Gravity PDF - Version 2.0.0

Version Description

  • Moved templates to active theme folder to prevent custom themes being removed on upgrade
  • Allow PDFs to be saved using a custom name
  • Fixed WP_Error bug when image/css file cannot be found
  • Upgraded to latest version of DOMPDF
  • Removed auto-load form bug which would see multiple instances of the example form loaded
  • Created a number of constants to allow easier developer modification
  • Plugin/Support moved to dedicated website.
  • Pro/Business package offers the ability to write fields on an existing PDF.
Download this release

Release Info

Developer Blue Liquid Designs
Plugin Icon 128x128 Gravity PDF
Version 2.0.0
Comparing to
See all releases

Code changes from version 1.2.3 to 2.0.0

Files changed (82) hide show
  1. README.txt +105 -97
  2. dompdf/CONTRIBUTING.md +73 -0
  3. dompdf/README.md +33 -0
  4. dompdf/_notes/dwsync.xml +12 -0
  5. dompdf/composer.json +23 -0
  6. dompdf/docblox.dist.xml +19 -19
  7. dompdf/dompdf.php +2 -3
  8. dompdf/dompdf_config.inc.php +21 -4
  9. dompdf/include/_notes/dwsync.xml +73 -140
  10. dompdf/include/absolute_positioner.cls.php +0 -1
  11. dompdf/include/abstract_renderer.cls.php +355 -467
  12. dompdf/include/attribute_translator.cls.php +177 -62
  13. dompdf/include/autoload.inc.php +4 -4
  14. dompdf/include/block_frame_decorator.cls.php +28 -59
  15. dompdf/include/block_frame_reflower.cls.php +250 -221
  16. dompdf/include/block_positioner.cls.php +6 -3
  17. dompdf/include/block_renderer.cls.php +37 -9
  18. dompdf/include/cached_pdf_decorator.cls.php +24 -14
  19. dompdf/include/canvas.cls.php +95 -34
  20. dompdf/include/canvas_factory.cls.php +16 -12
  21. dompdf/include/cellmap.cls.php +161 -99
  22. dompdf/include/cpdf_adapter.cls.php +111 -92
  23. dompdf/include/css_color.cls.php +39 -22
  24. dompdf/include/dompdf.cls.php +382 -253
  25. dompdf/include/dompdf_exception.cls.php +0 -1
  26. dompdf/include/dompdf_image_exception.cls.php +0 -1
  27. dompdf/include/file.skel +0 -1
  28. dompdf/include/fixed_positioner.cls.php +5 -4
  29. dompdf/include/font_metrics.cls.php +46 -30
  30. dompdf/include/frame.cls.php +306 -235
  31. dompdf/include/frame_decorator.cls.php +268 -134
  32. dompdf/include/frame_factory.cls.php +84 -24
  33. dompdf/include/frame_reflower.cls.php +88 -54
  34. dompdf/include/frame_tree.cls.php +37 -22
  35. dompdf/include/functions.inc.php +186 -118
  36. dompdf/include/gd_adapter.cls.php +65 -36
  37. dompdf/include/image_cache.cls.php +198 -187
  38. dompdf/include/image_frame_decorator.cls.php +11 -11
  39. dompdf/include/image_frame_reflower.cls.php +67 -7
  40. dompdf/include/image_renderer.cls.php +48 -4
  41. dompdf/include/inline_frame_decorator.cls.php +1 -2
  42. dompdf/include/inline_frame_reflower.cls.php +1 -2
  43. dompdf/include/inline_positioner.cls.php +0 -1
  44. dompdf/include/inline_renderer.cls.php +7 -8
  45. dompdf/include/javascript_embedder.cls.php +6 -6
  46. dompdf/include/line_box.cls.php +46 -22
  47. dompdf/include/list_bullet_frame_decorator.cls.php +0 -1
  48. dompdf/include/list_bullet_frame_reflower.cls.php +1 -2
  49. dompdf/include/list_bullet_image_frame_decorator.cls.php +3 -3
  50. dompdf/include/list_bullet_positioner.cls.php +0 -1
  51. dompdf/include/list_bullet_renderer.cls.php +10 -4
  52. dompdf/include/null_frame_decorator.cls.php +0 -1
  53. dompdf/include/null_frame_reflower.cls.php +1 -2
  54. dompdf/include/null_positioner.cls.php +0 -1
  55. dompdf/include/page_cache.cls.php +1 -2
  56. dompdf/include/page_frame_decorator.cls.php +15 -8
  57. dompdf/include/page_frame_reflower.cls.php +3 -34
  58. dompdf/include/pdflib_adapter.cls.php +106 -51
  59. dompdf/include/php_evaluator.cls.php +4 -4
  60. dompdf/include/positioner.cls.php +0 -1
  61. dompdf/include/renderer.cls.php +119 -115
  62. dompdf/include/style.cls.php +480 -256
  63. dompdf/include/stylesheet.cls.php +1434 -1362
  64. dompdf/include/table_cell_frame_decorator.cls.php +1 -2
  65. dompdf/include/table_cell_frame_reflower.cls.php +9 -5
  66. dompdf/include/table_cell_positioner.cls.php +0 -1
  67. dompdf/include/table_cell_renderer.cls.php +0 -1
  68. dompdf/include/table_frame_decorator.cls.php +17 -9
  69. dompdf/include/table_frame_reflower.cls.php +14 -3
  70. dompdf/include/table_row_frame_decorator.cls.php +0 -1
  71. dompdf/include/table_row_frame_reflower.cls.php +1 -2
  72. dompdf/include/table_row_group_frame_decorator.cls.php +4 -3
  73. dompdf/include/table_row_group_frame_reflower.cls.php +1 -2
  74. dompdf/include/table_row_group_renderer.cls.php +0 -1
  75. dompdf/include/table_row_positioner.cls.php +0 -1
  76. dompdf/include/tcpdf_adapter.cls.php +204 -42
  77. dompdf/include/text_frame_decorator.cls.php +4 -5
  78. dompdf/include/text_frame_reflower.cls.php +15 -7
  79. dompdf/include/text_renderer.cls.php +26 -24
  80. dompdf/lib/_notes/dwsync.xml +1 -2
  81. dompdf/lib/class.pdf.php +1237 -1616
  82. dompdf/lib/fonts/DejaVuSans-Bold.ufm +3826 -4059
README.txt CHANGED
@@ -1,97 +1,105 @@
1
- === Plugin Name ===
2
- Contributors: blueliquiddesigns
3
- Donate link: http://www.blueliquiddesigns.com.au/index.php/gravity-forms-pdf-extended-plugin/
4
- Tags: gravity, forms, pdf, automation, attachment
5
- Requires at least: 3.4.1
6
- Tested up to: 3.5
7
- Stable tag: 1.2.3
8
- License: GPLv2 or later
9
- License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
-
11
- Gravity Forms PDF Extended allows you to save/view/download a PDF from the front- and back-end, and automate PDF creation on form submission.
12
-
13
- == Description ==
14
-
15
- Expanding on the good work of 'rposborne', who created the original [Gravity Forms PDF Plugin](http://wordpress.org/extend/plugins/gravity-forms-pdf/), the extended version overhauls the rendering process so that developers now have more control over the creation of PDFs.
16
-
17
- **Features**
18
-
19
- * Save PDF File on user submission of a Gravity Form so it can be attached to a notification
20
- * Customise the PDF template without affecting the core Gravity Form Plugin
21
- * Multiple PDF Templates
22
- * Output individual form fields in the template - like MERGETAGS.
23
- * View and download a PDF via the administrator interface
24
- * Simple function to output PDF via template / plugin
25
- * Works with Gravity Forms Signature Add-On
26
- * Installs a sample form using the new MERGETAGS-style template to help the setup
27
-
28
- **Tutorial**
29
- [Head to Blue Liquid Designs](http://www.blueliquiddesigns.com.au/index.php/gravity-forms-pdf-extended-plugin/) - the developer of the extended Gravity Forms PDF plugin - and view everything you need to know installing, configuring and using the plugin.
30
-
31
- **Demo**
32
- You can see it in action [on the Blue Liquid Designs website](http://www.blueliquiddesigns.com.au/index.php/gravity-forms-pdf-extended-plugin/#tab-demo).
33
-
34
- **Haven't purchased Gravity Forms yet?**
35
- By purchasing a Gravity Forms Developer License through Blue Liquid Designs you'll get a 60% discount off the retail price. That's only $80 Australian Dollars and it includes all the premium Gravity Forms features like Paypal integration, the Signature and User Registration Add-On. [Click here to find out more](http://www.blueliquiddesigns.com.au/index.php/articles/gravity-forms-developers-license/).
36
-
37
- == Installation ==
38
-
39
- This section describes how to install the plugin and get it working.
40
-
41
- 1. Upload this plugin to your website and activate it
42
- 2. Modify the PDF template file, pdf-print-entry.php, inside the gravity-forms-pdf-extended plugin folder to suit your requirements.
43
- 3. Create a form you want to PDF and configure notifications
44
- 4. To create the PDF on the fly and add as an email attachment read the tutorial: http://blueliquiddesigns.com.au/index.php/gravity-forms-pdf-extended-plugin/
45
-
46
- == Frequently Asked Questions ==
47
-
48
- = I get the error message: Fatal error: Call to undefined method DOMText::getAttribute() on line ###. =
49
- This is generally caused by invalid HTML. [See The Template section](http://www.blueliquiddesigns.com.au/index.php/gravity-forms-pdf-extended-plugin/#gf-the-template) for an easy method to debug the issue.
50
-
51
- = I added an image to the template file and got the error 'Image not readable or empty'. =
52
- Make sure you use an absolute path to the file e.g. http://www.your-site.com/my-image.jpg. Also, check that the 'temp' folder in ../gravity-forms-pdf-extended/dompdf/ is writable by your web server.
53
-
54
- = I want to have multiple PDF template files. =
55
- Copy the *pdf-print-entry.php* file (located in the plugin directory) and pass the new template name to the PDF_Generator() function inside the gform_pdf_create() function.
56
-
57
- = I want users to be able to download the PDF from the server. =
58
- By deleting the .htaccess file in the 'output' folder you'll be able to access the PDFs through a web browser. Use the get_pdf_filename() function to get the PDF's name.
59
-
60
- == Screenshots ==
61
-
62
- 1. View PDF From the Form List
63
- 2. View or download the PDF from a form entry.
64
-
65
- == Changelog ==
66
-
67
- Remember to always make a backup of your plugin before upgrading otherwise you'll loose your custom PDF template file.
68
-
69
- = 1.2.3 =
70
- * Fixed $wpdb->prepare error
71
-
72
- = 1.2.2 =
73
- * Fixed bug with tempalte shipping method MERGETAGS
74
- * Fixed bug where attachment wasn't being sent
75
- * Fixed problem when all_url_fopen was turned off on server and failed to retreive remote images. Now uses WP_HTTP class.
76
-
77
- = 1.2.1 =
78
- * Fixed path to custom css file included in PDF template
79
-
80
- = 1.2.0 =
81
- * Template files moved to the plugin's template folder
82
- * Sample Form installed so developers have a working example to modify
83
- * Fixed bug when using WordPress in another directory to the site
84
-
85
- = 1.1.0 =
86
- * Now compatible with Gravity Forms Signature Add-On
87
- * Moved the field data functions out side of the Gravity Forms core so users can freely style their form information (located in pdf-entry-detail.php)
88
- * Simplified the field data output
89
- * Fixed bug when using product information
90
-
91
- = 1.0.0 =
92
- * First release.
93
-
94
- == Upgrade Notice ==
95
-
96
- = 1.2.2 =
97
- A number of bug fixes with the new MERGETAGS style template. **Note: Backup template files before upgrade as they will be deleted by Wordpress during the update process.**
 
 
 
 
 
 
 
 
1
+ === Plugin Name ===
2
+ Contributors: blueliquiddesigns
3
+ Donate link: http://www.gravityformspdfextended.com
4
+ Tags: gravity, forms, pdf, automation, attachment
5
+ Requires at least: 3.4.1
6
+ Tested up to: 3.5
7
+ Stable tag: 2.0.0
8
+ License: GPLv2 or later
9
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
+
11
+ Gravity Forms PDF Extended allows you to save/view/download a PDF from the front- and back-end, and automate PDF creation on form submission.
12
+
13
+ == Description ==
14
+
15
+ Gravity Forms PDF Extended is a plugin for Wordpress and Gravity Forms that allows your web server to create PDFs when a user submits a Gravity Form. Not only that, you can then easily attach the document to an email.
16
+
17
+ At its core the plugin uses the power of the DOMPDF library to convert HTML and CSS into PDFs.
18
+
19
+ **Features**
20
+
21
+ * Save PDF File on user submission of a Gravity Form so it can be attached to a notification
22
+ * Customise the PDF template without affecting the core Gravity Form Plugin
23
+ * Multiple PDF Templates
24
+ * Custom PDF Name
25
+ * Output individual form fields in the template - like MERGETAGS.
26
+ * View and download a PDF via the administrator interface
27
+ * Simple function to output PDF via template / plugin
28
+ * Works with Gravity Forms Signature Add-On
29
+ * Installs a sample form using the new MERGETAGS-style template to help customisation
30
+
31
+ **Server Requirements**
32
+
33
+ 1. PHP 5.0+ (5.3 recommended)
34
+ 2. MBString extension
35
+ 3. DOM extension (bundled with PHP 5)
36
+ 4. If you want images in your PDF you'll also need the GD Library
37
+
38
+ **Software Requirements**
39
+
40
+ 1. [Purchase and install Gravity Forms](https://www.e-junkie.com/ecom/gb.php?cl=54585&c=ib&aff=235154)
41
+ 2. Wordpress 3.0+
42
+ 3. Gravity Forms 1.6.9+
43
+
44
+ **Documentation and Support**
45
+
46
+ To view the Development Documentation head to [http://www.gravityformspdfextended.com/documentation/](http://www.gravityformspdfextended.com/documentation/). If you need support with the plugin please post a topic in our [support forums](http://gravityformspdfextended.com/support/gravity-forms-pdf-extended/).
47
+
48
+ == Installation ==
49
+
50
+ 1. Upload this plugin to your website and activate it
51
+ 2. Create a form in Gravity Forms and configure notifications
52
+ 3. Get the Form ID and follow the steps below in [the configuration section](http://gravityformspdfextended.com/documentation/2.0.0/1/configuration/)
53
+ 4. Modify the PDF template file ([see the advanced templating section in the documentation](http://gravityformspdfextended.com/documentation/2.0.0/9/advanced-configuration/)), pdf-print-entry.php or example-template.php, inside your active theme's PDF_EXTENDED_TEMPLATES/ folder.
54
+
55
+
56
+ == Frequently Asked Questions ==
57
+
58
+ All FAQs can be [viewed on the Gravity Forms PDF Extended website](http://gravityformspdfextended.com/faq/category/developers/).
59
+
60
+ == Screenshots ==
61
+
62
+ 1. View PDF from the Gravity Forms entries list.
63
+ 2. View or download the PDF from a Gravity Forms entry.
64
+
65
+ == Changelog ==
66
+
67
+ = 2.0.0 =
68
+ * Moved templates to active theme folder to prevent custom themes being removed on upgrade
69
+ * Allow PDFs to be saved using a custom name
70
+ * Fixed WP_Error bug when image/css file cannot be found
71
+ * Upgraded to latest version of DOMPDF
72
+ * Removed auto-load form bug which would see multiple instances of the example form loaded
73
+ * Created a number of constants to allow easier developer modification
74
+ * Plugin/Support moved to dedicated website.
75
+ * Pro/Business package offers the ability to write fields on an existing PDF.
76
+
77
+ = 1.2.3 =
78
+ * Fixed $wpdb->prepare error
79
+
80
+ = 1.2.2 =
81
+ * Fixed bug with tempalte shipping method MERGETAGS
82
+ * Fixed bug where attachment wasn't being sent
83
+ * Fixed problem when all_url_fopen was turned off on server and failed to retreive remote images. Now uses WP_HTTP class.
84
+
85
+ = 1.2.1 =
86
+ * Fixed path to custom css file included in PDF template
87
+
88
+ = 1.2.0 =
89
+ * Template files moved to the plugin's template folder
90
+ * Sample Form installed so developers have a working example to modify
91
+ * Fixed bug when using WordPress in another directory to the site
92
+
93
+ = 1.1.0 =
94
+ * Now compatible with Gravity Forms Signature Add-On
95
+ * Moved the field data functions out side of the Gravity Forms core so users can freely style their form information (located in pdf-entry-detail.php)
96
+ * Simplified the field data output
97
+ * Fixed bug when using product information
98
+
99
+ = 1.0.0 =
100
+ * First release.
101
+
102
+ == Upgrade Notice ==
103
+
104
+ = 2.0.0 =
105
+ New Features: Added custom PDF names and moved templates to active theme's folder (no longer overridden after updating). Also fixed a number of bugs in the problem. Remember to backup your custom templates before upgrading!
dompdf/CONTRIBUTING.md ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # How to contribute
2
+
3
+ - [Getting help](#getting-help)
4
+ - [Submitting bug reports](#submitting-bug-reports)
5
+ - [Contributing code](#contributing-code)
6
+
7
+ ## Getting help
8
+
9
+ Community discussion, questions, and informal bug reporting is done on the
10
+ [dompdf Google group](http://groups.google.com/group/dompdf).
11
+
12
+ ## Submitting bug reports
13
+
14
+ The preferred way to report bugs is to use the
15
+ [GitHub issue tracker](http://github.com/dompdf/dompdf/issues). Before
16
+ reporting a bug, read these pointers.
17
+
18
+ **Please search inside the bug tracker to see if the bug you found is not already reported.**
19
+
20
+ **Note:** The issue tracker is for *bugs* and *feature requests*, not requests for help.
21
+ Questions should be asked on the
22
+ [dompdf Google group](http://groups.google.com/group/dompdf) instead.
23
+
24
+ ### Reporting bugs effectively
25
+
26
+ - dompdf is maintained by volunteers. They don't owe you anything, so be
27
+ polite. Reports with an indignant or belligerent tone tend to be moved to the
28
+ bottom of the pile.
29
+
30
+ - Include information about **the PHP version on which the problem occurred**. Even
31
+ if you tested several PHP version on different servers, and the problem occurred
32
+ in all of them, mention this fact in the bug report.
33
+ Also include the operating system it's installed on. PHP configuration can also help,
34
+ and server error logs (like Apache logs)
35
+
36
+ - Mention which release of dompdf you're using (the zip, the master branch, etc).
37
+ Preferably, try also with the current development snapshot, to ensure the
38
+ problem has not already been fixed.
39
+
40
+ - Mention very precisely what went wrong. "X is broken" is not a good bug
41
+ report. What did you expect to happen? What happened instead? Describe the
42
+ exact steps a maintainer has to take to make the problem occur. We can not
43
+ fix something that we can not observe.
44
+
45
+ - If the problem can not be reproduced in any of the demos included in the
46
+ dompdf distribution, please provide an HTML document that demonstrates
47
+ the problem. There are a few options to show us your code:
48
+ - [JS Fiddle](http://jsfiddle.net/)
49
+ - [dompdf debug helper](http://eclecticgeek.com/dompdf/debug.php) (provided by @bsweeney)
50
+ - Include the HTML/CSS inside the bug report, with
51
+ [code highlighting](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#wiki-code).
52
+
53
+ ## Contributing code
54
+
55
+ - Make sure you have a [GitHub Account](https://github.com/signup/free)
56
+ - Fork [dompdf](https://github.com/dompdf/dompdf/)
57
+ ([how to fork a repo](https://help.github.com/articles/fork-a-repo))
58
+ - Make your changes
59
+ - Add a simple test file in `www/test/`, with a comprehensive name.
60
+ - Submit a pull request
61
+ ([how to create a pull request](https://help.github.com/articles/fork-a-repo))
62
+
63
+ ### Coding standards
64
+
65
+ - 2 spaces per indentation level, no tabs.
66
+ - spaces inside `if` like this:
67
+ ```php
68
+ if ( $foo == "bar" ) {
69
+ //
70
+ }
71
+ ```
72
+ - booleans in lowercase
73
+ - opening braces *always* on the same line
dompdf/README.md ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ **dompdf is an HTML to PDF converter**. At its heart, dompdf is (mostly) [CSS 2.1](https://github.com/HNygard/dompdf/tree/master/dompdf/lib) compliant HTML layout and rendering engine written in PHP. It is a style-driven renderer: it will download and read external stylesheets, inline style tags, and the style attributes of individual HTML elements. It also supports most presentational HTML attributes.
2
+
3
+ PDF rendering is currently provided either by [PDFLib](http://www.pdflib.com/) or by a bundled version the R&OS CPDF class written by Wayne Munro. (Some important changes have been made to the R&OS class, however). In order to use PDFLib with dompdf, the [PDFLib PECL extension](http://pecl.php.net/package/pdflib) is required. Using PDFLib improves performance and reduces the memory requirements of dompdf somewhat, while the R&OS CPDF class, though slightly slower, eliminates any dependencies on external PDF libraries.
4
+
5
+ [![Follow us on Twitter](http://twitter-badges.s3.amazonaws.com/twitter-a.png)](http://www.twitter.com/dompdf)
6
+ [![Follow us on Google+](https://ssl.gstatic.com/images/icons/gplus-32.png)](https://plus.google.com/108710008521858993320?prsrc=3)
7
+
8
+ Features
9
+ ========
10
+ * handles most CSS 2.1 and a few CSS3 properties, including @import, @media & @page rules
11
+ * supports most presentational HTML 4.0 attributes
12
+ * supports external stylesheets, either local or through http/ftp (via fopen-wrappers)
13
+ * supports complex tables, including row & column spans, separate & collapsed border models, individual cell styling
14
+ * image support (gif, png (8, 24 and 32 bit with alpha channel), bmp & jpeg)
15
+ * no dependencies on external PDF libraries, thanks to the R&OS PDF class
16
+ * inline PHP support
17
+
18
+ Requirements
19
+ ============
20
+ * PHP 5.0+ (5.3 recommended)
21
+ * MBString extension
22
+ * DOM extension (bundled with PHP 5)
23
+ * Some fonts. PDFs internally support Helvetica, Times-Roman, Courier & Zapf-Dingbats, but if you wish to use other fonts you will need to install some fonts. dompdf supports the same fonts as the underlying R&OS PDF class: Type 1 (.pfb with the corresponding .afm) and TrueType (.ttf). At the minimum, you should probably have the Microsoft core fonts. See the font installation instructions.
24
+
25
+ Limitations (Known Issues)
26
+ ==========================
27
+ * not particularly tolerant to poorly-formed HTML input (using Tidy first may help).
28
+ * large files or large tables can take a while to render
29
+ * CSS float is not supported (but is in the works).
30
+ * If you find this project useful, please consider making a donation.
31
+
32
+ (Any funds donated will be used to help further development on this project.)
33
+ [![Donate button](https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif)](http://goo.gl/DSvWf)
dompdf/_notes/dwsync.xml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8" ?>
2
+ <dwsync>
3
+ <file name="dompdf_config.inc.php" server="www.allnaturaltherapies.net" local="129915304800000000" remote="130012717200000000" />
4
+ <file name="docblox.dist.xml" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
5
+ <file name="dompdf.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
6
+ <file name="dompdf_config.custom.inc.php" server="www.allnaturaltherapies.net" local="129914800781916146" remote="130012717200000000" />
7
+ <file name="index.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
8
+ <file name="load_font.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
9
+ <file name="LICENSE.LGPL" server="www.allnaturaltherapies.net" local="129941327812717061" remote="130012717200000000" />
10
+ <file name="readme.html" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
11
+ <file name="dompdf_config.inc.php" server="blueliquiddesigns.co.nf//blueliquiddesigns.co.nf/" local="130014649235061612" remote="130014283200000000" />
12
+ </dwsync>
dompdf/composer.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "dompdf/dompdf",
3
+ "type": "library",
4
+ "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
5
+ "homepage": "https://github.com/dompdf/dompdf",
6
+ "license": "LGPL",
7
+ "authors": [
8
+ {
9
+ "name": "Fabien Ménager",
10
+ "email": "fabien.menager@gmail.com"
11
+ },
12
+ {
13
+ "name": "Brian Sweeney",
14
+ "email": "eclecticgeek@gmail.com"
15
+ }
16
+ ],
17
+ "autoload": {
18
+ "classmap": ["include/"]
19
+ },
20
+ "require": {
21
+ "phenx/php-font-lib": "0.1.*"
22
+ }
23
+ }
dompdf/docblox.dist.xml CHANGED
@@ -1,20 +1,20 @@
1
- <?xml version="1.0" encoding="UTF-8" ?>
2
- <docblox>
3
- <parser>
4
- <target>docs</target>
5
- </parser>
6
- <transformer>
7
- <target>docs</target>
8
- </transformer>
9
- <files>
10
- <directory>.</directory>
11
- <ignore>*/lib/fonts/*</ignore>
12
- <ignore>*/lib/html5lib/*</ignore>
13
- <ignore>*/lib/php-font-lib/*</ignore>
14
- <ignore>*www/*</ignore>
15
- <ignore>*.svn*</ignore>
16
- </files>
17
- <transformations>
18
- <template name="new_black" />
19
- </transformations>
20
  </docblox>
1
+ <?xml version="1.0" encoding="UTF-8" ?>
2
+ <docblox>
3
+ <parser>
4
+ <target>docs</target>
5
+ </parser>
6
+ <transformer>
7
+ <target>docs</target>
8
+ </transformer>
9
+ <files>
10
+ <directory>.</directory>
11
+ <ignore>*/lib/fonts/*</ignore>
12
+ <ignore>*/lib/html5lib/*</ignore>
13
+ <ignore>*/lib/php-font-lib/*</ignore>
14
+ <ignore>*www/*</ignore>
15
+ <ignore>*.svn*</ignore>
16
+ </files>
17
+ <transformations>
18
+ <template name="new_black" />
19
+ </transformations>
20
  </docblox>
dompdf/dompdf.php CHANGED
@@ -7,7 +7,6 @@
7
  * @link http://www.dompdf.com/
8
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
9
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
10
- * @version $Id: dompdf.php 448 2011-11-13 13:00:03Z fabien.menager $
11
  */
12
 
13
  /**
@@ -167,7 +166,7 @@ switch ( $sapi ) {
167
  $outfile = $opts["f"];
168
  else {
169
  if ( $file === "-" )
170
- $outfile = "dompdf_out.pdf";
171
  else
172
  $outfile = str_ireplace(array(".html", ".htm", ".php"), "", $file) . ".pdf";
173
  }
@@ -224,7 +223,7 @@ switch ( $sapi ) {
224
  if(($file_parts['protocol'] == '' || $file_parts['protocol'] === 'file://')) {
225
  $file = realpath($file);
226
  if ( strpos($file, DOMPDF_CHROOT) !== 0 ) {
227
- throw new DOMPDF_Exception("Permission denied on $file.");
228
  }
229
  }
230
 
7
  * @link http://www.dompdf.com/
8
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
9
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
10
  */
11
 
12
  /**
166
  $outfile = $opts["f"];
167
  else {
168
  if ( $file === "-" )
169
+ $outfile = "dompdf_out.pdf";
170
  else
171
  $outfile = str_ireplace(array(".html", ".htm", ".php"), "", $file) . ".pdf";
172
  }
223
  if(($file_parts['protocol'] == '' || $file_parts['protocol'] === 'file://')) {
224
  $file = realpath($file);
225
  if ( strpos($file, DOMPDF_CHROOT) !== 0 ) {
226
+ throw new DOMPDF_Exception("Permission denied on $file. The file could not be found under the directory specified by DOMPDF_CHROOT.");
227
  }
228
  }
229
 
dompdf/dompdf_config.inc.php CHANGED
@@ -4,9 +4,8 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
- * @author Fabien M�nager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
9
- * @version $Id: dompdf_config.inc.php 468 2012-02-05 10:51:40Z fabien.menager $
10
  */
11
 
12
  //error_reporting(E_STRICT | E_ALL | E_DEPRECATED);
@@ -199,7 +198,7 @@ def("DOMPDF_DEFAULT_MEDIA_TYPE", "screen");
199
  *
200
  * @see CPDF_Adapter::PAPER_SIZES for valid sizes
201
  */
202
- def("DOMPDF_DEFAULT_PAPER_SIZE", "letter");
203
 
204
  /**
205
  * The default font family
@@ -321,7 +320,25 @@ require_once(DOMPDF_LIB_DIR . "/html5lib/Parser.php");
321
 
322
  // ### End of user-configurable options ###
323
 
324
- require_once(DOMPDF_INC_DIR . "/autoload.inc.php");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
325
 
326
  /**
327
  * Ensure that PHP is working with text internally using UTF8 character encoding.
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
+ * @author Fabien Ménager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
9
  */
10
 
11
  //error_reporting(E_STRICT | E_ALL | E_DEPRECATED);
198
  *
199
  * @see CPDF_Adapter::PAPER_SIZES for valid sizes
200
  */
201
+ def("DOMPDF_DEFAULT_PAPER_SIZE", "a4");
202
 
203
  /**
204
  * The default font family
320
 
321
  // ### End of user-configurable options ###
322
 
323
+ // is composer running?
324
+ if (!class_exists("ComposerAutoloaderInit")) {
325
+ if (file_exists(DOMPDF_DIR . "/vendor/autoload.php")) {
326
+ // development mode - composer is installed locally
327
+ require_once(DOMPDF_DIR . "/vendor/autoload.php");
328
+ } else {
329
+ // composer is not installed - use our custom autoloader
330
+ require_once(DOMPDF_INC_DIR . "/autoload.inc.php");
331
+ }
332
+ }
333
+
334
+ // check for php-font-lib
335
+ if (!class_exists('Font')) {
336
+ if (file_exists(DOMPDF_LIB_DIR . "/php-font-lib/classes/font.cls.php")) {
337
+ require_once(DOMPDF_LIB_DIR . "/php-font-lib/classes/font.cls.php");
338
+ } else {
339
+ exit("PHP-font-lib must either be installed via composer or copied to lib/php-font-lib\n");
340
+ }
341
+ }
342
 
343
  /**
344
  * Ensure that PHP is working with text internally using UTF8 character encoding.
dompdf/include/_notes/dwsync.xml CHANGED
@@ -1,143 +1,76 @@
1
  <?xml version="1.0" encoding="utf-8" ?>
2
  <dwsync>
3
- <file name="absolute_positioner.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
4
- <file name="abstract_renderer.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
5
- <file name="attribute_translator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
6
- <file name="autoload.inc.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
7
- <file name="block_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
8
- <file name="block_frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
9
- <file name="block_positioner.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
10
- <file name="block_renderer.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
11
- <file name="cached_pdf_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
12
- <file name="canvas.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
13
- <file name="canvas_factory.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
14
- <file name="cellmap.cls.php" server="ftp.danielmarks.com.au" local="129908553354413613" remote="129908553000000000" />
15
- <file name="cpdf_adapter.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
16
- <file name="css_color.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
17
- <file name="dompdf.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
18
- <file name="dompdf_exception.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
19
- <file name="dompdf_image_exception.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
20
- <file name="file.skel" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
21
- <file name="fixed_positioner.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
22
- <file name="font_metrics.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
23
- <file name="frame.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
24
- <file name="frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
25
- <file name="frame_factory.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
26
- <file name="frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
27
- <file name="frame_tree.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
28
- <file name="functions.inc.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
29
- <file name="gd_adapter.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
30
- <file name="image_cache.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
31
- <file name="image_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
32
- <file name="image_frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
33
- <file name="image_renderer.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
34
- <file name="inline_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
35
- <file name="inline_frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
36
- <file name="inline_positioner.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
37
- <file name="inline_renderer.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
38
- <file name="javascript_embedder.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
39
- <file name="line_box.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
40
- <file name="list_bullet_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
41
- <file name="list_bullet_frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
42
- <file name="list_bullet_image_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
43
- <file name="list_bullet_positioner.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
44
- <file name="list_bullet_renderer.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
45
- <file name="null_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
46
- <file name="null_frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
47
- <file name="null_positioner.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
48
- <file name="page_cache.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
49
- <file name="page_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
50
- <file name="page_frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
51
- <file name="pdflib_adapter.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
52
- <file name="php_evaluator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
53
- <file name="positioner.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
54
- <file name="renderer.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
55
- <file name="style.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
56
- <file name="stylesheet.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
57
- <file name="table_cell_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
58
- <file name="table_cell_frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
59
- <file name="table_cell_positioner.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
60
- <file name="table_cell_renderer.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
61
- <file name="table_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
62
- <file name="table_frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
63
- <file name="table_row_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
64
- <file name="table_row_frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
65
- <file name="table_row_group_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
66
- <file name="table_row_group_frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
67
- <file name="table_row_group_renderer.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
68
- <file name="table_row_positioner.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
69
- <file name="tcpdf_adapter.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
70
- <file name="text_frame_decorator.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
71
- <file name="text_frame_reflower.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
72
- <file name="text_renderer.cls.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
73
- <file name="absolute_positioner.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913285200000000" />
74
- <file name="abstract_renderer.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913285200000000" />
75
- <file name="attribute_translator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913285200000000" />
76
- <file name="autoload.inc.php" server="216.235.107.57" local="129908529600000000" remote="129913285200000000" />
77
- <file name="block_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913285800000000" />
78
- <file name="block_frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913285800000000" />
79
- <file name="block_positioner.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913285800000000" />
80
- <file name="block_renderer.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913285800000000" />
81
- <file name="cached_pdf_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913285800000000" />
82
- <file name="canvas.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913285800000000" />
83
- <file name="canvas_factory.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913285800000000" />
84
- <file name="cellmap.cls.php" server="216.235.107.57" local="129908553354413613" remote="129913286400000000" />
85
- <file name="cpdf_adapter.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913286400000000" />
86
- <file name="css_color.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913286400000000" />
87
- <file name="dompdf.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913286400000000" />
88
- <file name="dompdf_exception.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913286400000000" />
89
- <file name="dompdf_image_exception.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913286400000000" />
90
- <file name="file.skel" server="216.235.107.57" local="129908529600000000" remote="129913286400000000" />
91
- <file name="fixed_positioner.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287000000000" />
92
- <file name="font_metrics.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287000000000" />
93
- <file name="frame.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287000000000" />
94
- <file name="frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287000000000" />
95
- <file name="frame_factory.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287000000000" />
96
- <file name="frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287000000000" />
97
- <file name="frame_tree.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287000000000" />
98
- <file name="functions.inc.php" server="216.235.107.57" local="129908529600000000" remote="129913287600000000" />
99
- <file name="gd_adapter.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287600000000" />
100
- <file name="image_cache.cls.php" server="216.235.107.57" local="129940735200000000" remote="129940735200000000" />
101
- <file name="image_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287600000000" />
102
- <file name="image_frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287600000000" />
103
- <file name="image_renderer.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287600000000" />
104
- <file name="inline_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287600000000" />
105
- <file name="inline_frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913287600000000" />
106
- <file name="inline_positioner.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288200000000" />
107
- <file name="inline_renderer.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288200000000" />
108
- <file name="javascript_embedder.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288200000000" />
109
- <file name="line_box.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288200000000" />
110
- <file name="list_bullet_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288200000000" />
111
- <file name="list_bullet_frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288200000000" />
112
- <file name="list_bullet_image_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288200000000" />
113
- <file name="list_bullet_positioner.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288200000000" />
114
- <file name="list_bullet_renderer.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288800000000" />
115
- <file name="null_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288800000000" />
116
- <file name="null_frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288800000000" />
117
- <file name="null_positioner.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288800000000" />
118
- <file name="page_cache.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288800000000" />
119
- <file name="page_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288800000000" />
120
- <file name="page_frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288800000000" />
121
- <file name="pdflib_adapter.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913288800000000" />
122
- <file name="php_evaluator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913289400000000" />
123
- <file name="positioner.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913289400000000" />
124
- <file name="renderer.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913289400000000" />
125
- <file name="style.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913289400000000" />
126
- <file name="stylesheet.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913289400000000" />
127
- <file name="table_cell_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913289400000000" />
128
- <file name="table_cell_frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290000000000" />
129
- <file name="table_cell_positioner.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290000000000" />
130
- <file name="table_cell_renderer.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290000000000" />
131
- <file name="table_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290000000000" />
132
- <file name="table_frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290000000000" />
133
- <file name="table_row_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290000000000" />
134
- <file name="table_row_frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290000000000" />
135
- <file name="table_row_group_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290000000000" />
136
- <file name="table_row_group_frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290600000000" />
137
- <file name="table_row_group_renderer.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290600000000" />
138
- <file name="table_row_positioner.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290600000000" />
139
- <file name="tcpdf_adapter.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290600000000" />
140
- <file name="text_frame_decorator.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290600000000" />
141
- <file name="text_frame_reflower.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290600000000" />
142
- <file name="text_renderer.cls.php" server="216.235.107.57" local="129908529600000000" remote="129913290600000000" />
143
  </dwsync>
1
  <?xml version="1.0" encoding="utf-8" ?>
2
  <dwsync>
3
+ <file name="absolute_positioner.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716000000000" />
4
+ <file name="abstract_renderer.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716000000000" />
5
+ <file name="attribute_translator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716000000000" />
6
+ <file name="autoload.inc.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716000000000" />
7
+ <file name="block_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716000000000" />
8
+ <file name="block_frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716000000000" />
9
+ <file name="block_positioner.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716000000000" />
10
+ <file name="block_renderer.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716000000000" />
11
+ <file name="cached_pdf_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716000000000" />
12
+ <file name="canvas.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716000000000" />
13
+ <file name="canvas_factory.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716000000000" />
14
+ <file name="cellmap.cls.php" server="www.allnaturaltherapies.net" local="129908553354413613" remote="130012716000000000" />
15
+ <file name="cpdf_adapter.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
16
+ <file name="css_color.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
17
+ <file name="dompdf.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
18
+ <file name="dompdf_exception.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
19
+ <file name="dompdf_image_exception.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
20
+ <file name="file.skel" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
21
+ <file name="fixed_positioner.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
22
+ <file name="font_metrics.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
23
+ <file name="frame.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
24
+ <file name="frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
25
+ <file name="frame_factory.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
26
+ <file name="frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
27
+ <file name="frame_tree.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
28
+ <file name="functions.inc.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
29
+ <file name="gd_adapter.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
30
+ <file name="image_cache.cls.php" server="www.allnaturaltherapies.net" local="129940735200000000" remote="130012716600000000" />
31
+ <file name="image_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
32
+ <file name="image_frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
33
+ <file name="image_renderer.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
34
+ <file name="inline_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
35
+ <file name="inline_frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
36
+ <file name="inline_positioner.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
37
+ <file name="inline_renderer.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
38
+ <file name="javascript_embedder.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
39
+ <file name="line_box.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
40
+ <file name="list_bullet_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
41
+ <file name="list_bullet_frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
42
+ <file name="list_bullet_image_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
43
+ <file name="list_bullet_positioner.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
44
+ <file name="list_bullet_renderer.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
45
+ <file name="null_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
46
+ <file name="null_frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
47
+ <file name="null_positioner.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
48
+ <file name="page_cache.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
49
+ <file name="page_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
50
+ <file name="page_frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012716600000000" />
51
+ <file name="pdflib_adapter.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
52
+ <file name="php_evaluator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
53
+ <file name="positioner.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
54
+ <file name="renderer.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
55
+ <file name="style.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
56
+ <file name="stylesheet.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
57
+ <file name="table_cell_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
58
+ <file name="table_cell_frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
59
+ <file name="table_cell_positioner.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
60
+ <file name="table_cell_renderer.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
61
+ <file name="table_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
62
+ <file name="table_frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
63
+ <file name="table_row_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
64
+ <file name="table_row_frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
65
+ <file name="table_row_group_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
66
+ <file name="table_row_group_frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
67
+ <file name="table_row_group_renderer.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
68
+ <file name="table_row_positioner.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
69
+ <file name="tcpdf_adapter.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
70
+ <file name="text_frame_decorator.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
71
+ <file name="text_frame_reflower.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
72
+ <file name="text_renderer.cls.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012717200000000" />
73
+ <file name="image_cache.cls.php" server="blueliquiddesigns.co.nf//blueliquiddesigns.co.nf/" local="130014695914117772" remote="130014330000000000" />
74
+ <file name="stylesheet.cls.php" server="blueliquiddesigns.co.nf//blueliquiddesigns.co.nf/" local="130014652369497408" remote="130014286800000000" />
75
+ <file name="functions.inc.php" server="blueliquiddesigns.co.nf//blueliquiddesigns.co.nf/" local="130014688989424453" remote="130014322800000000" />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  </dwsync>
dompdf/include/absolute_positioner.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: absolute_positioner.cls.php 460 2012-01-26 07:17:46Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/abstract_renderer.cls.php CHANGED
@@ -4,9 +4,8 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
- * @author Fabien M�nager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
9
- * @version $Id: abstract_renderer.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
10
  */
11
 
12
  /**
@@ -55,7 +54,7 @@ abstract class Abstract_Renderer {
55
  /**
56
  * Render a background image over a rectangular area
57
  *
58
- * @param string $img The background image to load
59
  * @param float $x The left edge of the rectangular area
60
  * @param float $y The top edge of the rectangular area
61
  * @param float $width The width of the rectangular area
@@ -66,8 +65,9 @@ abstract class Abstract_Renderer {
66
  $sheet = $style->get_stylesheet();
67
 
68
  // Skip degenerate cases
69
- if ( $width == 0 || $height == 0 )
70
  return;
 
71
 
72
  $box_width = $width;
73
  $box_height = $height;
@@ -75,18 +75,22 @@ abstract class Abstract_Renderer {
75
  //debugpng
76
  if (DEBUGPNG) print '[_background_image '.$url.']';
77
 
78
- list($img, $type, $msg) = Image_Cache::resolve_url($url,
79
- $sheet->get_protocol(),
80
- $sheet->get_host(),
81
- $sheet->get_base_path());
 
 
 
82
 
83
  // Bail if the image is no good
84
- if ( Image_Cache::is_broken($img) )
85
  return;
 
86
 
87
  //Try to optimize away reading and composing of same background multiple times
88
  //Postponing read with imagecreatefrom ...()
89
- //final composition paramters and name not known yet
90
  //Therefore read dimension directly from file, instead of creating gd object first.
91
  //$img_w = imagesx($src); $img_h = imagesy($src);
92
 
@@ -96,12 +100,12 @@ abstract class Abstract_Renderer {
96
  }
97
 
98
  $repeat = $style->background_repeat;
99
- $bg_color = $style->background_color;
100
 
101
  //Increase background resolution and dependent box size according to image resolution to be placed in
102
  //Then image can be copied in without resize
103
- $bg_width = round((float)($width * DOMPDF_DPI) / 72);
104
- $bg_height = round((float)($height * DOMPDF_DPI) / 72);
105
 
106
  //Need %bg_x, $bg_y as background pos, where img starts, converted to pixel
107
 
@@ -115,11 +119,12 @@ abstract class Abstract_Renderer {
115
  $x2 = $p * $bg_width;
116
 
117
  $bg_x = $x2 - $x1;
118
- } else {
119
- $bg_x = (float)($style->length_in_pt($bg_x)*DOMPDF_DPI) / 72;
 
120
  }
121
 
122
- $bg_x = round($bg_x + $style->length_in_pt($style->border_left_width)*DOMPDF_DPI / 72);
123
 
124
  if ( is_percent($bg_y) ) {
125
  // The point $bg_y % from the left edge of the image is placed
@@ -129,11 +134,12 @@ abstract class Abstract_Renderer {
129
  $y2 = $p * $bg_height;
130
 
131
  $bg_y = $y2 - $y1;
132
- } else {
133
- $bg_y = (float)($style->length_in_pt($bg_y)*DOMPDF_DPI) / 72;
 
134
  }
135
 
136
- $bg_y = round($bg_y + $style->length_in_pt($style->border_top_width)*DOMPDF_DPI / 72);
137
 
138
  //clip background to the image area on partial repeat. Nothing to do if img off area
139
  //On repeat, normalize start position to the tile at immediate left/top or 0/0 of area
@@ -144,23 +150,28 @@ abstract class Abstract_Renderer {
144
  //No repeat x
145
  if ($bg_x < 0) {
146
  $bg_width = $img_w + $bg_x;
147
- } else {
148
- $x += ($bg_x * 72)/DOMPDF_DPI;
 
149
  $bg_width = $bg_width - $bg_x;
150
  if ($bg_width > $img_w) {
151
  $bg_width = $img_w;
152
  }
153
  $bg_x = 0;
154
  }
 
155
  if ($bg_width <= 0) {
156
  return;
157
  }
158
- $width = (float)($bg_width * 72)/DOMPDF_DPI;
159
- } else {
 
 
160
  //repeat x
161
  if ($bg_x < 0) {
162
  $bg_x = - ((-$bg_x) % $img_w);
163
- } else {
 
164
  $bg_x = $bg_x % $img_w;
165
  if ($bg_x > 0) {
166
  $bg_x -= $img_w;
@@ -172,8 +183,9 @@ abstract class Abstract_Renderer {
172
  //no repeat y
173
  if ($bg_y < 0) {
174
  $bg_height = $img_h + $bg_y;
175
- } else {
176
- $y += ($bg_y * 72)/DOMPDF_DPI;
 
177
  $bg_height = $bg_height - $bg_y;
178
  if ($bg_height > $img_h) {
179
  $bg_height = $img_h;
@@ -183,12 +195,14 @@ abstract class Abstract_Renderer {
183
  if ($bg_height <= 0) {
184
  return;
185
  }
186
- $height = (float)($bg_height * 72)/DOMPDF_DPI;
187
- } else {
 
188
  //repeat y
189
  if ($bg_y < 0) {
190
  $bg_y = - ((-$bg_y) % $img_h);
191
- } else {
 
192
  $bg_y = $bg_y % $img_h;
193
  if ($bg_y > 0) {
194
  $bg_y -= $img_h;
@@ -200,9 +214,11 @@ abstract class Abstract_Renderer {
200
  if ( $repeat === "repeat" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height ) {
201
  $repeat = "repeat-x";
202
  }
 
203
  if ( $repeat === "repeat" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width ) {
204
  $repeat = "repeat-y";
205
  }
 
206
  if ( ($repeat === "repeat-x" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width) ||
207
  ($repeat === "repeat-y" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height) ) {
208
  $repeat = "no-repeat";
@@ -214,188 +230,168 @@ abstract class Abstract_Renderer {
214
  //Note: Here, bg_* are the start values, not end values after going through the tile loops!
215
 
216
  $filedummy = $img;
217
-
218
- /*
219
- //Make shorter strings with limited characters for cache associative array index - needed?
220
- //Strip common base path - server root, explicite temp, default temp; remove unwanted characters;
221
- $filedummy = strtr($filedummy,"\\:","//");
222
- $p = strtr($_SERVER["DOCUMENT_ROOT"],"\\:","//");
223
- $l = strlen($p);
224
- if ( substr($filedummy,0,$l) == $p) {
225
- $filedummy = substr($filedummy,$l);
226
- } else {
227
- $p = strtr(DOMPDF_TEMP_DIR,"\\:","//");
228
- $l = strlen($p);
229
- if ( substr($filedummy,0,$l) == $p) {
230
- $filedummy = substr($filedummy,$l);
231
- } else {
232
- $p = strtr(sys_get_temp_dir(),"\\:","//");
233
- $l = strlen($p);
234
- if ( substr($filedummy,0,$l) == $p) {
235
- $filedummy = substr($filedummy,$l);
236
- }
237
- }
238
- }
239
- */
240
 
241
  $is_png = false;
242
  $filedummy .= '_'.$bg_width.'_'.$bg_height.'_'.$bg_x.'_'.$bg_y.'_'.$repeat;
243
- //debugpng
244
- //if (DEBUGPNG) print '<pre>[_background_image name '.$filedummy.']</pre>';
245
 
246
  //Optimization to avoid multiple times rendering the same image.
247
  //If check functions are existing and identical image already cached,
248
  //then skip creation of duplicate, because it is not needed by addImagePng
249
- if ( method_exists( $this->_canvas, "get_cpdf" ) &&
250
- method_exists( $this->_canvas->get_cpdf(), "addImagePng" ) &&
251
- method_exists( $this->_canvas->get_cpdf(), "image_iscached" ) &&
252
  $this->_canvas->get_cpdf()->image_iscached($filedummy) ) {
253
- $bg = null;
254
-
255
- //debugpng
256
- //if (DEBUGPNG) print '[_background_image skip]';
257
- }
258
 
259
  else {
260
-
261
- // Create a new image to fit over the background rectangle
262
- $bg = imagecreatetruecolor($bg_width, $bg_height);
 
 
 
 
 
 
 
 
263
 
264
- switch (strtolower($type)) {
265
- case IMAGETYPE_PNG:
266
- $is_png = true;
267
- imagesavealpha($bg, true);
268
- imagealphablending($bg, false);
269
- $src = imagecreatefrompng($img);
270
- break;
 
 
 
 
 
 
 
 
271
 
272
- case IMAGETYPE_JPEG:
273
- $src = imagecreatefromjpeg($img);
274
- break;
275
 
276
- case IMAGETYPE_GIF:
277
- $src = imagecreatefromgif($img);
278
- break;
279
-
280
- case IMAGETYPE_BMP:
281
- $src = imagecreatefrombmp($img);
282
- break;
 
 
 
 
 
 
283
 
284
- default: return; // Unsupported image type
285
- }
286
-
287
- if ($src == null) {
288
- return;
289
- }
290
-
291
- //Background color if box is not relevant here
292
- //Non transparent image: box clipped to real size. Background non relevant.
293
- //Transparent image: The image controls the transparency and lets shine through whatever background.
294
- //However on transparent imaage preset the composed image with the transparency color,
295
- //to keep the transparency when copying over the non transparent parts of the tiles.
296
- $ti = imagecolortransparent($src);
297
-
298
- if ($ti >= 0) {
299
- $tc = imagecolorsforindex($src,$ti);
300
- $ti = imagecolorallocate($bg,$tc['red'],$tc['green'],$tc['blue']);
301
- imagefill($bg,0,0,$ti);
302
- imagecolortransparent($bg, $ti);
303
- }
304
-
305
- //This has only an effect for the non repeatable dimension.
306
- //compute start of src and dest coordinates of the single copy
307
- if ( $bg_x < 0 ) {
308
- $dst_x = 0;
309
- $src_x = -$bg_x;
310
- } else {
311
- $src_x = 0;
312
- $dst_x = $bg_x;
313
- }
314
-
315
- if ( $bg_y < 0 ) {
316
- $dst_y = 0;
317
- $src_y = -$bg_y;
318
- } else {
319
- $src_y = 0;
320
- $dst_y = $bg_y;
321
- }
322
-
323
- //For historical reasons exchange meanings of variables:
324
- //start_* will be the start values, while bg_* will be the temporary start values in the loops
325
- $start_x = $bg_x;
326
- $start_y = $bg_y;
327
-
328
- // Copy regions from the source image to the background
329
- if ( $repeat === "no-repeat" ) {
330
-
331
- // Simply place the image on the background
332
- imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $img_h);
333
-
334
- } else if ( $repeat === "repeat-x" ) {
335
-
336
- for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) {
337
- if ( $bg_x < 0 ) {
338
- $dst_x = 0;
339
- $src_x = -$bg_x;
340
- $w = $img_w + $bg_x;
341
- } else {
342
- $dst_x = $bg_x;
343
- $src_x = 0;
344
- $w = $img_w;
345
- }
346
- imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $img_h);
347
  }
348
-
349
- } else if ( $repeat === "repeat-y" ) {
350
-
351
- for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) {
352
- if ( $bg_y < 0 ) {
353
- $dst_y = 0;
354
- $src_y = -$bg_y;
355
- $h = $img_h + $bg_y;
356
- } else {
357
- $dst_y = $bg_y;
358
- $src_y = 0;
359
- $h = $img_h;
360
- }
361
- imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $h);
362
-
363
  }
364
-
365
- } else if ( $repeat === "repeat" ) {
366
-
367
- for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
368
  for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) {
369
-
370
  if ( $bg_x < 0 ) {
371
  $dst_x = 0;
372
  $src_x = -$bg_x;
373
  $w = $img_w + $bg_x;
374
- } else {
 
375
  $dst_x = $bg_x;
376
  $src_x = 0;
377
  $w = $img_w;
378
  }
379
-
 
 
 
 
 
 
380
  if ( $bg_y < 0 ) {
381
  $dst_y = 0;
382
  $src_y = -$bg_y;
383
  $h = $img_h + $bg_y;
384
- } else {
 
385
  $dst_y = $bg_y;
386
  $src_y = 0;
387
  $h = $img_h;
388
  }
389
- imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $h);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
390
  }
391
  }
392
- }
393
-
394
- else {
395
- print 'Unknown repeat!';
396
- }
397
-
398
- imagedestroy($src);
399
 
400
  } /* End optimize away creation of duplicates */
401
 
@@ -406,20 +402,20 @@ abstract class Abstract_Renderer {
406
  //width, height: box size in pt
407
  //bg_width, bg_height: box size in px
408
  //x, y: left/top edge of box on page in pt
409
- //start_x, start_y: placement of image relativ to pattern
410
  //$repeat: repeat mode
411
  //$bg: GD object of result image
412
  //$src: GD object of original image
413
  //When using cpdf and optimization to direct png creation from gd object is available,
414
  //don't create temp file, but place gd object directly into the pdf
415
- if ( !$is_png && method_exists( $this->_canvas, "get_cpdf" ) &&
416
- method_exists( $this->_canvas->get_cpdf(), "addImagePng" ) ) {
417
  // Note: CPDF_Adapter image converts y position
418
  $this->_canvas->get_cpdf()->addImagePng($filedummy, $x, $this->_canvas->get_height() - $y - $height, $width, $height, $bg);
419
  }
420
 
421
  else {
422
- $tmp_name = tempnam(DOMPDF_TEMP_DIR, "bg_dompdf_img_");
 
423
  @unlink($tmp_name);
424
  $tmp_file = "$tmp_name.png";
425
 
@@ -433,8 +429,9 @@ abstract class Abstract_Renderer {
433
  //debugpng
434
  if (DEBUGPNG) print '[_background_image unlink '.$tmp_file.']';
435
 
436
- if (!DEBUGKEEPTEMP)
437
  unlink($tmp_file);
 
438
  }
439
 
440
  $this->_canvas->clipping_end();
@@ -468,398 +465,289 @@ abstract class Abstract_Renderer {
468
  return $pattern;
469
  }
470
 
471
- protected function _border_none($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
472
  return;
473
  }
474
 
475
- protected function _border_hidden($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
476
  return;
477
  }
478
 
479
  // Border rendering functions
480
- protected function _border_dotted($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
481
- list($top, $right, $bottom, $left) = $widths;
482
-
483
- $pattern = $this->_get_dash_pattern("dotted", $$side);
484
-
485
- switch ($side) {
486
-
487
- case "top":
488
- $delta = $top / 2;
489
- case "bottom":
490
- $delta = isset($delta) ? $delta : -$bottom / 2;
491
- $this->_canvas->line($x, $y + $delta, $x + $length, $y + $delta, $color, $$side, $pattern);
492
- break;
493
 
494
- case "left":
495
- $delta = $left / 2;
496
- case "right":
497
- $delta = isset($delta) ? $delta : - $right / 2;
498
- $this->_canvas->line($x + $delta, $y, $x + $delta, $y + $length, $color, $$side, $pattern);
499
- break;
500
-
501
- default:
502
- return;
503
-
504
- }
505
  }
506
 
507
-
508
- protected function _border_dashed($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
509
- list($top, $right, $bottom, $left) = $widths;
510
 
511
- $pattern = $this->_get_dash_pattern("dashed", $$side);
512
-
513
- switch ($side) {
514
 
515
- case "top":
516
- $delta = $top / 2;
517
- case "bottom":
518
- $delta = isset($delta) ? $delta : -$bottom / 2;
519
- $this->_canvas->line($x, $y + $delta, $x + $length, $y + $delta, $color, $$side, $pattern);
520
- break;
521
 
522
- case "left":
523
- $delta = $left / 2;
524
- case "right":
525
- $delta = isset($delta) ? $delta : - $right / 2;
526
- $this->_canvas->line($x + $delta, $y, $x + $delta, $y + $length, $color, $$side, $pattern);
527
- break;
528
-
529
- default:
530
  return;
531
  }
532
-
533
- }
534
 
535
-
536
- protected function _border_solid($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
537
  list($top, $right, $bottom, $left) = $widths;
538
 
539
  // All this polygon business is for beveled corners...
540
  switch ($side) {
541
-
542
- case "top":
543
- if ( $corner_style === "bevel" ) {
544
-
545
  $points = array($x, $y,
546
  $x + $length, $y,
547
  $x + $length - $right, $y + $top,
548
  $x + $left, $y + $top);
549
  $this->_canvas->polygon($points, $color, null, null, true);
550
- } else
551
- $this->_canvas->filled_rectangle($x, $y, $length, $top, $color);
552
-
553
- break;
554
-
555
- case "bottom":
556
- if ( $corner_style === "bevel" ) {
557
  $points = array($x, $y,
558
  $x + $length, $y,
559
  $x + $length - $right, $y - $bottom,
560
  $x + $left, $y - $bottom);
561
  $this->_canvas->polygon($points, $color, null, null, true);
562
- } else
563
- $this->_canvas->filled_rectangle($x, $y - $bottom, $length, $bottom, $color);
564
-
565
- break;
566
-
567
- case "left":
568
- if ( $corner_style === "bevel" ) {
569
  $points = array($x, $y,
570
  $x, $y + $length,
571
  $x + $left, $y + $length - $bottom,
572
  $x + $left, $y + $top);
573
  $this->_canvas->polygon($points, $color, null, null, true);
574
- } else
575
- $this->_canvas->filled_rectangle($x, $y, $left, $length, $color);
576
-
577
- break;
578
-
579
- case "right":
580
- if ( $corner_style === "bevel" ) {
581
  $points = array($x, $y,
582
  $x, $y + $length,
583
  $x - $right, $y + $length - $bottom,
584
  $x - $right, $y + $top);
585
  $this->_canvas->polygon($points, $color, null, null, true);
586
- } else
587
- $this->_canvas->filled_rectangle($x - $right, $y, $right, $length, $color);
588
-
589
- break;
590
-
591
- default:
592
- return;
593
-
594
  }
595
-
596
  }
597
 
598
-
599
- protected function _border_double($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
600
- list($top, $right, $bottom, $left) = $widths;
601
-
602
- $line_width = $$side / 3;
603
-
604
- // We draw the outermost edge first. Points are ordered: outer left,
605
- // outer right, inner right, inner left, or outer top, outer bottom,
606
- // inner bottom, inner top.
607
  switch ($side) {
608
 
609
  case "top":
610
- if ( $corner_style === "bevel" ) {
611
- $left_line_width = $left / 3;
612
- $right_line_width = $right / 3;
613
-
614
- $points = array($x, $y,
615
- $x + $length, $y,
616
- $x + $length - $right_line_width, $y + $line_width,
617
- $x + $left_line_width, $y + $line_width,);
618
- $this->_canvas->polygon($points, $color, null, null, true);
619
-
620
- $points = array($x + $left - $left_line_width, $y + $top - $line_width,
621
- $x + $length - $right + $right_line_width, $y + $top - $line_width,
622
- $x + $length - $right, $y + $top,
623
- $x + $left, $y + $top);
624
- $this->_canvas->polygon($points, $color, null, null, true);
625
-
626
- } else {
627
- $this->_canvas->filled_rectangle($x, $y, $length, $line_width, $color);
628
- $this->_canvas->filled_rectangle($x, $y + $top - $line_width, $length, $line_width, $color);
629
-
630
- }
631
  break;
632
-
633
- case "bottom":
634
- if ( $corner_style === "bevel" ) {
635
- $left_line_width = $left / 3;
636
- $right_line_width = $right / 3;
637
-
638
- $points = array($x, $y,
639
- $x + $length, $y,
640
- $x + $length - $right_line_width, $y - $line_width,
641
- $x + $left_line_width, $y - $line_width);
642
- $this->_canvas->polygon($points, $color, null, null, true);
643
-
644
- $points = array($x + $left - $left_line_width, $y - $bottom + $line_width,
645
- $x + $length - $right + $right_line_width, $y - $bottom + $line_width,
646
- $x + $length - $right, $y - $bottom,
647
- $x + $left, $y - $bottom);
648
- $this->_canvas->polygon($points, $color, null, null, true);
649
 
650
- } else {
651
- $this->_canvas->filled_rectangle($x, $y - $line_width, $length, $line_width, $color);
652
- $this->_canvas->filled_rectangle($x, $y - $bottom, $length, $line_width, $color);
653
- }
654
-
 
655
  break;
656
 
657
  case "left":
658
- if ( $corner_style === "bevel" ) {
659
- $top_line_width = $top / 3;
660
- $bottom_line_width = $bottom / 3;
661
-
662
- $points = array($x, $y,
663
- $x, $y + $length,
664
- $x + $line_width, $y + $length - $bottom_line_width,
665
- $x + $line_width, $y + $top_line_width);
666
- $this->_canvas->polygon($points, $color, null, null, true);
667
-
668
- $points = array($x + $left - $line_width, $y + $top - $top_line_width,
669
- $x + $left - $line_width, $y + $length - $bottom + $bottom_line_width,
670
- $x + $left, $y + $length - $bottom,
671
- $x + $left, $y + $top);
672
- $this->_canvas->polygon($points, $color, null, null, true);
673
-
674
- } else {
675
- $this->_canvas->filled_rectangle($x, $y, $line_width, $length, $color);
676
- $this->_canvas->filled_rectangle($x + $left - $line_width, $y, $line_width, $length, $color);
677
- }
678
-
679
  break;
680
-
681
- case "right":
682
- if ( $corner_style === "bevel" ) {
683
- $top_line_width = $top / 3;
684
- $bottom_line_width = $bottom / 3;
685
-
686
-
687
- $points = array($x, $y,
688
- $x, $y + $length,
689
- $x - $line_width, $y + $length - $bottom_line_width,
690
- $x - $line_width, $y + $top_line_width);
691
- $this->_canvas->polygon($points, $color, null, null, true);
692
-
693
- $points = array($x - $right + $line_width, $y + $top - $top_line_width,
694
- $x - $right + $line_width, $y + $length - $bottom + $bottom_line_width,
695
- $x - $right, $y + $length - $bottom,
696
- $x - $right, $y + $top);
697
- $this->_canvas->polygon($points, $color, null, null, true);
698
 
699
- } else {
700
- $this->_canvas->filled_rectangle($x - $line_width, $y, $line_width, $length, $color);
701
- $this->_canvas->filled_rectangle($x - $right, $y, $line_width, $length, $color);
702
- }
703
-
 
704
  break;
705
 
706
  default:
707
  return;
708
 
709
  }
710
-
711
  }
712
 
713
- protected function _border_groove($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
714
  list($top, $right, $bottom, $left) = $widths;
715
-
716
- $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2);
717
-
718
- $this->_border_inset($x, $y, $length, $color, $half_widths, $side);
719
 
720
- switch ($side) {
721
 
722
- case "top":
723
- $x += $left / 2;
724
- $y += $top / 2;
725
- $length -= $left / 2 + $right / 2;
726
- break;
727
-
728
- case "bottom":
729
- $x += $left / 2;
730
- $y -= $bottom / 2;
731
- $length -= $left / 2 + $right / 2;
732
- break;
733
-
734
- case "left":
735
- $x += $left / 2;
736
- $y += $top / 2;
737
- $length -= $top / 2 + $bottom / 2;
738
- break;
739
 
740
- case "right":
741
- $x -= $right / 2;
742
- $y += $top / 2;
743
- $length -= $top / 2 + $bottom / 2;
744
- break;
745
 
746
- default:
747
- return;
748
-
749
- }
750
-
751
- $this->_border_outset($x, $y, $length, $color, $half_widths, $side);
752
-
753
  }
754
-
755
- protected function _border_ridge($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
756
  list($top, $right, $bottom, $left) = $widths;
757
-
758
- $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2);
759
-
760
- $this->_border_outset($x, $y, $length, $color, $half_widths, $side);
761
 
762
- switch ($side) {
763
 
764
- case "top":
765
- $x += $left / 2;
766
- $y += $top / 2;
767
- $length -= $left / 2 + $right / 2;
768
- break;
769
 
770
- case "bottom":
771
- $x += $left / 2;
772
- $y -= $bottom / 2;
773
- $length -= $left / 2 + $right / 2;
774
- break;
775
 
776
- case "left":
777
- $x += $left / 2;
778
- $y += $top / 2;
779
- $length -= $top / 2 + $bottom / 2;
780
- break;
781
 
782
- case "right":
783
- $x -= $right / 2;
784
- $y += $top / 2;
785
- $length -= $top / 2 + $bottom / 2;
786
- break;
787
 
788
- default:
789
- return;
790
 
791
- }
 
 
792
 
793
- $this->_border_inset($x, $y, $length, $color, $half_widths, $side);
794
 
795
  }
796
 
797
  protected function _tint($c) {
798
  if ( !is_numeric($c) )
799
  return $c;
800
-
801
  return min(1, $c + 0.16);
802
  }
803
 
804
  protected function _shade($c) {
805
  if ( !is_numeric($c) )
806
  return $c;
807
-
808
  return max(0, $c - 0.33);
809
  }
810
 
811
- protected function _border_inset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
812
- list($top, $right, $bottom, $left) = $widths;
813
-
814
  switch ($side) {
815
-
816
- case "top":
817
- case "left":
818
- $shade = array_map(array($this, "_shade"), $color);
819
- $this->_border_solid($x, $y, $length, $shade, $widths, $side);
820
- break;
821
-
822
- case "bottom":
823
- case "right":
824
- $tint = array_map(array($this, "_tint"), $color);
825
- $this->_border_solid($x, $y, $length, $tint, $widths, $side);
826
- break;
827
-
828
- default:
829
- return;
830
  }
831
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
832
 
833
- protected function _border_outset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
 
 
 
 
 
834
  list($top, $right, $bottom, $left) = $widths;
835
 
 
 
 
 
 
 
 
 
 
836
  switch ($side) {
837
- case "top":
838
- case "left":
839
- $tint = array_map(array($this, "_tint"), $color);
840
- $this->_border_solid($x, $y, $length, $tint, $widths, $side);
841
- break;
842
-
843
- case "bottom":
844
- case "right":
845
- $shade = array_map(array($this, "_shade"), $color);
846
- $this->_border_solid($x, $y, $length, $shade, $widths, $side);
847
- break;
848
-
849
- default:
850
- return;
851
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
852
  }
853
  }
854
-
855
  protected function _set_opacity($opacity) {
856
  if ( is_numeric($opacity) && $opacity <= 1.0 && $opacity >= 0.0 ) {
857
  $this->_canvas->set_opacity( $opacity );
858
  }
859
  }
860
-
861
  protected function _debug_layout($box, $color = "red", $style = array()) {
862
  $this->_canvas->rectangle($box[0], $box[1], $box[2], $box[3], CSS_Color::parse($color), 0.1, $style);
863
  }
864
- //........................................................................
865
  }
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
+ * @author Fabien Ménager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
9
  */
10
 
11
  /**
54
  /**
55
  * Render a background image over a rectangular area
56
  *
57
+ * @param string $url The background image to load
58
  * @param float $x The left edge of the rectangular area
59
  * @param float $y The top edge of the rectangular area
60
  * @param float $width The width of the rectangular area
65
  $sheet = $style->get_stylesheet();
66
 
67
  // Skip degenerate cases
68
+ if ( $width == 0 || $height == 0 ) {
69
  return;
70
+ }
71
 
72
  $box_width = $width;
73
  $box_height = $height;
75
  //debugpng
76
  if (DEBUGPNG) print '[_background_image '.$url.']';
77
 
78
+ list($img, $type, /*$msg*/) = Image_Cache::resolve_url(
79
+ $url,
80
+ $sheet->get_protocol(),
81
+ $sheet->get_host(),
82
+ $sheet->get_base_path(),
83
+ $this->_dompdf
84
+ );
85
 
86
  // Bail if the image is no good
87
+ if ( Image_Cache::is_broken($img) ) {
88
  return;
89
+ }
90
 
91
  //Try to optimize away reading and composing of same background multiple times
92
  //Postponing read with imagecreatefrom ...()
93
+ //final composition parameters and name not known yet
94
  //Therefore read dimension directly from file, instead of creating gd object first.
95
  //$img_w = imagesx($src); $img_h = imagesy($src);
96
 
100
  }
101
 
102
  $repeat = $style->background_repeat;
103
+ $dpi = $this->_dompdf->get_option("dpi");
104
 
105
  //Increase background resolution and dependent box size according to image resolution to be placed in
106
  //Then image can be copied in without resize
107
+ $bg_width = round((float)($width * $dpi) / 72);
108
+ $bg_height = round((float)($height * $dpi) / 72);
109
 
110
  //Need %bg_x, $bg_y as background pos, where img starts, converted to pixel
111
 
119
  $x2 = $p * $bg_width;
120
 
121
  $bg_x = $x2 - $x1;
122
+ }
123
+ else {
124
+ $bg_x = (float)($style->length_in_pt($bg_x)*$dpi) / 72;
125
  }
126
 
127
+ $bg_x = round($bg_x + $style->length_in_pt($style->border_left_width)*$dpi / 72);
128
 
129
  if ( is_percent($bg_y) ) {
130
  // The point $bg_y % from the left edge of the image is placed
134
  $y2 = $p * $bg_height;
135
 
136
  $bg_y = $y2 - $y1;
137
+ }
138
+ else {
139
+ $bg_y = (float)($style->length_in_pt($bg_y)*$dpi) / 72;
140
  }
141
 
142
+ $bg_y = round($bg_y + $style->length_in_pt($style->border_top_width)*$dpi / 72);
143
 
144
  //clip background to the image area on partial repeat. Nothing to do if img off area
145
  //On repeat, normalize start position to the tile at immediate left/top or 0/0 of area
150
  //No repeat x
151
  if ($bg_x < 0) {
152
  $bg_width = $img_w + $bg_x;
153
+ }
154
+ else {
155
+ $x += ($bg_x * 72)/$dpi;
156
  $bg_width = $bg_width - $bg_x;
157
  if ($bg_width > $img_w) {
158
  $bg_width = $img_w;
159
  }
160
  $bg_x = 0;
161
  }
162
+
163
  if ($bg_width <= 0) {
164
  return;
165
  }
166
+
167
+ $width = (float)($bg_width * 72)/$dpi;
168
+ }
169
+ else {
170
  //repeat x
171
  if ($bg_x < 0) {
172
  $bg_x = - ((-$bg_x) % $img_w);
173
+ }
174
+ else {
175
  $bg_x = $bg_x % $img_w;
176
  if ($bg_x > 0) {
177
  $bg_x -= $img_w;
183
  //no repeat y
184
  if ($bg_y < 0) {
185
  $bg_height = $img_h + $bg_y;
186
+ }
187
+ else {
188
+ $y += ($bg_y * 72)/$dpi;
189
  $bg_height = $bg_height - $bg_y;
190
  if ($bg_height > $img_h) {
191
  $bg_height = $img_h;
195
  if ($bg_height <= 0) {
196
  return;
197
  }
198
+ $height = (float)($bg_height * 72)/$dpi;
199
+ }
200
+ else {
201
  //repeat y
202
  if ($bg_y < 0) {
203
  $bg_y = - ((-$bg_y) % $img_h);
204
+ }
205
+ else {
206
  $bg_y = $bg_y % $img_h;
207
  if ($bg_y > 0) {
208
  $bg_y -= $img_h;
214
  if ( $repeat === "repeat" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height ) {
215
  $repeat = "repeat-x";
216
  }
217
+
218
  if ( $repeat === "repeat" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width ) {
219
  $repeat = "repeat-y";
220
  }
221
+
222
  if ( ($repeat === "repeat-x" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width) ||
223
  ($repeat === "repeat-y" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height) ) {
224
  $repeat = "no-repeat";
230
  //Note: Here, bg_* are the start values, not end values after going through the tile loops!
231
 
232
  $filedummy = $img;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
 
234
  $is_png = false;
235
  $filedummy .= '_'.$bg_width.'_'.$bg_height.'_'.$bg_x.'_'.$bg_y.'_'.$repeat;
 
 
236
 
237
  //Optimization to avoid multiple times rendering the same image.
238
  //If check functions are existing and identical image already cached,
239
  //then skip creation of duplicate, because it is not needed by addImagePng
240
+ if ( $this->_canvas instanceof CPDF_Adapter &&
 
 
241
  $this->_canvas->get_cpdf()->image_iscached($filedummy) ) {
242
+ $bg = null;
243
+ }
 
 
 
244
 
245
  else {
246
+
247
+ // Create a new image to fit over the background rectangle
248
+ $bg = imagecreatetruecolor($bg_width, $bg_height);
249
+
250
+ switch (strtolower($type)) {
251
+ case IMAGETYPE_PNG:
252
+ $is_png = true;
253
+ imagesavealpha($bg, true);
254
+ imagealphablending($bg, false);
255
+ $src = imagecreatefrompng($img);
256
+ break;
257
 
258
+ case IMAGETYPE_JPEG:
259
+ $src = imagecreatefromjpeg($img);
260
+ break;
261
+
262
+ case IMAGETYPE_GIF:
263
+ $src = imagecreatefromgif($img);
264
+ break;
265
+
266
+ case IMAGETYPE_BMP:
267
+ $src = imagecreatefrombmp($img);
268
+ break;
269
+
270
+ default:
271
+ return; // Unsupported image type
272
+ }
273
 
274
+ if ( $src == null ) {
275
+ return;
276
+ }
277
 
278
+ //Background color if box is not relevant here
279
+ //Non transparent image: box clipped to real size. Background non relevant.
280
+ //Transparent image: The image controls the transparency and lets shine through whatever background.
281
+ //However on transparent image preset the composed image with the transparency color,
282
+ //to keep the transparency when copying over the non transparent parts of the tiles.
283
+ $ti = imagecolortransparent($src);
284
+
285
+ if ( $ti >= 0 ) {
286
+ $tc = imagecolorsforindex($src, $ti);
287
+ $ti = imagecolorallocate($bg, $tc['red'], $tc['green'], $tc['blue']);
288
+ imagefill($bg, 0, 0, $ti);
289
+ imagecolortransparent($bg, $ti);
290
+ }
291
 
292
+ //This has only an effect for the non repeatable dimension.
293
+ //compute start of src and dest coordinates of the single copy
294
+ if ( $bg_x < 0 ) {
295
+ $dst_x = 0;
296
+ $src_x = -$bg_x;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  }
298
+ else {
299
+ $src_x = 0;
300
+ $dst_x = $bg_x;
 
 
 
 
 
 
 
 
 
 
 
 
301
  }
302
+
303
+ if ( $bg_y < 0 ) {
304
+ $dst_y = 0;
305
+ $src_y = -$bg_y;
306
+ }
307
+ else {
308
+ $src_y = 0;
309
+ $dst_y = $bg_y;
310
+ }
311
+
312
+ //For historical reasons exchange meanings of variables:
313
+ //start_* will be the start values, while bg_* will be the temporary start values in the loops
314
+ $start_x = $bg_x;
315
+ $start_y = $bg_y;
316
+
317
+ // Copy regions from the source image to the background
318
+ if ( $repeat === "no-repeat" ) {
319
+
320
+ // Simply place the image on the background
321
+ imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $img_h);
322
+
323
+ }
324
+ else if ( $repeat === "repeat-x" ) {
325
+
326
  for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) {
 
327
  if ( $bg_x < 0 ) {
328
  $dst_x = 0;
329
  $src_x = -$bg_x;
330
  $w = $img_w + $bg_x;
331
+ }
332
+ else {
333
  $dst_x = $bg_x;
334
  $src_x = 0;
335
  $w = $img_w;
336
  }
337
+ imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $img_h);
338
+ }
339
+
340
+ }
341
+ else if ( $repeat === "repeat-y" ) {
342
+
343
+ for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) {
344
  if ( $bg_y < 0 ) {
345
  $dst_y = 0;
346
  $src_y = -$bg_y;
347
  $h = $img_h + $bg_y;
348
+ }
349
+ else {
350
  $dst_y = $bg_y;
351
  $src_y = 0;
352
  $h = $img_h;
353
  }
354
+ imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $h);
355
+
356
+ }
357
+
358
+ }
359
+ else if ( $repeat === "repeat" ) {
360
+
361
+ for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) {
362
+ for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) {
363
+
364
+ if ( $bg_x < 0 ) {
365
+ $dst_x = 0;
366
+ $src_x = -$bg_x;
367
+ $w = $img_w + $bg_x;
368
+ }
369
+ else {
370
+ $dst_x = $bg_x;
371
+ $src_x = 0;
372
+ $w = $img_w;
373
+ }
374
+
375
+ if ( $bg_y < 0 ) {
376
+ $dst_y = 0;
377
+ $src_y = -$bg_y;
378
+ $h = $img_h + $bg_y;
379
+ }
380
+ else {
381
+ $dst_y = $bg_y;
382
+ $src_y = 0;
383
+ $h = $img_h;
384
+ }
385
+ imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $h);
386
+ }
387
  }
388
  }
389
+
390
+ else {
391
+ print 'Unknown repeat!';
392
+ }
393
+
394
+ imagedestroy($src);
 
395
 
396
  } /* End optimize away creation of duplicates */
397
 
402
  //width, height: box size in pt
403
  //bg_width, bg_height: box size in px
404
  //x, y: left/top edge of box on page in pt
405
+ //start_x, start_y: placement of image relative to pattern
406
  //$repeat: repeat mode
407
  //$bg: GD object of result image
408
  //$src: GD object of original image
409
  //When using cpdf and optimization to direct png creation from gd object is available,
410
  //don't create temp file, but place gd object directly into the pdf
411
+ if ( !$is_png && $this->_canvas instanceof CPDF_Adapter ) {
 
412
  // Note: CPDF_Adapter image converts y position
413
  $this->_canvas->get_cpdf()->addImagePng($filedummy, $x, $this->_canvas->get_height() - $y - $height, $width, $height, $bg);
414
  }
415
 
416
  else {
417
+ $tmp_dir = $this->_dompdf->get_option("temp_dir");
418
+ $tmp_name = tempnam($tmp_dir, "bg_dompdf_img_");
419
  @unlink($tmp_name);
420
  $tmp_file = "$tmp_name.png";
421
 
429
  //debugpng
430
  if (DEBUGPNG) print '[_background_image unlink '.$tmp_file.']';
431
 
432
+ if (!DEBUGKEEPTEMP) {
433
  unlink($tmp_file);
434
+ }
435
  }
436
 
437
  $this->_canvas->clipping_end();
465
  return $pattern;
466
  }
467
 
468
+ protected function _border_none($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) {
469
  return;
470
  }
471
 
472
+ protected function _border_hidden($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) {
473
  return;
474
  }
475
 
476
  // Border rendering functions
 
 
 
 
 
 
 
 
 
 
 
 
 
477
 
478
+ protected function _border_dotted($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) {
479
+ $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dotted", $r1, $r2);
 
 
 
 
 
 
 
 
 
480
  }
481
 
 
 
 
482
 
483
+ protected function _border_dashed($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) {
484
+ $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dashed", $r1, $r2);
485
+ }
486
 
 
 
 
 
 
 
487
 
488
+ protected function _border_solid($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) {
489
+ // TODO: Solve rendering where one corner is beveled (radius == 0), one corner isn't.
490
+ if ( $corner_style !== "bevel" || $r1 > 0 || $r2 > 0 ) {
491
+ // do it the simple way
492
+ $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "solid", $r1, $r2);
 
 
 
493
  return;
494
  }
 
 
495
 
 
 
496
  list($top, $right, $bottom, $left) = $widths;
497
 
498
  // All this polygon business is for beveled corners...
499
  switch ($side) {
500
+ case "top":
 
 
 
501
  $points = array($x, $y,
502
  $x + $length, $y,
503
  $x + $length - $right, $y + $top,
504
  $x + $left, $y + $top);
505
  $this->_canvas->polygon($points, $color, null, null, true);
506
+ break;
507
+
508
+ case "bottom":
 
 
 
 
509
  $points = array($x, $y,
510
  $x + $length, $y,
511
  $x + $length - $right, $y - $bottom,
512
  $x + $left, $y - $bottom);
513
  $this->_canvas->polygon($points, $color, null, null, true);
514
+ break;
515
+
516
+ case "left":
 
 
 
 
517
  $points = array($x, $y,
518
  $x, $y + $length,
519
  $x + $left, $y + $length - $bottom,
520
  $x + $left, $y + $top);
521
  $this->_canvas->polygon($points, $color, null, null, true);
522
+ break;
523
+
524
+ case "right":
 
 
 
 
525
  $points = array($x, $y,
526
  $x, $y + $length,
527
  $x - $right, $y + $length - $bottom,
528
  $x - $right, $y + $top);
529
  $this->_canvas->polygon($points, $color, null, null, true);
530
+ break;
531
+
532
+ default:
533
+ return;
 
 
 
 
534
  }
 
535
  }
536
 
537
+ protected function _apply_ratio($side, $ratio, $top, $right, $bottom, $left, &$x, &$y, &$length, &$r1, &$r2) {
 
 
 
 
 
 
 
 
538
  switch ($side) {
539
 
540
  case "top":
541
+ $r1 -= $left * $ratio;
542
+ $r2 -= $right * $ratio;
543
+ $x += $left * $ratio;
544
+ $y += $top * $ratio;
545
+ $length -= $left * $ratio + $right * $ratio;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
546
  break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
547
 
548
+ case "bottom":
549
+ $r1 -= $right * $ratio;
550
+ $r2 -= $left * $ratio;
551
+ $x += $left * $ratio;
552
+ $y -= $bottom * $ratio;
553
+ $length -= $left * $ratio + $right * $ratio;
554
  break;
555
 
556
  case "left":
557
+ $r1 -= $top * $ratio;
558
+ $r2 -= $bottom * $ratio;
559
+ $x += $left * $ratio;
560
+ $y += $top * $ratio;
561
+ $length -= $top * $ratio + $bottom * $ratio;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
562
  break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
563
 
564
+ case "right":
565
+ $r1 -= $bottom * $ratio;
566
+ $r2 -= $top * $ratio;
567
+ $x -= $right * $ratio;
568
+ $y += $top * $ratio;
569
+ $length -= $top * $ratio + $bottom * $ratio;
570
  break;
571
 
572
  default:
573
  return;
574
 
575
  }
 
576
  }
577
 
578
+ protected function _border_double($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) {
579
  list($top, $right, $bottom, $left) = $widths;
 
 
 
 
580
 
581
+ $third_widths = array($top / 3, $right / 3, $bottom / 3, $left / 3);
582
 
583
+ // draw the outer border
584
+ $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
585
 
586
+ $this->_apply_ratio($side, 2/3, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2);
 
 
 
 
587
 
588
+ $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2);
 
 
 
 
 
 
589
  }
590
+
591
+ protected function _border_groove($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) {
592
  list($top, $right, $bottom, $left) = $widths;
 
 
 
 
593
 
594
+ $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2);
595
 
596
+ $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2);
597
+
598
+ $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2);
 
 
599
 
600
+ $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2);
 
 
 
 
601
 
602
+ }
 
 
 
 
603
 
604
+ protected function _border_ridge($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) {
605
+ list($top, $right, $bottom, $left) = $widths;
 
 
 
606
 
607
+ $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2);
 
608
 
609
+ $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2);
610
+
611
+ $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2);
612
 
613
+ $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2);
614
 
615
  }
616
 
617
  protected function _tint($c) {
618
  if ( !is_numeric($c) )
619
  return $c;
620
+
621
  return min(1, $c + 0.16);
622
  }
623
 
624
  protected function _shade($c) {
625
  if ( !is_numeric($c) )
626
  return $c;
627
+
628
  return max(0, $c - 0.33);
629
  }
630
 
631
+ protected function _border_inset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) {
 
 
632
  switch ($side) {
633
+ case "top":
634
+ case "left":
635
+ $shade = array_map(array($this, "_shade"), $color);
636
+ $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2);
637
+ break;
638
+
639
+ case "bottom":
640
+ case "right":
641
+ $tint = array_map(array($this, "_tint"), $color);
642
+ $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2);
643
+ break;
644
+
645
+ default:
646
+ return;
 
647
  }
648
  }
649
+
650
+ protected function _border_outset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) {
651
+ switch ($side) {
652
+ case "top":
653
+ case "left":
654
+ $tint = array_map(array($this, "_tint"), $color);
655
+ $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2);
656
+ break;
657
+
658
+ case "bottom":
659
+ case "right":
660
+ $shade = array_map(array($this, "_shade"), $color);
661
+ $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2);
662
+ break;
663
 
664
+ default:
665
+ return;
666
+ }
667
+ }
668
+ // Draws a solid, dotted, or dashed line, observing the border radius
669
+ protected function _border_line($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $pattern_name, $r1 = 0, $r2 = 0) {
670
  list($top, $right, $bottom, $left) = $widths;
671
 
672
+ $width = $$side;
673
+ $pattern = $this->_get_dash_pattern($pattern_name, $width);
674
+
675
+ $half_width = $width/2;
676
+ $r1 -= $half_width;
677
+ $r2 -= $half_width;
678
+ $adjust = $r1/80;
679
+ $length -= $width;
680
+
681
  switch ($side) {
682
+ case "top":
683
+ $x += $half_width;
684
+ $y += $half_width;
685
+
686
+ if ( $r1 > 0 ) {
687
+ $this->_canvas->arc($x + $r1, $y + $r1, $r1, $r1, 90-$adjust, 135+$adjust, $color, $width, $pattern);
688
+ }
689
+
690
+ $this->_canvas->line($x + $r1, $y, $x + $length - $r2, $y, $color, $width, $pattern);
691
+
692
+ if ( $r2 > 0 ) {
693
+ $this->_canvas->arc($x + $length - $r2, $y + $r2, $r2, $r2, 45-$adjust, 90+$adjust, $color, $width, $pattern);
694
+ }
695
+ break;
696
+
697
+ case "bottom":
698
+ $x += $half_width;
699
+ $y -= $half_width;
700
+
701
+ if ( $r1 > 0 ) {
702
+ $this->_canvas->arc($x + $r1, $y - $r1, $r1, $r1, 225-$adjust, 270+$adjust, $color, $width, $pattern);
703
+ }
704
+
705
+ $this->_canvas->line($x + $r1, $y, $x + $length - $r2, $y, $color, $width, $pattern);
706
+
707
+ if ( $r2 > 0 ) {
708
+ $this->_canvas->arc($x + $length - $r2, $y - $r2, $r2, $r2, 270-$adjust, 315+$adjust, $color, $width, $pattern);
709
+ }
710
+ break;
711
+
712
+ case "left":
713
+ $y += $half_width;
714
+ $x += $half_width;
715
+
716
+ if ( $r1 > 0 ) {
717
+ $this->_canvas->arc($x + $r1, $y + $r1, $r1, $r1, 135-$adjust, 180+$adjust, $color, $width, $pattern);
718
+ }
719
+
720
+ $this->_canvas->line($x, $y + $r1, $x, $y + $length - $r2, $color, $width, $pattern);
721
+
722
+ if ( $r2 > 0 ) {
723
+ $this->_canvas->arc($x + $r2, $y + $length - $r2, $r2, $r2, 180-$adjust, 225+$adjust, $color, $width, $pattern);
724
+ }
725
+ break;
726
+
727
+ case "right":
728
+ $y += $half_width;
729
+ $x -= $half_width;
730
+
731
+ if ( $r1 > 0 ) {
732
+ $this->_canvas->arc($x - $r1, $y + $r1, $r1, $r1, 0-$adjust, 45+$adjust, $color, $width, $pattern);
733
+ }
734
+
735
+ $this->_canvas->line($x, $y + $r1, $x, $y + $length - $r2, $color, $width, $pattern);
736
+
737
+ if ( $r2 > 0 ) {
738
+ $this->_canvas->arc($x - $r2, $y + $length - $r2, $r2, $r2, 315-$adjust, 360+$adjust, $color, $width, $pattern);
739
+ }
740
+ break;
741
  }
742
  }
743
+
744
  protected function _set_opacity($opacity) {
745
  if ( is_numeric($opacity) && $opacity <= 1.0 && $opacity >= 0.0 ) {
746
  $this->_canvas->set_opacity( $opacity );
747
  }
748
  }
749
+
750
  protected function _debug_layout($box, $color = "red", $style = array()) {
751
  $this->_canvas->rectangle($box[0], $box[1], $box[2], $box[3], CSS_Color::parse($color), 0.1, $style);
752
  }
 
753
  }
dompdf/include/attribute_translator.cls.php CHANGED
@@ -3,15 +3,13 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: attribute_translator.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
12
  * Translates HTML 4.0 attributes into CSS rules
13
  *
14
- * @access private
15
  * @package dompdf
16
  */
17
  class Attribute_Translator {
@@ -199,24 +197,29 @@ class Attribute_Translator {
199
  10 => "52pt",
200
  11 => "60pt",
201
  );
202
-
203
-
 
 
204
  static function translate_attributes(Frame $frame) {
205
  $node = $frame->get_node();
206
- $tag = $node->tagName;
207
 
208
- if ( !isset(self::$__ATTRIBUTE_LOOKUP[$tag]) )
209
  return;
 
210
 
211
  $valid_attrs = self::$__ATTRIBUTE_LOOKUP[$tag];
212
  $attrs = $node->attributes;
213
  $style = rtrim($node->getAttribute(self::$_style_attr), "; ");
214
- if ( $style != "" )
215
  $style .= ";";
 
216
 
217
  foreach ($attrs as $attr => $attr_node ) {
218
- if ( !isset($valid_attrs[$attr]) )
219
  continue;
 
220
 
221
  $value = $attr_node->value;
222
 
@@ -224,11 +227,11 @@ class Attribute_Translator {
224
 
225
  // Look up $value in $target, if $target is an array:
226
  if ( is_array($target) ) {
227
-
228
- if ( isset($target[$value]) )
229
  $style .= " " . self::_resolve_target($node, $target[$value], $value);
230
-
231
- } else {
 
232
  // otherwise use target directly
233
  $style .= " " . self::_resolve_target($node, $target, $value);
234
  }
@@ -241,7 +244,14 @@ class Attribute_Translator {
241
 
242
  }
243
 
244
- static protected function _resolve_target($node, $target, $value) {
 
 
 
 
 
 
 
245
  if ( $target[0] === "!" ) {
246
  // Function call
247
  $func = "_" . mb_substr($target, 1);
@@ -250,18 +260,28 @@ class Attribute_Translator {
250
 
251
  return $value ? sprintf($target, $value) : "";
252
  }
253
-
254
- static function append_style(DOMNode $node, $new_style) {
 
 
 
 
255
  $style = rtrim($node->getAttribute(self::$_style_attr), ";");
256
  $style .= $new_style;
257
  $style = ltrim($style, ";");
258
  $node->setAttribute(self::$_style_attr, $style);
259
  }
260
-
261
- static protected function get_cell_list($node) {
 
 
 
 
 
262
  $xpath = new DOMXpath($node->ownerDocument);
263
 
264
  switch($node->nodeName) {
 
265
  case "table":
266
  $query = "tr/td | thead/tr/td | tbody/tr/td | tfoot/tr/td | tr/th | thead/tr/th | tbody/tr/th | tfoot/tr/th";
267
  break;
@@ -278,10 +298,13 @@ class Attribute_Translator {
278
  }
279
 
280
  return $xpath->query($query, $node);
281
- }
282
 
283
- //.....................................................................
284
-
 
 
 
285
  static protected function _get_valid_color($value) {
286
  if ( preg_match('/^#?([0-9A-F]{6})$/i', $value, $matches) ) {
287
  $value = "#$matches[1]";
@@ -290,17 +313,35 @@ class Attribute_Translator {
290
  return $value;
291
  }
292
 
293
- static protected function _set_color($node, $value) {
 
 
 
 
 
 
294
  $value = self::_get_valid_color($value);
295
  return "color: $value;";
296
  }
297
 
298
- static protected function _set_background_color($node, $value) {
 
 
 
 
 
 
299
  $value = self::_get_valid_color($value);
300
  return "background-color: $value;";
301
  }
302
 
303
- static protected function _set_table_cellpadding($node, $value) {
 
 
 
 
 
 
304
  $cell_list = self::get_cell_list($node);
305
 
306
  foreach ($cell_list as $cell) {
@@ -310,7 +351,13 @@ class Attribute_Translator {
310
  return null;
311
  }
312
 
313
- static protected function _set_table_border($node, $value) {
 
 
 
 
 
 
314
  $cell_list = self::get_cell_list($node);
315
 
316
  foreach ($cell_list as $cell) {
@@ -325,20 +372,34 @@ class Attribute_Translator {
325
  return ltrim($style, "; ");
326
  }
327
 
328
- static protected function _set_table_cellspacing($node, $value) {
 
 
 
 
 
 
329
  $style = rtrim($node->getAttribute(self::$_style_attr), ";");
330
 
331
- if ( $value == 0 )
332
  $style .= "; border-collapse: collapse;";
333
-
334
- else
335
  $style .= "; border-spacing: {$value}px; border-collapse: separate;";
336
-
 
337
  return ltrim($style, ";");
338
  }
339
-
340
- static protected function _set_table_rules($node, $value) {
 
 
 
 
 
 
341
  $new_style = "; border-collapse: collapse;";
 
342
  switch ($value) {
343
  case "none":
344
  $new_style .= "border-style: none;";
@@ -346,7 +407,7 @@ class Attribute_Translator {
346
 
347
  case "groups":
348
  // FIXME: unsupported
349
- return;
350
 
351
  case "rows":
352
  $new_style .= "border-style: solid none solid none; border-width: 1px; ";
@@ -379,40 +440,61 @@ class Attribute_Translator {
379
  return ltrim($style, "; ");
380
  }
381
 
382
- static protected function _set_hr_size($node, $value) {
 
 
 
 
 
 
383
  $style = rtrim($node->getAttribute(self::$_style_attr), ";");
384
  $style .= "; border-width: ".max(0, $value-2)."; ";
385
  return ltrim($style, "; ");
386
  }
387
 
388
- static protected function _set_hr_align($node, $value) {
 
 
 
 
 
 
389
  $style = rtrim($node->getAttribute(self::$_style_attr),";");
390
  $width = $node->getAttribute("width");
391
- if ( $width == "" )
 
392
  $width = "100%";
 
393
 
394
  $remainder = 100 - (double)rtrim($width, "% ");
395
 
396
  switch ($value) {
397
- case "left":
398
- $style .= "; margin-right: $remainder %;";
399
- break;
400
-
401
- case "right":
402
- $style .= "; margin-left: $remainder %;";
403
- break;
404
-
405
- case "center":
406
- $style .= "; margin-left: auto; margin-right: auto;";
407
- break;
408
-
409
- default:
410
- return null;
411
  }
 
412
  return ltrim($style, "; ");
413
  }
414
 
415
- static protected function _set_table_row_align($node, $value) {
 
 
 
 
 
 
416
  $cell_list = self::get_cell_list($node);
417
 
418
  foreach ($cell_list as $cell) {
@@ -422,7 +504,13 @@ class Attribute_Translator {
422
  return null;
423
  }
424
 
425
- static protected function _set_table_row_valign($node, $value) {
 
 
 
 
 
 
426
  $cell_list = self::get_cell_list($node);
427
 
428
  foreach ($cell_list as $cell) {
@@ -432,7 +520,13 @@ class Attribute_Translator {
432
  return null;
433
  }
434
 
435
- static protected function _set_table_row_bgcolor($node, $value) {
 
 
 
 
 
 
436
  $cell_list = self::get_cell_list($node);
437
  $value = self::_get_valid_color($value);
438
 
@@ -443,7 +537,13 @@ class Attribute_Translator {
443
  return null;
444
  }
445
 
446
- static protected function _set_body_link($node, $value) {
 
 
 
 
 
 
447
  $a_list = $node->getElementsByTagName("a");
448
  $value = self::_get_valid_color($value);
449
 
@@ -454,24 +554,39 @@ class Attribute_Translator {
454
  return null;
455
  }
456
 
457
- static protected function _set_basefont_size($node, $value) {
 
 
 
 
 
 
458
  // FIXME: ? we don't actually set the font size of anything here, just
459
  // the base size for later modification by <font> tags.
460
  self::$_last_basefont_size = $value;
461
  return null;
462
  }
463
-
464
- static protected function _set_font_size($node, $value) {
 
 
 
 
 
 
465
  $style = $node->getAttribute(self::$_style_attr);
466
 
467
- if ( $value[0] === "-" || $value[0] === "+" )
468
  $value = self::$_last_basefont_size + (int)$value;
469
-
470
- if ( isset(self::$_font_size_lookup[$value]) )
 
471
  $style .= "; font-size: " . self::$_font_size_lookup[$value] . ";";
472
- else
 
473
  $style .= "; font-size: $value;";
474
-
 
475
  return ltrim($style, "; ");
476
  }
477
  }
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
11
  * Translates HTML 4.0 attributes into CSS rules
12
  *
 
13
  * @package dompdf
14
  */
15
  class Attribute_Translator {
197
  10 => "52pt",
198
  11 => "60pt",
199
  );
200
+
201
+ /**
202
+ * @param Frame $frame
203
+ */
204
  static function translate_attributes(Frame $frame) {
205
  $node = $frame->get_node();
206
+ $tag = $node->nodeName;
207
 
208
+ if ( !isset(self::$__ATTRIBUTE_LOOKUP[$tag]) ) {
209
  return;
210
+ }
211
 
212
  $valid_attrs = self::$__ATTRIBUTE_LOOKUP[$tag];
213
  $attrs = $node->attributes;
214
  $style = rtrim($node->getAttribute(self::$_style_attr), "; ");
215
+ if ( $style != "" ) {
216
  $style .= ";";
217
+ }
218
 
219
  foreach ($attrs as $attr => $attr_node ) {
220
+ if ( !isset($valid_attrs[$attr]) ) {
221
  continue;
222
+ }
223
 
224
  $value = $attr_node->value;
225
 
227
 
228
  // Look up $value in $target, if $target is an array:
229
  if ( is_array($target) ) {
230
+ if ( isset($target[$value]) ) {
 
231
  $style .= " " . self::_resolve_target($node, $target[$value], $value);
232
+ }
233
+ }
234
+ else {
235
  // otherwise use target directly
236
  $style .= " " . self::_resolve_target($node, $target, $value);
237
  }
244
 
245
  }
246
 
247
+ /**
248
+ * @param DOMNode $node
249
+ * @param string $target
250
+ * @param string $value
251
+ *
252
+ * @return string
253
+ */
254
+ static protected function _resolve_target(DOMNode $node, $target, $value) {
255
  if ( $target[0] === "!" ) {
256
  // Function call
257
  $func = "_" . mb_substr($target, 1);
260
 
261
  return $value ? sprintf($target, $value) : "";
262
  }
263
+
264
+ /**
265
+ * @param DOMElement $node
266
+ * @param string $new_style
267
+ */
268
+ static function append_style(DOMElement $node, $new_style) {
269
  $style = rtrim($node->getAttribute(self::$_style_attr), ";");
270
  $style .= $new_style;
271
  $style = ltrim($style, ";");
272
  $node->setAttribute(self::$_style_attr, $style);
273
  }
274
+
275
+ /**
276
+ * @param DOMNode $node
277
+ *
278
+ * @return DOMNodeList|DOMElement[]
279
+ */
280
+ static protected function get_cell_list(DOMNode $node) {
281
  $xpath = new DOMXpath($node->ownerDocument);
282
 
283
  switch($node->nodeName) {
284
+ default:
285
  case "table":
286
  $query = "tr/td | thead/tr/td | tbody/tr/td | tfoot/tr/td | tr/th | thead/tr/th | tbody/tr/th | tfoot/tr/th";
287
  break;
298
  }
299
 
300
  return $xpath->query($query, $node);
301
+ }
302
 
303
+ /**
304
+ * @param string $value
305
+ *
306
+ * @return string
307
+ */
308
  static protected function _get_valid_color($value) {
309
  if ( preg_match('/^#?([0-9A-F]{6})$/i', $value, $matches) ) {
310
  $value = "#$matches[1]";
313
  return $value;
314
  }
315
 
316
+ /**
317
+ * @param DOMElement $node
318
+ * @param string $value
319
+ *
320
+ * @return string
321
+ */
322
+ static protected function _set_color(DOMElement $node, $value) {
323
  $value = self::_get_valid_color($value);
324
  return "color: $value;";
325
  }
326
 
327
+ /**
328
+ * @param DOMElement $node
329
+ * @param string $value
330
+ *
331
+ * @return string
332
+ */
333
+ static protected function _set_background_color(DOMElement $node, $value) {
334
  $value = self::_get_valid_color($value);
335
  return "background-color: $value;";
336
  }
337
 
338
+ /**
339
+ * @param DOMElement $node
340
+ * @param string $value
341
+ *
342
+ * @return null
343
+ */
344
+ static protected function _set_table_cellpadding(DOMElement $node, $value) {
345
  $cell_list = self::get_cell_list($node);
346
 
347
  foreach ($cell_list as $cell) {
351
  return null;
352
  }
353
 
354
+ /**
355
+ * @param DOMElement $node
356
+ * @param string $value
357
+ *
358
+ * @return string
359
+ */
360
+ static protected function _set_table_border(DOMElement $node, $value) {
361
  $cell_list = self::get_cell_list($node);
362
 
363
  foreach ($cell_list as $cell) {
372
  return ltrim($style, "; ");
373
  }
374
 
375
+ /**
376
+ * @param DOMElement $node
377
+ * @param string $value
378
+ *
379
+ * @return string
380
+ */
381
+ static protected function _set_table_cellspacing(DOMElement $node, $value) {
382
  $style = rtrim($node->getAttribute(self::$_style_attr), ";");
383
 
384
+ if ( $value == 0 ) {
385
  $style .= "; border-collapse: collapse;";
386
+ }
387
+ else {
388
  $style .= "; border-spacing: {$value}px; border-collapse: separate;";
389
+ }
390
+
391
  return ltrim($style, ";");
392
  }
393
+
394
+ /**
395
+ * @param DOMElement $node
396
+ * @param string $value
397
+ *
398
+ * @return null|string
399
+ */
400
+ static protected function _set_table_rules(DOMElement $node, $value) {
401
  $new_style = "; border-collapse: collapse;";
402
+
403
  switch ($value) {
404
  case "none":
405
  $new_style .= "border-style: none;";
407
 
408
  case "groups":
409
  // FIXME: unsupported
410
+ return null;
411
 
412
  case "rows":
413
  $new_style .= "border-style: solid none solid none; border-width: 1px; ";
440
  return ltrim($style, "; ");
441
  }
442
 
443
+ /**
444
+ * @param DOMElement $node
445
+ * @param string $value
446
+ *
447
+ * @return string
448
+ */
449
+ static protected function _set_hr_size(DOMElement $node, $value) {
450
  $style = rtrim($node->getAttribute(self::$_style_attr), ";");
451
  $style .= "; border-width: ".max(0, $value-2)."; ";
452
  return ltrim($style, "; ");
453
  }
454
 
455
+ /**
456
+ * @param DOMElement $node
457
+ * @param string $value
458
+ *
459
+ * @return null|string
460
+ */
461
+ static protected function _set_hr_align(DOMElement $node, $value) {
462
  $style = rtrim($node->getAttribute(self::$_style_attr),";");
463
  $width = $node->getAttribute("width");
464
+
465
+ if ( $width == "" ) {
466
  $width = "100%";
467
+ }
468
 
469
  $remainder = 100 - (double)rtrim($width, "% ");
470
 
471
  switch ($value) {
472
+ case "left":
473
+ $style .= "; margin-right: $remainder %;";
474
+ break;
475
+
476
+ case "right":
477
+ $style .= "; margin-left: $remainder %;";
478
+ break;
479
+
480
+ case "center":
481
+ $style .= "; margin-left: auto; margin-right: auto;";
482
+ break;
483
+
484
+ default:
485
+ return null;
486
  }
487
+
488
  return ltrim($style, "; ");
489
  }
490
 
491
+ /**
492
+ * @param DOMElement $node
493
+ * @param string $value
494
+ *
495
+ * @return null
496
+ */
497
+ static protected function _set_table_row_align(DOMElement $node, $value) {
498
  $cell_list = self::get_cell_list($node);
499
 
500
  foreach ($cell_list as $cell) {
504
  return null;
505
  }
506
 
507
+ /**
508
+ * @param DOMElement $node
509
+ * @param string $value
510
+ *
511
+ * @return null
512
+ */
513
+ static protected function _set_table_row_valign(DOMElement $node, $value) {
514
  $cell_list = self::get_cell_list($node);
515
 
516
  foreach ($cell_list as $cell) {
520
  return null;
521
  }
522
 
523
+ /**
524
+ * @param DOMElement $node
525
+ * @param string $value
526
+ *
527
+ * @return null
528
+ */
529
+ static protected function _set_table_row_bgcolor(DOMElement $node, $value) {
530
  $cell_list = self::get_cell_list($node);
531
  $value = self::_get_valid_color($value);
532
 
537
  return null;
538
  }
539
 
540
+ /**
541
+ * @param DOMElement $node
542
+ * @param string $value
543
+ *
544
+ * @return null
545
+ */
546
+ static protected function _set_body_link(DOMElement $node, $value) {
547
  $a_list = $node->getElementsByTagName("a");
548
  $value = self::_get_valid_color($value);
549
 
554
  return null;
555
  }
556
 
557
+ /**
558
+ * @param DOMElement $node
559
+ * @param string $value
560
+ *
561
+ * @return null
562
+ */
563
+ static protected function _set_basefont_size(DOMElement $node, $value) {
564
  // FIXME: ? we don't actually set the font size of anything here, just
565
  // the base size for later modification by <font> tags.
566
  self::$_last_basefont_size = $value;
567
  return null;
568
  }
569
+
570
+ /**
571
+ * @param DOMElement $node
572
+ * @param string $value
573
+ *
574
+ * @return string
575
+ */
576
+ static protected function _set_font_size(DOMElement $node, $value) {
577
  $style = $node->getAttribute(self::$_style_attr);
578
 
579
+ if ( $value[0] === "-" || $value[0] === "+" ) {
580
  $value = self::$_last_basefont_size + (int)$value;
581
+ }
582
+
583
+ if ( isset(self::$_font_size_lookup[$value]) ) {
584
  $style .= "; font-size: " . self::$_font_size_lookup[$value] . ";";
585
+ }
586
+ else {
587
  $style .= "; font-size: $value;";
588
+ }
589
+
590
  return ltrim($style, "; ");
591
  }
592
  }
dompdf/include/autoload.inc.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: autoload.inc.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
@@ -19,8 +18,9 @@
19
  function DOMPDF_autoload($class) {
20
  $filename = DOMPDF_INC_DIR . "/" . mb_strtolower($class) . ".cls.php";
21
 
22
- if ( is_file($filename) )
23
- require_once($filename);
 
24
  }
25
 
26
  // If SPL autoload functions are available (PHP >= 5.1.2)
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
18
  function DOMPDF_autoload($class) {
19
  $filename = DOMPDF_INC_DIR . "/" . mb_strtolower($class) . ".cls.php";
20
 
21
+ if ( is_file($filename) ) {
22
+ include_once $filename;
23
+ }
24
  }
25
 
26
  // If SPL autoload functions are available (PHP >= 5.1.2)
dompdf/include/block_frame_decorator.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: block_frame_decorator.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -14,17 +13,20 @@
14
  * @package dompdf
15
  */
16
  class Block_Frame_Decorator extends Frame_Decorator {
17
- protected $_cl; // current line index
 
 
 
 
 
18
 
19
  /**
20
  * The block's line boxes
21
  *
22
- * @var array
23
  */
24
  protected $_line_boxes;
25
 
26
- //........................................................................
27
-
28
  function __construct(Frame $frame, DOMPDF $dompdf) {
29
  parent::__construct($frame, $dompdf);
30
 
@@ -32,8 +34,6 @@ class Block_Frame_Decorator extends Frame_Decorator {
32
  $this->_cl = 0;
33
  }
34
 
35
- //........................................................................
36
-
37
  function reset() {
38
  parent::reset();
39
 
@@ -41,10 +41,6 @@ class Block_Frame_Decorator extends Frame_Decorator {
41
  $this->_cl = 0;
42
  }
43
 
44
- //........................................................................
45
-
46
- // Accessor methods
47
-
48
  /**
49
  * @return Line_Box
50
  */
@@ -60,59 +56,24 @@ class Block_Frame_Decorator extends Frame_Decorator {
60
  }
61
 
62
  /**
63
- * @return array
64
  */
65
  function get_line_boxes() {
66
  return $this->_line_boxes;
67
  }
68
 
69
- //........................................................................
70
-
71
- // Set methods
72
- function set_current_line($y = null, $w = null, $h = null, $tallest_frame = null, $left = null, $right = null) {
73
- $this->set_line($this->_cl, $y, $w, $h, $tallest_frame, $left, $right);
74
- }
75
-
76
  function clear_line($i) {
77
- if ( isset($this->_line_boxes[$i]) )
78
  unset($this->_line_boxes[$i]);
 
79
  }
80
 
81
  /**
82
- * @todo change this this to better use the Line_Box object
83
- * @param $lineno
84
- * @param $y
85
- * @param $w
86
- * @param $h
87
- * @param $tallest_frame
88
- * @param $left
89
- * @param $right
90
  */
91
- function set_line($lineno, $y = null, $w = null, $h = null, $tallest_frame = null, $left = null, $right = null) {
92
-
93
- if ( is_array($y) )
94
- extract($y);
95
-
96
- if (is_numeric($y))
97
- $this->_line_boxes[$lineno]->y = $y;
98
-
99
- if (is_numeric($w))
100
- $this->_line_boxes[$lineno]->w = $w;
101
-
102
- if (is_numeric($h))
103
- $this->_line_boxes[$lineno]->h = $h;
104
-
105
- if ($tallest_frame && $tallest_frame instanceof Frame)
106
- $this->_line_boxes[$lineno]->tallest_frame = $tallest_frame;
107
-
108
- if (is_numeric($left))
109
- $this->_line_boxes[$lineno]->left = $left;
110
-
111
- if (is_numeric($right))
112
- $this->_line_boxes[$lineno]->right = $right;
113
- }
114
-
115
-
116
  function add_frame_to_line(Frame $frame) {
117
  if ( !$frame->is_in_flow() ) {
118
  return;
@@ -162,8 +123,9 @@ class Block_Frame_Decorator extends Frame_Decorator {
162
 
163
  $w = $frame->get_margin_width();
164
 
165
- if ( $w == 0 )
166
  return;
 
167
 
168
  // Debugging code:
169
  /*
@@ -183,16 +145,18 @@ class Block_Frame_Decorator extends Frame_Decorator {
183
  // End debugging
184
 
185
  $line = $this->_line_boxes[$this->_cl];
186
- if ( $line->left + $line->w + $line->right + $w > $this->get_containing_block("w"))
187
  $this->add_line();
 
188
 
189
  $frame->position();
190
 
191
  $current_line = $this->_line_boxes[$this->_cl];
192
  $current_line->add_frame($frame);
193
 
194
- if ( $frame->is_text_node() )
195
  $current_line->wc += count(preg_split("/\s+/", trim($frame->get_text())));
 
196
 
197
  $this->increase_line_width($w);
198
 
@@ -202,15 +166,19 @@ class Block_Frame_Decorator extends Frame_Decorator {
202
  function remove_frames_from_line(Frame $frame) {
203
  // Search backwards through the lines for $frame
204
  $i = $this->_cl;
 
205
 
206
  while ($i >= 0) {
207
- if ( ($j = in_array($frame, $this->_line_boxes[$i]->get_frames(), true)) !== false )
208
  break;
 
 
209
  $i--;
210
  }
211
 
212
- if ( $j === false )
213
  return;
 
214
 
215
  // Remove $frame and all frames that follow
216
  while ($j < count($this->_line_boxes[$i]->get_frames())) {
@@ -224,8 +192,9 @@ class Block_Frame_Decorator extends Frame_Decorator {
224
 
225
  // Recalculate the height of the line
226
  $h = 0;
227
- foreach ($this->_line_boxes[$i]->get_frames() as $f)
228
  $h = max( $h, $f->get_margin_height() );
 
229
 
230
  $this->_line_boxes[$i]->h = $h;
231
 
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
13
  * @package dompdf
14
  */
15
  class Block_Frame_Decorator extends Frame_Decorator {
16
+ /**
17
+ * Current line index
18
+ *
19
+ * @var int
20
+ */
21
+ protected $_cl;
22
 
23
  /**
24
  * The block's line boxes
25
  *
26
+ * @var Line_Box[]
27
  */
28
  protected $_line_boxes;
29
 
 
 
30
  function __construct(Frame $frame, DOMPDF $dompdf) {
31
  parent::__construct($frame, $dompdf);
32
 
34
  $this->_cl = 0;
35
  }
36
 
 
 
37
  function reset() {
38
  parent::reset();
39
 
41
  $this->_cl = 0;
42
  }
43
 
 
 
 
 
44
  /**
45
  * @return Line_Box
46
  */
56
  }
57
 
58
  /**
59
+ * @return Line_Box[]
60
  */
61
  function get_line_boxes() {
62
  return $this->_line_boxes;
63
  }
64
 
65
+ /**
66
+ * @param integer $i
67
+ */
 
 
 
 
68
  function clear_line($i) {
69
+ if ( isset($this->_line_boxes[$i]) ) {
70
  unset($this->_line_boxes[$i]);
71
+ }
72
  }
73
 
74
  /**
75
+ * @param Frame $frame
 
 
 
 
 
 
 
76
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  function add_frame_to_line(Frame $frame) {
78
  if ( !$frame->is_in_flow() ) {
79
  return;
123
 
124
  $w = $frame->get_margin_width();
125
 
126
+ if ( $w == 0 ) {
127
  return;
128
+ }
129
 
130
  // Debugging code:
131
  /*
145
  // End debugging
146
 
147
  $line = $this->_line_boxes[$this->_cl];
148
+ if ( $line->left + $line->w + $line->right + $w > $this->get_containing_block("w")) {
149
  $this->add_line();
150
+ }
151
 
152
  $frame->position();
153
 
154
  $current_line = $this->_line_boxes[$this->_cl];
155
  $current_line->add_frame($frame);
156
 
157
+ if ( $frame->is_text_node() ) {
158
  $current_line->wc += count(preg_split("/\s+/", trim($frame->get_text())));
159
+ }
160
 
161
  $this->increase_line_width($w);
162
 
166
  function remove_frames_from_line(Frame $frame) {
167
  // Search backwards through the lines for $frame
168
  $i = $this->_cl;
169
+ $j = null;
170
 
171
  while ($i >= 0) {
172
+ if ( ($j = in_array($frame, $this->_line_boxes[$i]->get_frames(), true)) !== false ) {
173
  break;
174
+ }
175
+
176
  $i--;
177
  }
178
 
179
+ if ( $j === false ) {
180
  return;
181
+ }
182
 
183
  // Remove $frame and all frames that follow
184
  while ($j < count($this->_line_boxes[$i]->get_frames())) {
192
 
193
  // Recalculate the height of the line
194
  $h = 0;
195
+ foreach ($this->_line_boxes[$i]->get_frames() as $f) {
196
  $h = max( $h, $f->get_margin_height() );
197
+ }
198
 
199
  $this->_line_boxes[$i]->h = $h;
200
 
dompdf/include/block_frame_reflower.cls.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: block_frame_reflower.cls.php 471 2012-02-06 21:59:10Z fabien.menager $
9
  */
10
 
11
  /**
@@ -44,7 +43,7 @@ class Block_Frame_Reflower extends Frame_Reflower {
44
  $rm = $style->length_in_pt($style->margin_right, $w);
45
  $lm = $style->length_in_pt($style->margin_left, $w);
46
 
47
- $left = $style->length_in_pt($style->left, $w);
48
  $right = $style->length_in_pt($style->right, $w);
49
 
50
  // Handle 'auto' values
@@ -61,7 +60,8 @@ class Block_Frame_Reflower extends Frame_Reflower {
61
  $absolute = true;
62
  $dims[] = $left !== "auto" ? $left : 0;
63
  $dims[] = $right !== "auto" ? $right : 0;
64
- } else {
 
65
  $absolute = false;
66
  }
67
 
@@ -79,10 +79,8 @@ class Block_Frame_Reflower extends Frame_Reflower {
79
 
80
  if ( $width === "auto" && $left === "auto" && $right === "auto" ) {
81
 
82
- if ( $lm === "auto" )
83
- $lm = 0;
84
- if ( $rm === "auto" )
85
- $rm = 0;
86
 
87
  // Technically, the width should be "shrink-to-fit" i.e. based on the
88
  // preferred width of the content... a little too costly here as a
@@ -90,69 +88,71 @@ class Block_Frame_Reflower extends Frame_Reflower {
90
  $left = 0;
91
  $right = 0;
92
  $width = $diff;
 
 
93
 
94
- } else if ( $width === "auto" ) {
95
-
96
- if ( $lm === "auto" )
97
- $lm = 0;
98
- if ( $rm === "auto" )
99
- $rm = 0;
100
- if ( $left === "auto" )
101
- $left = 0;
102
- if ( $right === "auto" )
103
- $right = 0;
104
 
105
  $width = $diff;
106
-
107
- } else if ( $left === "auto" ) {
108
 
109
- if ( $lm === "auto" )
110
- $lm = 0;
111
- if ( $rm === "auto" )
112
- $rm = 0;
113
- if ( $right === "auto" )
114
- $right = 0;
115
 
116
  $left = $diff;
 
 
117
 
118
- } else if ( $right === "auto" ) {
119
-
120
- if ( $lm === "auto" )
121
- $lm = 0;
122
- if ( $rm === "auto" )
123
- $rm = 0;
124
 
125
  $right = $diff;
126
  }
127
 
128
- } else {
 
129
 
130
  // Find auto properties and get them to take up the slack
131
- if ( $width === "auto" )
132
  $width = $diff;
133
-
134
- else if ( $lm === "auto" && $rm === "auto" )
135
  $lm = $rm = round($diff / 2);
136
-
137
- else if ( $lm === "auto" )
138
  $lm = $diff;
139
-
140
- else if ( $rm === "auto" )
141
  $rm = $diff;
 
142
  }
143
 
144
- } else if ($diff < 0) {
 
145
 
146
  // We are over constrained--set margin-right to the difference
147
  $rm = $diff;
148
 
149
  }
150
 
151
- return array("width"=> $width, "margin_left" => $lm, "margin_right" => $rm, "left" => $left, "right" => $right);
 
 
 
 
 
 
152
  }
153
 
154
- /**
155
  * Call the above function, but resolve max/min widths
 
 
156
  * @return array
157
  */
158
  protected function _calculate_restricted_width() {
@@ -167,9 +167,10 @@ class Block_Frame_Reflower extends Frame_Reflower {
167
  //if ( $style->position === "absolute" )
168
  // $cb = $frame->find_positionned_parent()->get_containing_block();
169
 
170
- if ( !isset($cb["w"]) )
171
  throw new DOMPDF_Exception("Box property calculation requires containing block width");
172
-
 
173
  // Treat width 100% as auto
174
  if ( $style->width === "100%" ) {
175
  $width = "auto";
@@ -177,44 +178,55 @@ class Block_Frame_Reflower extends Frame_Reflower {
177
  else {
178
  $width = $style->length_in_pt($style->width, $cb["w"]);
179
  }
 
180
  extract($this->_calculate_width($width));
181
 
182
  // Handle min/max width
183
  $min_width = $style->length_in_pt($style->min_width, $cb["w"]);
184
  $max_width = $style->length_in_pt($style->max_width, $cb["w"]);
185
 
186
- if ( $max_width !== "none" && $min_width > $max_width)
187
- // Swap 'em
188
  list($max_width, $min_width) = array($min_width, $max_width);
189
-
190
- if ( $max_width !== "none" && $width > $max_width )
 
191
  extract($this->_calculate_width($max_width));
 
192
 
193
- if ( $width < $min_width )
194
  extract($this->_calculate_width($min_width));
 
195
 
196
  return array($width, $margin_left, $margin_right, $left, $right);
197
-
198
  }
199
 
200
  /**
201
  * Determine the unrestricted height of content within the block
202
  * not by adding each line's height, but by getting the last line's position.
203
  * This because lines could have been pushed lower by a clearing element.
 
204
  * @return float
205
  */
206
  protected function _calculate_content_height() {
207
  $lines = $this->_frame->get_line_boxes();
 
 
 
 
 
208
 
 
209
  $first_line = reset($lines);
210
  $last_line = end($lines);
211
- $height = $last_line->y + $last_line->h - $first_line->y;
 
212
 
213
  return $height;
214
  }
215
 
216
  /**
217
  * Determine the frame's restricted height
 
218
  * @return array
219
  */
220
  protected function _calculate_restricted_height() {
@@ -235,7 +247,7 @@ class Block_Frame_Reflower extends Frame_Reflower {
235
 
236
  // see http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height
237
 
238
- $dims = array($top !== "auto" ? $top : 0,
239
  $style->margin_top !== "auto" ? $style->margin_top : 0,
240
  $style->padding_top,
241
  $style->border_top_width,
@@ -253,85 +265,64 @@ class Block_Frame_Reflower extends Frame_Reflower {
253
 
254
  if ( $height === "auto" && $top === "auto" && $bottom === "auto" ) {
255
 
256
- if ( $margin_top === "auto" )
257
- $margin_top = 0;
258
- if ( $margin_bottom === "auto" )
259
- $margin_bottom = 0;
260
 
261
  $height = $diff;
 
 
262
 
263
- } else if ( $height === "auto" && $top === "auto" ) {
264
-
265
- if ( $margin_top === "auto" )
266
- $margin_top = 0;
267
- if ( $margin_bottom === "auto" )
268
- $margin_bottom = 0;
269
 
270
  $height = $content_height;
271
  $top = $diff - $content_height;
 
 
272
 
273
- } else if ( $height === "auto" && $bottom === "auto" ) {
274
-
275
- if ( $margin_top === "auto" )
276
- $margin_top = 0;
277
- if ( $margin_bottom === "auto" )
278
- $margin_bottom = 0;
279
 
280
  $height = $content_height;
281
  $bottom = $diff - $content_height;
 
 
282
 
283
- } else if ( $top === "auto" && $bottom === "auto" ) {
284
-
285
- if ( $margin_top === "auto" )
286
- $margin_top = 0;
287
- if ( $margin_bottom === "auto" )
288
- $margin_bottom = 0;
289
 
290
  $bottom = $diff;
 
 
291
 
292
- } else if ( $top === "auto" ) {
293
-
294
- if ( $margin_top === "auto" )
295
- $margin_top = 0;
296
- if ( $margin_bottom === "auto" )
297
- $margin_bottom = 0;
298
 
299
  $top = $diff;
 
 
300
 
301
- } else if ( $height === "auto" ) {
302
-
303
- if ( $margin_top === "auto" )
304
- $margin_top = 0;
305
- if ( $margin_bottom === "auto" )
306
- $margin_bottom = 0;
307
 
308
  $height = $diff;
 
 
309
 
310
- } else if ( $bottom === "auto" ) {
311
-
312
- if ( $margin_top === "auto" )
313
- $margin_top = 0;
314
- if ( $margin_bottom === "auto" )
315
- $margin_bottom = 0;
316
 
317
  $bottom = $diff;
318
-
319
- } else {
320
 
321
  if ( $style->overflow === "visible" ) {
322
-
323
  // set all autos to zero
324
- if ( $margin_top === "auto" )
325
- $margin_top = 0;
326
- if ( $margin_bottom === "auto" )
327
- $margin_bottom = 0;
328
- if ( $top === "auto" )
329
- $top = 0;
330
- if ( $bottom === "auto" )
331
- $bottom = 0;
332
- if ( $height === "auto" )
333
- $height = $content_height;
334
-
335
  }
336
 
337
  // FIXME: overflow hidden
@@ -339,11 +330,13 @@ class Block_Frame_Reflower extends Frame_Reflower {
339
 
340
  }
341
 
342
- } else {
 
343
 
344
  // Expand the height if overflow is visible
345
- if ( $height === "auto" && $content_height > $height /* && $style->overflow === "visible" */)
346
  $height = $content_height;
 
347
 
348
  // FIXME: this should probably be moved to a seperate function as per
349
  // _calculate_restricted_width
@@ -359,28 +352,36 @@ class Block_Frame_Reflower extends Frame_Reflower {
359
  $min_height = $style->length_in_pt($min_height, $cb["h"]);
360
  $max_height = $style->length_in_pt($max_height, $cb["h"]);
361
 
362
- } else if ( isset($cb["w"]) ) {
 
363
 
364
- if ( mb_strpos($min_height, "%") !== false )
365
  $min_height = 0;
366
- else
 
367
  $min_height = $style->length_in_pt($min_height, $cb["w"]);
 
368
 
369
- if ( mb_strpos($max_height, "%") !== false )
370
  $max_height = "none";
371
- else
 
372
  $max_height = $style->length_in_pt($max_height, $cb["w"]);
 
373
  }
374
 
375
- if ( $max_height !== "none" && $min_height > $max_height )
376
  // Swap 'em
377
  list($max_height, $min_height) = array($min_height, $max_height);
378
-
379
- if ( $max_height !== "none" && $height > $max_height )
 
380
  $height = $max_height;
 
381
 
382
- if ( $height < $min_height )
383
  $height = $min_height;
 
384
  }
385
 
386
  }
@@ -397,106 +398,119 @@ class Block_Frame_Reflower extends Frame_Reflower {
397
  $style = $this->_frame->get_style();
398
  $w = $this->_frame->get_containing_block("w");
399
  $width = $style->length_in_pt($style->width, $w);
 
400
  switch ($style->text_align) {
401
-
402
- default:
403
- case "left":
404
- foreach ($this->_frame->get_line_boxes() as $line) {
405
- if ( !$line->left ) continue;
406
- foreach($line->get_frames() as $frame) {
407
- if ( $frame instanceof Block_Frame_Decorator) continue;
408
- $frame->set_position( $frame->get_position("x") + $line->left );
409
- }
410
- }
411
- return;
412
-
413
- case "right":
414
- foreach ($this->_frame->get_line_boxes() as $line) {
415
- // Move each child over by $dx
416
- $dx = $width - $line->w - $line->right;
417
-
418
- foreach($line->get_frames() as $frame) {
419
- // Block frames are not aligned by text-align
420
- if ($frame instanceof Block_Frame_Decorator) continue;
421
 
422
- $frame->set_position( $frame->get_position("x") + $dx );
423
- }
424
- }
425
- break;
426
-
427
-
428
- case "justify":
429
- // We justify all lines except the last one
430
- $lines = $this->_frame->get_line_boxes(); // needs to be a variable (strict standards)
431
- $lines = array_splice($lines, 0, -1);
432
-
433
- foreach($lines as $i => $line) {
434
- if ( $line->br ) {
435
- unset($lines[$i]);
436
- }
437
- }
438
-
439
- // One space character's width. Will be used to get a more accurate spacing
440
- $space_width = Font_Metrics::get_text_width(" ", $style->font_family, $style->font_size);
441
-
442
- foreach ($lines as $i => $line) {
443
- if ( $line->left ) {
444
  foreach($line->get_frames() as $frame) {
445
- if ( !$frame instanceof Text_Frame_Decorator )
446
  continue;
447
-
448
  $frame->set_position( $frame->get_position("x") + $line->left );
449
  }
450
  }
 
 
 
 
 
 
451
 
452
- // Only set the spacing if the line is long enough. This is really
453
- // just an aesthetic choice ;)
454
- //if ( $line["left"] + $line["w"] + $line["right"] > self::MIN_JUSTIFY_WIDTH * $width ) {
455
-
456
- // Set the spacing for each child
457
- if ( $line->wc > 1 )
458
- $spacing = ($width - ($line->left + $line->w + $line->right) + $space_width) / ($line->wc - 1);
459
- else
460
- $spacing = 0;
461
-
462
- $dx = 0;
463
  foreach($line->get_frames() as $frame) {
464
- if ( !$frame instanceof Text_Frame_Decorator )
 
465
  continue;
466
-
467
- $text = $frame->get_text();
468
- $spaces = mb_substr_count($text, " ");
469
-
470
- $char_spacing = $style->length_in_pt($style->letter_spacing);
471
- $_spacing = $spacing + $char_spacing;
472
 
473
  $frame->set_position( $frame->get_position("x") + $dx );
474
- $frame->set_text_spacing($_spacing);
475
-
476
- $dx += $spaces * $_spacing;
477
  }
478
-
479
- // The line (should) now occupy the entire width
480
- $this->_frame->set_line($i, null, $width);
481
-
482
- //}
483
- }
484
- break;
485
-
486
- case "center":
487
- case "centre":
488
- foreach ($this->_frame->get_line_boxes() as $line) {
489
- // Centre each line by moving each frame in the line by:
490
- $dx = ($width + $line->left - $line->w - $line->right ) / 2;
491
 
492
- foreach ($line->get_frames() as $frame) {
493
- // Block frames are not aligned by text-align
494
- if ($frame instanceof Block_Frame_Decorator) continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
495
 
496
- $frame->set_position( $frame->get_position("x") + $dx );
 
 
 
 
 
 
 
497
  }
498
- }
499
- break;
500
  }
501
  }
502
 
@@ -515,16 +529,11 @@ class Block_Frame_Reflower extends Frame_Reflower {
515
  foreach ( $line->get_frames() as $frame ) {
516
  $style = $frame->get_style();
517
 
518
- if ( $style->display !== "inline" && $style->display !== "text" )
519
  continue;
 
520
 
521
- // FIXME?
522
- if ( $this instanceof Table_Cell_Frame_Reflower )
523
- $align = $frame->get_frame()->get_style()->vertical_align;
524
- else
525
- $align = $frame->get_frame()->get_parent()->get_style()->vertical_align;
526
-
527
- $frame_h = $frame->get_margin_height();
528
 
529
  if ( !isset($canvas) ) {
530
  $canvas = $frame->get_root()->get_dompdf()->get_canvas();
@@ -566,9 +575,13 @@ class Block_Frame_Reflower extends Frame_Reflower {
566
  }
567
  }
568
  }
569
-
 
 
 
570
  function process_clear(Frame $child){
571
- if ( !DOMPDF_ENABLE_CSS_FLOAT ) {
 
572
  return;
573
  }
574
 
@@ -592,9 +605,15 @@ class Block_Frame_Reflower extends Frame_Reflower {
592
  }
593
  }
594
  }
595
-
 
 
 
 
 
596
  function process_float(Frame $child, $cb_x, $cb_w){
597
- if ( !DOMPDF_ENABLE_CSS_FLOAT ) {
 
598
  return;
599
  }
600
 
@@ -634,6 +653,10 @@ class Block_Frame_Reflower extends Frame_Reflower {
634
  }
635
  }
636
 
 
 
 
 
637
  $line_box->get_float_offsets();
638
 
639
  if ( $child->_float_next_line ) {
@@ -645,15 +668,19 @@ class Block_Frame_Reflower extends Frame_Reflower {
645
  }
646
  }
647
 
648
- function reflow(Frame_Decorator $block = null) {
 
 
 
649
 
650
  // Check if a page break is forced
651
  $page = $this->_frame->get_root();
652
  $page->check_forced_page_break($this->_frame);
653
 
654
  // Bail if the page is full
655
- if ( $page->is_full() )
656
  return;
 
657
 
658
  // Generated content
659
  $this->_set_content();
@@ -704,16 +731,17 @@ class Block_Frame_Reflower extends Frame_Reflower {
704
  $cb_h = ($cb["h"] + $cb["y"]) - $bottom - $cb_y;
705
 
706
  // Set the y position of the first line in this block
707
- $this->_frame->set_current_line($cb_y);
708
-
709
- $this->_frame->get_current_line_box()->get_float_offsets();
710
 
711
  // Set the containing blocks and reflow each child
712
  foreach ( $this->_frame->get_children() as $child ) {
713
 
714
  // Bail out if the page is full
715
- if ( $page->is_full() )
716
  break;
 
717
 
718
  $child->set_containing_block($cb_x, $cb_y, $w, $cb_h);
719
 
@@ -722,8 +750,9 @@ class Block_Frame_Reflower extends Frame_Reflower {
722
  $child->reflow($this->_frame);
723
 
724
  // Don't add the child to the line if a page break has occurred
725
- if ( $page->check_page_break($child) )
726
  break;
 
727
 
728
  $this->process_float($child, $cb_x, $w);
729
  }
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
43
  $rm = $style->length_in_pt($style->margin_right, $w);
44
  $lm = $style->length_in_pt($style->margin_left, $w);
45
 
46
+ $left = $style->length_in_pt($style->left, $w);
47
  $right = $style->length_in_pt($style->right, $w);
48
 
49
  // Handle 'auto' values
60
  $absolute = true;
61
  $dims[] = $left !== "auto" ? $left : 0;
62
  $dims[] = $right !== "auto" ? $right : 0;
63
+ }
64
+ else {
65
  $absolute = false;
66
  }
67
 
79
 
80
  if ( $width === "auto" && $left === "auto" && $right === "auto" ) {
81
 
82
+ if ( $lm === "auto" ) $lm = 0;
83
+ if ( $rm === "auto" ) $rm = 0;
 
 
84
 
85
  // Technically, the width should be "shrink-to-fit" i.e. based on the
86
  // preferred width of the content... a little too costly here as a
88
  $left = 0;
89
  $right = 0;
90
  $width = $diff;
91
+ }
92
+ else if ( $width === "auto" ) {
93
 
94
+ if ( $lm === "auto" ) $lm = 0;
95
+ if ( $rm === "auto" ) $rm = 0;
96
+ if ( $left === "auto" ) $left = 0;
97
+ if ( $right === "auto" ) $right = 0;
 
 
 
 
 
 
98
 
99
  $width = $diff;
100
+ }
101
+ else if ( $left === "auto" ) {
102
 
103
+ if ( $lm === "auto" ) $lm = 0;
104
+ if ( $rm === "auto" ) $rm = 0;
105
+ if ( $right === "auto" ) $right = 0;
 
 
 
106
 
107
  $left = $diff;
108
+ }
109
+ else if ( $right === "auto" ) {
110
 
111
+ if ( $lm === "auto" ) $lm = 0;
112
+ if ( $rm === "auto" ) $rm = 0;
 
 
 
 
113
 
114
  $right = $diff;
115
  }
116
 
117
+ }
118
+ else {
119
 
120
  // Find auto properties and get them to take up the slack
121
+ if ( $width === "auto" ) {
122
  $width = $diff;
123
+ }
124
+ else if ( $lm === "auto" && $rm === "auto" ) {
125
  $lm = $rm = round($diff / 2);
126
+ }
127
+ else if ( $lm === "auto" ) {
128
  $lm = $diff;
129
+ }
130
+ else if ( $rm === "auto" ) {
131
  $rm = $diff;
132
+ }
133
  }
134
 
135
+ }
136
+ else if ($diff < 0) {
137
 
138
  // We are over constrained--set margin-right to the difference
139
  $rm = $diff;
140
 
141
  }
142
 
143
+ return array(
144
+ "width" => $width,
145
+ "margin_left" => $lm,
146
+ "margin_right" => $rm,
147
+ "left" => $left,
148
+ "right" => $right,
149
+ );
150
  }
151
 
152
+ /**
153
  * Call the above function, but resolve max/min widths
154
+ *
155
+ * @throws DOMPDF_Exception
156
  * @return array
157
  */
158
  protected function _calculate_restricted_width() {
167
  //if ( $style->position === "absolute" )
168
  // $cb = $frame->find_positionned_parent()->get_containing_block();
169
 
170
+ if ( !isset($cb["w"]) ) {
171
  throw new DOMPDF_Exception("Box property calculation requires containing block width");
172
+ }
173
+
174
  // Treat width 100% as auto
175
  if ( $style->width === "100%" ) {
176
  $width = "auto";
178
  else {
179
  $width = $style->length_in_pt($style->width, $cb["w"]);
180
  }
181
+
182
  extract($this->_calculate_width($width));
183
 
184
  // Handle min/max width
185
  $min_width = $style->length_in_pt($style->min_width, $cb["w"]);
186
  $max_width = $style->length_in_pt($style->max_width, $cb["w"]);
187
 
188
+ if ( $max_width !== "none" && $min_width > $max_width ) {
 
189
  list($max_width, $min_width) = array($min_width, $max_width);
190
+ }
191
+
192
+ if ( $max_width !== "none" && $width > $max_width ) {
193
  extract($this->_calculate_width($max_width));
194
+ }
195
 
196
+ if ( $width < $min_width ) {
197
  extract($this->_calculate_width($min_width));
198
+ }
199
 
200
  return array($width, $margin_left, $margin_right, $left, $right);
 
201
  }
202
 
203
  /**
204
  * Determine the unrestricted height of content within the block
205
  * not by adding each line's height, but by getting the last line's position.
206
  * This because lines could have been pushed lower by a clearing element.
207
+ *
208
  * @return float
209
  */
210
  protected function _calculate_content_height() {
211
  $lines = $this->_frame->get_line_boxes();
212
+ $height = 0;
213
+
214
+ foreach ($lines as $line) {
215
+ $height += $line->h;
216
+ }
217
 
218
+ /*
219
  $first_line = reset($lines);
220
  $last_line = end($lines);
221
+ $height2 = $last_line->y + $last_line->h - $first_line->y;
222
+ */
223
 
224
  return $height;
225
  }
226
 
227
  /**
228
  * Determine the frame's restricted height
229
+ *
230
  * @return array
231
  */
232
  protected function _calculate_restricted_height() {
247
 
248
  // see http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height
249
 
250
+ $dims = array($top !== "auto" ? $top : 0,
251
  $style->margin_top !== "auto" ? $style->margin_top : 0,
252
  $style->padding_top,
253
  $style->border_top_width,
265
 
266
  if ( $height === "auto" && $top === "auto" && $bottom === "auto" ) {
267
 
268
+ if ( $margin_top === "auto" ) $margin_top = 0;
269
+ if ( $margin_bottom === "auto" ) $margin_bottom = 0;
 
 
270
 
271
  $height = $diff;
272
+ }
273
+ else if ( $height === "auto" && $top === "auto" ) {
274
 
275
+ if ( $margin_top === "auto" ) $margin_top = 0;
276
+ if ( $margin_bottom === "auto" ) $margin_bottom = 0;
 
 
 
 
277
 
278
  $height = $content_height;
279
  $top = $diff - $content_height;
280
+ }
281
+ else if ( $height === "auto" && $bottom === "auto" ) {
282
 
283
+ if ( $margin_top === "auto" ) $margin_top = 0;
284
+ if ( $margin_bottom === "auto" ) $margin_bottom = 0;
 
 
 
 
285
 
286
  $height = $content_height;
287
  $bottom = $diff - $content_height;
288
+ }
289
+ else if ( $top === "auto" && $bottom === "auto" ) {
290
 
291
+ if ( $margin_top === "auto" ) $margin_top = 0;
292
+ if ( $margin_bottom === "auto" ) $margin_bottom = 0;
 
 
 
 
293
 
294
  $bottom = $diff;
295
+ }
296
+ else if ( $top === "auto" ) {
297
 
298
+ if ( $margin_top === "auto" ) $margin_top = 0;
299
+ if ( $margin_bottom === "auto" ) $margin_bottom = 0;
 
 
 
 
300
 
301
  $top = $diff;
302
+ }
303
+ else if ( $height === "auto" ) {
304
 
305
+ if ( $margin_top === "auto" ) $margin_top = 0;
306
+ if ( $margin_bottom === "auto" ) $margin_bottom = 0;
 
 
 
 
307
 
308
  $height = $diff;
309
+ }
310
+ else if ( $bottom === "auto" ) {
311
 
312
+ if ( $margin_top === "auto" ) $margin_top = 0;
313
+ if ( $margin_bottom === "auto" ) $margin_bottom = 0;
 
 
 
 
314
 
315
  $bottom = $diff;
316
+ }
317
+ else {
318
 
319
  if ( $style->overflow === "visible" ) {
 
320
  // set all autos to zero
321
+ if ( $margin_top === "auto" ) $margin_top = 0;
322
+ if ( $margin_bottom === "auto" ) $margin_bottom = 0;
323
+ if ( $top === "auto" ) $top = 0;
324
+ if ( $bottom === "auto" ) $bottom = 0;
325
+ if ( $height === "auto" ) $height = $content_height;
 
 
 
 
 
 
326
  }
327
 
328
  // FIXME: overflow hidden
330
 
331
  }
332
 
333
+ }
334
+ else {
335
 
336
  // Expand the height if overflow is visible
337
+ if ( $height === "auto" && $content_height > $height /* && $style->overflow === "visible" */) {
338
  $height = $content_height;
339
+ }
340
 
341
  // FIXME: this should probably be moved to a seperate function as per
342
  // _calculate_restricted_width
352
  $min_height = $style->length_in_pt($min_height, $cb["h"]);
353
  $max_height = $style->length_in_pt($max_height, $cb["h"]);
354
 
355
+ }
356
+ else if ( isset($cb["w"]) ) {
357
 
358
+ if ( mb_strpos($min_height, "%") !== false ) {
359
  $min_height = 0;
360
+ }
361
+ else {
362
  $min_height = $style->length_in_pt($min_height, $cb["w"]);
363
+ }
364
 
365
+ if ( mb_strpos($max_height, "%") !== false ) {
366
  $max_height = "none";
367
+ }
368
+ else {
369
  $max_height = $style->length_in_pt($max_height, $cb["w"]);
370
+ }
371
  }
372
 
373
+ if ( $max_height !== "none" && $min_height > $max_height ) {
374
  // Swap 'em
375
  list($max_height, $min_height) = array($min_height, $max_height);
376
+ }
377
+
378
+ if ( $max_height !== "none" && $height > $max_height ) {
379
  $height = $max_height;
380
+ }
381
 
382
+ if ( $height < $min_height ) {
383
  $height = $min_height;
384
+ }
385
  }
386
 
387
  }
398
  $style = $this->_frame->get_style();
399
  $w = $this->_frame->get_containing_block("w");
400
  $width = $style->length_in_pt($style->width, $w);
401
+
402
  switch ($style->text_align) {
403
+ default:
404
+ case "left":
405
+ foreach ($this->_frame->get_line_boxes() as $line) {
406
+ if ( !$line->left ) {
407
+ continue;
408
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
409
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
410
  foreach($line->get_frames() as $frame) {
411
+ if ( $frame instanceof Block_Frame_Decorator) {
412
  continue;
413
+ }
414
  $frame->set_position( $frame->get_position("x") + $line->left );
415
  }
416
  }
417
+ return;
418
+
419
+ case "right":
420
+ foreach ($this->_frame->get_line_boxes() as $line) {
421
+ // Move each child over by $dx
422
+ $dx = $width - $line->w - $line->right;
423
 
 
 
 
 
 
 
 
 
 
 
 
424
  foreach($line->get_frames() as $frame) {
425
+ // Block frames are not aligned by text-align
426
+ if ($frame instanceof Block_Frame_Decorator) {
427
  continue;
428
+ }
 
 
 
 
 
429
 
430
  $frame->set_position( $frame->get_position("x") + $dx );
 
 
 
431
  }
432
+ }
433
+ break;
434
+
435
+
436
+ case "justify":
437
+ // We justify all lines except the last one
438
+ $lines = $this->_frame->get_line_boxes(); // needs to be a variable (strict standards)
439
+ array_pop($lines);
 
 
 
 
 
440
 
441
+ foreach($lines as $i => $line) {
442
+ if ( $line->br ) {
443
+ unset($lines[$i]);
444
+ }
445
+ }
446
+
447
+ // One space character's width. Will be used to get a more accurate spacing
448
+ $space_width = Font_Metrics::get_text_width(" ", $style->font_family, $style->font_size);
449
+
450
+ foreach ($lines as $line) {
451
+ if ( $line->left ) {
452
+ foreach ( $line->get_frames() as $frame ) {
453
+ if ( !$frame instanceof Text_Frame_Decorator ) {
454
+ continue;
455
+ }
456
+
457
+ $frame->set_position( $frame->get_position("x") + $line->left );
458
+ }
459
+ }
460
+
461
+ // Only set the spacing if the line is long enough. This is really
462
+ // just an aesthetic choice ;)
463
+ //if ( $line["left"] + $line["w"] + $line["right"] > self::MIN_JUSTIFY_WIDTH * $width ) {
464
+
465
+ // Set the spacing for each child
466
+ if ( $line->wc > 1 ) {
467
+ $spacing = ($width - ($line->left + $line->w + $line->right) + $space_width) / ($line->wc - 1);
468
+ }
469
+ else {
470
+ $spacing = 0;
471
+ }
472
+
473
+ $dx = 0;
474
+ foreach($line->get_frames() as $frame) {
475
+ if ( !$frame instanceof Text_Frame_Decorator ) {
476
+ continue;
477
+ }
478
+
479
+ $text = $frame->get_text();
480
+ $spaces = mb_substr_count($text, " ");
481
+
482
+ $char_spacing = $style->length_in_pt($style->letter_spacing);
483
+ $_spacing = $spacing + $char_spacing;
484
+
485
+ $frame->set_position( $frame->get_position("x") + $dx );
486
+ $frame->set_text_spacing($_spacing);
487
+
488
+ $dx += $spaces * $_spacing;
489
+ }
490
+
491
+ // The line (should) now occupy the entire width
492
+ $line->w = $width;
493
+
494
+ //}
495
+ }
496
+ break;
497
+
498
+ case "center":
499
+ case "centre":
500
+ foreach ($this->_frame->get_line_boxes() as $line) {
501
+ // Centre each line by moving each frame in the line by:
502
+ $dx = ($width + $line->left - $line->w - $line->right ) / 2;
503
 
504
+ foreach ($line->get_frames() as $frame) {
505
+ // Block frames are not aligned by text-align
506
+ if ($frame instanceof Block_Frame_Decorator) {
507
+ continue;
508
+ }
509
+
510
+ $frame->set_position( $frame->get_position("x") + $dx );
511
+ }
512
  }
513
+ break;
 
514
  }
515
  }
516
 
529
  foreach ( $line->get_frames() as $frame ) {
530
  $style = $frame->get_style();
531
 
532
+ if ( $style->display !== "inline" ) {
533
  continue;
534
+ }
535
 
536
+ $align = $frame->get_parent()->get_style()->vertical_align;
 
 
 
 
 
 
537
 
538
  if ( !isset($canvas) ) {
539
  $canvas = $frame->get_root()->get_dompdf()->get_canvas();
575
  }
576
  }
577
  }
578
+
579
+ /**
580
+ * @param Frame $child
581
+ */
582
  function process_clear(Frame $child){
583
+ $enable_css_float = $this->get_dompdf()->get_option("enable_css_float");
584
+ if ( !$enable_css_float ) {
585
  return;
586
  }
587
 
605
  }
606
  }
607
  }
608
+
609
+ /**
610
+ * @param Frame $child
611
+ * @param float $cb_x
612
+ * @param float $cb_w
613
+ */
614
  function process_float(Frame $child, $cb_x, $cb_w){
615
+ $enable_css_float = $this->_frame->get_dompdf()->get_option("enable_css_float");
616
+ if ( !$enable_css_float ) {
617
  return;
618
  }
619
 
653
  }
654
  }
655
 
656
+ if ( $cb_w < $float_x + $float_w - $old_x ) {
657
+ // TODO handle when floating elements don't fit
658
+ }
659
+
660
  $line_box->get_float_offsets();
661
 
662
  if ( $child->_float_next_line ) {
668
  }
669
  }
670
 
671
+ /**
672
+ * @param Frame_Decorator $block
673
+ */
674
+ function reflow(Block_Frame_Decorator $block = null) {
675
 
676
  // Check if a page break is forced
677
  $page = $this->_frame->get_root();
678
  $page->check_forced_page_break($this->_frame);
679
 
680
  // Bail if the page is full
681
+ if ( $page->is_full() ) {
682
  return;
683
+ }
684
 
685
  // Generated content
686
  $this->_set_content();
731
  $cb_h = ($cb["h"] + $cb["y"]) - $bottom - $cb_y;
732
 
733
  // Set the y position of the first line in this block
734
+ $line_box = $this->_frame->get_current_line_box();
735
+ $line_box->y = $cb_y;
736
+ $line_box->get_float_offsets();
737
 
738
  // Set the containing blocks and reflow each child
739
  foreach ( $this->_frame->get_children() as $child ) {
740
 
741
  // Bail out if the page is full
742
+ if ( $page->is_full() ) {
743
  break;
744
+ }
745
 
746
  $child->set_containing_block($cb_x, $cb_y, $w, $cb_h);
747
 
750
  $child->reflow($this->_frame);
751
 
752
  // Don't add the child to the line if a page break has occurred
753
+ if ( $page->check_page_break($child) ) {
754
  break;
755
+ }
756
 
757
  $this->process_float($child, $cb_x, $w);
758
  }
dompdf/include/block_positioner.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: block_positioner.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -28,13 +27,17 @@ class Block_Positioner extends Positioner {
28
 
29
  if ( $p ) {
30
  $float = $style->float;
31
- if ( !DOMPDF_ENABLE_CSS_FLOAT || !$float || $float === "none" ) {
 
 
32
  $p->add_line(true);
33
  }
34
  $y = $p->get_current_line_box()->y;
35
 
36
- } else
 
37
  $y = $cb["y"];
 
38
 
39
  $x = $cb["x"];
40
 
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
27
 
28
  if ( $p ) {
29
  $float = $style->float;
30
+
31
+ $enable_css_float = $frame->get_dompdf()->get_option("enable_css_float");
32
+ if ( !$enable_css_float || !$float || $float === "none" ) {
33
  $p->add_line(true);
34
  }
35
  $y = $p->get_current_line_box()->y;
36
 
37
+ }
38
+ else {
39
  $y = $cb["y"];
40
+ }
41
 
42
  $x = $cb["x"];
43
 
dompdf/include/block_renderer.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: block_renderer.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -35,12 +34,23 @@ class Block_Renderer extends Abstract_Renderer {
35
  }
36
 
37
  // Draw our background, border and content
 
 
 
 
 
 
38
  if ( ($bg = $style->background_color) !== "transparent" ) {
39
  $this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg );
40
  }
41
 
42
- if ( ($url = $style->background_image) && $url !== "none" )
43
  $this->_background_image($url, $x, $y, $w, $h, $style);
 
 
 
 
 
44
 
45
  $this->_render_border($frame);
46
  $this->_render_outline($frame);
@@ -63,13 +73,17 @@ class Block_Renderer extends Abstract_Renderer {
63
  $style = $frame->get_style();
64
  $bbox = $frame->get_border_box();
65
  $bp = $style->get_border_properties();
 
 
 
66
 
67
- // If all the borders are "solid" with the same color and style, we'd better draw a rectangle
68
  if (
69
- in_array($bp["top"]["style"], array("solid", "dashed", "dotted")) &&
70
- $bp["top"] == $bp["right"] &&
71
- $bp["right"] == $bp["bottom"] &&
72
- $bp["bottom"] == $bp["left"]
 
73
  ) {
74
  $props = $bp["top"];
75
  if ( $props["color"] === "transparent" || $props["width"] <= 0 ) return;
@@ -81,6 +95,7 @@ class Block_Renderer extends Abstract_Renderer {
81
  return;
82
  }
83
 
 
84
  $widths = array($style->length_in_pt($bp["top"]["width"]),
85
  $style->length_in_pt($bp["right"]["width"]),
86
  $style->length_in_pt($bp["bottom"]["width"]),
@@ -88,6 +103,9 @@ class Block_Renderer extends Abstract_Renderer {
88
 
89
  foreach ($bp as $side => $props) {
90
  list($x, $y, $w, $h) = $bbox;
 
 
 
91
 
92
  if ( !$props["style"] ||
93
  $props["style"] === "none" ||
@@ -98,27 +116,36 @@ class Block_Renderer extends Abstract_Renderer {
98
  switch($side) {
99
  case "top":
100
  $length = $w;
 
 
101
  break;
102
 
103
  case "bottom":
104
  $length = $w;
105
  $y += $h;
 
 
106
  break;
107
 
108
  case "left":
109
  $length = $h;
 
 
110
  break;
111
 
112
  case "right":
113
  $length = $h;
114
  $x += $w;
 
 
115
  break;
116
  default:
117
  break;
118
  }
119
  $method = "_border_" . $props["style"];
120
-
121
- $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style);
 
122
  }
123
  }
124
 
@@ -158,6 +185,7 @@ class Block_Renderer extends Abstract_Renderer {
158
  $method = "_border_" . $props["style"];
159
  $widths = array_fill(0, 4, $props["width"]);
160
  $sides = array("top", "right", "left", "bottom");
 
161
 
162
  foreach ($sides as $side) {
163
  list($x, $y, $w, $h) = $bbox;
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
34
  }
35
 
36
  // Draw our background, border and content
37
+ list($tl, $tr, $br, $bl) = $style->get_computed_border_radius($w, $h);
38
+
39
+ if ( $tl + $tr + $br + $bl > 0 ) {
40
+ $this->_canvas->clipping_roundrectangle( $x, $y, $w, $h, $tl, $tr, $br, $bl );
41
+ }
42
+
43
  if ( ($bg = $style->background_color) !== "transparent" ) {
44
  $this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg );
45
  }
46
 
47
+ if ( ($url = $style->background_image) && $url !== "none" ) {
48
  $this->_background_image($url, $x, $y, $w, $h, $style);
49
+ }
50
+
51
+ if ( $tl + $tr + $br + $bl > 0 ) {
52
+ $this->_canvas->clipping_end();
53
+ }
54
 
55
  $this->_render_border($frame);
56
  $this->_render_outline($frame);
73
  $style = $frame->get_style();
74
  $bbox = $frame->get_border_box();
75
  $bp = $style->get_border_properties();
76
+
77
+ // find the radius
78
+ $radius = $style->get_computed_border_radius($bbox["w"], $bbox["h"]);
79
 
80
+ // Short-cut: If all the borders are "solid" with the same color and style, and no radius, we'd better draw a rectangle
81
  if (
82
+ in_array($bp["top"]["style"], array("solid", "dashed", "dotted")) &&
83
+ $bp["top"] == $bp["right"] &&
84
+ $bp["right"] == $bp["bottom"] &&
85
+ $bp["bottom"] == $bp["left"] &&
86
+ array_sum($radius) == 0
87
  ) {
88
  $props = $bp["top"];
89
  if ( $props["color"] === "transparent" || $props["width"] <= 0 ) return;
95
  return;
96
  }
97
 
98
+ // Do it the long way
99
  $widths = array($style->length_in_pt($bp["top"]["width"]),
100
  $style->length_in_pt($bp["right"]["width"]),
101
  $style->length_in_pt($bp["bottom"]["width"]),
103
 
104
  foreach ($bp as $side => $props) {
105
  list($x, $y, $w, $h) = $bbox;
106
+ $length = 0;
107
+ $r1 = 0;
108
+ $r2 = 0;
109
 
110
  if ( !$props["style"] ||
111
  $props["style"] === "none" ||
116
  switch($side) {
117
  case "top":
118
  $length = $w;
119
+ $r1 = $radius["top-left"];
120
+ $r2 = $radius["top-right"];
121
  break;
122
 
123
  case "bottom":
124
  $length = $w;
125
  $y += $h;
126
+ $r1 = $radius["bottom-left"];
127
+ $r2 = $radius["bottom-right"];
128
  break;
129
 
130
  case "left":
131
  $length = $h;
132
+ $r1 = $radius["top-left"];
133
+ $r2 = $radius["bottom-left"];
134
  break;
135
 
136
  case "right":
137
  $length = $h;
138
  $x += $w;
139
+ $r1 = $radius["top-right"];
140
+ $r2 = $radius["bottom-right"];
141
  break;
142
  default:
143
  break;
144
  }
145
  $method = "_border_" . $props["style"];
146
+
147
+ // draw rounded corners
148
+ $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style, $r1, $r2);
149
  }
150
  }
151
 
185
  $method = "_border_" . $props["style"];
186
  $widths = array_fill(0, 4, $props["width"]);
187
  $sides = array("top", "right", "left", "bottom");
188
+ $length = 0;
189
 
190
  foreach ($sides as $side) {
191
  list($x, $y, $w, $h) = $bbox;
dompdf/include/cached_pdf_decorator.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: cached_pdf_decorator.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -21,16 +20,27 @@
21
  * @package dompdf
22
  */
23
  class Cached_PDF_Decorator extends CPDF_Adapter implements Canvas {
 
 
 
24
  protected $_pdf;
25
  protected $_cache_id;
26
  protected $_current_page_id;
27
  protected $_fonts; // fonts used in this document
28
 
29
- function __construct($cache_id, CPDF_Adapter $pdf) {
30
- $this->_pdf = $pdf;
31
- $this->_cache_id = $cache_id;
32
  $this->_fonts = array();
33
-
 
 
 
 
 
 
 
 
 
 
34
  $this->_current_page_id = $this->_pdf->open_object();
35
  }
36
 
@@ -39,7 +49,7 @@ class Cached_PDF_Decorator extends CPDF_Adapter implements Canvas {
39
  function get_cpdf() { return $this->_pdf->get_cpdf(); }
40
 
41
  function open_object() { $this->_pdf->open_object(); }
42
- function reopen_object() { return $this->_pdf->reopen_object(); }
43
 
44
  function close_object() { $this->_pdf->close_object(); }
45
 
@@ -79,20 +89,20 @@ class Cached_PDF_Decorator extends CPDF_Adapter implements Canvas {
79
  $this->_pdf->circle($x, $y, $r1, $color, $width, $style, $fill);
80
  }
81
 
82
- function image($img_url, $x, $y, $w = null, $h = null) {
83
- $this->_pdf->image($img_url, $x, $y, $w, $h);
84
  }
85
 
86
- function text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) {
87
  $this->_fonts[$font] = true;
88
- $this->_pdf->text($x, $y, $text, $font, $size, $color, $adjust, $angle);
89
  }
90
 
91
- function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) {
92
 
93
  // We want to remove this from cached pages since it may not be correct
94
  $this->_pdf->close_object();
95
- $this->_pdf->page_text($x, $y, $text, $font, $size, $color, $adjust, $angle);
96
  $this->_pdf->reopen_object($this->_current_page_id);
97
  }
98
 
@@ -119,7 +129,7 @@ class Cached_PDF_Decorator extends CPDF_Adapter implements Canvas {
119
  return $this->_current_page_id;
120
  }
121
 
122
- function stream($filename) {
123
  // Store the last page in the page cache
124
  if ( !is_null($this->_current_page_id) ) {
125
  $this->_pdf->close_object();
@@ -135,7 +145,7 @@ class Cached_PDF_Decorator extends CPDF_Adapter implements Canvas {
135
 
136
  }
137
 
138
- function &output() {
139
  // Store the last page in the page cache
140
  if ( !is_null($this->_current_page_id) ) {
141
  $this->_pdf->close_object();
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
20
  * @package dompdf
21
  */
22
  class Cached_PDF_Decorator extends CPDF_Adapter implements Canvas {
23
+ /**
24
+ * @var CPDF_Adapter
25
+ */
26
  protected $_pdf;
27
  protected $_cache_id;
28
  protected $_current_page_id;
29
  protected $_fonts; // fonts used in this document
30
 
31
+ function __construct($paper = "letter", $orientation = "portrait", DOMPDF $dompdf) {
 
 
32
  $this->_fonts = array();
33
+ }
34
+
35
+ /**
36
+ * Must be called after constructor
37
+ *
38
+ * @param int $cache_id
39
+ * @param CPDF_Adapter $pdf
40
+ */
41
+ function init($cache_id, CPDF_Adapter $pdf) {
42
+ $this->_cache_id = $cache_id;
43
+ $this->_pdf = $pdf;
44
  $this->_current_page_id = $this->_pdf->open_object();
45
  }
46
 
49
  function get_cpdf() { return $this->_pdf->get_cpdf(); }
50
 
51
  function open_object() { $this->_pdf->open_object(); }
52
+ function reopen_object($object) { $this->_pdf->reopen_object($object); }
53
 
54
  function close_object() { $this->_pdf->close_object(); }
55
 
89
  $this->_pdf->circle($x, $y, $r1, $color, $width, $style, $fill);
90
  }
91
 
92
+ function image($img_url, $x, $y, $w, $h, $resolution = "normal") {
93
+ $this->_pdf->image($img_url, $x, $y, $w, $h, $resolution);
94
  }
95
 
96
+ function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0) {
97
  $this->_fonts[$font] = true;
98
+ $this->_pdf->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle);
99
  }
100
 
101
+ function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0) {
102
 
103
  // We want to remove this from cached pages since it may not be correct
104
  $this->_pdf->close_object();
105
+ $this->_pdf->page_text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle);
106
  $this->_pdf->reopen_object($this->_current_page_id);
107
  }
108
 
129
  return $this->_current_page_id;
130
  }
131
 
132
+ function stream($filename, $options = null) {
133
  // Store the last page in the page cache
134
  if ( !is_null($this->_current_page_id) ) {
135
  $this->_pdf->close_object();
145
 
146
  }
147
 
148
+ function output($options = null) {
149
  // Store the last page in the page cache
150
  if ( !is_null($this->_current_page_id) ) {
151
  $this->_pdf->close_object();
dompdf/include/canvas.cls.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: canvas.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
@@ -22,6 +21,12 @@
22
  * @package dompdf
23
  */
24
  interface Canvas {
 
 
 
 
 
 
25
 
26
  /**
27
  * Returns the current page number
@@ -100,6 +105,22 @@ interface Canvas {
100
  * @param float $h
101
  */
102
  function clipping_rectangle($x1, $y1, $w, $h);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
 
104
  /**
105
  * Ends the last clipping shape
@@ -191,30 +212,49 @@ interface Canvas {
191
  * given width and height.
192
  *
193
  * @param string $img_url the path to the image
194
- * @param string $img_type the type (e.g. extension) of the image
195
  * @param float $x x position
196
  * @param float $y y position
197
  * @param int $w width (in pixels)
198
  * @param int $h height (in pixels)
 
199
  */
200
  function image($img_url, $x, $y, $w, $h, $resolution = "normal");
201
 
202
  /**
203
- * Writes text at the specified x and y coordinates
 
 
 
 
 
 
 
 
 
 
 
204
  *
 
 
 
 
 
 
205
  * See {@link Style::munge_colour()} for the format of the colour array.
206
  *
207
- * @param float $x
208
- * @param float $y
209
- * @param string $text the text to write
210
- * @param string $font the font file to use
211
- * @param float $size the font size, in points
212
- * @param array $color
213
- * @param float $word_space word spacing adjustment
214
- * @param float $char_space whar spacing adjustment
215
- * @param float $angle angle
 
 
216
  */
217
- function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0, $char_space = 0, $angle = 0);
218
 
219
  /**
220
  * Add a named destination (similar to <a name="foo">...</a> in html)
@@ -226,19 +266,21 @@ interface Canvas {
226
  /**
227
  * Add a link to the pdf
228
  *
229
- * @param string $url The url to link to
230
- * @param float $x The x position of the link
231
- * @param float $y The y position of the link
232
- * @param float $width The width of the link
233
- * @param float $height The height of the link
 
 
234
  */
235
  function add_link($url, $x, $y, $width, $height);
236
-
237
  /**
238
  * Add meta information to the pdf
239
- *
240
- * @param string $label label of the value (Creator, Producer, etc.)
241
- * @param string $value the text to set
242
  */
243
  function add_info($name, $value);
244
 
@@ -248,27 +290,39 @@ interface Canvas {
248
  * @param string $text the text to be sized
249
  * @param string $font the desired font
250
  * @param float $size the desired font size
251
- * @param float $spacing word spacing, if any
 
 
252
  * @return float
253
  */
254
- function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0);
255
 
256
  /**
257
  * Calculates font height, in points
258
  *
259
  * @param string $font
260
- * @param float $size
 
261
  * @return float
262
  */
263
  function get_font_height($font, $size);
264
-
 
 
 
 
 
 
 
 
265
  function get_font_baseline($font, $size);
266
 
267
  /**
268
  * Returns the font x-height, in points
269
  *
270
  * @param string $font
271
- * @param float $size
 
272
  * @return float
273
  */
274
  //function get_font_x_height($font, $size);
@@ -276,17 +330,15 @@ interface Canvas {
276
  /**
277
  * Sets the opacity
278
  *
279
- * @param float $opacity
280
  * @param string $mode
281
- * @return float
282
  */
283
  function set_opacity($opacity, $mode = "Normal");
284
-
285
  /**
286
  * Sets the default view
287
  *
288
  * @param string $view
289
- *
290
  * 'XYZ' left, top, zoom
291
  * 'Fit'
292
  * 'FitH' top
@@ -295,9 +347,19 @@ interface Canvas {
295
  * 'FitB'
296
  * 'FitBH' top
297
  * 'FitBV' left
 
 
 
298
  */
299
  function set_default_view($view, $options = array());
300
-
 
 
 
 
 
 
 
301
  /**
302
  * Starts a new page
303
  *
@@ -320,5 +382,4 @@ interface Canvas {
320
  * @return string
321
  */
322
  function output($options = null);
323
-
324
  }
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
21
  * @package dompdf
22
  */
23
  interface Canvas {
24
+ function __construct($paper = "letter", $orientation = "portrait", DOMPDF $dompdf);
25
+
26
+ /**
27
+ * @return DOMPDF
28
+ */
29
+ function get_dompdf();
30
 
31
  /**
32
  * Returns the current page number
105
  * @param float $h
106
  */
107
  function clipping_rectangle($x1, $y1, $w, $h);
108
+
109
+ /**
110
+ * Starts a rounded clipping rectangle at x1,y1 with width w and height h
111
+ *
112
+ * @param float $x1
113
+ * @param float $y1
114
+ * @param float $w
115
+ * @param float $h
116
+ * @param float $tl
117
+ * @param float $tr
118
+ * @param float $br
119
+ * @param float $bl
120
+ *
121
+ * @return
122
+ */
123
+ function clipping_roundrectangle($x1, $y1, $w, $h, $tl, $tr, $br, $bl);
124
 
125
  /**
126
  * Ends the last clipping shape
212
  * given width and height.
213
  *
214
  * @param string $img_url the path to the image
 
215
  * @param float $x x position
216
  * @param float $y y position
217
  * @param int $w width (in pixels)
218
  * @param int $h height (in pixels)
219
+ * @param string $resolution The resolution of the image
220
  */
221
  function image($img_url, $x, $y, $w, $h, $resolution = "normal");
222
 
223
  /**
224
+ * Add an arc to the PDF
225
+ * See {@link Style::munge_colour()} for the format of the colour array.
226
+ *
227
+ * @param float $x X coordinate of the arc
228
+ * @param float $y Y coordinate of the arc
229
+ * @param float $r1 Radius 1
230
+ * @param float $r2 Radius 2
231
+ * @param float $astart Start angle in degrees
232
+ * @param float $aend End angle in degrees
233
+ * @param array $color Color
234
+ * @param float $width
235
+ * @param array $style
236
  *
237
+ * @return void
238
+ */
239
+ function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = array());
240
+
241
+ /**
242
+ * Writes text at the specified x and y coordinates
243
  * See {@link Style::munge_colour()} for the format of the colour array.
244
  *
245
+ * @param float $x
246
+ * @param float $y
247
+ * @param string $text the text to write
248
+ * @param string $font the font file to use
249
+ * @param float $size the font size, in points
250
+ * @param array $color
251
+ * @param float $word_space word spacing adjustment
252
+ * @param float $char_space char spacing adjustment
253
+ * @param float $angle angle
254
+ *
255
+ * @return void
256
  */
257
+ function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0);
258
 
259
  /**
260
  * Add a named destination (similar to <a name="foo">...</a> in html)
266
  /**
267
  * Add a link to the pdf
268
  *
269
+ * @param string $url The url to link to
270
+ * @param float $x The x position of the link
271
+ * @param float $y The y position of the link
272
+ * @param float $width The width of the link
273
+ * @param float $height The height of the link
274
+ *
275
+ * @return void
276
  */
277
  function add_link($url, $x, $y, $width, $height);
278
+
279
  /**
280
  * Add meta information to the pdf
281
+ *
282
+ * @param string $name Label of the value (Creator, Producer, etc.)
283
+ * @param string $value The text to set
284
  */
285
  function add_info($name, $value);
286
 
290
  * @param string $text the text to be sized
291
  * @param string $font the desired font
292
  * @param float $size the desired font size
293
+ * @param float $word_spacing word spacing, if any
294
+ * @param float $char_spacing
295
+ *
296
  * @return float
297
  */
298
+ function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0);
299
 
300
  /**
301
  * Calculates font height, in points
302
  *
303
  * @param string $font
304
+ * @param float $size
305
+ *
306
  * @return float
307
  */
308
  function get_font_height($font, $size);
309
+
310
+ /**
311
+ * Calculates font baseline, in points
312
+ *
313
+ * @param string $font
314
+ * @param float $size
315
+ *
316
+ * @return float
317
+ */
318
  function get_font_baseline($font, $size);
319
 
320
  /**
321
  * Returns the font x-height, in points
322
  *
323
  * @param string $font
324
+ * @param float $size
325
+ *
326
  * @return float
327
  */
328
  //function get_font_x_height($font, $size);
330
  /**
331
  * Sets the opacity
332
  *
333
+ * @param float $opacity
334
  * @param string $mode
 
335
  */
336
  function set_opacity($opacity, $mode = "Normal");
337
+
338
  /**
339
  * Sets the default view
340
  *
341
  * @param string $view
 
342
  * 'XYZ' left, top, zoom
343
  * 'Fit'
344
  * 'FitH' top
347
  * 'FitB'
348
  * 'FitBH' top
349
  * 'FitBV' left
350
+ * @param array $options
351
+ *
352
+ * @return void
353
  */
354
  function set_default_view($view, $options = array());
355
+
356
+ /**
357
+ * @param string $script
358
+ *
359
+ * @return void
360
+ */
361
+ function javascript($script);
362
+
363
  /**
364
  * Starts a new page
365
  *
382
  * @return string
383
  */
384
  function output($options = null);
 
385
  }
dompdf/include/canvas_factory.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: canvas_factory.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -23,37 +22,42 @@ class Canvas_Factory {
23
  private function __construct() { }
24
 
25
  /**
 
26
  * @param string|array $paper
27
- * @param string $orientation
28
- * @param string $class
29
- *
30
  * @return Canvas
31
  */
32
- static function get_instance($paper = null, $orientation = null, $class = null) {
33
 
34
  $backend = strtolower(DOMPDF_PDF_BACKEND);
35
 
36
- if ( isset($class) && class_exists($class, false) )
37
  $class .= "_Adapter";
 
38
 
39
  else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "pdflib" ) &&
40
- class_exists("PDFLib", false) )
41
  $class = "PDFLib_Adapter";
 
42
 
43
  // FIXME The TCPDF adapter is not ready yet
44
  //else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "cpdf") )
45
  // $class = "CPDF_Adapter";
46
 
47
- else if ( $backend === "tcpdf")
48
  $class = "TCPDF_Adapter";
 
49
 
50
- else if ( $backend === "gd" )
51
  $class = "GD_Adapter";
 
52
 
53
- else
54
  $class = "CPDF_Adapter";
 
55
 
56
- return new $class($paper, $orientation);
57
-
58
  }
59
  }
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
22
  private function __construct() { }
23
 
24
  /**
25
+ * @param DOMPDF $dompdf
26
  * @param string|array $paper
27
+ * @param string $orientation
28
+ * @param string $class
29
+ *
30
  * @return Canvas
31
  */
32
+ static function get_instance(DOMPDF $dompdf, $paper = null, $orientation = null, $class = null) {
33
 
34
  $backend = strtolower(DOMPDF_PDF_BACKEND);
35
 
36
+ if ( isset($class) && class_exists($class, false) ) {
37
  $class .= "_Adapter";
38
+ }
39
 
40
  else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "pdflib" ) &&
41
+ class_exists("PDFLib", false) ) {
42
  $class = "PDFLib_Adapter";
43
+ }
44
 
45
  // FIXME The TCPDF adapter is not ready yet
46
  //else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "cpdf") )
47
  // $class = "CPDF_Adapter";
48
 
49
+ else if ( $backend === "tcpdf" ) {
50
  $class = "TCPDF_Adapter";
51
+ }
52
 
53
+ else if ( $backend === "gd" ) {
54
  $class = "GD_Adapter";
55
+ }
56
 
57
+ else {
58
  $class = "CPDF_Adapter";
59
+ }
60
 
61
+ return new $class($paper, $orientation, $dompdf);
 
62
  }
63
  }
dompdf/include/cellmap.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: cellmap.cls.php 464 2012-01-30 20:44:53Z fabien.menager $
8
  */
9
 
10
  /**
@@ -23,16 +22,18 @@ class Cellmap {
23
  *
24
  * @var array
25
  */
26
- static protected $_BORDER_STYLE_SCORE = array("inset" => 1,
27
- "groove" => 2,
28
- "outset" => 3,
29
- "ridge" => 4,
30
- "dotted" => 5,
31
- "dashed" => 6,
32
- "solid" => 7,
33
- "double" => 8,
34
- "hidden" => 9,
35
- "none" => 0);
 
 
36
 
37
  /**
38
  * The table object this cellmap is attached to.
@@ -58,7 +59,7 @@ class Cellmap {
58
  /**
59
  * 2D array mapping <row,column> to frames
60
  *
61
- * @var array
62
  */
63
  protected $_cells;
64
 
@@ -84,27 +85,39 @@ class Cellmap {
84
  protected $_borders;
85
 
86
  /**
87
- * 1D Array mapping frames to (multiple) <row, col> pairs, keyed on
88
- * frame_id.
89
  *
90
- * @var array
91
  */
92
  protected $_frames;
93
 
94
  /**
95
- * @var int Current column when adding cells, 0-based
 
 
96
  */
97
  private $__col;
98
 
99
  /**
100
- * @var int Current row when adding cells, 0-based
 
 
101
  */
102
  private $__row;
103
 
104
  /**
105
- * @var bool Tells wether the columns' width can be modified
 
 
106
  */
107
  private $_columns_locked = false;
 
 
 
 
 
 
 
108
 
109
  //........................................................................
110
 
@@ -146,6 +159,14 @@ class Cellmap {
146
  return $this->_columns_locked;
147
  }
148
 
 
 
 
 
 
 
 
 
149
  function get_num_rows() { return $this->_num_rows; }
150
  function get_num_cols() { return $this->_num_cols; }
151
 
@@ -158,15 +179,18 @@ class Cellmap {
158
  }
159
 
160
  function &get_column($i) {
161
- if ( !isset($this->_columns[$i]) )
162
- $this->_columns[$i] = array("x" => 0,
163
- "min-width" => 0,
164
- "max-width" => 0,
165
- "used-width" => null,
166
- "absolute" => 0,
167
- "percent" => 0,
168
- "auto" => true);
169
-
 
 
 
170
  return $this->_columns[$i];
171
  }
172
 
@@ -175,37 +199,45 @@ class Cellmap {
175
  }
176
 
177
  function &get_row($j) {
178
- if ( !isset($this->_rows[$j]) )
179
- $this->_rows[$j] = array("y" => 0,
180
- "first-column" => 0,
181
- "height" => null);
 
 
 
 
182
  return $this->_rows[$j];
183
  }
184
 
185
  function get_border($i, $j, $h_v, $prop = null) {
186
- if ( !isset($this->_borders[$i][$j][$h_v]) )
187
- $this->_borders[$i][$j][$h_v] = array("width" => 0,
188
- "style" => "solid",
189
- "color" => "black");
190
- if ( isset($prop) )
 
 
 
 
191
  return $this->_borders[$i][$j][$h_v][$prop];
192
-
 
193
  return $this->_borders[$i][$j][$h_v];
194
  }
195
 
196
  function get_border_properties($i, $j) {
197
-
198
- $left = $this->get_border($i, $j, "vertical");
199
- $right = $this->get_border($i, $j+1, "vertical");
200
- $top = $this->get_border($i, $j, "horizontal");
201
- $bottom = $this->get_border($i+1, $j, "horizontal");
202
-
203
- return compact("top", "bottom", "left", "right");
204
  }
205
 
206
  //........................................................................
207
 
208
- function get_spanned_cells($frame) {
209
  $key = $frame->get_id();
210
 
211
  if ( !isset($this->_frames[$key]) ) {
@@ -216,12 +248,12 @@ class Cellmap {
216
 
217
  }
218
 
219
- function frame_exists_in_cellmap($frame) {
220
  $key = $frame->get_id();
221
  return isset($this->_frames[$key]);
222
  }
223
 
224
- function get_frame_position($frame) {
225
  global $_dompdf_warnings;
226
 
227
  $key = $frame->get_id();
@@ -236,19 +268,23 @@ class Cellmap {
236
  if ( !isset($this->_columns[$col])) {
237
  $_dompdf_warnings[] = "Frame not found in columns array. Check your table layout for missing or extra TDs.";
238
  $x = 0;
239
- } else
 
240
  $x = $this->_columns[$col]["x"];
 
241
 
242
  if ( !isset($this->_rows[$row])) {
243
  $_dompdf_warnings[] = "Frame not found in row array. Check your table layout for missing or extra TDs.";
244
  $y = 0;
245
- } else
 
246
  $y = $this->_rows[$row]["y"];
 
247
 
248
  return array($x, $y, "x" => $x, "y" => $y);
249
  }
250
 
251
- function get_frame_width($frame) {
252
  $key = $frame->get_id();
253
 
254
  if ( !isset($this->_frames[$key]) ) {
@@ -257,14 +293,14 @@ class Cellmap {
257
 
258
  $cols = $this->_frames[$key]["columns"];
259
  $w = 0;
260
- foreach ($cols as $i)
261
  $w += $this->_columns[$i]["used-width"];
262
-
 
263
  return $w;
264
-
265
  }
266
 
267
- function get_frame_height($frame) {
268
  $key = $frame->get_id();
269
 
270
  if ( !isset($this->_frames[$key]) ) {
@@ -275,12 +311,13 @@ class Cellmap {
275
  $h = 0;
276
  foreach ($rows as $i) {
277
  if ( !isset($this->_rows[$i]) ) {
278
- throw new Exception("foo");
279
  }
 
280
  $h += $this->_rows[$i]["height"];
281
  }
 
282
  return $h;
283
-
284
  }
285
 
286
 
@@ -316,7 +353,6 @@ class Cellmap {
316
  protected function _resolve_border($i, $j, $h_v, $border_spec) {
317
  $n_width = $border_spec["width"];
318
  $n_style = $border_spec["style"];
319
- $n_color = $border_spec["color"];
320
 
321
  if ( !isset($this->_borders[$i][$j][$h_v]) ) {
322
  $this->_borders[$i][$j][$h_v] = $border_spec;
@@ -327,7 +363,6 @@ class Cellmap {
327
 
328
  $o_width = $border["width"];
329
  $o_style = $border["style"];
330
- $o_color = $border["color"];
331
 
332
  if ( ($n_style === "hidden" ||
333
  $n_width > $o_width ||
@@ -337,8 +372,9 @@ class Cellmap {
337
 
338
  ($o_width == $n_width &&
339
  in_array($n_style, self::$_BORDER_STYLE_SCORE) &&
340
- self::$_BORDER_STYLE_SCORE[ $n_style ] > self::$_BORDER_STYLE_SCORE[ $o_style ]) )
341
  $border = $border_spec;
 
342
 
343
  return $border["width"];
344
  }
@@ -359,11 +395,13 @@ class Cellmap {
359
  in_array($display, Table_Frame_Decorator::$ROW_GROUPS) ) {
360
 
361
  $start_row = $this->__row;
362
- foreach ( $frame->get_children() as $child )
363
  $this->add_frame( $child );
 
364
 
365
- if ( $display === "table-row" )
366
  $this->add_row();
 
367
 
368
  $num_rows = $this->__row - $start_row - 1;
369
  $key = $frame->get_id();
@@ -418,8 +456,10 @@ class Cellmap {
418
 
419
  // Find the next available column (fix by Ciro Mondueri)
420
  $ac = $this->__col;
421
- while ( isset($this->_cells[$this->__row][$ac]) )
422
  $ac++;
 
 
423
  $this->__col = $ac;
424
 
425
  // Rows:
@@ -428,8 +468,9 @@ class Cellmap {
428
 
429
  $this->_frames[$key]["rows"][] = $row;
430
 
431
- for ( $j = 0; $j < $colspan; $j++)
432
  $this->_cells[$row][$this->__col + $j] = $frame;
 
433
 
434
  if ( $collapse ) {
435
  // Resolve vertical borders
@@ -464,9 +505,8 @@ class Cellmap {
464
  $style->margin = "$v $h";
465
 
466
  // The additional 1/2 width gets added to the table proper
467
-
468
- } else {
469
-
470
  // Drop the frame's actual border
471
  $style->border_left_width = $max_left / 2;
472
  $style->border_right_width = $max_right / 2;
@@ -475,21 +515,27 @@ class Cellmap {
475
  $style->margin = "none";
476
  }
477
 
478
- // Resolve the frame's width
479
- list($frame_min, $frame_max) = $frame->get_min_max_width();
480
-
481
- $width = $style->width;
482
-
483
- if ( is_percent($width) ) {
484
- $var = "percent";
485
- $val = (float)rtrim($width, "% ") / $colspan;
486
-
487
- } else if ( $width !== "auto" ) {
488
- $var = "absolute";
489
- $val = $style->length_in_pt($frame_min) / $colspan;
490
- }
491
 
492
- if (!$this->_columns_locked) {
 
 
 
 
 
 
 
 
 
493
  $min = 0;
494
  $max = 0;
495
  for ( $cs = 0; $cs < $colspan; $cs++ ) {
@@ -509,10 +555,10 @@ class Cellmap {
509
  $max += $col["max-width"];
510
  }
511
 
512
-
513
  if ( $frame_min > $min ) {
514
  // The frame needs more space. Expand each sub-column
515
- $inc = ($frame_min - $min) / $colspan;
 
516
  for ($c = 0; $c < $colspan; $c++) {
517
  $col =& $this->get_column($this->__col + $c);
518
  $col["min-width"] += $inc;
@@ -520,7 +566,8 @@ class Cellmap {
520
  }
521
 
522
  if ( $frame_max > $max ) {
523
- $inc = ($frame_max - $max) / $colspan;
 
524
  for ($c = 0; $c < $colspan; $c++) {
525
  $col =& $this->get_column($this->__col + $c);
526
  $col["max-width"] += $inc;
@@ -543,8 +590,9 @@ class Cellmap {
543
 
544
  // Find the next available column
545
  $i = 0;
546
- while ( isset($this->_cells[$this->__row][$i]) )
547
  $i++;
 
548
 
549
  $this->__col = $i;
550
 
@@ -560,8 +608,9 @@ class Cellmap {
560
  function remove_row(Frame $row) {
561
 
562
  $key = $row->get_id();
563
- if ( !isset($this->_frames[$key]) )
564
  return; // Presumably this row has alredy been removed
 
565
 
566
  $this->_row = $this->_num_rows--;
567
 
@@ -581,6 +630,7 @@ class Cellmap {
581
  unset($this->_cells[$r][$c]);
582
  }
583
  }
 
584
  $this->_rows[$r] = null;
585
  unset($this->_rows[$r]);
586
  }
@@ -598,9 +648,10 @@ class Cellmap {
598
  function remove_row_group(Frame $group) {
599
 
600
  $key = $group->get_id();
601
- if ( !isset($this->_frames[$key]) )
602
  return; // Presumably this row has alredy been removed
603
-
 
604
  $iter = $group->get_first_child();
605
  while ($iter) {
606
  $this->remove_row($iter);
@@ -641,7 +692,6 @@ class Cellmap {
641
  foreach ( array_keys($this->_columns) as $j ) {
642
  $this->_columns[$j]["x"] = $x;
643
  $x += $this->_columns[$j]["used-width"];
644
-
645
  }
646
 
647
  }
@@ -655,16 +705,20 @@ class Cellmap {
655
 
656
  $h = 0;
657
  foreach( $arr["rows"] as $row ) {
658
- if ( !isset($this->_rows[$row]) )
659
  // The row has been removed because of a page split, so skip it.
660
  continue;
 
 
661
  $h += $this->_rows[$row]["height"];
662
  }
663
 
664
- if ( $frame instanceof Table_Cell_Frame_Decorator )
665
  $frame->set_cell_height($h);
666
- else
 
667
  $frame->get_style()->height = $h;
 
668
  }
669
 
670
  }
@@ -683,21 +737,26 @@ class Cellmap {
683
 
684
  $h = 0;
685
  foreach ($arr["rows"] as $row ) {
686
- if ( !isset($this->_rows[$row]) )
687
  continue;
 
688
 
689
  $h += $this->_rows[$row]["height"];
690
  }
691
 
692
- if ( $content_height > 0 )
693
  $new_height = ($h / $content_height) * $table_height;
694
- else
 
695
  $new_height = 0;
 
696
 
697
- if ( $frame instanceof Table_Cell_Frame_Decorator )
698
  $frame->set_cell_height($new_height);
699
- else
 
700
  $frame->get_style()->height = $new_height;
 
701
  }
702
 
703
  }
@@ -714,15 +773,18 @@ class Cellmap {
714
 
715
  $str .= "Frames:<br/>";
716
  $arr = array();
717
- foreach ( $this->_frames as $key => $val )
718
  $arr[$key] = array("columns" => $val["columns"], "rows" => $val["rows"]);
719
-
 
720
  $str .= pre_r($arr, true);
721
 
722
- if ( php_sapi_name() == "cli" )
723
  $str = strip_tags(str_replace(array("<br/>","<b>","</b>"),
724
  array("\n",chr(27)."[01;33m", chr(27)."[0m"),
725
  $str));
 
 
726
  return $str;
727
  }
728
  }
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
22
  *
23
  * @var array
24
  */
25
+ static protected $_BORDER_STYLE_SCORE = array(
26
+ "inset" => 1,
27
+ "groove" => 2,
28
+ "outset" => 3,
29
+ "ridge" => 4,
30
+ "dotted" => 5,
31
+ "dashed" => 6,
32
+ "solid" => 7,
33
+ "double" => 8,
34
+ "hidden" => 9,
35
+ "none" => 0,
36
+ );
37
 
38
  /**
39
  * The table object this cellmap is attached to.
59
  /**
60
  * 2D array mapping <row,column> to frames
61
  *
62
+ * @var Frame[][]
63
  */
64
  protected $_cells;
65
 
85
  protected $_borders;
86
 
87
  /**
88
+ * 1D Array mapping frames to (multiple) <row, col> pairs, keyed on frame_id.
 
89
  *
90
+ * @var Frame[]
91
  */
92
  protected $_frames;
93
 
94
  /**
95
+ * Current column when adding cells, 0-based
96
+ *
97
+ * @var int
98
  */
99
  private $__col;
100
 
101
  /**
102
+ * Current row when adding cells, 0-based
103
+ *
104
+ * @var int
105
  */
106
  private $__row;
107
 
108
  /**
109
+ * Tells wether the columns' width can be modified
110
+ *
111
+ * @var bool
112
  */
113
  private $_columns_locked = false;
114
+
115
+ /**
116
+ * Tells wether the table has table-layout:fixed
117
+ *
118
+ * @var bool
119
+ */
120
+ private $_fixed_layout = false;
121
 
122
  //........................................................................
123
 
159
  return $this->_columns_locked;
160
  }
161
 
162
+ function set_layout_fixed($fixed) {
163
+ $this->_fixed_layout = $fixed;
164
+ }
165
+
166
+ function is_layout_fixed() {
167
+ return $this->_fixed_layout;
168
+ }
169
+
170
  function get_num_rows() { return $this->_num_rows; }
171
  function get_num_cols() { return $this->_num_cols; }
172
 
179
  }
180
 
181
  function &get_column($i) {
182
+ if ( !isset($this->_columns[$i]) ) {
183
+ $this->_columns[$i] = array(
184
+ "x" => 0,
185
+ "min-width" => 0,
186
+ "max-width" => 0,
187
+ "used-width" => null,
188
+ "absolute" => 0,
189
+ "percent" => 0,
190
+ "auto" => true,
191
+ );
192
+ }
193
+
194
  return $this->_columns[$i];
195
  }
196
 
199
  }
200
 
201
  function &get_row($j) {
202
+ if ( !isset($this->_rows[$j]) ) {
203
+ $this->_rows[$j] = array(
204
+ "y" => 0,
205
+ "first-column" => 0,
206
+ "height" => null,
207
+ );
208
+ }
209
+
210
  return $this->_rows[$j];
211
  }
212
 
213
  function get_border($i, $j, $h_v, $prop = null) {
214
+ if ( !isset($this->_borders[$i][$j][$h_v]) ) {
215
+ $this->_borders[$i][$j][$h_v] = array(
216
+ "width" => 0,
217
+ "style" => "solid",
218
+ "color" => "black",
219
+ );
220
+ }
221
+
222
+ if ( isset($prop) ) {
223
  return $this->_borders[$i][$j][$h_v][$prop];
224
+ }
225
+
226
  return $this->_borders[$i][$j][$h_v];
227
  }
228
 
229
  function get_border_properties($i, $j) {
230
+ return array(
231
+ "top" => $this->get_border($i, $j, "horizontal"),
232
+ "right" => $this->get_border($i, $j+1, "vertical"),
233
+ "bottom" => $this->get_border($i+1, $j, "horizontal"),
234
+ "left" => $this->get_border($i, $j, "vertical"),
235
+ );
 
236
  }
237
 
238
  //........................................................................
239
 
240
+ function get_spanned_cells(Frame $frame) {
241
  $key = $frame->get_id();
242
 
243
  if ( !isset($this->_frames[$key]) ) {
248
 
249
  }
250
 
251
+ function frame_exists_in_cellmap(Frame $frame) {
252
  $key = $frame->get_id();
253
  return isset($this->_frames[$key]);
254
  }
255
 
256
+ function get_frame_position(Frame $frame) {
257
  global $_dompdf_warnings;
258
 
259
  $key = $frame->get_id();
268
  if ( !isset($this->_columns[$col])) {
269
  $_dompdf_warnings[] = "Frame not found in columns array. Check your table layout for missing or extra TDs.";
270
  $x = 0;
271
+ }
272
+ else {
273
  $x = $this->_columns[$col]["x"];
274
+ }
275
 
276
  if ( !isset($this->_rows[$row])) {
277
  $_dompdf_warnings[] = "Frame not found in row array. Check your table layout for missing or extra TDs.";
278
  $y = 0;
279
+ }
280
+ else {
281
  $y = $this->_rows[$row]["y"];
282
+ }
283
 
284
  return array($x, $y, "x" => $x, "y" => $y);
285
  }
286
 
287
+ function get_frame_width(Frame $frame) {
288
  $key = $frame->get_id();
289
 
290
  if ( !isset($this->_frames[$key]) ) {
293
 
294
  $cols = $this->_frames[$key]["columns"];
295
  $w = 0;
296
+ foreach ($cols as $i) {
297
  $w += $this->_columns[$i]["used-width"];
298
+ }
299
+
300
  return $w;
 
301
  }
302
 
303
+ function get_frame_height(Frame $frame) {
304
  $key = $frame->get_id();
305
 
306
  if ( !isset($this->_frames[$key]) ) {
311
  $h = 0;
312
  foreach ($rows as $i) {
313
  if ( !isset($this->_rows[$i]) ) {
314
+ throw new Exception("The row #$i could not be found, please file an issue in the tracker with the HTML code");
315
  }
316
+
317
  $h += $this->_rows[$i]["height"];
318
  }
319
+
320
  return $h;
 
321
  }
322
 
323
 
353
  protected function _resolve_border($i, $j, $h_v, $border_spec) {
354
  $n_width = $border_spec["width"];
355
  $n_style = $border_spec["style"];
 
356
 
357
  if ( !isset($this->_borders[$i][$j][$h_v]) ) {
358
  $this->_borders[$i][$j][$h_v] = $border_spec;
363
 
364
  $o_width = $border["width"];
365
  $o_style = $border["style"];
 
366
 
367
  if ( ($n_style === "hidden" ||
368
  $n_width > $o_width ||
372
 
373
  ($o_width == $n_width &&
374
  in_array($n_style, self::$_BORDER_STYLE_SCORE) &&
375
+ self::$_BORDER_STYLE_SCORE[ $n_style ] > self::$_BORDER_STYLE_SCORE[ $o_style ]) ) {
376
  $border = $border_spec;
377
+ }
378
 
379
  return $border["width"];
380
  }
395
  in_array($display, Table_Frame_Decorator::$ROW_GROUPS) ) {
396
 
397
  $start_row = $this->__row;
398
+ foreach ( $frame->get_children() as $child ) {
399
  $this->add_frame( $child );
400
+ }
401
 
402
+ if ( $display === "table-row" ) {
403
  $this->add_row();
404
+ }
405
 
406
  $num_rows = $this->__row - $start_row - 1;
407
  $key = $frame->get_id();
456
 
457
  // Find the next available column (fix by Ciro Mondueri)
458
  $ac = $this->__col;
459
+ while ( isset($this->_cells[$this->__row][$ac]) ) {
460
  $ac++;
461
+ }
462
+
463
  $this->__col = $ac;
464
 
465
  // Rows:
468
 
469
  $this->_frames[$key]["rows"][] = $row;
470
 
471
+ for ( $j = 0; $j < $colspan; $j++) {
472
  $this->_cells[$row][$this->__col + $j] = $frame;
473
+ }
474
 
475
  if ( $collapse ) {
476
  // Resolve vertical borders
505
  $style->margin = "$v $h";
506
 
507
  // The additional 1/2 width gets added to the table proper
508
+ }
509
+ else {
 
510
  // Drop the frame's actual border
511
  $style->border_left_width = $max_left / 2;
512
  $style->border_right_width = $max_right / 2;
515
  $style->margin = "none";
516
  }
517
 
518
+ if ( !$this->_columns_locked ) {
519
+ // Resolve the frame's width
520
+ if ( $this->_fixed_layout ) {
521
+ list($frame_min, $frame_max) = array(0, 10e-10);
522
+ }
523
+ else {
524
+ list($frame_min, $frame_max) = $frame->get_min_max_width();
525
+ }
526
+
527
+ $width = $style->width;
 
 
 
528
 
529
+ $val = null;
530
+ if ( is_percent($width) ) {
531
+ $var = "percent";
532
+ $val = (float)rtrim($width, "% ") / $colspan;
533
+ }
534
+ else if ( $width !== "auto" ) {
535
+ $var = "absolute";
536
+ $val = $style->length_in_pt($frame_min) / $colspan;
537
+ }
538
+
539
  $min = 0;
540
  $max = 0;
541
  for ( $cs = 0; $cs < $colspan; $cs++ ) {
555
  $max += $col["max-width"];
556
  }
557
 
 
558
  if ( $frame_min > $min ) {
559
  // The frame needs more space. Expand each sub-column
560
+ // FIXME try to avoid putting this dummy value when table-layout:fixed
561
+ $inc = ($this->is_layout_fixed() ? 10e-10 : ($frame_min - $min) / $colspan);
562
  for ($c = 0; $c < $colspan; $c++) {
563
  $col =& $this->get_column($this->__col + $c);
564
  $col["min-width"] += $inc;
566
  }
567
 
568
  if ( $frame_max > $max ) {
569
+ // FIXME try to avoid putting this dummy value when table-layout:fixed
570
+ $inc = ($this->is_layout_fixed() ? 10e-10 : ($frame_max - $max) / $colspan);
571
  for ($c = 0; $c < $colspan; $c++) {
572
  $col =& $this->get_column($this->__col + $c);
573
  $col["max-width"] += $inc;
590
 
591
  // Find the next available column
592
  $i = 0;
593
+ while ( isset($this->_cells[$this->__row][$i]) ) {
594
  $i++;
595
+ }
596
 
597
  $this->__col = $i;
598
 
608
  function remove_row(Frame $row) {
609
 
610
  $key = $row->get_id();
611
+ if ( !isset($this->_frames[$key]) ) {
612
  return; // Presumably this row has alredy been removed
613
+ }
614
 
615
  $this->_row = $this->_num_rows--;
616
 
630
  unset($this->_cells[$r][$c]);
631
  }
632
  }
633
+
634
  $this->_rows[$r] = null;
635
  unset($this->_rows[$r]);
636
  }
648
  function remove_row_group(Frame $group) {
649
 
650
  $key = $group->get_id();
651
+ if ( !isset($this->_frames[$key]) ) {
652
  return; // Presumably this row has alredy been removed
653
+ }
654
+
655
  $iter = $group->get_first_child();
656
  while ($iter) {
657
  $this->remove_row($iter);
692
  foreach ( array_keys($this->_columns) as $j ) {
693
  $this->_columns[$j]["x"] = $x;
694
  $x += $this->_columns[$j]["used-width"];
 
695
  }
696
 
697
  }
705
 
706
  $h = 0;
707
  foreach( $arr["rows"] as $row ) {
708
+ if ( !isset($this->_rows[$row]) ) {
709
  // The row has been removed because of a page split, so skip it.
710
  continue;
711
+ }
712
+
713
  $h += $this->_rows[$row]["height"];
714
  }
715
 
716
+ if ( $frame instanceof Table_Cell_Frame_Decorator ) {
717
  $frame->set_cell_height($h);
718
+ }
719
+ else {
720
  $frame->get_style()->height = $h;
721
+ }
722
  }
723
 
724
  }
737
 
738
  $h = 0;
739
  foreach ($arr["rows"] as $row ) {
740
+ if ( !isset($this->_rows[$row]) ) {
741
  continue;
742
+ }
743
 
744
  $h += $this->_rows[$row]["height"];
745
  }
746
 
747
+ if ( $content_height > 0 ) {
748
  $new_height = ($h / $content_height) * $table_height;
749
+ }
750
+ else {
751
  $new_height = 0;
752
+ }
753
 
754
+ if ( $frame instanceof Table_Cell_Frame_Decorator ) {
755
  $frame->set_cell_height($new_height);
756
+ }
757
+ else {
758
  $frame->get_style()->height = $new_height;
759
+ }
760
  }
761
 
762
  }
773
 
774
  $str .= "Frames:<br/>";
775
  $arr = array();
776
+ foreach ( $this->_frames as $key => $val ) {
777
  $arr[$key] = array("columns" => $val["columns"], "rows" => $val["rows"]);
778
+ }
779
+
780
  $str .= pre_r($arr, true);
781
 
782
+ if ( php_sapi_name() == "cli" ) {
783
  $str = strip_tags(str_replace(array("<br/>","<b>","</b>"),
784
  array("\n",chr(27)."[01;33m", chr(27)."[0m"),
785
  $str));
786
+ }
787
+
788
  return $str;
789
  }
790
  }
dompdf/include/cpdf_adapter.cls.php CHANGED
@@ -5,9 +5,8 @@
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Orion Richardson <orionr@yahoo.com>
7
  * @author Helmut Tischer <htischer@weihenstephan.org>
8
- * @author Fabien M�nager <fabien.menager@gmail.com>
9
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
10
- * @version $Id: cpdf_adapter.cls.php 466 2012-02-04 13:08:38Z fabien.menager $
11
  */
12
 
13
  // FIXME: Need to sanity check inputs to this class
@@ -94,6 +93,12 @@ class CPDF_Adapter implements Canvas {
94
  "11x17" => array(0,0,792.00, 1224.00),
95
  );
96
 
 
 
 
 
 
 
97
 
98
  /**
99
  * Instance of Cpdf class
@@ -150,27 +155,38 @@ class CPDF_Adapter implements Canvas {
150
  * @var array
151
  */
152
  private $_image_cache;
153
-
154
  /**
155
  * Class constructor
156
  *
157
- * @param mixed $paper The size of paper to use in this PDF ({@link CPDF_Adapter::$PAPER_SIZES})
158
- * @param string $orientation The orienation of the document (either 'landscape' or 'portrait')
 
159
  */
160
- function __construct($paper = "letter", $orientation = "portrait") {
161
-
162
- if ( is_array($paper) )
163
  $size = $paper;
164
- else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) )
 
165
  $size = self::$PAPER_SIZES[mb_strtolower($paper)];
166
- else
 
167
  $size = self::$PAPER_SIZES["letter"];
 
168
 
169
  if ( mb_strtolower($orientation) === "landscape" ) {
170
  list($size[2], $size[3]) = array($size[3], $size[2]);
171
  }
 
 
172
 
173
- $this->_pdf = new Cpdf($size, DOMPDF_UNICODE_ENABLED, DOMPDF_FONT_CACHE, DOMPDF_TEMP_DIR);
 
 
 
 
 
 
174
  $this->_pdf->addInfo("Creator", "DOMPDF");
175
  $time = substr_replace(date('YmdHisO'), '\'', -2, 0).'\'';
176
  $this->_pdf->addInfo("CreationDate", "D:$time");
@@ -187,6 +203,10 @@ class CPDF_Adapter implements Canvas {
187
  $this->_image_cache = array();
188
  }
189
 
 
 
 
 
190
  /**
191
  * Class destructor
192
  *
@@ -194,10 +214,8 @@ class CPDF_Adapter implements Canvas {
194
  */
195
  function __destruct() {
196
  foreach ($this->_image_cache as $img) {
197
- //debugpng
198
  if (DEBUGPNG) print '[__destruct unlink '.$img.']';
199
- if (!DEBUGKEEPTEMP)
200
- unlink($img);
201
  }
202
  }
203
 
@@ -206,7 +224,9 @@ class CPDF_Adapter implements Canvas {
206
  *
207
  * @return Cpdf
208
  */
209
- function get_cpdf() { return $this->_pdf; }
 
 
210
 
211
  /**
212
  * Add meta information to the PDF
@@ -407,10 +427,10 @@ class CPDF_Adapter implements Canvas {
407
  *
408
  * @see Cpdf::setLineStyle()
409
  *
410
- * @param float width
411
- * @param string cap
412
- * @param string join
413
- * @param array dash
414
  */
415
  protected function _set_line_style($width, $cap, $join, $dash) {
416
  $this->_pdf->setLineStyle($width, $cap, $join, $dash);
@@ -429,37 +449,44 @@ class CPDF_Adapter implements Canvas {
429
 
430
  function set_default_view($view, $options = array()) {
431
  array_unshift($options, $view);
432
- $currentPage = $this->_pdf->currentPage;
433
  call_user_func_array(array($this->_pdf, "openHere"), $options);
434
  }
435
-
436
- //........................................................................
437
 
438
-
439
  /**
440
  * Remaps y coords from 4th to 1st quadrant
441
  *
442
  * @param float $y
443
  * @return float
444
  */
445
- protected function y($y) { return $this->_height - $y; }
 
 
446
 
447
  // Canvas implementation
448
-
449
  function line($x1, $y1, $x2, $y2, $color, $width, $style = array()) {
450
- //pre_r(compact("x1", "y1", "x2", "y2", "color", "width", "style"));
451
-
452
  $this->_set_stroke_color($color);
453
  $this->_set_line_style($width, "butt", "", $style);
 
454
  $this->_pdf->line($x1, $this->y($y1),
455
  $x2, $this->y($y2));
456
  }
 
 
 
 
 
 
 
457
 
458
  //........................................................................
459
 
460
  /**
461
  * Convert a GIF or BMP image to a PNG image
462
  *
 
 
 
 
463
  * @return string The url of the newly converted image
464
  */
465
  protected function _convert_gif_bmp_to_png($image_url, $type) {
@@ -476,9 +503,10 @@ class CPDF_Adapter implements Canvas {
476
  if ( $im ) {
477
  imageinterlace($im, false);
478
 
479
- $tempname = tempnam(DOMPDF_TEMP_DIR, "{$image_type}dompdf_img_");
480
- @unlink($tempname);
481
- $filename = "$tempname.png";
 
482
  $this->_image_cache[] = $filename;
483
 
484
  imagepng($im, $filename);
@@ -498,8 +526,6 @@ class CPDF_Adapter implements Canvas {
498
  $this->_set_line_style($width, "butt", "", $style);
499
  $this->_pdf->rectangle($x1, $this->y($y1) - $h, $w, $h);
500
  }
501
-
502
- //........................................................................
503
 
504
  function filled_rectangle($x1, $y1, $w, $h, $color) {
505
  $this->_set_fill_color($color);
@@ -510,6 +536,10 @@ class CPDF_Adapter implements Canvas {
510
  $this->_pdf->clippingRectangle($x1, $this->y($y1) - $h, $w, $h);
511
  }
512
 
 
 
 
 
513
  function clipping_end() {
514
  $this->_pdf->clippingEnd();
515
  }
@@ -542,65 +572,60 @@ class CPDF_Adapter implements Canvas {
542
  $this->_pdf->transform(array($a, $b, $c, $d, $e, $f));
543
  }
544
 
545
- //........................................................................
546
-
547
  function polygon($points, $color, $width = null, $style = array(), $fill = false) {
548
  $this->_set_fill_color($color);
549
  $this->_set_stroke_color($color);
550
 
551
  // Adjust y values
552
- for ( $i = 1; $i < count($points); $i += 2)
553
  $points[$i] = $this->y($points[$i]);
 
554
 
555
  $this->_pdf->polygon($points, count($points) / 2, $fill);
556
  }
557
 
558
- //........................................................................
559
-
560
  function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false) {
561
  $this->_set_fill_color($color);
562
  $this->_set_stroke_color($color);
563
 
564
- if ( !$fill && isset($width) )
565
  $this->_set_line_style($width, "round", "round", $style);
 
566
 
567
  $this->_pdf->ellipse($x, $this->y($y), $r1, 0, 0, 8, 0, 360, 1, $fill);
568
  }
569
-
570
- //........................................................................
571
 
572
  function image($img, $x, $y, $w, $h, $resolution = "normal") {
573
  list($width, $height, $type) = dompdf_getimagesize($img);
574
 
575
- //debugpng
576
- if (DEBUGPNG) print "[image:$img|$width|$height|$type]";
 
577
 
578
  switch ($type) {
579
  case IMAGETYPE_JPEG:
580
- if (DEBUGPNG) print '!!!jpg!!!';
581
  $this->_pdf->addJpegFromFile($img, $x, $this->y($y) - $h, $w, $h);
582
  break;
583
 
584
  case IMAGETYPE_GIF:
585
  case IMAGETYPE_BMP:
586
- if (DEBUGPNG) print '!!!bmp or gif!!!';
587
  // @todo use cache for BMP and GIF
588
  $img = $this->_convert_gif_bmp_to_png($img, $type);
589
 
590
  case IMAGETYPE_PNG:
591
- if (DEBUGPNG) print '!!!png!!!';
592
 
593
  $this->_pdf->addPngFromFile($img, $x, $this->y($y) - $h, $w, $h);
594
  break;
595
 
596
  default:
597
- if (DEBUGPNG) print '!!!unknown!!!';
598
  }
599
  }
600
 
601
- //........................................................................
602
-
603
- function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0, $char_space = 0, $angle = 0) {
604
  $pdf = $this->_pdf;
605
 
606
  $pdf->setColor($color);
@@ -675,45 +700,48 @@ class CPDF_Adapter implements Canvas {
675
  if ( strpos($url, '#') === 0 ) {
676
  // Local link
677
  $name = substr($url,1);
678
- if ( $name )
679
  $this->_pdf->addInternalLink($name, $x, $y, $x + $width, $y + $height);
680
-
681
- } else {
 
 
682
  $this->_pdf->addLink(rawurldecode($url), $x, $y, $x + $width, $y + $height);
683
  }
684
  }
685
 
686
- //........................................................................
687
-
688
  function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) {
689
  $this->_pdf->selectFont($font);
690
- if (!DOMPDF_UNICODE_ENABLED) {
 
 
691
  $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8');
692
  }
 
693
  return $this->_pdf->getTextWidth($size, $text, $word_spacing, $char_spacing);
694
  }
695
 
696
  function register_string_subset($font, $string) {
697
- return $this->_pdf->registerText($font, $string);
698
  }
699
 
700
- //........................................................................
701
-
702
  function get_font_height($font, $size) {
703
  $this->_pdf->selectFont($font);
704
- return $this->_pdf->getFontHeight($size) * DOMPDF_FONT_HEIGHT_RATIO;
 
 
705
  }
706
 
707
  /*function get_font_x_height($font, $size) {
708
  $this->_pdf->selectFont($font);
709
- return $this->_pdf->getFontXHeight($size) * DOMPDF_FONT_HEIGHT_RATIO;
 
710
  }*/
711
 
712
  function get_font_baseline($font, $size) {
713
- return $this->get_font_height($font, $size) / DOMPDF_FONT_HEIGHT_RATIO;
 
714
  }
715
-
716
- //........................................................................
717
 
718
  /**
719
  * Writes text at the specified x and y coordinates on every page
@@ -729,15 +757,14 @@ class CPDF_Adapter implements Canvas {
729
  * @param string $font the font file to use
730
  * @param float $size the font size, in points
731
  * @param array $color
732
- * @param float $adjust word spacing adjustment
 
733
  * @param float $angle angle to write the text at, measured CW starting from the x-axis
734
  */
735
- function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) {
736
  $_t = "text";
737
- $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "adjust", "angle");
738
  }
739
-
740
- //........................................................................
741
 
742
  /**
743
  * Processes a script on every page
@@ -754,8 +781,6 @@ class CPDF_Adapter implements Canvas {
754
  $_t = "script";
755
  $this->_page_text[] = compact("_t", "code", "type");
756
  }
757
-
758
- //........................................................................
759
 
760
  function new_page() {
761
  $this->_page_number++;
@@ -765,16 +790,15 @@ class CPDF_Adapter implements Canvas {
765
  $this->_pages[] = $ret;
766
  return $ret;
767
  }
768
-
769
- //........................................................................
770
 
771
  /**
772
  * Add text to each page after rendering is complete
773
  */
774
  protected function _add_page_text() {
775
 
776
- if ( !count($this->_page_text) )
777
  return;
 
778
 
779
  $page_number = 1;
780
  $eval = null;
@@ -786,19 +810,18 @@ class CPDF_Adapter implements Canvas {
786
  extract($pt);
787
 
788
  switch ($_t) {
 
 
 
 
 
789
 
790
- case "text":
791
- $text = str_replace(array("{PAGE_NUM}","{PAGE_COUNT}"),
792
- array($page_number, $this->_page_count), $text);
793
- $this->text($x, $y, $text, $font, $size, $color, $adjust, $angle);
794
- break;
795
-
796
- case "script":
797
- if (!$eval) {
798
- $eval = new PHP_Evaluator($this);
799
- }
800
- $eval->evaluate($code, array('PAGE_NUM' => $page_number, 'PAGE_COUNT' => $this->_page_count));
801
- break;
802
  }
803
  }
804
 
@@ -821,8 +844,6 @@ class CPDF_Adapter implements Canvas {
821
  $this->_pdf->stream($options);
822
  }
823
 
824
- //........................................................................
825
-
826
  /**
827
  * Returns the PDF as a string
828
  *
@@ -830,21 +851,19 @@ class CPDF_Adapter implements Canvas {
830
  * @return string
831
  */
832
  function output($options = null) {
833
- // Add page text
834
  $this->_add_page_text();
835
 
836
  $debug = isset($options["compress"]) && $options["compress"] != 1;
837
 
838
  return $this->_pdf->output($debug);
839
  }
840
-
841
- //........................................................................
842
 
843
  /**
844
  * Returns logging messages generated by the Cpdf class
845
  *
846
  * @return string
847
  */
848
- function get_messages() { return $this->_pdf->messages; }
849
-
 
850
  }
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Orion Richardson <orionr@yahoo.com>
7
  * @author Helmut Tischer <htischer@weihenstephan.org>
8
+ * @author Fabien Ménager <fabien.menager@gmail.com>
9
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
10
  */
11
 
12
  // FIXME: Need to sanity check inputs to this class
93
  "11x17" => array(0,0,792.00, 1224.00),
94
  );
95
 
96
+ /**
97
+ * The DOMPDF object
98
+ *
99
+ * @var DOMPDF
100
+ */
101
+ private $_dompdf;
102
 
103
  /**
104
  * Instance of Cpdf class
155
  * @var array
156
  */
157
  private $_image_cache;
158
+
159
  /**
160
  * Class constructor
161
  *
162
+ * @param mixed $paper The size of paper to use in this PDF ({@link CPDF_Adapter::$PAPER_SIZES})
163
+ * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')
164
+ * @param DOMPDF $dompdf The DOMPDF instance
165
  */
166
+ function __construct($paper = "letter", $orientation = "portrait", DOMPDF $dompdf) {
167
+ if ( is_array($paper) ) {
 
168
  $size = $paper;
169
+ }
170
+ else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) ) {
171
  $size = self::$PAPER_SIZES[mb_strtolower($paper)];
172
+ }
173
+ else {
174
  $size = self::$PAPER_SIZES["letter"];
175
+ }
176
 
177
  if ( mb_strtolower($orientation) === "landscape" ) {
178
  list($size[2], $size[3]) = array($size[3], $size[2]);
179
  }
180
+
181
+ $this->_dompdf = $dompdf;
182
 
183
+ $this->_pdf = new Cpdf(
184
+ $size,
185
+ $dompdf->get_option("enable_unicode"),
186
+ $dompdf->get_option("font_cache"),
187
+ $dompdf->get_option("temp_dir")
188
+ );
189
+
190
  $this->_pdf->addInfo("Creator", "DOMPDF");
191
  $time = substr_replace(date('YmdHisO'), '\'', -2, 0).'\'';
192
  $this->_pdf->addInfo("CreationDate", "D:$time");
203
  $this->_image_cache = array();
204
  }
205
 
206
+ function get_dompdf(){
207
+ return $this->_dompdf;
208
+ }
209
+
210
  /**
211
  * Class destructor
212
  *
214
  */
215
  function __destruct() {
216
  foreach ($this->_image_cache as $img) {
 
217
  if (DEBUGPNG) print '[__destruct unlink '.$img.']';
218
+ if (!DEBUGKEEPTEMP) unlink($img);
 
219
  }
220
  }
221
 
224
  *
225
  * @return Cpdf
226
  */
227
+ function get_cpdf() {
228
+ return $this->_pdf;
229
+ }
230
 
231
  /**
232
  * Add meta information to the PDF
427
  *
428
  * @see Cpdf::setLineStyle()
429
  *
430
+ * @param float $width
431
+ * @param string $cap
432
+ * @param string $join
433
+ * @param array $dash
434
  */
435
  protected function _set_line_style($width, $cap, $join, $dash) {
436
  $this->_pdf->setLineStyle($width, $cap, $join, $dash);
449
 
450
  function set_default_view($view, $options = array()) {
451
  array_unshift($options, $view);
 
452
  call_user_func_array(array($this->_pdf, "openHere"), $options);
453
  }
 
 
454
 
 
455
  /**
456
  * Remaps y coords from 4th to 1st quadrant
457
  *
458
  * @param float $y
459
  * @return float
460
  */
461
+ protected function y($y) {
462
+ return $this->_height - $y;
463
+ }
464
 
465
  // Canvas implementation
 
466
  function line($x1, $y1, $x2, $y2, $color, $width, $style = array()) {
 
 
467
  $this->_set_stroke_color($color);
468
  $this->_set_line_style($width, "butt", "", $style);
469
+
470
  $this->_pdf->line($x1, $this->y($y1),
471
  $x2, $this->y($y2));
472
  }
473
+
474
+ function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = array()) {
475
+ $this->_set_stroke_color($color);
476
+ $this->_set_line_style($width, "butt", "", $style);
477
+
478
+ $this->_pdf->ellipse($x, $this->y($y), $r1, $r2, 0, 8, $astart, $aend, false, false, true, false);
479
+ }
480
 
481
  //........................................................................
482
 
483
  /**
484
  * Convert a GIF or BMP image to a PNG image
485
  *
486
+ * @param string $image_url
487
+ * @param integer $type
488
+ *
489
+ * @throws DOMPDF_Exception
490
  * @return string The url of the newly converted image
491
  */
492
  protected function _convert_gif_bmp_to_png($image_url, $type) {
503
  if ( $im ) {
504
  imageinterlace($im, false);
505
 
506
+ $tmp_dir = $this->_dompdf->get_option("temp_dir");
507
+ $tmp_name = tempnam($tmp_dir, "{$image_type}dompdf_img_");
508
+ @unlink($tmp_name);
509
+ $filename = "$tmp_name.png";
510
  $this->_image_cache[] = $filename;
511
 
512
  imagepng($im, $filename);
526
  $this->_set_line_style($width, "butt", "", $style);
527
  $this->_pdf->rectangle($x1, $this->y($y1) - $h, $w, $h);
528
  }
 
 
529
 
530
  function filled_rectangle($x1, $y1, $w, $h, $color) {
531
  $this->_set_fill_color($color);
536
  $this->_pdf->clippingRectangle($x1, $this->y($y1) - $h, $w, $h);
537
  }
538
 
539
+ function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) {
540
+ $this->_pdf->clippingRectangleRounded($x1, $this->y($y1) - $h, $w, $h, $rTL, $rTR, $rBR, $rBL);
541
+ }
542
+
543
  function clipping_end() {
544
  $this->_pdf->clippingEnd();
545
  }
572
  $this->_pdf->transform(array($a, $b, $c, $d, $e, $f));
573
  }
574
 
 
 
575
  function polygon($points, $color, $width = null, $style = array(), $fill = false) {
576
  $this->_set_fill_color($color);
577
  $this->_set_stroke_color($color);
578
 
579
  // Adjust y values
580
+ for ( $i = 1; $i < count($points); $i += 2) {
581
  $points[$i] = $this->y($points[$i]);
582
+ }
583
 
584
  $this->_pdf->polygon($points, count($points) / 2, $fill);
585
  }
586
 
 
 
587
  function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false) {
588
  $this->_set_fill_color($color);
589
  $this->_set_stroke_color($color);
590
 
591
+ if ( !$fill && isset($width) ) {
592
  $this->_set_line_style($width, "round", "round", $style);
593
+ }
594
 
595
  $this->_pdf->ellipse($x, $this->y($y), $r1, 0, 0, 8, 0, 360, 1, $fill);
596
  }
 
 
597
 
598
  function image($img, $x, $y, $w, $h, $resolution = "normal") {
599
  list($width, $height, $type) = dompdf_getimagesize($img);
600
 
601
+ $debug_png = $this->_dompdf->get_option("debug_png");
602
+
603
+ if ($debug_png) print "[image:$img|$width|$height|$type]";
604
 
605
  switch ($type) {
606
  case IMAGETYPE_JPEG:
607
+ if ($debug_png) print '!!!jpg!!!';
608
  $this->_pdf->addJpegFromFile($img, $x, $this->y($y) - $h, $w, $h);
609
  break;
610
 
611
  case IMAGETYPE_GIF:
612
  case IMAGETYPE_BMP:
613
+ if ($debug_png) print '!!!bmp or gif!!!';
614
  // @todo use cache for BMP and GIF
615
  $img = $this->_convert_gif_bmp_to_png($img, $type);
616
 
617
  case IMAGETYPE_PNG:
618
+ if ($debug_png) print '!!!png!!!';
619
 
620
  $this->_pdf->addPngFromFile($img, $x, $this->y($y) - $h, $w, $h);
621
  break;
622
 
623
  default:
624
+ if ($debug_png) print '!!!unknown!!!';
625
  }
626
  }
627
 
628
+ function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0) {
 
 
629
  $pdf = $this->_pdf;
630
 
631
  $pdf->setColor($color);
700
  if ( strpos($url, '#') === 0 ) {
701
  // Local link
702
  $name = substr($url,1);
703
+ if ( $name ) {
704
  $this->_pdf->addInternalLink($name, $x, $y, $x + $width, $y + $height);
705
+ }
706
+
707
+ }
708
+ else {
709
  $this->_pdf->addLink(rawurldecode($url), $x, $y, $x + $width, $y + $height);
710
  }
711
  }
712
 
 
 
713
  function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) {
714
  $this->_pdf->selectFont($font);
715
+
716
+ $unicode = $this->_dompdf->get_option("enable_unicode");
717
+ if (!$unicode) {
718
  $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8');
719
  }
720
+
721
  return $this->_pdf->getTextWidth($size, $text, $word_spacing, $char_spacing);
722
  }
723
 
724
  function register_string_subset($font, $string) {
725
+ $this->_pdf->registerText($font, $string);
726
  }
727
 
 
 
728
  function get_font_height($font, $size) {
729
  $this->_pdf->selectFont($font);
730
+
731
+ $ratio = $this->_dompdf->get_option("font_height_ratio");
732
+ return $this->_pdf->getFontHeight($size) * $ratio;
733
  }
734
 
735
  /*function get_font_x_height($font, $size) {
736
  $this->_pdf->selectFont($font);
737
+ $ratio = $this->_dompdf->get_option("font_height_ratio");
738
+ return $this->_pdf->getFontXHeight($size) * $ratio;
739
  }*/
740
 
741
  function get_font_baseline($font, $size) {
742
+ $ratio = $this->_dompdf->get_option("font_height_ratio");
743
+ return $this->get_font_height($font, $size) / $ratio;
744
  }
 
 
745
 
746
  /**
747
  * Writes text at the specified x and y coordinates on every page
757
  * @param string $font the font file to use
758
  * @param float $size the font size, in points
759
  * @param array $color
760
+ * @param float $word_space word spacing adjustment
761
+ * @param float $char_space char spacing adjustment
762
  * @param float $angle angle to write the text at, measured CW starting from the x-axis
763
  */
764
+ function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0) {
765
  $_t = "text";
766
+ $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "word_space", "char_space", "angle");
767
  }
 
 
768
 
769
  /**
770
  * Processes a script on every page
781
  $_t = "script";
782
  $this->_page_text[] = compact("_t", "code", "type");
783
  }
 
 
784
 
785
  function new_page() {
786
  $this->_page_number++;
790
  $this->_pages[] = $ret;
791
  return $ret;
792
  }
 
 
793
 
794
  /**
795
  * Add text to each page after rendering is complete
796
  */
797
  protected function _add_page_text() {
798
 
799
+ if ( !count($this->_page_text) ) {
800
  return;
801
+ }
802
 
803
  $page_number = 1;
804
  $eval = null;
810
  extract($pt);
811
 
812
  switch ($_t) {
813
+ case "text":
814
+ $text = str_replace(array("{PAGE_NUM}","{PAGE_COUNT}"),
815
+ array($page_number, $this->_page_count), $text);
816
+ $this->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle);
817
+ break;
818
 
819
+ case "script":
820
+ if ( !$eval ) {
821
+ $eval = new PHP_Evaluator($this);
822
+ }
823
+ $eval->evaluate($code, array('PAGE_NUM' => $page_number, 'PAGE_COUNT' => $this->_page_count));
824
+ break;
 
 
 
 
 
 
825
  }
826
  }
827
 
844
  $this->_pdf->stream($options);
845
  }
846
 
 
 
847
  /**
848
  * Returns the PDF as a string
849
  *
851
  * @return string
852
  */
853
  function output($options = null) {
 
854
  $this->_add_page_text();
855
 
856
  $debug = isset($options["compress"]) && $options["compress"] != 1;
857
 
858
  return $this->_pdf->output($debug);
859
  }
 
 
860
 
861
  /**
862
  * Returns logging messages generated by the Cpdf class
863
  *
864
  * @return string
865
  */
866
+ function get_messages() {
867
+ return $this->_pdf->messages;
868
+ }
869
  }
dompdf/include/css_color.cls.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: css_color.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  class CSS_Color {
@@ -160,66 +159,84 @@ class CSS_Color {
160
  );
161
 
162
  static function parse($colour) {
163
- if ( is_array($colour) )
164
  // Assume the array has the right format...
165
  // FIXME: should/could verify this.
166
  return $colour;
 
 
 
167
 
168
  $colour = strtolower($colour);
169
-
170
- if ( in_array($colour, array("transparent", "inherit")) )
171
- return $colour;
172
 
173
- if (isset(self::$cssColorNames[$colour]))
174
- return self::getArray(self::$cssColorNames[$colour]);
 
175
 
 
 
 
 
 
 
 
 
176
  $length = mb_strlen($colour);
177
 
178
  // #rgb format
179
  if ( $length == 4 && $colour[0] === "#" ) {
180
- return self::getArray($colour[1].$colour[1].$colour[2].$colour[2].$colour[3].$colour[3]);
 
181
 
182
  // #rrggbb format
183
- } else if ( $length == 7 && $colour[0] === "#" ) {
184
- return self::getArray(mb_substr($colour, 1, 6));
185
-
 
186
  // rgb( r,g,b ) format
187
- } else if ( mb_strpos($colour, "rgb") !== false ) {
188
  $i = mb_strpos($colour, "(");
189
  $j = mb_strpos($colour, ")");
190
 
191
  // Bad colour value
192
- if ($i === false || $j === false)
193
  return null;
194
-
 
195
  $triplet = explode(",", mb_substr($colour, $i+1, $j-$i-1));
196
 
197
- if (count($triplet) != 3)
198
  return null;
 
199
 
200
  foreach (array_keys($triplet) as $c) {
201
  $triplet[$c] = trim($triplet[$c]);
202
 
203
- if ( $triplet[$c][mb_strlen($triplet[$c]) - 1] === "%" )
204
  $triplet[$c] = round($triplet[$c] * 2.55);
 
205
  }
206
 
207
- return self::getArray(vsprintf("%02X%02X%02X", $triplet));
 
 
208
 
209
  // cmyk( c,m,y,k ) format
210
  // http://www.w3.org/TR/css3-gcpm/#cmyk-colors
211
- } else if ( mb_strpos($colour, "cmyk") !== false ) {
212
  $i = mb_strpos($colour, "(");
213
  $j = mb_strpos($colour, ")");
214
 
215
  // Bad colour value
216
- if ($i === false || $j === false)
217
  return null;
 
218
 
219
  $values = explode(",", mb_substr($colour, $i+1, $j-$i-1));
220
 
221
- if (count($values) != 4)
222
  return null;
 
223
 
224
  foreach ($values as &$c) {
225
  $c = floatval(trim($c));
@@ -227,7 +244,7 @@ class CSS_Color {
227
  if ($c < 0.0) $c = 0.0;
228
  }
229
 
230
- return self::getArray($values);
231
  }
232
  }
233
 
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  class CSS_Color {
159
  );
160
 
161
  static function parse($colour) {
162
+ if ( is_array($colour) ) {
163
  // Assume the array has the right format...
164
  // FIXME: should/could verify this.
165
  return $colour;
166
+ }
167
+
168
+ static $cache = array();
169
 
170
  $colour = strtolower($colour);
 
 
 
171
 
172
+ if ( isset($cache[$colour]) ) {
173
+ return $cache[$colour];
174
+ }
175
 
176
+ if ( in_array($colour, array("transparent", "inherit")) ) {
177
+ return $cache[$colour] = $colour;
178
+ }
179
+
180
+ if ( isset(self::$cssColorNames[$colour]) ) {
181
+ return $cache[$colour] = self::getArray(self::$cssColorNames[$colour]);
182
+ }
183
+
184
  $length = mb_strlen($colour);
185
 
186
  // #rgb format
187
  if ( $length == 4 && $colour[0] === "#" ) {
188
+ return $cache[$colour] = self::getArray($colour[1].$colour[1].$colour[2].$colour[2].$colour[3].$colour[3]);
189
+ }
190
 
191
  // #rrggbb format
192
+ else if ( $length == 7 && $colour[0] === "#" ) {
193
+ return $cache[$colour] = self::getArray(mb_substr($colour, 1, 6));
194
+ }
195
+
196
  // rgb( r,g,b ) format
197
+ else if ( mb_strpos($colour, "rgb") !== false ) {
198
  $i = mb_strpos($colour, "(");
199
  $j = mb_strpos($colour, ")");
200
 
201
  // Bad colour value
202
+ if ( $i === false || $j === false ) {
203
  return null;
204
+ }
205
+
206
  $triplet = explode(",", mb_substr($colour, $i+1, $j-$i-1));
207
 
208
+ if ( count($triplet) != 3 ) {
209
  return null;
210
+ }
211
 
212
  foreach (array_keys($triplet) as $c) {
213
  $triplet[$c] = trim($triplet[$c]);
214
 
215
+ if ( $triplet[$c][mb_strlen($triplet[$c]) - 1] === "%" ) {
216
  $triplet[$c] = round($triplet[$c] * 2.55);
217
+ }
218
  }
219
 
220
+ return $cache[$colour] = self::getArray(vsprintf("%02X%02X%02X", $triplet));
221
+
222
+ }
223
 
224
  // cmyk( c,m,y,k ) format
225
  // http://www.w3.org/TR/css3-gcpm/#cmyk-colors
226
+ else if ( mb_strpos($colour, "cmyk") !== false ) {
227
  $i = mb_strpos($colour, "(");
228
  $j = mb_strpos($colour, ")");
229
 
230
  // Bad colour value
231
+ if ( $i === false || $j === false ) {
232
  return null;
233
+ }
234
 
235
  $values = explode(",", mb_substr($colour, $i+1, $j-$i-1));
236
 
237
+ if ( count($values) != 4 ) {
238
  return null;
239
+ }
240
 
241
  foreach ($values as &$c) {
242
  $c = floatval(trim($c));
244
  if ($c < 0.0) $c = 0.0;
245
  }
246
 
247
+ return $cache[$colour] = self::getArray($values);
248
  }
249
  }
250
 
dompdf/include/dompdf.cls.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: dompdf.cls.php 468 2012-02-05 10:51:40Z fabien.menager $
9
  */
10
 
11
  /**
@@ -60,7 +59,7 @@ class DOMPDF {
60
  /**
61
  * DomDocument representing the HTML document
62
  *
63
- * @var DomDocument
64
  */
65
  protected $_xml;
66
 
@@ -140,55 +139,111 @@ class DOMPDF {
140
  * HTTP context created with stream_context_create()
141
  * Will be used for file_get_contents
142
  *
143
- * @var resource
144
  */
145
  protected $_http_context;
146
-
147
  /**
148
  * Timestamp of the script start time
149
- *
150
- * @var int
151
  */
152
  private $_start_time = null;
153
-
154
  /**
155
- * @var string The system's locale
 
 
156
  */
157
  private $_system_locale = null;
158
-
159
  /**
160
- * @var bool Tells if the system's locale is the C standard one
 
 
161
  */
162
  private $_locale_standard = false;
163
-
164
  /**
165
- * @var string The default view of the PDF in the viewer
 
 
166
  */
167
  private $_default_view = "Fit";
168
-
169
  /**
170
- * @var array The default view options of the PDF in the viewer
 
 
171
  */
172
  private $_default_view_options = array();
173
 
174
  /**
175
- * @var bool Tells wether the DOM document is in quirksmode (experimental)
 
 
176
  */
177
  private $_quirksmode = false;
178
-
179
- public static $native_fonts = array("courier", "courier-bold", "courier-oblique", "courier-boldoblique",
180
- "helvetica", "helvetica-bold", "helvetica-oblique", "helvetica-boldoblique",
181
- "times-roman", "times-bold", "times-italic", "times-bolditalic",
182
- "symbol", "zapfdinbats");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
 
184
  /**
185
  * Class constructor
186
  */
187
  function __construct() {
188
  $this->_locale_standard = sprintf('%.1f', 1.0) == '1.0';
189
-
190
  $this->save_locale();
191
-
192
  $this->_messages = array();
193
  $this->_css = new Stylesheet($this);
194
  $this->_pdf = null;
@@ -200,33 +255,76 @@ class DOMPDF {
200
  $this->_http_context = null;
201
  $this->_callbacks = array();
202
  $this->_cache_id = null;
203
-
204
  $this->restore_locale();
205
  }
206
-
207
  /**
208
  * Class destructor
209
  */
210
  function __destruct() {
211
  clear_object($this);
212
  }
213
-
214
  /**
215
- * Save the system's locale configuration and
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
  * set the right value for numeric formatting
217
  */
218
  private function save_locale() {
219
- if ( $this->_locale_standard ) return;
220
-
 
 
221
  $this->_system_locale = setlocale(LC_NUMERIC, "C");
222
  }
223
-
224
  /**
225
  * Restore the system's locale configuration
226
  */
227
  private function restore_locale() {
228
- if ( $this->_locale_standard ) return;
229
-
 
 
230
  setlocale(LC_NUMERIC, $this->_system_locale);
231
  }
232
 
@@ -235,128 +333,166 @@ class DOMPDF {
235
  *
236
  * @return Frame_Tree
237
  */
238
- function get_tree() { return $this->_tree; }
 
 
239
 
240
  /**
241
  * Sets the protocol to use
242
  * FIXME validate these
243
- *
244
  * @param string $proto
245
  */
246
- function set_protocol($proto) { $this->_protocol = $proto; }
 
 
247
 
248
  /**
249
  * Sets the base hostname
250
  *
251
  * @param string $host
252
  */
253
- function set_host($host) { $this->_base_host = $host; }
 
 
254
 
255
  /**
256
  * Sets the base path
257
  *
258
  * @param string $path
259
  */
260
- function set_base_path($path) { $this->_base_path = $path; }
261
-
 
 
262
  /**
263
  * Sets the HTTP context
264
  *
265
  * @param resource $http_context
266
  */
267
- function set_http_context($http_context) { $this->_http_context = $http_context; }
268
-
 
 
269
  /**
270
  * Sets the default view
271
  *
272
- * @param string $default_view
 
273
  */
274
- function set_default_view($default_view, $options) {
275
  $this->_default_view = $default_view;
276
- $this->_default_view_options = $options;
277
  }
278
-
279
  /**
280
  * Returns the protocol in use
281
  *
282
  * @return string
283
  */
284
- function get_protocol() { return $this->_protocol; }
 
 
285
 
286
  /**
287
  * Returns the base hostname
288
  *
289
  * @return string
290
  */
291
- function get_host() { return $this->_base_host; }
 
 
292
 
293
  /**
294
  * Returns the base path
295
  *
296
  * @return string
297
  */
298
- function get_base_path() { return $this->_base_path; }
299
-
 
 
300
  /**
301
  * Returns the HTTP context
302
  *
303
  * @return resource
304
  */
305
- function get_http_context() { return $this->_http_context; }
 
 
306
 
307
  /**
308
  * Return the underlying Canvas instance (e.g. CPDF_Adapter, GD_Adapter)
309
  *
310
  * @return Canvas
311
  */
312
- function get_canvas() { return $this->_pdf; }
 
 
313
 
314
  /**
315
  * Returns the callbacks array
316
  *
317
  * @return array
318
  */
319
- function get_callbacks() { return $this->_callbacks; }
 
 
320
 
321
  /**
322
  * Returns the stylesheet
323
  *
324
  * @return Stylesheet
325
  */
326
- function get_css() { return $this->_css; }
 
 
 
 
 
 
 
 
 
327
 
328
  /**
329
  * Loads an HTML file
330
- *
331
  * Parse errors are stored in the global array _dompdf_warnings.
332
  *
333
  * @param string $file a filename or url to load
 
 
334
  */
335
  function load_html_file($file) {
336
  $this->save_locale();
337
-
338
  // Store parsing warnings as messages (this is to prevent output to the
339
  // browser if the html is ugly and the dom extension complains,
340
  // preventing the pdf from being streamed.)
341
- if ( !$this->_protocol && !$this->_base_host && !$this->_base_path )
342
  list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($file);
 
343
 
344
- if ( !DOMPDF_ENABLE_REMOTE &&
345
- ($this->_protocol != "" && $this->_protocol !== "file://" ) )
346
  throw new DOMPDF_Exception("Remote file requested, but DOMPDF_ENABLE_REMOTE is false.");
 
347
 
348
  if ($this->_protocol == "" || $this->_protocol === "file://") {
349
 
350
  $realfile = realpath($file);
351
- if ( !$file )
352
  throw new DOMPDF_Exception("File '$file' not found.");
 
353
 
354
- if ( strpos($realfile, DOMPDF_CHROOT) !== 0 )
355
- throw new DOMPDF_Exception("Permission denied on $file.");
 
 
356
 
357
  // Exclude dot files (e.g. .htaccess)
358
- if ( substr(basename($realfile),0,1) === "." )
359
  throw new DOMPDF_Exception("Permission denied on $file.");
 
360
 
361
  $file = $realfile;
362
  }
@@ -373,77 +509,82 @@ class DOMPDF {
373
  }
374
  }
375
  }
376
-
377
  $this->restore_locale();
378
-
379
  $this->load_html($contents, $encoding);
380
  }
381
 
382
  /**
383
  * Loads an HTML string
384
- *
385
  * Parse errors are stored in the global array _dompdf_warnings.
386
- *
387
  * @todo use the $encoding variable
388
- * @param string $str HTML text to load
 
 
389
  */
390
  function load_html($str, $encoding = null) {
391
  $this->save_locale();
392
-
393
  // FIXME: Determine character encoding, switch to UTF8, update meta tag. Need better http/file stream encoding detection, currently relies on text or meta tag.
394
  mb_detect_order('auto');
395
-
396
  if (mb_detect_encoding($str) !== 'UTF-8') {
397
  $metatags = array(
398
  '@<meta\s+http-equiv="Content-Type"\s+content="(?:[\w/]+)(?:;\s*?charset=([^\s"]+))?@i',
399
  '@<meta\s+content="(?:[\w/]+)(?:;\s*?charset=([^\s"]+))"?\s+http-equiv="Content-Type"@i',
400
  '@<meta [^>]*charset\s*=\s*["\']?\s*([^"\' ]+)@i',
401
  );
402
-
403
  foreach($metatags as $metatag) {
404
  if (preg_match($metatag, $str, $matches)) break;
405
  }
406
-
407
  if (mb_detect_encoding($str) == '') {
408
  if (isset($matches[1])) {
409
  $encoding = strtoupper($matches[1]);
410
- } else {
 
411
  $encoding = 'UTF-8';
412
  }
413
- } else {
414
- if (isset($matches[1])) {
 
415
  $encoding = strtoupper($matches[1]);
416
- } else {
 
417
  $encoding = 'auto';
418
  }
419
  }
420
-
421
- if ($encoding !== 'UTF-8') {
422
- $str = mb_convert_encoding($str, 'UTF-8', $encoding);
423
  }
424
-
425
- if (isset($matches[1])) {
426
  $str = preg_replace('/charset=([^\s"]+)/i', 'charset=UTF-8', $str);
427
- } else {
 
428
  $str = str_replace('<head>', '<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">', $str);
429
  }
430
- } else {
 
431
  $encoding = 'UTF-8';
432
  }
433
-
434
  // remove BOM mark from UTF-8, it's treated as document text by DOMDocument
435
  // FIXME: roll this into the encoding detection using UTF-8/16/32 BOM (http://us2.php.net/manual/en/function.mb-detect-encoding.php#91051)?
436
- if (substr($str, 0, 3) == chr(0xEF).chr(0xBB).chr(0xBF)) {
437
  $str = substr($str, 3);
438
  }
439
-
440
  // Parse embedded php, first-pass
441
- if ( DOMPDF_ENABLE_PHP ) {
442
  ob_start();
443
  eval("?" . ">$str");
444
  $str = ob_get_clean();
445
  }
446
-
447
  // if the document contains non utf-8 with a utf-8 meta tag chars and was
448
  // detected as utf-8 by mbstring, problems could happen.
449
  // http://devzone.zend.com/article/8855
@@ -451,39 +592,43 @@ class DOMPDF {
451
  $re = '/<meta ([^>]*)((?:charset=[^"\' ]+)([^>]*)|(?:charset=["\'][^"\' ]+["\']))([^>]*)>/i';
452
  $str = preg_replace($re, '<meta $1$3>', $str);
453
  }
454
-
455
  // Store parsing warnings as messages
456
  set_error_handler("record_warnings");
457
-
458
  // @todo Take the quirksmode into account
459
  // http://hsivonen.iki.fi/doctype/
460
  // https://developer.mozilla.org/en/mozilla's_quirks_mode
461
  $quirksmode = false;
462
-
463
- if ( DOMPDF_ENABLE_HTML5PARSER ) {
464
  $tokenizer = new HTML5_Tokenizer($str);
465
  $tokenizer->parse();
466
  $doc = $tokenizer->save();
467
-
468
  // Remove #text children nodes in nodes that shouldn't have
469
  $tag_names = array("html", "table", "tbody", "thead", "tfoot", "tr");
470
  foreach($tag_names as $tag_name) {
471
  $nodes = $doc->getElementsByTagName($tag_name);
472
-
473
  foreach($nodes as $node) {
474
  self::remove_text_nodes($node);
475
  }
476
  }
477
-
478
  $quirksmode = ($tokenizer->getTree()->getQuirksMode() > HTML5_TreeBuilder::NO_QUIRKS);
479
  }
480
  else {
481
  $doc = new DOMDocument();
482
  $doc->preserveWhiteSpace = true;
483
  $doc->loadHTML($str);
484
-
485
- // If some text is before the doctype of before the <html> tag, we are in quirksmode
486
- if ( preg_match("/^(.+)<(!doctype|html)/i", ltrim($str), $matches) ) {
 
 
 
 
487
  $quirksmode = true;
488
  }
489
  else {
@@ -491,24 +636,24 @@ class DOMPDF {
491
  if ( !$doc->doctype->publicId && !$doc->doctype->systemId ) {
492
  $quirksmode = false;
493
  }
494
-
495
  // not XHTML
496
  if ( !preg_match("/xhtml/i", $doc->doctype->publicId) ) {
497
  $quirksmode = true;
498
  }
499
  }
500
  }
501
-
502
  $this->_xml = $doc;
503
  $this->_quirksmode = $quirksmode;
504
-
505
  $this->_tree = new Frame_Tree($this->_xml);
506
-
507
  restore_error_handler();
508
-
509
  $this->restore_locale();
510
  }
511
-
512
  static function remove_text_nodes(DOMNode $node) {
513
  $children = array();
514
  for ($i = 0; $i < $node->childNodes->length; $i++) {
@@ -517,7 +662,7 @@ class DOMPDF {
517
  $children[] = $child;
518
  }
519
  }
520
-
521
  foreach($children as $child) {
522
  $node->removeChild($child);
523
  }
@@ -529,82 +674,90 @@ class DOMPDF {
529
  */
530
  protected function _process_html() {
531
  $this->save_locale();
532
-
533
  $this->_tree->build_tree();
534
 
535
  $this->_css->load_css_file(Stylesheet::DEFAULT_STYLESHEET, Stylesheet::ORIG_UA);
536
 
537
  $acceptedmedia = Stylesheet::$ACCEPTED_GENERIC_MEDIA_TYPES;
538
- if ( defined("DOMPDF_DEFAULT_MEDIA_TYPE") ) {
539
- $acceptedmedia[] = DOMPDF_DEFAULT_MEDIA_TYPE;
540
- } else {
541
- $acceptedmedia[] = Stylesheet::$ACCEPTED_DEFAULT_MEDIA_TYPE;
542
- }
543
-
544
- // load <link rel="STYLESHEET" ... /> tags
545
- $links = $this->_xml->getElementsByTagName("link");
546
- foreach ($links as $link) {
547
- if ( mb_strtolower($link->getAttribute("rel")) === "stylesheet" ||
548
- mb_strtolower($link->getAttribute("type")) === "text/css" ) {
549
- //Check if the css file is for an accepted media type
550
- //media not given then always valid
551
- $formedialist = preg_split("/[\s\n,]/", $link->getAttribute("media"),-1, PREG_SPLIT_NO_EMPTY);
552
- if ( count($formedialist) > 0 ) {
553
- $accept = false;
554
- foreach ( $formedialist as $type ) {
555
- if ( in_array(mb_strtolower(trim($type)), $acceptedmedia) ) {
556
- $accept = true;
557
- break;
558
- }
559
- }
560
- if (!$accept) {
561
- //found at least one mediatype, but none of the accepted ones
562
- //Skip this css file.
563
- continue;
564
- }
565
- }
566
-
567
- $url = $link->getAttribute("href");
568
- $url = build_url($this->_protocol, $this->_base_host, $this->_base_path, $url);
569
-
570
- $this->_css->load_css_file($url, Stylesheet::ORIG_AUTHOR);
571
- }
572
 
 
 
 
 
573
  }
574
-
575
  // Set the base path of the Stylesheet to that of the file being processed
576
  $this->_css->set_protocol($this->_protocol);
577
  $this->_css->set_host($this->_base_host);
578
  $this->_css->set_base_path($this->_base_path);
579
 
580
- // load <style> tags
581
- $styles = $this->_xml->getElementsByTagName("style");
582
- foreach ($styles as $style) {
583
-
584
- // Accept all <style> tags by default (note this is contrary to W3C
585
- // HTML 4.0 spec:
586
- // http://www.w3.org/TR/REC-html40/present/styles.html#adef-media
587
- // which states that the default media type is 'screen'
588
- if ( $style->hasAttributes() &&
589
- ($media = $style->getAttribute("media")) &&
590
- !in_array($media, $acceptedmedia) )
591
- continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
592
 
593
- $css = "";
594
- if ( $style->hasChildNodes() ) {
595
 
596
- $child = $style->firstChild;
597
- while ( $child ) {
598
- $css .= $child->nodeValue; // Handle <style><!-- blah --></style>
599
- $child = $child->nextSibling;
600
- }
 
 
 
 
 
 
 
 
 
 
601
 
602
- } else
603
- $css = $style->nodeValue;
 
 
 
 
 
 
 
 
 
604
 
605
- $this->_css->load_css($css);
 
 
606
  }
607
-
608
  $this->restore_locale();
609
  }
610
 
@@ -652,26 +805,26 @@ class DOMPDF {
652
  }
653
  }
654
  }
655
-
656
  /**
657
  * Get the quirks mode
658
- *
659
  * @return boolean true if quirks mode is active
660
  */
661
  function get_quirksmode(){
662
  return $this->_quirksmode;
663
  }
664
-
665
  function parse_default_view($value) {
666
  $valid = array("XYZ", "Fit", "FitH", "FitV", "FitR", "FitB", "FitBH", "FitBV");
667
-
668
  $options = preg_split("/\s*,\s*/", trim($value));
669
  $default_view = array_shift($options);
670
-
671
  if ( !in_array($default_view, $valid) ) {
672
  return false;
673
  }
674
-
675
  $this->set_default_view($default_view, $options);
676
  return true;
677
  }
@@ -681,12 +834,13 @@ class DOMPDF {
681
  */
682
  function render() {
683
  $this->save_locale();
684
-
685
- if ( DOMPDF_LOG_OUTPUT_FILE ) {
686
- if ( !file_exists(DOMPDF_LOG_OUTPUT_FILE) && is_writable(dirname(DOMPDF_LOG_OUTPUT_FILE)) ) {
687
- touch(DOMPDF_LOG_OUTPUT_FILE);
 
688
  }
689
-
690
  $this->_start_time = microtime(true);
691
  ob_start();
692
  }
@@ -694,48 +848,48 @@ class DOMPDF {
694
  //enable_mem_profile();
695
 
696
  $this->_process_html();
697
-
698
  $this->_css->apply_styles($this->_tree);
699
-
700
  // @page style rules : size, margins
701
  $page_styles = $this->_css->get_page_styles();
702
-
703
  $base_page_style = $page_styles["base"];
704
  unset($page_styles["base"]);
705
-
706
  foreach($page_styles as $_page_style) {
707
  $_page_style->inherit($base_page_style);
708
  }
709
-
710
  if ( is_array($base_page_style->size) ) {
711
  $this->set_paper(array(0, 0, $base_page_style->size[0], $base_page_style->size[1]));
712
  }
713
-
714
- $this->_pdf = Canvas_Factory::get_instance($this->_paper_size, $this->_paper_orientation);
715
  Font_Metrics::init($this->_pdf);
716
-
717
- if (DOMPDF_ENABLE_FONTSUBSETTING && $this->_pdf instanceof CPDF_Adapter) {
718
  foreach ($this->_tree->get_frames() as $frame) {
719
  $style = $frame->get_style();
720
  $node = $frame->get_node();
721
-
722
  // Handle text nodes
723
  if ( $node->nodeName === "#text" ) {
724
  $this->_pdf->register_string_subset($style->font_family, $node->nodeValue);
725
  continue;
726
  }
727
-
728
  // Handle generated content (list items)
729
  if ( $style->display === "list-item" ) {
730
  $chars = List_Bullet_Renderer::get_counter_chars($style->list_style_type);
731
  $this->_pdf->register_string_subset($style->font_family, $chars);
732
  continue;
733
  }
734
-
735
  // TODO Handle other generated content (pseudo elements)
736
  }
737
  }
738
-
739
  $root = null;
740
 
741
  foreach ($this->_tree->get_frames() as $frame) {
@@ -746,42 +900,7 @@ class DOMPDF {
746
  }
747
 
748
  // Create the appropriate decorators, reflowers & positioners.
749
- $deco = Frame_Factory::decorate_frame($frame, $this);
750
- $deco->set_root($root);
751
-
752
- // FIXME: handle generated content
753
- if ( $frame->get_style()->display === "list-item" ) {
754
- // Insert a list-bullet frame
755
- $node = $this->_xml->createElement("bullet"); // arbitrary choice
756
- $b_f = new Frame($node);
757
-
758
- $parent_node = $frame->get_parent()->get_node();
759
-
760
- if ( !$parent_node->hasAttribute("dompdf-children-count") ) {
761
- $xpath = new DOMXPath($this->_xml);
762
- $count = $xpath->query("li", $parent_node)->length;
763
- $parent_node->setAttribute("dompdf-children-count", $count);
764
- }
765
-
766
- if ( !$parent_node->hasAttribute("dompdf-counter") ) {
767
- $index = ($parent_node->hasAttribute("start") ? $parent_node->getAttribute("start")-1 : 0);
768
- }
769
- else {
770
- $index = $parent_node->getAttribute("dompdf-counter");
771
- }
772
-
773
- $index++;
774
- $parent_node->setAttribute("dompdf-counter", $index);
775
-
776
- $node->setAttribute("dompdf-counter", $index);
777
- $style = $this->_css->create_style();
778
- $style->display = "-dompdf-list-bullet";
779
- $style->inherit($frame->get_style());
780
- $b_f->set_style($style);
781
-
782
- $deco->prepend_child( Frame_Factory::decorate_frame($b_f, $this) );
783
- }
784
-
785
  }
786
 
787
  // Add meta information
@@ -789,7 +908,7 @@ class DOMPDF {
789
  if ( $title->length ) {
790
  $this->_pdf->add_info("Title", trim($title->item(0)->nodeValue));
791
  }
792
-
793
  $metas = $this->_xml->getElementsByTagName("meta");
794
  $labels = array(
795
  "author" => "Author",
@@ -799,17 +918,17 @@ class DOMPDF {
799
  foreach($metas as $meta) {
800
  $name = mb_strtolower($meta->getAttribute("name"));
801
  $value = trim($meta->getAttribute("content"));
802
-
803
  if ( isset($labels[$name]) ) {
804
  $this->_pdf->add_info($labels[$name], $value);
805
  continue;
806
  }
807
-
808
  if ( $name === "dompdf.view" && $this->parse_default_view($value) ) {
809
  $this->_pdf->set_default_view($this->_default_view, $this->_default_view_options);
810
  }
811
  }
812
-
813
  $root->set_containing_block(0, 0, $this->_pdf->get_width(), $this->_pdf->get_height());
814
  $root->set_renderer(new Renderer($this));
815
 
@@ -818,17 +937,18 @@ class DOMPDF {
818
 
819
  // Clean up cached images
820
  Image_Cache::clear();
821
-
822
  global $_dompdf_warnings, $_dompdf_show_warnings;
823
  if ( $_dompdf_show_warnings ) {
824
  echo '<b>DOMPDF Warnings</b><br><pre>';
825
- foreach ($_dompdf_warnings as $msg)
826
  echo $msg . "\n";
 
827
  echo $this->get_canvas()->get_cpdf()->messages;
828
  echo '</pre>';
829
  flush();
830
  }
831
-
832
  $this->restore_locale();
833
  }
834
 
@@ -836,32 +956,38 @@ class DOMPDF {
836
  * Add meta information to the PDF after rendering
837
  */
838
  function add_info($label, $value) {
839
- if (!is_null($this->_pdf))
840
  $this->_pdf->add_info($label, $value);
 
841
  }
842
 
843
  /**
844
  * Writes the output buffer in the log file
 
845
  * @return void
846
  */
847
  private function write_log() {
848
- if ( !DOMPDF_LOG_OUTPUT_FILE || !is_writable(DOMPDF_LOG_OUTPUT_FILE) ) return;
849
-
 
 
 
850
  $frames = Frame::$ID_COUNTER;
851
- $memory = DOMPDF_memory_usage();
852
- $memory = number_format($memory/1024);
853
- $time = number_format((microtime(true) - $this->_start_time) * 1000, 2);
854
-
855
- $out =
856
- "<span style='color: #000'>{$frames} frames</span>\t".
857
- "<span style='color: #900'>{$memory} KB</span>\t".
858
- "<span style='color: #090'>{$time} ms</span>\t".
859
- "<span style='color: #009' title='Quirksmode'>".
860
- ($this->_quirksmode ? "<span style='color: #c00'>ON</span>" : "<span style='color: #0c0'>OFF</span>").
861
- "</span><br />";
862
-
863
  $out .= ob_get_clean();
864
- file_put_contents(DOMPDF_LOG_OUTPUT_FILE, $out);
 
 
865
  }
866
 
867
  /**
@@ -886,12 +1012,13 @@ class DOMPDF {
886
  */
887
  function stream($filename, $options = null) {
888
  $this->save_locale();
889
-
890
  $this->write_log();
891
-
892
- if (!is_null($this->_pdf))
893
  $this->_pdf->stream($filename, $options);
894
-
 
895
  $this->restore_locale();
896
  }
897
 
@@ -907,20 +1034,22 @@ class DOMPDF {
907
  *
908
  *
909
  * @param array $options options (see above)
 
910
  * @return string
911
  */
912
  function output($options = null) {
913
  $this->save_locale();
914
-
915
  $this->write_log();
916
 
917
- if ( is_null($this->_pdf) )
918
  return null;
 
919
 
920
  $output = $this->_pdf->output( $options );
921
-
922
  $this->restore_locale();
923
-
924
  return $output;
925
  }
926
 
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
59
  /**
60
  * DomDocument representing the HTML document
61
  *
62
+ * @var DOMDocument
63
  */
64
  protected $_xml;
65
 
139
  * HTTP context created with stream_context_create()
140
  * Will be used for file_get_contents
141
  *
142
+ * @var resource
143
  */
144
  protected $_http_context;
145
+
146
  /**
147
  * Timestamp of the script start time
148
+ *
149
+ * @var int
150
  */
151
  private $_start_time = null;
152
+
153
  /**
154
+ * The system's locale
155
+ *
156
+ * @var string
157
  */
158
  private $_system_locale = null;
159
+
160
  /**
161
+ * Tells if the system's locale is the C standard one
162
+ *
163
+ * @var bool
164
  */
165
  private $_locale_standard = false;
166
+
167
  /**
168
+ * The default view of the PDF in the viewer
169
+ *
170
+ * @var string
171
  */
172
  private $_default_view = "Fit";
173
+
174
  /**
175
+ * The default view options of the PDF in the viewer
176
+ *
177
+ * @var array
178
  */
179
  private $_default_view_options = array();
180
 
181
  /**
182
+ * Tells wether the DOM document is in quirksmode (experimental)
183
+ *
184
+ * @var bool
185
  */
186
  private $_quirksmode = false;
187
+
188
+ /**
189
+ * The list of built-in fonts
190
+ *
191
+ * @var array
192
+ */
193
+ public static $native_fonts = array(
194
+ "courier", "courier-bold", "courier-oblique", "courier-boldoblique",
195
+ "helvetica", "helvetica-bold", "helvetica-oblique", "helvetica-boldoblique",
196
+ "times-roman", "times-bold", "times-italic", "times-bolditalic",
197
+ "symbol", "zapfdinbats"
198
+ );
199
+
200
+ private $_options = array(
201
+ // Directories
202
+ "temp_dir" => DOMPDF_TEMP_DIR,
203
+ "font_dir" => DOMPDF_FONT_DIR,
204
+ "font_cache" => DOMPDF_FONT_CACHE,
205
+ "chroot" => DOMPDF_CHROOT,
206
+ "log_output_file" => DOMPDF_LOG_OUTPUT_FILE,
207
+
208
+ // Rendering
209
+ "default_media_type" => DOMPDF_DEFAULT_MEDIA_TYPE,
210
+ "default_paper_size" => DOMPDF_DEFAULT_PAPER_SIZE,
211
+ "default_font" => DOMPDF_DEFAULT_FONT,
212
+ "dpi" => DOMPDF_DPI,
213
+ "font_height_ratio" => DOMPDF_FONT_HEIGHT_RATIO,
214
+
215
+ // Features
216
+ "enable_unicode" => DOMPDF_UNICODE_ENABLED,
217
+ "enable_php" => DOMPDF_ENABLE_PHP,
218
+ "enable_remote" => DOMPDF_ENABLE_REMOTE,
219
+ "enable_css_float" => DOMPDF_ENABLE_CSS_FLOAT,
220
+ "enable_javascript" => DOMPDF_ENABLE_JAVASCRIPT,
221
+ "enable_html5_parser" => DOMPDF_ENABLE_HTML5PARSER,
222
+ "enable_font_subsetting" => DOMPDF_ENABLE_FONTSUBSETTING,
223
+
224
+ // Debug
225
+ "debug_png" => DEBUGPNG,
226
+ "debug_keep_temp" => DEBUGKEEPTEMP,
227
+ "debug_css" => DEBUGCSS,
228
+ "debug_layout" => DEBUG_LAYOUT,
229
+ "debug_layout_lines" => DEBUG_LAYOUT_LINES,
230
+ "debug_layout_blocks" => DEBUG_LAYOUT_BLOCKS,
231
+ "debug_layout_inline" => DEBUG_LAYOUT_INLINE,
232
+ "debug_layout_padding_box" => DEBUG_LAYOUT_PADDINGBOX,
233
+
234
+ // Admin
235
+ "admin_username" => DOMPDF_ADMIN_USERNAME,
236
+ "admin_password" => DOMPDF_ADMIN_PASSWORD,
237
+ );
238
 
239
  /**
240
  * Class constructor
241
  */
242
  function __construct() {
243
  $this->_locale_standard = sprintf('%.1f', 1.0) == '1.0';
244
+
245
  $this->save_locale();
246
+
247
  $this->_messages = array();
248
  $this->_css = new Stylesheet($this);
249
  $this->_pdf = null;
255
  $this->_http_context = null;
256
  $this->_callbacks = array();
257
  $this->_cache_id = null;
258
+
259
  $this->restore_locale();
260
  }
261
+
262
  /**
263
  * Class destructor
264
  */
265
  function __destruct() {
266
  clear_object($this);
267
  }
268
+
269
  /**
270
+ * Get the dompdf option value
271
+ *
272
+ * @param string $key
273
+ *
274
+ * @return mixed
275
+ * @throws DOMPDF_Exception
276
+ */
277
+ function get_option($key) {
278
+ if ( !array_key_exists($key, $this->_options) ) {
279
+ throw new DOMPDF_Exception("Option '$key' doesn't exist");
280
+ }
281
+
282
+ return $this->_options[$key];
283
+ }
284
+
285
+ /**
286
+ * @param string $key
287
+ * @param mixed $value
288
+ *
289
+ * @throws DOMPDF_Exception
290
+ */
291
+ function set_option($key, $value) {
292
+ if ( !array_key_exists($key, $this->_options) ) {
293
+ throw new DOMPDF_Exception("Option '$key' doesn't exist");
294
+ }
295
+
296
+ $this->_options[$key] = $value;
297
+ }
298
+
299
+ /**
300
+ * @param array $options
301
+ */
302
+ function set_options(array $options) {
303
+ foreach ($options as $key => $value) {
304
+ $this->set_option($key, $value);
305
+ }
306
+ }
307
+
308
+ /**
309
+ * Save the system's locale configuration and
310
  * set the right value for numeric formatting
311
  */
312
  private function save_locale() {
313
+ if ( $this->_locale_standard ) {
314
+ return;
315
+ }
316
+
317
  $this->_system_locale = setlocale(LC_NUMERIC, "C");
318
  }
319
+
320
  /**
321
  * Restore the system's locale configuration
322
  */
323
  private function restore_locale() {
324
+ if ( $this->_locale_standard ) {
325
+ return;
326
+ }
327
+
328
  setlocale(LC_NUMERIC, $this->_system_locale);
329
  }
330
 
333
  *
334
  * @return Frame_Tree
335
  */
336
+ function get_tree() {
337
+ return $this->_tree;
338
+ }
339
 
340
  /**
341
  * Sets the protocol to use
342
  * FIXME validate these
343
+ *
344
  * @param string $proto
345
  */
346
+ function set_protocol($proto) {
347
+ $this->_protocol = $proto;
348
+ }
349
 
350
  /**
351
  * Sets the base hostname
352
  *
353
  * @param string $host
354
  */
355
+ function set_host($host) {
356
+ $this->_base_host = $host;
357
+ }
358
 
359
  /**
360
  * Sets the base path
361
  *
362
  * @param string $path
363
  */
364
+ function set_base_path($path) {
365
+ $this->_base_path = $path;
366
+ }
367
+
368
  /**
369
  * Sets the HTTP context
370
  *
371
  * @param resource $http_context
372
  */
373
+ function set_http_context($http_context) {
374
+ $this->_http_context = $http_context;
375
+ }
376
+
377
  /**
378
  * Sets the default view
379
  *
380
+ * @param string $default_view The default document view
381
+ * @param array $options The view's options
382
  */
383
+ function set_default_view($default_view, $options) {
384
  $this->_default_view = $default_view;
385
+ $this->_default_view_options = $options;
386
  }
387
+
388
  /**
389
  * Returns the protocol in use
390
  *
391
  * @return string
392
  */
393
+ function get_protocol() {
394
+ return $this->_protocol;
395
+ }
396
 
397
  /**
398
  * Returns the base hostname
399
  *
400
  * @return string
401
  */
402
+ function get_host() {
403
+ return $this->_base_host;
404
+ }
405
 
406
  /**
407
  * Returns the base path
408
  *
409
  * @return string
410
  */
411
+ function get_base_path() {
412
+ return $this->_base_path;
413
+ }
414
+
415
  /**
416
  * Returns the HTTP context
417
  *
418
  * @return resource
419
  */
420
+ function get_http_context() {
421
+ return $this->_http_context;
422
+ }
423
 
424
  /**
425
  * Return the underlying Canvas instance (e.g. CPDF_Adapter, GD_Adapter)
426
  *
427
  * @return Canvas
428
  */
429
+ function get_canvas() {
430
+ return $this->_pdf;
431
+ }
432
 
433
  /**
434
  * Returns the callbacks array
435
  *
436
  * @return array
437
  */
438
+ function get_callbacks() {
439
+ return $this->_callbacks;
440
+ }
441
 
442
  /**
443
  * Returns the stylesheet
444
  *
445
  * @return Stylesheet
446
  */
447
+ function get_css() {
448
+ return $this->_css;
449
+ }
450
+
451
+ /**
452
+ * @return DOMDocument
453
+ */
454
+ function get_dom() {
455
+ return $this->_xml;
456
+ }
457
 
458
  /**
459
  * Loads an HTML file
 
460
  * Parse errors are stored in the global array _dompdf_warnings.
461
  *
462
  * @param string $file a filename or url to load
463
+ *
464
+ * @throws DOMPDF_Exception
465
  */
466
  function load_html_file($file) {
467
  $this->save_locale();
468
+
469
  // Store parsing warnings as messages (this is to prevent output to the
470
  // browser if the html is ugly and the dom extension complains,
471
  // preventing the pdf from being streamed.)
472
+ if ( !$this->_protocol && !$this->_base_host && !$this->_base_path ) {
473
  list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($file);
474
+ }
475
 
476
+ if ( !$this->get_option("enable_remote") && ($this->_protocol != "" && $this->_protocol !== "file://" ) ) {
 
477
  throw new DOMPDF_Exception("Remote file requested, but DOMPDF_ENABLE_REMOTE is false.");
478
+ }
479
 
480
  if ($this->_protocol == "" || $this->_protocol === "file://") {
481
 
482
  $realfile = realpath($file);
483
+ if ( !$file ) {
484
  throw new DOMPDF_Exception("File '$file' not found.");
485
+ }
486
 
487
+ $chroot = $this->get_option("chroot");
488
+ if ( strpos($realfile, $chroot) !== 0 ) {
489
+ throw new DOMPDF_Exception("Permission denied on $file. The file could not be found under the directory specified by DOMPDF_CHROOT.");
490
+ }
491
 
492
  // Exclude dot files (e.g. .htaccess)
493
+ if ( substr(basename($realfile), 0, 1) === "." ) {
494
  throw new DOMPDF_Exception("Permission denied on $file.");
495
+ }
496
 
497
  $file = $realfile;
498
  }
509
  }
510
  }
511
  }
512
+
513
  $this->restore_locale();
514
+
515
  $this->load_html($contents, $encoding);
516
  }
517
 
518
  /**
519
  * Loads an HTML string
 
520
  * Parse errors are stored in the global array _dompdf_warnings.
 
521
  * @todo use the $encoding variable
522
+ *
523
+ * @param string $str HTML text to load
524
+ * @param string $encoding Not used yet
525
  */
526
  function load_html($str, $encoding = null) {
527
  $this->save_locale();
528
+
529
  // FIXME: Determine character encoding, switch to UTF8, update meta tag. Need better http/file stream encoding detection, currently relies on text or meta tag.
530
  mb_detect_order('auto');
531
+
532
  if (mb_detect_encoding($str) !== 'UTF-8') {
533
  $metatags = array(
534
  '@<meta\s+http-equiv="Content-Type"\s+content="(?:[\w/]+)(?:;\s*?charset=([^\s"]+))?@i',
535
  '@<meta\s+content="(?:[\w/]+)(?:;\s*?charset=([^\s"]+))"?\s+http-equiv="Content-Type"@i',
536
  '@<meta [^>]*charset\s*=\s*["\']?\s*([^"\' ]+)@i',
537
  );
538
+
539
  foreach($metatags as $metatag) {
540
  if (preg_match($metatag, $str, $matches)) break;
541
  }
542
+
543
  if (mb_detect_encoding($str) == '') {
544
  if (isset($matches[1])) {
545
  $encoding = strtoupper($matches[1]);
546
+ }
547
+ else {
548
  $encoding = 'UTF-8';
549
  }
550
+ }
551
+ else {
552
+ if ( isset($matches[1]) ) {
553
  $encoding = strtoupper($matches[1]);
554
+ }
555
+ else {
556
  $encoding = 'auto';
557
  }
558
  }
559
+
560
+ if ( $encoding !== 'UTF-8' ) {
561
+ $str = mb_convert_encoding($str, 'UTF-8', $encoding);
562
  }
563
+
564
+ if ( isset($matches[1]) ) {
565
  $str = preg_replace('/charset=([^\s"]+)/i', 'charset=UTF-8', $str);
566
+ }
567
+ else {
568
  $str = str_replace('<head>', '<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">', $str);
569
  }
570
+ }
571
+ else {
572
  $encoding = 'UTF-8';
573
  }
574
+
575
  // remove BOM mark from UTF-8, it's treated as document text by DOMDocument
576
  // FIXME: roll this into the encoding detection using UTF-8/16/32 BOM (http://us2.php.net/manual/en/function.mb-detect-encoding.php#91051)?
577
+ if ( substr($str, 0, 3) == chr(0xEF).chr(0xBB).chr(0xBF) ) {
578
  $str = substr($str, 3);
579
  }
580
+
581
  // Parse embedded php, first-pass
582
+ if ( $this->get_option("enable_php") ) {
583
  ob_start();
584
  eval("?" . ">$str");
585
  $str = ob_get_clean();
586
  }
587
+
588
  // if the document contains non utf-8 with a utf-8 meta tag chars and was
589
  // detected as utf-8 by mbstring, problems could happen.
590
  // http://devzone.zend.com/article/8855
592
  $re = '/<meta ([^>]*)((?:charset=[^"\' ]+)([^>]*)|(?:charset=["\'][^"\' ]+["\']))([^>]*)>/i';
593
  $str = preg_replace($re, '<meta $1$3>', $str);
594
  }
595
+
596
  // Store parsing warnings as messages
597
  set_error_handler("record_warnings");
598
+
599
  // @todo Take the quirksmode into account
600
  // http://hsivonen.iki.fi/doctype/
601
  // https://developer.mozilla.org/en/mozilla's_quirks_mode
602
  $quirksmode = false;
603
+
604
+ if ( $this->get_option("enable_html5_parser") ) {
605
  $tokenizer = new HTML5_Tokenizer($str);
606
  $tokenizer->parse();
607
  $doc = $tokenizer->save();
608
+
609
  // Remove #text children nodes in nodes that shouldn't have
610
  $tag_names = array("html", "table", "tbody", "thead", "tfoot", "tr");
611
  foreach($tag_names as $tag_name) {
612
  $nodes = $doc->getElementsByTagName($tag_name);
613
+
614
  foreach($nodes as $node) {
615
  self::remove_text_nodes($node);
616
  }
617
  }
618
+
619
  $quirksmode = ($tokenizer->getTree()->getQuirksMode() > HTML5_TreeBuilder::NO_QUIRKS);
620
  }
621
  else {
622
  $doc = new DOMDocument();
623
  $doc->preserveWhiteSpace = true;
624
  $doc->loadHTML($str);
625
+
626
+ // If some text is before the doctype, we are in quirksmode
627
+ if ( preg_match("/^(.+)<!doctype/i", ltrim($str), $matches) ) {
628
+ $quirksmode = true;
629
+ }
630
+ // If no doctype is provided, we are in quirksmode
631
+ elseif ( !preg_match("/^<!doctype/i", ltrim($str), $matches) ) {
632
  $quirksmode = true;
633
  }
634
  else {
636
  if ( !$doc->doctype->publicId && !$doc->doctype->systemId ) {
637
  $quirksmode = false;
638
  }
639
+
640
  // not XHTML
641
  if ( !preg_match("/xhtml/i", $doc->doctype->publicId) ) {
642
  $quirksmode = true;
643
  }
644
  }
645
  }
646
+
647
  $this->_xml = $doc;
648
  $this->_quirksmode = $quirksmode;
649
+
650
  $this->_tree = new Frame_Tree($this->_xml);
651
+
652
  restore_error_handler();
653
+
654
  $this->restore_locale();
655
  }
656
+
657
  static function remove_text_nodes(DOMNode $node) {
658
  $children = array();
659
  for ($i = 0; $i < $node->childNodes->length; $i++) {
662
  $children[] = $child;
663
  }
664
  }
665
+
666
  foreach($children as $child) {
667
  $node->removeChild($child);
668
  }
674
  */
675
  protected function _process_html() {
676
  $this->save_locale();
677
+
678
  $this->_tree->build_tree();
679
 
680
  $this->_css->load_css_file(Stylesheet::DEFAULT_STYLESHEET, Stylesheet::ORIG_UA);
681
 
682
  $acceptedmedia = Stylesheet::$ACCEPTED_GENERIC_MEDIA_TYPES;
683
+ $acceptedmedia[] = $this->get_option("default_media_type");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
684
 
685
+ // <base href="" />
686
+ $base_nodes = $this->_xml->getElementsByTagName("base");
687
+ if ( $base_nodes->length && ($href = $base_nodes->item(0)->getAttribute("href")) ) {
688
+ list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($href);
689
  }
690
+
691
  // Set the base path of the Stylesheet to that of the file being processed
692
  $this->_css->set_protocol($this->_protocol);
693
  $this->_css->set_host($this->_base_host);
694
  $this->_css->set_base_path($this->_base_path);
695
 
696
+ // Get all the stylesheets so that they are processed in document order
697
+ $xpath = new DOMXPath($this->_xml);
698
+ $stylesheets = $xpath->query("//*[name() = 'link' or name() = 'style']");
699
+
700
+ foreach($stylesheets as $tag) {
701
+ switch (strtolower($tag->nodeName)) {
702
+ // load <link rel="STYLESHEET" ... /> tags
703
+ case "link":
704
+ if ( mb_strtolower(stripos($tag->getAttribute("rel"), "stylesheet") !== false) || // may be "appendix stylesheet"
705
+ mb_strtolower($tag->getAttribute("type")) === "text/css" ) {
706
+ //Check if the css file is for an accepted media type
707
+ //media not given then always valid
708
+ $formedialist = preg_split("/[\s\n,]/", $tag->getAttribute("media"),-1, PREG_SPLIT_NO_EMPTY);
709
+ if ( count($formedialist) > 0 ) {
710
+ $accept = false;
711
+ foreach ( $formedialist as $type ) {
712
+ if ( in_array(mb_strtolower(trim($type)), $acceptedmedia) ) {
713
+ $accept = true;
714
+ break;
715
+ }
716
+ }
717
+
718
+ if (!$accept) {
719
+ //found at least one mediatype, but none of the accepted ones
720
+ //Skip this css file.
721
+ continue;
722
+ }
723
+ }
724
 
725
+ $url = $tag->getAttribute("href");
726
+ $url = build_url($this->_protocol, $this->_base_host, $this->_base_path, $url);
727
 
728
+ $this->_css->load_css_file($url, Stylesheet::ORIG_AUTHOR);
729
+ }
730
+ break;
731
+
732
+ // load <style> tags
733
+ case "style":
734
+ // Accept all <style> tags by default (note this is contrary to W3C
735
+ // HTML 4.0 spec:
736
+ // http://www.w3.org/TR/REC-html40/present/styles.html#adef-media
737
+ // which states that the default media type is 'screen'
738
+ if ( $tag->hasAttributes() &&
739
+ ($media = $tag->getAttribute("media")) &&
740
+ !in_array($media, $acceptedmedia) ) {
741
+ continue;
742
+ }
743
 
744
+ $css = "";
745
+ if ( $tag->hasChildNodes() ) {
746
+ $child = $tag->firstChild;
747
+ while ( $child ) {
748
+ $css .= $child->nodeValue; // Handle <style><!-- blah --></style>
749
+ $child = $child->nextSibling;
750
+ }
751
+ }
752
+ else {
753
+ $css = $tag->nodeValue;
754
+ }
755
 
756
+ $this->_css->load_css($css);
757
+ break;
758
+ }
759
  }
760
+
761
  $this->restore_locale();
762
  }
763
 
805
  }
806
  }
807
  }
808
+
809
  /**
810
  * Get the quirks mode
811
+ *
812
  * @return boolean true if quirks mode is active
813
  */
814
  function get_quirksmode(){
815
  return $this->_quirksmode;
816
  }
817
+
818
  function parse_default_view($value) {
819
  $valid = array("XYZ", "Fit", "FitH", "FitV", "FitR", "FitB", "FitBH", "FitBV");
820
+
821
  $options = preg_split("/\s*,\s*/", trim($value));
822
  $default_view = array_shift($options);
823
+
824
  if ( !in_array($default_view, $valid) ) {
825
  return false;
826
  }
827
+
828
  $this->set_default_view($default_view, $options);
829
  return true;
830
  }
834
  */
835
  function render() {
836
  $this->save_locale();
837
+
838
+ $log_output_file = $this->get_option("log_output_file");
839
+ if ( $log_output_file ) {
840
+ if ( !file_exists($log_output_file) && is_writable(dirname($log_output_file)) ) {
841
+ touch($log_output_file);
842
  }
843
+
844
  $this->_start_time = microtime(true);
845
  ob_start();
846
  }
848
  //enable_mem_profile();
849
 
850
  $this->_process_html();
851
+
852
  $this->_css->apply_styles($this->_tree);
853
+
854
  // @page style rules : size, margins
855
  $page_styles = $this->_css->get_page_styles();
856
+
857
  $base_page_style = $page_styles["base"];
858
  unset($page_styles["base"]);
859
+
860
  foreach($page_styles as $_page_style) {
861
  $_page_style->inherit($base_page_style);
862
  }
863
+
864
  if ( is_array($base_page_style->size) ) {
865
  $this->set_paper(array(0, 0, $base_page_style->size[0], $base_page_style->size[1]));
866
  }
867
+
868
+ $this->_pdf = Canvas_Factory::get_instance($this, $this->_paper_size, $this->_paper_orientation);
869
  Font_Metrics::init($this->_pdf);
870
+
871
+ if ( $this->get_option("enable_font_subsetting") && $this->_pdf instanceof CPDF_Adapter ) {
872
  foreach ($this->_tree->get_frames() as $frame) {
873
  $style = $frame->get_style();
874
  $node = $frame->get_node();
875
+
876
  // Handle text nodes
877
  if ( $node->nodeName === "#text" ) {
878
  $this->_pdf->register_string_subset($style->font_family, $node->nodeValue);
879
  continue;
880
  }
881
+
882
  // Handle generated content (list items)
883
  if ( $style->display === "list-item" ) {
884
  $chars = List_Bullet_Renderer::get_counter_chars($style->list_style_type);
885
  $this->_pdf->register_string_subset($style->font_family, $chars);
886
  continue;
887
  }
888
+
889
  // TODO Handle other generated content (pseudo elements)
890
  }
891
  }
892
+
893
  $root = null;
894
 
895
  foreach ($this->_tree->get_frames() as $frame) {
900
  }
901
 
902
  // Create the appropriate decorators, reflowers & positioners.
903
+ Frame_Factory::decorate_frame($frame, $this, $root);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
904
  }
905
 
906
  // Add meta information
908
  if ( $title->length ) {
909
  $this->_pdf->add_info("Title", trim($title->item(0)->nodeValue));
910
  }
911
+
912
  $metas = $this->_xml->getElementsByTagName("meta");
913
  $labels = array(
914
  "author" => "Author",
918
  foreach($metas as $meta) {
919
  $name = mb_strtolower($meta->getAttribute("name"));
920
  $value = trim($meta->getAttribute("content"));
921
+
922
  if ( isset($labels[$name]) ) {
923
  $this->_pdf->add_info($labels[$name], $value);
924
  continue;
925
  }
926
+
927
  if ( $name === "dompdf.view" && $this->parse_default_view($value) ) {
928
  $this->_pdf->set_default_view($this->_default_view, $this->_default_view_options);
929
  }
930
  }
931
+
932
  $root->set_containing_block(0, 0, $this->_pdf->get_width(), $this->_pdf->get_height());
933
  $root->set_renderer(new Renderer($this));
934
 
937
 
938
  // Clean up cached images
939
  Image_Cache::clear();
940
+
941
  global $_dompdf_warnings, $_dompdf_show_warnings;
942
  if ( $_dompdf_show_warnings ) {
943
  echo '<b>DOMPDF Warnings</b><br><pre>';
944
+ foreach ($_dompdf_warnings as $msg) {
945
  echo $msg . "\n";
946
+ }
947
  echo $this->get_canvas()->get_cpdf()->messages;
948
  echo '</pre>';
949
  flush();
950
  }
951
+
952
  $this->restore_locale();
953
  }
954
 
956
  * Add meta information to the PDF after rendering
957
  */
958
  function add_info($label, $value) {
959
+ if ( !is_null($this->_pdf) ) {
960
  $this->_pdf->add_info($label, $value);
961
+ }
962
  }
963
 
964
  /**
965
  * Writes the output buffer in the log file
966
+ *
967
  * @return void
968
  */
969
  private function write_log() {
970
+ $log_output_file = $this->get_option("log_output_file");
971
+ if ( !$log_output_file || !is_writable($log_output_file) ) {
972
+ return;
973
+ }
974
+
975
  $frames = Frame::$ID_COUNTER;
976
+ $memory = DOMPDF_memory_usage() / 1024;
977
+ $time = (microtime(true) - $this->_start_time) * 1000;
978
+
979
+ $out = sprintf(
980
+ "<span style='color: #000' title='Frames'>%6d</span>".
981
+ "<span style='color: #009' title='Memory'>%10.2f KB</span>".
982
+ "<span style='color: #900' title='Time'>%10.2f ms</span>".
983
+ "<span title='Quirksmode'> ".
984
+ ($this->_quirksmode ? "<span style='color: #d00'> ON</span>" : "<span style='color: #0d0'>OFF</span>").
985
+ "</span><br />", $frames, $memory, $time);
986
+
 
987
  $out .= ob_get_clean();
988
+
989
+ $log_output_file = $this->get_option("log_output_file");
990
+ file_put_contents($log_output_file, $out);
991
  }
992
 
993
  /**
1012
  */
1013
  function stream($filename, $options = null) {
1014
  $this->save_locale();
1015
+
1016
  $this->write_log();
1017
+
1018
+ if ( !is_null($this->_pdf) ) {
1019
  $this->_pdf->stream($filename, $options);
1020
+ }
1021
+
1022
  $this->restore_locale();
1023
  }
1024
 
1034
  *
1035
  *
1036
  * @param array $options options (see above)
1037
+ *
1038
  * @return string
1039
  */
1040
  function output($options = null) {
1041
  $this->save_locale();
1042
+
1043
  $this->write_log();
1044
 
1045
+ if ( is_null($this->_pdf) ) {
1046
  return null;
1047
+ }
1048
 
1049
  $output = $this->_pdf->output( $options );
1050
+
1051
  $this->restore_locale();
1052
+
1053
  return $output;
1054
  }
1055
 
dompdf/include/dompdf_exception.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: dompdf_exception.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/dompdf_image_exception.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: dompdf_image_exception.cls.php 449 2011-11-13 13:07:48Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/file.skel CHANGED
@@ -5,5 +5,4 @@
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author ...
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: file.skel 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author ...
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
dompdf/include/fixed_positioner.cls.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: fixed_positioner.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
@@ -53,7 +52,8 @@ class Fixed_Positioner extends Positioner {
53
  $margin_height = $this->_frame->get_margin_height();
54
  if ( $margin_height !== "auto" ) {
55
  $y -= $margin_height;
56
- } else {
 
57
  $y -= $height;
58
  }
59
  }
@@ -70,7 +70,8 @@ class Fixed_Positioner extends Positioner {
70
  $margin_width = $this->_frame->get_margin_width();
71
  if ( $margin_width !== "auto" ) {
72
  $x -= $margin_width;
73
- } else {
 
74
  $x -= $width;
75
  }
76
  }
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
52
  $margin_height = $this->_frame->get_margin_height();
53
  if ( $margin_height !== "auto" ) {
54
  $y -= $margin_height;
55
+ }
56
+ else {
57
  $y -= $height;
58
  }
59
  }
70
  $margin_width = $this->_frame->get_margin_width();
71
  if ( $margin_width !== "auto" ) {
72
  $x -= $margin_width;
73
+ }
74
+ else {
75
  $x -= $width;
76
  }
77
  }
dompdf/include/font_metrics.cls.php CHANGED
@@ -4,13 +4,11 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
- * @author Fabien M�nager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
9
- * @version $Id: font_metrics.cls.php 469 2012-02-05 22:25:30Z fabien.menager $
10
  */
11
 
12
  require_once DOMPDF_LIB_DIR . "/class.pdf.php";
13
- require_once DOMPDF_LIB_DIR . "/php-font-lib/classes/font.cls.php";
14
 
15
  /**
16
  * Name of the font cache file
@@ -26,7 +24,8 @@ require_once DOMPDF_LIB_DIR . "/php-font-lib/classes/font.cls.php";
26
  if (!defined("__DOMPDF_FONT_CACHE_FILE")) {
27
  if (file_exists(DOMPDF_FONT_DIR . "dompdf_font_family_cache")) {
28
  define('__DOMPDF_FONT_CACHE_FILE', DOMPDF_FONT_DIR . "dompdf_font_family_cache");
29
- } else {
 
30
  define('__DOMPDF_FONT_CACHE_FILE', DOMPDF_FONT_DIR . "dompdf_font_family_cache.dist.php");
31
  }
32
  }
@@ -72,7 +71,7 @@ class Font_Metrics {
72
  static function init(Canvas $canvas = null) {
73
  if (!self::$_pdf) {
74
  if (!$canvas) {
75
- $canvas = Canvas_Factory::get_instance();
76
  }
77
 
78
  self::$_pdf = $canvas;
@@ -85,10 +84,13 @@ class Font_Metrics {
85
  * @param string $text the text to be sized
86
  * @param string $font the desired font
87
  * @param float $size the desired font size
88
- * @param float $spacing word spacing, if any
 
 
 
89
  * @return float
90
  */
91
- static function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) {
92
  //return self::$_pdf->get_text_width($text, $font, $size, $word_spacing, $char_spacing);
93
 
94
  // @todo Make sure this cache is efficient before enabling it
@@ -129,18 +131,23 @@ class Font_Metrics {
129
 
130
  /**
131
  * Resolves a font family & subtype into an actual font file
132
- *
133
  * Subtype can be one of 'normal', 'bold', 'italic' or 'bold_italic'. If
134
  * the particular font family has no suitable font file, the default font
135
  * ({@link DOMPDF_DEFAULT_FONT}) is used. The font file returned
136
  * is the absolute pathname to the font file on the system.
137
  *
138
- * @param string $family
139
- * @param string $subtype
 
140
  * @return string
141
  */
142
- static function get_font($family, $subtype = "normal") {
143
-
 
 
 
 
 
144
  /* Allow calling for various fonts in search path. Therefore not immediately
145
  * return replacement on non match.
146
  * Only when called with NULL try replacement.
@@ -148,42 +155,51 @@ class Font_Metrics {
148
  * If only the subtype fails, nevertheless return failure.
149
  * Only on checking the fallback font, check various subtypes on same font.
150
  */
151
-
152
- if ( $family ) {
153
- $family = str_replace( array("'", '"'), "", mb_strtolower($family));
154
- $subtype = mb_strtolower($subtype);
155
-
 
156
  if ( isset(self::$_font_lookup[$family][$subtype]) ) {
157
- return self::$_font_lookup[$family][$subtype];
158
  }
 
159
  return null;
160
  }
161
 
162
- $family = DOMPDF_DEFAULT_FONT;
163
 
164
  if ( isset(self::$_font_lookup[$family][$subtype]) ) {
165
- return self::$_font_lookup[$family][$subtype];
166
  }
 
 
 
 
 
 
167
 
168
- foreach ( self::$_font_lookup[$family] as $sub => $font ) {
169
  if (strpos($subtype, $sub) !== false) {
170
- return $font;
171
  }
172
  }
173
 
174
  if ($subtype !== "normal") {
175
- foreach ( self::$_font_lookup[$family] as $sub => $font ) {
176
  if ($sub !== "normal") {
177
- return $font;
178
  }
179
  }
180
  }
181
 
182
  $subtype = "normal";
183
 
184
- if ( isset(self::$_font_lookup[$family][$subtype]) ) {
185
- return self::$_font_lookup[$family][$subtype];
186
  }
 
187
  return null;
188
  }
189
 
@@ -220,16 +236,17 @@ class Font_Metrics {
220
  * @see save_font_families()
221
  */
222
  static function load_font_families() {
223
- if ( !is_readable(self::CACHE_FILE) )
224
  return;
 
225
 
226
- self::$_font_lookup = require_once(self::CACHE_FILE);
227
 
228
  // If the font family cache is still in the old format
229
  if ( self::$_font_lookup === 1 ) {
230
  $cache_data = file_get_contents(self::CACHE_FILE);
231
  file_put_contents(self::CACHE_FILE, "<"."?php return $cache_data ?".">");
232
- self::$_font_lookup = require_once(self::CACHE_FILE);
233
  }
234
  }
235
 
@@ -298,7 +315,6 @@ class Font_Metrics {
298
  $entry = $families[$fontname];
299
  }
300
 
301
- $remote_file = $remote_file;
302
  $local_file = DOMPDF_FONT_DIR . md5($remote_file);
303
  $cache_entry = $local_file;
304
  $local_file .= ".ttf";
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
+ * @author Fabien Ménager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
9
  */
10
 
11
  require_once DOMPDF_LIB_DIR . "/class.pdf.php";
 
12
 
13
  /**
14
  * Name of the font cache file
24
  if (!defined("__DOMPDF_FONT_CACHE_FILE")) {
25
  if (file_exists(DOMPDF_FONT_DIR . "dompdf_font_family_cache")) {
26
  define('__DOMPDF_FONT_CACHE_FILE', DOMPDF_FONT_DIR . "dompdf_font_family_cache");
27
+ }
28
+ else {
29
  define('__DOMPDF_FONT_CACHE_FILE', DOMPDF_FONT_DIR . "dompdf_font_family_cache.dist.php");
30
  }
31
  }
71
  static function init(Canvas $canvas = null) {
72
  if (!self::$_pdf) {
73
  if (!$canvas) {
74
+ $canvas = Canvas_Factory::get_instance(new DOMPDF());
75
  }
76
 
77
  self::$_pdf = $canvas;
84
  * @param string $text the text to be sized
85
  * @param string $font the desired font
86
  * @param float $size the desired font size
87
+ * @param float $word_spacing
88
+ * @param float $char_spacing
89
+ *
90
+ * @internal param float $spacing word spacing, if any
91
  * @return float
92
  */
93
+ static function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0) {
94
  //return self::$_pdf->get_text_width($text, $font, $size, $word_spacing, $char_spacing);
95
 
96
  // @todo Make sure this cache is efficient before enabling it
131
 
132
  /**
133
  * Resolves a font family & subtype into an actual font file
 
134
  * Subtype can be one of 'normal', 'bold', 'italic' or 'bold_italic'. If
135
  * the particular font family has no suitable font file, the default font
136
  * ({@link DOMPDF_DEFAULT_FONT}) is used. The font file returned
137
  * is the absolute pathname to the font file on the system.
138
  *
139
+ * @param string $family_raw
140
+ * @param string $subtype_raw
141
+ *
142
  * @return string
143
  */
144
+ static function get_font($family_raw, $subtype_raw = "normal") {
145
+ static $cache = array();
146
+
147
+ if ( isset($cache[$family_raw][$subtype_raw]) ) {
148
+ return $cache[$family_raw][$subtype_raw];
149
+ }
150
+
151
  /* Allow calling for various fonts in search path. Therefore not immediately
152
  * return replacement on non match.
153
  * Only when called with NULL try replacement.
155
  * If only the subtype fails, nevertheless return failure.
156
  * Only on checking the fallback font, check various subtypes on same font.
157
  */
158
+
159
+ $subtype = strtolower($subtype_raw);
160
+
161
+ if ( $family_raw ) {
162
+ $family = str_replace( array("'", '"'), "", strtolower($family_raw));
163
+
164
  if ( isset(self::$_font_lookup[$family][$subtype]) ) {
165
+ return $cache[$family_raw][$subtype_raw] = self::$_font_lookup[$family][$subtype];
166
  }
167
+
168
  return null;
169
  }
170
 
171
+ $family = "serif";
172
 
173
  if ( isset(self::$_font_lookup[$family][$subtype]) ) {
174
+ return $cache[$family_raw][$subtype_raw] = self::$_font_lookup[$family][$subtype];
175
  }
176
+
177
+ if ( !isset(self::$_font_lookup[$family]) ) {
178
+ return null;
179
+ }
180
+
181
+ $family = self::$_font_lookup[$family];
182
 
183
+ foreach ( $family as $sub => $font ) {
184
  if (strpos($subtype, $sub) !== false) {
185
+ return $cache[$family_raw][$subtype_raw] = $font;
186
  }
187
  }
188
 
189
  if ($subtype !== "normal") {
190
+ foreach ( $family as $sub => $font ) {
191
  if ($sub !== "normal") {
192
+ return $cache[$family_raw][$subtype_raw] = $font;
193
  }
194
  }
195
  }
196
 
197
  $subtype = "normal";
198
 
199
+ if ( isset($family[$subtype]) ) {
200
+ return $cache[$family_raw][$subtype_raw] = $family[$subtype];
201
  }
202
+
203
  return null;
204
  }
205
 
236
  * @see save_font_families()
237
  */
238
  static function load_font_families() {
239
+ if ( !is_readable(self::CACHE_FILE) ) {
240
  return;
241
+ }
242
 
243
+ self::$_font_lookup = require_once self::CACHE_FILE;
244
 
245
  // If the font family cache is still in the old format
246
  if ( self::$_font_lookup === 1 ) {
247
  $cache_data = file_get_contents(self::CACHE_FILE);
248
  file_put_contents(self::CACHE_FILE, "<"."?php return $cache_data ?".">");
249
+ self::$_font_lookup = require_once self::CACHE_FILE;
250
  }
251
  }
252
 
315
  $entry = $families[$fontname];
316
  }
317
 
 
318
  $local_file = DOMPDF_FONT_DIR . md5($remote_file);
319
  $cache_entry = $local_file;
320
  $local_file .= ".ttf";
dompdf/include/frame.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: frame.cls.php 450 2012-01-10 22:29:32Z fabien.menager $
8
  */
9
 
10
  /**
@@ -20,11 +19,11 @@
20
  * @package dompdf
21
  */
22
  class Frame {
23
-
24
  /**
25
- * The DOMNode object this frame represents
26
  *
27
- * @var DOMNode
28
  */
29
  protected $_node;
30
 
@@ -40,7 +39,7 @@ class Frame {
40
  * Unique id counter
41
  */
42
  static /*protected*/ $ID_COUNTER = 0;
43
-
44
  /**
45
  * This frame's calculated style
46
  *
@@ -55,18 +54,18 @@ class Frame {
55
  * @var Style
56
  */
57
  protected $_original_style;
58
-
59
  /**
60
  * This frame's parent in the document tree.
61
  *
62
  * @var Frame
63
  */
64
  protected $_parent;
65
-
66
  /**
67
  * This frame's children
68
  *
69
- * @var array
70
  */
71
  protected $_frame_list;
72
 
@@ -98,11 +97,11 @@ class Frame {
98
  * @var Frame
99
  */
100
  protected $_next_sibling;
101
-
102
  /**
103
  * This frame's containing block (used in layout): array(x, y, w, h)
104
  *
105
- * @var array
106
  */
107
  protected $_containing_block;
108
 
@@ -110,10 +109,10 @@ class Frame {
110
  * Position on the page of the top-left corner of the margin box of
111
  * this frame: array(x,y)
112
  *
113
- * @var array
114
  */
115
  protected $_position;
116
-
117
  /**
118
  * Absolute opacity of this frame
119
  *
@@ -127,28 +126,30 @@ class Frame {
127
  * @var Frame_Decorator
128
  */
129
  protected $_decorator;
130
-
131
  /**
132
  * This frame's containing line box
 
133
  * @var Line_Box
134
  */
135
  protected $_containing_line;
136
-
137
  protected $_is_cache = array();
138
-
139
  /**
140
  * Tells wether the frame was already pushed to the next page
 
141
  * @var bool
142
  */
143
  public $_already_pushed = false;
144
-
145
  public $_float_next_line = false;
146
-
147
  static $_ws_state = self::WS_SPACE;
148
-
149
  const WS_TEXT = 1;
150
  const WS_SPACE = 2;
151
-
152
  /**
153
  * Class destructor
154
  */
@@ -163,32 +164,32 @@ class Frame {
163
  */
164
  function __construct(DOMNode $node) {
165
  $this->_node = $node;
166
-
167
  $this->_parent = null;
168
  $this->_first_child = null;
169
  $this->_last_child = null;
170
  $this->_prev_sibling = $this->_next_sibling = null;
171
-
172
  $this->_style = null;
173
  $this->_original_style = null;
174
-
175
  $this->_containing_block = array(
176
  "x" => null,
177
  "y" => null,
178
  "w" => null,
179
  "h" => null,
180
  );
181
-
182
  $this->_containing_block[0] =& $this->_containing_block["x"];
183
  $this->_containing_block[1] =& $this->_containing_block["y"];
184
  $this->_containing_block[2] =& $this->_containing_block["w"];
185
  $this->_containing_block[3] =& $this->_containing_block["h"];
186
-
187
  $this->_position = array(
188
  "x" => null,
189
  "y" => null,
190
  );
191
-
192
  $this->_position[0] =& $this->_position["x"];
193
  $this->_position[1] =& $this->_position["y"];
194
 
@@ -197,60 +198,62 @@ class Frame {
197
 
198
  $this->set_id( self::$ID_COUNTER++ );
199
  }
200
-
201
  // WIP : preprocessing to remove all the unused whitespace
202
  protected function ws_trim(){
203
- if ( $this->ws_keep() ) return;
204
-
 
 
205
  switch(self::$_ws_state) {
206
- case self::WS_SPACE:
207
  $node = $this->_node;
208
-
209
  if ( $node->nodeName === "#text" ) {
210
- $node->data = preg_replace("/[ \t\r\n\f]+/u", " ", $text);
211
-
212
  // starts with a whitespace
213
- if ( isset($node->data[0]) && $node->data[0] === " " ) {
214
- $node->data = ltrim($node->data);
215
  }
216
-
217
  // if not empty
218
- if ( $node->data !== "" ) {
219
  // change the current state (text)
220
  self::$_ws_state = self::WS_TEXT;
221
-
222
  // ends with a whitespace
223
- if ( preg_match("/[ \t\r\n\f]+$/u", $node->data) ) {
224
- $node->data = ltrim($node->data);
225
  }
226
  }
227
  }
228
  break;
229
-
230
  case self::WS_TEXT:
231
  }
232
  }
233
-
234
  protected function ws_keep(){
235
  $whitespace = $this->get_style()->white_space;
236
  return in_array($whitespace, array("pre", "pre-wrap", "pre-line"));
237
  }
238
-
239
  protected function ws_is_text(){
240
  $node = $this->get_node();
241
-
242
  if ($node->nodeName === "img") {
243
  return true;
244
  }
245
-
246
  if ( !$this->is_in_flow() ) {
247
  return false;
248
  }
249
-
250
  if ($this->is_text_node()) {
251
  return trim($node->nodeValue) !== "";
252
  }
253
-
254
  return true;
255
  }
256
 
@@ -262,13 +265,14 @@ class Frame {
262
  function dispose($recursive = false) {
263
 
264
  if ( $recursive ) {
265
- while ( $child = $this->_first_child )
266
  $child->dispose(true);
 
267
  }
268
 
269
  // Remove this frame from the tree
270
  if ( $this->_prev_sibling ) {
271
- $this->_prev_sibling->_next_sibling = $this->_next_sibling;
272
  }
273
 
274
  if ( $this->_next_sibling ) {
@@ -290,112 +294,133 @@ class Frame {
290
  $this->_style->dispose();
291
  $this->_style = null;
292
  unset($this->_style);
293
-
294
  $this->_original_style->dispose();
295
  $this->_original_style = null;
296
  unset($this->_original_style);
297
-
298
  }
299
 
300
  // Re-initialize the frame
301
  function reset() {
302
  $this->_position["x"] = null;
303
  $this->_position["y"] = null;
304
-
305
  $this->_containing_block["x"] = null;
306
  $this->_containing_block["y"] = null;
307
  $this->_containing_block["w"] = null;
308
  $this->_containing_block["h"] = null;
309
-
310
  $this->_style = null;
311
  unset($this->_style);
312
  $this->_style = clone $this->_original_style;
313
  }
314
-
315
  //........................................................................
316
 
317
- // Accessor methods
318
  /**
319
- * @return DOMNode
320
  */
321
- function get_node() { return $this->_node; }
322
-
 
 
323
  /**
324
  * @return string
325
  */
326
- function get_id() { return $this->_id; }
327
-
 
 
328
  /**
329
  * @return Style
330
  */
331
- function get_style() { return $this->_style; }
332
-
 
 
333
  /**
334
  * @return Style
335
  */
336
- function get_original_style() { return $this->_original_style; }
337
-
 
 
338
  /**
339
  * @return Frame
340
  */
341
- function get_parent() { return $this->_parent; }
342
-
 
 
343
  /**
344
  * @return Frame_Decorator
345
  */
346
- function get_decorator() { return $this->_decorator; }
347
-
 
 
348
  /**
349
  * @return Frame
350
  */
351
- function get_first_child() { return $this->_first_child; }
352
-
 
 
353
  /**
354
  * @return Frame
355
  */
356
- function get_last_child() { return $this->_last_child; }
357
-
 
 
358
  /**
359
  * @return Frame
360
  */
361
- function get_prev_sibling() { return $this->_prev_sibling; }
362
-
 
 
363
  /**
364
  * @return Frame
365
  */
366
- function get_next_sibling() { return $this->_next_sibling; }
367
-
 
 
368
  /**
369
- * @return FrameList
370
  */
371
- function get_children() {
372
  if ( isset($this->_frame_list) ) {
373
  return $this->_frame_list;
374
  }
375
-
376
  $this->_frame_list = new FrameList($this);
377
- return $this->_frame_list;
378
  }
379
-
380
  // Layout property accessors
381
-
382
- /**
383
  * Containing block dimensions
384
- *
385
  * @param $i string The key of the wanted containing block's dimension (x, y, x, h)
386
- * @return array|float
 
387
  */
388
  function get_containing_block($i = null) {
389
  if ( isset($i) ) {
390
- return $this->_containing_block[$i];
391
- }
392
  return $this->_containing_block;
393
  }
394
-
395
  /**
396
  * Block position
397
- *
398
  * @param $i string The key of the wanted position value (x, y)
 
399
  * @return array|float
400
  */
401
  function get_position($i = null) {
@@ -404,18 +429,18 @@ class Frame {
404
  }
405
  return $this->_position;
406
  }
407
-
408
  //........................................................................
409
 
410
  /**
411
  * Return the height of the margin box of the frame, in pt. Meaningless
412
  * unless the height has been calculated properly.
413
- *
414
  * @return float
415
  */
416
  function get_margin_height() {
417
  $style = $this->_style;
418
-
419
  return $style->length_in_pt(array(
420
  $style->height,
421
  $style->margin_top,
@@ -430,12 +455,12 @@ class Frame {
430
  /**
431
  * Return the width of the margin box of the frame, in pt. Meaningless
432
  * unless the width has been calculated properly.
433
- *
434
  * @return float
435
- */
436
  function get_margin_width() {
437
  $style = $this->_style;
438
-
439
  return $style->length_in_pt(array(
440
  $style->width,
441
  $style->margin_left,
@@ -446,10 +471,10 @@ class Frame {
446
  $style->padding_right
447
  ), $this->_containing_block["w"]);
448
  }
449
-
450
  function get_break_margins(){
451
  $style = $this->_style;
452
-
453
  return $style->length_in_pt(array(
454
  //$style->height,
455
  $style->margin_top,
@@ -463,23 +488,23 @@ class Frame {
463
 
464
  /**
465
  * Return the padding box (x,y,w,h) of the frame
466
- *
467
  * @return array
468
  */
469
  function get_padding_box() {
470
  $style = $this->_style;
471
  $cb = $this->_containing_block;
472
-
473
  $x = $this->_position["x"] +
474
  $style->length_in_pt(array($style->margin_left,
475
  $style->border_left_width),
476
  $cb["w"]);
477
-
478
  $y = $this->_position["y"] +
479
  $style->length_in_pt(array($style->margin_top,
480
  $style->border_top_width),
481
  $cb["h"]);
482
-
483
  $w = $style->length_in_pt(array($style->padding_left,
484
  $style->width,
485
  $style->padding_right),
@@ -496,17 +521,17 @@ class Frame {
496
  3 => $h, "h" => $h);
497
  }
498
 
499
- /**
500
  * Return the border box of the frame
501
- *
502
  * @return array
503
  */
504
  function get_border_box() {
505
  $style = $this->_style;
506
  $cb = $this->_containing_block;
507
-
508
  $x = $this->_position["x"] + $style->length_in_pt($style->margin_left, $cb["w"]);
509
-
510
  $y = $this->_position["y"] + $style->length_in_pt($style->margin_top, $cb["h"]);
511
 
512
  $w = $style->length_in_pt(array($style->border_left_width,
@@ -528,21 +553,21 @@ class Frame {
528
  2 => $w, "w" => $w,
529
  3 => $h, "h" => $h);
530
  }
531
-
532
  function get_opacity($opacity = null) {
533
  if ( $opacity !== null ) {
534
  $this->set_opacity($opacity);
535
  }
536
  return $this->_opacity;
537
  }
538
-
539
  /**
540
  * @return Line_Box
541
  */
542
  function &get_containing_line() {
543
  return $this->_containing_line;
544
  }
545
-
546
  //........................................................................
547
 
548
  // Set methods
@@ -552,50 +577,53 @@ class Frame {
552
  // We can only set attributes of DOMElement objects (nodeType == 1).
553
  // Since these are the only objects that we can assign CSS rules to,
554
  // this shortcoming is okay.
555
- if ( $this->_node->nodeType == XML_ELEMENT_NODE )
556
  $this->_node->setAttribute("frame_id", $id);
 
557
  }
558
 
559
  function set_style(Style $style) {
560
- if ( is_null($this->_style) )
561
  $this->_original_style = clone $style;
562
-
 
563
  //$style->set_frame($this);
564
  $this->_style = $style;
565
  }
566
-
567
  function set_decorator(Frame_Decorator $decorator) {
568
  $this->_decorator = $decorator;
569
  }
570
-
571
  function set_containing_block($x = null, $y = null, $w = null, $h = null) {
572
  if ( is_array($x) ){
573
  foreach($x as $key => $val){
574
  $$key = $val;
575
  }
576
  }
577
-
578
  if (is_numeric($x)) {
579
  $this->_containing_block["x"] = $x;
580
  }
581
-
582
  if (is_numeric($y)) {
583
  $this->_containing_block["y"] = $y;
584
  }
585
-
586
  if (is_numeric($w)) {
587
  $this->_containing_block["w"] = $w;
588
  }
589
-
590
  if (is_numeric($h)) {
591
  $this->_containing_block["h"] = $h;
592
  }
593
  }
594
 
595
  function set_position($x = null, $y = null) {
596
- if ( is_array($x) )
597
  extract($x);
598
-
 
599
  if ( is_numeric($x) ) {
600
  $this->_position["x"] = $x;
601
  }
@@ -604,153 +632,162 @@ class Frame {
604
  $this->_position["y"] = $y;
605
  }
606
  }
607
-
608
  function set_opacity($opacity) {
609
  $parent = $this->get_parent();
610
  $base_opacity = (($parent && $parent->_opacity !== null) ? $parent->_opacity : 1.0);
611
  $this->_opacity = $base_opacity * $opacity;
612
  }
613
-
614
  function set_containing_line(Line_Box $line) {
615
  $this->_containing_line = $line;
616
  }
617
 
618
  //........................................................................
619
-
620
  /**
621
  * Tells if the frame is a text node
622
- * @return bool
623
  */
624
  function is_text_node() {
625
  if ( isset($this->_is_cache["text_node"]) ) {
626
  return $this->_is_cache["text_node"];
627
  }
628
-
629
  return $this->_is_cache["text_node"] = ($this->get_node()->nodeName === "#text");
630
  }
631
-
632
  function is_positionned() {
633
  if ( isset($this->_is_cache["positionned"]) ) {
634
  return $this->_is_cache["positionned"];
635
  }
636
-
637
  $position = $this->get_style()->position;
638
-
639
  return $this->_is_cache["positionned"] = in_array($position, Style::$POSITIONNED_TYPES);
640
  }
641
-
642
  function is_absolute() {
643
  if ( isset($this->_is_cache["absolute"]) ) {
644
  return $this->_is_cache["absolute"];
645
  }
646
-
647
  $position = $this->get_style()->position;
648
-
649
  return $this->_is_cache["absolute"] = ($position === "absolute" || $position === "fixed");
650
  }
651
-
652
  function is_block() {
653
  if ( isset($this->_is_cache["block"]) ) {
654
  return $this->_is_cache["block"];
655
  }
656
-
657
  return $this->_is_cache["block"] = in_array($this->get_style()->display, Style::$BLOCK_TYPES);
658
  }
659
-
660
  function is_in_flow() {
661
  if ( isset($this->_is_cache["in_flow"]) ) {
662
  return $this->_is_cache["in_flow"];
663
  }
664
-
665
- return $this->_is_cache["in_flow"] = !(DOMPDF_ENABLE_CSS_FLOAT && $this->get_style()->float !== "none" || $this->is_absolute());
 
666
  }
667
-
668
  function is_pre(){
669
  if ( isset($this->_is_cache["pre"]) ) {
670
  return $this->_is_cache["pre"];
671
  }
672
-
673
  $white_space = $this->get_style()->white_space;
674
-
675
  return $this->_is_cache["pre"] = in_array($white_space, array("pre", "pre-wrap"));
676
  }
677
-
678
  function is_table(){
679
  if ( isset($this->_is_cache["table"]) ) {
680
  return $this->_is_cache["table"];
681
  }
682
-
683
  $display = $this->get_style()->display;
684
-
685
  return $this->_is_cache["table"] = in_array($display, Style::$TABLE_TYPES);
686
  }
687
-
688
-
689
  /**
690
  * Inserts a new child at the beginning of the Frame
691
- *
692
  * @param $child Frame The new Frame to insert
693
  * @param $update_node boolean Whether or not to update the DOM
694
- */
695
  function prepend_child(Frame $child, $update_node = true) {
696
- if ( $update_node )
697
  $this->_node->insertBefore($child->_node, $this->_first_child ? $this->_first_child->_node : null);
 
698
 
699
  // Remove the child from its parent
700
- if ( $child->_parent )
701
  $child->_parent->remove_child($child, false);
702
-
 
703
  $child->_parent = $this;
704
  $child->_prev_sibling = null;
705
-
706
  // Handle the first child
707
  if ( !$this->_first_child ) {
708
  $this->_first_child = $child;
709
  $this->_last_child = $child;
710
  $child->_next_sibling = null;
711
- } else {
 
712
  $this->_first_child->_prev_sibling = $child;
713
- $child->_next_sibling = $this->_first_child;
714
  $this->_first_child = $child;
715
  }
716
  }
717
-
718
  /**
719
  * Inserts a new child at the end of the Frame
720
- *
721
  * @param $child Frame The new Frame to insert
722
  * @param $update_node boolean Whether or not to update the DOM
723
- */
724
  function append_child(Frame $child, $update_node = true) {
725
- if ( $update_node )
726
  $this->_node->appendChild($child->_node);
 
727
 
728
  // Remove the child from its parent
729
- if ( $child->_parent )
730
  $child->_parent->remove_child($child, false);
 
731
 
732
  $child->_parent = $this;
733
  $child->_next_sibling = null;
734
-
735
  // Handle the first child
736
  if ( !$this->_last_child ) {
737
  $this->_first_child = $child;
738
  $this->_last_child = $child;
739
  $child->_prev_sibling = null;
740
- } else {
 
741
  $this->_last_child->_next_sibling = $child;
742
  $child->_prev_sibling = $this->_last_child;
743
  $this->_last_child = $child;
744
  }
745
- }
746
-
747
  /**
748
  * Inserts a new child immediately before the specified frame
749
- *
750
- * @param $new_child Frame The new Frame to insert
751
- * @param $ref Frame The Frame after the new Frame
752
  * @param $update_node boolean Whether or not to update the DOM
753
- */
 
 
754
  function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) {
755
  if ( $ref === $this->_first_child ) {
756
  $this->prepend_child($new_child, $update_node);
@@ -761,35 +798,41 @@ class Frame {
761
  $this->append_child($new_child, $update_node);
762
  return;
763
  }
764
-
765
- if ( $ref->_parent !== $this )
766
  throw new DOMPDF_Exception("Reference child is not a child of this node.");
 
767
 
768
- // Update the node
769
- if ( $update_node )
770
  $this->_node->insertBefore($new_child->_node, $ref->_node);
 
771
 
772
  // Remove the child from its parent
773
- if ( $new_child->_parent )
774
  $new_child->_parent->remove_child($new_child, false);
775
-
 
776
  $new_child->_parent = $this;
777
  $new_child->_next_sibling = $ref;
778
  $new_child->_prev_sibling = $ref->_prev_sibling;
779
 
780
- if ( $ref->_prev_sibling )
781
  $ref->_prev_sibling->_next_sibling = $new_child;
782
-
 
783
  $ref->_prev_sibling = $new_child;
784
  }
785
-
786
  /**
787
  * Inserts a new child immediately after the specified frame
788
- *
789
- * @param $new_child Frame The new Frame to insert
790
- * @param $ref Frame The Frame before the new Frame
791
  * @param $update_node boolean Whether or not to update the DOM
792
- */
 
 
793
  function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) {
794
  if ( $ref === $this->_last_child ) {
795
  $this->append_child($new_child, $update_node);
@@ -800,60 +843,72 @@ class Frame {
800
  $this->prepend_child($new_child, $update_node);
801
  return;
802
  }
803
-
804
- if ( $ref->_parent !== $this )
805
  throw new DOMPDF_Exception("Reference child is not a child of this node.");
 
806
 
807
  // Update the node
808
  if ( $update_node ) {
809
  if ( $ref->_next_sibling ) {
810
  $next_node = $ref->_next_sibling->_node;
811
  $this->_node->insertBefore($new_child->_node, $next_node);
812
- } else {
813
- $new_child->_node = $this->_node->appendChild($new_child);
 
814
  }
815
  }
816
-
817
  // Remove the child from its parent
818
- if ( $new_child->_parent)
819
  $new_child->_parent->remove_child($new_child, false);
820
-
 
821
  $new_child->_parent = $this;
822
  $new_child->_prev_sibling = $ref;
823
  $new_child->_next_sibling = $ref->_next_sibling;
824
 
825
- if ( $ref->_next_sibling )
826
  $ref->_next_sibling->_prev_sibling = $new_child;
 
827
 
828
  $ref->_next_sibling = $new_child;
829
  }
830
 
831
 
832
- /**
833
  * Remove a child frame
834
- *
835
- * @param $child Frame
836
- * @param $update_node boolean Whether or not to remove the DOM node
 
 
837
  * @return Frame The removed child frame
838
  */
839
  function remove_child(Frame $child, $update_node = true) {
840
- if ( $child->_parent !== $this )
841
  throw new DOMPDF_Exception("Child not found in this frame");
 
842
 
843
- if ( $update_node )
844
  $this->_node->removeChild($child->_node);
845
-
846
- if ( $child === $this->_first_child )
 
847
  $this->_first_child = $child->_next_sibling;
 
848
 
849
- if ( $child === $this->_last_child )
850
  $this->_last_child = $child->_prev_sibling;
 
851
 
852
- if ( $child->_prev_sibling )
853
  $child->_prev_sibling->_next_sibling = $child->_next_sibling;
 
854
 
855
- if ( $child->_next_sibling )
856
- $child->_next_sibling->_prev_sibling = $child->_prev_sibling;
 
857
 
858
  $child->_next_sibling = null;
859
  $child->_prev_sibling = null;
@@ -869,36 +924,39 @@ class Frame {
869
  // if ( $this->is_text_node() &&
870
  // preg_replace("/\s/", "", $this->_node->data) === "" )
871
  // return "";
872
-
873
-
874
  $str = "<b>" . $this->_node->nodeName . ":</b><br/>";
875
  //$str .= spl_object_hash($this->_node) . "<br/>";
876
  $str .= "Id: " .$this->get_id() . "<br/>";
877
  $str .= "Class: " .get_class($this) . "<br/>";
878
-
879
  if ( $this->is_text_node() ) {
880
  $tmp = htmlspecialchars($this->_node->nodeValue);
881
  $str .= "<pre>'" . mb_substr($tmp,0,70) .
882
  (mb_strlen($tmp) > 70 ? "..." : "") . "'</pre>";
883
- } elseif ( $css_class = $this->_node->getAttribute("class") ) {
884
- $tmp = htmlspecialchars($css_class);
885
  $str .= "CSS class: '$css_class'<br/>";
886
  }
887
-
888
- if ( $this->_parent )
889
  $str .= "\nParent:" . $this->_parent->_node->nodeName .
890
  " (" . spl_object_hash($this->_parent->_node) . ") " .
891
  "<br/>";
 
892
 
893
- if ( $this->_prev_sibling )
894
  $str .= "Prev: " . $this->_prev_sibling->_node->nodeName .
895
  " (" . spl_object_hash($this->_prev_sibling->_node) . ") " .
896
  "<br/>";
 
897
 
898
- if ( $this->_next_sibling )
899
  $str .= "Next: " . $this->_next_sibling->_node->nodeName .
900
  " (" . spl_object_hash($this->_next_sibling->_node) . ") " .
901
  "<br/>";
 
902
 
903
  $d = $this->get_decorator();
904
  while ($d && $d != $d->get_decorator()) {
@@ -910,7 +968,7 @@ class Frame {
910
  $str .= "\nContaining block: " . pre_r($this->_containing_block, true);
911
  $str .= "\nMargin width: " . pre_r($this->get_margin_width(), true);
912
  $str .= "\nMargin height: " . pre_r($this->get_margin_height(), true);
913
-
914
  $str .= "\nStyle: <pre>". $this->_style->__toString() . "</pre>";
915
 
916
  if ( $this->_decorator instanceof Block_Frame_Decorator ) {
@@ -918,13 +976,14 @@ class Frame {
918
  foreach ($this->_decorator->get_line_boxes() as $line) {
919
  foreach ($line->get_frames() as $frame) {
920
  if ($frame instanceof Text_Frame_Decorator) {
921
- $str .= "\ntext: ";
922
  $str .= "'". htmlspecialchars($frame->get_text()) ."'";
923
- } else {
 
924
  $str .= "\nBlock: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")";
925
  }
926
  }
927
-
928
  $str .=
929
  "\ny => " . $line->y . "\n" .
930
  "w => " . $line->w . "\n" .
@@ -934,12 +993,14 @@ class Frame {
934
  }
935
  $str .= "</pre>";
936
  }
 
937
  $str .= "\n";
938
- if ( php_sapi_name() === "cli" )
939
  $str = strip_tags(str_replace(array("<br/>","<b>","</b>"),
940
  array("\n","",""),
941
  $str));
942
-
 
943
  return $str;
944
  }
945
  }
@@ -958,7 +1019,7 @@ class FrameList implements IteratorAggregate {
958
  function __construct($frame) { $this->_frame = $frame; }
959
  function getIterator() { return new FrameListIterator($this->_frame); }
960
  }
961
-
962
  /**
963
  * Linked-list Iterator
964
  *
@@ -974,12 +1035,12 @@ class FrameListIterator implements Iterator {
974
  * @var Frame
975
  */
976
  protected $_parent;
977
-
978
  /**
979
  * @var Frame
980
  */
981
  protected $_cur;
982
-
983
  /**
984
  * @var int
985
  */
@@ -991,7 +1052,7 @@ class FrameListIterator implements Iterator {
991
  $this->_num = 0;
992
  }
993
 
994
- function rewind() {
995
  $this->_cur = $this->_parent->get_first_child();
996
  $this->_num = 0;
997
  }
@@ -1002,9 +1063,9 @@ class FrameListIterator implements Iterator {
1002
  function valid() {
1003
  return isset($this->_cur);// && ($this->_cur->get_prev_sibling() === $this->_prev);
1004
  }
1005
-
1006
  function key() { return $this->_num; }
1007
-
1008
  /**
1009
  * @return Frame
1010
  */
@@ -1016,9 +1077,10 @@ class FrameListIterator implements Iterator {
1016
  function next() {
1017
 
1018
  $ret = $this->_cur;
1019
- if ( !$ret )
1020
  return null;
1021
-
 
1022
  $this->_cur = $this->_cur->get_next_sibling();
1023
  $this->_num++;
1024
  return $ret;
@@ -1038,9 +1100,9 @@ class FrameTreeList implements IteratorAggregate {
1038
  * @var Frame
1039
  */
1040
  protected $_root;
1041
-
1042
  function __construct(Frame $root) { $this->_root = $root; }
1043
-
1044
  /**
1045
  * @return FrameTreeIterator
1046
  */
@@ -1061,12 +1123,12 @@ class FrameTreeIterator implements Iterator {
1061
  */
1062
  protected $_root;
1063
  protected $_stack = array();
1064
-
1065
  /**
1066
  * @var int
1067
  */
1068
  protected $_num;
1069
-
1070
  function __construct(Frame $root) {
1071
  $this->_stack[] = $this->_root = $root;
1072
  $this->_num = 0;
@@ -1076,38 +1138,47 @@ class FrameTreeIterator implements Iterator {
1076
  $this->_stack = array($this->_root);
1077
  $this->_num = 0;
1078
  }
1079
-
1080
  /**
1081
- * @return bool
1082
  */
1083
- function valid() { return count($this->_stack) > 0; }
1084
-
 
 
1085
  /**
1086
  * @return int
1087
  */
1088
- function key() { return $this->_num; }
1089
-
 
 
1090
  /**
1091
- * @var Frame
1092
  */
1093
- function current() { return end($this->_stack); }
 
 
1094
 
1095
  /**
1096
- * @var Frame
1097
  */
1098
  function next() {
1099
  $b = end($this->_stack);
1100
-
1101
  // Pop last element
1102
  unset($this->_stack[ key($this->_stack) ]);
1103
  $this->_num++;
1104
-
1105
  // Push all children onto the stack in reverse order
1106
  if ( $c = $b->get_last_child() ) {
1107
  $this->_stack[] = $c;
1108
- while ( $c = $c->get_prev_sibling() )
1109
  $this->_stack[] = $c;
 
1110
  }
 
1111
  return $b;
1112
  }
1113
  }
 
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
19
  * @package dompdf
20
  */
21
  class Frame {
22
+
23
  /**
24
+ * The DOMElement or DOMText object this frame represents
25
  *
26
+ * @var DOMElement|DOMText
27
  */
28
  protected $_node;
29
 
39
  * Unique id counter
40
  */
41
  static /*protected*/ $ID_COUNTER = 0;
42
+
43
  /**
44
  * This frame's calculated style
45
  *
54
  * @var Style
55
  */
56
  protected $_original_style;
57
+
58
  /**
59
  * This frame's parent in the document tree.
60
  *
61
  * @var Frame
62
  */
63
  protected $_parent;
64
+
65
  /**
66
  * This frame's children
67
  *
68
+ * @var Frame[]
69
  */
70
  protected $_frame_list;
71
 
97
  * @var Frame
98
  */
99
  protected $_next_sibling;
100
+
101
  /**
102
  * This frame's containing block (used in layout): array(x, y, w, h)
103
  *
104
+ * @var float[]
105
  */
106
  protected $_containing_block;
107
 
109
  * Position on the page of the top-left corner of the margin box of
110
  * this frame: array(x,y)
111
  *
112
+ * @var float[]
113
  */
114
  protected $_position;
115
+
116
  /**
117
  * Absolute opacity of this frame
118
  *
126
  * @var Frame_Decorator
127
  */
128
  protected $_decorator;
129
+
130
  /**
131
  * This frame's containing line box
132
+ *
133
  * @var Line_Box
134
  */
135
  protected $_containing_line;
136
+
137
  protected $_is_cache = array();
138
+
139
  /**
140
  * Tells wether the frame was already pushed to the next page
141
+ *
142
  * @var bool
143
  */
144
  public $_already_pushed = false;
145
+
146
  public $_float_next_line = false;
147
+
148
  static $_ws_state = self::WS_SPACE;
149
+
150
  const WS_TEXT = 1;
151
  const WS_SPACE = 2;
152
+
153
  /**
154
  * Class destructor
155
  */
164
  */
165
  function __construct(DOMNode $node) {
166
  $this->_node = $node;
167
+
168
  $this->_parent = null;
169
  $this->_first_child = null;
170
  $this->_last_child = null;
171
  $this->_prev_sibling = $this->_next_sibling = null;
172
+
173
  $this->_style = null;
174
  $this->_original_style = null;
175
+
176
  $this->_containing_block = array(
177
  "x" => null,
178
  "y" => null,
179
  "w" => null,
180
  "h" => null,
181
  );
182
+
183
  $this->_containing_block[0] =& $this->_containing_block["x"];
184
  $this->_containing_block[1] =& $this->_containing_block["y"];
185
  $this->_containing_block[2] =& $this->_containing_block["w"];
186
  $this->_containing_block[3] =& $this->_containing_block["h"];
187
+
188
  $this->_position = array(
189
  "x" => null,
190
  "y" => null,
191
  );
192
+
193
  $this->_position[0] =& $this->_position["x"];
194
  $this->_position[1] =& $this->_position["y"];
195
 
198
 
199
  $this->set_id( self::$ID_COUNTER++ );
200
  }
201
+
202
  // WIP : preprocessing to remove all the unused whitespace
203
  protected function ws_trim(){
204
+ if ( $this->ws_keep() ) {
205
+ return;
206
+ }
207
+
208
  switch(self::$_ws_state) {
209
+ case self::WS_SPACE:
210
  $node = $this->_node;
211
+
212
  if ( $node->nodeName === "#text" ) {
213
+ $node->nodeValue = preg_replace("/[ \t\r\n\f]+/u", " ", $node->nodeValue);
214
+
215
  // starts with a whitespace
216
+ if ( isset($node->nodeValue[0]) && $node->nodeValue[0] === " " ) {
217
+ $node->nodeValue = ltrim($node->nodeValue);
218
  }
219
+
220
  // if not empty
221
+ if ( $node->nodeValue !== "" ) {
222
  // change the current state (text)
223
  self::$_ws_state = self::WS_TEXT;
224
+
225
  // ends with a whitespace
226
+ if ( preg_match("/[ \t\r\n\f]+$/u", $node->nodeValue) ) {
227
+ $node->nodeValue = ltrim($node->nodeValue);
228
  }
229
  }
230
  }
231
  break;
232
+
233
  case self::WS_TEXT:
234
  }
235
  }
236
+
237
  protected function ws_keep(){
238
  $whitespace = $this->get_style()->white_space;
239
  return in_array($whitespace, array("pre", "pre-wrap", "pre-line"));
240
  }
241
+
242
  protected function ws_is_text(){
243
  $node = $this->get_node();
244
+
245
  if ($node->nodeName === "img") {
246
  return true;
247
  }
248
+
249
  if ( !$this->is_in_flow() ) {
250
  return false;
251
  }
252
+
253
  if ($this->is_text_node()) {
254
  return trim($node->nodeValue) !== "";
255
  }
256
+
257
  return true;
258
  }
259
 
265
  function dispose($recursive = false) {
266
 
267
  if ( $recursive ) {
268
+ while ( $child = $this->_first_child ) {
269
  $child->dispose(true);
270
+ }
271
  }
272
 
273
  // Remove this frame from the tree
274
  if ( $this->_prev_sibling ) {
275
+ $this->_prev_sibling->_next_sibling = $this->_next_sibling;
276
  }
277
 
278
  if ( $this->_next_sibling ) {
294
  $this->_style->dispose();
295
  $this->_style = null;
296
  unset($this->_style);
297
+
298
  $this->_original_style->dispose();
299
  $this->_original_style = null;
300
  unset($this->_original_style);
301
+
302
  }
303
 
304
  // Re-initialize the frame
305
  function reset() {
306
  $this->_position["x"] = null;
307
  $this->_position["y"] = null;
308
+
309
  $this->_containing_block["x"] = null;
310
  $this->_containing_block["y"] = null;
311
  $this->_containing_block["w"] = null;
312
  $this->_containing_block["h"] = null;
313
+
314
  $this->_style = null;
315
  unset($this->_style);
316
  $this->_style = clone $this->_original_style;
317
  }
318
+
319
  //........................................................................
320
 
 
321
  /**
322
+ * @return DOMElement|DOMText
323
  */
324
+ function get_node() {
325
+ return $this->_node;
326
+ }
327
+
328
  /**
329
  * @return string
330
  */
331
+ function get_id() {
332
+ return $this->_id;
333
+ }
334
+
335
  /**
336
  * @return Style
337
  */
338
+ function get_style() {
339
+ return $this->_style;
340
+ }
341
+
342
  /**
343
  * @return Style
344
  */
345
+ function get_original_style() {
346
+ return $this->_original_style;
347
+ }
348
+
349
  /**
350
  * @return Frame
351
  */
352
+ function get_parent() {
353
+ return $this->_parent;
354
+ }
355
+
356
  /**
357
  * @return Frame_Decorator
358
  */
359
+ function get_decorator() {
360
+ return $this->_decorator;
361
+ }
362
+
363
  /**
364
  * @return Frame
365
  */
366
+ function get_first_child() {
367
+ return $this->_first_child;
368
+ }
369
+
370
  /**
371
  * @return Frame
372
  */
373
+ function get_last_child() {
374
+ return $this->_last_child;
375
+ }
376
+
377
  /**
378
  * @return Frame
379
  */
380
+ function get_prev_sibling() {
381
+ return $this->_prev_sibling;
382
+ }
383
+
384
  /**
385
  * @return Frame
386
  */
387
+ function get_next_sibling() {
388
+ return $this->_next_sibling;
389
+ }
390
+
391
  /**
392
+ * @return FrameList|Frame[]
393
  */
394
+ function get_children() {
395
  if ( isset($this->_frame_list) ) {
396
  return $this->_frame_list;
397
  }
398
+
399
  $this->_frame_list = new FrameList($this);
400
+ return $this->_frame_list;
401
  }
402
+
403
  // Layout property accessors
404
+
405
+ /**
406
  * Containing block dimensions
407
+ *
408
  * @param $i string The key of the wanted containing block's dimension (x, y, x, h)
409
+ *
410
+ * @return float[]|float
411
  */
412
  function get_containing_block($i = null) {
413
  if ( isset($i) ) {
414
+ return $this->_containing_block[$i];
415
+ }
416
  return $this->_containing_block;
417
  }
418
+
419
  /**
420
  * Block position
421
+ *
422
  * @param $i string The key of the wanted position value (x, y)
423
+ *
424
  * @return array|float
425
  */
426
  function get_position($i = null) {
429
  }
430
  return $this->_position;
431
  }
432
+
433
  //........................................................................
434
 
435
  /**
436
  * Return the height of the margin box of the frame, in pt. Meaningless
437
  * unless the height has been calculated properly.
438
+ *
439
  * @return float
440
  */
441
  function get_margin_height() {
442
  $style = $this->_style;
443
+
444
  return $style->length_in_pt(array(
445
  $style->height,
446
  $style->margin_top,
455
  /**
456
  * Return the width of the margin box of the frame, in pt. Meaningless
457
  * unless the width has been calculated properly.
458
+ *
459
  * @return float
460
+ */
461
  function get_margin_width() {
462
  $style = $this->_style;
463
+
464
  return $style->length_in_pt(array(
465
  $style->width,
466
  $style->margin_left,
471
  $style->padding_right
472
  ), $this->_containing_block["w"]);
473
  }
474
+
475
  function get_break_margins(){
476
  $style = $this->_style;
477
+
478
  return $style->length_in_pt(array(
479
  //$style->height,
480
  $style->margin_top,
488
 
489
  /**
490
  * Return the padding box (x,y,w,h) of the frame
491
+ *
492
  * @return array
493
  */
494
  function get_padding_box() {
495
  $style = $this->_style;
496
  $cb = $this->_containing_block;
497
+
498
  $x = $this->_position["x"] +
499
  $style->length_in_pt(array($style->margin_left,
500
  $style->border_left_width),
501
  $cb["w"]);
502
+
503
  $y = $this->_position["y"] +
504
  $style->length_in_pt(array($style->margin_top,
505
  $style->border_top_width),
506
  $cb["h"]);
507
+
508
  $w = $style->length_in_pt(array($style->padding_left,
509
  $style->width,
510
  $style->padding_right),
521
  3 => $h, "h" => $h);
522
  }
523
 
524
+ /**
525
  * Return the border box of the frame
526
+ *
527
  * @return array
528
  */
529
  function get_border_box() {
530
  $style = $this->_style;
531
  $cb = $this->_containing_block;
532
+
533
  $x = $this->_position["x"] + $style->length_in_pt($style->margin_left, $cb["w"]);
534
+
535
  $y = $this->_position["y"] + $style->length_in_pt($style->margin_top, $cb["h"]);
536
 
537
  $w = $style->length_in_pt(array($style->border_left_width,
553
  2 => $w, "w" => $w,
554
  3 => $h, "h" => $h);
555
  }
556
+
557
  function get_opacity($opacity = null) {
558
  if ( $opacity !== null ) {
559
  $this->set_opacity($opacity);
560
  }
561
  return $this->_opacity;
562
  }
563
+
564
  /**
565
  * @return Line_Box
566
  */
567
  function &get_containing_line() {
568
  return $this->_containing_line;
569
  }
570
+
571
  //........................................................................
572
 
573
  // Set methods
577
  // We can only set attributes of DOMElement objects (nodeType == 1).
578
  // Since these are the only objects that we can assign CSS rules to,
579
  // this shortcoming is okay.
580
+ if ( $this->_node->nodeType == XML_ELEMENT_NODE ) {
581
  $this->_node->setAttribute("frame_id", $id);
582
+ }
583
  }
584
 
585
  function set_style(Style $style) {
586
+ if ( is_null($this->_style) ) {
587
  $this->_original_style = clone $style;
588
+ }
589
+
590
  //$style->set_frame($this);
591
  $this->_style = $style;
592
  }
593
+
594
  function set_decorator(Frame_Decorator $decorator) {
595
  $this->_decorator = $decorator;
596
  }
597
+
598
  function set_containing_block($x = null, $y = null, $w = null, $h = null) {
599
  if ( is_array($x) ){
600
  foreach($x as $key => $val){
601
  $$key = $val;
602
  }
603
  }
604
+
605
  if (is_numeric($x)) {
606
  $this->_containing_block["x"] = $x;
607
  }
608
+
609
  if (is_numeric($y)) {
610
  $this->_containing_block["y"] = $y;
611
  }
612
+
613
  if (is_numeric($w)) {
614
  $this->_containing_block["w"] = $w;
615
  }
616
+
617
  if (is_numeric($h)) {
618
  $this->_containing_block["h"] = $h;
619
  }
620
  }
621
 
622
  function set_position($x = null, $y = null) {
623
+ if ( is_array($x) ) {
624
  extract($x);
625
+ }
626
+
627
  if ( is_numeric($x) ) {
628
  $this->_position["x"] = $x;
629
  }
632
  $this->_position["y"] = $y;
633
  }
634
  }
635
+
636
  function set_opacity($opacity) {
637
  $parent = $this->get_parent();
638
  $base_opacity = (($parent && $parent->_opacity !== null) ? $parent->_opacity : 1.0);
639
  $this->_opacity = $base_opacity * $opacity;
640
  }
641
+
642
  function set_containing_line(Line_Box $line) {
643
  $this->_containing_line = $line;
644
  }
645
 
646
  //........................................................................
647
+
648
  /**
649
  * Tells if the frame is a text node
650
+ * @return bool
651
  */
652
  function is_text_node() {
653
  if ( isset($this->_is_cache["text_node"]) ) {
654
  return $this->_is_cache["text_node"];
655
  }
656
+
657
  return $this->_is_cache["text_node"] = ($this->get_node()->nodeName === "#text");
658
  }
659
+
660
  function is_positionned() {
661
  if ( isset($this->_is_cache["positionned"]) ) {
662
  return $this->_is_cache["positionned"];
663
  }
664
+
665
  $position = $this->get_style()->position;
666
+
667
  return $this->_is_cache["positionned"] = in_array($position, Style::$POSITIONNED_TYPES);
668
  }
669
+
670
  function is_absolute() {
671
  if ( isset($this->_is_cache["absolute"]) ) {
672
  return $this->_is_cache["absolute"];
673
  }
674
+
675
  $position = $this->get_style()->position;
676
+
677
  return $this->_is_cache["absolute"] = ($position === "absolute" || $position === "fixed");
678
  }
679
+
680
  function is_block() {
681
  if ( isset($this->_is_cache["block"]) ) {
682
  return $this->_is_cache["block"];
683
  }
684
+
685
  return $this->_is_cache["block"] = in_array($this->get_style()->display, Style::$BLOCK_TYPES);
686
  }
687
+
688
  function is_in_flow() {
689
  if ( isset($this->_is_cache["in_flow"]) ) {
690
  return $this->_is_cache["in_flow"];
691
  }
692
+
693
+ $enable_css_float = $this->get_style()->get_stylesheet()->get_dompdf()->get_option("enable_css_float");
694
+ return $this->_is_cache["in_flow"] = !($enable_css_float && $this->get_style()->float !== "none" || $this->is_absolute());
695
  }
696
+
697
  function is_pre(){
698
  if ( isset($this->_is_cache["pre"]) ) {
699
  return $this->_is_cache["pre"];
700
  }
701
+
702
  $white_space = $this->get_style()->white_space;
703
+
704
  return $this->_is_cache["pre"] = in_array($white_space, array("pre", "pre-wrap"));
705
  }
706
+
707
  function is_table(){
708
  if ( isset($this->_is_cache["table"]) ) {
709
  return $this->_is_cache["table"];
710
  }
711
+
712
  $display = $this->get_style()->display;
713
+
714
  return $this->_is_cache["table"] = in_array($display, Style::$TABLE_TYPES);
715
  }
716
+
717
+
718
  /**
719
  * Inserts a new child at the beginning of the Frame
720
+ *
721
  * @param $child Frame The new Frame to insert
722
  * @param $update_node boolean Whether or not to update the DOM
723
+ */
724
  function prepend_child(Frame $child, $update_node = true) {
725
+ if ( $update_node ) {
726
  $this->_node->insertBefore($child->_node, $this->_first_child ? $this->_first_child->_node : null);
727
+ }
728
 
729
  // Remove the child from its parent
730
+ if ( $child->_parent ) {
731
  $child->_parent->remove_child($child, false);
732
+ }
733
+
734
  $child->_parent = $this;
735
  $child->_prev_sibling = null;
736
+
737
  // Handle the first child
738
  if ( !$this->_first_child ) {
739
  $this->_first_child = $child;
740
  $this->_last_child = $child;
741
  $child->_next_sibling = null;
742
+ }
743
+ else {
744
  $this->_first_child->_prev_sibling = $child;
745
+ $child->_next_sibling = $this->_first_child;
746
  $this->_first_child = $child;
747
  }
748
  }
749
+
750
  /**
751
  * Inserts a new child at the end of the Frame
752
+ *
753
  * @param $child Frame The new Frame to insert
754
  * @param $update_node boolean Whether or not to update the DOM
755
+ */
756
  function append_child(Frame $child, $update_node = true) {
757
+ if ( $update_node ) {
758
  $this->_node->appendChild($child->_node);
759
+ }
760
 
761
  // Remove the child from its parent
762
+ if ( $child->_parent ) {
763
  $child->_parent->remove_child($child, false);
764
+ }
765
 
766
  $child->_parent = $this;
767
  $child->_next_sibling = null;
768
+
769
  // Handle the first child
770
  if ( !$this->_last_child ) {
771
  $this->_first_child = $child;
772
  $this->_last_child = $child;
773
  $child->_prev_sibling = null;
774
+ }
775
+ else {
776
  $this->_last_child->_next_sibling = $child;
777
  $child->_prev_sibling = $this->_last_child;
778
  $this->_last_child = $child;
779
  }
780
+ }
781
+
782
  /**
783
  * Inserts a new child immediately before the specified frame
784
+ *
785
+ * @param $new_child Frame The new Frame to insert
786
+ * @param $ref Frame The Frame after the new Frame
787
  * @param $update_node boolean Whether or not to update the DOM
788
+ *
789
+ * @throws DOMPDF_Exception
790
+ */
791
  function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) {
792
  if ( $ref === $this->_first_child ) {
793
  $this->prepend_child($new_child, $update_node);
798
  $this->append_child($new_child, $update_node);
799
  return;
800
  }
801
+
802
+ if ( $ref->_parent !== $this ) {
803
  throw new DOMPDF_Exception("Reference child is not a child of this node.");
804
+ }
805
 
806
+ // Update the node
807
+ if ( $update_node ) {
808
  $this->_node->insertBefore($new_child->_node, $ref->_node);
809
+ }
810
 
811
  // Remove the child from its parent
812
+ if ( $new_child->_parent ) {
813
  $new_child->_parent->remove_child($new_child, false);
814
+ }
815
+
816
  $new_child->_parent = $this;
817
  $new_child->_next_sibling = $ref;
818
  $new_child->_prev_sibling = $ref->_prev_sibling;
819
 
820
+ if ( $ref->_prev_sibling ) {
821
  $ref->_prev_sibling->_next_sibling = $new_child;
822
+ }
823
+
824
  $ref->_prev_sibling = $new_child;
825
  }
826
+
827
  /**
828
  * Inserts a new child immediately after the specified frame
829
+ *
830
+ * @param $new_child Frame The new Frame to insert
831
+ * @param $ref Frame The Frame before the new Frame
832
  * @param $update_node boolean Whether or not to update the DOM
833
+ *
834
+ * @throws DOMPDF_Exception
835
+ */
836
  function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) {
837
  if ( $ref === $this->_last_child ) {
838
  $this->append_child($new_child, $update_node);
843
  $this->prepend_child($new_child, $update_node);
844
  return;
845
  }
846
+
847
+ if ( $ref->_parent !== $this ) {
848
  throw new DOMPDF_Exception("Reference child is not a child of this node.");
849
+ }
850
 
851
  // Update the node
852
  if ( $update_node ) {
853
  if ( $ref->_next_sibling ) {
854
  $next_node = $ref->_next_sibling->_node;
855
  $this->_node->insertBefore($new_child->_node, $next_node);
856
+ }
857
+ else {
858
+ $new_child->_node = $this->_node->appendChild($new_child->_node);
859
  }
860
  }
861
+
862
  // Remove the child from its parent
863
+ if ( $new_child->_parent ) {
864
  $new_child->_parent->remove_child($new_child, false);
865
+ }
866
+
867
  $new_child->_parent = $this;
868
  $new_child->_prev_sibling = $ref;
869
  $new_child->_next_sibling = $ref->_next_sibling;
870
 
871
+ if ( $ref->_next_sibling ) {
872
  $ref->_next_sibling->_prev_sibling = $new_child;
873
+ }
874
 
875
  $ref->_next_sibling = $new_child;
876
  }
877
 
878
 
879
+ /**
880
  * Remove a child frame
881
+ *
882
+ * @param Frame $child
883
+ * @param boolean $update_node Whether or not to remove the DOM node
884
+ *
885
+ * @throws DOMPDF_Exception
886
  * @return Frame The removed child frame
887
  */
888
  function remove_child(Frame $child, $update_node = true) {
889
+ if ( $child->_parent !== $this ) {
890
  throw new DOMPDF_Exception("Child not found in this frame");
891
+ }
892
 
893
+ if ( $update_node ) {
894
  $this->_node->removeChild($child->_node);
895
+ }
896
+
897
+ if ( $child === $this->_first_child ) {
898
  $this->_first_child = $child->_next_sibling;
899
+ }
900
 
901
+ if ( $child === $this->_last_child ) {
902
  $this->_last_child = $child->_prev_sibling;
903
+ }
904
 
905
+ if ( $child->_prev_sibling ) {
906
  $child->_prev_sibling->_next_sibling = $child->_next_sibling;
907
+ }
908
 
909
+ if ( $child->_next_sibling ) {
910
+ $child->_next_sibling->_prev_sibling = $child->_prev_sibling;
911
+ }
912
 
913
  $child->_next_sibling = null;
914
  $child->_prev_sibling = null;
924
  // if ( $this->is_text_node() &&
925
  // preg_replace("/\s/", "", $this->_node->data) === "" )
926
  // return "";
927
+
928
+
929
  $str = "<b>" . $this->_node->nodeName . ":</b><br/>";
930
  //$str .= spl_object_hash($this->_node) . "<br/>";
931
  $str .= "Id: " .$this->get_id() . "<br/>";
932
  $str .= "Class: " .get_class($this) . "<br/>";
933
+
934
  if ( $this->is_text_node() ) {
935
  $tmp = htmlspecialchars($this->_node->nodeValue);
936
  $str .= "<pre>'" . mb_substr($tmp,0,70) .
937
  (mb_strlen($tmp) > 70 ? "..." : "") . "'</pre>";
938
+ }
939
+ elseif ( $css_class = $this->_node->getAttribute("class") ) {
940
  $str .= "CSS class: '$css_class'<br/>";
941
  }
942
+
943
+ if ( $this->_parent ) {
944
  $str .= "\nParent:" . $this->_parent->_node->nodeName .
945
  " (" . spl_object_hash($this->_parent->_node) . ") " .
946
  "<br/>";
947
+ }
948
 
949
+ if ( $this->_prev_sibling ) {
950
  $str .= "Prev: " . $this->_prev_sibling->_node->nodeName .
951
  " (" . spl_object_hash($this->_prev_sibling->_node) . ") " .
952
  "<br/>";
953
+ }
954
 
955
+ if ( $this->_next_sibling ) {
956
  $str .= "Next: " . $this->_next_sibling->_node->nodeName .
957
  " (" . spl_object_hash($this->_next_sibling->_node) . ") " .
958
  "<br/>";
959
+ }
960
 
961
  $d = $this->get_decorator();
962
  while ($d && $d != $d->get_decorator()) {
968
  $str .= "\nContaining block: " . pre_r($this->_containing_block, true);
969
  $str .= "\nMargin width: " . pre_r($this->get_margin_width(), true);
970
  $str .= "\nMargin height: " . pre_r($this->get_margin_height(), true);
971
+
972
  $str .= "\nStyle: <pre>". $this->_style->__toString() . "</pre>";
973
 
974
  if ( $this->_decorator instanceof Block_Frame_Decorator ) {
976
  foreach ($this->_decorator->get_line_boxes() as $line) {
977
  foreach ($line->get_frames() as $frame) {
978
  if ($frame instanceof Text_Frame_Decorator) {
979
+ $str .= "\ntext: ";
980
  $str .= "'". htmlspecialchars($frame->get_text()) ."'";
981
+ }
982
+ else {
983
  $str .= "\nBlock: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")";
984
  }
985
  }
986
+
987
  $str .=
988
  "\ny => " . $line->y . "\n" .
989
  "w => " . $line->w . "\n" .
993
  }
994
  $str .= "</pre>";
995
  }
996
+
997
  $str .= "\n";
998
+ if ( php_sapi_name() === "cli" ) {
999
  $str = strip_tags(str_replace(array("<br/>","<b>","</b>"),
1000
  array("\n","",""),
1001
  $str));
1002
+ }
1003
+
1004
  return $str;
1005
  }
1006
  }
1019
  function __construct($frame) { $this->_frame = $frame; }
1020
  function getIterator() { return new FrameListIterator($this->_frame); }
1021
  }
1022
+
1023
  /**
1024
  * Linked-list Iterator
1025
  *
1035
  * @var Frame
1036
  */
1037
  protected $_parent;
1038
+
1039
  /**
1040
  * @var Frame
1041
  */
1042
  protected $_cur;
1043
+
1044
  /**
1045
  * @var int
1046
  */
1052
  $this->_num = 0;
1053
  }
1054
 
1055
+ function rewind() {
1056
  $this->_cur = $this->_parent->get_first_child();
1057
  $this->_num = 0;
1058
  }
1063
  function valid() {
1064
  return isset($this->_cur);// && ($this->_cur->get_prev_sibling() === $this->_prev);
1065
  }
1066
+
1067
  function key() { return $this->_num; }
1068
+
1069
  /**
1070
  * @return Frame
1071
  */
1077
  function next() {
1078
 
1079
  $ret = $this->_cur;
1080
+ if ( !$ret ) {
1081
  return null;
1082
+ }
1083
+
1084
  $this->_cur = $this->_cur->get_next_sibling();
1085
  $this->_num++;
1086
  return $ret;
1100
  * @var Frame
1101
  */
1102
  protected $_root;
1103
+
1104
  function __construct(Frame $root) { $this->_root = $root; }
1105
+
1106
  /**
1107
  * @return FrameTreeIterator
1108
  */
1123
  */
1124
  protected $_root;
1125
  protected $_stack = array();
1126
+
1127
  /**
1128
  * @var int
1129
  */
1130
  protected $_num;
1131
+
1132
  function __construct(Frame $root) {
1133
  $this->_stack[] = $this->_root = $root;
1134
  $this->_num = 0;
1138
  $this->_stack = array($this->_root);
1139
  $this->_num = 0;
1140
  }
1141
+
1142
  /**
1143
+ * @return bool
1144
  */
1145
+ function valid() {
1146
+ return count($this->_stack) > 0;
1147
+ }
1148
+
1149
  /**
1150
  * @return int
1151
  */
1152
+ function key() {
1153
+ return $this->_num;
1154
+ }
1155
+
1156
  /**
1157
+ * @return Frame
1158
  */
1159
+ function current() {
1160
+ return end($this->_stack);
1161
+ }
1162
 
1163
  /**
1164
+ * @return Frame
1165
  */
1166
  function next() {
1167
  $b = end($this->_stack);
1168
+
1169
  // Pop last element
1170
  unset($this->_stack[ key($this->_stack) ]);
1171
  $this->_num++;
1172
+
1173
  // Push all children onto the stack in reverse order
1174
  if ( $c = $b->get_last_child() ) {
1175
  $this->_stack[] = $c;
1176
+ while ( $c = $c->get_prev_sibling() ) {
1177
  $this->_stack[] = $c;
1178
+ }
1179
  }
1180
+
1181
  return $b;
1182
  }
1183
  }
1184
+
dompdf/include/frame_decorator.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: frame_decorator.cls.php 464 2012-01-30 20:44:53Z fabien.menager $
8
  */
9
 
10
  /**
@@ -70,7 +69,8 @@ abstract class Frame_Decorator extends Frame {
70
  /**
71
  * Class constructor
72
  *
73
- * @param Frame $frame the decoration target
 
74
  */
75
  function __construct(Frame $frame, DOMPDF $dompdf) {
76
  $this->_frame = $frame;
@@ -85,10 +85,10 @@ abstract class Frame_Decorator extends Frame {
85
  * @param bool $recursive if true, call dispose on all children
86
  */
87
  function dispose($recursive = false) {
88
-
89
  if ( $recursive ) {
90
- while ( $child = $this->get_first_child() )
91
  $child->dispose(true);
 
92
  }
93
 
94
  $this->_root = null;
@@ -108,15 +108,15 @@ abstract class Frame_Decorator extends Frame {
108
  /**
109
  * Return a copy of this frame with $node as its node
110
  *
111
- * @param DomNode $node
 
112
  * @return Frame
113
  */
114
- function copy(DomNode $node) {
115
  $frame = new Frame($node);
116
  $frame->set_style(clone $this->_frame->get_original_style());
117
- $deco = Frame_Factory::decorate_frame($frame, $this->_dompdf);
118
- $deco->set_root($this->_root);
119
- return $deco;
120
  }
121
 
122
  /**
@@ -124,18 +124,18 @@ abstract class Frame_Decorator extends Frame {
124
  *
125
  * @return Frame
126
  */
127
- function deep_copy() {
128
  $frame = new Frame($this->get_node()->cloneNode());
129
  $frame->set_style(clone $this->_frame->get_original_style());
130
- $deco = Frame_Factory::decorate_frame($frame, $this->_dompdf);
131
- $deco->set_root($this->_root);
132
 
133
- foreach ($this->get_children() as $child)
134
  $deco->append_child($child->deep_copy());
 
135
 
136
  return $deco;
137
  }
138
- //........................................................................
139
 
140
  /**
141
  * Delegate calls to decorated frame object
@@ -146,100 +146,207 @@ abstract class Frame_Decorator extends Frame {
146
  $this->_counters = array();
147
 
148
  // Reset all children
149
- foreach ($this->get_children() as $child)
150
  $child->reset();
 
151
  }
152
 
153
  // Getters -----------
154
- function get_id() { return $this->_frame->get_id(); }
 
 
155
 
156
  /**
157
  * @return Frame
158
  */
159
- function get_frame() { return $this->_frame; }
 
 
160
 
161
  /**
162
- * @return DomNode
163
  */
164
- function get_node() { return $this->_frame->get_node(); }
 
 
165
 
166
  /**
167
  * @return Style
168
  */
169
- function get_style() { return $this->_frame->get_style(); }
 
 
170
 
171
  /**
172
  * @return Style
173
  */
174
- function get_original_style() { return $this->_frame->get_original_style(); }
175
- function get_containing_block($i = null) { return $this->_frame->get_containing_block($i); }
176
- function get_position($i = null) { return $this->_frame->get_position($i); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
 
178
  /**
179
  * @return DOMPDF
180
  */
181
- function get_dompdf() { return $this->_dompdf; }
182
-
183
- function get_margin_height() { return $this->_frame->get_margin_height(); }
184
- function get_margin_width() { return $this->_frame->get_margin_width(); }
185
- function get_padding_box() { return $this->_frame->get_padding_box(); }
186
- function get_border_box() { return $this->_frame->get_border_box(); }
187
 
188
- // Setters -----------
189
- function set_id($id) { $this->_frame->set_id($id); }
190
- function set_style(Style $style) { $this->_frame->set_style($style); }
 
 
 
191
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
192
  function set_containing_block($x = null, $y = null, $w = null, $h = null) {
193
  $this->_frame->set_containing_block($x, $y, $w, $h);
194
  }
195
 
 
 
 
 
196
  function set_position($x = null, $y = null) {
197
  $this->_frame->set_position($x, $y);
198
  }
199
- function __toString() { return $this->_frame->__toString(); }
200
-
 
 
 
 
 
 
 
 
 
 
201
  function prepend_child(Frame $child, $update_node = true) {
202
- while ( $child instanceof Frame_Decorator )
203
  $child = $child->_frame;
 
204
 
205
  $this->_frame->prepend_child($child, $update_node);
206
  }
207
 
 
 
 
 
208
  function append_child(Frame $child, $update_node = true) {
209
- while ( $child instanceof Frame_Decorator )
210
  $child = $child->_frame;
 
211
 
212
  $this->_frame->append_child($child, $update_node);
213
  }
214
 
 
 
 
 
 
215
  function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) {
216
- while ( $new_child instanceof Frame_Decorator )
217
  $new_child = $new_child->_frame;
 
218
 
219
- if ( $ref instanceof Frame_Decorator )
220
  $ref = $ref->_frame;
 
221
 
222
  $this->_frame->insert_child_before($new_child, $ref, $update_node);
223
  }
224
 
 
 
 
 
 
225
  function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) {
226
- while ( $new_child instanceof Frame_Decorator )
227
  $new_child = $new_child->_frame;
 
228
 
229
- while ( $ref instanceof Frame_Decorator )
230
  $ref = $ref->_frame;
 
231
 
232
  $this->_frame->insert_child_after($new_child, $ref, $update_node);
233
  }
234
 
 
 
 
 
 
 
235
  function remove_child(Frame $child, $update_node = true) {
236
- while ( $child instanceof Frame_Decorator )
237
- $child = $new_child->_frame;
 
238
 
239
- $this->_frame->remove_child($child, $update_node);
240
  }
241
-
242
- //........................................................................
243
 
244
  /**
245
  * @return Frame_Decorator
@@ -247,13 +354,17 @@ abstract class Frame_Decorator extends Frame {
247
  function get_parent() {
248
  $p = $this->_frame->get_parent();
249
  if ( $p && $deco = $p->get_decorator() ) {
250
- while ( $tmp = $deco->get_decorator() )
251
- $deco = $tmp;
 
 
252
  return $deco;
253
- } else if ( $p )
 
254
  return $p;
255
- else
256
- return null;
 
257
  }
258
 
259
  /**
@@ -262,13 +373,17 @@ abstract class Frame_Decorator extends Frame {
262
  function get_first_child() {
263
  $c = $this->_frame->get_first_child();
264
  if ( $c && $deco = $c->get_decorator() ) {
265
- while ( $tmp = $deco->get_decorator() )
266
- $deco = $tmp;
 
 
267
  return $deco;
268
- } else if ( $c )
 
269
  return $c;
270
- else
271
- return null;
 
272
  }
273
 
274
  /**
@@ -277,13 +392,17 @@ abstract class Frame_Decorator extends Frame {
277
  function get_last_child() {
278
  $c = $this->_frame->get_last_child();
279
  if ( $c && $deco = $c->get_decorator() ) {
280
- while ( $tmp = $deco->get_decorator() )
281
- $deco = $tmp;
 
 
282
  return $deco;
283
- } else if ( $c )
 
284
  return $c;
285
- else
286
- return null;
 
287
  }
288
 
289
  /**
@@ -292,13 +411,16 @@ abstract class Frame_Decorator extends Frame {
292
  function get_prev_sibling() {
293
  $s = $this->_frame->get_prev_sibling();
294
  if ( $s && $deco = $s->get_decorator() ) {
295
- while ( $tmp = $deco->get_decorator() )
296
- $deco = $tmp;
 
297
  return $deco;
298
- } else if ( $s )
 
299
  return $s;
300
- else
301
- return null;
 
302
  }
303
 
304
  /**
@@ -307,13 +429,17 @@ abstract class Frame_Decorator extends Frame {
307
  function get_next_sibling() {
308
  $s = $this->_frame->get_next_sibling();
309
  if ( $s && $deco = $s->get_decorator() ) {
310
- while ( $tmp = $deco->get_decorator() )
311
- $deco = $tmp;
 
 
312
  return $deco;
313
- } else if ( $s )
 
314
  return $s;
315
- else
316
- return null;
 
317
  }
318
 
319
  /**
@@ -322,42 +448,45 @@ abstract class Frame_Decorator extends Frame {
322
  function get_subtree() {
323
  return new FrameTreeList($this);
324
  }
325
-
326
- //........................................................................
327
 
328
  function set_positioner(Positioner $posn) {
329
  $this->_positioner = $posn;
330
- if ( $this->_frame instanceof Frame_Decorator )
331
  $this->_frame->set_positioner($posn);
 
332
  }
333
-
334
- //........................................................................
335
 
336
  function set_reflower(Frame_Reflower $reflower) {
337
  $this->_reflower = $reflower;
338
- if ( $this->_frame instanceof Frame_Decorator )
339
  $this->_frame->set_reflower( $reflower );
 
340
  }
341
 
342
  /**
343
  * @return Frame_Reflower
344
  */
345
- function get_reflower() { return $this->_reflower; }
346
-
347
- //........................................................................
348
-
 
 
 
349
  function set_root(Frame $root) {
350
  $this->_root = $root;
351
- if ( $this->_frame instanceof Frame_Decorator )
352
- $this->_frame->set_root($root);
 
 
353
  }
354
 
355
  /**
356
  * @return Page_Frame_Decorator
357
  */
358
- function get_root() { return $this->_root; }
359
-
360
- //........................................................................
361
 
362
  /**
363
  * @return Block_Frame_Decorator
@@ -371,7 +500,10 @@ abstract class Frame_Decorator extends Frame {
371
  $p = $this->get_parent();
372
 
373
  while ( $p ) {
374
- if ( $p->is_block() ) break;
 
 
 
375
  $p = $p->get_parent();
376
  }
377
 
@@ -389,7 +521,10 @@ abstract class Frame_Decorator extends Frame {
389
  // Find our nearest relative positionned parent
390
  $p = $this->get_parent();
391
  while ( $p ) {
392
- if ( $p->is_positionned() ) break;
 
 
 
393
  $p = $p->get_parent();
394
  }
395
 
@@ -400,26 +535,27 @@ abstract class Frame_Decorator extends Frame {
400
  return $this->_positionned_parent = $p;
401
  }
402
 
403
- //........................................................................
404
-
405
  /**
406
  * split this frame at $child.
407
- *
408
  * The current frame is cloned and $child and all children following
409
  * $child are added to the clone. The clone is then passed to the
410
  * current frame's parent->split() method.
411
  *
412
- * @param Frame $child
413
  * @param boolean $force_pagebreak
 
 
 
414
  */
415
- function split($child = null, $force_pagebreak = false) {
416
  if ( is_null( $child ) ) {
417
  $this->get_parent()->split($this, $force_pagebreak);
418
  return;
419
  }
420
 
421
- if ( $child->get_parent() !== $this )
422
  throw new DOMPDF_Exception("Unable to split: frame is not a child of this one.");
 
423
 
424
  $node = $this->_frame->get_node();
425
 
@@ -461,12 +597,12 @@ abstract class Frame_Decorator extends Frame {
461
  }
462
 
463
  function reset_counter($id = self::DEFAULT_COUNTER, $value = 0) {
464
- $this->get_parent()->_counters[$id] = $value;
465
  }
466
 
467
  function increment_counters($counters) {
468
  foreach($counters as $id => $increment) {
469
- $this->increment_counter($id, $increment);
470
  }
471
  }
472
 
@@ -504,59 +640,57 @@ abstract class Frame_Decorator extends Frame {
504
  $type = mb_strtolower($type);
505
 
506
  if ( !isset($this->_counters[$id]) ) {
507
- $value = $this->_counters[$id] = 0;
508
- }
509
- else {
510
- $value = $this->_counters[$id];
511
  }
 
 
512
 
513
  switch ($type) {
514
-
515
- default:
516
- case "decimal":
517
- return $value;
518
-
519
- case "decimal-leading-zero":
520
- return str_pad($value, 2, "0");
521
-
522
- case "lower-roman":
523
- return dec2roman($value);
524
-
525
- case "upper-roman":
526
- return mb_strtoupper(dec2roman($value));
527
-
528
- case "lower-latin":
529
- case "lower-alpha":
530
- return chr( ($value % 26) + ord('a') - 1);
531
-
532
- case "upper-latin":
533
- case "upper-alpha":
534
- return chr( ($value % 26) + ord('A') - 1);
535
-
536
- case "lower-greek":
537
- return unichr($value + 944);
538
-
539
- case "upper-greek":
540
- return unichr($value + 912);
541
  }
542
  }
543
 
544
- //........................................................................
545
-
546
- final function position() { $this->_positioner->position(); }
547
 
548
- final function move($offset_x, $offset_y, $ignore_self = false) {
549
  $this->_positioner->move($offset_x, $offset_y, $ignore_self);
550
  }
551
 
552
- final function reflow(Frame_Decorator $block = null) {
553
  // Uncomment this to see the frames before they're laid out, instead of
554
  // during rendering.
555
  //echo $this->_frame; flush();
556
  $this->_reflower->reflow($block);
557
  }
558
 
559
- final function get_min_max_width() { return $this->_reflower->get_min_max_width(); }
560
-
561
- //........................................................................
562
  }
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
69
  /**
70
  * Class constructor
71
  *
72
+ * @param Frame $frame The decoration target
73
+ * @param DOMPDF $dompdf The DOMPDF object
74
  */
75
  function __construct(Frame $frame, DOMPDF $dompdf) {
76
  $this->_frame = $frame;
85
  * @param bool $recursive if true, call dispose on all children
86
  */
87
  function dispose($recursive = false) {
 
88
  if ( $recursive ) {
89
+ while ( $child = $this->get_first_child() ) {
90
  $child->dispose(true);
91
+ }
92
  }
93
 
94
  $this->_root = null;
108
  /**
109
  * Return a copy of this frame with $node as its node
110
  *
111
+ * @param DOMNode $node
112
+ *
113
  * @return Frame
114
  */
115
+ function copy(DOMNode $node) {
116
  $frame = new Frame($node);
117
  $frame->set_style(clone $this->_frame->get_original_style());
118
+
119
+ return Frame_Factory::decorate_frame($frame, $this->_dompdf, $this->_root);
 
120
  }
121
 
122
  /**
124
  *
125
  * @return Frame
126
  */
127
+ function deep_copy() {
128
  $frame = new Frame($this->get_node()->cloneNode());
129
  $frame->set_style(clone $this->_frame->get_original_style());
130
+
131
+ $deco = Frame_Factory::decorate_frame($frame, $this->_dompdf, $this->_root);
132
 
133
+ foreach ($this->get_children() as $child) {
134
  $deco->append_child($child->deep_copy());
135
+ }
136
 
137
  return $deco;
138
  }
 
139
 
140
  /**
141
  * Delegate calls to decorated frame object
146
  $this->_counters = array();
147
 
148
  // Reset all children
149
+ foreach ($this->get_children() as $child) {
150
  $child->reset();
151
+ }
152
  }
153
 
154
  // Getters -----------
155
+ function get_id() {
156
+ return $this->_frame->get_id();
157
+ }
158
 
159
  /**
160
  * @return Frame
161
  */
162
+ function get_frame() {
163
+ return $this->_frame;
164
+ }
165
 
166
  /**
167
+ * @return DOMElement|DOMText
168
  */
169
+ function get_node() {
170
+ return $this->_frame->get_node();
171
+ }
172
 
173
  /**
174
  * @return Style
175
  */
176
+ function get_style() {
177
+ return $this->_frame->get_style();
178
+ }
179
 
180
  /**
181
  * @return Style
182
  */
183
+ function get_original_style() {
184
+ return $this->_frame->get_original_style();
185
+ }
186
+
187
+ /**
188
+ * @param integer $i
189
+ *
190
+ * @return array|float
191
+ */
192
+ function get_containing_block($i = null) {
193
+ return $this->_frame->get_containing_block($i);
194
+ }
195
+
196
+ /**
197
+ * @param integer $i
198
+ *
199
+ * @return array|float
200
+ */
201
+ function get_position($i = null) {
202
+ return $this->_frame->get_position($i);
203
+ }
204
 
205
  /**
206
  * @return DOMPDF
207
  */
208
+ function get_dompdf() {
209
+ return $this->_dompdf;
210
+ }
 
 
 
211
 
212
+ /**
213
+ * @return float
214
+ */
215
+ function get_margin_height() {
216
+ return $this->_frame->get_margin_height();
217
+ }
218
 
219
+ /**
220
+ * @return float
221
+ */
222
+ function get_margin_width() {
223
+ return $this->_frame->get_margin_width();
224
+ }
225
+
226
+ /**
227
+ * @return array
228
+ */
229
+ function get_padding_box() {
230
+ return $this->_frame->get_padding_box();
231
+ }
232
+
233
+ /**
234
+ * @return array
235
+ */
236
+ function get_border_box() {
237
+ return $this->_frame->get_border_box();
238
+ }
239
+
240
+ /**
241
+ * @param integer $id
242
+ */
243
+ function set_id($id) {
244
+ $this->_frame->set_id($id);
245
+ }
246
+
247
+ /**
248
+ * @param Style $style
249
+ */
250
+ function set_style(Style $style) {
251
+ $this->_frame->set_style($style);
252
+ }
253
+
254
+ /**
255
+ * @param float $x
256
+ * @param float $y
257
+ * @param float $w
258
+ * @param float $h
259
+ */
260
  function set_containing_block($x = null, $y = null, $w = null, $h = null) {
261
  $this->_frame->set_containing_block($x, $y, $w, $h);
262
  }
263
 
264
+ /**
265
+ * @param float $x
266
+ * @param float $y
267
+ */
268
  function set_position($x = null, $y = null) {
269
  $this->_frame->set_position($x, $y);
270
  }
271
+
272
+ /**
273
+ * @return string
274
+ */
275
+ function __toString() {
276
+ return $this->_frame->__toString();
277
+ }
278
+
279
+ /**
280
+ * @param Frame $child
281
+ * @param bool $update_node
282
+ */
283
  function prepend_child(Frame $child, $update_node = true) {
284
+ while ( $child instanceof Frame_Decorator ) {
285
  $child = $child->_frame;
286
+ }
287
 
288
  $this->_frame->prepend_child($child, $update_node);
289
  }
290
 
291
+ /**
292
+ * @param Frame $child
293
+ * @param bool $update_node
294
+ */
295
  function append_child(Frame $child, $update_node = true) {
296
+ while ( $child instanceof Frame_Decorator ) {
297
  $child = $child->_frame;
298
+ }
299
 
300
  $this->_frame->append_child($child, $update_node);
301
  }
302
 
303
+ /**
304
+ * @param Frame $new_child
305
+ * @param Frame $ref
306
+ * @param bool $update_node
307
+ */
308
  function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) {
309
+ while ( $new_child instanceof Frame_Decorator ) {
310
  $new_child = $new_child->_frame;
311
+ }
312
 
313
+ if ( $ref instanceof Frame_Decorator ) {
314
  $ref = $ref->_frame;
315
+ }
316
 
317
  $this->_frame->insert_child_before($new_child, $ref, $update_node);
318
  }
319
 
320
+ /**
321
+ * @param Frame $new_child
322
+ * @param Frame $ref
323
+ * @param bool $update_node
324
+ */
325
  function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) {
326
+ while ( $new_child instanceof Frame_Decorator ) {
327
  $new_child = $new_child->_frame;
328
+ }
329
 
330
+ while ( $ref instanceof Frame_Decorator ) {
331
  $ref = $ref->_frame;
332
+ }
333
 
334
  $this->_frame->insert_child_after($new_child, $ref, $update_node);
335
  }
336
 
337
+ /**
338
+ * @param Frame $child
339
+ * @param bool $update_node
340
+ *
341
+ * @return Frame
342
+ */
343
  function remove_child(Frame $child, $update_node = true) {
344
+ while ( $child instanceof Frame_Decorator ) {
345
+ $child = $child->_frame;
346
+ }
347
 
348
+ return $this->_frame->remove_child($child, $update_node);
349
  }
 
 
350
 
351
  /**
352
  * @return Frame_Decorator
354
  function get_parent() {
355
  $p = $this->_frame->get_parent();
356
  if ( $p && $deco = $p->get_decorator() ) {
357
+ while ( $tmp = $deco->get_decorator() ) {
358
+ $deco = $tmp;
359
+ }
360
+
361
  return $deco;
362
+ }
363
+ else if ( $p ) {
364
  return $p;
365
+ }
366
+
367
+ return null;
368
  }
369
 
370
  /**
373
  function get_first_child() {
374
  $c = $this->_frame->get_first_child();
375
  if ( $c && $deco = $c->get_decorator() ) {
376
+ while ( $tmp = $deco->get_decorator() ) {
377
+ $deco = $tmp;
378
+ }
379
+
380
  return $deco;
381
+ }
382
+ else if ( $c ) {
383
  return $c;
384
+ }
385
+
386
+ return null;
387
  }
388
 
389
  /**
392
  function get_last_child() {
393
  $c = $this->_frame->get_last_child();
394
  if ( $c && $deco = $c->get_decorator() ) {
395
+ while ( $tmp = $deco->get_decorator() ) {
396
+ $deco = $tmp;
397
+ }
398
+
399
  return $deco;
400
+ }
401
+ else if ( $c ) {
402
  return $c;
403
+ }
404
+
405
+ return null;
406
  }
407
 
408
  /**
411
  function get_prev_sibling() {
412
  $s = $this->_frame->get_prev_sibling();
413
  if ( $s && $deco = $s->get_decorator() ) {
414
+ while ( $tmp = $deco->get_decorator() ) {
415
+ $deco = $tmp;
416
+ }
417
  return $deco;
418
+ }
419
+ else if ( $s ) {
420
  return $s;
421
+ }
422
+
423
+ return null;
424
  }
425
 
426
  /**
429
  function get_next_sibling() {
430
  $s = $this->_frame->get_next_sibling();
431
  if ( $s && $deco = $s->get_decorator() ) {
432
+ while ( $tmp = $deco->get_decorator() ) {
433
+ $deco = $tmp;
434
+ }
435
+
436
  return $deco;
437
+ }
438
+ else if ( $s ) {
439
  return $s;
440
+ }
441
+
442
+ return null;
443
  }
444
 
445
  /**
448
  function get_subtree() {
449
  return new FrameTreeList($this);
450
  }
 
 
451
 
452
  function set_positioner(Positioner $posn) {
453
  $this->_positioner = $posn;
454
+ if ( $this->_frame instanceof Frame_Decorator ) {
455
  $this->_frame->set_positioner($posn);
456
+ }
457
  }
 
 
458
 
459
  function set_reflower(Frame_Reflower $reflower) {
460
  $this->_reflower = $reflower;
461
+ if ( $this->_frame instanceof Frame_Decorator ) {
462
  $this->_frame->set_reflower( $reflower );
463
+ }
464
  }
465
 
466
  /**
467
  * @return Frame_Reflower
468
  */
469
+ function get_reflower() {
470
+ return $this->_reflower;
471
+ }
472
+
473
+ /**
474
+ * @param Frame $root
475
+ */
476
  function set_root(Frame $root) {
477
  $this->_root = $root;
478
+
479
+ if ( $this->_frame instanceof Frame_Decorator ) {
480
+ $this->_frame->set_root($root);
481
+ }
482
  }
483
 
484
  /**
485
  * @return Page_Frame_Decorator
486
  */
487
+ function get_root() {
488
+ return $this->_root;
489
+ }
490
 
491
  /**
492
  * @return Block_Frame_Decorator
500
  $p = $this->get_parent();
501
 
502
  while ( $p ) {
503
+ if ( $p->is_block() ) {
504
+ break;
505
+ }
506
+
507
  $p = $p->get_parent();
508
  }
509
 
521
  // Find our nearest relative positionned parent
522
  $p = $this->get_parent();
523
  while ( $p ) {
524
+ if ( $p->is_positionned() ) {
525
+ break;
526
+ }
527
+
528
  $p = $p->get_parent();
529
  }
530
 
535
  return $this->_positionned_parent = $p;
536
  }
537
 
 
 
538
  /**
539
  * split this frame at $child.
 
540
  * The current frame is cloned and $child and all children following
541
  * $child are added to the clone. The clone is then passed to the
542
  * current frame's parent->split() method.
543
  *
544
+ * @param Frame $child
545
  * @param boolean $force_pagebreak
546
+ *
547
+ * @throws DOMPDF_Exception
548
+ * @return void
549
  */
550
+ function split(Frame $child = null, $force_pagebreak = false) {
551
  if ( is_null( $child ) ) {
552
  $this->get_parent()->split($this, $force_pagebreak);
553
  return;
554
  }
555
 
556
+ if ( $child->get_parent() !== $this ) {
557
  throw new DOMPDF_Exception("Unable to split: frame is not a child of this one.");
558
+ }
559
 
560
  $node = $this->_frame->get_node();
561
 
597
  }
598
 
599
  function reset_counter($id = self::DEFAULT_COUNTER, $value = 0) {
600
+ $this->get_parent()->_counters[$id] = intval($value);
601
  }
602
 
603
  function increment_counters($counters) {
604
  foreach($counters as $id => $increment) {
605
+ $this->increment_counter($id, intval($increment));
606
  }
607
  }
608
 
640
  $type = mb_strtolower($type);
641
 
642
  if ( !isset($this->_counters[$id]) ) {
643
+ $this->_counters[$id] = 0;
 
 
 
644
  }
645
+
646
+ $value = $this->_counters[$id];
647
 
648
  switch ($type) {
649
+ default:
650
+ case "decimal":
651
+ return $value;
652
+
653
+ case "decimal-leading-zero":
654
+ return str_pad($value, 2, "0");
655
+
656
+ case "lower-roman":
657
+ return dec2roman($value);
658
+
659
+ case "upper-roman":
660
+ return mb_strtoupper(dec2roman($value));
661
+
662
+ case "lower-latin":
663
+ case "lower-alpha":
664
+ return chr( ($value % 26) + ord('a') - 1);
665
+
666
+ case "upper-latin":
667
+ case "upper-alpha":
668
+ return chr( ($value % 26) + ord('A') - 1);
669
+
670
+ case "lower-greek":
671
+ return unichr($value + 944);
672
+
673
+ case "upper-greek":
674
+ return unichr($value + 912);
 
675
  }
676
  }
677
 
678
+ final function position() {
679
+ $this->_positioner->position();
680
+ }
681
 
682
+ final function move($offset_x, $offset_y, $ignore_self = false) {
683
  $this->_positioner->move($offset_x, $offset_y, $ignore_self);
684
  }
685
 
686
+ final function reflow(Block_Frame_Decorator $block = null) {
687
  // Uncomment this to see the frames before they're laid out, instead of
688
  // during rendering.
689
  //echo $this->_frame; flush();
690
  $this->_reflower->reflow($block);
691
  }
692
 
693
+ final function get_min_max_width() {
694
+ return $this->_reflower->get_min_max_width();
695
+ }
696
  }
dompdf/include/frame_factory.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: frame_factory.cls.php 470 2012-02-06 19:36:13Z fabien.menager $
8
  */
9
 
10
  /**
@@ -35,20 +34,32 @@ class Frame_Factory {
35
  }
36
 
37
  /**
38
- * Decorate a Frame
39
- *
40
- * @param $root Frame The frame to decorate
41
- * @param $dompdf DOMPDF The dompdf instance
 
 
 
42
  * @return Frame_Decorator
43
  * FIXME: this is admittedly a little smelly...
44
- */
45
- static function decorate_frame(Frame $frame, DOMPDF $dompdf) {
46
- if ( is_null($dompdf) )
47
- throw new Exception("foo");
48
-
 
49
  $style = $frame->get_style();
50
 
51
- switch ($style->display) {
 
 
 
 
 
 
 
 
52
 
53
  case "block":
54
  $positioner = "Block";
@@ -69,7 +80,8 @@ class Frame_Factory {
69
  $reflower = "Text";
70
  }
71
  else {
72
- if ( DOMPDF_ENABLE_CSS_FLOAT && $style->float !== "none" ) {
 
73
  $decorator = "Block";
74
  $reflower = "Block";
75
  }
@@ -119,15 +131,19 @@ class Frame_Factory {
119
  break;
120
 
121
  case "-dompdf-list-bullet":
122
- if ( $style->list_style_position === "inside" )
123
  $positioner = "Inline";
124
- else
 
125
  $positioner = "List_Bullet";
 
126
 
127
- if ( $style->list_style_image !== "none" )
128
  $decorator = "List_Bullet_Image";
129
- else
 
130
  $decorator = "List_Bullet";
 
131
 
132
  $reflower = "List_Bullet";
133
  break;
@@ -156,16 +172,17 @@ class Frame_Factory {
156
  // Handle CSS position
157
  $position = $style->position;
158
 
159
- if ( $position === "absolute" )
160
  $positioner = "Absolute";
161
-
162
- else if ( $position === "fixed" )
163
  $positioner = "Fixed";
 
164
 
165
- // Handle nodeName
166
- $node_name = $frame->get_node()->nodeName;
167
 
168
- if ( $node_name === "img" ) {
 
169
  $style->display = "-dompdf-image";
170
  $decorator = "Image";
171
  $reflower = "Image";
@@ -176,10 +193,53 @@ class Frame_Factory {
176
  $reflower .= "_Frame_Reflower";
177
 
178
  $deco = new $decorator($frame, $dompdf);
 
179
  $deco->set_positioner( new $positioner($deco) );
180
- $reflow = new $reflower($deco);
 
 
 
 
181
 
182
- $deco->set_reflower( $reflow );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
 
184
  return $deco;
185
  }
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
34
  }
35
 
36
  /**
37
+ * Decorate a Frame
38
+ *
39
+ * @param Frame $frame The frame to decorate
40
+ * @param DOMPDF $dompdf The dompdf instance
41
+ * @param Frame $root The frame to decorate
42
+ *
43
+ * @throws DOMPDF_Exception
44
  * @return Frame_Decorator
45
  * FIXME: this is admittedly a little smelly...
46
+ */
47
+ static function decorate_frame(Frame $frame, DOMPDF $dompdf, Frame $root = null) {
48
+ if ( is_null($dompdf) ) {
49
+ throw new DOMPDF_Exception("The DOMPDF argument is required");
50
+ }
51
+
52
  $style = $frame->get_style();
53
 
54
+ // Floating (and more generally out-of-flow) elements are blocks
55
+ // http://coding.smashingmagazine.com/2007/05/01/css-float-theory-things-you-should-know/
56
+ if ( !$frame->is_in_flow() && in_array($style->display, Style::$INLINE_TYPES)) {
57
+ $style->display = "block";
58
+ }
59
+
60
+ $display = $style->display;
61
+
62
+ switch ($display) {
63
 
64
  case "block":
65
  $positioner = "Block";
80
  $reflower = "Text";
81
  }
82
  else {
83
+ $enable_css_float = $dompdf->get_option("enable_css_float");
84
+ if ( $enable_css_float && $style->float !== "none" ) {
85
  $decorator = "Block";
86
  $reflower = "Block";
87
  }
131
  break;
132
 
133
  case "-dompdf-list-bullet":
134
+ if ( $style->list_style_position === "inside" ) {
135
  $positioner = "Inline";
136
+ }
137
+ else {
138
  $positioner = "List_Bullet";
139
+ }
140
 
141
+ if ( $style->list_style_image !== "none" ) {
142
  $decorator = "List_Bullet_Image";
143
+ }
144
+ else {
145
  $decorator = "List_Bullet";
146
+ }
147
 
148
  $reflower = "List_Bullet";
149
  break;
172
  // Handle CSS position
173
  $position = $style->position;
174
 
175
+ if ( $position === "absolute" ) {
176
  $positioner = "Absolute";
177
+ }
178
+ else if ( $position === "fixed" ) {
179
  $positioner = "Fixed";
180
+ }
181
 
182
+ $node = $frame->get_node();
 
183
 
184
+ // Handle nodeName
185
+ if ( $node->nodeName === "img" ) {
186
  $style->display = "-dompdf-image";
187
  $decorator = "Image";
188
  $reflower = "Image";
193
  $reflower .= "_Frame_Reflower";
194
 
195
  $deco = new $decorator($frame, $dompdf);
196
+
197
  $deco->set_positioner( new $positioner($deco) );
198
+ $deco->set_reflower( new $reflower($deco) );
199
+
200
+ if ( $root ) {
201
+ $deco->set_root($root);
202
+ }
203
 
204
+ if ( $display === "list-item" ) {
205
+ // Insert a list-bullet frame
206
+ $xml = $dompdf->get_dom();
207
+ $bullet_node = $xml->createElement("bullet"); // arbitrary choice
208
+ $b_f = new Frame($bullet_node);
209
+
210
+ $node = $frame->get_node();
211
+ $parent_node = $node->parentNode;
212
+
213
+ if ( $parent_node ) {
214
+ if ( !$parent_node->hasAttribute("dompdf-children-count") ) {
215
+ $xpath = new DOMXPath($xml);
216
+ $count = $xpath->query("li", $parent_node)->length;
217
+ $parent_node->setAttribute("dompdf-children-count", $count);
218
+ }
219
+
220
+ if ( is_numeric($node->getAttribute("value")) ) {
221
+ $index = intval($node->getAttribute("value"));
222
+ }
223
+ else {
224
+ if ( !$parent_node->hasAttribute("dompdf-counter") ) {
225
+ $index = ($parent_node->hasAttribute("start") ? $parent_node->getAttribute("start") : 1);
226
+ }
227
+ else {
228
+ $index = $parent_node->getAttribute("dompdf-counter")+1;
229
+ }
230
+ }
231
+
232
+ $parent_node->setAttribute("dompdf-counter", $index);
233
+ $bullet_node->setAttribute("dompdf-counter", $index);
234
+ }
235
+
236
+ $new_style = $dompdf->get_css()->create_style();
237
+ $new_style->display = "-dompdf-list-bullet";
238
+ $new_style->inherit($style);
239
+ $b_f->set_style($new_style);
240
+
241
+ $deco->prepend_child( Frame_Factory::decorate_frame($b_f, $dompdf, $root) );
242
+ }
243
 
244
  return $deco;
245
  }
dompdf/include/frame_reflower.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: frame_reflower.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -41,6 +40,13 @@ abstract class Frame_Reflower {
41
  clear_object($this);
42
  }
43
 
 
 
 
 
 
 
 
44
  /**
45
  * Collapse frames margins
46
  * http://www.w3.org/TR/CSS2/box.html#collapsing-margins
@@ -116,7 +122,7 @@ abstract class Frame_Reflower {
116
 
117
  //........................................................................
118
 
119
- abstract function reflow(Frame_Decorator $block = null);
120
 
121
  //........................................................................
122
 
@@ -143,8 +149,13 @@ abstract class Frame_Reflower {
143
  $delta = $style->length_in_pt($dims, $cb_w);
144
 
145
  // Handle degenerate case
146
- if ( !$this->_frame->get_first_child() )
147
- return $this->_min_max_cache = array($delta, $delta,"min" => $delta, "max" => $delta);
 
 
 
 
 
148
 
149
  $low = array();
150
  $high = array();
@@ -163,21 +174,20 @@ abstract class Frame_Reflower {
163
 
164
  $minmax = $child->get_min_max_width();
165
 
166
- if ( in_array( $iter->current()->get_style()->white_space, array("pre", "nowrap") ) )
167
  $inline_min += $minmax["min"];
168
- else
 
169
  $low[] = $minmax["min"];
 
170
 
171
  $inline_max += $minmax["max"];
172
  $iter->next();
173
 
174
  }
175
 
176
- if ( $inline_max > 0 )
177
- $high[] = $inline_max;
178
-
179
- if ( $inline_min > 0 )
180
- $low[] = $inline_min;
181
 
182
  if ( $iter->valid() ) {
183
  list($low[], $high[]) = $iter->current()->get_min_max_width();
@@ -193,10 +203,8 @@ abstract class Frame_Reflower {
193
  $width = $style->width;
194
  if ( $width !== "auto" && !is_percent($width) ) {
195
  $width = $style->length_in_pt($width, $cb_w);
196
- if ( $min < $width )
197
- $min = $width;
198
- if ( $max < $width )
199
- $max = $width;
200
  }
201
 
202
  $min += $delta;
@@ -212,9 +220,9 @@ abstract class Frame_Reflower {
212
  * @return string
213
  */
214
  protected function _parse_string($string, $single_trim = false) {
215
- if ($single_trim) {
216
- $string = preg_replace("/^[\"\']/", "", $string);
217
- $string = preg_replace("/[\"\']$/", "", $string);
218
  }
219
  else {
220
  $string = trim($string, "'\"");
@@ -224,9 +232,9 @@ abstract class Frame_Reflower {
224
  array("",'"',"'"), $string);
225
 
226
  // Convert escaped hex characters into ascii characters (e.g. \A => newline)
227
- $string = preg_replace_callback("/\\\\([0-9a-fA-F]{0,6})(\s)?(?(2)|(?=[^0-9a-fA-F]))/",
228
  create_function('$matches',
229
- 'return chr(hexdec($matches[1]));'),
230
  $string);
231
  return $string;
232
  }
@@ -239,13 +247,14 @@ abstract class Frame_Reflower {
239
  protected function _parse_quotes() {
240
 
241
  // Matches quote types
242
- $re = "/(\'[^\']*\')|(\"[^\"]*\")/";
243
 
244
  $quotes = $this->_frame->get_style()->quotes;
245
 
246
  // split on spaces, except within quotes
247
- if (!preg_match_all($re, "$quotes", $matches, PREG_SET_ORDER))
248
  return;
 
249
 
250
  $quotes_array = array();
251
  foreach($matches as &$_quote){
@@ -281,21 +290,25 @@ abstract class Frame_Reflower {
281
  $quotes = $this->_parse_quotes();
282
 
283
  // split on spaces, except within quotes
284
- if (!preg_match_all($re, $content, $matches, PREG_SET_ORDER))
285
  return;
 
286
 
287
  $text = "";
288
 
289
  foreach ($matches as $match) {
290
 
291
- if ( isset($match[2]) && $match[2] !== "" )
292
  $match[1] = $match[2];
293
-
294
- if ( isset($match[6]) && $match[6] !== "" )
 
295
  $match[4] = $match[6];
 
296
 
297
- if ( isset($match[8]) && $match[8] !== "" )
298
  $match[7] = $match[8];
 
299
 
300
  if ( isset($match[1]) && $match[1] !== "" ) {
301
 
@@ -306,8 +319,9 @@ abstract class Frame_Reflower {
306
  // http://www.w3.org/TR/CSS21/generate.html#content
307
 
308
  $i = mb_strpos($match[1], ")");
309
- if ( $i === false )
310
  continue;
 
311
 
312
  $args = explode(",", mb_substr($match[1], 8, $i - 8));
313
  $counter_id = $args[0];
@@ -315,26 +329,33 @@ abstract class Frame_Reflower {
315
  if ( $match[1][7] === "(" ) {
316
  // counter(name [,style])
317
 
318
- if ( isset($args[1]) )
319
  $type = trim($args[1]);
320
- else
 
321
  $type = null;
 
322
 
323
  $p = $this->_frame->lookup_counter_frame($counter_id);
324
 
325
  $text .= $p->counter_value($counter_id, $type);
326
 
327
- } else if ( $match[1][7] === "s" ) {
 
328
  // counters(name, string [,style])
329
- if ( isset($args[1]) )
330
  $string = $this->_parse_string(trim($args[1]));
331
- else
 
332
  $string = "";
 
333
 
334
- if ( isset($args[2]) )
335
  $type = $args[2];
336
- else
 
337
  $type = null;
 
338
 
339
  $p = $this->_frame->lookup_counter_frame($counter_id);
340
  $tmp = "";
@@ -344,40 +365,51 @@ abstract class Frame_Reflower {
344
  }
345
  $text .= $tmp;
346
 
347
- } else
 
348
  // countertops?
349
  continue;
 
350
 
351
- } else if ( isset($match[4]) && $match[4] !== "" ) {
 
352
  // String match
353
  $text .= $this->_parse_string($match[4]);
354
-
355
- } else if ( isset($match[7]) && $match[7] !== "" ) {
356
  // Directive match
357
 
358
  if ( $match[7] === "open-quote" ) {
359
  // FIXME: do something here
360
  $text .= $quotes[0][0];
361
- } else if ( $match[7] === "close-quote" ) {
 
362
  // FIXME: do something else here
363
  $text .= $quotes[0][1];
364
- } else if ( $match[7] === "no-open-quote" ) {
 
365
  // FIXME:
366
- } else if ( $match[7] === "no-close-quote" ) {
 
367
  // FIXME:
368
- } else if ( mb_strpos($match[7],"attr(") === 0 ) {
 
369
 
370
  $i = mb_strpos($match[7],")");
371
- if ( $i === false )
372
  continue;
 
373
 
374
  $attr = mb_substr($match[7], 5, $i - 5);
375
- if ( $attr == "" )
376
  continue;
 
377
 
378
  $text .= $this->_frame->get_parent()->get_node()->getAttribute($attr);
379
- } else
 
380
  continue;
 
381
  }
382
  }
383
 
@@ -390,6 +422,15 @@ abstract class Frame_Reflower {
390
  protected function _set_content(){
391
  $frame = $this->_frame;
392
  $style = $frame->get_style();
 
 
 
 
 
 
 
 
 
393
 
394
  if ( $style->content && !$frame->get_first_child() && $frame->get_node()->nodeName === "dompdf_generated" ) {
395
  $content = $this->_parse_content();
@@ -401,15 +442,8 @@ abstract class Frame_Reflower {
401
  $new_frame = new Frame($node);
402
  $new_frame->set_style($new_style);
403
 
404
- Frame_Factory::decorate_frame($new_frame, $frame->get_dompdf());
405
- $new_frame->get_decorator()->set_root($frame->get_root());
406
  $frame->append_child($new_frame);
407
  }
408
-
409
- if ( $style->counter_reset && ($reset = $style->counter_reset) !== "none" )
410
- $frame->reset_counter($reset);
411
-
412
- if ( $style->counter_increment && ($increment = $style->counter_increment) !== "none" )
413
- $frame->increment_counters($increment);
414
  }
415
  }
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
40
  clear_object($this);
41
  }
42
 
43
+ /**
44
+ * @return DOMPDF
45
+ */
46
+ function get_dompdf() {
47
+ return $this->_frame->get_dompdf();
48
+ }
49
+
50
  /**
51
  * Collapse frames margins
52
  * http://www.w3.org/TR/CSS2/box.html#collapsing-margins
122
 
123
  //........................................................................
124
 
125
+ abstract function reflow(Block_Frame_Decorator $block = null);
126
 
127
  //........................................................................
128
 
149
  $delta = $style->length_in_pt($dims, $cb_w);
150
 
151
  // Handle degenerate case
152
+ if ( !$this->_frame->get_first_child() ) {
153
+ return $this->_min_max_cache = array(
154
+ $delta, $delta,
155
+ "min" => $delta,
156
+ "max" => $delta,
157
+ );
158
+ }
159
 
160
  $low = array();
161
  $high = array();
174
 
175
  $minmax = $child->get_min_max_width();
176
 
177
+ if ( in_array( $iter->current()->get_style()->white_space, array("pre", "nowrap") ) ) {
178
  $inline_min += $minmax["min"];
179
+ }
180
+ else {
181
  $low[] = $minmax["min"];
182
+ }
183
 
184
  $inline_max += $minmax["max"];
185
  $iter->next();
186
 
187
  }
188
 
189
+ if ( $inline_max > 0 ) $high[] = $inline_max;
190
+ if ( $inline_min > 0 ) $low[] = $inline_min;
 
 
 
191
 
192
  if ( $iter->valid() ) {
193
  list($low[], $high[]) = $iter->current()->get_min_max_width();
203
  $width = $style->width;
204
  if ( $width !== "auto" && !is_percent($width) ) {
205
  $width = $style->length_in_pt($width, $cb_w);
206
+ if ( $min < $width ) $min = $width;
207
+ if ( $max < $width ) $max = $width;
 
 
208
  }
209
 
210
  $min += $delta;
220
  * @return string
221
  */
222
  protected function _parse_string($string, $single_trim = false) {
223
+ if ( $single_trim ) {
224
+ $string = preg_replace('/^[\"\']/', "", $string);
225
+ $string = preg_replace('/[\"\']$/', "", $string);
226
  }
227
  else {
228
  $string = trim($string, "'\"");
232
  array("",'"',"'"), $string);
233
 
234
  // Convert escaped hex characters into ascii characters (e.g. \A => newline)
235
+ $string = preg_replace_callback("/\\\\([0-9a-fA-F]{0,6})/",
236
  create_function('$matches',
237
+ 'return unichr(hexdec($matches[1]));'),
238
  $string);
239
  return $string;
240
  }
247
  protected function _parse_quotes() {
248
 
249
  // Matches quote types
250
+ $re = '/(\'[^\']*\')|(\"[^\"]*\")/';
251
 
252
  $quotes = $this->_frame->get_style()->quotes;
253
 
254
  // split on spaces, except within quotes
255
+ if ( !preg_match_all($re, "$quotes", $matches, PREG_SET_ORDER) ) {
256
  return;
257
+ }
258
 
259
  $quotes_array = array();
260
  foreach($matches as &$_quote){
290
  $quotes = $this->_parse_quotes();
291
 
292
  // split on spaces, except within quotes
293
+ if ( !preg_match_all($re, $content, $matches, PREG_SET_ORDER) ) {
294
  return;
295
+ }
296
 
297
  $text = "";
298
 
299
  foreach ($matches as $match) {
300
 
301
+ if ( isset($match[2]) && $match[2] !== "" ) {
302
  $match[1] = $match[2];
303
+ }
304
+
305
+ if ( isset($match[6]) && $match[6] !== "" ) {
306
  $match[4] = $match[6];
307
+ }
308
 
309
+ if ( isset($match[8]) && $match[8] !== "" ) {
310
  $match[7] = $match[8];
311
+ }
312
 
313
  if ( isset($match[1]) && $match[1] !== "" ) {
314
 
319
  // http://www.w3.org/TR/CSS21/generate.html#content
320
 
321
  $i = mb_strpos($match[1], ")");
322
+ if ( $i === false ) {
323
  continue;
324
+ }
325
 
326
  $args = explode(",", mb_substr($match[1], 8, $i - 8));
327
  $counter_id = $args[0];
329
  if ( $match[1][7] === "(" ) {
330
  // counter(name [,style])
331
 
332
+ if ( isset($args[1]) ) {
333
  $type = trim($args[1]);
334
+ }
335
+ else {
336
  $type = null;
337
+ }
338
 
339
  $p = $this->_frame->lookup_counter_frame($counter_id);
340
 
341
  $text .= $p->counter_value($counter_id, $type);
342
 
343
+ }
344
+ else if ( $match[1][7] === "s" ) {
345
  // counters(name, string [,style])
346
+ if ( isset($args[1]) ) {
347
  $string = $this->_parse_string(trim($args[1]));
348
+ }
349
+ else {
350
  $string = "";
351
+ }
352
 
353
+ if ( isset($args[2]) ) {
354
  $type = $args[2];
355
+ }
356
+ else {
357
  $type = null;
358
+ }
359
 
360
  $p = $this->_frame->lookup_counter_frame($counter_id);
361
  $tmp = "";
365
  }
366
  $text .= $tmp;
367
 
368
+ }
369
+ else {
370
  // countertops?
371
  continue;
372
+ }
373
 
374
+ }
375
+ else if ( isset($match[4]) && $match[4] !== "" ) {
376
  // String match
377
  $text .= $this->_parse_string($match[4]);
378
+ }
379
+ else if ( isset($match[7]) && $match[7] !== "" ) {
380
  // Directive match
381
 
382
  if ( $match[7] === "open-quote" ) {
383
  // FIXME: do something here
384
  $text .= $quotes[0][0];
385
+ }
386
+ else if ( $match[7] === "close-quote" ) {
387
  // FIXME: do something else here
388
  $text .= $quotes[0][1];
389
+ }
390
+ else if ( $match[7] === "no-open-quote" ) {
391
  // FIXME:
392
+ }
393
+ else if ( $match[7] === "no-close-quote" ) {
394
  // FIXME:
395
+ }
396
+ else if ( mb_strpos($match[7],"attr(") === 0 ) {
397
 
398
  $i = mb_strpos($match[7],")");
399
+ if ( $i === false ) {
400
  continue;
401
+ }
402
 
403
  $attr = mb_substr($match[7], 5, $i - 5);
404
+ if ( $attr == "" ) {
405
  continue;
406
+ }
407
 
408
  $text .= $this->_frame->get_parent()->get_node()->getAttribute($attr);
409
+ }
410
+ else {
411
  continue;
412
+ }
413
  }
414
  }
415
 
422
  protected function _set_content(){
423
  $frame = $this->_frame;
424
  $style = $frame->get_style();
425
+
426
+ if ( $style->counter_reset && ($reset = $style->counter_reset) !== "none" ) {
427
+ $vars = preg_split('/\s+/', trim($reset), 2);
428
+ $frame->reset_counter($vars[0], isset($vars[1]) ? $vars[1] : 0);
429
+ }
430
+
431
+ if ( $style->counter_increment && ($increment = $style->counter_increment) !== "none" ) {
432
+ $frame->increment_counters($increment);
433
+ }
434
 
435
  if ( $style->content && !$frame->get_first_child() && $frame->get_node()->nodeName === "dompdf_generated" ) {
436
  $content = $this->_parse_content();
442
  $new_frame = new Frame($node);
443
  $new_frame->set_style($new_style);
444
 
445
+ Frame_Factory::decorate_frame($new_frame, $frame->get_dompdf(), $frame->get_root());
 
446
  $frame->append_child($new_frame);
447
  }
 
 
 
 
 
 
448
  }
449
  }
dompdf/include/frame_tree.cls.php CHANGED
@@ -4,14 +4,13 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: frame_tree.cls.php 464 2012-01-30 20:44:53Z fabien.menager $
8
  */
9
 
10
  /**
11
  * Represents an entire document as a tree of frames
12
  *
13
  * The Frame_Tree consists of {@link Frame} objects each tied to specific
14
- * DomNode objects in a specific DomDocument. The Frame_Tree has the same
15
  * structure as the DomDocument, but adds additional capabalities for
16
  * styling and layout.
17
  *
@@ -51,7 +50,7 @@ class Frame_Tree {
51
  protected $_absolute_frames;
52
 
53
  /**
54
- * A mapping of {@link Frame} objects to DomNode objects
55
  *
56
  * @var array
57
  */
@@ -76,16 +75,20 @@ class Frame_Tree {
76
  /**
77
  * Returns the DomDocument object representing the curent html document
78
  *
79
- * @return DomDocument
80
  */
81
- function get_dom() { return $this->_dom; }
 
 
82
 
83
  /**
84
  * Returns the root frame of the tree
85
  *
86
  * @return Page_Frame_Decorator
87
  */
88
- function get_root() { return $this->_root; }
 
 
89
 
90
  /**
91
  * Returns a specific frame given its id
@@ -93,30 +96,35 @@ class Frame_Tree {
93
  * @param string $id
94
  * @return Frame
95
  */
96
- function get_frame($id) { return isset($this->_registry[$id]) ? $this->_registry[$id] : null; }
 
 
97
 
98
  /**
99
  * Returns a post-order iterator for all frames in the tree
100
  *
101
- * @return FrameTreeList
102
  */
103
- function get_frames() { return new FrameTreeList($this->_root); }
 
 
104
 
105
  /**
106
  * Builds the tree
107
  */
108
  function build_tree() {
109
  $html = $this->_dom->getElementsByTagName("html")->item(0);
110
- if ( is_null($html) )
111
  $html = $this->_dom->firstChild;
 
112
 
113
- if ( is_null($html) )
114
  throw new DOMPDF_Exception("Requested HTML document contains no data.");
 
115
 
116
  $this->fix_tables();
117
 
118
  $this->_root = $this->_build_tree_r($html);
119
-
120
  }
121
 
122
  /**
@@ -149,17 +157,18 @@ class Frame_Tree {
149
  * tree may be adjusted (i.e. nodes and frames for generated content
150
  * and images may be created).
151
  *
152
- * @param DomNode $node the current DomNode being considered
153
  * @return Frame
154
  */
155
- protected function _build_tree_r(DomNode $node) {
156
 
157
  $frame = new Frame($node);
158
  $id = $frame->get_id();
159
  $this->_registry[ $id ] = $frame;
160
 
161
- if ( !$node->hasChildNodes() )
162
  return $frame;
 
163
 
164
  // Fixes 'cannot access undefined property for object with
165
  // overloaded access', fix by Stefan radulian
@@ -168,17 +177,19 @@ class Frame_Tree {
168
 
169
  // Store the children in an array so that the tree can be modified
170
  $children = array();
171
- for ($i = 0; $i < $node->childNodes->length; $i++)
172
  $children[] = $node->childNodes->item($i);
 
173
 
174
  foreach ($children as $child) {
175
  $node_name = mb_strtolower($child->nodeName);
176
 
177
  // Skip non-displaying nodes
178
  if ( in_array($node_name, self::$_HIDDEN_TAGS) ) {
179
- if ( $node_name !== "head" &&
180
- $node_name !== "style" )
181
  $child->parentNode->removeChild($child);
 
 
182
  continue;
183
  }
184
 
@@ -201,10 +212,12 @@ class Frame_Tree {
201
  }
202
 
203
  public function insert_node(DOMNode $node, DOMNode $new_node, $pos) {
204
- if ($pos === "after" || !$node->firstChild)
205
  $node->appendChild($new_node);
206
- else
 
207
  $node->insertBefore($new_node, $node->firstChild);
 
208
 
209
  $this->_build_tree_r($new_node);
210
 
@@ -214,10 +227,12 @@ class Frame_Tree {
214
  $parent_id = $node->getAttribute("frame_id");
215
  $parent = $this->get_frame($parent_id);
216
 
217
- if ($pos === "before")
218
  $parent->prepend_child($frame, false);
219
- else
 
220
  $parent->append_child($frame, false);
 
221
 
222
  return $frame_id;
223
  }
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
10
  * Represents an entire document as a tree of frames
11
  *
12
  * The Frame_Tree consists of {@link Frame} objects each tied to specific
13
+ * DOMNode objects in a specific DomDocument. The Frame_Tree has the same
14
  * structure as the DomDocument, but adds additional capabalities for
15
  * styling and layout.
16
  *
50
  protected $_absolute_frames;
51
 
52
  /**
53
+ * A mapping of {@link Frame} objects to DOMNode objects
54
  *
55
  * @var array
56
  */
75
  /**
76
  * Returns the DomDocument object representing the curent html document
77
  *
78
+ * @return DOMDocument
79
  */
80
+ function get_dom() {
81
+ return $this->_dom;
82
+ }
83
 
84
  /**
85
  * Returns the root frame of the tree
86
  *
87
  * @return Page_Frame_Decorator
88
  */
89
+ function get_root() {
90
+ return $this->_root;
91
+ }
92
 
93
  /**
94
  * Returns a specific frame given its id
96
  * @param string $id
97
  * @return Frame
98
  */
99
+ function get_frame($id) {
100
+ return isset($this->_registry[$id]) ? $this->_registry[$id] : null;
101
+ }
102
 
103
  /**
104
  * Returns a post-order iterator for all frames in the tree
105
  *
106
+ * @return FrameTreeList|Frame[]
107
  */
108
+ function get_frames() {
109
+ return new FrameTreeList($this->_root);
110
+ }
111
 
112
  /**
113
  * Builds the tree
114
  */
115
  function build_tree() {
116
  $html = $this->_dom->getElementsByTagName("html")->item(0);
117
+ if ( is_null($html) ) {
118
  $html = $this->_dom->firstChild;
119
+ }
120
 
121
+ if ( is_null($html) ) {
122
  throw new DOMPDF_Exception("Requested HTML document contains no data.");
123
+ }
124
 
125
  $this->fix_tables();
126
 
127
  $this->_root = $this->_build_tree_r($html);
 
128
  }
129
 
130
  /**
157
  * tree may be adjusted (i.e. nodes and frames for generated content
158
  * and images may be created).
159
  *
160
+ * @param DOMNode $node the current DOMNode being considered
161
  * @return Frame
162
  */
163
+ protected function _build_tree_r(DOMNode $node) {
164
 
165
  $frame = new Frame($node);
166
  $id = $frame->get_id();
167
  $this->_registry[ $id ] = $frame;
168
 
169
+ if ( !$node->hasChildNodes() ) {
170
  return $frame;
171
+ }
172
 
173
  // Fixes 'cannot access undefined property for object with
174
  // overloaded access', fix by Stefan radulian
177
 
178
  // Store the children in an array so that the tree can be modified
179
  $children = array();
180
+ for ($i = 0; $i < $node->childNodes->length; $i++) {
181
  $children[] = $node->childNodes->item($i);
182
+ }
183
 
184
  foreach ($children as $child) {
185
  $node_name = mb_strtolower($child->nodeName);
186
 
187
  // Skip non-displaying nodes
188
  if ( in_array($node_name, self::$_HIDDEN_TAGS) ) {
189
+ if ( $node_name !== "head" && $node_name !== "style" ) {
 
190
  $child->parentNode->removeChild($child);
191
+ }
192
+
193
  continue;
194
  }
195
 
212
  }
213
 
214
  public function insert_node(DOMNode $node, DOMNode $new_node, $pos) {
215
+ if ( $pos === "after" || !$node->firstChild ) {
216
  $node->appendChild($new_node);
217
+ }
218
+ else {
219
  $node->insertBefore($new_node, $node->firstChild);
220
+ }
221
 
222
  $this->_build_tree_r($new_node);
223
 
227
  $parent_id = $node->getAttribute("frame_id");
228
  $parent = $this->get_frame($parent_id);
229
 
230
+ if ( $pos === "before" ) {
231
  $parent->prepend_child($frame, false);
232
+ }
233
+ else {
234
  $parent->append_child($frame, false);
235
+ }
236
 
237
  return $frame_id;
238
  }
dompdf/include/functions.inc.php CHANGED
@@ -4,9 +4,8 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
- * @author Fabien M�nager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
9
- * @version $Id: functions.inc.php 448 2011-11-13 13:00:03Z fabien.menager $
10
  */
11
 
12
  if ( !defined('PHP_VERSION_ID') ) {
@@ -15,7 +14,7 @@ if ( !defined('PHP_VERSION_ID') ) {
15
  }
16
 
17
  function def($name, $value = true) {
18
- if (!defined($name)) {
19
  define($name, $value);
20
  }
21
  }
@@ -24,26 +23,32 @@ if ( !function_exists("pre_r") ) {
24
  /**
25
  * print_r wrapper for html/cli output
26
  *
27
- * Wraps print_r() output in < pre > tags if the current sapi is not
28
- * 'cli'. Returns the output string instead of displaying it if $return is
29
- * true.
30
  *
31
  * @param mixed $mixed variable or expression to display
32
  * @param bool $return
33
  *
 
34
  */
35
  function pre_r($mixed, $return = false) {
36
- if ($return)
37
  return "<pre>" . print_r($mixed, true) . "</pre>";
 
38
 
39
- if ( php_sapi_name() !== "cli")
40
- echo ("<pre>");
 
 
41
  print_r($mixed);
42
 
43
- if ( php_sapi_name() !== "cli")
44
- echo("</pre>");
45
- else
46
- echo ("\n");
 
 
 
47
  flush();
48
 
49
  }
@@ -53,19 +58,20 @@ if ( !function_exists("pre_var_dump") ) {
53
  /**
54
  * var_dump wrapper for html/cli output
55
  *
56
- * Wraps var_dump() output in < pre > tags if the current sapi is not
57
- * 'cli'.
58
  *
59
  * @param mixed $mixed variable or expression to display.
60
  */
61
  function pre_var_dump($mixed) {
62
- if ( php_sapi_name() !== "cli")
63
- echo("<pre>");
 
64
 
65
  var_dump($mixed);
66
 
67
- if ( php_sapi_name() !== "cli")
68
- echo("</pre>");
 
69
  }
70
  }
71
 
@@ -78,11 +84,12 @@ if ( !function_exists("d") ) {
78
  * @param mixed $mixed variable or expression to display.
79
  */
80
  function d($mixed) {
81
- if ( php_sapi_name() !== "cli")
82
- echo("<pre>");
 
83
 
84
  // line
85
- if ($mixed instanceof Line_Box) {
86
  echo $mixed;
87
  }
88
 
@@ -91,8 +98,9 @@ function d($mixed) {
91
  var_export($mixed);
92
  }
93
 
94
- if ( php_sapi_name() !== "cli")
95
- echo("</pre>");
 
96
  }
97
  }
98
 
@@ -120,22 +128,23 @@ function build_url($protocol, $host, $base_path, $url) {
120
  }
121
 
122
  // Is the url already fully qualified or a Data URI?
123
- if ( mb_strpos($url, "://") !== false || mb_strpos($url, "data:") === 0 )
124
  return $url;
 
125
 
126
  $ret = $protocol;
127
 
128
- if (!in_array(mb_strtolower($protocol), array("http://", "https://", "ftp://", "ftps://"))) {
129
  //On Windows local file, an abs path can begin also with a '\' or a drive letter and colon
130
  //drive: followed by a relative path would be a drive specific default folder.
131
  //not known in php app code, treat as abs path
132
  //($url[1] !== ':' || ($url[2]!=='\\' && $url[2]!=='/'))
133
- if ($url[0] !== '/' && (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' || ($url[0] !== '\\' && $url[1] !== ':'))) {
134
  // For rel path and local acess we ignore the host, and run the path through realpath()
135
  $ret .= realpath($base_path).'/';
136
  }
137
  $ret .= $url;
138
- $ret = preg_replace("/\?(.*)$/", "", $ret);
139
  return $ret;
140
  }
141
 
@@ -143,7 +152,8 @@ function build_url($protocol, $host, $base_path, $url) {
143
  if ( $url[0] === '/' || $url[0] === '\\' ) {
144
  // Absolute path
145
  $ret .= $host . $url;
146
- } else {
 
147
  // Relative path
148
  //$base_path = $base_path !== "" ? rtrim($base_path, "/\\") . "/" : "";
149
  $ret .= $host . $base_path . $url;
@@ -168,49 +178,55 @@ function explode_url($url) {
168
 
169
  $arr = parse_url($url);
170
 
171
- if ( isset($arr["scheme"]) &&
172
- $arr["scheme"] !== "file" &&
173
- strlen($arr["scheme"]) > 1 ) // Exclude windows drive letters...
174
- {
175
  $protocol = $arr["scheme"] . "://";
176
 
177
  if ( isset($arr["user"]) ) {
178
  $host .= $arr["user"];
179
 
180
- if ( isset($arr["pass"]) )
181
- $host .= "@" . $arr["pass"];
 
182
 
183
- $host .= ":";
184
  }
185
 
186
- if ( isset($arr["host"]) )
187
  $host .= $arr["host"];
 
188
 
189
- if ( isset($arr["port"]) )
190
  $host .= ":" . $arr["port"];
 
191
 
192
  if ( isset($arr["path"]) && $arr["path"] !== "" ) {
193
  // Do we have a trailing slash?
194
  if ( $arr["path"][ mb_strlen($arr["path"]) - 1 ] === "/" ) {
195
  $path = $arr["path"];
196
  $file = "";
197
- } else {
 
198
  $path = rtrim(dirname($arr["path"]), '/\\') . "/";
199
  $file = basename($arr["path"]);
200
  }
201
  }
202
 
203
- if ( isset($arr["query"]) )
204
  $file .= "?" . $arr["query"];
 
205
 
206
- if ( isset($arr["fragment"]) )
207
  $file .= "#" . $arr["fragment"];
 
208
 
209
- } else {
 
210
 
211
  $i = mb_strpos($url, "file://");
212
- if ( $i !== false)
213
  $url = mb_substr($url, $i + 7);
 
214
 
215
  $protocol = ""; // "file://"; ? why doesn't this work... It's because of
216
  // network filenames like //COMPU/SHARENAME
@@ -224,7 +240,8 @@ function explode_url($url) {
224
  if ( $path !== false ) {
225
  $path .= '/';
226
 
227
- } else {
 
228
  // generate a url to access the file if no real path found.
229
  $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
230
 
@@ -232,7 +249,8 @@ function explode_url($url) {
232
 
233
  if ( substr($arr["path"], 0, 1) === '/' ) {
234
  $path = dirname($arr["path"]);
235
- } else {
 
236
  $path = '/' . rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/') . '/' . $arr["path"];
237
  }
238
  }
@@ -247,26 +265,27 @@ function explode_url($url) {
247
  }
248
 
249
  /**
250
- * converts decimal numbers to roman numerals
251
  *
252
  * @param int $num
 
 
253
  * @return string
254
  */
255
  function dec2roman($num) {
256
 
257
- static $ones = array("", "i", "ii", "iii", "iv", "v",
258
- "vi", "vii", "viii", "ix");
259
- static $tens = array("", "x", "xx", "xxx", "xl", "l",
260
- "lx", "lxx", "lxxx", "xc");
261
- static $hund = array("", "c", "cc", "ccc", "cd", "d",
262
- "dc", "dcc", "dccc", "cm");
263
  static $thou = array("", "m", "mm", "mmm");
264
 
265
- if ( !is_numeric($num) )
266
  throw new DOMPDF_Exception("dec2roman() requires a numeric argument.");
 
267
 
268
- if ( $num > 4000 || $num < 0 )
269
  return "(out of range)";
 
270
 
271
  $num = strrev((string)$num);
272
 
@@ -278,22 +297,27 @@ function dec2roman($num) {
278
  case 1: $ret .= $ones[$num[0]];
279
  default: break;
280
  }
 
281
  return $ret;
282
-
283
  }
284
 
285
  /**
286
  * Determines whether $value is a percentage or not
287
  *
288
  * @param float $value
 
289
  * @return bool
290
  */
291
- function is_percent($value) { return false !== mb_strpos($value, "%"); }
 
 
292
 
293
  /**
294
  * Parses a data URI scheme
295
  * http://en.wikipedia.org/wiki/Data_URI_scheme
 
296
  * @param string $data_uri The data URI to parse
 
297
  * @return array The result with charset, mime type and decoded data
298
  */
299
  function parse_data_uri($data_uri) {
@@ -315,7 +339,6 @@ function parse_data_uri($data_uri) {
315
  * mb_string compatibility
316
  */
317
  if ( !function_exists("mb_strlen") ) {
318
-
319
  define('MB_OVERLOAD_MAIL', 1);
320
  define('MB_OVERLOAD_STRING', 2);
321
  define('MB_OVERLOAD_REGEX', 4);
@@ -326,9 +349,9 @@ if ( !function_exists("mb_strlen") ) {
326
  function mb_convert_encoding($data, $to_encoding, $from_encoding = 'UTF-8') {
327
  if (str_replace('-', '', strtolower($to_encoding)) === 'utf8') {
328
  return utf8_encode($data);
329
- } else {
330
- return utf8_decode($data);
331
  }
 
 
332
  }
333
 
334
  function mb_detect_encoding($data, $encoding_list = array('iso-8859-1'), $strict = false) {
@@ -342,9 +365,9 @@ if ( !function_exists("mb_strlen") ) {
342
  function mb_internal_encoding($encoding = null) {
343
  if (isset($encoding)) {
344
  return true;
345
- } else {
346
- return 'iso-8859-1';
347
  }
 
 
348
  }
349
 
350
  function mb_strlen($str, $encoding = 'iso-8859-1') {
@@ -372,10 +395,11 @@ if ( !function_exists("mb_strlen") ) {
372
  }
373
 
374
  function mb_substr($string, $start, $length = null, $encoding = 'iso-8859-1') {
375
- if ( is_null($length) )
376
  return substr($string, $start);
377
- else
378
- return substr($string, $start, $length);
 
379
  }
380
 
381
  function mb_substr_count($haystack, $needle, $encoding = 'iso-8859-1') {
@@ -407,6 +431,11 @@ if ( !function_exists("mb_strlen") ) {
407
  /**
408
  * Decoder for RLE8 compression in windows bitmaps
409
  * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp
 
 
 
 
 
410
  */
411
  function rle8_decode ($str, $width){
412
  $lineWidth = $width + (3 - ($width-1) % 4);
@@ -447,12 +476,18 @@ function rle8_decode ($str, $width){
447
  /**
448
  * Decoder for RLE4 compression in windows bitmaps
449
  * see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp
 
 
 
 
 
450
  */
451
  function rle4_decode ($str, $width) {
452
  $w = floor($width/2) + ($width % 2);
453
  $lineWidth = $w + (3 - ( ($width-1) / 2) % 4);
454
  $pixels = array();
455
  $cnt = strlen($str);
 
456
 
457
  for ($i = 0; $i < $cnt; $i++) {
458
  $o = ord($str[$i]);
@@ -461,41 +496,53 @@ function rle4_decode ($str, $width) {
461
  $i++;
462
  switch (ord($str[$i])){
463
  case 0: # NEW LINE
464
- while (count($pixels)%$lineWidth!=0)
465
- $pixels[]=0;
 
466
  break;
467
  case 1: # END OF FILE
468
- while (count($pixels)%$lineWidth!=0)
469
- $pixels[]=0;
 
470
  break 3;
471
  case 2: # DELTA
472
  $i += 2;
473
  break;
474
  default: # ABSOLUTE MODE
475
  $num = ord($str[$i]);
476
- for ($j = 0; $j < $num; $j++){
477
- if ($j%2 == 0){
478
  $c = ord($str[++$i]);
479
  $pixels[] = ($c & 240)>>4;
480
- } else
 
481
  $pixels[] = $c & 15;
 
 
 
 
 
482
  }
483
- if ($num % 2 == 0) $i++;
484
  }
485
  break;
486
  default:
487
  $c = ord($str[++$i]);
488
- for ($j = 0; $j < $o; $j++)
489
  $pixels[] = ($j%2==0 ? ($c & 240)>>4 : $c & 15);
 
490
  }
491
  }
492
 
493
  $out = '';
494
- if (count($pixels)%2) $pixels[]=0;
 
 
 
495
  $cnt = count($pixels)/2;
496
 
497
- for ($i = 0; $i < $cnt; $i++)
498
  $out .= chr(16*$pixels[2*$i] + $pixels[2*$i+1]);
 
499
 
500
  return $out;
501
  }
@@ -508,7 +555,6 @@ if ( !function_exists("imagecreatefrombmp") ) {
508
  * Modified by Fabien Menager to support RGB555 BMP format
509
  */
510
  function imagecreatefrombmp($filename) {
511
- try {
512
  // version 1.00
513
  if (!($fh = fopen($filename, 'rb'))) {
514
  trigger_error('imagecreatefrombmp: Can not open ' . $filename, E_USER_WARNING);
@@ -611,10 +657,12 @@ function imagecreatefrombmp($filename) {
611
  }
612
  $color = unpack('v', $part);
613
 
614
- if (empty($meta['rMask']) || $meta['rMask'] != 0xf800)
615
  $color[1] = (($color[1] & 0x7c00) >> 7) * 65536 + (($color[1] & 0x03e0) >> 2) * 256 + (($color[1] & 0x001f) << 3); // 555
616
- else
 
617
  $color[1] = (($color[1] & 0xf800) >> 8) * 65536 + (($color[1] & 0x07e0) >> 3) * 256 + (($color[1] & 0x001f) << 3); // 565
 
618
  break;
619
  case 8:
620
  $color = unpack('n', $vide . substr($data, $p, 1));
@@ -652,7 +700,6 @@ function imagecreatefrombmp($filename) {
652
  }
653
  fclose($fh);
654
  return $im;
655
- } catch (Exception $e) {var_dump($e);}
656
  }
657
  }
658
 
@@ -688,11 +735,12 @@ function dompdf_getimagesize($filename) {
688
  /**
689
  * Converts a CMYK color to RGB
690
  *
691
- * @param int $c
692
- * @param int $m
693
- * @param int $y
694
- * @param int $k
695
- * @return object
 
696
  */
697
  function cmyk_to_rgb($c, $m = null, $y = null, $k = null) {
698
  if (is_array($c)) {
@@ -708,9 +756,9 @@ function cmyk_to_rgb($c, $m = null, $y = null, $k = null) {
708
  $g = (1 - round(2.55 * ($m+$k))) ;
709
  $b = (1 - round(2.55 * ($y+$k))) ;
710
 
711
- if($r<0) $r = 0;
712
- if($g<0) $g = 0;
713
- if($b<0) $b = 0;
714
 
715
  return array(
716
  $r, $g, $b,
@@ -721,12 +769,15 @@ function cmyk_to_rgb($c, $m = null, $y = null, $k = null) {
721
  function unichr($c) {
722
  if ($c <= 0x7F) {
723
  return chr($c);
724
- } else if ($c <= 0x7FF) {
 
725
  return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F);
726
- } else if ($c <= 0xFFFF) {
 
727
  return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F)
728
  . chr(0x80 | $c & 0x3F);
729
- } else if ($c <= 0x10FFFF) {
 
730
  return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F)
731
  . chr(0x80 | $c >> 6 & 0x3F)
732
  . chr(0x80 | $c & 0x3F);
@@ -746,29 +797,32 @@ if ( !function_exists("date_default_timezone_get") ) {
746
 
747
  /**
748
  * Stores warnings in an array for display later
749
- *
750
  * This function allows warnings generated by the DomDocument parser
751
  * and CSS loader ({@link Stylesheet}) to be captured and displayed
752
  * later. Without this function, errors are displayed immediately and
753
  * PDF streaming is impossible.
754
- *
755
  * @see http://www.php.net/manual/en/function.set-error_handler.php
756
  *
757
- * @param int $errno
758
  * @param string $errstr
759
  * @param string $errfile
760
  * @param string $errline
 
 
761
  */
762
  function record_warnings($errno, $errstr, $errfile, $errline) {
763
 
764
- if ( !($errno & (E_WARNING | E_NOTICE | E_USER_NOTICE | E_USER_WARNING )) ) // Not a warning or notice
 
765
  throw new DOMPDF_Exception($errstr . " $errno");
 
766
 
767
  global $_dompdf_warnings;
768
  global $_dompdf_show_warnings;
769
 
770
- if ( $_dompdf_show_warnings )
771
  echo $errstr . "\n";
 
772
 
773
  $_dompdf_warnings[] = $errstr;
774
  }
@@ -777,8 +831,9 @@ function record_warnings($errno, $errstr, $errfile, $errline) {
777
  * Print a useful backtrace
778
  */
779
  function bt() {
780
- if ( php_sapi_name() !== "cli")
781
- echo("<pre>");
 
782
 
783
  $bt = debug_backtrace();
784
 
@@ -790,7 +845,8 @@ function bt() {
790
  $file = basename($call["file"]) . " (" . $call["line"] . ")";
791
  if ( isset($call["class"]) ) {
792
  $func = $call["class"] . "->" . $call["function"] . "()";
793
- } else {
 
794
  $func = $call["function"] . "()";
795
  }
796
 
@@ -799,14 +855,16 @@ function bt() {
799
  }
800
  echo "\n";
801
 
802
- if ( php_sapi_name() !== "cli")
803
- echo("</pre>");
 
804
  }
805
 
806
  /**
807
  * Print debug messages
808
  *
809
- * @param string $type The type of debug messages to print
 
810
  */
811
  function dompdf_debug($type, $msg) {
812
  global $_DOMPDF_DEBUG_TYPES, $_dompdf_show_warnings, $_dompdf_debug;
@@ -824,19 +882,19 @@ if ( !function_exists("print_memusage") ) {
824
  */
825
  function print_memusage() {
826
  global $memusage;
827
- echo ("Memory Usage\n");
828
  $prev = 0;
829
  $initial = reset($memusage);
830
- echo (str_pad("Initial:", 40) . $initial . "\n\n");
831
 
832
  foreach ($memusage as $key=>$mem) {
833
  $mem -= $initial;
834
- echo (str_pad("$key:" , 40));
835
- echo (str_pad("$mem", 12) . "(diff: " . ($mem - $prev) . ")\n");
836
  $prev = $mem;
837
  }
838
 
839
- echo ("\n" . str_pad("Total:", 40) . memory_get_usage()) . "\n";
840
  }
841
  }
842
 
@@ -845,9 +903,9 @@ if ( !function_exists("enable_mem_profile") ) {
845
  * Initialize memory profiling code
846
  */
847
  function enable_mem_profile() {
848
- global $memusage;
849
- $memusage = array("Startup" => memory_get_usage());
850
- register_shutdown_function("print_memusage");
851
  }
852
  }
853
 
@@ -859,8 +917,9 @@ if ( !function_exists("mark_memusage") ) {
859
  */
860
  function mark_memusage($location) {
861
  global $memusage;
862
- if ( isset($memusage) )
863
  $memusage[$location] = memory_get_usage();
 
864
  }
865
  }
866
 
@@ -871,13 +930,22 @@ if ( !function_exists('sys_get_temp_dir')) {
871
  * @link http://us.php.net/manual/en/function.sys-get-temp-dir.php#85261
872
  */
873
  function sys_get_temp_dir() {
874
- if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); }
875
- if (!empty($_ENV['TMPDIR'])) { return realpath( $_ENV['TMPDIR']); }
876
- if (!empty($_ENV['TEMP'])) { return realpath( $_ENV['TEMP']); }
877
- $tempfile=tempnam(uniqid(rand(),TRUE),'');
 
 
 
 
 
 
 
 
 
878
  if (file_exists($tempfile)) {
879
- unlink($tempfile);
880
- return realpath(dirname($tempfile));
881
  }
882
  }
883
  }
@@ -903,8 +971,8 @@ if ( function_exists("curl_init") ) {
903
  $ch = curl_init($url);
904
  curl_setopt($ch, CURLOPT_TIMEOUT, 10);
905
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
906
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
907
- curl_setopt($ch, CURLOPT_HEADER, TRUE);
908
 
909
  $data = curl_exec($ch);
910
  $raw_headers = substr($data, 0, curl_getinfo($ch, CURLINFO_HEADER_SIZE));
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
+ * @author Fabien Ménager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
9
  */
10
 
11
  if ( !defined('PHP_VERSION_ID') ) {
14
  }
15
 
16
  function def($name, $value = true) {
17
+ if ( !defined($name) ) {
18
  define($name, $value);
19
  }
20
  }
23
  /**
24
  * print_r wrapper for html/cli output
25
  *
26
+ * Wraps print_r() output in < pre > tags if the current sapi is not 'cli'.
27
+ * Returns the output string instead of displaying it if $return is true.
 
28
  *
29
  * @param mixed $mixed variable or expression to display
30
  * @param bool $return
31
  *
32
+ * @return string
33
  */
34
  function pre_r($mixed, $return = false) {
35
+ if ( $return ) {
36
  return "<pre>" . print_r($mixed, true) . "</pre>";
37
+ }
38
 
39
+ if ( php_sapi_name() !== "cli" ) {
40
+ echo "<pre>";
41
+ }
42
+
43
  print_r($mixed);
44
 
45
+ if ( php_sapi_name() !== "cli" ) {
46
+ echo "</pre>";
47
+ }
48
+ else {
49
+ echo "\n";
50
+ }
51
+
52
  flush();
53
 
54
  }
58
  /**
59
  * var_dump wrapper for html/cli output
60
  *
61
+ * Wraps var_dump() output in < pre > tags if the current sapi is not 'cli'.
 
62
  *
63
  * @param mixed $mixed variable or expression to display.
64
  */
65
  function pre_var_dump($mixed) {
66
+ if ( php_sapi_name() !== "cli" ) {
67
+ echo "<pre>";
68
+ }
69
 
70
  var_dump($mixed);
71
 
72
+ if ( php_sapi_name() !== "cli" ) {
73
+ echo "</pre>";
74
+ }
75
  }
76
  }
77
 
84
  * @param mixed $mixed variable or expression to display.
85
  */
86
  function d($mixed) {
87
+ if ( php_sapi_name() !== "cli" ) {
88
+ echo "<pre>";
89
+ }
90
 
91
  // line
92
+ if ( $mixed instanceof Line_Box ) {
93
  echo $mixed;
94
  }
95
 
98
  var_export($mixed);
99
  }
100
 
101
+ if ( php_sapi_name() !== "cli" ) {
102
+ echo "</pre>";
103
+ }
104
  }
105
  }
106
 
128
  }
129
 
130
  // Is the url already fully qualified or a Data URI?
131
+ if ( mb_strpos($url, "://") !== false || mb_strpos($url, "data:") === 0 ) {
132
  return $url;
133
+ }
134
 
135
  $ret = $protocol;
136
 
137
+ if ( !in_array(mb_strtolower($protocol), array("http://", "https://", "ftp://", "ftps://")) ) {
138
  //On Windows local file, an abs path can begin also with a '\' or a drive letter and colon
139
  //drive: followed by a relative path would be a drive specific default folder.
140
  //not known in php app code, treat as abs path
141
  //($url[1] !== ':' || ($url[2]!=='\\' && $url[2]!=='/'))
142
+ if ( $url[0] !== '/' && (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' || ($url[0] !== '\\' && $url[1] !== ':')) ) {
143
  // For rel path and local acess we ignore the host, and run the path through realpath()
144
  $ret .= realpath($base_path).'/';
145
  }
146
  $ret .= $url;
147
+ $ret = preg_replace('/\?(.*)$/', "", $ret);
148
  return $ret;
149
  }
150
 
152
  if ( $url[0] === '/' || $url[0] === '\\' ) {
153
  // Absolute path
154
  $ret .= $host . $url;
155
+ }
156
+ else {
157
  // Relative path
158
  //$base_path = $base_path !== "" ? rtrim($base_path, "/\\") . "/" : "";
159
  $ret .= $host . $base_path . $url;
178
 
179
  $arr = parse_url($url);
180
 
181
+ // Exclude windows drive letters...
182
+ if ( isset($arr["scheme"]) && $arr["scheme"] !== "file" && strlen($arr["scheme"]) > 1 ) {
 
 
183
  $protocol = $arr["scheme"] . "://";
184
 
185
  if ( isset($arr["user"]) ) {
186
  $host .= $arr["user"];
187
 
188
+ if ( isset($arr["pass"]) ) {
189
+ $host .= ":" . $arr["pass"];
190
+ }
191
 
192
+ $host .= "@";
193
  }
194
 
195
+ if ( isset($arr["host"]) ) {
196
  $host .= $arr["host"];
197
+ }
198
 
199
+ if ( isset($arr["port"]) ) {
200
  $host .= ":" . $arr["port"];
201
+ }
202
 
203
  if ( isset($arr["path"]) && $arr["path"] !== "" ) {
204
  // Do we have a trailing slash?
205
  if ( $arr["path"][ mb_strlen($arr["path"]) - 1 ] === "/" ) {
206
  $path = $arr["path"];
207
  $file = "";
208
+ }
209
+ else {
210
  $path = rtrim(dirname($arr["path"]), '/\\') . "/";
211
  $file = basename($arr["path"]);
212
  }
213
  }
214
 
215
+ if ( isset($arr["query"]) ) {
216
  $file .= "?" . $arr["query"];
217
+ }
218
 
219
+ if ( isset($arr["fragment"]) ) {
220
  $file .= "#" . $arr["fragment"];
221
+ }
222
 
223
+ }
224
+ else {
225
 
226
  $i = mb_strpos($url, "file://");
227
+ if ( $i !== false ) {
228
  $url = mb_substr($url, $i + 7);
229
+ }
230
 
231
  $protocol = ""; // "file://"; ? why doesn't this work... It's because of
232
  // network filenames like //COMPU/SHARENAME
240
  if ( $path !== false ) {
241
  $path .= '/';
242
 
243
+ }
244
+ else {
245
  // generate a url to access the file if no real path found.
246
  $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
247
 
249
 
250
  if ( substr($arr["path"], 0, 1) === '/' ) {
251
  $path = dirname($arr["path"]);
252
+ }
253
+ else {
254
  $path = '/' . rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/') . '/' . $arr["path"];
255
  }
256
  }
265
  }
266
 
267
  /**
268
+ * Converts decimal numbers to roman numerals
269
  *
270
  * @param int $num
271
+ *
272
+ * @throws DOMPDF_Exception
273
  * @return string
274
  */
275
  function dec2roman($num) {
276
 
277
+ static $ones = array("", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix");
278
+ static $tens = array("", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc");
279
+ static $hund = array("", "c", "cc", "ccc", "cd", "d", "dc", "dcc", "dccc", "cm");
 
 
 
280
  static $thou = array("", "m", "mm", "mmm");
281
 
282
+ if ( !is_numeric($num) ) {
283
  throw new DOMPDF_Exception("dec2roman() requires a numeric argument.");
284
+ }
285
 
286
+ if ( $num > 4000 || $num < 0 ) {
287
  return "(out of range)";
288
+ }
289
 
290
  $num = strrev((string)$num);
291
 
297
  case 1: $ret .= $ones[$num[0]];
298
  default: break;
299
  }
300
+
301
  return $ret;
 
302
  }
303
 
304
  /**
305
  * Determines whether $value is a percentage or not
306
  *
307
  * @param float $value
308
+ *
309
  * @return bool
310
  */
311
+ function is_percent($value) {
312
+ return false !== mb_strpos($value, "%");
313
+ }
314
 
315
  /**
316
  * Parses a data URI scheme
317
  * http://en.wikipedia.org/wiki/Data_URI_scheme
318
+ *
319
  * @param string $data_uri The data URI to parse
320
+ *
321
  * @return array The result with charset, mime type and decoded data
322
  */
323
  function parse_data_uri($data_uri) {
339
  * mb_string compatibility
340
  */
341
  if ( !function_exists("mb_strlen") ) {
 
342
  define('MB_OVERLOAD_MAIL', 1);
343
  define('MB_OVERLOAD_STRING', 2);
344
  define('MB_OVERLOAD_REGEX', 4);
349
  function mb_convert_encoding($data, $to_encoding, $from_encoding = 'UTF-8') {
350
  if (str_replace('-', '', strtolower($to_encoding)) === 'utf8') {
351
  return utf8_encode($data);
 
 
352
  }
353
+
354
+ return utf8_decode($data);
355
  }
356
 
357
  function mb_detect_encoding($data, $encoding_list = array('iso-8859-1'), $strict = false) {
365
  function mb_internal_encoding($encoding = null) {
366
  if (isset($encoding)) {
367
  return true;
 
 
368
  }
369
+
370
+ return 'iso-8859-1';
371
  }
372
 
373
  function mb_strlen($str, $encoding = 'iso-8859-1') {
395
  }
396
 
397
  function mb_substr($string, $start, $length = null, $encoding = 'iso-8859-1') {
398
+ if ( is_null($length) ) {
399
  return substr($string, $start);
400
+ }
401
+
402
+ return substr($string, $start, $length);
403
  }
404
 
405
  function mb_substr_count($haystack, $needle, $encoding = 'iso-8859-1') {
431
  /**
432
  * Decoder for RLE8 compression in windows bitmaps
433
  * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp
434
+ *
435
+ * @param string $str Data to decode
436
+ * @param integer $width Image width
437
+ *
438
+ * @return string
439
  */
440
  function rle8_decode ($str, $width){
441
  $lineWidth = $width + (3 - ($width-1) % 4);
476
  /**
477
  * Decoder for RLE4 compression in windows bitmaps
478
  * see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp
479
+ *
480
+ * @param string $str Data to decode
481
+ * @param integer $width Image width
482
+ *
483
+ * @return string
484
  */
485
  function rle4_decode ($str, $width) {
486
  $w = floor($width/2) + ($width % 2);
487
  $lineWidth = $w + (3 - ( ($width-1) / 2) % 4);
488
  $pixels = array();
489
  $cnt = strlen($str);
490
+ $c = 0;
491
 
492
  for ($i = 0; $i < $cnt; $i++) {
493
  $o = ord($str[$i]);
496
  $i++;
497
  switch (ord($str[$i])){
498
  case 0: # NEW LINE
499
+ while (count($pixels)%$lineWidth != 0) {
500
+ $pixels[] = 0;
501
+ }
502
  break;
503
  case 1: # END OF FILE
504
+ while (count($pixels)%$lineWidth != 0) {
505
+ $pixels[] = 0;
506
+ }
507
  break 3;
508
  case 2: # DELTA
509
  $i += 2;
510
  break;
511
  default: # ABSOLUTE MODE
512
  $num = ord($str[$i]);
513
+ for ($j = 0; $j < $num; $j++) {
514
+ if ($j%2 == 0) {
515
  $c = ord($str[++$i]);
516
  $pixels[] = ($c & 240)>>4;
517
+ }
518
+ else {
519
  $pixels[] = $c & 15;
520
+ }
521
+ }
522
+
523
+ if ($num % 2 == 0) {
524
+ $i++;
525
  }
 
526
  }
527
  break;
528
  default:
529
  $c = ord($str[++$i]);
530
+ for ($j = 0; $j < $o; $j++) {
531
  $pixels[] = ($j%2==0 ? ($c & 240)>>4 : $c & 15);
532
+ }
533
  }
534
  }
535
 
536
  $out = '';
537
+ if (count($pixels)%2) {
538
+ $pixels[] = 0;
539
+ }
540
+
541
  $cnt = count($pixels)/2;
542
 
543
+ for ($i = 0; $i < $cnt; $i++) {
544
  $out .= chr(16*$pixels[2*$i] + $pixels[2*$i+1]);
545
+ }
546
 
547
  return $out;
548
  }
555
  * Modified by Fabien Menager to support RGB555 BMP format
556
  */
557
  function imagecreatefrombmp($filename) {
 
558
  // version 1.00
559
  if (!($fh = fopen($filename, 'rb'))) {
560
  trigger_error('imagecreatefrombmp: Can not open ' . $filename, E_USER_WARNING);
657
  }
658
  $color = unpack('v', $part);
659
 
660
+ if (empty($meta['rMask']) || $meta['rMask'] != 0xf800) {
661
  $color[1] = (($color[1] & 0x7c00) >> 7) * 65536 + (($color[1] & 0x03e0) >> 2) * 256 + (($color[1] & 0x001f) << 3); // 555
662
+ }
663
+ else {
664
  $color[1] = (($color[1] & 0xf800) >> 8) * 65536 + (($color[1] & 0x07e0) >> 3) * 256 + (($color[1] & 0x001f) << 3); // 565
665
+ }
666
  break;
667
  case 8:
668
  $color = unpack('n', $vide . substr($data, $p, 1));
700
  }
701
  fclose($fh);
702
  return $im;
 
703
  }
704
  }
705
 
735
  /**
736
  * Converts a CMYK color to RGB
737
  *
738
+ * @param float|float[] $c
739
+ * @param float $m
740
+ * @param float $y
741
+ * @param float $k
742
+ *
743
+ * @return float[]
744
  */
745
  function cmyk_to_rgb($c, $m = null, $y = null, $k = null) {
746
  if (is_array($c)) {
756
  $g = (1 - round(2.55 * ($m+$k))) ;
757
  $b = (1 - round(2.55 * ($y+$k))) ;
758
 
759
+ if ($r < 0) $r = 0;
760
+ if ($g < 0) $g = 0;
761
+ if ($b < 0) $b = 0;
762
 
763
  return array(
764
  $r, $g, $b,
769
  function unichr($c) {
770
  if ($c <= 0x7F) {
771
  return chr($c);
772
+ }
773
+ else if ($c <= 0x7FF) {
774
  return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F);
775
+ }
776
+ else if ($c <= 0xFFFF) {
777
  return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F)
778
  . chr(0x80 | $c & 0x3F);
779
+ }
780
+ else if ($c <= 0x10FFFF) {
781
  return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F)
782
  . chr(0x80 | $c >> 6 & 0x3F)
783
  . chr(0x80 | $c & 0x3F);
797
 
798
  /**
799
  * Stores warnings in an array for display later
 
800
  * This function allows warnings generated by the DomDocument parser
801
  * and CSS loader ({@link Stylesheet}) to be captured and displayed
802
  * later. Without this function, errors are displayed immediately and
803
  * PDF streaming is impossible.
 
804
  * @see http://www.php.net/manual/en/function.set-error_handler.php
805
  *
806
+ * @param int $errno
807
  * @param string $errstr
808
  * @param string $errfile
809
  * @param string $errline
810
+ *
811
+ * @throws DOMPDF_Exception
812
  */
813
  function record_warnings($errno, $errstr, $errfile, $errline) {
814
 
815
+ // Not a warning or notice
816
+ if ( !($errno & (E_WARNING | E_NOTICE | E_USER_NOTICE | E_USER_WARNING )) ) {
817
  throw new DOMPDF_Exception($errstr . " $errno");
818
+ }
819
 
820
  global $_dompdf_warnings;
821
  global $_dompdf_show_warnings;
822
 
823
+ if ( $_dompdf_show_warnings ) {
824
  echo $errstr . "\n";
825
+ }
826
 
827
  $_dompdf_warnings[] = $errstr;
828
  }
831
  * Print a useful backtrace
832
  */
833
  function bt() {
834
+ if ( php_sapi_name() !== "cli") {
835
+ echo "<pre>";
836
+ }
837
 
838
  $bt = debug_backtrace();
839
 
845
  $file = basename($call["file"]) . " (" . $call["line"] . ")";
846
  if ( isset($call["class"]) ) {
847
  $func = $call["class"] . "->" . $call["function"] . "()";
848
+ }
849
+ else {
850
  $func = $call["function"] . "()";
851
  }
852
 
855
  }
856
  echo "\n";
857
 
858
+ if ( php_sapi_name() !== "cli") {
859
+ echo "</pre>";
860
+ }
861
  }
862
 
863
  /**
864
  * Print debug messages
865
  *
866
+ * @param string $type The type of debug messages to print
867
+ * @param string $msg The message to show
868
  */
869
  function dompdf_debug($type, $msg) {
870
  global $_DOMPDF_DEBUG_TYPES, $_dompdf_show_warnings, $_dompdf_debug;
882
  */
883
  function print_memusage() {
884
  global $memusage;
885
+ echo "Memory Usage\n";
886
  $prev = 0;
887
  $initial = reset($memusage);
888
+ echo str_pad("Initial:", 40) . $initial . "\n\n";
889
 
890
  foreach ($memusage as $key=>$mem) {
891
  $mem -= $initial;
892
+ echo str_pad("$key:" , 40);
893
+ echo str_pad("$mem", 12) . "(diff: " . ($mem - $prev) . ")\n";
894
  $prev = $mem;
895
  }
896
 
897
+ echo "\n" . str_pad("Total:", 40) . memory_get_usage() . "\n";
898
  }
899
  }
900
 
903
  * Initialize memory profiling code
904
  */
905
  function enable_mem_profile() {
906
+ global $memusage;
907
+ $memusage = array("Startup" => memory_get_usage());
908
+ register_shutdown_function("print_memusage");
909
  }
910
  }
911
 
917
  */
918
  function mark_memusage($location) {
919
  global $memusage;
920
+ if ( isset($memusage) ) {
921
  $memusage[$location] = memory_get_usage();
922
+ }
923
  }
924
  }
925
 
930
  * @link http://us.php.net/manual/en/function.sys-get-temp-dir.php#85261
931
  */
932
  function sys_get_temp_dir() {
933
+ if (!empty($_ENV['TMP'])) {
934
+ return realpath($_ENV['TMP']);
935
+ }
936
+
937
+ if (!empty($_ENV['TMPDIR'])) {
938
+ return realpath( $_ENV['TMPDIR']);
939
+ }
940
+
941
+ if (!empty($_ENV['TEMP'])) {
942
+ return realpath( $_ENV['TEMP']);
943
+ }
944
+
945
+ $tempfile=tempnam(uniqid(rand(), true), '');
946
  if (file_exists($tempfile)) {
947
+ unlink($tempfile);
948
+ return realpath(dirname($tempfile));
949
  }
950
  }
951
  }
971
  $ch = curl_init($url);
972
  curl_setopt($ch, CURLOPT_TIMEOUT, 10);
973
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
974
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
975
+ curl_setopt($ch, CURLOPT_HEADER, true);
976
 
977
  $data = curl_exec($ch);
978
  $raw_headers = substr($data, 0, curl_getinfo($ch, CURLINFO_HEADER_SIZE));
dompdf/include/gd_adapter.cls.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: gd_adapter.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
@@ -17,9 +16,13 @@
17
  * @package dompdf
18
  */
19
  class GD_Adapter implements Canvas {
 
 
 
 
20
 
21
  /**
22
- * Resoure handle for the image
23
  *
24
  * @var resource
25
  */
@@ -73,32 +76,38 @@ class GD_Adapter implements Canvas {
73
  * @var int
74
  */
75
  private $_bg_color;
76
-
77
  /**
78
  * Class constructor
79
  *
80
  * @param mixed $size The size of image to create: array(x1,y1,x2,y2) or "letter", "legal", etc.
81
  * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')
 
82
  * @param float $aa_factor Anti-aliasing factor, 1 for no AA
83
  * @param array $bg_color Image background color: array(r,g,b,a), 0 <= r,g,b,a <= 1
84
  */
85
- function __construct($size, $orientation = "portrait", $aa_factor = 1, $bg_color = array(1,1,1,0) ) {
86
 
87
  if ( !is_array($size) ) {
88
  $size = strtolower($size);
89
 
90
- if ( isset(CPDF_Adapter::$PAPER_SIZES[$size]) )
91
  $size = CPDF_Adapter::$PAPER_SIZES[$size];
92
- else
 
93
  $size = CPDF_Adapter::$PAPER_SIZES["letter"];
 
94
  }
95
 
96
  if ( strtolower($orientation) === "landscape" ) {
97
  list($size[2],$size[3]) = array($size[3],$size[2]);
98
  }
99
 
100
- if ( $aa_factor < 1 )
 
 
101
  $aa_factor = 1;
 
102
 
103
  $this->_aa_factor = $aa_factor;
104
 
@@ -122,6 +131,10 @@ class GD_Adapter implements Canvas {
122
 
123
  }
124
 
 
 
 
 
125
  /**
126
  * Return the GF image resource
127
  *
@@ -297,6 +310,10 @@ class GD_Adapter implements Canvas {
297
 
298
  }
299
 
 
 
 
 
300
  /**
301
  * Draws a rectangle at x1,y1 with width w and height h
302
  *
@@ -374,11 +391,15 @@ class GD_Adapter implements Canvas {
374
  * @param float $y1
375
  * @param float $w
376
  * @param float $h
377
- */
378
  function clipping_rectangle($x1, $y1, $w, $h) {
379
  // @todo
380
  }
381
 
 
 
 
 
382
  /**
383
  * Ends the last clipping shape
384
  */
@@ -518,16 +539,18 @@ class GD_Adapter implements Canvas {
518
 
519
  /**
520
  * Add an image to the pdf.
521
- *
522
  * The image is placed at the specified x and y coordinates with the
523
  * given width and height.
524
  *
525
  * @param string $img_url the path to the image
526
- * @param string $img_type the type (e.g. extension) of the image
527
- * @param float $x x position
528
- * @param float $y y position
529
- * @param int $w width (in pixels)
530
- * @param int $h height (in pixels)
 
 
 
531
  */
532
  function image($img_url, $x, $y, $w, $h, $resolution = "normal") {
533
  $img_type = Image_Cache::detect_type($img_url);
@@ -560,19 +583,21 @@ class GD_Adapter implements Canvas {
560
 
561
  /**
562
  * Writes text at the specified x and y coordinates
563
- *
564
  * See {@link Style::munge_color()} for the format of the color array.
565
  *
566
- * @param float $x
567
- * @param float $y
568
- * @param string $text the text to write
569
- * @param string $font the font file to use
570
- * @param float $size the font size, in points
571
- * @param array $color
572
- * @param float $adjust word spacing adjustment
573
- * @param float $angle Text angle
 
 
 
574
  */
575
- function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_spacing = 0, $char_spacing = 0, $angle = 0) {
576
 
577
  // Scale by the AA factor
578
  $x *= $this->_aa_factor;
@@ -607,11 +632,11 @@ class GD_Adapter implements Canvas {
607
  /**
608
  * Add a link to the pdf
609
  *
610
- * @param string $url The url to link to
611
- * @param float $x The x position of the link
612
- * @param float $y The y position of the link
613
- * @param float $width The width of the link
614
- * @param float $height The height of the link
615
  */
616
  function add_link($url, $x, $y, $width, $height) {
617
  // Not implemented
@@ -630,17 +655,19 @@ class GD_Adapter implements Canvas {
630
  function set_default_view($view, $options = array()) {
631
  // N/A
632
  }
633
-
634
  /**
635
  * Calculates text size, in points
636
  *
637
  * @param string $text the text to be sized
638
  * @param string $font the desired font
639
  * @param float $size the desired font size
640
- * @param float $spacing word spacing, if any
 
 
641
  * @return float
642
  */
643
- function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) {
644
  $font = $this->get_ttf_file($font);
645
 
646
  $text = mb_encode_numericentity($text, array(0x0080, 0xffff, 0, 0xffff), 'UTF-8');
@@ -672,14 +699,16 @@ class GD_Adapter implements Canvas {
672
  */
673
  function get_font_height($font, $size) {
674
  $font = $this->get_ttf_file($font);
675
-
 
676
  // FIXME: word spacing
677
  list(,$y2,,,,$y1) = imagettfbbox($size, 0, $font, "MXjpqytfhl"); // Test string with ascenders, descenders and caps
678
- return ($y2 - $y1) * DOMPDF_FONT_HEIGHT_RATIO;
679
  }
680
 
681
  function get_font_baseline($font, $size) {
682
- return $this->get_font_height($font, $size) / DOMPDF_FONT_HEIGHT_RATIO;
 
683
  }
684
 
685
  /**
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
16
  * @package dompdf
17
  */
18
  class GD_Adapter implements Canvas {
19
+ /**
20
+ * @var DOMPDF
21
+ */
22
+ private $_dompdf;
23
 
24
  /**
25
+ * Resource handle for the image
26
  *
27
  * @var resource
28
  */
76
  * @var int
77
  */
78
  private $_bg_color;
79
+
80
  /**
81
  * Class constructor
82
  *
83
  * @param mixed $size The size of image to create: array(x1,y1,x2,y2) or "letter", "legal", etc.
84
  * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')
85
+ * @param DOMPDF $dompdf
86
  * @param float $aa_factor Anti-aliasing factor, 1 for no AA
87
  * @param array $bg_color Image background color: array(r,g,b,a), 0 <= r,g,b,a <= 1
88
  */
89
+ function __construct($size, $orientation = "portrait", DOMPDF $dompdf, $aa_factor = 1.0, $bg_color = array(1,1,1,0) ) {
90
 
91
  if ( !is_array($size) ) {
92
  $size = strtolower($size);
93
 
94
+ if ( isset(CPDF_Adapter::$PAPER_SIZES[$size]) ) {
95
  $size = CPDF_Adapter::$PAPER_SIZES[$size];
96
+ }
97
+ else {
98
  $size = CPDF_Adapter::$PAPER_SIZES["letter"];
99
+ }
100
  }
101
 
102
  if ( strtolower($orientation) === "landscape" ) {
103
  list($size[2],$size[3]) = array($size[3],$size[2]);
104
  }
105
 
106
+ $this->_dompdf = $dompdf;
107
+
108
+ if ( $aa_factor < 1 ) {
109
  $aa_factor = 1;
110
+ }
111
 
112
  $this->_aa_factor = $aa_factor;
113
 
131
 
132
  }
133
 
134
+ function get_dompdf(){
135
+ return $this->_dompdf;
136
+ }
137
+
138
  /**
139
  * Return the GF image resource
140
  *
310
 
311
  }
312
 
313
+ function arc($x1, $y1, $r1, $r2, $astart, $aend, $color, $width, $style = array()) {
314
+ // @todo
315
+ }
316
+
317
  /**
318
  * Draws a rectangle at x1,y1 with width w and height h
319
  *
391
  * @param float $y1
392
  * @param float $w
393
  * @param float $h
394
+ */
395
  function clipping_rectangle($x1, $y1, $w, $h) {
396
  // @todo
397
  }
398
 
399
+ function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) {
400
+ // @todo
401
+ }
402
+
403
  /**
404
  * Ends the last clipping shape
405
  */
539
 
540
  /**
541
  * Add an image to the pdf.
 
542
  * The image is placed at the specified x and y coordinates with the
543
  * given width and height.
544
  *
545
  * @param string $img_url the path to the image
546
+ * @param float $x x position
547
+ * @param float $y y position
548
+ * @param int $w width (in pixels)
549
+ * @param int $h height (in pixels)
550
+ * @param string $resolution
551
+ *
552
+ * @return void
553
+ * @internal param string $img_type the type (e.g. extension) of the image
554
  */
555
  function image($img_url, $x, $y, $w, $h, $resolution = "normal") {
556
  $img_type = Image_Cache::detect_type($img_url);
583
 
584
  /**
585
  * Writes text at the specified x and y coordinates
 
586
  * See {@link Style::munge_color()} for the format of the color array.
587
  *
588
+ * @param float $x
589
+ * @param float $y
590
+ * @param string $text the text to write
591
+ * @param string $font the font file to use
592
+ * @param float $size the font size, in points
593
+ * @param array $color
594
+ * @param float $word_spacing word spacing adjustment
595
+ * @param float $char_spacing
596
+ * @param float $angle Text angle
597
+ *
598
+ * @return void
599
  */
600
+ function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_spacing = 0.0, $char_spacing = 0.0, $angle = 0.0) {
601
 
602
  // Scale by the AA factor
603
  $x *= $this->_aa_factor;
632
  /**
633
  * Add a link to the pdf
634
  *
635
+ * @param string $url The url to link to
636
+ * @param float $x The x position of the link
637
+ * @param float $y The y position of the link
638
+ * @param float $width The width of the link
639
+ * @param float $height The height of the link
640
  */
641
  function add_link($url, $x, $y, $width, $height) {
642
  // Not implemented
655
  function set_default_view($view, $options = array()) {
656
  // N/A
657
  }
658
+
659
  /**
660
  * Calculates text size, in points
661
  *
662
  * @param string $text the text to be sized
663
  * @param string $font the desired font
664
  * @param float $size the desired font size
665
+ * @param float $word_spacing word spacing, if any
666
+ * @param float $char_spacing char spacing, if any
667
+ *
668
  * @return float
669
  */
670
+ function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0) {
671
  $font = $this->get_ttf_file($font);
672
 
673
  $text = mb_encode_numericentity($text, array(0x0080, 0xffff, 0, 0xffff), 'UTF-8');
699
  */
700
  function get_font_height($font, $size) {
701
  $font = $this->get_ttf_file($font);
702
+ $ratio = $this->_dompdf->get_option("font_height_ratio");
703
+
704
  // FIXME: word spacing
705
  list(,$y2,,,,$y1) = imagettfbbox($size, 0, $font, "MXjpqytfhl"); // Test string with ascenders, descenders and caps
706
+ return ($y2 - $y1) * $ratio;
707
  }
708
 
709
  function get_font_baseline($font, $size) {
710
+ $ratio = $this->_dompdf->get_option("font_height_ratio");
711
+ return $this->get_font_height($font, $size) / $ratio;
712
  }
713
 
714
  /**
dompdf/include/image_cache.cls.php CHANGED
@@ -1,187 +1,198 @@
1
- <?php
2
- /**
3
- * @package dompdf
4
- * @link http://www.dompdf.com/
5
- * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Helmut Tischer <htischer@weihenstephan.org>
7
- * @author Fabien Ménager <fabien.menager@gmail.com>
8
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
9
- * @version $Id: image_cache.cls.php 455 2012-01-19 19:25:18Z eclecticgeek@gmail.com $
10
- */
11
-
12
- /**
13
- * Static class that resolves image urls and downloads and caches
14
- * remote images if required.
15
- *
16
- * @access private
17
- * @package dompdf
18
- */
19
- class Image_Cache {
20
-
21
- /**
22
- * Array of downloaded images. Cached so that identical images are
23
- * not needlessly downloaded.
24
- *
25
- * @var array
26
- */
27
- static protected $_cache = array();
28
-
29
- /**
30
- * The url to the "broken image" used when images can't be loade
31
- *
32
- * @var string
33
- */
34
- public static $broken_image;
35
-
36
- /**
37
- * Resolve and fetch an image for use.
38
- *
39
- * @param string $url The url of the image
40
- * @param string $proto Default protocol if none specified in $url
41
- * @param string $host Default host if none specified in $url
42
- * @param string $base_path Default path if none specified in $url
43
- * @return array An array with two elements: The local path to the image and the image extension
44
- */
45
- static function resolve_url($url, $proto, $host, $base_path) {
46
- $parsed_url = explode_url($url);
47
- $message = null;
48
-
49
- $remote = ($proto && $proto !== "file://") || ($parsed_url['protocol'] != "");
50
-
51
- $datauri = strpos($parsed_url['protocol'], "data:") === 0;
52
-
53
- try {
54
-
55
- // Remote not allowed and is not DataURI
56
- if ( !DOMPDF_ENABLE_REMOTE && $remote && !$datauri ) {
57
- throw new DOMPDF_Image_Exception("DOMPDF_ENABLE_REMOTE is set to FALSE");
58
- }
59
-
60
- // Remote allowed or DataURI
61
- else if ( DOMPDF_ENABLE_REMOTE && $remote || $datauri ) {
62
- // Download remote files to a temporary directory
63
- $full_url = build_url($proto, $host, $base_path, $url);
64
-
65
- // From cache
66
- if ( isset(self::$_cache[$full_url]) ) {
67
- $resolved_url = self::$_cache[$full_url];
68
- }
69
-
70
- // From remote
71
- else {
72
- $resolved_url = tempnam(DOMPDF_TEMP_DIR, "ca_dompdf_img_");
73
-
74
- if ($datauri) {
75
- if ($parsed_data_uri = parse_data_uri($url)) {
76
- $image = $parsed_data_uri['data'];
77
- }
78
- }
79
- else {
80
- $old_err = set_error_handler("record_warnings");
81
- $image = file_get_contents($full_url);
82
- restore_error_handler();
83
- }
84
-
85
- if(strlen($image) == 0) {
86
- /* try one last technique to display images */
87
- if( !class_exists( 'WP_Http' ) ) {
88
- include_once( ABSPATH . WPINC. '/class-http.php' );
89
- }
90
- $request = new WP_Http();
91
- $result = $request->request($full_url);
92
- $image = $result['body'];
93
- }
94
-
95
- // Image not found or invalid
96
- if ( strlen($image) == 0 ) {
97
- $msg = ($datauri ? "Data-URI could not be parsed" : "Image not found");
98
- throw new DOMPDF_Image_Exception($msg);
99
- }
100
-
101
- // Image found, put in cache and process
102
- else {
103
- //e.g. fetch.php?media=url.jpg&cache=1
104
- //- Image file name might be one of the dynamic parts of the url, don't strip off!
105
- //- a remote url does not need to have a file extension at all
106
- //- local cached file does not have a matching file extension
107
- //Therefore get image type from the content
108
- file_put_contents($resolved_url, $image);
109
- }
110
- }
111
- }
112
-
113
- // Not remote, local image
114
- else {
115
- $resolved_url = build_url($proto, $host, $base_path, $url);
116
- }
117
-
118
-
119
- // Check if the local file is readable
120
- if ( !is_readable($resolved_url) || !filesize($resolved_url) ) {
121
- throw new DOMPDF_Image_Exception("Image not readable or empty");
122
- }
123
-
124
- // Check is the file is an image
125
- else {
126
- list($width, $height, $type) = dompdf_getimagesize($resolved_url);
127
-
128
- // Known image type
129
- if ( $width && $height && in_array($type, array(IMAGETYPE_GIF, IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_BMP)) ) {
130
- //Don't put replacement image into cache - otherwise it will be deleted on cache cleanup.
131
- //Only execute on successfull caching of remote image.
132
- if ( DOMPDF_ENABLE_REMOTE && $remote ) {
133
- self::$_cache[$full_url] = $resolved_url;
134
- }
135
- }
136
-
137
- // Unknown image type
138
- else {
139
- throw new DOMPDF_Image_Exception("Image type unknown");
140
- unlink($resolved_url);
141
- }
142
- }
143
- }
144
- catch(DOMPDF_Image_Exception $e) {
145
- $resolved_url = self::$broken_image;
146
- $type = IMAGETYPE_PNG;
147
- $message = $e->getMessage()." \n $url";
148
- }
149
-
150
- return array($resolved_url, $type, $message);
151
- }
152
-
153
- /**
154
- * Unlink all cached images (i.e. temporary images either downloaded
155
- * or converted)
156
- */
157
- static function clear() {
158
- if ( empty(self::$_cache) || DEBUGKEEPTEMP ) return;
159
-
160
- foreach ( self::$_cache as $file ) {
161
- if (DEBUGPNG) print "[clear unlink $file]";
162
- unlink($file);
163
- }
164
- }
165
-
166
- static function detect_type($file) {
167
- list($width, $height, $type) = dompdf_getimagesize($file);
168
- return $type;
169
- }
170
-
171
- static function type_to_ext($type) {
172
- $image_types = array(
173
- IMAGETYPE_GIF => "gif",
174
- IMAGETYPE_PNG => "png",
175
- IMAGETYPE_JPEG => "jpeg",
176
- IMAGETYPE_BMP => "bmp",
177
- );
178
-
179
- return (isset($image_types[$type]) ? $image_types[$type] : null);
180
- }
181
-
182
- static function is_broken($url) {
183
- return $url === self::$broken_image;
184
- }
185
- }
186
-
187
- Image_Cache::$broken_image = DOMPDF_LIB_DIR . "/res/broken_image.png";
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ error_reporting(E_ALL);
3
+
4
+ /**
5
+ * @package dompdf
6
+ * @link http://www.dompdf.com/
7
+ * @author Benj Carson <benjcarson@digitaljunkies.ca>
8
+ * @author Helmut Tischer <htischer@weihenstephan.org>
9
+ * @author Fabien Ménager <fabien.menager@gmail.com>
10
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
11
+ */
12
+
13
+ /**
14
+ * Static class that resolves image urls and downloads and caches
15
+ * remote images if required.
16
+ *
17
+ * @access private
18
+ * @package dompdf
19
+ */
20
+ class Image_Cache {
21
+
22
+ /**
23
+ * Array of downloaded images. Cached so that identical images are
24
+ * not needlessly downloaded.
25
+ *
26
+ * @var array
27
+ */
28
+ static protected $_cache = array();
29
+
30
+ /**
31
+ * The url to the "broken image" used when images can't be loade
32
+ *
33
+ * @var string
34
+ */
35
+ public static $broken_image;
36
+
37
+ /**
38
+ * Resolve and fetch an image for use.
39
+ *
40
+ * @param string $url The url of the image
41
+ * @param string $protocol Default protocol if none specified in $url
42
+ * @param string $host Default host if none specified in $url
43
+ * @param string $base_path Default path if none specified in $url
44
+ * @param DOMPDF $dompdf The DOMPDF instance
45
+ *
46
+ * @throws DOMPDF_Image_Exception
47
+ * @return array An array with two elements: The local path to the image and the image extension
48
+ */
49
+ static function resolve_url($url, $protocol, $host, $base_path, DOMPDF $dompdf) {
50
+ $parsed_url = explode_url($url);
51
+ $message = null;
52
+
53
+ $remote = ($protocol && $protocol !== "file://") || ($parsed_url['protocol'] != "");
54
+
55
+ $data_uri = strpos($parsed_url['protocol'], "data:") === 0;
56
+ $full_url = null;
57
+ $enable_remote = $dompdf->get_option("enable_remote");
58
+
59
+ try {
60
+
61
+ // Remote not allowed and is not DataURI
62
+ if ( !$enable_remote && $remote && !$data_uri ) {
63
+ throw new DOMPDF_Image_Exception("DOMPDF_ENABLE_REMOTE is set to FALSE");
64
+ }
65
+
66
+ // Remote allowed or DataURI
67
+ else if ( $enable_remote && $remote || $data_uri ) {
68
+ // Download remote files to a temporary directory
69
+ $full_url = build_url($protocol, $host, $base_path, $url);
70
+
71
+ // From cache
72
+ if ( isset(self::$_cache[$full_url]) ) {
73
+ $resolved_url = self::$_cache[$full_url];
74
+ }
75
+
76
+ // From remote
77
+ else {
78
+ $tmp_dir = $dompdf->get_option("temp_dir");
79
+ $resolved_url = tempnam($tmp_dir, "ca_dompdf_img_");
80
+ $image = "";
81
+
82
+ if ($data_uri) {
83
+ if ($parsed_data_uri = parse_data_uri($url)) {
84
+ $image = $parsed_data_uri['data'];
85
+ }
86
+ }
87
+ else {
88
+ set_error_handler("record_warnings");
89
+ $image = file_get_contents($full_url);
90
+ restore_error_handler();
91
+ }
92
+
93
+ // Image not found or invalid
94
+ if(strlen($image) == 0) {
95
+ /* try one last technique to display images */
96
+ if( !class_exists( 'WP_Http' ) ) {
97
+ include_once( ABSPATH . WPINC. '/class-http.php' );
98
+ }
99
+ $request = new WP_Http();
100
+ $result = $request->request($full_url);
101
+ if ( !is_wp_error($result) ) {
102
+ $image = $result['body'];
103
+ }
104
+ }
105
+
106
+ // Image not found or invalid
107
+ if ( strlen($image) == 0 ) {
108
+ $msg = ($datauri ? "Data-URI could not be parsed" : "Image not found");
109
+ throw new DOMPDF_Image_Exception($msg);
110
+ }
111
+
112
+ // Image found, put in cache and process
113
+ else {
114
+ //e.g. fetch.php?media=url.jpg&cache=1
115
+ //- Image file name might be one of the dynamic parts of the url, don't strip off!
116
+ //- a remote url does not need to have a file extension at all
117
+ //- local cached file does not have a matching file extension
118
+ //Therefore get image type from the content
119
+ file_put_contents($resolved_url, $image);
120
+ }
121
+ }
122
+ }
123
+
124
+ // Not remote, local image
125
+ else {
126
+ $resolved_url = build_url($protocol, $host, $base_path, $url);
127
+ }
128
+
129
+ // Check if the local file is readable
130
+ if ( !is_readable($resolved_url) || !filesize($resolved_url) ) {
131
+ throw new DOMPDF_Image_Exception("Image not readable or empty");
132
+ }
133
+
134
+ // Check is the file is an image
135
+ else {
136
+ list($width, $height, $type) = dompdf_getimagesize($resolved_url);
137
+
138
+ // Known image type
139
+ if ( $width && $height && in_array($type, array(IMAGETYPE_GIF, IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_BMP)) ) {
140
+ //Don't put replacement image into cache - otherwise it will be deleted on cache cleanup.
141
+ //Only execute on successful caching of remote image.
142
+ if ( $enable_remote && $remote || $data_uri ) {
143
+ self::$_cache[$full_url] = $resolved_url;
144
+ }
145
+ }
146
+
147
+ // Unknown image type
148
+ else {
149
+ throw new DOMPDF_Image_Exception("Image type unknown");
150
+ }
151
+ }
152
+ }
153
+ catch(DOMPDF_Image_Exception $e) {
154
+ $resolved_url = self::$broken_image;
155
+ $type = IMAGETYPE_PNG;
156
+ $message = $e->getMessage()." \n $url";
157
+ }
158
+
159
+ return array($resolved_url, $type, $message);
160
+ }
161
+
162
+ /**
163
+ * Unlink all cached images (i.e. temporary images either downloaded
164
+ * or converted)
165
+ */
166
+ static function clear() {
167
+ if ( empty(self::$_cache) || DEBUGKEEPTEMP ) return;
168
+
169
+ foreach ( self::$_cache as $file ) {
170
+ if (DEBUGPNG) print "[clear unlink $file]";
171
+ unlink($file);
172
+ }
173
+
174
+ self::$_cache = array();
175
+ }
176
+
177
+ static function detect_type($file) {
178
+ list(, , $type) = dompdf_getimagesize($file);
179
+ return $type;
180
+ }
181
+
182
+ static function type_to_ext($type) {
183
+ $image_types = array(
184
+ IMAGETYPE_GIF => "gif",
185
+ IMAGETYPE_PNG => "png",
186
+ IMAGETYPE_JPEG => "jpeg",
187
+ IMAGETYPE_BMP => "bmp",
188
+ );
189
+
190
+ return (isset($image_types[$type]) ? $image_types[$type] : null);
191
+ }
192
+
193
+ static function is_broken($url) {
194
+ return $url === self::$broken_image;
195
+ }
196
+ }
197
+
198
+ Image_Cache::$broken_image = DOMPDF_LIB_DIR . "/res/broken_image.png";
dompdf/include/image_frame_decorator.cls.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: image_frame_decorator.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
@@ -38,18 +37,19 @@ class Image_Frame_Decorator extends Frame_Decorator {
38
  * @param DOMPDF $dompdf the document's dompdf object (required to resolve relative & remote urls)
39
  */
40
  function __construct(Frame $frame, DOMPDF $dompdf) {
41
- global $_dompdf_warnings;
42
-
43
  parent::__construct($frame, $dompdf);
44
  $url = $frame->get_node()->getAttribute("src");
45
-
46
- //debugpng
47
- if (DEBUGPNG) print '[__construct '.$url.']';
48
 
49
- list($this->_image_url, $type, $this->_image_msg) = Image_Cache::resolve_url($url,
50
- $dompdf->get_protocol(),
51
- $dompdf->get_host(),
52
- $dompdf->get_base_path());
 
 
 
 
 
 
53
 
54
  if ( Image_Cache::is_broken($this->_image_url) &&
55
  $alt = $frame->get_node()->getAttribute("alt") ) {
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
37
  * @param DOMPDF $dompdf the document's dompdf object (required to resolve relative & remote urls)
38
  */
39
  function __construct(Frame $frame, DOMPDF $dompdf) {
 
 
40
  parent::__construct($frame, $dompdf);
41
  $url = $frame->get_node()->getAttribute("src");
 
 
 
42
 
43
+ $debug_png = $dompdf->get_option("debug_png");
44
+ if ($debug_png) print '[__construct '.$url.']';
45
+
46
+ list($this->_image_url, /*$type*/, $this->_image_msg) = Image_Cache::resolve_url(
47
+ $url,
48
+ $dompdf->get_protocol(),
49
+ $dompdf->get_host(),
50
+ $dompdf->get_base_path(),
51
+ $dompdf
52
+ );
53
 
54
  if ( Image_Cache::is_broken($this->_image_url) &&
55
  $alt = $frame->get_node()->getAttribute("alt") ) {
dompdf/include/image_frame_reflower.cls.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: image_frame_reflower.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
@@ -20,13 +19,15 @@ class Image_Frame_Reflower extends Frame_Reflower {
20
  parent::__construct($frame);
21
  }
22
 
23
- function reflow(Frame_Decorator $block = null) {
24
  $this->_frame->position();
25
 
26
  //FLOAT
27
  //$frame = $this->_frame;
28
  //$page = $frame->get_root();
29
- //if (DOMPDF_ENABLE_CSS_FLOAT && $frame->get_style()->float !== "none" ) {
 
 
30
  // $page->add_floating_frame($this);
31
  //}
32
  // Set the frame's width
@@ -53,6 +54,9 @@ class Image_Frame_Reflower extends Frame_Reflower {
53
  }
54
 
55
  $style = $this->_frame->get_style();
 
 
 
56
 
57
  //own style auto or invalid value: use natural size in px
58
  //own style value: ignore suffix text including unit, use given number as px
@@ -106,19 +110,75 @@ class Image_Frame_Reflower extends Frame_Reflower {
106
  // Resample according to px per inch
107
  // See also List_Bullet_Image_Frame_Decorator::__construct
108
  if ($width == 0 && $height == 0) {
109
- $width = (float)($img_width * 72) / DOMPDF_DPI;
110
- $height = (float)($img_height * 72) / DOMPDF_DPI;
 
 
 
111
  } elseif ($height == 0 && $width != 0) {
 
112
  $height = ($width / $img_width) * $img_height; //keep aspect ratio
113
  } elseif ($width == 0 && $height != 0) {
 
114
  $width = ($height / $img_height) * $img_width; //keep aspect ratio
115
  }
116
  }
117
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  if (DEBUGPNG) print $width.' '.$height.';';
119
 
120
  $style->width = $width . "pt";
121
  $style->height = $height . "pt";
 
 
 
 
 
122
 
123
  return array( $width, $width, "min" => $width, "max" => $width);
124
 
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
19
  parent::__construct($frame);
20
  }
21
 
22
+ function reflow(Block_Frame_Decorator $block = null) {
23
  $this->_frame->position();
24
 
25
  //FLOAT
26
  //$frame = $this->_frame;
27
  //$page = $frame->get_root();
28
+
29
+ //$enable_css_float = $this->get_dompdf()->get_option("enable_css_float");
30
+ //if ($enable_css_float && $frame->get_style()->float !== "none" ) {
31
  // $page->add_floating_frame($this);
32
  //}
33
  // Set the frame's width
54
  }
55
 
56
  $style = $this->_frame->get_style();
57
+
58
+ $width_forced = true;
59
+ $height_forced = true;
60
 
61
  //own style auto or invalid value: use natural size in px
62
  //own style value: ignore suffix text including unit, use given number as px
110
  // Resample according to px per inch
111
  // See also List_Bullet_Image_Frame_Decorator::__construct
112
  if ($width == 0 && $height == 0) {
113
+ $dpi = $this->_frame->get_dompdf()->get_option("dpi");
114
+ $width = (float)($img_width * 72) / $dpi;
115
+ $height = (float)($img_height * 72) / $dpi;
116
+ $width_forced = false;
117
+ $height_forced = false;
118
  } elseif ($height == 0 && $width != 0) {
119
+ $height_forced = false;
120
  $height = ($width / $img_width) * $img_height; //keep aspect ratio
121
  } elseif ($width == 0 && $height != 0) {
122
+ $width_forced = false;
123
  $width = ($height / $img_height) * $img_width; //keep aspect ratio
124
  }
125
  }
126
+
127
+ // Handle min/max width/height
128
+ if ( $style->min_width !== "none" ||
129
+ $style->max_width !== "none" ||
130
+ $style->min_height !== "none" ||
131
+ $style->max_height !== "none" ) {
132
+
133
+ list(/*$x*/, /*$y*/, $w, $h) = $this->_frame->get_containing_block();
134
+
135
+ $min_width = $style->length_in_pt($style->min_width, $w);
136
+ $max_width = $style->length_in_pt($style->max_width, $w);
137
+ $min_height = $style->length_in_pt($style->min_height, $h);
138
+ $max_height = $style->length_in_pt($style->max_height, $h);
139
+
140
+ if ( $max_width !== "none" && $width > $max_width ) {
141
+ if ( !$height_forced ) {
142
+ $height *= $max_width / $width;
143
+ }
144
+
145
+ $width = $max_width;
146
+ }
147
+
148
+ if ( $min_width !== "none" && $width < $min_width ) {
149
+ if ( !$height_forced ) {
150
+ $height *= $min_width / $width;
151
+ }
152
+
153
+ $width = $min_width;
154
+ }
155
+
156
+ if ( $max_height !== "none" && $height > $max_height ) {
157
+ if ( !$width_forced ) {
158
+ $width *= $max_height / $height;
159
+ }
160
+
161
+ $height = $max_height;
162
+ }
163
+
164
+ if ( $min_height !== "none" && $height < $min_height ) {
165
+ if ( !$width_forced ) {
166
+ $width *= $min_height / $height;
167
+ }
168
+
169
+ $height = $min_height;
170
+ }
171
+ }
172
+
173
  if (DEBUGPNG) print $width.' '.$height.';';
174
 
175
  $style->width = $width . "pt";
176
  $style->height = $height . "pt";
177
+
178
+ $style->min_width = "none";
179
+ $style->max_width = "none";
180
+ $style->min_height = "none";
181
+ $style->max_height = "none";
182
 
183
  return array( $width, $width, "min" => $width, "max" => $width);
184
 
dompdf/include/image_renderer.cls.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: image_renderer.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
@@ -23,24 +22,65 @@ class Image_Renderer extends Block_Renderer {
23
  list($x, $y, $w, $h) = $frame->get_border_box();
24
 
25
  $this->_set_opacity( $frame->get_opacity( $style->opacity ) );
 
 
 
 
 
 
 
 
26
 
27
- if ( ($bg = $style->background_color) !== "transparent" )
28
  $this->_canvas->filled_rectangle($x, $y, $w, $h, $bg);
 
29
 
30
- if ( ($url = $style->background_image) && $url !== "none" )
31
  $this->_background_image($url, $x, $y, $w, $h, $style);
 
 
 
 
 
32
 
33
  $this->_render_border($frame);
34
  $this->_render_outline($frame);
35
 
36
  list($x, $y) = $frame->get_padding_box();
 
37
  $x += $style->length_in_pt($style->padding_left, $cb["w"]);
38
  $y += $style->length_in_pt($style->padding_top, $cb["h"]);
39
 
40
  $w = $style->length_in_pt($style->width, $cb["w"]);
41
  $h = $style->length_in_pt($style->height, $cb["h"]);
42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  $src = $frame->get_image_url();
 
44
 
45
  if ( Image_Cache::is_broken($src) &&
46
  $alt = $frame->get_node()->getAttribute("alt") ) {
@@ -55,6 +95,10 @@ class Image_Renderer extends Block_Renderer {
55
  $this->_canvas->image( $src, $x, $y, $w, $h, $style->image_resolution);
56
  }
57
 
 
 
 
 
58
  if ( $msg = $frame->get_image_msg() ) {
59
  $parts = preg_split("/\s*\n\s*/", $msg);
60
  $height = 10;
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
22
  list($x, $y, $w, $h) = $frame->get_border_box();
23
 
24
  $this->_set_opacity( $frame->get_opacity( $style->opacity ) );
25
+
26
+ list($tl, $tr, $br, $bl) = $style->get_computed_border_radius($w, $h);
27
+
28
+ $has_border_radius = $tl + $tr + $br + $bl > 0;
29
+
30
+ if ( $has_border_radius ) {
31
+ $this->_canvas->clipping_roundrectangle( $x, $y, $w, $h, $tl, $tr, $br, $bl );
32
+ }
33
 
34
+ if ( ($bg = $style->background_color) !== "transparent" ) {
35
  $this->_canvas->filled_rectangle($x, $y, $w, $h, $bg);
36
+ }
37
 
38
+ if ( ($url = $style->background_image) && $url !== "none" ) {
39
  $this->_background_image($url, $x, $y, $w, $h, $style);
40
+ }
41
+
42
+ if ( $has_border_radius ) {
43
+ $this->_canvas->clipping_end();
44
+ }
45
 
46
  $this->_render_border($frame);
47
  $this->_render_outline($frame);
48
 
49
  list($x, $y) = $frame->get_padding_box();
50
+
51
  $x += $style->length_in_pt($style->padding_left, $cb["w"]);
52
  $y += $style->length_in_pt($style->padding_top, $cb["h"]);
53
 
54
  $w = $style->length_in_pt($style->width, $cb["w"]);
55
  $h = $style->length_in_pt($style->height, $cb["h"]);
56
 
57
+ if ( $has_border_radius ) {
58
+ list($wt, $wr, $wb, $wl) = array(
59
+ $style->border_top_width,
60
+ $style->border_right_width,
61
+ $style->border_bottom_width,
62
+ $style->border_left_width,
63
+ );
64
+
65
+ // we have to get the "inner" radius
66
+ if ( $tl > 0 ) {
67
+ $tl -= ($wt + $wl) / 2;
68
+ }
69
+ if ( $tr > 0 ) {
70
+ $tr -= ($wt + $wr) / 2;
71
+ }
72
+ if ( $br > 0 ) {
73
+ $br -= ($wb + $wr) / 2;
74
+ }
75
+ if ( $bl > 0 ) {
76
+ $bl -= ($wb + $wl) / 2;
77
+ }
78
+
79
+ $this->_canvas->clipping_roundrectangle( $x, $y, $w, $h, $tl, $tr, $br, $bl );
80
+ }
81
+
82
  $src = $frame->get_image_url();
83
+ $alt = null;
84
 
85
  if ( Image_Cache::is_broken($src) &&
86
  $alt = $frame->get_node()->getAttribute("alt") ) {
95
  $this->_canvas->image( $src, $x, $y, $w, $h, $style->image_resolution);
96
  }
97
 
98
+ if ( $has_border_radius ) {
99
+ $this->_canvas->clipping_end();
100
+ }
101
+
102
  if ( $msg = $frame->get_image_msg() ) {
103
  $parts = preg_split("/\s*\n\s*/", $msg);
104
  $height = 10;
dompdf/include/inline_frame_decorator.cls.php CHANGED
@@ -5,7 +5,6 @@
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: inline_frame_decorator.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
@@ -18,7 +17,7 @@ class Inline_Frame_Decorator extends Frame_Decorator {
18
 
19
  function __construct(Frame $frame, DOMPDF $dompdf) { parent::__construct($frame, $dompdf); }
20
 
21
- function split($frame = null, $force_pagebreak = false) {
22
 
23
  if ( is_null($frame) ) {
24
  $this->get_parent()->split($this, $force_pagebreak);
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
17
 
18
  function __construct(Frame $frame, DOMPDF $dompdf) { parent::__construct($frame, $dompdf); }
19
 
20
+ function split(Frame $frame = null, $force_pagebreak = false) {
21
 
22
  if ( is_null($frame) ) {
23
  $this->get_parent()->split($this, $force_pagebreak);
dompdf/include/inline_frame_reflower.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: inline_frame_reflower.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -19,7 +18,7 @@ class Inline_Frame_Reflower extends Frame_Reflower {
19
 
20
  //........................................................................
21
 
22
- function reflow(Frame_Decorator $block = null) {
23
  $frame = $this->_frame;
24
 
25
  // Check if a page break is forced
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
18
 
19
  //........................................................................
20
 
21
+ function reflow(Block_Frame_Decorator $block = null) {
22
  $frame = $this->_frame;
23
 
24
  // Check if a page break is forced
dompdf/include/inline_positioner.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: inline_positioner.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/inline_renderer.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: inline_renderer.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -110,6 +109,13 @@ class Inline_Renderer extends Abstract_Renderer {
110
  $w += $child_w;
111
 
112
  $h = max($h, $child_h);
 
 
 
 
 
 
 
113
  }
114
 
115
 
@@ -180,12 +186,5 @@ class Inline_Renderer extends Abstract_Renderer {
180
  if ( $href = $link_node->getAttribute("href") )
181
  $this->_canvas->add_link($href, $x, $y, $w, $h);
182
  }
183
-
184
- if (DEBUG_LAYOUT && DEBUG_LAYOUT_INLINE) {
185
- $this->_debug_layout($child->get_border_box(), "blue");
186
- if (DEBUG_LAYOUT_PADDINGBOX) {
187
- $this->_debug_layout($child->get_padding_box(), "blue", array(0.5, 0.5));
188
- }
189
- }
190
  }
191
  }
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
109
  $w += $child_w;
110
 
111
  $h = max($h, $child_h);
112
+
113
+ if (DEBUG_LAYOUT && DEBUG_LAYOUT_INLINE) {
114
+ $this->_debug_layout($child->get_border_box(), "blue");
115
+ if (DEBUG_LAYOUT_PADDINGBOX) {
116
+ $this->_debug_layout($child->get_padding_box(), "blue", array(0.5, 0.5));
117
+ }
118
+ }
119
  }
120
 
121
 
186
  if ( $href = $link_node->getAttribute("href") )
187
  $this->_canvas->add_link($href, $x, $y, $w, $h);
188
  }
 
 
 
 
 
 
 
189
  }
190
  }
dompdf/include/javascript_embedder.cls.php CHANGED
@@ -2,9 +2,8 @@
2
  /**
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
- * @author Fabien M�nager <fabien.menager@gmail.com>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: javascript_embedder.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -24,13 +23,14 @@ class Javascript_Embedder {
24
  $this->_dompdf = $dompdf;
25
  }
26
 
27
- function insert($code) {
28
- $this->_dompdf->get_canvas()->javascript($code);
29
  }
30
 
31
- function render($frame) {
32
- if ( !DOMPDF_ENABLE_JAVASCRIPT )
33
  return;
 
34
 
35
  $this->insert($frame->get_node()->nodeValue);
36
  }
2
  /**
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
+ * @author Fabien Ménager <fabien.menager@gmail.com>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
23
  $this->_dompdf = $dompdf;
24
  }
25
 
26
+ function insert($script) {
27
+ $this->_dompdf->get_canvas()->javascript($script);
28
  }
29
 
30
+ function render(Frame $frame) {
31
+ if ( !$this->_dompdf->get_option("enable_javascript") ) {
32
  return;
33
+ }
34
 
35
  $this->insert($frame->get_node()->nodeValue);
36
  }
dompdf/include/line_box.cls.php CHANGED
@@ -2,9 +2,8 @@
2
  /**
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
- * @author Fabien M�nager <fabien.menager@gmail.com>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: line_box.cls.php 471 2012-02-06 21:59:10Z fabien.menager $
8
  */
9
 
10
  /**
@@ -24,7 +23,7 @@ class Line_Box {
24
  protected $_block_frame;
25
 
26
  /**
27
- * @var array
28
  */
29
  protected $_frames = array();
30
 
@@ -62,7 +61,10 @@ class Line_Box {
62
  * @var Frame
63
  */
64
  public $tallest_frame = null;
65
-
 
 
 
66
  public $floating_blocks = array();
67
 
68
  /**
@@ -85,23 +87,30 @@ class Line_Box {
85
 
86
  /**
87
  * Returns the floating elements inside the first floating parent
88
- * @param $root
 
 
 
89
  */
90
- function get_floats_inside($root) {
 
 
 
 
 
 
91
  // Find nearest floating element
92
  $p = $this->_block_frame;
93
  while( $p->get_style()->float === "none" ) {
94
  $parent = $p->get_parent();
95
 
96
- if (!$parent) {
97
  break;
98
  }
99
 
100
  $p = $parent;
101
  }
102
 
103
- $floating_frames = $root->get_floating_frames();
104
-
105
  if ( $p == $root ) {
106
  return $floating_frames;
107
  }
@@ -113,19 +122,19 @@ class Line_Box {
113
  foreach ($floating_frames as $_floating) {
114
  $p = $_floating->get_parent();
115
 
116
- while(($p = $p->get_parent()) && $p !== $parent);
117
 
118
- if ($p) {
119
  $childs[] = $p;
120
  }
121
  }
122
 
123
  return $childs;
124
-
125
  }
126
 
127
  function get_float_offsets() {
128
- if ( !DOMPDF_ENABLE_CSS_FLOAT ) {
 
129
  return;
130
  }
131
 
@@ -133,12 +142,19 @@ class Line_Box {
133
 
134
  $reflower = $this->_block_frame->get_reflower();
135
 
136
- if ( !$reflower ) return;
 
 
137
 
138
  $cb_w = null;
139
 
140
  $block = $this->_block_frame;
141
  $root = $block->get_root();
 
 
 
 
 
142
  $floating_frames = $this->get_floats_inside($root);
143
 
144
  foreach ( $floating_frames as $child_key => $floating_frame ) {
@@ -149,8 +165,6 @@ class Line_Box {
149
  }
150
 
151
  $floating_style = $floating_frame->get_style();
152
-
153
- $clear = $floating_style->clear;
154
  $float = $floating_style->float;
155
 
156
  $floating_width = $floating_frame->get_margin_width();
@@ -161,7 +175,7 @@ class Line_Box {
161
 
162
  $line_w = $this->get_width();
163
 
164
- if (!$floating_frame->_float_next_line && ($cb_w <= $line_w + $floating_width) && ($cb_w > $line_w) ) {
165
  $floating_frame->_float_next_line = true;
166
  continue;
167
  }
@@ -185,7 +199,10 @@ class Line_Box {
185
  }
186
  }
187
  }
188
-
 
 
 
189
  function get_width(){
190
  return $this->left + $this->w + $this->right;
191
  }
@@ -193,13 +210,20 @@ class Line_Box {
193
  /**
194
  * @return Block_Frame_Decorator
195
  */
196
- function get_block_frame() { return $this->_block_frame; }
 
 
197
 
198
  /**
199
- * @return array
 
 
 
 
 
 
 
200
  */
201
- function &get_frames() { return $this->_frames; }
202
-
203
  function add_frame(Frame $frame) {
204
  $this->_frames[] = $frame;
205
  }
2
  /**
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
+ * @author Fabien Ménager <fabien.menager@gmail.com>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
23
  protected $_block_frame;
24
 
25
  /**
26
+ * @var Frame[]
27
  */
28
  protected $_frames = array();
29
 
61
  * @var Frame
62
  */
63
  public $tallest_frame = null;
64
+
65
+ /**
66
+ * @var bool[]
67
+ */
68
  public $floating_blocks = array();
69
 
70
  /**
87
 
88
  /**
89
  * Returns the floating elements inside the first floating parent
90
+ *
91
+ * @param Page_Frame_Decorator $root
92
+ *
93
+ * @return Frame[]
94
  */
95
+ function get_floats_inside(Page_Frame_Decorator $root) {
96
+ $floating_frames = $root->get_floating_frames();
97
+
98
+ if ( count($floating_frames) == 0 ) {
99
+ return $floating_frames;
100
+ }
101
+
102
  // Find nearest floating element
103
  $p = $this->_block_frame;
104
  while( $p->get_style()->float === "none" ) {
105
  $parent = $p->get_parent();
106
 
107
+ if ( !$parent ) {
108
  break;
109
  }
110
 
111
  $p = $parent;
112
  }
113
 
 
 
114
  if ( $p == $root ) {
115
  return $floating_frames;
116
  }
122
  foreach ($floating_frames as $_floating) {
123
  $p = $_floating->get_parent();
124
 
125
+ while (($p = $p->get_parent()) && $p !== $parent);
126
 
127
+ if ( $p ) {
128
  $childs[] = $p;
129
  }
130
  }
131
 
132
  return $childs;
 
133
  }
134
 
135
  function get_float_offsets() {
136
+ $enable_css_float = $this->_block_frame->get_dompdf()->get_option("enable_css_float");
137
+ if ( !$enable_css_float ) {
138
  return;
139
  }
140
 
142
 
143
  $reflower = $this->_block_frame->get_reflower();
144
 
145
+ if ( !$reflower ) {
146
+ return;
147
+ }
148
 
149
  $cb_w = null;
150
 
151
  $block = $this->_block_frame;
152
  $root = $block->get_root();
153
+
154
+ if ( !$root ) {
155
+ return;
156
+ }
157
+
158
  $floating_frames = $this->get_floats_inside($root);
159
 
160
  foreach ( $floating_frames as $child_key => $floating_frame ) {
165
  }
166
 
167
  $floating_style = $floating_frame->get_style();
 
 
168
  $float = $floating_style->float;
169
 
170
  $floating_width = $floating_frame->get_margin_width();
175
 
176
  $line_w = $this->get_width();
177
 
178
+ if ( !$floating_frame->_float_next_line && ($cb_w <= $line_w + $floating_width) && ($cb_w > $line_w) ) {
179
  $floating_frame->_float_next_line = true;
180
  continue;
181
  }
199
  }
200
  }
201
  }
202
+
203
+ /**
204
+ * @return float
205
+ */
206
  function get_width(){
207
  return $this->left + $this->w + $this->right;
208
  }
210
  /**
211
  * @return Block_Frame_Decorator
212
  */
213
+ function get_block_frame() {
214
+ return $this->_block_frame;
215
+ }
216
 
217
  /**
218
+ * @return Frame[]
219
+ */
220
+ function &get_frames() {
221
+ return $this->_frames;
222
+ }
223
+
224
+ /**
225
+ * @param Frame $frame
226
  */
 
 
227
  function add_frame(Frame $frame) {
228
  $this->_frames[] = $frame;
229
  }
dompdf/include/list_bullet_frame_decorator.cls.php CHANGED
@@ -5,7 +5,6 @@
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: list_bullet_frame_decorator.cls.php 451 2012-01-14 14:54:23Z fabien.menager $
9
  */
10
 
11
  /**
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
dompdf/include/list_bullet_frame_reflower.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: list_bullet_frame_reflower.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -19,7 +18,7 @@ class List_Bullet_Frame_Reflower extends Frame_Reflower {
19
 
20
  //........................................................................
21
 
22
- function reflow(Frame_Decorator $block = null) {
23
  $style = $this->_frame->get_style();
24
 
25
  $style->width = $this->_frame->get_width();
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
18
 
19
  //........................................................................
20
 
21
+ function reflow(Block_Frame_Decorator $block = null) {
22
  $style = $this->_frame->get_style();
23
 
24
  $style->width = $this->_frame->get_width();
dompdf/include/list_bullet_image_frame_decorator.cls.php CHANGED
@@ -5,7 +5,6 @@
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: list_bullet_image_frame_decorator.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
@@ -54,8 +53,9 @@ class List_Bullet_Image_Frame_Decorator extends Frame_Decorator {
54
  // Resample the bullet image to be consistent with 'auto' sized images
55
  // See also Image_Frame_Reflower::get_min_max_width
56
  // Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary.
57
- $this->_width = (((float)rtrim($width, "px")) * 72) / DOMPDF_DPI;
58
- $this->_height = (((float)rtrim($height, "px")) * 72) / DOMPDF_DPI;
 
59
 
60
  //If an image is taller as the containing block/box, the box should be extended.
61
  //Neighbour elements are overwriting the overlapping image areas.
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
53
  // Resample the bullet image to be consistent with 'auto' sized images
54
  // See also Image_Frame_Reflower::get_min_max_width
55
  // Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary.
56
+ $dpi = $this->_dompdf->get_option("dpi");
57
+ $this->_width = ((float)rtrim($width, "px") * 72) / $dpi;
58
+ $this->_height = ((float)rtrim($height, "px") * 72) / $dpi;
59
 
60
  //If an image is taller as the containing block/box, the box should be extended.
61
  //Neighbour elements are overwriting the overlapping image areas.
dompdf/include/list_bullet_positioner.cls.php CHANGED
@@ -5,7 +5,6 @@
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: list_bullet_positioner.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
dompdf/include/list_bullet_renderer.cls.php CHANGED
@@ -5,7 +5,6 @@
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: list_bullet_renderer.cls.php 468 2012-02-05 10:51:40Z fabien.menager $
9
  */
10
 
11
  /**
@@ -63,7 +62,13 @@ class List_Bullet_Renderer extends Abstract_Renderer {
63
  return $cache[$type] = "$text.";
64
  }
65
 
66
- //........................................................................
 
 
 
 
 
 
67
  private function make_counter($n, $type, $pad = null){
68
  $n = intval($n);
69
  $text = "";
@@ -130,8 +135,9 @@ class List_Bullet_Renderer extends Abstract_Renderer {
130
  //$w = $frame->get_width();
131
  //$h = $frame->get_height();
132
  list($width, $height) = dompdf_getimagesize($img);
133
- $w = (((float)rtrim($width, "px")) * 72) / DOMPDF_DPI;
134
- $h = (((float)rtrim($height, "px")) * 72) / DOMPDF_DPI;
 
135
 
136
  $x -= $w;
137
  $y -= ($line_height - $font_size)/2; //Reverse hinting of list_bullet_positioner
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
62
  return $cache[$type] = "$text.";
63
  }
64
 
65
+ /**
66
+ * @param integer $n
67
+ * @param string $type
68
+ * @param integer $pad
69
+ *
70
+ * @return string
71
+ */
72
  private function make_counter($n, $type, $pad = null){
73
  $n = intval($n);
74
  $text = "";
135
  //$w = $frame->get_width();
136
  //$h = $frame->get_height();
137
  list($width, $height) = dompdf_getimagesize($img);
138
+ $dpi = $this->_dompdf->get_option("dpi");
139
+ $w = ((float)rtrim($width, "px") * 72) / $dpi;
140
+ $h = ((float)rtrim($height, "px") * 72) / $dpi;
141
 
142
  $x -= $w;
143
  $y -= ($line_height - $font_size)/2; //Reverse hinting of list_bullet_positioner
dompdf/include/null_frame_decorator.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: null_frame_decorator.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/null_frame_reflower.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: null_frame_reflower.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -17,6 +16,6 @@ class Null_Frame_Reflower extends Frame_Reflower {
17
 
18
  function __construct(Frame $frame) { parent::__construct($frame); }
19
 
20
- function reflow(Frame_Decorator $block = null) { return; }
21
 
22
  }
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
16
 
17
  function __construct(Frame $frame) { parent::__construct($frame); }
18
 
19
+ function reflow(Block_Frame_Decorator $block = null) { return; }
20
 
21
  }
dompdf/include/null_positioner.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: null_positioner.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/page_cache.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: page_cache.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -24,7 +23,7 @@ class Page_Cache {
24
 
25
  static private $__connection = null;
26
 
27
- function init() {
28
  if ( is_null(self::$__connection) ) {
29
  $con_str = "host=" . DB_HOST .
30
  " dbname=" . self::DB_NAME .
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
23
 
24
  static private $__connection = null;
25
 
26
+ static function init() {
27
  if ( is_null(self::$__connection) ) {
28
  $con_str = "host=" . DB_HOST .
29
  " dbname=" . self::DB_NAME .
dompdf/include/page_frame_decorator.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: page_frame_decorator.cls.php 457 2012-01-22 11:48:20Z fabien.menager $
8
  */
9
 
10
  /**
@@ -55,7 +54,8 @@ class Page_Frame_Decorator extends Frame_Decorator {
55
  /**
56
  * Class constructor
57
  *
58
- * @param Frame $frame the frame to decorate
 
59
  */
60
  function __construct(Frame $frame, DOMPDF $dompdf) {
61
  parent::__construct($frame, $dompdf);
@@ -152,7 +152,7 @@ class Page_Frame_Decorator extends Frame_Decorator {
152
 
153
  // Skip check if page is already split
154
  if ( $this->_page_full )
155
- return;
156
 
157
  $block_types = array("block", "list-item", "table", "inline");
158
  $page_breaks = array("always", "left", "right");
@@ -501,6 +501,11 @@ class Page_Frame_Decorator extends Frame_Decorator {
501
  else if ( !$next->is_table() && $iter->is_table() )
502
  $this->_in_table--;
503
 
 
 
 
 
 
504
  $iter = $next;
505
  $flg = false;
506
  continue;
@@ -549,21 +554,23 @@ class Page_Frame_Decorator extends Frame_Decorator {
549
 
550
  //........................................................................
551
 
552
- function split($frame = null, $force_pagebreak = false) {
553
  // Do nothing
554
  }
555
-
556
  /**
557
  * Add a floating frame
558
- *
559
- * @param $child Frame
 
 
560
  */
561
  function add_floating_frame(Frame $frame) {
562
  array_unshift($this->_floating_frames, $frame);
563
  }
564
 
565
  /**
566
- * @return array
567
  */
568
  function get_floating_frames() {
569
  return $this->_floating_frames;
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
54
  /**
55
  * Class constructor
56
  *
57
+ * @param Frame $frame the frame to decorate
58
+ * @param DOMPDF $dompdf
59
  */
60
  function __construct(Frame $frame, DOMPDF $dompdf) {
61
  parent::__construct($frame, $dompdf);
152
 
153
  // Skip check if page is already split
154
  if ( $this->_page_full )
155
+ return null;
156
 
157
  $block_types = array("block", "list-item", "table", "inline");
158
  $page_breaks = array("always", "left", "right");
501
  else if ( !$next->is_table() && $iter->is_table() )
502
  $this->_in_table--;
503
 
504
+ // Avoid bug with whitespace after blocks
505
+ while ( $next = $iter->get_last_child() ) {
506
+ // Already selected last child, do nothing more
507
+ }
508
+
509
  $iter = $next;
510
  $flg = false;
511
  continue;
554
 
555
  //........................................................................
556
 
557
+ function split(Frame $frame = null, $force_pagebreak = false) {
558
  // Do nothing
559
  }
560
+
561
  /**
562
  * Add a floating frame
563
+ *
564
+ * @param Frame $frame
565
+ *
566
+ * @return void
567
  */
568
  function add_floating_frame(Frame $frame) {
569
  array_unshift($this->_floating_frames, $frame);
570
  }
571
 
572
  /**
573
+ * @return Frame[]
574
  */
575
  function get_floating_frames() {
576
  return $this->_floating_frames;
dompdf/include/page_frame_reflower.cls.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: page_frame_reflower.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
@@ -29,22 +28,8 @@ class Page_Frame_Reflower extends Frame_Reflower {
29
  * @var Canvas
30
  */
31
  private $_canvas;
32
-
33
- /**
34
- * The stacking context, containing all z-indexed frames
35
- * @var array
36
- */
37
- private $_stacking_context = array();
38
 
39
  function __construct(Page_Frame_Decorator $frame) { parent::__construct($frame); }
40
-
41
- /**
42
- * @param $frame Frame
43
- * @return void
44
- */
45
- function add_frame_to_stacking_context(Frame $frame, $z_index) {
46
- $this->_stacking_context[$z_index][] = $frame;
47
- }
48
 
49
  function apply_page_style(Frame $frame, $page_number){
50
  $style = $frame->get_style();
@@ -89,7 +74,7 @@ class Page_Frame_Reflower extends Frame_Reflower {
89
  * Paged layout:
90
  * http://www.w3.org/TR/CSS21/page.html
91
  */
92
- function reflow(Frame_Decorator $block = null) {
93
  $fixed_children = array();
94
  $prev_child = null;
95
  $child = $this->_frame->get_first_child();
@@ -141,24 +126,8 @@ class Page_Frame_Reflower extends Frame_Reflower {
141
  // Check for begin render callback
142
  $this->_check_callbacks("begin_page_render", $child);
143
 
144
- $renderer = $this->_frame->get_renderer();
145
-
146
  // Render the page
147
- $renderer->render($child);
148
-
149
- Renderer::$stacking_first_pass = false;
150
-
151
- // http://www.w3.org/TR/CSS21/visuren.html#z-index
152
- ksort($this->_stacking_context);
153
-
154
- foreach( $this->_stacking_context as $_frames ) {
155
- foreach ( $_frames as $_frame ) {
156
- $renderer->render($_frame);
157
- }
158
- }
159
-
160
- Renderer::$stacking_first_pass = true;
161
- $this->_stacking_context = array();
162
 
163
  // Check for end render callback
164
  $this->_check_callbacks("end_page_render", $child);
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
28
  * @var Canvas
29
  */
30
  private $_canvas;
 
 
 
 
 
 
31
 
32
  function __construct(Page_Frame_Decorator $frame) { parent::__construct($frame); }
 
 
 
 
 
 
 
 
33
 
34
  function apply_page_style(Frame $frame, $page_number){
35
  $style = $frame->get_style();
74
  * Paged layout:
75
  * http://www.w3.org/TR/CSS21/page.html
76
  */
77
+ function reflow(Block_Frame_Decorator $block = null) {
78
  $fixed_children = array();
79
  $prev_child = null;
80
  $child = $this->_frame->get_first_child();
126
  // Check for begin render callback
127
  $this->_check_callbacks("begin_page_render", $child);
128
 
 
 
129
  // Render the page
130
+ $this->_frame->get_renderer()->render($child);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
 
132
  // Check for end render callback
133
  $this->_check_callbacks("end_page_render", $child);
dompdf/include/pdflib_adapter.cls.php CHANGED
@@ -5,7 +5,6 @@
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: pdflib_adapter.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
9
  */
10
 
11
  /**
@@ -30,8 +29,7 @@ class PDFLib_Adapter implements Canvas {
30
  *
31
  * @var array;
32
  */
33
- static public $PAPER_SIZES = array(); // Set to
34
- // CPDF_Adapter::$PAPER_SIZES below.
35
 
36
  /**
37
  * Whether to create PDFs in memory or on disk
@@ -40,6 +38,11 @@ class PDFLib_Adapter implements Canvas {
40
  */
41
  static $IN_MEMORY = true;
42
 
 
 
 
 
 
43
  /**
44
  * Instance of PDFLib class
45
  *
@@ -64,7 +67,7 @@ class PDFLib_Adapter implements Canvas {
64
  /**
65
  * PDF height, in points
66
  *
67
- * @var height
68
  */
69
  private $_height;
70
 
@@ -134,17 +137,21 @@ class PDFLib_Adapter implements Canvas {
134
  /**
135
  * Class constructor
136
  *
137
- * @param mixed $paper The size of paper to use either a string (see {@link CPDF_Adapter::$PAPER_SIZES}) or
138
- * an array(xmin,ymin,xmax,ymax)
139
  * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')
 
140
  */
141
- function __construct($paper = "letter", $orientation = "portrait") {
142
- if ( is_array($paper) )
143
  $size = $paper;
144
- else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) )
 
145
  $size = self::$PAPER_SIZES[mb_strtolower($paper)];
146
- else
 
147
  $size = self::$PAPER_SIZES["letter"];
 
148
 
149
  if ( mb_strtolower($orientation) === "landscape" ) {
150
  list($size[2], $size[3]) = array($size[3], $size[2]);
@@ -153,6 +160,8 @@ class PDFLib_Adapter implements Canvas {
153
  $this->_width = $size[2] - $size[0];
154
  $this->_height= $size[3] - $size[1];
155
 
 
 
156
  $this->_pdf = new PDFLib();
157
 
158
  if ( defined("DOMPDF_PDFLIB_LICENSE") )
@@ -172,16 +181,17 @@ class PDFLib_Adapter implements Canvas {
172
  if ( self::$IN_MEMORY )
173
  $this->_pdf->begin_document("","");
174
  else {
175
- $tempname = tempnam(DOMPDF_TEMP_DIR, "libdompdf_pdf_");
176
- @unlink($tempname);
177
- $this->_file = "$tempname.pdf";
 
178
  $this->_pdf->begin_document($this->_file,"");
179
  }
180
 
181
  $this->_pdf->begin_page_ext($this->_width, $this->_height, "");
182
 
183
  $this->_page_number = $this->_page_count = 1;
184
- $this->_page_text = array();
185
 
186
  $this->_imgs = array();
187
  $this->_fonts = array();
@@ -189,39 +199,47 @@ class PDFLib_Adapter implements Canvas {
189
 
190
  // Set up font paths
191
  $families = Font_Metrics::get_font_families();
192
- foreach ($families as $family => $files) {
193
- foreach ($files as $style => $file) {
194
  $face = basename($file);
 
195
 
196
  // Prefer ttfs to afms
197
  if ( file_exists("$file.ttf") ) {
198
  $outline = "$file.ttf";
199
- $afm = null;
200
 
201
  } else if ( file_exists("$file.TTF") ) {
202
  $outline = "$file.TTF";
203
- $afm = null;
204
 
205
  } else if ( file_exists("$file.pfb") ) {
206
  $outline = "$file.pfb";
207
 
208
- if ( file_exists("$file.afm") )
209
  $afm = "$file.afm";
 
210
 
211
  } else if ( file_exists("$file.PFB") ) {
212
  $outline = "$file.PFB";
213
- if ( file_exists("$file.AFM") )
214
  $afm = "$file.AFM";
215
- } else
 
216
  continue;
 
217
 
218
  $this->_pdf->set_parameter("FontOutline", "\{$face\}=\{$outline\}");
219
- if ( !is_null($afm) )
 
220
  $this->_pdf->set_parameter("FontAFM", "\{$face\}=\{$afm\}");
 
221
  }
222
  }
223
  }
224
 
 
 
 
 
225
  /**
226
  * Close the pdf
227
  */
@@ -244,7 +262,9 @@ class PDFLib_Adapter implements Canvas {
244
  *
245
  * @return PDFLib
246
  */
247
- function get_pdflib() { return $this->_pdf; }
 
 
248
 
249
  /**
250
  * Add meta information to the PDF
@@ -280,10 +300,12 @@ class PDFLib_Adapter implements Canvas {
280
 
281
  /**
282
  * Reopen an existing object (NOT IMPLEMENTED)
283
- *
284
  * PDFLib does not seem to support reopening templates.
285
  *
286
  * @param int $object the ID of a previously opened object
 
 
 
287
  */
288
  function reopen_object($object) {
289
  throw new DOMPDF_Exception("PDFLib does not support reopening objects.");
@@ -333,7 +355,7 @@ class PDFLib_Adapter implements Canvas {
333
  * The object will stop being displayed on the page following the
334
  * current one.
335
  *
336
- * @param int $object
337
  */
338
  function stop_object($object) {
339
 
@@ -347,8 +369,9 @@ class PDFLib_Adapter implements Canvas {
347
  if ( $this->_page_number >= $start &&
348
  (($this->_page_number % 2 == 0 && $where === "even") ||
349
  ($this->_page_number % 2 == 1 && $where === "odd") ||
350
- ($where === "all")) )
351
- $this->_pdf->fit_image($object,0,0,"");
 
352
 
353
  $this->_objs[$object] = null;
354
  unset($this->_objs[$object]);
@@ -390,10 +413,12 @@ class PDFLib_Adapter implements Canvas {
390
  /**
391
  * Sets the line style
392
  *
393
- * @param float width
394
- * @param string corner
395
- * @param string join
396
- * @param array dash
 
 
397
  */
398
  protected function _set_line_style($width, $cap, $join, $dash) {
399
 
@@ -530,6 +555,9 @@ class PDFLib_Adapter implements Canvas {
530
  * Loads a specific font and stores the corresponding descriptor.
531
  *
532
  * @param string $font
 
 
 
533
  * @return int the font descriptor for the font
534
  */
535
  protected function _load_font($font, $encoding = null, $options = "") {
@@ -580,6 +608,15 @@ class PDFLib_Adapter implements Canvas {
580
 
581
  //........................................................................
582
 
 
 
 
 
 
 
 
 
 
583
  function line($x1, $y1, $x2, $y2, $color, $width, $style = null) {
584
  $this->_set_line_style($width, "butt", "", $style);
585
  $this->_set_stroke_color($color);
@@ -587,10 +624,20 @@ class PDFLib_Adapter implements Canvas {
587
  $y1 = $this->y($y1);
588
  $y2 = $this->y($y2);
589
 
590
- $this->_pdf->moveto($x1,$y1);
591
  $this->_pdf->lineto($x2, $y2);
592
  $this->_pdf->stroke();
593
  }
 
 
 
 
 
 
 
 
 
 
594
 
595
  //........................................................................
596
 
@@ -624,6 +671,11 @@ class PDFLib_Adapter implements Canvas {
624
  $this->_pdf->clip();
625
  }
626
 
 
 
 
 
 
627
  function clipping_end() {
628
  $this->_pdf->restore();
629
  }
@@ -721,15 +773,14 @@ class PDFLib_Adapter implements Canvas {
721
  $img_type = Image_Cache::detect_type($img_url);
722
  $img_ext = Image_Cache::type_to_ext($img_type);
723
 
724
- if ( isset($this->_imgs[$img_url]) ) {
725
- $img = $this->_imgs[$img_url];
726
- }
727
- else {
728
- $img = $this->_imgs[$img_url] = $this->_pdf->load_image($img_type, $img_url, "");
729
  }
730
 
 
 
731
  $y = $this->y($y) - $h;
732
- $this->_pdf->fit_image($img, $x, $y, "boxsize=\{$w $h\} fitmethod=entire");
733
  }
734
 
735
  //........................................................................
@@ -792,7 +843,7 @@ class PDFLib_Adapter implements Canvas {
792
 
793
  list($proto, $host, $path, $file) = explode_url($url);
794
 
795
- if ( $proto == "" || $proto === "file://" )
796
  return; // Local links are not allowed
797
  $url = build_url($proto, $host, $path, $file);
798
  $url = '{' . rawurldecode($url) . '}';
@@ -831,11 +882,13 @@ class PDFLib_Adapter implements Canvas {
831
  $desc = $this->_pdf->get_value("descender", $fh);
832
 
833
  // $desc is usually < 0,
834
- return $size * ($asc - $desc) * DOMPDF_FONT_HEIGHT_RATIO;
 
835
  }
836
 
837
  function get_font_baseline($font, $size) {
838
- return $this->get_font_height($font, $size) / DOMPDF_FONT_HEIGHT_RATIO * 1.1;
 
839
  }
840
 
841
  //........................................................................
@@ -854,13 +907,13 @@ class PDFLib_Adapter implements Canvas {
854
  * @param string $font the font file to use
855
  * @param float $size the font size, in points
856
  * @param array $color
857
- * @param float $adjust word spacing adjustment
 
858
  * @param float $angle angle to write the text at, measured CW starting from the x-axis
859
  */
860
- function page_text($x, $y, $text, $font, $size, $color = array(0,0,0),
861
- $adjust = 0, $angle = 0) {
862
  $_t = "text";
863
- $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "adjust", "angle");
864
  }
865
 
866
  //........................................................................
@@ -917,7 +970,7 @@ class PDFLib_Adapter implements Canvas {
917
  case "text":
918
  $text = str_replace(array("{PAGE_NUM}","{PAGE_COUNT}"),
919
  array($p, $this->_page_count), $text);
920
- $this->text($x, $y, $text, $font, $size, $color, $adjust, $angle);
921
  break;
922
 
923
  case "script":
@@ -949,12 +1002,14 @@ class PDFLib_Adapter implements Canvas {
949
 
950
  $this->_close();
951
 
 
 
952
  if ( self::$IN_MEMORY ) {
953
  $data = $this->_pdf->get_buffer();
954
- $size = strlen($data);
955
-
956
- } else
957
- $size = filesize($this->_file);
958
 
959
 
960
  $filename = str_replace(array("\n","'"),"", $filename);
@@ -976,7 +1031,7 @@ class PDFLib_Adapter implements Canvas {
976
  $fh = fopen($this->_file, "rb");
977
  if ( !$fh )
978
  throw new DOMPDF_Exception("Unable to load temporary PDF file: " . $this->_file);
979
-
980
  while ( !feof($fh) )
981
  echo fread($fh,$chunk);
982
  fclose($fh);
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
29
  *
30
  * @var array;
31
  */
32
+ static public $PAPER_SIZES = array(); // Set to CPDF_Adapter::$PAPER_SIZES below.
 
33
 
34
  /**
35
  * Whether to create PDFs in memory or on disk
38
  */
39
  static $IN_MEMORY = true;
40
 
41
+ /**
42
+ * @var DOMPDF
43
+ */
44
+ private $_dompdf;
45
+
46
  /**
47
  * Instance of PDFLib class
48
  *
67
  /**
68
  * PDF height, in points
69
  *
70
+ * @var float
71
  */
72
  private $_height;
73
 
137
  /**
138
  * Class constructor
139
  *
140
+ * @param mixed $paper The size of paper to use either a string (see {@link CPDF_Adapter::$PAPER_SIZES}) or
141
+ * an array(xmin,ymin,xmax,ymax)
142
  * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')
143
+ * @param DOMPDF $dompdf
144
  */
145
+ function __construct($paper = "letter", $orientation = "portrait", DOMPDF $dompdf) {
146
+ if ( is_array($paper) ) {
147
  $size = $paper;
148
+ }
149
+ else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) ) {
150
  $size = self::$PAPER_SIZES[mb_strtolower($paper)];
151
+ }
152
+ else {
153
  $size = self::$PAPER_SIZES["letter"];
154
+ }
155
 
156
  if ( mb_strtolower($orientation) === "landscape" ) {
157
  list($size[2], $size[3]) = array($size[3], $size[2]);
160
  $this->_width = $size[2] - $size[0];
161
  $this->_height= $size[3] - $size[1];
162
 
163
+ $this->_dompdf = $dompdf;
164
+
165
  $this->_pdf = new PDFLib();
166
 
167
  if ( defined("DOMPDF_PDFLIB_LICENSE") )
181
  if ( self::$IN_MEMORY )
182
  $this->_pdf->begin_document("","");
183
  else {
184
+ $tmp_dir = $this->_dompdf->get_options("temp_dir");
185
+ $tmp_name = tempnam($tmp_dir, "libdompdf_pdf_");
186
+ @unlink($tmp_name);
187
+ $this->_file = "$tmp_name.pdf";
188
  $this->_pdf->begin_document($this->_file,"");
189
  }
190
 
191
  $this->_pdf->begin_page_ext($this->_width, $this->_height, "");
192
 
193
  $this->_page_number = $this->_page_count = 1;
194
+ $this->_page_text = array();
195
 
196
  $this->_imgs = array();
197
  $this->_fonts = array();
199
 
200
  // Set up font paths
201
  $families = Font_Metrics::get_font_families();
202
+ foreach ($families as $files) {
203
+ foreach ($files as $file) {
204
  $face = basename($file);
205
+ $afm = null;
206
 
207
  // Prefer ttfs to afms
208
  if ( file_exists("$file.ttf") ) {
209
  $outline = "$file.ttf";
 
210
 
211
  } else if ( file_exists("$file.TTF") ) {
212
  $outline = "$file.TTF";
 
213
 
214
  } else if ( file_exists("$file.pfb") ) {
215
  $outline = "$file.pfb";
216
 
217
+ if ( file_exists("$file.afm") ) {
218
  $afm = "$file.afm";
219
+ }
220
 
221
  } else if ( file_exists("$file.PFB") ) {
222
  $outline = "$file.PFB";
223
+ if ( file_exists("$file.AFM") ) {
224
  $afm = "$file.AFM";
225
+ }
226
+ } else {
227
  continue;
228
+ }
229
 
230
  $this->_pdf->set_parameter("FontOutline", "\{$face\}=\{$outline\}");
231
+
232
+ if ( !is_null($afm) ) {
233
  $this->_pdf->set_parameter("FontAFM", "\{$face\}=\{$afm\}");
234
+ }
235
  }
236
  }
237
  }
238
 
239
+ function get_dompdf(){
240
+ return $this->_dompdf;
241
+ }
242
+
243
  /**
244
  * Close the pdf
245
  */
262
  *
263
  * @return PDFLib
264
  */
265
+ function get_pdflib() {
266
+ return $this->_pdf;
267
+ }
268
 
269
  /**
270
  * Add meta information to the PDF
300
 
301
  /**
302
  * Reopen an existing object (NOT IMPLEMENTED)
 
303
  * PDFLib does not seem to support reopening templates.
304
  *
305
  * @param int $object the ID of a previously opened object
306
+ *
307
+ * @throws DOMPDF_Exception
308
+ * @return void
309
  */
310
  function reopen_object($object) {
311
  throw new DOMPDF_Exception("PDFLib does not support reopening objects.");
355
  * The object will stop being displayed on the page following the
356
  * current one.
357
  *
358
+ * @param int $object
359
  */
360
  function stop_object($object) {
361
 
369
  if ( $this->_page_number >= $start &&
370
  (($this->_page_number % 2 == 0 && $where === "even") ||
371
  ($this->_page_number % 2 == 1 && $where === "odd") ||
372
+ ($where === "all")) ) {
373
+ $this->_pdf->fit_image($object, 0, 0, "");
374
+ }
375
 
376
  $this->_objs[$object] = null;
377
  unset($this->_objs[$object]);
413
  /**
414
  * Sets the line style
415
  *
416
+ * @param float $width
417
+ * @param $cap
418
+ * @param string $join
419
+ * @param array $dash
420
+ *
421
+ * @return void
422
  */
423
  protected function _set_line_style($width, $cap, $join, $dash) {
424
 
555
  * Loads a specific font and stores the corresponding descriptor.
556
  *
557
  * @param string $font
558
+ * @param string $encoding
559
+ * @param string $options
560
+ *
561
  * @return int the font descriptor for the font
562
  */
563
  protected function _load_font($font, $encoding = null, $options = "") {
608
 
609
  //........................................................................
610
 
611
+ /**
612
+ * @param float $x1
613
+ * @param float $y1
614
+ * @param float $x2
615
+ * @param float $y2
616
+ * @param array $color
617
+ * @param float $width
618
+ * @param array $style
619
+ */
620
  function line($x1, $y1, $x2, $y2, $color, $width, $style = null) {
621
  $this->_set_line_style($width, "butt", "", $style);
622
  $this->_set_stroke_color($color);
624
  $y1 = $this->y($y1);
625
  $y2 = $this->y($y2);
626
 
627
+ $this->_pdf->moveto($x1, $y1);
628
  $this->_pdf->lineto($x2, $y2);
629
  $this->_pdf->stroke();
630
  }
631
+
632
+ function arc($x1, $y1, $r1, $r2, $astart, $aend, $color, $width, $style = array()) {
633
+ $this->_set_line_style($width, "butt", "", $style);
634
+ $this->_set_stroke_color($color);
635
+
636
+ $y1 = $this->y($y1);
637
+
638
+ $this->_pdf->arc($x1, $y1, $r1, $astart, $aend);
639
+ $this->_pdf->stroke();
640
+ }
641
 
642
  //........................................................................
643
 
671
  $this->_pdf->clip();
672
  }
673
 
674
+ function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) {
675
+ // @todo
676
+ $this->clipping_rectangle($x1, $y1, $w, $h);
677
+ }
678
+
679
  function clipping_end() {
680
  $this->_pdf->restore();
681
  }
773
  $img_type = Image_Cache::detect_type($img_url);
774
  $img_ext = Image_Cache::type_to_ext($img_type);
775
 
776
+ if ( !isset($this->_imgs[$img_url]) ) {
777
+ $this->_imgs[$img_url] = $this->_pdf->load_image($img_ext, $img_url, "");
 
 
 
778
  }
779
 
780
+ $img = $this->_imgs[$img_url];
781
+
782
  $y = $this->y($y) - $h;
783
+ $this->_pdf->fit_image($img, $x, $y, 'boxsize={'."$w $h".'} fitmethod=entire');
784
  }
785
 
786
  //........................................................................
843
 
844
  list($proto, $host, $path, $file) = explode_url($url);
845
 
846
+ if ( $proto == "" || $proto === "file://" )
847
  return; // Local links are not allowed
848
  $url = build_url($proto, $host, $path, $file);
849
  $url = '{' . rawurldecode($url) . '}';
882
  $desc = $this->_pdf->get_value("descender", $fh);
883
 
884
  // $desc is usually < 0,
885
+ $ratio = $this->_dompdf->get_option("font_height_ratio");
886
+ return $size * ($asc - $desc) * $ratio;
887
  }
888
 
889
  function get_font_baseline($font, $size) {
890
+ $ratio = $this->_dompdf->get_option("font_height_ratio");
891
+ return $this->get_font_height($font, $size) / $ratio * 1.1;
892
  }
893
 
894
  //........................................................................
907
  * @param string $font the font file to use
908
  * @param float $size the font size, in points
909
  * @param array $color
910
+ * @param float $word_space word spacing adjustment
911
+ * @param float $char_space char spacing adjustment
912
  * @param float $angle angle to write the text at, measured CW starting from the x-axis
913
  */
914
+ function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0) {
 
915
  $_t = "text";
916
+ $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "word_space", "char_space", "angle");
917
  }
918
 
919
  //........................................................................
970
  case "text":
971
  $text = str_replace(array("{PAGE_NUM}","{PAGE_COUNT}"),
972
  array($p, $this->_page_count), $text);
973
+ $this->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle);
974
  break;
975
 
976
  case "script":
1002
 
1003
  $this->_close();
1004
 
1005
+ $data = "";
1006
+
1007
  if ( self::$IN_MEMORY ) {
1008
  $data = $this->_pdf->get_buffer();
1009
+ //$size = strlen($data);
1010
+ } else {
1011
+ //$size = filesize($this->_file);
1012
+ }
1013
 
1014
 
1015
  $filename = str_replace(array("\n","'"),"", $filename);
1031
  $fh = fopen($this->_file, "rb");
1032
  if ( !$fh )
1033
  throw new DOMPDF_Exception("Unable to load temporary PDF file: " . $this->_file);
1034
+
1035
  while ( !feof($fh) )
1036
  echo fread($fh,$chunk);
1037
  fclose($fh);
dompdf/include/php_evaluator.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: php_evaluator.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -25,8 +24,9 @@ class PHP_Evaluator {
25
  }
26
 
27
  function evaluate($code, $vars = array()) {
28
- if ( !DOMPDF_ENABLE_PHP )
29
  return;
 
30
 
31
  // Set up some variables for the inline code
32
  $pdf = $this->_canvas;
@@ -39,10 +39,10 @@ class PHP_Evaluator {
39
  }
40
 
41
  //$code = html_entity_decode($code); // @todo uncomment this when tested
42
- eval(utf8_decode($code));
43
  }
44
 
45
- function render($frame) {
46
  $this->evaluate($frame->get_node()->nodeValue);
47
  }
48
  }
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
24
  }
25
 
26
  function evaluate($code, $vars = array()) {
27
+ if ( !$this->_canvas->get_dompdf()->get_option("enable_php") ) {
28
  return;
29
+ }
30
 
31
  // Set up some variables for the inline code
32
  $pdf = $this->_canvas;
39
  }
40
 
41
  //$code = html_entity_decode($code); // @todo uncomment this when tested
42
+ eval($code);
43
  }
44
 
45
+ function render(Frame $frame) {
46
  $this->evaluate($frame->get_node()->nodeValue);
47
  }
48
  }
dompdf/include/positioner.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: positioner.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/renderer.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: renderer.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -21,7 +20,7 @@ class Renderer extends Abstract_Renderer {
21
  /**
22
  * Array of renderers for specific frame types
23
  *
24
- * @var array
25
  */
26
  protected $_renderers;
27
 
@@ -32,12 +31,6 @@ class Renderer extends Abstract_Renderer {
32
  */
33
  private $_callbacks;
34
 
35
- /**
36
- * true when a stacking context is currently built
37
- * @var bool
38
- */
39
- public static $stacking_first_pass = true;
40
-
41
  /**
42
  * Class destructor
43
  */
@@ -57,7 +50,7 @@ class Renderer extends Abstract_Renderer {
57
  *
58
  * @param Frame $frame the frame to render
59
  */
60
- function render(Frame $frame, $stacking = false) {
61
  global $_dompdf_debug;
62
 
63
  if ( $_dompdf_debug ) {
@@ -70,134 +63,145 @@ class Renderer extends Abstract_Renderer {
70
  if ( in_array($style->visibility, array("hidden", "collapse")) ) {
71
  return;
72
  }
73
-
74
- $render_self = self::$stacking_first_pass && !$stacking || !self::$stacking_first_pass;
75
 
76
- if ( $render_self ) {
77
- $display = $style->display;
 
 
 
 
 
78
 
79
- // Starts the CSS transformation
80
- if ( $style->transform && is_array($style->transform) ) {
81
- $this->_canvas->save();
82
- list($x, $y, $w, $h) = $frame->get_padding_box();
83
- $origin = $style->transform_origin;
84
-
85
- foreach($style->transform as $transform) {
86
- list($function, $values) = $transform;
87
- if ( $function === "matrix" ) {
88
- $function = "transform";
89
- }
90
-
91
- $values = array_map("floatval", $values);
92
- $values[] = $x + $style->length_in_pt($origin[0], $style->width);
93
- $values[] = $y + $style->length_in_pt($origin[1], $style->height);
94
-
95
- call_user_func_array(array($this->_canvas, $function), $values);
96
  }
97
- }
98
-
99
- switch ($display) {
100
 
101
- case "block":
102
- case "list-item":
103
- case "inline-block":
104
- case "table":
105
- case "inline-table":
106
- $this->_render_frame("block", $frame);
107
- break;
108
-
109
- case "inline":
110
- if ( $frame->is_text_node() )
111
- $this->_render_frame("text", $frame);
112
- else
113
- $this->_render_frame("inline", $frame);
114
- break;
115
-
116
- case "table-cell":
117
- $this->_render_frame("table-cell", $frame);
118
- break;
119
-
120
- case "table-row-group":
121
- case "table-header-group":
122
- case "table-footer-group":
123
- $this->_render_frame("table-row-group", $frame);
124
- break;
125
-
126
- case "-dompdf-list-bullet":
127
- $this->_render_frame("list-bullet", $frame);
128
- break;
129
-
130
- case "-dompdf-image":
131
- $this->_render_frame("image", $frame);
132
- break;
133
 
134
- case "none":
135
- $node = $frame->get_node();
136
-
137
- if ( $node->nodeName === "script" ) {
138
- if ( $node->getAttribute("type") === "text/php" ||
139
- $node->getAttribute("language") === "php" ) {
140
- // Evaluate embedded php scripts
141
- $this->_render_frame("php", $frame);
142
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
 
144
- elseif ( $node->getAttribute("type") === "text/javascript" ||
145
- $node->getAttribute("language") === "javascript" ) {
146
- // Insert JavaScript
147
- $this->_render_frame("javascript", $frame);
148
- }
149
  }
150
-
151
- // Don't render children, so skip to next iter
152
- return;
153
 
154
- default:
155
- break;
156
-
 
 
157
  }
158
-
159
- // Check for begin frame callback
160
- $this->_check_callbacks("begin_frame", $frame);
 
 
 
 
 
 
 
 
 
 
 
 
 
161
 
162
- // Starts the overflow: hidden box
163
- if ( $style->overflow === "hidden" ) {
164
- list($x, $y, $w, $h) = $frame->get_padding_box();
 
165
  $this->_canvas->clipping_rectangle($x, $y, $w, $h);
166
  }
167
  }
168
-
169
- $page = $frame->get_root()->get_reflower();
170
 
171
  foreach ($frame->get_children() as $child) {
 
 
 
 
172
  $child_style = $child->get_style();
173
- $_stacking = $stacking;
 
174
 
175
- // Stacking context
176
- if ( self::$stacking_first_pass && (
177
- $child_style->z_index !== "auto" ||
178
- $child_style->float !== "none" ||
179
- $child->is_positionned()) ) {
180
- $z_index = ($child_style->z_index === "auto") ? 0 : intval($child_style->z_index);
181
- $page->add_frame_to_stacking_context($child, $z_index);
182
- $_stacking = true;
183
  }
184
 
185
- $this->render($child, $_stacking);
186
  }
187
-
188
- if ( $render_self ) {
189
- // Ends the overflow: hidden box
190
- if ( $style->overflow === "hidden" ) {
191
- $this->_canvas->clipping_end();
192
- }
193
-
194
- if ( $style->transform && is_array($style->transform) ) {
195
- $this->_canvas->restore();
196
  }
197
-
198
- // Check for end frame callback
199
- $this->_check_callbacks("end_frame", $frame);
200
  }
 
 
 
 
 
 
 
 
 
 
 
 
201
  }
202
 
203
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
20
  /**
21
  * Array of renderers for specific frame types
22
  *
23
+ * @var Abstract_Renderer[]
24
  */
25
  protected $_renderers;
26
 
31
  */
32
  private $_callbacks;
33
 
 
 
 
 
 
 
34
  /**
35
  * Class destructor
36
  */
50
  *
51
  * @param Frame $frame the frame to render
52
  */
53
+ function render(Frame $frame) {
54
  global $_dompdf_debug;
55
 
56
  if ( $_dompdf_debug ) {
63
  if ( in_array($style->visibility, array("hidden", "collapse")) ) {
64
  return;
65
  }
 
 
66
 
67
+ $display = $style->display;
68
+
69
+ // Starts the CSS transformation
70
+ if ( $style->transform && is_array($style->transform) ) {
71
+ $this->_canvas->save();
72
+ list($x, $y) = $frame->get_padding_box();
73
+ $origin = $style->transform_origin;
74
 
75
+ foreach($style->transform as $transform) {
76
+ list($function, $values) = $transform;
77
+ if ( $function === "matrix" ) {
78
+ $function = "transform";
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  }
 
 
 
80
 
81
+ $values = array_map("floatval", $values);
82
+ $values[] = $x + $style->length_in_pt($origin[0], $style->width);
83
+ $values[] = $y + $style->length_in_pt($origin[1], $style->height);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
 
85
+ call_user_func_array(array($this->_canvas, $function), $values);
86
+ }
87
+ }
88
+
89
+ switch ($display) {
90
+
91
+ case "block":
92
+ case "list-item":
93
+ case "inline-block":
94
+ case "table":
95
+ case "inline-table":
96
+ $this->_render_frame("block", $frame);
97
+ break;
98
+
99
+ case "inline":
100
+ if ( $frame->is_text_node() )
101
+ $this->_render_frame("text", $frame);
102
+ else
103
+ $this->_render_frame("inline", $frame);
104
+ break;
105
+
106
+ case "table-cell":
107
+ $this->_render_frame("table-cell", $frame);
108
+ break;
109
+
110
+ case "table-row-group":
111
+ case "table-header-group":
112
+ case "table-footer-group":
113
+ $this->_render_frame("table-row-group", $frame);
114
+ break;
115
+
116
+ case "-dompdf-list-bullet":
117
+ $this->_render_frame("list-bullet", $frame);
118
+ break;
119
+
120
+ case "-dompdf-image":
121
+ $this->_render_frame("image", $frame);
122
+ break;
123
+
124
+ case "none":
125
+ $node = $frame->get_node();
126
 
127
+ if ( $node->nodeName === "script" ) {
128
+ if ( $node->getAttribute("type") === "text/php" ||
129
+ $node->getAttribute("language") === "php" ) {
130
+ // Evaluate embedded php scripts
131
+ $this->_render_frame("php", $frame);
132
  }
 
 
 
133
 
134
+ elseif ( $node->getAttribute("type") === "text/javascript" ||
135
+ $node->getAttribute("language") === "javascript" ) {
136
+ // Insert JavaScript
137
+ $this->_render_frame("javascript", $frame);
138
+ }
139
  }
140
+
141
+ // Don't render children, so skip to next iter
142
+ return;
143
+
144
+ default:
145
+ break;
146
+
147
+ }
148
+
149
+ // Starts the overflow: hidden box
150
+ if ( $style->overflow === "hidden" ) {
151
+ list($x, $y, $w, $h) = $frame->get_padding_box();
152
+
153
+ // get border radii
154
+ $style = $frame->get_style();
155
+ list($tl, $tr, $br, $bl) = $style->get_computed_border_radius($w, $h);
156
 
157
+ if ( $tl + $tr + $br + $bl > 0 ) {
158
+ $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl);
159
+ }
160
+ else {
161
  $this->_canvas->clipping_rectangle($x, $y, $w, $h);
162
  }
163
  }
164
+
165
+ $stack = array();
166
 
167
  foreach ($frame->get_children() as $child) {
168
+ // < 0 : nagative z-index
169
+ // = 0 : no z-index, no stacking context
170
+ // = 1 : stacking context without z-index
171
+ // > 1 : z-index
172
  $child_style = $child->get_style();
173
+ $child_z_index = $child_style->z_index;
174
+ $z_index = 0;
175
 
176
+ if ( $child_z_index !== "auto" ) {
177
+ $z_index = intval($child_z_index) + 1;
178
+ }
179
+ elseif ( $child_style->float !== "none" || $child->is_positionned()) {
180
+ $z_index = 1;
 
 
 
181
  }
182
 
183
+ $stack[$z_index][] = $child;
184
  }
185
+
186
+ ksort($stack);
187
+
188
+ foreach ($stack as $by_index) {
189
+ foreach($by_index as $child) {
190
+ $this->render($child);
 
 
 
191
  }
 
 
 
192
  }
193
+
194
+ // Ends the overflow: hidden box
195
+ if ( $style->overflow === "hidden" ) {
196
+ $this->_canvas->clipping_end();
197
+ }
198
+
199
+ if ( $style->transform && is_array($style->transform) ) {
200
+ $this->_canvas->restore();
201
+ }
202
+
203
+ // Check for end frame callback
204
+ $this->_check_callbacks("end_frame", $frame);
205
  }
206
 
207
  /**
dompdf/include/style.cls.php CHANGED
@@ -4,9 +4,8 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
- * @author Fabien M�nager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
9
- * @version $Id: style.cls.php 469 2012-02-05 22:25:30Z fabien.menager $
10
  */
11
 
12
  /**
@@ -148,6 +147,8 @@ class Style {
148
  */
149
  protected $_parent_font_size; // Font size of parent element
150
 
 
 
151
  /**
152
  * @var Frame
153
  */
@@ -168,10 +169,21 @@ class Style {
168
  */
169
  private $__font_size_calculated; // Cache flag
170
 
 
 
 
 
 
 
 
 
 
 
171
  /**
172
  * Class constructor
173
  *
174
  * @param Stylesheet $stylesheet the stylesheet this Style is associated with.
 
175
  */
176
  function __construct(Stylesheet $stylesheet, $origin = Stylesheet::ORIG_AUTHOR) {
177
  $this->_props = array();
@@ -217,6 +229,11 @@ class Style {
217
  $d["border_bottom_width"] = "medium";
218
  $d["border_left_width"] = "medium";
219
  $d["border_width"] = "medium";
 
 
 
 
 
220
  $d["border"] = "";
221
  $d["bottom"] = "auto";
222
  $d["caption_side"] = "top";
@@ -235,7 +252,7 @@ class Style {
235
  $d["elevation"] = "level";
236
  $d["empty_cells"] = "show";
237
  $d["float"] = "none";
238
- $d["font_family"] = "serif";
239
  $d["font_size"] = "medium";
240
  $d["font_style"] = "normal";
241
  $d["font_variant"] = "normal";
@@ -415,11 +432,13 @@ class Style {
415
  function length_in_pt($length, $ref_size = null) {
416
  static $cache = array();
417
 
418
- if ( !is_array($length) )
419
  $length = array($length);
 
420
 
421
- if ( !isset($ref_size) )
422
  $ref_size = self::$default_font_size;
 
423
 
424
  $key = implode("@", $length)."/$ref_size";
425
 
@@ -430,11 +449,13 @@ class Style {
430
  $ret = 0;
431
  foreach ($length as $l) {
432
 
433
- if ( $l === "auto" )
434
  return "auto";
 
435
 
436
- if ( $l === "none" )
437
  return "none";
 
438
 
439
  // Assume numeric values are already in points
440
  if ( is_numeric($l) ) {
@@ -464,27 +485,28 @@ class Style {
464
  }
465
 
466
  if ( ($i = mb_strpos($l, "px")) !== false ) {
467
- $ret += ( mb_substr($l, 0, $i) * 72 ) / DOMPDF_DPI;
 
468
  continue;
469
  }
470
 
471
  if ( ($i = mb_strpos($l, "pt")) !== false ) {
472
- $ret += mb_substr($l, 0, $i);
473
  continue;
474
  }
475
 
476
  if ( ($i = mb_strpos($l, "%")) !== false ) {
477
- $ret += mb_substr($l, 0, $i)/100 * $ref_size;
478
  continue;
479
  }
480
 
481
  if ( ($i = mb_strpos($l, "rem")) !== false ) {
482
- $ret += mb_substr($l, 0, $i) * $this->_stylesheet->get_dompdf()->get_tree()->get_root()->get_style()->font_size;
483
  continue;
484
  }
485
 
486
  if ( ($i = mb_strpos($l, "em")) !== false ) {
487
- $ret += mb_substr($l, 0, $i) * $this->__get("font_size");
488
  continue;
489
  }
490
 
@@ -505,12 +527,12 @@ class Style {
505
  }
506
 
507
  if ( ($i = mb_strpos($l, "in")) !== false ) {
508
- $ret += mb_substr($l, 0, $i) * 72;
509
  continue;
510
  }
511
 
512
  if ( ($i = mb_strpos($l, "pc")) !== false ) {
513
- $ret += mb_substr($l, 0, $i) * 12;
514
  continue;
515
  }
516
 
@@ -526,6 +548,8 @@ class Style {
526
  * Set inherited properties in this style using values in $parent
527
  *
528
  * @param Style $parent
 
 
529
  */
530
  function inherit(Style $parent) {
531
 
@@ -549,8 +573,8 @@ class Style {
549
  }
550
  }
551
 
552
- foreach (array_keys($this->_props) as $prop) {
553
- if ( $this->_props[$prop] === "inherit" ) {
554
  if ( isset($parent->_important_props[$prop]) ) {
555
  $this->_important_props[$prop] = true;
556
  }
@@ -565,7 +589,7 @@ class Style {
565
  //props_set for more obvious explicite assignment not implemented, because
566
  //too many implicite uses.
567
  // $this->props_set($prop, $parent->$prop);
568
- $this->$prop = $parent->$prop;
569
  }
570
  }
571
 
@@ -587,15 +611,17 @@ class Style {
587
  //see __set and __get, on all assignments clear cache!
588
  $this->_prop_cache[$prop] = null;
589
  $this->_props[$prop] = $val;
590
- } else if ( !isset($this->_important_props[$prop]) ) {
 
591
  //see __set and __get, on all assignments clear cache!
592
  $this->_prop_cache[$prop] = null;
593
  $this->_props[$prop] = $val;
594
  }
595
  }
596
 
597
- if ( isset($style->_props["font_size"]) )
598
  $this->__font_size_calculated = false;
 
599
  }
600
 
601
  /**
@@ -627,7 +653,7 @@ class Style {
627
  }
628
 
629
  function important_get($prop) {
630
- isset($this->_important_props[$prop]);
631
  }
632
 
633
  /**
@@ -678,44 +704,50 @@ class Style {
678
  self::$_methods_cache[$method] = method_exists($this, $method);
679
  }
680
 
681
- if ( self::$_methods_cache[$method] )
682
  $this->$method($val);
683
- else
 
684
  $this->_props[$prop] = $val;
 
685
  }
686
 
687
  /**
688
  * PHP5 overloaded getter
689
- *
690
  * Along with {@link Style::__set()} __get() provides access to all CSS
691
  * properties directly. Typically __get() is not called directly outside
692
  * of this class.
693
- *
694
  * On each modification clear cache to return accurate setting.
695
  * Also affects direct settings not using __set
696
  *
697
  * @param string $prop
 
 
698
  * @return mixed
699
  */
700
  function __get($prop) {
701
- if ( !isset(self::$_defaults[$prop]) )
702
  throw new DOMPDF_Exception("'$prop' is not a valid CSS2 property.");
 
703
 
704
- if ( isset($this->_prop_cache[$prop]) && $this->_prop_cache[$prop] != null )
705
  return $this->_prop_cache[$prop];
 
706
 
707
  $method = "get_$prop";
708
 
709
  // Fall back on defaults if property is not set
710
- if ( !isset($this->_props[$prop]) )
711
  $this->_props[$prop] = self::$_defaults[$prop];
 
712
 
713
  if ( !isset(self::$_methods_cache[$method]) ) {
714
  self::$_methods_cache[$method] = method_exists($this, $method);
715
  }
716
 
717
- if ( self::$_methods_cache[$method] )
718
  return $this->_prop_cache[$prop] = $this->$method();
 
719
 
720
  return $this->_prop_cache[$prop] = $this->_props[$prop];
721
  }
@@ -726,15 +758,19 @@ class Style {
726
 
727
  /**
728
  * Getter for the 'font-family' CSS property.
729
- *
730
  * Uses the {@link Font_Metrics} class to resolve the font family into an
731
  * actual font file.
732
  *
733
  * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-family
 
 
734
  * @return string
735
  */
736
  function get_font_family() {
737
-
 
 
 
738
  $DEBUGCSS=DEBUGCSS; //=DEBUGCSS; Allow override of global setting for ad hoc debug
739
 
740
  // Select the appropriate font. First determine the subtype, then check
@@ -744,64 +780,71 @@ class Style {
744
  $weight = $this->__get("font_weight");
745
 
746
  if ( is_numeric($weight) ) {
747
-
748
- if ( $weight < 600 )
749
  $weight = "normal";
750
- else
 
751
  $weight = "bold";
752
-
753
- } else if ( $weight === "bold" || $weight === "bolder" ) {
 
754
  $weight = "bold";
755
-
756
- } else {
757
  $weight = "normal";
758
-
759
  }
760
 
761
  // Resolve font-style
762
  $font_style = $this->__get("font_style");
763
 
764
- if ( $weight === "bold" && ($font_style === "italic" || $font_style === "oblique") )
765
  $subtype = "bold_italic";
766
- else if ( $weight === "bold" && $font_style !== "italic" && $font_style !== "oblique" )
 
767
  $subtype = "bold";
768
- else if ( $weight !== "bold" && ($font_style === "italic" || $font_style === "oblique") )
 
769
  $subtype = "italic";
770
- else
 
771
  $subtype = "normal";
 
772
 
773
  // Resolve the font family
774
- if ($DEBUGCSS) {
775
  print "<pre>[get_font_family:";
776
  print '('.$this->_props["font_family"].'.'.$font_style.'.'.$this->__get("font_weight").'.'.$weight.'.'.$subtype.')';
777
  }
778
- $families = explode(",", $this->_props["font_family"]);
779
- $families = array_map('trim',$families);
780
- reset($families);
781
 
782
  $font = null;
783
- while ( current($families) ) {
784
- list(,$family) = each($families);
785
  //remove leading and trailing string delimiters, e.g. on font names with spaces;
786
  //remove leading and trailing whitespace
787
  $family = trim($family, " \t\n\r\x0B\"'");
788
- if ($DEBUGCSS) print '('.$family.')';
 
 
789
  $font = Font_Metrics::get_font($family, $subtype);
790
 
791
  if ( $font ) {
792
- if ($DEBUGCSS) print '('.$font.")get_font_family]\n</pre>";
793
- return $font;
794
  }
795
  }
796
 
797
  $family = null;
798
- if ($DEBUGCSS) print '(default)';
 
 
799
  $font = Font_Metrics::get_font($family, $subtype);
800
 
801
  if ( $font ) {
802
- if ($DEBUGCSS) print '('.$font.")get_font_family]\n</pre>";
803
- return $font;
804
  }
 
805
  throw new DOMPDF_Exception("Unable to find a suitable font replacement for: '" . $this->_props["font_family"] ."'");
806
 
807
  }
@@ -814,49 +857,54 @@ class Style {
814
  */
815
  function get_font_size() {
816
 
817
- if ( $this->__font_size_calculated )
818
  return $this->_props["font_size"];
 
819
 
820
- if ( !isset($this->_props["font_size"]) )
821
  $fs = self::$_defaults["font_size"];
822
- else
 
823
  $fs = $this->_props["font_size"];
 
824
 
825
- if ( !isset($this->_parent_font_size) )
826
  $this->_parent_font_size = self::$default_font_size;
 
827
 
828
  switch ($fs) {
829
- case "xx-small":
830
- case "x-small":
831
- case "small":
832
- case "medium":
833
- case "large":
834
- case "x-large":
835
- case "xx-large":
836
- $fs = self::$default_font_size * self::$font_size_keywords[$fs];
837
- break;
838
-
839
- case "smaller":
840
- $fs = 8/9 * $this->_parent_font_size;
841
- break;
842
-
843
- case "larger":
844
- $fs = 6/5 * $this->_parent_font_size;
845
- break;
846
-
847
- default:
848
- break;
849
  }
850
 
851
  // Ensure relative sizes resolve to something
852
- if ( ($i = mb_strpos($fs, "em")) !== false )
853
  $fs = mb_substr($fs, 0, $i) * $this->_parent_font_size;
854
-
855
- else if ( ($i = mb_strpos($fs, "ex")) !== false )
856
  $fs = mb_substr($fs, 0, $i) * $this->_parent_font_size;
857
-
858
- else
859
  $fs = $this->length_in_pt($fs);
 
860
 
861
  //see __set and __get, on all assignments clear cache!
862
  $this->_prop_cache["font_size"] = null;
@@ -871,8 +919,9 @@ class Style {
871
  * @return float
872
  */
873
  function get_word_spacing() {
874
- if ( $this->_props["word_spacing"] === "normal" )
875
  return 0;
 
876
 
877
  return $this->_props["word_spacing"];
878
  }
@@ -882,8 +931,9 @@ class Style {
882
  * @return float
883
  */
884
  function get_letter_spacing() {
885
- if ( $this->_props["letter_spacing"] === "normal" )
886
  return 0;
 
887
 
888
  return $this->_props["letter_spacing"];
889
  }
@@ -895,13 +945,15 @@ class Style {
895
  function get_line_height() {
896
  $line_height = $this->_props["line_height"];
897
 
898
- if ( $line_height === "normal" )
899
  return self::$default_line_height * $this->get_font_size();
 
900
 
901
- if ( is_numeric($line_height) )
902
  return $this->length_in_pt( $line_height . "em", $this->get_font_size());
 
903
 
904
- return $this->length_in_pt( $line_height, $this->get_font_size() );
905
  }
906
 
907
  /**
@@ -942,76 +994,82 @@ class Style {
942
  $tmp = explode(" ", $this->_props["background_position"]);
943
 
944
  switch ($tmp[0]) {
945
-
946
- case "left":
947
- $x = "0%";
948
- break;
949
-
950
- case "right":
951
- $x = "100%";
952
- break;
953
-
954
- case "top":
955
- $y = "0%";
956
- break;
957
-
958
- case "bottom":
959
- $y = "100%";
960
- break;
961
-
962
- case "center":
963
- $x = "50%";
964
- $y = "50%";
965
- break;
966
-
967
- default:
968
- $x = $tmp[0];
969
- break;
970
- }
971
-
972
- if ( isset($tmp[1]) ) {
973
-
974
- switch ($tmp[1]) {
975
  case "left":
976
  $x = "0%";
977
  break;
978
-
979
  case "right":
980
  $x = "100%";
981
  break;
982
-
983
  case "top":
984
  $y = "0%";
985
  break;
986
-
987
  case "bottom":
988
  $y = "100%";
989
  break;
990
-
991
  case "center":
992
- if ( $tmp[0] === "left" || $tmp[0] === "right" || $tmp[0] === "center" )
993
- $y = "50%";
994
- else
995
- $x = "50%";
996
  break;
997
-
998
  default:
999
- $y = $tmp[1];
1000
  break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1001
  }
1002
 
1003
- } else {
 
1004
  $y = "50%";
1005
  }
1006
 
1007
- if ( !isset($x) )
1008
  $x = "0%";
 
1009
 
1010
- if ( !isset($y) )
1011
  $y = "0%";
 
1012
 
1013
- return array( 0 => $x, "x" => $x,
1014
- 1 => $y, "y" => $y );
 
 
1015
  }
1016
 
1017
 
@@ -1071,6 +1129,7 @@ class Style {
1071
  $this->_prop_cache["border_top_color"] = null;
1072
  $this->_props["border_top_color"] = $this->__get("color");
1073
  }
 
1074
  return $this->munge_color($this->_props["border_top_color"]);
1075
  }
1076
 
@@ -1080,6 +1139,7 @@ class Style {
1080
  $this->_prop_cache["border_right_color"] = null;
1081
  $this->_props["border_right_color"] = $this->__get("color");
1082
  }
 
1083
  return $this->munge_color($this->_props["border_right_color"]);
1084
  }
1085
 
@@ -1089,6 +1149,7 @@ class Style {
1089
  $this->_prop_cache["border_bottom_color"] = null;
1090
  $this->_props["border_bottom_color"] = $this->__get("color");
1091
  }
 
1092
  return $this->munge_color($this->_props["border_bottom_color"]);
1093
  }
1094
 
@@ -1098,6 +1159,7 @@ class Style {
1098
  $this->_prop_cache["border_left_color"] = null;
1099
  $this->_props["border_left_color"] = $this->__get("color");
1100
  }
 
1101
  return $this->munge_color($this->_props["border_left_color"]);
1102
  }
1103
 
@@ -1144,23 +1206,35 @@ class Style {
1144
  * @return array
1145
  */
1146
  function get_border_properties() {
1147
- return array("top" => array("width" => $this->__get("border_top_width"),
1148
- "style" => $this->__get("border_top_style"),
1149
- "color" => $this->__get("border_top_color")),
1150
- "bottom" => array("width" => $this->__get("border_bottom_width"),
1151
- "style" => $this->__get("border_bottom_style"),
1152
- "color" => $this->__get("border_bottom_color")),
1153
- "right" => array("width" => $this->__get("border_right_width"),
1154
- "style" => $this->__get("border_right_style"),
1155
- "color" => $this->__get("border_right_color")),
1156
- "left" => array("width" => $this->__get("border_left_width"),
1157
- "style" => $this->__get("border_left_style"),
1158
- "color" => $this->__get("border_left_color")));
 
 
 
 
 
 
 
 
 
 
1159
  }
1160
 
1161
  /**
1162
  * Return a single border property
1163
  *
 
 
1164
  * @return mixed
1165
  */
1166
  protected function _get_border($side) {
@@ -1180,12 +1254,64 @@ class Style {
1180
  * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties
1181
  * @return string
1182
  */
1183
- function get_border_top() { return $this->_get_border("top"); }
1184
- function get_border_right() { return $this->_get_border("right"); }
1185
- function get_border_bottom() { return $this->_get_border("bottom"); }
1186
- function get_border_left() { return $this->_get_border("left"); }
 
 
 
 
 
 
 
 
 
 
 
1187
  /**#@-*/
1188
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1189
  /**
1190
  * Returns the outline colour as an array
1191
  *
@@ -1200,6 +1326,7 @@ class Style {
1200
  $this->_prop_cache["outline_color"] = null;
1201
  $this->_props["outline_color"] = $this->__get("color");
1202
  }
 
1203
  return $this->munge_color($this->_props["outline_color"]);
1204
  }
1205
 
@@ -1271,9 +1398,9 @@ class Style {
1271
  Special treatment:
1272
  At individual property like border-top-width need to check whether overriding value is also !important.
1273
  Also store the !important condition for later overrides.
1274
- Since not known who is initiating the override, need to get passed !importan as parameter.
1275
  !important Paramter taken as in the original style in the css file.
1276
- When poperty border !important given, do not mark subsets like border_style as important. Only
1277
  individual properties.
1278
 
1279
  Note:
@@ -1292,13 +1419,13 @@ class Style {
1292
  * Applicable for background, border, padding, margin, font, list_style
1293
  * Note: $type has a leading underscore (or is empty), the others not.
1294
  */
1295
- protected function _set_style_side_type($style,$side,$type,$val,$important) {
1296
  $prop = $style.'_'.$side.$type;
1297
 
1298
  if ( !isset($this->_important_props[$prop]) || $important) {
1299
  //see __set and __get, on all assignments clear cache!
1300
  $this->_prop_cache[$prop] = null;
1301
- if ($important) {
1302
  $this->_important_props[$prop] = true;
1303
  }
1304
  $this->_props[$prop] = $val;
@@ -1306,10 +1433,10 @@ class Style {
1306
  }
1307
 
1308
  protected function _set_style_sides_type($style,$top,$right,$bottom,$left,$type,$important) {
1309
- $this->_set_style_side_type($style,'top',$type,$top,$important);
1310
- $this->_set_style_side_type($style,'right',$type,$right,$important);
1311
- $this->_set_style_side_type($style,'bottom',$type,$bottom,$important);
1312
- $this->_set_style_side_type($style,'left',$type,$left,$important);
1313
  }
1314
 
1315
  protected function _set_style_type($style,$type,$val,$important) {
@@ -1317,21 +1444,12 @@ class Style {
1317
  $arr = explode(" ", $val);
1318
 
1319
  switch (count($arr)) {
1320
- case 1:
1321
- $this->_set_style_sides_type($style,$arr[0],$arr[0],$arr[0],$arr[0],$type,$important);
1322
- break;
1323
- case 2:
1324
- $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[0],$arr[1],$type,$important);
1325
- break;
1326
- case 3:
1327
- $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[2],$arr[1],$type,$important);
1328
- break;
1329
- case 4:
1330
- $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[2],$arr[3],$type,$important);
1331
- break;
1332
- default:
1333
- break;
1334
  }
 
1335
  //see __set and __get, on all assignments clear cache!
1336
  $this->_prop_cache[$style.$type] = null;
1337
  $this->_props[$style.$type] = $val;
@@ -1352,7 +1470,7 @@ class Style {
1352
 
1353
  protected function _set_style($style,$val,$important) {
1354
  if ( !isset($this->_important_props[$style]) || $important) {
1355
- if ($important) {
1356
  $this->_important_props[$style] = true;
1357
  }
1358
  //see __set and __get, on all assignments clear cache!
@@ -1363,10 +1481,12 @@ class Style {
1363
 
1364
  protected function _image($val) {
1365
  $DEBUGCSS=DEBUGCSS;
 
1366
 
1367
  if ( mb_strpos($val, "url") === false ) {
1368
  $path = "none"; //Don't resolve no image -> otherwise would prefix path and no longer recognize as none
1369
- } else {
 
1370
  $val = preg_replace("/url\(['\"]?([^'\")]+)['\"]?\)/","\\1", trim($val));
1371
 
1372
  // Resolve the url now in the context of the current stylesheet
@@ -1374,14 +1494,19 @@ class Style {
1374
  if ( $parsed_url["protocol"] == "" && $this->_stylesheet->get_protocol() == "" ) {
1375
  if ($parsed_url["path"][0] === '/' || $parsed_url["path"][0] === '\\' ) {
1376
  $path = $_SERVER["DOCUMENT_ROOT"].'/';
1377
- } else {
 
1378
  $path = $this->_stylesheet->get_base_path();
1379
  }
 
1380
  $path .= $parsed_url["path"] . $parsed_url["file"];
1381
  $path = realpath($path);
1382
  // If realpath returns FALSE then specifically state that there is no background image
1383
- if (!$path) { $path = 'none'; }
1384
- } else {
 
 
 
1385
  $path = build_url($this->_stylesheet->get_protocol(),
1386
  $this->_stylesheet->get_host(),
1387
  $this->_stylesheet->get_base_path(),
@@ -1405,29 +1530,36 @@ class Style {
1405
  * The colour parameter can be any valid CSS colour value
1406
  *
1407
  * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color
1408
- * @param string $colour
1409
  */
1410
- function set_color($colour) {
1411
- $col = $this->munge_colour($colour);
1412
 
1413
- if ( is_null($col) )
1414
- $col = self::$_defaults["color"];
 
 
 
 
1415
 
1416
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1417
  $this->_prop_cache["color"] = null;
1418
- $this->_props["color"] = $col["hex"];
1419
  }
1420
 
1421
  /**
1422
  * Sets the background colour
1423
  *
1424
  * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color
1425
- * @param string $colour
1426
  */
1427
- function set_background_color($colour) {
1428
- $col = $this->munge_colour($colour);
1429
- if ( is_null($col) )
1430
- $col = self::$_defaults["background_color"];
 
 
 
1431
 
1432
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1433
  $this->_prop_cache["background_color"] = null;
@@ -1436,9 +1568,9 @@ class Style {
1436
 
1437
  /**
1438
  * Set the background image url
 
1439
  *
1440
- * @link http://www.w3.org/TR/CSS21/colors.html#background-properties
1441
- * @param string $url
1442
  */
1443
  function set_background_image($val) {
1444
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
@@ -1453,8 +1585,9 @@ class Style {
1453
  * @param string $val
1454
  */
1455
  function set_background_repeat($val) {
1456
- if ( is_null($val) )
1457
  $val = self::$_defaults["background_repeat"];
 
1458
 
1459
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1460
  $this->_prop_cache["background_repeat"] = null;
@@ -1468,8 +1601,9 @@ class Style {
1468
  * @param string $val
1469
  */
1470
  function set_background_attachment($val) {
1471
- if ( is_null($val) )
1472
  $val = self::$_defaults["background_attachment"];
 
1473
 
1474
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1475
  $this->_prop_cache["background_attachment"] = null;
@@ -1483,8 +1617,9 @@ class Style {
1483
  * @param string $val
1484
  */
1485
  function set_background_position($val) {
1486
- if ( is_null($val) )
1487
  $val = self::$_defaults["background_position"];
 
1488
 
1489
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1490
  $this->_prop_cache["background_position"] = null;
@@ -1498,29 +1633,41 @@ class Style {
1498
  * @param string $val
1499
  */
1500
  function set_background($val) {
1501
- $col = null;
1502
- $pos = array();
1503
- $tmp = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces
1504
- $tmp = explode(" ", $tmp);
1505
  $important = isset($this->_important_props["background"]);
1506
 
1507
- foreach($tmp as $attr) {
1508
- if (mb_substr($attr, 0, 3) === "url" || $attr === "none") {
1509
- $this->_set_style("background_image", $this->_image($attr), $important);
1510
- } else if ($attr === "fixed" || $attr === "scroll") {
1511
- $this->_set_style("background_attachment", $attr, $important);
1512
- } else if ($attr === "repeat" || $attr === "repeat-x" || $attr === "repeat-y" || $attr === "no-repeat") {
1513
- $this->_set_style("background_repeat", $attr, $important);
1514
- } else if (($col = $this->munge_color($attr)) != null ) {
1515
- $this->_set_style("background_color", is_array($col) ? $col["hex"] : $col, $important);
1516
- } else {
1517
- $pos[] = $attr;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1518
  }
1519
  }
1520
 
1521
- if (count($pos)) {
1522
- $this->_set_style("background_position",implode(' ',$pos), $important);
1523
- }
1524
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1525
  $this->_prop_cache["background"] = null;
1526
  $this->_props["background"] = $val;
@@ -1576,44 +1723,50 @@ class Style {
1576
  if ( preg_match("/^(italic|oblique|normal)\s*(.*)$/i",$val,$match) ) {
1577
  $this->_set_style("font_style", $match[1], $important);
1578
  $val = $match[2];
1579
- } else {
 
1580
  $this->_set_style("font_style", self::$_defaults["font_style"], $important);
1581
  }
1582
 
1583
  if ( preg_match("/^(small-caps|normal)\s*(.*)$/i",$val,$match) ) {
1584
  $this->_set_style("font_variant", $match[1], $important);
1585
  $val = $match[2];
1586
- } else {
 
1587
  $this->_set_style("font_variant", self::$_defaults["font_variant"], $important);
1588
  }
1589
 
1590
  //matching numeric value followed by unit -> this is indeed a subsequent font size. Skip!
1591
- if ( preg_match("/^(bold|bolder|lighter|100|200|300|400|500|600|700|800|900|normal)\s*(.*)$/i",$val,$match) &&
1592
  !preg_match("/^(?:pt|px|pc|em|ex|in|cm|mm|%)/",$match[2])
1593
  ) {
1594
  $this->_set_style("font_weight", $match[1], $important);
1595
  $val = $match[2];
1596
- } else {
 
1597
  $this->_set_style("font_weight", self::$_defaults["font_weight"], $important);
1598
  }
1599
 
1600
  if ( preg_match("/^(xx-small|x-small|small|medium|large|x-large|xx-large|smaller|larger|\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))\s*(.*)$/i",$val,$match) ) {
1601
  $this->_set_style("font_size", $match[1], $important);
1602
  $val = $match[2];
1603
- if (preg_match("/^\/\s*(\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))\s*(.*)$/i",$val,$match) ) {
1604
  $this->_set_style("line_height", $match[1], $important);
1605
  $val = $match[2];
1606
- } else {
 
1607
  $this->_set_style("line_height", self::$_defaults["line_height"], $important);
1608
  }
1609
- } else {
 
1610
  $this->_set_style("font_size", self::$_defaults["font_size"], $important);
1611
  $this->_set_style("line_height", self::$_defaults["line_height"], $important);
1612
  }
1613
 
1614
- if(strlen($val) != 0) {
1615
  $this->_set_style("font_family", $val, $important);
1616
- } else {
 
1617
  $this->_set_style("font_family", self::$_defaults["font_family"], $important);
1618
  }
1619
  }
@@ -1625,8 +1778,9 @@ class Style {
1625
  * @param string $break
1626
  */
1627
  function set_page_break_before($break) {
1628
- if ($break === "left" || $break === "right")
1629
  $break = "always";
 
1630
 
1631
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1632
  $this->_prop_cache["page_break_before"] = null;
@@ -1634,8 +1788,9 @@ class Style {
1634
  }
1635
 
1636
  function set_page_break_after($break) {
1637
- if ($break === "left" || $break === "right")
1638
  $break = "always";
 
1639
 
1640
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1641
  $this->_prop_cache["page_break_after"] = null;
@@ -1704,8 +1859,9 @@ class Style {
1704
  /**
1705
  * Sets a single border
1706
  *
1707
- * @param string $side
1708
- * @param string $border_spec ([width] [style] [color])
 
1709
  */
1710
  protected function _set_border($side, $border_spec, $important) {
1711
  $border_spec = preg_replace("/\s*\,\s*/", ",", $border_spec);
@@ -1724,11 +1880,11 @@ class Style {
1724
  $value = trim($value);
1725
  if ( in_array($value, self::$BORDER_STYLES) ) {
1726
  $this->_set_style_side_type('border',$side,'_style',$value,$important);
1727
-
1728
- } else if ( preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value ) ) {
1729
  $this->_set_style_side_type('border',$side,'_width',$value,$important);
1730
-
1731
- } else {
1732
  // must be colour
1733
  $this->_set_style_side_type('border',$side,'_color',$value,$important);
1734
  }
@@ -1739,16 +1895,27 @@ class Style {
1739
  $this->_props['border_'.$side] = $border_spec;
1740
  }
1741
 
1742
- /**#@+
1743
  * Sets the border styles
1744
  *
1745
  * @link http://www.w3.org/TR/CSS21/box.html#border-properties
1746
  * @param string $val
1747
  */
1748
- function set_border_top($val) { $this->_set_border("top", $val, isset($this->_important_props['border_top'])); }
1749
- function set_border_right($val) { $this->_set_border("right", $val, isset($this->_important_props['border_right'])); }
1750
- function set_border_bottom($val) { $this->_set_border("bottom", $val, isset($this->_important_props['border_bottom'])); }
1751
- function set_border_left($val) { $this->_set_border("left", $val, isset($this->_important_props['border_left'])); }
 
 
 
 
 
 
 
 
 
 
 
1752
 
1753
  function set_border($val) {
1754
  $important = isset($this->_important_props["border"]);
@@ -1773,7 +1940,56 @@ class Style {
1773
  $this->_set_style_type_important('border','_style',$val);
1774
  }
1775
 
1776
- /**#@+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1777
  * Sets the outline styles
1778
  *
1779
  * @link http://www.w3.org/TR/CSS21/ui.html#dynamic-outlines
@@ -1794,7 +2010,7 @@ class Style {
1794
  if ( !isset($this->_important_props[$prop]) || $important) {
1795
  //see __set and __get, on all assignments clear cache!
1796
  $this->_prop_cache[$prop] = null;
1797
- if ($important) {
1798
  $this->_important_props[$prop] = true;
1799
  }
1800
  $this->_props[$prop] = $_val;
@@ -1805,11 +2021,14 @@ class Style {
1805
  $arr = explode(" ", $val);
1806
  foreach ($arr as $value) {
1807
  $value = trim($value);
 
1808
  if ( in_array($value, self::$BORDER_STYLES) ) {
1809
  $this->set_outline_style($value);
1810
- } else if ( preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value ) ) {
 
1811
  $this->set_outline_width($value);
1812
- } else {
 
1813
  // must be colour
1814
  $this->set_outline_color($value);
1815
  }
@@ -1831,8 +2050,6 @@ class Style {
1831
  function set_outline_style($val) {
1832
  $this->_set_style_type_important('outline','_style',$val);
1833
  }
1834
- /**#@-*/
1835
-
1836
 
1837
  /**
1838
  * Sets the border spacing
@@ -1843,8 +2060,9 @@ class Style {
1843
  function set_border_spacing($val) {
1844
  $arr = explode(" ", $val);
1845
 
1846
- if ( count($arr) == 1 )
1847
  $arr[1] = $arr[0];
 
1848
 
1849
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1850
  $this->_prop_cache["border_spacing"] = null;
@@ -1891,7 +2109,7 @@ class Style {
1891
  /* http://www.w3.org/TR/CSS21/generate.html#list-style
1892
  * A value of 'none' for the 'list-style' property sets both 'list-style-type' and 'list-style-image' to 'none'
1893
  */
1894
- if ($value === "none") {
1895
  $this->_set_style("list_style_type", $value, $important);
1896
  $this->_set_style("list_style_image", $value, $important);
1897
  continue;
@@ -1902,14 +2120,15 @@ class Style {
1902
  //Firefox is wrong here (list_style_image gets overwritten on explicite list_style_type)
1903
  //Internet Explorer 7/8 and dompdf is right.
1904
 
1905
- if (mb_substr($value, 0, 3) === "url") {
1906
  $this->_set_style("list_style_image", $this->_image($value), $important);
1907
  continue;
1908
  }
1909
 
1910
  if ( in_array($value, $types) ) {
1911
  $this->_set_style("list_style_type", $value, $important);
1912
- } else if ( in_array($value, $positions) ) {
 
1913
  $this->_set_style("list_style_position", $value, $important);
1914
  }
1915
  }
@@ -1966,7 +2185,7 @@ class Style {
1966
  $tr_value = "\s*([^,\s]+)\s*";
1967
  $angle = "\s*([^,\s]+(?:deg|rad)?)\s*";
1968
 
1969
- if( !preg_match_all("/[a-z]+\([^\)]+\)/i", $val, $parts, PREG_SET_ORDER) ) {
1970
  return;
1971
  }
1972
 
@@ -1994,7 +2213,7 @@ class Style {
1994
  $t = $part[0];
1995
 
1996
  foreach($functions as $name => $pattern) {
1997
- if (preg_match("/$name\s*$pattern/i", $t, $matches)) {
1998
  $values = array_slice($matches, 1);
1999
 
2000
  switch($name) {
@@ -2005,16 +2224,19 @@ class Style {
2005
  case "skewY":
2006
 
2007
  foreach($values as $i => $value) {
2008
- if ( strpos($value, "rad") )
2009
  $values[$i] = rad2deg(floatval($value));
2010
- else
 
2011
  $values[$i] = floatval($value);
 
2012
  }
2013
 
2014
  switch($name) {
2015
  case "skew":
2016
- if ( !isset($values[1]) )
2017
  $values[1] = 0;
 
2018
  break;
2019
  case "skewX":
2020
  $name = "skew";
@@ -2031,10 +2253,12 @@ class Style {
2031
  case "translate":
2032
  $values[0] = $this->length_in_pt($values[0], $this->width);
2033
 
2034
- if ( isset($values[1]) )
2035
  $values[1] = $this->length_in_pt($values[1], $this->height);
2036
- else
 
2037
  $values[1] = 0;
 
2038
  break;
2039
 
2040
  case "translateX":
@@ -2049,8 +2273,9 @@ class Style {
2049
 
2050
  // <number> units
2051
  case "scale":
2052
- if ( !isset($values[1]) )
2053
  $values[1] = $values[0];
 
2054
  break;
2055
 
2056
  case "scaleX":
@@ -2078,11 +2303,11 @@ class Style {
2078
  }
2079
 
2080
  function set__webkit_transform($val) {
2081
- return $this->set_transform($val);
2082
  }
2083
 
2084
  function set__webkit_transform_origin($val) {
2085
- return $this->set_transform_origin($val);
2086
  }
2087
 
2088
  /**
@@ -2147,11 +2372,11 @@ class Style {
2147
  }
2148
 
2149
  function set__dompdf_background_image_resolution($val) {
2150
- return $this->set_background_image_resolution($val);
2151
  }
2152
 
2153
  function set__dompdf_image_resolution($val) {
2154
- return $this->set_image_resolution($val);
2155
  }
2156
 
2157
  function set_z_index($val) {
@@ -2197,8 +2422,7 @@ class Style {
2197
  $this->_props), true);
2198
  }
2199
 
2200
- /*DEBUGCSS*/ function debug_print()
2201
- /*DEBUGCSS*/ {
2202
  /*DEBUGCSS*/ print "parent_font_size:".$this->_parent_font_size . ";\n";
2203
  /*DEBUGCSS*/ foreach($this->_props as $prop => $val ) {
2204
  /*DEBUGCSS*/ print $prop.':'.$val;
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
+ * @author Fabien Ménager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
9
  */
10
 
11
  /**
147
  */
148
  protected $_parent_font_size; // Font size of parent element
149
 
150
+ protected $_font_family;
151
+
152
  /**
153
  * @var Frame
154
  */
169
  */
170
  private $__font_size_calculated; // Cache flag
171
 
172
+ /**
173
+ * The computed border radius
174
+ */
175
+ private $_computed_border_radius = null;
176
+
177
+ /**
178
+ * @var bool
179
+ */
180
+ public $_has_border_radius = false;
181
+
182
  /**
183
  * Class constructor
184
  *
185
  * @param Stylesheet $stylesheet the stylesheet this Style is associated with.
186
+ * @param int $origin
187
  */
188
  function __construct(Stylesheet $stylesheet, $origin = Stylesheet::ORIG_AUTHOR) {
189
  $this->_props = array();
229
  $d["border_bottom_width"] = "medium";
230
  $d["border_left_width"] = "medium";
231
  $d["border_width"] = "medium";
232
+ $d["border_bottom_left_radius"] = "";
233
+ $d["border_bottom_right_radius"] = "";
234
+ $d["border_top_left_radius"] = "";
235
+ $d["border_top_right_radius"] = "";
236
+ $d["border_radius"] = "";
237
  $d["border"] = "";
238
  $d["bottom"] = "auto";
239
  $d["caption_side"] = "top";
252
  $d["elevation"] = "level";
253
  $d["empty_cells"] = "show";
254
  $d["float"] = "none";
255
+ $d["font_family"] = $stylesheet->get_dompdf()->get_option("default_font");
256
  $d["font_size"] = "medium";
257
  $d["font_style"] = "normal";
258
  $d["font_variant"] = "normal";
432
  function length_in_pt($length, $ref_size = null) {
433
  static $cache = array();
434
 
435
+ if ( !is_array($length) ) {
436
  $length = array($length);
437
+ }
438
 
439
+ if ( !isset($ref_size) ) {
440
  $ref_size = self::$default_font_size;
441
+ }
442
 
443
  $key = implode("@", $length)."/$ref_size";
444
 
449
  $ret = 0;
450
  foreach ($length as $l) {
451
 
452
+ if ( $l === "auto" ) {
453
  return "auto";
454
+ }
455
 
456
+ if ( $l === "none" ) {
457
  return "none";
458
+ }
459
 
460
  // Assume numeric values are already in points
461
  if ( is_numeric($l) ) {
485
  }
486
 
487
  if ( ($i = mb_strpos($l, "px")) !== false ) {
488
+ $dpi = $this->_stylesheet->get_dompdf()->get_option("dpi");
489
+ $ret += ( mb_substr($l, 0, $i) * 72 ) / $dpi;
490
  continue;
491
  }
492
 
493
  if ( ($i = mb_strpos($l, "pt")) !== false ) {
494
+ $ret += (float)mb_substr($l, 0, $i);
495
  continue;
496
  }
497
 
498
  if ( ($i = mb_strpos($l, "%")) !== false ) {
499
+ $ret += (float)mb_substr($l, 0, $i)/100 * $ref_size;
500
  continue;
501
  }
502
 
503
  if ( ($i = mb_strpos($l, "rem")) !== false ) {
504
+ $ret += (float)mb_substr($l, 0, $i) * $this->_stylesheet->get_dompdf()->get_tree()->get_root()->get_style()->font_size;
505
  continue;
506
  }
507
 
508
  if ( ($i = mb_strpos($l, "em")) !== false ) {
509
+ $ret += (float)mb_substr($l, 0, $i) * $this->__get("font_size");
510
  continue;
511
  }
512
 
527
  }
528
 
529
  if ( ($i = mb_strpos($l, "in")) !== false ) {
530
+ $ret += (float)mb_substr($l, 0, $i) * 72;
531
  continue;
532
  }
533
 
534
  if ( ($i = mb_strpos($l, "pc")) !== false ) {
535
+ $ret += (float)mb_substr($l, 0, $i) * 12;
536
  continue;
537
  }
538
 
548
  * Set inherited properties in this style using values in $parent
549
  *
550
  * @param Style $parent
551
+ *
552
+ * @return Style
553
  */
554
  function inherit(Style $parent) {
555
 
573
  }
574
  }
575
 
576
+ foreach ($this->_props as $prop => $value) {
577
+ if ( $value === "inherit" ) {
578
  if ( isset($parent->_important_props[$prop]) ) {
579
  $this->_important_props[$prop] = true;
580
  }
589
  //props_set for more obvious explicite assignment not implemented, because
590
  //too many implicite uses.
591
  // $this->props_set($prop, $parent->$prop);
592
+ $this->__set($prop, $parent->__get($prop));
593
  }
594
  }
595
 
611
  //see __set and __get, on all assignments clear cache!
612
  $this->_prop_cache[$prop] = null;
613
  $this->_props[$prop] = $val;
614
+ }
615
+ else if ( !isset($this->_important_props[$prop]) ) {
616
  //see __set and __get, on all assignments clear cache!
617
  $this->_prop_cache[$prop] = null;
618
  $this->_props[$prop] = $val;
619
  }
620
  }
621
 
622
+ if ( isset($style->_props["font_size"]) ) {
623
  $this->__font_size_calculated = false;
624
+ }
625
  }
626
 
627
  /**
653
  }
654
 
655
  function important_get($prop) {
656
+ return isset($this->_important_props[$prop]);
657
  }
658
 
659
  /**
704
  self::$_methods_cache[$method] = method_exists($this, $method);
705
  }
706
 
707
+ if ( self::$_methods_cache[$method] ) {
708
  $this->$method($val);
709
+ }
710
+ else {
711
  $this->_props[$prop] = $val;
712
+ }
713
  }
714
 
715
  /**
716
  * PHP5 overloaded getter
 
717
  * Along with {@link Style::__set()} __get() provides access to all CSS
718
  * properties directly. Typically __get() is not called directly outside
719
  * of this class.
 
720
  * On each modification clear cache to return accurate setting.
721
  * Also affects direct settings not using __set
722
  *
723
  * @param string $prop
724
+ *
725
+ * @throws DOMPDF_Exception
726
  * @return mixed
727
  */
728
  function __get($prop) {
729
+ if ( !isset(self::$_defaults[$prop]) ) {
730
  throw new DOMPDF_Exception("'$prop' is not a valid CSS2 property.");
731
+ }
732
 
733
+ if ( isset($this->_prop_cache[$prop]) && $this->_prop_cache[$prop] != null ) {
734
  return $this->_prop_cache[$prop];
735
+ }
736
 
737
  $method = "get_$prop";
738
 
739
  // Fall back on defaults if property is not set
740
+ if ( !isset($this->_props[$prop]) ) {
741
  $this->_props[$prop] = self::$_defaults[$prop];
742
+ }
743
 
744
  if ( !isset(self::$_methods_cache[$method]) ) {
745
  self::$_methods_cache[$method] = method_exists($this, $method);
746
  }
747
 
748
+ if ( self::$_methods_cache[$method] ) {
749
  return $this->_prop_cache[$prop] = $this->$method();
750
+ }
751
 
752
  return $this->_prop_cache[$prop] = $this->_props[$prop];
753
  }
758
 
759
  /**
760
  * Getter for the 'font-family' CSS property.
 
761
  * Uses the {@link Font_Metrics} class to resolve the font family into an
762
  * actual font file.
763
  *
764
  * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-family
765
+ * @throws DOMPDF_Exception
766
+ *
767
  * @return string
768
  */
769
  function get_font_family() {
770
+ if ( isset($this->_font_family) ) {
771
+ return $this->_font_family;
772
+ }
773
+
774
  $DEBUGCSS=DEBUGCSS; //=DEBUGCSS; Allow override of global setting for ad hoc debug
775
 
776
  // Select the appropriate font. First determine the subtype, then check
780
  $weight = $this->__get("font_weight");
781
 
782
  if ( is_numeric($weight) ) {
783
+ if ( $weight < 600 ) {
 
784
  $weight = "normal";
785
+ }
786
+ else {
787
  $weight = "bold";
788
+ }
789
+ }
790
+ else if ( $weight === "bold" || $weight === "bolder" ) {
791
  $weight = "bold";
792
+ }
793
+ else {
794
  $weight = "normal";
 
795
  }
796
 
797
  // Resolve font-style
798
  $font_style = $this->__get("font_style");
799
 
800
+ if ( $weight === "bold" && ($font_style === "italic" || $font_style === "oblique") ) {
801
  $subtype = "bold_italic";
802
+ }
803
+ else if ( $weight === "bold" && $font_style !== "italic" && $font_style !== "oblique" ) {
804
  $subtype = "bold";
805
+ }
806
+ else if ( $weight !== "bold" && ($font_style === "italic" || $font_style === "oblique") ) {
807
  $subtype = "italic";
808
+ }
809
+ else {
810
  $subtype = "normal";
811
+ }
812
 
813
  // Resolve the font family
814
+ if ( $DEBUGCSS ) {
815
  print "<pre>[get_font_family:";
816
  print '('.$this->_props["font_family"].'.'.$font_style.'.'.$this->__get("font_weight").'.'.$weight.'.'.$subtype.')';
817
  }
818
+
819
+ $families = preg_split("/\s*,\s*/", $this->_props["font_family"]);
 
820
 
821
  $font = null;
822
+ foreach($families as $family) {
 
823
  //remove leading and trailing string delimiters, e.g. on font names with spaces;
824
  //remove leading and trailing whitespace
825
  $family = trim($family, " \t\n\r\x0B\"'");
826
+ if ( $DEBUGCSS ) {
827
+ print '('.$family.')';
828
+ }
829
  $font = Font_Metrics::get_font($family, $subtype);
830
 
831
  if ( $font ) {
832
+ if ($DEBUGCSS) print '('.$font.")get_font_family]\n</pre>";
833
+ return $this->_font_family = $font;
834
  }
835
  }
836
 
837
  $family = null;
838
+ if ( $DEBUGCSS ) {
839
+ print '(default)';
840
+ }
841
  $font = Font_Metrics::get_font($family, $subtype);
842
 
843
  if ( $font ) {
844
+ if ( $DEBUGCSS ) print '('.$font.")get_font_family]\n</pre>";
845
+ return$this->_font_family = $font;
846
  }
847
+
848
  throw new DOMPDF_Exception("Unable to find a suitable font replacement for: '" . $this->_props["font_family"] ."'");
849
 
850
  }
857
  */
858
  function get_font_size() {
859
 
860
+ if ( $this->__font_size_calculated ) {
861
  return $this->_props["font_size"];
862
+ }
863
 
864
+ if ( !isset($this->_props["font_size"]) ) {
865
  $fs = self::$_defaults["font_size"];
866
+ }
867
+ else {
868
  $fs = $this->_props["font_size"];
869
+ }
870
 
871
+ if ( !isset($this->_parent_font_size) ) {
872
  $this->_parent_font_size = self::$default_font_size;
873
+ }
874
 
875
  switch ($fs) {
876
+ case "xx-small":
877
+ case "x-small":
878
+ case "small":
879
+ case "medium":
880
+ case "large":
881
+ case "x-large":
882
+ case "xx-large":
883
+ $fs = self::$default_font_size * self::$font_size_keywords[$fs];
884
+ break;
885
+
886
+ case "smaller":
887
+ $fs = 8/9 * $this->_parent_font_size;
888
+ break;
889
+
890
+ case "larger":
891
+ $fs = 6/5 * $this->_parent_font_size;
892
+ break;
893
+
894
+ default:
895
+ break;
896
  }
897
 
898
  // Ensure relative sizes resolve to something
899
+ if ( ($i = mb_strpos($fs, "em")) !== false ) {
900
  $fs = mb_substr($fs, 0, $i) * $this->_parent_font_size;
901
+ }
902
+ else if ( ($i = mb_strpos($fs, "ex")) !== false ) {
903
  $fs = mb_substr($fs, 0, $i) * $this->_parent_font_size;
904
+ }
905
+ else {
906
  $fs = $this->length_in_pt($fs);
907
+ }
908
 
909
  //see __set and __get, on all assignments clear cache!
910
  $this->_prop_cache["font_size"] = null;
919
  * @return float
920
  */
921
  function get_word_spacing() {
922
+ if ( $this->_props["word_spacing"] === "normal" ) {
923
  return 0;
924
+ }
925
 
926
  return $this->_props["word_spacing"];
927
  }
931
  * @return float
932
  */
933
  function get_letter_spacing() {
934
+ if ( $this->_props["letter_spacing"] === "normal" ) {
935
  return 0;
936
+ }
937
 
938
  return $this->_props["letter_spacing"];
939
  }
945
  function get_line_height() {
946
  $line_height = $this->_props["line_height"];
947
 
948
+ if ( $line_height === "normal" ) {
949
  return self::$default_line_height * $this->get_font_size();
950
+ }
951
 
952
+ if ( is_numeric($line_height) ) {
953
  return $this->length_in_pt( $line_height . "em", $this->get_font_size());
954
+ }
955
 
956
+ return $this->length_in_pt( $line_height, $this->_parent_font_size );
957
  }
958
 
959
  /**
994
  $tmp = explode(" ", $this->_props["background_position"]);
995
 
996
  switch ($tmp[0]) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
997
  case "left":
998
  $x = "0%";
999
  break;
1000
+
1001
  case "right":
1002
  $x = "100%";
1003
  break;
1004
+
1005
  case "top":
1006
  $y = "0%";
1007
  break;
1008
+
1009
  case "bottom":
1010
  $y = "100%";
1011
  break;
1012
+
1013
  case "center":
1014
+ $x = "50%";
1015
+ $y = "50%";
 
 
1016
  break;
1017
+
1018
  default:
1019
+ $x = $tmp[0];
1020
  break;
1021
+ }
1022
+
1023
+ if ( isset($tmp[1]) ) {
1024
+
1025
+ switch ($tmp[1]) {
1026
+ case "left":
1027
+ $x = "0%";
1028
+ break;
1029
+
1030
+ case "right":
1031
+ $x = "100%";
1032
+ break;
1033
+
1034
+ case "top":
1035
+ $y = "0%";
1036
+ break;
1037
+
1038
+ case "bottom":
1039
+ $y = "100%";
1040
+ break;
1041
+
1042
+ case "center":
1043
+ if ( $tmp[0] === "left" || $tmp[0] === "right" || $tmp[0] === "center" ) {
1044
+ $y = "50%";
1045
+ }
1046
+ else {
1047
+ $x = "50%";
1048
+ }
1049
+ break;
1050
+
1051
+ default:
1052
+ $y = $tmp[1];
1053
+ break;
1054
  }
1055
 
1056
+ }
1057
+ else {
1058
  $y = "50%";
1059
  }
1060
 
1061
+ if ( !isset($x) ) {
1062
  $x = "0%";
1063
+ }
1064
 
1065
+ if ( !isset($y) ) {
1066
  $y = "0%";
1067
+ }
1068
 
1069
+ return array(
1070
+ 0 => $x, "x" => $x,
1071
+ 1 => $y, "y" => $y,
1072
+ );
1073
  }
1074
 
1075
 
1129
  $this->_prop_cache["border_top_color"] = null;
1130
  $this->_props["border_top_color"] = $this->__get("color");
1131
  }
1132
+
1133
  return $this->munge_color($this->_props["border_top_color"]);
1134
  }
1135
 
1139
  $this->_prop_cache["border_right_color"] = null;
1140
  $this->_props["border_right_color"] = $this->__get("color");
1141
  }
1142
+
1143
  return $this->munge_color($this->_props["border_right_color"]);
1144
  }
1145
 
1149
  $this->_prop_cache["border_bottom_color"] = null;
1150
  $this->_props["border_bottom_color"] = $this->__get("color");
1151
  }
1152
+
1153
  return $this->munge_color($this->_props["border_bottom_color"]);
1154
  }
1155
 
1159
  $this->_prop_cache["border_left_color"] = null;
1160
  $this->_props["border_left_color"] = $this->__get("color");
1161
  }
1162
+
1163
  return $this->munge_color($this->_props["border_left_color"]);
1164
  }
1165
 
1206
  * @return array
1207
  */
1208
  function get_border_properties() {
1209
+ return array(
1210
+ "top" => array(
1211
+ "width" => $this->__get("border_top_width"),
1212
+ "style" => $this->__get("border_top_style"),
1213
+ "color" => $this->__get("border_top_color"),
1214
+ ),
1215
+ "bottom" => array(
1216
+ "width" => $this->__get("border_bottom_width"),
1217
+ "style" => $this->__get("border_bottom_style"),
1218
+ "color" => $this->__get("border_bottom_color"),
1219
+ ),
1220
+ "right" => array(
1221
+ "width" => $this->__get("border_right_width"),
1222
+ "style" => $this->__get("border_right_style"),
1223
+ "color" => $this->__get("border_right_color"),
1224
+ ),
1225
+ "left" => array(
1226
+ "width" => $this->__get("border_left_width"),
1227
+ "style" => $this->__get("border_left_style"),
1228
+ "color" => $this->__get("border_left_color"),
1229
+ ),
1230
+ );
1231
  }
1232
 
1233
  /**
1234
  * Return a single border property
1235
  *
1236
+ * @param string $side
1237
+ *
1238
  * @return mixed
1239
  */
1240
  protected function _get_border($side) {
1254
  * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties
1255
  * @return string
1256
  */
1257
+ function get_border_top() {
1258
+ return $this->_get_border("top");
1259
+ }
1260
+
1261
+ function get_border_right() {
1262
+ return $this->_get_border("right");
1263
+ }
1264
+
1265
+ function get_border_bottom() {
1266
+ return $this->_get_border("bottom");
1267
+ }
1268
+
1269
+ function get_border_left() {
1270
+ return $this->_get_border("left");
1271
+ }
1272
  /**#@-*/
1273
 
1274
+ function get_computed_border_radius($w, $h) {
1275
+ if ( !empty($this->_computed_border_radius) ) {
1276
+ return $this->_computed_border_radius;
1277
+ }
1278
+
1279
+ $rTL = $this->__get("border_top_left_radius");
1280
+ $rTR = $this->__get("border_top_right_radius");
1281
+ $rBL = $this->__get("border_bottom_left_radius");
1282
+ $rBR = $this->__get("border_bottom_right_radius");
1283
+
1284
+ if ( $rTL + $rTR + $rBL + $rBR == 0 ) {
1285
+ return $this->_computed_border_radius = array(
1286
+ 0, 0, 0, 0,
1287
+ "top-left" => 0,
1288
+ "top-right" => 0,
1289
+ "bottom-right" => 0,
1290
+ "bottom-left" => 0,
1291
+ );
1292
+ }
1293
+
1294
+ $t = $this->__get("border_top_width");
1295
+ $r = $this->__get("border_right_width");
1296
+ $b = $this->__get("border_bottom_width");
1297
+ $l = $this->__get("border_left_width");
1298
+
1299
+ $rTL = min($rTL, $h - $rBL - $t/2 - $b/2, $w - $rTR - $l/2 - $r/2);
1300
+ $rTR = min($rTR, $h - $rBR - $t/2 - $b/2, $w - $rTL - $l/2 - $r/2);
1301
+ $rBL = min($rBL, $h - $rTL - $t/2 - $b/2, $w - $rBR - $l/2 - $r/2);
1302
+ $rBR = min($rBR, $h - $rTR - $t/2 - $b/2, $w - $rBL - $l/2 - $r/2);
1303
+
1304
+ return $this->_computed_border_radius = array(
1305
+ $rTL, $rTR, $rBR, $rBL,
1306
+ "top-left" => $rTL,
1307
+ "top-right" => $rTR,
1308
+ "bottom-right" => $rBR,
1309
+ "bottom-left" => $rBL,
1310
+ );
1311
+ }
1312
+ /**#@-*/
1313
+
1314
+
1315
  /**
1316
  * Returns the outline colour as an array
1317
  *
1326
  $this->_prop_cache["outline_color"] = null;
1327
  $this->_props["outline_color"] = $this->__get("color");
1328
  }
1329
+
1330
  return $this->munge_color($this->_props["outline_color"]);
1331
  }
1332
 
1398
  Special treatment:
1399
  At individual property like border-top-width need to check whether overriding value is also !important.
1400
  Also store the !important condition for later overrides.
1401
+ Since not known who is initiating the override, need to get passed !important as parameter.
1402
  !important Paramter taken as in the original style in the css file.
1403
+ When property border !important given, do not mark subsets like border_style as important. Only
1404
  individual properties.
1405
 
1406
  Note:
1419
  * Applicable for background, border, padding, margin, font, list_style
1420
  * Note: $type has a leading underscore (or is empty), the others not.
1421
  */
1422
+ protected function _set_style_side_type($style, $side, $type, $val, $important) {
1423
  $prop = $style.'_'.$side.$type;
1424
 
1425
  if ( !isset($this->_important_props[$prop]) || $important) {
1426
  //see __set and __get, on all assignments clear cache!
1427
  $this->_prop_cache[$prop] = null;
1428
+ if ( $important ) {
1429
  $this->_important_props[$prop] = true;
1430
  }
1431
  $this->_props[$prop] = $val;
1433
  }
1434
 
1435
  protected function _set_style_sides_type($style,$top,$right,$bottom,$left,$type,$important) {
1436
+ $this->_set_style_side_type($style,'top',$type,$top,$important);
1437
+ $this->_set_style_side_type($style,'right',$type,$right,$important);
1438
+ $this->_set_style_side_type($style,'bottom',$type,$bottom,$important);
1439
+ $this->_set_style_side_type($style,'left',$type,$left,$important);
1440
  }
1441
 
1442
  protected function _set_style_type($style,$type,$val,$important) {
1444
  $arr = explode(" ", $val);
1445
 
1446
  switch (count($arr)) {
1447
+ case 1: $this->_set_style_sides_type($style,$arr[0],$arr[0],$arr[0],$arr[0],$type,$important); break;
1448
+ case 2: $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[0],$arr[1],$type,$important); break;
1449
+ case 3: $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[2],$arr[1],$type,$important); break;
1450
+ case 4: $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[2],$arr[3],$type,$important); break;
 
 
 
 
 
 
 
 
 
 
1451
  }
1452
+
1453
  //see __set and __get, on all assignments clear cache!
1454
  $this->_prop_cache[$style.$type] = null;
1455
  $this->_props[$style.$type] = $val;
1470
 
1471
  protected function _set_style($style,$val,$important) {
1472
  if ( !isset($this->_important_props[$style]) || $important) {
1473
+ if ( $important ) {
1474
  $this->_important_props[$style] = true;
1475
  }
1476
  //see __set and __get, on all assignments clear cache!
1481
 
1482
  protected function _image($val) {
1483
  $DEBUGCSS=DEBUGCSS;
1484
+ $parsed_url = "none";
1485
 
1486
  if ( mb_strpos($val, "url") === false ) {
1487
  $path = "none"; //Don't resolve no image -> otherwise would prefix path and no longer recognize as none
1488
+ }
1489
+ else {
1490
  $val = preg_replace("/url\(['\"]?([^'\")]+)['\"]?\)/","\\1", trim($val));
1491
 
1492
  // Resolve the url now in the context of the current stylesheet
1494
  if ( $parsed_url["protocol"] == "" && $this->_stylesheet->get_protocol() == "" ) {
1495
  if ($parsed_url["path"][0] === '/' || $parsed_url["path"][0] === '\\' ) {
1496
  $path = $_SERVER["DOCUMENT_ROOT"].'/';
1497
+ }
1498
+ else {
1499
  $path = $this->_stylesheet->get_base_path();
1500
  }
1501
+
1502
  $path .= $parsed_url["path"] . $parsed_url["file"];
1503
  $path = realpath($path);
1504
  // If realpath returns FALSE then specifically state that there is no background image
1505
+ if ( !$path ) {
1506
+ $path = 'none';
1507
+ }
1508
+ }
1509
+ else {
1510
  $path = build_url($this->_stylesheet->get_protocol(),
1511
  $this->_stylesheet->get_host(),
1512
  $this->_stylesheet->get_base_path(),
1530
  * The colour parameter can be any valid CSS colour value
1531
  *
1532
  * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color
1533
+ * @param string $color
1534
  */
1535
+ function set_color($color) {
1536
+ $col = $this->munge_colour($color);
1537
 
1538
+ if ( is_null($col) || !isset($col["hex"]) ) {
1539
+ $color = "inherit";
1540
+ }
1541
+ else {
1542
+ $color = $col["hex"];
1543
+ }
1544
 
1545
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1546
  $this->_prop_cache["color"] = null;
1547
+ $this->_props["color"] = $color;
1548
  }
1549
 
1550
  /**
1551
  * Sets the background colour
1552
  *
1553
  * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color
1554
+ * @param string $color
1555
  */
1556
+ function set_background_color($color) {
1557
+ $col = $this->munge_colour($color);
1558
+
1559
+ if ( is_null($col) ) {
1560
+ return;
1561
+ //$col = self::$_defaults["background_color"];
1562
+ }
1563
 
1564
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1565
  $this->_prop_cache["background_color"] = null;
1568
 
1569
  /**
1570
  * Set the background image url
1571
+ * @link http://www.w3.org/TR/CSS21/colors.html#background-properties
1572
  *
1573
+ * @param string $val
 
1574
  */
1575
  function set_background_image($val) {
1576
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1585
  * @param string $val
1586
  */
1587
  function set_background_repeat($val) {
1588
+ if ( is_null($val) ) {
1589
  $val = self::$_defaults["background_repeat"];
1590
+ }
1591
 
1592
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1593
  $this->_prop_cache["background_repeat"] = null;
1601
  * @param string $val
1602
  */
1603
  function set_background_attachment($val) {
1604
+ if ( is_null($val) ) {
1605
  $val = self::$_defaults["background_attachment"];
1606
+ }
1607
 
1608
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1609
  $this->_prop_cache["background_attachment"] = null;
1617
  * @param string $val
1618
  */
1619
  function set_background_position($val) {
1620
+ if ( is_null($val) ) {
1621
  $val = self::$_defaults["background_position"];
1622
+ }
1623
 
1624
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1625
  $this->_prop_cache["background_position"] = null;
1633
  * @param string $val
1634
  */
1635
  function set_background($val) {
1636
+ $val = trim($val);
 
 
 
1637
  $important = isset($this->_important_props["background"]);
1638
 
1639
+ if ( $val === "none" ) {
1640
+ $this->_set_style("background_image", "none", $important);
1641
+ $this->_set_style("background_color", "transparent", $important);
1642
+ }
1643
+ else {
1644
+ $pos = array();
1645
+ $tmp = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces
1646
+ $tmp = preg_split("/\s+/", $tmp);
1647
+
1648
+ foreach($tmp as $attr) {
1649
+ if ( mb_substr($attr, 0, 3) === "url" || $attr === "none" ) {
1650
+ $this->_set_style("background_image", $this->_image($attr), $important);
1651
+ }
1652
+ elseif ( $attr === "fixed" || $attr === "scroll" ) {
1653
+ $this->_set_style("background_attachment", $attr, $important);
1654
+ }
1655
+ elseif ( $attr === "repeat" || $attr === "repeat-x" || $attr === "repeat-y" || $attr === "no-repeat" ) {
1656
+ $this->_set_style("background_repeat", $attr, $important);
1657
+ }
1658
+ elseif ( ($col = $this->munge_color($attr)) != null ) {
1659
+ $this->_set_style("background_color", is_array($col) ? $col["hex"] : $col, $important);
1660
+ }
1661
+ else {
1662
+ $pos[] = $attr;
1663
+ }
1664
+ }
1665
+
1666
+ if (count($pos)) {
1667
+ $this->_set_style("background_position", implode(" ", $pos), $important);
1668
  }
1669
  }
1670
 
 
 
 
1671
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1672
  $this->_prop_cache["background"] = null;
1673
  $this->_props["background"] = $val;
1723
  if ( preg_match("/^(italic|oblique|normal)\s*(.*)$/i",$val,$match) ) {
1724
  $this->_set_style("font_style", $match[1], $important);
1725
  $val = $match[2];
1726
+ }
1727
+ else {
1728
  $this->_set_style("font_style", self::$_defaults["font_style"], $important);
1729
  }
1730
 
1731
  if ( preg_match("/^(small-caps|normal)\s*(.*)$/i",$val,$match) ) {
1732
  $this->_set_style("font_variant", $match[1], $important);
1733
  $val = $match[2];
1734
+ }
1735
+ else {
1736
  $this->_set_style("font_variant", self::$_defaults["font_variant"], $important);
1737
  }
1738
 
1739
  //matching numeric value followed by unit -> this is indeed a subsequent font size. Skip!
1740
+ if ( preg_match("/^(bold|bolder|lighter|100|200|300|400|500|600|700|800|900|normal)\s*(.*)$/i", $val, $match) &&
1741
  !preg_match("/^(?:pt|px|pc|em|ex|in|cm|mm|%)/",$match[2])
1742
  ) {
1743
  $this->_set_style("font_weight", $match[1], $important);
1744
  $val = $match[2];
1745
+ }
1746
+ else {
1747
  $this->_set_style("font_weight", self::$_defaults["font_weight"], $important);
1748
  }
1749
 
1750
  if ( preg_match("/^(xx-small|x-small|small|medium|large|x-large|xx-large|smaller|larger|\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))\s*(.*)$/i",$val,$match) ) {
1751
  $this->_set_style("font_size", $match[1], $important);
1752
  $val = $match[2];
1753
+ if ( preg_match("/^\/\s*(\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))\s*(.*)$/i", $val, $match ) ) {
1754
  $this->_set_style("line_height", $match[1], $important);
1755
  $val = $match[2];
1756
+ }
1757
+ else {
1758
  $this->_set_style("line_height", self::$_defaults["line_height"], $important);
1759
  }
1760
+ }
1761
+ else {
1762
  $this->_set_style("font_size", self::$_defaults["font_size"], $important);
1763
  $this->_set_style("line_height", self::$_defaults["line_height"], $important);
1764
  }
1765
 
1766
+ if( strlen($val) != 0 ) {
1767
  $this->_set_style("font_family", $val, $important);
1768
+ }
1769
+ else {
1770
  $this->_set_style("font_family", self::$_defaults["font_family"], $important);
1771
  }
1772
  }
1778
  * @param string $break
1779
  */
1780
  function set_page_break_before($break) {
1781
+ if ( $break === "left" || $break === "right" ) {
1782
  $break = "always";
1783
+ }
1784
 
1785
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1786
  $this->_prop_cache["page_break_before"] = null;
1788
  }
1789
 
1790
  function set_page_break_after($break) {
1791
+ if ( $break === "left" || $break === "right" ) {
1792
  $break = "always";
1793
+ }
1794
 
1795
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
1796
  $this->_prop_cache["page_break_after"] = null;
1859
  /**
1860
  * Sets a single border
1861
  *
1862
+ * @param string $side
1863
+ * @param string $border_spec ([width] [style] [color])
1864
+ * @param boolean $important
1865
  */
1866
  protected function _set_border($side, $border_spec, $important) {
1867
  $border_spec = preg_replace("/\s*\,\s*/", ",", $border_spec);
1880
  $value = trim($value);
1881
  if ( in_array($value, self::$BORDER_STYLES) ) {
1882
  $this->_set_style_side_type('border',$side,'_style',$value,$important);
1883
+ }
1884
+ else if ( preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value ) ) {
1885
  $this->_set_style_side_type('border',$side,'_width',$value,$important);
1886
+ }
1887
+ else {
1888
  // must be colour
1889
  $this->_set_style_side_type('border',$side,'_color',$value,$important);
1890
  }
1895
  $this->_props['border_'.$side] = $border_spec;
1896
  }
1897
 
1898
+ /**
1899
  * Sets the border styles
1900
  *
1901
  * @link http://www.w3.org/TR/CSS21/box.html#border-properties
1902
  * @param string $val
1903
  */
1904
+ function set_border_top($val) {
1905
+ $this->_set_border("top", $val, isset($this->_important_props['border_top']));
1906
+ }
1907
+
1908
+ function set_border_right($val) {
1909
+ $this->_set_border("right", $val, isset($this->_important_props['border_right']));
1910
+ }
1911
+
1912
+ function set_border_bottom($val) {
1913
+ $this->_set_border("bottom", $val, isset($this->_important_props['border_bottom']));
1914
+ }
1915
+
1916
+ function set_border_left($val) {
1917
+ $this->_set_border("left", $val, isset($this->_important_props['border_left']));
1918
+ }
1919
 
1920
  function set_border($val) {
1921
  $important = isset($this->_important_props["border"]);
1940
  $this->_set_style_type_important('border','_style',$val);
1941
  }
1942
 
1943
+ /**
1944
+ * Sets the border radius size
1945
+ *
1946
+ * http://www.w3.org/TR/css3-background/#corners
1947
+ */
1948
+ function set_border_top_left_radius($val) {
1949
+ $this->_set_border_radius_corner($val, "top_left");
1950
+ }
1951
+
1952
+ function set_border_top_right_radius($val) {
1953
+ $this->_set_border_radius_corner($val, "top_right");
1954
+ }
1955
+
1956
+ function set_border_bottom_left_radius($val) {
1957
+ $this->_set_border_radius_corner($val, "bottom_left");
1958
+ }
1959
+
1960
+ function set_border_bottom_right_radius($val) {
1961
+ $this->_set_border_radius_corner($val, "bottom_right");
1962
+ }
1963
+
1964
+ function set_border_radius($val) {
1965
+ $val = preg_replace("/\s*\,\s*/", ",", $val); // when border-radius has spaces
1966
+ $arr = explode(" ", $val);
1967
+
1968
+ switch (count($arr)) {
1969
+ case 1: $this->_set_border_radii($arr[0],$arr[0],$arr[0],$arr[0]); break;
1970
+ case 2: $this->_set_border_radii($arr[0],$arr[1],$arr[0],$arr[1]); break;
1971
+ case 3: $this->_set_border_radii($arr[0],$arr[1],$arr[2],$arr[1]); break;
1972
+ case 4: $this->_set_border_radii($arr[0],$arr[1],$arr[2],$arr[3]); break;
1973
+ }
1974
+ }
1975
+
1976
+ protected function _set_border_radii($val1, $val2, $val3, $val4) {
1977
+ $this->_set_border_radius_corner($val1, "top_left");
1978
+ $this->_set_border_radius_corner($val2, "top_right");
1979
+ $this->_set_border_radius_corner($val3, "bottom_right");
1980
+ $this->_set_border_radius_corner($val4, "bottom_left");
1981
+ }
1982
+
1983
+ protected function _set_border_radius_corner($val, $corner) {
1984
+ $this->_has_border_radius = true;
1985
+
1986
+ //see __set and __get, on all assignments clear cache!
1987
+ $this->_prop_cache["border_" . $corner . "_radius"] = null;
1988
+
1989
+ $this->_props["border_" . $corner . "_radius"] = $this->length_in_pt($val);
1990
+ }
1991
+
1992
+ /**
1993
  * Sets the outline styles
1994
  *
1995
  * @link http://www.w3.org/TR/CSS21/ui.html#dynamic-outlines
2010
  if ( !isset($this->_important_props[$prop]) || $important) {
2011
  //see __set and __get, on all assignments clear cache!
2012
  $this->_prop_cache[$prop] = null;
2013
+ if ( $important ) {
2014
  $this->_important_props[$prop] = true;
2015
  }
2016
  $this->_props[$prop] = $_val;
2021
  $arr = explode(" ", $val);
2022
  foreach ($arr as $value) {
2023
  $value = trim($value);
2024
+
2025
  if ( in_array($value, self::$BORDER_STYLES) ) {
2026
  $this->set_outline_style($value);
2027
+ }
2028
+ else if ( preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value ) ) {
2029
  $this->set_outline_width($value);
2030
+ }
2031
+ else {
2032
  // must be colour
2033
  $this->set_outline_color($value);
2034
  }
2050
  function set_outline_style($val) {
2051
  $this->_set_style_type_important('outline','_style',$val);
2052
  }
 
 
2053
 
2054
  /**
2055
  * Sets the border spacing
2060
  function set_border_spacing($val) {
2061
  $arr = explode(" ", $val);
2062
 
2063
+ if ( count($arr) == 1 ) {
2064
  $arr[1] = $arr[0];
2065
+ }
2066
 
2067
  //see __set and __get, on all assignments clear cache, not needed on direct set through __set
2068
  $this->_prop_cache["border_spacing"] = null;
2109
  /* http://www.w3.org/TR/CSS21/generate.html#list-style
2110
  * A value of 'none' for the 'list-style' property sets both 'list-style-type' and 'list-style-image' to 'none'
2111
  */
2112
+ if ( $value === "none" ) {
2113
  $this->_set_style("list_style_type", $value, $important);
2114
  $this->_set_style("list_style_image", $value, $important);
2115
  continue;
2120
  //Firefox is wrong here (list_style_image gets overwritten on explicite list_style_type)
2121
  //Internet Explorer 7/8 and dompdf is right.
2122
 
2123
+ if ( mb_substr($value, 0, 3) === "url" ) {
2124
  $this->_set_style("list_style_image", $this->_image($value), $important);
2125
  continue;
2126
  }
2127
 
2128
  if ( in_array($value, $types) ) {
2129
  $this->_set_style("list_style_type", $value, $important);
2130
+ }
2131
+ else if ( in_array($value, $positions) ) {
2132
  $this->_set_style("list_style_position", $value, $important);
2133
  }
2134
  }
2185
  $tr_value = "\s*([^,\s]+)\s*";
2186
  $angle = "\s*([^,\s]+(?:deg|rad)?)\s*";
2187
 
2188
+ if ( !preg_match_all("/[a-z]+\([^\)]+\)/i", $val, $parts, PREG_SET_ORDER) ) {
2189
  return;
2190
  }
2191
 
2213
  $t = $part[0];
2214
 
2215
  foreach($functions as $name => $pattern) {
2216
+ if ( preg_match("/$name\s*$pattern/i", $t, $matches) ) {
2217
  $values = array_slice($matches, 1);
2218
 
2219
  switch($name) {
2224
  case "skewY":
2225
 
2226
  foreach($values as $i => $value) {
2227
+ if ( strpos($value, "rad") ) {
2228
  $values[$i] = rad2deg(floatval($value));
2229
+ }
2230
+ else {
2231
  $values[$i] = floatval($value);
2232
+ }
2233
  }
2234
 
2235
  switch($name) {
2236
  case "skew":
2237
+ if ( !isset($values[1]) ) {
2238
  $values[1] = 0;
2239
+ }
2240
  break;
2241
  case "skewX":
2242
  $name = "skew";
2253
  case "translate":
2254
  $values[0] = $this->length_in_pt($values[0], $this->width);
2255
 
2256
+ if ( isset($values[1]) ) {
2257
  $values[1] = $this->length_in_pt($values[1], $this->height);
2258
+ }
2259
+ else {
2260
  $values[1] = 0;
2261
+ }
2262
  break;
2263
 
2264
  case "translateX":
2273
 
2274
  // <number> units
2275
  case "scale":
2276
+ if ( !isset($values[1]) ) {
2277
  $values[1] = $values[0];
2278
+ }
2279
  break;
2280
 
2281
  case "scaleX":
2303
  }
2304
 
2305
  function set__webkit_transform($val) {
2306
+ $this->set_transform($val);
2307
  }
2308
 
2309
  function set__webkit_transform_origin($val) {
2310
+ $this->set_transform_origin($val);
2311
  }
2312
 
2313
  /**
2372
  }
2373
 
2374
  function set__dompdf_background_image_resolution($val) {
2375
+ $this->set_background_image_resolution($val);
2376
  }
2377
 
2378
  function set__dompdf_image_resolution($val) {
2379
+ $this->set_image_resolution($val);
2380
  }
2381
 
2382
  function set_z_index($val) {
2422
  $this->_props), true);
2423
  }
2424
 
2425
+ /*DEBUGCSS*/ function debug_print() {
 
2426
  /*DEBUGCSS*/ print "parent_font_size:".$this->_parent_font_size . ";\n";
2427
  /*DEBUGCSS*/ foreach($this->_props as $prop => $val ) {
2428
  /*DEBUGCSS*/ print $prop.':'.$val;
dompdf/include/stylesheet.cls.php CHANGED
@@ -1,1362 +1,1434 @@
1
- <?php
2
- /**
3
- * @package dompdf
4
- * @link http://www.dompdf.com/
5
- * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Helmut Tischer <htischer@weihenstephan.org>
7
- * @author Fabien M�nager <fabien.menager@gmail.com>
8
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
9
- * @version $Id: stylesheet.cls.php 461 2012-01-26 20:26:02Z fabien.menager $
10
- */
11
-
12
- /**
13
- * The location of the default built-in CSS file.
14
- * {@link Stylesheet::DEFAULT_STYLESHEET}
15
- */
16
- define('__DEFAULT_STYLESHEET', DOMPDF_LIB_DIR . DIRECTORY_SEPARATOR . "res" . DIRECTORY_SEPARATOR . "html.css");
17
-
18
- /**
19
- * The master stylesheet class
20
- *
21
- * The Stylesheet class is responsible for parsing stylesheets and style
22
- * tags/attributes. It also acts as a registry of the individual Style
23
- * objects generated by the current set of loaded CSS files and style
24
- * elements.
25
- *
26
- * @see Style
27
- * @package dompdf
28
- */
29
- class Stylesheet {
30
-
31
- /**
32
- * The location of the default built-in CSS file.
33
- */
34
- const DEFAULT_STYLESHEET = __DEFAULT_STYLESHEET;
35
-
36
- /**
37
- * User agent stylesheet origin
38
- * @var int
39
- */
40
- const ORIG_UA = 1;
41
-
42
- /**
43
- * User normal stylesheet origin
44
- * @var int
45
- */
46
- const ORIG_USER = 2;
47
-
48
- /**
49
- * Author normal stylesheet origin
50
- * @var int
51
- */
52
- const ORIG_AUTHOR = 3;
53
-
54
- private static $_stylesheet_origins = array(
55
- self::ORIG_UA => -0x0FFFFFFF, // user agent style sheets
56
- self::ORIG_USER => -0x0000FFFF, // user normal style sheets
57
- self::ORIG_AUTHOR => 0x00000000, // author normal style sheets
58
- );
59
-
60
- /**
61
- * Current dompdf instance
62
- * @var DOMPDF
63
- */
64
- private $_dompdf;
65
-
66
- /**
67
- * Array of currently defined styles
68
- * @var array
69
- */
70
- private $_styles;
71
-
72
- /**
73
- * Base protocol of the document being parsed
74
- * Used to handle relative urls.
75
- * @var string
76
- */
77
- private $_protocol;
78
-
79
- /**
80
- * Base hostname of the document being parsed
81
- * Used to handle relative urls.
82
- * @var string
83
- */
84
- private $_base_host;
85
-
86
- /**
87
- * Base path of the document being parsed
88
- * Used to handle relative urls.
89
- * @var string
90
- */
91
- private $_base_path;
92
-
93
- /**
94
- * The styles defined by @page rules
95
- * @var array<Style>
96
- */
97
- private $_page_styles;
98
-
99
- /**
100
- * List of loaded files, used to prevent recursion
101
- * @var array
102
- */
103
- private $_loaded_files;
104
-
105
- private $_current_origin = self::ORIG_UA;
106
-
107
- /**
108
- * Accepted CSS media types
109
- * List of types and parsing rules for future extensions:
110
- * http://www.w3.org/TR/REC-html40/types.html
111
- * screen, tty, tv, projection, handheld, print, braille, aural, all
112
- * The following are non standard extensions for undocumented specific environments.
113
- * static, visual, bitmap, paged, dompdf
114
- * Note, even though the generated pdf file is intended for print output,
115
- * the desired content might be different (e.g. screen or projection view of html file).
116
- * Therefore allow specification of content by dompdf setting DOMPDF_DEFAULT_MEDIA_TYPE.
117
- * If given, replace media "print" by DOMPDF_DEFAULT_MEDIA_TYPE.
118
- * (Previous version $ACCEPTED_MEDIA_TYPES = $ACCEPTED_GENERIC_MEDIA_TYPES + $ACCEPTED_DEFAULT_MEDIA_TYPE)
119
- */
120
- static $ACCEPTED_DEFAULT_MEDIA_TYPE = "print";
121
- static $ACCEPTED_GENERIC_MEDIA_TYPES = array("all", "static", "visual", "bitmap", "paged", "dompdf");
122
-
123
- /**
124
- * The class constructor.
125
- *
126
- * The base protocol, host & path are initialized to those of
127
- * the current script.
128
- */
129
- function __construct(DOMPDF $dompdf) {
130
- $this->_dompdf = $dompdf;
131
- $this->_styles = array();
132
- $this->_loaded_files = array();
133
- list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($_SERVER["SCRIPT_FILENAME"]);
134
- $this->_page_styles = array("base" => null);
135
- }
136
-
137
- /**
138
- * Class destructor
139
- */
140
- function __destruct() {
141
- clear_object($this);
142
- }
143
-
144
- /**
145
- * Set the base protocol
146
- *
147
- * @param string $proto
148
- */
149
- function set_protocol($proto) { $this->_protocol = $proto; }
150
-
151
- /**
152
- * Set the base host
153
- *
154
- * @param string $host
155
- */
156
- function set_host($host) { $this->_base_host = $host; }
157
-
158
- /**
159
- * Set the base path
160
- *
161
- * @param string $path
162
- */
163
- function set_base_path($path) { $this->_base_path = $path; }
164
-
165
- /**
166
- * Return the DOMPDF object
167
- *
168
- * @return DOMPDF
169
- */
170
- function get_dompdf() { return $this->_dompdf; }
171
-
172
- /**
173
- * Return the base protocol for this stylesheet
174
- *
175
- * @return string
176
- */
177
- function get_protocol() { return $this->_protocol; }
178
-
179
- /**
180
- * Return the base host for this stylesheet
181
- *
182
- * @return string
183
- */
184
- function get_host() { return $this->_base_host; }
185
-
186
- /**
187
- * Return the base path for this stylesheet
188
- *
189
- * @return string
190
- */
191
- function get_base_path() { return $this->_base_path; }
192
-
193
- /**
194
- * Return the array of page styles
195
- *
196
- * @return array<Style>
197
- */
198
- function get_page_styles() { return $this->_page_styles; }
199
-
200
- /**
201
- * Add a new Style object to the stylesheet
202
- *
203
- * add_style() adds a new Style object to the current stylesheet, or
204
- * merges a new Style with an existing one.
205
- *
206
- * @param string $key the Style's selector
207
- * @param Style $style the Style to be added
208
- */
209
- function add_style($key, Style $style) {
210
- if (!is_string($key))
211
- throw new DOMPDF_Exception("CSS rule must be keyed by a string.");
212
-
213
- if ( isset($this->_styles[$key]) )
214
- $this->_styles[$key]->merge($style);
215
- else
216
- $this->_styles[$key] = clone $style;
217
-
218
- $this->_styles[$key]->set_origin( $this->_current_origin );
219
- }
220
-
221
- /**
222
- * lookup a specifc Style object
223
- *
224
- * lookup() returns the Style specified by $key, or null if the Style is
225
- * not found.
226
- *
227
- * @param string $key the selector of the requested Style
228
- * @return Style
229
- */
230
- function lookup($key) {
231
- if ( !isset($this->_styles[$key]) )
232
- return null;
233
-
234
- return $this->_styles[$key];
235
- }
236
-
237
- /**
238
- * create a new Style object associated with this stylesheet
239
- *
240
- * @param Style $parent The style of this style's parent in the DOM tree
241
- * @return Style
242
- */
243
- function create_style(Style $parent = null) {
244
- return new Style($this, $this->_current_origin);
245
- }
246
-
247
- /**
248
- * load and parse a CSS string
249
- *
250
- * @param string $css
251
- */
252
- function load_css(&$css) { $this->_parse_css($css); }
253
-
254
-
255
- /**
256
- * load and parse a CSS file
257
- *
258
- * @param string $file
259
- */
260
- function load_css_file($file, $origin = self::ORIG_AUTHOR) {
261
- global $_dompdf_warnings;
262
-
263
- if ( $origin ) {
264
- $this->_current_origin = $origin;
265
- }
266
-
267
- // Prevent circular references
268
- if ( isset($this->_loaded_files[$file]) )
269
- return;
270
-
271
- $this->_loaded_files[$file] = true;
272
- $parsed_url = explode_url($file);
273
-
274
- list($this->_protocol, $this->_base_host, $this->_base_path, $filename) = $parsed_url;
275
-
276
- // Fix submitted by Nick Oostveen for aliased directory support:
277
- if ( $this->_protocol == "" )
278
- $file = $this->_base_path . $filename;
279
- else
280
- $file = build_url($this->_protocol, $this->_base_host, $this->_base_path, $filename);
281
-
282
- set_error_handler("record_warnings");
283
- $css = file_get_contents($file, null, $this->_dompdf->get_http_context());
284
-
285
- $good_mime_type = true;
286
-
287
- if ( !$this->_dompdf->get_quirksmode() ) {
288
- // See http://the-stickman.com/web-development/php/getting-http-response-headers-when-using-file_get_contents/
289
- if ( isset($http_response_header) ) {
290
- foreach($http_response_header as $_header) {
291
- if ( preg_match("@Content-Type:\s*([\w/]+)@i", $_header, $matches) ) {
292
- if ( $matches[1] !== "text/css" ) {
293
- $good_mime_type = false;
294
- }
295
- }
296
- }
297
- }
298
- }
299
-
300
- restore_error_handler();
301
-
302
- if ( !$good_mime_type || $css == "" ) {
303
- record_warnings(E_USER_WARNING, "Unable to load css file $file", __FILE__, __LINE__);
304
- return;
305
- }
306
-
307
- $this->_parse_css($css);
308
- }
309
-
310
- /**
311
- * @link http://www.w3.org/TR/CSS21/cascade.html#specificity
312
- *
313
- *
314
- *
315
- * @param string $selector
316
- * @param string $origin :
317
- * - ua: user agent style sheets
318
- * - un: user normal style sheets
319
- * - an: author normal style sheets
320
- * - ai: author important style sheets
321
- * - ui: user important style sheets
322
- *
323
- * @return int
324
- */
325
- private function _specificity($selector, $origin = self::ORIG_AUTHOR) {
326
- // http://www.w3.org/TR/CSS21/cascade.html#specificity
327
- // ignoring the ":" pseudoclass modifyers
328
- // also ignored in _css_selector_to_xpath
329
-
330
- $a = ($selector === "!attr") ? 1 : 0;
331
-
332
- $b = min(mb_substr_count($selector, "#"), 255);
333
-
334
- $c = min(mb_substr_count($selector, ".") +
335
- mb_substr_count($selector, "["), 255);
336
-
337
- $d = min(mb_substr_count($selector, " ") +
338
- mb_substr_count($selector, ">") +
339
- mb_substr_count($selector, "+"), 255);
340
-
341
- //If a normal element name is at the begining of the string,
342
- //a leading whitespace might have been removed on whitespace collapsing and removal
343
- //therefore there might be one whitespace less as selected element names
344
- //this can lead to a too small specificity
345
- //see _css_selector_to_xpath
346
-
347
- if ( !in_array($selector[0], array(" ", ">", ".", "#", "+", ":", "["))/* && $selector !== "*"*/) {
348
- $d++;
349
- }
350
-
351
- if (DEBUGCSS) {
352
- /*DEBUGCSS*/ print "<pre>\n";
353
- /*DEBUGCSS*/ printf("_specificity(): 0x%08x \"%s\"\n", ($a << 24) | ($b << 16) | ($c << 8) | ($d), $selector);
354
- /*DEBUGCSS*/ print "</pre>";
355
- }
356
-
357
- return self::$_stylesheet_origins[$origin] + ($a << 24) | ($b << 16) | ($c << 8) | ($d);
358
- }
359
-
360
- /**
361
- * converts a CSS selector to an XPath query.
362
- *
363
- * @param string $selector
364
- * @return string
365
- */
366
- private function _css_selector_to_xpath($selector, $first_pass = false) {
367
-
368
- // Collapse white space and strip whitespace around delimiters
369
- // $search = array("/\\s+/", "/\\s+([.>#+:])\\s+/");
370
- // $replace = array(" ", "\\1");
371
- // $selector = preg_replace($search, $replace, trim($selector));
372
-
373
- // Initial query (non-absolute)
374
- $query = "//";
375
-
376
- // Will contain :before and :after if they must be created
377
- $pseudo_elements = array();
378
-
379
- // Parse the selector
380
- //$s = preg_split("/([ :>.#+])/", $selector, -1, PREG_SPLIT_DELIM_CAPTURE);
381
-
382
- $delimiters = array(" ", ">", ".", "#", "+", ":", "[", "(");
383
-
384
- // Add an implicit * at the beginning of the selector
385
- // if it begins with an attribute selector
386
- if ( $selector[0] === "[" )
387
- $selector = "*$selector";
388
-
389
- // Add an implicit space at the beginning of the selector if there is no
390
- // delimiter there already.
391
- if ( !in_array($selector[0], $delimiters) )
392
- $selector = " $selector";
393
-
394
- $tok = "";
395
- $len = mb_strlen($selector);
396
- $i = 0;
397
-
398
- while ( $i < $len ) {
399
-
400
- $s = $selector[$i];
401
- $i++;
402
-
403
- // Eat characters up to the next delimiter
404
- $tok = "";
405
- $in_attr = false;
406
-
407
- while ($i < $len) {
408
- $c = $selector[$i];
409
- $c_prev = $selector[$i-1];
410
-
411
- if ( !$in_attr && in_array($c, $delimiters) )
412
- break;
413
-
414
- if ( $c_prev === "[" ) {
415
- $in_attr = true;
416
- }
417
-
418
- $tok .= $selector[$i++];
419
- }
420
-
421
- switch ($s) {
422
-
423
- case " ":
424
- case ">":
425
- // All elements matching the next token that are direct children of
426
- // the current token
427
- $expr = $s === " " ? "descendant" : "child";
428
-
429
- if ( mb_substr($query, -1, 1) !== "/" )
430
- $query .= "/";
431
-
432
- // Tag names are case-insensitive
433
- $tok = strtolower($tok);
434
-
435
- if ( !$tok )
436
- $tok = "*";
437
-
438
- $query .= "$expr::$tok";
439
- $tok = "";
440
- break;
441
-
442
- case ".":
443
- case "#":
444
- // All elements matching the current token with a class/id equal to
445
- // the _next_ token.
446
-
447
- $attr = $s === "." ? "class" : "id";
448
-
449
- // empty class/id == *
450
- if ( mb_substr($query, -1, 1) === "/" )
451
- $query .= "*";
452
-
453
- // Match multiple classes: $tok contains the current selected
454
- // class. Search for class attributes with class="$tok",
455
- // class=".* $tok .*" and class=".* $tok"
456
-
457
- // This doesn't work because libxml only supports XPath 1.0...
458
- //$query .= "[matches(@$attr,\"^${tok}\$|^${tok}[ ]+|[ ]+${tok}\$|[ ]+${tok}[ ]+\")]";
459
-
460
- // Query improvement by Michael Sheakoski <michael@mjsdigital.com>:
461
- $query .= "[contains(concat(' ', @$attr, ' '), concat(' ', '$tok', ' '))]";
462
- $tok = "";
463
- break;
464
-
465
- case "+":
466
- // All sibling elements that folow the current token
467
- if ( mb_substr($query, -1, 1) !== "/" )
468
- $query .= "/";
469
-
470
- $query .= "following-sibling::$tok";
471
- $tok = "";
472
- break;
473
-
474
- case ":":
475
- $i2 = $i-strlen($tok)-2; // the char before ":"
476
- if ( !isset($selector[$i2]) || in_array($selector[$i2], $delimiters) ) {
477
- $query .= "*";
478
- }
479
-
480
- $last = false;
481
-
482
- // Pseudo-classes
483
- switch ($tok) {
484
-
485
- case "first-child":
486
- $query .= "[1]";
487
- $tok = "";
488
- break;
489
-
490
- case "last-child":
491
- $query .= "[not(following-sibling::*)]";
492
- $tok = "";
493
- break;
494
-
495
- case "first-of-type":
496
- $query .= "[position() = 1]";
497
- $tok = "";
498
- break;
499
-
500
- case "last-of-type":
501
- $query .= "[position() = last()]";
502
- $tok = "";
503
- break;
504
-
505
- // an+b, n, odd, and even
506
- case "nth-last-of-type":
507
- case "nth-last-child":
508
- $last = true;
509
-
510
- case "nth-of-type":
511
- case "nth-child":
512
- $p = $i+1;
513
- $nth = trim(mb_substr($selector, $p, strpos($selector, ")", $i)-$p));
514
-
515
- $condition = "";
516
-
517
- // 1
518
- if ( preg_match("/^\d+$/", $nth) ) {
519
- $condition = "position() = $nth";
520
- }
521
-
522
- // odd
523
- elseif ( $nth === "odd" ) {
524
- $condition = "(position() mod 2) = 1";
525
- }
526
-
527
- // even
528
- elseif ( $nth === "even" ) {
529
- $condition = "(position() mod 2) = 0";
530
- }
531
-
532
- // an+b
533
- else {
534
- $condition = $this->_selector_an_plus_b($nth, $last);
535
- }
536
-
537
- $query .= "[$condition]";
538
- $tok = "";
539
- break;
540
-
541
- case "link":
542
- $query .= "[@href]";
543
- $tok = "";
544
- break;
545
-
546
- case "first-line": // TODO
547
- case "first-letter": // TODO
548
-
549
- // N/A
550
- case "active":
551
- case "hover":
552
- case "visited":
553
- $query .= "[false()]";
554
- $tok = "";
555
- break;
556
-
557
- /* Pseudo-elements */
558
- case "before":
559
- case "after":
560
- if ( $first_pass )
561
- $pseudo_elements[$tok] = $tok;
562
- else
563
- $query .= "/*[@$tok]";
564
-
565
- $tok = "";
566
- break;
567
-
568
- case "empty":
569
- $query .= "[not(*) and not(normalize-space())]";
570
- $tok = "";
571
- break;
572
-
573
- case "disabled":
574
- case "checked":
575
- $query .= "[@$tok]";
576
- $tok = "";
577
- break;
578
-
579
- case "enabled":
580
- $query .= "[not(@disabled)]";
581
- $tok = "";
582
- break;
583
- }
584
-
585
- break;
586
-
587
- case "[":
588
- // Attribute selectors. All with an attribute matching the following token(s)
589
- $attr_delimiters = array("=", "]", "~", "|", "$", "^", "*");
590
- $tok_len = mb_strlen($tok);
591
- $j = 0;
592
-
593
- $attr = "";
594
- $op = "";
595
- $value = "";
596
-
597
- while ( $j < $tok_len ) {
598
- if ( in_array($tok[$j], $attr_delimiters) )
599
- break;
600
- $attr .= $tok[$j++];
601
- }
602
-
603
- switch ( $tok[$j] ) {
604
-
605
- case "~":
606
- case "|":
607
- case "$":
608
- case "^":
609
- case "*":
610
- $op .= $tok[$j++];
611
-
612
- if ( $tok[$j] !== "=" )
613
- throw new DOMPDF_Exception("Invalid CSS selector syntax: invalid attribute selector: $selector");
614
-
615
- $op .= $tok[$j];
616
- break;
617
-
618
- case "=":
619
- $op = "=";
620
- break;
621
-
622
- }
623
-
624
- // Read the attribute value, if required
625
- if ( $op != "" ) {
626
- $j++;
627
- while ( $j < $tok_len ) {
628
- if ( $tok[$j] === "]" )
629
- break;
630
- $value .= $tok[$j++];
631
- }
632
- }
633
-
634
- if ( $attr == "" )
635
- throw new DOMPDF_Exception("Invalid CSS selector syntax: missing attribute name");
636
-
637
- $value = trim($value, "\"'");
638
-
639
- switch ( $op ) {
640
-
641
- case "":
642
- $query .= "[@$attr]";
643
- break;
644
-
645
- case "=":
646
- $query .= "[@$attr=\"$value\"]";
647
- break;
648
-
649
- case "~=":
650
- // FIXME: this will break if $value contains quoted strings
651
- // (e.g. [type~="a b c" "d e f"])
652
- $values = explode(" ", $value);
653
- $query .= "[";
654
-
655
- foreach ( $values as $val )
656
- $query .= "@$attr=\"$val\" or ";
657
-
658
- $query = rtrim($query, " or ") . "]";
659
- break;
660
-
661
- case "|=":
662
- $values = explode("-", $value);
663
- $query .= "[";
664
-
665
- foreach ( $values as $val )
666
- $query .= "starts-with(@$attr, \"$val\") or ";
667
-
668
- $query = rtrim($query, " or ") . "]";
669
- break;
670
-
671
- case "$=":
672
- $query .= "[substring(@$attr, string-length(@$attr)-".(strlen($value) - 1).")=\"$value\"]";
673
- break;
674
-
675
- case "^=":
676
- $query .= "[starts-with(@$attr,\"$value\")]";
677
- break;
678
-
679
- case "*=":
680
- $query .= "[contains(@$attr,\"$value\")]";
681
- break;
682
- }
683
-
684
- break;
685
- }
686
- }
687
- $i++;
688
-
689
- // case ":":
690
- // // Pseudo selectors: ignore for now. Partially handled directly
691
- // // below.
692
-
693
- // // Skip until the next special character, leaving the token as-is
694
- // while ( $i < $len ) {
695
- // if ( in_array($selector[$i], $delimiters) )
696
- // break;
697
- // $i++;
698
- // }
699
- // break;
700
-
701
- // default:
702
- // // Add the character to the token
703
- // $tok .= $selector[$i++];
704
- // break;
705
- // }
706
-
707
- // }
708
-
709
-
710
- // Trim the trailing '/' from the query
711
- if ( mb_strlen($query) > 2 )
712
- $query = rtrim($query, "/");
713
-
714
- return array("query" => $query, "pseudo_elements" => $pseudo_elements);
715
- }
716
-
717
- // https://github.com/tenderlove/nokogiri/blob/master/lib/nokogiri/css/xpath_visitor.rb
718
- protected function _selector_an_plus_b($expr, $last = false) {
719
- $expr = preg_replace("/\s/", "", $expr);
720
- if ( !preg_match("/^(?P<a>-?[0-9]*)?n(?P<b>[-+]?[0-9]+)?$/", $expr, $matches)) {
721
- return "false()";
722
- }
723
-
724
- $a = ((isset($matches["a"]) && $matches["a"] !== "") ? intval($matches["a"]) : 1);
725
- $b = ((isset($matches["b"]) && $matches["b"] !== "") ? intval($matches["b"]) : 0);
726
-
727
- $position = ($last ? "(last()-position()+1)" : "position()");
728
-
729
- if ($b == 0) {
730
- return "($position mod $a) = 0";
731
- }
732
- else {
733
- $compare = (($a < 0) ? "<=" : ">=");
734
- $b2 = -$b;
735
- if( $b2 >= 0 ) {
736
- $b2 = "+$b2";
737
- }
738
- return "($position $compare $b) and ((($position $b2) mod ".abs($a).") = 0)";
739
- }
740
- }
741
-
742
- /**
743
- * applies all current styles to a particular document tree
744
- *
745
- * apply_styles() applies all currently loaded styles to the provided
746
- * {@link Frame_Tree}. Aside from parsing CSS, this is the main purpose
747
- * of this class.
748
- *
749
- * @param Frame_Tree $tree
750
- */
751
- function apply_styles(Frame_Tree $tree) {
752
- // Use XPath to select nodes. This would be easier if we could attach
753
- // Frame objects directly to DOMNodes using the setUserData() method, but
754
- // we can't do that just yet. Instead, we set a _node attribute_ in
755
- // Frame->set_id() and use that as a handle on the Frame object via
756
- // Frame_Tree::$_registry.
757
-
758
- // We create a scratch array of styles indexed by frame id. Once all
759
- // styles have been assigned, we order the cached styles by specificity
760
- // and create a final style object to assign to the frame.
761
-
762
- // FIXME: this is not particularly robust...
763
-
764
- $styles = array();
765
- $xp = new DOMXPath($tree->get_dom());
766
-
767
- // Add generated content
768
- foreach ($this->_styles as $selector => $style) {
769
- if (strpos($selector, ":before") === false &&
770
- strpos($selector, ":after") === false) continue;
771
-
772
- $query = $this->_css_selector_to_xpath($selector, true);
773
-
774
- // Retrieve the nodes
775
- $nodes = @$xp->query($query["query"]);
776
- if ($nodes == null) {
777
- record_warnings(E_USER_WARNING, "The CSS selector '$selector' is not valid", __FILE__, __LINE__);
778
- continue;
779
- }
780
-
781
- foreach ($nodes as $i => $node) {
782
- foreach ($query["pseudo_elements"] as $pos) {
783
- // Do not add a new pseudo element if another one already matched
784
- if ( $node->hasAttribute("dompdf_{$pos}_frame_id") ) {
785
- continue;
786
- }
787
-
788
- if (($src = $this->_image($style->content)) !== "none") {
789
- $new_node = $node->ownerDocument->createElement("img_generated");
790
- $new_node->setAttribute("src", $src);
791
- }
792
- else {
793
- $new_node = $node->ownerDocument->createElement("dompdf_generated");
794
- }
795
-
796
- $new_node->setAttribute($pos, $pos);
797
-
798
- $new_frame_id = $tree->insert_node($node, $new_node, $pos);
799
-
800
- $node->setAttribute("dompdf_{$pos}_frame_id", $new_frame_id);
801
- }
802
- }
803
- }
804
-
805
- // Apply all styles in stylesheet
806
- foreach ($this->_styles as $selector => $style) {
807
- $query = $this->_css_selector_to_xpath($selector);
808
-
809
- // Retrieve the nodes
810
- $nodes = @$xp->query($query["query"]);
811
- if ($nodes == null) {
812
- record_warnings(E_USER_WARNING, "The CSS selector '$selector' is not valid", __FILE__, __LINE__);
813
- continue;
814
- }
815
-
816
- foreach ($nodes as $node) {
817
- // Retrieve the node id
818
- if ( $node->nodeType != XML_ELEMENT_NODE ) // Only DOMElements get styles
819
- continue;
820
-
821
- $id = $node->getAttribute("frame_id");
822
-
823
- // Assign the current style to the scratch array
824
- $spec = $this->_specificity($selector);
825
- $styles[$id][$spec][] = $style;
826
- }
827
- }
828
-
829
- // Now create the styles and assign them to the appropriate frames. (We
830
- // iterate over the tree using an implicit Frame_Tree iterator.)
831
- $root_flg = false;
832
- foreach ($tree->get_frames() as $frame) {
833
- // pre_r($frame->get_node()->nodeName . ":");
834
- if ( !$root_flg && $this->_page_styles["base"] ) {
835
- $style = $this->_page_styles["base"];
836
- $root_flg = true;
837
- } else
838
- $style = $this->create_style();
839
-
840
- // Find nearest DOMElement parent
841
- $p = $frame;
842
- while ( $p = $p->get_parent() )
843
- if ($p->get_node()->nodeType == XML_ELEMENT_NODE )
844
- break;
845
-
846
- // Styles can only be applied directly to DOMElements; anonymous
847
- // frames inherit from their parent
848
- if ( $frame->get_node()->nodeType != XML_ELEMENT_NODE ) {
849
- if ( $p )
850
- $style->inherit($p->get_style());
851
- $frame->set_style($style);
852
- continue;
853
- }
854
-
855
- $id = $frame->get_id();
856
-
857
- // Handle HTML 4.0 attributes
858
- Attribute_Translator::translate_attributes($frame);
859
- if ( ($str = $frame->get_node()->getAttribute(Attribute_Translator::$_style_attr)) !== "" ) {
860
- // Lowest specificity
861
- $styles[$id][1][] = $this->_parse_properties($str);
862
- }
863
-
864
- // Locate any additional style attributes
865
- if ( ($str = $frame->get_node()->getAttribute("style")) !== "" ) {
866
- // Destroy CSS comments
867
- $str = preg_replace("'/\*.*?\*/'si", "", $str);
868
-
869
- $spec = $this->_specificity("!attr");
870
- $styles[$id][$spec][] = $this->_parse_properties($str);
871
- }
872
-
873
- // Grab the applicable styles
874
- if ( isset($styles[$id]) ) {
875
-
876
- $applied_styles = $styles[ $frame->get_id() ];
877
-
878
- // Sort by specificity
879
- ksort($applied_styles);
880
-
881
- if (DEBUGCSS) {
882
- $debug_nodename = $frame->get_node()->nodeName;
883
- print "<pre>\n[$debug_nodename\n";
884
- foreach ($applied_styles as $spec => $arr) {
885
- printf("specificity: 0x%08x\n",$spec);
886
- foreach ($arr as $s) {
887
- print "[\n";
888
- $s->debug_print();
889
- print "]\n";
890
- }
891
- }
892
- }
893
-
894
- // Merge the new styles with the inherited styles
895
- foreach ($applied_styles as $arr) {
896
- foreach ($arr as $s)
897
- $style->merge($s);
898
- }
899
- }
900
-
901
- // Inherit parent's styles if required
902
- if ( $p ) {
903
-
904
- if (DEBUGCSS) {
905
- print "inherit:\n";
906
- print "[\n";
907
- $p->get_style()->debug_print();
908
- print "]\n";
909
- }
910
-
911
- $style->inherit( $p->get_style() );
912
- }
913
-
914
- if (DEBUGCSS) {
915
- print "DomElementStyle:\n";
916
- print "[\n";
917
- $style->debug_print();
918
- print "]\n";
919
- print "/$debug_nodename]\n</pre>";
920
- }
921
-
922
- /*DEBUGCSS print: see below different print debugging method
923
- pre_r($frame->get_node()->nodeName . ":");
924
- echo "<pre>";
925
- echo $style;
926
- echo "</pre>";*/
927
- $frame->set_style($style);
928
-
929
- }
930
-
931
- // We're done! Clean out the registry of all styles since we
932
- // won't be needing this later.
933
- foreach ( array_keys($this->_styles) as $key ) {
934
- $this->_styles[$key] = null;
935
- unset($this->_styles[$key]);
936
- }
937
-
938
- }
939
-
940
-
941
- /**
942
- * parse a CSS string using a regex parser
943
- *
944
- * Called by {@link Stylesheet::parse_css()}
945
- *
946
- * @param string $str
947
- */
948
- private function _parse_css($str) {
949
-
950
- $str = trim($str);
951
-
952
- // Destroy comments and remove HTML comments
953
- $css = preg_replace(array(
954
- "'/\*.*?\*/'si",
955
- "/^<!--/",
956
- "/-->$/"
957
- ), "", $str);
958
-
959
- // FIXME: handle '{' within strings, e.g. [attr="string {}"]
960
-
961
- // Something more legible:
962
- $re =
963
- "/\s* # Skip leading whitespace \n".
964
- "( @([^\s]+)\s+([^{;]*) (?:;|({)) )? # Match @rules followed by ';' or '{' \n".
965
- "(?(1) # Only parse sub-sections if we're in an @rule... \n".
966
- " (?(4) # ...and if there was a leading '{' \n".
967
- " \s*( (?:(?>[^{}]+) ({)? # Parse rulesets and individual @page rules \n".
968
- " (?(6) (?>[^}]*) }) \s*)+? \n".
969
- " ) \n".
970
- " }) # Balancing '}' \n".
971
- "| # Branch to match regular rules (not preceeded by '@')\n".
972
- "([^{]*{[^}]*})) # Parse normal rulesets\n".
973
- "/xs";
974
-
975
- if ( preg_match_all($re, $css, $matches, PREG_SET_ORDER) === false )
976
- // An error occured
977
- throw new DOMPDF_Exception("Error parsing css file: preg_match_all() failed.");
978
-
979
- // After matching, the array indicies are set as follows:
980
- //
981
- // [0] => complete text of match
982
- // [1] => contains '@import ...;' or '@media {' if applicable
983
- // [2] => text following @ for cases where [1] is set
984
- // [3] => media types or full text following '@import ...;'
985
- // [4] => '{', if present
986
- // [5] => rulesets within media rules
987
- // [6] => '{', within media rules
988
- // [7] => individual rules, outside of media rules
989
- //
990
- //pre_r($matches);
991
- foreach ( $matches as $match ) {
992
- $match[2] = trim($match[2]);
993
-
994
- if ( $match[2] !== "" ) {
995
- // Handle @rules
996
- switch ($match[2]) {
997
-
998
- case "import":
999
- $this->_parse_import($match[3]);
1000
- break;
1001
-
1002
- case "media":
1003
- $acceptedmedia = self::$ACCEPTED_GENERIC_MEDIA_TYPES;
1004
-
1005
- if ( defined("DOMPDF_DEFAULT_MEDIA_TYPE") ) {
1006
- $acceptedmedia[] = DOMPDF_DEFAULT_MEDIA_TYPE;
1007
- }
1008
- else {
1009
- $acceptedmedia[] = self::$ACCEPTED_DEFAULT_MEDIA_TYPE;
1010
- }
1011
-
1012
- $media = preg_split("/\s*,\s*/", mb_strtolower(trim($match[3])));
1013
-
1014
- if ( count(array_intersect($acceptedmedia, $media)) ) {
1015
- $this->_parse_sections($match[5]);
1016
- }
1017
- break;
1018
-
1019
- case "page":
1020
- //This handles @page to be applied to page oriented media
1021
- //Note: This has a reduced syntax:
1022
- //@page { margin:1cm; color:blue; }
1023
- //Not a sequence of styles like a full.css, but only the properties
1024
- //of a single style, which is applied to the very first "root" frame before
1025
- //processing other styles of the frame.
1026
- //Working properties:
1027
- // margin (for margin around edge of paper)
1028
- // font-family (default font of pages)
1029
- // color (default text color of pages)
1030
- //Non working properties:
1031
- // border
1032
- // padding
1033
- // background-color
1034
- //Todo:Reason is unknown
1035
- //Other properties (like further font or border attributes) not tested.
1036
- //If a border or background color around each paper sheet is desired,
1037
- //assign it to the <body> tag, possibly only for the css of the correct media type.
1038
-
1039
- // If the page has a name, skip the style.
1040
- $page_selector = trim($match[3]);
1041
-
1042
- switch($page_selector) {
1043
- case "":
1044
- $key = "base";
1045
- break;
1046
-
1047
- case ":left":
1048
- case ":right":
1049
- case ":odd":
1050
- case ":even":
1051
- case ":first":
1052
- $key = $page_selector;
1053
-
1054
- default: continue;
1055
- }
1056
-
1057
- // Store the style for later...
1058
- if ( empty($this->_page_styles[$key]) )
1059
- $this->_page_styles[$key] = $this->_parse_properties($match[5]);
1060
- else
1061
- $this->_page_styles[$key]->merge($this->_parse_properties($match[5]));
1062
- break;
1063
-
1064
- case "font-face":
1065
- $this->_parse_font_face($match[5]);
1066
- break;
1067
-
1068
- default:
1069
- // ignore everything else
1070
- break;
1071
- }
1072
-
1073
- continue;
1074
- }
1075
-
1076
- if ( $match[7] !== "" )
1077
- $this->_parse_sections($match[7]);
1078
-
1079
- }
1080
- }
1081
-
1082
- /* See also style.cls Style::_image(), refactoring?, works also for imported css files */
1083
- protected function _image($val) {
1084
- $DEBUGCSS=DEBUGCSS;
1085
-
1086
- if ( mb_strpos($val, "url") === false ) {
1087
- $path = "none"; //Don't resolve no image -> otherwise would prefix path and no longer recognize as none
1088
- }
1089
- else {
1090
- $val = preg_replace("/url\(['\"]?([^'\")]+)['\"]?\)/","\\1", trim($val));
1091
-
1092
- // Resolve the url now in the context of the current stylesheet
1093
- $parsed_url = explode_url($val);
1094
- if ( $parsed_url["protocol"] == "" && $this->get_protocol() == "" ) {
1095
- if ($parsed_url["path"][0] === '/' || $parsed_url["path"][0] === '\\' ) {
1096
- $path = $_SERVER["DOCUMENT_ROOT"].'/';
1097
- } else {
1098
- $path = $this->get_base_path();
1099
- }
1100
- $path .= $parsed_url["path"] . $parsed_url["file"];
1101
- $path = realpath($path);
1102
- // If realpath returns FALSE then specifically state that there is no background image
1103
- // FIXME: Is this causing problems for imported CSS files? There are some './none' references when running the test cases.
1104
- if (!$path) { $path = 'none'; }
1105
- } else {
1106
- $path = build_url($this->get_protocol(),
1107
- $this->get_host(),
1108
- $this->get_base_path(),
1109
- $val);
1110
- }
1111
- }
1112
- if ($DEBUGCSS) {
1113
- print "<pre>[_image\n";
1114
- print_r($parsed_url);
1115
- print $this->get_protocol()."\n".$this->get_base_path()."\n".$path."\n";
1116
- print "_image]</pre>";;
1117
- }
1118
- return $path;
1119
- }
1120
-
1121
- /**
1122
- * parse @import{} sections
1123
- *
1124
- * @param string $url the url of the imported CSS file
1125
- */
1126
- private function _parse_import($url) {
1127
- $arr = preg_split("/[\s\n,]/", $url,-1, PREG_SPLIT_NO_EMPTY);
1128
- $url = array_shift($arr);
1129
- $accept = false;
1130
-
1131
- if ( count($arr) > 0 ) {
1132
-
1133
- $acceptedmedia = self::$ACCEPTED_GENERIC_MEDIA_TYPES;
1134
- if ( defined("DOMPDF_DEFAULT_MEDIA_TYPE") ) {
1135
- $acceptedmedia[] = DOMPDF_DEFAULT_MEDIA_TYPE;
1136
- } else {
1137
- $acceptedmedia[] = self::$ACCEPTED_DEFAULT_MEDIA_TYPE;
1138
- }
1139
-
1140
- // @import url media_type [media_type...]
1141
- foreach ( $arr as $type ) {
1142
- if ( in_array(mb_strtolower(trim($type)), $acceptedmedia) ) {
1143
- $accept = true;
1144
- break;
1145
- }
1146
- }
1147
-
1148
- } else {
1149
- // unconditional import
1150
- $accept = true;
1151
- }
1152
-
1153
- if ( $accept ) {
1154
- // Store our current base url properties in case the new url is elsewhere
1155
- $protocol = $this->_protocol;
1156
- $host = $this->_base_host;
1157
- $path = $this->_base_path;
1158
-
1159
- // $url = str_replace(array('"',"url", "(", ")"), "", $url);
1160
- // If the protocol is php, assume that we will import using file://
1161
- // $url = build_url($protocol == "php://" ? "file://" : $protocol, $host, $path, $url);
1162
- // Above does not work for subfolders and absolute urls.
1163
- // Todo: As above, do we need to replace php or file to an empty protocol for local files?
1164
-
1165
- $url = $this->_image($url);
1166
-
1167
- $this->load_css_file($url);
1168
-
1169
- // Restore the current base url
1170
- $this->_protocol = $protocol;
1171
- $this->_base_host = $host;
1172
- $this->_base_path = $path;
1173
- }
1174
-
1175
- }
1176
-
1177
- /**
1178
- * parse @font-face{} sections
1179
- * http://www.w3.org/TR/css3-fonts/#the-font-face-rule
1180
- *
1181
- * @param string $str CSS @font-face rules
1182
- * @return Style
1183
- */
1184
- private function _parse_font_face($str) {
1185
- $descriptors = $this->_parse_properties($str);
1186
-
1187
- preg_match_all("/(url|local)\s*\([\"\']?([^\"\'\)]+)[\"\']?\)\s*(format\s*\([\"\']?([^\"\'\)]+)[\"\']?\))?/i", $descriptors->src, $src);
1188
-
1189
- $sources = array();
1190
- $valid_sources = array();
1191
-
1192
- foreach($src[0] as $i => $value) {
1193
- $source = array(
1194
- "local" => strtolower($src[1][$i]) === "local",
1195
- "uri" => $src[2][$i],
1196
- "format" => $src[4][$i],
1197
- "path" => build_url($this->_protocol, $this->_base_host, $this->_base_path, $src[2][$i]),
1198
- );
1199
-
1200
- if ( !$source["local"] && in_array($source["format"], array("", "woff", "opentype", "truetype")) ) {
1201
- $valid_sources[] = $source;
1202
- }
1203
-
1204
- $sources[] = $source;
1205
- }
1206
-
1207
- // No valid sources
1208
- if ( empty($valid_sources) ) {
1209
- return;
1210
- }
1211
-
1212
- $style = array(
1213
- "family" => $descriptors->get_font_family_raw(),
1214
- "weight" => $descriptors->font_weight,
1215
- "style" => $descriptors->font_style,
1216
- );
1217
-
1218
- Font_Metrics::register_font($style, $valid_sources[0]["path"]);
1219
- }
1220
-
1221
- /**
1222
- * parse regular CSS blocks
1223
- *
1224
- * _parse_properties() creates a new Style object based on the provided
1225
- * CSS rules.
1226
- *
1227
- * @param string $str CSS rules
1228
- * @return Style
1229
- */
1230
- private function _parse_properties($str) {
1231
- $properties = preg_split("/;(?=(?:[^\(]*\([^\)]*\))*(?![^\)]*\)))/", $str);
1232
-
1233
- if (DEBUGCSS) print '[_parse_properties';
1234
-
1235
- // Create the style
1236
- $style = new Style($this);
1237
-
1238
- foreach ($properties as $prop) {
1239
- // If the $prop contains an url, the regex may be wrong
1240
- // @todo: fix the regex so that it works everytime
1241
- /*if (strpos($prop, "url(") === false) {
1242
- if (preg_match("/([a-z-]+)\s*:\s*[^:]+$/i", $prop, $m))
1243
- $prop = $m[0];
1244
- }*/
1245
- //A css property can have " ! important" appended (whitespace optional)
1246
- //strip this off to decode core of the property correctly.
1247
- //Pass on in the style to allow proper handling:
1248
- //!important properties can only be overridden by other !important ones.
1249
- //$style->$prop_name = is a shortcut of $style->__set($prop_name,$value);.
1250
- //If no specific set function available, set _props["prop_name"]
1251
- //style is always copied completely, or $_props handled separately
1252
- //Therefore set a _important_props["prop_name"]=true to indicate the modifier
1253
-
1254
- /* Instead of short code, prefer the typical case with fast code
1255
- $important = preg_match("/(.*?)!\s*important/",$prop,$match);
1256
- if ( $important ) {
1257
- $prop = $match[1];
1258
- }
1259
- $prop = trim($prop);
1260
- */
1261
- if (DEBUGCSS) print '(';
1262
-
1263
- $important = false;
1264
- $prop = trim($prop);
1265
-
1266
- if ( substr($prop, -9) === 'important' ) {
1267
- $prop_tmp = rtrim(substr($prop, 0, -9));
1268
-
1269
- if ( substr($prop_tmp, -1) === '!' ) {
1270
- $prop = rtrim(substr($prop_tmp, 0, -1));
1271
- $important = true;
1272
- }
1273
- }
1274
-
1275
- if ( $prop === "" ) {
1276
- if (DEBUGCSS) print 'empty)';
1277
- continue;
1278
- }
1279
-
1280
- $i = mb_strpos($prop, ":");
1281
- if ( $i === false ) {
1282
- if (DEBUGCSS) print 'novalue'.$prop.')';
1283
- continue;
1284
- }
1285
-
1286
- $prop_name = rtrim(mb_strtolower(mb_substr($prop, 0, $i)));
1287
- $value = ltrim(mb_substr($prop, $i+1));
1288
- if (DEBUGCSS) print $prop_name.':='.$value.($important?'!IMPORTANT':'').')';
1289
- //New style, anyway empty
1290
- //if ($important || !$style->important_get($prop_name) ) {
1291
- //$style->$prop_name = array($value,$important);
1292
- //assignment might be replaced by overloading through __set,
1293
- //and overloaded functions might check _important_props,
1294
- //therefore set _important_props first.
1295
- if ($important) {
1296
- $style->important_set($prop_name);
1297
- }
1298
- //For easier debugging, don't use overloading of assignments with __set
1299
- $style->$prop_name = $value;
1300
- //$style->props_set($prop_name, $value);
1301
- }
1302
- if (DEBUGCSS) print '_parse_properties]';
1303
-
1304
- return $style;
1305
- }
1306
-
1307
- /**
1308
- * parse selector + rulesets
1309
- *
1310
- * @param string $str CSS selectors and rulesets
1311
- */
1312
- private function _parse_sections($str) {
1313
- // Pre-process: collapse all whitespace and strip whitespace around '>',
1314
- // '.', ':', '+', '#'
1315
-
1316
- $patterns = array("/[\\s\n]+/", "/\\s+([>.:+#])\\s+/");
1317
- $replacements = array(" ", "\\1");
1318
- $str = preg_replace($patterns, $replacements, $str);
1319
-
1320
- $sections = explode("}", $str);
1321
- if (DEBUGCSS) print '[_parse_sections';
1322
- foreach ($sections as $sect) {
1323
- $i = mb_strpos($sect, "{");
1324
-
1325
- $selectors = explode(",", mb_substr($sect, 0, $i));
1326
- if (DEBUGCSS) print '[section';
1327
- $style = $this->_parse_properties(trim(mb_substr($sect, $i+1)));
1328
-
1329
- // Assign it to the selected elements
1330
- foreach ($selectors as $selector) {
1331
- $selector = trim($selector);
1332
-
1333
- if ($selector == "") {
1334
- if (DEBUGCSS) print '#empty#';
1335
- continue;
1336
- }
1337
- if (DEBUGCSS) print '#'.$selector.'#';
1338
- //if (DEBUGCSS) { if (strpos($selector,'p') !== false) print '!!!p!!!#'; }
1339
-
1340
- $this->add_style($selector, $style);
1341
- }
1342
- if (DEBUGCSS) print 'section]';
1343
- }
1344
- if (DEBUGCSS) print '_parse_sections]';
1345
- }
1346
-
1347
- /**
1348
- * dumps the entire stylesheet as a string
1349
- *
1350
- * Generates a string of each selector and associated style in the
1351
- * Stylesheet. Useful for debugging.
1352
- *
1353
- * @return string
1354
- */
1355
- function __toString() {
1356
- $str = "";
1357
- foreach ($this->_styles as $selector => $style)
1358
- $str .= "$selector => " . $style->__toString() . "\n";
1359
-
1360
- return $str;
1361
- }
1362
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @package dompdf
4
+ * @link http://www.dompdf.com/
5
+ * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Helmut Tischer <htischer@weihenstephan.org>
7
+ * @author Fabien Ménager <fabien.menager@gmail.com>
8
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
9
+ */
10
+
11
+ /**
12
+ * The location of the default built-in CSS file.
13
+ * {@link Stylesheet::DEFAULT_STYLESHEET}
14
+ */
15
+ define('__DEFAULT_STYLESHEET', DOMPDF_LIB_DIR . DIRECTORY_SEPARATOR . "res" . DIRECTORY_SEPARATOR . "html.css");
16
+
17
+ /**
18
+ * The master stylesheet class
19
+ *
20
+ * The Stylesheet class is responsible for parsing stylesheets and style
21
+ * tags/attributes. It also acts as a registry of the individual Style
22
+ * objects generated by the current set of loaded CSS files and style
23
+ * elements.
24
+ *
25
+ * @see Style
26
+ * @package dompdf
27
+ */
28
+ class Stylesheet {
29
+
30
+ /**
31
+ * The location of the default built-in CSS file.
32
+ */
33
+ const DEFAULT_STYLESHEET = __DEFAULT_STYLESHEET;
34
+
35
+ /**
36
+ * User agent stylesheet origin
37
+ *
38
+ * @var int
39
+ */
40
+ const ORIG_UA = 1;
41
+
42
+ /**
43
+ * User normal stylesheet origin
44
+ *
45
+ * @var int
46
+ */
47
+ const ORIG_USER = 2;
48
+
49
+ /**
50
+ * Author normal stylesheet origin
51
+ *
52
+ * @var int
53
+ */
54
+ const ORIG_AUTHOR = 3;
55
+
56
+ private static $_stylesheet_origins = array(
57
+ self::ORIG_UA => -0x0FFFFFFF, // user agent style sheets
58
+ self::ORIG_USER => -0x0000FFFF, // user normal style sheets
59
+ self::ORIG_AUTHOR => 0x00000000, // author normal style sheets
60
+ );
61
+
62
+ /**
63
+ * Current dompdf instance
64
+ *
65
+ * @var DOMPDF
66
+ */
67
+ private $_dompdf;
68
+
69
+ /**
70
+ * Array of currently defined styles
71
+ *
72
+ * @var Style[]
73
+ */
74
+ private $_styles;
75
+
76
+ /**
77
+ * Base protocol of the document being parsed
78
+ * Used to handle relative urls.
79
+ *
80
+ * @var string
81
+ */
82
+ private $_protocol;
83
+
84
+ /**
85
+ * Base hostname of the document being parsed
86
+ * Used to handle relative urls.
87
+ *
88
+ * @var string
89
+ */
90
+ private $_base_host;
91
+
92
+ /**
93
+ * Base path of the document being parsed
94
+ * Used to handle relative urls.
95
+ *
96
+ * @var string
97
+ */
98
+ private $_base_path;
99
+
100
+ /**
101
+ * The styles defined by @page rules
102
+ *
103
+ * @var array<Style>
104
+ */
105
+ private $_page_styles;
106
+
107
+ /**
108
+ * List of loaded files, used to prevent recursion
109
+ *
110
+ * @var array
111
+ */
112
+ private $_loaded_files;
113
+
114
+ /**
115
+ * Current stylesheet origin
116
+ *
117
+ * @var int
118
+ */
119
+ private $_current_origin = self::ORIG_UA;
120
+
121
+ /**
122
+ * Accepted CSS media types
123
+ * List of types and parsing rules for future extensions:
124
+ * http://www.w3.org/TR/REC-html40/types.html
125
+ * screen, tty, tv, projection, handheld, print, braille, aural, all
126
+ * The following are non standard extensions for undocumented specific environments.
127
+ * static, visual, bitmap, paged, dompdf
128
+ * Note, even though the generated pdf file is intended for print output,
129
+ * the desired content might be different (e.g. screen or projection view of html file).
130
+ * Therefore allow specification of content by dompdf setting DOMPDF_DEFAULT_MEDIA_TYPE.
131
+ * If given, replace media "print" by DOMPDF_DEFAULT_MEDIA_TYPE.
132
+ * (Previous version $ACCEPTED_MEDIA_TYPES = $ACCEPTED_GENERIC_MEDIA_TYPES + $ACCEPTED_DEFAULT_MEDIA_TYPE)
133
+ */
134
+ static $ACCEPTED_DEFAULT_MEDIA_TYPE = "print";
135
+ static $ACCEPTED_GENERIC_MEDIA_TYPES = array("all", "static", "visual", "bitmap", "paged", "dompdf");
136
+
137
+ /**
138
+ * The class constructor.
139
+ *
140
+ * The base protocol, host & path are initialized to those of
141
+ * the current script.
142
+ */
143
+ function __construct(DOMPDF $dompdf) {
144
+ $this->_dompdf = $dompdf;
145
+ $this->_styles = array();
146
+ $this->_loaded_files = array();
147
+ list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($_SERVER["SCRIPT_FILENAME"]);
148
+ $this->_page_styles = array("base" => null);
149
+ }
150
+
151
+ /**
152
+ * Class destructor
153
+ */
154
+ function __destruct() {
155
+ clear_object($this);
156
+ }
157
+
158
+ /**
159
+ * Set the base protocol
160
+ *
161
+ * @param string $protocol
162
+ */
163
+ function set_protocol($protocol) { $this->_protocol = $protocol; }
164
+
165
+ /**
166
+ * Set the base host
167
+ *
168
+ * @param string $host
169
+ */
170
+ function set_host($host) { $this->_base_host = $host; }
171
+
172
+ /**
173
+ * Set the base path
174
+ *
175
+ * @param string $path
176
+ */
177
+ function set_base_path($path) { $this->_base_path = $path; }
178
+
179
+ /**
180
+ * Return the DOMPDF object
181
+ *
182
+ * @return DOMPDF
183
+ */
184
+ function get_dompdf() { return $this->_dompdf; }
185
+
186
+ /**
187
+ * Return the base protocol for this stylesheet
188
+ *
189
+ * @return string
190
+ */
191
+ function get_protocol() { return $this->_protocol; }
192
+
193
+ /**
194
+ * Return the base host for this stylesheet
195
+ *
196
+ * @return string
197
+ */
198
+ function get_host() { return $this->_base_host; }
199
+
200
+ /**
201
+ * Return the base path for this stylesheet
202
+ *
203
+ * @return string
204
+ */
205
+ function get_base_path() { return $this->_base_path; }
206
+
207
+ /**
208
+ * Return the array of page styles
209
+ *
210
+ * @return Style[]
211
+ */
212
+ function get_page_styles() { return $this->_page_styles; }
213
+
214
+ /**
215
+ * Add a new Style object to the stylesheet
216
+ * add_style() adds a new Style object to the current stylesheet, or
217
+ * merges a new Style with an existing one.
218
+ *
219
+ * @param string $key the Style's selector
220
+ * @param Style $style the Style to be added
221
+ *
222
+ * @throws DOMPDF_Exception
223
+ */
224
+ function add_style($key, Style $style) {
225
+ if ( !is_string($key) ) {
226
+ throw new DOMPDF_Exception("CSS rule must be keyed by a string.");
227
+ }
228
+
229
+ if ( isset($this->_styles[$key]) ) {
230
+ $this->_styles[$key]->merge($style);
231
+ }
232
+ else {
233
+ $this->_styles[$key] = clone $style;
234
+ }
235
+
236
+ $this->_styles[$key]->set_origin( $this->_current_origin );
237
+ }
238
+
239
+ /**
240
+ * lookup a specifc Style object
241
+ *
242
+ * lookup() returns the Style specified by $key, or null if the Style is
243
+ * not found.
244
+ *
245
+ * @param string $key the selector of the requested Style
246
+ * @return Style
247
+ */
248
+ function lookup($key) {
249
+ if ( !isset($this->_styles[$key]) ) {
250
+ return null;
251
+ }
252
+
253
+ return $this->_styles[$key];
254
+ }
255
+
256
+ /**
257
+ * create a new Style object associated with this stylesheet
258
+ *
259
+ * @param Style $parent The style of this style's parent in the DOM tree
260
+ * @return Style
261
+ */
262
+ function create_style(Style $parent = null) {
263
+ return new Style($this, $this->_current_origin);
264
+ }
265
+
266
+ /**
267
+ * load and parse a CSS string
268
+ *
269
+ * @param string $css
270
+ */
271
+ function load_css(&$css) { $this->_parse_css($css); }
272
+
273
+
274
+ /**
275
+ * load and parse a CSS file
276
+ *
277
+ * @param string $file
278
+ * @param int $origin
279
+ */
280
+ function load_css_file($file, $origin = self::ORIG_AUTHOR) {
281
+ if ( $origin ) {
282
+ $this->_current_origin = $origin;
283
+ }
284
+
285
+ // Prevent circular references
286
+ if ( isset($this->_loaded_files[$file]) ) {
287
+ return;
288
+ }
289
+
290
+ $this->_loaded_files[$file] = true;
291
+
292
+ if ( strpos($file, "data:") === 0) {
293
+ $parsed = parse_data_uri($file);
294
+ $css = $parsed["data"];
295
+ }
296
+ else {
297
+ $parsed_url = explode_url($file);
298
+
299
+ list($this->_protocol, $this->_base_host, $this->_base_path, $filename) = $parsed_url;
300
+
301
+ // Fix submitted by Nick Oostveen for aliased directory support:
302
+ if ( $this->_protocol == "" ) {
303
+ $file = $this->_base_path . $filename;
304
+ }
305
+ else {
306
+ $file = build_url($this->_protocol, $this->_base_host, $this->_base_path, $filename);
307
+ }
308
+
309
+ set_error_handler("record_warnings");
310
+ $css = file_get_contents($file, null, $this->_dompdf->get_http_context());
311
+ restore_error_handler();
312
+
313
+ $good_mime_type = true;
314
+
315
+ // See http://the-stickman.com/web-development/php/getting-http-response-headers-when-using-file_get_contents/
316
+ if ( isset($http_response_header) && !$this->_dompdf->get_quirksmode() ) {
317
+ foreach($http_response_header as $_header) {
318
+ if ( preg_match("@Content-Type:\s*([\w/]+)@i", $_header, $matches) &&
319
+ ($matches[1] !== "text/css") ) {
320
+ $good_mime_type = false;
321
+ }
322
+ }
323
+ }
324
+
325
+ if ( !$good_mime_type || $css == "" ) {
326
+ if($css == "")
327
+ {
328
+ if( !class_exists( 'WP_Http' ) ) {
329
+ include_once( ABSPATH . WPINC. '/class-http.php' );
330
+ }
331
+ $request = new WP_Http();
332
+ $result = $request->request($file);
333
+ if ( !is_wp_error($result) ) {
334
+ $css = $result['body'];
335
+ }
336
+ }
337
+
338
+ if($css == "")
339
+ {
340
+ record_warnings(E_USER_WARNING, "Unable to load css file $file", __FILE__, __LINE__);
341
+ return;
342
+ }
343
+ }
344
+ }
345
+
346
+ $this->_parse_css($css);
347
+ }
348
+
349
+ /**
350
+ * @link http://www.w3.org/TR/CSS21/cascade.html#specificity
351
+ *
352
+ * @param string $selector
353
+ * @param int $origin :
354
+ * - ua: user agent style sheets
355
+ * - un: user normal style sheets
356
+ * - an: author normal style sheets
357
+ * - ai: author important style sheets
358
+ * - ui: user important style sheets
359
+ *
360
+ * @return int
361
+ */
362
+ private function _specificity($selector, $origin = self::ORIG_AUTHOR) {
363
+ // http://www.w3.org/TR/CSS21/cascade.html#specificity
364
+ // ignoring the ":" pseudoclass modifyers
365
+ // also ignored in _css_selector_to_xpath
366
+
367
+ $a = ($selector === "!attr") ? 1 : 0;
368
+
369
+ $b = min(mb_substr_count($selector, "#"), 255);
370
+
371
+ $c = min(mb_substr_count($selector, ".") +
372
+ mb_substr_count($selector, "["), 255);
373
+
374
+ $d = min(mb_substr_count($selector, " ") +
375
+ mb_substr_count($selector, ">") +
376
+ mb_substr_count($selector, "+"), 255);
377
+
378
+ //If a normal element name is at the begining of the string,
379
+ //a leading whitespace might have been removed on whitespace collapsing and removal
380
+ //therefore there might be one whitespace less as selected element names
381
+ //this can lead to a too small specificity
382
+ //see _css_selector_to_xpath
383
+
384
+ if ( !in_array($selector[0], array(" ", ">", ".", "#", "+", ":", "["))/* && $selector !== "*"*/) {
385
+ $d++;
386
+ }
387
+
388
+ if (DEBUGCSS) {
389
+ /*DEBUGCSS*/ print "<pre>\n";
390
+ /*DEBUGCSS*/ printf("_specificity(): 0x%08x \"%s\"\n", ($a << 24) | ($b << 16) | ($c << 8) | ($d), $selector);
391
+ /*DEBUGCSS*/ print "</pre>";
392
+ }
393
+
394
+ return self::$_stylesheet_origins[$origin] + ($a << 24) | ($b << 16) | ($c << 8) | ($d);
395
+ }
396
+
397
+ /**
398
+ * Converts a CSS selector to an XPath query.
399
+ *
400
+ * @param string $selector
401
+ * @param bool $first_pass
402
+ *
403
+ * @throws DOMPDF_Exception
404
+ * @return string
405
+ */
406
+ private function _css_selector_to_xpath($selector, $first_pass = false) {
407
+
408
+ // Collapse white space and strip whitespace around delimiters
409
+ // $search = array("/\\s+/", "/\\s+([.>#+:])\\s+/");
410
+ // $replace = array(" ", "\\1");
411
+ // $selector = preg_replace($search, $replace, trim($selector));
412
+
413
+ // Initial query (non-absolute)
414
+ $query = "//";
415
+
416
+ // Will contain :before and :after if they must be created
417
+ $pseudo_elements = array();
418
+
419
+ // Parse the selector
420
+ //$s = preg_split("/([ :>.#+])/", $selector, -1, PREG_SPLIT_DELIM_CAPTURE);
421
+
422
+ $delimiters = array(" ", ">", ".", "#", "+", ":", "[", "(");
423
+
424
+ // Add an implicit * at the beginning of the selector
425
+ // if it begins with an attribute selector
426
+ if ( $selector[0] === "[" ) {
427
+ $selector = "*$selector";
428
+ }
429
+
430
+ // Add an implicit space at the beginning of the selector if there is no
431
+ // delimiter there already.
432
+ if ( !in_array($selector[0], $delimiters) ) {
433
+ $selector = " $selector";
434
+ }
435
+
436
+ $tok = "";
437
+ $len = mb_strlen($selector);
438
+ $i = 0;
439
+
440
+ while ( $i < $len ) {
441
+
442
+ $s = $selector[$i];
443
+ $i++;
444
+
445
+ // Eat characters up to the next delimiter
446
+ $tok = "";
447
+ $in_attr = false;
448
+
449
+ while ($i < $len) {
450
+ $c = $selector[$i];
451
+ $c_prev = $selector[$i-1];
452
+
453
+ if ( !$in_attr && in_array($c, $delimiters) ) {
454
+ break;
455
+ }
456
+
457
+ if ( $c_prev === "[" ) {
458
+ $in_attr = true;
459
+ }
460
+
461
+ $tok .= $selector[$i++];
462
+
463
+ if ( $in_attr && $c === "]" ) {
464
+ $in_attr = false;
465
+ break;
466
+ }
467
+ }
468
+
469
+ switch ($s) {
470
+
471
+ case " ":
472
+ case ">":
473
+ // All elements matching the next token that are direct children of
474
+ // the current token
475
+ $expr = $s === " " ? "descendant" : "child";
476
+
477
+ if ( mb_substr($query, -1, 1) !== "/" ) {
478
+ $query .= "/";
479
+ }
480
+
481
+ // Tag names are case-insensitive
482
+ $tok = strtolower($tok);
483
+
484
+ if ( !$tok ) {
485
+ $tok = "*";
486
+ }
487
+
488
+ $query .= "$expr::$tok";
489
+ $tok = "";
490
+ break;
491
+
492
+ case ".":
493
+ case "#":
494
+ // All elements matching the current token with a class/id equal to
495
+ // the _next_ token.
496
+
497
+ $attr = $s === "." ? "class" : "id";
498
+
499
+ // empty class/id == *
500
+ if ( mb_substr($query, -1, 1) === "/" ) {
501
+ $query .= "*";
502
+ }
503
+
504
+ // Match multiple classes: $tok contains the current selected
505
+ // class. Search for class attributes with class="$tok",
506
+ // class=".* $tok .*" and class=".* $tok"
507
+
508
+ // This doesn't work because libxml only supports XPath 1.0...
509
+ //$query .= "[matches(@$attr,\"^${tok}\$|^${tok}[ ]+|[ ]+${tok}\$|[ ]+${tok}[ ]+\")]";
510
+
511
+ // Query improvement by Michael Sheakoski <michael@mjsdigital.com>:
512
+ $query .= "[contains(concat(' ', @$attr, ' '), concat(' ', '$tok', ' '))]";
513
+ $tok = "";
514
+ break;
515
+
516
+ case "+":
517
+ // All sibling elements that folow the current token
518
+ if ( mb_substr($query, -1, 1) !== "/" ) {
519
+ $query .= "/";
520
+ }
521
+
522
+ $query .= "following-sibling::$tok";
523
+ $tok = "";
524
+ break;
525
+
526
+ case ":":
527
+ $i2 = $i-strlen($tok)-2; // the char before ":"
528
+ if ( !isset($selector[$i2]) || in_array($selector[$i2], $delimiters) ) {
529
+ $query .= "*";
530
+ }
531
+
532
+ $last = false;
533
+
534
+ // Pseudo-classes
535
+ switch ($tok) {
536
+
537
+ case "first-child":
538
+ $query .= "[1]";
539
+ $tok = "";
540
+ break;
541
+
542
+ case "last-child":
543
+ $query .= "[not(following-sibling::*)]";
544
+ $tok = "";
545
+ break;
546
+
547
+ case "first-of-type":
548
+ $query .= "[position() = 1]";
549
+ $tok = "";
550
+ break;
551
+
552
+ case "last-of-type":
553
+ $query .= "[position() = last()]";
554
+ $tok = "";
555
+ break;
556
+
557
+ // an+b, n, odd, and even
558
+ case "nth-last-of-type":
559
+ case "nth-last-child":
560
+ $last = true;
561
+
562
+ case "nth-of-type":
563
+ case "nth-child":
564
+ $p = $i+1;
565
+ $nth = trim(mb_substr($selector, $p, strpos($selector, ")", $i)-$p));
566
+
567
+ // 1
568
+ if ( preg_match("/^\d+$/", $nth) ) {
569
+ $condition = "position() = $nth";
570
+ }
571
+
572
+ // odd
573
+ elseif ( $nth === "odd" ) {
574
+ $condition = "(position() mod 2) = 1";
575
+ }
576
+
577
+ // even
578
+ elseif ( $nth === "even" ) {
579
+ $condition = "(position() mod 2) = 0";
580
+ }
581
+
582
+ // an+b
583
+ else {
584
+ $condition = $this->_selector_an_plus_b($nth, $last);
585
+ }
586
+
587
+ $query .= "[$condition]";
588
+ $tok = "";
589
+ break;
590
+
591
+ case "link":
592
+ $query .= "[@href]";
593
+ $tok = "";
594
+ break;
595
+
596
+ case "first-line": // TODO
597
+ case "first-letter": // TODO
598
+
599
+ // N/A
600
+ case "active":
601
+ case "hover":
602
+ case "visited":
603
+ $query .= "[false()]";
604
+ $tok = "";
605
+ break;
606
+
607
+ /* Pseudo-elements */
608
+ case "before":
609
+ case "after":
610
+ if ( $first_pass ) {
611
+ $pseudo_elements[$tok] = $tok;
612
+ }
613
+ else {
614
+ $query .= "/*[@$tok]";
615
+ }
616
+
617
+ $tok = "";
618
+ break;
619
+
620
+ case "empty":
621
+ $query .= "[not(*) and not(normalize-space())]";
622
+ $tok = "";
623
+ break;
624
+
625
+ case "disabled":
626
+ case "checked":
627
+ $query .= "[@$tok]";
628
+ $tok = "";
629
+ break;
630
+
631
+ case "enabled":
632
+ $query .= "[not(@disabled)]";
633
+ $tok = "";
634
+ break;
635
+ }
636
+
637
+ break;
638
+
639
+ case "[":
640
+ // Attribute selectors. All with an attribute matching the following token(s)
641
+ $attr_delimiters = array("=", "]", "~", "|", "$", "^", "*");
642
+ $tok_len = mb_strlen($tok);
643
+ $j = 0;
644
+
645
+ $attr = "";
646
+ $op = "";
647
+ $value = "";
648
+
649
+ while ( $j < $tok_len ) {
650
+ if ( in_array($tok[$j], $attr_delimiters) ) {
651
+ break;
652
+ }
653
+ $attr .= $tok[$j++];
654
+ }
655
+
656
+ switch ( $tok[$j] ) {
657
+
658
+ case "~":
659
+ case "|":
660
+ case "$":
661
+ case "^":
662
+ case "*":
663
+ $op .= $tok[$j++];
664
+
665
+ if ( $tok[$j] !== "=" ) {
666
+ throw new DOMPDF_Exception("Invalid CSS selector syntax: invalid attribute selector: $selector");
667
+ }
668
+
669
+ $op .= $tok[$j];
670
+ break;
671
+
672
+ case "=":
673
+ $op = "=";
674
+ break;
675
+
676
+ }
677
+
678
+ // Read the attribute value, if required
679
+ if ( $op != "" ) {
680
+ $j++;
681
+ while ( $j < $tok_len ) {
682
+ if ( $tok[$j] === "]" ) {
683
+ break;
684
+ }
685
+ $value .= $tok[$j++];
686
+ }
687
+ }
688
+
689
+ if ( $attr == "" ) {
690
+ throw new DOMPDF_Exception("Invalid CSS selector syntax: missing attribute name");
691
+ }
692
+
693
+ $value = trim($value, "\"'");
694
+
695
+ switch ( $op ) {
696
+
697
+ case "":
698
+ $query .= "[@$attr]";
699
+ break;
700
+
701
+ case "=":
702
+ $query .= "[@$attr=\"$value\"]";
703
+ break;
704
+
705
+ case "~=":
706
+ // FIXME: this will break if $value contains quoted strings
707
+ // (e.g. [type~="a b c" "d e f"])
708
+ $values = explode(" ", $value);
709
+ $query .= "[";
710
+
711
+ foreach ( $values as $val ) {
712
+ $query .= "@$attr=\"$val\" or ";
713
+ }
714
+
715
+ $query = rtrim($query, " or ") . "]";
716
+ break;
717
+
718
+ case "|=":
719
+ $values = explode("-", $value);
720
+ $query .= "[";
721
+
722
+ foreach ( $values as $val ) {
723
+ $query .= "starts-with(@$attr, \"$val\") or ";
724
+ }
725
+
726
+ $query = rtrim($query, " or ") . "]";
727
+ break;
728
+
729
+ case "$=":
730
+ $query .= "[substring(@$attr, string-length(@$attr)-".(strlen($value) - 1).")=\"$value\"]";
731
+ break;
732
+
733
+ case "^=":
734
+ $query .= "[starts-with(@$attr,\"$value\")]";
735
+ break;
736
+
737
+ case "*=":
738
+ $query .= "[contains(@$attr,\"$value\")]";
739
+ break;
740
+ }
741
+
742
+ break;
743
+ }
744
+ }
745
+ $i++;
746
+
747
+ // case ":":
748
+ // // Pseudo selectors: ignore for now. Partially handled directly
749
+ // // below.
750
+
751
+ // // Skip until the next special character, leaving the token as-is
752
+ // while ( $i < $len ) {
753
+ // if ( in_array($selector[$i], $delimiters) )
754
+ // break;
755
+ // $i++;
756
+ // }
757
+ // break;
758
+
759
+ // default:
760
+ // // Add the character to the token
761
+ // $tok .= $selector[$i++];
762
+ // break;
763
+ // }
764
+
765
+ // }
766
+
767
+
768
+ // Trim the trailing '/' from the query
769
+ if ( mb_strlen($query) > 2 ) {
770
+ $query = rtrim($query, "/");
771
+ }
772
+
773
+ return array("query" => $query, "pseudo_elements" => $pseudo_elements);
774
+ }
775
+
776
+ // https://github.com/tenderlove/nokogiri/blob/master/lib/nokogiri/css/xpath_visitor.rb
777
+ protected function _selector_an_plus_b($expr, $last = false) {
778
+ $expr = preg_replace("/\s/", "", $expr);
779
+ if ( !preg_match("/^(?P<a>-?[0-9]*)?n(?P<b>[-+]?[0-9]+)?$/", $expr, $matches)) {
780
+ return "false()";
781
+ }
782
+
783
+ $a = ((isset($matches["a"]) && $matches["a"] !== "") ? intval($matches["a"]) : 1);
784
+ $b = ((isset($matches["b"]) && $matches["b"] !== "") ? intval($matches["b"]) : 0);
785
+
786
+ $position = ($last ? "(last()-position()+1)" : "position()");
787
+
788
+ if ( $b == 0 ) {
789
+ return "($position mod $a) = 0";
790
+ }
791
+ else {
792
+ $compare = (($a < 0) ? "<=" : ">=");
793
+ $b2 = -$b;
794
+ if ( $b2 >= 0 ) {
795
+ $b2 = "+$b2";
796
+ }
797
+ return "($position $compare $b) and ((($position $b2) mod ".abs($a).") = 0)";
798
+ }
799
+ }
800
+
801
+ /**
802
+ * applies all current styles to a particular document tree
803
+ *
804
+ * apply_styles() applies all currently loaded styles to the provided
805
+ * {@link Frame_Tree}. Aside from parsing CSS, this is the main purpose
806
+ * of this class.
807
+ *
808
+ * @param Frame_Tree $tree
809
+ */
810
+ function apply_styles(Frame_Tree $tree) {
811
+ // Use XPath to select nodes. This would be easier if we could attach
812
+ // Frame objects directly to DOMNodes using the setUserData() method, but
813
+ // we can't do that just yet. Instead, we set a _node attribute_ in
814
+ // Frame->set_id() and use that as a handle on the Frame object via
815
+ // Frame_Tree::$_registry.
816
+
817
+ // We create a scratch array of styles indexed by frame id. Once all
818
+ // styles have been assigned, we order the cached styles by specificity
819
+ // and create a final style object to assign to the frame.
820
+
821
+ // FIXME: this is not particularly robust...
822
+
823
+ $styles = array();
824
+ $xp = new DOMXPath($tree->get_dom());
825
+
826
+ // Add generated content
827
+ foreach ($this->_styles as $selector => $style) {
828
+ if ( strpos($selector, ":before") === false && strpos($selector, ":after") === false ) {
829
+ continue;
830
+ }
831
+
832
+ $query = $this->_css_selector_to_xpath($selector, true);
833
+
834
+ // Retrieve the nodes
835
+ $nodes = @$xp->query($query["query"]);
836
+ if ( $nodes == null ) {
837
+ record_warnings(E_USER_WARNING, "The CSS selector '$selector' is not valid", __FILE__, __LINE__);
838
+ continue;
839
+ }
840
+
841
+ foreach ($nodes as $node) {
842
+ foreach ($query["pseudo_elements"] as $pos) {
843
+ // Do not add a new pseudo element if another one already matched
844
+ if ( $node->hasAttribute("dompdf_{$pos}_frame_id") ) {
845
+ continue;
846
+ }
847
+
848
+ if (($src = $this->_image($style->content)) !== "none") {
849
+ $new_node = $node->ownerDocument->createElement("img_generated");
850
+ $new_node->setAttribute("src", $src);
851
+ }
852
+ else {
853
+ $new_node = $node->ownerDocument->createElement("dompdf_generated");
854
+ }
855
+
856
+ $new_node->setAttribute($pos, $pos);
857
+
858
+ $new_frame_id = $tree->insert_node($node, $new_node, $pos);
859
+ $node->setAttribute("dompdf_{$pos}_frame_id", $new_frame_id);
860
+ }
861
+ }
862
+ }
863
+
864
+ // Apply all styles in stylesheet
865
+ foreach ($this->_styles as $selector => $style) {
866
+ $query = $this->_css_selector_to_xpath($selector);
867
+
868
+ // Retrieve the nodes
869
+ $nodes = @$xp->query($query["query"]);
870
+ if ( $nodes == null ) {
871
+ record_warnings(E_USER_WARNING, "The CSS selector '$selector' is not valid", __FILE__, __LINE__);
872
+ continue;
873
+ }
874
+
875
+ foreach ($nodes as $node) {
876
+ // Retrieve the node id
877
+ // Only DOMElements get styles
878
+ if ( $node->nodeType != XML_ELEMENT_NODE ) {
879
+ continue;
880
+ }
881
+
882
+ $id = $node->getAttribute("frame_id");
883
+
884
+ // Assign the current style to the scratch array
885
+ $spec = $this->_specificity($selector);
886
+ $styles[$id][$spec][] = $style;
887
+ }
888
+ }
889
+
890
+ // Now create the styles and assign them to the appropriate frames. (We
891
+ // iterate over the tree using an implicit Frame_Tree iterator.)
892
+ $root_flg = false;
893
+ foreach ($tree->get_frames() as $frame) {
894
+ // pre_r($frame->get_node()->nodeName . ":");
895
+ if ( !$root_flg && $this->_page_styles["base"] ) {
896
+ $style = $this->_page_styles["base"];
897
+ $root_flg = true;
898
+ }
899
+ else {
900
+ $style = $this->create_style();
901
+ }
902
+
903
+ // Find nearest DOMElement parent
904
+ $p = $frame;
905
+ while ( $p = $p->get_parent() ) {
906
+ if ( $p->get_node()->nodeType == XML_ELEMENT_NODE ) {
907
+ break;
908
+ }
909
+ }
910
+
911
+ // Styles can only be applied directly to DOMElements; anonymous
912
+ // frames inherit from their parent
913
+ if ( $frame->get_node()->nodeType != XML_ELEMENT_NODE ) {
914
+ if ( $p ) {
915
+ $style->inherit($p->get_style());
916
+ }
917
+
918
+ $frame->set_style($style);
919
+ continue;
920
+ }
921
+
922
+ $id = $frame->get_id();
923
+
924
+ // Handle HTML 4.0 attributes
925
+ Attribute_Translator::translate_attributes($frame);
926
+ if ( ($str = $frame->get_node()->getAttribute(Attribute_Translator::$_style_attr)) !== "" ) {
927
+ // Lowest specificity
928
+ $styles[$id][1][] = $this->_parse_properties($str);
929
+ }
930
+
931
+ // Locate any additional style attributes
932
+ if ( ($str = $frame->get_node()->getAttribute("style")) !== "" ) {
933
+ // Destroy CSS comments
934
+ $str = preg_replace("'/\*.*?\*/'si", "", $str);
935
+
936
+ $spec = $this->_specificity("!attr");
937
+ $styles[$id][$spec][] = $this->_parse_properties($str);
938
+ }
939
+
940
+ // Grab the applicable styles
941
+ if ( isset($styles[$id]) ) {
942
+
943
+ $applied_styles = $styles[ $frame->get_id() ];
944
+
945
+ // Sort by specificity
946
+ ksort($applied_styles);
947
+
948
+ if (DEBUGCSS) {
949
+ $debug_nodename = $frame->get_node()->nodeName;
950
+ print "<pre>\n[$debug_nodename\n";
951
+ foreach ($applied_styles as $spec => $arr) {
952
+ printf("specificity: 0x%08x\n",$spec);
953
+ foreach ($arr as $s) {
954
+ print "[\n";
955
+ $s->debug_print();
956
+ print "]\n";
957
+ }
958
+ }
959
+ }
960
+
961
+ // Merge the new styles with the inherited styles
962
+ foreach ($applied_styles as $arr) {
963
+ foreach ($arr as $s) {
964
+ $style->merge($s);
965
+ }
966
+ }
967
+ }
968
+
969
+ // Inherit parent's styles if required
970
+ if ( $p ) {
971
+
972
+ if (DEBUGCSS) {
973
+ print "inherit:\n";
974
+ print "[\n";
975
+ $p->get_style()->debug_print();
976
+ print "]\n";
977
+ }
978
+
979
+ $style->inherit( $p->get_style() );
980
+ }
981
+
982
+ if (DEBUGCSS) {
983
+ print "DomElementStyle:\n";
984
+ print "[\n";
985
+ $style->debug_print();
986
+ print "]\n";
987
+ print "/$debug_nodename]\n</pre>";
988
+ }
989
+
990
+ /*DEBUGCSS print: see below different print debugging method
991
+ pre_r($frame->get_node()->nodeName . ":");
992
+ echo "<pre>";
993
+ echo $style;
994
+ echo "</pre>";*/
995
+ $frame->set_style($style);
996
+
997
+ }
998
+
999
+ // We're done! Clean out the registry of all styles since we
1000
+ // won't be needing this later.
1001
+ foreach ( array_keys($this->_styles) as $key ) {
1002
+ $this->_styles[$key] = null;
1003
+ unset($this->_styles[$key]);
1004
+ }
1005
+
1006
+ }
1007
+
1008
+ /**
1009
+ * parse a CSS string using a regex parser
1010
+ * Called by {@link Stylesheet::parse_css()}
1011
+ *
1012
+ * @param string $str
1013
+ *
1014
+ * @throws DOMPDF_Exception
1015
+ */
1016
+ private function _parse_css($str) {
1017
+
1018
+ $str = trim($str);
1019
+
1020
+ // Destroy comments and remove HTML comments
1021
+ $css = preg_replace(array(
1022
+ "'/\*.*?\*/'si",
1023
+ "/^<!--/",
1024
+ "/-->$/"
1025
+ ), "", $str);
1026
+
1027
+ // FIXME: handle '{' within strings, e.g. [attr="string {}"]
1028
+
1029
+ // Something more legible:
1030
+ $re =
1031
+ "/\s* # Skip leading whitespace \n".
1032
+ "( @([^\s]+)\s+([^{;]*) (?:;|({)) )? # Match @rules followed by ';' or '{' \n".
1033
+ "(?(1) # Only parse sub-sections if we're in an @rule... \n".
1034
+ " (?(4) # ...and if there was a leading '{' \n".
1035
+ " \s*( (?:(?>[^{}]+) ({)? # Parse rulesets and individual @page rules \n".
1036
+ " (?(6) (?>[^}]*) }) \s*)+? \n".
1037
+ " ) \n".
1038
+ " }) # Balancing '}' \n".
1039
+ "| # Branch to match regular rules (not preceeded by '@')\n".
1040
+ "([^{]*{[^}]*})) # Parse normal rulesets\n".
1041
+ "/xs";
1042
+
1043
+ if ( preg_match_all($re, $css, $matches, PREG_SET_ORDER) === false ) {
1044
+ // An error occured
1045
+ throw new DOMPDF_Exception("Error parsing css file: preg_match_all() failed.");
1046
+ }
1047
+
1048
+ // After matching, the array indicies are set as follows:
1049
+ //
1050
+ // [0] => complete text of match
1051
+ // [1] => contains '@import ...;' or '@media {' if applicable
1052
+ // [2] => text following @ for cases where [1] is set
1053
+ // [3] => media types or full text following '@import ...;'
1054
+ // [4] => '{', if present
1055
+ // [5] => rulesets within media rules
1056
+ // [6] => '{', within media rules
1057
+ // [7] => individual rules, outside of media rules
1058
+ //
1059
+ //pre_r($matches);
1060
+ foreach ( $matches as $match ) {
1061
+ $match[2] = trim($match[2]);
1062
+
1063
+ if ( $match[2] !== "" ) {
1064
+ // Handle @rules
1065
+ switch ($match[2]) {
1066
+
1067
+ case "import":
1068
+ $this->_parse_import($match[3]);
1069
+ break;
1070
+
1071
+ case "media":
1072
+ $acceptedmedia = self::$ACCEPTED_GENERIC_MEDIA_TYPES;
1073
+ $acceptedmedia[] = $this->_dompdf->get_option("default_media_type");
1074
+
1075
+ $media = preg_split("/\s*,\s*/", mb_strtolower(trim($match[3])));
1076
+
1077
+ if ( count(array_intersect($acceptedmedia, $media)) ) {
1078
+ $this->_parse_sections($match[5]);
1079
+ }
1080
+ break;
1081
+
1082
+ case "page":
1083
+ //This handles @page to be applied to page oriented media
1084
+ //Note: This has a reduced syntax:
1085
+ //@page { margin:1cm; color:blue; }
1086
+ //Not a sequence of styles like a full.css, but only the properties
1087
+ //of a single style, which is applied to the very first "root" frame before
1088
+ //processing other styles of the frame.
1089
+ //Working properties:
1090
+ // margin (for margin around edge of paper)
1091
+ // font-family (default font of pages)
1092
+ // color (default text color of pages)
1093
+ //Non working properties:
1094
+ // border
1095
+ // padding
1096
+ // background-color
1097
+ //Todo:Reason is unknown
1098
+ //Other properties (like further font or border attributes) not tested.
1099
+ //If a border or background color around each paper sheet is desired,
1100
+ //assign it to the <body> tag, possibly only for the css of the correct media type.
1101
+
1102
+ // If the page has a name, skip the style.
1103
+ $page_selector = trim($match[3]);
1104
+
1105
+ $key = null;
1106
+ switch($page_selector) {
1107
+ case "":
1108
+ $key = "base";
1109
+ break;
1110
+
1111
+ case ":left":
1112
+ case ":right":
1113
+ case ":odd":
1114
+ case ":even":
1115
+ case ":first":
1116
+ $key = $page_selector;
1117
+
1118
+ default: continue;
1119
+ }
1120
+
1121
+ // Store the style for later...
1122
+ if ( empty($this->_page_styles[$key]) ) {
1123
+ $this->_page_styles[$key] = $this->_parse_properties($match[5]);
1124
+ }
1125
+ else {
1126
+ $this->_page_styles[$key]->merge($this->_parse_properties($match[5]));
1127
+ }
1128
+ break;
1129
+
1130
+ case "font-face":
1131
+ $this->_parse_font_face($match[5]);
1132
+ break;
1133
+
1134
+ default:
1135
+ // ignore everything else
1136
+ break;
1137
+ }
1138
+
1139
+ continue;
1140
+ }
1141
+
1142
+ if ( $match[7] !== "" ) {
1143
+ $this->_parse_sections($match[7]);
1144
+ }
1145
+
1146
+ }
1147
+ }
1148
+
1149
+ /* See also style.cls Style::_image(), refactoring?, works also for imported css files */
1150
+ protected function _image($val) {
1151
+ $DEBUGCSS=DEBUGCSS;
1152
+ $parsed_url = "none";
1153
+
1154
+ if ( mb_strpos($val, "url") === false ) {
1155
+ $path = "none"; //Don't resolve no image -> otherwise would prefix path and no longer recognize as none
1156
+ }
1157
+ else {
1158
+ $val = preg_replace("/url\(['\"]?([^'\")]+)['\"]?\)/","\\1", trim($val));
1159
+
1160
+ // Resolve the url now in the context of the current stylesheet
1161
+ $parsed_url = explode_url($val);
1162
+ if ( $parsed_url["protocol"] == "" && $this->get_protocol() == "" ) {
1163
+ if ($parsed_url["path"][0] === '/' || $parsed_url["path"][0] === '\\' ) {
1164
+ $path = $_SERVER["DOCUMENT_ROOT"].'/';
1165
+ }
1166
+ else {
1167
+ $path = $this->get_base_path();
1168
+ }
1169
+
1170
+ $path .= $parsed_url["path"] . $parsed_url["file"];
1171
+ $path = realpath($path);
1172
+ // If realpath returns FALSE then specifically state that there is no background image
1173
+ // FIXME: Is this causing problems for imported CSS files? There are some './none' references when running the test cases.
1174
+ if (!$path) { $path = 'none'; }
1175
+ }
1176
+ else {
1177
+ $path = build_url($this->get_protocol(),
1178
+ $this->get_host(),
1179
+ $this->get_base_path(),
1180
+ $val);
1181
+ }
1182
+ }
1183
+
1184
+ if ($DEBUGCSS) {
1185
+ print "<pre>[_image\n";
1186
+ print_r($parsed_url);
1187
+ print $this->get_protocol()."\n".$this->get_base_path()."\n".$path."\n";
1188
+ print "_image]</pre>";;
1189
+ }
1190
+
1191
+ return $path;
1192
+ }
1193
+
1194
+ /**
1195
+ * parse @import{} sections
1196
+ *
1197
+ * @param string $url the url of the imported CSS file
1198
+ */
1199
+ private function _parse_import($url) {
1200
+ $arr = preg_split("/[\s\n,]/", $url,-1, PREG_SPLIT_NO_EMPTY);
1201
+ $url = array_shift($arr);
1202
+ $accept = false;
1203
+
1204
+ if ( count($arr) > 0 ) {
1205
+ $acceptedmedia = self::$ACCEPTED_GENERIC_MEDIA_TYPES;
1206
+ $acceptedmedia[] = $this->_dompdf->get_option("default_media_type");
1207
+
1208
+ // @import url media_type [media_type...]
1209
+ foreach ( $arr as $type ) {
1210
+ if ( in_array(mb_strtolower(trim($type)), $acceptedmedia) ) {
1211
+ $accept = true;
1212
+ break;
1213
+ }
1214
+ }
1215
+
1216
+ }
1217
+ else {
1218
+ // unconditional import
1219
+ $accept = true;
1220
+ }
1221
+
1222
+ if ( $accept ) {
1223
+ // Store our current base url properties in case the new url is elsewhere
1224
+ $protocol = $this->_protocol;
1225
+ $host = $this->_base_host;
1226
+ $path = $this->_base_path;
1227
+
1228
+ // $url = str_replace(array('"',"url", "(", ")"), "", $url);
1229
+ // If the protocol is php, assume that we will import using file://
1230
+ // $url = build_url($protocol == "php://" ? "file://" : $protocol, $host, $path, $url);
1231
+ // Above does not work for subfolders and absolute urls.
1232
+ // Todo: As above, do we need to replace php or file to an empty protocol for local files?
1233
+
1234
+ $url = $this->_image($url);
1235
+
1236
+ $this->load_css_file($url);
1237
+
1238
+ // Restore the current base url
1239
+ $this->_protocol = $protocol;
1240
+ $this->_base_host = $host;
1241
+ $this->_base_path = $path;
1242
+ }
1243
+
1244
+ }
1245
+
1246
+ /**
1247
+ * parse @font-face{} sections
1248
+ * http://www.w3.org/TR/css3-fonts/#the-font-face-rule
1249
+ *
1250
+ * @param string $str CSS @font-face rules
1251
+ * @return Style
1252
+ */
1253
+ private function _parse_font_face($str) {
1254
+ $descriptors = $this->_parse_properties($str);
1255
+
1256
+ preg_match_all("/(url|local)\s*\([\"\']?([^\"\'\)]+)[\"\']?\)\s*(format\s*\([\"\']?([^\"\'\)]+)[\"\']?\))?/i", $descriptors->src, $src);
1257
+
1258
+ $sources = array();
1259
+ $valid_sources = array();
1260
+
1261
+ foreach($src[0] as $i => $value) {
1262
+ $source = array(
1263
+ "local" => strtolower($src[1][$i]) === "local",
1264
+ "uri" => $src[2][$i],
1265
+ "format" => $src[4][$i],
1266
+ "path" => build_url($this->_protocol, $this->_base_host, $this->_base_path, $src[2][$i]),
1267
+ );
1268
+
1269
+ if ( !$source["local"] && in_array($source["format"], array("", "woff", "opentype", "truetype")) ) {
1270
+ $valid_sources[] = $source;
1271
+ }
1272
+
1273
+ $sources[] = $source;
1274
+ }
1275
+
1276
+ // No valid sources
1277
+ if ( empty($valid_sources) ) {
1278
+ return;
1279
+ }
1280
+
1281
+ $style = array(
1282
+ "family" => $descriptors->get_font_family_raw(),
1283
+ "weight" => $descriptors->font_weight,
1284
+ "style" => $descriptors->font_style,
1285
+ );
1286
+
1287
+ Font_Metrics::register_font($style, $valid_sources[0]["path"]);
1288
+ }
1289
+
1290
+ /**
1291
+ * parse regular CSS blocks
1292
+ *
1293
+ * _parse_properties() creates a new Style object based on the provided
1294
+ * CSS rules.
1295
+ *
1296
+ * @param string $str CSS rules
1297
+ * @return Style
1298
+ */
1299
+ private function _parse_properties($str) {
1300
+ $properties = preg_split("/;(?=(?:[^\(]*\([^\)]*\))*(?![^\)]*\)))/", $str);
1301
+
1302
+ if (DEBUGCSS) print '[_parse_properties';
1303
+
1304
+ // Create the style
1305
+ $style = new Style($this);
1306
+
1307
+ foreach ($properties as $prop) {
1308
+ // If the $prop contains an url, the regex may be wrong
1309
+ // @todo: fix the regex so that it works everytime
1310
+ /*if (strpos($prop, "url(") === false) {
1311
+ if (preg_match("/([a-z-]+)\s*:\s*[^:]+$/i", $prop, $m))
1312
+ $prop = $m[0];
1313
+ }*/
1314
+ //A css property can have " ! important" appended (whitespace optional)
1315
+ //strip this off to decode core of the property correctly.
1316
+ //Pass on in the style to allow proper handling:
1317
+ //!important properties can only be overridden by other !important ones.
1318
+ //$style->$prop_name = is a shortcut of $style->__set($prop_name,$value);.
1319
+ //If no specific set function available, set _props["prop_name"]
1320
+ //style is always copied completely, or $_props handled separately
1321
+ //Therefore set a _important_props["prop_name"]=true to indicate the modifier
1322
+
1323
+ /* Instead of short code, prefer the typical case with fast code
1324
+ $important = preg_match("/(.*?)!\s*important/",$prop,$match);
1325
+ if ( $important ) {
1326
+ $prop = $match[1];
1327
+ }
1328
+ $prop = trim($prop);
1329
+ */
1330
+ if (DEBUGCSS) print '(';
1331
+
1332
+ $important = false;
1333
+ $prop = trim($prop);
1334
+
1335
+ if ( substr($prop, -9) === 'important' ) {
1336
+ $prop_tmp = rtrim(substr($prop, 0, -9));
1337
+
1338
+ if ( substr($prop_tmp, -1) === '!' ) {
1339
+ $prop = rtrim(substr($prop_tmp, 0, -1));
1340
+ $important = true;
1341
+ }
1342
+ }
1343
+
1344
+ if ( $prop === "" ) {
1345
+ if (DEBUGCSS) print 'empty)';
1346
+ continue;
1347
+ }
1348
+
1349
+ $i = mb_strpos($prop, ":");
1350
+ if ( $i === false ) {
1351
+ if (DEBUGCSS) print 'novalue'.$prop.')';
1352
+ continue;
1353
+ }
1354
+
1355
+ $prop_name = rtrim(mb_strtolower(mb_substr($prop, 0, $i)));
1356
+ $value = ltrim(mb_substr($prop, $i+1));
1357
+ if (DEBUGCSS) print $prop_name.':='.$value.($important?'!IMPORTANT':'').')';
1358
+ //New style, anyway empty
1359
+ //if ($important || !$style->important_get($prop_name) ) {
1360
+ //$style->$prop_name = array($value,$important);
1361
+ //assignment might be replaced by overloading through __set,
1362
+ //and overloaded functions might check _important_props,
1363
+ //therefore set _important_props first.
1364
+ if ($important) {
1365
+ $style->important_set($prop_name);
1366
+ }
1367
+ //For easier debugging, don't use overloading of assignments with __set
1368
+ $style->$prop_name = $value;
1369
+ //$style->props_set($prop_name, $value);
1370
+ }
1371
+ if (DEBUGCSS) print '_parse_properties]';
1372
+
1373
+ return $style;
1374
+ }
1375
+
1376
+ /**
1377
+ * parse selector + rulesets
1378
+ *
1379
+ * @param string $str CSS selectors and rulesets
1380
+ */
1381
+ private function _parse_sections($str) {
1382
+ // Pre-process: collapse all whitespace and strip whitespace around '>',
1383
+ // '.', ':', '+', '#'
1384
+
1385
+ $patterns = array("/[\\s\n]+/", "/\\s+([>.:+#])\\s+/");
1386
+ $replacements = array(" ", "\\1");
1387
+ $str = preg_replace($patterns, $replacements, $str);
1388
+
1389
+ $sections = explode("}", $str);
1390
+ if (DEBUGCSS) print '[_parse_sections';
1391
+ foreach ($sections as $sect) {
1392
+ $i = mb_strpos($sect, "{");
1393
+
1394
+ $selectors = explode(",", mb_substr($sect, 0, $i));
1395
+ if (DEBUGCSS) print '[section';
1396
+ $style = $this->_parse_properties(trim(mb_substr($sect, $i+1)));
1397
+
1398
+ // Assign it to the selected elements
1399
+ foreach ($selectors as $selector) {
1400
+ $selector = trim($selector);
1401
+
1402
+ if ($selector == "") {
1403
+ if (DEBUGCSS) print '#empty#';
1404
+ continue;
1405
+ }
1406
+ if (DEBUGCSS) print '#'.$selector.'#';
1407
+ //if (DEBUGCSS) { if (strpos($selector,'p') !== false) print '!!!p!!!#'; }
1408
+
1409
+ $this->add_style($selector, $style);
1410
+ }
1411
+
1412
+ if (DEBUGCSS) print 'section]';
1413
+ }
1414
+
1415
+ if (DEBUGCSS) print '_parse_sections]';
1416
+ }
1417
+
1418
+ /**
1419
+ * dumps the entire stylesheet as a string
1420
+ *
1421
+ * Generates a string of each selector and associated style in the
1422
+ * Stylesheet. Useful for debugging.
1423
+ *
1424
+ * @return string
1425
+ */
1426
+ function __toString() {
1427
+ $str = "";
1428
+ foreach ($this->_styles as $selector => $style) {
1429
+ $str .= "$selector => " . $style->__toString() . "\n";
1430
+ }
1431
+
1432
+ return $str;
1433
+ }
1434
+ }
dompdf/include/table_cell_frame_decorator.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_cell_frame_decorator.cls.php 451 2012-01-14 14:54:23Z fabien.menager $
8
  */
9
 
10
  /**
@@ -80,7 +79,7 @@ class Table_Cell_Frame_Decorator extends Block_Frame_Decorator {
80
 
81
  if ( $y_offset ) {
82
  // Move our children
83
- foreach ( $this->get_line_boxes() as $i => $line ) {
84
  foreach ( $line->get_frames() as $frame )
85
  $frame->move( 0, $y_offset );
86
  }
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
79
 
80
  if ( $y_offset ) {
81
  // Move our children
82
+ foreach ( $this->get_line_boxes() as $line ) {
83
  foreach ( $line->get_frames() as $frame )
84
  $frame->move( 0, $y_offset );
85
  }
dompdf/include/table_cell_frame_reflower.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_cell_frame_reflower.cls.php 457 2012-01-22 11:48:20Z fabien.menager $
8
  */
9
 
10
  /**
@@ -17,13 +16,13 @@ class Table_Cell_Frame_Reflower extends Block_Frame_Reflower {
17
 
18
  //........................................................................
19
 
20
- function __construct(Frame $frame) {
21
  parent::__construct($frame);
22
  }
23
 
24
  //........................................................................
25
 
26
- function reflow(Frame_Decorator $block = null) {
27
 
28
  $style = $this->_frame->get_style();
29
 
@@ -72,9 +71,11 @@ class Table_Cell_Frame_Reflower extends Block_Frame_Reflower {
72
  $indent = $style->length_in_pt($style->text_indent, $w);
73
  $this->_frame->increase_line_width($indent);
74
 
75
- // Set the y position of the first line in the cell
76
  $page = $this->_frame->get_root();
77
- $this->_frame->set_current_line($line_y);
 
 
 
78
 
79
  // Set the containing blocks and reflow each child
80
  foreach ( $this->_frame->get_children() as $child ) {
@@ -83,6 +84,9 @@ class Table_Cell_Frame_Reflower extends Block_Frame_Reflower {
83
  break;
84
 
85
  $child->set_containing_block($content_x, $content_y, $cb_w, $h);
 
 
 
86
  $child->reflow($this->_frame);
87
 
88
  $this->process_float($child, $x + $left_space, $w - $right_space - $left_space);
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
16
 
17
  //........................................................................
18
 
19
+ function __construct(Block_Frame_Decorator $frame) {
20
  parent::__construct($frame);
21
  }
22
 
23
  //........................................................................
24
 
25
+ function reflow(Block_Frame_Decorator $block = null) {
26
 
27
  $style = $this->_frame->get_style();
28
 
71
  $indent = $style->length_in_pt($style->text_indent, $w);
72
  $this->_frame->increase_line_width($indent);
73
 
 
74
  $page = $this->_frame->get_root();
75
+
76
+ // Set the y position of the first line in the cell
77
+ $line_box = $this->_frame->get_current_line_box();
78
+ $line_box->y = $line_y;
79
 
80
  // Set the containing blocks and reflow each child
81
  foreach ( $this->_frame->get_children() as $child ) {
84
  break;
85
 
86
  $child->set_containing_block($content_x, $content_y, $cb_w, $h);
87
+
88
+ $this->process_clear($child);
89
+
90
  $child->reflow($this->_frame);
91
 
92
  $this->process_float($child, $x + $left_space, $w - $right_space - $left_space);
dompdf/include/table_cell_positioner.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_cell_positioner.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/table_cell_renderer.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_cell_renderer.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/table_frame_decorator.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_frame_decorator.cls.php 462 2012-01-29 22:44:23Z fabien.menager $
8
  */
9
 
10
  /**
@@ -68,11 +67,17 @@ class Table_Frame_Decorator extends Frame_Decorator {
68
  /**
69
  * Class constructor
70
  *
71
- * @param Frame $frame the frame to decorate
 
72
  */
73
  function __construct(Frame $frame, DOMPDF $dompdf) {
74
  parent::__construct($frame, $dompdf);
75
  $this->_cellmap = new Cellmap($this);
 
 
 
 
 
76
  $this->_min_width = null;
77
  $this->_max_width = null;
78
  $this->_headers = array();
@@ -97,9 +102,12 @@ class Table_Frame_Decorator extends Frame_Decorator {
97
  * added to the clone. This method is overidden in order to remove
98
  * frames from the cellmap properly.
99
  *
100
- * @param Frame $row
 
 
 
101
  */
102
- function split($child = null, $force_pagebreak = false) {
103
 
104
  if ( is_null($child) ) {
105
  parent::split();
@@ -147,10 +155,10 @@ class Table_Frame_Decorator extends Frame_Decorator {
147
  /**
148
  * Return a copy of this frame with $node as its node
149
  *
150
- * @param DomNode $node
151
  * @return Frame
152
  */
153
- function copy(DomNode $node) {
154
  $deco = parent::copy($node);
155
 
156
  // In order to keep columns' widths through pages
@@ -269,8 +277,7 @@ class Table_Frame_Decorator extends Frame_Decorator {
269
  // Okay, I have absolutely no idea why I need this clone here, but
270
  // if it's omitted, php (as of 2004-07-28) segfaults.
271
  $frame->set_style(clone $style);
272
- $table_row = Frame_Factory::decorate_frame($frame, $this->_dompdf);
273
- $table_row->set_root($this->_root);
274
 
275
  // Add the cell to the row
276
  $table_row->append_child($child);
@@ -286,8 +293,9 @@ class Table_Frame_Decorator extends Frame_Decorator {
286
 
287
  // Normalise other table parts (i.e. row groups)
288
  foreach ($child->get_children() as $grandchild) {
289
- if ( $grandchild->get_style()->display === "table-row" )
290
  $grandchild->normalise();
 
291
  }
292
 
293
  // Add headers and footers
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
67
  /**
68
  * Class constructor
69
  *
70
+ * @param Frame $frame the frame to decorate
71
+ * @param DOMPDF $dompdf
72
  */
73
  function __construct(Frame $frame, DOMPDF $dompdf) {
74
  parent::__construct($frame, $dompdf);
75
  $this->_cellmap = new Cellmap($this);
76
+
77
+ if ( $frame->get_style()->table_layout === "fixed" ) {
78
+ $this->_cellmap->set_layout_fixed(true);
79
+ }
80
+
81
  $this->_min_width = null;
82
  $this->_max_width = null;
83
  $this->_headers = array();
102
  * added to the clone. This method is overidden in order to remove
103
  * frames from the cellmap properly.
104
  *
105
+ * @param Frame $child
106
+ * @param bool $force_pagebreak
107
+ *
108
+ * @return void
109
  */
110
+ function split(Frame $child = null, $force_pagebreak = false) {
111
 
112
  if ( is_null($child) ) {
113
  parent::split();
155
  /**
156
  * Return a copy of this frame with $node as its node
157
  *
158
+ * @param DOMNode $node
159
  * @return Frame
160
  */
161
+ function copy(DOMNode $node) {
162
  $deco = parent::copy($node);
163
 
164
  // In order to keep columns' widths through pages
277
  // Okay, I have absolutely no idea why I need this clone here, but
278
  // if it's omitted, php (as of 2004-07-28) segfaults.
279
  $frame->set_style(clone $style);
280
+ $table_row = Frame_Factory::decorate_frame($frame, $this->_dompdf, $this->_root);
 
281
 
282
  // Add the cell to the row
283
  $table_row->append_child($child);
293
 
294
  // Normalise other table parts (i.e. row groups)
295
  foreach ($child->get_children() as $grandchild) {
296
+ if ( $grandchild->get_style()->display === "table-row" ) {
297
  $grandchild->normalise();
298
+ }
299
  }
300
 
301
  // Add headers and footers
dompdf/include/table_frame_reflower.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_frame_reflower.cls.php 465 2012-01-30 21:58:11Z fabien.menager $
8
  */
9
 
10
  /**
@@ -14,6 +13,12 @@
14
  * @package dompdf
15
  */
16
  class Table_Frame_Reflower extends Frame_Reflower {
 
 
 
 
 
 
17
 
18
  /**
19
  * Cache of results between call to get_min_max_width and assign_widths
@@ -147,12 +152,15 @@ class Table_Frame_Reflower extends Frame_Reflower {
147
  //
148
  // 4. Both absolute and percentage widths have been specified.
149
 
 
 
150
  // Case 1:
151
  if ( $absolute_used == 0 && $percent_used == 0 ) {
152
  $increment = $width - $min_width;
153
 
154
- foreach (array_keys($columns) as $i)
155
  $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment * ($columns[$i]["max-width"] / $max_width));
 
156
  return;
157
  }
158
 
@@ -355,7 +363,10 @@ class Table_Frame_Reflower extends Frame_Reflower {
355
  }
356
  //........................................................................
357
 
358
- function reflow(Frame_Decorator $block = null) {
 
 
 
359
  /**
360
  * @var Table_Frame_Decorator
361
  */
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
13
  * @package dompdf
14
  */
15
  class Table_Frame_Reflower extends Frame_Reflower {
16
+ /**
17
+ * Frame for this reflower
18
+ *
19
+ * @var Table_Frame_Decorator
20
+ */
21
+ protected $_frame;
22
 
23
  /**
24
  * Cache of results between call to get_min_max_width and assign_widths
152
  //
153
  // 4. Both absolute and percentage widths have been specified.
154
 
155
+ $increment = 0;
156
+
157
  // Case 1:
158
  if ( $absolute_used == 0 && $percent_used == 0 ) {
159
  $increment = $width - $min_width;
160
 
161
+ foreach (array_keys($columns) as $i) {
162
  $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment * ($columns[$i]["max-width"] / $max_width));
163
+ }
164
  return;
165
  }
166
 
363
  }
364
  //........................................................................
365
 
366
+ /**
367
+ * @param Block_Frame_Decorator $block
368
+ */
369
+ function reflow(Block_Frame_Decorator $block = null) {
370
  /**
371
  * @var Table_Frame_Decorator
372
  */
dompdf/include/table_row_frame_decorator.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_row_frame_decorator.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/table_row_frame_reflower.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_row_frame_reflower.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -22,7 +21,7 @@ class Table_Row_Frame_Reflower extends Frame_Reflower {
22
 
23
  //........................................................................
24
 
25
- function reflow(Frame_Decorator $block = null) {
26
  $page = $this->_frame->get_root();
27
 
28
  if ( $page->is_full() )
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
21
 
22
  //........................................................................
23
 
24
+ function reflow(Block_Frame_Decorator $block = null) {
25
  $page = $this->_frame->get_root();
26
 
27
  if ( $page->is_full() )
dompdf/include/table_row_group_frame_decorator.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_row_group_frame_decorator.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -31,15 +30,17 @@ class Table_Row_Group_Frame_Decorator extends Frame_Decorator {
31
  * Override split() to remove all child rows and this element from the cellmap
32
  *
33
  * @param Frame $child
 
 
 
34
  */
35
- function split($child = null, $force_pagebreak = false) {
36
 
37
  if ( is_null($child) ) {
38
  parent::split();
39
  return;
40
  }
41
 
42
-
43
  // Remove child & all subsequent rows from the cellmap
44
  $cellmap = $this->get_parent()->get_cellmap();
45
  $iter = $child;
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
30
  * Override split() to remove all child rows and this element from the cellmap
31
  *
32
  * @param Frame $child
33
+ * @param bool $force_pagebreak
34
+ *
35
+ * @return void
36
  */
37
+ function split(Frame $child = null, $force_pagebreak = false) {
38
 
39
  if ( is_null($child) ) {
40
  parent::split();
41
  return;
42
  }
43
 
 
44
  // Remove child & all subsequent rows from the cellmap
45
  $cellmap = $this->get_parent()->get_cellmap();
46
  $iter = $child;
dompdf/include/table_row_group_frame_reflower.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_row_group_frame_reflower.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
@@ -19,7 +18,7 @@ class Table_Row_Group_Frame_Reflower extends Frame_Reflower {
19
  parent::__construct($frame);
20
  }
21
 
22
- function reflow(Frame_Decorator $block = null) {
23
  $page = $this->_frame->get_root();
24
 
25
  $style = $this->_frame->get_style();
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
18
  parent::__construct($frame);
19
  }
20
 
21
+ function reflow(Block_Frame_Decorator $block = null) {
22
  $page = $this->_frame->get_root();
23
 
24
  $style = $this->_frame->get_style();
dompdf/include/table_row_group_renderer.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_row_group_renderer.cls.php 449 2011-11-13 13:07:48Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/table_row_positioner.cls.php CHANGED
@@ -4,7 +4,6 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: table_row_positioner.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
  /**
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
  /**
dompdf/include/tcpdf_adapter.cls.php CHANGED
@@ -4,10 +4,9 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7
- * @version $Id: tcpdf_adapter.cls.php 448 2011-11-13 13:00:03Z fabien.menager $
8
  */
9
 
10
- require_once(DOMPDF_LIB_DIR . '/tcpdf/tcpdf.php');
11
 
12
  /**
13
  * TCPDF PDF Rendering interface
@@ -30,9 +29,12 @@ class TCPDF_Adapter implements Canvas {
30
  *
31
  * @var array;
32
  */
33
- static public $PAPER_SIZES = array(); // Set to
34
- // CPDF_Adapter::$PAPER_SIZES below.
35
 
 
 
 
 
36
 
37
  /**
38
  * Instance of the TCPDF class
@@ -100,26 +102,29 @@ class TCPDF_Adapter implements Canvas {
100
  /**
101
  * Class constructor
102
  *
103
- * @param mixed $paper The size of paper to use either a string (see {@link CPDF_Adapter::$PAPER_SIZES}) or
104
- * an array(xmin,ymin,xmax,ymax)
105
  * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')
 
106
  */
107
- function __construct($paper = "letter", $orientation = "portrait") {
108
 
109
  if ( is_array($paper) )
110
  $size = $paper;
111
  else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) )
112
- $size = self::$PAPER_SIZE[$paper];
113
  else
114
- $size = self::$PAPER_SIZE["letter"];
115
 
116
  if ( mb_strtolower($orientation) === "landscape" ) {
117
  list($size[2], $size[3]) = array($size[3], $size[2]);
118
  }
119
 
120
- $this->_width = $size[2] - $size[0];
121
  $this->_height = $size[3] - $size[1];
122
 
 
 
123
  $this->_pdf = new TCPDF("P", "pt", array($this->_width, $this->_height));
124
  $this->_pdf->Setcreator("DOMPDF Converter");
125
 
@@ -128,11 +133,14 @@ class TCPDF_Adapter implements Canvas {
128
  $this->_page_number = $this->_page_count = 1;
129
  $this->_page_text = array();
130
 
131
- $this->_last_fill_color =
132
- $this->_last_stroke_color =
133
- $this->_last_line_width = null;
 
134
 
135
- }
 
 
136
 
137
  /**
138
  * Remaps y coords from 4th to 1st quadrant
@@ -146,11 +154,13 @@ class TCPDF_Adapter implements Canvas {
146
  * Sets the stroke colour
147
  *
148
  * @param array $color
 
 
149
  */
150
- protected function _set_stroke_colour($colour) {
151
- $colour[0] = round(255 * $colour[0]);
152
- $colour[1] = round(255 * $colour[1]);
153
- $colour[2] = round(255 * $colour[2]);
154
 
155
  if ( is_null($this->_last_stroke_color) || $color != $this->_last_stroke_color ) {
156
  $this->_pdf->SetDrawColor($color[0],$color[1],$color[2]);
@@ -164,10 +174,10 @@ class TCPDF_Adapter implements Canvas {
164
  *
165
  * @param array $color
166
  */
167
- protected function _set_fill_colour($colour) {
168
- $colour[0] = round(255 * $colour[0]);
169
- $colour[1] = round(255 * $colour[1]);
170
- $colour[2] = round(255 * $colour[2]);
171
 
172
  if ( is_null($this->_last_fill_color) || $color != $this->_last_fill_color ) {
173
  $this->_pdf->SetDrawColor($color[0],$color[1],$color[2]);
@@ -335,35 +345,39 @@ class TCPDF_Adapter implements Canvas {
335
 
336
  /**
337
  * Add an image to the pdf.
338
- *
339
  * The image is placed at the specified x and y coordinates with the
340
  * given width and height.
341
  *
342
  * @param string $img_url the path to the image
343
- * @param string $img_type the type (e.g. extension) of the image
344
- * @param float $x x position
345
- * @param float $y y position
346
- * @param int $w width (in pixels)
347
- * @param int $h height (in pixels)
 
 
348
  */
349
- function image($img_url, $img_type, $x, $y, $w, $h) {
350
  // FIXME
351
  }
352
 
353
  /**
354
  * Writes text at the specified x and y coordinates
355
- *
356
  * See {@link Style::munge_colour()} for the format of the colour array.
357
  *
358
- * @param float $x
359
- * @param float $y
360
  * @param string $text the text to write
361
  * @param string $font the font file to use
362
- * @param float $size the font size, in points
363
- * @param array $color
364
- * @param float $adjust word spacing adjustment
 
 
 
 
365
  */
366
- function text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0) {
367
  // FIXME
368
  }
369
 
@@ -405,17 +419,19 @@ class TCPDF_Adapter implements Canvas {
405
  $this->_pdf->$method($value);
406
  }
407
  }
408
-
409
  /**
410
  * Calculates text size, in points
411
  *
412
  * @param string $text the text to be sized
413
  * @param string $font the desired font
414
  * @param float $size the desired font size
415
- * @param float $spacing word spacing, if any
 
 
416
  * @return float
417
  */
418
- function get_text_width($text, $font, $size, $spacing = 0) {
419
  // FIXME
420
  }
421
 
@@ -459,8 +475,154 @@ class TCPDF_Adapter implements Canvas {
459
  function output($options = null) {
460
  // FIXME
461
  }
462
-
463
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
464
 
465
  // Workaround for idiotic limitation on statics...
466
- PDFLib_Adapter::$PAPER_SIZES = CPDF_Adapter::$PAPER_SIZES;
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
7
  */
8
 
9
+ require_once DOMPDF_LIB_DIR . '/tcpdf/tcpdf.php';
10
 
11
  /**
12
  * TCPDF PDF Rendering interface
29
  *
30
  * @var array;
31
  */
32
+ static public $PAPER_SIZES = array(); // Set to CPDF_Adapter::$PAPER_SIZES below.
 
33
 
34
+ /**
35
+ * @var DOMPDF
36
+ */
37
+ private $_dompdf;
38
 
39
  /**
40
  * Instance of the TCPDF class
102
  /**
103
  * Class constructor
104
  *
105
+ * @param mixed $paper The size of paper to use either a string (see {@link CPDF_Adapter::$PAPER_SIZES}) or
106
+ * an array(xmin,ymin,xmax,ymax)
107
  * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')
108
+ * @param DOMPDF $dompdf
109
  */
110
+ function __construct($paper = "letter", $orientation = "portrait", DOMPDF $dompdf) {
111
 
112
  if ( is_array($paper) )
113
  $size = $paper;
114
  else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) )
115
+ $size = self::$PAPER_SIZES[$paper];
116
  else
117
+ $size = self::$PAPER_SIZES["letter"];
118
 
119
  if ( mb_strtolower($orientation) === "landscape" ) {
120
  list($size[2], $size[3]) = array($size[3], $size[2]);
121
  }
122
 
123
+ $this->_width = $size[2] - $size[0];
124
  $this->_height = $size[3] - $size[1];
125
 
126
+ $this->_dompdf = $dompdf;
127
+
128
  $this->_pdf = new TCPDF("P", "pt", array($this->_width, $this->_height));
129
  $this->_pdf->Setcreator("DOMPDF Converter");
130
 
133
  $this->_page_number = $this->_page_count = 1;
134
  $this->_page_text = array();
135
 
136
+ $this->_last_fill_color = null;
137
+ $this->_last_stroke_color = null;
138
+ $this->_last_line_width = null;
139
+ }
140
 
141
+ function get_dompdf(){
142
+ return $this->_dompdf;
143
+ }
144
 
145
  /**
146
  * Remaps y coords from 4th to 1st quadrant
154
  * Sets the stroke colour
155
  *
156
  * @param array $color
157
+ *
158
+ * @return void
159
  */
160
+ protected function _set_stroke_colour($color) {
161
+ $color[0] = round(255 * $color[0]);
162
+ $color[1] = round(255 * $color[1]);
163
+ $color[2] = round(255 * $color[2]);
164
 
165
  if ( is_null($this->_last_stroke_color) || $color != $this->_last_stroke_color ) {
166
  $this->_pdf->SetDrawColor($color[0],$color[1],$color[2]);
174
  *
175
  * @param array $color
176
  */
177
+ protected function _set_fill_colour($color) {
178
+ $color[0] = round(255 * $color[0]);
179
+ $color[1] = round(255 * $color[1]);
180
+ $color[2] = round(255 * $color[2]);
181
 
182
  if ( is_null($this->_last_fill_color) || $color != $this->_last_fill_color ) {
183
  $this->_pdf->SetDrawColor($color[0],$color[1],$color[2]);
345
 
346
  /**
347
  * Add an image to the pdf.
 
348
  * The image is placed at the specified x and y coordinates with the
349
  * given width and height.
350
  *
351
  * @param string $img_url the path to the image
352
+ * @param float $x x position
353
+ * @param float $y y position
354
+ * @param int $w width (in pixels)
355
+ * @param int $h height (in pixels)
356
+ * @param string $resolution
357
+ *
358
+ * @return void
359
  */
360
+ function image($img_url, $x, $y, $w, $h, $resolution = "normal") {
361
  // FIXME
362
  }
363
 
364
  /**
365
  * Writes text at the specified x and y coordinates
 
366
  * See {@link Style::munge_colour()} for the format of the colour array.
367
  *
368
+ * @param float $x
369
+ * @param float $y
370
  * @param string $text the text to write
371
  * @param string $font the font file to use
372
+ * @param float $size the font size, in points
373
+ * @param array $color
374
+ * @param float $word_space word spacing adjustment
375
+ * @param float $char_space
376
+ * @param float $angle
377
+ *
378
+ * @return void
379
  */
380
+ function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0) {
381
  // FIXME
382
  }
383
 
419
  $this->_pdf->$method($value);
420
  }
421
  }
422
+
423
  /**
424
  * Calculates text size, in points
425
  *
426
  * @param string $text the text to be sized
427
  * @param string $font the desired font
428
  * @param float $size the desired font size
429
+ * @param float $word_spacing word spacing, if any
430
+ * @param float $char_spacing
431
+ *
432
  * @return float
433
  */
434
+ function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0) {
435
  // FIXME
436
  }
437
 
475
  function output($options = null) {
476
  // FIXME
477
  }
478
+
479
+ /**
480
+ * Starts a clipping rectangle at x1,y1 with width w and height h
481
+ *
482
+ * @param float $x1
483
+ * @param float $y1
484
+ * @param float $w
485
+ * @param float $h
486
+ */
487
+ function clipping_rectangle($x1, $y1, $w, $h) {
488
+ // TODO: Implement clipping_rectangle() method.
489
+ }
490
+
491
+ /**
492
+ * Starts a rounded clipping rectangle at x1,y1 with width w and height h
493
+ *
494
+ * @param float $x1
495
+ * @param float $y1
496
+ * @param float $w
497
+ * @param float $h
498
+ * @param float $tl
499
+ * @param float $tr
500
+ * @param float $br
501
+ * @param float $bl
502
+ *
503
+ * @return void
504
+ */
505
+ function clipping_roundrectangle($x1, $y1, $w, $h, $tl, $tr, $br, $bl) {
506
+ // TODO: Implement clipping_roundrectangle() method.
507
+ }
508
+
509
+ /**
510
+ * Ends the last clipping shape
511
+ */
512
+ function clipping_end() {
513
+ // TODO: Implement clipping_end() method.
514
+ }
515
+
516
+ /**
517
+ * Save current state
518
+ */
519
+ function save() {
520
+ // TODO: Implement save() method.
521
+ }
522
+
523
+ /**
524
+ * Restore last state
525
+ */
526
+ function restore() {
527
+ // TODO: Implement restore() method.
528
+ }
529
+
530
+ /**
531
+ * Rotate
532
+ */
533
+ function rotate($angle, $x, $y) {
534
+ // TODO: Implement rotate() method.
535
+ }
536
+
537
+ /**
538
+ * Skew
539
+ */
540
+ function skew($angle_x, $angle_y, $x, $y) {
541
+ // TODO: Implement skew() method.
542
+ }
543
+
544
+ /**
545
+ * Scale
546
+ */
547
+ function scale($s_x, $s_y, $x, $y) {
548
+ // TODO: Implement scale() method.
549
+ }
550
+
551
+ /**
552
+ * Translate
553
+ */
554
+ function translate($t_x, $t_y) {
555
+ // TODO: Implement translate() method.
556
+ }
557
+
558
+ /**
559
+ * Transform
560
+ */
561
+ function transform($a, $b, $c, $d, $e, $f) {
562
+ // TODO: Implement transform() method.
563
+ }
564
+
565
+ /**
566
+ * Add an arc to the PDF
567
+ * See {@link Style::munge_colour()} for the format of the colour array.
568
+ *
569
+ * @param float $x X coordinate of the arc
570
+ * @param float $y Y coordinate of the arc
571
+ * @param float $r1 Radius 1
572
+ * @param float $r2 Radius 2
573
+ * @param float $astart Start angle in degrees
574
+ * @param float $aend End angle in degrees
575
+ * @param array $color Color
576
+ * @param float $width
577
+ * @param array $style
578
+ *
579
+ * @return void
580
+ */
581
+ function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = array()) {
582
+ // TODO: Implement arc() method.
583
+ }
584
+
585
+ /**
586
+ * Calculates font baseline, in points
587
+ *
588
+ * @param string $font
589
+ * @param float $size
590
+ *
591
+ * @return float
592
+ */
593
+ function get_font_baseline($font, $size) {
594
+ // TODO: Implement get_font_baseline() method.
595
+ }
596
+
597
+ /**
598
+ * Sets the opacity
599
+ *
600
+ * @param float $opacity
601
+ * @param string $mode
602
+ */
603
+ function set_opacity($opacity, $mode = "Normal") {
604
+ // TODO: Implement set_opacity() method.
605
+ }
606
+
607
+ /**
608
+ * Sets the default view
609
+ *
610
+ * @param string $view
611
+ * 'XYZ' left, top, zoom
612
+ * 'Fit'
613
+ * 'FitH' top
614
+ * 'FitV' left
615
+ * 'FitR' left,bottom,right
616
+ * 'FitB'
617
+ * 'FitBH' top
618
+ * 'FitBV' left
619
+ * @param array $options
620
+ *
621
+ * @return void
622
+ */
623
+ function set_default_view($view, $options = array()) {
624
+ // TODO: Implement set_default_view() method.
625
+ }}
626
 
627
  // Workaround for idiotic limitation on statics...
628
+ TCPDF_Adapter::$PAPER_SIZES = CPDF_Adapter::$PAPER_SIZES;
dompdf/include/text_frame_decorator.cls.php CHANGED
@@ -4,9 +4,8 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Brian Sweeney <eclecticgeek@gmail.com>
7
- * @author Fabien M�nager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
9
- * @version $Id: text_frame_decorator.cls.php 459 2012-01-25 21:38:50Z fabien.menager $
10
  */
11
 
12
  /**
@@ -75,7 +74,7 @@ class Text_Frame_Decorator extends Frame_Decorator {
75
  // This function is called in add_frame_to_line() and is used to
76
  // determine the line height, so we actually want to return the
77
  // 'line-height' property, not the actual margin box
78
- $style = $this->get_style();
79
  $font = $style->font_family;
80
  $size = $style->font_size;
81
 
@@ -131,7 +130,7 @@ class Text_Frame_Decorator extends Frame_Decorator {
131
  // text is added a sibling frame following this one and is returned.
132
  function split_text($offset) {
133
  if ( $offset == 0 )
134
- return;
135
 
136
  if ( self::$_buggy_splittext ) {
137
  // workaround to solve DOMText::spliText() bug parsing multibyte strings
@@ -162,7 +161,7 @@ class Text_Frame_Decorator extends Frame_Decorator {
162
  function delete_text($offset, $count) {
163
  $this->_frame->get_node()->deleteData($offset, $count);
164
  }
165
-
166
  //........................................................................
167
 
168
  function set_text($text) {
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Brian Sweeney <eclecticgeek@gmail.com>
7
+ * @author Fabien Ménager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
9
  */
10
 
11
  /**
74
  // This function is called in add_frame_to_line() and is used to
75
  // determine the line height, so we actually want to return the
76
  // 'line-height' property, not the actual margin box
77
+ $style = $this->get_parent()->get_style();
78
  $font = $style->font_family;
79
  $size = $style->font_size;
80
 
130
  // text is added a sibling frame following this one and is returned.
131
  function split_text($offset) {
132
  if ( $offset == 0 )
133
+ return null;
134
 
135
  if ( self::$_buggy_splittext ) {
136
  // workaround to solve DOMText::spliText() bug parsing multibyte strings
161
  function delete_text($offset, $count) {
162
  $this->_frame->get_node()->deleteData($offset, $count);
163
  }
164
+
165
  //........................................................................
166
 
167
  function set_text($text) {
dompdf/include/text_frame_reflower.cls.php CHANGED
@@ -3,9 +3,8 @@
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
- * @author Fabien M�nager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
8
- * @version $Id: text_frame_reflower.cls.php 462 2012-01-29 22:44:23Z fabien.menager $
9
  */
10
 
11
  /**
@@ -53,10 +52,6 @@ class Text_Frame_Reflower extends Frame_Reflower {
53
 
54
  $available_width = $line_width - $current_line_width;
55
 
56
- // split the text into words
57
- $words = preg_split('/([\s-]+)/u', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
58
- $wc = count($words);
59
-
60
  // Account for word-spacing
61
  $word_spacing = $style->length_in_pt($style->word_spacing);
62
  $char_spacing = $style->length_in_pt($style->letter_spacing);
@@ -87,6 +82,10 @@ class Text_Frame_Reflower extends Frame_Reflower {
87
  if ( $frame_width <= $available_width )
88
  return false;
89
 
 
 
 
 
90
  // Determine the split point
91
  $width = 0;
92
  $str = "";
@@ -310,7 +309,7 @@ class Text_Frame_Reflower extends Frame_Reflower {
310
 
311
  //........................................................................
312
 
313
- function reflow(Frame_Decorator $block = null) {
314
  $frame = $this->_frame;
315
  $page = $frame->get_root();
316
  $page->check_forced_page_break($this->_frame);
@@ -370,6 +369,9 @@ class Text_Frame_Reflower extends Frame_Reflower {
370
  // faster than doing a single-pass character by character scan. Heh,
371
  // yes I took the time to bench it ;)
372
  $words = array_flip(preg_split("/[\s-]+/u",$str, -1, PREG_SPLIT_DELIM_CAPTURE));
 
 
 
373
  array_walk($words, create_function('&$val,$str',
374
  '$val = Font_Metrics::get_text_width($str, "'.addslashes($font).'", '.$size.', '.$word_spacing.', '.$char_spacing.');'));
375
  arsort($words);
@@ -378,6 +380,9 @@ class Text_Frame_Reflower extends Frame_Reflower {
378
 
379
  case "pre":
380
  $lines = array_flip(preg_split("/\n/u", $str));
 
 
 
381
  array_walk($lines, create_function('&$val,$str',
382
  '$val = Font_Metrics::get_text_width($str, "'.addslashes($font).'", '.$size.', '.$word_spacing.', '.$char_spacing.');'));
383
 
@@ -406,6 +411,9 @@ class Text_Frame_Reflower extends Frame_Reflower {
406
  case "pre-wrap":
407
  // Find the longest word (i.e. minimum length)
408
  $lines = array_flip(preg_split("/\n/", $text));
 
 
 
409
  array_walk($lines, create_function('&$val,$str',
410
  '$val = Font_Metrics::get_text_width($str, "'.$font.'", '.$size.', '.$word_spacing.', '.$char_spacing.');'));
411
  arsort($lines);
3
  * @package dompdf
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
+ * @author Fabien Ménager <fabien.menager@gmail.com>
7
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
8
  */
9
 
10
  /**
52
 
53
  $available_width = $line_width - $current_line_width;
54
 
 
 
 
 
55
  // Account for word-spacing
56
  $word_spacing = $style->length_in_pt($style->word_spacing);
57
  $char_spacing = $style->length_in_pt($style->letter_spacing);
82
  if ( $frame_width <= $available_width )
83
  return false;
84
 
85
+ // split the text into words
86
+ $words = preg_split('/([\s-]+)/u', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
87
+ $wc = count($words);
88
+
89
  // Determine the split point
90
  $width = 0;
91
  $str = "";
309
 
310
  //........................................................................
311
 
312
+ function reflow(Block_Frame_Decorator $block = null) {
313
  $frame = $this->_frame;
314
  $page = $frame->get_root();
315
  $page->check_forced_page_break($this->_frame);
369
  // faster than doing a single-pass character by character scan. Heh,
370
  // yes I took the time to bench it ;)
371
  $words = array_flip(preg_split("/[\s-]+/u",$str, -1, PREG_SPLIT_DELIM_CAPTURE));
372
+ /*foreach($words as &$word) {
373
+ $word = Font_Metrics::get_text_width($word, $font, $size, $word_spacing, $char_spacing);
374
+ }*/
375
  array_walk($words, create_function('&$val,$str',
376
  '$val = Font_Metrics::get_text_width($str, "'.addslashes($font).'", '.$size.', '.$word_spacing.', '.$char_spacing.');'));
377
  arsort($words);
380
 
381
  case "pre":
382
  $lines = array_flip(preg_split("/\n/u", $str));
383
+ /*foreach($words as &$word) {
384
+ $word = Font_Metrics::get_text_width($word, $font, $size, $word_spacing, $char_spacing);
385
+ }*/
386
  array_walk($lines, create_function('&$val,$str',
387
  '$val = Font_Metrics::get_text_width($str, "'.addslashes($font).'", '.$size.', '.$word_spacing.', '.$char_spacing.');'));
388
 
411
  case "pre-wrap":
412
  // Find the longest word (i.e. minimum length)
413
  $lines = array_flip(preg_split("/\n/", $text));
414
+ /*foreach($words as &$word) {
415
+ $word = Font_Metrics::get_text_width($word, $font, $size, $word_spacing, $char_spacing);
416
+ }*/
417
  array_walk($lines, create_function('&$val,$str',
418
  '$val = Font_Metrics::get_text_width($str, "'.$font.'", '.$size.', '.$word_spacing.', '.$char_spacing.');'));
419
  arsort($lines);
dompdf/include/text_renderer.cls.php CHANGED
@@ -4,9 +4,8 @@
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
- * @author Fabien M�nager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
9
- * @version $Id: text_renderer.cls.php 471 2012-02-06 21:59:10Z fabien.menager $
10
  */
11
 
12
  /**
@@ -31,6 +30,9 @@ class Text_Renderer extends Abstract_Renderer {
31
 
32
  //........................................................................
33
 
 
 
 
34
  function render(Frame $frame) {
35
  $text = $frame->get_text();
36
  if ( trim($text) === "" )
@@ -53,7 +55,7 @@ class Text_Renderer extends Abstract_Renderer {
53
 
54
  $font = $style->font_family;
55
  $size = $frame_font_size = $style->font_size;
56
- $height = $style->height;
57
  $word_spacing = $frame->get_text_spacing() + $style->length_in_pt($style->word_spacing);
58
  $char_spacing = $style->length_in_pt($style->letter_spacing);
59
  $width = $style->width;
@@ -79,25 +81,26 @@ class Text_Renderer extends Abstract_Renderer {
79
  $height = $line->h * ($size / $style->line_height);
80
  }
81
 
82
- if ( method_exists( $this->_canvas, "get_cpdf" ) ) {
83
- $cpdf = $this->_canvas->get_cpdf();
 
 
 
 
 
 
84
 
85
- //$cpdf_font = $cpdf->fonts[$style->font_family];
86
- //$base = ($cpdf_font["UnderlinePosition"]*$size)/1000;
87
- //$descent = (($cpdf_font["Ascender"]-$cpdf_font["Descender"])*$size)/1000;
88
 
89
- $fontBBox = $cpdf->fonts[$style->font_family]['FontBBox'];
90
- $base = (($fontBBox[3]*$size)/1000) * 0.90;
91
- $descent = ($fontBBox[1]*$size)/1000;
92
- //print '<pre>Text_Renderer cpdf:'.$base.' '.$descent.' '.$size.'</pre>';
93
- } else {
94
- //Descent is font part below baseline, typically negative. $height is about full height of font box.
95
- //$descent = -$size/6; is less accurate, depends on font family.
96
- // @todo Could we get font info for PDFlib adapter and others ?
97
- $base = $size*1.08;
98
- $descent = $size-$height;
99
- //print '<pre>Text_Renderer other than cpdf:'.$base.' '.$descent.' '.$size.'</pre>';
100
  }
 
 
 
101
 
102
  // Handle text decoration:
103
  // http://www.w3.org/TR/CSS21/text.html#propdef-text-decoration
@@ -123,23 +126,22 @@ class Text_Renderer extends Abstract_Renderer {
123
  continue;
124
 
125
  case "underline":
126
- $deco_y += $base - $descent + $size * (self::UNDERLINE_OFFSET - self::DECO_THICKNESS/2);
127
  break;
128
 
129
  case "overline":
130
- $deco_y += $size * (self::OVERLINE_OFFSET + self::DECO_THICKNESS/2);
131
  break;
132
 
133
  case "line-through":
134
- $deco_y += $base * 0.7 + $size * self::LINETHROUGH_OFFSET;
135
  break;
136
  }
137
 
138
  $dx = 0;
139
  $x1 = $x - self::DECO_EXTENSION;
140
  $x2 = $x + $width + $dx + self::DECO_EXTENSION;
141
- $this->_canvas->line($x1, $deco_y, $x2, $deco_y, $color, $size * self::DECO_THICKNESS);
142
-
143
  }
144
 
145
  if (DEBUG_LAYOUT && DEBUG_LAYOUT_LINES) {
4
  * @link http://www.dompdf.com/
5
  * @author Benj Carson <benjcarson@digitaljunkies.ca>
6
  * @author Helmut Tischer <htischer@weihenstephan.org>
7
+ * @author Fabien Ménager <fabien.menager@gmail.com>
8
  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 
9
  */
10
 
11
  /**
30
 
31
  //........................................................................
32
 
33
+ /**
34
+ * @param Text_Frame_Decorator $frame
35
+ */
36
  function render(Frame $frame) {
37
  $text = $frame->get_text();
38
  if ( trim($text) === "" )
55
 
56
  $font = $style->font_family;
57
  $size = $frame_font_size = $style->font_size;
58
+ $height = $style->height;
59
  $word_spacing = $frame->get_text_spacing() + $style->length_in_pt($style->word_spacing);
60
  $char_spacing = $style->length_in_pt($style->letter_spacing);
61
  $width = $style->width;
81
  $height = $line->h * ($size / $style->line_height);
82
  }
83
 
84
+ $line_thickness = $size * self::DECO_THICKNESS;
85
+ $underline_offset = $size * self::UNDERLINE_OFFSET;
86
+ $overline_offset = $size * self::OVERLINE_OFFSET;
87
+ $linethrough_offset = $size * self::LINETHROUGH_OFFSET;
88
+ $underline_position = -0.08;
89
+
90
+ if ( $this->_canvas instanceof CPDF_Adapter ) {
91
+ $cpdf_font = $this->_canvas->get_cpdf()->fonts[$style->font_family];
92
 
93
+ if (isset($cpdf_font["UnderlinePosition"])) {
94
+ $underline_position = $cpdf_font["UnderlinePosition"]/1000;
95
+ }
96
 
97
+ if (isset($cpdf_font["UnderlineThickness"])) {
98
+ $line_thickness = $size * ($cpdf_font["UnderlineThickness"]/1000);
99
+ }
 
 
 
 
 
 
 
 
100
  }
101
+
102
+ $descent = $size * $underline_position;
103
+ $base = $size;
104
 
105
  // Handle text decoration:
106
  // http://www.w3.org/TR/CSS21/text.html#propdef-text-decoration
126
  continue;
127
 
128
  case "underline":
129
+ $deco_y += $base - $descent + $underline_offset + $line_thickness/2;
130
  break;
131
 
132
  case "overline":
133
+ $deco_y += $overline_offset + $line_thickness/2;
134
  break;
135
 
136
  case "line-through":
137
+ $deco_y += $base * 0.7 + $linethrough_offset;
138
  break;
139
  }
140
 
141
  $dx = 0;
142
  $x1 = $x - self::DECO_EXTENSION;
143
  $x2 = $x + $width + $dx + self::DECO_EXTENSION;
144
+ $this->_canvas->line($x1, $deco_y, $x2, $deco_y, $color, $line_thickness);
 
145
  }
146
 
147
  if (DEBUG_LAYOUT && DEBUG_LAYOUT_LINES) {
dompdf/lib/_notes/dwsync.xml CHANGED
@@ -1,5 +1,4 @@
1
  <?xml version="1.0" encoding="utf-8" ?>
2
  <dwsync>
3
- <file name="class.pdf.php" server="ftp.danielmarks.com.au" local="129908529600000000" remote="129908529600000000" />
4
- <file name="class.pdf.php" server="216.235.107.57" local="129908529600000000" remote="129913291200000000" />
5
  </dwsync>
1
  <?xml version="1.0" encoding="utf-8" ?>
2
  <dwsync>
3
+ <file name="class.pdf.php" server="www.allnaturaltherapies.net" local="129908529600000000" remote="130012718400000000" />
 
4
  </dwsync>
dompdf/lib/class.pdf.php CHANGED
@@ -11,8 +11,7 @@
11
  * @author Helmut Tischer <htischer@weihenstephan.org>
12
  * @author Ryan H. Masten <ryan.masten@gmail.com>
13
  * @author Brian Sweeney <eclecticgeek@gmail.com>
14
- * @author Fabien M�nager <fabien.menager@gmail.com>
15
- * @version $Id: class.pdf.php 469 2012-02-05 22:25:30Z fabien.menager $
16
  * @license Public Domain http://creativecommons.org/licenses/publicdomain/
17
  * @package Cpdf
18
  */
@@ -21,85 +20,85 @@ class Cpdf {
21
  /**
22
  * @var integer The current number of pdf objects in the document
23
  */
24
- public $numObj = 0;
25
 
26
  /**
27
  * @var array This array contains all of the pdf objects, ready for final assembly
28
  */
29
- public $objects = array();
30
 
31
  /**
32
  * @var integer The objectId (number within the objects array) of the document catalog
33
  */
34
- public $catalogId;
35
 
36
  /**
37
  * @var array Array carrying information about the fonts that the system currently knows about
38
  * Used to ensure that a font is not loaded twice, among other things
39
  */
40
- public $fonts = array();
41
 
42
  /**
43
  * @var string The default font metrics file to use if no other font has been loaded.
44
  * The path to the directory containing the font metrics should be included
45
  */
46
- public $defaultFont = './fonts/Helvetica.afm';
47
 
48
  /**
49
  * @string A record of the current font
50
  */
51
- public $currentFont = '';
52
 
53
  /**
54
  * @var string The current base font
55
  */
56
- public $currentBaseFont = '';
57
 
58
  /**
59
  * @var integer The number of the current font within the font array
60
  */
61
- public $currentFontNum = 0;
62
 
63
  /**
64
  * @var integer
65
  */
66
- public $currentNode;
67
 
68
  /**
69
  * @var integer Object number of the current page
70
  */
71
- public $currentPage;
72
 
73
  /**
74
  * @var integer Object number of the currently active contents block
75
  */
76
- public $currentContents;
77
 
78
  /**
79
  * @var integer Number of fonts within the system
80
  */
81
- public $numFonts = 0;
82
 
83
  /**
84
  * @var integer Number of graphic state resources used
85
  */
86
- private $numStates = 0;
87
 
88
  /**
89
  * @var array Current colour for fill operations, defaults to inactive value,
90
  * all three components should be between 0 and 1 inclusive when active
91
  */
92
- public $currentColour = null;
93
 
94
  /**
95
  * @var array Current colour for stroke operations (lines etc.)
96
  */
97
- public $currentStrokeColour = null;
98
 
99
  /**
100
  * @var string Current style that lines are drawn in
101
  */
102
- public $currentLineStyle = '';
103
 
104
  /**
105
  * @var array Current line transparency (partial graphics state)
@@ -115,84 +114,84 @@ class Cpdf {
115
  * @var array An array which is used to save the state of the document, mainly the colours and styles
116
  * it is used to temporarily change to another state, the change back to what it was before
117
  */
118
- public $stateStack = array();
119
 
120
  /**
121
  * @var integer Number of elements within the state stack
122
  */
123
- public $nStateStack = 0;
124
 
125
  /**
126
  * @var integer Number of page objects within the document
127
  */
128
- public $numPages = 0;
129
 
130
  /**
131
  * @var array Object Id storage stack
132
  */
133
- public $stack = array();
134
 
135
  /**
136
  * @var integer Number of elements within the object Id storage stack
137
  */
138
- public $nStack = 0;
139
 
140
  /**
141
  * an array which contains information about the objects which are not firmly attached to pages
142
  * these have been added with the addObject function
143
  */
144
- public $looseObjects = array();
145
 
146
  /**
147
  * array contains infomation about how the loose objects are to be added to the document
148
  */
149
- public $addLooseObjects = array();
150
 
151
  /**
152
  * @var integer The objectId of the information object for the document
153
  * this contains authorship, title etc.
154
  */
155
- public $infoObject = 0;
156
 
157
  /**
158
  * @var integer Number of images being tracked within the document
159
  */
160
- public $numImages = 0;
161
 
162
  /**
163
  * @var array An array containing options about the document
164
  * it defaults to turning on the compression of the objects
165
  */
166
- public $options = array('compression'=>true);
167
 
168
  /**
169
  * @var integer The objectId of the first page of the document
170
  */
171
- public $firstPageId;
172
 
173
  /**
174
  * @var float Used to track the last used value of the inter-word spacing, this is so that it is known
175
  * when the spacing is changed.
176
  */
177
- public $wordSpaceAdjust = 0;
178
 
179
  /**
180
  * @var float Used to track the last used value of the inter-letter spacing, this is so that it is known
181
  * when the spacing is changed.
182
  */
183
- public $charSpaceAdjust = 0;
184
 
185
  /**
186
  * @var integer The object Id of the procset object
187
  */
188
- public $procsetObjectId;
189
 
190
  /**
191
  * @var array Store the information about the relationship between font families
192
  * this used so that the code knows which font is the bold version of another font, etc.
193
  * the value of this array is initialised in the constuctor function.
194
  */
195
- public $fontFamilies = array();
196
 
197
  /**
198
  * @var string Folder for php serialized formats of font metrics files.
@@ -201,13 +200,13 @@ class Cpdf {
201
  * If this folder does not exist or is not writable, Cpdf will be **much** slower.
202
  * Because of potential trouble with php safe mode, folder cannot be created at runtime.
203
  */
204
- public $fontcache = '';
205
 
206
  /**
207
  * @var integer The version of the font metrics cache file.
208
  * This value must be manually incremented whenever the internal font data structure is modified.
209
  */
210
- public $fontcacheVersion = 5;
211
 
212
  /**
213
  * @var string Temporary folder.
@@ -215,81 +214,81 @@ class Cpdf {
215
  * This can be passed in from class creator.
216
  * Only used for conversion of gd images to jpeg images.
217
  */
218
- public $tmp = '';
219
 
220
  /**
221
  * @var string Track if the current font is bolded or italicised
222
  */
223
- public $currentTextState = '';
224
 
225
  /**
226
  * @var string Messages are stored here during processing, these can be selected afterwards to give some useful debug information
227
  */
228
- public $messages = '';
229
 
230
  /**
231
  * @var string The ancryption array for the document encryption is stored here
232
  */
233
- public $arc4 = '';
234
 
235
  /**
236
  * @var integer The object Id of the encryption information
237
  */
238
- public $arc4_objnum = 0;
239
 
240
  /**
241
  * @var string The file identifier, used to uniquely identify a pdf document
242
  */
243
- public $fileIdentifier = '';
244
 
245
  /**
246
  * @var boolean A flag to say if a document is to be encrypted or not
247
  */
248
- public $encrypted = false;
249
 
250
  /**
251
  * @var string The encryption key for the encryption of all the document content (structure is not encrypted)
252
  */
253
- public $encryptionKey = '';
254
 
255
  /**
256
  * @var array Array which forms a stack to keep track of nested callback functions
257
  */
258
- public $callback = array();
259
 
260
  /**
261
  * @var integer The number of callback functions in the callback array
262
  */
263
- public $nCallback = 0;
264
 
265
  /**
266
  * @var array Store label->id pairs for named destinations, these will be used to replace internal links
267
  * done this way so that destinations can be defined after the location that links to them
268
  */
269
- public $destinations = array();
270
 
271
  /**
272
  * @var array Store the stack for the transaction commands, each item in here is a record of the values of all the
273
  * publiciables within the class, so that the user can rollback at will (from each 'start' command)
274
  * note that this includes the objects array, so these can be large.
275
  */
276
- public $checkpoint = '';
277
 
278
  /**
279
  * @var array Table of Image origin filenames and image labels which were already added with o_image().
280
  * Allows to merge identical images
281
  */
282
- public $imagelist = array();
283
 
284
  /**
285
  * @var boolean Whether the text passed in should be treated as Unicode or just local character set.
286
  */
287
- public $isUnicode = false;
288
 
289
  /**
290
  * @var string the JavaScript code of the document
291
  */
292
- public $javascript = '';
293
 
294
  /**
295
  * @var boolean whether the compression is possible
@@ -320,16 +319,17 @@ class Cpdf {
320
  'times-roman', 'times-bold', 'times-italic', 'times-bolditalic',
321
  'symbol', 'zapfdingbats'
322
  );
323
-
324
  /**
325
- * class constructor
326
- * this will start a new document
327
- * @var array $pageSize Array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero.
328
- * @var boolean $isUnicode Whether text will be treated as Unicode or not.
329
- * @var string $fontcache The font cache folder
330
- * @var string $tmp The temporary folder
 
331
  */
332
- function __construct ($pageSize = array(0, 0, 612, 792), $isUnicode = false, $fontcache = '', $tmp = '') {
333
  $this->isUnicode = $isUnicode;
334
  $this->fontcache = $fontcache;
335
  $this->tmp = $tmp;
@@ -362,38 +362,38 @@ class Cpdf {
362
  */
363
 
364
  /**
365
- *destination object, used to specify the location for the user to jump to, presently on opening
366
  */
367
  protected function o_destination($id, $action, $options = '') {
368
- if ($action !== 'new') {
369
- $o = & $this->objects[$id];
370
  }
371
 
372
  switch ($action) {
373
- case 'new':
374
  $this->objects[$id] = array('t'=>'destination', 'info'=>array());
375
- $tmp = '';
376
- switch ($options['type']) {
377
- case 'XYZ':
378
- case 'FitR':
379
- $tmp = ' '.$options['p3'].$tmp;
380
- case 'FitH':
381
- case 'FitV':
382
- case 'FitBH':
383
- case 'FitBV':
384
- $tmp = ' '.$options['p1'].' '.$options['p2'].$tmp;
385
- case 'Fit':
386
- case 'FitB':
387
- $tmp = $options['type'].$tmp;
388
- $this->objects[$id]['info']['string'] = $tmp;
389
- $this->objects[$id]['info']['page'] = $options['page'];
390
  }
391
  break;
392
 
393
- case 'out':
394
- $tmp = $o['info'];
395
  $res = "\n$id 0 obj\n".'['.$tmp['page'].' 0 R /'.$tmp['string']."]\nendobj";
396
- return $res;
397
  }
398
  }
399
 
@@ -401,38 +401,38 @@ class Cpdf {
401
  * set the viewer preferences
402
  */
403
  protected function o_viewerPreferences($id, $action, $options = '') {
404
- if ($action !== 'new') {
405
  $o = & $this->objects[$id];
406
  }
407
 
408
- switch ($action) {
409
- case 'new':
410
  $this->objects[$id] = array('t'=>'viewerPreferences', 'info'=>array());
411
  break;
412
 
413
- case 'add':
414
- foreach($options as $k=>$v) {
415
- switch ($k) {
416
- case 'HideToolbar':
417
- case 'HideMenubar':
418
- case 'HideWindowUI':
419
- case 'FitWindow':
420
- case 'CenterWindow':
421
- case 'NonFullScreenPageMode':
422
- case 'Direction':
423
- $o['info'][$k] = $v;
424
- break;
425
  }
426
  }
427
  break;
428
 
429
- case 'out':
430
  $res = "\n$id 0 obj\n<< ";
431
- foreach($o['info'] as $k=>$v) {
432
  $res.= "\n/$k $v";
433
  }
434
  $res.= "\n>>\n";
435
- return $res;
436
  }
437
  }
438
 
@@ -440,64 +440,64 @@ class Cpdf {
440
  * define the document catalog, the overall controller for the document
441
  */
442
  protected function o_catalog($id, $action, $options = '') {
443
- if ($action !== 'new') {
444
  $o = & $this->objects[$id];
445
  }
446
 
447
- switch ($action) {
448
- case 'new':
449
- $this->objects[$id] = array('t'=>'catalog', 'info'=>array());
450
- $this->catalogId = $id;
451
- break;
452
 
453
- case 'outlines':
454
- case 'pages':
455
- case 'openHere':
456
- case 'javascript':
457
- $o['info'][$action] = $options;
458
- break;
459
 
460
- case 'viewerPreferences':
461
- if (!isset($o['info']['viewerPreferences'])) {
462
- $this->numObj++;
463
- $this->o_viewerPreferences($this->numObj, 'new');
464
- $o['info']['viewerPreferences'] = $this->numObj;
465
- }
466
 
467
- $vp = $o['info']['viewerPreferences'];
468
- $this->o_viewerPreferences($vp, 'add', $options);
469
 
470
- break;
471
 
472
- case 'out':
473
- $res = "\n$id 0 obj\n<< /Type /Catalog";
474
 
475
- foreach($o['info'] as $k=>$v) {
476
- switch ($k) {
477
- case 'outlines':
478
- $res.= "\n/Outlines $v 0 R";
479
- break;
480
-
481
- case 'pages':
482
- $res.= "\n/Pages $v 0 R";
483
- break;
484
 
485
- case 'viewerPreferences':
486
- $res.= "\n/ViewerPreferences $v 0 R";
487
- break;
488
 
489
- case 'openHere':
490
- $res.= "\n/OpenAction $v 0 R";
491
- break;
492
 
493
- case 'javascript':
494
- $res.= "\n/Names <</JavaScript $v 0 R>>";
495
- break;
 
 
 
 
 
496
  }
497
- }
498
 
499
- $res.= " >>\nendobj";
500
- return $res;
501
  }
502
  }
503
 
@@ -505,45 +505,46 @@ class Cpdf {
505
  * object which is a parent to the pages in the document
506
  */
507
  protected function o_pages($id, $action, $options = '') {
508
- if ($action !== 'new') {
509
  $o = & $this->objects[$id];
510
  }
511
 
512
- switch ($action) {
513
- case 'new':
514
  $this->objects[$id] = array('t'=>'pages', 'info'=>array());
515
  $this->o_catalog($this->catalogId, 'pages', $id);
516
  break;
517
 
518
- case 'page':
519
- if (!is_array($options)) {
520
  // then it will just be the id of the new page
521
  $o['info']['pages'][] = $options;
522
- } else {
 
523
  // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative
524
  // and pos is either 'before' or 'after', saying where this page will fit.
525
- if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) {
526
- $i = array_search($options['rid'], $o['info']['pages']);
527
- if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) {
528
 
529
  // then there is a match
530
  // make a space
531
- switch ($options['pos']) {
532
- case 'before':
533
- $k = $i;
534
- break;
535
 
536
- case 'after':
537
- $k = $i+1;
538
- break;
539
 
540
- default:
541
- $k = -1;
542
- break;
543
  }
544
 
545
- if ($k >= 0) {
546
- for ($j = count($o['info']['pages']) -1;$j >= $k;$j--) {
547
  $o['info']['pages'][$j+1] = $o['info']['pages'][$j];
548
  }
549
 
@@ -554,83 +555,84 @@ class Cpdf {
554
  }
555
  break;
556
 
557
- case 'procset':
558
  $o['info']['procset'] = $options;
559
  break;
560
 
561
- case 'mediaBox':
562
  $o['info']['mediaBox'] = $options;
563
  // which should be an array of 4 numbers
564
  $this->currentPageSize = array('width' => $options[2], 'height' => $options[3]);
565
  break;
566
 
567
- case 'font':
568
  $o['info']['fonts'][] = array('objNum'=>$options['objNum'], 'fontNum'=>$options['fontNum']);
569
  break;
570
 
571
- case 'extGState':
572
- $o['info']['extGStates'][] = array('objNum' => $options['objNum'], 'stateNum' => $options['stateNum']);
573
  break;
574
 
575
- case 'xObject':
576
  $o['info']['xObjects'][] = array('objNum'=>$options['objNum'], 'label'=>$options['label']);
577
  break;
578
 
579
- case 'out':
580
- if (count($o['info']['pages'])) {
581
  $res = "\n$id 0 obj\n<< /Type /Pages\n/Kids [";
582
- foreach($o['info']['pages'] as $v) {
583
  $res.= "$v 0 R\n";
584
  }
585
 
586
  $res.= "]\n/Count ".count($this->objects[$id]['info']['pages']);
587
 
588
- if ( (isset($o['info']['fonts']) && count($o['info']['fonts'])) ||
589
  isset($o['info']['procset']) ||
590
  (isset($o['info']['extGStates']) && count($o['info']['extGStates']))) {
591
  $res.= "\n/Resources <<";
592
 
593
- if (isset($o['info']['procset'])) {
594
  $res.= "\n/ProcSet ".$o['info']['procset']." 0 R";
595
  }
596
 
597
- if (isset($o['info']['fonts']) && count($o['info']['fonts'])) {
598
  $res.= "\n/Font << ";
599
- foreach($o['info']['fonts'] as $finfo) {
600
  $res.= "\n/F".$finfo['fontNum']." ".$finfo['objNum']." 0 R";
601
  }
602
  $res.= "\n>>";
603
  }
604
 
605
- if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) {
606
  $res.= "\n/XObject << ";
607
- foreach($o['info']['xObjects'] as $finfo) {
608
  $res.= "\n/".$finfo['label']." ".$finfo['objNum']." 0 R";
609
  }
610
  $res.= "\n>>";
611
  }
612
 
613
- if ( isset($o['info']['extGStates']) && count($o['info']['extGStates'])) {
614
- $res.= "\n/ExtGState << ";
615
  foreach ($o['info']['extGStates'] as $gstate) {
616
- $res.= "\n/GS" . $gstate['stateNum'] . " " . $gstate['objNum'] . " 0 R";
617
  }
618
- $res.= "\n>>";
619
  }
620
 
621
  $res.= "\n>>";
622
- if (isset($o['info']['mediaBox'])) {
623
  $tmp = $o['info']['mediaBox'];
624
  $res.= "\n/MediaBox [".sprintf('%.3F %.3F %.3F %.3F', $tmp[0], $tmp[1], $tmp[2], $tmp[3]) .']';
625
  }
626
  }
627
 
628
  $res.= "\n >>\nendobj";
629
- } else {
 
630
  $res = "\n$id 0 obj\n<< /Type /Pages\n/Count 0\n>>\nendobj";
631
  }
632
 
633
- return $res;
634
  }
635
  }
636
 
@@ -638,33 +640,33 @@ class Cpdf {
638
  * define the outlines in the doc, empty for now
639
  */
640
  protected function o_outlines($id, $action, $options = '') {
641
- if ($action !== 'new') {
642
- $o = & $this->objects[$id];
643
  }
644
 
645
- switch ($action) {
646
- case 'new':
647
- $this->objects[$id] = array('t'=>'outlines', 'info'=>array('outlines'=>array()));
648
- $this->o_catalog($this->catalogId, 'outlines', $id);
649
- break;
650
 
651
- case 'outline':
652
- $o['info']['outlines'][] = $options;
653
- break;
654
 
655
- case 'out':
656
- if (count($o['info']['outlines'])) {
657
- $res = "\n$id 0 obj\n<< /Type /Outlines /Kids [";
658
- foreach($o['info']['outlines'] as $v) {
659
- $res.= "$v 0 R ";
660
- }
661
 
662
- $res.= "] /Count ".count($o['info']['outlines']) ." >>\nendobj";
663
- } else {
664
- $res = "\n$id 0 obj\n<< /Type /Outlines /Count 0 >>\nendobj";
665
- }
666
 
667
- return $res;
668
  }
669
  }
670
 
@@ -672,40 +674,42 @@ class Cpdf {
672
  * an object to hold the font description
673
  */
674
  protected function o_font($id, $action, $options = '') {
675
- if ($action !== 'new') {
676
- $o = & $this->objects[$id];
677
  }
678
 
679
- switch ($action) {
680
- case 'new':
681
- $this->objects[$id] = array('t' => 'font', 'info' => array('name' => $options['name'], 'fontFileName' => $options['fontFileName'], 'SubType' => 'Type1'));
682
- $fontNum = $this->numFonts;
683
- $this->objects[$id]['info']['fontNum'] = $fontNum;
684
 
685
  // deal with the encoding and the differences
686
- if (isset($options['differences'])) {
687
  // then we'll need an encoding dictionary
688
  $this->numObj++;
689
  $this->o_fontEncoding($this->numObj, 'new', $options);
690
- $this->objects[$id]['info']['encodingDictionary'] = $this->numObj;
691
- } else if (isset($options['encoding'])) {
 
692
  // we can specify encoding here
693
  switch ($options['encoding']) {
694
- case 'WinAnsiEncoding':
695
- case 'MacRomanEncoding':
696
- case 'MacExpertEncoding':
697
- $this->objects[$id]['info']['encoding'] = $options['encoding'];
698
- break;
699
 
700
- case 'none':
701
- break;
702
 
703
- default:
704
- $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding';
705
- break;
706
  }
707
- } else {
708
- $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding';
 
709
  }
710
 
711
  if ($this->fonts[$options['fontFileName']]['isUnicode']) {
@@ -721,7 +725,7 @@ class Cpdf {
721
  $this->o_contents($toUnicodeId, 'new', 'raw');
722
  $this->objects[$id]['info']['toUnicode'] = $toUnicodeId;
723
 
724
- $stream = <<<EOT
725
  /CIDInit /ProcSet findresource begin
726
  12 dict begin
727
  begincmap
@@ -744,8 +748,8 @@ end
744
  end
745
  EOT;
746
 
747
- $res = "<</Length " . mb_strlen($stream, '8bit') . " >>\n";
748
- $res .= "stream\n" . $stream . "endstream";
749
 
750
  $this->objects[$toUnicodeId]['c'] = $res;
751
 
@@ -758,20 +762,20 @@ EOT;
758
  $this->o_pages($this->currentNode, 'font', array('fontNum' => $fontNum, 'objNum' => $id));
759
  break;
760
 
761
- case 'add':
762
  foreach ($options as $k => $v) {
763
- switch ($k) {
764
- case 'BaseFont':
765
- $o['info']['name'] = $v;
766
- break;
767
- case 'FirstChar':
768
- case 'LastChar':
769
- case 'Widths':
770
- case 'FontDescriptor':
771
- case 'SubType':
772
- $this->addMessage('o_font '.$k." : ".$v);
773
- $o['info'][$k] = $v;
774
- break;
775
  }
776
  }
777
 
@@ -781,7 +785,7 @@ EOT;
781
  }
782
  break;
783
 
784
- case 'out':
785
  if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) {
786
  // For Unicode fonts, we need to incorporate font data into
787
  // sub-sections that are linked from the primary font section.
@@ -791,50 +795,50 @@ EOT;
791
  // All of this code is adapted from the excellent changes made to
792
  // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/)
793
 
794
- $res = "\n$id 0 obj\n<</Type /Font\n/Subtype /Type0\n";
795
- $res.= "/BaseFont /".$o['info']['name']."\n";
796
 
797
  // The horizontal identity mapping for 2-byte CIDs; may be used
798
  // with CIDFonts using any Registry, Ordering, and Supplement values.
799
- $res.= "/Encoding /Identity-H\n";
800
- $res.= "/DescendantFonts [".$o['info']['cidFont']." 0 R]\n";
801
- $res.= "/ToUnicode ".$o['info']['toUnicode']." 0 R\n";
802
- $res.= ">>\n";
803
- $res.= "endobj";
804
  } else {
805
- $res = "\n$id 0 obj\n<< /Type /Font\n/Subtype /".$o['info']['SubType']."\n";
806
- $res.= "/Name /F".$o['info']['fontNum']."\n";
807
- $res.= "/BaseFont /".$o['info']['name']."\n";
808
 
809
- if (isset($o['info']['encodingDictionary'])) {
810
  // then place a reference to the dictionary
811
- $res.= "/Encoding ".$o['info']['encodingDictionary']." 0 R\n";
812
- } else if (isset($o['info']['encoding'])) {
813
  // use the specified encoding
814
- $res.= "/Encoding /".$o['info']['encoding']."\n";
815
  }
816
 
817
- if (isset($o['info']['FirstChar'])) {
818
- $res.= "/FirstChar ".$o['info']['FirstChar']."\n";
819
  }
820
 
821
- if (isset($o['info']['LastChar'])) {
822
- $res.= "/LastChar ".$o['info']['LastChar']."\n";
823
  }
824
 
825
- if (isset($o['info']['Widths'])) {
826
- $res.= "/Widths ".$o['info']['Widths']." 0 R\n";
827
  }
828
 
829
- if (isset($o['info']['FontDescriptor'])) {
830
- $res.= "/FontDescriptor ".$o['info']['FontDescriptor']." 0 R\n";
831
  }
832
 
833
- $res.= ">>\n";
834
- $res.= "endobj";
835
  }
836
 
837
- return $res;
838
  }
839
  }
840
 
@@ -842,56 +846,56 @@ EOT;
842
  * a font descriptor, needed for including additional fonts
843
  */
844
  protected function o_fontDescriptor($id, $action, $options = '') {
845
- if ($action !== 'new') {
846
  $o = & $this->objects[$id];
847
  }
848
 
849
- switch ($action) {
850
- case 'new':
851
- $this->objects[$id] = array('t'=>'fontDescriptor', 'info'=>$options);
852
- break;
853
 
854
- case 'out':
855
- $res = "\n$id 0 obj\n<< /Type /FontDescriptor\n";
856
- foreach ($o['info'] as $label => $value) {
857
- switch ($label) {
858
- case 'Ascent':
859
- case 'CapHeight':
860
- case 'Descent':
861
- case 'Flags':
862
- case 'ItalicAngle':
863
- case 'StemV':
864
- case 'AvgWidth':
865
- case 'Leading':
866
- case 'MaxWidth':
867
- case 'MissingWidth':
868
- case 'StemH':
869
- case 'XHeight':
870
- case 'CharSet':
871
- if (mb_strlen($value, '8bit')) {
872
- $res.= "/$label $value\n";
873
- }
874
 
875
- break;
876
- case 'FontFile':
877
- case 'FontFile2':
878
- case 'FontFile3':
879
- $res.= "/$label $value 0 R\n";
880
- break;
881
 
882
- case 'FontBBox':
883
- $res.= "/$label [$value[0] $value[1] $value[2] $value[3]]\n";
884
- break;
885
 
886
- case 'FontName':
887
- $res.= "/$label /$value\n";
888
- break;
 
889
  }
890
- }
891
 
892
- $res.= ">>\nendobj";
893
 
894
- return $res;
895
  }
896
  }
897
 
@@ -899,23 +903,23 @@ EOT;
899
  * the font encoding
900
  */
901
  protected function o_fontEncoding($id, $action, $options = '') {
902
- if ($action !== 'new') {
903
  $o = & $this->objects[$id];
904
  }
905
 
906
- switch ($action) {
907
- case 'new':
908
  // the options array should contain 'differences' and maybe 'encoding'
909
  $this->objects[$id] = array('t'=>'fontEncoding', 'info'=>$options);
910
  break;
911
 
912
- case 'out':
913
  $res = "\n$id 0 obj\n<< /Type /Encoding\n";
914
- if (!isset($o['info']['encoding'])) {
915
  $o['info']['encoding'] = 'WinAnsiEncoding';
916
  }
917
 
918
- if ($o['info']['encoding'] !== 'none') {
919
  $res.= "/BaseEncoding /".$o['info']['encoding']."\n";
920
  }
921
 
@@ -923,42 +927,42 @@ EOT;
923
 
924
  $onum = -100;
925
 
926
- foreach($o['info']['differences'] as $num=>$label) {
927
- if ($num != $onum+1) {
928
  // we cannot make use of consecutive numbering
929
- $res.= "\n$num /$label";
930
  } else {
931
- $res.= " /$label";
932
  }
933
 
934
  $onum = $num;
935
  }
936
 
937
  $res.= "\n]\n>>\nendobj";
938
- return $res;
939
  }
940
  }
941
 
942
- /**
943
  * a descendent cid font, needed for unicode fonts
944
  */
945
  protected function o_fontDescendentCID($id, $action, $options = '') {
946
- if ($action !== 'new') {
947
  $o = & $this->objects[$id];
948
  }
949
 
950
- switch ($action) {
951
- case 'new':
952
- $this->objects[$id] = array('t'=>'fontDescendentCID', 'info'=>$options);
953
 
954
  // we need a CID system info section
955
  $cidSystemInfoId = ++$this->numObj;
956
  $this->o_contents($cidSystemInfoId, 'new', 'raw');
957
  $this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId;
958
  $res= "<</Registry (Adobe)\n"; // A string identifying an issuer of character collections
959
- $res.= "/Ordering (UCS)\n"; // A string that uniquely names a character collection issued by a specific registry
960
- $res.= "/Supplement 0\n"; // The supplement number of the character collection.
961
- $res.= ">>";
962
  $this->objects[$cidSystemInfoId]['c'] = $res;
963
 
964
  // and a CID to GID map
@@ -967,20 +971,20 @@ EOT;
967
  $this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId;
968
  break;
969
 
970
- case 'add':
971
  foreach ($options as $k => $v) {
972
- switch ($k) {
973
- case 'BaseFont':
974
- $o['info']['name'] = $v;
975
  break;
976
 
977
- case 'FirstChar':
978
- case 'LastChar':
979
- case 'MissingWidth':
980
- case 'FontDescriptor':
981
- case 'SubType':
982
  $this->addMessage("o_fontDescendentCID $k : $v");
983
- $o['info'][$k] = $v;
984
  break;
985
  }
986
  }
@@ -989,41 +993,41 @@ EOT;
989
  $this->o_fontGIDtoCIDMap($o['info']['cidToGidMap'], 'add', $options);
990
  break;
991
 
992
- case 'out':
993
- $res = "\n$id 0 obj\n";
994
- $res.= "<</Type /Font\n";
995
- $res.= "/Subtype /CIDFontType2\n";
996
- $res.= "/BaseFont /".$o['info']['name']."\n";
997
- $res.= "/CIDSystemInfo ".$o['info']['cidSystemInfo']." 0 R\n";
998
- // if (isset($o['info']['FirstChar'])) {
999
- // $res.= "/FirstChar ".$o['info']['FirstChar']."\n";
1000
  // }
1001
 
1002
- // if (isset($o['info']['LastChar'])) {
1003
- // $res.= "/LastChar ".$o['info']['LastChar']."\n";
1004
  // }
1005
- if (isset($o['info']['FontDescriptor'])) {
1006
- $res.= "/FontDescriptor ".$o['info']['FontDescriptor']." 0 R\n";
1007
  }
1008
 
1009
- if (isset($o['info']['MissingWidth'])) {
1010
- $res.= "/DW ".$o['info']['MissingWidth']."\n";
1011
  }
1012
 
1013
- if (isset($o['info']['fontFileName']) && isset($this->fonts[$o['info']['fontFileName']]['CIDWidths'])) {
1014
  $cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths'];
1015
  $w = '';
1016
  foreach ($cid_widths as $cid => $width) {
1017
  $w .= "$cid [$width] ";
1018
  }
1019
- $res.= "/W [$w]\n";
1020
  }
1021
 
1022
- $res.= "/CIDToGIDMap ".$o['info']['cidToGidMap']." 0 R\n";
1023
- $res.= ">>\n";
1024
- $res.= "endobj";
1025
 
1026
- return $res;
1027
  }
1028
  }
1029
 
@@ -1031,16 +1035,16 @@ EOT;
1031
  * a font glyph to character map, needed for unicode fonts
1032
  */
1033
  protected function o_fontGIDtoCIDMap($id, $action, $options = '') {
1034
- if ($action !== 'new') {
1035
  $o = & $this->objects[$id];
1036
  }
1037
 
1038
- switch ($action) {
1039
- case 'new':
1040
- $this->objects[$id] = array('t'=>'fontGIDtoCIDMap', 'info'=>$options);
1041
  break;
1042
 
1043
- case 'out':
1044
  $res = "\n$id 0 obj\n";
1045
  $fontFileName = $o['info']['fontFileName'];
1046
  $tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']);
@@ -1048,15 +1052,15 @@ EOT;
1048
  $compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) &&
1049
  $this->fonts[$fontFileName]['CIDtoGID_Compressed'];
1050
 
1051
- if (!$compressed && isset($o['raw'])) {
1052
  $res.= $tmp;
1053
  } else {
1054
- $res.= "<<";
1055
 
1056
- if (!$compressed && $this->compressionReady && $this->options['compression']) {
1057
  // then implement ZLIB based compression on this content stream
1058
  $compressed = true;
1059
- $tmp = gzcompress($tmp, 6);
1060
  }
1061
  if ($compressed) {
1062
  $res.= "\n/Filter /FlateDecode";
@@ -1066,7 +1070,7 @@ EOT;
1066
  }
1067
 
1068
  $res.= "\nendobj";
1069
- return $res;
1070
  }
1071
  }
1072
 
@@ -1074,36 +1078,36 @@ EOT;
1074
  * the document procset, solves some problems with printing to old PS printers
1075
  */
1076
  protected function o_procset($id, $action, $options = '') {
1077
- if ($action !== 'new') {
1078
  $o = & $this->objects[$id];
1079
  }
1080
 
1081
- switch ($action) {
1082
- case 'new':
1083
- $this->objects[$id] = array('t'=>'procset', 'info'=>array('PDF'=>1, 'Text'=>1));
1084
- $this->o_pages($this->currentNode, 'procset', $id);
1085
- $this->procsetObjectId = $id;
1086
- break;
1087
 
1088
- case 'add':
1089
- // this is to add new items to the procset list, despite the fact that this is considered
1090
- // obselete, the items are required for printing to some postscript printers
1091
- switch ($options) {
1092
- case 'ImageB':
1093
- case 'ImageC':
1094
- case 'ImageI':
1095
- $o['info'][$options] = 1;
 
 
1096
  break;
1097
- }
1098
- break;
1099
 
1100
- case 'out':
1101
- $res = "\n$id 0 obj\n[";
1102
- foreach ($o['info'] as $label=>$val) {
1103
- $res.= "/$label ";
1104
- }
1105
- $res.= "]\nendobj";
1106
- return $res;
1107
  }
1108
  }
1109
 
@@ -1111,50 +1115,50 @@ EOT;
1111
  * define the document information
1112
  */
1113
  protected function o_info($id, $action, $options = '') {
1114
- if ($action !== 'new') {
1115
  $o = & $this->objects[$id];
1116
  }
1117
 
1118
- switch ($action) {
1119
- case 'new':
1120
- $this->infoObject = $id;
1121
- $date = 'D:'.@date('Ymd');
1122
- $this->objects[$id] = array('t'=>'info', 'info'=>array('Creator'=>'R and OS php pdf writer, http://www.ros.co.nz', 'CreationDate'=>$date));
1123
- break;
1124
- case 'Title':
1125
- case 'Author':
1126
- case 'Subject':
1127
- case 'Keywords':
1128
- case 'Creator':
1129
- case 'Producer':
1130
- case 'CreationDate':
1131
- case 'ModDate':
1132
- case 'Trapped':
1133
- $o['info'][$action] = $options;
1134
- break;
1135
 
1136
- case 'out':
1137
- if ($this->encrypted) {
1138
- $this->encryptInit($id);
1139
- }
1140
 
1141
- $res = "\n$id 0 obj\n<<\n";
1142
- foreach ($o['info'] as $k=>$v) {
1143
- $res.= "/$k (";
1144
- // dates must be outputted as-is, without Unicode transformations
1145
- $raw = ($k === 'CreationDate' || $k === 'ModDate');
1146
- $c = $v;
1147
 
1148
- if ($this->encrypted) {
1149
- $c = $this->ARC4($c);
1150
- }
1151
 
1152
- $res.= ($raw) ? $c : $this->filterText($c);
1153
- $res.= ")\n";
1154
- }
1155
 
1156
- $res.= ">>\nendobj";
1157
- return $res;
1158
  }
1159
  }
1160
 
@@ -1162,48 +1166,48 @@ EOT;
1162
  * an action object, used to link to URLS initially
1163
  */
1164
  protected function o_action($id, $action, $options = '') {
1165
- if ($action !== 'new') {
1166
  $o = & $this->objects[$id];
1167
  }
1168
 
1169
- switch ($action) {
1170
- case 'new':
1171
- if (is_array($options)) {
1172
- $this->objects[$id] = array('t'=>'action', 'info'=>$options, 'type'=>$options['type']);
1173
- } else {
1174
- // then assume a URI action
1175
- $this->objects[$id] = array('t'=>'action', 'info'=>$options, 'type'=>'URI');
1176
- }
1177
- break;
1178
-
1179
- case 'out':
1180
- if ($this->encrypted) {
1181
- $this->encryptInit($id);
1182
- }
1183
-
1184
- $res = "\n$id 0 obj\n<< /Type /Action";
1185
- switch ($o['type']) {
1186
- case 'ilink':
1187
- if (!isset($this->destinations[(string)$o['info']['label']])) break;
1188
-
1189
- // there will be an 'label' setting, this is the name of the destination
1190
- $res.= "\n/S /GoTo\n/D ".$this->destinations[(string)$o['info']['label']]." 0 R";
1191
  break;
1192
 
1193
- case 'URI':
1194
- $res.= "\n/S /URI\n/URI (";
1195
- if ($this->encrypted) {
1196
- $res.= $this->filterText($this->ARC4($o['info']), true, false);
1197
- } else {
1198
- $res.= $this->filterText($o['info'], true, false);
1199
  }
1200
 
1201
- $res.= ")";
1202
- break;
1203
- }
 
1204
 
1205
- $res.= "\n>>\nendobj";
1206
- return $res;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1207
  }
1208
  }
1209
 
@@ -1212,56 +1216,56 @@ EOT;
1212
  * initially will support just link annotations
1213
  */
1214
  protected function o_annotation($id, $action, $options = '') {
1215
- if ($action !== 'new') {
1216
  $o = & $this->objects[$id];
1217
  }
1218
 
1219
- switch ($action) {
1220
- case 'new':
1221
- // add the annotation to the current page
1222
- $pageId = $this->currentPage;
1223
- $this->o_page($pageId, 'annot', $id);
 
 
 
 
 
 
 
 
 
1224
 
1225
- // and add the action object which is going to be required
1226
- switch ($options['type']) {
1227
- case 'link':
1228
- $this->objects[$id] = array('t'=>'annotation', 'info'=>$options);
1229
- $this->numObj++;
1230
- $this->o_action($this->numObj, 'new', $options['url']);
1231
- $this->objects[$id]['info']['actionId'] = $this->numObj;
 
 
1232
  break;
1233
 
1234
- case 'ilink':
1235
- // this is to a named internal link
1236
- $label = $options['label'];
1237
- $this->objects[$id] = array('t'=>'annotation', 'info'=>$options);
1238
- $this->numObj++;
1239
- $this->o_action($this->numObj, 'new', array('type'=>'ilink', 'label'=>$label));
1240
- $this->objects[$id]['info']['actionId'] = $this->numObj;
1241
- break;
1242
- }
1243
- break;
1244
-
1245
- case 'out':
1246
- $res = "\n$id 0 obj\n<< /Type /Annot";
1247
- switch ($o['info']['type']) {
1248
- case 'link':
1249
- case 'ilink':
1250
- $res.= "\n/Subtype /Link";
1251
- break;
1252
- }
1253
- $res.= "\n/A ".$o['info']['actionId']." 0 R";
1254
- $res.= "\n/Border [0 0 0]";
1255
- $res.= "\n/H /I";
1256
- $res.= "\n/Rect [ ";
1257
 
1258
- foreach($o['info']['rect'] as $v) {
1259
- $res.= sprintf("%.4F ", $v);
1260
- }
1261
 
1262
- $res.= "]";
1263
- $res.= "\n>>\nendobj";
1264
- return $res;
1265
  }
1266
  }
1267
 
@@ -1269,16 +1273,16 @@ EOT;
1269
  * a page object, it also creates a contents object to hold its contents
1270
  */
1271
  protected function o_page($id, $action, $options = '') {
1272
- if ($action !== 'new') {
1273
  $o = & $this->objects[$id];
1274
  }
1275
 
1276
- switch ($action) {
1277
- case 'new':
1278
  $this->numPages++;
1279
  $this->objects[$id] = array('t'=>'page', 'info'=>array('parent'=>$this->currentNode, 'pageNum'=>$this->numPages));
1280
 
1281
- if (is_array($options)) {
1282
  // then this must be a page insertion, array should contain 'rid','pos'=[before|after]
1283
  $options['id'] = $id;
1284
  $this->o_pages($this->currentNode, 'page', $options);
@@ -1294,21 +1298,21 @@ EOT;
1294
  $this->objects[$id]['info']['contents'] = array();
1295
  $this->objects[$id]['info']['contents'][] = $this->numObj;
1296
 
1297
- $match = ($this->numPages%2 ? 'odd' : 'even');
1298
- foreach($this->addLooseObjects as $oId=>$target) {
1299
- if ($target === 'all' || $match === $target) {
1300
  $this->objects[$id]['info']['contents'][] = $oId;
1301
  }
1302
  }
1303
  break;
1304
 
1305
- case 'content':
1306
  $o['info']['contents'][] = $options;
1307
  break;
1308
 
1309
- case 'annot':
1310
  // add an annotation to this page
1311
- if (!isset($o['info']['annot'])) {
1312
  $o['info']['annot'] = array();
1313
  }
1314
 
@@ -1316,22 +1320,22 @@ EOT;
1316
  $o['info']['annot'][] = $options;
1317
  break;
1318
 
1319
- case 'out':
1320
  $res = "\n$id 0 obj\n<< /Type /Page";
1321
  $res.= "\n/Parent ".$o['info']['parent']." 0 R";
1322
 
1323
- if (isset($o['info']['annot'])) {
1324
  $res.= "\n/Annots [";
1325
- foreach($o['info']['annot'] as $aId) {
1326
  $res.= " $aId 0 R";
1327
  }
1328
  $res.= " ]";
1329
  }
1330
 
1331
- $count = count($o['info']['contents']);
1332
- if ($count == 1) {
1333
  $res.= "\n/Contents ".$o['info']['contents'][0]." 0 R";
1334
- } else if ($count>1) {
1335
  $res.= "\n/Contents [\n";
1336
 
1337
  // reverse the page contents so added objects are below normal content
@@ -1344,7 +1348,7 @@ EOT;
1344
  }
1345
 
1346
  $res.= "\n>>\nendobj";
1347
- return $res;
1348
  }
1349
  }
1350
 
@@ -1352,101 +1356,101 @@ EOT;
1352
  * the contents objects hold all of the content which appears on pages
1353
  */
1354
  protected function o_contents($id, $action, $options = '') {
1355
- if ($action !== 'new') {
1356
  $o = & $this->objects[$id];
1357
  }
1358
 
1359
- switch ($action) {
1360
- case 'new':
1361
  $this->objects[$id] = array('t'=>'contents', 'c'=>'', 'info'=>array());
1362
- if (mb_strlen($options, '8bit') && intval($options)) {
1363
  // then this contents is the primary for a page
1364
  $this->objects[$id]['onPage'] = $options;
1365
- } else if ($options === 'raw') {
1366
  // then this page contains some other type of system object
1367
  $this->objects[$id]['raw'] = 1;
1368
  }
1369
  break;
1370
 
1371
- case 'add':
1372
  // add more options to the decleration
1373
  foreach ($options as $k=>$v) {
1374
  $o['info'][$k] = $v;
1375
  }
1376
 
1377
- case 'out':
1378
  $tmp = $o['c'];
1379
- $res = "\n$id 0 obj\n";
1380
 
1381
- if (isset($this->objects[$id]['raw'])) {
1382
  $res.= $tmp;
1383
  } else {
1384
- $res.= "<<";
1385
- if ($this->compressionReady && $this->options['compression']) {
1386
  // then implement ZLIB based compression on this content stream
1387
  $res.= " /Filter /FlateDecode";
1388
- $tmp = gzcompress($tmp, 6);
1389
  }
1390
 
1391
- if ($this->encrypted) {
1392
  $this->encryptInit($id);
1393
- $tmp = $this->ARC4($tmp);
1394
  }
1395
 
1396
- foreach($o['info'] as $k=>$v) {
1397
- $res.= "\n/$k $v";
1398
  }
1399
 
1400
  $res.= "\n/Length ".mb_strlen($tmp, '8bit') ." >>\nstream\n$tmp\nendstream";
1401
  }
1402
 
1403
  $res.= "\nendobj";
1404
- return $res;
1405
  }
1406
  }
1407
 
1408
- protected function o_embedjs($id, $action, $code = '') {
1409
- if ($action !== 'new') {
1410
  $o = & $this->objects[$id];
1411
  }
1412
 
1413
- switch ($action) {
1414
- case 'new':
1415
  $this->objects[$id] = array('t'=>'embedjs', 'info'=>array(
1416
  'Names' => '[(EmbeddedJS) '.($id+1).' 0 R]'
1417
  ));
1418
  break;
1419
 
1420
- case 'out':
1421
  $res = "\n$id 0 obj\n<< ";
1422
- foreach($o['info'] as $k=>$v) {
1423
- $res.= "\n/$k $v";
1424
  }
1425
  $res.= "\n>>\nendobj";
1426
- return $res;
1427
  }
1428
  }
1429
 
1430
  protected function o_javascript($id, $action, $code = '') {
1431
- if ($action !== 'new') {
1432
  $o = & $this->objects[$id];
1433
  }
1434
 
1435
- switch ($action) {
1436
- case 'new':
1437
  $this->objects[$id] = array('t'=>'javascript', 'info'=>array(
1438
  'S' => '/JavaScript',
1439
  'JS' => '('.$this->filterText($code).')',
1440
  ));
1441
  break;
1442
 
1443
- case 'out':
1444
  $res = "\n$id 0 obj\n<< ";
1445
- foreach($o['info'] as $k=>$v) {
1446
- $res.= "\n/$k $v";
1447
  }
1448
  $res.= "\n>>\nendobj";
1449
- return $res;
1450
  }
1451
  }
1452
 
@@ -1454,12 +1458,12 @@ EOT;
1454
  * an image object, will be an XObject in the document, includes description and data
1455
  */
1456
  protected function o_image($id, $action, $options = '') {
1457
- if ($action !== 'new') {
1458
  $o = & $this->objects[$id];
1459
  }
1460
 
1461
  switch ($action) {
1462
- case 'new':
1463
  // make the new object
1464
  $this->objects[$id] = array('t'=>'image', 'data'=>&$options['data'], 'info'=>array());
1465
 
@@ -1474,8 +1478,8 @@ EOT;
1474
  $info['SMask'] = ($this->numObj-1).' 0 R';
1475
  }
1476
 
1477
- if (!isset($options['type']) || $options['type'] === 'jpg') {
1478
- if (!isset($options['channels'])) {
1479
  $options['channels'] = 3;
1480
  }
1481
 
@@ -1493,7 +1497,7 @@ EOT;
1493
  $info['BitsPerComponent'] = 8;
1494
  }
1495
 
1496
- else if ($options['type'] === 'png') {
1497
  $info['Filter'] = '/FlateDecode';
1498
  $info['DecodeParms'] = '<< /Predictor 15 /Colors '.$options['ncolor'].' /Columns '.$options['iw'].' /BitsPerComponent '.$options['bitsPerComponent'].'>>';
1499
 
@@ -1501,21 +1505,21 @@ EOT;
1501
  $info['ColorSpace'] = '/DeviceGray';
1502
  }
1503
  else {
1504
- if (mb_strlen($options['pdata'], '8bit')) {
1505
- $tmp = ' [ /Indexed /DeviceRGB '.(mb_strlen($options['pdata'], '8bit') /3-1) .' ';
1506
  $this->numObj++;
1507
  $this->o_contents($this->numObj, 'new');
1508
  $this->objects[$this->numObj]['c'] = $options['pdata'];
1509
  $tmp.= $this->numObj.' 0 R';
1510
  $tmp.= ' ]';
1511
- $info['ColorSpace'] = $tmp;
1512
 
1513
- if (isset($options['transparency'])) {
1514
  $transparency = $options['transparency'];
1515
  switch ($transparency['type']) {
1516
- case 'indexed':
1517
  $tmp = ' [ '.$transparency['data'].' '.$transparency['data'].'] ';
1518
- $info['Mask'] = $tmp;
1519
  break;
1520
 
1521
  case 'color-key':
@@ -1529,13 +1533,13 @@ EOT;
1529
  }
1530
  }
1531
  } else {
1532
- if (isset($options['transparency'])) {
1533
  $transparency = $options['transparency'];
1534
 
1535
  switch ($transparency['type']) {
1536
- case 'indexed':
1537
  $tmp = ' [ '.$transparency['data'].' '.$transparency['data'].'] ';
1538
- $info['Mask'] = $tmp;
1539
  break;
1540
 
1541
  case 'color-key':
@@ -1563,22 +1567,22 @@ EOT;
1563
  $this->o_procset($this->procsetObjectId, 'add', 'ImageC');
1564
  break;
1565
 
1566
- case 'out':
1567
  $tmp = &$o['data'];
1568
- $res = "\n$id 0 obj\n<<";
1569
 
1570
- foreach($o['info'] as $k=>$v) {
1571
  $res.= "\n/$k $v";
1572
  }
1573
 
1574
- if ($this->encrypted) {
1575
  $this->encryptInit($id);
1576
- $tmp = $this->ARC4($tmp);
1577
  }
1578
 
1579
  $res.= "\n/Length ".mb_strlen($tmp, '8bit') .">>\nstream\n$tmp\nendstream\nendobj";
1580
 
1581
- return $res;
1582
  }
1583
  }
1584
 
@@ -1586,20 +1590,20 @@ EOT;
1586
  * graphics state object
1587
  */
1588
  protected function o_extGState($id, $action, $options = "") {
1589
- static $valid_params = array("LW", "LC", "LC", "LJ", "ML",
1590
  "D", "RI", "OP", "op", "OPM",
1591
  "Font", "BG", "BG2", "UCR",
1592
  "TR", "TR2", "HT", "FL",
1593
  "SM", "SA", "BM", "SMask",
1594
  "CA", "ca", "AIS", "TK");
1595
 
1596
- if ($action !== "new") {
1597
  $o = & $this->objects[$id];
1598
  }
1599
 
1600
- switch ($action) {
1601
  case "new":
1602
- $this->objects[$id] = array('t' => 'extGState', 'info' => $options);
1603
 
1604
  // Tell the pages about the new resource
1605
  $this->numStates++;
@@ -1610,13 +1614,13 @@ EOT;
1610
  $res = "\n$id 0 obj\n<< /Type /ExtGState\n";
1611
 
1612
  foreach ($o["info"] as $k => $v) {
1613
- if ( !in_array($k, $valid_params))
1614
  continue;
1615
- $res.= "/$k $v\n";
1616
  }
1617
 
1618
  $res.= ">>\nendobj";
1619
- return $res;
1620
  }
1621
  }
1622
 
@@ -1624,53 +1628,53 @@ EOT;
1624
  * encryption object.
1625
  */
1626
  protected function o_encryption($id, $action, $options = '') {
1627
- if ($action !== 'new') {
1628
  $o = & $this->objects[$id];
1629
  }
1630
 
1631
  switch ($action) {
1632
- case 'new':
1633
  // make the new object
1634
  $this->objects[$id] = array('t'=>'encryption', 'info'=>$options);
1635
  $this->arc4_objnum = $id;
1636
 
1637
  // figure out the additional paramaters required
1638
- $pad = chr(0x28) .chr(0xBF) .chr(0x4E) .chr(0x5E) .chr(0x4E) .chr(0x75) .chr(0x8A) .chr(0x41)
1639
  .chr(0x64) .chr(0x00) .chr(0x4E) .chr(0x56) .chr(0xFF) .chr(0xFA) .chr(0x01) .chr(0x08)
1640
  .chr(0x2E) .chr(0x2E) .chr(0x00) .chr(0xB6) .chr(0xD0) .chr(0x68) .chr(0x3E) .chr(0x80)
1641
  .chr(0x2F) .chr(0x0C) .chr(0xA9) .chr(0xFE) .chr(0x64) .chr(0x53) .chr(0x69) .chr(0x7A);
1642
 
1643
- $len = mb_strlen($options['owner'], '8bit');
1644
 
1645
- if ($len>32) {
1646
- $owner = substr($options['owner'], 0, 32);
1647
- } else if ($len<32) {
1648
- $owner = $options['owner'].substr($pad, 0, 32-$len);
1649
  } else {
1650
- $owner = $options['owner'];
1651
  }
1652
 
1653
- $len = mb_strlen($options['user'], '8bit');
1654
- if ($len>32) {
1655
- $user = substr($options['user'], 0, 32);
1656
- } else if ($len<32) {
1657
- $user = $options['user'].substr($pad, 0, 32-$len);
1658
  } else {
1659
- $user = $options['user'];
1660
  }
1661
 
1662
- $tmp = $this->md5_16($owner);
1663
- $okey = substr($tmp, 0, 5);
1664
  $this->ARC4_init($okey);
1665
  $ovalue = $this->ARC4($user);
1666
  $this->objects[$id]['info']['O'] = $ovalue;
1667
 
1668
  // now make the u value, phew.
1669
- $tmp = $this->md5_16($user.$ovalue.chr($options['p']) .chr(255) .chr(255) .chr(255) .$this->fileIdentifier);
1670
 
1671
- $ukey = substr($tmp, 0, 5);
1672
  $this->ARC4_init($ukey);
1673
- $this->encryptionKey = $ukey;
1674
  $this->encrypted = true;
1675
  $uvalue = $this->ARC4($pad);
1676
  $this->objects[$id]['info']['U'] = $uvalue;
@@ -1678,18 +1682,18 @@ EOT;
1678
  // initialize the arc4 array
1679
  break;
1680
 
1681
- case 'out':
1682
- $res = "\n$id 0 obj\n<<";
1683
  $res.= "\n/Filter /Standard";
1684
  $res.= "\n/V 1";
1685
  $res.= "\n/R 2";
1686
  $res.= "\n/O (".$this->filterText($o['info']['O'], true, false) .')';
1687
  $res.= "\n/U (".$this->filterText($o['info']['U'], true, false) .')';
1688
  // and the p-value needs to be converted to account for the twos-complement approach
1689
- $o['info']['p'] = (($o['info']['p']^255) +1) *-1;
1690
  $res.= "\n/P ".($o['info']['p']);
1691
  $res.= "\n>>\nendobj";
1692
- return $res;
1693
  }
1694
  }
1695
 
@@ -1702,25 +1706,25 @@ EOT;
1702
  * calculate the 16 byte version of the 128 bit md5 digest of the string
1703
  */
1704
  function md5_16($string) {
1705
- $tmp = md5($string);
1706
  $out = '';
1707
- for ($i = 0;$i <= 30;$i = $i+2) {
1708
  $out.= chr(hexdec(substr($tmp, $i, 2)));
1709
  }
1710
- return $out;
1711
  }
1712
 
1713
  /**
1714
  * initialize the encryption for processing a particular object
1715
  */
1716
  function encryptInit($id) {
1717
- $tmp = $this->encryptionKey;
1718
- $hex = dechex($id);
1719
- if (mb_strlen($hex, '8bit') <6) {
1720
- $hex = substr('000000', 0, 6-mb_strlen($hex, '8bit')) .$hex;
1721
  }
1722
  $tmp.= chr(hexdec(substr($hex, 4, 2))) .chr(hexdec(substr($hex, 2, 2))) .chr(hexdec(substr($hex, 0, 2))) .chr(0) .chr(0);
1723
- $key = $this->md5_16($tmp);
1724
  $this->ARC4_init(substr($key, 0, 10));
1725
  }
1726
 
@@ -1728,28 +1732,28 @@ EOT;
1728
  * initialize the ARC4 encryption
1729
  */
1730
  function ARC4_init($key = '') {
1731
- $this->arc4 = '';
1732
 
1733
  // setup the control array
1734
- if (mb_strlen($key, '8bit') == 0) {
1735
  return;
1736
  }
1737
 
1738
- $k = '';
1739
  while (mb_strlen($k, '8bit') <256) {
1740
  $k.= $key;
1741
  }
1742
 
1743
  $k = substr($k, 0, 256);
1744
- for ($i = 0;$i<256;$i++) {
1745
  $this->arc4.= chr($i);
1746
  }
1747
 
1748
  $j = 0;
1749
 
1750
- for ($i = 0;$i<256;$i++) {
1751
- $t = $this->arc4[$i];
1752
- $j = ($j + ord($t) + ord($k[$i])) %256;
1753
  $this->arc4[$i] = $this->arc4[$j];
1754
  $this->arc4[$j] = $t;
1755
  }
@@ -1762,18 +1766,18 @@ EOT;
1762
  $len = mb_strlen($text, '8bit');
1763
  $a = 0;
1764
  $b = 0;
1765
- $c = $this->arc4;
1766
  $out = '';
1767
- for ($i = 0;$i<$len;$i++) {
1768
- $a = ($a+1) %256;
1769
- $t = $c[$a];
1770
- $b = ($b+ord($t)) %256;
1771
  $c[$a] = $c[$b];
1772
  $c[$b] = $t;
1773
- $k = ord($c[(ord($c[$a]) +ord($c[$b])) %256]);
1774
  $out.= chr(ord($text[$i]) ^ $k);
1775
  }
1776
- return $out;
1777
  }
1778
 
1779
  /**
@@ -1785,7 +1789,7 @@ EOT;
1785
  */
1786
  function addLink($url, $x0, $y0, $x1, $y1) {
1787
  $this->numObj++;
1788
- $info = array('type'=>'link', 'url'=>$url, 'rect'=>array($x0, $y0, $x1, $y1));
1789
  $this->o_annotation($this->numObj, 'new', $info);
1790
  }
1791
 
@@ -1794,7 +1798,7 @@ EOT;
1794
  */
1795
  function addInternalLink($label, $x0, $y0, $x1, $y1) {
1796
  $this->numObj++;
1797
- $info = array('type'=>'ilink', 'label'=>$label, 'rect'=>array($x0, $y0, $x1, $y1));
1798
  $this->o_annotation($this->numObj, 'new', $info);
1799
  }
1800
 
@@ -1806,21 +1810,21 @@ EOT;
1806
  function setEncryption($userPass = '', $ownerPass = '', $pc = array()) {
1807
  $p = bindec("11000000");
1808
 
1809
- $options = array('print'=>4, 'modify'=>8, 'copy'=>16, 'add'=>32);
1810
 
1811
- foreach($pc as $k=>$v) {
1812
- if ($v && isset($options[$k])) {
1813
  $p+= $options[$k];
1814
- } else if (isset($options[$v])) {
1815
  $p+= $options[$v];
1816
  }
1817
  }
1818
 
1819
  // implement encryption on the document
1820
- if ($this->arc4_objnum == 0) {
1821
  // then the block does not exist already, add it.
1822
  $this->numObj++;
1823
- if (mb_strlen($ownerPass) == 0) {
1824
  $ownerPass = $userPass;
1825
  }
1826
 
@@ -1838,7 +1842,7 @@ EOT;
1838
  * return the pdf stream as a string returned from the function
1839
  */
1840
  function output($debug = false) {
1841
- if ($debug) {
1842
  // turn compression off
1843
  $this->options['compression'] = false;
1844
  }
@@ -1850,12 +1854,12 @@ EOT;
1850
  $this->o_embedjs($js_id, 'new');
1851
  $this->o_javascript(++$this->numObj, 'new', $this->javascript);
1852
 
1853
- $id = $this->catalogId;
1854
 
1855
  $this->o_catalog($id, 'javascript', $js_id);
1856
  }
1857
 
1858
- if ($this->arc4_objnum) {
1859
  $this->ARC4_init($this->encryptionKey);
1860
  }
1861
 
@@ -1866,7 +1870,7 @@ EOT;
1866
  $content = '%PDF-1.3';
1867
  $pos = mb_strlen($content, '8bit');
1868
 
1869
- foreach($this->objects as $k=>$v) {
1870
  $tmp = 'o_'.$v['t'];
1871
  $cont = $this->$tmp($k, 'out');
1872
  $content.= $cont;
@@ -1876,36 +1880,34 @@ EOT;
1876
 
1877
  $content.= "\nxref\n0 ".(count($xref) +1) ."\n0000000000 65535 f \n";
1878
 
1879
- foreach($xref as $p) {
1880
  $content.= str_pad($p, 10, "0", STR_PAD_LEFT) . " 00000 n \n";
1881
  }
1882
 
1883
  $content.= "trailer\n<<\n/Size ".(count($xref) +1) ."\n/Root 1 0 R\n/Info $this->infoObject 0 R\n";
1884
 
1885
  // if encryption has been applied to this document then add the marker for this dictionary
1886
- if ($this->arc4_objnum > 0) {
1887
- $content.= "/Encrypt $this->arc4_objnum 0 R\n";
1888
  }
1889
 
1890
- if (mb_strlen($this->fileIdentifier, '8bit')) {
1891
- $content.= "/ID[<$this->fileIdentifier><$this->fileIdentifier>]\n";
1892
  }
1893
 
1894
- $content.= ">>\nstartxref\n$pos\n%%EOF\n";
1895
 
1896
- return $content;
1897
  }
1898
 
1899
  /**
1900
  * intialize a new document
1901
  * if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum
1902
  * this function is called automatically by the constructor function
1903
- *
1904
- * @access private
1905
  */
1906
- function newDocument($pageSize = array(0, 0, 612, 792)) {
1907
  $this->numObj = 0;
1908
- $this->objects = array();
1909
 
1910
  $this->numObj++;
1911
  $this->o_catalog($this->numObj, 'new');
@@ -1917,7 +1919,7 @@ EOT;
1917
  $this->o_pages($this->numObj, 'new');
1918
 
1919
  $this->o_pages($this->numObj, 'mediaBox', $pageSize);
1920
- $this->currentNode = 3;
1921
 
1922
  $this->numObj++;
1923
  $this->o_procset($this->numObj, 'new');
@@ -1930,7 +1932,7 @@ EOT;
1930
 
1931
  // need to store the first page id as there is no way to get it to the user during
1932
  // startup
1933
- $this->firstPageId = $this->currentContents;
1934
  }
1935
 
1936
  /**
@@ -1939,16 +1941,14 @@ EOT;
1939
  * note that if a php serialized version does not exist it will try and make one, but will
1940
  * require write access to the directory to do it... it is MUCH faster to have these serialized
1941
  * files.
1942
- *
1943
- * @access private
1944
  */
1945
- function openFont($font) {
1946
  // assume that $font contains the path and file but not the extension
1947
  $pos = strrpos($font, '/');
1948
 
1949
- if ($pos === false) {
1950
- $dir = './';
1951
- $name = $font;
1952
  } else {
1953
  $dir = substr($font, 0, $pos+1);
1954
  $name = substr($font, $pos+1);
@@ -1977,11 +1977,11 @@ EOT;
1977
  $cache_name = "$metrics_name.php";
1978
  $this->addMessage("metrics: $metrics_name, cache: $cache_name");
1979
 
1980
- if (file_exists($fontcache . $cache_name)) {
1981
  $this->addMessage("openFont: php file exists $fontcache$cache_name");
1982
  $this->fonts[$font] = require($fontcache . $cache_name);
1983
 
1984
- if (!isset($this->fonts[$font]['_version_']) || $this->fonts[$font]['_version_'] != $this->fontcacheVersion) {
1985
  // if the font file is old, then clear it out and prepare for re-creation
1986
  $this->addMessage('openFont: clear out, make way for new version.');
1987
  $this->fonts[$font] = null;
@@ -1998,10 +1998,10 @@ EOT;
1998
  }
1999
  }
2000
 
2001
- if (!isset($this->fonts[$font]) && file_exists($dir . $metrics_name)) {
2002
  // then rebuild the php_<font>.afm file from the <font>.afm file
2003
  $this->addMessage("openFont: build php file from $dir$metrics_name");
2004
- $data = array();
2005
 
2006
  // 20 => 'space'
2007
  $data['codeToName'] = array();
@@ -2015,58 +2015,58 @@ EOT;
2015
  $cidtogid = str_pad('', 256*256*2, "\x00");
2016
  }
2017
 
2018
- $file = file($dir . $metrics_name);
2019
 
2020
  foreach ($file as $rowA) {
2021
  $row = trim($rowA);
2022
  $pos = strpos($row, ' ');
2023
 
2024
- if ($pos) {
2025
  // then there must be some keyword
2026
- $key = substr($row, 0, $pos);
2027
- switch ($key) {
2028
- case 'FontName':
2029
- case 'FullName':
2030
- case 'FamilyName':
2031
- case 'PostScriptName':
2032
- case 'Weight':
2033
- case 'ItalicAngle':
2034
- case 'IsFixedPitch':
2035
- case 'CharacterSet':
2036
- case 'UnderlinePosition':
2037
- case 'UnderlineThickness':
2038
- case 'Version':
2039
- case 'EncodingScheme':
2040
- case 'CapHeight':
2041
- case 'XHeight':
2042
- case 'Ascender':
2043
- case 'Descender':
2044
- case 'StdHW':
2045
- case 'StdVW':
2046
- case 'StartCharMetrics':
2047
- case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font. Otherwise it's too big.
2048
  $data[$key] = trim(substr($row, $pos));
2049
  break;
2050
 
2051
- case 'FontBBox':
2052
  $data[$key] = explode(' ', trim(substr($row, $pos)));
2053
  break;
2054
 
2055
  //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ;
2056
- case 'C': // Found in AFM files
2057
  $bits = explode(';', trim($row));
2058
  $dtmp = array();
2059
 
2060
- foreach($bits as $bit) {
2061
- $bits2 = explode(' ', trim($bit));
2062
- if (mb_strlen($bits2[0], '8bit') == 0) continue;
2063
 
2064
- if (count($bits2) >2) {
2065
  $dtmp[$bits2[0]] = array();
2066
- for ($i = 1;$i<count($bits2);$i++) {
2067
  $dtmp[$bits2[0]][] = $bits2[$i];
2068
  }
2069
- } else if (count($bits2) == 2) {
2070
  $dtmp[$bits2[0]] = $bits2[1];
2071
  }
2072
  }
@@ -2075,7 +2075,7 @@ EOT;
2075
  $n = $dtmp['N'];
2076
  $width = floatval($dtmp['WX']);
2077
 
2078
- if ($c >= 0) {
2079
  if ($c != hexdec($n)) {
2080
  $data['codeToName'][$c] = $n;
2081
  }
@@ -2084,29 +2084,29 @@ EOT;
2084
  $data['C'][$n] = $width;
2085
  }
2086
 
2087
- if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') {
2088
  $data['MissingWidth'] = $width;
2089
  }
2090
 
2091
  break;
2092
 
2093
  // U 827 ; WX 0 ; N squaresubnosp ; G 675 ;
2094
- case 'U': // Found in UFM files
2095
  if (!$data['isUnicode']) break;
2096
 
2097
  $bits = explode(';', trim($row));
2098
  $dtmp = array();
2099
 
2100
- foreach($bits as $bit) {
2101
- $bits2 = explode(' ', trim($bit));
2102
- if (mb_strlen($bits2[0], '8bit') === 0) continue;
2103
 
2104
- if (count($bits2) >2) {
2105
  $dtmp[$bits2[0]] = array();
2106
- for ($i = 1;$i<count($bits2);$i++) {
2107
  $dtmp[$bits2[0]][] = $bits2[$i];
2108
  }
2109
- } else if (count($bits2) == 2) {
2110
  $dtmp[$bits2[0]] = $bits2[1];
2111
  }
2112
  }
@@ -2116,7 +2116,7 @@ EOT;
2116
  $glyph = $dtmp['G'];
2117
  $width = floatval($dtmp['WX']);
2118
 
2119
- if ($c >= 0) {
2120
  // Set values in CID to GID map
2121
  if ($c >= 0 && $c < 0xFFFF && $glyph) {
2122
  $cidtogid[$c*2] = chr($glyph >> 8);
@@ -2131,13 +2131,13 @@ EOT;
2131
  $data['C'][$n] = $width;
2132
  }
2133
 
2134
- if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') {
2135
  $data['MissingWidth'] = $width;
2136
  }
2137
 
2138
  break;
2139
 
2140
- case 'KPX':
2141
  break; // don't include them as they are not used yet
2142
  //KPX Adieresis yacute -40
2143
  $bits = explode(' ', trim($row));
@@ -2148,10 +2148,10 @@ EOT;
2148
  }
2149
 
2150
  // echo $cidtogid; die("CIDtoGID Displayed!");
2151
- if ($this->compressionReady && $this->options['compression']) {
2152
  // then implement ZLIB based compression on CIDtoGID string
2153
  $data['CIDtoGID_Compressed'] = true;
2154
- $cidtogid = gzcompress($cidtogid, 6);
2155
  }
2156
  $data['CIDtoGID'] = base64_encode($cidtogid);
2157
  $data['_version_'] = $this->fontcacheVersion;
@@ -2165,7 +2165,7 @@ EOT;
2165
  $data = null;
2166
  }
2167
 
2168
- if (!isset($this->fonts[$font])) {
2169
  $this->addMessage("openFont: no font file found for $font. Do you need to run load_font.php?");
2170
  //echo 'Font not Found '.$font;
2171
  }
@@ -2181,123 +2181,123 @@ EOT;
2181
  * and 'differences' => an array of mappings between numbers 0->255 and character names.
2182
  *
2183
  */
2184
- function selectFont($fontName, $encoding = '', $set = true) {
2185
  $ext = substr($fontName, -4);
2186
- if ($ext === '.afm' || $ext === '.ufm') {
2187
  $fontName = substr($fontName, 0, mb_strlen($fontName)-4);
2188
  }
2189
 
2190
- if (!isset($this->fonts[$fontName])) {
2191
  $this->addMessage("selectFont: selecting - $fontName - $encoding, $set");
2192
 
2193
  // load the file
2194
  $this->openFont($fontName);
2195
 
2196
- if (isset($this->fonts[$fontName])) {
2197
  $this->numObj++;
2198
  $this->numFonts++;
2199
 
2200
  $font = &$this->fonts[$fontName];
2201
 
2202
  //$this->numFonts = md5($fontName);
2203
- $pos = strrpos($fontName, '/');
2204
  // $dir = substr($fontName,0,$pos+1);
2205
- $name = substr($fontName, $pos+1);
2206
- $options = array('name' => $name, 'fontFileName' => $fontName);
2207
 
2208
- if (is_array($encoding)) {
2209
  // then encoding and differences might be set
2210
- if (isset($encoding['encoding'])) {
2211
- $options['encoding'] = $encoding['encoding'];
2212
  }
2213
 
2214
- if (isset($encoding['differences'])) {
2215
- $options['differences'] = $encoding['differences'];
2216
  }
2217
- } else if (mb_strlen($encoding, '8bit')) {
2218
  // then perhaps only the encoding has been set
2219
- $options['encoding'] = $encoding;
2220
  }
2221
 
2222
- $fontObj = $this->numObj;
2223
  $this->o_font($this->numObj, 'new', $options);
2224
- $font['fontNum'] = $this->numFonts;
2225
 
2226
  // if this is a '.afm' font, and there is a '.pfa' file to go with it ( as there
2227
  // should be for all non-basic fonts), then load it into an object and put the
2228
  // references into the font object
2229
- $basefile = $fontName;
2230
 
2231
  $fbtype = '';
2232
- if (file_exists("$basefile.pfb")) {
2233
- $fbtype = 'pfb';
2234
  }
2235
- elseif (file_exists("$basefile.ttf")) {
2236
- $fbtype = 'ttf';
2237
  }
2238
 
2239
- $fbfile = "$basefile.$fbtype";
2240
 
2241
  // $pfbfile = substr($fontName,0,strlen($fontName)-4).'.pfb';
2242
  // $ttffile = substr($fontName,0,strlen($fontName)-4).'.ttf';
2243
  $this->addMessage('selectFont: checking for - '.$fbfile);
2244
 
2245
  // OAR - I don't understand this old check
2246
- // if (substr($fontName, -4) === '.afm' && strlen($fbtype)) {
2247
- if ($fbtype) {
2248
- $adobeFontName = isset($font['PostScriptName']) ? $font['PostScriptName'] : $font['FontName'];
2249
  // $fontObj = $this->numObj;
2250
  $this->addMessage("selectFont: adding font file - $fbfile - $adobeFontName");
2251
 
2252
  // find the array of font widths, and put that into an object.
2253
- $firstChar = -1;
2254
- $lastChar = 0;
2255
- $widths = array();
2256
  $cid_widths = array();
2257
 
2258
  foreach ($font['C'] as $num => $d) {
2259
- if (intval($num) >0 || $num == '0') {
2260
  if (!$font['isUnicode']) {
2261
  // With Unicode, widths array isn't used
2262
- if ($lastChar>0 && $num>$lastChar+1) {
2263
- for ($i = $lastChar+1;$i<$num;$i++) {
2264
- $widths[] = 0;
2265
  }
2266
  }
2267
  }
2268
 
2269
- $widths[] = $d;
2270
 
2271
  if ($font['isUnicode']) {
2272
- $cid_widths[$num] = $d;
2273
  }
2274
 
2275
- if ($firstChar == -1) {
2276
- $firstChar = $num;
2277
  }
2278
 
2279
- $lastChar = $num;
2280
  }
2281
  }
2282
 
2283
  // also need to adjust the widths for the differences array
2284
- if (isset($options['differences'])) {
2285
- foreach($options['differences'] as $charNum => $charName) {
2286
- if ($charNum > $lastChar) {
2287
  if (!$font['isUnicode']) {
2288
  // With Unicode, widths array isn't used
2289
- for ($i = $lastChar + 1; $i <= $charNum; $i++) {
2290
- $widths[] = 0;
2291
  }
2292
  }
2293
 
2294
- $lastChar = $charNum;
2295
  }
2296
 
2297
- if (isset($font['C'][$charName])) {
2298
- $widths[$charNum-$firstChar] = $font['C'][$charName];
2299
  if ($font['isUnicode']) {
2300
- $cid_widths[$charName] = $font['C'][$charName];
2301
  }
2302
  }
2303
  }
@@ -2318,14 +2318,14 @@ EOT;
2318
  $this->numObj++;
2319
  $this->o_contents($this->numObj, 'new', 'raw');
2320
  $this->objects[$this->numObj]['c'].= '['.implode(' ', $widths).']';
2321
- $widthid = $this->numObj;
2322
  }
2323
 
2324
  $missing_width = 500;
2325
  $stemV = 70;
2326
 
2327
  if (isset($font['MissingWidth'])) {
2328
- $missing_width = $font['MissingWidth'];
2329
  }
2330
  if (isset($font['StdVW'])) {
2331
  $stemV = $font['StdVW'];
@@ -2340,8 +2340,6 @@ EOT;
2340
  $data = file_get_contents($fbfile);
2341
  }
2342
  else {
2343
- require_once dirname(__FILE__)."/php-font-lib/classes/font.cls.php";
2344
-
2345
  $this->stringSubsets[$fontName][] = 32; // Force space if not in yet
2346
 
2347
  $subset = $this->stringSubsets[$fontName];
@@ -2356,7 +2354,7 @@ EOT;
2356
  $font_obj->reduce();
2357
 
2358
  // Write new font
2359
- $tmp_name = "$fbfile.tmp.".sprintf("%u", crc32(implode($subset)));
2360
  $font_obj->open($tmp_name, Font_Binary_Stream::modeWrite);
2361
  $font_obj->encode(array("OS/2"));
2362
  $font_obj->close();
@@ -2366,7 +2364,7 @@ EOT;
2366
 
2367
  // Find Unicode char map table
2368
  $subtable = null;
2369
- foreach($font_obj->getData("cmap", "subtables") as $_subtable) {
2370
  if ($_subtable["platformID"] == 0 || $_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1) {
2371
  $subtable = $_subtable;
2372
  break;
@@ -2381,8 +2379,7 @@ EOT;
2381
 
2382
  $cidtogid = str_pad('', max(array_keys($glyphIndexArray))*2+1, "\x00");
2383
  $font['CIDWidths'] = array();
2384
-
2385
- foreach($glyphIndexArray as $cid => $gid) {
2386
  if ($cid >= 0 && $cid < 0xFFFF && $gid) {
2387
  $cidtogid[$cid*2] = chr($gid >> 8);
2388
  $cidtogid[$cid*2 + 1] = chr($gid & 0xFF);
@@ -2407,24 +2404,24 @@ EOT;
2407
 
2408
  // create the font descriptor
2409
  $this->numObj++;
2410
- $fontDescriptorId = $this->numObj;
2411
 
2412
  $this->numObj++;
2413
- $pfbid = $this->numObj;
2414
 
2415
  // determine flags (more than a little flakey, hopefully will not matter much)
2416
- $flags = 0;
2417
 
2418
- if ($font['ItalicAngle'] != 0) {
2419
  $flags+= pow(2, 6);
2420
  }
2421
 
2422
- if ($font['IsFixedPitch'] === 'true') {
2423
  $flags+= 1;
2424
  }
2425
 
2426
  $flags+= pow(2, 5); // assume non-sybolic
2427
- $list = array(
2428
  'Ascent' => 'Ascender',
2429
  'CapHeight' => 'CapHeight',
2430
  'MissingWidth' => 'MissingWidth',
@@ -2432,22 +2429,22 @@ EOT;
2432
  'FontBBox' => 'FontBBox',
2433
  'ItalicAngle' => 'ItalicAngle'
2434
  );
2435
- $fdopt = array(
2436
  'Flags' => $flags,
2437
  'FontName' => $adobeFontName,
2438
  'StemV' => $stemV
2439
  );
2440
 
2441
- foreach($list as $k => $v) {
2442
- if (isset($font[$v])) {
2443
- $fdopt[$k] = $font[$v];
2444
  }
2445
  }
2446
 
2447
- if ($fbtype === 'pfb') {
2448
- $fdopt['FontFile'] = $pfbid;
2449
- } else if ($fbtype === 'ttf') {
2450
- $fdopt['FontFile2'] = $pfbid;
2451
  }
2452
 
2453
  $this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt);
@@ -2457,18 +2454,18 @@ EOT;
2457
  $this->objects[$pfbid]['c'].= $data;
2458
 
2459
  // determine the cruicial lengths within this file
2460
- if ($fbtype === 'pfb') {
2461
- $l1 = strpos($data, 'eexec') +6;
2462
- $l2 = strpos($data, '00000000') -$l1;
2463
- $l3 = mb_strlen($data, '8bit') -$l2-$l1;
2464
  $this->o_contents($this->numObj, 'add', array('Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3));
2465
- } else if ($fbtype == 'ttf') {
2466
- $l1 = mb_strlen($data, '8bit');
2467
  $this->o_contents($this->numObj, 'add', array('Length1' => $l1));
2468
  }
2469
 
2470
  // tell the font object about all this new stuff
2471
- $tmp = array(
2472
  'BaseFont' => $adobeFontName,
2473
  'MissingWidth' => $missing_width,
2474
  'Widths' => $widthid,
@@ -2477,13 +2474,13 @@ EOT;
2477
  'FontDescriptor' => $fontDescriptorId,
2478
  );
2479
 
2480
- if ($fbtype === 'ttf') {
2481
- $tmp['SubType'] = 'TrueType';
2482
  }
2483
 
2484
  $this->addMessage("adding extra info to font.($fontObj)");
2485
 
2486
- foreach($tmp as $fk => $fv) {
2487
  $this->addMessage("$fk : $fv");
2488
  }
2489
 
@@ -2494,25 +2491,25 @@ EOT;
2494
 
2495
  // also set the differences here, note that this means that these will take effect only the
2496
  //first time that a font is selected, else they are ignored
2497
- if (isset($options['differences'])) {
2498
- $font['differences'] = $options['differences'];
2499
  }
2500
  }
2501
  }
2502
 
2503
- if ($set && isset($this->fonts[$fontName])) {
2504
  // so if for some reason the font was not set in the last one then it will not be selected
2505
- $this->currentBaseFont = $fontName;
2506
 
2507
  // the next lines mean that if a new font is selected, then the current text state will be
2508
  // applied to it as well.
2509
- $this->currentFont = $this->currentBaseFont;
2510
- $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum'];
2511
 
2512
  //$this->setCurrentFont();
2513
  }
2514
 
2515
- return $this->currentFontNum;
2516
  //return $this->numObj;
2517
  }
2518
 
@@ -2525,10 +2522,8 @@ EOT;
2525
  * If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont
2526
  * This function will change the currentFont to whatever it should be, but will not change the
2527
  * currentBaseFont.
2528
- *
2529
- * @access private
2530
  */
2531
- function setCurrentFont() {
2532
  // if (strlen($this->currentBaseFont) == 0){
2533
  // // then assume an initial font
2534
  // $this->selectFont($this->defaultFont);
@@ -2547,8 +2542,8 @@ EOT;
2547
  // } else {
2548
  // // the this font must not have the right family member for the current state
2549
  // // simply assume the base font
2550
- $this->currentFont = $this->currentBaseFont;
2551
- $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum'];
2552
  // }
2553
  }
2554
 
@@ -2557,16 +2552,14 @@ EOT;
2557
  * startup - useful if they wish to add something to it later.
2558
  */
2559
  function getFirstPageId() {
2560
- return $this->firstPageId;
2561
  }
2562
 
2563
  /**
2564
  * add content to the currently active object
2565
- *
2566
- * @access private
2567
  */
2568
- function addContent($content) {
2569
- $this->objects[$this->currentContents]['c'].= $content;
2570
  }
2571
 
2572
  /**
@@ -2575,35 +2568,37 @@ EOT;
2575
  function setColor($color, $force = false) {
2576
  $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null);
2577
 
2578
- if (!$force && $this->currentColour == $new_color) return;
 
 
2579
 
2580
  if (isset($new_color[3])) {
2581
  $this->currentColour = $new_color;
2582
- $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F %.3F k", $this->currentColour);
2583
  }
2584
 
2585
  elseif (isset($new_color[2])) {
2586
  $this->currentColour = $new_color;
2587
- $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F rg", $this->currentColour);
2588
  }
2589
  }
2590
 
2591
  /**
2592
  * sets the colour for stroke operations
2593
  */
2594
- function setStrokeColor($color, $force = false) {
2595
  $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null);
2596
 
2597
  if (!$force && $this->currentStrokeColour == $new_color) return;
2598
 
2599
  if (isset($new_color[3])) {
2600
  $this->currentStrokeColour = $new_color;
2601
- $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F %.3F K", $this->currentStrokeColour);
2602
  }
2603
 
2604
  elseif (isset($new_color[2])) {
2605
  $this->currentStrokeColour = $new_color;
2606
- $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F RG", $this->currentStrokeColour);
2607
  }
2608
  }
2609
 
@@ -2614,8 +2609,8 @@ EOT;
2614
  // Create a new graphics state object
2615
  // FIXME: should actually keep track of states that have already been created...
2616
  $this->numObj++;
2617
- $this->o_extGState($this->numObj, 'new', $parameters);
2618
- $this->objects[ $this->currentContents ]['c'].= "\n/GS$this->numStates gs";
2619
  }
2620
 
2621
  /**
@@ -2671,18 +2666,22 @@ EOT;
2671
  "ColorDogde", "ColorBurn", "HardLight",
2672
  "SoftLight", "Difference", "Exclusion");
2673
 
2674
- if ( !in_array($mode, $blend_modes) )
2675
  $mode = "Normal";
 
2676
 
2677
  if ( $mode === $this->currentFillTransparency["mode"] &&
2678
- $opacity == $this->currentFillTransparency["opacity"] )
2679
  return;
 
2680
 
2681
  $this->currentFillTransparency["mode"] = $mode;
2682
  $this->currentFillTransparency["opacity"] = $opacity;
2683
 
2684
- $options = array("BM" => "/$mode",
2685
- "ca" => (float)$opacity);
 
 
2686
 
2687
  $this->setGraphicsState($options);
2688
  }
@@ -2690,8 +2689,12 @@ EOT;
2690
  /**
2691
  * draw a line from one set of coordinates to another
2692
  */
2693
- function line($x1, $y1, $x2, $y2) {
2694
- $this->objects[$this->currentContents]['c'] .= sprintf("\n%.3F %.3F m %.3F %.3F l S", $x1, $y1, $x2, $y2);
 
 
 
 
2695
  }
2696
 
2697
  /**
@@ -2700,22 +2703,21 @@ EOT;
2700
  function curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) {
2701
  // in the current line style, draw a bezier curve from (x0,y0) to (x3,y3) using the other two points
2702
  // as the control points for the curve.
2703
- $this->objects[$this->currentContents]['c'] .=
2704
- sprintf("\n%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c S", $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3);
2705
  }
2706
 
2707
  /**
2708
  * draw a part of an ellipse
2709
  */
2710
- function partEllipse($x0, $y0, $astart, $afinish, $r1, $r2 = 0, $angle = 0, $nSeg = 8) {
2711
  $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, false);
2712
  }
2713
 
2714
  /**
2715
  * draw a filled ellipse
2716
  */
2717
- function filledEllipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360) {
2718
- return $this->ellipse($x0, $y0, $r1, $r2 = 0, $angle, $nSeg, $astart, $afinish, true, true);
2719
  }
2720
 
2721
  /**
@@ -2725,74 +2727,79 @@ EOT;
2725
  * draws an ellipse in the current line style
2726
  * centered at $x0,$y0, radii $r1,$r2
2727
  * if $r2 is not set, then a circle is drawn
 
2728
  * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a
2729
  * pretty crappy shape at 2, as we are approximating with bezier curves.
2730
  */
2731
- function ellipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360, $close = true, $fill = false) {
2732
- if ($r1 == 0) {
2733
  return;
2734
  }
2735
 
2736
- if ($r2 == 0) {
2737
- $r2 = $r1;
2738
  }
2739
 
2740
- if ($nSeg < 2) {
2741
- $nSeg = 2;
2742
  }
2743
 
2744
- $astart = deg2rad((float)$astart);
2745
- $afinish = deg2rad((float)$afinish);
2746
  $totalAngle = $afinish-$astart;
2747
 
2748
- $dt = $totalAngle/$nSeg;
2749
- $dtm = $dt/3;
2750
 
2751
- if ($angle != 0) {
2752
- $a = -1*deg2rad((float)$angle);
2753
 
2754
- $this->objects[$this->currentContents]['c'] .=
2755
- sprintf("\n q %.3F %.3F %.3F %.3F %.3F %.3F cm", cos($a), -sin($a), sin($a), cos($a), $x0, $y0);
2756
 
2757
- $x0 = 0;
2758
- $y0 = 0;
2759
  }
2760
 
2761
- $t1 = $astart;
2762
- $a0 = $x0 + $r1*cos($t1);
2763
- $b0 = $y0 + $r2*sin($t1);
2764
- $c0 = -$r1 * sin($t1);
2765
- $d0 = $r2 * cos($t1);
2766
 
2767
- $this->objects[$this->currentContents]['c'] .= sprintf("\n%.3F %.3F m ", $a0, $b0);
2768
-
2769
- for ($i = 1; $i <= $nSeg; $i++) {
 
 
2770
  // draw this bit of the total curve
2771
- $t1 = $i * $dt + $astart;
2772
- $a1 = $x0 + $r1 * cos($t1);
2773
- $b1 = $y0 + $r2 * sin($t1);
2774
  $c1 = -$r1 * sin($t1);
2775
- $d1 = $r2 * cos($t1);
2776
 
2777
- $this->objects[$this->currentContents]['c'] .=
2778
- sprintf("\n%.3F %.3F %.3F %.3F %.3F %.3F c", ($a0+$c0*$dtm), ($b0+$d0*$dtm), ($a1-$c1*$dtm), ($b1-$d1*$dtm), $a1, $b1);
2779
 
2780
- $a0 = $a1;
2781
- $b0 = $b1;
2782
- $c0 = $c1;
2783
- $d0 = $d1;
2784
  }
2785
 
2786
- if ($fill) {
2787
- $this->objects[$this->currentContents]['c'].= ' f';
2788
- } else if ($close) {
2789
- $this->objects[$this->currentContents]['c'].= ' s'; // small 's' signifies closing the path as well
2790
- } else {
2791
- $this->objects[$this->currentContents]['c'].= ' S';
 
 
 
 
2792
  }
2793
 
2794
- if ($angle != 0) {
2795
- $this->objects[$this->currentContents]['c'].= ' Q';
2796
  }
2797
  }
2798
 
@@ -2809,48 +2816,48 @@ EOT;
2809
  * (2,1) is 2 on, 1 off, 2 on, 1 off.. etc
2810
  * phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts.
2811
  */
2812
- function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0) {
2813
  // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day
2814
- $string = '';
2815
 
2816
- if ($width>0) {
2817
- $string.= "$width w";
2818
  }
2819
 
2820
- $ca = array('butt' => 0, 'round' => 1, 'square' => 2);
2821
 
2822
- if (isset($ca[$cap])) {
2823
- $string.= " $ca[$cap] J";
2824
  }
2825
 
2826
- $ja = array('miter' => 0, 'round' => 1, 'bevel' => 2);
2827
 
2828
- if (isset($ja[$join])) {
2829
- $string.= " $ja[$join] j";
2830
  }
2831
 
2832
- if (is_array($dash)) {
2833
  $string.= ' [ ' . implode(' ', $dash) . " ] $phase d";
2834
  }
2835
 
2836
- $this->currentLineStyle = $string;
2837
- $this->objects[$this->currentContents]['c'].= "\n$string";
2838
  }
2839
 
2840
  /**
2841
  * draw a polygon, the syntax for this is similar to the GD polygon command
2842
  */
2843
  function polygon($p, $np, $f = false) {
2844
- $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F m ", $p[0], $p[1]);
2845
 
2846
- for ($i = 2; $i < $np * 2; $i = $i + 2) {
2847
- $this->objects[$this->currentContents]['c'].= sprintf("%.3F %.3F l ", $p[$i], $p[$i+1]);
2848
  }
2849
 
2850
- if ($f) {
2851
- $this->objects[$this->currentContents]['c'].= ' f';
2852
  } else {
2853
- $this->objects[$this->currentContents]['c'].= ' S';
2854
  }
2855
  }
2856
 
@@ -2859,7 +2866,7 @@ EOT;
2859
  * the coordinates of the upper-right corner
2860
  */
2861
  function filledRectangle($x1, $y1, $width, $height) {
2862
- $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F %.3F %.3F re f", $x1, $y1, $width, $height);
2863
  }
2864
 
2865
  /**
@@ -2867,7 +2874,7 @@ EOT;
2867
  * the coordinates of the upper-right corner
2868
  */
2869
  function rectangle($x1, $y1, $width, $height) {
2870
- $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F %.3F %.3F re S", $x1, $y1, $width, $height);
2871
  }
2872
 
2873
  /**
@@ -2877,14 +2884,14 @@ EOT;
2877
  // we must reset the colour cache or it will keep bad colours after clipping
2878
  $this->currentColour = null;
2879
  $this->currentStrokeColour = null;
2880
- $this->objects[$this->currentContents]['c'].= "\nq";
2881
  }
2882
 
2883
  /**
2884
  * restore the last graphic state
2885
  */
2886
  function restore() {
2887
- $this->objects[$this->currentContents]['c'].= "\nQ";
2888
  }
2889
 
2890
  /**
@@ -2892,7 +2899,44 @@ EOT;
2892
  */
2893
  function clippingRectangle($x1, $y1, $width, $height) {
2894
  $this->save();
2895
- $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F %.3F %.3F re W n", $x1, $y1, $width, $height);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2896
  }
2897
 
2898
  /**
@@ -2985,66 +3029,65 @@ EOT;
2985
  * @param array $tm transformation matrix
2986
  */
2987
  function transform($tm) {
2988
- $this->objects[$this->currentContents]['c'].=
2989
- vsprintf("\n %.3F %.3F %.3F %.3F %.3F %.3F cm", $tm);
2990
  }
2991
 
2992
  /**
2993
  * add a new page to the document
2994
  * this also makes the new page the current active object
2995
  */
2996
- function newPage($insert = 0, $id = 0, $pos = 'after') {
2997
  // if there is a state saved, then go up the stack closing them
2998
  // then on the new page, re-open them with the right setings
2999
 
3000
- if ($this->nStateStack) {
3001
- for ($i = $this->nStateStack;$i >= 1;$i--) {
3002
  $this->restoreState($i);
3003
  }
3004
  }
3005
 
3006
  $this->numObj++;
3007
 
3008
- if ($insert) {
3009
  // the id from the ezPdf class is the id of the contents of the page, not the page object itself
3010
  // query that object to find the parent
3011
- $rid = $this->objects[$id]['onPage'];
3012
- $opt = array('rid' => $rid, 'pos' => $pos);
3013
  $this->o_page($this->numObj, 'new', $opt);
3014
  } else {
3015
  $this->o_page($this->numObj, 'new');
3016
  }
3017
 
3018
  // if there is a stack saved, then put that onto the page
3019
- if ($this->nStateStack) {
3020
- for ($i = 1;$i <= $this->nStateStack;$i++) {
3021
  $this->saveState($i);
3022
  }
3023
  }
3024
 
3025
  // and if there has been a stroke or fill colour set, then transfer them
3026
- if (isset($this->currentColour)) {
3027
  $this->setColor($this->currentColour, true);
3028
  }
3029
 
3030
- if (isset($this->currentStrokeColour)) {
3031
  $this->setStrokeColor($this->currentStrokeColour, true);
3032
  }
3033
 
3034
  // if there is a line style set, then put this in too
3035
- if (mb_strlen($this->currentLineStyle, '8bit')) {
3036
- $this->objects[$this->currentContents]['c'].= "\n$this->currentLineStyle";
3037
  }
3038
 
3039
  // the call to the o_page object set currentContents to the present page, so this can be returned as the page id
3040
- return $this->currentContents;
3041
  }
3042
 
3043
  /**
3044
  * output the pdf code, streaming it to the browser
3045
  * the relevant headers are set so that hopefully the browser will recognise it
3046
  */
3047
- function stream($options = '') {
3048
  // setting the options allows the adjustment of the headers
3049
  // values at the moment are:
3050
  // 'Content-Disposition' => 'filename' - sets the filename, though not too sure how well this will
@@ -3054,31 +3097,32 @@ EOT;
3054
  // them, so I am leaving it off by default.
3055
  // 'compress' = > 1 or 0 - apply content stream compression, this is on (1) by default
3056
  // 'Attachment' => 1 or 0 - if 1, force the browser to open a download dialog
3057
- if (!is_array($options)) {
3058
- $options = array();
3059
  }
3060
 
3061
- if ( headers_sent())
3062
  die("Unable to stream pdf: headers already sent");
 
3063
 
3064
  $debug = empty($options['compression']);
3065
- $tmp = ltrim($this->output($debug));
3066
 
3067
  header("Cache-Control: private");
3068
  header("Content-type: application/pdf");
3069
 
3070
  //FIXME: I don't know that this is sufficient for determining content length (i.e. what about transport compression?)
3071
  header("Content-Length: " . mb_strlen($tmp, '8bit'));
3072
- $fileName = (isset($options['Content-Disposition']) ? $options['Content-Disposition'] : 'file.pdf');
3073
 
3074
- if ( !isset($options["Attachment"]))
3075
- $options["Attachment"] = true;
3076
 
3077
- $attachment = $options["Attachment"] ? "attachment" : "inline";
3078
 
3079
  header("Content-Disposition: $attachment; filename=\"$fileName\"");
3080
 
3081
- if (isset($options['Accept-Ranges']) && $options['Accept-Ranges'] == 1) {
3082
  //FIXME: Is this the correct value ... spec says 1#range-unit
3083
  header("Accept-Ranges: " . mb_strlen($tmp, '8bit'));
3084
  }
@@ -3091,7 +3135,7 @@ EOT;
3091
  * return the height in units of the current font in the given size
3092
  */
3093
  function getFontHeight($size) {
3094
- if (!$this->numFonts) {
3095
  $this->selectFont($this->defaultFont);
3096
  }
3097
 
@@ -3099,10 +3143,10 @@ EOT;
3099
 
3100
  // for the current font, and the given size, what is the height of the font in user units
3101
  if ( isset($font['Ascender']) && isset($font['Descender']) ) {
3102
- $h = $font['Ascender']-$font['Descender'];
3103
  }
3104
  else {
3105
- $h = $font['FontBBox'][3]-$font['FontBBox'][1];
3106
  }
3107
 
3108
  // have to adjust by a font offset for Windows fonts. unfortunately it looks like
@@ -3118,11 +3162,11 @@ EOT;
3118
  $h += (int)$font['FontHeightOffset'];
3119
  }
3120
 
3121
- return $size*$h/1000;
3122
  }
3123
 
3124
  function getFontXHeight($size) {
3125
- if (!$this->numFonts) {
3126
  $this->selectFont($this->defaultFont);
3127
  }
3128
 
@@ -3130,13 +3174,13 @@ EOT;
3130
 
3131
  // for the current font, and the given size, what is the height of the font in user units
3132
  if ( isset($font['XHeight']) ) {
3133
- $xh = $font['Ascender']-$font['Descender'];
3134
  }
3135
  else {
3136
- $xh = $this->getFontHeight($size) / 2;
3137
  }
3138
 
3139
- return $size*$xh/1000;
3140
  }
3141
 
3142
  /**
@@ -3146,14 +3190,14 @@ EOT;
3146
  */
3147
  function getFontDescender($size) {
3148
  // note that this will most likely return a negative value
3149
- if (!$this->numFonts) {
3150
  $this->selectFont($this->defaultFont);
3151
  }
3152
 
3153
  //$h = $this->fonts[$this->currentFont]['FontBBox'][1];
3154
  $h = $this->fonts[$this->currentFont]['Descender'];
3155
 
3156
- return $size*$h/1000;
3157
  }
3158
 
3159
  /**
@@ -3171,7 +3215,7 @@ EOT;
3171
  $cf = $this->currentFont;
3172
  if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) {
3173
  //$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
3174
- $text = $this->utf8toUtf16BE($text, $bom);
3175
  } else {
3176
  //$text = html_entity_decode($text, ENT_QUOTES);
3177
  $text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8');
@@ -3268,7 +3312,7 @@ EOT;
3268
  * @return string UTF-16 result string
3269
  */
3270
  function utf8toUtf16BE(&$text, $bom = true) {
3271
- $cf = $this->currentFont;
3272
  if (!$this->fonts[$cf]['isUnicode']) return $text;
3273
  $out = $bom ? "\xFE\xFF" : '';
3274
 
@@ -3287,221 +3331,22 @@ EOT;
3287
  }
3288
  return $out;
3289
  }
3290
-
3291
  /**
3292
  * given a start position and information about how text is to be laid out, calculate where
3293
  * on the page the text will end
3294
- *
3295
- * @access private
3296
  */
3297
- function PRVTgetTextPosition($x, $y, $angle, $size, $wa, $text) {
3298
  // given this information return an array containing x and y for the end position as elements 0 and 1
3299
- $w = $this->getTextWidth($size, $text);
3300
 
3301
  // need to adjust for the number of spaces in this text
3302
- $words = explode(' ', $text);
3303
- $nspaces = count($words) -1;
3304
  $w+= $wa*$nspaces;
3305
- $a = deg2rad((float)$angle);
3306
-
3307
- return array(cos($a) *$w+$x, -sin($a) *$w+$y);
3308
- }
3309
-
3310
- /**
3311
- * wrapper function for PRVTcheckTextDirective1
3312
- *
3313
- * @access private
3314
- */
3315
- function PRVTcheckTextDirective(&$text, $i, &$f) {
3316
- return 0;
3317
- $x = 0;
3318
- $y = 0;
3319
- return $this->PRVTcheckTextDirective1($text, $i, $f, 0, $x, $y);
3320
- }
3321
-
3322
- /**
3323
- * checks if the text stream contains a control directive
3324
- * if so then makes some changes and returns the number of characters involved in the directive
3325
- * this has been re-worked to include everything neccesary to find the current writing point, so that
3326
- * the location can be sent to the callback function if required
3327
- * if the directive does not require a font change, then $f should be set to 0
3328
- *
3329
- * @access private
3330
- */
3331
- function PRVTcheckTextDirective1(&$text, $i, &$f, $final, &$x, &$y, $size = 0, $angle = 0, $wordSpaceAdjust = 0) {
3332
- return 0;
3333
- $directive = 0;
3334
- $j = $i;
3335
- if ($text[$j] === '<') {
3336
- $j++;
3337
- switch ($text[$j]) {
3338
- case '/':
3339
- $j++;
3340
- if (mb_strlen($text) <= $j) {
3341
- return $directive;
3342
- }
3343
-
3344
- switch ($text[$j]) {
3345
- case 'b':
3346
- case 'i':
3347
- $j++;
3348
- if ($text[$j] === '>') {
3349
- $p = mb_strrpos($this->currentTextState, $text[$j-1]);
3350
-
3351
- if ($p !== false) {
3352
- // then there is one to remove
3353
- $this->currentTextState = mb_substr($this->currentTextState, 0, $p) .substr($this->currentTextState, $p+1);
3354
- }
3355
-
3356
- $directive = $j-$i+1;
3357
- }
3358
- break;
3359
-
3360
- case 'c':
3361
- // this this might be a callback function
3362
- $j++;
3363
- $k = mb_strpos($text, '>', $j);
3364
-
3365
- if ($k !== false && $text[$j] === ':') {
3366
- // then this will be treated as a callback directive
3367
- $directive = $k-$i+1;
3368
- $f = 0;
3369
- // split the remainder on colons to get the function name and the paramater
3370
- $tmp = mb_substr($text, $j+1, $k-$j-1);
3371
- $b1 = mb_strpos($tmp, ':');
3372
-
3373
- if ($b1 !== false) {
3374
- $func = mb_substr($tmp, 0, $b1);
3375
- $parm = mb_substr($tmp, $b1+1);
3376
- } else {
3377
- $func = $tmp;
3378
- $parm = '';
3379
- }
3380
-
3381
- if (!isset($func) || !mb_strlen(trim($func), '8bit')) {
3382
- $directive = 0;
3383
- } else {
3384
- // only call the function if this is the final call
3385
- if ($final) {
3386
- // need to assess the text position, calculate the text width to this point
3387
- // can use getTextWidth to find the text width I think
3388
- $tmp = $this->PRVTgetTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, mb_substr($text, 0, $i));
3389
-
3390
- $info = array('x' => $tmp[0], 'y' => $tmp[1], 'angle' => $angle, 'status' => 'end', 'p' => $parm, 'nCallback' => $this->nCallback);
3391
- $x = $tmp[0];
3392
- $y = $tmp[1];
3393
- $ret = $this->$func($info);
3394
-
3395
- if (is_array($ret)) {
3396
- // then the return from the callback function could set the position, to start with, later will do font colour, and font
3397
- foreach($ret as $rk => $rv) {
3398
- switch ($rk) {
3399
- case 'x':
3400
- case 'y':
3401
- $$rk = $rv;
3402
- break;
3403
- }
3404
- }
3405
- }
3406
-
3407
- // also remove from to the stack
3408
- // for simplicity, just take from the end, fix this another day
3409
- $this->nCallback--;
3410
- if ($this->nCallback<0) {
3411
- $this->nCallBack = 0;
3412
- }
3413
- }
3414
- }
3415
- }
3416
- break;
3417
- }
3418
- break;
3419
-
3420
- case 'b':
3421
- case 'i':
3422
- $j++;
3423
- if ($text[$j] === '>') {
3424
- $this->currentTextState.= $text[$j-1];
3425
- $directive = $j-$i+1;
3426
- }
3427
- break;
3428
 
3429
- case 'C':
3430
- $noClose = 1;
3431
- case 'c':
3432
- // this this might be a callback function
3433
- $j++;
3434
- $k = mb_strpos($text, '>', $j);
3435
-
3436
- if ($k !== false && $text[$j] === ':') {
3437
- // then this will be treated as a callback directive
3438
- $directive = $k-$i+1;
3439
-
3440
- $f = 0;
3441
-
3442
- // split the remainder on colons to get the function name and the paramater
3443
- // $bits = explode(':',substr($text,$j+1,$k-$j-1));
3444
- $tmp = mb_substr($text, $j+1, $k-$j-1);
3445
- $b1 = mb_strpos($tmp, ':');
3446
-
3447
- if ($b1 !== false) {
3448
- $func = mb_substr($tmp, 0, $b1);
3449
- $parm = mb_substr($tmp, $b1+1);
3450
- } else {
3451
- $func = $tmp;
3452
- $parm = '';
3453
- }
3454
-
3455
- if (!isset($func) || !mb_strlen(trim($func), '8bit')) {
3456
- $directive = 0;
3457
- } else {
3458
- // only call the function if this is the final call, ie, the one actually doing printing, not measurement
3459
- if ($final) {
3460
- // need to assess the text position, calculate the text width to this point
3461
- // can use getTextWidth to find the text width I think
3462
- // also add the text height and descender
3463
- $tmp = $this->PRVTgetTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, mb_substr($text, 0, $i));
3464
-
3465
- $info = array(
3466
- 'x' => $tmp[0],
3467
- 'y' => $tmp[1],
3468
- 'angle' => $angle,
3469
- 'status' => 'start',
3470
- 'p' => $parm,
3471
- 'f' => $func,
3472
- 'height' => $this->getFontHeight($size),
3473
- 'descender' => $this->getFontDescender($size)
3474
- );
3475
- $x = $tmp[0];
3476
- $y = $tmp[1];
3477
-
3478
- if (!isset($noClose) || !$noClose) {
3479
- // only add to the stack if this is a small 'c', therefore is a start-stop pair
3480
- $this->nCallback++;
3481
- $info['nCallback'] = $this->nCallback;
3482
- $this->callback[$this->nCallback] = $info;
3483
- }
3484
-
3485
- $ret = $this->$func($info);
3486
- if (is_array($ret)) {
3487
- // then the return from the callback function could set the position, to start with, later will do font colour, and font
3488
- foreach($ret as $rk => $rv) {
3489
- switch ($rk) {
3490
- case 'x':
3491
- case 'y':
3492
- $$rk = $rv;
3493
- break;
3494
- }
3495
- }
3496
- }
3497
- }
3498
- }
3499
- }
3500
- break;
3501
- }
3502
- }
3503
-
3504
- return $directive;
3505
  }
3506
 
3507
  /**
@@ -3516,7 +3361,7 @@ EOT;
3516
 
3517
  function concatMatches($matches) {
3518
  $str = "";
3519
- foreach($matches as $match){
3520
  $str .= $match[0];
3521
  }
3522
  return $str;
@@ -3540,8 +3385,8 @@ EOT;
3540
  /**
3541
  * add text to the document, at a specified location, size and angle on the page
3542
  */
3543
- function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false) {
3544
- if (!$this->numFonts) {
3545
  $this->selectFont($this->defaultFont);
3546
  }
3547
 
@@ -3560,89 +3405,47 @@ EOT;
3560
  }
3561
 
3562
  // if there are any open callbacks, then they should be called, to show the start of the line
3563
- if ($this->nCallback>0) {
3564
- for ($i = $this->nCallback;$i>0;$i--) {
3565
  // call each function
3566
- $info = array('x' => $x,
3567
- 'y' => $y,
3568
- 'angle' => $angle,
3569
- 'status' => 'sol',
3570
- 'p' => $this->callback[$i]['p'],
3571
- 'nCallback' => $this->callback[$i]['nCallback'],
3572
- 'height' => $this->callback[$i]['height'],
3573
- 'descender' => $this->callback[$i]['descender']);
3574
-
3575
- $func = $this->callback[$i]['f'];
 
 
3576
  $this->$func($info);
3577
  }
3578
  }
3579
 
3580
- if ($angle == 0) {
3581
- $this->objects[$this->currentContents]['c'].= sprintf("\nBT %.3F %.3F Td", $x, $y);
3582
  } else {
3583
- $a = deg2rad((float)$angle);
3584
- $this->objects[$this->currentContents]['c'].=
3585
- sprintf("\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm", cos($a), -sin($a), sin($a), cos($a), $x, $y);
3586
- }
3587
-
3588
- if ($wordSpaceAdjust != 0 || $wordSpaceAdjust != $this->wordSpaceAdjust) {
3589
- $this->wordSpaceAdjust = $wordSpaceAdjust;
3590
- $this->objects[$this->currentContents]['c'].= sprintf(" %.3F Tw", $wordSpaceAdjust);
3591
- }
3592
-
3593
- if ($charSpaceAdjust != 0 || $charSpaceAdjust != $this->charSpaceAdjust) {
3594
- $this->charSpaceAdjust = $charSpaceAdjust;
3595
- $this->objects[$this->currentContents]['c'].= sprintf(" %.3F Tc", $charSpaceAdjust);
3596
- }
3597
-
3598
- $len = mb_strlen($text);
3599
- $start = 0;
3600
-
3601
- /*
3602
- for ($i = 0;$i<$len;$i++){
3603
- $f = 1;
3604
- $directive = 0; //$this->PRVTcheckTextDirective($text,$i,$f);
3605
- if ($directive){
3606
- // then we should write what we need to
3607
- if ($i>$start){
3608
- $part = mb_substr($text,$start,$i-$start);
3609
- $this->objects[$this->currentContents]['c'] .= ' /F'.$this->currentFontNum.' '.sprintf('%.1F',$size).' Tf ';
3610
- $this->objects[$this->currentContents]['c'] .= ' ('.$this->filterText($part, false).') Tj';
3611
- }
3612
- if ($f){
3613
- // then there was nothing drastic done here, restore the contents
3614
- $this->setCurrentFont();
3615
- } else {
3616
- $this->objects[$this->currentContents]['c'] .= ' ET';
3617
- $f = 1;
3618
- $xp = $x;
3619
- $yp = $y;
3620
- $directive = 0; //$this->PRVTcheckTextDirective1($text,$i,$f,1,$xp,$yp,$size,$angle,$wordSpaceAdjust);
3621
-
3622
- // restart the text object
3623
- if ($angle == 0){
3624
- $this->objects[$this->currentContents]['c'] .= "\n".'BT '.sprintf('%.3F',$xp).' '.sprintf('%.3F',$yp).' Td';
3625
- } else {
3626
- $a = deg2rad((float)$angle);
3627
- $tmp = "\n".'BT ';
3628
- $tmp .= sprintf('%.3F',cos($a)).' '.sprintf('%.3F',(-1.0*sin($a))).' '.sprintf('%.3F',sin($a)).' '.sprintf('%.3F',cos($a)).' ';
3629
- $tmp .= sprintf('%.3F',$xp).' '.sprintf('%.3F',$yp).' Tm';
3630
- $this->objects[$this->currentContents]['c'] .= $tmp;
3631
- }
3632
- if ($wordSpaceAdjust != 0 || $wordSpaceAdjust != $this->wordSpaceAdjust){
3633
- $this->wordSpaceAdjust = $wordSpaceAdjust;
3634
- $this->objects[$this->currentContents]['c'] .= ' '.sprintf('%.3F',$wordSpaceAdjust).' Tw';
3635
- }
3636
- }
3637
- // and move the writing point to the next piece of text
3638
- $i = $i+$directive-1;
3639
- $start = $i+1;
3640
- }
3641
-
3642
- }
3643
- */
3644
- if ($start < $len) {
3645
- $part = $text; // OAR - Don't need this anymore, given that $start always equals zero. substr($text, $start);
3646
  $place_text = $this->filterText($part, false);
3647
  // modify unicode text so that extra word spacing is manually implemented (bug #)
3648
  $cf = $this->currentFont;
@@ -3651,18 +3454,18 @@ EOT;
3651
  //$place_text = str_replace(' ', ') ( ) '.($this->getTextWidth($size, chr(32), $wordSpaceAdjust)*-75).' (', $place_text);
3652
  $place_text = str_replace(' ', ' ) '.(-round($space_scale*$wordSpaceAdjust)).' (', $place_text);
3653
  }
3654
- $this->objects[$this->currentContents]['c'].= " /F$this->currentFontNum ".sprintf('%.1F Tf ', $size);
3655
- $this->objects[$this->currentContents]['c'].= " [($place_text)] TJ";
3656
  }
3657
 
3658
- $this->objects[$this->currentContents]['c'].= ' ET';
3659
 
3660
  // if there are any open callbacks, then they should be called, to show the end of the line
3661
- if ($this->nCallback>0) {
3662
- for ($i = $this->nCallback;$i>0;$i--) {
3663
  // call each function
3664
- $tmp = $this->PRVTgetTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text);
3665
- $info = array(
3666
  'x' => $tmp[0],
3667
  'y' => $tmp[1],
3668
  'angle' => $angle,
@@ -3672,7 +3475,7 @@ EOT;
3672
  'height' => $this->callback[$i]['height'],
3673
  'descender' => $this->callback[$i]['descender']
3674
  );
3675
- $func = $this->callback[$i]['f'];
3676
  $this->$func($info);
3677
  }
3678
  }
@@ -3682,13 +3485,13 @@ EOT;
3682
  * calculate how wide a given text string will be on a page, at a given size.
3683
  * this can be called externally, but is alse used by the other class functions
3684
  */
3685
- function getTextWidth($size, $text, $word_spacing = 0, $char_spacing = 0) {
3686
  static $ord_cache = array();
3687
 
3688
  // this function should not change any of the settings, though it will need to
3689
  // track any directives which change during calculation, so copy them at the start
3690
  // and put them back at the end.
3691
- $store_currentTextState = $this->currentTextState;
3692
 
3693
  if (!$this->numFonts) {
3694
  $this->selectFont($this->defaultFont);
@@ -3777,189 +3580,7 @@ EOT;
3777
  $this->currentTextState = $store_currentTextState;
3778
  $this->setCurrentFont();
3779
 
3780
- return $w*$size/1000;
3781
- }
3782
-
3783
- /**
3784
- * do a part of the calculation for sorting out the justification of the text
3785
- *
3786
- * @access private
3787
- */
3788
- function PRVTadjustWrapText($text, $actual, $width, &$x, &$adjust, $justification) {
3789
- switch ($justification) {
3790
- case 'left':
3791
- return;
3792
-
3793
- case 'right':
3794
- $x+= $width-$actual;
3795
- break;
3796
-
3797
- case 'center':
3798
- case 'centre':
3799
- $x+= ($width-$actual) /2;
3800
- break;
3801
-
3802
- case 'full':
3803
- // count the number of words
3804
- $words = explode(' ', $text);
3805
- $nspaces = count($words) -1;
3806
-
3807
- if ($nspaces>0) {
3808
- $adjust = ($width-$actual) /$nspaces;
3809
- } else {
3810
- $adjust = 0;
3811
- }
3812
- break;
3813
- }
3814
- }
3815
-
3816
- /**
3817
- * add text to the page, but ensure that it fits within a certain width
3818
- * if it does not fit then put in as much as possible, splitting at word boundaries
3819
- * and return the remainder.
3820
- * justification and angle can also be specified for the text
3821
- */
3822
- function addTextWrap($x, $y, $width, $size, $text, $justification = 'left', $angle = 0, $test = 0) {
3823
- // TODO - need to support Unicode
3824
- $cf = $this->currentFont;
3825
- if ($this->fonts[$cf]['isUnicode']) {
3826
- die("addTextWrap does not support Unicode yet!");
3827
- }
3828
-
3829
- // this will display the text, and if it goes beyond the width $width, will backtrack to the
3830
- // previous space or hyphen, and return the remainder of the text.
3831
-
3832
- // $justification can be set to 'left','right','center','centre','full'
3833
-
3834
- // need to store the initial text state, as this will change during the width calculation
3835
- // but will need to be re-set before printing, so that the chars work out right
3836
- $store_currentTextState = $this->currentTextState;
3837
-
3838
- if (!$this->numFonts) {
3839
- $this->selectFont($this->defaultFont);
3840
- }
3841
-
3842
- if ($width <= 0) {
3843
- // error, pretend it printed ok, otherwise risking a loop
3844
- return '';
3845
- }
3846
-
3847
- $w = 0;
3848
- $break = 0;
3849
- $breakWidth = 0;
3850
- $len = mb_strlen($text);
3851
- $cf = $this->currentFont;
3852
- $tw = $width/$size*1000;
3853
-
3854
- for ($i = 0;$i<$len;$i++) {
3855
- $f = 1;
3856
- $directive = 0;
3857
- //$this->PRVTcheckTextDirective($text,$i,$f);
3858
- if ($directive) {
3859
- if ($f) {
3860
- $this->setCurrentFont();
3861
- $cf = $this->currentFont;
3862
- }
3863
-
3864
- $i = $i+$directive-1;
3865
- } else {
3866
- $cOrd = ord($text[$i]);
3867
-
3868
- if (isset($this->fonts[$cf]['differences'][$cOrd])) {
3869
- // then this character is being replaced by another
3870
- $cOrd2 = $this->fonts[$cf]['differences'][$cOrd];
3871
- } else {
3872
- $cOrd2 = $cOrd;
3873
- }
3874
-
3875
- if (isset($this->fonts[$cf]['C'][$cOrd2])) {
3876
- $w+= $this->fonts[$cf]['C'][$cOrd2];
3877
- }
3878
-
3879
- if ($w>$tw) {
3880
- // then we need to truncate this line
3881
- if ($break>0) {
3882
- // then we have somewhere that we can split :)
3883
- if ($text[$break] === ' ') {
3884
- $tmp = mb_substr($text, 0, $break);
3885
- } else {
3886
- $tmp = mb_substr($text, 0, $break+1);
3887
- }
3888
-
3889
- $adjust = 0;
3890
- $this->PRVTadjustWrapText($tmp, $breakWidth, $width, $x, $adjust, $justification);
3891
-
3892
- // reset the text state
3893
- $this->currentTextState = $store_currentTextState;
3894
- $this->setCurrentFont();
3895
-
3896
- if (!$test) {
3897
- $this->addText($x, $y, $size, $tmp, $angle, $adjust);
3898
- }
3899
-
3900
- return mb_substr($text, $break+1);
3901
- } else {
3902
- // just split before the current character
3903
- $tmp = mb_substr($text, 0, $i);
3904
- $adjust = 0;
3905
- $ctmp = ord($text[$i]);
3906
-
3907
- if (isset($this->fonts[$cf]['differences'][$ctmp])) {
3908
- $ctmp = $this->fonts[$cf]['differences'][$ctmp];
3909
- }
3910
-
3911
- $tmpw = ($w-$this->fonts[$cf]['C'][$ctmp]) *$size/1000;
3912
- $this->PRVTadjustWrapText($tmp, $tmpw, $width, $x, $adjust, $justification);
3913
-
3914
- // reset the text state
3915
- $this->currentTextState = $store_currentTextState;
3916
- $this->setCurrentFont();
3917
-
3918
- if (!$test) {
3919
- $this->addText($x, $y, $size, $tmp, $angle, $adjust);
3920
- }
3921
-
3922
- return mb_substr($text, $i);
3923
- }
3924
- }
3925
-
3926
- if ($text[$i] === '-') {
3927
- $break = $i;
3928
- $breakWidth = $w*$size/1000;
3929
- }
3930
-
3931
- if ($text[$i] === ' ') {
3932
- $break = $i;
3933
- $ctmp = ord($text[$i]);
3934
-
3935
- if (isset($this->fonts[$cf]['differences'][$ctmp])) {
3936
- $ctmp = $this->fonts[$cf]['differences'][$ctmp];
3937
- }
3938
-
3939
- $breakWidth = ($w-$this->fonts[$cf]['C'][$ctmp]) *$size/1000;
3940
- }
3941
- }
3942
- }
3943
-
3944
- // then there was no need to break this line
3945
- if ($justification === 'full') {
3946
- $justification = 'left';
3947
- }
3948
-
3949
- $adjust = 0;
3950
- $tmpw = $w*$size/1000;
3951
-
3952
- $this->PRVTadjustWrapText($text, $tmpw, $width, $x, $adjust, $justification);
3953
-
3954
- // reset the text state
3955
- $this->currentTextState = $store_currentTextState;
3956
- $this->setCurrentFont();
3957
-
3958
- if (!$test) {
3959
- $this->addText($x, $y, $size, $text, $angle, $adjust);
3960
- }
3961
-
3962
- return '';
3963
  }
3964
 
3965
  /**
@@ -3968,20 +3589,20 @@ EOT;
3968
  * This is to get around not being able to have open 'q' across pages
3969
  *
3970
  */
3971
- function saveState($pageEnd = 0) {
3972
- if ($pageEnd) {
3973
  // this will be called at a new page to return the state to what it was on the
3974
  // end of the previous page, before the stack was closed down
3975
  // This is to get around not being able to have open 'q' across pages
3976
- $opt = $this->stateStack[$pageEnd];
3977
  // ok to use this as stack starts numbering at 1
3978
  $this->setColor($opt['col'], true);
3979
  $this->setStrokeColor($opt['str'], true);
3980
- $this->objects[$this->currentContents]['c'].= "\n".$opt['lin'];
3981
  // $this->currentLineStyle = $opt['lin'];
3982
  } else {
3983
  $this->nStateStack++;
3984
- $this->stateStack[$this->nStateStack] = array(
3985
  'col' => $this->currentColour,
3986
  'str' => $this->currentStrokeColour,
3987
  'lin' => $this->currentLineStyle
@@ -3994,12 +3615,12 @@ EOT;
3994
  /**
3995
  * restore a previously saved state
3996
  */
3997
- function restoreState($pageEnd = 0) {
3998
- if (!$pageEnd) {
3999
- $n = $this->nStateStack;
4000
  $this->currentColour = $this->stateStack[$n]['col'];
4001
  $this->currentStrokeColour = $this->stateStack[$n]['str'];
4002
- $this->objects[$this->currentContents]['c'].= "\n".$this->stateStack[$n]['lin'];
4003
  $this->currentLineStyle = $this->stateStack[$n]['lin'];
4004
  $this->stateStack[$n] = null;
4005
  unset($this->stateStack[$n]);
@@ -4017,14 +3638,14 @@ EOT;
4017
  */
4018
  function openObject() {
4019
  $this->nStack++;
4020
- $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage);
4021
  // add a new object of the content type, to hold the data flow
4022
  $this->numObj++;
4023
  $this->o_contents($this->numObj, 'new');
4024
- $this->currentContents = $this->numObj;
4025
- $this->looseObjects[$this->numObj] = 1;
4026
 
4027
- return $this->numObj;
4028
  }
4029
 
4030
  /**
@@ -4032,12 +3653,12 @@ EOT;
4032
  */
4033
  function reopenObject($id) {
4034
  $this->nStack++;
4035
- $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage);
4036
- $this->currentContents = $id;
4037
 
4038
  // also if this object is the primary contents for a page, then set the current page to its parent
4039
- if (isset($this->objects[$id]['onPage'])) {
4040
- $this->currentPage = $this->objects[$id]['onPage'];
4041
  }
4042
  }
4043
 
@@ -4047,9 +3668,9 @@ EOT;
4047
  function closeObject() {
4048
  // close the object, as long as there was one open in the first place, which will be indicated by
4049
  // an objectId on the stack.
4050
- if ($this->nStack>0) {
4051
- $this->currentContents = $this->stack[$this->nStack]['c'];
4052
- $this->currentPage = $this->stack[$this->nStack]['p'];
4053
  $this->nStack--;
4054
  // easier to probably not worry about removing the old entries, they will be overwritten
4055
  // if there are new ones.
@@ -4062,60 +3683,60 @@ EOT;
4062
  function stopObject($id) {
4063
  // if an object has been appearing on pages up to now, then stop it, this page will
4064
  // be the last one that could contian it.
4065
- if (isset($this->addLooseObjects[$id])) {
4066
- $this->addLooseObjects[$id] = '';
4067
  }
4068
  }
4069
 
4070
  /**
4071
  * after an object has been created, it wil only show if it has been added, using this function.
4072
  */
4073
- function addObject($id, $options = 'add') {
4074
  // add the specified object to the page
4075
- if (isset($this->looseObjects[$id]) && $this->currentContents != $id) {
4076
  // then it is a valid object, and it is not being added to itself
4077
  switch ($options) {
4078
- case 'all':
4079
  // then this object is to be added to this page (done in the next block) and
4080
  // all future new pages.
4081
- $this->addLooseObjects[$id] = 'all';
4082
 
4083
- case 'add':
4084
- if (isset($this->objects[$this->currentContents]['onPage'])) {
4085
  // then the destination contents is the primary for the page
4086
  // (though this object is actually added to that page)
4087
  $this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id);
4088
  }
4089
  break;
4090
 
4091
- case 'even':
4092
- $this->addLooseObjects[$id] = 'even';
4093
- $pageObjectId = $this->objects[$this->currentContents]['onPage'];
4094
- if ($this->objects[$pageObjectId]['info']['pageNum']%2 == 0) {
4095
  $this->addObject($id);
4096
  // hacky huh :)
4097
  }
4098
  break;
4099
 
4100
- case 'odd':
4101
- $this->addLooseObjects[$id] = 'odd';
4102
- $pageObjectId = $this->objects[$this->currentContents]['onPage'];
4103
- if ($this->objects[$pageObjectId]['info']['pageNum']%2 == 1) {
4104
  $this->addObject($id);
4105
  // hacky huh :)
4106
  }
4107
  break;
4108
 
4109
- case 'next':
4110
- $this->addLooseObjects[$id] = 'all';
4111
  break;
4112
 
4113
- case 'nexteven':
4114
- $this->addLooseObjects[$id] = 'even';
4115
  break;
4116
 
4117
- case 'nextodd':
4118
- $this->addLooseObjects[$id] = 'odd';
4119
  break;
4120
  }
4121
  }
@@ -4125,29 +3746,30 @@ EOT;
4125
  * return a storable representation of a specific object
4126
  */
4127
  function serializeObject($id) {
4128
- if ( array_key_exists($id, $this->objects))
4129
- return var_export($this->objects[$id], true);
 
4130
  }
4131
 
4132
  /**
4133
  * restore an object from its stored representation. returns its new object id.
4134
  */
4135
  function restoreSerializedObject($obj) {
4136
- $obj_id = $this->openObject();
4137
- eval('$this->objects[$obj_id] = ' . $obj . ';');
4138
  $this->closeObject();
4139
- return $obj_id;
4140
  }
4141
 
4142
  /**
4143
  * add content to the documents info object
4144
  */
4145
- function addInfo($label, $value = 0) {
4146
  // this will only work if the label is one of the valid ones.
4147
  // modify this so that arrays can be passed as well.
4148
  // if $label is an array then assume that it is key => value pairs
4149
  // else assume that they are both scalar, anything else will probably error
4150
- if (is_array($label)) {
4151
  foreach ($label as $l => $v) {
4152
  $this->o_info($this->infoObject, $l, $v);
4153
  }
@@ -4159,9 +3781,9 @@ EOT;
4159
  /**
4160
  * set the viewer preferences of the document, it is up to the browser to obey these.
4161
  */
4162
- function setPreferences($label, $value = 0) {
4163
  // this will only work if the label is one of the valid ones.
4164
- if (is_array($label)) {
4165
  foreach ($label as $l => $v) {
4166
  $this->o_catalog($this->catalogId, 'viewerPreferences', array($l => $v));
4167
  }
@@ -4172,18 +3794,16 @@ EOT;
4172
 
4173
  /**
4174
  * extract an integer from a position in a byte stream
4175
- *
4176
- * @access private
4177
  */
4178
- function PRVT_getBytes(&$data, $pos, $num) {
4179
  // return the integer represented by $num bytes from $pos within $data
4180
- $ret = 0;
4181
- for ($i = 0;$i<$num;$i++) {
4182
- $ret = $ret*256;
4183
- $ret+= ord($data[$pos+$i]);
4184
  }
4185
 
4186
- return $ret;
4187
  }
4188
 
4189
  /**
@@ -4197,17 +3817,17 @@ EOT;
4197
  /**
4198
  * add a PNG image into the document, from a GD object
4199
  * this should work with remote files
4200
- *
4201
- * @param string $file The PNG file
4202
- * @param float $x X position
4203
- * @param float $y Y position
4204
- * @param float $w Width
4205
- * @param float $h Height
4206
- * @param resource $img A GD resource
4207
- * @param bool $is_mask true if the image is a mask
4208
- * @param bool $mask true if the image is masked
4209
- */
4210
- function addImagePng($file, $x, $y, $w = 0, $h = 0, &$img, $is_mask = false, $mask = null) {
4211
  //if already cached, need not to read again
4212
  if ( isset($this->imagelist[$file]) ) {
4213
  $data = null;
@@ -4227,7 +3847,7 @@ EOT;
4227
  //default, but explicitely set to ensure pdf compatibility
4228
  imagesavealpha($img, false/*!$is_mask && !$mask*/);
4229
 
4230
- $error = 0;
4231
  //DEBUG_IMG_TEMP
4232
  //debugpng
4233
  if (DEBUGPNG) print '[addImagePng '.$file.']';
@@ -4244,7 +3864,7 @@ EOT;
4244
  if (DEBUGPNG) print 'trouble writing file from GD';
4245
  }
4246
 
4247
- if ($error) {
4248
  $this->addMessage('PNG error - ('.$file.') '.$errormsg);
4249
  return;
4250
  }
@@ -4411,7 +4031,7 @@ EOT;
4411
  * add a PNG image into the document, from a file
4412
  * this should work with remote files
4413
  */
4414
- function addPngFromFile($file, $x, $y, $w = 0, $h = 0) {
4415
  //if already cached, need not to read again
4416
  if ( isset($this->imagelist[$file]) ) {
4417
  $img = null;
@@ -4476,7 +4096,7 @@ EOT;
4476
  /**
4477
  * add a PNG image into the document, from a memory buffer of the file
4478
  */
4479
- function addPngFromBuf($file, $x, $y, $w = 0, $h = 0, &$data, $is_mask = false, $mask = null) {
4480
  if ( isset($this->imagelist[$file]) ) {
4481
  $data = null;
4482
  $info['width'] = $this->imagelist[$file]['w'];
@@ -4486,83 +4106,83 @@ EOT;
4486
 
4487
  else {
4488
  if ($data == null) {
4489
- $this->addMessage('addPngFromBuf error - ('.$imgname.') data not present!');
4490
  return;
4491
  }
4492
 
4493
- $error = 0;
4494
 
4495
- if (!$error) {
4496
- $header = chr(137) .chr(80) .chr(78) .chr(71) .chr(13) .chr(10) .chr(26) .chr(10);
4497
 
4498
- if (mb_substr($data, 0, 8, '8bit') != $header) {
4499
- $error = 1;
4500
 
4501
  if (DEBUGPNG) print '[addPngFromFile this file does not have a valid header '.$file.']';
4502
 
4503
- $errormsg = 'this file does not have a valid header';
4504
  }
4505
  }
4506
 
4507
- if (!$error) {
4508
  // set pointer
4509
- $p = 8;
4510
- $len = mb_strlen($data, '8bit');
4511
 
4512
  // cycle through the file, identifying chunks
4513
- $haveHeader = 0;
4514
- $info = array();
4515
- $idata = '';
4516
- $pdata = '';
4517
 
4518
  while ($p < $len) {
4519
- $chunkLen = $this->PRVT_getBytes($data, $p, 4);
4520
- $chunkType = mb_substr($data, $p+4, 4, '8bit');
4521
 
4522
  switch ($chunkType) {
4523
- case 'IHDR':
4524
  // this is where all the file information comes from
4525
- $info['width'] = $this->PRVT_getBytes($data, $p+8, 4);
4526
- $info['height'] = $this->PRVT_getBytes($data, $p+12, 4);
4527
- $info['bitDepth'] = ord($data[$p+16]);
4528
- $info['colorType'] = ord($data[$p+17]);
4529
- $info['compressionMethod'] = ord($data[$p+18]);
4530
- $info['filterMethod'] = ord($data[$p+19]);
4531
- $info['interlaceMethod'] = ord($data[$p+20]);
4532
 
4533
  //print_r($info);
4534
- $haveHeader = 1;
4535
- if ($info['compressionMethod'] != 0) {
4536
- $error = 1;
4537
 
4538
  //debugpng
4539
  if (DEBUGPNG) print '[addPngFromFile unsupported compression method '.$file.']';
4540
 
4541
- $errormsg = 'unsupported compression method';
4542
  }
4543
 
4544
- if ($info['filterMethod'] != 0) {
4545
- $error = 1;
4546
 
4547
  //debugpng
4548
  if (DEBUGPNG) print '[addPngFromFile unsupported filter method '.$file.']';
4549
 
4550
- $errormsg = 'unsupported filter method';
4551
  }
4552
  break;
4553
 
4554
- case 'PLTE':
4555
  $pdata.= mb_substr($data, $p+8, $chunkLen, '8bit');
4556
  break;
4557
 
4558
- case 'IDAT':
4559
  $idata.= mb_substr($data, $p+8, $chunkLen, '8bit');
4560
  break;
4561
 
4562
- case 'tRNS':
4563
  //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk
4564
  //print "tRNS found, color type = ".$info['colorType']."\n";
4565
- $transparency = array();
4566
 
4567
  switch ($info['colorType']) {
4568
  // indexed color, rbg
@@ -4574,18 +4194,16 @@ EOT;
4574
  */
4575
  // there will be one entry for each palette entry. up until the last non-opaque entry.
4576
  // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent)
4577
- $transparency['type'] = 'indexed';
4578
-
4579
- $numPalette = mb_strlen($pdata, '8bit')/3;
4580
- $trans = 0;
4581
 
4582
- for ($i = $chunkLen;$i >= 0;$i--) {
4583
- if (ord($data[$p+8+$i]) == 0) {
4584
- $trans = $i;
4585
  }
4586
  }
4587
 
4588
- $transparency['data'] = $trans;
4589
  break;
4590
 
4591
  // grayscale
@@ -4594,8 +4212,8 @@ EOT;
4594
  Gray: 2 bytes, range 0 .. (2^bitdepth)-1
4595
  */
4596
  // $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale
4597
- $transparency['type'] = 'indexed';
4598
- $transparency['data'] = ord($data[$p+8+1]);
4599
  break;
4600
 
4601
  // truecolor
@@ -4605,11 +4223,11 @@ EOT;
4605
  Green: 2 bytes, range 0 .. (2^bitdepth)-1
4606
  Blue: 2 bytes, range 0 .. (2^bitdepth)-1
4607
  */
4608
- $transparency['r'] = $this->PRVT_getBytes($data, $p+8, 2);
4609
  // r from truecolor
4610
- $transparency['g'] = $this->PRVT_getBytes($data, $p+10, 2);
4611
  // g from truecolor
4612
- $transparency['b'] = $this->PRVT_getBytes($data, $p+12, 2);
4613
  // b from truecolor
4614
 
4615
  $transparency['type'] = 'color-key';
@@ -4632,61 +4250,61 @@ EOT;
4632
  }
4633
 
4634
  if (!$haveHeader) {
4635
- $error = 1;
4636
 
4637
  //debugpng
4638
  if (DEBUGPNG) print '[addPngFromFile information header is missing '.$file.']';
4639
 
4640
- $errormsg = 'information header is missing';
4641
  }
4642
 
4643
- if (isset($info['interlaceMethod']) && $info['interlaceMethod']) {
4644
- $error = 1;
4645
 
4646
  //debugpng
4647
  if (DEBUGPNG) print '[addPngFromFile no support for interlaced images in pdf '.$file.']';
4648
 
4649
- $errormsg = 'There appears to be no support for interlaced images in pdf.';
4650
  }
4651
  }
4652
 
4653
- if (!$error && $info['bitDepth'] > 8) {
4654
- $error = 1;
4655
 
4656
  //debugpng
4657
  if (DEBUGPNG) print '[addPngFromFile bit depth of 8 or less is supported '.$file.']';
4658
 
4659
- $errormsg = 'only bit depth of 8 or less is supported';
4660
  }
4661
 
4662
- if (!$error) {
4663
- switch ($info['colorType']) {
4664
- case 3:
4665
- $color = 'DeviceRGB';
4666
- $ncolor = 1;
4667
  break;
4668
 
4669
- case 2:
4670
- $color = 'DeviceRGB';
4671
- $ncolor = 3;
4672
  break;
4673
 
4674
- case 0:
4675
- $color = 'DeviceGray';
4676
- $ncolor = 1;
4677
  break;
4678
 
4679
  default:
4680
- $error = 1;
4681
 
4682
  //debugpng
4683
  if (DEBUGPNG) print '[addPngFromFile alpha channel not supported: '.$info['colorType'].' '.$file.']';
4684
 
4685
- $errormsg = 'transparancey alpha channel not supported, transparency only supported for palette images.';
4686
  }
4687
  }
4688
 
4689
- if ($error) {
4690
  $this->addMessage('PNG error - ('.$file.') '.$errormsg);
4691
  return;
4692
  }
@@ -4694,12 +4312,12 @@ EOT;
4694
  //print_r($info);
4695
  // so this image is ok... add it in.
4696
  $this->numImages++;
4697
- $im = $this->numImages;
4698
- $label = "I$im";
4699
  $this->numObj++;
4700
 
4701
  // $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width']));
4702
- $options = array(
4703
  'label' => $label,
4704
  'data' => $idata,
4705
  'bitsPerComponent' => $info['bitDepth'],
@@ -4713,8 +4331,8 @@ EOT;
4713
  'isMask' => $is_mask,
4714
  );
4715
 
4716
- if (isset($transparency)) {
4717
- $options['transparency'] = $transparency;
4718
  }
4719
 
4720
  $this->o_image($this->numObj, 'new', $options);
@@ -4725,30 +4343,30 @@ EOT;
4725
  return;
4726
  }
4727
 
4728
- if ($w <= 0 && $h <= 0) {
4729
- $w = $info['width'];
4730
- $h = $info['height'];
4731
  }
4732
 
4733
- if ($w <= 0) {
4734
- $w = $h/$info['height']*$info['width'];
4735
  }
4736
 
4737
- if ($h <= 0) {
4738
- $h = $w*$info['height']/$info['width'];
4739
  }
4740
 
4741
- $this->objects[$this->currentContents]['c'].= sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ", $w, $h, $x, $y, $label);
4742
  }
4743
 
4744
  /**
4745
  * add a JPEG image into the document, from a file
4746
  */
4747
- function addJpegFromFile($img, $x, $y, $w = 0, $h = 0) {
4748
  // attempt to add a jpeg image straight from a file, using no GD commands
4749
  // note that this function is unable to operate on a remote file.
4750
 
4751
- if (!file_exists($img)) {
4752
  return;
4753
  }
4754
 
@@ -4764,24 +4382,24 @@ EOT;
4764
  $imageHeight = $tmp[1];
4765
 
4766
  if ( isset($tmp['channels']) ) {
4767
- $channels = $tmp['channels'];
4768
  } else {
4769
- $channels = 3;
4770
  }
4771
 
4772
- $data = file_get_contents($img);
4773
  }
4774
 
4775
- if ($w <= 0 && $h <= 0) {
4776
- $w = $imageWidth;
4777
  }
4778
 
4779
- if ($w == 0) {
4780
- $w = $h/$imageHeight*$imageWidth;
4781
  }
4782
 
4783
- if ($h == 0) {
4784
- $h = $w*$imageHeight/$imageWidth;
4785
  }
4786
 
4787
  $this->addJpegImage_common($data, $x, $y, $w, $h, $imageWidth, $imageHeight, $channels, $img);
@@ -4789,10 +4407,8 @@ EOT;
4789
 
4790
  /**
4791
  * common code used by the two JPEG adding functions
4792
- *
4793
- * @access private
4794
  */
4795
- function addJpegImage_common(&$data, $x, $y, $w = 0, $h = 0, $imageWidth, $imageHeight, $channels = 3, $imgname) {
4796
  if ( $this->image_iscached($imgname) ) {
4797
  $label = $this->imagelist[$imgname]['label'];
4798
  //debugpng
@@ -4807,8 +4423,8 @@ EOT;
4807
  // note that this function is not to be called externally
4808
  // it is just the common code between the GD and the file options
4809
  $this->numImages++;
4810
- $im = $this->numImages;
4811
- $label = "I$im";
4812
  $this->numObj++;
4813
 
4814
  $this->o_image($this->numObj, 'new', array(
@@ -4822,13 +4438,13 @@ EOT;
4822
  $this->imagelist[$imgname] = array('label' =>$label, 'w' => $imageWidth, 'h' => $imageHeight, 'c'=> $channels );
4823
  }
4824
 
4825
- $this->objects[$this->currentContents]['c'].= sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ ", $w, $h, $x, $y, $label);
4826
  }
4827
 
4828
  /**
4829
  * specify where the document should open when it first starts
4830
  */
4831
- function openHere($style, $a = 0, $b = 0, $c = 0) {
4832
  // this function will open the document at a specified page, in a specified style
4833
  // the values for style, and the required paramters are:
4834
  // 'XYZ' left, top, zoom
@@ -4841,7 +4457,7 @@ EOT;
4841
  // 'FitBV' left
4842
  $this->numObj++;
4843
  $this->o_destination($this->numObj, 'new', array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c));
4844
- $id = $this->catalogId;
4845
  $this->o_catalog($id, 'openHere', $this->numObj);
4846
  }
4847
 
@@ -4858,16 +4474,16 @@ EOT;
4858
  /**
4859
  * create a labelled destination within the document
4860
  */
4861
- function addDestination($label, $style, $a = 0, $b = 0, $c = 0) {
4862
  // associates the given label with the destination, it is done this way so that a destination can be specified after
4863
  // it has been linked to
4864
  // styles are the same as the 'openHere' function
4865
  $this->numObj++;
4866
  $this->o_destination($this->numObj, 'new', array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c));
4867
- $id = $this->numObj;
4868
 
4869
  // store the label->idf relationship, note that this means that labels can be used only once
4870
- $this->destinations["$label"] = $id;
4871
  }
4872
 
4873
  /**
@@ -4875,36 +4491,42 @@ EOT;
4875
  * and for the user to add new ones for their fonts. The default bahavious can be overridden should
4876
  * that be desired.
4877
  */
4878
- function setFontFamily($family, $options = '') {
4879
- if (!is_array($options)) {
4880
- if ($family === 'init') {
4881
  // set the known family groups
4882
  // these font families will be used to enable bold and italic markers to be included
4883
  // within text streams. html forms will be used... <b></b> <i></i>
4884
  $this->fontFamilies['Helvetica.afm'] =
4885
- array('b' => 'Helvetica-Bold.afm',
4886
- 'i' => 'Helvetica-Oblique.afm',
4887
- 'bi' => 'Helvetica-BoldOblique.afm',
4888
- 'ib' => 'Helvetica-BoldOblique.afm');
 
 
4889
 
4890
  $this->fontFamilies['Courier.afm'] =
4891
- array('b' => 'Courier-Bold.afm',
4892
- 'i' => 'Courier-Oblique.afm',
4893
- 'bi' => 'Courier-BoldOblique.afm',
4894
- 'ib' => 'Courier-BoldOblique.afm');
 
 
4895
 
4896
  $this->fontFamilies['Times-Roman.afm'] =
4897
- array('b' => 'Times-Bold.afm',
4898
- 'i' => 'Times-Italic.afm',
4899
- 'bi' => 'Times-BoldItalic.afm',
4900
- 'ib' => 'Times-BoldItalic.afm');
 
 
4901
  }
4902
  } else {
4903
 
4904
  // the user is trying to set a font family
4905
  // note that this can also be used to set the base ones to something else
4906
- if (mb_strlen($family)) {
4907
- $this->fontFamilies[$family] = $options;
4908
  }
4909
  }
4910
  }
@@ -4920,33 +4542,33 @@ EOT;
4920
  * a few functions which should allow the document to be treated transactionally.
4921
  */
4922
  function transaction($action) {
4923
- switch ($action) {
4924
  case 'start':
4925
  // store all the data away into the checkpoint variable
4926
- $data = get_object_vars($this);
4927
- $this->checkpoint = $data;
4928
  unset($data);
4929
  break;
4930
 
4931
  case 'commit':
4932
- if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) {
4933
- $tmp = $this->checkpoint['checkpoint'];
4934
- $this->checkpoint = $tmp;
4935
  unset($tmp);
4936
  } else {
4937
- $this->checkpoint = '';
4938
  }
4939
  break;
4940
 
4941
  case 'rewind':
4942
  // do not destroy the current checkpoint, but move us back to the state then, so that we can try again
4943
- if (is_array($this->checkpoint)) {
4944
  // can only abort if were inside a checkpoint
4945
- $tmp = $this->checkpoint;
4946
 
4947
  foreach ($tmp as $k => $v) {
4948
- if ($k !== 'checkpoint') {
4949
- $this->$k = $v;
4950
  }
4951
  }
4952
  unset($tmp);
@@ -4954,11 +4576,11 @@ EOT;
4954
  break;
4955
 
4956
  case 'abort':
4957
- if (is_array($this->checkpoint)) {
4958
  // can only abort if were inside a checkpoint
4959
- $tmp = $this->checkpoint;
4960
  foreach ($tmp as $k => $v) {
4961
- $this->$k = $v;
4962
  }
4963
  unset($tmp);
4964
  }
@@ -4966,4 +4588,3 @@ EOT;
4966
  }
4967
  }
4968
  }
4969
-
11
  * @author Helmut Tischer <htischer@weihenstephan.org>
12
  * @author Ryan H. Masten <ryan.masten@gmail.com>
13
  * @author Brian Sweeney <eclecticgeek@gmail.com>
14
+ * @author Fabien Ménager <fabien.menager@gmail.com>
 
15
  * @license Public Domain http://creativecommons.org/licenses/publicdomain/
16
  * @package Cpdf
17
  */
20
  /**
21
  * @var integer The current number of pdf objects in the document
22
  */
23
+ public $numObj = 0;
24
 
25
  /**
26
  * @var array This array contains all of the pdf objects, ready for final assembly
27
  */
28
+ public $objects = array();
29
 
30
  /**
31
  * @var integer The objectId (number within the objects array) of the document catalog
32
  */
33
+ public $catalogId;
34
 
35
  /**
36
  * @var array Array carrying information about the fonts that the system currently knows about
37
  * Used to ensure that a font is not loaded twice, among other things
38
  */
39
+ public $fonts = array();
40
 
41
  /**
42
  * @var string The default font metrics file to use if no other font has been loaded.
43
  * The path to the directory containing the font metrics should be included
44
  */
45
+ public $defaultFont = './fonts/Helvetica.afm';
46
 
47
  /**
48
  * @string A record of the current font
49
  */
50
+ public $currentFont = '';
51
 
52
  /**
53
  * @var string The current base font
54
  */
55
+ public $currentBaseFont = '';
56
 
57
  /**
58
  * @var integer The number of the current font within the font array
59
  */
60
+ public $currentFontNum = 0;
61
 
62
  /**
63
  * @var integer
64
  */
65
+ public $currentNode;
66
 
67
  /**
68
  * @var integer Object number of the current page
69
  */
70
+ public $currentPage;
71
 
72
  /**
73
  * @var integer Object number of the currently active contents block
74
  */
75
+ public $currentContents;
76
 
77
  /**
78
  * @var integer Number of fonts within the system
79
  */
80
+ public $numFonts = 0;
81
 
82
  /**
83
  * @var integer Number of graphic state resources used
84
  */
85
+ private $numStates = 0;
86
 
87
  /**
88
  * @var array Current colour for fill operations, defaults to inactive value,
89
  * all three components should be between 0 and 1 inclusive when active
90
  */
91
+ public $currentColour = null;
92
 
93
  /**
94
  * @var array Current colour for stroke operations (lines etc.)
95
  */
96
+ public $currentStrokeColour = null;
97
 
98
  /**
99
  * @var string Current style that lines are drawn in
100
  */
101
+ public $currentLineStyle = '';
102
 
103
  /**
104
  * @var array Current line transparency (partial graphics state)
114
  * @var array An array which is used to save the state of the document, mainly the colours and styles
115
  * it is used to temporarily change to another state, the change back to what it was before
116
  */
117
+ public $stateStack = array();
118
 
119
  /**
120
  * @var integer Number of elements within the state stack
121
  */
122
+ public $nStateStack = 0;
123
 
124
  /**
125
  * @var integer Number of page objects within the document
126
  */
127
+ public $numPages = 0;
128
 
129
  /**
130
  * @var array Object Id storage stack
131
  */
132
+ public $stack = array();
133
 
134
  /**
135
  * @var integer Number of elements within the object Id storage stack
136
  */
137
+ public $nStack = 0;
138
 
139
  /**
140
  * an array which contains information about the objects which are not firmly attached to pages
141
  * these have been added with the addObject function
142
  */
143
+ public $looseObjects = array();
144
 
145
  /**
146
  * array contains infomation about how the loose objects are to be added to the document
147
  */
148
+ public $addLooseObjects = array();
149
 
150
  /**
151
  * @var integer The objectId of the information object for the document
152
  * this contains authorship, title etc.
153
  */
154
+ public $infoObject = 0;
155
 
156
  /**
157
  * @var integer Number of images being tracked within the document
158
  */
159
+ public $numImages = 0;
160
 
161
  /**
162
  * @var array An array containing options about the document
163
  * it defaults to turning on the compression of the objects
164
  */
165
+ public $options = array('compression'=>true);
166
 
167
  /**
168
  * @var integer The objectId of the first page of the document
169
  */
170
+ public $firstPageId;
171
 
172
  /**
173
  * @var float Used to track the last used value of the inter-word spacing, this is so that it is known
174
  * when the spacing is changed.
175
  */
176
+ public $wordSpaceAdjust = 0;
177
 
178
  /**
179
  * @var float Used to track the last used value of the inter-letter spacing, this is so that it is known
180
  * when the spacing is changed.
181
  */
182
+ public $charSpaceAdjust = 0;
183
 
184
  /**
185
  * @var integer The object Id of the procset object
186
  */
187
+ public $procsetObjectId;
188
 
189
  /**
190
  * @var array Store the information about the relationship between font families
191
  * this used so that the code knows which font is the bold version of another font, etc.
192
  * the value of this array is initialised in the constuctor function.
193
  */
194
+ public $fontFamilies = array();
195
 
196
  /**
197
  * @var string Folder for php serialized formats of font metrics files.
200
  * If this folder does not exist or is not writable, Cpdf will be **much** slower.
201
  * Because of potential trouble with php safe mode, folder cannot be created at runtime.
202
  */
203
+ public $fontcache = '';
204
 
205
  /**
206
  * @var integer The version of the font metrics cache file.
207
  * This value must be manually incremented whenever the internal font data structure is modified.
208
  */
209
+ public $fontcacheVersion = 6;
210
 
211
  /**
212
  * @var string Temporary folder.
214
  * This can be passed in from class creator.
215
  * Only used for conversion of gd images to jpeg images.
216
  */
217
+ public $tmp = '';
218
 
219
  /**
220
  * @var string Track if the current font is bolded or italicised
221
  */
222
+ public $currentTextState = '';
223
 
224
  /**
225
  * @var string Messages are stored here during processing, these can be selected afterwards to give some useful debug information
226
  */
227
+ public $messages = '';
228
 
229
  /**
230
  * @var string The ancryption array for the document encryption is stored here
231
  */
232
+ public $arc4 = '';
233
 
234
  /**
235
  * @var integer The object Id of the encryption information
236
  */
237
+ public $arc4_objnum = 0;
238
 
239
  /**
240
  * @var string The file identifier, used to uniquely identify a pdf document
241
  */
242
+ public $fileIdentifier = '';
243
 
244
  /**
245
  * @var boolean A flag to say if a document is to be encrypted or not
246
  */
247
+ public $encrypted = false;
248
 
249
  /**
250
  * @var string The encryption key for the encryption of all the document content (structure is not encrypted)
251
  */
252
+ public $encryptionKey = '';
253
 
254
  /**
255
  * @var array Array which forms a stack to keep track of nested callback functions
256
  */
257
+ public $callback = array();
258
 
259
  /**
260
  * @var integer The number of callback functions in the callback array
261
  */
262
+ public $nCallback = 0;
263
 
264
  /**
265
  * @var array Store label->id pairs for named destinations, these will be used to replace internal links
266
  * done this way so that destinations can be defined after the location that links to them
267
  */
268
+ public $destinations = array();
269
 
270
  /**
271
  * @var array Store the stack for the transaction commands, each item in here is a record of the values of all the
272
  * publiciables within the class, so that the user can rollback at will (from each 'start' command)
273
  * note that this includes the objects array, so these can be large.
274
  */
275
+ public $checkpoint = '';
276
 
277
  /**
278
  * @var array Table of Image origin filenames and image labels which were already added with o_image().
279
  * Allows to merge identical images
280
  */
281
+ public $imagelist = array();
282
 
283
  /**
284
  * @var boolean Whether the text passed in should be treated as Unicode or just local character set.
285
  */
286
+ public $isUnicode = false;
287
 
288
  /**
289
  * @var string the JavaScript code of the document
290
  */
291
+ public $javascript = '';
292
 
293
  /**
294
  * @var boolean whether the compression is possible
319
  'times-roman', 'times-bold', 'times-italic', 'times-bolditalic',
320
  'symbol', 'zapfdingbats'
321
  );
322
+
323
  /**
324
+ * Class constructor
325
+ * This will start a new document
326
+ *
327
+ * @param array $pageSize Array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero.
328
+ * @param boolean $isUnicode Whether text will be treated as Unicode or not.
329
+ * @param string $fontcache The font cache folder
330
+ * @param string $tmp The temporary folder
331
  */
332
+ function __construct($pageSize = array(0, 0, 612, 792), $isUnicode = false, $fontcache = '', $tmp = '') {
333
  $this->isUnicode = $isUnicode;
334
  $this->fontcache = $fontcache;
335
  $this->tmp = $tmp;
362
  */
363
 
364
  /**
365
+ * Destination object, used to specify the location for the user to jump to, presently on opening
366
  */
367
  protected function o_destination($id, $action, $options = '') {
368
+ if ($action !== 'new') {
369
+ $o = &$this->objects[$id];
370
  }
371
 
372
  switch ($action) {
373
+ case 'new':
374
  $this->objects[$id] = array('t'=>'destination', 'info'=>array());
375
+ $tmp = '';
376
+ switch ($options['type']) {
377
+ case 'XYZ':
378
+ case 'FitR':
379
+ $tmp = ' '.$options['p3'].$tmp;
380
+ case 'FitH':
381
+ case 'FitV':
382
+ case 'FitBH':
383
+ case 'FitBV':
384
+ $tmp = ' '.$options['p1'].' '.$options['p2'].$tmp;
385
+ case 'Fit':
386
+ case 'FitB':
387
+ $tmp = $options['type'].$tmp;
388
+ $this->objects[$id]['info']['string'] = $tmp;
389
+ $this->objects[$id]['info']['page'] = $options['page'];
390
  }
391
  break;
392
 
393
+ case 'out':
394
+ $tmp = $o['info'];
395
  $res = "\n$id 0 obj\n".'['.$tmp['page'].' 0 R /'.$tmp['string']."]\nendobj";
396
+ return $res;
397
  }
398
  }
399
 
401
  * set the viewer preferences
402
  */
403
  protected function o_viewerPreferences($id, $action, $options = '') {
404
+ if ($action !== 'new') {
405
  $o = & $this->objects[$id];
406
  }
407
 
408
+ switch ($action) {
409
+ case 'new':
410
  $this->objects[$id] = array('t'=>'viewerPreferences', 'info'=>array());
411
  break;
412
 
413
+ case 'add':
414
+ foreach ($options as $k=>$v) {
415
+ switch ($k) {
416
+ case 'HideToolbar':
417
+ case 'HideMenubar':
418
+ case 'HideWindowUI':
419
+ case 'FitWindow':
420
+ case 'CenterWindow':
421
+ case 'NonFullScreenPageMode':
422
+ case 'Direction':
423
+ $o['info'][$k] = $v;
424
+ break;
425
  }
426
  }
427
  break;
428
 
429
+ case 'out':
430
  $res = "\n$id 0 obj\n<< ";
431
+ foreach ($o['info'] as $k=>$v) {
432
  $res.= "\n/$k $v";
433
  }
434
  $res.= "\n>>\n";
435
+ return $res;
436
  }
437
  }
438
 
440
  * define the document catalog, the overall controller for the document
441
  */
442
  protected function o_catalog($id, $action, $options = '') {
443
+ if ($action !== 'new') {
444
  $o = & $this->objects[$id];
445
  }
446
 
447
+ switch ($action) {
448
+ case 'new':
449
+ $this->objects[$id] = array('t'=>'catalog', 'info'=>array());
450
+ $this->catalogId = $id;
451
+ break;
452
 
453
+ case 'outlines':
454
+ case 'pages':
455
+ case 'openHere':
456
+ case 'javascript':
457
+ $o['info'][$action] = $options;
458
+ break;
459
 
460
+ case 'viewerPreferences':
461
+ if (!isset($o['info']['viewerPreferences'])) {
462
+ $this->numObj++;
463
+ $this->o_viewerPreferences($this->numObj, 'new');
464
+ $o['info']['viewerPreferences'] = $this->numObj;
465
+ }
466
 
467
+ $vp = $o['info']['viewerPreferences'];
468
+ $this->o_viewerPreferences($vp, 'add', $options);
469
 
470
+ break;
471
 
472
+ case 'out':
473
+ $res = "\n$id 0 obj\n<< /Type /Catalog";
474
 
475
+ foreach ($o['info'] as $k=>$v) {
476
+ switch ($k) {
477
+ case 'outlines':
478
+ $res.= "\n/Outlines $v 0 R";
479
+ break;
 
 
 
 
480
 
481
+ case 'pages':
482
+ $res.= "\n/Pages $v 0 R";
483
+ break;
484
 
485
+ case 'viewerPreferences':
486
+ $res.= "\n/ViewerPreferences $v 0 R";
487
+ break;
488
 
489
+ case 'openHere':
490
+ $res.= "\n/OpenAction $v 0 R";
491
+ break;
492
+
493
+ case 'javascript':
494
+ $res.= "\n/Names <</JavaScript $v 0 R>>";
495
+ break;
496
+ }
497
  }
 
498
 
499
+ $res.= " >>\nendobj";
500
+ return $res;
501
  }
502
  }
503
 
505
  * object which is a parent to the pages in the document
506
  */
507
  protected function o_pages($id, $action, $options = '') {
508
+ if ($action !== 'new') {
509
  $o = & $this->objects[$id];
510
  }
511
 
512
+ switch ($action) {
513
+ case 'new':
514
  $this->objects[$id] = array('t'=>'pages', 'info'=>array());
515
  $this->o_catalog($this->catalogId, 'pages', $id);
516
  break;
517
 
518
+ case 'page':
519
+ if (!is_array($options)) {
520
  // then it will just be the id of the new page
521
  $o['info']['pages'][] = $options;
522
+ }
523
+ else {
524
  // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative
525
  // and pos is either 'before' or 'after', saying where this page will fit.
526
+ if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) {
527
+ $i = array_search($options['rid'], $o['info']['pages']);
528
+ if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) {
529
 
530
  // then there is a match
531
  // make a space
532
+ switch ($options['pos']) {
533
+ case 'before':
534
+ $k = $i;
535
+ break;
536
 
537
+ case 'after':
538
+ $k = $i+1;
539
+ break;
540
 
541
+ default:
542
+ $k = -1;
543
+ break;
544
  }
545
 
546
+ if ($k >= 0) {
547
+ for ($j = count($o['info']['pages']) -1;$j >= $k;$j--) {
548
  $o['info']['pages'][$j+1] = $o['info']['pages'][$j];
549
  }
550
 
555
  }
556
  break;
557
 
558
+ case 'procset':
559
  $o['info']['procset'] = $options;
560
  break;
561
 
562
+ case 'mediaBox':
563
  $o['info']['mediaBox'] = $options;
564
  // which should be an array of 4 numbers
565
  $this->currentPageSize = array('width' => $options[2], 'height' => $options[3]);
566
  break;
567
 
568
+ case 'font':
569
  $o['info']['fonts'][] = array('objNum'=>$options['objNum'], 'fontNum'=>$options['fontNum']);
570
  break;
571
 
572
+ case 'extGState':
573
+ $o['info']['extGStates'][] = array('objNum' => $options['objNum'], 'stateNum' => $options['stateNum']);
574
  break;
575
 
576
+ case 'xObject':
577
  $o['info']['xObjects'][] = array('objNum'=>$options['objNum'], 'label'=>$options['label']);
578
  break;
579
 
580
+ case 'out':
581
+ if (count($o['info']['pages'])) {
582
  $res = "\n$id 0 obj\n<< /Type /Pages\n/Kids [";
583
+ foreach ($o['info']['pages'] as $v) {
584
  $res.= "$v 0 R\n";
585
  }
586
 
587
  $res.= "]\n/Count ".count($this->objects[$id]['info']['pages']);
588
 
589
+ if ( (isset($o['info']['fonts']) && count($o['info']['fonts'])) ||
590
  isset($o['info']['procset']) ||
591
  (isset($o['info']['extGStates']) && count($o['info']['extGStates']))) {
592
  $res.= "\n/Resources <<";
593
 
594
+ if (isset($o['info']['procset'])) {
595
  $res.= "\n/ProcSet ".$o['info']['procset']." 0 R";
596
  }
597
 
598
+ if (isset($o['info']['fonts']) && count($o['info']['fonts'])) {
599
  $res.= "\n/Font << ";
600
+ foreach ($o['info']['fonts'] as $finfo) {
601
  $res.= "\n/F".$finfo['fontNum']." ".$finfo['objNum']." 0 R";
602
  }
603
  $res.= "\n>>";
604
  }
605
 
606
+ if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) {
607
  $res.= "\n/XObject << ";
608
+ foreach ($o['info']['xObjects'] as $finfo) {
609
  $res.= "\n/".$finfo['label']." ".$finfo['objNum']." 0 R";
610
  }
611
  $res.= "\n>>";
612
  }
613
 
614
+ if ( isset($o['info']['extGStates']) && count($o['info']['extGStates'])) {
615
+ $res.= "\n/ExtGState << ";
616
  foreach ($o['info']['extGStates'] as $gstate) {
617
+ $res.= "\n/GS" . $gstate['stateNum'] . " " . $gstate['objNum'] . " 0 R";
618
  }
619
+ $res.= "\n>>";
620
  }
621
 
622
  $res.= "\n>>";
623
+ if (isset($o['info']['mediaBox'])) {
624
  $tmp = $o['info']['mediaBox'];
625
  $res.= "\n/MediaBox [".sprintf('%.3F %.3F %.3F %.3F', $tmp[0], $tmp[1], $tmp[2], $tmp[3]) .']';
626
  }
627
  }
628
 
629
  $res.= "\n >>\nendobj";
630
+ }
631
+ else {
632
  $res = "\n$id 0 obj\n<< /Type /Pages\n/Count 0\n>>\nendobj";
633
  }
634
 
635
+ return $res;
636
  }
637
  }
638
 
640
  * define the outlines in the doc, empty for now
641
  */
642
  protected function o_outlines($id, $action, $options = '') {
643
+ if ($action !== 'new') {
644
+ $o = &$this->objects[$id];
645
  }
646
 
647
+ switch ($action) {
648
+ case 'new':
649
+ $this->objects[$id] = array('t'=>'outlines', 'info'=>array('outlines'=>array()));
650
+ $this->o_catalog($this->catalogId, 'outlines', $id);
651
+ break;
652
 
653
+ case 'outline':
654
+ $o['info']['outlines'][] = $options;
655
+ break;
656
 
657
+ case 'out':
658
+ if (count($o['info']['outlines'])) {
659
+ $res = "\n$id 0 obj\n<< /Type /Outlines /Kids [";
660
+ foreach ($o['info']['outlines'] as $v) {
661
+ $res.= "$v 0 R ";
662
+ }
663
 
664
+ $res.= "] /Count ".count($o['info']['outlines']) ." >>\nendobj";
665
+ } else {
666
+ $res = "\n$id 0 obj\n<< /Type /Outlines /Count 0 >>\nendobj";
667
+ }
668
 
669
+ return $res;
670
  }
671
  }
672
 
674
  * an object to hold the font description
675
  */
676
  protected function o_font($id, $action, $options = '') {
677
+ if ($action !== 'new') {
678
+ $o = &$this->objects[$id];
679
  }
680
 
681
+ switch ($action) {
682
+ case 'new':
683
+ $this->objects[$id] = array('t' => 'font', 'info' => array('name' => $options['name'], 'fontFileName' => $options['fontFileName'], 'SubType' => 'Type1'));
684
+ $fontNum = $this->numFonts;
685
+ $this->objects[$id]['info']['fontNum'] = $fontNum;
686
 
687
  // deal with the encoding and the differences
688
+ if (isset($options['differences'])) {
689
  // then we'll need an encoding dictionary
690
  $this->numObj++;
691
  $this->o_fontEncoding($this->numObj, 'new', $options);
692
+ $this->objects[$id]['info']['encodingDictionary'] = $this->numObj;
693
+ }
694
+ else if (isset($options['encoding'])) {
695
  // we can specify encoding here
696
  switch ($options['encoding']) {
697
+ case 'WinAnsiEncoding':
698
+ case 'MacRomanEncoding':
699
+ case 'MacExpertEncoding':
700
+ $this->objects[$id]['info']['encoding'] = $options['encoding'];
701
+ break;
702
 
703
+ case 'none':
704
+ break;
705
 
706
+ default:
707
+ $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding';
708
+ break;
709
  }
710
+ }
711
+ else {
712
+ $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding';
713
  }
714
 
715
  if ($this->fonts[$options['fontFileName']]['isUnicode']) {
725
  $this->o_contents($toUnicodeId, 'new', 'raw');
726
  $this->objects[$id]['info']['toUnicode'] = $toUnicodeId;
727
 
728
+ $stream = <<<EOT
729
  /CIDInit /ProcSet findresource begin
730
  12 dict begin
731
  begincmap
748
  end
749
  EOT;
750
 
751
+ $res = "<</Length " . mb_strlen($stream, '8bit') . " >>\n";
752
+ $res .= "stream\n" . $stream . "endstream";
753
 
754
  $this->objects[$toUnicodeId]['c'] = $res;
755
 
762
  $this->o_pages($this->currentNode, 'font', array('fontNum' => $fontNum, 'objNum' => $id));
763
  break;
764
 
765
+ case 'add':
766
  foreach ($options as $k => $v) {
767
+ switch ($k) {
768
+ case 'BaseFont':
769
+ $o['info']['name'] = $v;
770
+ break;
771
+ case 'FirstChar':
772
+ case 'LastChar':
773
+ case 'Widths':
774
+ case 'FontDescriptor':
775
+ case 'SubType':
776
+ $this->addMessage('o_font '.$k." : ".$v);
777
+ $o['info'][$k] = $v;
778
+ break;
779
  }
780
  }
781
 
785
  }
786
  break;
787
 
788
+ case 'out':
789
  if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) {
790
  // For Unicode fonts, we need to incorporate font data into
791
  // sub-sections that are linked from the primary font section.
795
  // All of this code is adapted from the excellent changes made to
796
  // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/)
797
 
798
+ $res = "\n$id 0 obj\n<</Type /Font\n/Subtype /Type0\n";
799
+ $res.= "/BaseFont /".$o['info']['name']."\n";
800
 
801
  // The horizontal identity mapping for 2-byte CIDs; may be used
802
  // with CIDFonts using any Registry, Ordering, and Supplement values.
803
+ $res.= "/Encoding /Identity-H\n";
804
+ $res.= "/DescendantFonts [".$o['info']['cidFont']." 0 R]\n";
805
+ $res.= "/ToUnicode ".$o['info']['toUnicode']." 0 R\n";
806
+ $res.= ">>\n";
807
+ $res.= "endobj";
808
  } else {
809
+ $res = "\n$id 0 obj\n<< /Type /Font\n/Subtype /".$o['info']['SubType']."\n";
810
+ $res.= "/Name /F".$o['info']['fontNum']."\n";
811
+ $res.= "/BaseFont /".$o['info']['name']."\n";
812
 
813
+ if (isset($o['info']['encodingDictionary'])) {
814
  // then place a reference to the dictionary
815
+ $res.= "/Encoding ".$o['info']['encodingDictionary']." 0 R\n";
816
+ } else if (isset($o['info']['encoding'])) {
817
  // use the specified encoding
818
+ $res.= "/Encoding /".$o['info']['encoding']."\n";
819
  }
820
 
821
+ if (isset($o['info']['FirstChar'])) {
822
+ $res.= "/FirstChar ".$o['info']['FirstChar']."\n";
823
  }
824
 
825
+ if (isset($o['info']['LastChar'])) {
826
+ $res.= "/LastChar ".$o['info']['LastChar']."\n";
827
  }
828
 
829
+ if (isset($o['info']['Widths'])) {
830
+ $res.= "/Widths ".$o['info']['Widths']." 0 R\n";
831
  }
832
 
833
+ if (isset($o['info']['FontDescriptor'])) {
834
+ $res.= "/FontDescriptor ".$o['info']['FontDescriptor']." 0 R\n";
835
  }
836
 
837
+ $res.= ">>\n";
838
+ $res.= "endobj";
839
  }
840
 
841
+ return $res;
842
  }
843
  }
844
 
846
  * a font descriptor, needed for including additional fonts
847
  */
848
  protected function o_fontDescriptor($id, $action, $options = '') {
849
+ if ($action !== 'new') {
850
  $o = & $this->objects[$id];
851
  }
852
 
853
+ switch ($action) {
854
+ case 'new':
855
+ $this->objects[$id] = array('t'=>'fontDescriptor', 'info'=>$options);
856
+ break;
857
 
858
+ case 'out':
859
+ $res = "\n$id 0 obj\n<< /Type /FontDescriptor\n";
860
+ foreach ($o['info'] as $label => $value) {
861
+ switch ($label) {
862
+ case 'Ascent':
863
+ case 'CapHeight':
864
+ case 'Descent':
865
+ case 'Flags':
866
+ case 'ItalicAngle':
867
+ case 'StemV':
868
+ case 'AvgWidth':
869
+ case 'Leading':
870
+ case 'MaxWidth':
871
+ case 'MissingWidth':
872
+ case 'StemH':
873
+ case 'XHeight':
874
+ case 'CharSet':
875
+ if (mb_strlen($value, '8bit')) {
876
+ $res.= "/$label $value\n";
877
+ }
878
 
879
+ break;
880
+ case 'FontFile':
881
+ case 'FontFile2':
882
+ case 'FontFile3':
883
+ $res.= "/$label $value 0 R\n";
884
+ break;
885
 
886
+ case 'FontBBox':
887
+ $res.= "/$label [$value[0] $value[1] $value[2] $value[3]]\n";
888
+ break;
889
 
890
+ case 'FontName':
891
+ $res.= "/$label /$value\n";
892
+ break;
893
+ }
894
  }
 
895
 
896
+ $res.= ">>\nendobj";
897
 
898
+ return $res;
899
  }
900
  }
901
 
903
  * the font encoding
904
  */
905
  protected function o_fontEncoding($id, $action, $options = '') {
906
+ if ($action !== 'new') {
907
  $o = & $this->objects[$id];
908
  }
909
 
910
+ switch ($action) {
911
+ case 'new':
912
  // the options array should contain 'differences' and maybe 'encoding'
913
  $this->objects[$id] = array('t'=>'fontEncoding', 'info'=>$options);
914
  break;
915
 
916
+ case 'out':
917
  $res = "\n$id 0 obj\n<< /Type /Encoding\n";
918
+ if (!isset($o['info']['encoding'])) {
919
  $o['info']['encoding'] = 'WinAnsiEncoding';
920
  }
921
 
922
+ if ($o['info']['encoding'] !== 'none') {
923
  $res.= "/BaseEncoding /".$o['info']['encoding']."\n";
924
  }
925
 
927
 
928
  $onum = -100;
929
 
930
+ foreach ($o['info']['differences'] as $num=>$label) {
931
+ if ($num != $onum+1) {
932
  // we cannot make use of consecutive numbering
933
+ $res.= "\n$num /$label";
934
  } else {
935
+ $res.= " /$label";
936
  }
937
 
938
  $onum = $num;
939
  }
940
 
941
  $res.= "\n]\n>>\nendobj";
942
+ return $res;
943
  }
944
  }
945
 
946
+ /**
947
  * a descendent cid font, needed for unicode fonts
948
  */
949
  protected function o_fontDescendentCID($id, $action, $options = '') {
950
+ if ($action !== 'new') {
951
  $o = & $this->objects[$id];
952
  }
953
 
954
+ switch ($action) {
955
+ case 'new':
956
+ $this->objects[$id] = array('t'=>'fontDescendentCID', 'info'=>$options);
957
 
958
  // we need a CID system info section
959
  $cidSystemInfoId = ++$this->numObj;
960
  $this->o_contents($cidSystemInfoId, 'new', 'raw');
961
  $this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId;
962
  $res= "<</Registry (Adobe)\n"; // A string identifying an issuer of character collections
963
+ $res.= "/Ordering (UCS)\n"; // A string that uniquely names a character collection issued by a specific registry
964
+ $res.= "/Supplement 0\n"; // The supplement number of the character collection.
965
+ $res.= ">>";
966
  $this->objects[$cidSystemInfoId]['c'] = $res;
967
 
968
  // and a CID to GID map
971
  $this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId;
972
  break;
973
 
974
+ case 'add':
975
  foreach ($options as $k => $v) {
976
+ switch ($k) {
977
+ case 'BaseFont':
978
+ $o['info']['name'] = $v;
979
  break;
980
 
981
+ case 'FirstChar':
982
+ case 'LastChar':
983
+ case 'MissingWidth':
984
+ case 'FontDescriptor':
985
+ case 'SubType':
986
  $this->addMessage("o_fontDescendentCID $k : $v");
987
+ $o['info'][$k] = $v;
988
  break;
989
  }
990
  }
993
  $this->o_fontGIDtoCIDMap($o['info']['cidToGidMap'], 'add', $options);
994
  break;
995
 
996
+ case 'out':
997
+ $res = "\n$id 0 obj\n";
998
+ $res.= "<</Type /Font\n";
999
+ $res.= "/Subtype /CIDFontType2\n";
1000
+ $res.= "/BaseFont /".$o['info']['name']."\n";
1001
+ $res.= "/CIDSystemInfo ".$o['info']['cidSystemInfo']." 0 R\n";
1002
+ // if (isset($o['info']['FirstChar'])) {
1003
+ // $res.= "/FirstChar ".$o['info']['FirstChar']."\n";
1004
  // }
1005
 
1006
+ // if (isset($o['info']['LastChar'])) {
1007
+ // $res.= "/LastChar ".$o['info']['LastChar']."\n";
1008
  // }
1009
+ if (isset($o['info']['FontDescriptor'])) {
1010
+ $res.= "/FontDescriptor ".$o['info']['FontDescriptor']." 0 R\n";
1011
  }
1012
 
1013
+ if (isset($o['info']['MissingWidth'])) {
1014
+ $res.= "/DW ".$o['info']['MissingWidth']."\n";
1015
  }
1016
 
1017
+ if (isset($o['info']['fontFileName']) && isset($this->fonts[$o['info']['fontFileName']]['CIDWidths'])) {
1018
  $cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths'];
1019
  $w = '';
1020
  foreach ($cid_widths as $cid => $width) {
1021
  $w .= "$cid [$width] ";
1022
  }
1023
+ $res.= "/W [$w]\n";
1024
  }
1025
 
1026
+ $res.= "/CIDToGIDMap ".$o['info']['cidToGidMap']." 0 R\n";
1027
+ $res.= ">>\n";
1028
+ $res.= "endobj";
1029
 
1030
+ return $res;
1031
  }
1032
  }
1033
 
1035
  * a font glyph to character map, needed for unicode fonts
1036
  */
1037
  protected function o_fontGIDtoCIDMap($id, $action, $options = '') {
1038
+ if ($action !== 'new') {
1039
  $o = & $this->objects[$id];
1040
  }
1041
 
1042
+ switch ($action) {
1043
+ case 'new':
1044
+ $this->objects[$id] = array('t'=>'fontGIDtoCIDMap', 'info'=>$options);
1045
  break;
1046
 
1047
+ case 'out':
1048
  $res = "\n$id 0 obj\n";
1049
  $fontFileName = $o['info']['fontFileName'];
1050
  $tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']);
1052
  $compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) &&
1053
  $this->fonts[$fontFileName]['CIDtoGID_Compressed'];
1054
 
1055
+ if (!$compressed && isset($o['raw'])) {
1056
  $res.= $tmp;
1057
  } else {
1058
+ $res.= "<<";
1059
 
1060
+ if (!$compressed && $this->compressionReady && $this->options['compression']) {
1061
  // then implement ZLIB based compression on this content stream
1062
  $compressed = true;
1063
+ $tmp = gzcompress($tmp, 6);
1064
  }
1065
  if ($compressed) {
1066
  $res.= "\n/Filter /FlateDecode";
1070
  }
1071
 
1072
  $res.= "\nendobj";
1073
+ return $res;
1074
  }
1075
  }
1076
 
1078
  * the document procset, solves some problems with printing to old PS printers
1079
  */
1080
  protected function o_procset($id, $action, $options = '') {
1081
+ if ($action !== 'new') {
1082
  $o = & $this->objects[$id];
1083
  }
1084
 
1085
+ switch ($action) {
1086
+ case 'new':
1087
+ $this->objects[$id] = array('t'=>'procset', 'info'=>array('PDF'=>1, 'Text'=>1));
1088
+ $this->o_pages($this->currentNode, 'procset', $id);
1089
+ $this->procsetObjectId = $id;
1090
+ break;
1091
 
1092
+ case 'add':
1093
+ // this is to add new items to the procset list, despite the fact that this is considered
1094
+ // obselete, the items are required for printing to some postscript printers
1095
+ switch ($options) {
1096
+ case 'ImageB':
1097
+ case 'ImageC':
1098
+ case 'ImageI':
1099
+ $o['info'][$options] = 1;
1100
+ break;
1101
+ }
1102
  break;
 
 
1103
 
1104
+ case 'out':
1105
+ $res = "\n$id 0 obj\n[";
1106
+ foreach ($o['info'] as $label=>$val) {
1107
+ $res.= "/$label ";
1108
+ }
1109
+ $res.= "]\nendobj";
1110
+ return $res;
1111
  }
1112
  }
1113
 
1115
  * define the document information
1116
  */
1117
  protected function o_info($id, $action, $options = '') {
1118
+ if ($action !== 'new') {
1119
  $o = & $this->objects[$id];
1120
  }
1121
 
1122
+ switch ($action) {
1123
+ case 'new':
1124
+ $this->infoObject = $id;
1125
+ $date = 'D:'.@date('Ymd');
1126
+ $this->objects[$id] = array('t'=>'info', 'info'=>array('Creator'=>'R and OS php pdf writer, http://www.ros.co.nz', 'CreationDate'=>$date));
1127
+ break;
1128
+ case 'Title':
1129
+ case 'Author':
1130
+ case 'Subject':
1131
+ case 'Keywords':
1132
+ case 'Creator':
1133
+ case 'Producer':
1134
+ case 'CreationDate':
1135
+ case 'ModDate':
1136
+ case 'Trapped':
1137
+ $o['info'][$action] = $options;
1138
+ break;
1139
 
1140
+ case 'out':
1141
+ if ($this->encrypted) {
1142
+ $this->encryptInit($id);
1143
+ }
1144
 
1145
+ $res = "\n$id 0 obj\n<<\n";
1146
+ foreach ($o['info'] as $k=>$v) {
1147
+ $res.= "/$k (";
1148
+ // dates must be outputted as-is, without Unicode transformations
1149
+ $raw = ($k === 'CreationDate' || $k === 'ModDate');
1150
+ $c = $v;
1151
 
1152
+ if ($this->encrypted) {
1153
+ $c = $this->ARC4($c);
1154
+ }
1155
 
1156
+ $res.= ($raw) ? $c : $this->filterText($c);
1157
+ $res.= ")\n";
1158
+ }
1159
 
1160
+ $res.= ">>\nendobj";
1161
+ return $res;
1162
  }
1163
  }
1164
 
1166
  * an action object, used to link to URLS initially
1167
  */
1168
  protected function o_action($id, $action, $options = '') {
1169
+ if ($action !== 'new') {
1170
  $o = & $this->objects[$id];
1171
  }
1172
 
1173
+ switch ($action) {
1174
+ case 'new':
1175
+ if (is_array($options)) {
1176
+ $this->objects[$id] = array('t'=>'action', 'info'=>$options, 'type'=>$options['type']);
1177
+ } else {
1178
+ // then assume a URI action
1179
+ $this->objects[$id] = array('t'=>'action', 'info'=>$options, 'type'=>'URI');
1180
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1181
  break;
1182
 
1183
+ case 'out':
1184
+ if ($this->encrypted) {
1185
+ $this->encryptInit($id);
 
 
 
1186
  }
1187
 
1188
+ $res = "\n$id 0 obj\n<< /Type /Action";
1189
+ switch ($o['type']) {
1190
+ case 'ilink':
1191
+ if (!isset($this->destinations[(string)$o['info']['label']])) break;
1192
 
1193
+ // there will be an 'label' setting, this is the name of the destination
1194
+ $res.= "\n/S /GoTo\n/D ".$this->destinations[(string)$o['info']['label']]." 0 R";
1195
+ break;
1196
+
1197
+ case 'URI':
1198
+ $res.= "\n/S /URI\n/URI (";
1199
+ if ($this->encrypted) {
1200
+ $res.= $this->filterText($this->ARC4($o['info']), true, false);
1201
+ } else {
1202
+ $res.= $this->filterText($o['info'], true, false);
1203
+ }
1204
+
1205
+ $res.= ")";
1206
+ break;
1207
+ }
1208
+
1209
+ $res.= "\n>>\nendobj";
1210
+ return $res;
1211
  }
1212
  }
1213
 
1216
  * initially will support just link annotations
1217
  */
1218
  protected function o_annotation($id, $action, $options = '') {
1219
+ if ($action !== 'new') {
1220
  $o = & $this->objects[$id];
1221
  }
1222
 
1223
+ switch ($action) {
1224
+ case 'new':
1225
+ // add the annotation to the current page
1226
+ $pageId = $this->currentPage;
1227
+ $this->o_page($pageId, 'annot', $id);
1228
+
1229
+ // and add the action object which is going to be required
1230
+ switch ($options['type']) {
1231
+ case 'link':
1232
+ $this->objects[$id] = array('t'=>'annotation', 'info'=>$options);
1233
+ $this->numObj++;
1234
+ $this->o_action($this->numObj, 'new', $options['url']);
1235
+ $this->objects[$id]['info']['actionId'] = $this->numObj;
1236
+ break;
1237
 
1238
+ case 'ilink':
1239
+ // this is to a named internal link
1240
+ $label = $options['label'];
1241
+ $this->objects[$id] = array('t'=>'annotation', 'info'=>$options);
1242
+ $this->numObj++;
1243
+ $this->o_action($this->numObj, 'new', array('type'=>'ilink', 'label'=>$label));
1244
+ $this->objects[$id]['info']['actionId'] = $this->numObj;
1245
+ break;
1246
+ }
1247
  break;
1248
 
1249
+ case 'out':
1250
+ $res = "\n$id 0 obj\n<< /Type /Annot";
1251
+ switch ($o['info']['type']) {
1252
+ case 'link':
1253
+ case 'ilink':
1254
+ $res.= "\n/Subtype /Link";
1255
+ break;
1256
+ }
1257
+ $res.= "\n/A ".$o['info']['actionId']." 0 R";
1258
+ $res.= "\n/Border [0 0 0]";
1259
+ $res.= "\n/H /I";
1260
+ $res.= "\n/Rect [ ";
 
 
 
 
 
 
 
 
 
 
 
1261
 
1262
+ foreach ($o['info']['rect'] as $v) {
1263
+ $res.= sprintf("%.4F ", $v);
1264
+ }
1265
 
1266
+ $res.= "]";
1267
+ $res.= "\n>>\nendobj";
1268
+ return $res;
1269
  }
1270
  }
1271
 
1273
  * a page object, it also creates a contents object to hold its contents
1274
  */
1275
  protected function o_page($id, $action, $options = '') {
1276
+ if ($action !== 'new') {
1277
  $o = & $this->objects[$id];
1278
  }
1279
 
1280
+ switch ($action) {
1281
+ case 'new':
1282
  $this->numPages++;
1283
  $this->objects[$id] = array('t'=>'page', 'info'=>array('parent'=>$this->currentNode, 'pageNum'=>$this->numPages));
1284
 
1285
+ if (is_array($options)) {
1286
  // then this must be a page insertion, array should contain 'rid','pos'=[before|after]
1287
  $options['id'] = $id;
1288
  $this->o_pages($this->currentNode, 'page', $options);
1298
  $this->objects[$id]['info']['contents'] = array();
1299
  $this->objects[$id]['info']['contents'][] = $this->numObj;
1300
 
1301
+ $match = ($this->numPages%2 ? 'odd' : 'even');
1302
+ foreach ($this->addLooseObjects as $oId=>$target) {
1303
+ if ($target === 'all' || $match === $target) {
1304
  $this->objects[$id]['info']['contents'][] = $oId;
1305
  }
1306
  }
1307
  break;
1308
 
1309
+ case 'content':
1310
  $o['info']['contents'][] = $options;
1311
  break;
1312
 
1313
+ case 'annot':
1314
  // add an annotation to this page
1315
+ if (!isset($o['info']['annot'])) {
1316
  $o['info']['annot'] = array();
1317
  }
1318
 
1320
  $o['info']['annot'][] = $options;
1321
  break;
1322
 
1323
+ case 'out':
1324
  $res = "\n$id 0 obj\n<< /Type /Page";
1325
  $res.= "\n/Parent ".$o['info']['parent']." 0 R";
1326
 
1327
+ if (isset($o['info']['annot'])) {
1328
  $res.= "\n/Annots [";
1329
+ foreach ($o['info']['annot'] as $aId) {
1330
  $res.= " $aId 0 R";
1331
  }
1332
  $res.= " ]";
1333
  }
1334
 
1335
+ $count = count($o['info']['contents']);
1336
+ if ($count == 1) {
1337
  $res.= "\n/Contents ".$o['info']['contents'][0]." 0 R";
1338
+ } else if ($count>1) {
1339
  $res.= "\n/Contents [\n";
1340
 
1341
  // reverse the page contents so added objects are below normal content
1348
  }
1349
 
1350
  $res.= "\n>>\nendobj";
1351
+ return $res;
1352
  }
1353
  }
1354
 
1356
  * the contents objects hold all of the content which appears on pages
1357
  */
1358
  protected function o_contents($id, $action, $options = '') {
1359
+ if ($action !== 'new') {
1360
  $o = & $this->objects[$id];
1361
  }
1362
 
1363
+ switch ($action) {
1364
+ case 'new':
1365
  $this->objects[$id] = array('t'=>'contents', 'c'=>'', 'info'=>array());
1366
+ if (mb_strlen($options, '8bit') && intval($options)) {
1367
  // then this contents is the primary for a page
1368
  $this->objects[$id]['onPage'] = $options;
1369
+ } else if ($options === 'raw') {
1370
  // then this page contains some other type of system object
1371
  $this->objects[$id]['raw'] = 1;
1372
  }
1373
  break;
1374
 
1375
+ case 'add':
1376
  // add more options to the decleration
1377
  foreach ($options as $k=>$v) {
1378
  $o['info'][$k] = $v;
1379
  }
1380
 
1381
+ case 'out':
1382
  $tmp = $o['c'];
1383
+ $res = "\n$id 0 obj\n";
1384
 
1385
+ if (isset($this->objects[$id]['raw'])) {
1386
  $res.= $tmp;
1387
  } else {
1388
+ $res.= "<<";
1389
+ if ($this->compressionReady && $this->options['compression']) {
1390
  // then implement ZLIB based compression on this content stream
1391
  $res.= " /Filter /FlateDecode";
1392
+ $tmp = gzcompress($tmp, 6);
1393
  }
1394
 
1395
+ if ($this->encrypted) {
1396
  $this->encryptInit($id);
1397
+ $tmp = $this->ARC4($tmp);
1398
  }
1399
 
1400
+ foreach ($o['info'] as $k=>$v) {
1401
+ $res.= "\n/$k $v";
1402
  }
1403
 
1404
  $res.= "\n/Length ".mb_strlen($tmp, '8bit') ." >>\nstream\n$tmp\nendstream";
1405
  }
1406
 
1407
  $res.= "\nendobj";
1408
+ return $res;
1409
  }
1410
  }
1411
 
1412
+ protected function o_embedjs($id, $action) {
1413
+ if ($action !== 'new') {
1414
  $o = & $this->objects[$id];
1415
  }
1416
 
1417
+ switch ($action) {
1418
+ case 'new':
1419
  $this->objects[$id] = array('t'=>'embedjs', 'info'=>array(
1420
  'Names' => '[(EmbeddedJS) '.($id+1).' 0 R]'
1421
  ));
1422
  break;
1423
 
1424
+ case 'out':
1425
  $res = "\n$id 0 obj\n<< ";
1426
+ foreach ($o['info'] as $k=>$v) {
1427
+ $res.= "\n/$k $v";
1428
  }
1429
  $res.= "\n>>\nendobj";
1430
+ return $res;
1431
  }
1432
  }
1433
 
1434
  protected function o_javascript($id, $action, $code = '') {
1435
+ if ($action !== 'new') {
1436
  $o = & $this->objects[$id];
1437
  }
1438
 
1439
+ switch ($action) {
1440
+ case 'new':
1441
  $this->objects[$id] = array('t'=>'javascript', 'info'=>array(
1442
  'S' => '/JavaScript',
1443
  'JS' => '('.$this->filterText($code).')',
1444
  ));
1445
  break;
1446
 
1447
+ case 'out':
1448
  $res = "\n$id 0 obj\n<< ";
1449
+ foreach ($o['info'] as $k=>$v) {
1450
+ $res.= "\n/$k $v";
1451
  }
1452
  $res.= "\n>>\nendobj";
1453
+ return $res;
1454
  }
1455
  }
1456
 
1458
  * an image object, will be an XObject in the document, includes description and data
1459
  */
1460
  protected function o_image($id, $action, $options = '') {
1461
+ if ($action !== 'new') {
1462
  $o = & $this->objects[$id];
1463
  }
1464
 
1465
  switch ($action) {
1466
+ case 'new':
1467
  // make the new object
1468
  $this->objects[$id] = array('t'=>'image', 'data'=>&$options['data'], 'info'=>array());
1469
 
1478
  $info['SMask'] = ($this->numObj-1).' 0 R';
1479
  }
1480
 
1481
+ if (!isset($options['type']) || $options['type'] === 'jpg') {
1482
+ if (!isset($options['channels'])) {
1483
  $options['channels'] = 3;
1484
  }
1485
 
1497
  $info['BitsPerComponent'] = 8;
1498
  }
1499
 
1500
+ else if ($options['type'] === 'png') {
1501
  $info['Filter'] = '/FlateDecode';
1502
  $info['DecodeParms'] = '<< /Predictor 15 /Colors '.$options['ncolor'].' /Columns '.$options['iw'].' /BitsPerComponent '.$options['bitsPerComponent'].'>>';
1503
 
1505
  $info['ColorSpace'] = '/DeviceGray';
1506
  }
1507
  else {
1508
+ if (mb_strlen($options['pdata'], '8bit')) {
1509
+ $tmp = ' [ /Indexed /DeviceRGB '.(mb_strlen($options['pdata'], '8bit') /3-1) .' ';
1510
  $this->numObj++;
1511
  $this->o_contents($this->numObj, 'new');
1512
  $this->objects[$this->numObj]['c'] = $options['pdata'];
1513
  $tmp.= $this->numObj.' 0 R';
1514
  $tmp.= ' ]';
1515
+ $info['ColorSpace'] = $tmp;
1516
 
1517
+ if (isset($options['transparency'])) {
1518
  $transparency = $options['transparency'];
1519
  switch ($transparency['type']) {
1520
+ case 'indexed':
1521
  $tmp = ' [ '.$transparency['data'].' '.$transparency['data'].'] ';
1522
+ $info['Mask'] = $tmp;
1523
  break;
1524
 
1525
  case 'color-key':
1533
  }
1534
  }
1535
  } else {
1536
+ if (isset($options['transparency'])) {
1537
  $transparency = $options['transparency'];
1538
 
1539
  switch ($transparency['type']) {
1540
+ case 'indexed':
1541
  $tmp = ' [ '.$transparency['data'].' '.$transparency['data'].'] ';
1542
+ $info['Mask'] = $tmp;
1543
  break;
1544
 
1545
  case 'color-key':
1567
  $this->o_procset($this->procsetObjectId, 'add', 'ImageC');
1568
  break;
1569
 
1570
+ case 'out':
1571
  $tmp = &$o['data'];
1572
+ $res = "\n$id 0 obj\n<<";
1573
 
1574
+ foreach ($o['info'] as $k=>$v) {
1575
  $res.= "\n/$k $v";
1576
  }
1577
 
1578
+ if ($this->encrypted) {
1579
  $this->encryptInit($id);
1580
+ $tmp = $this->ARC4($tmp);
1581
  }
1582
 
1583
  $res.= "\n/Length ".mb_strlen($tmp, '8bit') .">>\nstream\n$tmp\nendstream\nendobj";
1584
 
1585
+ return $res;
1586
  }
1587
  }
1588
 
1590
  * graphics state object
1591
  */
1592
  protected function o_extGState($id, $action, $options = "") {
1593
+ static $valid_params = array("LW", "LC", "LC", "LJ", "ML",
1594
  "D", "RI", "OP", "op", "OPM",
1595
  "Font", "BG", "BG2", "UCR",
1596
  "TR", "TR2", "HT", "FL",
1597
  "SM", "SA", "BM", "SMask",
1598
  "CA", "ca", "AIS", "TK");
1599
 
1600
+ if ($action !== "new") {
1601
  $o = & $this->objects[$id];
1602
  }
1603
 
1604
+ switch ($action) {
1605
  case "new":
1606
+ $this->objects[$id] = array('t' => 'extGState', 'info' => $options);
1607
 
1608
  // Tell the pages about the new resource
1609
  $this->numStates++;
1614
  $res = "\n$id 0 obj\n<< /Type /ExtGState\n";
1615
 
1616
  foreach ($o["info"] as $k => $v) {
1617
+ if ( !in_array($k, $valid_params))
1618
  continue;
1619
+ $res.= "/$k $v\n";
1620
  }
1621
 
1622
  $res.= ">>\nendobj";
1623
+ return $res;
1624
  }
1625
  }
1626
 
1628
  * encryption object.
1629
  */
1630
  protected function o_encryption($id, $action, $options = '') {
1631
+ if ($action !== 'new') {
1632
  $o = & $this->objects[$id];
1633
  }
1634
 
1635
  switch ($action) {
1636
+ case 'new':
1637
  // make the new object
1638
  $this->objects[$id] = array('t'=>'encryption', 'info'=>$options);
1639
  $this->arc4_objnum = $id;
1640
 
1641
  // figure out the additional paramaters required
1642
+ $pad = chr(0x28) .chr(0xBF) .chr(0x4E) .chr(0x5E) .chr(0x4E) .chr(0x75) .chr(0x8A) .chr(0x41)
1643
  .chr(0x64) .chr(0x00) .chr(0x4E) .chr(0x56) .chr(0xFF) .chr(0xFA) .chr(0x01) .chr(0x08)
1644
  .chr(0x2E) .chr(0x2E) .chr(0x00) .chr(0xB6) .chr(0xD0) .chr(0x68) .chr(0x3E) .chr(0x80)
1645
  .chr(0x2F) .chr(0x0C) .chr(0xA9) .chr(0xFE) .chr(0x64) .chr(0x53) .chr(0x69) .chr(0x7A);
1646
 
1647
+ $len = mb_strlen($options['owner'], '8bit');
1648
 
1649
+ if ($len > 32) {
1650
+ $owner = substr($options['owner'], 0, 32);
1651
+ } else if ($len < 32) {
1652
+ $owner = $options['owner'].substr($pad, 0, 32-$len);
1653
  } else {
1654
+ $owner = $options['owner'];
1655
  }
1656
 
1657
+ $len = mb_strlen($options['user'], '8bit');
1658
+ if ($len > 32) {
1659
+ $user = substr($options['user'], 0, 32);
1660
+ } else if ($len < 32) {
1661
+ $user = $options['user'].substr($pad, 0, 32-$len);
1662
  } else {
1663
+ $user = $options['user'];
1664
  }
1665
 
1666
+ $tmp = $this->md5_16($owner);
1667
+ $okey = substr($tmp, 0, 5);
1668
  $this->ARC4_init($okey);
1669
  $ovalue = $this->ARC4($user);
1670
  $this->objects[$id]['info']['O'] = $ovalue;
1671
 
1672
  // now make the u value, phew.
1673
+ $tmp = $this->md5_16($user.$ovalue.chr($options['p']) .chr(255) .chr(255) .chr(255) .$this->fileIdentifier);
1674
 
1675
+ $ukey = substr($tmp, 0, 5);
1676
  $this->ARC4_init($ukey);
1677
+ $this->encryptionKey = $ukey;
1678
  $this->encrypted = true;
1679
  $uvalue = $this->ARC4($pad);
1680
  $this->objects[$id]['info']['U'] = $uvalue;
1682
  // initialize the arc4 array
1683
  break;
1684
 
1685
+ case 'out':
1686
+ $res = "\n$id 0 obj\n<<";
1687
  $res.= "\n/Filter /Standard";
1688
  $res.= "\n/V 1";
1689
  $res.= "\n/R 2";
1690
  $res.= "\n/O (".$this->filterText($o['info']['O'], true, false) .')';
1691
  $res.= "\n/U (".$this->filterText($o['info']['U'], true, false) .')';
1692
  // and the p-value needs to be converted to account for the twos-complement approach
1693
+ $o['info']['p'] = (($o['info']['p']^255) +1) *-1;
1694
  $res.= "\n/P ".($o['info']['p']);
1695
  $res.= "\n>>\nendobj";
1696
+ return $res;
1697
  }
1698
  }
1699
 
1706
  * calculate the 16 byte version of the 128 bit md5 digest of the string
1707
  */
1708
  function md5_16($string) {
1709
+ $tmp = md5($string);
1710
  $out = '';
1711
+ for ($i = 0;$i <= 30;$i = $i+2) {
1712
  $out.= chr(hexdec(substr($tmp, $i, 2)));
1713
  }
1714
+ return $out;
1715
  }
1716
 
1717
  /**
1718
  * initialize the encryption for processing a particular object
1719
  */
1720
  function encryptInit($id) {
1721
+ $tmp = $this->encryptionKey;
1722
+ $hex = dechex($id);
1723
+ if (mb_strlen($hex, '8bit') <6) {
1724
+ $hex = substr('000000', 0, 6-mb_strlen($hex, '8bit')) .$hex;
1725
  }
1726
  $tmp.= chr(hexdec(substr($hex, 4, 2))) .chr(hexdec(substr($hex, 2, 2))) .chr(hexdec(substr($hex, 0, 2))) .chr(0) .chr(0);
1727
+ $key = $this->md5_16($tmp);
1728
  $this->ARC4_init(substr($key, 0, 10));
1729
  }
1730
 
1732
  * initialize the ARC4 encryption
1733
  */
1734
  function ARC4_init($key = '') {
1735
+ $this->arc4 = '';
1736
 
1737
  // setup the control array
1738
+ if (mb_strlen($key, '8bit') == 0) {
1739
  return;
1740
  }
1741
 
1742
+ $k = '';
1743
  while (mb_strlen($k, '8bit') <256) {
1744
  $k.= $key;
1745
  }
1746
 
1747
  $k = substr($k, 0, 256);
1748
+ for ($i = 0;$i<256;$i++) {
1749
  $this->arc4.= chr($i);
1750
  }
1751
 
1752
  $j = 0;
1753
 
1754
+ for ($i = 0;$i<256;$i++) {
1755
+ $t = $this->arc4[$i];
1756
+ $j = ($j + ord($t) + ord($k[$i])) %256;
1757
  $this->arc4[$i] = $this->arc4[$j];
1758
  $this->arc4[$j] = $t;
1759
  }
1766
  $len = mb_strlen($text, '8bit');
1767
  $a = 0;
1768
  $b = 0;
1769
+ $c = $this->arc4;
1770
  $out = '';
1771
+ for ($i = 0;$i<$len;$i++) {
1772
+ $a = ($a+1) %256;
1773
+ $t = $c[$a];
1774
+ $b = ($b+ord($t)) %256;
1775
  $c[$a] = $c[$b];
1776
  $c[$b] = $t;
1777
+ $k = ord($c[(ord($c[$a]) +ord($c[$b])) %256]);
1778
  $out.= chr(ord($text[$i]) ^ $k);
1779
  }
1780
+ return $out;
1781
  }
1782
 
1783
  /**
1789
  */
1790
  function addLink($url, $x0, $y0, $x1, $y1) {
1791
  $this->numObj++;
1792
+ $info = array('type'=>'link', 'url'=>$url, 'rect'=>array($x0, $y0, $x1, $y1));
1793
  $this->o_annotation($this->numObj, 'new', $info);
1794
  }
1795
 
1798
  */
1799
  function addInternalLink($label, $x0, $y0, $x1, $y1) {
1800
  $this->numObj++;
1801
+ $info = array('type'=>'ilink', 'label'=>$label, 'rect'=>array($x0, $y0, $x1, $y1));
1802
  $this->o_annotation($this->numObj, 'new', $info);
1803
  }
1804
 
1810
  function setEncryption($userPass = '', $ownerPass = '', $pc = array()) {
1811
  $p = bindec("11000000");
1812
 
1813
+ $options = array('print'=>4, 'modify'=>8, 'copy'=>16, 'add'=>32);
1814
 
1815
+ foreach ($pc as $k=>$v) {
1816
+ if ($v && isset($options[$k])) {
1817
  $p+= $options[$k];
1818
+ } else if (isset($options[$v])) {
1819
  $p+= $options[$v];
1820
  }
1821
  }
1822
 
1823
  // implement encryption on the document
1824
+ if ($this->arc4_objnum == 0) {
1825
  // then the block does not exist already, add it.
1826
  $this->numObj++;
1827
+ if (mb_strlen($ownerPass) == 0) {
1828
  $ownerPass = $userPass;
1829
  }
1830
 
1842
  * return the pdf stream as a string returned from the function
1843
  */
1844
  function output($debug = false) {
1845
+ if ($debug) {
1846
  // turn compression off
1847
  $this->options['compression'] = false;
1848
  }
1854
  $this->o_embedjs($js_id, 'new');
1855
  $this->o_javascript(++$this->numObj, 'new', $this->javascript);
1856
 
1857
+ $id = $this->catalogId;
1858
 
1859
  $this->o_catalog($id, 'javascript', $js_id);
1860
  }
1861
 
1862
+ if ($this->arc4_objnum) {
1863
  $this->ARC4_init($this->encryptionKey);
1864
  }
1865
 
1870
  $content = '%PDF-1.3';
1871
  $pos = mb_strlen($content, '8bit');
1872
 
1873
+ foreach ($this->objects as $k=>$v) {
1874
  $tmp = 'o_'.$v['t'];
1875
  $cont = $this->$tmp($k, 'out');
1876
  $content.= $cont;
1880
 
1881
  $content.= "\nxref\n0 ".(count($xref) +1) ."\n0000000000 65535 f \n";
1882
 
1883
+ foreach ($xref as $p) {
1884
  $content.= str_pad($p, 10, "0", STR_PAD_LEFT) . " 00000 n \n";
1885
  }
1886
 
1887
  $content.= "trailer\n<<\n/Size ".(count($xref) +1) ."\n/Root 1 0 R\n/Info $this->infoObject 0 R\n";
1888
 
1889
  // if encryption has been applied to this document then add the marker for this dictionary
1890
+ if ($this->arc4_objnum > 0) {
1891
+ $content.= "/Encrypt $this->arc4_objnum 0 R\n";
1892
  }
1893
 
1894
+ if (mb_strlen($this->fileIdentifier, '8bit')) {
1895
+ $content.= "/ID[<$this->fileIdentifier><$this->fileIdentifier>]\n";
1896
  }
1897
 
1898
+ $content.= ">>\nstartxref\n$pos\n%%EOF\n";
1899
 
1900
+ return $content;
1901
  }
1902
 
1903
  /**
1904
  * intialize a new document
1905
  * if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum
1906
  * this function is called automatically by the constructor function
 
 
1907
  */
1908
+ private function newDocument($pageSize = array(0, 0, 612, 792)) {
1909
  $this->numObj = 0;
1910
+ $this->objects = array();
1911
 
1912
  $this->numObj++;
1913
  $this->o_catalog($this->numObj, 'new');
1919
  $this->o_pages($this->numObj, 'new');
1920
 
1921
  $this->o_pages($this->numObj, 'mediaBox', $pageSize);
1922
+ $this->currentNode = 3;
1923
 
1924
  $this->numObj++;
1925
  $this->o_procset($this->numObj, 'new');
1932
 
1933
  // need to store the first page id as there is no way to get it to the user during
1934
  // startup
1935
+ $this->firstPageId = $this->currentContents;
1936
  }
1937
 
1938
  /**
1941
  * note that if a php serialized version does not exist it will try and make one, but will
1942
  * require write access to the directory to do it... it is MUCH faster to have these serialized
1943
  * files.
 
 
1944
  */
1945
+ private function openFont($font) {
1946
  // assume that $font contains the path and file but not the extension
1947
  $pos = strrpos($font, '/');
1948
 
1949
+ if ($pos === false) {
1950
+ $dir = './';
1951
+ $name = $font;
1952
  } else {
1953
  $dir = substr($font, 0, $pos+1);
1954
  $name = substr($font, $pos+1);
1977
  $cache_name = "$metrics_name.php";
1978
  $this->addMessage("metrics: $metrics_name, cache: $cache_name");
1979
 
1980
+ if (file_exists($fontcache . $cache_name)) {
1981
  $this->addMessage("openFont: php file exists $fontcache$cache_name");
1982
  $this->fonts[$font] = require($fontcache . $cache_name);
1983
 
1984
+ if (!isset($this->fonts[$font]['_version_']) || $this->fonts[$font]['_version_'] != $this->fontcacheVersion) {
1985
  // if the font file is old, then clear it out and prepare for re-creation
1986
  $this->addMessage('openFont: clear out, make way for new version.');
1987
  $this->fonts[$font] = null;
1998
  }
1999
  }
2000
 
2001
+ if (!isset($this->fonts[$font]) && file_exists($dir . $metrics_name)) {
2002
  // then rebuild the php_<font>.afm file from the <font>.afm file
2003
  $this->addMessage("openFont: build php file from $dir$metrics_name");
2004
+ $data = array();
2005
 
2006
  // 20 => 'space'
2007
  $data['codeToName'] = array();
2015
  $cidtogid = str_pad('', 256*256*2, "\x00");
2016
  }
2017
 
2018
+ $file = file($dir . $metrics_name);
2019
 
2020
  foreach ($file as $rowA) {
2021
  $row = trim($rowA);
2022
  $pos = strpos($row, ' ');
2023
 
2024
+ if ($pos) {
2025
  // then there must be some keyword
2026
+ $key = substr($row, 0, $pos);
2027
+ switch ($key) {
2028
+ case 'FontName':
2029
+ case 'FullName':
2030
+ case 'FamilyName':
2031
+ case 'PostScriptName':
2032
+ case 'Weight':
2033
+ case 'ItalicAngle':
2034
+ case 'IsFixedPitch':
2035
+ case 'CharacterSet':
2036
+ case 'UnderlinePosition':
2037
+ case 'UnderlineThickness':
2038
+ case 'Version':
2039
+ case 'EncodingScheme':
2040
+ case 'CapHeight':
2041
+ case 'XHeight':
2042
+ case 'Ascender':
2043
+ case 'Descender':
2044
+ case 'StdHW':
2045
+ case 'StdVW':
2046
+ case 'StartCharMetrics':
2047
+ case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font. Otherwise it's too big.
2048
  $data[$key] = trim(substr($row, $pos));
2049
  break;
2050
 
2051
+ case 'FontBBox':
2052
  $data[$key] = explode(' ', trim(substr($row, $pos)));
2053
  break;
2054
 
2055
  //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ;
2056
+ case 'C': // Found in AFM files
2057
  $bits = explode(';', trim($row));
2058
  $dtmp = array();
2059
 
2060
+ foreach ($bits as $bit) {
2061
+ $bits2 = explode(' ', trim($bit));
2062
+ if (mb_strlen($bits2[0], '8bit') == 0) continue;
2063
 
2064
+ if (count($bits2) >2) {
2065
  $dtmp[$bits2[0]] = array();
2066
+ for ($i = 1;$i<count($bits2);$i++) {
2067
  $dtmp[$bits2[0]][] = $bits2[$i];
2068
  }
2069
+ } else if (count($bits2) == 2) {
2070
  $dtmp[$bits2[0]] = $bits2[1];
2071
  }
2072
  }
2075
  $n = $dtmp['N'];
2076
  $width = floatval($dtmp['WX']);
2077
 
2078
+ if ($c >= 0) {
2079
  if ($c != hexdec($n)) {
2080
  $data['codeToName'][$c] = $n;
2081
  }
2084
  $data['C'][$n] = $width;
2085
  }
2086
 
2087
+ if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') {
2088
  $data['MissingWidth'] = $width;
2089
  }
2090
 
2091
  break;
2092
 
2093
  // U 827 ; WX 0 ; N squaresubnosp ; G 675 ;
2094
+ case 'U': // Found in UFM files
2095
  if (!$data['isUnicode']) break;
2096
 
2097
  $bits = explode(';', trim($row));
2098
  $dtmp = array();
2099
 
2100
+ foreach ($bits as $bit) {
2101
+ $bits2 = explode(' ', trim($bit));
2102
+ if (mb_strlen($bits2[0], '8bit') === 0) continue;
2103
 
2104
+ if (count($bits2) >2) {
2105
  $dtmp[$bits2[0]] = array();
2106
+ for ($i = 1;$i<count($bits2);$i++) {
2107
  $dtmp[$bits2[0]][] = $bits2[$i];
2108
  }
2109
+ } else if (count($bits2) == 2) {
2110
  $dtmp[$bits2[0]] = $bits2[1];
2111
  }
2112
  }
2116
  $glyph = $dtmp['G'];
2117
  $width = floatval($dtmp['WX']);
2118
 
2119
+ if ($c >= 0) {
2120
  // Set values in CID to GID map
2121
  if ($c >= 0 && $c < 0xFFFF && $glyph) {
2122
  $cidtogid[$c*2] = chr($glyph >> 8);
2131
  $data['C'][$n] = $width;
2132
  }
2133
 
2134
+ if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') {
2135
  $data['MissingWidth'] = $width;
2136
  }
2137
 
2138
  break;
2139
 
2140
+ case 'KPX':
2141
  break; // don't include them as they are not used yet
2142
  //KPX Adieresis yacute -40
2143
  $bits = explode(' ', trim($row));
2148
  }
2149
 
2150
  // echo $cidtogid; die("CIDtoGID Displayed!");
2151
+ if ($this->compressionReady && $this->options['compression']) {
2152
  // then implement ZLIB based compression on CIDtoGID string
2153
  $data['CIDtoGID_Compressed'] = true;
2154
+ $cidtogid = gzcompress($cidtogid, 6);
2155
  }
2156
  $data['CIDtoGID'] = base64_encode($cidtogid);
2157
  $data['_version_'] = $this->fontcacheVersion;
2165
  $data = null;
2166
  }
2167
 
2168
+ if (!isset($this->fonts[$font])) {
2169
  $this->addMessage("openFont: no font file found for $font. Do you need to run load_font.php?");
2170
  //echo 'Font not Found '.$font;
2171
  }
2181
  * and 'differences' => an array of mappings between numbers 0->255 and character names.
2182
  *
2183
  */
2184
+ function selectFont($fontName, $encoding = '', $set = true) {
2185
  $ext = substr($fontName, -4);
2186
+ if ($ext === '.afm' || $ext === '.ufm') {
2187
  $fontName = substr($fontName, 0, mb_strlen($fontName)-4);
2188
  }
2189
 
2190
+ if (!isset($this->fonts[$fontName])) {
2191
  $this->addMessage("selectFont: selecting - $fontName - $encoding, $set");
2192
 
2193
  // load the file
2194
  $this->openFont($fontName);
2195
 
2196
+ if (isset($this->fonts[$fontName])) {
2197
  $this->numObj++;
2198
  $this->numFonts++;
2199
 
2200
  $font = &$this->fonts[$fontName];
2201
 
2202
  //$this->numFonts = md5($fontName);
2203
+ $pos = strrpos($fontName, '/');
2204
  // $dir = substr($fontName,0,$pos+1);
2205
+ $name = substr($fontName, $pos+1);
2206
+ $options = array('name' => $name, 'fontFileName' => $fontName);
2207
 
2208
+ if (is_array($encoding)) {
2209
  // then encoding and differences might be set
2210
+ if (isset($encoding['encoding'])) {
2211
+ $options['encoding'] = $encoding['encoding'];
2212
  }
2213
 
2214
+ if (isset($encoding['differences'])) {
2215
+ $options['differences'] = $encoding['differences'];
2216
  }
2217
+ } else if (mb_strlen($encoding, '8bit')) {
2218
  // then perhaps only the encoding has been set
2219
+ $options['encoding'] = $encoding;
2220
  }
2221
 
2222
+ $fontObj = $this->numObj;
2223
  $this->o_font($this->numObj, 'new', $options);
2224
+ $font['fontNum'] = $this->numFonts;
2225
 
2226
  // if this is a '.afm' font, and there is a '.pfa' file to go with it ( as there
2227
  // should be for all non-basic fonts), then load it into an object and put the
2228
  // references into the font object
2229
+ $basefile = $fontName;
2230
 
2231
  $fbtype = '';
2232
+ if (file_exists("$basefile.pfb")) {
2233
+ $fbtype = 'pfb';
2234
  }
2235
+ elseif (file_exists("$basefile.ttf")) {
2236
+ $fbtype = 'ttf';
2237
  }
2238
 
2239
+ $fbfile = "$basefile.$fbtype";
2240
 
2241
  // $pfbfile = substr($fontName,0,strlen($fontName)-4).'.pfb';
2242
  // $ttffile = substr($fontName,0,strlen($fontName)-4).'.ttf';
2243
  $this->addMessage('selectFont: checking for - '.$fbfile);
2244
 
2245
  // OAR - I don't understand this old check
2246
+ // if (substr($fontName, -4) === '.afm' && strlen($fbtype)) {
2247
+ if ($fbtype) {
2248
+ $adobeFontName = isset($font['PostScriptName']) ? $font['PostScriptName'] : $font['FontName'];
2249
  // $fontObj = $this->numObj;
2250
  $this->addMessage("selectFont: adding font file - $fbfile - $adobeFontName");
2251
 
2252
  // find the array of font widths, and put that into an object.
2253
+ $firstChar = -1;
2254
+ $lastChar = 0;
2255
+ $widths = array();
2256
  $cid_widths = array();
2257
 
2258
  foreach ($font['C'] as $num => $d) {
2259
+ if (intval($num) >0 || $num == '0') {
2260
  if (!$font['isUnicode']) {
2261
  // With Unicode, widths array isn't used
2262
+ if ($lastChar>0 && $num>$lastChar+1) {
2263
+ for ($i = $lastChar+1;$i<$num;$i++) {
2264
+ $widths[] = 0;
2265
  }
2266
  }
2267
  }
2268
 
2269
+ $widths[] = $d;
2270
 
2271
  if ($font['isUnicode']) {
2272
+ $cid_widths[$num] = $d;
2273
  }
2274
 
2275
+ if ($firstChar == -1) {
2276
+ $firstChar = $num;
2277
  }
2278
 
2279
+ $lastChar = $num;
2280
  }
2281
  }
2282
 
2283
  // also need to adjust the widths for the differences array
2284
+ if (isset($options['differences'])) {
2285
+ foreach ($options['differences'] as $charNum => $charName) {
2286
+ if ($charNum > $lastChar) {
2287
  if (!$font['isUnicode']) {
2288
  // With Unicode, widths array isn't used
2289
+ for ($i = $lastChar + 1; $i <= $charNum; $i++) {
2290
+ $widths[] = 0;
2291
  }
2292
  }
2293
 
2294
+ $lastChar = $charNum;
2295
  }
2296
 
2297
+ if (isset($font['C'][$charName])) {
2298
+ $widths[$charNum-$firstChar] = $font['C'][$charName];
2299
  if ($font['isUnicode']) {
2300
+ $cid_widths[$charName] = $font['C'][$charName];
2301
  }
2302
  }
2303
  }
2318
  $this->numObj++;
2319
  $this->o_contents($this->numObj, 'new', 'raw');
2320
  $this->objects[$this->numObj]['c'].= '['.implode(' ', $widths).']';
2321
+ $widthid = $this->numObj;
2322
  }
2323
 
2324
  $missing_width = 500;
2325
  $stemV = 70;
2326
 
2327
  if (isset($font['MissingWidth'])) {
2328
+ $missing_width = $font['MissingWidth'];
2329
  }
2330
  if (isset($font['StdVW'])) {
2331
  $stemV = $font['StdVW'];
2340
  $data = file_get_contents($fbfile);
2341
  }
2342
  else {
 
 
2343
  $this->stringSubsets[$fontName][] = 32; // Force space if not in yet
2344
 
2345
  $subset = $this->stringSubsets[$fontName];
2354
  $font_obj->reduce();
2355
 
2356
  // Write new font
2357
+ $tmp_name = "$fbfile.tmp.".uniqid();
2358
  $font_obj->open($tmp_name, Font_Binary_Stream::modeWrite);
2359
  $font_obj->encode(array("OS/2"));
2360
  $font_obj->close();
2364
 
2365
  // Find Unicode char map table
2366
  $subtable = null;
2367
+ foreach ($font_obj->getData("cmap", "subtables") as $_subtable) {
2368
  if ($_subtable["platformID"] == 0 || $_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1) {
2369
  $subtable = $_subtable;
2370
  break;
2379
 
2380
  $cidtogid = str_pad('', max(array_keys($glyphIndexArray))*2+1, "\x00");
2381
  $font['CIDWidths'] = array();
2382
+ foreach ($glyphIndexArray as $cid => $gid) {
 
2383
  if ($cid >= 0 && $cid < 0xFFFF && $gid) {
2384
  $cidtogid[$cid*2] = chr($gid >> 8);
2385
  $cidtogid[$cid*2 + 1] = chr($gid & 0xFF);
2404
 
2405
  // create the font descriptor
2406
  $this->numObj++;
2407
+ $fontDescriptorId = $this->numObj;
2408
 
2409
  $this->numObj++;
2410
+ $pfbid = $this->numObj;
2411
 
2412
  // determine flags (more than a little flakey, hopefully will not matter much)
2413
+ $flags = 0;
2414
 
2415
+ if ($font['ItalicAngle'] != 0) {
2416
  $flags+= pow(2, 6);
2417
  }
2418
 
2419
+ if ($font['IsFixedPitch'] === 'true') {
2420
  $flags+= 1;
2421
  }
2422
 
2423
  $flags+= pow(2, 5); // assume non-sybolic
2424
+ $list = array(
2425
  'Ascent' => 'Ascender',
2426
  'CapHeight' => 'CapHeight',
2427
  'MissingWidth' => 'MissingWidth',
2429
  'FontBBox' => 'FontBBox',
2430
  'ItalicAngle' => 'ItalicAngle'
2431
  );
2432
+ $fdopt = array(
2433
  'Flags' => $flags,
2434
  'FontName' => $adobeFontName,
2435
  'StemV' => $stemV
2436
  );
2437
 
2438
+ foreach ($list as $k => $v) {
2439
+ if (isset($font[$v])) {
2440
+ $fdopt[$k] = $font[$v];
2441
  }
2442
  }
2443
 
2444
+ if ($fbtype === 'pfb') {
2445
+ $fdopt['FontFile'] = $pfbid;
2446
+ } else if ($fbtype === 'ttf') {
2447
+ $fdopt['FontFile2'] = $pfbid;
2448
  }
2449
 
2450
  $this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt);
2454
  $this->objects[$pfbid]['c'].= $data;
2455
 
2456
  // determine the cruicial lengths within this file
2457
+ if ($fbtype === 'pfb') {
2458
+ $l1 = strpos($data, 'eexec') +6;
2459
+ $l2 = strpos($data, '00000000') -$l1;
2460
+ $l3 = mb_strlen($data, '8bit') -$l2-$l1;
2461
  $this->o_contents($this->numObj, 'add', array('Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3));
2462
+ } else if ($fbtype == 'ttf') {
2463
+ $l1 = mb_strlen($data, '8bit');
2464
  $this->o_contents($this->numObj, 'add', array('Length1' => $l1));
2465
  }
2466
 
2467
  // tell the font object about all this new stuff
2468
+ $tmp = array(
2469
  'BaseFont' => $adobeFontName,
2470
  'MissingWidth' => $missing_width,
2471
  'Widths' => $widthid,
2474
  'FontDescriptor' => $fontDescriptorId,
2475
  );
2476
 
2477
+ if ($fbtype === 'ttf') {
2478
+ $tmp['SubType'] = 'TrueType';
2479
  }
2480
 
2481
  $this->addMessage("adding extra info to font.($fontObj)");
2482
 
2483
+ foreach ($tmp as $fk => $fv) {
2484
  $this->addMessage("$fk : $fv");
2485
  }
2486
 
2491
 
2492
  // also set the differences here, note that this means that these will take effect only the
2493
  //first time that a font is selected, else they are ignored
2494
+ if (isset($options['differences'])) {
2495
+ $font['differences'] = $options['differences'];
2496
  }
2497
  }
2498
  }
2499
 
2500
+ if ($set && isset($this->fonts[$fontName])) {
2501
  // so if for some reason the font was not set in the last one then it will not be selected
2502
+ $this->currentBaseFont = $fontName;
2503
 
2504
  // the next lines mean that if a new font is selected, then the current text state will be
2505
  // applied to it as well.
2506
+ $this->currentFont = $this->currentBaseFont;
2507
+ $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum'];
2508
 
2509
  //$this->setCurrentFont();
2510
  }
2511
 
2512
+ return $this->currentFontNum;
2513
  //return $this->numObj;
2514
  }
2515
 
2522
  * If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont
2523
  * This function will change the currentFont to whatever it should be, but will not change the
2524
  * currentBaseFont.
 
 
2525
  */
2526
+ private function setCurrentFont() {
2527
  // if (strlen($this->currentBaseFont) == 0){
2528
  // // then assume an initial font
2529
  // $this->selectFont($this->defaultFont);
2542
  // } else {
2543
  // // the this font must not have the right family member for the current state
2544
  // // simply assume the base font
2545
+ $this->currentFont = $this->currentBaseFont;
2546
+ $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum'];
2547
  // }
2548
  }
2549
 
2552
  * startup - useful if they wish to add something to it later.
2553
  */
2554
  function getFirstPageId() {
2555
+ return $this->firstPageId;
2556
  }
2557
 
2558
  /**
2559
  * add content to the currently active object
 
 
2560
  */
2561
+ private function addContent($content) {
2562
+ $this->objects[$this->currentContents]['c'] .= $content;
2563
  }
2564
 
2565
  /**
2568
  function setColor($color, $force = false) {
2569
  $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null);
2570
 
2571
+ if (!$force && $this->currentColour == $new_color) {
2572
+ return;
2573
+ }
2574
 
2575
  if (isset($new_color[3])) {
2576
  $this->currentColour = $new_color;
2577
+ $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F k", $this->currentColour));
2578
  }
2579
 
2580
  elseif (isset($new_color[2])) {
2581
  $this->currentColour = $new_color;
2582
+ $this->addContent(vsprintf("\n%.3F %.3F %.3F rg", $this->currentColour));
2583
  }
2584
  }
2585
 
2586
  /**
2587
  * sets the colour for stroke operations
2588
  */
2589
+ function setStrokeColor($color, $force = false) {
2590
  $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null);
2591
 
2592
  if (!$force && $this->currentStrokeColour == $new_color) return;
2593
 
2594
  if (isset($new_color[3])) {
2595
  $this->currentStrokeColour = $new_color;
2596
+ $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F K", $this->currentStrokeColour));
2597
  }
2598
 
2599
  elseif (isset($new_color[2])) {
2600
  $this->currentStrokeColour = $new_color;
2601
+ $this->addContent(vsprintf("\n%.3F %.3F %.3F RG", $this->currentStrokeColour));
2602
  }
2603
  }
2604
 
2609
  // Create a new graphics state object
2610
  // FIXME: should actually keep track of states that have already been created...
2611
  $this->numObj++;
2612
+ $this->o_extGState($this->numObj, 'new', $parameters);
2613
+ $this->addContent("\n/GS$this->numStates gs");
2614
  }
2615
 
2616
  /**
2666
  "ColorDogde", "ColorBurn", "HardLight",
2667
  "SoftLight", "Difference", "Exclusion");
2668
 
2669
+ if ( !in_array($mode, $blend_modes) ) {
2670
  $mode = "Normal";
2671
+ }
2672
 
2673
  if ( $mode === $this->currentFillTransparency["mode"] &&
2674
+ $opacity == $this->currentFillTransparency["opacity"] ) {
2675
  return;
2676
+ }
2677
 
2678
  $this->currentFillTransparency["mode"] = $mode;
2679
  $this->currentFillTransparency["opacity"] = $opacity;
2680
 
2681
+ $options = array(
2682
+ "BM" => "/$mode",
2683
+ "ca" => (float)$opacity,
2684
+ );
2685
 
2686
  $this->setGraphicsState($options);
2687
  }
2689
  /**
2690
  * draw a line from one set of coordinates to another
2691
  */
2692
+ function line($x1, $y1, $x2, $y2, $stroke = true) {
2693
+ $this->addContent(sprintf("\n%.3F %.3F m %.3F %.3F l", $x1, $y1, $x2, $y2));
2694
+
2695
+ if ($stroke) {
2696
+ $this->addContent(' S');
2697
+ }
2698
  }
2699
 
2700
  /**
2703
  function curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) {
2704
  // in the current line style, draw a bezier curve from (x0,y0) to (x3,y3) using the other two points
2705
  // as the control points for the curve.
2706
+ $this->addContent(sprintf("\n%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c S", $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3));
 
2707
  }
2708
 
2709
  /**
2710
  * draw a part of an ellipse
2711
  */
2712
+ function partEllipse($x0, $y0, $astart, $afinish, $r1, $r2 = 0, $angle = 0, $nSeg = 8) {
2713
  $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, false);
2714
  }
2715
 
2716
  /**
2717
  * draw a filled ellipse
2718
  */
2719
+ function filledEllipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360) {
2720
+ return $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, true, true);
2721
  }
2722
 
2723
  /**
2727
  * draws an ellipse in the current line style
2728
  * centered at $x0,$y0, radii $r1,$r2
2729
  * if $r2 is not set, then a circle is drawn
2730
+ * from $astart to $afinish, measured in degrees, running anti-clockwise from the right hand side of the ellipse.
2731
  * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a
2732
  * pretty crappy shape at 2, as we are approximating with bezier curves.
2733
  */
2734
+ function ellipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360, $close = true, $fill = false, $stroke = true, $incomplete = false) {
2735
+ if ($r1 == 0) {
2736
  return;
2737
  }
2738
 
2739
+ if ($r2 == 0) {
2740
+ $r2 = $r1;
2741
  }
2742
 
2743
+ if ($nSeg < 2) {
2744
+ $nSeg = 2;
2745
  }
2746
 
2747
+ $astart = deg2rad((float)$astart);
2748
+ $afinish = deg2rad((float)$afinish);
2749
  $totalAngle = $afinish-$astart;
2750
 
2751
+ $dt = $totalAngle/$nSeg;
2752
+ $dtm = $dt/3;
2753
 
2754
+ if ($angle != 0) {
2755
+ $a = -1*deg2rad((float)$angle);
2756
 
2757
+ $this->addContent(sprintf("\n q %.3F %.3F %.3F %.3F %.3F %.3F cm", cos($a), -sin($a), sin($a), cos($a), $x0, $y0));
 
2758
 
2759
+ $x0 = 0;
2760
+ $y0 = 0;
2761
  }
2762
 
2763
+ $t1 = $astart;
2764
+ $a0 = $x0 + $r1*cos($t1);
2765
+ $b0 = $y0 + $r2*sin($t1);
2766
+ $c0 = -$r1 * sin($t1);
2767
+ $d0 = $r2 * cos($t1);
2768
 
2769
+ if (!$incomplete) {
2770
+ $this->addContent(sprintf("\n%.3F %.3F m ", $a0, $b0));
2771
+ }
2772
+
2773
+ for ($i = 1; $i <= $nSeg; $i++) {
2774
  // draw this bit of the total curve
2775
+ $t1 = $i * $dt + $astart;
2776
+ $a1 = $x0 + $r1 * cos($t1);
2777
+ $b1 = $y0 + $r2 * sin($t1);
2778
  $c1 = -$r1 * sin($t1);
2779
+ $d1 = $r2 * cos($t1);
2780
 
2781
+ $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F %.3F %.3F c", ($a0+$c0*$dtm), ($b0+$d0*$dtm), ($a1-$c1*$dtm), ($b1-$d1*$dtm), $a1, $b1));
 
2782
 
2783
+ $a0 = $a1;
2784
+ $b0 = $b1;
2785
+ $c0 = $c1;
2786
+ $d0 = $d1;
2787
  }
2788
 
2789
+ if (!$incomplete) {
2790
+ if ($fill) {
2791
+ $this->addContent(' f');
2792
+ }
2793
+ else if ($close) {
2794
+ $this->addContent(' s'); // small 's' signifies closing the path as well
2795
+ }
2796
+ else if ($stroke) {
2797
+ $this->addContent(' S');
2798
+ }
2799
  }
2800
 
2801
+ if ($angle != 0) {
2802
+ $this->addContent(' Q');
2803
  }
2804
  }
2805
 
2816
  * (2,1) is 2 on, 1 off, 2 on, 1 off.. etc
2817
  * phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts.
2818
  */
2819
+ function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0) {
2820
  // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day
2821
+ $string = '';
2822
 
2823
+ if ($width > 0) {
2824
+ $string.= "$width w";
2825
  }
2826
 
2827
+ $ca = array('butt' => 0, 'round' => 1, 'square' => 2);
2828
 
2829
+ if (isset($ca[$cap])) {
2830
+ $string.= " $ca[$cap] J";
2831
  }
2832
 
2833
+ $ja = array('miter' => 0, 'round' => 1, 'bevel' => 2);
2834
 
2835
+ if (isset($ja[$join])) {
2836
+ $string.= " $ja[$join] j";
2837
  }
2838
 
2839
+ if (is_array($dash)) {
2840
  $string.= ' [ ' . implode(' ', $dash) . " ] $phase d";
2841
  }
2842
 
2843
+ $this->currentLineStyle = $string;
2844
+ $this->addContent("\n$string");
2845
  }
2846
 
2847
  /**
2848
  * draw a polygon, the syntax for this is similar to the GD polygon command
2849
  */
2850
  function polygon($p, $np, $f = false) {
2851
+ $this->addContent(sprintf("\n%.3F %.3F m ", $p[0], $p[1]));
2852
 
2853
+ for ($i = 2; $i < $np * 2; $i = $i + 2) {
2854
+ $this->addContent(sprintf("%.3F %.3F l ", $p[$i], $p[$i+1]));
2855
  }
2856
 
2857
+ if ($f) {
2858
+ $this->addContent(' f');
2859
  } else {
2860
+ $this->addContent(' S');
2861
  }
2862
  }
2863
 
2866
  * the coordinates of the upper-right corner
2867
  */
2868
  function filledRectangle($x1, $y1, $width, $height) {
2869
+ $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re f", $x1, $y1, $width, $height));
2870
  }
2871
 
2872
  /**
2874
  * the coordinates of the upper-right corner
2875
  */
2876
  function rectangle($x1, $y1, $width, $height) {
2877
+ $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re S", $x1, $y1, $width, $height));
2878
  }
2879
 
2880
  /**
2884
  // we must reset the colour cache or it will keep bad colours after clipping
2885
  $this->currentColour = null;
2886
  $this->currentStrokeColour = null;
2887
+ $this->addContent("\nq");
2888
  }
2889
 
2890
  /**
2891
  * restore the last graphic state
2892
  */
2893
  function restore() {
2894
+ $this->addContent("\nQ");
2895
  }
2896
 
2897
  /**
2899
  */
2900
  function clippingRectangle($x1, $y1, $width, $height) {
2901
  $this->save();
2902
+ $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re W n", $x1, $y1, $width, $height));
2903
+ }
2904
+
2905
+ /**
2906
+ * draw a clipping rounded rectangle, all the elements added after this will be clipped
2907
+ */
2908
+ function clippingRectangleRounded($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) {
2909
+ $this->save();
2910
+
2911
+ // start: top edge, left end
2912
+ $this->addContent(sprintf("\n%.3F %.3F m ", $x1, $y1 - $rTL + $h));
2913
+
2914
+ // curve: bottom-left corner
2915
+ $this->ellipse($x1 + $rBL, $y1 + $rBL, $rBL, 0, 0, 8, 180, 270, false, false, false, true);
2916
+
2917
+ // line: right edge, bottom end
2918
+ $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w - $rBR, $y1));
2919
+
2920
+ // curve: bottom-right corner
2921
+ $this->ellipse($x1 + $w - $rBR, $y1 + $rBR, $rBR, 0, 0, 8, 270, 360, false, false, false, true);
2922
+
2923
+ // line: right edge, top end
2924
+ $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w, $y1 + $h - $rTR));
2925
+
2926
+ // curve: bottom-right corner
2927
+ $this->ellipse($x1 + $w - $rTR, $y1 + $h - $rTR, $rTR, 0, 0, 8, 0, 90, false, false, false, true);
2928
+
2929
+ // line: bottom edge, right end
2930
+ $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rTL, $y1 + $h));
2931
+
2932
+ // curve: top-right corner
2933
+ $this->ellipse($x1 + $rTL, $y1 + $h - $rTL, $rTL, 0, 0, 8, 90, 180, false, false, false, true);
2934
+
2935
+ // line: top edge, left end
2936
+ $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rBL, $y1));
2937
+
2938
+ // Close & clip
2939
+ $this->addContent(" W n");
2940
  }
2941
 
2942
  /**
3029
  * @param array $tm transformation matrix
3030
  */
3031
  function transform($tm) {
3032
+ $this->addContent(vsprintf("\n %.3F %.3F %.3F %.3F %.3F %.3F cm", $tm));
 
3033
  }
3034
 
3035
  /**
3036
  * add a new page to the document
3037
  * this also makes the new page the current active object
3038
  */
3039
+ function newPage($insert = 0, $id = 0, $pos = 'after') {
3040
  // if there is a state saved, then go up the stack closing them
3041
  // then on the new page, re-open them with the right setings
3042
 
3043
+ if ($this->nStateStack) {
3044
+ for ($i = $this->nStateStack;$i >= 1;$i--) {
3045
  $this->restoreState($i);
3046
  }
3047
  }
3048
 
3049
  $this->numObj++;
3050
 
3051
+ if ($insert) {
3052
  // the id from the ezPdf class is the id of the contents of the page, not the page object itself
3053
  // query that object to find the parent
3054
+ $rid = $this->objects[$id]['onPage'];
3055
+ $opt = array('rid' => $rid, 'pos' => $pos);
3056
  $this->o_page($this->numObj, 'new', $opt);
3057
  } else {
3058
  $this->o_page($this->numObj, 'new');
3059
  }
3060
 
3061
  // if there is a stack saved, then put that onto the page
3062
+ if ($this->nStateStack) {
3063
+ for ($i = 1;$i <= $this->nStateStack;$i++) {
3064
  $this->saveState($i);
3065
  }
3066
  }
3067
 
3068
  // and if there has been a stroke or fill colour set, then transfer them
3069
+ if (isset($this->currentColour)) {
3070
  $this->setColor($this->currentColour, true);
3071
  }
3072
 
3073
+ if (isset($this->currentStrokeColour)) {
3074
  $this->setStrokeColor($this->currentStrokeColour, true);
3075
  }
3076
 
3077
  // if there is a line style set, then put this in too
3078
+ if (mb_strlen($this->currentLineStyle, '8bit')) {
3079
+ $this->addContent("\n$this->currentLineStyle");
3080
  }
3081
 
3082
  // the call to the o_page object set currentContents to the present page, so this can be returned as the page id
3083
+ return $this->currentContents;
3084
  }
3085
 
3086
  /**
3087
  * output the pdf code, streaming it to the browser
3088
  * the relevant headers are set so that hopefully the browser will recognise it
3089
  */
3090
+ function stream($options = '') {
3091
  // setting the options allows the adjustment of the headers
3092
  // values at the moment are:
3093
  // 'Content-Disposition' => 'filename' - sets the filename, though not too sure how well this will
3097
  // them, so I am leaving it off by default.
3098
  // 'compress' = > 1 or 0 - apply content stream compression, this is on (1) by default
3099
  // 'Attachment' => 1 or 0 - if 1, force the browser to open a download dialog
3100
+ if (!is_array($options)) {
3101
+ $options = array();
3102
  }
3103
 
3104
+ if ( headers_sent()) {
3105
  die("Unable to stream pdf: headers already sent");
3106
+ }
3107
 
3108
  $debug = empty($options['compression']);
3109
+ $tmp = ltrim($this->output($debug));
3110
 
3111
  header("Cache-Control: private");
3112
  header("Content-type: application/pdf");
3113
 
3114
  //FIXME: I don't know that this is sufficient for determining content length (i.e. what about transport compression?)
3115
  header("Content-Length: " . mb_strlen($tmp, '8bit'));
3116
+ $fileName = (isset($options['Content-Disposition']) ? $options['Content-Disposition'] : 'file.pdf');
3117
 
3118
+ if ( !isset($options["Attachment"]))
3119
+ $options["Attachment"] = true;
3120
 
3121
+ $attachment = $options["Attachment"] ? "attachment" : "inline";
3122
 
3123
  header("Content-Disposition: $attachment; filename=\"$fileName\"");
3124
 
3125
+ if (isset($options['Accept-Ranges']) && $options['Accept-Ranges'] == 1) {
3126
  //FIXME: Is this the correct value ... spec says 1#range-unit
3127
  header("Accept-Ranges: " . mb_strlen($tmp, '8bit'));
3128
  }
3135
  * return the height in units of the current font in the given size
3136
  */
3137
  function getFontHeight($size) {
3138
+ if (!$this->numFonts) {
3139
  $this->selectFont($this->defaultFont);
3140
  }
3141
 
3143
 
3144
  // for the current font, and the given size, what is the height of the font in user units
3145
  if ( isset($font['Ascender']) && isset($font['Descender']) ) {
3146
+ $h = $font['Ascender']-$font['Descender'];
3147
  }
3148
  else {
3149
+ $h = $font['FontBBox'][3]-$font['FontBBox'][1];
3150
  }
3151
 
3152
  // have to adjust by a font offset for Windows fonts. unfortunately it looks like
3162
  $h += (int)$font['FontHeightOffset'];
3163
  }
3164
 
3165
+ return $size*$h/1000;
3166
  }
3167
 
3168
  function getFontXHeight($size) {
3169
+ if (!$this->numFonts) {
3170
  $this->selectFont($this->defaultFont);
3171
  }
3172
 
3174
 
3175
  // for the current font, and the given size, what is the height of the font in user units
3176
  if ( isset($font['XHeight']) ) {
3177
+ $xh = $font['Ascender']-$font['Descender'];
3178
  }
3179
  else {
3180
+ $xh = $this->getFontHeight($size) / 2;
3181
  }
3182
 
3183
+ return $size*$xh/1000;
3184
  }
3185
 
3186
  /**
3190
  */
3191
  function getFontDescender($size) {
3192
  // note that this will most likely return a negative value
3193
+ if (!$this->numFonts) {
3194
  $this->selectFont($this->defaultFont);
3195
  }
3196
 
3197
  //$h = $this->fonts[$this->currentFont]['FontBBox'][1];
3198
  $h = $this->fonts[$this->currentFont]['Descender'];
3199
 
3200
+ return $size*$h/1000;
3201
  }
3202
 
3203
  /**
3215
  $cf = $this->currentFont;
3216
  if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) {
3217
  //$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
3218
+ $text = $this->utf8toUtf16BE($text, $bom);
3219
  } else {
3220
  //$text = html_entity_decode($text, ENT_QUOTES);
3221
  $text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8');
3312
  * @return string UTF-16 result string
3313
  */
3314
  function utf8toUtf16BE(&$text, $bom = true) {
3315
+ $cf = $this->currentFont;
3316
  if (!$this->fonts[$cf]['isUnicode']) return $text;
3317
  $out = $bom ? "\xFE\xFF" : '';
3318
 
3331
  }
3332
  return $out;
3333
  }
3334
+
3335
  /**
3336
  * given a start position and information about how text is to be laid out, calculate where
3337
  * on the page the text will end
 
 
3338
  */
3339
+ private function getTextPosition($x, $y, $angle, $size, $wa, $text) {
3340
  // given this information return an array containing x and y for the end position as elements 0 and 1
3341
+ $w = $this->getTextWidth($size, $text);
3342
 
3343
  // need to adjust for the number of spaces in this text
3344
+ $words = explode(' ', $text);
3345
+ $nspaces = count($words) -1;
3346
  $w+= $wa*$nspaces;
3347
+ $a = deg2rad((float)$angle);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3348
 
3349
+ return array(cos($a) *$w+$x, -sin($a) *$w+$y);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3350
  }
3351
 
3352
  /**
3361
 
3362
  function concatMatches($matches) {
3363
  $str = "";
3364
+ foreach ($matches as $match){
3365
  $str .= $match[0];
3366
  }
3367
  return $str;
3385
  /**
3386
  * add text to the document, at a specified location, size and angle on the page
3387
  */
3388
+ function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false) {
3389
+ if (!$this->numFonts) {
3390
  $this->selectFont($this->defaultFont);
3391
  }
3392
 
3405
  }
3406
 
3407
  // if there are any open callbacks, then they should be called, to show the start of the line
3408
+ if ($this->nCallback>0) {
3409
+ for ($i = $this->nCallback;$i>0;$i--) {
3410
  // call each function
3411
+ $info = array(
3412
+ 'x' => $x,
3413
+ 'y' => $y,
3414
+ 'angle' => $angle,
3415
+ 'status' => 'sol',
3416
+ 'p' => $this->callback[$i]['p'],
3417
+ 'nCallback' => $this->callback[$i]['nCallback'],
3418
+ 'height' => $this->callback[$i]['height'],
3419
+ 'descender' => $this->callback[$i]['descender'],
3420
+ );
3421
+
3422
+ $func = $this->callback[$i]['f'];
3423
  $this->$func($info);
3424
  }
3425
  }
3426
 
3427
+ if ($angle == 0) {
3428
+ $this->addContent(sprintf("\nBT %.3F %.3F Td", $x, $y));
3429
  } else {
3430
+ $a = deg2rad((float)$angle);
3431
+ $this->addContent(sprintf("\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm", cos($a), -sin($a), sin($a), cos($a), $x, $y));
3432
+ }
3433
+
3434
+ if ($wordSpaceAdjust != 0 || $wordSpaceAdjust != $this->wordSpaceAdjust) {
3435
+ $this->wordSpaceAdjust = $wordSpaceAdjust;
3436
+ $this->addContent(sprintf(" %.3F Tw", $wordSpaceAdjust));
3437
+ }
3438
+
3439
+ if ($charSpaceAdjust != 0 || $charSpaceAdjust != $this->charSpaceAdjust) {
3440
+ $this->charSpaceAdjust = $charSpaceAdjust;
3441
+ $this->addContent(sprintf(" %.3F Tc", $charSpaceAdjust));
3442
+ }
3443
+
3444
+ $len = mb_strlen($text);
3445
+ $start = 0;
3446
+
3447
+ if ($start < $len) {
3448
+ $part = $text; // OAR - Don't need this anymore, given that $start always equals zero. substr($text, $start);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3449
  $place_text = $this->filterText($part, false);
3450
  // modify unicode text so that extra word spacing is manually implemented (bug #)
3451
  $cf = $this->currentFont;
3454
  //$place_text = str_replace(' ', ') ( ) '.($this->getTextWidth($size, chr(32), $wordSpaceAdjust)*-75).' (', $place_text);
3455
  $place_text = str_replace(' ', ' ) '.(-round($space_scale*$wordSpaceAdjust)).' (', $place_text);
3456
  }
3457
+ $this->addContent(" /F$this->currentFontNum ".sprintf('%.1F Tf ', $size));
3458
+ $this->addContent(" [($place_text)] TJ");
3459
  }
3460
 
3461
+ $this->addContent(' ET');
3462
 
3463
  // if there are any open callbacks, then they should be called, to show the end of the line
3464
+ if ($this->nCallback>0) {
3465
+ for ($i = $this->nCallback;$i>0;$i--) {
3466
  // call each function
3467
+ $tmp = $this->getTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text);
3468
+ $info = array(
3469
  'x' => $tmp[0],
3470
  'y' => $tmp[1],
3471
  'angle' => $angle,
3475
  'height' => $this->callback[$i]['height'],
3476
  'descender' => $this->callback[$i]['descender']
3477
  );
3478
+ $func = $this->callback[$i]['f'];
3479
  $this->$func($info);
3480
  }
3481
  }
3485
  * calculate how wide a given text string will be on a page, at a given size.
3486
  * this can be called externally, but is alse used by the other class functions
3487
  */
3488
+ function getTextWidth($size, $text, $word_spacing = 0, $char_spacing = 0) {
3489
  static $ord_cache = array();
3490
 
3491
  // this function should not change any of the settings, though it will need to
3492
  // track any directives which change during calculation, so copy them at the start
3493
  // and put them back at the end.
3494
+ $store_currentTextState = $this->currentTextState;
3495
 
3496
  if (!$this->numFonts) {
3497
  $this->selectFont($this->defaultFont);
3580
  $this->currentTextState = $store_currentTextState;
3581
  $this->setCurrentFont();
3582
 
3583
+ return $w*$size/1000;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3584
  }
3585
 
3586
  /**
3589
  * This is to get around not being able to have open 'q' across pages
3590
  *
3591
  */
3592
+ function saveState($pageEnd = 0) {
3593
+ if ($pageEnd) {
3594
  // this will be called at a new page to return the state to what it was on the
3595
  // end of the previous page, before the stack was closed down
3596
  // This is to get around not being able to have open 'q' across pages
3597
+ $opt = $this->stateStack[$pageEnd];
3598
  // ok to use this as stack starts numbering at 1
3599
  $this->setColor($opt['col'], true);
3600
  $this->setStrokeColor($opt['str'], true);
3601
+ $this->addContent("\n".$opt['lin']);
3602
  // $this->currentLineStyle = $opt['lin'];
3603
  } else {
3604
  $this->nStateStack++;
3605
+ $this->stateStack[$this->nStateStack] = array(
3606
  'col' => $this->currentColour,
3607
  'str' => $this->currentStrokeColour,
3608
  'lin' => $this->currentLineStyle
3615
  /**
3616
  * restore a previously saved state
3617
  */
3618
+ function restoreState($pageEnd = 0) {
3619
+ if (!$pageEnd) {
3620
+ $n = $this->nStateStack;
3621
  $this->currentColour = $this->stateStack[$n]['col'];
3622
  $this->currentStrokeColour = $this->stateStack[$n]['str'];
3623
+ $this->addContent("\n".$this->stateStack[$n]['lin']);
3624
  $this->currentLineStyle = $this->stateStack[$n]['lin'];
3625
  $this->stateStack[$n] = null;
3626
  unset($this->stateStack[$n]);
3638
  */
3639
  function openObject() {
3640
  $this->nStack++;
3641
+ $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage);
3642
  // add a new object of the content type, to hold the data flow
3643
  $this->numObj++;
3644
  $this->o_contents($this->numObj, 'new');
3645
+ $this->currentContents = $this->numObj;
3646
+ $this->looseObjects[$this->numObj] = 1;
3647
 
3648
+ return $this->numObj;
3649
  }
3650
 
3651
  /**
3653
  */
3654
  function reopenObject($id) {
3655
  $this->nStack++;
3656
+ $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage);
3657
+ $this->currentContents = $id;
3658
 
3659
  // also if this object is the primary contents for a page, then set the current page to its parent
3660
+ if (isset($this->objects[$id]['onPage'])) {
3661
+ $this->currentPage = $this->objects[$id]['onPage'];
3662
  }
3663
  }
3664
 
3668
  function closeObject() {
3669
  // close the object, as long as there was one open in the first place, which will be indicated by
3670
  // an objectId on the stack.
3671
+ if ($this->nStack>0) {
3672
+ $this->currentContents = $this->stack[$this->nStack]['c'];
3673
+ $this->currentPage = $this->stack[$this->nStack]['p'];
3674
  $this->nStack--;
3675
  // easier to probably not worry about removing the old entries, they will be overwritten
3676
  // if there are new ones.
3683
  function stopObject($id) {
3684
  // if an object has been appearing on pages up to now, then stop it, this page will
3685
  // be the last one that could contian it.
3686
+ if (isset($this->addLooseObjects[$id])) {
3687
+ $this->addLooseObjects[$id] = '';
3688
  }
3689
  }
3690
 
3691
  /**
3692
  * after an object has been created, it wil only show if it has been added, using this function.
3693
  */
3694
+ function addObject($id, $options = 'add') {
3695
  // add the specified object to the page
3696
+ if (isset($this->looseObjects[$id]) && $this->currentContents != $id) {
3697
  // then it is a valid object, and it is not being added to itself
3698
  switch ($options) {
3699
+ case 'all':
3700
  // then this object is to be added to this page (done in the next block) and
3701
  // all future new pages.
3702
+ $this->addLooseObjects[$id] = 'all';
3703
 
3704
+ case 'add':
3705
+ if (isset($this->objects[$this->currentContents]['onPage'])) {
3706
  // then the destination contents is the primary for the page
3707
  // (though this object is actually added to that page)
3708
  $this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id);
3709
  }
3710
  break;
3711
 
3712
+ case 'even':
3713
+ $this->addLooseObjects[$id] = 'even';
3714
+ $pageObjectId = $this->objects[$this->currentContents]['onPage'];
3715
+ if ($this->objects[$pageObjectId]['info']['pageNum']%2 == 0) {
3716
  $this->addObject($id);
3717
  // hacky huh :)
3718
  }
3719
  break;
3720
 
3721
+ case 'odd':
3722
+ $this->addLooseObjects[$id] = 'odd';
3723
+ $pageObjectId = $this->objects[$this->currentContents]['onPage'];
3724
+ if ($this->objects[$pageObjectId]['info']['pageNum']%2 == 1) {
3725
  $this->addObject($id);
3726
  // hacky huh :)
3727
  }
3728
  break;
3729
 
3730
+ case 'next':
3731
+ $this->addLooseObjects[$id] = 'all';
3732
  break;
3733
 
3734
+ case 'nexteven':
3735
+ $this->addLooseObjects[$id] = 'even';
3736
  break;
3737
 
3738
+ case 'nextodd':
3739
+ $this->addLooseObjects[$id] = 'odd';
3740
  break;
3741
  }
3742
  }
3746
  * return a storable representation of a specific object
3747
  */
3748
  function serializeObject($id) {
3749
+ if ( array_key_exists($id, $this->objects)) {
3750
+ return serialize($this->objects[$id]);
3751
+ }
3752
  }
3753
 
3754
  /**
3755
  * restore an object from its stored representation. returns its new object id.
3756
  */
3757
  function restoreSerializedObject($obj) {
3758
+ $obj_id = $this->openObject();
3759
+ $this->objects[$obj_id] = unserialize($obj);
3760
  $this->closeObject();
3761
+ return $obj_id;
3762
  }
3763
 
3764
  /**
3765
  * add content to the documents info object
3766
  */
3767
+ function addInfo($label, $value = 0) {
3768
  // this will only work if the label is one of the valid ones.
3769
  // modify this so that arrays can be passed as well.
3770
  // if $label is an array then assume that it is key => value pairs
3771
  // else assume that they are both scalar, anything else will probably error
3772
+ if (is_array($label)) {
3773
  foreach ($label as $l => $v) {
3774
  $this->o_info($this->infoObject, $l, $v);
3775
  }
3781
  /**
3782
  * set the viewer preferences of the document, it is up to the browser to obey these.
3783
  */
3784
+ function setPreferences($label, $value = 0) {
3785
  // this will only work if the label is one of the valid ones.
3786
+ if (is_array($label)) {
3787
  foreach ($label as $l => $v) {
3788
  $this->o_catalog($this->catalogId, 'viewerPreferences', array($l => $v));
3789
  }
3794
 
3795
  /**
3796
  * extract an integer from a position in a byte stream
 
 
3797
  */
3798
+ private function getBytes(&$data, $pos, $num) {
3799
  // return the integer represented by $num bytes from $pos within $data
3800
+ $ret = 0;
3801
+ for ($i = 0; $i < $num; $i++) {
3802
+ $ret *= 256;
3803
+ $ret += ord($data[$pos+$i]);
3804
  }
3805
 
3806
+ return $ret;
3807
  }
3808
 
3809
  /**
3817
  /**
3818
  * add a PNG image into the document, from a GD object
3819
  * this should work with remote files
3820
+ *
3821
+ * @param string $file The PNG file
3822
+ * @param float $x X position
3823
+ * @param float $y Y position
3824
+ * @param float $w Width
3825
+ * @param float $h Height
3826
+ * @param resource $img A GD resource
3827
+ * @param bool $is_mask true if the image is a mask
3828
+ * @param bool $mask true if the image is masked
3829
+ */
3830
+ function addImagePng($file, $x, $y, $w = 0.0, $h = 0.0, &$img, $is_mask = false, $mask = null) {
3831
  //if already cached, need not to read again
3832
  if ( isset($this->imagelist[$file]) ) {
3833
  $data = null;
3847
  //default, but explicitely set to ensure pdf compatibility
3848
  imagesavealpha($img, false/*!$is_mask && !$mask*/);
3849
 
3850
+ $error = 0;
3851
  //DEBUG_IMG_TEMP
3852
  //debugpng
3853
  if (DEBUGPNG) print '[addImagePng '.$file.']';
3864
  if (DEBUGPNG) print 'trouble writing file from GD';
3865
  }
3866
 
3867
+ if ($error) {
3868
  $this->addMessage('PNG error - ('.$file.') '.$errormsg);
3869
  return;
3870
  }
4031
  * add a PNG image into the document, from a file
4032
  * this should work with remote files
4033
  */
4034
+ function addPngFromFile($file, $x, $y, $w = 0, $h = 0) {
4035
  //if already cached, need not to read again
4036
  if ( isset($this->imagelist[$file]) ) {
4037
  $img = null;
4096
  /**
4097
  * add a PNG image into the document, from a memory buffer of the file
4098
  */
4099
+ function addPngFromBuf($file, $x, $y, $w = 0.0, $h = 0.0, &$data, $is_mask = false, $mask = null) {
4100
  if ( isset($this->imagelist[$file]) ) {
4101
  $data = null;
4102
  $info['width'] = $this->imagelist[$file]['w'];
4106
 
4107
  else {
4108
  if ($data == null) {
4109
+ $this->addMessage('addPngFromBuf error - data not present!');
4110
  return;
4111
  }
4112
 
4113
+ $error = 0;
4114
 
4115
+ if (!$error) {
4116
+ $header = chr(137) .chr(80) .chr(78) .chr(71) .chr(13) .chr(10) .chr(26) .chr(10);
4117
 
4118
+ if (mb_substr($data, 0, 8, '8bit') != $header) {
4119
+ $error = 1;
4120
 
4121
  if (DEBUGPNG) print '[addPngFromFile this file does not have a valid header '.$file.']';
4122
 
4123
+ $errormsg = 'this file does not have a valid header';
4124
  }
4125
  }
4126
 
4127
+ if (!$error) {
4128
  // set pointer
4129
+ $p = 8;
4130
+ $len = mb_strlen($data, '8bit');
4131
 
4132
  // cycle through the file, identifying chunks
4133
+ $haveHeader = 0;
4134
+ $info = array();
4135
+ $idata = '';
4136
+ $pdata = '';
4137
 
4138
  while ($p < $len) {
4139
+ $chunkLen = $this->getBytes($data, $p, 4);
4140
+ $chunkType = mb_substr($data, $p+4, 4, '8bit');
4141
 
4142
  switch ($chunkType) {
4143
+ case 'IHDR':
4144
  // this is where all the file information comes from
4145
+ $info['width'] = $this->getBytes($data, $p+8, 4);
4146
+ $info['height'] = $this->getBytes($data, $p+12, 4);
4147
+ $info['bitDepth'] = ord($data[$p+16]);
4148
+ $info['colorType'] = ord($data[$p+17]);
4149
+ $info['compressionMethod'] = ord($data[$p+18]);
4150
+ $info['filterMethod'] = ord($data[$p+19]);
4151
+ $info['interlaceMethod'] = ord($data[$p+20]);
4152
 
4153
  //print_r($info);
4154
+ $haveHeader = 1;
4155
+ if ($info['compressionMethod'] != 0) {
4156
+ $error = 1;
4157
 
4158
  //debugpng
4159
  if (DEBUGPNG) print '[addPngFromFile unsupported compression method '.$file.']';
4160
 
4161
+ $errormsg = 'unsupported compression method';
4162
  }
4163
 
4164
+ if ($info['filterMethod'] != 0) {
4165
+ $error = 1;
4166
 
4167
  //debugpng
4168
  if (DEBUGPNG) print '[addPngFromFile unsupported filter method '.$file.']';
4169
 
4170
+ $errormsg = 'unsupported filter method';
4171
  }
4172
  break;
4173
 
4174
+ case 'PLTE':
4175
  $pdata.= mb_substr($data, $p+8, $chunkLen, '8bit');
4176
  break;
4177
 
4178
+ case 'IDAT':
4179
  $idata.= mb_substr($data, $p+8, $chunkLen, '8bit');
4180
  break;
4181
 
4182
+ case 'tRNS':
4183
  //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk
4184
  //print "tRNS found, color type = ".$info['colorType']."\n";
4185
+ $transparency = array();
4186
 
4187
  switch ($info['colorType']) {
4188
  // indexed color, rbg
4194
  */
4195
  // there will be one entry for each palette entry. up until the last non-opaque entry.
4196
  // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent)
4197
+ $transparency['type'] = 'indexed';
4198
+ $trans = 0;
 
 
4199
 
4200
+ for ($i = $chunkLen;$i >= 0;$i--) {
4201
+ if (ord($data[$p+8+$i]) == 0) {
4202
+ $trans = $i;
4203
  }
4204
  }
4205
 
4206
+ $transparency['data'] = $trans;
4207
  break;
4208
 
4209
  // grayscale
4212
  Gray: 2 bytes, range 0 .. (2^bitdepth)-1
4213
  */
4214
  // $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale
4215
+ $transparency['type'] = 'indexed';
4216
+ $transparency['data'] = ord($data[$p+8+1]);
4217
  break;
4218
 
4219
  // truecolor
4223
  Green: 2 bytes, range 0 .. (2^bitdepth)-1
4224
  Blue: 2 bytes, range 0 .. (2^bitdepth)-1
4225
  */
4226
+ $transparency['r'] = $this->getBytes($data, $p+8, 2);
4227
  // r from truecolor
4228
+ $transparency['g'] = $this->getBytes($data, $p+10, 2);
4229
  // g from truecolor
4230
+ $transparency['b'] = $this->getBytes($data, $p+12, 2);
4231
  // b from truecolor
4232
 
4233
  $transparency['type'] = 'color-key';
4250
  }
4251
 
4252
  if (!$haveHeader) {
4253
+ $error = 1;
4254
 
4255
  //debugpng
4256
  if (DEBUGPNG) print '[addPngFromFile information header is missing '.$file.']';
4257
 
4258
+ $errormsg = 'information header is missing';
4259
  }
4260
 
4261
+ if (isset($info['interlaceMethod']) && $info['interlaceMethod']) {
4262
+ $error = 1;
4263
 
4264
  //debugpng
4265
  if (DEBUGPNG) print '[addPngFromFile no support for interlaced images in pdf '.$file.']';
4266
 
4267
+ $errormsg = 'There appears to be no support for interlaced images in pdf.';
4268
  }
4269
  }
4270
 
4271
+ if (!$error && $info['bitDepth'] > 8) {
4272
+ $error = 1;
4273
 
4274
  //debugpng
4275
  if (DEBUGPNG) print '[addPngFromFile bit depth of 8 or less is supported '.$file.']';
4276
 
4277
+ $errormsg = 'only bit depth of 8 or less is supported';
4278
  }
4279
 
4280
+ if (!$error) {
4281
+ switch ($info['colorType']) {
4282
+ case 3:
4283
+ $color = 'DeviceRGB';
4284
+ $ncolor = 1;
4285
  break;
4286
 
4287
+ case 2:
4288
+ $color = 'DeviceRGB';
4289
+ $ncolor = 3;
4290
  break;
4291
 
4292
+ case 0:
4293
+ $color = 'DeviceGray';
4294
+ $ncolor = 1;
4295
  break;
4296
 
4297
  default:
4298
+ $error = 1;
4299
 
4300
  //debugpng
4301
  if (DEBUGPNG) print '[addPngFromFile alpha channel not supported: '.$info['colorType'].' '.$file.']';
4302
 
4303
+ $errormsg = 'transparancey alpha channel not supported, transparency only supported for palette images.';
4304
  }
4305
  }
4306
 
4307
+ if ($error) {
4308
  $this->addMessage('PNG error - ('.$file.') '.$errormsg);
4309
  return;
4310
  }
4312
  //print_r($info);
4313
  // so this image is ok... add it in.
4314
  $this->numImages++;
4315
+ $im = $this->numImages;
4316
+ $label = "I$im";
4317
  $this->numObj++;
4318
 
4319
  // $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width']));
4320
+ $options = array(
4321
  'label' => $label,
4322
  'data' => $idata,
4323
  'bitsPerComponent' => $info['bitDepth'],
4331
  'isMask' => $is_mask,
4332
  );
4333
 
4334
+ if (isset($transparency)) {
4335
+ $options['transparency'] = $transparency;
4336
  }
4337
 
4338
  $this->o_image($this->numObj, 'new', $options);
4343
  return;
4344
  }
4345
 
4346
+ if ($w <= 0 && $h <= 0) {
4347
+ $w = $info['width'];
4348
+ $h = $info['height'];
4349
  }
4350
 
4351
+ if ($w <= 0) {
4352
+ $w = $h/$info['height']*$info['width'];
4353
  }
4354
 
4355
+ if ($h <= 0) {
4356
+ $h = $w*$info['height']/$info['width'];
4357
  }
4358
 
4359
+ $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ", $w, $h, $x, $y, $label));
4360
  }
4361
 
4362
  /**
4363
  * add a JPEG image into the document, from a file
4364
  */
4365
+ function addJpegFromFile($img, $x, $y, $w = 0, $h = 0) {
4366
  // attempt to add a jpeg image straight from a file, using no GD commands
4367
  // note that this function is unable to operate on a remote file.
4368
 
4369
+ if (!file_exists($img)) {
4370
  return;
4371
  }
4372
 
4382
  $imageHeight = $tmp[1];
4383
 
4384
  if ( isset($tmp['channels']) ) {
4385
+ $channels = $tmp['channels'];
4386
  } else {
4387
+ $channels = 3;
4388
  }
4389
 
4390
+ $data = file_get_contents($img);
4391
  }
4392
 
4393
+ if ($w <= 0 && $h <= 0) {
4394
+ $w = $imageWidth;
4395
  }
4396
 
4397
+ if ($w == 0) {
4398
+ $w = $h/$imageHeight*$imageWidth;
4399
  }
4400
 
4401
+ if ($h == 0) {
4402
+ $h = $w*$imageHeight/$imageWidth;
4403
  }
4404
 
4405
  $this->addJpegImage_common($data, $x, $y, $w, $h, $imageWidth, $imageHeight, $channels, $img);
4407
 
4408
  /**
4409
  * common code used by the two JPEG adding functions
 
 
4410
  */
4411
+ private function addJpegImage_common(&$data, $x, $y, $w = 0, $h = 0, $imageWidth, $imageHeight, $channels = 3, $imgname) {
4412
  if ( $this->image_iscached($imgname) ) {
4413
  $label = $this->imagelist[$imgname]['label'];
4414
  //debugpng
4423
  // note that this function is not to be called externally
4424
  // it is just the common code between the GD and the file options
4425
  $this->numImages++;
4426
+ $im = $this->numImages;
4427
+ $label = "I$im";
4428
  $this->numObj++;
4429
 
4430
  $this->o_image($this->numObj, 'new', array(
4438
  $this->imagelist[$imgname] = array('label' =>$label, 'w' => $imageWidth, 'h' => $imageHeight, 'c'=> $channels );
4439
  }
4440
 
4441
+ $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ ", $w, $h, $x, $y, $label));
4442
  }
4443
 
4444
  /**
4445
  * specify where the document should open when it first starts
4446
  */
4447
+ function openHere($style, $a = 0, $b = 0, $c = 0) {
4448
  // this function will open the document at a specified page, in a specified style
4449
  // the values for style, and the required paramters are:
4450
  // 'XYZ' left, top, zoom
4457
  // 'FitBV' left
4458
  $this->numObj++;
4459
  $this->o_destination($this->numObj, 'new', array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c));
4460
+ $id = $this->catalogId;
4461
  $this->o_catalog($id, 'openHere', $this->numObj);
4462
  }
4463
 
4474
  /**
4475
  * create a labelled destination within the document
4476
  */
4477
+ function addDestination($label, $style, $a = 0, $b = 0, $c = 0) {
4478
  // associates the given label with the destination, it is done this way so that a destination can be specified after
4479
  // it has been linked to
4480
  // styles are the same as the 'openHere' function
4481
  $this->numObj++;
4482
  $this->o_destination($this->numObj, 'new', array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c));
4483
+ $id = $this->numObj;
4484
 
4485
  // store the label->idf relationship, note that this means that labels can be used only once
4486
+ $this->destinations["$label"] = $id;
4487
  }
4488
 
4489
  /**
4491
  * and for the user to add new ones for their fonts. The default bahavious can be overridden should
4492
  * that be desired.
4493
  */
4494
+ function setFontFamily($family, $options = '') {
4495
+ if (!is_array($options)) {
4496
+ if ($family === 'init') {
4497
  // set the known family groups
4498
  // these font families will be used to enable bold and italic markers to be included
4499
  // within text streams. html forms will be used... <b></b> <i></i>
4500
  $this->fontFamilies['Helvetica.afm'] =
4501
+ array(
4502
+ 'b' => 'Helvetica-Bold.afm',
4503
+ 'i' => 'Helvetica-Oblique.afm',
4504
+ 'bi' => 'Helvetica-BoldOblique.afm',
4505
+ 'ib' => 'Helvetica-BoldOblique.afm',
4506
+ );
4507
 
4508
  $this->fontFamilies['Courier.afm'] =
4509
+ array(
4510
+ 'b' => 'Courier-Bold.afm',
4511
+ 'i' => 'Courier-Oblique.afm',
4512
+ 'bi' => 'Courier-BoldOblique.afm',
4513
+ 'ib' => 'Courier-BoldOblique.afm',
4514
+ );
4515
 
4516
  $this->fontFamilies['Times-Roman.afm'] =
4517
+ array(
4518
+ 'b' => 'Times-Bold.afm',
4519
+ 'i' => 'Times-Italic.afm',
4520
+ 'bi' => 'Times-BoldItalic.afm',
4521
+ 'ib' => 'Times-BoldItalic.afm',
4522
+ );
4523
  }
4524
  } else {
4525
 
4526
  // the user is trying to set a font family
4527
  // note that this can also be used to set the base ones to something else
4528
+ if (mb_strlen($family)) {
4529
+ $this->fontFamilies[$family] = $options;
4530
  }
4531
  }
4532
  }
4542
  * a few functions which should allow the document to be treated transactionally.
4543
  */
4544
  function transaction($action) {
4545
+ switch ($action) {
4546
  case 'start':
4547
  // store all the data away into the checkpoint variable
4548
+ $data = get_object_vars($this);
4549
+ $this->checkpoint = $data;
4550
  unset($data);
4551
  break;
4552
 
4553
  case 'commit':
4554
+ if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) {
4555
+ $tmp = $this->checkpoint['checkpoint'];
4556
+ $this->checkpoint = $tmp;
4557
  unset($tmp);
4558
  } else {
4559
+ $this->checkpoint = '';
4560
  }
4561
  break;
4562
 
4563
  case 'rewind':
4564
  // do not destroy the current checkpoint, but move us back to the state then, so that we can try again
4565
+ if (is_array($this->checkpoint)) {
4566
  // can only abort if were inside a checkpoint
4567
+ $tmp = $this->checkpoint;
4568
 
4569
  foreach ($tmp as $k => $v) {
4570
+ if ($k !== 'checkpoint') {
4571
+ $this->$k = $v;
4572
  }
4573
  }
4574
  unset($tmp);
4576
  break;
4577
 
4578
  case 'abort':
4579
+ if (is_array($this->checkpoint)) {
4580
  // can only abort if were inside a checkpoint
4581
+ $tmp = $this->checkpoint;
4582
  foreach ($tmp as $k => $v) {
4583
+ $this->$k = $v;
4584
  }
4585
  unset($tmp);
4586
  }
4588
  }
4589
  }
4590
  }
 
dompdf/lib/fonts/DejaVuSans-Bold.ufm CHANGED
@@ -1,340 +1,347 @@
1
  StartFontMetrics 4.1
2
- FontName DejaVuSans-Bold
3
- FullName DejaVu Sans Bold
4
- Notice Converted by DOMPDF
5
  EncodingScheme FontSpecific
6
- FamilyName DejaVu Sans
 
 
 
 
 
 
 
 
 
 
7
  Weight Bold
8
- Version 65536
9
- Characters
10
  ItalicAngle 0
11
- Ascender 928.22265625
12
- Descender -235.83984375
13
- UnderlineThickness 43.9453125
14
  IsFixedPitch false
 
 
 
 
 
15
  FontBBox -1069 -415 1975 1174
16
- StemV 165
17
- StartCharMetrics 5180
18
- U 0 ; WX 5395 ; N uni0000 ; G 0
19
- U 32 ; WX 348 ; N uni0020 ; G 3
20
- U 33 ; WX 456 ; N uni0021 ; G 4
21
- U 34 ; WX 521 ; N uni0022 ; G 5
22
- U 35 ; WX 838 ; N uni0023 ; G 6
23
- U 36 ; WX 696 ; N uni0024 ; G 7
24
- U 37 ; WX 1002 ; N uni0025 ; G 8
25
- U 38 ; WX 872 ; N uni0026 ; G 9
26
- U 39 ; WX 306 ; N uni0027 ; G 10
27
- U 40 ; WX 457 ; N uni0028 ; G 11
28
- U 41 ; WX 457 ; N uni0029 ; G 12
29
- U 42 ; WX 523 ; N uni002a ; G 13
30
- U 43 ; WX 838 ; N uni002b ; G 14
31
- U 44 ; WX 380 ; N uni002c ; G 15
32
- U 45 ; WX 415 ; N uni002d ; G 16
33
- U 46 ; WX 380 ; N uni002e ; G 17
34
- U 47 ; WX 365 ; N uni002f ; G 18
35
- U 48 ; WX 696 ; N uni0030 ; G 19
36
- U 49 ; WX 696 ; N uni0031 ; G 20
37
- U 50 ; WX 696 ; N uni0032 ; G 21
38
- U 51 ; WX 696 ; N uni0033 ; G 22
39
- U 52 ; WX 696 ; N uni0034 ; G 23
40
- U 53 ; WX 696 ; N uni0035 ; G 24
41
- U 54 ; WX 696 ; N uni0036 ; G 25
42
- U 55 ; WX 696 ; N uni0037 ; G 26
43
- U 56 ; WX 696 ; N uni0038 ; G 27
44
- U 57 ; WX 696 ; N uni0039 ; G 28
45
- U 58 ; WX 400 ; N uni003a ; G 29
46
- U 59 ; WX 400 ; N uni003b ; G 30
47
- U 60 ; WX 838 ; N uni003c ; G 31
48
- U 61 ; WX 838 ; N uni003d ; G 32
49
- U 62 ; WX 838 ; N uni003e ; G 33
50
- U 63 ; WX 580 ; N uni003f ; G 34
51
- U 64 ; WX 1000 ; N uni0040 ; G 35
52
- U 65 ; WX 774 ; N uni0041 ; G 36
53
- U 66 ; WX 762 ; N uni0042 ; G 37
54
- U 67 ; WX 734 ; N uni0043 ; G 38
55
- U 68 ; WX 830 ; N uni0044 ; G 39
56
- U 69 ; WX 683 ; N uni0045 ; G 40
57
- U 70 ; WX 683 ; N uni0046 ; G 41
58
- U 71 ; WX 821 ; N uni0047 ; G 42
59
- U 72 ; WX 837 ; N uni0048 ; G 43
60
- U 73 ; WX 372 ; N uni0049 ; G 44
61
- U 74 ; WX 372 ; N uni004a ; G 45
62
- U 75 ; WX 775 ; N uni004b ; G 46
63
- U 76 ; WX 637 ; N uni004c ; G 47
64
- U 77 ; WX 995 ; N uni004d ; G 48
65
- U 78 ; WX 837 ; N uni004e ; G 49
66
- U 79 ; WX 850 ; N uni004f ; G 50
67
- U 80 ; WX 733 ; N uni0050 ; G 51
68
- U 81 ; WX 850 ; N uni0051 ; G 52
69
- U 82 ; WX 770 ; N uni0052 ; G 53
70
- U 83 ; WX 720 ; N uni0053 ; G 54
71
- U 84 ; WX 682 ; N uni0054 ; G 55
72
- U 85 ; WX 812 ; N uni0055 ; G 56
73
- U 86 ; WX 774 ; N uni0056 ; G 57
74
- U 87 ; WX 1103 ; N uni0057 ; G 58
75
- U 88 ; WX 771 ; N uni0058 ; G 59
76
- U 89 ; WX 724 ; N uni0059 ; G 60
77
- U 90 ; WX 725 ; N uni005a ; G 61
78
- U 91 ; WX 457 ; N uni005b ; G 62
79
- U 92 ; WX 365 ; N uni005c ; G 63
80
- U 93 ; WX 457 ; N uni005d ; G 64
81
- U 94 ; WX 838 ; N uni005e ; G 65
82
- U 95 ; WX 500 ; N uni005f ; G 66
83
- U 96 ; WX 500 ; N uni0060 ; G 67
84
- U 97 ; WX 675 ; N uni0061 ; G 68
85
- U 98 ; WX 716 ; N uni0062 ; G 69
86
- U 99 ; WX 593 ; N uni0063 ; G 70
87
- U 100 ; WX 716 ; N uni0064 ; G 71
88
- U 101 ; WX 678 ; N uni0065 ; G 72
89
- U 102 ; WX 435 ; N uni0066 ; G 73
90
- U 103 ; WX 716 ; N uni0067 ; G 74
91
- U 104 ; WX 712 ; N uni0068 ; G 75
92
- U 105 ; WX 343 ; N uni0069 ; G 76
93
- U 106 ; WX 343 ; N uni006a ; G 77
94
- U 107 ; WX 665 ; N uni006b ; G 78
95
- U 108 ; WX 343 ; N uni006c ; G 79
96
- U 109 ; WX 1042 ; N uni006d ; G 80
97
- U 110 ; WX 712 ; N uni006e ; G 81
98
- U 111 ; WX 687 ; N uni006f ; G 82
99
- U 112 ; WX 716 ; N uni0070 ; G 83
100
- U 113 ; WX 716 ; N uni0071 ; G 84
101
- U 114 ; WX 493 ; N uni0072 ; G 85
102
- U 115 ; WX 595 ; N uni0073 ; G 86
103
- U 116 ; WX 478 ; N uni0074 ; G 87
104
- U 117 ; WX 712 ; N uni0075 ; G 88
105
- U 118 ; WX 652 ; N uni0076 ; G 89
106
- U 119 ; WX 924 ; N uni0077 ; G 90
107
- U 120 ; WX 645 ; N uni0078 ; G 91
108
- U 121 ; WX 652 ; N uni0079 ; G 92
109
- U 122 ; WX 582 ; N uni007a ; G 93
110
- U 123 ; WX 712 ; N uni007b ; G 94
111
- U 124 ; WX 365 ; N uni007c ; G 95
112
- U 125 ; WX 712 ; N uni007d ; G 96
113
- U 126 ; WX 838 ; N uni007e ; G 97
114
- U 160 ; WX 348 ; N uni00a0 ; G 98
115
- U 161 ; WX 456 ; N uni00a1 ; G 99
116
- U 162 ; WX 696 ; N uni00a2 ; G 100
117
- U 163 ; WX 696 ; N uni00a3 ; G 101
118
- U 164 ; WX 636 ; N uni00a4 ; G 102
119
- U 165 ; WX 696 ; N uni00a5 ; G 103
120
- U 166 ; WX 365 ; N uni00a6 ; G 104
121
- U 167 ; WX 500 ; N uni00a7 ; G 105
122
- U 168 ; WX 500 ; N uni00a8 ; G 106
123
- U 169 ; WX 1000 ; N uni00a9 ; G 107
124
- U 170 ; WX 564 ; N uni00aa ; G 108
125
- U 171 ; WX 646 ; N uni00ab ; G 109
126
- U 172 ; WX 838 ; N uni00ac ; G 110
127
- U 173 ; WX 415 ; N uni00ad ; G 111
128
- U 174 ; WX 1000 ; N uni00ae ; G 112
129
- U 175 ; WX 500 ; N uni00af ; G 113
130
- U 176 ; WX 500 ; N uni00b0 ; G 114
131
- U 177 ; WX 838 ; N uni00b1 ; G 115
132
- U 178 ; WX 438 ; N uni00b2 ; G 116
133
- U 179 ; WX 438 ; N uni00b3 ; G 117
134
- U 180 ; WX 500 ; N uni00b4 ; G 118
135
- U 181 ; WX 736 ; N uni00b5 ; G 119
136
- U 182 ; WX 636 ; N uni00b6 ; G 120
137
- U 183 ; WX 380 ; N uni00b7 ; G 121
138
- U 184 ; WX 500 ; N uni00b8 ; G 122
139
- U 185 ; WX 438 ; N uni00b9 ; G 123
140
- U 186 ; WX 564 ; N uni00ba ; G 124
141
- U 187 ; WX 646 ; N uni00bb ; G 125
142
- U 188 ; WX 1035 ; N uni00bc ; G 126
143
- U 189 ; WX 1035 ; N uni00bd ; G 127
144
- U 190 ; WX 1035 ; N uni00be ; G 128
145
- U 191 ; WX 580 ; N uni00bf ; G 129
146
- U 192 ; WX 774 ; N uni00c0 ; G 130
147
- U 193 ; WX 774 ; N uni00c1 ; G 131
148
- U 194 ; WX 774 ; N uni00c2 ; G 132
149
- U 195 ; WX 774 ; N uni00c3 ; G 133
150
- U 196 ; WX 774 ; N uni00c4 ; G 134
151
- U 197 ; WX 774 ; N uni00c5 ; G 135
152
- U 198 ; WX 1085 ; N uni00c6 ; G 136
153
- U 199 ; WX 734 ; N uni00c7 ; G 137
154
- U 200 ; WX 683 ; N uni00c8 ; G 138
155
- U 201 ; WX 683 ; N uni00c9 ; G 139
156
- U 202 ; WX 683 ; N uni00ca ; G 140
157
- U 203 ; WX 683 ; N uni00cb ; G 141
158
- U 204 ; WX 372 ; N uni00cc ; G 142
159
- U 205 ; WX 372 ; N uni00cd ; G 143
160
- U 206 ; WX 372 ; N uni00ce ; G 144
161
- U 207 ; WX 372 ; N uni00cf ; G 145
162
- U 208 ; WX 838 ; N uni00d0 ; G 146
163
- U 209 ; WX 837 ; N uni00d1 ; G 147
164
- U 210 ; WX 850 ; N uni00d2 ; G 148
165
- U 211 ; WX 850 ; N uni00d3 ; G 149
166
- U 212 ; WX 850 ; N uni00d4 ; G 150
167
- U 213 ; WX 850 ; N uni00d5 ; G 151
168
- U 214 ; WX 850 ; N uni00d6 ; G 152
169
- U 215 ; WX 838 ; N uni00d7 ; G 153
170
- U 216 ; WX 850 ; N uni00d8 ; G 154
171
- U 217 ; WX 812 ; N uni00d9 ; G 155
172
- U 218 ; WX 812 ; N uni00da ; G 156
173
- U 219 ; WX 812 ; N uni00db ; G 157
174
- U 220 ; WX 812 ; N uni00dc ; G 158
175
- U 221 ; WX 724 ; N uni00dd ; G 159
176
- U 222 ; WX 738 ; N uni00de ; G 160
177
- U 223 ; WX 719 ; N uni00df ; G 161
178
- U 224 ; WX 675 ; N uni00e0 ; G 162
179
- U 225 ; WX 675 ; N uni00e1 ; G 163
180
- U 226 ; WX 675 ; N uni00e2 ; G 164
181
- U 227 ; WX 675 ; N uni00e3 ; G 165
182
- U 228 ; WX 675 ; N uni00e4 ; G 166
183
- U 229 ; WX 675 ; N uni00e5 ; G 167
184
- U 230 ; WX 1048 ; N uni00e6 ; G 168
185
- U 231 ; WX 593 ; N uni00e7 ; G 169
186
- U 232 ; WX 678 ; N uni00e8 ; G 170
187
- U 233 ; WX 678 ; N uni00e9 ; G 171
188
- U 234 ; WX 678 ; N uni00ea ; G 172
189
- U 235 ; WX 678 ; N uni00eb ; G 173
190
- U 236 ; WX 343 ; N uni00ec ; G 174
191
- U 237 ; WX 343 ; N uni00ed ; G 175
192
- U 238 ; WX 343 ; N uni00ee ; G 176
193
- U 239 ; WX 343 ; N uni00ef ; G 177
194
- U 240 ; WX 687 ; N uni00f0 ; G 178
195
- U 241 ; WX 712 ; N uni00f1 ; G 179
196
- U 242 ; WX 687 ; N uni00f2 ; G 180
197
- U 243 ; WX 687 ; N uni00f3 ; G 181
198
- U 244 ; WX 687 ; N uni00f4 ; G 182
199
- U 245 ; WX 687 ; N uni00f5 ; G 183
200
- U 246 ; WX 687 ; N uni00f6 ; G 184
201
- U 247 ; WX 838 ; N uni00f7 ; G 185
202
- U 248 ; WX 687 ; N uni00f8 ; G 186
203
- U 249 ; WX 712 ; N uni00f9 ; G 187
204
- U 250 ; WX 712 ; N uni00fa ; G 188
205
- U 251 ; WX 712 ; N uni00fb ; G 189
206
- U 252 ; WX 712 ; N uni00fc ; G 190
207
- U 253 ; WX 652 ; N uni00fd ; G 191
208
- U 254 ; WX 716 ; N uni00fe ; G 192
209
- U 255 ; WX 652 ; N uni00ff ; G 193
210
- U 256 ; WX 774 ; N uni0100 ; G 194
211
- U 257 ; WX 675 ; N uni0101 ; G 195
212
- U 258 ; WX 774 ; N uni0102 ; G 196
213
- U 259 ; WX 675 ; N uni0103 ; G 197
214
- U 260 ; WX 774 ; N uni0104 ; G 198
215
- U 261 ; WX 675 ; N uni0105 ; G 199
216
- U 262 ; WX 734 ; N uni0106 ; G 200
217
- U 263 ; WX 593 ; N uni0107 ; G 201
218
- U 264 ; WX 734 ; N uni0108 ; G 202
219
- U 265 ; WX 593 ; N uni0109 ; G 203
220
- U 266 ; WX 734 ; N uni010a ; G 204
221
- U 267 ; WX 593 ; N uni010b ; G 205
222
- U 268 ; WX 734 ; N uni010c ; G 206
223
- U 269 ; WX 593 ; N uni010d ; G 207
224
- U 270 ; WX 830 ; N uni010e ; G 208
225
- U 271 ; WX 716 ; N uni010f ; G 209
226
- U 272 ; WX 838 ; N uni0110 ; G 210
227
- U 273 ; WX 716 ; N uni0111 ; G 211
228
- U 274 ; WX 683 ; N uni0112 ; G 212
229
- U 275 ; WX 678 ; N uni0113 ; G 213
230
- U 276 ; WX 683 ; N uni0114 ; G 214
231
- U 277 ; WX 678 ; N uni0115 ; G 215
232
- U 278 ; WX 683 ; N uni0116 ; G 216
233
- U 279 ; WX 678 ; N uni0117 ; G 217
234
- U 280 ; WX 683 ; N uni0118 ; G 218
235
- U 281 ; WX 678 ; N uni0119 ; G 219
236
- U 282 ; WX 683 ; N uni011a ; G 220
237
- U 283 ; WX 678 ; N uni011b ; G 221
238
- U 284 ; WX 821 ; N uni011c ; G 222
239
- U 285 ; WX 716 ; N uni011d ; G 223
240
- U 286 ; WX 821 ; N uni011e ; G 224
241
- U 287 ; WX 716 ; N uni011f ; G 225
242
- U 288 ; WX 821 ; N uni0120 ; G 226
243
- U 289 ; WX 716 ; N uni0121 ; G 227
244
- U 290 ; WX 821 ; N uni0122 ; G 228
245
- U 291 ; WX 716 ; N uni0123 ; G 229
246
- U 292 ; WX 837 ; N uni0124 ; G 230
247
- U 293 ; WX 712 ; N uni0125 ; G 231
248
- U 294 ; WX 974 ; N uni0126 ; G 232
249
- U 295 ; WX 790 ; N uni0127 ; G 233
250
- U 296 ; WX 372 ; N uni0128 ; G 234
251
- U 297 ; WX 343 ; N uni0129 ; G 235
252
- U 298 ; WX 372 ; N uni012a ; G 236
253
- U 299 ; WX 343 ; N uni012b ; G 237
254
- U 300 ; WX 372 ; N uni012c ; G 238
255
- U 301 ; WX 343 ; N uni012d ; G 239
256
- U 302 ; WX 372 ; N uni012e ; G 240
257
- U 303 ; WX 343 ; N uni012f ; G 241
258
- U 304 ; WX 372 ; N uni0130 ; G 242
259
- U 305 ; WX 343 ; N uni0131 ; G 243
260
- U 306 ; WX 744 ; N uni0132 ; G 244
261
- U 307 ; WX 686 ; N uni0133 ; G 245
262
- U 308 ; WX 372 ; N uni0134 ; G 246
263
- U 309 ; WX 343 ; N uni0135 ; G 247
264
- U 310 ; WX 775 ; N uni0136 ; G 248
265
- U 311 ; WX 665 ; N uni0137 ; G 249
266
- U 312 ; WX 665 ; N uni0138 ; G 250
267
- U 313 ; WX 637 ; N uni0139 ; G 251
268
- U 314 ; WX 343 ; N uni013a ; G 252
269
- U 315 ; WX 637 ; N uni013b ; G 253
270
- U 316 ; WX 343 ; N uni013c ; G 254
271
- U 317 ; WX 637 ; N uni013d ; G 255
272
- U 318 ; WX 479 ; N uni013e ; G 256
273
- U 319 ; WX 637 ; N uni013f ; G 257
274
- U 320 ; WX 557 ; N uni0140 ; G 258
275
- U 321 ; WX 642 ; N uni0141 ; G 259
276
- U 322 ; WX 371 ; N uni0142 ; G 260
277
- U 323 ; WX 837 ; N uni0143 ; G 261
278
- U 324 ; WX 712 ; N uni0144 ; G 262
279
- U 325 ; WX 837 ; N uni0145 ; G 263
280
- U 326 ; WX 712 ; N uni0146 ; G 264
281
- U 327 ; WX 837 ; N uni0147 ; G 265
282
- U 328 ; WX 712 ; N uni0148 ; G 266
283
- U 329 ; WX 983 ; N uni0149 ; G 267
284
- U 330 ; WX 837 ; N uni014a ; G 268
285
- U 331 ; WX 712 ; N uni014b ; G 269
286
- U 332 ; WX 850 ; N uni014c ; G 270
287
- U 333 ; WX 687 ; N uni014d ; G 271
288
- U 334 ; WX 850 ; N uni014e ; G 272
289
- U 335 ; WX 687 ; N uni014f ; G 273
290
- U 336 ; WX 850 ; N uni0150 ; G 274
291
- U 337 ; WX 687 ; N uni0151 ; G 275
292
- U 338 ; WX 1167 ; N uni0152 ; G 276
293
- U 339 ; WX 1094 ; N uni0153 ; G 277
294
- U 340 ; WX 770 ; N uni0154 ; G 278
295
- U 341 ; WX 493 ; N uni0155 ; G 279
296
- U 342 ; WX 770 ; N uni0156 ; G 280
297
- U 343 ; WX 493 ; N uni0157 ; G 281
298
- U 344 ; WX 770 ; N uni0158 ; G 282
299
- U 345 ; WX 493 ; N uni0159 ; G 283
300
- U 346 ; WX 720 ; N uni015a ; G 284
301
- U 347 ; WX 595 ; N uni015b ; G 285
302
- U 348 ; WX 720 ; N uni015c ; G 286
303
- U 349 ; WX 595 ; N uni015d ; G 287
304
- U 350 ; WX 720 ; N uni015e ; G 288
305
- U 351 ; WX 595 ; N uni015f ; G 289
306
- U 352 ; WX 720 ; N uni0160 ; G 290
307
- U 353 ; WX 595 ; N uni0161 ; G 291
308
- U 354 ; WX 682 ; N uni0162 ; G 292
309
- U 355 ; WX 478 ; N uni0163 ; G 293
310
- U 356 ; WX 682 ; N uni0164 ; G 294
311
- U 357 ; WX 478 ; N uni0165 ; G 295
312
- U 358 ; WX 682 ; N uni0166 ; G 296
313
- U 359 ; WX 478 ; N uni0167 ; G 297
314
- U 360 ; WX 812 ; N uni0168 ; G 298
315
- U 361 ; WX 712 ; N uni0169 ; G 299
316
- U 362 ; WX 812 ; N uni016a ; G 300
317
- U 363 ; WX 712 ; N uni016b ; G 301
318
- U 364 ; WX 812 ; N uni016c ; G 302
319
- U 365 ; WX 712 ; N uni016d ; G 303
320
- U 366 ; WX 812 ; N uni016e ; G 304
321
- U 367 ; WX 712 ; N uni016f ; G 305
322
- U 368 ; WX 812 ; N uni0170 ; G 306
323
- U 369 ; WX 712 ; N uni0171 ; G 307
324
- U 370 ; WX 812 ; N uni0172 ; G 308
325
- U 371 ; WX 712 ; N uni0173 ; G 309
326
- U 372 ; WX 1103 ; N uni0174 ; G 310
327
- U 373 ; WX 924 ; N uni0175 ; G 311
328
- U 374 ; WX 724 ; N uni0176 ; G 312
329
- U 375 ; WX 652 ; N uni0177 ; G 313
330
- U 376 ; WX 724 ; N uni0178 ; G 314
331
- U 377 ; WX 725 ; N uni0179 ; G 315
332
- U 378 ; WX 582 ; N uni017a ; G 316
333
- U 379 ; WX 725 ; N uni017b ; G 317
334
- U 380 ; WX 582 ; N uni017c ; G 318
335
- U 381 ; WX 725 ; N uni017d ; G 319
336
- U 382 ; WX 582 ; N uni017e ; G 320
337
- U 383 ; WX 435 ; N uni017f ; G 321
338
  U 384 ; WX 716 ; N uni0180 ; G 322
339
  U 385 ; WX 811 ; N uni0181 ; G 323
340
  U 386 ; WX 762 ; N uni0182 ; G 324
@@ -345,15 +352,15 @@ U 390 ; WX 734 ; N uni0186 ; G 328
345
  U 391 ; WX 734 ; N uni0187 ; G 329
346
  U 392 ; WX 593 ; N uni0188 ; G 330
347
  U 393 ; WX 838 ; N uni0189 ; G 331
348
- U 394 ; WX 879 ; N uni018a ; G 332
349
- U 395 ; WX 757 ; N uni018b ; G 333
350
- U 396 ; WX 716 ; N uni018c ; G 334
351
- U 397 ; WX 688 ; N uni018d ; G 335
352
- U 398 ; WX 683 ; N uni018e ; G 336
353
- U 399 ; WX 849 ; N uni018f ; G 337
354
  U 400 ; WX 696 ; N uni0190 ; G 338
355
  U 401 ; WX 683 ; N uni0191 ; G 339
356
- U 402 ; WX 435 ; N uni0192 ; G 340
357
  U 403 ; WX 821 ; N uni0193 ; G 341
358
  U 404 ; WX 793 ; N uni0194 ; G 342
359
  U 405 ; WX 1045 ; N uni0195 ; G 343
@@ -361,108 +368,108 @@ U 406 ; WX 436 ; N uni0196 ; G 344
361
  U 407 ; WX 389 ; N uni0197 ; G 345
362
  U 408 ; WX 775 ; N uni0198 ; G 346
363
  U 409 ; WX 665 ; N uni0199 ; G 347
364
- U 410 ; WX 360 ; N uni019a ; G 348
365
- U 411 ; WX 592 ; N uni019b ; G 349
366
- U 412 ; WX 1042 ; N uni019c ; G 350
367
- U 413 ; WX 837 ; N uni019d ; G 351
368
- U 414 ; WX 712 ; N uni019e ; G 352
369
- U 415 ; WX 850 ; N uni019f ; G 353
370
- U 416 ; WX 874 ; N uni01a0 ; G 354
371
- U 417 ; WX 687 ; N uni01a1 ; G 355
372
- U 418 ; WX 1083 ; N uni01a2 ; G 356
373
- U 419 ; WX 912 ; N uni01a3 ; G 357
374
- U 420 ; WX 782 ; N uni01a4 ; G 358
375
- U 421 ; WX 716 ; N uni01a5 ; G 359
376
- U 422 ; WX 770 ; N uni01a6 ; G 360
377
- U 423 ; WX 720 ; N uni01a7 ; G 361
378
- U 424 ; WX 595 ; N uni01a8 ; G 362
379
- U 425 ; WX 683 ; N uni01a9 ; G 363
380
- U 426 ; WX 552 ; N uni01aa ; G 364
381
- U 427 ; WX 478 ; N uni01ab ; G 365
382
- U 428 ; WX 707 ; N uni01ac ; G 366
383
- U 429 ; WX 478 ; N uni01ad ; G 367
384
- U 430 ; WX 682 ; N uni01ae ; G 368
385
- U 431 ; WX 835 ; N uni01af ; G 369
386
- U 432 ; WX 712 ; N uni01b0 ; G 370
387
- U 433 ; WX 850 ; N uni01b1 ; G 371
388
- U 434 ; WX 813 ; N uni01b2 ; G 372
389
- U 435 ; WX 797 ; N uni01b3 ; G 373
390
- U 436 ; WX 778 ; N uni01b4 ; G 374
391
- U 437 ; WX 725 ; N uni01b5 ; G 375
392
- U 438 ; WX 582 ; N uni01b6 ; G 376
393
- U 439 ; WX 772 ; N uni01b7 ; G 377
394
- U 440 ; WX 772 ; N uni01b8 ; G 378
395
- U 441 ; WX 641 ; N uni01b9 ; G 379
396
- U 442 ; WX 582 ; N uni01ba ; G 380
397
- U 443 ; WX 696 ; N uni01bb ; G 381
398
- U 444 ; WX 772 ; N uni01bc ; G 382
399
- U 445 ; WX 641 ; N uni01bd ; G 383
400
- U 446 ; WX 573 ; N uni01be ; G 384
401
- U 447 ; WX 716 ; N uni01bf ; G 385
402
- U 448 ; WX 372 ; N uni01c0 ; G 386
403
- U 449 ; WX 659 ; N uni01c1 ; G 387
404
- U 450 ; WX 544 ; N uni01c2 ; G 388
405
- U 451 ; WX 372 ; N uni01c3 ; G 389
406
- U 452 ; WX 1555 ; N uni01c4 ; G 390
407
- U 453 ; WX 1412 ; N uni01c5 ; G 391
408
- U 454 ; WX 1298 ; N uni01c6 ; G 392
409
- U 455 ; WX 1009 ; N uni01c7 ; G 393
410
- U 456 ; WX 980 ; N uni01c8 ; G 394
411
- U 457 ; WX 686 ; N uni01c9 ; G 395
412
- U 458 ; WX 1209 ; N uni01ca ; G 396
413
- U 459 ; WX 1180 ; N uni01cb ; G 397
414
- U 460 ; WX 1055 ; N uni01cc ; G 398
415
- U 461 ; WX 774 ; N uni01cd ; G 399
416
- U 462 ; WX 675 ; N uni01ce ; G 400
417
- U 463 ; WX 372 ; N uni01cf ; G 401
418
- U 464 ; WX 343 ; N uni01d0 ; G 402
419
- U 465 ; WX 850 ; N uni01d1 ; G 403
420
- U 466 ; WX 687 ; N uni01d2 ; G 404
421
- U 467 ; WX 812 ; N uni01d3 ; G 405
422
- U 468 ; WX 712 ; N uni01d4 ; G 406
423
- U 469 ; WX 812 ; N uni01d5 ; G 407
424
- U 470 ; WX 712 ; N uni01d6 ; G 408
425
- U 471 ; WX 812 ; N uni01d7 ; G 409
426
- U 472 ; WX 712 ; N uni01d8 ; G 410
427
- U 473 ; WX 812 ; N uni01d9 ; G 411
428
- U 474 ; WX 712 ; N uni01da ; G 412
429
- U 475 ; WX 812 ; N uni01db ; G 413
430
- U 476 ; WX 712 ; N uni01dc ; G 414
431
- U 477 ; WX 678 ; N uni01dd ; G 415
432
- U 478 ; WX 774 ; N uni01de ; G 416
433
- U 479 ; WX 675 ; N uni01df ; G 417
434
- U 480 ; WX 774 ; N uni01e0 ; G 418
435
- U 481 ; WX 675 ; N uni01e1 ; G 419
436
- U 482 ; WX 1085 ; N uni01e2 ; G 420
437
- U 483 ; WX 1048 ; N uni01e3 ; G 421
438
- U 484 ; WX 821 ; N uni01e4 ; G 422
439
- U 485 ; WX 716 ; N uni01e5 ; G 423
440
- U 486 ; WX 821 ; N uni01e6 ; G 424
441
- U 487 ; WX 716 ; N uni01e7 ; G 425
442
- U 488 ; WX 775 ; N uni01e8 ; G 426
443
- U 489 ; WX 665 ; N uni01e9 ; G 427
444
- U 490 ; WX 850 ; N uni01ea ; G 428
445
- U 491 ; WX 687 ; N uni01eb ; G 429
446
- U 492 ; WX 850 ; N uni01ec ; G 430
447
- U 493 ; WX 687 ; N uni01ed ; G 431
448
- U 494 ; WX 772 ; N uni01ee ; G 432
449
- U 495 ; WX 582 ; N uni01ef ; G 433
450
- U 496 ; WX 343 ; N uni01f0 ; G 434
451
- U 497 ; WX 1555 ; N uni01f1 ; G 435
452
- U 498 ; WX 1412 ; N uni01f2 ; G 436
453
- U 499 ; WX 1298 ; N uni01f3 ; G 437
454
- U 500 ; WX 821 ; N uni01f4 ; G 438
455
- U 501 ; WX 716 ; N uni01f5 ; G 439
456
- U 502 ; WX 1289 ; N uni01f6 ; G 440
457
- U 503 ; WX 787 ; N uni01f7 ; G 441
458
- U 504 ; WX 837 ; N uni01f8 ; G 442
459
- U 505 ; WX 712 ; N uni01f9 ; G 443
460
- U 506 ; WX 774 ; N uni01fa ; G 444
461
- U 507 ; WX 675 ; N uni01fb ; G 445
462
- U 508 ; WX 1085 ; N uni01fc ; G 446
463
- U 509 ; WX 1048 ; N uni01fd ; G 447
464
- U 510 ; WX 850 ; N uni01fe ; G 448
465
- U 511 ; WX 687 ; N uni01ff ; G 449
466
  U 512 ; WX 774 ; N uni0200 ; G 450
467
  U 513 ; WX 675 ; N uni0201 ; G 451
468
  U 514 ; WX 774 ; N uni0202 ; G 452
@@ -473,12 +480,12 @@ U 518 ; WX 683 ; N uni0206 ; G 456
473
  U 519 ; WX 678 ; N uni0207 ; G 457
474
  U 520 ; WX 372 ; N uni0208 ; G 458
475
  U 521 ; WX 343 ; N uni0209 ; G 459
476
- U 522 ; WX 372 ; N uni020a ; G 460
477
- U 523 ; WX 343 ; N uni020b ; G 461
478
- U 524 ; WX 850 ; N uni020c ; G 462
479
- U 525 ; WX 687 ; N uni020d ; G 463
480
- U 526 ; WX 850 ; N uni020e ; G 464
481
- U 527 ; WX 687 ; N uni020f ; G 465
482
  U 528 ; WX 770 ; N uni0210 ; G 466
483
  U 529 ; WX 493 ; N uni0211 ; G 467
484
  U 530 ; WX 770 ; N uni0212 ; G 468
@@ -487,14 +494,14 @@ U 532 ; WX 812 ; N uni0214 ; G 470
487
  U 533 ; WX 712 ; N uni0215 ; G 471
488
  U 534 ; WX 812 ; N uni0216 ; G 472
489
  U 535 ; WX 712 ; N uni0217 ; G 473
490
- U 536 ; WX 720 ; N uni0218 ; G 474
491
- U 537 ; WX 595 ; N uni0219 ; G 475
492
- U 538 ; WX 682 ; N uni021a ; G 476
493
- U 539 ; WX 478 ; N uni021b ; G 477
494
- U 540 ; WX 690 ; N uni021c ; G 478
495
- U 541 ; WX 607 ; N uni021d ; G 479
496
- U 542 ; WX 837 ; N uni021e ; G 480
497
- U 543 ; WX 712 ; N uni021f ; G 481
498
  U 544 ; WX 837 ; N uni0220 ; G 482
499
  U 545 ; WX 865 ; N uni0221 ; G 483
500
  U 546 ; WX 809 ; N uni0222 ; G 484
@@ -505,12 +512,12 @@ U 550 ; WX 774 ; N uni0226 ; G 488
505
  U 551 ; WX 675 ; N uni0227 ; G 489
506
  U 552 ; WX 683 ; N uni0228 ; G 490
507
  U 553 ; WX 678 ; N uni0229 ; G 491
508
- U 554 ; WX 850 ; N uni022a ; G 492
509
- U 555 ; WX 687 ; N uni022b ; G 493
510
- U 556 ; WX 850 ; N uni022c ; G 494
511
- U 557 ; WX 687 ; N uni022d ; G 495
512
- U 558 ; WX 850 ; N uni022e ; G 496
513
- U 559 ; WX 687 ; N uni022f ; G 497
514
  U 560 ; WX 850 ; N uni0230 ; G 498
515
  U 561 ; WX 687 ; N uni0231 ; G 499
516
  U 562 ; WX 724 ; N uni0232 ; G 500
@@ -518,15 +525,15 @@ U 563 ; WX 652 ; N uni0233 ; G 501
518
  U 564 ; WX 492 ; N uni0234 ; G 502
519
  U 565 ; WX 867 ; N uni0235 ; G 503
520
  U 566 ; WX 512 ; N uni0236 ; G 504
521
- U 567 ; WX 343 ; N uni0237 ; G 505
522
  U 568 ; WX 1088 ; N uni0238 ; G 506
523
  U 569 ; WX 1088 ; N uni0239 ; G 507
524
- U 570 ; WX 774 ; N uni023a ; G 508
525
- U 571 ; WX 734 ; N uni023b ; G 509
526
- U 572 ; WX 593 ; N uni023c ; G 510
527
- U 573 ; WX 637 ; N uni023d ; G 511
528
- U 574 ; WX 682 ; N uni023e ; G 512
529
- U 575 ; WX 595 ; N uni023f ; G 513
530
  U 576 ; WX 582 ; N uni0240 ; G 514
531
  U 577 ; WX 782 ; N uni0241 ; G 515
532
  U 578 ; WX 614 ; N uni0242 ; G 516
@@ -537,12 +544,12 @@ U 582 ; WX 683 ; N uni0246 ; G 520
537
  U 583 ; WX 678 ; N uni0247 ; G 521
538
  U 584 ; WX 372 ; N uni0248 ; G 522
539
  U 585 ; WX 343 ; N uni0249 ; G 523
540
- U 586 ; WX 860 ; N uni024a ; G 524
541
- U 587 ; WX 791 ; N uni024b ; G 525
542
- U 588 ; WX 770 ; N uni024c ; G 526
543
- U 589 ; WX 493 ; N uni024d ; G 527
544
- U 590 ; WX 724 ; N uni024e ; G 528
545
- U 591 ; WX 652 ; N uni024f ; G 529
546
  U 592 ; WX 675 ; N uni0250 ; G 530
547
  U 593 ; WX 716 ; N uni0251 ; G 531
548
  U 594 ; WX 716 ; N uni0252 ; G 532
@@ -553,12 +560,12 @@ U 598 ; WX 717 ; N uni0256 ; G 536
553
  U 599 ; WX 792 ; N uni0257 ; G 537
554
  U 600 ; WX 678 ; N uni0258 ; G 538
555
  U 601 ; WX 678 ; N uni0259 ; G 539
556
- U 602 ; WX 876 ; N uni025a ; G 540
557
- U 603 ; WX 557 ; N uni025b ; G 541
558
- U 604 ; WX 545 ; N uni025c ; G 542
559
- U 605 ; WX 815 ; N uni025d ; G 543
560
- U 606 ; WX 731 ; N uni025e ; G 544
561
- U 607 ; WX 343 ; N uni025f ; G 545
562
  U 608 ; WX 792 ; N uni0260 ; G 546
563
  U 609 ; WX 716 ; N uni0261 ; G 547
564
  U 610 ; WX 627 ; N uni0262 ; G 548
@@ -569,12 +576,12 @@ U 614 ; WX 712 ; N uni0266 ; G 552
569
  U 615 ; WX 712 ; N uni0267 ; G 553
570
  U 616 ; WX 545 ; N uni0268 ; G 554
571
  U 617 ; WX 440 ; N uni0269 ; G 555
572
- U 618 ; WX 545 ; N uni026a ; G 556
573
- U 619 ; WX 559 ; N uni026b ; G 557
574
- U 620 ; WX 693 ; N uni026c ; G 558
575
- U 621 ; WX 343 ; N uni026d ; G 559
576
- U 622 ; WX 841 ; N uni026e ; G 560
577
- U 623 ; WX 1042 ; N uni026f ; G 561
578
  U 624 ; WX 1042 ; N uni0270 ; G 562
579
  U 625 ; WX 1042 ; N uni0271 ; G 563
580
  U 626 ; WX 712 ; N uni0272 ; G 564
@@ -585,12 +592,12 @@ U 630 ; WX 909 ; N uni0276 ; G 568
585
  U 631 ; WX 681 ; N uni0277 ; G 569
586
  U 632 ; WX 796 ; N uni0278 ; G 570
587
  U 633 ; WX 538 ; N uni0279 ; G 571
588
- U 634 ; WX 538 ; N uni027a ; G 572
589
- U 635 ; WX 650 ; N uni027b ; G 573
590
- U 636 ; WX 493 ; N uni027c ; G 574
591
- U 637 ; WX 493 ; N uni027d ; G 575
592
- U 638 ; WX 596 ; N uni027e ; G 576
593
- U 639 ; WX 596 ; N uni027f ; G 577
594
  U 640 ; WX 642 ; N uni0280 ; G 578
595
  U 641 ; WX 642 ; N uni0281 ; G 579
596
  U 642 ; WX 595 ; N uni0282 ; G 580
@@ -601,12 +608,12 @@ U 646 ; WX 552 ; N uni0286 ; G 584
601
  U 647 ; WX 478 ; N uni0287 ; G 585
602
  U 648 ; WX 478 ; N uni0288 ; G 586
603
  U 649 ; WX 920 ; N uni0289 ; G 587
604
- U 650 ; WX 772 ; N uni028a ; G 588
605
- U 651 ; WX 670 ; N uni028b ; G 589
606
- U 652 ; WX 652 ; N uni028c ; G 590
607
- U 653 ; WX 924 ; N uni028d ; G 591
608
- U 654 ; WX 652 ; N uni028e ; G 592
609
- U 655 ; WX 724 ; N uni028f ; G 593
610
  U 656 ; WX 694 ; N uni0290 ; G 594
611
  U 657 ; WX 684 ; N uni0291 ; G 595
612
  U 658 ; WX 641 ; N uni0292 ; G 596
@@ -617,91 +624,184 @@ U 662 ; WX 573 ; N uni0296 ; G 600
617
  U 663 ; WX 573 ; N uni0297 ; G 601
618
  U 664 ; WX 850 ; N uni0298 ; G 602
619
  U 665 ; WX 633 ; N uni0299 ; G 603
620
- U 666 ; WX 731 ; N uni029a ; G 604
621
- U 667 ; WX 685 ; N uni029b ; G 605
622
- U 668 ; WX 691 ; N uni029c ; G 606
623
- U 669 ; WX 343 ; N uni029d ; G 607
624
- U 670 ; WX 732 ; N uni029e ; G 608
625
- U 671 ; WX 539 ; N uni029f ; G 609
626
- U 672 ; WX 792 ; N uni02a0 ; G 610
627
- U 673 ; WX 573 ; N uni02a1 ; G 611
628
- U 674 ; WX 573 ; N uni02a2 ; G 612
629
- U 675 ; WX 1156 ; N uni02a3 ; G 613
630
- U 676 ; WX 1214 ; N uni02a4 ; G 614
631
- U 677 ; WX 1155 ; N uni02a5 ; G 615
632
- U 678 ; WX 974 ; N uni02a6 ; G 616
633
- U 679 ; WX 769 ; N uni02a7 ; G 617
634
- U 680 ; WX 929 ; N uni02a8 ; G 618
635
- U 681 ; WX 1026 ; N uni02a9 ; G 619
636
- U 682 ; WX 792 ; N uni02aa ; G 620
637
- U 683 ; WX 780 ; N uni02ab ; G 621
638
- U 684 ; WX 591 ; N uni02ac ; G 622
639
- U 685 ; WX 415 ; N uni02ad ; G 623
640
- U 686 ; WX 677 ; N uni02ae ; G 624
641
- U 687 ; WX 789 ; N uni02af ; G 625
642
- U 688 ; WX 456 ; N uni02b0 ; G 626
643
- U 689 ; WX 456 ; N uni02b1 ; G 627
644
- U 690 ; WX 219 ; N uni02b2 ; G 628
645
- U 691 ; WX 315 ; N uni02b3 ; G 629
646
- U 692 ; WX 315 ; N uni02b4 ; G 630
647
- U 693 ; WX 315 ; N uni02b5 ; G 631
648
- U 694 ; WX 411 ; N uni02b6 ; G 632
649
- U 695 ; WX 591 ; N uni02b7 ; G 633
650
- U 696 ; WX 417 ; N uni02b8 ; G 634
651
- U 697 ; WX 302 ; N uni02b9 ; G 635
652
- U 698 ; WX 521 ; N uni02ba ; G 636
653
- U 699 ; WX 380 ; N uni02bb ; G 637
654
- U 700 ; WX 380 ; N uni02bc ; G 638
655
- U 701 ; WX 380 ; N uni02bd ; G 639
656
- U 702 ; WX 366 ; N uni02be ; G 640
657
- U 703 ; WX 366 ; N uni02bf ; G 641
658
- U 704 ; WX 326 ; N uni02c0 ; G 642
659
- U 705 ; WX 326 ; N uni02c1 ; G 643
660
- U 706 ; WX 500 ; N uni02c2 ; G 644
661
- U 707 ; WX 500 ; N uni02c3 ; G 645
662
- U 708 ; WX 500 ; N uni02c4 ; G 646
663
- U 709 ; WX 500 ; N uni02c5 ; G 647
664
- U 710 ; WX 500 ; N uni02c6 ; G 648
665
- U 711 ; WX 500 ; N uni02c7 ; G 649
666
- U 712 ; WX 306 ; N uni02c8 ; G 650
667
- U 713 ; WX 500 ; N uni02c9 ; G 651
668
- U 714 ; WX 500 ; N uni02ca ; G 652
669
- U 715 ; WX 500 ; N uni02cb ; G 653
670
- U 716 ; WX 306 ; N uni02cc ; G 654
671
- U 717 ; WX 500 ; N uni02cd ; G 655
672
- U 718 ; WX 500 ; N uni02ce ; G 656
673
- U 719 ; WX 500 ; N uni02cf ; G 657
674
- U 720 ; WX 337 ; N uni02d0 ; G 658
675
- U 721 ; WX 337 ; N uni02d1 ; G 659
676
- U 722 ; WX 366 ; N uni02d2 ; G 660
677
- U 723 ; WX 366 ; N uni02d3 ; G 661
678
- U 724 ; WX 500 ; N uni02d4 ; G 662
679
- U 725 ; WX 500 ; N uni02d5 ; G 663
680
- U 726 ; WX 416 ; N uni02d6 ; G 664
681
- U 727 ; WX 328 ; N uni02d7 ; G 665
682
- U 728 ; WX 500 ; N uni02d8 ; G 666
683
- U 729 ; WX 500 ; N uni02d9 ; G 667
684
- U 730 ; WX 500 ; N uni02da ; G 668
685
- U 731 ; WX 500 ; N uni02db ; G 669
686
- U 732 ; WX 500 ; N uni02dc ; G 670
687
- U 733 ; WX 500 ; N uni02dd ; G 671
688
- U 734 ; WX 351 ; N uni02de ; G 672
689
- U 735 ; WX 500 ; N uni02df ; G 673
690
- U 736 ; WX 412 ; N uni02e0 ; G 674
691
- U 737 ; WX 219 ; N uni02e1 ; G 675
692
- U 738 ; WX 381 ; N uni02e2 ; G 676
693
- U 739 ; WX 413 ; N uni02e3 ; G 677
694
- U 740 ; WX 326 ; N uni02e4 ; G 678
695
- U 741 ; WX 500 ; N uni02e5 ; G 679
696
- U 742 ; WX 500 ; N uni02e6 ; G 680
697
- U 743 ; WX 500 ; N uni02e7 ; G 681
698
- U 744 ; WX 500 ; N uni02e8 ; G 682
699
- U 745 ; WX 500 ; N uni02e9 ; G 683
700
- U 748 ; WX 500 ; N uni02ec ; G 684
701
- U 749 ; WX 500 ; N uni02ed ; G 685
702
- U 750 ; WX 657 ; N uni02ee ; G 686
703
- U 755 ; WX 500 ; N uni02f3 ; G 687
704
- U 759 ; WX 500 ; N uni02f7 ; G 688
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
705
  U 880 ; WX 698 ; N uni0370 ; G 782
706
  U 881 ; WX 565 ; N uni0371 ; G 783
707
  U 882 ; WX 1022 ; N uni0372 ; G 784
@@ -710,132 +810,132 @@ U 884 ; WX 302 ; N uni0374 ; G 786
710
  U 885 ; WX 302 ; N uni0375 ; G 787
711
  U 886 ; WX 837 ; N uni0376 ; G 788
712
  U 887 ; WX 701 ; N uni0377 ; G 789
713
- U 890 ; WX 500 ; N uni037a ; G 790
714
- U 891 ; WX 593 ; N uni037b ; G 791
715
- U 892 ; WX 550 ; N uni037c ; G 792
716
- U 893 ; WX 549 ; N uni037d ; G 793
717
- U 894 ; WX 400 ; N uni037e ; G 794
718
- U 900 ; WX 441 ; N uni0384 ; G 795
719
- U 901 ; WX 500 ; N uni0385 ; G 796
720
- U 902 ; WX 797 ; N uni0386 ; G 797
721
- U 903 ; WX 380 ; N uni0387 ; G 798
722
- U 904 ; WX 846 ; N uni0388 ; G 799
723
- U 905 ; WX 1009 ; N uni0389 ; G 800
724
- U 906 ; WX 563 ; N uni038a ; G 801
725
- U 908 ; WX 891 ; N uni038c ; G 802
726
- U 910 ; WX 980 ; N uni038e ; G 803
727
- U 911 ; WX 894 ; N uni038f ; G 804
728
- U 912 ; WX 390 ; N uni0390 ; G 805
729
- U 913 ; WX 774 ; N uni0391 ; G 806
730
- U 914 ; WX 762 ; N uni0392 ; G 807
731
- U 915 ; WX 637 ; N uni0393 ; G 808
732
  U 916 ; WX 774 ; N uni0394 ; G 809
733
- U 917 ; WX 683 ; N uni0395 ; G 810
734
- U 918 ; WX 725 ; N uni0396 ; G 811
735
- U 919 ; WX 837 ; N uni0397 ; G 812
736
- U 920 ; WX 850 ; N uni0398 ; G 813
737
- U 921 ; WX 372 ; N uni0399 ; G 814
738
- U 922 ; WX 775 ; N uni039a ; G 815
739
- U 923 ; WX 774 ; N uni039b ; G 816
740
- U 924 ; WX 995 ; N uni039c ; G 817
741
- U 925 ; WX 837 ; N uni039d ; G 818
742
- U 926 ; WX 632 ; N uni039e ; G 819
743
- U 927 ; WX 850 ; N uni039f ; G 820
744
- U 928 ; WX 837 ; N uni03a0 ; G 821
745
- U 929 ; WX 733 ; N uni03a1 ; G 822
746
- U 931 ; WX 683 ; N uni03a3 ; G 823
747
- U 932 ; WX 682 ; N uni03a4 ; G 824
748
- U 933 ; WX 724 ; N uni03a5 ; G 825
749
- U 934 ; WX 850 ; N uni03a6 ; G 826
750
- U 935 ; WX 771 ; N uni03a7 ; G 827
751
- U 936 ; WX 850 ; N uni03a8 ; G 828
752
- U 937 ; WX 850 ; N uni03a9 ; G 829
753
- U 938 ; WX 372 ; N uni03aa ; G 830
754
- U 939 ; WX 724 ; N uni03ab ; G 831
755
- U 940 ; WX 687 ; N uni03ac ; G 832
756
- U 941 ; WX 557 ; N uni03ad ; G 833
757
- U 942 ; WX 712 ; N uni03ae ; G 834
758
- U 943 ; WX 390 ; N uni03af ; G 835
759
- U 944 ; WX 675 ; N uni03b0 ; G 836
760
- U 945 ; WX 687 ; N uni03b1 ; G 837
761
- U 946 ; WX 716 ; N uni03b2 ; G 838
762
- U 947 ; WX 681 ; N uni03b3 ; G 839
763
- U 948 ; WX 687 ; N uni03b4 ; G 840
764
- U 949 ; WX 557 ; N uni03b5 ; G 841
765
- U 950 ; WX 591 ; N uni03b6 ; G 842
766
- U 951 ; WX 712 ; N uni03b7 ; G 843
767
- U 952 ; WX 687 ; N uni03b8 ; G 844
768
- U 953 ; WX 390 ; N uni03b9 ; G 845
769
- U 954 ; WX 710 ; N uni03ba ; G 846
770
- U 955 ; WX 633 ; N uni03bb ; G 847
771
- U 956 ; WX 736 ; N uni03bc ; G 848
772
- U 957 ; WX 681 ; N uni03bd ; G 849
773
- U 958 ; WX 591 ; N uni03be ; G 850
774
- U 959 ; WX 687 ; N uni03bf ; G 851
775
- U 960 ; WX 791 ; N uni03c0 ; G 852
776
- U 961 ; WX 716 ; N uni03c1 ; G 853
777
- U 962 ; WX 593 ; N uni03c2 ; G 854
778
- U 963 ; WX 779 ; N uni03c3 ; G 855
779
- U 964 ; WX 638 ; N uni03c4 ; G 856
780
- U 965 ; WX 675 ; N uni03c5 ; G 857
781
- U 966 ; WX 782 ; N uni03c6 ; G 858
782
- U 967 ; WX 645 ; N uni03c7 ; G 859
783
- U 968 ; WX 794 ; N uni03c8 ; G 860
784
- U 969 ; WX 869 ; N uni03c9 ; G 861
785
- U 970 ; WX 390 ; N uni03ca ; G 862
786
- U 971 ; WX 675 ; N uni03cb ; G 863
787
- U 972 ; WX 687 ; N uni03cc ; G 864
788
- U 973 ; WX 675 ; N uni03cd ; G 865
789
- U 974 ; WX 869 ; N uni03ce ; G 866
790
- U 975 ; WX 775 ; N uni03cf ; G 867
791
- U 976 ; WX 651 ; N uni03d0 ; G 868
792
- U 977 ; WX 661 ; N uni03d1 ; G 869
793
- U 978 ; WX 746 ; N uni03d2 ; G 870
794
- U 979 ; WX 981 ; N uni03d3 ; G 871
795
- U 980 ; WX 746 ; N uni03d4 ; G 872
796
- U 981 ; WX 796 ; N uni03d5 ; G 873
797
- U 982 ; WX 869 ; N uni03d6 ; G 874
798
- U 983 ; WX 744 ; N uni03d7 ; G 875
799
- U 984 ; WX 850 ; N uni03d8 ; G 876
800
- U 985 ; WX 687 ; N uni03d9 ; G 877
801
- U 986 ; WX 734 ; N uni03da ; G 878
802
- U 987 ; WX 593 ; N uni03db ; G 879
803
- U 988 ; WX 683 ; N uni03dc ; G 880
804
- U 989 ; WX 494 ; N uni03dd ; G 881
805
- U 990 ; WX 702 ; N uni03de ; G 882
806
- U 991 ; WX 660 ; N uni03df ; G 883
807
- U 992 ; WX 919 ; N uni03e0 ; G 884
808
- U 993 ; WX 627 ; N uni03e1 ; G 885
809
- U 994 ; WX 1093 ; N uni03e2 ; G 886
810
- U 995 ; WX 837 ; N uni03e3 ; G 887
811
- U 996 ; WX 832 ; N uni03e4 ; G 888
812
- U 997 ; WX 716 ; N uni03e5 ; G 889
813
- U 998 ; WX 928 ; N uni03e6 ; G 890
814
- U 999 ; WX 744 ; N uni03e7 ; G 891
815
- U 1000 ; WX 733 ; N uni03e8 ; G 892
816
- U 1001 ; WX 650 ; N uni03e9 ; G 893
817
- U 1002 ; WX 789 ; N uni03ea ; G 894
818
- U 1003 ; WX 671 ; N uni03eb ; G 895
819
- U 1004 ; WX 752 ; N uni03ec ; G 896
820
- U 1005 ; WX 716 ; N uni03ed ; G 897
821
- U 1006 ; WX 682 ; N uni03ee ; G 898
822
- U 1007 ; WX 590 ; N uni03ef ; G 899
823
- U 1008 ; WX 744 ; N uni03f0 ; G 900
824
- U 1009 ; WX 716 ; N uni03f1 ; G 901
825
- U 1010 ; WX 593 ; N uni03f2 ; G 902
826
- U 1011 ; WX 343 ; N uni03f3 ; G 903
827
- U 1012 ; WX 850 ; N uni03f4 ; G 904
828
- U 1013 ; WX 645 ; N uni03f5 ; G 905
829
- U 1014 ; WX 644 ; N uni03f6 ; G 906
830
- U 1015 ; WX 738 ; N uni03f7 ; G 907
831
- U 1016 ; WX 716 ; N uni03f8 ; G 908
832
- U 1017 ; WX 734 ; N uni03f9 ; G 909
833
- U 1018 ; WX 995 ; N uni03fa ; G 910
834
- U 1019 ; WX 732 ; N uni03fb ; G 911
835
- U 1020 ; WX 716 ; N uni03fc ; G 912
836
- U 1021 ; WX 698 ; N uni03fd ; G 913
837
- U 1022 ; WX 734 ; N uni03fe ; G 914
838
- U 1023 ; WX 698 ; N uni03ff ; G 915
839
  U 1024 ; WX 683 ; N uni0400 ; G 916
840
  U 1025 ; WX 683 ; N uni0401 ; G 917
841
  U 1026 ; WX 878 ; N uni0402 ; G 918
@@ -846,12 +946,12 @@ U 1030 ; WX 372 ; N uni0406 ; G 922
846
  U 1031 ; WX 372 ; N uni0407 ; G 923
847
  U 1032 ; WX 372 ; N uni0408 ; G 924
848
  U 1033 ; WX 1154 ; N uni0409 ; G 925
849
- U 1034 ; WX 1130 ; N uni040a ; G 926
850
- U 1035 ; WX 878 ; N uni040b ; G 927
851
- U 1036 ; WX 817 ; N uni040c ; G 928
852
- U 1037 ; WX 837 ; N uni040d ; G 929
853
- U 1038 ; WX 771 ; N uni040e ; G 930
854
- U 1039 ; WX 837 ; N uni040f ; G 931
855
  U 1040 ; WX 774 ; N uni0410 ; G 932
856
  U 1041 ; WX 762 ; N uni0411 ; G 933
857
  U 1042 ; WX 762 ; N uni0412 ; G 934
@@ -862,12 +962,12 @@ U 1046 ; WX 1224 ; N uni0416 ; G 938
862
  U 1047 ; WX 710 ; N uni0417 ; G 939
863
  U 1048 ; WX 837 ; N uni0418 ; G 940
864
  U 1049 ; WX 837 ; N uni0419 ; G 941
865
- U 1050 ; WX 817 ; N uni041a ; G 942
866
- U 1051 ; WX 831 ; N uni041b ; G 943
867
- U 1052 ; WX 995 ; N uni041c ; G 944
868
- U 1053 ; WX 837 ; N uni041d ; G 945
869
- U 1054 ; WX 850 ; N uni041e ; G 946
870
- U 1055 ; WX 837 ; N uni041f ; G 947
871
  U 1056 ; WX 733 ; N uni0420 ; G 948
872
  U 1057 ; WX 734 ; N uni0421 ; G 949
873
  U 1058 ; WX 682 ; N uni0422 ; G 950
@@ -878,12 +978,12 @@ U 1062 ; WX 928 ; N uni0426 ; G 954
878
  U 1063 ; WX 808 ; N uni0427 ; G 955
879
  U 1064 ; WX 1235 ; N uni0428 ; G 956
880
  U 1065 ; WX 1326 ; N uni0429 ; G 957
881
- U 1066 ; WX 939 ; N uni042a ; G 958
882
- U 1067 ; WX 1036 ; N uni042b ; G 959
883
- U 1068 ; WX 762 ; N uni042c ; G 960
884
- U 1069 ; WX 734 ; N uni042d ; G 961
885
- U 1070 ; WX 1174 ; N uni042e ; G 962
886
- U 1071 ; WX 770 ; N uni042f ; G 963
887
  U 1072 ; WX 675 ; N uni0430 ; G 964
888
  U 1073 ; WX 698 ; N uni0431 ; G 965
889
  U 1074 ; WX 633 ; N uni0432 ; G 966
@@ -894,12 +994,12 @@ U 1078 ; WX 995 ; N uni0436 ; G 970
894
  U 1079 ; WX 581 ; N uni0437 ; G 971
895
  U 1080 ; WX 701 ; N uni0438 ; G 972
896
  U 1081 ; WX 701 ; N uni0439 ; G 973
897
- U 1082 ; WX 679 ; N uni043a ; G 974
898
- U 1083 ; WX 732 ; N uni043b ; G 975
899
- U 1084 ; WX 817 ; N uni043c ; G 976
900
- U 1085 ; WX 691 ; N uni043d ; G 977
901
- U 1086 ; WX 687 ; N uni043e ; G 978
902
- U 1087 ; WX 691 ; N uni043f ; G 979
903
  U 1088 ; WX 716 ; N uni0440 ; G 980
904
  U 1089 ; WX 593 ; N uni0441 ; G 981
905
  U 1090 ; WX 580 ; N uni0442 ; G 982
@@ -910,12 +1010,12 @@ U 1094 ; WX 741 ; N uni0446 ; G 986
910
  U 1095 ; WX 687 ; N uni0447 ; G 987
911
  U 1096 ; WX 1062 ; N uni0448 ; G 988
912
  U 1097 ; WX 1105 ; N uni0449 ; G 989
913
- U 1098 ; WX 751 ; N uni044a ; G 990
914
- U 1099 ; WX 904 ; N uni044b ; G 991
915
- U 1100 ; WX 632 ; N uni044c ; G 992
916
- U 1101 ; WX 593 ; N uni044d ; G 993
917
- U 1102 ; WX 972 ; N uni044e ; G 994
918
- U 1103 ; WX 642 ; N uni044f ; G 995
919
  U 1104 ; WX 678 ; N uni0450 ; G 996
920
  U 1105 ; WX 678 ; N uni0451 ; G 997
921
  U 1106 ; WX 714 ; N uni0452 ; G 998
@@ -926,12 +1026,12 @@ U 1110 ; WX 343 ; N uni0456 ; G 1002
926
  U 1111 ; WX 343 ; N uni0457 ; G 1003
927
  U 1112 ; WX 343 ; N uni0458 ; G 1004
928
  U 1113 ; WX 991 ; N uni0459 ; G 1005
929
- U 1114 ; WX 956 ; N uni045a ; G 1006
930
- U 1115 ; WX 734 ; N uni045b ; G 1007
931
- U 1116 ; WX 679 ; N uni045c ; G 1008
932
- U 1117 ; WX 701 ; N uni045d ; G 1009
933
- U 1118 ; WX 652 ; N uni045e ; G 1010
934
- U 1119 ; WX 691 ; N uni045f ; G 1011
935
  U 1120 ; WX 1093 ; N uni0460 ; G 1012
936
  U 1121 ; WX 869 ; N uni0461 ; G 1013
937
  U 1122 ; WX 840 ; N uni0462 ; G 1014
@@ -942,12 +1042,12 @@ U 1126 ; WX 992 ; N uni0466 ; G 1018
942
  U 1127 ; WX 832 ; N uni0467 ; G 1019
943
  U 1128 ; WX 1358 ; N uni0468 ; G 1020
944
  U 1129 ; WX 1121 ; N uni0469 ; G 1021
945
- U 1130 ; WX 850 ; N uni046a ; G 1022
946
- U 1131 ; WX 687 ; N uni046b ; G 1023
947
- U 1132 ; WX 1236 ; N uni046c ; G 1024
948
- U 1133 ; WX 1007 ; N uni046d ; G 1025
949
- U 1134 ; WX 696 ; N uni046e ; G 1026
950
- U 1135 ; WX 557 ; N uni046f ; G 1027
951
  U 1136 ; WX 1075 ; N uni0470 ; G 1028
952
  U 1137 ; WX 1061 ; N uni0471 ; G 1029
953
  U 1138 ; WX 850 ; N uni0472 ; G 1030
@@ -958,23 +1058,28 @@ U 1142 ; WX 850 ; N uni0476 ; G 1034
958
  U 1143 ; WX 695 ; N uni0477 ; G 1035
959
  U 1144 ; WX 1148 ; N uni0478 ; G 1036
960
  U 1145 ; WX 1043 ; N uni0479 ; G 1037
961
- U 1146 ; WX 1074 ; N uni047a ; G 1038
962
- U 1147 ; WX 863 ; N uni047b ; G 1039
963
- U 1148 ; WX 1405 ; N uni047c ; G 1040
964
- U 1149 ; WX 1173 ; N uni047d ; G 1041
965
- U 1150 ; WX 1093 ; N uni047e ; G 1042
966
- U 1151 ; WX 869 ; N uni047f ; G 1043
967
  U 1152 ; WX 734 ; N uni0480 ; G 1044
968
  U 1153 ; WX 593 ; N uni0481 ; G 1045
969
  U 1154 ; WX 652 ; N uni0482 ; G 1046
 
 
 
 
 
970
  U 1160 ; WX 418 ; N uni0488 ; G 1052
971
  U 1161 ; WX 418 ; N uni0489 ; G 1053
972
- U 1162 ; WX 957 ; N uni048a ; G 1054
973
- U 1163 ; WX 807 ; N uni048b ; G 1055
974
- U 1164 ; WX 762 ; N uni048c ; G 1056
975
- U 1165 ; WX 611 ; N uni048d ; G 1057
976
- U 1166 ; WX 733 ; N uni048e ; G 1058
977
- U 1167 ; WX 716 ; N uni048f ; G 1059
978
  U 1168 ; WX 637 ; N uni0490 ; G 1060
979
  U 1169 ; WX 522 ; N uni0491 ; G 1061
980
  U 1170 ; WX 666 ; N uni0492 ; G 1062
@@ -985,108 +1090,108 @@ U 1174 ; WX 1224 ; N uni0496 ; G 1066
985
  U 1175 ; WX 995 ; N uni0497 ; G 1067
986
  U 1176 ; WX 710 ; N uni0498 ; G 1068
987
  U 1177 ; WX 581 ; N uni0499 ; G 1069
988
- U 1178 ; WX 775 ; N uni049a ; G 1070
989
- U 1179 ; WX 679 ; N uni049b ; G 1071
990
- U 1180 ; WX 817 ; N uni049c ; G 1072
991
- U 1181 ; WX 679 ; N uni049d ; G 1073
992
- U 1182 ; WX 817 ; N uni049e ; G 1074
993
- U 1183 ; WX 679 ; N uni049f ; G 1075
994
- U 1184 ; WX 1015 ; N uni04a0 ; G 1076
995
- U 1185 ; WX 826 ; N uni04a1 ; G 1077
996
- U 1186 ; WX 956 ; N uni04a2 ; G 1078
997
- U 1187 ; WX 808 ; N uni04a3 ; G 1079
998
- U 1188 ; WX 1103 ; N uni04a4 ; G 1080
999
- U 1189 ; WX 874 ; N uni04a5 ; G 1081
1000
- U 1190 ; WX 1273 ; N uni04a6 ; G 1082
1001
- U 1191 ; WX 1017 ; N uni04a7 ; G 1083
1002
- U 1192 ; WX 952 ; N uni04a8 ; G 1084
1003
- U 1193 ; WX 858 ; N uni04a9 ; G 1085
1004
- U 1194 ; WX 734 ; N uni04aa ; G 1086
1005
- U 1195 ; WX 593 ; N uni04ab ; G 1087
1006
- U 1196 ; WX 682 ; N uni04ac ; G 1088
1007
- U 1197 ; WX 580 ; N uni04ad ; G 1089
1008
- U 1198 ; WX 724 ; N uni04ae ; G 1090
1009
- U 1199 ; WX 652 ; N uni04af ; G 1091
1010
- U 1200 ; WX 724 ; N uni04b0 ; G 1092
1011
- U 1201 ; WX 652 ; N uni04b1 ; G 1093
1012
- U 1202 ; WX 771 ; N uni04b2 ; G 1094
1013
- U 1203 ; WX 645 ; N uni04b3 ; G 1095
1014
- U 1204 ; WX 1112 ; N uni04b4 ; G 1096
1015
- U 1205 ; WX 1000 ; N uni04b5 ; G 1097
1016
- U 1206 ; WX 808 ; N uni04b6 ; G 1098
1017
- U 1207 ; WX 687 ; N uni04b7 ; G 1099
1018
- U 1208 ; WX 808 ; N uni04b8 ; G 1100
1019
- U 1209 ; WX 687 ; N uni04b9 ; G 1101
1020
- U 1210 ; WX 808 ; N uni04ba ; G 1102
1021
- U 1211 ; WX 712 ; N uni04bb ; G 1103
1022
- U 1212 ; WX 1026 ; N uni04bc ; G 1104
1023
- U 1213 ; WX 810 ; N uni04bd ; G 1105
1024
- U 1214 ; WX 1026 ; N uni04be ; G 1106
1025
- U 1215 ; WX 810 ; N uni04bf ; G 1107
1026
- U 1216 ; WX 372 ; N uni04c0 ; G 1108
1027
- U 1217 ; WX 1224 ; N uni04c1 ; G 1109
1028
- U 1218 ; WX 995 ; N uni04c2 ; G 1110
1029
- U 1219 ; WX 775 ; N uni04c3 ; G 1111
1030
- U 1220 ; WX 630 ; N uni04c4 ; G 1112
1031
- U 1221 ; WX 951 ; N uni04c5 ; G 1113
1032
- U 1222 ; WX 805 ; N uni04c6 ; G 1114
1033
- U 1223 ; WX 837 ; N uni04c7 ; G 1115
1034
- U 1224 ; WX 691 ; N uni04c8 ; G 1116
1035
- U 1225 ; WX 957 ; N uni04c9 ; G 1117
1036
- U 1226 ; WX 807 ; N uni04ca ; G 1118
1037
- U 1227 ; WX 808 ; N uni04cb ; G 1119
1038
- U 1228 ; WX 687 ; N uni04cc ; G 1120
1039
- U 1229 ; WX 1115 ; N uni04cd ; G 1121
1040
- U 1230 ; WX 933 ; N uni04ce ; G 1122
1041
- U 1231 ; WX 343 ; N uni04cf ; G 1123
1042
- U 1232 ; WX 774 ; N uni04d0 ; G 1124
1043
- U 1233 ; WX 675 ; N uni04d1 ; G 1125
1044
- U 1234 ; WX 774 ; N uni04d2 ; G 1126
1045
- U 1235 ; WX 675 ; N uni04d3 ; G 1127
1046
- U 1236 ; WX 1085 ; N uni04d4 ; G 1128
1047
- U 1237 ; WX 1048 ; N uni04d5 ; G 1129
1048
- U 1238 ; WX 683 ; N uni04d6 ; G 1130
1049
- U 1239 ; WX 678 ; N uni04d7 ; G 1131
1050
- U 1240 ; WX 849 ; N uni04d8 ; G 1132
1051
- U 1241 ; WX 678 ; N uni04d9 ; G 1133
1052
- U 1242 ; WX 849 ; N uni04da ; G 1134
1053
- U 1243 ; WX 678 ; N uni04db ; G 1135
1054
- U 1244 ; WX 1224 ; N uni04dc ; G 1136
1055
- U 1245 ; WX 995 ; N uni04dd ; G 1137
1056
- U 1246 ; WX 710 ; N uni04de ; G 1138
1057
- U 1247 ; WX 581 ; N uni04df ; G 1139
1058
- U 1248 ; WX 772 ; N uni04e0 ; G 1140
1059
- U 1249 ; WX 641 ; N uni04e1 ; G 1141
1060
- U 1250 ; WX 837 ; N uni04e2 ; G 1142
1061
- U 1251 ; WX 701 ; N uni04e3 ; G 1143
1062
- U 1252 ; WX 837 ; N uni04e4 ; G 1144
1063
- U 1253 ; WX 701 ; N uni04e5 ; G 1145
1064
- U 1254 ; WX 850 ; N uni04e6 ; G 1146
1065
- U 1255 ; WX 687 ; N uni04e7 ; G 1147
1066
- U 1256 ; WX 850 ; N uni04e8 ; G 1148
1067
- U 1257 ; WX 687 ; N uni04e9 ; G 1149
1068
- U 1258 ; WX 850 ; N uni04ea ; G 1150
1069
- U 1259 ; WX 687 ; N uni04eb ; G 1151
1070
- U 1260 ; WX 734 ; N uni04ec ; G 1152
1071
- U 1261 ; WX 593 ; N uni04ed ; G 1153
1072
- U 1262 ; WX 771 ; N uni04ee ; G 1154
1073
- U 1263 ; WX 652 ; N uni04ef ; G 1155
1074
- U 1264 ; WX 771 ; N uni04f0 ; G 1156
1075
- U 1265 ; WX 652 ; N uni04f1 ; G 1157
1076
- U 1266 ; WX 771 ; N uni04f2 ; G 1158
1077
- U 1267 ; WX 652 ; N uni04f3 ; G 1159
1078
- U 1268 ; WX 808 ; N uni04f4 ; G 1160
1079
- U 1269 ; WX 687 ; N uni04f5 ; G 1161
1080
- U 1270 ; WX 637 ; N uni04f6 ; G 1162
1081
- U 1271 ; WX 522 ; N uni04f7 ; G 1163
1082
- U 1272 ; WX 1036 ; N uni04f8 ; G 1164
1083
- U 1273 ; WX 904 ; N uni04f9 ; G 1165
1084
- U 1274 ; WX 666 ; N uni04fa ; G 1166
1085
- U 1275 ; WX 543 ; N uni04fb ; G 1167
1086
- U 1276 ; WX 771 ; N uni04fc ; G 1168
1087
- U 1277 ; WX 645 ; N uni04fd ; G 1169
1088
- U 1278 ; WX 771 ; N uni04fe ; G 1170
1089
- U 1279 ; WX 645 ; N uni04ff ; G 1171
1090
  U 1280 ; WX 762 ; N uni0500 ; G 1172
1091
  U 1281 ; WX 608 ; N uni0501 ; G 1173
1092
  U 1282 ; WX 1159 ; N uni0502 ; G 1174
@@ -1097,12 +1202,12 @@ U 1286 ; WX 828 ; N uni0506 ; G 1178
1097
  U 1287 ; WX 693 ; N uni0507 ; G 1179
1098
  U 1288 ; WX 1242 ; N uni0508 ; G 1180
1099
  U 1289 ; WX 1017 ; N uni0509 ; G 1181
1100
- U 1290 ; WX 1289 ; N uni050a ; G 1182
1101
- U 1291 ; WX 1013 ; N uni050b ; G 1183
1102
- U 1292 ; WX 839 ; N uni050c ; G 1184
1103
- U 1293 ; WX 638 ; N uni050d ; G 1185
1104
- U 1294 ; WX 938 ; N uni050e ; G 1186
1105
- U 1295 ; WX 803 ; N uni050f ; G 1187
1106
  U 1296 ; WX 696 ; N uni0510 ; G 1188
1107
  U 1297 ; WX 557 ; N uni0511 ; G 1189
1108
  U 1298 ; WX 831 ; N uni0512 ; G 1190
@@ -1113,10 +1218,10 @@ U 1302 ; WX 1065 ; N uni0516 ; G 1194
1113
  U 1303 ; WX 979 ; N uni0517 ; G 1195
1114
  U 1304 ; WX 1082 ; N uni0518 ; G 1196
1115
  U 1305 ; WX 1013 ; N uni0519 ; G 1197
1116
- U 1306 ; WX 850 ; N uni051a ; G 1198
1117
- U 1307 ; WX 716 ; N uni051b ; G 1199
1118
- U 1308 ; WX 1103 ; N uni051c ; G 1200
1119
- U 1309 ; WX 924 ; N uni051d ; G 1201
1120
  U 1312 ; WX 1267 ; N uni0520 ; G 1202
1121
  U 1313 ; WX 1059 ; N uni0521 ; G 1203
1122
  U 1314 ; WX 1273 ; N uni0522 ; G 1204
@@ -1132,12 +1237,12 @@ U 1334 ; WX 777 ; N uni0536 ; G 1213
1132
  U 1335 ; WX 812 ; N uni0537 ; G 1214
1133
  U 1336 ; WX 812 ; N uni0538 ; G 1215
1134
  U 1337 ; WX 975 ; N uni0539 ; G 1216
1135
- U 1338 ; WX 984 ; N uni053a ; G 1217
1136
- U 1339 ; WX 812 ; N uni053b ; G 1218
1137
- U 1340 ; WX 710 ; N uni053c ; G 1219
1138
- U 1341 ; WX 1078 ; N uni053d ; G 1220
1139
- U 1342 ; WX 1136 ; N uni053e ; G 1221
1140
- U 1343 ; WX 812 ; N uni053f ; G 1222
1141
  U 1344 ; WX 710 ; N uni0540 ; G 1223
1142
  U 1345 ; WX 757 ; N uni0541 ; G 1224
1143
  U 1346 ; WX 984 ; N uni0542 ; G 1225
@@ -1148,12 +1253,12 @@ U 1350 ; WX 984 ; N uni0546 ; G 1229
1148
  U 1351 ; WX 812 ; N uni0547 ; G 1230
1149
  U 1352 ; WX 812 ; N uni0548 ; G 1231
1150
  U 1353 ; WX 812 ; N uni0549 ; G 1232
1151
- U 1354 ; WX 958 ; N uni054a ; G 1233
1152
- U 1355 ; WX 777 ; N uni054b ; G 1234
1153
- U 1356 ; WX 984 ; N uni054c ; G 1235
1154
- U 1357 ; WX 812 ; N uni054d ; G 1236
1155
- U 1358 ; WX 984 ; N uni054e ; G 1237
1156
- U 1359 ; WX 720 ; N uni054f ; G 1238
1157
  U 1360 ; WX 812 ; N uni0550 ; G 1239
1158
  U 1361 ; WX 793 ; N uni0551 ; G 1240
1159
  U 1362 ; WX 895 ; N uni0552 ; G 1241
@@ -1162,12 +1267,12 @@ U 1364 ; WX 936 ; N uni0554 ; G 1243
1162
  U 1365 ; WX 850 ; N uni0555 ; G 1244
1163
  U 1366 ; WX 720 ; N uni0556 ; G 1245
1164
  U 1369 ; WX 366 ; N uni0559 ; G 1246
1165
- U 1370 ; WX 380 ; N uni055a ; G 1247
1166
- U 1371 ; WX 550 ; N uni055b ; G 1248
1167
- U 1372 ; WX 550 ; N uni055c ; G 1249
1168
- U 1373 ; WX 380 ; N uni055d ; G 1250
1169
- U 1374 ; WX 546 ; N uni055e ; G 1251
1170
- U 1375 ; WX 521 ; N uni055f ; G 1252
1171
  U 1377 ; WX 1042 ; N uni0561 ; G 1253
1172
  U 1378 ; WX 712 ; N uni0562 ; G 1254
1173
  U 1379 ; WX 866 ; N uni0563 ; G 1255
@@ -1177,12 +1282,12 @@ U 1382 ; WX 817 ; N uni0566 ; G 1258
1177
  U 1383 ; WX 653 ; N uni0567 ; G 1259
1178
  U 1384 ; WX 712 ; N uni0568 ; G 1260
1179
  U 1385 ; WX 811 ; N uni0569 ; G 1261
1180
- U 1386 ; WX 817 ; N uni056a ; G 1262
1181
- U 1387 ; WX 712 ; N uni056b ; G 1263
1182
- U 1388 ; WX 498 ; N uni056c ; G 1264
1183
- U 1389 ; WX 1018 ; N uni056d ; G 1265
1184
- U 1390 ; WX 716 ; N uni056e ; G 1266
1185
- U 1391 ; WX 712 ; N uni056f ; G 1267
1186
  U 1392 ; WX 712 ; N uni0570 ; G 1268
1187
  U 1393 ; WX 716 ; N uni0571 ; G 1269
1188
  U 1394 ; WX 819 ; N uni0572 ; G 1270
@@ -1193,12 +1298,12 @@ U 1398 ; WX 882 ; N uni0576 ; G 1274
1193
  U 1399 ; WX 559 ; N uni0577 ; G 1275
1194
  U 1400 ; WX 712 ; N uni0578 ; G 1276
1195
  U 1401 ; WX 559 ; N uni0579 ; G 1277
1196
- U 1402 ; WX 1042 ; N uni057a ; G 1278
1197
- U 1403 ; WX 559 ; N uni057b ; G 1279
1198
- U 1404 ; WX 863 ; N uni057c ; G 1280
1199
- U 1405 ; WX 712 ; N uni057d ; G 1281
1200
- U 1406 ; WX 813 ; N uni057e ; G 1282
1201
- U 1407 ; WX 1042 ; N uni057f ; G 1283
1202
  U 1408 ; WX 712 ; N uni0580 ; G 1284
1203
  U 1409 ; WX 716 ; N uni0581 ; G 1285
1204
  U 1410 ; WX 571 ; N uni0582 ; G 1286
@@ -1208,50 +1313,69 @@ U 1413 ; WX 687 ; N uni0585 ; G 1289
1208
  U 1414 ; WX 720 ; N uni0586 ; G 1290
1209
  U 1415 ; WX 862 ; N uni0587 ; G 1291
1210
  U 1417 ; WX 400 ; N uni0589 ; G 1292
1211
- U 1418 ; WX 487 ; N uni058a ; G 1293
1212
- U 1470 ; WX 415 ; N uni05be ; G 1308
1213
- U 1472 ; WX 372 ; N uni05c0 ; G 1310
1214
- U 1475 ; WX 372 ; N uni05c3 ; G 1313
1215
- U 1478 ; WX 497 ; N uni05c6 ; G 1314
1216
- U 1488 ; WX 751 ; N uni05d0 ; G 1316
1217
- U 1489 ; WX 673 ; N uni05d1 ; G 1317
1218
- U 1490 ; WX 537 ; N uni05d2 ; G 1318
1219
- U 1491 ; WX 654 ; N uni05d3 ; G 1319
1220
- U 1492 ; WX 712 ; N uni05d4 ; G 1320
1221
- U 1493 ; WX 343 ; N uni05d5 ; G 1321
1222
- U 1494 ; WX 491 ; N uni05d6 ; G 1322
1223
- U 1495 ; WX 712 ; N uni05d7 ; G 1323
1224
- U 1496 ; WX 724 ; N uni05d8 ; G 1324
1225
- U 1497 ; WX 343 ; N uni05d9 ; G 1325
1226
- U 1498 ; WX 649 ; N uni05da ; G 1326
1227
- U 1499 ; WX 650 ; N uni05db ; G 1327
1228
- U 1500 ; WX 679 ; N uni05dc ; G 1328
1229
- U 1501 ; WX 712 ; N uni05dd ; G 1329
1230
- U 1502 ; WX 775 ; N uni05de ; G 1330
1231
- U 1503 ; WX 343 ; N uni05df ; G 1331
1232
- U 1504 ; WX 497 ; N uni05e0 ; G 1332
1233
- U 1505 ; WX 773 ; N uni05e1 ; G 1333
1234
- U 1506 ; WX 678 ; N uni05e2 ; G 1334
1235
- U 1507 ; WX 718 ; N uni05e3 ; G 1335
1236
- U 1508 ; WX 687 ; N uni05e4 ; G 1336
1237
- U 1509 ; WX 628 ; N uni05e5 ; G 1337
1238
- U 1510 ; WX 751 ; N uni05e6 ; G 1338
1239
- U 1511 ; WX 729 ; N uni05e7 ; G 1339
1240
- U 1512 ; WX 649 ; N uni05e8 ; G 1340
1241
- U 1513 ; WX 949 ; N uni05e9 ; G 1341
1242
- U 1514 ; WX 751 ; N uni05ea ; G 1342
1243
- U 1520 ; WX 664 ; N uni05f0 ; G 1343
1244
- U 1521 ; WX 664 ; N uni05f1 ; G 1344
1245
- U 1522 ; WX 663 ; N uni05f2 ; G 1345
1246
- U 1523 ; WX 444 ; N uni05f3 ; G 1346
1247
- U 1524 ; WX 710 ; N uni05f4 ; G 1347
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1248
  U 1542 ; WX 667 ; N uni0606 ; G 1348
1249
  U 1543 ; WX 667 ; N uni0607 ; G 1349
1250
  U 1545 ; WX 884 ; N uni0609 ; G 1350
1251
- U 1546 ; WX 1157 ; N uni060a ; G 1351
1252
- U 1548 ; WX 380 ; N uni060c ; G 1352
1253
- U 1563 ; WX 400 ; N uni061b ; G 1354
1254
- U 1567 ; WX 580 ; N uni061f ; G 1355
 
1255
  U 1569 ; WX 511 ; N uni0621 ; G 1356
1256
  U 1570 ; WX 343 ; N uni0622 ; G 1357
1257
  U 1571 ; WX 343 ; N uni0623 ; G 1358
@@ -1261,12 +1385,12 @@ U 1574 ; WX 917 ; N uni0626 ; G 1361
1261
  U 1575 ; WX 343 ; N uni0627 ; G 1362
1262
  U 1576 ; WX 1005 ; N uni0628 ; G 1363
1263
  U 1577 ; WX 590 ; N uni0629 ; G 1364
1264
- U 1578 ; WX 1005 ; N uni062a ; G 1365
1265
- U 1579 ; WX 1005 ; N uni062b ; G 1366
1266
- U 1580 ; WX 721 ; N uni062c ; G 1367
1267
- U 1581 ; WX 721 ; N uni062d ; G 1368
1268
- U 1582 ; WX 721 ; N uni062e ; G 1369
1269
- U 1583 ; WX 513 ; N uni062f ; G 1370
1270
  U 1584 ; WX 513 ; N uni0630 ; G 1371
1271
  U 1585 ; WX 576 ; N uni0631 ; G 1372
1272
  U 1586 ; WX 576 ; N uni0632 ; G 1373
@@ -1277,7 +1401,7 @@ U 1590 ; WX 1345 ; N uni0636 ; G 1377
1277
  U 1591 ; WX 1039 ; N uni0637 ; G 1378
1278
  U 1592 ; WX 1039 ; N uni0638 ; G 1379
1279
  U 1593 ; WX 683 ; N uni0639 ; G 1380
1280
- U 1594 ; WX 683 ; N uni063a ; G 1381
1281
  U 1600 ; WX 342 ; N uni0640 ; G 1382
1282
  U 1601 ; WX 1162 ; N uni0641 ; G 1383
1283
  U 1602 ; WX 894 ; N uni0642 ; G 1384
@@ -1288,8 +1412,20 @@ U 1606 ; WX 854 ; N uni0646 ; G 1388
1288
  U 1607 ; WX 590 ; N uni0647 ; G 1389
1289
  U 1608 ; WX 622 ; N uni0648 ; G 1390
1290
  U 1609 ; WX 917 ; N uni0649 ; G 1391
1291
- U 1610 ; WX 917 ; N uni064a ; G 1392
1292
- U 1626 ; WX 500 ; N uni065a ; G 1405
 
 
 
 
 
 
 
 
 
 
 
 
1293
  U 1632 ; WX 610 ; N uni0660 ; G 1406
1294
  U 1633 ; WX 610 ; N uni0661 ; G 1407
1295
  U 1634 ; WX 610 ; N uni0662 ; G 1408
@@ -1300,20 +1436,21 @@ U 1638 ; WX 610 ; N uni0666 ; G 1412
1300
  U 1639 ; WX 610 ; N uni0667 ; G 1413
1301
  U 1640 ; WX 610 ; N uni0668 ; G 1414
1302
  U 1641 ; WX 610 ; N uni0669 ; G 1415
1303
- U 1642 ; WX 610 ; N uni066a ; G 1416
1304
- U 1643 ; WX 374 ; N uni066b ; G 1417
1305
- U 1644 ; WX 380 ; N uni066c ; G 1418
1306
- U 1645 ; WX 545 ; N uni066d ; G 1419
1307
- U 1646 ; WX 1005 ; N uni066e ; G 1420
1308
- U 1647 ; WX 894 ; N uni066f ; G 1421
 
1309
  U 1652 ; WX 292 ; N uni0674 ; G 1423
1310
  U 1657 ; WX 1005 ; N uni0679 ; G 1424
1311
- U 1658 ; WX 1005 ; N uni067a ; G 1425
1312
- U 1659 ; WX 1005 ; N uni067b ; G 1426
1313
- U 1660 ; WX 1005 ; N uni067c ; G 1427
1314
- U 1661 ; WX 1005 ; N uni067d ; G 1428
1315
- U 1662 ; WX 1005 ; N uni067e ; G 1429
1316
- U 1663 ; WX 1005 ; N uni067f ; G 1430
1317
  U 1664 ; WX 1005 ; N uni0680 ; G 1431
1318
  U 1665 ; WX 721 ; N uni0681 ; G 1432
1319
  U 1666 ; WX 721 ; N uni0682 ; G 1433
@@ -1324,12 +1461,12 @@ U 1670 ; WX 721 ; N uni0686 ; G 1437
1324
  U 1671 ; WX 721 ; N uni0687 ; G 1438
1325
  U 1672 ; WX 445 ; N uni0688 ; G 1439
1326
  U 1673 ; WX 445 ; N uni0689 ; G 1440
1327
- U 1674 ; WX 445 ; N uni068a ; G 1441
1328
- U 1675 ; WX 445 ; N uni068b ; G 1442
1329
- U 1676 ; WX 445 ; N uni068c ; G 1443
1330
- U 1677 ; WX 445 ; N uni068d ; G 1444
1331
- U 1678 ; WX 445 ; N uni068e ; G 1445
1332
- U 1679 ; WX 445 ; N uni068f ; G 1446
1333
  U 1680 ; WX 445 ; N uni0690 ; G 1447
1334
  U 1681 ; WX 576 ; N uni0691 ; G 1448
1335
  U 1682 ; WX 576 ; N uni0692 ; G 1449
@@ -1340,237 +1477,261 @@ U 1686 ; WX 576 ; N uni0696 ; G 1453
1340
  U 1687 ; WX 576 ; N uni0697 ; G 1454
1341
  U 1688 ; WX 576 ; N uni0698 ; G 1455
1342
  U 1689 ; WX 576 ; N uni0699 ; G 1456
1343
- U 1690 ; WX 1380 ; N uni069a ; G 1457
1344
- U 1691 ; WX 1380 ; N uni069b ; G 1458
1345
- U 1692 ; WX 1380 ; N uni069c ; G 1459
1346
- U 1693 ; WX 1345 ; N uni069d ; G 1460
1347
- U 1694 ; WX 1345 ; N uni069e ; G 1461
1348
- U 1695 ; WX 1039 ; N uni069f ; G 1462
1349
- U 1696 ; WX 683 ; N uni06a0 ; G 1463
1350
- U 1697 ; WX 1162 ; N uni06a1 ; G 1464
1351
- U 1698 ; WX 1162 ; N uni06a2 ; G 1465
1352
- U 1699 ; WX 1162 ; N uni06a3 ; G 1466
1353
- U 1700 ; WX 1162 ; N uni06a4 ; G 1467
1354
- U 1701 ; WX 1162 ; N uni06a5 ; G 1468
1355
- U 1702 ; WX 1162 ; N uni06a6 ; G 1469
1356
- U 1703 ; WX 894 ; N uni06a7 ; G 1470
1357
- U 1704 ; WX 894 ; N uni06a8 ; G 1471
1358
- U 1705 ; WX 1024 ; N uni06a9 ; G 1472
1359
- U 1706 ; WX 1271 ; N uni06aa ; G 1473
1360
- U 1707 ; WX 1024 ; N uni06ab ; G 1474
1361
- U 1708 ; WX 917 ; N uni06ac ; G 1475
1362
- U 1709 ; WX 917 ; N uni06ad ; G 1476
1363
- U 1710 ; WX 917 ; N uni06ae ; G 1477
1364
- U 1711 ; WX 1024 ; N uni06af ; G 1478
1365
- U 1712 ; WX 1024 ; N uni06b0 ; G 1479
1366
- U 1713 ; WX 1024 ; N uni06b1 ; G 1480
1367
- U 1714 ; WX 1024 ; N uni06b2 ; G 1481
1368
- U 1715 ; WX 1024 ; N uni06b3 ; G 1482
1369
- U 1716 ; WX 1024 ; N uni06b4 ; G 1483
1370
- U 1717 ; WX 868 ; N uni06b5 ; G 1484
1371
- U 1718 ; WX 868 ; N uni06b6 ; G 1485
1372
- U 1719 ; WX 868 ; N uni06b7 ; G 1486
1373
- U 1720 ; WX 868 ; N uni06b8 ; G 1487
1374
- U 1721 ; WX 854 ; N uni06b9 ; G 1488
1375
- U 1722 ; WX 854 ; N uni06ba ; G 1489
1376
- U 1723 ; WX 854 ; N uni06bb ; G 1490
1377
- U 1724 ; WX 854 ; N uni06bc ; G 1491
1378
- U 1725 ; WX 854 ; N uni06bd ; G 1492
1379
- U 1726 ; WX 938 ; N uni06be ; G 1493
1380
- U 1727 ; WX 721 ; N uni06bf ; G 1494
1381
- U 1734 ; WX 622 ; N uni06c6 ; G 1495
1382
- U 1740 ; WX 917 ; N uni06cc ; G 1496
1383
- U 1742 ; WX 917 ; N uni06ce ; G 1497
1384
- U 1749 ; WX 590 ; N uni06d5 ; G 1498
1385
- U 1776 ; WX 610 ; N uni06f0 ; G 1499
1386
- U 1777 ; WX 610 ; N uni06f1 ; G 1500
1387
- U 1778 ; WX 610 ; N uni06f2 ; G 1501
1388
- U 1779 ; WX 610 ; N uni06f3 ; G 1502
1389
- U 1780 ; WX 610 ; N uni06f4 ; G 1503
1390
- U 1781 ; WX 610 ; N uni06f5 ; G 1504
1391
- U 1782 ; WX 610 ; N uni06f6 ; G 1505
1392
- U 1783 ; WX 610 ; N uni06f7 ; G 1506
1393
- U 1784 ; WX 610 ; N uni06f8 ; G 1507
1394
- U 1785 ; WX 610 ; N uni06f9 ; G 1508
1395
- U 1984 ; WX 696 ; N uni07c0 ; G 1509
1396
- U 1985 ; WX 696 ; N uni07c1 ; G 1510
1397
- U 1986 ; WX 696 ; N uni07c2 ; G 1511
1398
- U 1987 ; WX 696 ; N uni07c3 ; G 1512
1399
- U 1988 ; WX 696 ; N uni07c4 ; G 1513
1400
- U 1989 ; WX 696 ; N uni07c5 ; G 1514
1401
- U 1990 ; WX 696 ; N uni07c6 ; G 1515
1402
- U 1991 ; WX 696 ; N uni07c7 ; G 1516
1403
- U 1992 ; WX 696 ; N uni07c8 ; G 1517
1404
- U 1993 ; WX 696 ; N uni07c9 ; G 1518
1405
- U 1994 ; WX 343 ; N uni07ca ; G 1519
1406
- U 1995 ; WX 547 ; N uni07cb ; G 1520
1407
- U 1996 ; WX 543 ; N uni07cc ; G 1521
1408
- U 1997 ; WX 652 ; N uni07cd ; G 1522
1409
- U 1998 ; WX 691 ; N uni07ce ; G 1523
1410
- U 1999 ; WX 691 ; N uni07cf ; G 1524
1411
- U 2000 ; WX 594 ; N uni07d0 ; G 1525
1412
- U 2001 ; WX 691 ; N uni07d1 ; G 1526
1413
- U 2002 ; WX 904 ; N uni07d2 ; G 1527
1414
- U 2003 ; WX 551 ; N uni07d3 ; G 1528
1415
- U 2004 ; WX 551 ; N uni07d4 ; G 1529
1416
- U 2005 ; WX 627 ; N uni07d5 ; G 1530
1417
- U 2006 ; WX 688 ; N uni07d6 ; G 1531
1418
- U 2007 ; WX 444 ; N uni07d7 ; G 1532
1419
- U 2008 ; WX 1022 ; N uni07d8 ; G 1533
1420
- U 2009 ; WX 506 ; N uni07d9 ; G 1534
1421
- U 2010 ; WX 826 ; N uni07da ; G 1535
1422
- U 2011 ; WX 691 ; N uni07db ; G 1536
1423
- U 2012 ; WX 652 ; N uni07dc ; G 1537
1424
- U 2013 ; WX 912 ; N uni07dd ; G 1538
1425
- U 2014 ; WX 627 ; N uni07de ; G 1539
1426
- U 2015 ; WX 707 ; N uni07df ; G 1540
1427
- U 2016 ; WX 506 ; N uni07e0 ; G 1541
1428
- U 2017 ; WX 652 ; N uni07e1 ; G 1542
1429
- U 2018 ; WX 574 ; N uni07e2 ; G 1543
1430
- U 2019 ; WX 627 ; N uni07e3 ; G 1544
1431
- U 2020 ; WX 627 ; N uni07e4 ; G 1545
1432
- U 2021 ; WX 627 ; N uni07e5 ; G 1546
1433
- U 2022 ; WX 574 ; N uni07e6 ; G 1547
1434
- U 2023 ; WX 574 ; N uni07e7 ; G 1548
1435
- U 2036 ; WX 380 ; N uni07f4 ; G 1558
1436
- U 2037 ; WX 380 ; N uni07f5 ; G 1559
1437
- U 2040 ; WX 691 ; N uni07f8 ; G 1560
1438
- U 2041 ; WX 691 ; N uni07f9 ; G 1561
1439
- U 2042 ; WX 415 ; N uni07fa ; G 1562
1440
- U 3647 ; WX 696 ; N uni0e3f ; G 1563
1441
- U 3713 ; WX 790 ; N uni0e81 ; G 1564
1442
- U 3714 ; WX 748 ; N uni0e82 ; G 1565
1443
- U 3716 ; WX 749 ; N uni0e84 ; G 1566
1444
- U 3719 ; WX 569 ; N uni0e87 ; G 1567
1445
- U 3720 ; WX 742 ; N uni0e88 ; G 1568
1446
- U 3722 ; WX 744 ; N uni0e8a ; G 1569
1447
- U 3725 ; WX 761 ; N uni0e8d ; G 1570
1448
- U 3732 ; WX 706 ; N uni0e94 ; G 1571
1449
- U 3733 ; WX 704 ; N uni0e95 ; G 1572
1450
- U 3734 ; WX 747 ; N uni0e96 ; G 1573
1451
- U 3735 ; WX 819 ; N uni0e97 ; G 1574
1452
- U 3737 ; WX 730 ; N uni0e99 ; G 1575
1453
- U 3738 ; WX 727 ; N uni0e9a ; G 1576
1454
- U 3739 ; WX 727 ; N uni0e9b ; G 1577
1455
- U 3740 ; WX 922 ; N uni0e9c ; G 1578
1456
- U 3741 ; WX 827 ; N uni0e9d ; G 1579
1457
- U 3742 ; WX 866 ; N uni0e9e ; G 1580
1458
- U 3743 ; WX 866 ; N uni0e9f ; G 1581
1459
- U 3745 ; WX 836 ; N uni0ea1 ; G 1582
1460
- U 3746 ; WX 761 ; N uni0ea2 ; G 1583
1461
- U 3747 ; WX 770 ; N uni0ea3 ; G 1584
1462
- U 3749 ; WX 769 ; N uni0ea5 ; G 1585
1463
- U 3751 ; WX 713 ; N uni0ea7 ; G 1586
1464
- U 3754 ; WX 827 ; N uni0eaa ; G 1587
1465
- U 3755 ; WX 1031 ; N uni0eab ; G 1588
1466
- U 3757 ; WX 724 ; N uni0ead ; G 1589
1467
- U 3758 ; WX 784 ; N uni0eae ; G 1590
1468
- U 3759 ; WX 934 ; N uni0eaf ; G 1591
1469
- U 3760 ; WX 688 ; N uni0eb0 ; G 1592
1470
- U 3762 ; WX 610 ; N uni0eb2 ; G 1594
1471
- U 3763 ; WX 610 ; N uni0eb3 ; G 1595
1472
- U 3773 ; WX 670 ; N uni0ebd ; G 1604
1473
- U 3776 ; WX 516 ; N uni0ec0 ; G 1605
1474
- U 3777 ; WX 860 ; N uni0ec1 ; G 1606
1475
- U 3778 ; WX 516 ; N uni0ec2 ; G 1607
1476
- U 3779 ; WX 650 ; N uni0ec3 ; G 1608
1477
- U 3780 ; WX 632 ; N uni0ec4 ; G 1609
1478
- U 3782 ; WX 759 ; N uni0ec6 ; G 1610
1479
- U 3792 ; WX 771 ; N uni0ed0 ; G 1617
1480
- U 3793 ; WX 771 ; N uni0ed1 ; G 1618
1481
- U 3794 ; WX 693 ; N uni0ed2 ; G 1619
1482
- U 3795 ; WX 836 ; N uni0ed3 ; G 1620
1483
- U 3796 ; WX 729 ; N uni0ed4 ; G 1621
1484
- U 3797 ; WX 729 ; N uni0ed5 ; G 1622
1485
- U 3798 ; WX 849 ; N uni0ed6 ; G 1623
1486
- U 3799 ; WX 790 ; N uni0ed7 ; G 1624
1487
- U 3800 ; WX 759 ; N uni0ed8 ; G 1625
1488
- U 3801 ; WX 910 ; N uni0ed9 ; G 1626
1489
- U 3804 ; WX 1363 ; N uni0edc ; G 1627
1490
- U 3805 ; WX 1363 ; N uni0edd ; G 1628
1491
- U 4256 ; WX 918 ; N uni10a0 ; G 1629
1492
- U 4257 ; WX 744 ; N uni10a1 ; G 1630
1493
- U 4258 ; WX 739 ; N uni10a2 ; G 1631
1494
- U 4259 ; WX 837 ; N uni10a3 ; G 1632
1495
- U 4260 ; WX 649 ; N uni10a4 ; G 1633
1496
- U 4261 ; WX 773 ; N uni10a5 ; G 1634
1497
- U 4262 ; WX 857 ; N uni10a6 ; G 1635
1498
- U 4263 ; WX 889 ; N uni10a7 ; G 1636
1499
- U 4264 ; WX 530 ; N uni10a8 ; G 1637
1500
- U 4265 ; WX 633 ; N uni10a9 ; G 1638
1501
- U 4266 ; WX 857 ; N uni10aa ; G 1639
1502
- U 4267 ; WX 900 ; N uni10ab ; G 1640
1503
- U 4268 ; WX 643 ; N uni10ac ; G 1641
1504
- U 4269 ; WX 903 ; N uni10ad ; G 1642
1505
- U 4270 ; WX 814 ; N uni10ae ; G 1643
1506
- U 4271 ; WX 752 ; N uni10af ; G 1644
1507
- U 4272 ; WX 869 ; N uni10b0 ; G 1645
1508
- U 4273 ; WX 643 ; N uni10b1 ; G 1646
1509
- U 4274 ; WX 643 ; N uni10b2 ; G 1647
1510
- U 4275 ; WX 886 ; N uni10b3 ; G 1648
1511
- U 4276 ; WX 886 ; N uni10b4 ; G 1649
1512
- U 4277 ; WX 733 ; N uni10b5 ; G 1650
1513
- U 4278 ; WX 653 ; N uni10b6 ; G 1651
1514
- U 4279 ; WX 643 ; N uni10b7 ; G 1652
1515
- U 4280 ; WX 646 ; N uni10b8 ; G 1653
1516
- U 4281 ; WX 643 ; N uni10b9 ; G 1654
1517
- U 4282 ; WX 790 ; N uni10ba ; G 1655
1518
- U 4283 ; WX 902 ; N uni10bb ; G 1656
1519
- U 4284 ; WX 633 ; N uni10bc ; G 1657
1520
- U 4285 ; WX 619 ; N uni10bd ; G 1658
1521
- U 4286 ; WX 643 ; N uni10be ; G 1659
1522
- U 4287 ; WX 778 ; N uni10bf ; G 1660
1523
- U 4288 ; WX 892 ; N uni10c0 ; G 1661
1524
- U 4289 ; WX 601 ; N uni10c1 ; G 1662
1525
- U 4290 ; WX 742 ; N uni10c2 ; G 1663
1526
- U 4291 ; WX 616 ; N uni10c3 ; G 1664
1527
- U 4292 ; WX 633 ; N uni10c4 ; G 1665
1528
- U 4293 ; WX 742 ; N uni10c5 ; G 1666
1529
- U 4304 ; WX 553 ; N uni10d0 ; G 1667
1530
- U 4305 ; WX 552 ; N uni10d1 ; G 1668
1531
- U 4306 ; WX 596 ; N uni10d2 ; G 1669
1532
- U 4307 ; WX 815 ; N uni10d3 ; G 1670
1533
- U 4308 ; WX 562 ; N uni10d4 ; G 1671
1534
- U 4309 ; WX 563 ; N uni10d5 ; G 1672
1535
- U 4310 ; WX 553 ; N uni10d6 ; G 1673
1536
- U 4311 ; WX 827 ; N uni10d7 ; G 1674
1537
- U 4312 ; WX 553 ; N uni10d8 ; G 1675
1538
- U 4313 ; WX 543 ; N uni10d9 ; G 1676
1539
- U 4314 ; WX 1074 ; N uni10da ; G 1677
1540
- U 4315 ; WX 563 ; N uni10db ; G 1678
1541
- U 4316 ; WX 563 ; N uni10dc ; G 1679
1542
- U 4317 ; WX 812 ; N uni10dd ; G 1680
1543
- U 4318 ; WX 552 ; N uni10de ; G 1681
1544
- U 4319 ; WX 591 ; N uni10df ; G 1682
1545
- U 4320 ; WX 822 ; N uni10e0 ; G 1683
1546
- U 4321 ; WX 563 ; N uni10e1 ; G 1684
1547
- U 4322 ; WX 690 ; N uni10e2 ; G 1685
1548
- U 4323 ; WX 583 ; N uni10e3 ; G 1686
1549
- U 4324 ; WX 813 ; N uni10e4 ; G 1687
1550
- U 4325 ; WX 562 ; N uni10e5 ; G 1688
1551
- U 4326 ; WX 813 ; N uni10e6 ; G 1689
1552
- U 4327 ; WX 563 ; N uni10e7 ; G 1690
1553
- U 4328 ; WX 563 ; N uni10e8 ; G 1691
1554
- U 4329 ; WX 563 ; N uni10e9 ; G 1692
1555
- U 4330 ; WX 632 ; N uni10ea ; G 1693
1556
- U 4331 ; WX 563 ; N uni10eb ; G 1694
1557
- U 4332 ; WX 563 ; N uni10ec ; G 1695
1558
- U 4333 ; WX 552 ; N uni10ed ; G 1696
1559
- U 4334 ; WX 563 ; N uni10ee ; G 1697
1560
- U 4335 ; WX 563 ; N uni10ef ; G 1698
1561
- U 4336 ; WX 558 ; N uni10f0 ; G 1699
1562
- U 4337 ; WX 604 ; N uni10f1 ; G 1700
1563
- U 4338 ; WX 552 ; N uni10f2 ; G 1701
1564
- U 4339 ; WX 552 ; N uni10f3 ; G 1702
1565
- U 4340 ; WX 553 ; N uni10f4 ; G 1703
1566
- U 4341 ; WX 605 ; N uni10f5 ; G 1704
1567
- U 4342 ; WX 852 ; N uni10f6 ; G 1705
1568
- U 4343 ; WX 635 ; N uni10f7 ; G 1706
1569
- U 4344 ; WX 563 ; N uni10f8 ; G 1707
1570
- U 4345 ; WX 596 ; N uni10f9 ; G 1708
1571
- U 4346 ; WX 542 ; N uni10fa ; G 1709
1572
- U 4347 ; WX 684 ; N uni10fb ; G 1710
1573
- U 4348 ; WX 368 ; N uni10fc ; G 1711
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1574
  U 5121 ; WX 774 ; N uni1401 ; G 1712
1575
  U 5122 ; WX 774 ; N uni1402 ; G 1713
1576
  U 5123 ; WX 774 ; N uni1403 ; G 1714
@@ -1579,12 +1740,12 @@ U 5125 ; WX 905 ; N uni1405 ; G 1716
1579
  U 5126 ; WX 905 ; N uni1406 ; G 1717
1580
  U 5127 ; WX 905 ; N uni1407 ; G 1718
1581
  U 5129 ; WX 905 ; N uni1409 ; G 1719
1582
- U 5130 ; WX 905 ; N uni140a ; G 1720
1583
- U 5131 ; WX 905 ; N uni140b ; G 1721
1584
- U 5132 ; WX 1018 ; N uni140c ; G 1722
1585
- U 5133 ; WX 1009 ; N uni140d ; G 1723
1586
- U 5134 ; WX 1018 ; N uni140e ; G 1724
1587
- U 5135 ; WX 1009 ; N uni140f ; G 1725
1588
  U 5136 ; WX 1018 ; N uni1410 ; G 1726
1589
  U 5137 ; WX 1009 ; N uni1411 ; G 1727
1590
  U 5138 ; WX 1149 ; N uni1412 ; G 1728
@@ -1595,11 +1756,11 @@ U 5142 ; WX 905 ; N uni1416 ; G 1732
1595
  U 5143 ; WX 1149 ; N uni1417 ; G 1733
1596
  U 5144 ; WX 1142 ; N uni1418 ; G 1734
1597
  U 5145 ; WX 1149 ; N uni1419 ; G 1735
1598
- U 5146 ; WX 1142 ; N uni141a ; G 1736
1599
- U 5147 ; WX 905 ; N uni141b ; G 1737
1600
- U 5149 ; WX 310 ; N uni141d ; G 1738
1601
- U 5150 ; WX 529 ; N uni141e ; G 1739
1602
- U 5151 ; WX 425 ; N uni141f ; G 1740
1603
  U 5152 ; WX 425 ; N uni1420 ; G 1741
1604
  U 5153 ; WX 395 ; N uni1421 ; G 1742
1605
  U 5154 ; WX 395 ; N uni1422 ; G 1743
@@ -1610,12 +1771,12 @@ U 5158 ; WX 470 ; N uni1426 ; G 1747
1610
  U 5159 ; WX 310 ; N uni1427 ; G 1748
1611
  U 5160 ; WX 395 ; N uni1428 ; G 1749
1612
  U 5161 ; WX 395 ; N uni1429 ; G 1750
1613
- U 5162 ; WX 395 ; N uni142a ; G 1751
1614
- U 5163 ; WX 1213 ; N uni142b ; G 1752
1615
- U 5164 ; WX 986 ; N uni142c ; G 1753
1616
- U 5165 ; WX 1216 ; N uni142d ; G 1754
1617
- U 5166 ; WX 1297 ; N uni142e ; G 1755
1618
- U 5167 ; WX 774 ; N uni142f ; G 1756
1619
  U 5168 ; WX 774 ; N uni1430 ; G 1757
1620
  U 5169 ; WX 774 ; N uni1431 ; G 1758
1621
  U 5170 ; WX 774 ; N uni1432 ; G 1759
@@ -1625,12 +1786,12 @@ U 5173 ; WX 886 ; N uni1435 ; G 1762
1625
  U 5175 ; WX 886 ; N uni1437 ; G 1763
1626
  U 5176 ; WX 886 ; N uni1438 ; G 1764
1627
  U 5177 ; WX 886 ; N uni1439 ; G 1765
1628
- U 5178 ; WX 1018 ; N uni143a ; G 1766
1629
- U 5179 ; WX 1009 ; N uni143b ; G 1767
1630
- U 5180 ; WX 1018 ; N uni143c ; G 1768
1631
- U 5181 ; WX 1009 ; N uni143d ; G 1769
1632
- U 5182 ; WX 1018 ; N uni143e ; G 1770
1633
- U 5183 ; WX 1009 ; N uni143f ; G 1771
1634
  U 5184 ; WX 1149 ; N uni1440 ; G 1772
1635
  U 5185 ; WX 1140 ; N uni1441 ; G 1773
1636
  U 5186 ; WX 1149 ; N uni1442 ; G 1774
@@ -1641,11 +1802,11 @@ U 5190 ; WX 1149 ; N uni1446 ; G 1778
1641
  U 5191 ; WX 1142 ; N uni1447 ; G 1779
1642
  U 5192 ; WX 886 ; N uni1448 ; G 1780
1643
  U 5193 ; WX 576 ; N uni1449 ; G 1781
1644
- U 5194 ; WX 229 ; N uni144a ; G 1782
1645
- U 5196 ; WX 812 ; N uni144c ; G 1783
1646
- U 5197 ; WX 812 ; N uni144d ; G 1784
1647
- U 5198 ; WX 812 ; N uni144e ; G 1785
1648
- U 5199 ; WX 812 ; N uni144f ; G 1786
1649
  U 5200 ; WX 815 ; N uni1450 ; G 1787
1650
  U 5201 ; WX 815 ; N uni1451 ; G 1788
1651
  U 5202 ; WX 815 ; N uni1452 ; G 1789
@@ -1655,12 +1816,12 @@ U 5206 ; WX 815 ; N uni1456 ; G 1792
1655
  U 5207 ; WX 1056 ; N uni1457 ; G 1793
1656
  U 5208 ; WX 1048 ; N uni1458 ; G 1794
1657
  U 5209 ; WX 1056 ; N uni1459 ; G 1795
1658
- U 5210 ; WX 1048 ; N uni145a ; G 1796
1659
- U 5211 ; WX 1056 ; N uni145b ; G 1797
1660
- U 5212 ; WX 1048 ; N uni145c ; G 1798
1661
- U 5213 ; WX 1060 ; N uni145d ; G 1799
1662
- U 5214 ; WX 1054 ; N uni145e ; G 1800
1663
- U 5215 ; WX 1060 ; N uni145f ; G 1801
1664
  U 5216 ; WX 1054 ; N uni1460 ; G 1802
1665
  U 5217 ; WX 1060 ; N uni1461 ; G 1803
1666
  U 5218 ; WX 1052 ; N uni1462 ; G 1804
@@ -1671,12 +1832,12 @@ U 5222 ; WX 483 ; N uni1466 ; G 1808
1671
  U 5223 ; WX 1005 ; N uni1467 ; G 1809
1672
  U 5224 ; WX 1005 ; N uni1468 ; G 1810
1673
  U 5225 ; WX 1023 ; N uni1469 ; G 1811
1674
- U 5226 ; WX 1017 ; N uni146a ; G 1812
1675
- U 5227 ; WX 743 ; N uni146b ; G 1813
1676
- U 5228 ; WX 743 ; N uni146c ; G 1814
1677
- U 5229 ; WX 743 ; N uni146d ; G 1815
1678
- U 5230 ; WX 743 ; N uni146e ; G 1816
1679
- U 5231 ; WX 743 ; N uni146f ; G 1817
1680
  U 5232 ; WX 743 ; N uni1470 ; G 1818
1681
  U 5233 ; WX 743 ; N uni1471 ; G 1819
1682
  U 5234 ; WX 743 ; N uni1472 ; G 1820
@@ -1687,12 +1848,12 @@ U 5238 ; WX 980 ; N uni1476 ; G 1824
1687
  U 5239 ; WX 975 ; N uni1477 ; G 1825
1688
  U 5240 ; WX 980 ; N uni1478 ; G 1826
1689
  U 5241 ; WX 975 ; N uni1479 ; G 1827
1690
- U 5242 ; WX 1029 ; N uni147a ; G 1828
1691
- U 5243 ; WX 975 ; N uni147b ; G 1829
1692
- U 5244 ; WX 1029 ; N uni147c ; G 1830
1693
- U 5245 ; WX 975 ; N uni147d ; G 1831
1694
- U 5246 ; WX 980 ; N uni147e ; G 1832
1695
- U 5247 ; WX 975 ; N uni147f ; G 1833
1696
  U 5248 ; WX 980 ; N uni1480 ; G 1834
1697
  U 5249 ; WX 975 ; N uni1481 ; G 1835
1698
  U 5250 ; WX 980 ; N uni1482 ; G 1836
@@ -1703,12 +1864,12 @@ U 5254 ; WX 938 ; N uni1486 ; G 1840
1703
  U 5255 ; WX 938 ; N uni1487 ; G 1841
1704
  U 5256 ; WX 938 ; N uni1488 ; G 1842
1705
  U 5257 ; WX 743 ; N uni1489 ; G 1843
1706
- U 5258 ; WX 743 ; N uni148a ; G 1844
1707
- U 5259 ; WX 743 ; N uni148b ; G 1845
1708
- U 5260 ; WX 743 ; N uni148c ; G 1846
1709
- U 5261 ; WX 743 ; N uni148d ; G 1847
1710
- U 5262 ; WX 743 ; N uni148e ; G 1848
1711
- U 5263 ; WX 743 ; N uni148f ; G 1849
1712
  U 5264 ; WX 743 ; N uni1490 ; G 1850
1713
  U 5265 ; WX 743 ; N uni1491 ; G 1851
1714
  U 5266 ; WX 1029 ; N uni1492 ; G 1852
@@ -1719,105 +1880,105 @@ U 5270 ; WX 1029 ; N uni1496 ; G 1856
1719
  U 5271 ; WX 975 ; N uni1497 ; G 1857
1720
  U 5272 ; WX 1029 ; N uni1498 ; G 1858
1721
  U 5273 ; WX 975 ; N uni1499 ; G 1859
1722
- U 5274 ; WX 1029 ; N uni149a ; G 1860
1723
- U 5275 ; WX 975 ; N uni149b ; G 1861
1724
- U 5276 ; WX 1029 ; N uni149c ; G 1862
1725
- U 5277 ; WX 975 ; N uni149d ; G 1863
1726
- U 5278 ; WX 1029 ; N uni149e ; G 1864
1727
- U 5279 ; WX 975 ; N uni149f ; G 1865
1728
- U 5280 ; WX 1029 ; N uni14a0 ; G 1866
1729
- U 5281 ; WX 501 ; N uni14a1 ; G 1867
1730
- U 5282 ; WX 501 ; N uni14a2 ; G 1868
1731
- U 5283 ; WX 626 ; N uni14a3 ; G 1869
1732
- U 5284 ; WX 626 ; N uni14a4 ; G 1870
1733
- U 5285 ; WX 626 ; N uni14a5 ; G 1871
1734
- U 5286 ; WX 626 ; N uni14a6 ; G 1872
1735
- U 5287 ; WX 626 ; N uni14a7 ; G 1873
1736
- U 5288 ; WX 626 ; N uni14a8 ; G 1874
1737
- U 5289 ; WX 626 ; N uni14a9 ; G 1875
1738
- U 5290 ; WX 626 ; N uni14aa ; G 1876
1739
- U 5291 ; WX 626 ; N uni14ab ; G 1877
1740
- U 5292 ; WX 881 ; N uni14ac ; G 1878
1741
- U 5293 ; WX 854 ; N uni14ad ; G 1879
1742
- U 5294 ; WX 863 ; N uni14ae ; G 1880
1743
- U 5295 ; WX 874 ; N uni14af ; G 1881
1744
- U 5296 ; WX 863 ; N uni14b0 ; G 1882
1745
- U 5297 ; WX 874 ; N uni14b1 ; G 1883
1746
- U 5298 ; WX 881 ; N uni14b2 ; G 1884
1747
- U 5299 ; WX 874 ; N uni14b3 ; G 1885
1748
- U 5300 ; WX 881 ; N uni14b4 ; G 1886
1749
- U 5301 ; WX 874 ; N uni14b5 ; G 1887
1750
- U 5302 ; WX 863 ; N uni14b6 ; G 1888
1751
- U 5303 ; WX 874 ; N uni14b7 ; G 1889
1752
- U 5304 ; WX 863 ; N uni14b8 ; G 1890
1753
- U 5305 ; WX 874 ; N uni14b9 ; G 1891
1754
- U 5306 ; WX 863 ; N uni14ba ; G 1892
1755
- U 5307 ; WX 436 ; N uni14bb ; G 1893
1756
- U 5308 ; WX 548 ; N uni14bc ; G 1894
1757
- U 5309 ; WX 436 ; N uni14bd ; G 1895
1758
- U 5312 ; WX 988 ; N uni14c0 ; G 1896
1759
- U 5313 ; WX 988 ; N uni14c1 ; G 1897
1760
- U 5314 ; WX 988 ; N uni14c2 ; G 1898
1761
- U 5315 ; WX 988 ; N uni14c3 ; G 1899
1762
- U 5316 ; WX 931 ; N uni14c4 ; G 1900
1763
- U 5317 ; WX 931 ; N uni14c5 ; G 1901
1764
- U 5318 ; WX 931 ; N uni14c6 ; G 1902
1765
- U 5319 ; WX 931 ; N uni14c7 ; G 1903
1766
- U 5320 ; WX 931 ; N uni14c8 ; G 1904
1767
- U 5321 ; WX 1238 ; N uni14c9 ; G 1905
1768
- U 5322 ; WX 1247 ; N uni14ca ; G 1906
1769
- U 5323 ; WX 1200 ; N uni14cb ; G 1907
1770
- U 5324 ; WX 1228 ; N uni14cc ; G 1908
1771
- U 5325 ; WX 1200 ; N uni14cd ; G 1909
1772
- U 5326 ; WX 1228 ; N uni14ce ; G 1910
1773
- U 5327 ; WX 931 ; N uni14cf ; G 1911
1774
- U 5328 ; WX 660 ; N uni14d0 ; G 1912
1775
- U 5329 ; WX 497 ; N uni14d1 ; G 1913
1776
- U 5330 ; WX 660 ; N uni14d2 ; G 1914
1777
- U 5331 ; WX 988 ; N uni14d3 ; G 1915
1778
- U 5332 ; WX 988 ; N uni14d4 ; G 1916
1779
- U 5333 ; WX 988 ; N uni14d5 ; G 1917
1780
- U 5334 ; WX 988 ; N uni14d6 ; G 1918
1781
- U 5335 ; WX 931 ; N uni14d7 ; G 1919
1782
- U 5336 ; WX 931 ; N uni14d8 ; G 1920
1783
- U 5337 ; WX 931 ; N uni14d9 ; G 1921
1784
- U 5338 ; WX 931 ; N uni14da ; G 1922
1785
- U 5339 ; WX 931 ; N uni14db ; G 1923
1786
- U 5340 ; WX 1231 ; N uni14dc ; G 1924
1787
- U 5341 ; WX 1247 ; N uni14dd ; G 1925
1788
- U 5342 ; WX 1283 ; N uni14de ; G 1926
1789
- U 5343 ; WX 1228 ; N uni14df ; G 1927
1790
- U 5344 ; WX 1283 ; N uni14e0 ; G 1928
1791
- U 5345 ; WX 1228 ; N uni14e1 ; G 1929
1792
- U 5346 ; WX 1228 ; N uni14e2 ; G 1930
1793
- U 5347 ; WX 1214 ; N uni14e3 ; G 1931
1794
- U 5348 ; WX 1228 ; N uni14e4 ; G 1932
1795
- U 5349 ; WX 1214 ; N uni14e5 ; G 1933
1796
- U 5350 ; WX 1283 ; N uni14e6 ; G 1934
1797
- U 5351 ; WX 1228 ; N uni14e7 ; G 1935
1798
- U 5352 ; WX 1283 ; N uni14e8 ; G 1936
1799
- U 5353 ; WX 1228 ; N uni14e9 ; G 1937
1800
- U 5354 ; WX 660 ; N uni14ea ; G 1938
1801
- U 5356 ; WX 886 ; N uni14ec ; G 1939
1802
- U 5357 ; WX 730 ; N uni14ed ; G 1940
1803
- U 5358 ; WX 730 ; N uni14ee ; G 1941
1804
- U 5359 ; WX 730 ; N uni14ef ; G 1942
1805
- U 5360 ; WX 730 ; N uni14f0 ; G 1943
1806
- U 5361 ; WX 730 ; N uni14f1 ; G 1944
1807
- U 5362 ; WX 730 ; N uni14f2 ; G 1945
1808
- U 5363 ; WX 730 ; N uni14f3 ; G 1946
1809
- U 5364 ; WX 730 ; N uni14f4 ; G 1947
1810
- U 5365 ; WX 730 ; N uni14f5 ; G 1948
1811
- U 5366 ; WX 998 ; N uni14f6 ; G 1949
1812
- U 5367 ; WX 958 ; N uni14f7 ; G 1950
1813
- U 5368 ; WX 967 ; N uni14f8 ; G 1951
1814
- U 5369 ; WX 989 ; N uni14f9 ; G 1952
1815
- U 5370 ; WX 967 ; N uni14fa ; G 1953
1816
- U 5371 ; WX 989 ; N uni14fb ; G 1954
1817
- U 5372 ; WX 998 ; N uni14fc ; G 1955
1818
- U 5373 ; WX 958 ; N uni14fd ; G 1956
1819
- U 5374 ; WX 998 ; N uni14fe ; G 1957
1820
- U 5375 ; WX 958 ; N uni14ff ; G 1958
1821
  U 5376 ; WX 967 ; N uni1500 ; G 1959
1822
  U 5377 ; WX 989 ; N uni1501 ; G 1960
1823
  U 5378 ; WX 967 ; N uni1502 ; G 1961
@@ -1836,12 +1997,12 @@ U 5398 ; WX 1136 ; N uni1516 ; G 1973
1836
  U 5399 ; WX 1209 ; N uni1517 ; G 1974
1837
  U 5400 ; WX 1202 ; N uni1518 ; G 1975
1838
  U 5401 ; WX 1209 ; N uni1519 ; G 1976
1839
- U 5402 ; WX 1202 ; N uni151a ; G 1977
1840
- U 5403 ; WX 1209 ; N uni151b ; G 1978
1841
- U 5404 ; WX 1202 ; N uni151c ; G 1979
1842
- U 5405 ; WX 1431 ; N uni151d ; G 1980
1843
- U 5406 ; WX 1420 ; N uni151e ; G 1981
1844
- U 5407 ; WX 1431 ; N uni151f ; G 1982
1845
  U 5408 ; WX 1420 ; N uni1520 ; G 1983
1846
  U 5409 ; WX 1431 ; N uni1521 ; G 1984
1847
  U 5410 ; WX 1420 ; N uni1522 ; G 1985
@@ -1852,12 +2013,12 @@ U 5414 ; WX 776 ; N uni1526 ; G 1989
1852
  U 5415 ; WX 776 ; N uni1527 ; G 1990
1853
  U 5416 ; WX 776 ; N uni1528 ; G 1991
1854
  U 5417 ; WX 776 ; N uni1529 ; G 1992
1855
- U 5418 ; WX 776 ; N uni152a ; G 1993
1856
- U 5419 ; WX 776 ; N uni152b ; G 1994
1857
- U 5420 ; WX 776 ; N uni152c ; G 1995
1858
- U 5421 ; WX 776 ; N uni152d ; G 1996
1859
- U 5422 ; WX 776 ; N uni152e ; G 1997
1860
- U 5423 ; WX 1003 ; N uni152f ; G 1998
1861
  U 5424 ; WX 1003 ; N uni1530 ; G 1999
1862
  U 5425 ; WX 1013 ; N uni1531 ; G 2000
1863
  U 5426 ; WX 996 ; N uni1532 ; G 2001
@@ -1868,11 +2029,11 @@ U 5430 ; WX 1003 ; N uni1536 ; G 2005
1868
  U 5431 ; WX 1003 ; N uni1537 ; G 2006
1869
  U 5432 ; WX 1003 ; N uni1538 ; G 2007
1870
  U 5433 ; WX 1013 ; N uni1539 ; G 2008
1871
- U 5434 ; WX 996 ; N uni153a ; G 2009
1872
- U 5435 ; WX 1013 ; N uni153b ; G 2010
1873
- U 5436 ; WX 996 ; N uni153c ; G 2011
1874
- U 5437 ; WX 1013 ; N uni153d ; G 2012
1875
- U 5438 ; WX 495 ; N uni153e ; G 2013
1876
  U 5440 ; WX 395 ; N uni1540 ; G 2014
1877
  U 5441 ; WX 510 ; N uni1541 ; G 2015
1878
  U 5442 ; WX 1033 ; N uni1542 ; G 2016
@@ -1883,12 +2044,12 @@ U 5446 ; WX 976 ; N uni1546 ; G 2020
1883
  U 5447 ; WX 976 ; N uni1547 ; G 2021
1884
  U 5448 ; WX 733 ; N uni1548 ; G 2022
1885
  U 5449 ; WX 733 ; N uni1549 ; G 2023
1886
- U 5450 ; WX 733 ; N uni154a ; G 2024
1887
- U 5451 ; WX 733 ; N uni154b ; G 2025
1888
- U 5452 ; WX 733 ; N uni154c ; G 2026
1889
- U 5453 ; WX 733 ; N uni154d ; G 2027
1890
- U 5454 ; WX 1003 ; N uni154e ; G 2028
1891
- U 5455 ; WX 959 ; N uni154f ; G 2029
1892
  U 5456 ; WX 495 ; N uni1550 ; G 2030
1893
  U 5458 ; WX 886 ; N uni1552 ; G 2031
1894
  U 5459 ; WX 774 ; N uni1553 ; G 2032
@@ -1898,12 +2059,12 @@ U 5462 ; WX 774 ; N uni1556 ; G 2035
1898
  U 5463 ; WX 928 ; N uni1557 ; G 2036
1899
  U 5464 ; WX 928 ; N uni1558 ; G 2037
1900
  U 5465 ; WX 928 ; N uni1559 ; G 2038
1901
- U 5466 ; WX 928 ; N uni155a ; G 2039
1902
- U 5467 ; WX 1172 ; N uni155b ; G 2040
1903
- U 5468 ; WX 1142 ; N uni155c ; G 2041
1904
- U 5469 ; WX 602 ; N uni155d ; G 2042
1905
- U 5470 ; WX 812 ; N uni155e ; G 2043
1906
- U 5471 ; WX 812 ; N uni155f ; G 2044
1907
  U 5472 ; WX 812 ; N uni1560 ; G 2045
1908
  U 5473 ; WX 812 ; N uni1561 ; G 2046
1909
  U 5474 ; WX 812 ; N uni1562 ; G 2047
@@ -1914,31 +2075,31 @@ U 5478 ; WX 815 ; N uni1566 ; G 2051
1914
  U 5479 ; WX 815 ; N uni1567 ; G 2052
1915
  U 5480 ; WX 1060 ; N uni1568 ; G 2053
1916
  U 5481 ; WX 1052 ; N uni1569 ; G 2054
1917
- U 5482 ; WX 548 ; N uni156a ; G 2055
1918
  U 5492 ; WX 977 ; N uni1574 ; G 2056
1919
  U 5493 ; WX 977 ; N uni1575 ; G 2057
1920
  U 5494 ; WX 977 ; N uni1576 ; G 2058
1921
  U 5495 ; WX 977 ; N uni1577 ; G 2059
1922
  U 5496 ; WX 977 ; N uni1578 ; G 2060
1923
  U 5497 ; WX 977 ; N uni1579 ; G 2061
1924
- U 5498 ; WX 977 ; N uni157a ; G 2062
1925
- U 5499 ; WX 618 ; N uni157b ; G 2063
1926
- U 5500 ; WX 837 ; N uni157c ; G 2064
1927
- U 5501 ; WX 510 ; N uni157d ; G 2065
1928
- U 5502 ; WX 1238 ; N uni157e ; G 2066
1929
- U 5503 ; WX 1238 ; N uni157f ; G 2067
1930
  U 5504 ; WX 1238 ; N uni1580 ; G 2068
1931
  U 5505 ; WX 1238 ; N uni1581 ; G 2069
1932
  U 5506 ; WX 1238 ; N uni1582 ; G 2070
1933
  U 5507 ; WX 1238 ; N uni1583 ; G 2071
1934
  U 5508 ; WX 1238 ; N uni1584 ; G 2072
1935
  U 5509 ; WX 989 ; N uni1585 ; G 2073
1936
- U 5514 ; WX 977 ; N uni158a ; G 2074
1937
- U 5515 ; WX 977 ; N uni158b ; G 2075
1938
- U 5516 ; WX 977 ; N uni158c ; G 2076
1939
- U 5517 ; WX 977 ; N uni158d ; G 2077
1940
- U 5518 ; WX 1591 ; N uni158e ; G 2078
1941
- U 5519 ; WX 1591 ; N uni158f ; G 2079
1942
  U 5520 ; WX 1591 ; N uni1590 ; G 2080
1943
  U 5521 ; WX 1295 ; N uni1591 ; G 2081
1944
  U 5522 ; WX 1295 ; N uni1592 ; G 2082
@@ -1946,28 +2107,28 @@ U 5523 ; WX 1591 ; N uni1593 ; G 2083
1946
  U 5524 ; WX 1591 ; N uni1594 ; G 2084
1947
  U 5525 ; WX 848 ; N uni1595 ; G 2085
1948
  U 5526 ; WX 1273 ; N uni1596 ; G 2086
1949
- U 5536 ; WX 988 ; N uni15a0 ; G 2087
1950
- U 5537 ; WX 988 ; N uni15a1 ; G 2088
1951
- U 5538 ; WX 931 ; N uni15a2 ; G 2089
1952
- U 5539 ; WX 931 ; N uni15a3 ; G 2090
1953
- U 5540 ; WX 931 ; N uni15a4 ; G 2091
1954
- U 5541 ; WX 931 ; N uni15a5 ; G 2092
1955
- U 5542 ; WX 660 ; N uni15a6 ; G 2093
1956
- U 5543 ; WX 776 ; N uni15a7 ; G 2094
1957
- U 5544 ; WX 776 ; N uni15a8 ; G 2095
1958
- U 5545 ; WX 776 ; N uni15a9 ; G 2096
1959
- U 5546 ; WX 776 ; N uni15aa ; G 2097
1960
- U 5547 ; WX 776 ; N uni15ab ; G 2098
1961
- U 5548 ; WX 776 ; N uni15ac ; G 2099
1962
- U 5549 ; WX 776 ; N uni15ad ; G 2100
1963
- U 5550 ; WX 495 ; N uni15ae ; G 2101
1964
- U 5551 ; WX 743 ; N uni15af ; G 2102
1965
- U 5598 ; WX 830 ; N uni15de ; G 2103
1966
- U 5601 ; WX 830 ; N uni15e1 ; G 2104
1967
  U 5702 ; WX 496 ; N uni1646 ; G 2105
1968
  U 5703 ; WX 496 ; N uni1647 ; G 2106
1969
- U 5742 ; WX 413 ; N uni166e ; G 2107
1970
- U 5743 ; WX 1238 ; N uni166f ; G 2108
1971
  U 5744 ; WX 1591 ; N uni1670 ; G 2109
1972
  U 5745 ; WX 2016 ; N uni1671 ; G 2110
1973
  U 5746 ; WX 2016 ; N uni1672 ; G 2111
@@ -1985,12 +2146,12 @@ U 5766 ; WX 627 ; N uni1686 ; G 2122
1985
  U 5767 ; WX 936 ; N uni1687 ; G 2123
1986
  U 5768 ; WX 1254 ; N uni1688 ; G 2124
1987
  U 5769 ; WX 1559 ; N uni1689 ; G 2125
1988
- U 5770 ; WX 1871 ; N uni168a ; G 2126
1989
- U 5771 ; WX 569 ; N uni168b ; G 2127
1990
- U 5772 ; WX 877 ; N uni168c ; G 2128
1991
- U 5773 ; WX 1187 ; N uni168d ; G 2129
1992
- U 5774 ; WX 1497 ; N uni168e ; G 2130
1993
- U 5775 ; WX 1807 ; N uni168f ; G 2131
1994
  U 5776 ; WX 637 ; N uni1690 ; G 2132
1995
  U 5777 ; WX 945 ; N uni1691 ; G 2133
1996
  U 5778 ; WX 1240 ; N uni1692 ; G 2134
@@ -2001,638 +2162,644 @@ U 5782 ; WX 569 ; N uni1696 ; G 2138
2001
  U 5783 ; WX 789 ; N uni1697 ; G 2139
2002
  U 5784 ; WX 1234 ; N uni1698 ; G 2140
2003
  U 5785 ; WX 1559 ; N uni1699 ; G 2141
2004
- U 5786 ; WX 740 ; N uni169a ; G 2142
2005
- U 5787 ; WX 638 ; N uni169b ; G 2143
2006
- U 5788 ; WX 638 ; N uni169c ; G 2144
2007
- U 7424 ; WX 652 ; N uni1d00 ; G 2145
2008
- U 7425 ; WX 833 ; N uni1d01 ; G 2146
2009
- U 7426 ; WX 1048 ; N uni1d02 ; G 2147
2010
- U 7427 ; WX 608 ; N uni1d03 ; G 2148
2011
- U 7428 ; WX 593 ; N uni1d04 ; G 2149
2012
- U 7429 ; WX 676 ; N uni1d05 ; G 2150
2013
- U 7430 ; WX 676 ; N uni1d06 ; G 2151
2014
- U 7431 ; WX 559 ; N uni1d07 ; G 2152
2015
- U 7432 ; WX 557 ; N uni1d08 ; G 2153
2016
- U 7433 ; WX 343 ; N uni1d09 ; G 2154
2017
- U 7434 ; WX 494 ; N uni1d0a ; G 2155
2018
- U 7435 ; WX 665 ; N uni1d0b ; G 2156
2019
- U 7436 ; WX 539 ; N uni1d0c ; G 2157
2020
- U 7437 ; WX 817 ; N uni1d0d ; G 2158
2021
- U 7438 ; WX 701 ; N uni1d0e ; G 2159
2022
- U 7439 ; WX 687 ; N uni1d0f ; G 2160
2023
- U 7440 ; WX 593 ; N uni1d10 ; G 2161
2024
- U 7441 ; WX 660 ; N uni1d11 ; G 2162
2025
- U 7442 ; WX 660 ; N uni1d12 ; G 2163
2026
- U 7443 ; WX 660 ; N uni1d13 ; G 2164
2027
- U 7444 ; WX 1094 ; N uni1d14 ; G 2165
2028
- U 7446 ; WX 687 ; N uni1d16 ; G 2166
2029
- U 7447 ; WX 687 ; N uni1d17 ; G 2167
2030
- U 7448 ; WX 556 ; N uni1d18 ; G 2168
2031
- U 7449 ; WX 642 ; N uni1d19 ; G 2169
2032
- U 7450 ; WX 642 ; N uni1d1a ; G 2170
2033
- U 7451 ; WX 580 ; N uni1d1b ; G 2171
2034
- U 7452 ; WX 634 ; N uni1d1c ; G 2172
2035
- U 7453 ; WX 737 ; N uni1d1d ; G 2173
2036
- U 7454 ; WX 948 ; N uni1d1e ; G 2174
2037
- U 7455 ; WX 695 ; N uni1d1f ; G 2175
2038
- U 7456 ; WX 652 ; N uni1d20 ; G 2176
2039
- U 7457 ; WX 924 ; N uni1d21 ; G 2177
2040
- U 7458 ; WX 582 ; N uni1d22 ; G 2178
2041
- U 7459 ; WX 646 ; N uni1d23 ; G 2179
2042
- U 7462 ; WX 539 ; N uni1d26 ; G 2180
2043
- U 7463 ; WX 652 ; N uni1d27 ; G 2181
2044
- U 7464 ; WX 691 ; N uni1d28 ; G 2182
2045
- U 7465 ; WX 556 ; N uni1d29 ; G 2183
2046
- U 7466 ; WX 781 ; N uni1d2a ; G 2184
2047
- U 7467 ; WX 732 ; N uni1d2b ; G 2185
2048
- U 7468 ; WX 487 ; N uni1d2c ; G 2186
2049
- U 7469 ; WX 683 ; N uni1d2d ; G 2187
2050
- U 7470 ; WX 480 ; N uni1d2e ; G 2188
2051
- U 7472 ; WX 523 ; N uni1d30 ; G 2189
2052
- U 7473 ; WX 430 ; N uni1d31 ; G 2190
2053
- U 7474 ; WX 430 ; N uni1d32 ; G 2191
2054
- U 7475 ; WX 517 ; N uni1d33 ; G 2192
2055
- U 7476 ; WX 527 ; N uni1d34 ; G 2193
2056
- U 7477 ; WX 234 ; N uni1d35 ; G 2194
2057
- U 7478 ; WX 234 ; N uni1d36 ; G 2195
2058
- U 7479 ; WX 488 ; N uni1d37 ; G 2196
2059
- U 7480 ; WX 401 ; N uni1d38 ; G 2197
2060
- U 7481 ; WX 626 ; N uni1d39 ; G 2198
2061
- U 7482 ; WX 527 ; N uni1d3a ; G 2199
2062
- U 7483 ; WX 527 ; N uni1d3b ; G 2200
2063
- U 7484 ; WX 535 ; N uni1d3c ; G 2201
2064
- U 7485 ; WX 509 ; N uni1d3d ; G 2202
2065
- U 7486 ; WX 461 ; N uni1d3e ; G 2203
2066
- U 7487 ; WX 485 ; N uni1d3f ; G 2204
2067
- U 7488 ; WX 430 ; N uni1d40 ; G 2205
2068
- U 7489 ; WX 511 ; N uni1d41 ; G 2206
2069
- U 7490 ; WX 695 ; N uni1d42 ; G 2207
2070
- U 7491 ; WX 458 ; N uni1d43 ; G 2208
2071
- U 7492 ; WX 458 ; N uni1d44 ; G 2209
2072
- U 7493 ; WX 479 ; N uni1d45 ; G 2210
2073
- U 7494 ; WX 712 ; N uni1d46 ; G 2211
2074
- U 7495 ; WX 479 ; N uni1d47 ; G 2212
2075
- U 7496 ; WX 479 ; N uni1d48 ; G 2213
2076
- U 7497 ; WX 479 ; N uni1d49 ; G 2214
2077
- U 7498 ; WX 479 ; N uni1d4a ; G 2215
2078
- U 7499 ; WX 386 ; N uni1d4b ; G 2216
2079
- U 7500 ; WX 386 ; N uni1d4c ; G 2217
2080
- U 7501 ; WX 479 ; N uni1d4d ; G 2218
2081
- U 7502 ; WX 219 ; N uni1d4e ; G 2219
2082
- U 7503 ; WX 487 ; N uni1d4f ; G 2220
2083
- U 7504 ; WX 664 ; N uni1d50 ; G 2221
2084
- U 7505 ; WX 456 ; N uni1d51 ; G 2222
2085
- U 7506 ; WX 488 ; N uni1d52 ; G 2223
2086
- U 7507 ; WX 414 ; N uni1d53 ; G 2224
2087
- U 7508 ; WX 488 ; N uni1d54 ; G 2225
2088
- U 7509 ; WX 488 ; N uni1d55 ; G 2226
2089
- U 7510 ; WX 479 ; N uni1d56 ; G 2227
2090
- U 7511 ; WX 388 ; N uni1d57 ; G 2228
2091
- U 7512 ; WX 456 ; N uni1d58 ; G 2229
2092
- U 7513 ; WX 462 ; N uni1d59 ; G 2230
2093
- U 7514 ; WX 664 ; N uni1d5a ; G 2231
2094
- U 7515 ; WX 501 ; N uni1d5b ; G 2232
2095
- U 7517 ; WX 451 ; N uni1d5d ; G 2233
2096
- U 7518 ; WX 429 ; N uni1d5e ; G 2234
2097
- U 7519 ; WX 433 ; N uni1d5f ; G 2235
2098
- U 7520 ; WX 493 ; N uni1d60 ; G 2236
2099
- U 7521 ; WX 406 ; N uni1d61 ; G 2237
2100
- U 7522 ; WX 219 ; N uni1d62 ; G 2238
2101
- U 7523 ; WX 315 ; N uni1d63 ; G 2239
2102
- U 7524 ; WX 456 ; N uni1d64 ; G 2240
2103
- U 7525 ; WX 501 ; N uni1d65 ; G 2241
2104
- U 7526 ; WX 451 ; N uni1d66 ; G 2242
2105
- U 7527 ; WX 429 ; N uni1d67 ; G 2243
2106
- U 7528 ; WX 451 ; N uni1d68 ; G 2244
2107
- U 7529 ; WX 493 ; N uni1d69 ; G 2245
2108
- U 7530 ; WX 406 ; N uni1d6a ; G 2246
2109
- U 7543 ; WX 716 ; N uni1d77 ; G 2247
2110
- U 7544 ; WX 527 ; N uni1d78 ; G 2248
2111
- U 7547 ; WX 545 ; N uni1d7b ; G 2249
2112
- U 7549 ; WX 747 ; N uni1d7d ; G 2250
2113
- U 7557 ; WX 514 ; N uni1d85 ; G 2251
2114
- U 7579 ; WX 479 ; N uni1d9b ; G 2252
2115
- U 7580 ; WX 414 ; N uni1d9c ; G 2253
2116
- U 7581 ; WX 414 ; N uni1d9d ; G 2254
2117
- U 7582 ; WX 488 ; N uni1d9e ; G 2255
2118
- U 7583 ; WX 386 ; N uni1d9f ; G 2256
2119
- U 7584 ; WX 377 ; N uni1da0 ; G 2257
2120
- U 7585 ; WX 348 ; N uni1da1 ; G 2258
2121
- U 7586 ; WX 479 ; N uni1da2 ; G 2259
2122
- U 7587 ; WX 456 ; N uni1da3 ; G 2260
2123
- U 7588 ; WX 347 ; N uni1da4 ; G 2261
2124
- U 7589 ; WX 281 ; N uni1da5 ; G 2262
2125
- U 7590 ; WX 347 ; N uni1da6 ; G 2263
2126
- U 7591 ; WX 347 ; N uni1da7 ; G 2264
2127
- U 7592 ; WX 431 ; N uni1da8 ; G 2265
2128
- U 7593 ; WX 326 ; N uni1da9 ; G 2266
2129
- U 7594 ; WX 330 ; N uni1daa ; G 2267
2130
- U 7595 ; WX 370 ; N uni1dab ; G 2268
2131
- U 7596 ; WX 664 ; N uni1dac ; G 2269
2132
- U 7597 ; WX 664 ; N uni1dad ; G 2270
2133
- U 7598 ; WX 562 ; N uni1dae ; G 2271
2134
- U 7599 ; WX 562 ; N uni1daf ; G 2272
2135
- U 7600 ; WX 448 ; N uni1db0 ; G 2273
2136
- U 7601 ; WX 488 ; N uni1db1 ; G 2274
2137
- U 7602 ; WX 542 ; N uni1db2 ; G 2275
2138
- U 7603 ; WX 422 ; N uni1db3 ; G 2276
2139
- U 7604 ; WX 396 ; N uni1db4 ; G 2277
2140
- U 7605 ; WX 388 ; N uni1db5 ; G 2278
2141
- U 7606 ; WX 583 ; N uni1db6 ; G 2279
2142
- U 7607 ; WX 494 ; N uni1db7 ; G 2280
2143
- U 7608 ; WX 399 ; N uni1db8 ; G 2281
2144
- U 7609 ; WX 451 ; N uni1db9 ; G 2282
2145
- U 7610 ; WX 501 ; N uni1dba ; G 2283
2146
- U 7611 ; WX 417 ; N uni1dbb ; G 2284
2147
- U 7612 ; WX 523 ; N uni1dbc ; G 2285
2148
- U 7613 ; WX 470 ; N uni1dbd ; G 2286
2149
- U 7614 ; WX 455 ; N uni1dbe ; G 2287
2150
- U 7615 ; WX 425 ; N uni1dbf ; G 2288
2151
- U 7680 ; WX 774 ; N uni1e00 ; G 2295
2152
- U 7681 ; WX 675 ; N uni1e01 ; G 2296
2153
- U 7682 ; WX 762 ; N uni1e02 ; G 2297
2154
- U 7683 ; WX 716 ; N uni1e03 ; G 2298
2155
- U 7684 ; WX 762 ; N uni1e04 ; G 2299
2156
- U 7685 ; WX 716 ; N uni1e05 ; G 2300
2157
- U 7686 ; WX 762 ; N uni1e06 ; G 2301
2158
- U 7687 ; WX 716 ; N uni1e07 ; G 2302
2159
- U 7688 ; WX 734 ; N uni1e08 ; G 2303
2160
- U 7689 ; WX 593 ; N uni1e09 ; G 2304
2161
- U 7690 ; WX 830 ; N uni1e0a ; G 2305
2162
- U 7691 ; WX 716 ; N uni1e0b ; G 2306
2163
- U 7692 ; WX 830 ; N uni1e0c ; G 2307
2164
- U 7693 ; WX 716 ; N uni1e0d ; G 2308
2165
- U 7694 ; WX 830 ; N uni1e0e ; G 2309
2166
- U 7695 ; WX 716 ; N uni1e0f ; G 2310
2167
- U 7696 ; WX 830 ; N uni1e10 ; G 2311
2168
- U 7697 ; WX 716 ; N uni1e11 ; G 2312
2169
- U 7698 ; WX 830 ; N uni1e12 ; G 2313
2170
- U 7699 ; WX 716 ; N uni1e13 ; G 2314
2171
- U 7700 ; WX 683 ; N uni1e14 ; G 2315
2172
- U 7701 ; WX 678 ; N uni1e15 ; G 2316
2173
- U 7702 ; WX 683 ; N uni1e16 ; G 2317
2174
- U 7703 ; WX 678 ; N uni1e17 ; G 2318
2175
- U 7704 ; WX 683 ; N uni1e18 ; G 2319
2176
- U 7705 ; WX 678 ; N uni1e19 ; G 2320
2177
- U 7706 ; WX 683 ; N uni1e1a ; G 2321
2178
- U 7707 ; WX 678 ; N uni1e1b ; G 2322
2179
- U 7708 ; WX 683 ; N uni1e1c ; G 2323
2180
- U 7709 ; WX 678 ; N uni1e1d ; G 2324
2181
- U 7710 ; WX 683 ; N uni1e1e ; G 2325
2182
- U 7711 ; WX 435 ; N uni1e1f ; G 2326
2183
- U 7712 ; WX 821 ; N uni1e20 ; G 2327
2184
- U 7713 ; WX 716 ; N uni1e21 ; G 2328
2185
- U 7714 ; WX 837 ; N uni1e22 ; G 2329
2186
- U 7715 ; WX 712 ; N uni1e23 ; G 2330
2187
- U 7716 ; WX 837 ; N uni1e24 ; G 2331
2188
- U 7717 ; WX 712 ; N uni1e25 ; G 2332
2189
- U 7718 ; WX 837 ; N uni1e26 ; G 2333
2190
- U 7719 ; WX 712 ; N uni1e27 ; G 2334
2191
- U 7720 ; WX 837 ; N uni1e28 ; G 2335
2192
- U 7721 ; WX 712 ; N uni1e29 ; G 2336
2193
- U 7722 ; WX 837 ; N uni1e2a ; G 2337
2194
- U 7723 ; WX 712 ; N uni1e2b ; G 2338
2195
- U 7724 ; WX 372 ; N uni1e2c ; G 2339
2196
- U 7725 ; WX 343 ; N uni1e2d ; G 2340
2197
- U 7726 ; WX 372 ; N uni1e2e ; G 2341
2198
- U 7727 ; WX 343 ; N uni1e2f ; G 2342
2199
- U 7728 ; WX 775 ; N uni1e30 ; G 2343
2200
- U 7729 ; WX 665 ; N uni1e31 ; G 2344
2201
- U 7730 ; WX 775 ; N uni1e32 ; G 2345
2202
- U 7731 ; WX 665 ; N uni1e33 ; G 2346
2203
- U 7732 ; WX 775 ; N uni1e34 ; G 2347
2204
- U 7733 ; WX 665 ; N uni1e35 ; G 2348
2205
- U 7734 ; WX 637 ; N uni1e36 ; G 2349
2206
- U 7735 ; WX 343 ; N uni1e37 ; G 2350
2207
- U 7736 ; WX 637 ; N uni1e38 ; G 2351
2208
- U 7737 ; WX 343 ; N uni1e39 ; G 2352
2209
- U 7738 ; WX 637 ; N uni1e3a ; G 2353
2210
- U 7739 ; WX 343 ; N uni1e3b ; G 2354
2211
- U 7740 ; WX 637 ; N uni1e3c ; G 2355
2212
- U 7741 ; WX 343 ; N uni1e3d ; G 2356
2213
- U 7742 ; WX 995 ; N uni1e3e ; G 2357
2214
- U 7743 ; WX 1042 ; N uni1e3f ; G 2358
2215
- U 7744 ; WX 995 ; N uni1e40 ; G 2359
2216
- U 7745 ; WX 1042 ; N uni1e41 ; G 2360
2217
- U 7746 ; WX 995 ; N uni1e42 ; G 2361
2218
- U 7747 ; WX 1042 ; N uni1e43 ; G 2362
2219
- U 7748 ; WX 837 ; N uni1e44 ; G 2363
2220
- U 7749 ; WX 712 ; N uni1e45 ; G 2364
2221
- U 7750 ; WX 837 ; N uni1e46 ; G 2365
2222
- U 7751 ; WX 712 ; N uni1e47 ; G 2366
2223
- U 7752 ; WX 837 ; N uni1e48 ; G 2367
2224
- U 7753 ; WX 712 ; N uni1e49 ; G 2368
2225
- U 7754 ; WX 837 ; N uni1e4a ; G 2369
2226
- U 7755 ; WX 712 ; N uni1e4b ; G 2370
2227
- U 7756 ; WX 850 ; N uni1e4c ; G 2371
2228
- U 7757 ; WX 687 ; N uni1e4d ; G 2372
2229
- U 7758 ; WX 850 ; N uni1e4e ; G 2373
2230
- U 7759 ; WX 687 ; N uni1e4f ; G 2374
2231
- U 7760 ; WX 850 ; N uni1e50 ; G 2375
2232
- U 7761 ; WX 687 ; N uni1e51 ; G 2376
2233
- U 7762 ; WX 850 ; N uni1e52 ; G 2377
2234
- U 7763 ; WX 687 ; N uni1e53 ; G 2378
2235
- U 7764 ; WX 733 ; N uni1e54 ; G 2379
2236
- U 7765 ; WX 716 ; N uni1e55 ; G 2380
2237
- U 7766 ; WX 733 ; N uni1e56 ; G 2381
2238
- U 7767 ; WX 716 ; N uni1e57 ; G 2382
2239
- U 7768 ; WX 770 ; N uni1e58 ; G 2383
2240
- U 7769 ; WX 493 ; N uni1e59 ; G 2384
2241
- U 7770 ; WX 770 ; N uni1e5a ; G 2385
2242
- U 7771 ; WX 493 ; N uni1e5b ; G 2386
2243
- U 7772 ; WX 770 ; N uni1e5c ; G 2387
2244
- U 7773 ; WX 493 ; N uni1e5d ; G 2388
2245
- U 7774 ; WX 770 ; N uni1e5e ; G 2389
2246
- U 7775 ; WX 493 ; N uni1e5f ; G 2390
2247
- U 7776 ; WX 720 ; N uni1e60 ; G 2391
2248
- U 7777 ; WX 595 ; N uni1e61 ; G 2392
2249
- U 7778 ; WX 720 ; N uni1e62 ; G 2393
2250
- U 7779 ; WX 595 ; N uni1e63 ; G 2394
2251
- U 7780 ; WX 720 ; N uni1e64 ; G 2395
2252
- U 7781 ; WX 595 ; N uni1e65 ; G 2396
2253
- U 7782 ; WX 720 ; N uni1e66 ; G 2397
2254
- U 7783 ; WX 595 ; N uni1e67 ; G 2398
2255
- U 7784 ; WX 720 ; N uni1e68 ; G 2399
2256
- U 7785 ; WX 595 ; N uni1e69 ; G 2400
2257
- U 7786 ; WX 682 ; N uni1e6a ; G 2401
2258
- U 7787 ; WX 478 ; N uni1e6b ; G 2402
2259
- U 7788 ; WX 682 ; N uni1e6c ; G 2403
2260
- U 7789 ; WX 478 ; N uni1e6d ; G 2404
2261
- U 7790 ; WX 682 ; N uni1e6e ; G 2405
2262
- U 7791 ; WX 478 ; N uni1e6f ; G 2406
2263
- U 7792 ; WX 682 ; N uni1e70 ; G 2407
2264
- U 7793 ; WX 478 ; N uni1e71 ; G 2408
2265
- U 7794 ; WX 812 ; N uni1e72 ; G 2409
2266
- U 7795 ; WX 712 ; N uni1e73 ; G 2410
2267
- U 7796 ; WX 812 ; N uni1e74 ; G 2411
2268
- U 7797 ; WX 712 ; N uni1e75 ; G 2412
2269
- U 7798 ; WX 812 ; N uni1e76 ; G 2413
2270
- U 7799 ; WX 712 ; N uni1e77 ; G 2414
2271
- U 7800 ; WX 812 ; N uni1e78 ; G 2415
2272
- U 7801 ; WX 712 ; N uni1e79 ; G 2416
2273
- U 7802 ; WX 812 ; N uni1e7a ; G 2417
2274
- U 7803 ; WX 712 ; N uni1e7b ; G 2418
2275
- U 7804 ; WX 774 ; N uni1e7c ; G 2419
2276
- U 7805 ; WX 652 ; N uni1e7d ; G 2420
2277
- U 7806 ; WX 774 ; N uni1e7e ; G 2421
2278
- U 7807 ; WX 652 ; N uni1e7f ; G 2422
2279
- U 7808 ; WX 1103 ; N uni1e80 ; G 2423
2280
- U 7809 ; WX 924 ; N uni1e81 ; G 2424
2281
- U 7810 ; WX 1103 ; N uni1e82 ; G 2425
2282
- U 7811 ; WX 924 ; N uni1e83 ; G 2426
2283
- U 7812 ; WX 1103 ; N uni1e84 ; G 2427
2284
- U 7813 ; WX 924 ; N uni1e85 ; G 2428
2285
- U 7814 ; WX 1103 ; N uni1e86 ; G 2429
2286
- U 7815 ; WX 924 ; N uni1e87 ; G 2430
2287
- U 7816 ; WX 1103 ; N uni1e88 ; G 2431
2288
- U 7817 ; WX 924 ; N uni1e89 ; G 2432
2289
- U 7818 ; WX 771 ; N uni1e8a ; G 2433
2290
- U 7819 ; WX 645 ; N uni1e8b ; G 2434
2291
- U 7820 ; WX 771 ; N uni1e8c ; G 2435
2292
- U 7821 ; WX 645 ; N uni1e8d ; G 2436
2293
- U 7822 ; WX 724 ; N uni1e8e ; G 2437
2294
- U 7823 ; WX 652 ; N uni1e8f ; G 2438
2295
- U 7824 ; WX 725 ; N uni1e90 ; G 2439
2296
- U 7825 ; WX 582 ; N uni1e91 ; G 2440
2297
- U 7826 ; WX 725 ; N uni1e92 ; G 2441
2298
- U 7827 ; WX 582 ; N uni1e93 ; G 2442
2299
- U 7828 ; WX 725 ; N uni1e94 ; G 2443
2300
- U 7829 ; WX 582 ; N uni1e95 ; G 2444
2301
- U 7830 ; WX 712 ; N uni1e96 ; G 2445
2302
- U 7831 ; WX 478 ; N uni1e97 ; G 2446
2303
- U 7832 ; WX 924 ; N uni1e98 ; G 2447
2304
- U 7833 ; WX 652 ; N uni1e99 ; G 2448
2305
- U 7834 ; WX 675 ; N uni1e9a ; G 2449
2306
- U 7835 ; WX 435 ; N uni1e9b ; G 2450
2307
- U 7836 ; WX 435 ; N uni1e9c ; G 2451
2308
- U 7837 ; WX 435 ; N uni1e9d ; G 2452
2309
- U 7838 ; WX 896 ; N uni1e9e ; G 2453
2310
- U 7839 ; WX 687 ; N uni1e9f ; G 2454
2311
- U 7840 ; WX 774 ; N uni1ea0 ; G 2455
2312
- U 7841 ; WX 675 ; N uni1ea1 ; G 2456
2313
- U 7842 ; WX 774 ; N uni1ea2 ; G 2457
2314
- U 7843 ; WX 675 ; N uni1ea3 ; G 2458
2315
- U 7844 ; WX 774 ; N uni1ea4 ; G 2459
2316
- U 7845 ; WX 675 ; N uni1ea5 ; G 2460
2317
- U 7846 ; WX 774 ; N uni1ea6 ; G 2461
2318
- U 7847 ; WX 675 ; N uni1ea7 ; G 2462
2319
- U 7848 ; WX 774 ; N uni1ea8 ; G 2463
2320
- U 7849 ; WX 675 ; N uni1ea9 ; G 2464
2321
- U 7850 ; WX 774 ; N uni1eaa ; G 2465
2322
- U 7851 ; WX 675 ; N uni1eab ; G 2466
2323
- U 7852 ; WX 774 ; N uni1eac ; G 2467
2324
- U 7853 ; WX 675 ; N uni1ead ; G 2468
2325
- U 7854 ; WX 774 ; N uni1eae ; G 2469
2326
- U 7855 ; WX 675 ; N uni1eaf ; G 2470
2327
- U 7856 ; WX 774 ; N uni1eb0 ; G 2471
2328
- U 7857 ; WX 675 ; N uni1eb1 ; G 2472
2329
- U 7858 ; WX 774 ; N uni1eb2 ; G 2473
2330
- U 7859 ; WX 675 ; N uni1eb3 ; G 2474
2331
- U 7860 ; WX 774 ; N uni1eb4 ; G 2475
2332
- U 7861 ; WX 675 ; N uni1eb5 ; G 2476
2333
- U 7862 ; WX 774 ; N uni1eb6 ; G 2477
2334
- U 7863 ; WX 675 ; N uni1eb7 ; G 2478
2335
- U 7864 ; WX 683 ; N uni1eb8 ; G 2479
2336
- U 7865 ; WX 678 ; N uni1eb9 ; G 2480
2337
- U 7866 ; WX 683 ; N uni1eba ; G 2481
2338
- U 7867 ; WX 678 ; N uni1ebb ; G 2482
2339
- U 7868 ; WX 683 ; N uni1ebc ; G 2483
2340
- U 7869 ; WX 678 ; N uni1ebd ; G 2484
2341
- U 7870 ; WX 683 ; N uni1ebe ; G 2485
2342
- U 7871 ; WX 678 ; N uni1ebf ; G 2486
2343
- U 7872 ; WX 683 ; N uni1ec0 ; G 2487
2344
- U 7873 ; WX 678 ; N uni1ec1 ; G 2488
2345
- U 7874 ; WX 683 ; N uni1ec2 ; G 2489
2346
- U 7875 ; WX 678 ; N uni1ec3 ; G 2490
2347
- U 7876 ; WX 683 ; N uni1ec4 ; G 2491
2348
- U 7877 ; WX 678 ; N uni1ec5 ; G 2492
2349
- U 7878 ; WX 683 ; N uni1ec6 ; G 2493
2350
- U 7879 ; WX 678 ; N uni1ec7 ; G 2494
2351
- U 7880 ; WX 372 ; N uni1ec8 ; G 2495
2352
- U 7881 ; WX 343 ; N uni1ec9 ; G 2496
2353
- U 7882 ; WX 372 ; N uni1eca ; G 2497
2354
- U 7883 ; WX 343 ; N uni1ecb ; G 2498
2355
- U 7884 ; WX 850 ; N uni1ecc ; G 2499
2356
- U 7885 ; WX 687 ; N uni1ecd ; G 2500
2357
- U 7886 ; WX 850 ; N uni1ece ; G 2501
2358
- U 7887 ; WX 687 ; N uni1ecf ; G 2502
2359
- U 7888 ; WX 850 ; N uni1ed0 ; G 2503
2360
- U 7889 ; WX 687 ; N uni1ed1 ; G 2504
2361
- U 7890 ; WX 850 ; N uni1ed2 ; G 2505
2362
- U 7891 ; WX 687 ; N uni1ed3 ; G 2506
2363
- U 7892 ; WX 850 ; N uni1ed4 ; G 2507
2364
- U 7893 ; WX 687 ; N uni1ed5 ; G 2508
2365
- U 7894 ; WX 850 ; N uni1ed6 ; G 2509
2366
- U 7895 ; WX 687 ; N uni1ed7 ; G 2510
2367
- U 7896 ; WX 850 ; N uni1ed8 ; G 2511
2368
- U 7897 ; WX 687 ; N uni1ed9 ; G 2512
2369
- U 7898 ; WX 874 ; N uni1eda ; G 2513
2370
- U 7899 ; WX 687 ; N uni1edb ; G 2514
2371
- U 7900 ; WX 874 ; N uni1edc ; G 2515
2372
- U 7901 ; WX 687 ; N uni1edd ; G 2516
2373
- U 7902 ; WX 874 ; N uni1ede ; G 2517
2374
- U 7903 ; WX 687 ; N uni1edf ; G 2518
2375
- U 7904 ; WX 874 ; N uni1ee0 ; G 2519
2376
- U 7905 ; WX 687 ; N uni1ee1 ; G 2520
2377
- U 7906 ; WX 874 ; N uni1ee2 ; G 2521
2378
- U 7907 ; WX 687 ; N uni1ee3 ; G 2522
2379
- U 7908 ; WX 812 ; N uni1ee4 ; G 2523
2380
- U 7909 ; WX 712 ; N uni1ee5 ; G 2524
2381
- U 7910 ; WX 812 ; N uni1ee6 ; G 2525
2382
- U 7911 ; WX 712 ; N uni1ee7 ; G 2526
2383
- U 7912 ; WX 835 ; N uni1ee8 ; G 2527
2384
- U 7913 ; WX 712 ; N uni1ee9 ; G 2528
2385
- U 7914 ; WX 835 ; N uni1eea ; G 2529
2386
- U 7915 ; WX 712 ; N uni1eeb ; G 2530
2387
- U 7916 ; WX 835 ; N uni1eec ; G 2531
2388
- U 7917 ; WX 712 ; N uni1eed ; G 2532
2389
- U 7918 ; WX 835 ; N uni1eee ; G 2533
2390
- U 7919 ; WX 712 ; N uni1eef ; G 2534
2391
- U 7920 ; WX 835 ; N uni1ef0 ; G 2535
2392
- U 7921 ; WX 712 ; N uni1ef1 ; G 2536
2393
- U 7922 ; WX 724 ; N uni1ef2 ; G 2537
2394
- U 7923 ; WX 652 ; N uni1ef3 ; G 2538
2395
- U 7924 ; WX 724 ; N uni1ef4 ; G 2539
2396
- U 7925 ; WX 652 ; N uni1ef5 ; G 2540
2397
- U 7926 ; WX 724 ; N uni1ef6 ; G 2541
2398
- U 7927 ; WX 652 ; N uni1ef7 ; G 2542
2399
- U 7928 ; WX 724 ; N uni1ef8 ; G 2543
2400
- U 7929 ; WX 652 ; N uni1ef9 ; G 2544
2401
- U 7930 ; WX 953 ; N uni1efa ; G 2545
2402
- U 7931 ; WX 644 ; N uni1efb ; G 2546
2403
- U 7936 ; WX 687 ; N uni1f00 ; G 2547
2404
- U 7937 ; WX 687 ; N uni1f01 ; G 2548
2405
- U 7938 ; WX 687 ; N uni1f02 ; G 2549
2406
- U 7939 ; WX 687 ; N uni1f03 ; G 2550
2407
- U 7940 ; WX 687 ; N uni1f04 ; G 2551
2408
- U 7941 ; WX 687 ; N uni1f05 ; G 2552
2409
- U 7942 ; WX 687 ; N uni1f06 ; G 2553
2410
- U 7943 ; WX 687 ; N uni1f07 ; G 2554
2411
- U 7944 ; WX 774 ; N uni1f08 ; G 2555
2412
- U 7945 ; WX 774 ; N uni1f09 ; G 2556
2413
- U 7946 ; WX 1041 ; N uni1f0a ; G 2557
2414
- U 7947 ; WX 1043 ; N uni1f0b ; G 2558
2415
- U 7948 ; WX 935 ; N uni1f0c ; G 2559
2416
- U 7949 ; WX 963 ; N uni1f0d ; G 2560
2417
- U 7950 ; WX 835 ; N uni1f0e ; G 2561
2418
- U 7951 ; WX 859 ; N uni1f0f ; G 2562
2419
- U 7952 ; WX 557 ; N uni1f10 ; G 2563
2420
- U 7953 ; WX 557 ; N uni1f11 ; G 2564
2421
- U 7954 ; WX 557 ; N uni1f12 ; G 2565
2422
- U 7955 ; WX 557 ; N uni1f13 ; G 2566
2423
- U 7956 ; WX 557 ; N uni1f14 ; G 2567
2424
- U 7957 ; WX 557 ; N uni1f15 ; G 2568
2425
- U 7960 ; WX 792 ; N uni1f18 ; G 2569
2426
- U 7961 ; WX 794 ; N uni1f19 ; G 2570
2427
- U 7962 ; WX 1100 ; N uni1f1a ; G 2571
2428
- U 7963 ; WX 1096 ; N uni1f1b ; G 2572
2429
- U 7964 ; WX 1023 ; N uni1f1c ; G 2573
2430
- U 7965 ; WX 1052 ; N uni1f1d ; G 2574
2431
- U 7968 ; WX 712 ; N uni1f20 ; G 2575
2432
- U 7969 ; WX 712 ; N uni1f21 ; G 2576
2433
- U 7970 ; WX 712 ; N uni1f22 ; G 2577
2434
- U 7971 ; WX 712 ; N uni1f23 ; G 2578
2435
- U 7972 ; WX 712 ; N uni1f24 ; G 2579
2436
- U 7973 ; WX 712 ; N uni1f25 ; G 2580
2437
- U 7974 ; WX 712 ; N uni1f26 ; G 2581
2438
- U 7975 ; WX 712 ; N uni1f27 ; G 2582
2439
- U 7976 ; WX 945 ; N uni1f28 ; G 2583
2440
- U 7977 ; WX 951 ; N uni1f29 ; G 2584
2441
- U 7978 ; WX 1250 ; N uni1f2a ; G 2585
2442
- U 7979 ; WX 1250 ; N uni1f2b ; G 2586
2443
- U 7980 ; WX 1180 ; N uni1f2c ; G 2587
2444
- U 7981 ; WX 1206 ; N uni1f2d ; G 2588
2445
- U 7982 ; WX 1054 ; N uni1f2e ; G 2589
2446
- U 7983 ; WX 1063 ; N uni1f2f ; G 2590
2447
- U 7984 ; WX 390 ; N uni1f30 ; G 2591
2448
- U 7985 ; WX 390 ; N uni1f31 ; G 2592
2449
- U 7986 ; WX 390 ; N uni1f32 ; G 2593
2450
- U 7987 ; WX 390 ; N uni1f33 ; G 2594
2451
- U 7988 ; WX 390 ; N uni1f34 ; G 2595
2452
- U 7989 ; WX 390 ; N uni1f35 ; G 2596
2453
- U 7990 ; WX 390 ; N uni1f36 ; G 2597
2454
- U 7991 ; WX 390 ; N uni1f37 ; G 2598
2455
- U 7992 ; WX 483 ; N uni1f38 ; G 2599
2456
- U 7993 ; WX 489 ; N uni1f39 ; G 2600
2457
- U 7994 ; WX 777 ; N uni1f3a ; G 2601
2458
- U 7995 ; WX 785 ; N uni1f3b ; G 2602
2459
- U 7996 ; WX 712 ; N uni1f3c ; G 2603
2460
- U 7997 ; WX 738 ; N uni1f3d ; G 2604
2461
- U 7998 ; WX 604 ; N uni1f3e ; G 2605
2462
- U 7999 ; WX 604 ; N uni1f3f ; G 2606
2463
- U 8000 ; WX 687 ; N uni1f40 ; G 2607
2464
- U 8001 ; WX 687 ; N uni1f41 ; G 2608
2465
- U 8002 ; WX 687 ; N uni1f42 ; G 2609
2466
- U 8003 ; WX 687 ; N uni1f43 ; G 2610
2467
- U 8004 ; WX 687 ; N uni1f44 ; G 2611
2468
- U 8005 ; WX 687 ; N uni1f45 ; G 2612
2469
- U 8008 ; WX 892 ; N uni1f48 ; G 2613
2470
- U 8009 ; WX 933 ; N uni1f49 ; G 2614
2471
- U 8010 ; WX 1221 ; N uni1f4a ; G 2615
2472
- U 8011 ; WX 1224 ; N uni1f4b ; G 2616
2473
- U 8012 ; WX 1053 ; N uni1f4c ; G 2617
2474
- U 8013 ; WX 1082 ; N uni1f4d ; G 2618
2475
- U 8016 ; WX 675 ; N uni1f50 ; G 2619
2476
- U 8017 ; WX 675 ; N uni1f51 ; G 2620
2477
- U 8018 ; WX 675 ; N uni1f52 ; G 2621
2478
- U 8019 ; WX 675 ; N uni1f53 ; G 2622
2479
- U 8020 ; WX 675 ; N uni1f54 ; G 2623
2480
- U 8021 ; WX 675 ; N uni1f55 ; G 2624
2481
- U 8022 ; WX 675 ; N uni1f56 ; G 2625
2482
- U 8023 ; WX 675 ; N uni1f57 ; G 2626
2483
- U 8025 ; WX 930 ; N uni1f59 ; G 2627
2484
- U 8027 ; WX 1184 ; N uni1f5b ; G 2628
2485
- U 8029 ; WX 1199 ; N uni1f5d ; G 2629
2486
- U 8031 ; WX 1049 ; N uni1f5f ; G 2630
2487
- U 8032 ; WX 869 ; N uni1f60 ; G 2631
2488
- U 8033 ; WX 869 ; N uni1f61 ; G 2632
2489
- U 8034 ; WX 869 ; N uni1f62 ; G 2633
2490
- U 8035 ; WX 869 ; N uni1f63 ; G 2634
2491
- U 8036 ; WX 869 ; N uni1f64 ; G 2635
2492
- U 8037 ; WX 869 ; N uni1f65 ; G 2636
2493
- U 8038 ; WX 869 ; N uni1f66 ; G 2637
2494
- U 8039 ; WX 869 ; N uni1f67 ; G 2638
2495
- U 8040 ; WX 909 ; N uni1f68 ; G 2639
2496
- U 8041 ; WX 958 ; N uni1f69 ; G 2640
2497
- U 8042 ; WX 1246 ; N uni1f6a ; G 2641
2498
- U 8043 ; WX 1251 ; N uni1f6b ; G 2642
2499
- U 8044 ; WX 1076 ; N uni1f6c ; G 2643
2500
- U 8045 ; WX 1105 ; N uni1f6d ; G 2644
2501
- U 8046 ; WX 1028 ; N uni1f6e ; G 2645
2502
- U 8047 ; WX 1076 ; N uni1f6f ; G 2646
2503
- U 8048 ; WX 687 ; N uni1f70 ; G 2647
2504
- U 8049 ; WX 687 ; N uni1f71 ; G 2648
2505
- U 8050 ; WX 557 ; N uni1f72 ; G 2649
2506
- U 8051 ; WX 557 ; N uni1f73 ; G 2650
2507
- U 8052 ; WX 712 ; N uni1f74 ; G 2651
2508
- U 8053 ; WX 712 ; N uni1f75 ; G 2652
2509
- U 8054 ; WX 390 ; N uni1f76 ; G 2653
2510
- U 8055 ; WX 390 ; N uni1f77 ; G 2654
2511
- U 8056 ; WX 687 ; N uni1f78 ; G 2655
2512
- U 8057 ; WX 687 ; N uni1f79 ; G 2656
2513
- U 8058 ; WX 675 ; N uni1f7a ; G 2657
2514
- U 8059 ; WX 675 ; N uni1f7b ; G 2658
2515
- U 8060 ; WX 869 ; N uni1f7c ; G 2659
2516
- U 8061 ; WX 869 ; N uni1f7d ; G 2660
2517
- U 8064 ; WX 687 ; N uni1f80 ; G 2661
2518
- U 8065 ; WX 687 ; N uni1f81 ; G 2662
2519
- U 8066 ; WX 687 ; N uni1f82 ; G 2663
2520
- U 8067 ; WX 687 ; N uni1f83 ; G 2664
2521
- U 8068 ; WX 687 ; N uni1f84 ; G 2665
2522
- U 8069 ; WX 687 ; N uni1f85 ; G 2666
2523
- U 8070 ; WX 687 ; N uni1f86 ; G 2667
2524
- U 8071 ; WX 687 ; N uni1f87 ; G 2668
2525
- U 8072 ; WX 774 ; N uni1f88 ; G 2669
2526
- U 8073 ; WX 774 ; N uni1f89 ; G 2670
2527
- U 8074 ; WX 1041 ; N uni1f8a ; G 2671
2528
- U 8075 ; WX 1043 ; N uni1f8b ; G 2672
2529
- U 8076 ; WX 935 ; N uni1f8c ; G 2673
2530
- U 8077 ; WX 963 ; N uni1f8d ; G 2674
2531
- U 8078 ; WX 835 ; N uni1f8e ; G 2675
2532
- U 8079 ; WX 859 ; N uni1f8f ; G 2676
2533
- U 8080 ; WX 712 ; N uni1f90 ; G 2677
2534
- U 8081 ; WX 712 ; N uni1f91 ; G 2678
2535
- U 8082 ; WX 712 ; N uni1f92 ; G 2679
2536
- U 8083 ; WX 712 ; N uni1f93 ; G 2680
2537
- U 8084 ; WX 712 ; N uni1f94 ; G 2681
2538
- U 8085 ; WX 712 ; N uni1f95 ; G 2682
2539
- U 8086 ; WX 712 ; N uni1f96 ; G 2683
2540
- U 8087 ; WX 712 ; N uni1f97 ; G 2684
2541
- U 8088 ; WX 945 ; N uni1f98 ; G 2685
2542
- U 8089 ; WX 951 ; N uni1f99 ; G 2686
2543
- U 8090 ; WX 1250 ; N uni1f9a ; G 2687
2544
- U 8091 ; WX 1250 ; N uni1f9b ; G 2688
2545
- U 8092 ; WX 1180 ; N uni1f9c ; G 2689
2546
- U 8093 ; WX 1206 ; N uni1f9d ; G 2690
2547
- U 8094 ; WX 1054 ; N uni1f9e ; G 2691
2548
- U 8095 ; WX 1063 ; N uni1f9f ; G 2692
2549
- U 8096 ; WX 869 ; N uni1fa0 ; G 2693
2550
- U 8097 ; WX 869 ; N uni1fa1 ; G 2694
2551
- U 8098 ; WX 869 ; N uni1fa2 ; G 2695
2552
- U 8099 ; WX 869 ; N uni1fa3 ; G 2696
2553
- U 8100 ; WX 869 ; N uni1fa4 ; G 2697
2554
- U 8101 ; WX 869 ; N uni1fa5 ; G 2698
2555
- U 8102 ; WX 869 ; N uni1fa6 ; G 2699
2556
- U 8103 ; WX 869 ; N uni1fa7 ; G 2700
2557
- U 8104 ; WX 909 ; N uni1fa8 ; G 2701
2558
- U 8105 ; WX 958 ; N uni1fa9 ; G 2702
2559
- U 8106 ; WX 1246 ; N uni1faa ; G 2703
2560
- U 8107 ; WX 1251 ; N uni1fab ; G 2704
2561
- U 8108 ; WX 1076 ; N uni1fac ; G 2705
2562
- U 8109 ; WX 1105 ; N uni1fad ; G 2706
2563
- U 8110 ; WX 1028 ; N uni1fae ; G 2707
2564
- U 8111 ; WX 1076 ; N uni1faf ; G 2708
2565
- U 8112 ; WX 687 ; N uni1fb0 ; G 2709
2566
- U 8113 ; WX 687 ; N uni1fb1 ; G 2710
2567
- U 8114 ; WX 687 ; N uni1fb2 ; G 2711
2568
- U 8115 ; WX 687 ; N uni1fb3 ; G 2712
2569
- U 8116 ; WX 687 ; N uni1fb4 ; G 2713
2570
- U 8118 ; WX 687 ; N uni1fb6 ; G 2714
2571
- U 8119 ; WX 687 ; N uni1fb7 ; G 2715
2572
- U 8120 ; WX 774 ; N uni1fb8 ; G 2716
2573
- U 8121 ; WX 774 ; N uni1fb9 ; G 2717
2574
- U 8122 ; WX 876 ; N uni1fba ; G 2718
2575
- U 8123 ; WX 797 ; N uni1fbb ; G 2719
2576
- U 8124 ; WX 774 ; N uni1fbc ; G 2720
2577
- U 8125 ; WX 500 ; N uni1fbd ; G 2721
2578
- U 8126 ; WX 500 ; N uni1fbe ; G 2722
2579
- U 8127 ; WX 500 ; N uni1fbf ; G 2723
2580
- U 8128 ; WX 500 ; N uni1fc0 ; G 2724
2581
- U 8129 ; WX 500 ; N uni1fc1 ; G 2725
2582
- U 8130 ; WX 712 ; N uni1fc2 ; G 2726
2583
- U 8131 ; WX 712 ; N uni1fc3 ; G 2727
2584
- U 8132 ; WX 712 ; N uni1fc4 ; G 2728
2585
- U 8134 ; WX 712 ; N uni1fc6 ; G 2729
2586
- U 8135 ; WX 712 ; N uni1fc7 ; G 2730
2587
- U 8136 ; WX 929 ; N uni1fc8 ; G 2731
2588
- U 8137 ; WX 846 ; N uni1fc9 ; G 2732
2589
- U 8138 ; WX 1080 ; N uni1fca ; G 2733
2590
- U 8139 ; WX 1009 ; N uni1fcb ; G 2734
2591
- U 8140 ; WX 837 ; N uni1fcc ; G 2735
2592
- U 8141 ; WX 500 ; N uni1fcd ; G 2736
2593
- U 8142 ; WX 500 ; N uni1fce ; G 2737
2594
- U 8143 ; WX 500 ; N uni1fcf ; G 2738
2595
- U 8144 ; WX 390 ; N uni1fd0 ; G 2739
2596
- U 8145 ; WX 390 ; N uni1fd1 ; G 2740
2597
- U 8146 ; WX 390 ; N uni1fd2 ; G 2741
2598
- U 8147 ; WX 390 ; N uni1fd3 ; G 2742
2599
- U 8150 ; WX 390 ; N uni1fd6 ; G 2743
2600
- U 8151 ; WX 390 ; N uni1fd7 ; G 2744
2601
- U 8152 ; WX 372 ; N uni1fd8 ; G 2745
2602
- U 8153 ; WX 372 ; N uni1fd9 ; G 2746
2603
- U 8154 ; WX 621 ; N uni1fda ; G 2747
2604
- U 8155 ; WX 563 ; N uni1fdb ; G 2748
2605
- U 8157 ; WX 500 ; N uni1fdd ; G 2749
2606
- U 8158 ; WX 500 ; N uni1fde ; G 2750
2607
- U 8159 ; WX 500 ; N uni1fdf ; G 2751
2608
- U 8160 ; WX 675 ; N uni1fe0 ; G 2752
2609
- U 8161 ; WX 675 ; N uni1fe1 ; G 2753
2610
- U 8162 ; WX 675 ; N uni1fe2 ; G 2754
2611
- U 8163 ; WX 675 ; N uni1fe3 ; G 2755
2612
- U 8164 ; WX 716 ; N uni1fe4 ; G 2756
2613
- U 8165 ; WX 716 ; N uni1fe5 ; G 2757
2614
- U 8166 ; WX 675 ; N uni1fe6 ; G 2758
2615
- U 8167 ; WX 675 ; N uni1fe7 ; G 2759
2616
- U 8168 ; WX 724 ; N uni1fe8 ; G 2760
2617
- U 8169 ; WX 724 ; N uni1fe9 ; G 2761
2618
- U 8170 ; WX 1020 ; N uni1fea ; G 2762
2619
- U 8171 ; WX 980 ; N uni1feb ; G 2763
2620
- U 8172 ; WX 838 ; N uni1fec ; G 2764
2621
- U 8173 ; WX 500 ; N uni1fed ; G 2765
2622
- U 8174 ; WX 500 ; N uni1fee ; G 2766
2623
- U 8175 ; WX 500 ; N uni1fef ; G 2767
2624
- U 8178 ; WX 869 ; N uni1ff2 ; G 2768
2625
- U 8179 ; WX 869 ; N uni1ff3 ; G 2769
2626
- U 8180 ; WX 869 ; N uni1ff4 ; G 2770
2627
- U 8182 ; WX 869 ; N uni1ff6 ; G 2771
2628
- U 8183 ; WX 869 ; N uni1ff7 ; G 2772
2629
- U 8184 ; WX 1065 ; N uni1ff8 ; G 2773
2630
- U 8185 ; WX 891 ; N uni1ff9 ; G 2774
2631
- U 8186 ; WX 1084 ; N uni1ffa ; G 2775
2632
- U 8187 ; WX 894 ; N uni1ffb ; G 2776
2633
- U 8188 ; WX 850 ; N uni1ffc ; G 2777
2634
- U 8189 ; WX 500 ; N uni1ffd ; G 2778
2635
- U 8190 ; WX 500 ; N uni1ffe ; G 2779
 
 
 
 
 
 
2636
  U 8192 ; WX 500 ; N uni2000 ; G 2780
2637
  U 8193 ; WX 1000 ; N uni2001 ; G 2781
2638
  U 8194 ; WX 500 ; N uni2002 ; G 2782
@@ -2643,64 +2810,76 @@ U 8198 ; WX 167 ; N uni2006 ; G 2786
2643
  U 8199 ; WX 696 ; N uni2007 ; G 2787
2644
  U 8200 ; WX 380 ; N uni2008 ; G 2788
2645
  U 8201 ; WX 200 ; N uni2009 ; G 2789
2646
- U 8202 ; WX 100 ; N uni200a ; G 2790
 
 
 
 
 
2647
  U 8208 ; WX 415 ; N uni2010 ; G 2796
2648
  U 8209 ; WX 415 ; N uni2011 ; G 2797
2649
- U 8210 ; WX 696 ; N uni2012 ; G 2798
2650
- U 8211 ; WX 500 ; N uni2013 ; G 2799
2651
- U 8212 ; WX 1000 ; N uni2014 ; G 2800
2652
  U 8213 ; WX 1000 ; N uni2015 ; G 2801
2653
  U 8214 ; WX 500 ; N uni2016 ; G 2802
2654
- U 8215 ; WX 500 ; N uni2017 ; G 2803
2655
- U 8216 ; WX 380 ; N uni2018 ; G 2804
2656
- U 8217 ; WX 380 ; N uni2019 ; G 2805
2657
- U 8218 ; WX 380 ; N uni201a ; G 2806
2658
- U 8219 ; WX 380 ; N uni201b ; G 2807
2659
- U 8220 ; WX 657 ; N uni201c ; G 2808
2660
- U 8221 ; WX 657 ; N uni201d ; G 2809
2661
- U 8222 ; WX 657 ; N uni201e ; G 2810
2662
- U 8223 ; WX 657 ; N uni201f ; G 2811
2663
- U 8224 ; WX 500 ; N uni2020 ; G 2812
2664
- U 8225 ; WX 500 ; N uni2021 ; G 2813
2665
- U 8226 ; WX 639 ; N uni2022 ; G 2814
2666
  U 8227 ; WX 639 ; N uni2023 ; G 2815
2667
- U 8228 ; WX 333 ; N uni2024 ; G 2816
2668
- U 8229 ; WX 667 ; N uni2025 ; G 2817
2669
- U 8230 ; WX 1000 ; N uni2026 ; G 2818
2670
  U 8231 ; WX 348 ; N uni2027 ; G 2819
2671
- U 8239 ; WX 200 ; N uni202f ; G 2827
2672
- U 8240 ; WX 1440 ; N uni2030 ; G 2828
 
 
 
 
 
 
 
2673
  U 8241 ; WX 1887 ; N uni2031 ; G 2829
2674
- U 8242 ; WX 264 ; N uni2032 ; G 2830
2675
- U 8243 ; WX 447 ; N uni2033 ; G 2831
2676
  U 8244 ; WX 630 ; N uni2034 ; G 2832
2677
  U 8245 ; WX 264 ; N uni2035 ; G 2833
2678
  U 8246 ; WX 447 ; N uni2036 ; G 2834
2679
  U 8247 ; WX 630 ; N uni2037 ; G 2835
2680
  U 8248 ; WX 733 ; N uni2038 ; G 2836
2681
- U 8249 ; WX 412 ; N uni2039 ; G 2837
2682
- U 8250 ; WX 412 ; N uni203a ; G 2838
2683
- U 8251 ; WX 972 ; N uni203b ; G 2839
2684
- U 8252 ; WX 627 ; N uni203c ; G 2840
2685
- U 8253 ; WX 580 ; N uni203d ; G 2841
2686
- U 8254 ; WX 500 ; N uni203e ; G 2842
2687
- U 8255 ; WX 828 ; N uni203f ; G 2843
2688
  U 8256 ; WX 828 ; N uni2040 ; G 2844
2689
  U 8257 ; WX 329 ; N uni2041 ; G 2845
2690
  U 8258 ; WX 1023 ; N uni2042 ; G 2846
2691
  U 8259 ; WX 500 ; N uni2043 ; G 2847
2692
- U 8260 ; WX 167 ; N uni2044 ; G 2848
2693
  U 8261 ; WX 457 ; N uni2045 ; G 2849
2694
  U 8262 ; WX 457 ; N uni2046 ; G 2850
2695
  U 8263 ; WX 1030 ; N uni2047 ; G 2851
2696
  U 8264 ; WX 829 ; N uni2048 ; G 2852
2697
  U 8265 ; WX 829 ; N uni2049 ; G 2853
2698
- U 8266 ; WX 513 ; N uni204a ; G 2854
2699
- U 8267 ; WX 636 ; N uni204b ; G 2855
2700
- U 8268 ; WX 500 ; N uni204c ; G 2856
2701
- U 8269 ; WX 500 ; N uni204d ; G 2857
2702
- U 8270 ; WX 523 ; N uni204e ; G 2858
2703
- U 8271 ; WX 400 ; N uni204f ; G 2859
2704
  U 8272 ; WX 828 ; N uni2050 ; G 2860
2705
  U 8273 ; WX 523 ; N uni2051 ; G 2861
2706
  U 8274 ; WX 556 ; N uni2052 ; G 2862
@@ -2711,12 +2890,23 @@ U 8278 ; WX 684 ; N uni2056 ; G 2866
2711
  U 8279 ; WX 813 ; N uni2057 ; G 2867
2712
  U 8280 ; WX 838 ; N uni2058 ; G 2868
2713
  U 8281 ; WX 838 ; N uni2059 ; G 2869
2714
- U 8282 ; WX 380 ; N uni205a ; G 2870
2715
- U 8283 ; WX 872 ; N uni205b ; G 2871
2716
- U 8284 ; WX 838 ; N uni205c ; G 2872
2717
- U 8285 ; WX 380 ; N uni205d ; G 2873
2718
- U 8286 ; WX 380 ; N uni205e ; G 2874
2719
- U 8287 ; WX 222 ; N uni205f ; G 2875
 
 
 
 
 
 
 
 
 
 
 
2720
  U 8304 ; WX 438 ; N uni2070 ; G 2887
2721
  U 8305 ; WX 219 ; N uni2071 ; G 2888
2722
  U 8308 ; WX 438 ; N uni2074 ; G 2889
@@ -2725,12 +2915,12 @@ U 8310 ; WX 438 ; N uni2076 ; G 2891
2725
  U 8311 ; WX 438 ; N uni2077 ; G 2892
2726
  U 8312 ; WX 438 ; N uni2078 ; G 2893
2727
  U 8313 ; WX 438 ; N uni2079 ; G 2894
2728
- U 8314 ; WX 528 ; N uni207a ; G 2895
2729
- U 8315 ; WX 528 ; N uni207b ; G 2896
2730
- U 8316 ; WX 528 ; N uni207c ; G 2897
2731
- U 8317 ; WX 288 ; N uni207d ; G 2898
2732
- U 8318 ; WX 288 ; N uni207e ; G 2899
2733
- U 8319 ; WX 456 ; N uni207f ; G 2900
2734
  U 8320 ; WX 438 ; N uni2080 ; G 2901
2735
  U 8321 ; WX 438 ; N uni2081 ; G 2902
2736
  U 8322 ; WX 438 ; N uni2082 ; G 2903
@@ -2741,40 +2931,47 @@ U 8326 ; WX 438 ; N uni2086 ; G 2907
2741
  U 8327 ; WX 438 ; N uni2087 ; G 2908
2742
  U 8328 ; WX 438 ; N uni2088 ; G 2909
2743
  U 8329 ; WX 438 ; N uni2089 ; G 2910
2744
- U 8330 ; WX 528 ; N uni208a ; G 2911
2745
- U 8331 ; WX 528 ; N uni208b ; G 2912
2746
- U 8332 ; WX 528 ; N uni208c ; G 2913
2747
- U 8333 ; WX 288 ; N uni208d ; G 2914
2748
- U 8334 ; WX 288 ; N uni208e ; G 2915
2749
  U 8336 ; WX 458 ; N uni2090 ; G 2916
2750
  U 8337 ; WX 479 ; N uni2091 ; G 2917
2751
  U 8338 ; WX 488 ; N uni2092 ; G 2918
2752
  U 8339 ; WX 413 ; N uni2093 ; G 2919
2753
  U 8340 ; WX 479 ; N uni2094 ; G 2920
2754
- U 8352 ; WX 929 ; N uni20a0 ; G 2921
2755
- U 8353 ; WX 696 ; N uni20a1 ; G 2922
2756
- U 8354 ; WX 696 ; N uni20a2 ; G 2923
2757
- U 8355 ; WX 696 ; N uni20a3 ; G 2924
2758
- U 8356 ; WX 696 ; N uni20a4 ; G 2925
2759
- U 8357 ; WX 1042 ; N uni20a5 ; G 2926
2760
- U 8358 ; WX 837 ; N uni20a6 ; G 2927
2761
- U 8359 ; WX 1518 ; N uni20a7 ; G 2928
2762
- U 8360 ; WX 1205 ; N uni20a8 ; G 2929
2763
- U 8361 ; WX 1103 ; N uni20a9 ; G 2930
2764
- U 8362 ; WX 904 ; N uni20aa ; G 2931
2765
- U 8363 ; WX 696 ; N uni20ab ; G 2932
2766
- U 8364 ; WX 696 ; N uni20ac ; G 2933
2767
- U 8365 ; WX 696 ; N uni20ad ; G 2934
2768
- U 8366 ; WX 696 ; N uni20ae ; G 2935
2769
- U 8367 ; WX 1392 ; N uni20af ; G 2936
2770
- U 8368 ; WX 696 ; N uni20b0 ; G 2937
2771
- U 8369 ; WX 696 ; N uni20b1 ; G 2938
2772
- U 8370 ; WX 696 ; N uni20b2 ; G 2939
2773
- U 8371 ; WX 696 ; N uni20b3 ; G 2940
2774
- U 8372 ; WX 859 ; N uni20b4 ; G 2941
2775
- U 8373 ; WX 696 ; N uni20b5 ; G 2942
2776
- U 8376 ; WX 696 ; N uni20b8 ; G 2943
2777
- U 8377 ; WX 696 ; N uni20b9 ; G 2944
 
 
 
 
 
 
 
2778
  U 8448 ; WX 1120 ; N uni2100 ; G 2952
2779
  U 8449 ; WX 1170 ; N uni2101 ; G 2953
2780
  U 8450 ; WX 734 ; N uni2102 ; G 2954
@@ -2785,30 +2982,30 @@ U 8454 ; WX 1144 ; N uni2106 ; G 2958
2785
  U 8455 ; WX 614 ; N uni2107 ; G 2959
2786
  U 8456 ; WX 698 ; N uni2108 ; G 2960
2787
  U 8457 ; WX 1086 ; N uni2109 ; G 2961
2788
- U 8459 ; WX 1073 ; N uni210b ; G 2962
2789
- U 8460 ; WX 913 ; N uni210c ; G 2963
2790
- U 8461 ; WX 888 ; N uni210d ; G 2964
2791
- U 8462 ; WX 712 ; N uni210e ; G 2965
2792
- U 8463 ; WX 712 ; N uni210f ; G 2966
2793
  U 8464 ; WX 597 ; N uni2110 ; G 2967
2794
- U 8465 ; WX 697 ; N uni2111 ; G 2968
2795
  U 8466 ; WX 856 ; N uni2112 ; G 2969
2796
  U 8467 ; WX 472 ; N uni2113 ; G 2970
2797
  U 8468 ; WX 974 ; N uni2114 ; G 2971
2798
  U 8469 ; WX 837 ; N uni2115 ; G 2972
2799
  U 8470 ; WX 1203 ; N uni2116 ; G 2973
2800
  U 8471 ; WX 1000 ; N uni2117 ; G 2974
2801
- U 8472 ; WX 697 ; N uni2118 ; G 2975
2802
  U 8473 ; WX 750 ; N uni2119 ; G 2976
2803
- U 8474 ; WX 850 ; N uni211a ; G 2977
2804
- U 8475 ; WX 938 ; N uni211b ; G 2978
2805
- U 8476 ; WX 814 ; N uni211c ; G 2979
2806
- U 8477 ; WX 801 ; N uni211d ; G 2980
2807
- U 8478 ; WX 896 ; N uni211e ; G 2981
2808
- U 8479 ; WX 710 ; N uni211f ; G 2982
2809
  U 8480 ; WX 1020 ; N uni2120 ; G 2983
2810
  U 8481 ; WX 1281 ; N uni2121 ; G 2984
2811
- U 8482 ; WX 1000 ; N uni2122 ; G 2985
2812
  U 8483 ; WX 755 ; N uni2123 ; G 2986
2813
  U 8484 ; WX 754 ; N uni2124 ; G 2987
2814
  U 8485 ; WX 578 ; N uni2125 ; G 2988
@@ -2816,28 +3013,28 @@ U 8486 ; WX 850 ; N uni2126 ; G 2989
2816
  U 8487 ; WX 850 ; N uni2127 ; G 2990
2817
  U 8488 ; WX 763 ; N uni2128 ; G 2991
2818
  U 8489 ; WX 338 ; N uni2129 ; G 2992
2819
- U 8490 ; WX 775 ; N uni212a ; G 2993
2820
- U 8491 ; WX 774 ; N uni212b ; G 2994
2821
- U 8492 ; WX 928 ; N uni212c ; G 2995
2822
- U 8493 ; WX 818 ; N uni212d ; G 2996
2823
- U 8494 ; WX 854 ; N uni212e ; G 2997
2824
- U 8495 ; WX 636 ; N uni212f ; G 2998
2825
  U 8496 ; WX 729 ; N uni2130 ; G 2999
2826
  U 8497 ; WX 808 ; N uni2131 ; G 3000
2827
  U 8498 ; WX 683 ; N uni2132 ; G 3001
2828
  U 8499 ; WX 1184 ; N uni2133 ; G 3002
2829
  U 8500 ; WX 465 ; N uni2134 ; G 3003
2830
- U 8501 ; WX 794 ; N uni2135 ; G 3004
2831
  U 8502 ; WX 731 ; N uni2136 ; G 3005
2832
  U 8503 ; WX 494 ; N uni2137 ; G 3006
2833
  U 8504 ; WX 684 ; N uni2138 ; G 3007
2834
  U 8505 ; WX 380 ; N uni2139 ; G 3008
2835
- U 8506 ; WX 945 ; N uni213a ; G 3009
2836
- U 8507 ; WX 1348 ; N uni213b ; G 3010
2837
- U 8508 ; WX 790 ; N uni213c ; G 3011
2838
- U 8509 ; WX 737 ; N uni213d ; G 3012
2839
- U 8510 ; WX 654 ; N uni213e ; G 3013
2840
- U 8511 ; WX 863 ; N uni213f ; G 3014
2841
  U 8512 ; WX 840 ; N uni2140 ; G 3015
2842
  U 8513 ; WX 775 ; N uni2141 ; G 3016
2843
  U 8514 ; WX 557 ; N uni2142 ; G 3017
@@ -2848,24 +3045,24 @@ U 8518 ; WX 716 ; N uni2146 ; G 3021
2848
  U 8519 ; WX 678 ; N uni2147 ; G 3022
2849
  U 8520 ; WX 343 ; N uni2148 ; G 3023
2850
  U 8521 ; WX 343 ; N uni2149 ; G 3024
2851
- U 8523 ; WX 872 ; N uni214b ; G 3025
2852
- U 8526 ; WX 547 ; N uni214e ; G 3026
2853
  U 8528 ; WX 1035 ; N uni2150 ; G 3027
2854
  U 8529 ; WX 1035 ; N uni2151 ; G 3028
2855
  U 8530 ; WX 1483 ; N uni2152 ; G 3029
2856
- U 8531 ; WX 1035 ; N uni2153 ; G 3030
2857
- U 8532 ; WX 1035 ; N uni2154 ; G 3031
2858
  U 8533 ; WX 1035 ; N uni2155 ; G 3032
2859
  U 8534 ; WX 1035 ; N uni2156 ; G 3033
2860
  U 8535 ; WX 1035 ; N uni2157 ; G 3034
2861
  U 8536 ; WX 1035 ; N uni2158 ; G 3035
2862
  U 8537 ; WX 1035 ; N uni2159 ; G 3036
2863
- U 8538 ; WX 1035 ; N uni215a ; G 3037
2864
- U 8539 ; WX 1035 ; N uni215b ; G 3038
2865
- U 8540 ; WX 1035 ; N uni215c ; G 3039
2866
- U 8541 ; WX 1035 ; N uni215d ; G 3040
2867
- U 8542 ; WX 1035 ; N uni215e ; G 3041
2868
- U 8543 ; WX 615 ; N uni215f ; G 3042
2869
  U 8544 ; WX 372 ; N uni2160 ; G 3043
2870
  U 8545 ; WX 659 ; N uni2161 ; G 3044
2871
  U 8546 ; WX 945 ; N uni2162 ; G 3045
@@ -2876,12 +3073,12 @@ U 8550 ; WX 1386 ; N uni2166 ; G 3049
2876
  U 8551 ; WX 1672 ; N uni2167 ; G 3050
2877
  U 8552 ; WX 1121 ; N uni2168 ; G 3051
2878
  U 8553 ; WX 771 ; N uni2169 ; G 3052
2879
- U 8554 ; WX 1120 ; N uni216a ; G 3053
2880
- U 8555 ; WX 1407 ; N uni216b ; G 3054
2881
- U 8556 ; WX 637 ; N uni216c ; G 3055
2882
- U 8557 ; WX 734 ; N uni216d ; G 3056
2883
- U 8558 ; WX 830 ; N uni216e ; G 3057
2884
- U 8559 ; WX 995 ; N uni216f ; G 3058
2885
  U 8560 ; WX 343 ; N uni2170 ; G 3059
2886
  U 8561 ; WX 607 ; N uni2171 ; G 3060
2887
  U 8562 ; WX 872 ; N uni2172 ; G 3061
@@ -2892,12 +3089,12 @@ U 8566 ; WX 1227 ; N uni2176 ; G 3065
2892
  U 8567 ; WX 1491 ; N uni2177 ; G 3066
2893
  U 8568 ; WX 969 ; N uni2178 ; G 3067
2894
  U 8569 ; WX 645 ; N uni2179 ; G 3068
2895
- U 8570 ; WX 969 ; N uni217a ; G 3069
2896
- U 8571 ; WX 1233 ; N uni217b ; G 3070
2897
- U 8572 ; WX 343 ; N uni217c ; G 3071
2898
- U 8573 ; WX 593 ; N uni217d ; G 3072
2899
- U 8574 ; WX 716 ; N uni217e ; G 3073
2900
- U 8575 ; WX 1042 ; N uni217f ; G 3074
2901
  U 8576 ; WX 1289 ; N uni2180 ; G 3075
2902
  U 8577 ; WX 830 ; N uni2181 ; G 3076
2903
  U 8578 ; WX 1289 ; N uni2182 ; G 3077
@@ -2905,198 +3102,198 @@ U 8579 ; WX 734 ; N uni2183 ; G 3078
2905
  U 8580 ; WX 593 ; N uni2184 ; G 3079
2906
  U 8581 ; WX 734 ; N uni2185 ; G 3080
2907
  U 8585 ; WX 1035 ; N uni2189 ; G 3081
2908
- U 8592 ; WX 838 ; N uni2190 ; G 3082
2909
- U 8593 ; WX 838 ; N uni2191 ; G 3083
2910
- U 8594 ; WX 838 ; N uni2192 ; G 3084
2911
- U 8595 ; WX 838 ; N uni2193 ; G 3085
2912
- U 8596 ; WX 838 ; N uni2194 ; G 3086
2913
- U 8597 ; WX 838 ; N uni2195 ; G 3087
2914
  U 8598 ; WX 838 ; N uni2196 ; G 3088
2915
  U 8599 ; WX 838 ; N uni2197 ; G 3089
2916
  U 8600 ; WX 838 ; N uni2198 ; G 3090
2917
  U 8601 ; WX 838 ; N uni2199 ; G 3091
2918
- U 8602 ; WX 838 ; N uni219a ; G 3092
2919
- U 8603 ; WX 838 ; N uni219b ; G 3093
2920
- U 8604 ; WX 838 ; N uni219c ; G 3094
2921
- U 8605 ; WX 838 ; N uni219d ; G 3095
2922
- U 8606 ; WX 838 ; N uni219e ; G 3096
2923
- U 8607 ; WX 838 ; N uni219f ; G 3097
2924
- U 8608 ; WX 838 ; N uni21a0 ; G 3098
2925
- U 8609 ; WX 838 ; N uni21a1 ; G 3099
2926
- U 8610 ; WX 838 ; N uni21a2 ; G 3100
2927
- U 8611 ; WX 838 ; N uni21a3 ; G 3101
2928
- U 8612 ; WX 838 ; N uni21a4 ; G 3102
2929
- U 8613 ; WX 838 ; N uni21a5 ; G 3103
2930
- U 8614 ; WX 838 ; N uni21a6 ; G 3104
2931
- U 8615 ; WX 838 ; N uni21a7 ; G 3105
2932
- U 8616 ; WX 838 ; N uni21a8 ; G 3106
2933
- U 8617 ; WX 838 ; N uni21a9 ; G 3107
2934
- U 8618 ; WX 838 ; N uni21aa ; G 3108
2935
- U 8619 ; WX 838 ; N uni21ab ; G 3109
2936
- U 8620 ; WX 838 ; N uni21ac ; G 3110
2937
- U 8621 ; WX 838 ; N uni21ad ; G 3111
2938
- U 8622 ; WX 838 ; N uni21ae ; G 3112
2939
- U 8623 ; WX 838 ; N uni21af ; G 3113
2940
- U 8624 ; WX 838 ; N uni21b0 ; G 3114
2941
- U 8625 ; WX 838 ; N uni21b1 ; G 3115
2942
- U 8626 ; WX 838 ; N uni21b2 ; G 3116
2943
- U 8627 ; WX 838 ; N uni21b3 ; G 3117
2944
- U 8628 ; WX 838 ; N uni21b4 ; G 3118
2945
- U 8629 ; WX 838 ; N uni21b5 ; G 3119
2946
- U 8630 ; WX 838 ; N uni21b6 ; G 3120
2947
- U 8631 ; WX 838 ; N uni21b7 ; G 3121
2948
- U 8632 ; WX 838 ; N uni21b8 ; G 3122
2949
- U 8633 ; WX 838 ; N uni21b9 ; G 3123
2950
- U 8634 ; WX 838 ; N uni21ba ; G 3124
2951
- U 8635 ; WX 838 ; N uni21bb ; G 3125
2952
- U 8636 ; WX 838 ; N uni21bc ; G 3126
2953
- U 8637 ; WX 838 ; N uni21bd ; G 3127
2954
- U 8638 ; WX 838 ; N uni21be ; G 3128
2955
- U 8639 ; WX 838 ; N uni21bf ; G 3129
2956
- U 8640 ; WX 838 ; N uni21c0 ; G 3130
2957
- U 8641 ; WX 838 ; N uni21c1 ; G 3131
2958
- U 8642 ; WX 838 ; N uni21c2 ; G 3132
2959
- U 8643 ; WX 838 ; N uni21c3 ; G 3133
2960
- U 8644 ; WX 838 ; N uni21c4 ; G 3134
2961
- U 8645 ; WX 838 ; N uni21c5 ; G 3135
2962
- U 8646 ; WX 838 ; N uni21c6 ; G 3136
2963
- U 8647 ; WX 838 ; N uni21c7 ; G 3137
2964
- U 8648 ; WX 838 ; N uni21c8 ; G 3138
2965
- U 8649 ; WX 838 ; N uni21c9 ; G 3139
2966
- U 8650 ; WX 838 ; N uni21ca ; G 3140
2967
- U 8651 ; WX 838 ; N uni21cb ; G 3141
2968
- U 8652 ; WX 838 ; N uni21cc ; G 3142
2969
- U 8653 ; WX 838 ; N uni21cd ; G 3143
2970
- U 8654 ; WX 838 ; N uni21ce ; G 3144
2971
- U 8655 ; WX 838 ; N uni21cf ; G 3145
2972
- U 8656 ; WX 838 ; N uni21d0 ; G 3146
2973
- U 8657 ; WX 838 ; N uni21d1 ; G 3147
2974
- U 8658 ; WX 838 ; N uni21d2 ; G 3148
2975
- U 8659 ; WX 838 ; N uni21d3 ; G 3149
2976
- U 8660 ; WX 838 ; N uni21d4 ; G 3150
2977
- U 8661 ; WX 838 ; N uni21d5 ; G 3151
2978
- U 8662 ; WX 838 ; N uni21d6 ; G 3152
2979
- U 8663 ; WX 838 ; N uni21d7 ; G 3153
2980
- U 8664 ; WX 838 ; N uni21d8 ; G 3154
2981
- U 8665 ; WX 838 ; N uni21d9 ; G 3155
2982
- U 8666 ; WX 838 ; N uni21da ; G 3156
2983
- U 8667 ; WX 838 ; N uni21db ; G 3157
2984
- U 8668 ; WX 838 ; N uni21dc ; G 3158
2985
- U 8669 ; WX 838 ; N uni21dd ; G 3159
2986
- U 8670 ; WX 838 ; N uni21de ; G 3160
2987
- U 8671 ; WX 838 ; N uni21df ; G 3161
2988
- U 8672 ; WX 838 ; N uni21e0 ; G 3162
2989
- U 8673 ; WX 838 ; N uni21e1 ; G 3163
2990
- U 8674 ; WX 838 ; N uni21e2 ; G 3164
2991
- U 8675 ; WX 838 ; N uni21e3 ; G 3165
2992
- U 8676 ; WX 838 ; N uni21e4 ; G 3166
2993
- U 8677 ; WX 838 ; N uni21e5 ; G 3167
2994
- U 8678 ; WX 838 ; N uni21e6 ; G 3168
2995
- U 8679 ; WX 838 ; N uni21e7 ; G 3169
2996
- U 8680 ; WX 838 ; N uni21e8 ; G 3170
2997
- U 8681 ; WX 838 ; N uni21e9 ; G 3171
2998
- U 8682 ; WX 838 ; N uni21ea ; G 3172
2999
- U 8683 ; WX 838 ; N uni21eb ; G 3173
3000
- U 8684 ; WX 838 ; N uni21ec ; G 3174
3001
- U 8685 ; WX 838 ; N uni21ed ; G 3175
3002
- U 8686 ; WX 838 ; N uni21ee ; G 3176
3003
- U 8687 ; WX 838 ; N uni21ef ; G 3177
3004
- U 8688 ; WX 838 ; N uni21f0 ; G 3178
3005
- U 8689 ; WX 838 ; N uni21f1 ; G 3179
3006
- U 8690 ; WX 838 ; N uni21f2 ; G 3180
3007
- U 8691 ; WX 838 ; N uni21f3 ; G 3181
3008
- U 8692 ; WX 838 ; N uni21f4 ; G 3182
3009
- U 8693 ; WX 838 ; N uni21f5 ; G 3183
3010
- U 8694 ; WX 838 ; N uni21f6 ; G 3184
3011
- U 8695 ; WX 838 ; N uni21f7 ; G 3185
3012
- U 8696 ; WX 838 ; N uni21f8 ; G 3186
3013
- U 8697 ; WX 838 ; N uni21f9 ; G 3187
3014
- U 8698 ; WX 838 ; N uni21fa ; G 3188
3015
- U 8699 ; WX 838 ; N uni21fb ; G 3189
3016
- U 8700 ; WX 838 ; N uni21fc ; G 3190
3017
- U 8701 ; WX 838 ; N uni21fd ; G 3191
3018
- U 8702 ; WX 838 ; N uni21fe ; G 3192
3019
- U 8703 ; WX 838 ; N uni21ff ; G 3193
3020
- U 8704 ; WX 774 ; N uni2200 ; G 3194
3021
  U 8705 ; WX 696 ; N uni2201 ; G 3195
3022
- U 8706 ; WX 544 ; N uni2202 ; G 3196
3023
- U 8707 ; WX 683 ; N uni2203 ; G 3197
3024
  U 8708 ; WX 683 ; N uni2204 ; G 3198
3025
- U 8709 ; WX 856 ; N uni2205 ; G 3199
3026
- U 8710 ; WX 697 ; N uni2206 ; G 3200
3027
- U 8711 ; WX 697 ; N uni2207 ; G 3201
3028
- U 8712 ; WX 896 ; N uni2208 ; G 3202
3029
- U 8713 ; WX 896 ; N uni2209 ; G 3203
3030
- U 8714 ; WX 750 ; N uni220a ; G 3204
3031
- U 8715 ; WX 896 ; N uni220b ; G 3205
3032
- U 8716 ; WX 896 ; N uni220c ; G 3206
3033
- U 8717 ; WX 750 ; N uni220d ; G 3207
3034
- U 8718 ; WX 636 ; N uni220e ; G 3208
3035
- U 8719 ; WX 787 ; N uni220f ; G 3209
3036
  U 8720 ; WX 787 ; N uni2210 ; G 3210
3037
- U 8721 ; WX 718 ; N uni2211 ; G 3211
3038
- U 8722 ; WX 838 ; N uni2212 ; G 3212
3039
  U 8723 ; WX 838 ; N uni2213 ; G 3213
3040
  U 8724 ; WX 696 ; N uni2214 ; G 3214
3041
  U 8725 ; WX 365 ; N uni2215 ; G 3215
3042
  U 8726 ; WX 696 ; N uni2216 ; G 3216
3043
- U 8727 ; WX 838 ; N uni2217 ; G 3217
3044
  U 8728 ; WX 626 ; N uni2218 ; G 3218
3045
  U 8729 ; WX 380 ; N uni2219 ; G 3219
3046
- U 8730 ; WX 667 ; N uni221a ; G 3220
3047
- U 8731 ; WX 667 ; N uni221b ; G 3221
3048
- U 8732 ; WX 667 ; N uni221c ; G 3222
3049
- U 8733 ; WX 712 ; N uni221d ; G 3223
3050
- U 8734 ; WX 833 ; N uni221e ; G 3224
3051
- U 8735 ; WX 838 ; N uni221f ; G 3225
3052
- U 8736 ; WX 896 ; N uni2220 ; G 3226
3053
  U 8737 ; WX 896 ; N uni2221 ; G 3227
3054
  U 8738 ; WX 838 ; N uni2222 ; G 3228
3055
  U 8739 ; WX 500 ; N uni2223 ; G 3229
3056
  U 8740 ; WX 500 ; N uni2224 ; G 3230
3057
  U 8741 ; WX 500 ; N uni2225 ; G 3231
3058
  U 8742 ; WX 500 ; N uni2226 ; G 3232
3059
- U 8743 ; WX 812 ; N uni2227 ; G 3233
3060
- U 8744 ; WX 812 ; N uni2228 ; G 3234
3061
- U 8745 ; WX 812 ; N uni2229 ; G 3235
3062
- U 8746 ; WX 812 ; N uni222a ; G 3236
3063
- U 8747 ; WX 610 ; N uni222b ; G 3237
3064
- U 8748 ; WX 929 ; N uni222c ; G 3238
3065
- U 8749 ; WX 1295 ; N uni222d ; G 3239
3066
- U 8750 ; WX 563 ; N uni222e ; G 3240
3067
- U 8751 ; WX 977 ; N uni222f ; G 3241
3068
  U 8752 ; WX 1313 ; N uni2230 ; G 3242
3069
  U 8753 ; WX 563 ; N uni2231 ; G 3243
3070
  U 8754 ; WX 563 ; N uni2232 ; G 3244
3071
  U 8755 ; WX 563 ; N uni2233 ; G 3245
3072
- U 8756 ; WX 696 ; N uni2234 ; G 3246
3073
  U 8757 ; WX 696 ; N uni2235 ; G 3247
3074
  U 8758 ; WX 294 ; N uni2236 ; G 3248
3075
  U 8759 ; WX 696 ; N uni2237 ; G 3249
3076
  U 8760 ; WX 838 ; N uni2238 ; G 3250
3077
  U 8761 ; WX 838 ; N uni2239 ; G 3251
3078
- U 8762 ; WX 838 ; N uni223a ; G 3252
3079
- U 8763 ; WX 838 ; N uni223b ; G 3253
3080
- U 8764 ; WX 838 ; N uni223c ; G 3254
3081
- U 8765 ; WX 838 ; N uni223d ; G 3255
3082
- U 8766 ; WX 838 ; N uni223e ; G 3256
3083
- U 8767 ; WX 838 ; N uni223f ; G 3257
3084
  U 8768 ; WX 375 ; N uni2240 ; G 3258
3085
  U 8769 ; WX 838 ; N uni2241 ; G 3259
3086
  U 8770 ; WX 838 ; N uni2242 ; G 3260
3087
  U 8771 ; WX 838 ; N uni2243 ; G 3261
3088
  U 8772 ; WX 838 ; N uni2244 ; G 3262
3089
- U 8773 ; WX 838 ; N uni2245 ; G 3263
3090
  U 8774 ; WX 838 ; N uni2246 ; G 3264
3091
  U 8775 ; WX 838 ; N uni2247 ; G 3265
3092
- U 8776 ; WX 838 ; N uni2248 ; G 3266
3093
  U 8777 ; WX 838 ; N uni2249 ; G 3267
3094
- U 8778 ; WX 838 ; N uni224a ; G 3268
3095
- U 8779 ; WX 838 ; N uni224b ; G 3269
3096
- U 8780 ; WX 838 ; N uni224c ; G 3270
3097
- U 8781 ; WX 838 ; N uni224d ; G 3271
3098
- U 8782 ; WX 838 ; N uni224e ; G 3272
3099
- U 8783 ; WX 838 ; N uni224f ; G 3273
3100
  U 8784 ; WX 838 ; N uni2250 ; G 3274
3101
  U 8785 ; WX 838 ; N uni2251 ; G 3275
3102
  U 8786 ; WX 838 ; N uni2252 ; G 3276
@@ -3107,28 +3304,28 @@ U 8790 ; WX 838 ; N uni2256 ; G 3280
3107
  U 8791 ; WX 838 ; N uni2257 ; G 3281
3108
  U 8792 ; WX 838 ; N uni2258 ; G 3282
3109
  U 8793 ; WX 838 ; N uni2259 ; G 3283
3110
- U 8794 ; WX 838 ; N uni225a ; G 3284
3111
- U 8795 ; WX 838 ; N uni225b ; G 3285
3112
- U 8796 ; WX 838 ; N uni225c ; G 3286
3113
- U 8797 ; WX 838 ; N uni225d ; G 3287
3114
- U 8798 ; WX 838 ; N uni225e ; G 3288
3115
- U 8799 ; WX 838 ; N uni225f ; G 3289
3116
- U 8800 ; WX 838 ; N uni2260 ; G 3290
3117
- U 8801 ; WX 838 ; N uni2261 ; G 3291
3118
  U 8802 ; WX 838 ; N uni2262 ; G 3292
3119
  U 8803 ; WX 838 ; N uni2263 ; G 3293
3120
- U 8804 ; WX 838 ; N uni2264 ; G 3294
3121
- U 8805 ; WX 838 ; N uni2265 ; G 3295
3122
  U 8806 ; WX 838 ; N uni2266 ; G 3296
3123
  U 8807 ; WX 838 ; N uni2267 ; G 3297
3124
  U 8808 ; WX 841 ; N uni2268 ; G 3298
3125
  U 8809 ; WX 841 ; N uni2269 ; G 3299
3126
- U 8810 ; WX 1047 ; N uni226a ; G 3300
3127
- U 8811 ; WX 1047 ; N uni226b ; G 3301
3128
- U 8812 ; WX 500 ; N uni226c ; G 3302
3129
- U 8813 ; WX 838 ; N uni226d ; G 3303
3130
- U 8814 ; WX 838 ; N uni226e ; G 3304
3131
- U 8815 ; WX 838 ; N uni226f ; G 3305
3132
  U 8816 ; WX 838 ; N uni2270 ; G 3306
3133
  U 8817 ; WX 838 ; N uni2271 ; G 3307
3134
  U 8818 ; WX 838 ; N uni2272 ; G 3308
@@ -3139,143 +3336,143 @@ U 8822 ; WX 838 ; N uni2276 ; G 3312
3139
  U 8823 ; WX 838 ; N uni2277 ; G 3313
3140
  U 8824 ; WX 838 ; N uni2278 ; G 3314
3141
  U 8825 ; WX 838 ; N uni2279 ; G 3315
3142
- U 8826 ; WX 838 ; N uni227a ; G 3316
3143
- U 8827 ; WX 838 ; N uni227b ; G 3317
3144
- U 8828 ; WX 838 ; N uni227c ; G 3318
3145
- U 8829 ; WX 838 ; N uni227d ; G 3319
3146
- U 8830 ; WX 838 ; N uni227e ; G 3320
3147
- U 8831 ; WX 838 ; N uni227f ; G 3321
3148
  U 8832 ; WX 838 ; N uni2280 ; G 3322
3149
  U 8833 ; WX 838 ; N uni2281 ; G 3323
3150
- U 8834 ; WX 838 ; N uni2282 ; G 3324
3151
- U 8835 ; WX 838 ; N uni2283 ; G 3325
3152
- U 8836 ; WX 838 ; N uni2284 ; G 3326
3153
  U 8837 ; WX 838 ; N uni2285 ; G 3327
3154
- U 8838 ; WX 838 ; N uni2286 ; G 3328
3155
- U 8839 ; WX 838 ; N uni2287 ; G 3329
3156
  U 8840 ; WX 838 ; N uni2288 ; G 3330
3157
  U 8841 ; WX 838 ; N uni2289 ; G 3331
3158
- U 8842 ; WX 838 ; N uni228a ; G 3332
3159
- U 8843 ; WX 838 ; N uni228b ; G 3333
3160
- U 8844 ; WX 812 ; N uni228c ; G 3334
3161
- U 8845 ; WX 812 ; N uni228d ; G 3335
3162
- U 8846 ; WX 812 ; N uni228e ; G 3336
3163
- U 8847 ; WX 838 ; N uni228f ; G 3337
3164
  U 8848 ; WX 838 ; N uni2290 ; G 3338
3165
  U 8849 ; WX 838 ; N uni2291 ; G 3339
3166
  U 8850 ; WX 838 ; N uni2292 ; G 3340
3167
  U 8851 ; WX 796 ; N uni2293 ; G 3341
3168
  U 8852 ; WX 796 ; N uni2294 ; G 3342
3169
- U 8853 ; WX 838 ; N uni2295 ; G 3343
3170
  U 8854 ; WX 838 ; N uni2296 ; G 3344
3171
- U 8855 ; WX 838 ; N uni2297 ; G 3345
3172
  U 8856 ; WX 838 ; N uni2298 ; G 3346
3173
  U 8857 ; WX 838 ; N uni2299 ; G 3347
3174
- U 8858 ; WX 838 ; N uni229a ; G 3348
3175
- U 8859 ; WX 838 ; N uni229b ; G 3349
3176
- U 8860 ; WX 838 ; N uni229c ; G 3350
3177
- U 8861 ; WX 838 ; N uni229d ; G 3351
3178
- U 8862 ; WX 838 ; N uni229e ; G 3352
3179
- U 8863 ; WX 838 ; N uni229f ; G 3353
3180
- U 8864 ; WX 838 ; N uni22a0 ; G 3354
3181
- U 8865 ; WX 838 ; N uni22a1 ; G 3355
3182
- U 8866 ; WX 914 ; N uni22a2 ; G 3356
3183
- U 8867 ; WX 914 ; N uni22a3 ; G 3357
3184
- U 8868 ; WX 914 ; N uni22a4 ; G 3358
3185
- U 8869 ; WX 914 ; N uni22a5 ; G 3359
3186
- U 8870 ; WX 542 ; N uni22a6 ; G 3360
3187
- U 8871 ; WX 542 ; N uni22a7 ; G 3361
3188
- U 8872 ; WX 914 ; N uni22a8 ; G 3362
3189
- U 8873 ; WX 914 ; N uni22a9 ; G 3363
3190
- U 8874 ; WX 914 ; N uni22aa ; G 3364
3191
- U 8875 ; WX 914 ; N uni22ab ; G 3365
3192
- U 8876 ; WX 914 ; N uni22ac ; G 3366
3193
- U 8877 ; WX 914 ; N uni22ad ; G 3367
3194
- U 8878 ; WX 914 ; N uni22ae ; G 3368
3195
- U 8879 ; WX 914 ; N uni22af ; G 3369
3196
- U 8880 ; WX 838 ; N uni22b0 ; G 3370
3197
- U 8881 ; WX 838 ; N uni22b1 ; G 3371
3198
- U 8882 ; WX 838 ; N uni22b2 ; G 3372
3199
- U 8883 ; WX 838 ; N uni22b3 ; G 3373
3200
- U 8884 ; WX 838 ; N uni22b4 ; G 3374
3201
- U 8885 ; WX 838 ; N uni22b5 ; G 3375
3202
- U 8886 ; WX 1000 ; N uni22b6 ; G 3376
3203
- U 8887 ; WX 1000 ; N uni22b7 ; G 3377
3204
- U 8888 ; WX 838 ; N uni22b8 ; G 3378
3205
- U 8889 ; WX 838 ; N uni22b9 ; G 3379
3206
- U 8890 ; WX 542 ; N uni22ba ; G 3380
3207
- U 8891 ; WX 812 ; N uni22bb ; G 3381
3208
- U 8892 ; WX 812 ; N uni22bc ; G 3382
3209
- U 8893 ; WX 812 ; N uni22bd ; G 3383
3210
- U 8894 ; WX 838 ; N uni22be ; G 3384
3211
- U 8895 ; WX 838 ; N uni22bf ; G 3385
3212
- U 8896 ; WX 843 ; N uni22c0 ; G 3386
3213
- U 8897 ; WX 843 ; N uni22c1 ; G 3387
3214
- U 8898 ; WX 843 ; N uni22c2 ; G 3388
3215
- U 8899 ; WX 843 ; N uni22c3 ; G 3389
3216
- U 8900 ; WX 494 ; N uni22c4 ; G 3390
3217
- U 8901 ; WX 380 ; N uni22c5 ; G 3391
3218
- U 8902 ; WX 626 ; N uni22c6 ; G 3392
3219
- U 8903 ; WX 838 ; N uni22c7 ; G 3393
3220
- U 8904 ; WX 1000 ; N uni22c8 ; G 3394
3221
- U 8905 ; WX 1000 ; N uni22c9 ; G 3395
3222
- U 8906 ; WX 1000 ; N uni22ca ; G 3396
3223
- U 8907 ; WX 1000 ; N uni22cb ; G 3397
3224
- U 8908 ; WX 1000 ; N uni22cc ; G 3398
3225
- U 8909 ; WX 838 ; N uni22cd ; G 3399
3226
- U 8910 ; WX 812 ; N uni22ce ; G 3400
3227
- U 8911 ; WX 812 ; N uni22cf ; G 3401
3228
- U 8912 ; WX 838 ; N uni22d0 ; G 3402
3229
- U 8913 ; WX 838 ; N uni22d1 ; G 3403
3230
- U 8914 ; WX 838 ; N uni22d2 ; G 3404
3231
- U 8915 ; WX 838 ; N uni22d3 ; G 3405
3232
- U 8916 ; WX 838 ; N uni22d4 ; G 3406
3233
- U 8917 ; WX 838 ; N uni22d5 ; G 3407
3234
- U 8918 ; WX 838 ; N uni22d6 ; G 3408
3235
- U 8919 ; WX 838 ; N uni22d7 ; G 3409
3236
- U 8920 ; WX 1422 ; N uni22d8 ; G 3410
3237
- U 8921 ; WX 1422 ; N uni22d9 ; G 3411
3238
- U 8922 ; WX 838 ; N uni22da ; G 3412
3239
- U 8923 ; WX 838 ; N uni22db ; G 3413
3240
- U 8924 ; WX 838 ; N uni22dc ; G 3414
3241
- U 8925 ; WX 838 ; N uni22dd ; G 3415
3242
- U 8926 ; WX 838 ; N uni22de ; G 3416
3243
- U 8927 ; WX 838 ; N uni22df ; G 3417
3244
- U 8928 ; WX 838 ; N uni22e0 ; G 3418
3245
- U 8929 ; WX 838 ; N uni22e1 ; G 3419
3246
- U 8930 ; WX 838 ; N uni22e2 ; G 3420
3247
- U 8931 ; WX 838 ; N uni22e3 ; G 3421
3248
- U 8932 ; WX 838 ; N uni22e4 ; G 3422
3249
- U 8933 ; WX 838 ; N uni22e5 ; G 3423
3250
- U 8934 ; WX 838 ; N uni22e6 ; G 3424
3251
- U 8935 ; WX 838 ; N uni22e7 ; G 3425
3252
- U 8936 ; WX 838 ; N uni22e8 ; G 3426
3253
- U 8937 ; WX 838 ; N uni22e9 ; G 3427
3254
- U 8938 ; WX 838 ; N uni22ea ; G 3428
3255
- U 8939 ; WX 838 ; N uni22eb ; G 3429
3256
- U 8940 ; WX 838 ; N uni22ec ; G 3430
3257
- U 8941 ; WX 838 ; N uni22ed ; G 3431
3258
- U 8942 ; WX 1000 ; N uni22ee ; G 3432
3259
- U 8943 ; WX 1000 ; N uni22ef ; G 3433
3260
- U 8944 ; WX 1000 ; N uni22f0 ; G 3434
3261
- U 8945 ; WX 1000 ; N uni22f1 ; G 3435
3262
- U 8946 ; WX 1158 ; N uni22f2 ; G 3436
3263
- U 8947 ; WX 896 ; N uni22f3 ; G 3437
3264
- U 8948 ; WX 750 ; N uni22f4 ; G 3438
3265
- U 8949 ; WX 896 ; N uni22f5 ; G 3439
3266
- U 8950 ; WX 896 ; N uni22f6 ; G 3440
3267
- U 8951 ; WX 750 ; N uni22f7 ; G 3441
3268
- U 8952 ; WX 896 ; N uni22f8 ; G 3442
3269
- U 8953 ; WX 896 ; N uni22f9 ; G 3443
3270
- U 8954 ; WX 1158 ; N uni22fa ; G 3444
3271
- U 8955 ; WX 896 ; N uni22fb ; G 3445
3272
- U 8956 ; WX 750 ; N uni22fc ; G 3446
3273
- U 8957 ; WX 896 ; N uni22fd ; G 3447
3274
- U 8958 ; WX 750 ; N uni22fe ; G 3448
3275
- U 8959 ; WX 896 ; N uni22ff ; G 3449
3276
  U 8960 ; WX 602 ; N uni2300 ; G 3450
3277
  U 8961 ; WX 602 ; N uni2301 ; G 3451
3278
- U 8962 ; WX 716 ; N uni2302 ; G 3452
3279
  U 8963 ; WX 838 ; N uni2303 ; G 3453
3280
  U 8964 ; WX 838 ; N uni2304 ; G 3454
3281
  U 8965 ; WX 838 ; N uni2305 ; G 3455
@@ -3283,61 +3480,61 @@ U 8966 ; WX 838 ; N uni2306 ; G 3456
3283
  U 8967 ; WX 488 ; N uni2307 ; G 3457
3284
  U 8968 ; WX 457 ; N uni2308 ; G 3458
3285
  U 8969 ; WX 457 ; N uni2309 ; G 3459
3286
- U 8970 ; WX 457 ; N uni230a ; G 3460
3287
- U 8971 ; WX 457 ; N uni230b ; G 3461
3288
- U 8972 ; WX 809 ; N uni230c ; G 3462
3289
- U 8973 ; WX 809 ; N uni230d ; G 3463
3290
- U 8974 ; WX 809 ; N uni230e ; G 3464
3291
- U 8975 ; WX 809 ; N uni230f ; G 3465
3292
- U 8976 ; WX 838 ; N uni2310 ; G 3466
3293
  U 8977 ; WX 539 ; N uni2311 ; G 3467
3294
  U 8984 ; WX 928 ; N uni2318 ; G 3468
3295
  U 8985 ; WX 838 ; N uni2319 ; G 3469
3296
- U 8988 ; WX 469 ; N uni231c ; G 3470
3297
- U 8989 ; WX 469 ; N uni231d ; G 3471
3298
- U 8990 ; WX 469 ; N uni231e ; G 3472
3299
- U 8991 ; WX 469 ; N uni231f ; G 3473
3300
- U 8992 ; WX 610 ; N uni2320 ; G 3474
3301
- U 8993 ; WX 610 ; N uni2321 ; G 3475
3302
  U 8996 ; WX 1152 ; N uni2324 ; G 3476
3303
  U 8997 ; WX 1152 ; N uni2325 ; G 3477
3304
  U 8998 ; WX 1414 ; N uni2326 ; G 3478
3305
  U 8999 ; WX 1152 ; N uni2327 ; G 3479
3306
  U 9000 ; WX 1443 ; N uni2328 ; G 3480
3307
- U 9003 ; WX 1414 ; N uni232b ; G 3481
3308
- U 9004 ; WX 873 ; N uni232c ; G 3482
3309
  U 9075 ; WX 390 ; N uni2373 ; G 3483
3310
  U 9076 ; WX 716 ; N uni2374 ; G 3484
3311
  U 9077 ; WX 869 ; N uni2375 ; G 3485
3312
- U 9082 ; WX 687 ; N uni237a ; G 3486
3313
- U 9085 ; WX 863 ; N uni237d ; G 3487
3314
  U 9095 ; WX 1152 ; N uni2387 ; G 3488
3315
  U 9108 ; WX 873 ; N uni2394 ; G 3489
3316
- U 9115 ; WX 500 ; N uni239b ; G 3490
3317
- U 9116 ; WX 500 ; N uni239c ; G 3491
3318
- U 9117 ; WX 500 ; N uni239d ; G 3492
3319
- U 9118 ; WX 500 ; N uni239e ; G 3493
3320
- U 9119 ; WX 500 ; N uni239f ; G 3494
3321
- U 9120 ; WX 500 ; N uni23a0 ; G 3495
3322
- U 9121 ; WX 500 ; N uni23a1 ; G 3496
3323
- U 9122 ; WX 500 ; N uni23a2 ; G 3497
3324
- U 9123 ; WX 500 ; N uni23a3 ; G 3498
3325
- U 9124 ; WX 500 ; N uni23a4 ; G 3499
3326
- U 9125 ; WX 500 ; N uni23a5 ; G 3500
3327
- U 9126 ; WX 500 ; N uni23a6 ; G 3501
3328
- U 9127 ; WX 750 ; N uni23a7 ; G 3502
3329
- U 9128 ; WX 750 ; N uni23a8 ; G 3503
3330
- U 9129 ; WX 750 ; N uni23a9 ; G 3504
3331
- U 9130 ; WX 750 ; N uni23aa ; G 3505
3332
- U 9131 ; WX 750 ; N uni23ab ; G 3506
3333
- U 9132 ; WX 750 ; N uni23ac ; G 3507
3334
- U 9133 ; WX 750 ; N uni23ad ; G 3508
3335
- U 9134 ; WX 610 ; N uni23ae ; G 3509
3336
- U 9166 ; WX 838 ; N uni23ce ; G 3510
3337
- U 9167 ; WX 945 ; N uni23cf ; G 3511
3338
- U 9187 ; WX 873 ; N uni23e3 ; G 3512
3339
- U 9189 ; WX 769 ; N uni23e5 ; G 3513
3340
- U 9192 ; WX 696 ; N uni23e8 ; G 3514
3341
  U 9250 ; WX 716 ; N uni2422 ; G 3515
3342
  U 9251 ; WX 716 ; N uni2423 ; G 3516
3343
  U 9312 ; WX 847 ; N uni2460 ; G 3517
@@ -3350,134 +3547,134 @@ U 9318 ; WX 847 ; N uni2466 ; G 3523
3350
  U 9319 ; WX 847 ; N uni2467 ; G 3524
3351
  U 9320 ; WX 847 ; N uni2468 ; G 3525
3352
  U 9321 ; WX 847 ; N uni2469 ; G 3526
3353
- U 9600 ; WX 769 ; N uni2580 ; G 3527
3354
  U 9601 ; WX 769 ; N uni2581 ; G 3528
3355
  U 9602 ; WX 769 ; N uni2582 ; G 3529
3356
  U 9603 ; WX 769 ; N uni2583 ; G 3530
3357
- U 9604 ; WX 769 ; N uni2584 ; G 3531
3358
  U 9605 ; WX 769 ; N uni2585 ; G 3532
3359
  U 9606 ; WX 769 ; N uni2586 ; G 3533
3360
  U 9607 ; WX 769 ; N uni2587 ; G 3534
3361
- U 9608 ; WX 769 ; N uni2588 ; G 3535
3362
  U 9609 ; WX 769 ; N uni2589 ; G 3536
3363
- U 9610 ; WX 769 ; N uni258a ; G 3537
3364
- U 9611 ; WX 769 ; N uni258b ; G 3538
3365
- U 9612 ; WX 769 ; N uni258c ; G 3539
3366
- U 9613 ; WX 769 ; N uni258d ; G 3540
3367
- U 9614 ; WX 769 ; N uni258e ; G 3541
3368
- U 9615 ; WX 769 ; N uni258f ; G 3542
3369
- U 9616 ; WX 769 ; N uni2590 ; G 3543
3370
- U 9617 ; WX 769 ; N uni2591 ; G 3544
3371
- U 9618 ; WX 769 ; N uni2592 ; G 3545
3372
- U 9619 ; WX 769 ; N uni2593 ; G 3546
3373
  U 9620 ; WX 769 ; N uni2594 ; G 3547
3374
  U 9621 ; WX 769 ; N uni2595 ; G 3548
3375
  U 9622 ; WX 769 ; N uni2596 ; G 3549
3376
  U 9623 ; WX 769 ; N uni2597 ; G 3550
3377
  U 9624 ; WX 769 ; N uni2598 ; G 3551
3378
  U 9625 ; WX 769 ; N uni2599 ; G 3552
3379
- U 9626 ; WX 769 ; N uni259a ; G 3553
3380
- U 9627 ; WX 769 ; N uni259b ; G 3554
3381
- U 9628 ; WX 769 ; N uni259c ; G 3555
3382
- U 9629 ; WX 769 ; N uni259d ; G 3556
3383
- U 9630 ; WX 769 ; N uni259e ; G 3557
3384
- U 9631 ; WX 769 ; N uni259f ; G 3558
3385
- U 9632 ; WX 945 ; N uni25a0 ; G 3559
3386
- U 9633 ; WX 945 ; N uni25a1 ; G 3560
3387
- U 9634 ; WX 945 ; N uni25a2 ; G 3561
3388
- U 9635 ; WX 945 ; N uni25a3 ; G 3562
3389
- U 9636 ; WX 945 ; N uni25a4 ; G 3563
3390
- U 9637 ; WX 945 ; N uni25a5 ; G 3564
3391
- U 9638 ; WX 945 ; N uni25a6 ; G 3565
3392
- U 9639 ; WX 945 ; N uni25a7 ; G 3566
3393
- U 9640 ; WX 945 ; N uni25a8 ; G 3567
3394
- U 9641 ; WX 945 ; N uni25a9 ; G 3568
3395
- U 9642 ; WX 678 ; N uni25aa ; G 3569
3396
- U 9643 ; WX 678 ; N uni25ab ; G 3570
3397
- U 9644 ; WX 945 ; N uni25ac ; G 3571
3398
- U 9645 ; WX 945 ; N uni25ad ; G 3572
3399
- U 9646 ; WX 550 ; N uni25ae ; G 3573
3400
- U 9647 ; WX 550 ; N uni25af ; G 3574
3401
- U 9648 ; WX 769 ; N uni25b0 ; G 3575
3402
- U 9649 ; WX 769 ; N uni25b1 ; G 3576
3403
- U 9650 ; WX 769 ; N uni25b2 ; G 3577
3404
- U 9651 ; WX 769 ; N uni25b3 ; G 3578
3405
- U 9652 ; WX 502 ; N uni25b4 ; G 3579
3406
- U 9653 ; WX 502 ; N uni25b5 ; G 3580
3407
- U 9654 ; WX 769 ; N uni25b6 ; G 3581
3408
- U 9655 ; WX 769 ; N uni25b7 ; G 3582
3409
- U 9656 ; WX 502 ; N uni25b8 ; G 3583
3410
- U 9657 ; WX 502 ; N uni25b9 ; G 3584
3411
- U 9658 ; WX 769 ; N uni25ba ; G 3585
3412
- U 9659 ; WX 769 ; N uni25bb ; G 3586
3413
- U 9660 ; WX 769 ; N uni25bc ; G 3587
3414
- U 9661 ; WX 769 ; N uni25bd ; G 3588
3415
- U 9662 ; WX 502 ; N uni25be ; G 3589
3416
- U 9663 ; WX 502 ; N uni25bf ; G 3590
3417
- U 9664 ; WX 769 ; N uni25c0 ; G 3591
3418
- U 9665 ; WX 769 ; N uni25c1 ; G 3592
3419
- U 9666 ; WX 502 ; N uni25c2 ; G 3593
3420
- U 9667 ; WX 502 ; N uni25c3 ; G 3594
3421
- U 9668 ; WX 769 ; N uni25c4 ; G 3595
3422
- U 9669 ; WX 769 ; N uni25c5 ; G 3596
3423
- U 9670 ; WX 769 ; N uni25c6 ; G 3597
3424
- U 9671 ; WX 769 ; N uni25c7 ; G 3598
3425
- U 9672 ; WX 769 ; N uni25c8 ; G 3599
3426
- U 9673 ; WX 873 ; N uni25c9 ; G 3600
3427
- U 9674 ; WX 494 ; N uni25ca ; G 3601
3428
- U 9675 ; WX 873 ; N uni25cb ; G 3602
3429
- U 9676 ; WX 873 ; N uni25cc ; G 3603
3430
- U 9677 ; WX 873 ; N uni25cd ; G 3604
3431
- U 9678 ; WX 873 ; N uni25ce ; G 3605
3432
- U 9679 ; WX 873 ; N uni25cf ; G 3606
3433
- U 9680 ; WX 873 ; N uni25d0 ; G 3607
3434
- U 9681 ; WX 873 ; N uni25d1 ; G 3608
3435
- U 9682 ; WX 873 ; N uni25d2 ; G 3609
3436
- U 9683 ; WX 873 ; N uni25d3 ; G 3610
3437
- U 9684 ; WX 873 ; N uni25d4 ; G 3611
3438
- U 9685 ; WX 873 ; N uni25d5 ; G 3612
3439
- U 9686 ; WX 527 ; N uni25d6 ; G 3613
3440
- U 9687 ; WX 527 ; N uni25d7 ; G 3614
3441
- U 9688 ; WX 840 ; N uni25d8 ; G 3615
3442
- U 9689 ; WX 970 ; N uni25d9 ; G 3616
3443
- U 9690 ; WX 970 ; N uni25da ; G 3617
3444
- U 9691 ; WX 970 ; N uni25db ; G 3618
3445
- U 9692 ; WX 387 ; N uni25dc ; G 3619
3446
- U 9693 ; WX 387 ; N uni25dd ; G 3620
3447
- U 9694 ; WX 387 ; N uni25de ; G 3621
3448
- U 9695 ; WX 387 ; N uni25df ; G 3622
3449
- U 9696 ; WX 769 ; N uni25e0 ; G 3623
3450
- U 9697 ; WX 769 ; N uni25e1 ; G 3624
3451
- U 9698 ; WX 769 ; N uni25e2 ; G 3625
3452
- U 9699 ; WX 769 ; N uni25e3 ; G 3626
3453
- U 9700 ; WX 769 ; N uni25e4 ; G 3627
3454
- U 9701 ; WX 769 ; N uni25e5 ; G 3628
3455
- U 9702 ; WX 639 ; N uni25e6 ; G 3629
3456
- U 9703 ; WX 945 ; N uni25e7 ; G 3630
3457
- U 9704 ; WX 945 ; N uni25e8 ; G 3631
3458
- U 9705 ; WX 945 ; N uni25e9 ; G 3632
3459
- U 9706 ; WX 945 ; N uni25ea ; G 3633
3460
- U 9707 ; WX 945 ; N uni25eb ; G 3634
3461
- U 9708 ; WX 769 ; N uni25ec ; G 3635
3462
- U 9709 ; WX 769 ; N uni25ed ; G 3636
3463
- U 9710 ; WX 769 ; N uni25ee ; G 3637
3464
- U 9711 ; WX 1119 ; N uni25ef ; G 3638
3465
- U 9712 ; WX 945 ; N uni25f0 ; G 3639
3466
- U 9713 ; WX 945 ; N uni25f1 ; G 3640
3467
- U 9714 ; WX 945 ; N uni25f2 ; G 3641
3468
- U 9715 ; WX 945 ; N uni25f3 ; G 3642
3469
- U 9716 ; WX 873 ; N uni25f4 ; G 3643
3470
- U 9717 ; WX 873 ; N uni25f5 ; G 3644
3471
- U 9718 ; WX 873 ; N uni25f6 ; G 3645
3472
- U 9719 ; WX 873 ; N uni25f7 ; G 3646
3473
- U 9720 ; WX 769 ; N uni25f8 ; G 3647
3474
- U 9721 ; WX 769 ; N uni25f9 ; G 3648
3475
- U 9722 ; WX 769 ; N uni25fa ; G 3649
3476
- U 9723 ; WX 830 ; N uni25fb ; G 3650
3477
- U 9724 ; WX 830 ; N uni25fc ; G 3651
3478
- U 9725 ; WX 732 ; N uni25fd ; G 3652
3479
- U 9726 ; WX 732 ; N uni25fe ; G 3653
3480
- U 9727 ; WX 769 ; N uni25ff ; G 3654
3481
  U 9728 ; WX 896 ; N uni2600 ; G 3655
3482
  U 9729 ; WX 1000 ; N uni2601 ; G 3656
3483
  U 9730 ; WX 896 ; N uni2602 ; G 3657
@@ -3488,12 +3685,12 @@ U 9734 ; WX 896 ; N uni2606 ; G 3661
3488
  U 9735 ; WX 573 ; N uni2607 ; G 3662
3489
  U 9736 ; WX 896 ; N uni2608 ; G 3663
3490
  U 9737 ; WX 896 ; N uni2609 ; G 3664
3491
- U 9738 ; WX 888 ; N uni260a ; G 3665
3492
- U 9739 ; WX 888 ; N uni260b ; G 3666
3493
- U 9740 ; WX 671 ; N uni260c ; G 3667
3494
- U 9741 ; WX 1013 ; N uni260d ; G 3668
3495
- U 9742 ; WX 1246 ; N uni260e ; G 3669
3496
- U 9743 ; WX 1250 ; N uni260f ; G 3670
3497
  U 9744 ; WX 896 ; N uni2610 ; G 3671
3498
  U 9745 ; WX 896 ; N uni2611 ; G 3672
3499
  U 9746 ; WX 896 ; N uni2612 ; G 3673
@@ -3504,12 +3701,12 @@ U 9750 ; WX 896 ; N uni2616 ; G 3677
3504
  U 9751 ; WX 896 ; N uni2617 ; G 3678
3505
  U 9752 ; WX 896 ; N uni2618 ; G 3679
3506
  U 9753 ; WX 896 ; N uni2619 ; G 3680
3507
- U 9754 ; WX 896 ; N uni261a ; G 3681
3508
- U 9755 ; WX 896 ; N uni261b ; G 3682
3509
- U 9756 ; WX 896 ; N uni261c ; G 3683
3510
- U 9757 ; WX 609 ; N uni261d ; G 3684
3511
- U 9758 ; WX 896 ; N uni261e ; G 3685
3512
- U 9759 ; WX 609 ; N uni261f ; G 3686
3513
  U 9760 ; WX 896 ; N uni2620 ; G 3687
3514
  U 9761 ; WX 896 ; N uni2621 ; G 3688
3515
  U 9762 ; WX 896 ; N uni2622 ; G 3689
@@ -3520,12 +3717,12 @@ U 9766 ; WX 649 ; N uni2626 ; G 3693
3520
  U 9767 ; WX 784 ; N uni2627 ; G 3694
3521
  U 9768 ; WX 545 ; N uni2628 ; G 3695
3522
  U 9769 ; WX 896 ; N uni2629 ; G 3696
3523
- U 9770 ; WX 896 ; N uni262a ; G 3697
3524
- U 9771 ; WX 896 ; N uni262b ; G 3698
3525
- U 9772 ; WX 710 ; N uni262c ; G 3699
3526
- U 9773 ; WX 896 ; N uni262d ; G 3700
3527
- U 9774 ; WX 896 ; N uni262e ; G 3701
3528
- U 9775 ; WX 896 ; N uni262f ; G 3702
3529
  U 9776 ; WX 896 ; N uni2630 ; G 3703
3530
  U 9777 ; WX 896 ; N uni2631 ; G 3704
3531
  U 9778 ; WX 896 ; N uni2632 ; G 3705
@@ -3536,15 +3733,15 @@ U 9782 ; WX 896 ; N uni2636 ; G 3709
3536
  U 9783 ; WX 896 ; N uni2637 ; G 3710
3537
  U 9784 ; WX 896 ; N uni2638 ; G 3711
3538
  U 9785 ; WX 896 ; N uni2639 ; G 3712
3539
- U 9786 ; WX 896 ; N uni263a ; G 3713
3540
- U 9787 ; WX 896 ; N uni263b ; G 3714
3541
- U 9788 ; WX 896 ; N uni263c ; G 3715
3542
- U 9789 ; WX 896 ; N uni263d ; G 3716
3543
- U 9790 ; WX 896 ; N uni263e ; G 3717
3544
- U 9791 ; WX 614 ; N uni263f ; G 3718
3545
- U 9792 ; WX 732 ; N uni2640 ; G 3719
3546
  U 9793 ; WX 732 ; N uni2641 ; G 3720
3547
- U 9794 ; WX 896 ; N uni2642 ; G 3721
3548
  U 9795 ; WX 896 ; N uni2643 ; G 3722
3549
  U 9796 ; WX 896 ; N uni2644 ; G 3723
3550
  U 9797 ; WX 896 ; N uni2645 ; G 3724
@@ -3552,12 +3749,12 @@ U 9798 ; WX 896 ; N uni2646 ; G 3725
3552
  U 9799 ; WX 896 ; N uni2647 ; G 3726
3553
  U 9800 ; WX 896 ; N uni2648 ; G 3727
3554
  U 9801 ; WX 896 ; N uni2649 ; G 3728
3555
- U 9802 ; WX 896 ; N uni264a ; G 3729
3556
- U 9803 ; WX 896 ; N uni264b ; G 3730
3557
- U 9804 ; WX 896 ; N uni264c ; G 3731
3558
- U 9805 ; WX 896 ; N uni264d ; G 3732
3559
- U 9806 ; WX 896 ; N uni264e ; G 3733
3560
- U 9807 ; WX 896 ; N uni264f ; G 3734
3561
  U 9808 ; WX 896 ; N uni2650 ; G 3735
3562
  U 9809 ; WX 896 ; N uni2651 ; G 3736
3563
  U 9810 ; WX 896 ; N uni2652 ; G 3737
@@ -3568,28 +3765,28 @@ U 9814 ; WX 896 ; N uni2656 ; G 3741
3568
  U 9815 ; WX 896 ; N uni2657 ; G 3742
3569
  U 9816 ; WX 896 ; N uni2658 ; G 3743
3570
  U 9817 ; WX 896 ; N uni2659 ; G 3744
3571
- U 9818 ; WX 896 ; N uni265a ; G 3745
3572
- U 9819 ; WX 896 ; N uni265b ; G 3746
3573
- U 9820 ; WX 896 ; N uni265c ; G 3747
3574
- U 9821 ; WX 896 ; N uni265d ; G 3748
3575
- U 9822 ; WX 896 ; N uni265e ; G 3749
3576
- U 9823 ; WX 896 ; N uni265f ; G 3750
3577
- U 9824 ; WX 896 ; N uni2660 ; G 3751
3578
  U 9825 ; WX 896 ; N uni2661 ; G 3752
3579
  U 9826 ; WX 896 ; N uni2662 ; G 3753
3580
- U 9827 ; WX 896 ; N uni2663 ; G 3754
3581
  U 9828 ; WX 896 ; N uni2664 ; G 3755
3582
- U 9829 ; WX 896 ; N uni2665 ; G 3756
3583
- U 9830 ; WX 896 ; N uni2666 ; G 3757
3584
  U 9831 ; WX 896 ; N uni2667 ; G 3758
3585
  U 9832 ; WX 896 ; N uni2668 ; G 3759
3586
  U 9833 ; WX 472 ; N uni2669 ; G 3760
3587
- U 9834 ; WX 638 ; N uni266a ; G 3761
3588
- U 9835 ; WX 896 ; N uni266b ; G 3762
3589
- U 9836 ; WX 896 ; N uni266c ; G 3763
3590
- U 9837 ; WX 472 ; N uni266d ; G 3764
3591
- U 9838 ; WX 357 ; N uni266e ; G 3765
3592
- U 9839 ; WX 484 ; N uni266f ; G 3766
3593
  U 9840 ; WX 748 ; N uni2670 ; G 3767
3594
  U 9841 ; WX 766 ; N uni2671 ; G 3768
3595
  U 9842 ; WX 896 ; N uni2672 ; G 3769
@@ -3600,12 +3797,12 @@ U 9846 ; WX 896 ; N uni2676 ; G 3773
3600
  U 9847 ; WX 896 ; N uni2677 ; G 3774
3601
  U 9848 ; WX 896 ; N uni2678 ; G 3775
3602
  U 9849 ; WX 896 ; N uni2679 ; G 3776
3603
- U 9850 ; WX 896 ; N uni267a ; G 3777
3604
- U 9851 ; WX 896 ; N uni267b ; G 3778
3605
- U 9852 ; WX 896 ; N uni267c ; G 3779
3606
- U 9853 ; WX 896 ; N uni267d ; G 3780
3607
- U 9854 ; WX 896 ; N uni267e ; G 3781
3608
- U 9855 ; WX 896 ; N uni267f ; G 3782
3609
  U 9856 ; WX 869 ; N uni2680 ; G 3783
3610
  U 9857 ; WX 869 ; N uni2681 ; G 3784
3611
  U 9858 ; WX 869 ; N uni2682 ; G 3785
@@ -3616,12 +3813,12 @@ U 9862 ; WX 896 ; N uni2686 ; G 3789
3616
  U 9863 ; WX 896 ; N uni2687 ; G 3790
3617
  U 9864 ; WX 896 ; N uni2688 ; G 3791
3618
  U 9865 ; WX 896 ; N uni2689 ; G 3792
3619
- U 9866 ; WX 896 ; N uni268a ; G 3793
3620
- U 9867 ; WX 896 ; N uni268b ; G 3794
3621
- U 9868 ; WX 896 ; N uni268c ; G 3795
3622
- U 9869 ; WX 896 ; N uni268d ; G 3796
3623
- U 9870 ; WX 896 ; N uni268e ; G 3797
3624
- U 9871 ; WX 896 ; N uni268f ; G 3798
3625
  U 9872 ; WX 896 ; N uni2690 ; G 3799
3626
  U 9873 ; WX 896 ; N uni2691 ; G 3800
3627
  U 9874 ; WX 896 ; N uni2692 ; G 3801
@@ -3632,38 +3829,38 @@ U 9878 ; WX 896 ; N uni2696 ; G 3805
3632
  U 9879 ; WX 896 ; N uni2697 ; G 3806
3633
  U 9880 ; WX 896 ; N uni2698 ; G 3807
3634
  U 9881 ; WX 896 ; N uni2699 ; G 3808
3635
- U 9882 ; WX 896 ; N uni269a ; G 3809
3636
- U 9883 ; WX 896 ; N uni269b ; G 3810
3637
- U 9884 ; WX 896 ; N uni269c ; G 3811
3638
- U 9888 ; WX 896 ; N uni26a0 ; G 3812
3639
- U 9889 ; WX 702 ; N uni26a1 ; G 3813
3640
- U 9890 ; WX 1004 ; N uni26a2 ; G 3814
3641
- U 9891 ; WX 1089 ; N uni26a3 ; G 3815
3642
- U 9892 ; WX 1175 ; N uni26a4 ; G 3816
3643
- U 9893 ; WX 903 ; N uni26a5 ; G 3817
3644
- U 9894 ; WX 838 ; N uni26a6 ; G 3818
3645
- U 9895 ; WX 838 ; N uni26a7 ; G 3819
3646
- U 9896 ; WX 838 ; N uni26a8 ; G 3820
3647
- U 9897 ; WX 838 ; N uni26a9 ; G 3821
3648
- U 9898 ; WX 838 ; N uni26aa ; G 3822
3649
- U 9899 ; WX 838 ; N uni26ab ; G 3823
3650
- U 9900 ; WX 838 ; N uni26ac ; G 3824
3651
- U 9901 ; WX 838 ; N uni26ad ; G 3825
3652
- U 9902 ; WX 838 ; N uni26ae ; G 3826
3653
- U 9903 ; WX 838 ; N uni26af ; G 3827
3654
- U 9904 ; WX 844 ; N uni26b0 ; G 3828
3655
- U 9905 ; WX 838 ; N uni26b1 ; G 3829
3656
- U 9906 ; WX 732 ; N uni26b2 ; G 3830
3657
- U 9907 ; WX 732 ; N uni26b3 ; G 3831
3658
- U 9908 ; WX 732 ; N uni26b4 ; G 3832
3659
- U 9909 ; WX 732 ; N uni26b5 ; G 3833
3660
- U 9910 ; WX 850 ; N uni26b6 ; G 3834
3661
- U 9911 ; WX 732 ; N uni26b7 ; G 3835
3662
- U 9912 ; WX 732 ; N uni26b8 ; G 3836
3663
- U 9920 ; WX 838 ; N uni26c0 ; G 3837
3664
- U 9921 ; WX 838 ; N uni26c1 ; G 3838
3665
- U 9922 ; WX 838 ; N uni26c2 ; G 3839
3666
- U 9923 ; WX 838 ; N uni26c3 ; G 3840
3667
  U 9985 ; WX 838 ; N uni2701 ; G 3841
3668
  U 9986 ; WX 838 ; N uni2702 ; G 3842
3669
  U 9987 ; WX 838 ; N uni2703 ; G 3843
@@ -3672,10 +3869,10 @@ U 9990 ; WX 838 ; N uni2706 ; G 3845
3672
  U 9991 ; WX 838 ; N uni2707 ; G 3846
3673
  U 9992 ; WX 838 ; N uni2708 ; G 3847
3674
  U 9993 ; WX 838 ; N uni2709 ; G 3848
3675
- U 9996 ; WX 838 ; N uni270c ; G 3849
3676
- U 9997 ; WX 838 ; N uni270d ; G 3850
3677
- U 9998 ; WX 838 ; N uni270e ; G 3851
3678
- U 9999 ; WX 838 ; N uni270f ; G 3852
3679
  U 10000 ; WX 838 ; N uni2710 ; G 3853
3680
  U 10001 ; WX 838 ; N uni2711 ; G 3854
3681
  U 10002 ; WX 838 ; N uni2712 ; G 3855
@@ -3686,12 +3883,12 @@ U 10006 ; WX 838 ; N uni2716 ; G 3859
3686
  U 10007 ; WX 838 ; N uni2717 ; G 3860
3687
  U 10008 ; WX 838 ; N uni2718 ; G 3861
3688
  U 10009 ; WX 838 ; N uni2719 ; G 3862
3689
- U 10010 ; WX 838 ; N uni271a ; G 3863
3690
- U 10011 ; WX 838 ; N uni271b ; G 3864
3691
- U 10012 ; WX 838 ; N uni271c ; G 3865
3692
- U 10013 ; WX 838 ; N uni271d ; G 3866
3693
- U 10014 ; WX 838 ; N uni271e ; G 3867
3694
- U 10015 ; WX 838 ; N uni271f ; G 3868
3695
  U 10016 ; WX 838 ; N uni2720 ; G 3869
3696
  U 10017 ; WX 838 ; N uni2721 ; G 3870
3697
  U 10018 ; WX 838 ; N uni2722 ; G 3871
@@ -3701,12 +3898,12 @@ U 10021 ; WX 838 ; N uni2725 ; G 3874
3701
  U 10022 ; WX 838 ; N uni2726 ; G 3875
3702
  U 10023 ; WX 838 ; N uni2727 ; G 3876
3703
  U 10025 ; WX 838 ; N uni2729 ; G 3877
3704
- U 10026 ; WX 838 ; N uni272a ; G 3878
3705
- U 10027 ; WX 838 ; N uni272b ; G 3879
3706
- U 10028 ; WX 838 ; N uni272c ; G 3880
3707
- U 10029 ; WX 838 ; N uni272d ; G 3881
3708
- U 10030 ; WX 838 ; N uni272e ; G 3882
3709
- U 10031 ; WX 838 ; N uni272f ; G 3883
3710
  U 10032 ; WX 838 ; N uni2730 ; G 3884
3711
  U 10033 ; WX 838 ; N uni2731 ; G 3885
3712
  U 10034 ; WX 838 ; N uni2732 ; G 3886
@@ -3717,12 +3914,12 @@ U 10038 ; WX 838 ; N uni2736 ; G 3890
3717
  U 10039 ; WX 838 ; N uni2737 ; G 3891
3718
  U 10040 ; WX 838 ; N uni2738 ; G 3892
3719
  U 10041 ; WX 838 ; N uni2739 ; G 3893
3720
- U 10042 ; WX 838 ; N uni273a ; G 3894
3721
- U 10043 ; WX 838 ; N uni273b ; G 3895
3722
- U 10044 ; WX 838 ; N uni273c ; G 3896
3723
- U 10045 ; WX 838 ; N uni273d ; G 3897
3724
- U 10046 ; WX 838 ; N uni273e ; G 3898
3725
- U 10047 ; WX 838 ; N uni273f ; G 3899
3726
  U 10048 ; WX 838 ; N uni2740 ; G 3900
3727
  U 10049 ; WX 838 ; N uni2741 ; G 3901
3728
  U 10050 ; WX 838 ; N uni2742 ; G 3902
@@ -3733,21 +3930,21 @@ U 10054 ; WX 838 ; N uni2746 ; G 3906
3733
  U 10055 ; WX 838 ; N uni2747 ; G 3907
3734
  U 10056 ; WX 838 ; N uni2748 ; G 3908
3735
  U 10057 ; WX 838 ; N uni2749 ; G 3909
3736
- U 10058 ; WX 838 ; N uni274a ; G 3910
3737
- U 10059 ; WX 838 ; N uni274b ; G 3911
3738
- U 10061 ; WX 896 ; N uni274d ; G 3912
3739
- U 10063 ; WX 896 ; N uni274f ; G 3913
3740
  U 10064 ; WX 896 ; N uni2750 ; G 3914
3741
  U 10065 ; WX 896 ; N uni2751 ; G 3915
3742
  U 10066 ; WX 896 ; N uni2752 ; G 3916
3743
  U 10070 ; WX 896 ; N uni2756 ; G 3917
3744
  U 10072 ; WX 838 ; N uni2758 ; G 3918
3745
  U 10073 ; WX 838 ; N uni2759 ; G 3919
3746
- U 10074 ; WX 838 ; N uni275a ; G 3920
3747
- U 10075 ; WX 347 ; N uni275b ; G 3921
3748
- U 10076 ; WX 347 ; N uni275c ; G 3922
3749
- U 10077 ; WX 587 ; N uni275d ; G 3923
3750
- U 10078 ; WX 587 ; N uni275e ; G 3924
3751
  U 10081 ; WX 838 ; N uni2761 ; G 3925
3752
  U 10082 ; WX 838 ; N uni2762 ; G 3926
3753
  U 10083 ; WX 838 ; N uni2763 ; G 3927
@@ -3757,12 +3954,12 @@ U 10086 ; WX 838 ; N uni2766 ; G 3930
3757
  U 10087 ; WX 838 ; N uni2767 ; G 3931
3758
  U 10088 ; WX 838 ; N uni2768 ; G 3932
3759
  U 10089 ; WX 838 ; N uni2769 ; G 3933
3760
- U 10090 ; WX 838 ; N uni276a ; G 3934
3761
- U 10091 ; WX 838 ; N uni276b ; G 3935
3762
- U 10092 ; WX 838 ; N uni276c ; G 3936
3763
- U 10093 ; WX 838 ; N uni276d ; G 3937
3764
- U 10094 ; WX 838 ; N uni276e ; G 3938
3765
- U 10095 ; WX 838 ; N uni276f ; G 3939
3766
  U 10096 ; WX 838 ; N uni2770 ; G 3940
3767
  U 10097 ; WX 838 ; N uni2771 ; G 3941
3768
  U 10098 ; WX 838 ; N uni2772 ; G 3942
@@ -3773,12 +3970,12 @@ U 10102 ; WX 847 ; N uni2776 ; G 3946
3773
  U 10103 ; WX 847 ; N uni2777 ; G 3947
3774
  U 10104 ; WX 847 ; N uni2778 ; G 3948
3775
  U 10105 ; WX 847 ; N uni2779 ; G 3949
3776
- U 10106 ; WX 847 ; N uni277a ; G 3950
3777
- U 10107 ; WX 847 ; N uni277b ; G 3951
3778
- U 10108 ; WX 847 ; N uni277c ; G 3952
3779
- U 10109 ; WX 847 ; N uni277d ; G 3953
3780
- U 10110 ; WX 847 ; N uni277e ; G 3954
3781
- U 10111 ; WX 847 ; N uni277f ; G 3955
3782
  U 10112 ; WX 838 ; N uni2780 ; G 3956
3783
  U 10113 ; WX 838 ; N uni2781 ; G 3957
3784
  U 10114 ; WX 838 ; N uni2782 ; G 3958
@@ -3789,12 +3986,12 @@ U 10118 ; WX 838 ; N uni2786 ; G 3962
3789
  U 10119 ; WX 838 ; N uni2787 ; G 3963
3790
  U 10120 ; WX 838 ; N uni2788 ; G 3964
3791
  U 10121 ; WX 838 ; N uni2789 ; G 3965
3792
- U 10122 ; WX 838 ; N uni278a ; G 3966
3793
- U 10123 ; WX 838 ; N uni278b ; G 3967
3794
- U 10124 ; WX 838 ; N uni278c ; G 3968
3795
- U 10125 ; WX 838 ; N uni278d ; G 3969
3796
- U 10126 ; WX 838 ; N uni278e ; G 3970
3797
- U 10127 ; WX 838 ; N uni278f ; G 3971
3798
  U 10128 ; WX 838 ; N uni2790 ; G 3972
3799
  U 10129 ; WX 838 ; N uni2791 ; G 3973
3800
  U 10130 ; WX 838 ; N uni2792 ; G 3974
@@ -3802,67 +3999,67 @@ U 10131 ; WX 838 ; N uni2793 ; G 3975
3802
  U 10132 ; WX 838 ; N uni2794 ; G 3976
3803
  U 10136 ; WX 838 ; N uni2798 ; G 3977
3804
  U 10137 ; WX 838 ; N uni2799 ; G 3978
3805
- U 10138 ; WX 838 ; N uni279a ; G 3979
3806
- U 10139 ; WX 838 ; N uni279b ; G 3980
3807
- U 10140 ; WX 838 ; N uni279c ; G 3981
3808
- U 10141 ; WX 838 ; N uni279d ; G 3982
3809
- U 10142 ; WX 838 ; N uni279e ; G 3983
3810
- U 10143 ; WX 838 ; N uni279f ; G 3984
3811
- U 10144 ; WX 838 ; N uni27a0 ; G 3985
3812
- U 10145 ; WX 838 ; N uni27a1 ; G 3986
3813
- U 10146 ; WX 838 ; N uni27a2 ; G 3987
3814
- U 10147 ; WX 838 ; N uni27a3 ; G 3988
3815
- U 10148 ; WX 838 ; N uni27a4 ; G 3989
3816
- U 10149 ; WX 838 ; N uni27a5 ; G 3990
3817
- U 10150 ; WX 838 ; N uni27a6 ; G 3991
3818
- U 10151 ; WX 838 ; N uni27a7 ; G 3992
3819
- U 10152 ; WX 838 ; N uni27a8 ; G 3993
3820
- U 10153 ; WX 838 ; N uni27a9 ; G 3994
3821
- U 10154 ; WX 838 ; N uni27aa ; G 3995
3822
- U 10155 ; WX 838 ; N uni27ab ; G 3996
3823
- U 10156 ; WX 838 ; N uni27ac ; G 3997
3824
- U 10157 ; WX 838 ; N uni27ad ; G 3998
3825
- U 10158 ; WX 838 ; N uni27ae ; G 3999
3826
- U 10159 ; WX 838 ; N uni27af ; G 4000
3827
- U 10161 ; WX 838 ; N uni27b1 ; G 4001
3828
- U 10162 ; WX 838 ; N uni27b2 ; G 4002
3829
- U 10163 ; WX 838 ; N uni27b3 ; G 4003
3830
- U 10164 ; WX 838 ; N uni27b4 ; G 4004
3831
- U 10165 ; WX 838 ; N uni27b5 ; G 4005
3832
- U 10166 ; WX 838 ; N uni27b6 ; G 4006
3833
- U 10167 ; WX 838 ; N uni27b7 ; G 4007
3834
- U 10168 ; WX 838 ; N uni27b8 ; G 4008
3835
- U 10169 ; WX 838 ; N uni27b9 ; G 4009
3836
- U 10170 ; WX 838 ; N uni27ba ; G 4010
3837
- U 10171 ; WX 838 ; N uni27bb ; G 4011
3838
- U 10172 ; WX 838 ; N uni27bc ; G 4012
3839
- U 10173 ; WX 838 ; N uni27bd ; G 4013
3840
- U 10174 ; WX 838 ; N uni27be ; G 4014
3841
- U 10181 ; WX 457 ; N uni27c5 ; G 4015
3842
- U 10182 ; WX 457 ; N uni27c6 ; G 4016
3843
- U 10208 ; WX 494 ; N uni27e0 ; G 4017
3844
- U 10214 ; WX 487 ; N uni27e6 ; G 4018
3845
- U 10215 ; WX 487 ; N uni27e7 ; G 4019
3846
- U 10216 ; WX 457 ; N uni27e8 ; G 4020
3847
- U 10217 ; WX 457 ; N uni27e9 ; G 4021
3848
- U 10218 ; WX 721 ; N uni27ea ; G 4022
3849
- U 10219 ; WX 721 ; N uni27eb ; G 4023
3850
- U 10224 ; WX 838 ; N uni27f0 ; G 4024
3851
- U 10225 ; WX 838 ; N uni27f1 ; G 4025
3852
- U 10226 ; WX 838 ; N uni27f2 ; G 4026
3853
- U 10227 ; WX 838 ; N uni27f3 ; G 4027
3854
- U 10228 ; WX 1157 ; N uni27f4 ; G 4028
3855
- U 10229 ; WX 1434 ; N uni27f5 ; G 4029
3856
- U 10230 ; WX 1434 ; N uni27f6 ; G 4030
3857
- U 10231 ; WX 1434 ; N uni27f7 ; G 4031
3858
- U 10232 ; WX 1434 ; N uni27f8 ; G 4032
3859
- U 10233 ; WX 1434 ; N uni27f9 ; G 4033
3860
- U 10234 ; WX 1434 ; N uni27fa ; G 4034
3861
- U 10235 ; WX 1434 ; N uni27fb ; G 4035
3862
- U 10236 ; WX 1434 ; N uni27fc ; G 4036
3863
- U 10237 ; WX 1434 ; N uni27fd ; G 4037
3864
- U 10238 ; WX 1434 ; N uni27fe ; G 4038
3865
- U 10239 ; WX 1434 ; N uni27ff ; G 4039
3866
  U 10240 ; WX 781 ; N uni2800 ; G 4040
3867
  U 10241 ; WX 781 ; N uni2801 ; G 4041
3868
  U 10242 ; WX 781 ; N uni2802 ; G 4042
@@ -3873,12 +4070,12 @@ U 10246 ; WX 781 ; N uni2806 ; G 4046
3873
  U 10247 ; WX 781 ; N uni2807 ; G 4047
3874
  U 10248 ; WX 781 ; N uni2808 ; G 4048
3875
  U 10249 ; WX 781 ; N uni2809 ; G 4049
3876
- U 10250 ; WX 781 ; N uni280a ; G 4050
3877
- U 10251 ; WX 781 ; N uni280b ; G 4051
3878
- U 10252 ; WX 781 ; N uni280c ; G 4052
3879
- U 10253 ; WX 781 ; N uni280d ; G 4053
3880
- U 10254 ; WX 781 ; N uni280e ; G 4054
3881
- U 10255 ; WX 781 ; N uni280f ; G 4055
3882
  U 10256 ; WX 781 ; N uni2810 ; G 4056
3883
  U 10257 ; WX 781 ; N uni2811 ; G 4057
3884
  U 10258 ; WX 781 ; N uni2812 ; G 4058
@@ -3889,12 +4086,12 @@ U 10262 ; WX 781 ; N uni2816 ; G 4062
3889
  U 10263 ; WX 781 ; N uni2817 ; G 4063
3890
  U 10264 ; WX 781 ; N uni2818 ; G 4064
3891
  U 10265 ; WX 781 ; N uni2819 ; G 4065
3892
- U 10266 ; WX 781 ; N uni281a ; G 4066
3893
- U 10267 ; WX 781 ; N uni281b ; G 4067
3894
- U 10268 ; WX 781 ; N uni281c ; G 4068
3895
- U 10269 ; WX 781 ; N uni281d ; G 4069
3896
- U 10270 ; WX 781 ; N uni281e ; G 4070
3897
- U 10271 ; WX 781 ; N uni281f ; G 4071
3898
  U 10272 ; WX 781 ; N uni2820 ; G 4072
3899
  U 10273 ; WX 781 ; N uni2821 ; G 4073
3900
  U 10274 ; WX 781 ; N uni2822 ; G 4074
@@ -3905,12 +4102,12 @@ U 10278 ; WX 781 ; N uni2826 ; G 4078
3905
  U 10279 ; WX 781 ; N uni2827 ; G 4079
3906
  U 10280 ; WX 781 ; N uni2828 ; G 4080
3907
  U 10281 ; WX 781 ; N uni2829 ; G 4081
3908
- U 10282 ; WX 781 ; N uni282a ; G 4082
3909
- U 10283 ; WX 781 ; N uni282b ; G 4083
3910
- U 10284 ; WX 781 ; N uni282c ; G 4084
3911
- U 10285 ; WX 781 ; N uni282d ; G 4085
3912
- U 10286 ; WX 781 ; N uni282e ; G 4086
3913
- U 10287 ; WX 781 ; N uni282f ; G 4087
3914
  U 10288 ; WX 781 ; N uni2830 ; G 4088
3915
  U 10289 ; WX 781 ; N uni2831 ; G 4089
3916
  U 10290 ; WX 781 ; N uni2832 ; G 4090
@@ -3921,12 +4118,12 @@ U 10294 ; WX 781 ; N uni2836 ; G 4094
3921
  U 10295 ; WX 781 ; N uni2837 ; G 4095
3922
  U 10296 ; WX 781 ; N uni2838 ; G 4096
3923
  U 10297 ; WX 781 ; N uni2839 ; G 4097
3924
- U 10298 ; WX 781 ; N uni283a ; G 4098
3925
- U 10299 ; WX 781 ; N uni283b ; G 4099
3926
- U 10300 ; WX 781 ; N uni283c ; G 4100
3927
- U 10301 ; WX 781 ; N uni283d ; G 4101
3928
- U 10302 ; WX 781 ; N uni283e ; G 4102
3929
- U 10303 ; WX 781 ; N uni283f ; G 4103
3930
  U 10304 ; WX 781 ; N uni2840 ; G 4104
3931
  U 10305 ; WX 781 ; N uni2841 ; G 4105
3932
  U 10306 ; WX 781 ; N uni2842 ; G 4106
@@ -3937,12 +4134,12 @@ U 10310 ; WX 781 ; N uni2846 ; G 4110
3937
  U 10311 ; WX 781 ; N uni2847 ; G 4111
3938
  U 10312 ; WX 781 ; N uni2848 ; G 4112
3939
  U 10313 ; WX 781 ; N uni2849 ; G 4113
3940
- U 10314 ; WX 781 ; N uni284a ; G 4114
3941
- U 10315 ; WX 781 ; N uni284b ; G 4115
3942
- U 10316 ; WX 781 ; N uni284c ; G 4116
3943
- U 10317 ; WX 781 ; N uni284d ; G 4117
3944
- U 10318 ; WX 781 ; N uni284e ; G 4118
3945
- U 10319 ; WX 781 ; N uni284f ; G 4119
3946
  U 10320 ; WX 781 ; N uni2850 ; G 4120
3947
  U 10321 ; WX 781 ; N uni2851 ; G 4121
3948
  U 10322 ; WX 781 ; N uni2852 ; G 4122
@@ -3953,12 +4150,12 @@ U 10326 ; WX 781 ; N uni2856 ; G 4126
3953
  U 10327 ; WX 781 ; N uni2857 ; G 4127
3954
  U 10328 ; WX 781 ; N uni2858 ; G 4128
3955
  U 10329 ; WX 781 ; N uni2859 ; G 4129
3956
- U 10330 ; WX 781 ; N uni285a ; G 4130
3957
- U 10331 ; WX 781 ; N uni285b ; G 4131
3958
- U 10332 ; WX 781 ; N uni285c ; G 4132
3959
- U 10333 ; WX 781 ; N uni285d ; G 4133
3960
- U 10334 ; WX 781 ; N uni285e ; G 4134
3961
- U 10335 ; WX 781 ; N uni285f ; G 4135
3962
  U 10336 ; WX 781 ; N uni2860 ; G 4136
3963
  U 10337 ; WX 781 ; N uni2861 ; G 4137
3964
  U 10338 ; WX 781 ; N uni2862 ; G 4138
@@ -3969,12 +4166,12 @@ U 10342 ; WX 781 ; N uni2866 ; G 4142
3969
  U 10343 ; WX 781 ; N uni2867 ; G 4143
3970
  U 10344 ; WX 781 ; N uni2868 ; G 4144
3971
  U 10345 ; WX 781 ; N uni2869 ; G 4145
3972
- U 10346 ; WX 781 ; N uni286a ; G 4146
3973
- U 10347 ; WX 781 ; N uni286b ; G 4147
3974
- U 10348 ; WX 781 ; N uni286c ; G 4148
3975
- U 10349 ; WX 781 ; N uni286d ; G 4149
3976
- U 10350 ; WX 781 ; N uni286e ; G 4150
3977
- U 10351 ; WX 781 ; N uni286f ; G 4151
3978
  U 10352 ; WX 781 ; N uni2870 ; G 4152
3979
  U 10353 ; WX 781 ; N uni2871 ; G 4153
3980
  U 10354 ; WX 781 ; N uni2872 ; G 4154
@@ -3985,12 +4182,12 @@ U 10358 ; WX 781 ; N uni2876 ; G 4158
3985
  U 10359 ; WX 781 ; N uni2877 ; G 4159
3986
  U 10360 ; WX 781 ; N uni2878 ; G 4160
3987
  U 10361 ; WX 781 ; N uni2879 ; G 4161
3988
- U 10362 ; WX 781 ; N uni287a ; G 4162
3989
- U 10363 ; WX 781 ; N uni287b ; G 4163
3990
- U 10364 ; WX 781 ; N uni287c ; G 4164
3991
- U 10365 ; WX 781 ; N uni287d ; G 4165
3992
- U 10366 ; WX 781 ; N uni287e ; G 4166
3993
- U 10367 ; WX 781 ; N uni287f ; G 4167
3994
  U 10368 ; WX 781 ; N uni2880 ; G 4168
3995
  U 10369 ; WX 781 ; N uni2881 ; G 4169
3996
  U 10370 ; WX 781 ; N uni2882 ; G 4170
@@ -4001,12 +4198,12 @@ U 10374 ; WX 781 ; N uni2886 ; G 4174
4001
  U 10375 ; WX 781 ; N uni2887 ; G 4175
4002
  U 10376 ; WX 781 ; N uni2888 ; G 4176
4003
  U 10377 ; WX 781 ; N uni2889 ; G 4177
4004
- U 10378 ; WX 781 ; N uni288a ; G 4178
4005
- U 10379 ; WX 781 ; N uni288b ; G 4179
4006
- U 10380 ; WX 781 ; N uni288c ; G 4180
4007
- U 10381 ; WX 781 ; N uni288d ; G 4181
4008
- U 10382 ; WX 781 ; N uni288e ; G 4182
4009
- U 10383 ; WX 781 ; N uni288f ; G 4183
4010
  U 10384 ; WX 781 ; N uni2890 ; G 4184
4011
  U 10385 ; WX 781 ; N uni2891 ; G 4185
4012
  U 10386 ; WX 781 ; N uni2892 ; G 4186
@@ -4017,1183 +4214,1521 @@ U 10390 ; WX 781 ; N uni2896 ; G 4190
4017
  U 10391 ; WX 781 ; N uni2897 ; G 4191
4018
  U 10392 ; WX 781 ; N uni2898 ; G 4192
4019
  U 10393 ; WX 781 ; N uni2899 ; G 4193
4020
- U 10394 ; WX 781 ; N uni289a ; G 4194
4021
- U 10395 ; WX 781 ; N uni289b ; G 4195
4022
- U 10396 ; WX 781 ; N uni289c ; G 4196
4023
- U 10397 ; WX 781 ; N uni289d ; G 4197
4024
- U 10398 ; WX 781 ; N uni289e ; G 4198
4025
- U 10399 ; WX 781 ; N uni289f ; G 4199
4026
- U 10400 ; WX 781 ; N uni28a0 ; G 4200
4027
- U 10401 ; WX 781 ; N uni28a1 ; G 4201
4028
- U 10402 ; WX 781 ; N uni28a2 ; G 4202
4029
- U 10403 ; WX 781 ; N uni28a3 ; G 4203
4030
- U 10404 ; WX 781 ; N uni28a4 ; G 4204
4031
- U 10405 ; WX 781 ; N uni28a5 ; G 4205
4032
- U 10406 ; WX 781 ; N uni28a6 ; G 4206
4033
- U 10407 ; WX 781 ; N uni28a7 ; G 4207
4034
- U 10408 ; WX 781 ; N uni28a8 ; G 4208
4035
- U 10409 ; WX 781 ; N uni28a9 ; G 4209
4036
- U 10410 ; WX 781 ; N uni28aa ; G 4210
4037
- U 10411 ; WX 781 ; N uni28ab ; G 4211
4038
- U 10412 ; WX 781 ; N uni28ac ; G 4212
4039
- U 10413 ; WX 781 ; N uni28ad ; G 4213
4040
- U 10414 ; WX 781 ; N uni28ae ; G 4214
4041
- U 10415 ; WX 781 ; N uni28af ; G 4215
4042
- U 10416 ; WX 781 ; N uni28b0 ; G 4216
4043
- U 10417 ; WX 781 ; N uni28b1 ; G 4217
4044
- U 10418 ; WX 781 ; N uni28b2 ; G 4218
4045
- U 10419 ; WX 781 ; N uni28b3 ; G 4219
4046
- U 10420 ; WX 781 ; N uni28b4 ; G 4220
4047
- U 10421 ; WX 781 ; N uni28b5 ; G 4221
4048
- U 10422 ; WX 781 ; N uni28b6 ; G 4222
4049
- U 10423 ; WX 781 ; N uni28b7 ; G 4223
4050
- U 10424 ; WX 781 ; N uni28b8 ; G 4224
4051
- U 10425 ; WX 781 ; N uni28b9 ; G 4225
4052
- U 10426 ; WX 781 ; N uni28ba ; G 4226
4053
- U 10427 ; WX 781 ; N uni28bb ; G 4227
4054
- U 10428 ; WX 781 ; N uni28bc ; G 4228
4055
- U 10429 ; WX 781 ; N uni28bd ; G 4229
4056
- U 10430 ; WX 781 ; N uni28be ; G 4230
4057
- U 10431 ; WX 781 ; N uni28bf ; G 4231
4058
- U 10432 ; WX 781 ; N uni28c0 ; G 4232
4059
- U 10433 ; WX 781 ; N uni28c1 ; G 4233
4060
- U 10434 ; WX 781 ; N uni28c2 ; G 4234
4061
- U 10435 ; WX 781 ; N uni28c3 ; G 4235
4062
- U 10436 ; WX 781 ; N uni28c4 ; G 4236
4063
- U 10437 ; WX 781 ; N uni28c5 ; G 4237
4064
- U 10438 ; WX 781 ; N uni28c6 ; G 4238
4065
- U 10439 ; WX 781 ; N uni28c7 ; G 4239
4066
- U 10440 ; WX 781 ; N uni28c8 ; G 4240
4067
- U 10441 ; WX 781 ; N uni28c9 ; G 4241
4068
- U 10442 ; WX 781 ; N uni28ca ; G 4242
4069
- U 10443 ; WX 781 ; N uni28cb ; G 4243
4070
- U 10444 ; WX 781 ; N uni28cc ; G 4244
4071
- U 10445 ; WX 781 ; N uni28cd ; G 4245
4072
- U 10446 ; WX 781 ; N uni28ce ; G 4246
4073
- U 10447 ; WX 781 ; N uni28cf ; G 4247
4074
- U 10448 ; WX 781 ; N uni28d0 ; G 4248
4075
- U 10449 ; WX 781 ; N uni28d1 ; G 4249
4076
- U 10450 ; WX 781 ; N uni28d2 ; G 4250
4077
- U 10451 ; WX 781 ; N uni28d3 ; G 4251
4078
- U 10452 ; WX 781 ; N uni28d4 ; G 4252
4079
- U 10453 ; WX 781 ; N uni28d5 ; G 4253
4080
- U 10454 ; WX 781 ; N uni28d6 ; G 4254
4081
- U 10455 ; WX 781 ; N uni28d7 ; G 4255
4082
- U 10456 ; WX 781 ; N uni28d8 ; G 4256
4083
- U 10457 ; WX 781 ; N uni28d9 ; G 4257
4084
- U 10458 ; WX 781 ; N uni28da ; G 4258
4085
- U 10459 ; WX 781 ; N uni28db ; G 4259
4086
- U 10460 ; WX 781 ; N uni28dc ; G 4260
4087
- U 10461 ; WX 781 ; N uni28dd ; G 4261
4088
- U 10462 ; WX 781 ; N uni28de ; G 4262
4089
- U 10463 ; WX 781 ; N uni28df ; G 4263
4090
- U 10464 ; WX 781 ; N uni28e0 ; G 4264
4091
- U 10465 ; WX 781 ; N uni28e1 ; G 4265
4092
- U 10466 ; WX 781 ; N uni28e2 ; G 4266
4093
- U 10467 ; WX 781 ; N uni28e3 ; G 4267
4094
- U 10468 ; WX 781 ; N uni28e4 ; G 4268
4095
- U 10469 ; WX 781 ; N uni28e5 ; G 4269
4096
- U 10470 ; WX 781 ; N uni28e6 ; G 4270
4097
- U 10471 ; WX 781 ; N uni28e7 ; G 4271
4098
- U 10472 ; WX 781 ; N uni28e8 ; G 4272
4099
- U 10473 ; WX 781 ; N uni28e9 ; G 4273
4100
- U 10474 ; WX 781 ; N uni28ea ; G 4274
4101
- U 10475 ; WX 781 ; N uni28eb ; G 4275
4102
- U 10476 ; WX 781 ; N uni28ec ; G 4276
4103
- U 10477 ; WX 781 ; N uni28ed ; G 4277
4104
- U 10478 ; WX 781 ; N uni28ee ; G 4278
4105
- U 10479 ; WX 781 ; N uni28ef ; G 4279
4106
- U 10480 ; WX 781 ; N uni28f0 ; G 4280
4107
- U 10481 ; WX 781 ; N uni28f1 ; G 4281
4108
- U 10482 ; WX 781 ; N uni28f2 ; G 4282
4109
- U 10483 ; WX 781 ; N uni28f3 ; G 4283
4110
- U 10484 ; WX 781 ; N uni28f4 ; G 4284
4111
- U 10485 ; WX 781 ; N uni28f5 ; G 4285
4112
- U 10486 ; WX 781 ; N uni28f6 ; G 4286
4113
- U 10487 ; WX 781 ; N uni28f7 ; G 4287
4114
- U 10488 ; WX 781 ; N uni28f8 ; G 4288
4115
- U 10489 ; WX 781 ; N uni28f9 ; G 4289
4116
- U 10490 ; WX 781 ; N uni28fa ; G 4290
4117
- U 10491 ; WX 781 ; N uni28fb ; G 4291
4118
- U 10492 ; WX 781 ; N uni28fc ; G 4292
4119
- U 10493 ; WX 781 ; N uni28fd ; G 4293
4120
- U 10494 ; WX 781 ; N uni28fe ; G 4294
4121
- U 10495 ; WX 781 ; N uni28ff ; G 4295
4122
  U 10502 ; WX 838 ; N uni2906 ; G 4296
4123
  U 10503 ; WX 838 ; N uni2907 ; G 4297
4124
- U 10506 ; WX 838 ; N uni290a ; G 4298
4125
- U 10507 ; WX 838 ; N uni290b ; G 4299
4126
  U 10560 ; WX 838 ; N uni2940 ; G 4300
4127
  U 10561 ; WX 838 ; N uni2941 ; G 4301
4128
  U 10627 ; WX 753 ; N uni2983 ; G 4302
4129
  U 10628 ; WX 753 ; N uni2984 ; G 4303
4130
- U 10702 ; WX 838 ; N uni29ce ; G 4304
4131
- U 10703 ; WX 1046 ; N uni29cf ; G 4305
4132
- U 10704 ; WX 1046 ; N uni29d0 ; G 4306
4133
- U 10705 ; WX 1000 ; N uni29d1 ; G 4307
4134
- U 10706 ; WX 1000 ; N uni29d2 ; G 4308
4135
- U 10707 ; WX 1000 ; N uni29d3 ; G 4309
4136
- U 10708 ; WX 1000 ; N uni29d4 ; G 4310
4137
- U 10709 ; WX 1000 ; N uni29d5 ; G 4311
4138
- U 10731 ; WX 494 ; N uni29eb ; G 4312
4139
- U 10746 ; WX 838 ; N uni29fa ; G 4313
4140
- U 10747 ; WX 838 ; N uni29fb ; G 4314
4141
- U 10752 ; WX 1000 ; N uni2a00 ; G 4315
4142
- U 10753 ; WX 1000 ; N uni2a01 ; G 4316
4143
- U 10754 ; WX 1000 ; N uni2a02 ; G 4317
4144
- U 10764 ; WX 1661 ; N uni2a0c ; G 4318
4145
- U 10765 ; WX 563 ; N uni2a0d ; G 4319
4146
- U 10766 ; WX 563 ; N uni2a0e ; G 4320
4147
- U 10767 ; WX 563 ; N uni2a0f ; G 4321
4148
- U 10768 ; WX 563 ; N uni2a10 ; G 4322
4149
- U 10769 ; WX 563 ; N uni2a11 ; G 4323
4150
- U 10770 ; WX 563 ; N uni2a12 ; G 4324
4151
- U 10771 ; WX 563 ; N uni2a13 ; G 4325
4152
- U 10772 ; WX 563 ; N uni2a14 ; G 4326
4153
- U 10773 ; WX 563 ; N uni2a15 ; G 4327
4154
- U 10774 ; WX 563 ; N uni2a16 ; G 4328
4155
- U 10775 ; WX 563 ; N uni2a17 ; G 4329
4156
- U 10776 ; WX 563 ; N uni2a18 ; G 4330
4157
- U 10777 ; WX 563 ; N uni2a19 ; G 4331
4158
- U 10778 ; WX 563 ; N uni2a1a ; G 4332
4159
- U 10779 ; WX 563 ; N uni2a1b ; G 4333
4160
- U 10780 ; WX 563 ; N uni2a1c ; G 4334
4161
- U 10799 ; WX 838 ; N uni2a2f ; G 4335
4162
- U 10877 ; WX 838 ; N uni2a7d ; G 4336
4163
- U 10878 ; WX 838 ; N uni2a7e ; G 4337
4164
- U 10879 ; WX 838 ; N uni2a7f ; G 4338
4165
- U 10880 ; WX 838 ; N uni2a80 ; G 4339
4166
- U 10881 ; WX 838 ; N uni2a81 ; G 4340
4167
- U 10882 ; WX 838 ; N uni2a82 ; G 4341
4168
- U 10883 ; WX 838 ; N uni2a83 ; G 4342
4169
- U 10884 ; WX 838 ; N uni2a84 ; G 4343
4170
- U 10885 ; WX 838 ; N uni2a85 ; G 4344
4171
- U 10886 ; WX 838 ; N uni2a86 ; G 4345
4172
- U 10887 ; WX 838 ; N uni2a87 ; G 4346
4173
- U 10888 ; WX 838 ; N uni2a88 ; G 4347
4174
- U 10889 ; WX 838 ; N uni2a89 ; G 4348
4175
- U 10890 ; WX 838 ; N uni2a8a ; G 4349
4176
- U 10891 ; WX 838 ; N uni2a8b ; G 4350
4177
- U 10892 ; WX 838 ; N uni2a8c ; G 4351
4178
- U 10893 ; WX 838 ; N uni2a8d ; G 4352
4179
- U 10894 ; WX 838 ; N uni2a8e ; G 4353
4180
- U 10895 ; WX 838 ; N uni2a8f ; G 4354
4181
- U 10896 ; WX 838 ; N uni2a90 ; G 4355
4182
- U 10897 ; WX 838 ; N uni2a91 ; G 4356
4183
- U 10898 ; WX 838 ; N uni2a92 ; G 4357
4184
- U 10899 ; WX 838 ; N uni2a93 ; G 4358
4185
- U 10900 ; WX 838 ; N uni2a94 ; G 4359
4186
- U 10901 ; WX 838 ; N uni2a95 ; G 4360
4187
- U 10902 ; WX 838 ; N uni2a96 ; G 4361
4188
- U 10903 ; WX 838 ; N uni2a97 ; G 4362
4189
- U 10904 ; WX 838 ; N uni2a98 ; G 4363
4190
- U 10905 ; WX 838 ; N uni2a99 ; G 4364
4191
- U 10906 ; WX 838 ; N uni2a9a ; G 4365
4192
- U 10907 ; WX 838 ; N uni2a9b ; G 4366
4193
- U 10908 ; WX 838 ; N uni2a9c ; G 4367
4194
- U 10909 ; WX 838 ; N uni2a9d ; G 4368
4195
- U 10910 ; WX 838 ; N uni2a9e ; G 4369
4196
- U 10911 ; WX 838 ; N uni2a9f ; G 4370
4197
- U 10912 ; WX 838 ; N uni2aa0 ; G 4371
4198
- U 10926 ; WX 838 ; N uni2aae ; G 4372
4199
- U 10927 ; WX 838 ; N uni2aaf ; G 4373
4200
- U 10928 ; WX 838 ; N uni2ab0 ; G 4374
4201
- U 10929 ; WX 838 ; N uni2ab1 ; G 4375
4202
- U 10930 ; WX 838 ; N uni2ab2 ; G 4376
4203
- U 10931 ; WX 838 ; N uni2ab3 ; G 4377
4204
- U 10932 ; WX 838 ; N uni2ab4 ; G 4378
4205
- U 10933 ; WX 838 ; N uni2ab5 ; G 4379
4206
- U 10934 ; WX 838 ; N uni2ab6 ; G 4380
4207
- U 10935 ; WX 838 ; N uni2ab7 ; G 4381
4208
- U 10936 ; WX 838 ; N uni2ab8 ; G 4382
4209
- U 10937 ; WX 838 ; N uni2ab9 ; G 4383
4210
- U 10938 ; WX 838 ; N uni2aba ; G 4384
4211
- U 11001 ; WX 838 ; N uni2af9 ; G 4385
4212
- U 11002 ; WX 838 ; N uni2afa ; G 4386
4213
- U 11008 ; WX 838 ; N uni2b00 ; G 4387
4214
- U 11009 ; WX 838 ; N uni2b01 ; G 4388
4215
- U 11010 ; WX 838 ; N uni2b02 ; G 4389
4216
- U 11011 ; WX 838 ; N uni2b03 ; G 4390
4217
- U 11012 ; WX 838 ; N uni2b04 ; G 4391
4218
- U 11013 ; WX 838 ; N uni2b05 ; G 4392
4219
- U 11014 ; WX 838 ; N uni2b06 ; G 4393
4220
- U 11015 ; WX 838 ; N uni2b07 ; G 4394
4221
- U 11016 ; WX 838 ; N uni2b08 ; G 4395
4222
- U 11017 ; WX 838 ; N uni2b09 ; G 4396
4223
- U 11018 ; WX 838 ; N uni2b0a ; G 4397
4224
- U 11019 ; WX 838 ; N uni2b0b ; G 4398
4225
- U 11020 ; WX 838 ; N uni2b0c ; G 4399
4226
- U 11021 ; WX 838 ; N uni2b0d ; G 4400
4227
- U 11022 ; WX 838 ; N uni2b0e ; G 4401
4228
- U 11023 ; WX 838 ; N uni2b0f ; G 4402
4229
- U 11024 ; WX 838 ; N uni2b10 ; G 4403
4230
- U 11025 ; WX 838 ; N uni2b11 ; G 4404
4231
- U 11026 ; WX 945 ; N uni2b12 ; G 4405
4232
- U 11027 ; WX 945 ; N uni2b13 ; G 4406
4233
- U 11028 ; WX 945 ; N uni2b14 ; G 4407
4234
- U 11029 ; WX 945 ; N uni2b15 ; G 4408
4235
- U 11030 ; WX 769 ; N uni2b16 ; G 4409
4236
- U 11031 ; WX 769 ; N uni2b17 ; G 4410
4237
- U 11032 ; WX 769 ; N uni2b18 ; G 4411
4238
- U 11033 ; WX 769 ; N uni2b19 ; G 4412
4239
- U 11034 ; WX 945 ; N uni2b1a ; G 4413
4240
- U 11039 ; WX 869 ; N uni2b1f ; G 4414
4241
- U 11040 ; WX 869 ; N uni2b20 ; G 4415
4242
- U 11041 ; WX 873 ; N uni2b21 ; G 4416
4243
- U 11042 ; WX 873 ; N uni2b22 ; G 4417
4244
- U 11043 ; WX 873 ; N uni2b23 ; G 4418
4245
- U 11044 ; WX 1119 ; N uni2b24 ; G 4419
4246
- U 11091 ; WX 869 ; N uni2b53 ; G 4420
4247
- U 11092 ; WX 869 ; N uni2b54 ; G 4421
4248
- U 11360 ; WX 637 ; N uni2c60 ; G 4422
4249
- U 11361 ; WX 360 ; N uni2c61 ; G 4423
4250
- U 11362 ; WX 637 ; N uni2c62 ; G 4424
4251
- U 11363 ; WX 733 ; N uni2c63 ; G 4425
4252
- U 11364 ; WX 770 ; N uni2c64 ; G 4426
4253
- U 11365 ; WX 675 ; N uni2c65 ; G 4427
4254
- U 11366 ; WX 478 ; N uni2c66 ; G 4428
4255
- U 11367 ; WX 956 ; N uni2c67 ; G 4429
4256
- U 11368 ; WX 712 ; N uni2c68 ; G 4430
4257
- U 11369 ; WX 775 ; N uni2c69 ; G 4431
4258
- U 11370 ; WX 665 ; N uni2c6a ; G 4432
4259
- U 11371 ; WX 725 ; N uni2c6b ; G 4433
4260
- U 11372 ; WX 582 ; N uni2c6c ; G 4434
4261
- U 11373 ; WX 860 ; N uni2c6d ; G 4435
4262
- U 11374 ; WX 995 ; N uni2c6e ; G 4436
4263
- U 11375 ; WX 774 ; N uni2c6f ; G 4437
4264
- U 11376 ; WX 860 ; N uni2c70 ; G 4438
4265
- U 11377 ; WX 778 ; N uni2c71 ; G 4439
4266
- U 11378 ; WX 1221 ; N uni2c72 ; G 4440
4267
- U 11379 ; WX 1056 ; N uni2c73 ; G 4441
4268
- U 11380 ; WX 652 ; N uni2c74 ; G 4442
4269
- U 11381 ; WX 698 ; N uni2c75 ; G 4443
4270
- U 11382 ; WX 565 ; N uni2c76 ; G 4444
4271
- U 11383 ; WX 782 ; N uni2c77 ; G 4445
4272
- U 11385 ; WX 538 ; N uni2c79 ; G 4446
4273
- U 11386 ; WX 687 ; N uni2c7a ; G 4447
4274
- U 11387 ; WX 559 ; N uni2c7b ; G 4448
4275
- U 11388 ; WX 219 ; N uni2c7c ; G 4449
4276
- U 11389 ; WX 487 ; N uni2c7d ; G 4450
4277
- U 11390 ; WX 720 ; N uni2c7e ; G 4451
4278
- U 11391 ; WX 725 ; N uni2c7f ; G 4452
4279
- U 11568 ; WX 691 ; N uni2d30 ; G 4453
4280
- U 11569 ; WX 941 ; N uni2d31 ; G 4454
4281
- U 11570 ; WX 941 ; N uni2d32 ; G 4455
4282
- U 11571 ; WX 725 ; N uni2d33 ; G 4456
4283
- U 11572 ; WX 725 ; N uni2d34 ; G 4457
4284
- U 11573 ; WX 725 ; N uni2d35 ; G 4458
4285
- U 11574 ; WX 676 ; N uni2d36 ; G 4459
4286
- U 11575 ; WX 774 ; N uni2d37 ; G 4460
4287
- U 11576 ; WX 774 ; N uni2d38 ; G 4461
4288
- U 11577 ; WX 683 ; N uni2d39 ; G 4462
4289
- U 11578 ; WX 683 ; N uni2d3a ; G 4463
4290
- U 11579 ; WX 802 ; N uni2d3b ; G 4464
4291
- U 11580 ; WX 989 ; N uni2d3c ; G 4465
4292
- U 11581 ; WX 761 ; N uni2d3d ; G 4466
4293
- U 11582 ; WX 623 ; N uni2d3e ; G 4467
4294
- U 11583 ; WX 761 ; N uni2d3f ; G 4468
4295
- U 11584 ; WX 941 ; N uni2d40 ; G 4469
4296
- U 11585 ; WX 941 ; N uni2d41 ; G 4470
4297
- U 11586 ; WX 373 ; N uni2d42 ; G 4471
4298
- U 11587 ; WX 740 ; N uni2d43 ; G 4472
4299
- U 11588 ; WX 837 ; N uni2d44 ; G 4473
4300
- U 11589 ; WX 914 ; N uni2d45 ; G 4474
4301
- U 11590 ; WX 672 ; N uni2d46 ; G 4475
4302
- U 11591 ; WX 737 ; N uni2d47 ; G 4476
4303
- U 11592 ; WX 680 ; N uni2d48 ; G 4477
4304
- U 11593 ; WX 683 ; N uni2d49 ; G 4478
4305
- U 11594 ; WX 602 ; N uni2d4a ; G 4479
4306
- U 11595 ; WX 1039 ; N uni2d4b ; G 4480
4307
- U 11596 ; WX 778 ; N uni2d4c ; G 4481
4308
- U 11597 ; WX 837 ; N uni2d4d ; G 4482
4309
- U 11598 ; WX 683 ; N uni2d4e ; G 4483
4310
- U 11599 ; WX 372 ; N uni2d4f ; G 4484
4311
- U 11600 ; WX 778 ; N uni2d50 ; G 4485
4312
- U 11601 ; WX 373 ; N uni2d51 ; G 4486
4313
- U 11602 ; WX 725 ; N uni2d52 ; G 4487
4314
- U 11603 ; WX 691 ; N uni2d53 ; G 4488
4315
- U 11604 ; WX 941 ; N uni2d54 ; G 4489
4316
- U 11605 ; WX 941 ; N uni2d55 ; G 4490
4317
- U 11606 ; WX 837 ; N uni2d56 ; G 4491
4318
- U 11607 ; WX 373 ; N uni2d57 ; G 4492
4319
- U 11608 ; WX 836 ; N uni2d58 ; G 4493
4320
- U 11609 ; WX 941 ; N uni2d59 ; G 4494
4321
- U 11610 ; WX 941 ; N uni2d5a ; G 4495
4322
- U 11611 ; WX 734 ; N uni2d5b ; G 4496
4323
- U 11612 ; WX 876 ; N uni2d5c ; G 4497
4324
- U 11613 ; WX 771 ; N uni2d5d ; G 4498
4325
- U 11614 ; WX 734 ; N uni2d5e ; G 4499
4326
- U 11615 ; WX 683 ; N uni2d5f ; G 4500
4327
- U 11616 ; WX 774 ; N uni2d60 ; G 4501
4328
- U 11617 ; WX 837 ; N uni2d61 ; G 4502
4329
- U 11618 ; WX 683 ; N uni2d62 ; G 4503
4330
- U 11619 ; WX 850 ; N uni2d63 ; G 4504
4331
- U 11620 ; WX 697 ; N uni2d64 ; G 4505
4332
- U 11621 ; WX 850 ; N uni2d65 ; G 4506
4333
- U 11631 ; WX 716 ; N uni2d6f ; G 4507
4334
- U 11800 ; WX 580 ; N uni2e18 ; G 4508
4335
- U 11810 ; WX 457 ; N uni2e22 ; G 4509
4336
- U 11811 ; WX 457 ; N uni2e23 ; G 4510
4337
- U 11812 ; WX 457 ; N uni2e24 ; G 4511
4338
- U 11813 ; WX 457 ; N uni2e25 ; G 4512
4339
- U 11822 ; WX 580 ; N uni2e2e ; G 4513
4340
- U 19904 ; WX 896 ; N uni4dc0 ; G 4514
4341
- U 19905 ; WX 896 ; N uni4dc1 ; G 4515
4342
- U 19906 ; WX 896 ; N uni4dc2 ; G 4516
4343
- U 19907 ; WX 896 ; N uni4dc3 ; G 4517
4344
- U 19908 ; WX 896 ; N uni4dc4 ; G 4518
4345
- U 19909 ; WX 896 ; N uni4dc5 ; G 4519
4346
- U 19910 ; WX 896 ; N uni4dc6 ; G 4520
4347
- U 19911 ; WX 896 ; N uni4dc7 ; G 4521
4348
- U 19912 ; WX 896 ; N uni4dc8 ; G 4522
4349
- U 19913 ; WX 896 ; N uni4dc9 ; G 4523
4350
- U 19914 ; WX 896 ; N uni4dca ; G 4524
4351
- U 19915 ; WX 896 ; N uni4dcb ; G 4525
4352
- U 19916 ; WX 896 ; N uni4dcc ; G 4526
4353
- U 19917 ; WX 896 ; N uni4dcd ; G 4527
4354
- U 19918 ; WX 896 ; N uni4dce ; G 4528
4355
- U 19919 ; WX 896 ; N uni4dcf ; G 4529
4356
- U 19920 ; WX 896 ; N uni4dd0 ; G 4530
4357
- U 19921 ; WX 896 ; N uni4dd1 ; G 4531
4358
- U 19922 ; WX 896 ; N uni4dd2 ; G 4532
4359
- U 19923 ; WX 896 ; N uni4dd3 ; G 4533
4360
- U 19924 ; WX 896 ; N uni4dd4 ; G 4534
4361
- U 19925 ; WX 896 ; N uni4dd5 ; G 4535
4362
- U 19926 ; WX 896 ; N uni4dd6 ; G 4536
4363
- U 19927 ; WX 896 ; N uni4dd7 ; G 4537
4364
- U 19928 ; WX 896 ; N uni4dd8 ; G 4538
4365
- U 19929 ; WX 896 ; N uni4dd9 ; G 4539
4366
- U 19930 ; WX 896 ; N uni4dda ; G 4540
4367
- U 19931 ; WX 896 ; N uni4ddb ; G 4541
4368
- U 19932 ; WX 896 ; N uni4ddc ; G 4542
4369
- U 19933 ; WX 896 ; N uni4ddd ; G 4543
4370
- U 19934 ; WX 896 ; N uni4dde ; G 4544
4371
- U 19935 ; WX 896 ; N uni4ddf ; G 4545
4372
- U 19936 ; WX 896 ; N uni4de0 ; G 4546
4373
- U 19937 ; WX 896 ; N uni4de1 ; G 4547
4374
- U 19938 ; WX 896 ; N uni4de2 ; G 4548
4375
- U 19939 ; WX 896 ; N uni4de3 ; G 4549
4376
- U 19940 ; WX 896 ; N uni4de4 ; G 4550
4377
- U 19941 ; WX 896 ; N uni4de5 ; G 4551
4378
- U 19942 ; WX 896 ; N uni4de6 ; G 4552
4379
- U 19943 ; WX 896 ; N uni4de7 ; G 4553
4380
- U 19944 ; WX 896 ; N uni4de8 ; G 4554
4381
- U 19945 ; WX 896 ; N uni4de9 ; G 4555
4382
- U 19946 ; WX 896 ; N uni4dea ; G 4556
4383
- U 19947 ; WX 896 ; N uni4deb ; G 4557
4384
- U 19948 ; WX 896 ; N uni4dec ; G 4558
4385
- U 19949 ; WX 896 ; N uni4ded ; G 4559
4386
- U 19950 ; WX 896 ; N uni4dee ; G 4560
4387
- U 19951 ; WX 896 ; N uni4def ; G 4561
4388
- U 19952 ; WX 896 ; N uni4df0 ; G 4562
4389
- U 19953 ; WX 896 ; N uni4df1 ; G 4563
4390
- U 19954 ; WX 896 ; N uni4df2 ; G 4564
4391
- U 19955 ; WX 896 ; N uni4df3 ; G 4565
4392
- U 19956 ; WX 896 ; N uni4df4 ; G 4566
4393
- U 19957 ; WX 896 ; N uni4df5 ; G 4567
4394
- U 19958 ; WX 896 ; N uni4df6 ; G 4568
4395
- U 19959 ; WX 896 ; N uni4df7 ; G 4569
4396
- U 19960 ; WX 896 ; N uni4df8 ; G 4570
4397
- U 19961 ; WX 896 ; N uni4df9 ; G 4571
4398
- U 19962 ; WX 896 ; N uni4dfa ; G 4572
4399
- U 19963 ; WX 896 ; N uni4dfb ; G 4573
4400
- U 19964 ; WX 896 ; N uni4dfc ; G 4574
4401
- U 19965 ; WX 896 ; N uni4dfd ; G 4575
4402
- U 19966 ; WX 896 ; N uni4dfe ; G 4576
4403
- U 19967 ; WX 896 ; N uni4dff ; G 4577
4404
- U 42564 ; WX 720 ; N unia644 ; G 4578
4405
- U 42565 ; WX 595 ; N unia645 ; G 4579
4406
- U 42566 ; WX 436 ; N unia646 ; G 4580
4407
- U 42567 ; WX 440 ; N unia647 ; G 4581
4408
- U 42572 ; WX 1405 ; N unia64c ; G 4582
4409
- U 42573 ; WX 1173 ; N unia64d ; G 4583
4410
- U 42576 ; WX 1234 ; N unia650 ; G 4584
4411
- U 42577 ; WX 1027 ; N unia651 ; G 4585
4412
- U 42580 ; WX 1174 ; N unia654 ; G 4586
4413
- U 42581 ; WX 972 ; N unia655 ; G 4587
4414
- U 42582 ; WX 1093 ; N unia656 ; G 4588
4415
- U 42583 ; WX 958 ; N unia657 ; G 4589
4416
- U 42594 ; WX 1085 ; N unia662 ; G 4590
4417
- U 42595 ; WX 924 ; N unia663 ; G 4591
4418
- U 42596 ; WX 1096 ; N unia664 ; G 4592
4419
- U 42597 ; WX 912 ; N unia665 ; G 4593
4420
- U 42598 ; WX 1260 ; N unia666 ; G 4594
4421
- U 42599 ; WX 997 ; N unia667 ; G 4595
4422
- U 42600 ; WX 850 ; N unia668 ; G 4596
4423
- U 42601 ; WX 687 ; N unia669 ; G 4597
4424
- U 42602 ; WX 1037 ; N unia66a ; G 4598
4425
- U 42603 ; WX 868 ; N unia66b ; G 4599
4426
- U 42604 ; WX 1406 ; N unia66c ; G 4600
4427
- U 42605 ; WX 1106 ; N unia66d ; G 4601
4428
- U 42606 ; WX 961 ; N unia66e ; G 4602
4429
- U 42634 ; WX 963 ; N unia68a ; G 4603
4430
- U 42635 ; WX 787 ; N unia68b ; G 4604
4431
- U 42636 ; WX 682 ; N unia68c ; G 4605
4432
- U 42637 ; WX 580 ; N unia68d ; G 4606
4433
- U 42644 ; WX 808 ; N unia694 ; G 4607
4434
- U 42645 ; WX 712 ; N unia695 ; G 4608
4435
- U 42760 ; WX 500 ; N unia708 ; G 4609
4436
- U 42761 ; WX 500 ; N unia709 ; G 4610
4437
- U 42762 ; WX 500 ; N unia70a ; G 4611
4438
- U 42763 ; WX 500 ; N unia70b ; G 4612
4439
- U 42764 ; WX 500 ; N unia70c ; G 4613
4440
- U 42765 ; WX 500 ; N unia70d ; G 4614
4441
- U 42766 ; WX 500 ; N unia70e ; G 4615
4442
- U 42767 ; WX 500 ; N unia70f ; G 4616
4443
- U 42768 ; WX 500 ; N unia710 ; G 4617
4444
- U 42769 ; WX 500 ; N unia711 ; G 4618
4445
- U 42770 ; WX 500 ; N unia712 ; G 4619
4446
- U 42771 ; WX 500 ; N unia713 ; G 4620
4447
- U 42772 ; WX 500 ; N unia714 ; G 4621
4448
- U 42773 ; WX 500 ; N unia715 ; G 4622
4449
- U 42774 ; WX 500 ; N unia716 ; G 4623
4450
- U 42779 ; WX 400 ; N unia71b ; G 4624
4451
- U 42780 ; WX 400 ; N unia71c ; G 4625
4452
- U 42781 ; WX 287 ; N unia71d ; G 4626
4453
- U 42782 ; WX 287 ; N unia71e ; G 4627
4454
- U 42783 ; WX 287 ; N unia71f ; G 4628
4455
- U 42786 ; WX 444 ; N unia722 ; G 4629
4456
- U 42787 ; WX 390 ; N unia723 ; G 4630
4457
- U 42788 ; WX 540 ; N unia724 ; G 4631
4458
- U 42789 ; WX 540 ; N unia725 ; G 4632
4459
- U 42790 ; WX 837 ; N unia726 ; G 4633
4460
- U 42791 ; WX 712 ; N unia727 ; G 4634
4461
- U 42792 ; WX 1031 ; N unia728 ; G 4635
4462
- U 42793 ; WX 857 ; N unia729 ; G 4636
4463
- U 42794 ; WX 696 ; N unia72a ; G 4637
4464
- U 42795 ; WX 557 ; N unia72b ; G 4638
4465
- U 42800 ; WX 559 ; N unia730 ; G 4639
4466
- U 42801 ; WX 595 ; N unia731 ; G 4640
4467
- U 42802 ; WX 1349 ; N unia732 ; G 4641
4468
- U 42803 ; WX 1052 ; N unia733 ; G 4642
4469
- U 42804 ; WX 1284 ; N unia734 ; G 4643
4470
- U 42805 ; WX 1064 ; N unia735 ; G 4644
4471
- U 42806 ; WX 1216 ; N unia736 ; G 4645
4472
- U 42807 ; WX 1054 ; N unia737 ; G 4646
4473
- U 42808 ; WX 1079 ; N unia738 ; G 4647
4474
- U 42809 ; WX 922 ; N unia739 ; G 4648
4475
- U 42810 ; WX 1079 ; N unia73a ; G 4649
4476
- U 42811 ; WX 922 ; N unia73b ; G 4650
4477
- U 42812 ; WX 1035 ; N unia73c ; G 4651
4478
- U 42813 ; WX 922 ; N unia73d ; G 4652
4479
- U 42814 ; WX 698 ; N unia73e ; G 4653
4480
- U 42815 ; WX 549 ; N unia73f ; G 4654
4481
- U 42822 ; WX 850 ; N unia746 ; G 4655
4482
- U 42823 ; WX 542 ; N unia747 ; G 4656
4483
- U 42824 ; WX 683 ; N unia748 ; G 4657
4484
- U 42825 ; WX 531 ; N unia749 ; G 4658
4485
- U 42826 ; WX 918 ; N unia74a ; G 4659
4486
- U 42827 ; WX 814 ; N unia74b ; G 4660
4487
- U 42830 ; WX 1406 ; N unia74e ; G 4661
4488
- U 42831 ; WX 1106 ; N unia74f ; G 4662
4489
- U 42832 ; WX 733 ; N unia750 ; G 4663
4490
- U 42833 ; WX 716 ; N unia751 ; G 4664
4491
- U 42834 ; WX 948 ; N unia752 ; G 4665
4492
- U 42835 ; WX 937 ; N unia753 ; G 4666
4493
- U 42838 ; WX 850 ; N unia756 ; G 4667
4494
- U 42839 ; WX 716 ; N unia757 ; G 4668
4495
- U 42852 ; WX 738 ; N unia764 ; G 4669
4496
- U 42853 ; WX 716 ; N unia765 ; G 4670
4497
- U 42854 ; WX 738 ; N unia766 ; G 4671
4498
- U 42855 ; WX 716 ; N unia767 ; G 4672
4499
- U 42880 ; WX 637 ; N unia780 ; G 4673
4500
- U 42881 ; WX 343 ; N unia781 ; G 4674
4501
- U 42882 ; WX 837 ; N unia782 ; G 4675
4502
- U 42883 ; WX 712 ; N unia783 ; G 4676
4503
- U 42889 ; WX 400 ; N unia789 ; G 4677
4504
- U 42890 ; WX 386 ; N unia78a ; G 4678
4505
- U 42891 ; WX 456 ; N unia78b ; G 4679
4506
- U 42892 ; WX 306 ; N unia78c ; G 4680
4507
- U 42893 ; WX 808 ; N unia78d ; G 4681
4508
- U 43003 ; WX 683 ; N unia7fb ; G 4682
4509
- U 43004 ; WX 733 ; N unia7fc ; G 4683
4510
- U 43005 ; WX 995 ; N unia7fd ; G 4684
4511
- U 43006 ; WX 372 ; N unia7fe ; G 4685
4512
- U 43007 ; WX 1325 ; N unia7ff ; G 4686
4513
- U 61184 ; WX 216 ; N unief00 ; G 4687
4514
- U 61185 ; WX 242 ; N unief01 ; G 4688
4515
- U 61186 ; WX 267 ; N unief02 ; G 4689
4516
- U 61187 ; WX 277 ; N unief03 ; G 4690
4517
- U 61188 ; WX 282 ; N unief04 ; G 4691
4518
- U 61189 ; WX 242 ; N unief05 ; G 4692
4519
- U 61190 ; WX 216 ; N unief06 ; G 4693
4520
- U 61191 ; WX 242 ; N unief07 ; G 4694
4521
- U 61192 ; WX 267 ; N unief08 ; G 4695
4522
- U 61193 ; WX 277 ; N unief09 ; G 4696
4523
- U 61194 ; WX 267 ; N unief0a ; G 4697
4524
- U 61195 ; WX 242 ; N unief0b ; G 4698
4525
- U 61196 ; WX 216 ; N unief0c ; G 4699
4526
- U 61197 ; WX 242 ; N unief0d ; G 4700
4527
- U 61198 ; WX 267 ; N unief0e ; G 4701
4528
- U 61199 ; WX 277 ; N unief0f ; G 4702
4529
- U 61200 ; WX 267 ; N unief10 ; G 4703
4530
- U 61201 ; WX 242 ; N unief11 ; G 4704
4531
- U 61202 ; WX 216 ; N unief12 ; G 4705
4532
- U 61203 ; WX 242 ; N unief13 ; G 4706
4533
- U 61204 ; WX 282 ; N unief14 ; G 4707
4534
- U 61205 ; WX 277 ; N unief15 ; G 4708
4535
- U 61206 ; WX 267 ; N unief16 ; G 4709
4536
- U 61207 ; WX 242 ; N unief17 ; G 4710
4537
- U 61208 ; WX 216 ; N unief18 ; G 4711
4538
- U 61209 ; WX 282 ; N unief19 ; G 4712
4539
- U 63173 ; WX 687 ; N unif6c5 ; G 4713
4540
- U 64256 ; WX 810 ; N unifb00 ; G 4714
4541
- U 64257 ; WX 741 ; N unifb01 ; G 4715
4542
- U 64258 ; WX 741 ; N unifb02 ; G 4716
4543
- U 64259 ; WX 1115 ; N unifb03 ; G 4717
4544
- U 64260 ; WX 1116 ; N unifb04 ; G 4718
4545
- U 64261 ; WX 808 ; N unifb05 ; G 4719
4546
- U 64262 ; WX 1020 ; N unifb06 ; G 4720
4547
- U 64275 ; WX 1388 ; N unifb13 ; G 4721
4548
- U 64276 ; WX 1384 ; N unifb14 ; G 4722
4549
- U 64277 ; WX 1378 ; N unifb15 ; G 4723
4550
- U 64278 ; WX 1384 ; N unifb16 ; G 4724
4551
- U 64279 ; WX 1713 ; N unifb17 ; G 4725
4552
- U 64285 ; WX 343 ; N unifb1d ; G 4726
4553
- U 64287 ; WX 663 ; N unifb1f ; G 4728
4554
- U 64288 ; WX 720 ; N unifb20 ; G 4729
4555
- U 64289 ; WX 963 ; N unifb21 ; G 4730
4556
- U 64290 ; WX 890 ; N unifb22 ; G 4731
4557
- U 64291 ; WX 988 ; N unifb23 ; G 4732
4558
- U 64292 ; WX 963 ; N unifb24 ; G 4733
4559
- U 64293 ; WX 938 ; N unifb25 ; G 4734
4560
- U 64294 ; WX 988 ; N unifb26 ; G 4735
4561
- U 64295 ; WX 988 ; N unifb27 ; G 4736
4562
- U 64296 ; WX 976 ; N unifb28 ; G 4737
4563
- U 64297 ; WX 838 ; N unifb29 ; G 4738
4564
- U 64298 ; WX 949 ; N unifb2a ; G 4739
4565
- U 64299 ; WX 949 ; N unifb2b ; G 4740
4566
- U 64300 ; WX 949 ; N unifb2c ; G 4741
4567
- U 64301 ; WX 949 ; N unifb2d ; G 4742
4568
- U 64302 ; WX 751 ; N unifb2e ; G 4743
4569
- U 64303 ; WX 751 ; N unifb2f ; G 4744
4570
- U 64304 ; WX 751 ; N unifb30 ; G 4745
4571
- U 64305 ; WX 673 ; N unifb31 ; G 4746
4572
- U 64306 ; WX 537 ; N unifb32 ; G 4747
4573
- U 64307 ; WX 654 ; N unifb33 ; G 4748
4574
- U 64308 ; WX 712 ; N unifb34 ; G 4749
4575
- U 64309 ; WX 438 ; N unifb35 ; G 4750
4576
- U 64310 ; WX 491 ; N unifb36 ; G 4751
4577
- U 64312 ; WX 724 ; N unifb38 ; G 4752
4578
- U 64313 ; WX 438 ; N unifb39 ; G 4753
4579
- U 64314 ; WX 649 ; N unifb3a ; G 4754
4580
- U 64315 ; WX 650 ; N unifb3b ; G 4755
4581
- U 64316 ; WX 679 ; N unifb3c ; G 4756
4582
- U 64318 ; WX 775 ; N unifb3e ; G 4757
4583
- U 64320 ; WX 497 ; N unifb40 ; G 4758
4584
- U 64321 ; WX 773 ; N unifb41 ; G 4759
4585
- U 64323 ; WX 718 ; N unifb43 ; G 4760
4586
- U 64324 ; WX 687 ; N unifb44 ; G 4761
4587
- U 64326 ; WX 751 ; N unifb46 ; G 4762
4588
- U 64327 ; WX 729 ; N unifb47 ; G 4763
4589
- U 64328 ; WX 649 ; N unifb48 ; G 4764
4590
- U 64329 ; WX 949 ; N unifb49 ; G 4765
4591
- U 64330 ; WX 751 ; N unifb4a ; G 4766
4592
- U 64331 ; WX 343 ; N unifb4b ; G 4767
4593
- U 64332 ; WX 673 ; N unifb4c ; G 4768
4594
- U 64333 ; WX 650 ; N unifb4d ; G 4769
4595
- U 64334 ; WX 687 ; N unifb4e ; G 4770
4596
- U 64335 ; WX 651 ; N unifb4f ; G 4771
4597
- U 64338 ; WX 1005 ; N unifb52 ; G 4772
4598
- U 64339 ; WX 1059 ; N unifb53 ; G 4773
4599
- U 64340 ; WX 375 ; N unifb54 ; G 4774
4600
- U 64341 ; WX 408 ; N unifb55 ; G 4775
4601
- U 64342 ; WX 1005 ; N unifb56 ; G 4776
4602
- U 64343 ; WX 1059 ; N unifb57 ; G 4777
4603
- U 64344 ; WX 375 ; N unifb58 ; G 4778
4604
- U 64345 ; WX 408 ; N unifb59 ; G 4779
4605
- U 64346 ; WX 1005 ; N unifb5a ; G 4780
4606
- U 64347 ; WX 1059 ; N unifb5b ; G 4781
4607
- U 64348 ; WX 375 ; N unifb5c ; G 4782
4608
- U 64349 ; WX 408 ; N unifb5d ; G 4783
4609
- U 64350 ; WX 1005 ; N unifb5e ; G 4784
4610
- U 64351 ; WX 1059 ; N unifb5f ; G 4785
4611
- U 64352 ; WX 375 ; N unifb60 ; G 4786
4612
- U 64353 ; WX 408 ; N unifb61 ; G 4787
4613
- U 64354 ; WX 1005 ; N unifb62 ; G 4788
4614
- U 64355 ; WX 1059 ; N unifb63 ; G 4789
4615
- U 64356 ; WX 375 ; N unifb64 ; G 4790
4616
- U 64357 ; WX 408 ; N unifb65 ; G 4791
4617
- U 64358 ; WX 1005 ; N unifb66 ; G 4792
4618
- U 64359 ; WX 1059 ; N unifb67 ; G 4793
4619
- U 64360 ; WX 375 ; N unifb68 ; G 4794
4620
- U 64361 ; WX 408 ; N unifb69 ; G 4795
4621
- U 64362 ; WX 1162 ; N unifb6a ; G 4796
4622
- U 64363 ; WX 1191 ; N unifb6b ; G 4797
4623
- U 64364 ; WX 655 ; N unifb6c ; G 4798
4624
- U 64365 ; WX 720 ; N unifb6d ; G 4799
4625
- U 64366 ; WX 1162 ; N unifb6e ; G 4800
4626
- U 64367 ; WX 1191 ; N unifb6f ; G 4801
4627
- U 64368 ; WX 655 ; N unifb70 ; G 4802
4628
- U 64369 ; WX 720 ; N unifb71 ; G 4803
4629
- U 64370 ; WX 721 ; N unifb72 ; G 4804
4630
- U 64371 ; WX 721 ; N unifb73 ; G 4805
4631
- U 64372 ; WX 721 ; N unifb74 ; G 4806
4632
- U 64373 ; WX 721 ; N unifb75 ; G 4807
4633
- U 64374 ; WX 721 ; N unifb76 ; G 4808
4634
- U 64375 ; WX 721 ; N unifb77 ; G 4809
4635
- U 64376 ; WX 721 ; N unifb78 ; G 4810
4636
- U 64377 ; WX 721 ; N unifb79 ; G 4811
4637
- U 64378 ; WX 721 ; N unifb7a ; G 4812
4638
- U 64379 ; WX 721 ; N unifb7b ; G 4813
4639
- U 64380 ; WX 721 ; N unifb7c ; G 4814
4640
- U 64381 ; WX 721 ; N unifb7d ; G 4815
4641
- U 64382 ; WX 721 ; N unifb7e ; G 4816
4642
- U 64383 ; WX 721 ; N unifb7f ; G 4817
4643
- U 64384 ; WX 721 ; N unifb80 ; G 4818
4644
- U 64385 ; WX 721 ; N unifb81 ; G 4819
4645
- U 64386 ; WX 513 ; N unifb82 ; G 4820
4646
- U 64387 ; WX 578 ; N unifb83 ; G 4821
4647
- U 64388 ; WX 513 ; N unifb84 ; G 4822
4648
- U 64389 ; WX 578 ; N unifb85 ; G 4823
4649
- U 64390 ; WX 513 ; N unifb86 ; G 4824
4650
- U 64391 ; WX 578 ; N unifb87 ; G 4825
4651
- U 64392 ; WX 513 ; N unifb88 ; G 4826
4652
- U 64393 ; WX 578 ; N unifb89 ; G 4827
4653
- U 64394 ; WX 576 ; N unifb8a ; G 4828
4654
- U 64395 ; WX 622 ; N unifb8b ; G 4829
4655
- U 64396 ; WX 576 ; N unifb8c ; G 4830
4656
- U 64397 ; WX 622 ; N unifb8d ; G 4831
4657
- U 64398 ; WX 1024 ; N unifb8e ; G 4832
4658
- U 64399 ; WX 1024 ; N unifb8f ; G 4833
4659
- U 64400 ; WX 582 ; N unifb90 ; G 4834
4660
- U 64401 ; WX 582 ; N unifb91 ; G 4835
4661
- U 64402 ; WX 1024 ; N unifb92 ; G 4836
4662
- U 64403 ; WX 1024 ; N unifb93 ; G 4837
4663
- U 64404 ; WX 582 ; N unifb94 ; G 4838
4664
- U 64405 ; WX 582 ; N unifb95 ; G 4839
4665
- U 64406 ; WX 1024 ; N unifb96 ; G 4840
4666
- U 64407 ; WX 1024 ; N unifb97 ; G 4841
4667
- U 64408 ; WX 582 ; N unifb98 ; G 4842
4668
- U 64409 ; WX 582 ; N unifb99 ; G 4843
4669
- U 64410 ; WX 1024 ; N unifb9a ; G 4844
4670
- U 64411 ; WX 1024 ; N unifb9b ; G 4845
4671
- U 64412 ; WX 582 ; N unifb9c ; G 4846
4672
- U 64413 ; WX 582 ; N unifb9d ; G 4847
4673
- U 64414 ; WX 854 ; N unifb9e ; G 4848
4674
- U 64415 ; WX 900 ; N unifb9f ; G 4849
4675
- U 64416 ; WX 854 ; N unifba0 ; G 4850
4676
- U 64417 ; WX 900 ; N unifba1 ; G 4851
4677
- U 64418 ; WX 375 ; N unifba2 ; G 4852
4678
- U 64419 ; WX 408 ; N unifba3 ; G 4853
4679
- U 64426 ; WX 938 ; N unifbaa ; G 4854
4680
- U 64427 ; WX 880 ; N unifbab ; G 4855
4681
- U 64428 ; WX 693 ; N unifbac ; G 4856
4682
- U 64429 ; WX 660 ; N unifbad ; G 4857
4683
- U 64467 ; WX 824 ; N unifbd3 ; G 4858
4684
- U 64468 ; WX 843 ; N unifbd4 ; G 4859
4685
- U 64469 ; WX 476 ; N unifbd5 ; G 4860
4686
- U 64470 ; WX 552 ; N unifbd6 ; G 4861
4687
- U 64473 ; WX 622 ; N unifbd9 ; G 4862
4688
- U 64474 ; WX 627 ; N unifbda ; G 4863
4689
- U 64488 ; WX 375 ; N unifbe8 ; G 4864
4690
- U 64489 ; WX 408 ; N unifbe9 ; G 4865
4691
- U 64508 ; WX 917 ; N unifbfc ; G 4866
4692
- U 64509 ; WX 1012 ; N unifbfd ; G 4867
4693
- U 64510 ; WX 375 ; N unifbfe ; G 4868
4694
- U 64511 ; WX 408 ; N unifbff ; G 4869
4695
- U 65136 ; WX 342 ; N unife70 ; G 4890
4696
- U 65137 ; WX 342 ; N unife71 ; G 4891
4697
- U 65138 ; WX 342 ; N unife72 ; G 4892
4698
- U 65139 ; WX 346 ; N unife73 ; G 4893
4699
- U 65140 ; WX 342 ; N unife74 ; G 4894
4700
- U 65142 ; WX 342 ; N unife76 ; G 4895
4701
- U 65143 ; WX 342 ; N unife77 ; G 4896
4702
- U 65144 ; WX 342 ; N unife78 ; G 4897
4703
- U 65145 ; WX 342 ; N unife79 ; G 4898
4704
- U 65146 ; WX 342 ; N unife7a ; G 4899
4705
- U 65147 ; WX 342 ; N unife7b ; G 4900
4706
- U 65148 ; WX 342 ; N unife7c ; G 4901
4707
- U 65149 ; WX 342 ; N unife7d ; G 4902
4708
- U 65150 ; WX 342 ; N unife7e ; G 4903
4709
- U 65151 ; WX 342 ; N unife7f ; G 4904
4710
- U 65152 ; WX 511 ; N unife80 ; G 4905
4711
- U 65153 ; WX 343 ; N unife81 ; G 4906
4712
- U 65154 ; WX 375 ; N unife82 ; G 4907
4713
- U 65155 ; WX 343 ; N unife83 ; G 4908
4714
- U 65156 ; WX 375 ; N unife84 ; G 4909
4715
- U 65157 ; WX 622 ; N unife85 ; G 4910
4716
- U 65158 ; WX 627 ; N unife86 ; G 4911
4717
- U 65159 ; WX 343 ; N unife87 ; G 4912
4718
- U 65160 ; WX 375 ; N unife88 ; G 4913
4719
- U 65161 ; WX 917 ; N unife89 ; G 4914
4720
- U 65162 ; WX 917 ; N unife8a ; G 4915
4721
- U 65163 ; WX 375 ; N unife8b ; G 4916
4722
- U 65164 ; WX 408 ; N unife8c ; G 4917
4723
- U 65165 ; WX 343 ; N unife8d ; G 4918
4724
- U 65166 ; WX 375 ; N unife8e ; G 4919
4725
- U 65167 ; WX 1005 ; N unife8f ; G 4920
4726
- U 65168 ; WX 1059 ; N unife90 ; G 4921
4727
- U 65169 ; WX 375 ; N unife91 ; G 4922
4728
- U 65170 ; WX 408 ; N unife92 ; G 4923
4729
- U 65171 ; WX 590 ; N unife93 ; G 4924
4730
- U 65172 ; WX 606 ; N unife94 ; G 4925
4731
- U 65173 ; WX 1005 ; N unife95 ; G 4926
4732
- U 65174 ; WX 1059 ; N unife96 ; G 4927
4733
- U 65175 ; WX 375 ; N unife97 ; G 4928
4734
- U 65176 ; WX 408 ; N unife98 ; G 4929
4735
- U 65177 ; WX 1005 ; N unife99 ; G 4930
4736
- U 65178 ; WX 1059 ; N unife9a ; G 4931
4737
- U 65179 ; WX 375 ; N unife9b ; G 4932
4738
- U 65180 ; WX 408 ; N unife9c ; G 4933
4739
- U 65181 ; WX 721 ; N unife9d ; G 4934
4740
- U 65182 ; WX 721 ; N unife9e ; G 4935
4741
- U 65183 ; WX 721 ; N unife9f ; G 4936
4742
- U 65184 ; WX 721 ; N unifea0 ; G 4937
4743
- U 65185 ; WX 721 ; N unifea1 ; G 4938
4744
- U 65186 ; WX 721 ; N unifea2 ; G 4939
4745
- U 65187 ; WX 721 ; N unifea3 ; G 4940
4746
- U 65188 ; WX 721 ; N unifea4 ; G 4941
4747
- U 65189 ; WX 721 ; N unifea5 ; G 4942
4748
- U 65190 ; WX 721 ; N unifea6 ; G 4943
4749
- U 65191 ; WX 721 ; N unifea7 ; G 4944
4750
- U 65192 ; WX 721 ; N unifea8 ; G 4945
4751
- U 65193 ; WX 513 ; N unifea9 ; G 4946
4752
- U 65194 ; WX 578 ; N unifeaa ; G 4947
4753
- U 65195 ; WX 513 ; N unifeab ; G 4948
4754
- U 65196 ; WX 578 ; N unifeac ; G 4949
4755
- U 65197 ; WX 576 ; N unifead ; G 4950
4756
- U 65198 ; WX 622 ; N unifeae ; G 4951
4757
- U 65199 ; WX 576 ; N unifeaf ; G 4952
4758
- U 65200 ; WX 622 ; N unifeb0 ; G 4953
4759
- U 65201 ; WX 1380 ; N unifeb1 ; G 4954
4760
- U 65202 ; WX 1414 ; N unifeb2 ; G 4955
4761
- U 65203 ; WX 983 ; N unifeb3 ; G 4956
4762
- U 65204 ; WX 1018 ; N unifeb4 ; G 4957
4763
- U 65205 ; WX 1380 ; N unifeb5 ; G 4958
4764
- U 65206 ; WX 1414 ; N unifeb6 ; G 4959
4765
- U 65207 ; WX 983 ; N unifeb7 ; G 4960
4766
- U 65208 ; WX 1018 ; N unifeb8 ; G 4961
4767
- U 65209 ; WX 1345 ; N unifeb9 ; G 4962
4768
- U 65210 ; WX 1364 ; N unifeba ; G 4963
4769
- U 65211 ; WX 966 ; N unifebb ; G 4964
4770
- U 65212 ; WX 985 ; N unifebc ; G 4965
4771
- U 65213 ; WX 1345 ; N unifebd ; G 4966
4772
- U 65214 ; WX 1364 ; N unifebe ; G 4967
4773
- U 65215 ; WX 966 ; N unifebf ; G 4968
4774
- U 65216 ; WX 985 ; N unifec0 ; G 4969
4775
- U 65217 ; WX 1039 ; N unifec1 ; G 4970
4776
- U 65218 ; WX 1071 ; N unifec2 ; G 4971
4777
- U 65219 ; WX 942 ; N unifec3 ; G 4972
4778
- U 65220 ; WX 974 ; N unifec4 ; G 4973
4779
- U 65221 ; WX 1039 ; N unifec5 ; G 4974
4780
- U 65222 ; WX 1071 ; N unifec6 ; G 4975
4781
- U 65223 ; WX 942 ; N unifec7 ; G 4976
4782
- U 65224 ; WX 974 ; N unifec8 ; G 4977
4783
- U 65225 ; WX 683 ; N unifec9 ; G 4978
4784
- U 65226 ; WX 683 ; N unifeca ; G 4979
4785
- U 65227 ; WX 683 ; N unifecb ; G 4980
4786
- U 65228 ; WX 564 ; N unifecc ; G 4981
4787
- U 65229 ; WX 683 ; N unifecd ; G 4982
4788
- U 65230 ; WX 683 ; N unifece ; G 4983
4789
- U 65231 ; WX 683 ; N unifecf ; G 4984
4790
- U 65232 ; WX 564 ; N unifed0 ; G 4985
4791
- U 65233 ; WX 1162 ; N unifed1 ; G 4986
4792
- U 65234 ; WX 1191 ; N unifed2 ; G 4987
4793
- U 65235 ; WX 655 ; N unifed3 ; G 4988
4794
- U 65236 ; WX 720 ; N unifed4 ; G 4989
4795
- U 65237 ; WX 894 ; N unifed5 ; G 4990
4796
- U 65238 ; WX 901 ; N unifed6 ; G 4991
4797
- U 65239 ; WX 655 ; N unifed7 ; G 4992
4798
- U 65240 ; WX 720 ; N unifed8 ; G 4993
4799
- U 65241 ; WX 917 ; N unifed9 ; G 4994
4800
- U 65242 ; WX 931 ; N unifeda ; G 4995
4801
- U 65243 ; WX 582 ; N unifedb ; G 4996
4802
- U 65244 ; WX 582 ; N unifedc ; G 4997
4803
- U 65245 ; WX 868 ; N unifedd ; G 4998
4804
- U 65246 ; WX 893 ; N unifede ; G 4999
4805
- U 65247 ; WX 375 ; N unifedf ; G 5000
4806
- U 65248 ; WX 408 ; N unifee0 ; G 5001
4807
- U 65249 ; WX 733 ; N unifee1 ; G 5002
4808
- U 65250 ; WX 784 ; N unifee2 ; G 5003
4809
- U 65251 ; WX 619 ; N unifee3 ; G 5004
4810
- U 65252 ; WX 670 ; N unifee4 ; G 5005
4811
- U 65253 ; WX 854 ; N unifee5 ; G 5006
4812
- U 65254 ; WX 900 ; N unifee6 ; G 5007
4813
- U 65255 ; WX 375 ; N unifee7 ; G 5008
4814
- U 65256 ; WX 408 ; N unifee8 ; G 5009
4815
- U 65257 ; WX 590 ; N unifee9 ; G 5010
4816
- U 65258 ; WX 606 ; N unifeea ; G 5011
4817
- U 65259 ; WX 693 ; N unifeeb ; G 5012
4818
- U 65260 ; WX 660 ; N unifeec ; G 5013
4819
- U 65261 ; WX 622 ; N unifeed ; G 5014
4820
- U 65262 ; WX 627 ; N unifeee ; G 5015
4821
- U 65263 ; WX 917 ; N unifeef ; G 5016
4822
- U 65264 ; WX 1012 ; N unifef0 ; G 5017
4823
- U 65265 ; WX 917 ; N unifef1 ; G 5018
4824
- U 65266 ; WX 1012 ; N unifef2 ; G 5019
4825
- U 65267 ; WX 375 ; N unifef3 ; G 5020
4826
- U 65268 ; WX 408 ; N unifef4 ; G 5021
4827
- U 65269 ; WX 745 ; N unifef5 ; G 5022
4828
- U 65270 ; WX 759 ; N unifef6 ; G 5023
4829
- U 65271 ; WX 745 ; N unifef7 ; G 5024
4830
- U 65272 ; WX 759 ; N unifef8 ; G 5025
4831
- U 65273 ; WX 745 ; N unifef9 ; G 5026
4832
- U 65274 ; WX 759 ; N unifefa ; G 5027
4833
- U 65275 ; WX 745 ; N unifefb ; G 5028
4834
- U 65276 ; WX 759 ; N unifefc ; G 5029
4835
- U 65533 ; WX 1113 ; N unifffd ; G 5035
4836
- U 119552 ; WX 896 ; N uni1d300 ; G 0
4837
- U 119553 ; WX 896 ; N uni1d301 ; G 0
4838
- U 119554 ; WX 896 ; N uni1d302 ; G 0
4839
- U 119555 ; WX 896 ; N uni1d303 ; G 0
4840
- U 119556 ; WX 896 ; N uni1d304 ; G 0
4841
- U 119557 ; WX 896 ; N uni1d305 ; G 0
4842
- U 119558 ; WX 896 ; N uni1d306 ; G 0
4843
- U 119559 ; WX 896 ; N uni1d307 ; G 0
4844
- U 119560 ; WX 896 ; N uni1d308 ; G 0
4845
- U 119561 ; WX 896 ; N uni1d309 ; G 0
4846
- U 119562 ; WX 896 ; N uni1d30a ; G 0
4847
- U 119563 ; WX 896 ; N uni1d30b ; G 0
4848
- U 119564 ; WX 896 ; N uni1d30c ; G 0
4849
- U 119565 ; WX 896 ; N uni1d30d ; G 0
4850
- U 119566 ; WX 896 ; N uni1d30e ; G 0
4851
- U 119567 ; WX 896 ; N uni1d30f ; G 0
4852
- U 119568 ; WX 896 ; N uni1d310 ; G 0
4853
- U 119569 ; WX 896 ; N uni1d311 ; G 0
4854
- U 119570 ; WX 896 ; N uni1d312 ; G 0
4855
- U 119571 ; WX 896 ; N uni1d313 ; G 0
4856
- U 119572 ; WX 896 ; N uni1d314 ; G 0
4857
- U 119573 ; WX 896 ; N uni1d315 ; G 0
4858
- U 119574 ; WX 896 ; N uni1d316 ; G 0
4859
- U 119575 ; WX 896 ; N uni1d317 ; G 0
4860
- U 119576 ; WX 896 ; N uni1d318 ; G 0
4861
- U 119577 ; WX 896 ; N uni1d319 ; G 0
4862
- U 119578 ; WX 896 ; N uni1d31a ; G 0
4863
- U 119579 ; WX 896 ; N uni1d31b ; G 0
4864
- U 119580 ; WX 896 ; N uni1d31c ; G 0
4865
- U 119581 ; WX 896 ; N uni1d31d ; G 0
4866
- U 119582 ; WX 896 ; N uni1d31e ; G 0
4867
- U 119583 ; WX 896 ; N uni1d31f ; G 0
4868
- U 119584 ; WX 896 ; N uni1d320 ; G 0
4869
- U 119585 ; WX 896 ; N uni1d321 ; G 0
4870
- U 119586 ; WX 896 ; N uni1d322 ; G 0
4871
- U 119587 ; WX 896 ; N uni1d323 ; G 0
4872
- U 119588 ; WX 896 ; N uni1d324 ; G 0
4873
- U 119589 ; WX 896 ; N uni1d325 ; G 0
4874
- U 119590 ; WX 896 ; N uni1d326 ; G 0
4875
- U 119591 ; WX 896 ; N uni1d327 ; G 0
4876
- U 119592 ; WX 896 ; N uni1d328 ; G 0
4877
- U 119593 ; WX 896 ; N uni1d329 ; G 0
4878
- U 119594 ; WX 896 ; N uni1d32a ; G 0
4879
- U 119595 ; WX 896 ; N uni1d32b ; G 0
4880
- U 119596 ; WX 896 ; N uni1d32c ; G 0
4881
- U 119597 ; WX 896 ; N uni1d32d ; G 0
4882
- U 119598 ; WX 896 ; N uni1d32e ; G 0
4883
- U 119599 ; WX 896 ; N uni1d32f ; G 0
4884
- U 119600 ; WX 896 ; N uni1d330 ; G 0
4885
- U 119601 ; WX 896 ; N uni1d331 ; G 0
4886
- U 119602 ; WX 896 ; N uni1d332 ; G 0
4887
- U 119603 ; WX 896 ; N uni1d333 ; G 0
4888
- U 119604 ; WX 896 ; N uni1d334 ; G 0
4889
- U 119605 ; WX 896 ; N uni1d335 ; G 0
4890
- U 119606 ; WX 896 ; N uni1d336 ; G 0
4891
- U 119607 ; WX 896 ; N uni1d337 ; G 0
4892
- U 119608 ; WX 896 ; N uni1d338 ; G 0
4893
- U 119609 ; WX 896 ; N uni1d339 ; G 0
4894
- U 119610 ; WX 896 ; N uni1d33a ; G 0
4895
- U 119611 ; WX 896 ; N uni1d33b ; G 0
4896
- U 119612 ; WX 896 ; N uni1d33c ; G 0
4897
- U 119613 ; WX 896 ; N uni1d33d ; G 0
4898
- U 119614 ; WX 896 ; N uni1d33e ; G 0
4899
- U 119615 ; WX 896 ; N uni1d33f ; G 0
4900
- U 119616 ; WX 896 ; N uni1d340 ; G 0
4901
- U 119617 ; WX 896 ; N uni1d341 ; G 0
4902
- U 119618 ; WX 896 ; N uni1d342 ; G 0
4903
- U 119619 ; WX 896 ; N uni1d343 ; G 0
4904
- U 119620 ; WX 896 ; N uni1d344 ; G 0
4905
- U 119621 ; WX 896 ; N uni1d345 ; G 0
4906
- U 119622 ; WX 896 ; N uni1d346 ; G 0
4907
- U 119623 ; WX 896 ; N uni1d347 ; G 0
4908
- U 119624 ; WX 896 ; N uni1d348 ; G 0
4909
- U 119625 ; WX 896 ; N uni1d349 ; G 0
4910
- U 119626 ; WX 896 ; N uni1d34a ; G 0
4911
- U 119627 ; WX 896 ; N uni1d34b ; G 0
4912
- U 119628 ; WX 896 ; N uni1d34c ; G 0
4913
- U 119629 ; WX 896 ; N uni1d34d ; G 0
4914
- U 119630 ; WX 896 ; N uni1d34e ; G 0
4915
- U 119631 ; WX 896 ; N uni1d34f ; G 0
4916
- U 119632 ; WX 896 ; N uni1d350 ; G 0
4917
- U 119633 ; WX 896 ; N uni1d351 ; G 0
4918
- U 119634 ; WX 896 ; N uni1d352 ; G 0
4919
- U 119635 ; WX 896 ; N uni1d353 ; G 0
4920
- U 119636 ; WX 896 ; N uni1d354 ; G 0
4921
- U 119637 ; WX 896 ; N uni1d355 ; G 0
4922
- U 119638 ; WX 896 ; N uni1d356 ; G 0
4923
- U 120120 ; WX 760 ; N uni1d538 ; G 0
4924
- U 120121 ; WX 771 ; N uni1d539 ; G 0
4925
- U 120123 ; WX 830 ; N uni1d53b ; G 0
4926
- U 120124 ; WX 686 ; N uni1d53c ; G 0
4927
- U 120125 ; WX 686 ; N uni1d53d ; G 0
4928
- U 120126 ; WX 821 ; N uni1d53e ; G 0
4929
- U 120128 ; WX 460 ; N uni1d540 ; G 0
4930
- U 120129 ; WX 389 ; N uni1d541 ; G 0
4931
- U 120130 ; WX 792 ; N uni1d542 ; G 0
4932
- U 120131 ; WX 654 ; N uni1d543 ; G 0
4933
- U 120132 ; WX 1042 ; N uni1d544 ; G 0
4934
- U 120134 ; WX 850 ; N uni1d546 ; G 0
4935
- U 120138 ; WX 720 ; N uni1d54a ; G 0
4936
- U 120139 ; WX 699 ; N uni1d54b ; G 0
4937
- U 120140 ; WX 827 ; N uni1d54c ; G 0
4938
- U 120141 ; WX 770 ; N uni1d54d ; G 0
4939
- U 120142 ; WX 1082 ; N uni1d54e ; G 0
4940
- U 120143 ; WX 806 ; N uni1d54f ; G 0
4941
- U 120144 ; WX 741 ; N uni1d550 ; G 0
4942
- U 120146 ; WX 704 ; N uni1d552 ; G 0
4943
- U 120147 ; WX 716 ; N uni1d553 ; G 0
4944
- U 120148 ; WX 593 ; N uni1d554 ; G 0
4945
- U 120149 ; WX 716 ; N uni1d555 ; G 0
4946
- U 120150 ; WX 678 ; N uni1d556 ; G 0
4947
- U 120151 ; WX 506 ; N uni1d557 ; G 0
4948
- U 120152 ; WX 726 ; N uni1d558 ; G 0
4949
- U 120153 ; WX 712 ; N uni1d559 ; G 0
4950
- U 120154 ; WX 343 ; N uni1d55a ; G 0
4951
- U 120155 ; WX 343 ; N uni1d55b ; G 0
4952
- U 120156 ; WX 694 ; N uni1d55c ; G 0
4953
- U 120157 ; WX 343 ; N uni1d55d ; G 0
4954
- U 120158 ; WX 1113 ; N uni1d55e ; G 0
4955
- U 120159 ; WX 712 ; N uni1d55f ; G 0
4956
- U 120160 ; WX 687 ; N uni1d560 ; G 0
4957
- U 120161 ; WX 716 ; N uni1d561 ; G 0
4958
- U 120162 ; WX 716 ; N uni1d562 ; G 0
4959
- U 120163 ; WX 522 ; N uni1d563 ; G 0
4960
- U 120164 ; WX 595 ; N uni1d564 ; G 0
4961
- U 120165 ; WX 507 ; N uni1d565 ; G 0
4962
- U 120166 ; WX 712 ; N uni1d566 ; G 0
4963
- U 120167 ; WX 581 ; N uni1d567 ; G 0
4964
- U 120168 ; WX 904 ; N uni1d568 ; G 0
4965
- U 120169 ; WX 689 ; N uni1d569 ; G 0
4966
- U 120170 ; WX 652 ; N uni1d56a ; G 0
4967
- U 120171 ; WX 601 ; N uni1d56b ; G 0
4968
- U 120276 ; WX 774 ; N uni1d5d4 ; G 0
4969
- U 120277 ; WX 762 ; N uni1d5d5 ; G 0
4970
- U 120278 ; WX 734 ; N uni1d5d6 ; G 0
4971
- U 120279 ; WX 830 ; N uni1d5d7 ; G 0
4972
- U 120280 ; WX 683 ; N uni1d5d8 ; G 0
4973
- U 120281 ; WX 683 ; N uni1d5d9 ; G 0
4974
- U 120282 ; WX 821 ; N uni1d5da ; G 0
4975
- U 120283 ; WX 837 ; N uni1d5db ; G 0
4976
- U 120284 ; WX 513 ; N uni1d5dc ; G 0
4977
- U 120285 ; WX 372 ; N uni1d5dd ; G 0
4978
- U 120286 ; WX 775 ; N uni1d5de ; G 0
4979
- U 120287 ; WX 637 ; N uni1d5df ; G 0
4980
- U 120288 ; WX 995 ; N uni1d5e0 ; G 0
4981
- U 120289 ; WX 837 ; N uni1d5e1 ; G 0
4982
- U 120290 ; WX 850 ; N uni1d5e2 ; G 0
4983
- U 120291 ; WX 733 ; N uni1d5e3 ; G 0
4984
- U 120292 ; WX 850 ; N uni1d5e4 ; G 0
4985
- U 120293 ; WX 770 ; N uni1d5e5 ; G 0
4986
- U 120294 ; WX 720 ; N uni1d5e6 ; G 0
4987
- U 120295 ; WX 682 ; N uni1d5e7 ; G 0
4988
- U 120296 ; WX 812 ; N uni1d5e8 ; G 0
4989
- U 120297 ; WX 774 ; N uni1d5e9 ; G 0
4990
- U 120298 ; WX 1103 ; N uni1d5ea ; G 0
4991
- U 120299 ; WX 771 ; N uni1d5eb ; G 0
4992
- U 120300 ; WX 724 ; N uni1d5ec ; G 0
4993
- U 120301 ; WX 725 ; N uni1d5ed ; G 0
4994
- U 120302 ; WX 675 ; N uni1d5ee ; G 0
4995
- U 120303 ; WX 716 ; N uni1d5ef ; G 0
4996
- U 120304 ; WX 593 ; N uni1d5f0 ; G 0
4997
- U 120305 ; WX 716 ; N uni1d5f1 ; G 0
4998
- U 120306 ; WX 678 ; N uni1d5f2 ; G 0
4999
- U 120307 ; WX 435 ; N uni1d5f3 ; G 0
5000
- U 120308 ; WX 716 ; N uni1d5f4 ; G 0
5001
- U 120309 ; WX 712 ; N uni1d5f5 ; G 0
5002
- U 120310 ; WX 343 ; N uni1d5f6 ; G 0
5003
- U 120311 ; WX 343 ; N uni1d5f7 ; G 0
5004
- U 120312 ; WX 665 ; N uni1d5f8 ; G 0
5005
- U 120313 ; WX 343 ; N uni1d5f9 ; G 0
5006
- U 120314 ; WX 1042 ; N uni1d5fa ; G 0
5007
- U 120315 ; WX 712 ; N uni1d5fb ; G 0
5008
- U 120316 ; WX 687 ; N uni1d5fc ; G 0
5009
- U 120317 ; WX 716 ; N uni1d5fd ; G 0
5010
- U 120318 ; WX 716 ; N uni1d5fe ; G 0
5011
- U 120319 ; WX 493 ; N uni1d5ff ; G 0
5012
- U 120320 ; WX 595 ; N uni1d600 ; G 0
5013
- U 120321 ; WX 478 ; N uni1d601 ; G 0
5014
- U 120322 ; WX 712 ; N uni1d602 ; G 0
5015
- U 120323 ; WX 652 ; N uni1d603 ; G 0
5016
- U 120324 ; WX 924 ; N uni1d604 ; G 0
5017
- U 120325 ; WX 645 ; N uni1d605 ; G 0
5018
- U 120326 ; WX 652 ; N uni1d606 ; G 0
5019
- U 120327 ; WX 582 ; N uni1d607 ; G 0
5020
- U 120662 ; WX 774 ; N uni1d756 ; G 0
5021
- U 120663 ; WX 762 ; N uni1d757 ; G 0
5022
- U 120664 ; WX 637 ; N uni1d758 ; G 0
5023
- U 120665 ; WX 774 ; N uni1d759 ; G 0
5024
- U 120666 ; WX 683 ; N uni1d75a ; G 0
5025
- U 120667 ; WX 725 ; N uni1d75b ; G 0
5026
- U 120668 ; WX 837 ; N uni1d75c ; G 0
5027
- U 120669 ; WX 850 ; N uni1d75d ; G 0
5028
- U 120670 ; WX 372 ; N uni1d75e ; G 0
5029
- U 120671 ; WX 775 ; N uni1d75f ; G 0
5030
- U 120672 ; WX 774 ; N uni1d760 ; G 0
5031
- U 120673 ; WX 995 ; N uni1d761 ; G 0
5032
- U 120674 ; WX 837 ; N uni1d762 ; G 0
5033
- U 120675 ; WX 632 ; N uni1d763 ; G 0
5034
- U 120676 ; WX 850 ; N uni1d764 ; G 0
5035
- U 120677 ; WX 837 ; N uni1d765 ; G 0
5036
- U 120678 ; WX 733 ; N uni1d766 ; G 0
5037
- U 120679 ; WX 850 ; N uni1d767 ; G 0
5038
- U 120680 ; WX 683 ; N uni1d768 ; G 0
5039
- U 120681 ; WX 682 ; N uni1d769 ; G 0
5040
- U 120682 ; WX 724 ; N uni1d76a ; G 0
5041
- U 120683 ; WX 850 ; N uni1d76b ; G 0
5042
- U 120684 ; WX 771 ; N uni1d76c ; G 0
5043
- U 120685 ; WX 850 ; N uni1d76d ; G 0
5044
- U 120686 ; WX 850 ; N uni1d76e ; G 0
5045
- U 120687 ; WX 697 ; N uni1d76f ; G 0
5046
- U 120688 ; WX 687 ; N uni1d770 ; G 0
5047
- U 120689 ; WX 716 ; N uni1d771 ; G 0
5048
- U 120690 ; WX 681 ; N uni1d772 ; G 0
5049
- U 120691 ; WX 687 ; N uni1d773 ; G 0
5050
- U 120692 ; WX 557 ; N uni1d774 ; G 0
5051
- U 120693 ; WX 591 ; N uni1d775 ; G 0
5052
- U 120694 ; WX 712 ; N uni1d776 ; G 0
5053
- U 120695 ; WX 687 ; N uni1d777 ; G 0
5054
- U 120696 ; WX 390 ; N uni1d778 ; G 0
5055
- U 120697 ; WX 710 ; N uni1d779 ; G 0
5056
- U 120698 ; WX 633 ; N uni1d77a ; G 0
5057
- U 120699 ; WX 736 ; N uni1d77b ; G 0
5058
- U 120700 ; WX 681 ; N uni1d77c ; G 0
5059
- U 120701 ; WX 591 ; N uni1d77d ; G 0
5060
- U 120702 ; WX 687 ; N uni1d77e ; G 0
5061
- U 120703 ; WX 791 ; N uni1d77f ; G 0
5062
- U 120704 ; WX 716 ; N uni1d780 ; G 0
5063
- U 120705 ; WX 593 ; N uni1d781 ; G 0
5064
- U 120706 ; WX 779 ; N uni1d782 ; G 0
5065
- U 120707 ; WX 638 ; N uni1d783 ; G 0
5066
- U 120708 ; WX 675 ; N uni1d784 ; G 0
5067
- U 120709 ; WX 782 ; N uni1d785 ; G 0
5068
- U 120710 ; WX 645 ; N uni1d786 ; G 0
5069
- U 120711 ; WX 794 ; N uni1d787 ; G 0
5070
- U 120712 ; WX 869 ; N uni1d788 ; G 0
5071
- U 120713 ; WX 544 ; N uni1d789 ; G 0
5072
- U 120714 ; WX 645 ; N uni1d78a ; G 0
5073
- U 120715 ; WX 661 ; N uni1d78b ; G 0
5074
- U 120716 ; WX 744 ; N uni1d78c ; G 0
5075
- U 120717 ; WX 796 ; N uni1d78d ; G 0
5076
- U 120718 ; WX 716 ; N uni1d78e ; G 0
5077
- U 120719 ; WX 869 ; N uni1d78f ; G 0
5078
- U 120792 ; WX 696 ; N uni1d7d8 ; G 0
5079
- U 120793 ; WX 696 ; N uni1d7d9 ; G 0
5080
- U 120794 ; WX 696 ; N uni1d7da ; G 0
5081
- U 120795 ; WX 696 ; N uni1d7db ; G 0
5082
- U 120796 ; WX 696 ; N uni1d7dc ; G 0
5083
- U 120797 ; WX 696 ; N uni1d7dd ; G 0
5084
- U 120798 ; WX 696 ; N uni1d7de ; G 0
5085
- U 120799 ; WX 696 ; N uni1d7df ; G 0
5086
- U 120800 ; WX 696 ; N uni1d7e0 ; G 0
5087
- U 120801 ; WX 696 ; N uni1d7e1 ; G 0
5088
- U 120812 ; WX 696 ; N uni1d7ec ; G 0
5089
- U 120813 ; WX 696 ; N uni1d7ed ; G 0
5090
- U 120814 ; WX 696 ; N uni1d7ee ; G 0
5091
- U 120815 ; WX 696 ; N uni1d7ef ; G 0
5092
- U 120816 ; WX 696 ; N uni1d7f0 ; G 0
5093
- U 120817 ; WX 696 ; N uni1d7f1 ; G 0
5094
- U 120818 ; WX 696 ; N uni1d7f2 ; G 0
5095
- U 120819 ; WX 696 ; N uni1d7f3 ; G 0
5096
- U 120820 ; WX 696 ; N uni1d7f4 ; G 0
5097
- U 120821 ; WX 696 ; N uni1d7f5 ; G 0
5098
- U 127024 ; WX 1364 ; N uni1f030 ; G 0
5099
- U 127025 ; WX 1364 ; N uni1f031 ; G 0
5100
- U 127026 ; WX 1364 ; N uni1f032 ; G 0
5101
- U 127027 ; WX 1364 ; N uni1f033 ; G 0
5102
- U 127028 ; WX 1364 ; N uni1f034 ; G 0
5103
- U 127029 ; WX 1364 ; N uni1f035 ; G 0
5104
- U 127030 ; WX 1364 ; N uni1f036 ; G 0
5105
- U 127031 ; WX 1364 ; N uni1f037 ; G 0
5106
- U 127032 ; WX 1364 ; N uni1f038 ; G 0
5107
- U 127033 ; WX 1364 ; N uni1f039 ; G 0
5108
- U 127034 ; WX 1364 ; N uni1f03a ; G 0
5109
- U 127035 ; WX 1364 ; N uni1f03b ; G 0
5110
- U 127036 ; WX 1364 ; N uni1f03c ; G 0
5111
- U 127037 ; WX 1364 ; N uni1f03d ; G 0
5112
- U 127038 ; WX 1364 ; N uni1f03e ; G 0
5113
- U 127039 ; WX 1364 ; N uni1f03f ; G 0
5114
- U 127040 ; WX 1364 ; N uni1f040 ; G 0
5115
- U 127041 ; WX 1364 ; N uni1f041 ; G 0
5116
- U 127042 ; WX 1364 ; N uni1f042 ; G 0
5117
- U 127043 ; WX 1364 ; N uni1f043 ; G 0
5118
- U 127044 ; WX 1364 ; N uni1f044 ; G 0
5119
- U 127045 ; WX 1364 ; N uni1f045 ; G 0
5120
- U 127046 ; WX 1364 ; N uni1f046 ; G 0
5121
- U 127047 ; WX 1364 ; N uni1f047 ; G 0
5122
- U 127048 ; WX 1364 ; N uni1f048 ; G 0
5123
- U 127049 ; WX 1364 ; N uni1f049 ; G 0
5124
- U 127050 ; WX 1364 ; N uni1f04a ; G 0
5125
- U 127051 ; WX 1364 ; N uni1f04b ; G 0
5126
- U 127052 ; WX 1364 ; N uni1f04c ; G 0
5127
- U 127053 ; WX 1364 ; N uni1f04d ; G 0
5128
- U 127054 ; WX 1364 ; N uni1f04e ; G 0
5129
- U 127055 ; WX 1364 ; N uni1f04f ; G 0
5130
- U 127056 ; WX 1364 ; N uni1f050 ; G 0
5131
- U 127057 ; WX 1364 ; N uni1f051 ; G 0
5132
- U 127058 ; WX 1364 ; N uni1f052 ; G 0
5133
- U 127059 ; WX 1364 ; N uni1f053 ; G 0
5134
- U 127060 ; WX 1364 ; N uni1f054 ; G 0
5135
- U 127061 ; WX 1364 ; N uni1f055 ; G 0
5136
- U 127062 ; WX 1364 ; N uni1f056 ; G 0
5137
- U 127063 ; WX 1364 ; N uni1f057 ; G 0
5138
- U 127064 ; WX 1364 ; N uni1f058 ; G 0
5139
- U 127065 ; WX 1364 ; N uni1f059 ; G 0
5140
- U 127066 ; WX 1364 ; N uni1f05a ; G 0
5141
- U 127067 ; WX 1364 ; N uni1f05b ; G 0
5142
- U 127068 ; WX 1364 ; N uni1f05c ; G 0
5143
- U 127069 ; WX 1364 ; N uni1f05d ; G 0
5144
- U 127070 ; WX 1364 ; N uni1f05e ; G 0
5145
- U 127071 ; WX 1364 ; N uni1f05f ; G 0
5146
- U 127072 ; WX 1364 ; N uni1f060 ; G 0
5147
- U 127073 ; WX 1364 ; N uni1f061 ; G 0
5148
- U 127074 ; WX 815 ; N uni1f062 ; G 0
5149
- U 127075 ; WX 815 ; N uni1f063 ; G 0
5150
- U 127076 ; WX 815 ; N uni1f064 ; G 0
5151
- U 127077 ; WX 815 ; N uni1f065 ; G 0
5152
- U 127078 ; WX 815 ; N uni1f066 ; G 0
5153
- U 127079 ; WX 815 ; N uni1f067 ; G 0
5154
- U 127080 ; WX 815 ; N uni1f068 ; G 0
5155
- U 127081 ; WX 815 ; N uni1f069 ; G 0
5156
- U 127082 ; WX 815 ; N uni1f06a ; G 0
5157
- U 127083 ; WX 815 ; N uni1f06b ; G 0
5158
- U 127084 ; WX 815 ; N uni1f06c ; G 0
5159
- U 127085 ; WX 815 ; N uni1f06d ; G 0
5160
- U 127086 ; WX 815 ; N uni1f06e ; G 0
5161
- U 127087 ; WX 815 ; N uni1f06f ; G 0
5162
- U 127088 ; WX 815 ; N uni1f070 ; G 0
5163
- U 127089 ; WX 815 ; N uni1f071 ; G 0
5164
- U 127090 ; WX 815 ; N uni1f072 ; G 0
5165
- U 127091 ; WX 815 ; N uni1f073 ; G 0
5166
- U 127092 ; WX 815 ; N uni1f074 ; G 0
5167
- U 127093 ; WX 815 ; N uni1f075 ; G 0
5168
- U 127094 ; WX 815 ; N uni1f076 ; G 0
5169
- U 127095 ; WX 815 ; N uni1f077 ; G 0
5170
- U 127096 ; WX 815 ; N uni1f078 ; G 0
5171
- U 127097 ; WX 815 ; N uni1f079 ; G 0
5172
- U 127098 ; WX 815 ; N uni1f07a ; G 0
5173
- U 127099 ; WX 815 ; N uni1f07b ; G 0
5174
- U 127100 ; WX 815 ; N uni1f07c ; G 0
5175
- U 127101 ; WX 815 ; N uni1f07d ; G 0
5176
- U 127102 ; WX 815 ; N uni1f07e ; G 0
5177
- U 127103 ; WX 815 ; N uni1f07f ; G 0
5178
- U 127104 ; WX 815 ; N uni1f080 ; G 0
5179
- U 127105 ; WX 815 ; N uni1f081 ; G 0
5180
- U 127106 ; WX 815 ; N uni1f082 ; G 0
5181
- U 127107 ; WX 815 ; N uni1f083 ; G 0
5182
- U 127108 ; WX 815 ; N uni1f084 ; G 0
5183
- U 127109 ; WX 815 ; N uni1f085 ; G 0
5184
- U 127110 ; WX 815 ; N uni1f086 ; G 0
5185
- U 127111 ; WX 815 ; N uni1f087 ; G 0
5186
- U 127112 ; WX 815 ; N uni1f088 ; G 0
5187
- U 127113 ; WX 815 ; N uni1f089 ; G 0
5188
- U 127114 ; WX 815 ; N uni1f08a ; G 0
5189
- U 127115 ; WX 815 ; N uni1f08b ; G 0
5190
- U 127116 ; WX 815 ; N uni1f08c ; G 0
5191
- U 127117 ; WX 815 ; N uni1f08d ; G 0
5192
- U 127118 ; WX 815 ; N uni1f08e ; G 0
5193
- U 127119 ; WX 815 ; N uni1f08f ; G 0
5194
- U 127120 ; WX 815 ; N uni1f090 ; G 0
5195
- U 127121 ; WX 815 ; N uni1f091 ; G 0
5196
- U 127122 ; WX 815 ; N uni1f092 ; G 0
5197
- U 127123 ; WX 815 ; N uni1f093 ; G 0
1
  StartFontMetrics 4.1
2
+ Notice Converted by PHP-font-lib
3
+ Comment http://php-font-lib.googlecode.com/
 
4
  EncodingScheme FontSpecific
5
+ FontName DejaVu Sans
6
+ FontSubfamily Bold
7
+ UniqueID DejaVu Sans Bold
8
+ FullName DejaVu Sans Bold
9
+ Version Version 2.32
10
+ PostScriptName DejaVuSans-Bold
11
+ Manufacturer DejaVu fonts team
12
+ FontVendorURL http://dejavu.sourceforge.net
13
+ LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License
14
+ PreferredFamily DejaVu Sans
15
+ PreferredSubfamily Bold
16
  Weight Bold
 
 
17
  ItalicAngle 0
 
 
 
18
  IsFixedPitch false
19
+ UnderlineThickness 44
20
+ UnderlinePosition -63
21
+ FontHeightOffset 0
22
+ Ascender 928
23
+ Descender -236
24
  FontBBox -1069 -415 1975 1174
25
+ StartCharMetrics 5690
26
+ U 32 ; WX 348 ; N space ; G 3
27
+ U 33 ; WX 456 ; N exclam ; G 4
28
+ U 34 ; WX 521 ; N quotedbl ; G 5
29
+ U 35 ; WX 838 ; N numbersign ; G 6
30
+ U 36 ; WX 696 ; N dollar ; G 7
31
+ U 37 ; WX 1002 ; N percent ; G 8
32
+ U 38 ; WX 872 ; N ampersand ; G 9
33
+ U 39 ; WX 306 ; N quotesingle ; G 10
34
+ U 40 ; WX 457 ; N parenleft ; G 11
35
+ U 41 ; WX 457 ; N parenright ; G 12
36
+ U 42 ; WX 523 ; N asterisk ; G 13
37
+ U 43 ; WX 838 ; N plus ; G 14
38
+ U 44 ; WX 380 ; N comma ; G 15
39
+ U 45 ; WX 415 ; N hyphen ; G 16
40
+ U 46 ; WX 380 ; N period ; G 17
41
+ U 47 ; WX 365 ; N slash ; G 18
42
+ U 48 ; WX 696 ; N zero ; G 19
43
+ U 49 ; WX 696 ; N one ; G 20
44
+ U 50 ; WX 696 ; N two ; G 21
45
+ U 51 ; WX 696 ; N three ; G 22
46
+ U 52 ; WX 696 ; N four ; G 23
47
+ U 53 ; WX 696 ; N five ; G 24
48
+ U 54 ; WX 696 ; N six ; G 25
49
+ U 55 ; WX 696 ; N seven ; G 26
50
+ U 56 ; WX 696 ; N eight ; G 27
51
+ U 57 ; WX 696 ; N nine ; G 28
52
+ U 58 ; WX 400 ; N colon ; G 29
53
+ U 59 ; WX 400 ; N semicolon ; G 30
54
+ U 60 ; WX 838 ; N less ; G 31
55
+ U 61 ; WX 838 ; N equal ; G 32
56
+ U 62 ; WX 838 ; N greater ; G 33
57
+ U 63 ; WX 580 ; N question ; G 34
58
+ U 64 ; WX 1000 ; N at ; G 35
59
+ U 65 ; WX 774 ; N A ; G 36
60
+ U 66 ; WX 762 ; N B ; G 37
61
+ U 67 ; WX 734 ; N C ; G 38
62
+ U 68 ; WX 830 ; N D ; G 39
63
+ U 69 ; WX 683 ; N E ; G 40
64
+ U 70 ; WX 683 ; N F ; G 41
65
+ U 71 ; WX 821 ; N G ; G 42
66
+ U 72 ; WX 837 ; N H ; G 43
67
+ U 73 ; WX 372 ; N I ; G 44
68
+ U 74 ; WX 372 ; N J ; G 45
69
+ U 75 ; WX 775 ; N K ; G 46
70
+ U 76 ; WX 637 ; N L ; G 47
71
+ U 77 ; WX 995 ; N M ; G 48
72
+ U 78 ; WX 837 ; N N ; G 49
73
+ U 79 ; WX 850 ; N O ; G 50
74
+ U 80 ; WX 733 ; N P ; G 51
75
+ U 81 ; WX 850 ; N Q ; G 52
76
+ U 82 ; WX 770 ; N R ; G 53
77
+ U 83 ; WX 720 ; N S ; G 54
78
+ U 84 ; WX 682 ; N T ; G 55
79
+ U 85 ; WX 812 ; N U ; G 56
80
+ U 86 ; WX 774 ; N V ; G 57
81
+ U 87 ; WX 1103 ; N W ; G 58
82
+ U 88 ; WX 771 ; N X ; G 59
83
+ U 89 ; WX 724 ; N Y ; G 60
84
+ U 90 ; WX 725 ; N Z ; G 61
85
+ U 91 ; WX 457 ; N bracketleft ; G 62
86
+ U 92 ; WX 365 ; N backslash ; G 63
87
+ U 93 ; WX 457 ; N bracketright ; G 64
88
+ U 94 ; WX 838 ; N asciicircum ; G 65
89
+ U 95 ; WX 500 ; N underscore ; G 66
90
+ U 96 ; WX 500 ; N grave ; G 67
91
+ U 97 ; WX 675 ; N a ; G 68
92
+ U 98 ; WX 716 ; N b ; G 69
93
+ U 99 ; WX 593 ; N c ; G 70
94
+ U 100 ; WX 716 ; N d ; G 71
95
+ U 101 ; WX 678 ; N e ; G 72
96
+ U 102 ; WX 435 ; N f ; G 73
97
+ U 103 ; WX 716 ; N g ; G 74
98
+ U 104 ; WX 712 ; N h ; G 75
99
+ U 105 ; WX 343 ; N i ; G 76
100
+ U 106 ; WX 343 ; N j ; G 77
101
+ U 107 ; WX 665 ; N k ; G 78
102
+ U 108 ; WX 343 ; N l ; G 79
103
+ U 109 ; WX 1042 ; N m ; G 80
104
+ U 110 ; WX 712 ; N n ; G 81
105
+ U 111 ; WX 687 ; N o ; G 82
106
+ U 112 ; WX 716 ; N p ; G 83
107
+ U 113 ; WX 716 ; N q ; G 84
108
+ U 114 ; WX 493 ; N r ; G 85
109
+ U 115 ; WX 595 ; N s ; G 86
110
+ U 116 ; WX 478 ; N t ; G 87
111
+ U 117 ; WX 712 ; N u ; G 88
112
+ U 118 ; WX 652 ; N v ; G 89
113
+ U 119 ; WX 924 ; N w ; G 90
114
+ U 120 ; WX 645 ; N x ; G 91
115
+ U 121 ; WX 652 ; N y ; G 92
116
+ U 122 ; WX 582 ; N z ; G 93
117
+ U 123 ; WX 712 ; N braceleft ; G 94
118
+ U 124 ; WX 365 ; N bar ; G 95
119
+ U 125 ; WX 712 ; N braceright ; G 96
120
+ U 126 ; WX 838 ; N asciitilde ; G 97
121
+ U 160 ; WX 348 ; N nbspace ; G 98
122
+ U 161 ; WX 456 ; N exclamdown ; G 99
123
+ U 162 ; WX 696 ; N cent ; G 100
124
+ U 163 ; WX 696 ; N sterling ; G 101
125
+ U 164 ; WX 636 ; N currency ; G 102
126
+ U 165 ; WX 696 ; N yen ; G 103
127
+ U 166 ; WX 365 ; N brokenbar ; G 104
128
+ U 167 ; WX 500 ; N section ; G 105
129
+ U 168 ; WX 500 ; N dieresis ; G 106
130
+ U 169 ; WX 1000 ; N copyright ; G 107
131
+ U 170 ; WX 564 ; N ordfeminine ; G 108
132
+ U 171 ; WX 646 ; N guillemotleft ; G 109
133
+ U 172 ; WX 838 ; N logicalnot ; G 110
134
+ U 173 ; WX 415 ; N sfthyphen ; G 111
135
+ U 174 ; WX 1000 ; N registered ; G 112
136
+ U 175 ; WX 500 ; N macron ; G 113
137
+ U 176 ; WX 500 ; N degree ; G 114
138
+ U 177 ; WX 838 ; N plusminus ; G 115
139
+ U 178 ; WX 438 ; N twosuperior ; G 116
140
+ U 179 ; WX 438 ; N threesuperior ; G 117
141
+ U 180 ; WX 500 ; N acute ; G 118
142
+ U 181 ; WX 736 ; N mu ; G 119
143
+ U 182 ; WX 636 ; N paragraph ; G 120
144
+ U 183 ; WX 380 ; N periodcentered ; G 121
145
+ U 184 ; WX 500 ; N cedilla ; G 122
146
+ U 185 ; WX 438 ; N onesuperior ; G 123
147
+ U 186 ; WX 564 ; N ordmasculine ; G 124
148
+ U 187 ; WX 646 ; N guillemotright ; G 125
149
+ U 188 ; WX 1035 ; N onequarter ; G 126
150
+ U 189 ; WX 1035 ; N onehalf ; G 127
151
+ U 190 ; WX 1035 ; N threequarters ; G 128
152
+ U 191 ; WX 580 ; N questiondown ; G 129
153
+ U 192 ; WX 774 ; N Agrave ; G 130
154
+ U 193 ; WX 774 ; N Aacute ; G 131
155
+ U 194 ; WX 774 ; N Acircumflex ; G 132
156
+ U 195 ; WX 774 ; N Atilde ; G 133
157
+ U 196 ; WX 774 ; N Adieresis ; G 134
158
+ U 197 ; WX 774 ; N Aring ; G 135
159
+ U 198 ; WX 1085 ; N AE ; G 136
160
+ U 199 ; WX 734 ; N Ccedilla ; G 137
161
+ U 200 ; WX 683 ; N Egrave ; G 138
162
+ U 201 ; WX 683 ; N Eacute ; G 139
163
+ U 202 ; WX 683 ; N Ecircumflex ; G 140
164
+ U 203 ; WX 683 ; N Edieresis ; G 141
165
+ U 204 ; WX 372 ; N Igrave ; G 142
166
+ U 205 ; WX 372 ; N Iacute ; G 143
167
+ U 206 ; WX 372 ; N Icircumflex ; G 144
168
+ U 207 ; WX 372 ; N Idieresis ; G 145
169
+ U 208 ; WX 838 ; N Eth ; G 146
170
+ U 209 ; WX 837 ; N Ntilde ; G 147
171
+ U 210 ; WX 850 ; N Ograve ; G 148
172
+ U 211 ; WX 850 ; N Oacute ; G 149
173
+ U 212 ; WX 850 ; N Ocircumflex ; G 150
174
+ U 213 ; WX 850 ; N Otilde ; G 151
175
+ U 214 ; WX 850 ; N Odieresis ; G 152
176
+ U 215 ; WX 838 ; N multiply ; G 153
177
+ U 216 ; WX 850 ; N Oslash ; G 154
178
+ U 217 ; WX 812 ; N Ugrave ; G 155
179
+ U 218 ; WX 812 ; N Uacute ; G 156
180
+ U 219 ; WX 812 ; N Ucircumflex ; G 157
181
+ U 220 ; WX 812 ; N Udieresis ; G 158
182
+ U 221 ; WX 724 ; N Yacute ; G 159
183
+ U 222 ; WX 738 ; N Thorn ; G 160
184
+ U 223 ; WX 719 ; N germandbls ; G 161
185
+ U 224 ; WX 675 ; N agrave ; G 162
186
+ U 225 ; WX 675 ; N aacute ; G 163
187
+ U 226 ; WX 675 ; N acircumflex ; G 164
188
+ U 227 ; WX 675 ; N atilde ; G 165
189
+ U 228 ; WX 675 ; N adieresis ; G 166
190
+ U 229 ; WX 675 ; N aring ; G 167
191
+ U 230 ; WX 1048 ; N ae ; G 168
192
+ U 231 ; WX 593 ; N ccedilla ; G 169
193
+ U 232 ; WX 678 ; N egrave ; G 170
194
+ U 233 ; WX 678 ; N eacute ; G 171
195
+ U 234 ; WX 678 ; N ecircumflex ; G 172
196
+ U 235 ; WX 678 ; N edieresis ; G 173
197
+ U 236 ; WX 343 ; N igrave ; G 174
198
+ U 237 ; WX 343 ; N iacute ; G 175
199
+ U 238 ; WX 343 ; N icircumflex ; G 176
200
+ U 239 ; WX 343 ; N idieresis ; G 177
201
+ U 240 ; WX 687 ; N eth ; G 178
202
+ U 241 ; WX 712 ; N ntilde ; G 179
203
+ U 242 ; WX 687 ; N ograve ; G 180
204
+ U 243 ; WX 687 ; N oacute ; G 181
205
+ U 244 ; WX 687 ; N ocircumflex ; G 182
206
+ U 245 ; WX 687 ; N otilde ; G 183
207
+ U 246 ; WX 687 ; N odieresis ; G 184
208
+ U 247 ; WX 838 ; N divide ; G 185
209
+ U 248 ; WX 687 ; N oslash ; G 186
210
+ U 249 ; WX 712 ; N ugrave ; G 187
211
+ U 250 ; WX 712 ; N uacute ; G 188
212
+ U 251 ; WX 712 ; N ucircumflex ; G 189
213
+ U 252 ; WX 712 ; N udieresis ; G 190
214
+ U 253 ; WX 652 ; N yacute ; G 191
215
+ U 254 ; WX 716 ; N thorn ; G 192
216
+ U 255 ; WX 652 ; N ydieresis ; G 193
217
+ U 256 ; WX 774 ; N Amacron ; G 194
218
+ U 257 ; WX 675 ; N amacron ; G 195
219
+ U 258 ; WX 774 ; N Abreve ; G 196
220
+ U 259 ; WX 675 ; N abreve ; G 197
221
+ U 260 ; WX 774 ; N Aogonek ; G 198
222
+ U 261 ; WX 675 ; N aogonek ; G 199
223
+ U 262 ; WX 734 ; N Cacute ; G 200
224
+ U 263 ; WX 593 ; N cacute ; G 201
225
+ U 264 ; WX 734 ; N Ccircumflex ; G 202
226
+ U 265 ; WX 593 ; N ccircumflex ; G 203
227
+ U 266 ; WX 734 ; N Cdotaccent ; G 204
228
+ U 267 ; WX 593 ; N cdotaccent ; G 205
229
+ U 268 ; WX 734 ; N Ccaron ; G 206
230
+ U 269 ; WX 593 ; N ccaron ; G 207
231
+ U 270 ; WX 830 ; N Dcaron ; G 208
232
+ U 271 ; WX 716 ; N dcaron ; G 209
233
+ U 272 ; WX 838 ; N Dcroat ; G 210
234
+ U 273 ; WX 716 ; N dmacron ; G 211
235
+ U 274 ; WX 683 ; N Emacron ; G 212
236
+ U 275 ; WX 678 ; N emacron ; G 213
237
+ U 276 ; WX 683 ; N Ebreve ; G 214
238
+ U 277 ; WX 678 ; N ebreve ; G 215
239
+ U 278 ; WX 683 ; N Edotaccent ; G 216
240
+ U 279 ; WX 678 ; N edotaccent ; G 217
241
+ U 280 ; WX 683 ; N Eogonek ; G 218
242
+ U 281 ; WX 678 ; N eogonek ; G 219
243
+ U 282 ; WX 683 ; N Ecaron ; G 220
244
+ U 283 ; WX 678 ; N ecaron ; G 221
245
+ U 284 ; WX 821 ; N Gcircumflex ; G 222
246
+ U 285 ; WX 716 ; N gcircumflex ; G 223
247
+ U 286 ; WX 821 ; N Gbreve ; G 224
248
+ U 287 ; WX 716 ; N gbreve ; G 225
249
+ U 288 ; WX 821 ; N Gdotaccent ; G 226
250
+ U 289 ; WX 716 ; N gdotaccent ; G 227
251
+ U 290 ; WX 821 ; N Gcommaaccent ; G 228
252
+ U 291 ; WX 716 ; N gcommaaccent ; G 229
253
+ U 292 ; WX 837 ; N Hcircumflex ; G 230
254
+ U 293 ; WX 712 ; N hcircumflex ; G 231
255
+ U 294 ; WX 974 ; N Hbar ; G 232
256
+ U 295 ; WX 790 ; N hbar ; G 233
257
+ U 296 ; WX 372 ; N Itilde ; G 234
258
+ U 297 ; WX 343 ; N itilde ; G 235
259
+ U 298 ; WX 372 ; N Imacron ; G 236
260
+ U 299 ; WX 343 ; N imacron ; G 237
261
+ U 300 ; WX 372 ; N Ibreve ; G 238
262
+ U 301 ; WX 343 ; N ibreve ; G 239
263
+ U 302 ; WX 372 ; N Iogonek ; G 240
264
+ U 303 ; WX 343 ; N iogonek ; G 241
265
+ U 304 ; WX 372 ; N Idot ; G 242
266
+ U 305 ; WX 343 ; N dotlessi ; G 243
267
+ U 306 ; WX 744 ; N IJ ; G 244
268
+ U 307 ; WX 686 ; N ij ; G 245
269
+ U 308 ; WX 372 ; N Jcircumflex ; G 246
270
+ U 309 ; WX 343 ; N jcircumflex ; G 247
271
+ U 310 ; WX 775 ; N Kcommaaccent ; G 248
272
+ U 311 ; WX 665 ; N kcommaaccent ; G 249
273
+ U 312 ; WX 665 ; N kgreenlandic ; G 250
274
+ U 313 ; WX 637 ; N Lacute ; G 251
275
+ U 314 ; WX 343 ; N lacute ; G 252
276
+ U 315 ; WX 637 ; N Lcommaaccent ; G 253
277
+ U 316 ; WX 343 ; N lcommaaccent ; G 254
278
+ U 317 ; WX 637 ; N Lcaron ; G 255
279
+ U 318 ; WX 479 ; N lcaron ; G 256
280
+ U 319 ; WX 637 ; N Ldot ; G 257
281
+ U 320 ; WX 557 ; N ldot ; G 258
282
+ U 321 ; WX 642 ; N Lslash ; G 259
283
+ U 322 ; WX 371 ; N lslash ; G 260
284
+ U 323 ; WX 837 ; N Nacute ; G 261
285
+ U 324 ; WX 712 ; N nacute ; G 262
286
+ U 325 ; WX 837 ; N Ncommaaccent ; G 263
287
+ U 326 ; WX 712 ; N ncommaaccent ; G 264
288
+ U 327 ; WX 837 ; N Ncaron ; G 265
289
+ U 328 ; WX 712 ; N ncaron ; G 266
290
+ U 329 ; WX 983 ; N napostrophe ; G 267
291
+ U 330 ; WX 837 ; N Eng ; G 268
292
+ U 331 ; WX 712 ; N eng ; G 269
293
+ U 332 ; WX 850 ; N Omacron ; G 270
294
+ U 333 ; WX 687 ; N omacron ; G 271
295
+ U 334 ; WX 850 ; N Obreve ; G 272
296
+ U 335 ; WX 687 ; N obreve ; G 273
297
+ U 336 ; WX 850 ; N Ohungarumlaut ; G 274
298
+ U 337 ; WX 687 ; N ohungarumlaut ; G 275
299
+ U 338 ; WX 1167 ; N OE ; G 276
300
+ U 339 ; WX 1094 ; N oe ; G 277
301
+ U 340 ; WX 770 ; N Racute ; G 278
302
+ U 341 ; WX 493 ; N racute ; G 279
303
+ U 342 ; WX 770 ; N Rcommaaccent ; G 280
304
+ U 343 ; WX 493 ; N rcommaaccent ; G 281
305
+ U 344 ; WX 770 ; N Rcaron ; G 282
306
+ U 345 ; WX 493 ; N rcaron ; G 283
307
+ U 346 ; WX 720 ; N Sacute ; G 284
308
+ U 347 ; WX 595 ; N sacute ; G 285
309
+ U 348 ; WX 720 ; N Scircumflex ; G 286
310
+ U 349 ; WX 595 ; N scircumflex ; G 287
311
+ U 350 ; WX 720 ; N Scedilla ; G 288
312
+ U 351 ; WX 595 ; N scedilla ; G 289
313
+ U 352 ; WX 720 ; N Scaron ; G 290
314
+ U 353 ; WX 595 ; N scaron ; G 291
315
+ U 354 ; WX 682 ; N Tcommaaccent ; G 292
316
+ U 355 ; WX 478 ; N tcommaaccent ; G 293
317
+ U 356 ; WX 682 ; N Tcaron ; G 294
318
+ U 357 ; WX 478 ; N tcaron ; G 295
319
+ U 358 ; WX 682 ; N Tbar ; G 296
320
+ U 359 ; WX 478 ; N tbar ; G 297
321
+ U 360 ; WX 812 ; N Utilde ; G 298
322
+ U 361 ; WX 712 ; N utilde ; G 299
323
+ U 362 ; WX 812 ; N Umacron ; G 300
324
+ U 363 ; WX 712 ; N umacron ; G 301
325
+ U 364 ; WX 812 ; N Ubreve ; G 302
326
+ U 365 ; WX 712 ; N ubreve ; G 303
327
+ U 366 ; WX 812 ; N Uring ; G 304
328
+ U 367 ; WX 712 ; N uring ; G 305
329
+ U 368 ; WX 812 ; N Uhungarumlaut ; G 306
330
+ U 369 ; WX 712 ; N uhungarumlaut ; G 307
331
+ U 370 ; WX 812 ; N Uogonek ; G 308
332
+ U 371 ; WX 712 ; N uogonek ; G 309
333
+ U 372 ; WX 1103 ; N Wcircumflex ; G 310
334
+ U 373 ; WX 924 ; N wcircumflex ; G 311
335
+ U 374 ; WX 724 ; N Ycircumflex ; G 312
336
+ U 375 ; WX 652 ; N ycircumflex ; G 313
337
+ U 376 ; WX 724 ; N Ydieresis ; G 314
338
+ U 377 ; WX 725 ; N Zacute ; G 315
339
+ U 378 ; WX 582 ; N zacute ; G 316
340
+ U 379 ; WX 725 ; N Zdotaccent ; G 317
341
+ U 380 ; WX 582 ; N zdotaccent ; G 318
342
+ U 381 ; WX 725 ; N Zcaron ; G 319
343
+ U 382 ; WX 582 ; N zcaron ; G 320
344
+ U 383 ; WX 435 ; N longs ; G 321
 
 
345
  U 384 ; WX 716 ; N uni0180 ; G 322
346
  U 385 ; WX 811 ; N uni0181 ; G 323
347
  U 386 ; WX 762 ; N uni0182 ; G 324
352
  U 391 ; WX 734 ; N uni0187 ; G 329
353
  U 392 ; WX 593 ; N uni0188 ; G 330
354
  U 393 ; WX 838 ; N uni0189 ; G 331
355
+ U 394 ; WX 879 ; N uni018A ; G 332
356
+ U 395 ; WX 757 ; N uni018B ; G 333
357
+ U 396 ; WX 716 ; N uni018C ; G 334
358
+ U 397 ; WX 688 ; N uni018D ; G 335
359
+ U 398 ; WX 683 ; N uni018E ; G 336
360
+ U 399 ; WX 849 ; N uni018F ; G 337
361
  U 400 ; WX 696 ; N uni0190 ; G 338
362
  U 401 ; WX 683 ; N uni0191 ; G 339
363
+ U 402 ; WX 435 ; N florin ; G 340
364
  U 403 ; WX 821 ; N uni0193 ; G 341
365
  U 404 ; WX 793 ; N uni0194 ; G 342
366
  U 405 ; WX 1045 ; N uni0195 ; G 343
368
  U 407 ; WX 389 ; N uni0197 ; G 345
369
  U 408 ; WX 775 ; N uni0198 ; G 346
370
  U 409 ; WX 665 ; N uni0199 ; G 347
371
+ U 410 ; WX 360 ; N uni019A ; G 348
372
+ U 411 ; WX 592 ; N uni019B ; G 349
373
+ U 412 ; WX 1042 ; N uni019C ; G 350
374
+ U 413 ; WX 837 ; N uni019D ; G 351
375
+ U 414 ; WX 712 ; N uni019E ; G 352
376
+ U 415 ; WX 850 ; N uni019F ; G 353
377
+ U 416 ; WX 874 ; N Ohorn ; G 354
378
+ U 417 ; WX 687 ; N ohorn ; G 355
379
+ U 418 ; WX 1083 ; N uni01A2 ; G 356
380
+ U 419 ; WX 912 ; N uni01A3 ; G 357
381
+ U 420 ; WX 782 ; N uni01A4 ; G 358
382
+ U 421 ; WX 716 ; N uni01A5 ; G 359
383
+ U 422 ; WX 770 ; N uni01A6 ; G 360
384
+ U 423 ; WX 720 ; N uni01A7 ; G 361
385
+ U 424 ; WX 595 ; N uni01A8 ; G 362
386
+ U 425 ; WX 683 ; N uni01A9 ; G 363
387
+ U 426 ; WX 552 ; N uni01AA ; G 364
388
+ U 427 ; WX 478 ; N uni01AB ; G 365
389
+ U 428 ; WX 707 ; N uni01AC ; G 366
390
+ U 429 ; WX 478 ; N uni01AD ; G 367
391
+ U 430 ; WX 682 ; N uni01AE ; G 368
392
+ U 431 ; WX 835 ; N Uhorn ; G 369
393
+ U 432 ; WX 712 ; N uhorn ; G 370
394
+ U 433 ; WX 850 ; N uni01B1 ; G 371
395
+ U 434 ; WX 813 ; N uni01B2 ; G 372
396
+ U 435 ; WX 797 ; N uni01B3 ; G 373
397
+ U 436 ; WX 778 ; N uni01B4 ; G 374
398
+ U 437 ; WX 725 ; N uni01B5 ; G 375
399
+ U 438 ; WX 582 ; N uni01B6 ; G 376
400
+ U 439 ; WX 772 ; N uni01B7 ; G 377
401
+ U 440 ; WX 772 ; N uni01B8 ; G 378
402
+ U 441 ; WX 641 ; N uni01B9 ; G 379
403
+ U 442 ; WX 582 ; N uni01BA ; G 380
404
+ U 443 ; WX 696 ; N uni01BB ; G 381
405
+ U 444 ; WX 772 ; N uni01BC ; G 382
406
+ U 445 ; WX 641 ; N uni01BD ; G 383
407
+ U 446 ; WX 573 ; N uni01BE ; G 384
408
+ U 447 ; WX 716 ; N uni01BF ; G 385
409
+ U 448 ; WX 372 ; N uni01C0 ; G 386
410
+ U 449 ; WX 659 ; N uni01C1 ; G 387
411
+ U 450 ; WX 544 ; N uni01C2 ; G 388
412
+ U 451 ; WX 372 ; N uni01C3 ; G 389
413
+ U 452 ; WX 1555 ; N uni01C4 ; G 390
414
+ U 453 ; WX 1412 ; N uni01C5 ; G 391
415
+ U 454 ; WX 1298 ; N uni01C6 ; G 392
416
+ U 455 ; WX 1009 ; N uni01C7 ; G 393
417
+ U 456 ; WX 980 ; N uni01C8 ; G 394
418
+ U 457 ; WX 686 ; N uni01C9 ; G 395
419
+ U 458 ; WX 1209 ; N uni01CA ; G 396
420
+ U 459 ; WX 1180 ; N uni01CB ; G 397
421
+ U 460 ; WX 1055 ; N uni01CC ; G 398
422
+ U 461 ; WX 774 ; N uni01CD ; G 399
423
+ U 462 ; WX 675 ; N uni01CE ; G 400
424
+ U 463 ; WX 372 ; N uni01CF ; G 401
425
+ U 464 ; WX 343 ; N uni01D0 ; G 402
426
+ U 465 ; WX 850 ; N uni01D1 ; G 403
427
+ U 466 ; WX 687 ; N uni01D2 ; G 404
428
+ U 467 ; WX 812 ; N uni01D3 ; G 405
429
+ U 468 ; WX 712 ; N uni01D4 ; G 406
430
+ U 469 ; WX 812 ; N uni01D5 ; G 407
431
+ U 470 ; WX 712 ; N uni01D6 ; G 408
432
+ U 471 ; WX 812 ; N uni01D7 ; G 409
433
+ U 472 ; WX 712 ; N uni01D8 ; G 410
434
+ U 473 ; WX 812 ; N uni01D9 ; G 411
435
+ U 474 ; WX 712 ; N uni01DA ; G 412
436
+ U 475 ; WX 812 ; N uni01DB ; G 413
437
+ U 476 ; WX 712 ; N uni01DC ; G 414
438
+ U 477 ; WX 678 ; N uni01DD ; G 415
439
+ U 478 ; WX 774 ; N uni01DE ; G 416
440
+ U 479 ; WX 675 ; N uni01DF ; G 417
441
+ U 480 ; WX 774 ; N uni01E0 ; G 418
442
+ U 481 ; WX 675 ; N uni01E1 ; G 419
443
+ U 482 ; WX 1085 ; N uni01E2 ; G 420
444
+ U 483 ; WX 1048 ; N uni01E3 ; G 421
445
+ U 484 ; WX 821 ; N uni01E4 ; G 422
446
+ U 485 ; WX 716 ; N uni01E5 ; G 423
447
+ U 486 ; WX 821 ; N Gcaron ; G 424
448
+ U 487 ; WX 716 ; N gcaron ; G 425
449
+ U 488 ; WX 775 ; N uni01E8 ; G 426
450
+ U 489 ; WX 665 ; N uni01E9 ; G 427
451
+ U 490 ; WX 850 ; N uni01EA ; G 428
452
+ U 491 ; WX 687 ; N uni01EB ; G 429
453
+ U 492 ; WX 850 ; N uni01EC ; G 430
454
+ U 493 ; WX 687 ; N uni01ED ; G 431
455
+ U 494 ; WX 772 ; N uni01EE ; G 432
456
+ U 495 ; WX 582 ; N uni01EF ; G 433
457
+ U 496 ; WX 343 ; N uni01F0 ; G 434
458
+ U 497 ; WX 1555 ; N uni01F1 ; G 435
459
+ U 498 ; WX 1412 ; N uni01F2 ; G 436
460
+ U 499 ; WX 1298 ; N uni01F3 ; G 437
461
+ U 500 ; WX 821 ; N uni01F4 ; G 438
462
+ U 501 ; WX 716 ; N uni01F5 ; G 439
463
+ U 502 ; WX 1289 ; N uni01F6 ; G 440
464
+ U 503 ; WX 787 ; N uni01F7 ; G 441
465
+ U 504 ; WX 837 ; N uni01F8 ; G 442
466
+ U 505 ; WX 712 ; N uni01F9 ; G 443
467
+ U 506 ; WX 774 ; N Aringacute ; G 444
468
+ U 507 ; WX 675 ; N aringacute ; G 445
469
+ U 508 ; WX 1085 ; N AEacute ; G 446
470
+ U 509 ; WX 1048 ; N aeacute ; G 447
471
+ U 510 ; WX 850 ; N Oslashacute ; G 448
472
+ U 511 ; WX 687 ; N oslashacute ; G 449
473
  U 512 ; WX 774 ; N uni0200 ; G 450
474
  U 513 ; WX 675 ; N uni0201 ; G 451
475
  U 514 ; WX 774 ; N uni0202 ; G 452
480
  U 519 ; WX 678 ; N uni0207 ; G 457
481
  U 520 ; WX 372 ; N uni0208 ; G 458
482
  U 521 ; WX 343 ; N uni0209 ; G 459
483
+ U 522 ; WX 372 ; N uni020A ; G 460
484
+ U 523 ; WX 343 ; N uni020B ; G 461
485
+ U 524 ; WX 850 ; N uni020C ; G 462
486
+ U 525 ; WX 687 ; N uni020D ; G 463
487
+ U 526 ; WX 850 ; N uni020E ; G 464
488
+ U 527 ; WX 687 ; N uni020F ; G 465
489
  U 528 ; WX 770 ; N uni0210 ; G 466
490
  U 529 ; WX 493 ; N uni0211 ; G 467
491
  U 530 ; WX 770 ; N uni0212 ; G 468
494
  U 533 ; WX 712 ; N uni0215 ; G 471
495
  U 534 ; WX 812 ; N uni0216 ; G 472
496
  U 535 ; WX 712 ; N uni0217 ; G 473
497
+ U 536 ; WX 720 ; N Scommaaccent ; G 474
498
+ U 537 ; WX 595 ; N scommaaccent ; G 475
499
+ U 538 ; WX 682 ; N uni021A ; G 476
500
+ U 539 ; WX 478 ; N uni021B ; G 477
501
+ U 540 ; WX 690 ; N uni021C ; G 478
502
+ U 541 ; WX 607 ; N uni021D ; G 479
503
+ U 542 ; WX 837 ; N uni021E ; G 480
504
+ U 543 ; WX 712 ; N uni021F ; G 481
505
  U 544 ; WX 837 ; N uni0220 ; G 482
506
  U 545 ; WX 865 ; N uni0221 ; G 483
507
  U 546 ; WX 809 ; N uni0222 ; G 484
512
  U 551 ; WX 675 ; N uni0227 ; G 489
513
  U 552 ; WX 683 ; N uni0228 ; G 490
514
  U 553 ; WX 678 ; N uni0229 ; G 491
515
+ U 554 ; WX 850 ; N uni022A ; G 492
516
+ U 555 ; WX 687 ; N uni022B ; G 493
517
+ U 556 ; WX 850 ; N uni022C ; G 494
518
+ U 557 ; WX 687 ; N uni022D ; G 495
519
+ U 558 ; WX 850 ; N uni022E ; G 496
520
+ U 559 ; WX 687 ; N uni022F ; G 497
521
  U 560 ; WX 850 ; N uni0230 ; G 498
522
  U 561 ; WX 687 ; N uni0231 ; G 499
523
  U 562 ; WX 724 ; N uni0232 ; G 500
525
  U 564 ; WX 492 ; N uni0234 ; G 502
526
  U 565 ; WX 867 ; N uni0235 ; G 503
527
  U 566 ; WX 512 ; N uni0236 ; G 504
528
+ U 567 ; WX 343 ; N dotlessj ; G 505
529
  U 568 ; WX 1088 ; N uni0238 ; G 506
530
  U 569 ; WX 1088 ; N uni0239 ; G 507
531
+ U 570 ; WX 774 ; N uni023A ; G 508
532
+ U 571 ; WX 734 ; N uni023B ; G 509
533
+ U 572 ; WX 593 ; N uni023C ; G 510
534
+ U 573 ; WX 637 ; N uni023D ; G 511
535
+ U 574 ; WX 682 ; N uni023E ; G 512
536
+ U 575 ; WX 595 ; N uni023F ; G 513
537
  U 576 ; WX 582 ; N uni0240 ; G 514
538
  U 577 ; WX 782 ; N uni0241 ; G 515
539
  U 578 ; WX 614 ; N uni0242 ; G 516
544
  U 583 ; WX 678 ; N uni0247 ; G 521
545
  U 584 ; WX 372 ; N uni0248 ; G 522
546
  U 585 ; WX 343 ; N uni0249 ; G 523
547
+ U 586 ; WX 860 ; N uni024A ; G 524
548
+ U 587 ; WX 791 ; N uni024B ; G 525
549
+ U 588 ; WX 770 ; N uni024C ; G 526
550
+ U 589 ; WX 493 ; N uni024D ; G 527
551
+ U 590 ; WX 724 ; N uni024E ; G 528
552
+ U 591 ; WX 652 ; N uni024F ; G 529
553
  U 592 ; WX 675 ; N uni0250 ; G 530
554
  U 593 ; WX 716 ; N uni0251 ; G 531
555
  U 594 ; WX 716 ; N uni0252 ; G 532
560
  U 599 ; WX 792 ; N uni0257 ; G 537
561
  U 600 ; WX 678 ; N uni0258 ; G 538
562
  U 601 ; WX 678 ; N uni0259 ; G 539
563
+ U 602 ; WX 876 ; N uni025A ; G 540
564
+ U 603 ; WX 557 ; N uni025B ; G 541
565
+ U 604 ; WX 545 ; N uni025C ; G 542
566
+ U 605 ; WX 815 ; N uni025D ; G 543
567
+ U 606 ; WX 731 ; N uni025E ; G 544
568
+ U 607 ; WX 343 ; N uni025F ; G 545
569
  U 608 ; WX 792 ; N uni0260 ; G 546
570
  U 609 ; WX 716 ; N uni0261 ; G 547
571
  U 610 ; WX 627 ; N uni0262 ; G 548
576
  U 615 ; WX 712 ; N uni0267 ; G 553
577
  U 616 ; WX 545 ; N uni0268 ; G 554
578
  U 617 ; WX 440 ; N uni0269 ; G 555
579
+ U 618 ; WX 545 ; N uni026A ; G 556
580
+ U 619 ; WX 559 ; N uni026B ; G 557
581
+ U 620 ; WX 693 ; N uni026C ; G 558
582
+ U 621 ; WX 343 ; N uni026D ; G 559
583
+ U 622 ; WX 841 ; N uni026E ; G 560
584
+ U 623 ; WX 1042 ; N uni026F ; G 561
585
  U 624 ; WX 1042 ; N uni0270 ; G 562
586
  U 625 ; WX 1042 ; N uni0271 ; G 563
587
  U 626 ; WX 712 ; N uni0272 ; G 564
592
  U 631 ; WX 681 ; N uni0277 ; G 569
593
  U 632 ; WX 796 ; N uni0278 ; G 570
594
  U 633 ; WX 538 ; N uni0279 ; G 571
595
+ U 634 ; WX 538 ; N uni027A ; G 572
596
+ U 635 ; WX 650 ; N uni027B ; G 573
597
+ U 636 ; WX 493 ; N uni027C ; G 574
598
+ U 637 ; WX 493 ; N uni027D ; G 575
599
+ U 638 ; WX 596 ; N uni027E ; G 576
600
+ U 639 ; WX 596 ; N uni027F ; G 577
601
  U 640 ; WX 642 ; N uni0280 ; G 578
602
  U 641 ; WX 642 ; N uni0281 ; G 579
603
  U 642 ; WX 595 ; N uni0282 ; G 580
608
  U 647 ; WX 478 ; N uni0287 ; G 585
609
  U 648 ; WX 478 ; N uni0288 ; G 586
610
  U 649 ; WX 920 ; N uni0289 ; G 587
611
+ U 650 ; WX 772 ; N uni028A ; G 588
612
+ U 651 ; WX 670 ; N uni028B ; G 589
613
+ U 652 ; WX 652 ; N uni028C ; G 590
614
+ U 653 ; WX 924 ; N uni028D ; G 591
615
+ U 654 ; WX 652 ; N uni028E ; G 592
616
+ U 655 ; WX 724 ; N uni028F ; G 593
617
  U 656 ; WX 694 ; N uni0290 ; G 594
618
  U 657 ; WX 684 ; N uni0291 ; G 595
619
  U 658 ; WX 641 ; N uni0292 ; G 596
624
  U 663 ; WX 573 ; N uni0297 ; G 601
625
  U 664 ; WX 850 ; N uni0298 ; G 602
626
  U 665 ; WX 633 ; N uni0299 ; G 603
627
+ U 666 ; WX 731 ; N uni029A ; G 604
628
+ U 667 ; WX 685 ; N uni029B ; G 605
629
+ U 668 ; WX 691 ; N uni029C ; G 606
630
+ U 669 ; WX 343 ; N uni029D ; G 607
631
+ U 670 ; WX 732 ; N uni029E ; G 608
632
+ U 671 ; WX 539 ; N uni029F ; G 609
633
+ U 672 ; WX 792 ; N uni02A0 ; G 610
634
+ U 673 ; WX 573 ; N uni02A1 ; G 611
635
+ U 674 ; WX 573 ; N uni02A2 ; G 612
636
+ U 675 ; WX 1156 ; N uni02A3 ; G 613
637
+ U 676 ; WX 1214 ; N uni02A4 ; G 614
638
+ U 677 ; WX 1155 ; N uni02A5 ; G 615
639
+ U 678 ; WX 974 ; N uni02A6 ; G 616
640
+ U 679 ; WX 769 ; N uni02A7 ; G 617
641
+ U 680 ; WX 929 ; N uni02A8 ; G 618
642
+ U 681 ; WX 1026 ; N uni02A9 ; G 619
643
+ U 682 ; WX 792 ; N uni02AA ; G 620
644
+ U 683 ; WX 780 ; N uni02AB ; G 621
645
+ U 684 ; WX 591 ; N uni02AC ; G 622
646
+ U 685 ; WX 415 ; N uni02AD ; G 623
647
+ U 686 ; WX 677 ; N uni02AE ; G 624
648
+ U 687 ; WX 789 ; N uni02AF ; G 625
649
+ U 688 ; WX 456 ; N uni02B0 ; G 626
650
+ U 689 ; WX 456 ; N uni02B1 ; G 627
651
+ U 690 ; WX 219 ; N uni02B2 ; G 628
652
+ U 691 ; WX 315 ; N uni02B3 ; G 629
653
+ U 692 ; WX 315 ; N uni02B4 ; G 630
654
+ U 693 ; WX 315 ; N uni02B5 ; G 631
655
+ U 694 ; WX 411 ; N uni02B6 ; G 632
656
+ U 695 ; WX 591 ; N uni02B7 ; G 633
657
+ U 696 ; WX 417 ; N uni02B8 ; G 634
658
+ U 697 ; WX 302 ; N uni02B9 ; G 635
659
+ U 698 ; WX 521 ; N uni02BA ; G 636
660
+ U 699 ; WX 380 ; N uni02BB ; G 637
661
+ U 700 ; WX 380 ; N uni02BC ; G 638
662
+ U 701 ; WX 380 ; N uni02BD ; G 639
663
+ U 702 ; WX 366 ; N uni02BE ; G 640
664
+ U 703 ; WX 366 ; N uni02BF ; G 641
665
+ U 704 ; WX 326 ; N uni02C0 ; G 642
666
+ U 705 ; WX 326 ; N uni02C1 ; G 643
667
+ U 706 ; WX 500 ; N uni02C2 ; G 644
668
+ U 707 ; WX 500 ; N uni02C3 ; G 645
669
+ U 708 ; WX 500 ; N uni02C4 ; G 646
670
+ U 709 ; WX 500 ; N uni02C5 ; G 647
671
+ U 710 ; WX 500 ; N circumflex ; G 648
672
+ U 711 ; WX 500 ; N caron ; G 649
673
+ U 712 ; WX 306 ; N uni02C8 ; G 650
674
+ U 713 ; WX 500 ; N uni02C9 ; G 651
675
+ U 714 ; WX 500 ; N uni02CA ; G 652
676
+ U 715 ; WX 500 ; N uni02CB ; G 653
677
+ U 716 ; WX 306 ; N uni02CC ; G 654
678
+ U 717 ; WX 500 ; N uni02CD ; G 655
679
+ U 718 ; WX 500 ; N uni02CE ; G 656
680
+ U 719 ; WX 500 ; N uni02CF ; G 657
681
+ U 720 ; WX 337 ; N uni02D0 ; G 658
682
+ U 721 ; WX 337 ; N uni02D1 ; G 659
683
+ U 722 ; WX 366 ; N uni02D2 ; G 660
684
+ U 723 ; WX 366 ; N uni02D3 ; G 661
685
+ U 724 ; WX 500 ; N uni02D4 ; G 662
686
+ U 725 ; WX 500 ; N uni02D5 ; G 663
687
+ U 726 ; WX 416 ; N uni02D6 ; G 664
688
+ U 727 ; WX 328 ; N uni02D7 ; G 665
689
+ U 728 ; WX 500 ; N breve ; G 666
690
+ U 729 ; WX 500 ; N dotaccent ; G 667
691
+ U 730 ; WX 500 ; N ring ; G 668
692
+ U 731 ; WX 500 ; N ogonek ; G 669
693
+ U 732 ; WX 500 ; N tilde ; G 670
694
+ U 733 ; WX 500 ; N hungarumlaut ; G 671
695
+ U 734 ; WX 351 ; N uni02DE ; G 672
696
+ U 735 ; WX 500 ; N uni02DF ; G 673
697
+ U 736 ; WX 412 ; N uni02E0 ; G 674
698
+ U 737 ; WX 219 ; N uni02E1 ; G 675
699
+ U 738 ; WX 381 ; N uni02E2 ; G 676
700
+ U 739 ; WX 413 ; N uni02E3 ; G 677
701
+ U 740 ; WX 326 ; N uni02E4 ; G 678
702
+ U 741 ; WX 500 ; N uni02E5 ; G 679
703
+ U 742 ; WX 500 ; N uni02E6 ; G 680
704
+ U 743 ; WX 500 ; N uni02E7 ; G 681
705
+ U 744 ; WX 500 ; N uni02E8 ; G 682
706
+ U 745 ; WX 500 ; N uni02E9 ; G 683
707
+ U 748 ; WX 500 ; N uni02EC ; G 684
708
+ U 749 ; WX 500 ; N uni02ED ; G 685
709
+ U 750 ; WX 657 ; N uni02EE ; G 686
710
+ U 755 ; WX 500 ; N uni02F3 ; G 687
711
+ U 759 ; WX 500 ; N uni02F7 ; G 688
712
+ U 768 ; WX 0 ; N gravecomb ; G 689
713
+ U 769 ; WX 0 ; N acutecomb ; G 690
714
+ U 770 ; WX 0 ; N uni0302 ; G 691
715
+ U 771 ; WX 0 ; N tildecomb ; G 692
716
+ U 772 ; WX 0 ; N uni0304 ; G 693
717
+ U 773 ; WX 0 ; N uni0305 ; G 694
718
+ U 774 ; WX 0 ; N uni0306 ; G 695
719
+ U 775 ; WX 0 ; N uni0307 ; G 696
720
+ U 776 ; WX 0 ; N uni0308 ; G 697
721
+ U 777 ; WX 0 ; N hookabovecomb ; G 698
722
+ U 778 ; WX 0 ; N uni030A ; G 699
723
+ U 779 ; WX 0 ; N uni030B ; G 700
724
+ U 780 ; WX 0 ; N uni030C ; G 701
725
+ U 781 ; WX 0 ; N uni030D ; G 702
726
+ U 782 ; WX 0 ; N uni030E ; G 703
727
+ U 783 ; WX 0 ; N uni030F ; G 704
728
+ U 784 ; WX 0 ; N uni0310 ; G 705
729
+ U 785 ; WX 0 ; N uni0311 ; G 706
730
+ U 786 ; WX 0 ; N uni0312 ; G 707
731
+ U 787 ; WX 0 ; N uni0313 ; G 708
732
+ U 788 ; WX 0 ; N uni0314 ; G 709
733
+ U 789 ; WX 0 ; N uni0315 ; G 710
734
+ U 790 ; WX 0 ; N uni0316 ; G 711
735
+ U 791 ; WX 0 ; N uni0317 ; G 712
736
+ U 792 ; WX 0 ; N uni0318 ; G 713
737
+ U 793 ; WX 0 ; N uni0319 ; G 714
738
+ U 794 ; WX 0 ; N uni031A ; G 715
739
+ U 795 ; WX 0 ; N uni031B ; G 716
740
+ U 796 ; WX 0 ; N uni031C ; G 717
741
+ U 797 ; WX 0 ; N uni031D ; G 718
742
+ U 798 ; WX 0 ; N uni031E ; G 719
743
+ U 799 ; WX 0 ; N uni031F ; G 720
744
+ U 800 ; WX 0 ; N uni0320 ; G 721
745
+ U 801 ; WX 0 ; N uni0321 ; G 722
746
+ U 802 ; WX 0 ; N uni0322 ; G 723
747
+ U 803 ; WX 0 ; N dotbelowcomb ; G 724
748
+ U 804 ; WX 0 ; N uni0324 ; G 725
749
+ U 805 ; WX 0 ; N uni0325 ; G 726
750
+ U 806 ; WX 0 ; N uni0326 ; G 727
751
+ U 807 ; WX 0 ; N uni0327 ; G 728
752
+ U 808 ; WX 0 ; N uni0328 ; G 729
753
+ U 809 ; WX 0 ; N uni0329 ; G 730
754
+ U 810 ; WX 0 ; N uni032A ; G 731
755
+ U 811 ; WX 0 ; N uni032B ; G 732
756
+ U 812 ; WX 0 ; N uni032C ; G 733
757
+ U 813 ; WX 0 ; N uni032D ; G 734
758
+ U 814 ; WX 0 ; N uni032E ; G 735
759
+ U 815 ; WX 0 ; N uni032F ; G 736
760
+ U 816 ; WX 0 ; N uni0330 ; G 737
761
+ U 817 ; WX 0 ; N uni0331 ; G 738
762
+ U 818 ; WX 0 ; N uni0332 ; G 739
763
+ U 819 ; WX 0 ; N uni0333 ; G 740
764
+ U 820 ; WX 0 ; N uni0334 ; G 741
765
+ U 821 ; WX 0 ; N uni0335 ; G 742
766
+ U 822 ; WX 0 ; N uni0336 ; G 743
767
+ U 823 ; WX 0 ; N uni0337 ; G 744
768
+ U 824 ; WX 0 ; N uni0338 ; G 745
769
+ U 825 ; WX 0 ; N uni0339 ; G 746
770
+ U 826 ; WX 0 ; N uni033A ; G 747
771
+ U 827 ; WX 0 ; N uni033B ; G 748
772
+ U 828 ; WX 0 ; N uni033C ; G 749
773
+ U 829 ; WX 0 ; N uni033D ; G 750
774
+ U 830 ; WX 0 ; N uni033E ; G 751
775
+ U 831 ; WX 0 ; N uni033F ; G 752
776
+ U 832 ; WX 0 ; N uni0340 ; G 753
777
+ U 833 ; WX 0 ; N uni0341 ; G 754
778
+ U 834 ; WX 0 ; N uni0342 ; G 755
779
+ U 835 ; WX 0 ; N uni0343 ; G 756
780
+ U 836 ; WX 0 ; N uni0344 ; G 757
781
+ U 837 ; WX 0 ; N uni0345 ; G 758
782
+ U 838 ; WX 0 ; N uni0346 ; G 759
783
+ U 839 ; WX 0 ; N uni0347 ; G 760
784
+ U 840 ; WX 0 ; N uni0348 ; G 761
785
+ U 841 ; WX 0 ; N uni0349 ; G 762
786
+ U 842 ; WX 0 ; N uni034A ; G 763
787
+ U 843 ; WX 0 ; N uni034B ; G 764
788
+ U 844 ; WX 0 ; N uni034C ; G 765
789
+ U 845 ; WX 0 ; N uni034D ; G 766
790
+ U 846 ; WX 0 ; N uni034E ; G 767
791
+ U 847 ; WX 0 ; N uni034F ; G 768
792
+ U 849 ; WX 0 ; N uni0351 ; G 769
793
+ U 850 ; WX 0 ; N uni0352 ; G 770
794
+ U 851 ; WX 0 ; N uni0353 ; G 771
795
+ U 855 ; WX 0 ; N uni0357 ; G 772
796
+ U 856 ; WX 0 ; N uni0358 ; G 773
797
+ U 858 ; WX 0 ; N uni035A ; G 774
798
+ U 860 ; WX 0 ; N uni035C ; G 775
799
+ U 861 ; WX 0 ; N uni035D ; G 776
800
+ U 862 ; WX 0 ; N uni035E ; G 777
801
+ U 863 ; WX 0 ; N uni035F ; G 778
802
+ U 864 ; WX 0 ; N uni0360 ; G 779
803
+ U 865 ; WX 0 ; N uni0361 ; G 780
804
+ U 866 ; WX 0 ; N uni0362 ; G 781
805
  U 880 ; WX 698 ; N uni0370 ; G 782
806
  U 881 ; WX 565 ; N uni0371 ; G 783
807
  U 882 ; WX 1022 ; N uni0372 ; G 784
810
  U 885 ; WX 302 ; N uni0375 ; G 787
811
  U 886 ; WX 837 ; N uni0376 ; G 788
812
  U 887 ; WX 701 ; N uni0377 ; G 789
813
+ U 890 ; WX 500 ; N uni037A ; G 790
814
+ U 891 ; WX 593 ; N uni037B ; G 791
815
+ U 892 ; WX 550 ; N uni037C ; G 792
816
+ U 893 ; WX 549 ; N uni037D ; G 793
817
+ U 894 ; WX 400 ; N uni037E ; G 794
818
+ U 900 ; WX 441 ; N tonos ; G 795
819
+ U 901 ; WX 500 ; N dieresistonos ; G 796
820
+ U 902 ; WX 797 ; N Alphatonos ; G 797
821
+ U 903 ; WX 380 ; N anoteleia ; G 798
822
+ U 904 ; WX 846 ; N Epsilontonos ; G 799
823
+ U 905 ; WX 1009 ; N Etatonos ; G 800
824
+ U 906 ; WX 563 ; N Iotatonos ; G 801
825
+ U 908 ; WX 891 ; N Omicrontonos ; G 802
826
+ U 910 ; WX 980 ; N Upsilontonos ; G 803
827
+ U 911 ; WX 894 ; N Omegatonos ; G 804
828
+ U 912 ; WX 390 ; N iotadieresistonos ; G 805
829
+ U 913 ; WX 774 ; N Alpha ; G 806
830
+ U 914 ; WX 762 ; N Beta ; G 807
831
+ U 915 ; WX 637 ; N Gamma ; G 808
832
  U 916 ; WX 774 ; N uni0394 ; G 809
833
+ U 917 ; WX 683 ; N Epsilon ; G 810
834
+ U 918 ; WX 725 ; N Zeta ; G 811
835
+ U 919 ; WX 837 ; N Eta ; G 812
836
+ U 920 ; WX 850 ; N Theta ; G 813
837
+ U 921 ; WX 372 ; N Iota ; G 814
838
+ U 922 ; WX 775 ; N Kappa ; G 815
839
+ U 923 ; WX 774 ; N Lambda ; G 816
840
+ U 924 ; WX 995 ; N Mu ; G 817
841
+ U 925 ; WX 837 ; N Nu ; G 818
842
+ U 926 ; WX 632 ; N Xi ; G 819
843
+ U 927 ; WX 850 ; N Omicron ; G 820
844
+ U 928 ; WX 837 ; N Pi ; G 821
845
+ U 929 ; WX 733 ; N Rho ; G 822
846
+ U 931 ; WX 683 ; N Sigma ; G 823
847
+ U 932 ; WX 682 ; N Tau ; G 824
848
+ U 933 ; WX 724 ; N Upsilon ; G 825
849
+ U 934 ; WX 850 ; N Phi ; G 826
850
+ U 935 ; WX 771 ; N Chi ; G 827
851
+ U 936 ; WX 850 ; N Psi ; G 828
852
+ U 937 ; WX 850 ; N Omega ; G 829
853
+ U 938 ; WX 372 ; N Iotadieresis ; G 830
854
+ U 939 ; WX 724 ; N Upsilondieresis ; G 831
855
+ U 940 ; WX 687 ; N alphatonos ; G 832
856
+ U 941 ; WX 557 ; N epsilontonos ; G 833
857
+ U 942 ; WX 712 ; N etatonos ; G 834
858
+ U 943 ; WX 390 ; N iotatonos ; G 835
859
+ U 944 ; WX 675 ; N upsilondieresistonos ; G 836
860
+ U 945 ; WX 687 ; N alpha ; G 837
861
+ U 946 ; WX 716 ; N beta ; G 838
862
+ U 947 ; WX 681 ; N gamma ; G 839
863
+ U 948 ; WX 687 ; N delta ; G 840
864
+ U 949 ; WX 557 ; N epsilon ; G 841
865
+ U 950 ; WX 591 ; N zeta ; G 842
866
+ U 951 ; WX 712 ; N eta ; G 843
867
+ U 952 ; WX 687 ; N theta ; G 844
868
+ U 953 ; WX 390 ; N iota ; G 845
869
+ U 954 ; WX 710 ; N kappa ; G 846
870
+ U 955 ; WX 633 ; N lambda ; G 847
871
+ U 956 ; WX 736 ; N uni03BC ; G 848
872
+ U 957 ; WX 681 ; N nu ; G 849
873
+ U 958 ; WX 591 ; N xi ; G 850
874
+ U 959 ; WX 687 ; N omicron ; G 851
875
+ U 960 ; WX 791 ; N pi ; G 852
876
+ U 961 ; WX 716 ; N rho ; G 853
877
+ U 962 ; WX 593 ; N sigma1 ; G 854
878
+ U 963 ; WX 779 ; N sigma ; G 855
879
+ U 964 ; WX 638 ; N tau ; G 856
880
+ U 965 ; WX 675 ; N upsilon ; G 857
881
+ U 966 ; WX 782 ; N phi ; G 858
882
+ U 967 ; WX 645 ; N chi ; G 859
883
+ U 968 ; WX 794 ; N psi ; G 860
884
+ U 969 ; WX 869 ; N omega ; G 861
885
+ U 970 ; WX 390 ; N iotadieresis ; G 862
886
+ U 971 ; WX 675 ; N upsilondieresis ; G 863
887
+ U 972 ; WX 687 ; N omicrontonos ; G 864
888
+ U 973 ; WX 675 ; N upsilontonos ; G 865
889
+ U 974 ; WX 869 ; N omegatonos ; G 866
890
+ U 975 ; WX 775 ; N uni03CF ; G 867
891
+ U 976 ; WX 651 ; N uni03D0 ; G 868
892
+ U 977 ; WX 661 ; N theta1 ; G 869
893
+ U 978 ; WX 746 ; N Upsilon1 ; G 870
894
+ U 979 ; WX 981 ; N uni03D3 ; G 871
895
+ U 980 ; WX 746 ; N uni03D4 ; G 872
896
+ U 981 ; WX 796 ; N phi1 ; G 873
897
+ U 982 ; WX 869 ; N omega1 ; G 874
898
+ U 983 ; WX 744 ; N uni03D7 ; G 875
899
+ U 984 ; WX 850 ; N uni03D8 ; G 876
900
+ U 985 ; WX 687 ; N uni03D9 ; G 877
901
+ U 986 ; WX 734 ; N uni03DA ; G 878
902
+ U 987 ; WX 593 ; N uni03DB ; G 879
903
+ U 988 ; WX 683 ; N uni03DC ; G 880
904
+ U 989 ; WX 494 ; N uni03DD ; G 881
905
+ U 990 ; WX 702 ; N uni03DE ; G 882
906
+ U 991 ; WX 660 ; N uni03DF ; G 883
907
+ U 992 ; WX 919 ; N uni03E0 ; G 884
908
+ U 993 ; WX 627 ; N uni03E1 ; G 885
909
+ U 994 ; WX 1093 ; N uni03E2 ; G 886
910
+ U 995 ; WX 837 ; N uni03E3 ; G 887
911
+ U 996 ; WX 832 ; N uni03E4 ; G 888
912
+ U 997 ; WX 716 ; N uni03E5 ; G 889
913
+ U 998 ; WX 928 ; N uni03E6 ; G 890
914
+ U 999 ; WX 744 ; N uni03E7 ; G 891
915
+ U 1000 ; WX 733 ; N uni03E8 ; G 892
916
+ U 1001 ; WX 650 ; N uni03E9 ; G 893
917
+ U 1002 ; WX 789 ; N uni03EA ; G 894
918
+ U 1003 ; WX 671 ; N uni03EB ; G 895
919
+ U 1004 ; WX 752 ; N uni03EC ; G 896
920
+ U 1005 ; WX 716 ; N uni03ED ; G 897
921
+ U 1006 ; WX 682 ; N uni03EE ; G 898
922
+ U 1007 ; WX 590 ; N uni03EF ; G 899
923
+ U 1008 ; WX 744 ; N uni03F0 ; G 900
924
+ U 1009 ; WX 716 ; N uni03F1 ; G 901
925
+ U 1010 ; WX 593 ; N uni03F2 ; G 902
926
+ U 1011 ; WX 343 ; N uni03F3 ; G 903
927
+ U 1012 ; WX 850 ; N uni03F4 ; G 904
928
+ U 1013 ; WX 645 ; N uni03F5 ; G 905
929
+ U 1014 ; WX 644 ; N uni03F6 ; G 906
930
+ U 1015 ; WX 738 ; N uni03F7 ; G 907
931
+ U 1016 ; WX 716 ; N uni03F8 ; G 908
932
+ U 1017 ; WX 734 ; N uni03F9 ; G 909
933
+ U 1018 ; WX 995 ; N uni03FA ; G 910
934
+ U 1019 ; WX 732 ; N uni03FB ; G 911
935
+ U 1020 ; WX 716 ; N uni03FC ; G 912
936
+ U 1021 ; WX 698 ; N uni03FD ; G 913
937
+ U 1022 ; WX 734 ; N uni03FE ; G 914
938
+ U 1023 ; WX 698 ; N uni03FF ; G 915
939
  U 1024 ; WX 683 ; N uni0400 ; G 916
940
  U 1025 ; WX 683 ; N uni0401 ; G 917
941
  U 1026 ; WX 878 ; N uni0402 ; G 918
946
  U 1031 ; WX 372 ; N uni0407 ; G 923
947
  U 1032 ; WX 372 ; N uni0408 ; G 924
948
  U 1033 ; WX 1154 ; N uni0409 ; G 925
949
+ U 1034 ; WX 1130 ; N uni040A ; G 926
950
+ U 1035 ; WX 878 ; N uni040B ; G 927
951
+ U 1036 ; WX 817 ; N uni040C ; G 928
952
+ U 1037 ; WX 837 ; N uni040D ; G 929
953
+ U 1038 ; WX 771 ; N uni040E ; G 930
954
+ U 1039 ; WX 837 ; N uni040F ; G 931
955
  U 1040 ; WX 774 ; N uni0410 ; G 932
956
  U 1041 ; WX 762 ; N uni0411 ; G 933
957
  U 1042 ; WX 762 ; N uni0412 ; G 934
962
  U 1047 ; WX 710 ; N uni0417 ; G 939
963
  U 1048 ; WX 837 ; N uni0418 ; G 940
964
  U 1049 ; WX 837 ; N uni0419 ; G 941
965
+ U 1050 ; WX 817 ; N uni041A ; G 942
966
+ U 1051 ; WX 831 ; N uni041B ; G 943
967
+ U 1052 ; WX 995 ; N uni041C ; G 944
968
+ U 1053 ; WX 837 ; N uni041D ; G 945
969
+ U 1054 ; WX 850 ; N uni041E ; G 946
970
+ U 1055 ; WX 837 ; N uni041F ; G 947
971
  U 1056 ; WX 733 ; N uni0420 ; G 948
972
  U 1057 ; WX 734 ; N uni0421 ; G 949
973
  U 1058 ; WX 682 ; N uni0422 ; G 950
978
  U 1063 ; WX 808 ; N uni0427 ; G 955
979
  U 1064 ; WX 1235 ; N uni0428 ; G 956
980
  U 1065 ; WX 1326 ; N uni0429 ; G 957
981
+ U 1066 ; WX 939 ; N uni042A ; G 958
982
+ U 1067 ; WX 1036 ; N uni042B ; G 959
983
+ U 1068 ; WX 762 ; N uni042C ; G 960
984
+ U 1069 ; WX 734 ; N uni042D ; G 961
985
+ U 1070 ; WX 1174 ; N uni042E ; G 962
986
+ U 1071 ; WX 770 ; N uni042F ; G 963
987
  U 1072 ; WX 675 ; N uni0430 ; G 964
988
  U 1073 ; WX 698 ; N uni0431 ; G 965
989
  U 1074 ; WX 633 ; N uni0432 ; G 966
994
  U 1079 ; WX 581 ; N uni0437 ; G 971
995
  U 1080 ; WX 701 ; N uni0438 ; G 972
996
  U 1081 ; WX 701 ; N uni0439 ; G 973
997
+ U 1082 ; WX 679 ; N uni043A ; G 974
998
+ U 1083 ; WX 732 ; N uni043B ; G 975
999
+ U 1084 ; WX 817 ; N uni043C ; G 976
1000
+ U 1085 ; WX 691 ; N uni043D ; G 977
1001
+ U 1086 ; WX 687 ; N uni043E ; G 978
1002
+ U 1087 ; WX 691 ; N uni043F ; G 979
1003
  U 1088 ; WX 716 ; N uni0440 ; G 980
1004
  U 1089 ; WX 593 ; N uni0441 ; G 981
1005
  U 1090 ; WX 580 ; N uni0442 ; G 982
1010
  U 1095 ; WX 687 ; N uni0447 ; G 987
1011
  U 1096 ; WX 1062 ; N uni0448 ; G 988
1012
  U 1097 ; WX 1105 ; N uni0449 ; G 989
1013
+ U 1098 ; WX 751 ; N uni044A ; G 990
1014
+ U 1099 ; WX 904 ; N uni044B ; G 991
1015
+ U 1100 ; WX 632 ; N uni044C ; G 992
1016
+ U 1101 ; WX 593 ; N uni044D ; G 993
1017
+ U 1102 ; WX 972 ; N uni044E ; G 994
1018
+ U 1103 ; WX 642 ; N uni044F ; G 995
1019
  U 1104 ; WX 678 ; N uni0450 ; G 996
1020
  U 1105 ; WX 678 ; N uni0451 ; G 997
1021
  U 1106 ; WX 714 ; N uni0452 ; G 998
1026
  U 1111 ; WX 343 ; N uni0457 ; G 1003
1027
  U 1112 ; WX 343 ; N uni0458 ; G 1004
1028
  U 1113 ; WX 991 ; N uni0459 ; G 1005
1029
+ U 1114 ; WX 956 ; N uni045A ; G 1006
1030
+ U 1115 ; WX 734 ; N uni045B ; G 1007
1031
+ U 1116 ; WX 679 ; N uni045C ; G 1008
1032
+ U 1117 ; WX 701 ; N uni045D ; G 1009
1033
+ U 1118 ; WX 652 ; N uni045E ; G 1010
1034
+ U 1119 ; WX 691 ; N uni045F ; G 1011
1035
  U 1120 ; WX 1093 ; N uni0460 ; G 1012
1036
  U 1121 ; WX 869 ; N uni0461 ; G 1013
1037
  U 1122 ; WX 840 ; N uni0462 ; G 1014
1042
  U 1127 ; WX 832 ; N uni0467 ; G 1019
1043
  U 1128 ; WX 1358 ; N uni0468 ; G 1020
1044
  U 1129 ; WX 1121 ; N uni0469 ; G 1021
1045
+ U 1130 ; WX 850 ; N uni046A ; G 1022
1046
+ U 1131 ; WX 687 ; N uni046B ; G 1023
1047
+ U 1132 ; WX 1236 ; N uni046C ; G 1024
1048
+ U 1133 ; WX 1007 ; N uni046D ; G 1025
1049
+ U 1134 ; WX 696 ; N uni046E ; G 1026
1050
+ U 1135 ; WX 557 ; N uni046F ; G 1027
1051
  U 1136 ; WX 1075 ; N uni0470 ; G 1028
1052
  U 1137 ; WX 1061 ; N uni0471 ; G 1029
1053
  U 1138 ; WX 850 ; N uni0472 ; G 1030
1058
  U 1143 ; WX 695 ; N uni0477 ; G 1035
1059
  U 1144 ; WX 1148 ; N uni0478 ; G 1036
1060
  U 1145 ; WX 1043 ; N uni0479 ; G 1037
1061
+ U 1146 ; WX 1074 ; N uni047A ; G 1038
1062
+ U 1147 ; WX 863 ; N uni047B ; G 1039
1063
+ U 1148 ; WX 1405 ; N uni047C ; G 1040
1064
+ U 1149 ; WX 1173 ; N uni047D ; G 1041
1065
+ U 1150 ; WX 1093 ; N uni047E ; G 1042
1066
+ U 1151 ; WX 869 ; N uni047F ; G 1043
1067
  U 1152 ; WX 734 ; N uni0480 ; G 1044
1068
  U 1153 ; WX 593 ; N uni0481 ; G 1045
1069
  U 1154 ; WX 652 ; N uni0482 ; G 1046
1070
+ U 1155 ; WX 0 ; N uni0483 ; G 1047
1071
+ U 1156 ; WX 0 ; N uni0484 ; G 1048
1072
+ U 1157 ; WX 0 ; N uni0485 ; G 1049
1073
+ U 1158 ; WX 0 ; N uni0486 ; G 1050
1074
+ U 1159 ; WX 0 ; N uni0487 ; G 1051
1075
  U 1160 ; WX 418 ; N uni0488 ; G 1052
1076
  U 1161 ; WX 418 ; N uni0489 ; G 1053
1077
+ U 1162 ; WX 957 ; N uni048A ; G 1054
1078
+ U 1163 ; WX 807 ; N uni048B ; G 1055
1079
+ U 1164 ; WX 762 ; N uni048C ; G 1056
1080
+ U 1165 ; WX 611 ; N uni048D ; G 1057
1081
+ U 1166 ; WX 733 ; N uni048E ; G 1058
1082
+ U 1167 ; WX 716 ; N uni048F ; G 1059
1083
  U 1168 ; WX 637 ; N uni0490 ; G 1060
1084
  U 1169 ; WX 522 ; N uni0491 ; G 1061
1085
  U 1170 ; WX 666 ; N uni0492 ; G 1062
1090
  U 1175 ; WX 995 ; N uni0497 ; G 1067
1091
  U 1176 ; WX 710 ; N uni0498 ; G 1068
1092
  U 1177 ; WX 581 ; N uni0499 ; G 1069
1093
+ U 1178 ; WX 775 ; N uni049A ; G 1070
1094
+ U 1179 ; WX 679 ; N uni049B ; G 1071
1095
+ U 1180 ; WX 817 ; N uni049C ; G 1072
1096
+ U 1181 ; WX 679 ; N uni049D ; G 1073
1097
+ U 1182 ; WX 817 ; N uni049E ; G 1074
1098
+ U 1183 ; WX 679 ; N uni049F ; G 1075
1099
+ U 1184 ; WX 1015 ; N uni04A0 ; G 1076
1100
+ U 1185 ; WX 826 ; N uni04A1 ; G 1077
1101
+ U 1186 ; WX 956 ; N uni04A2 ; G 1078
1102
+ U 1187 ; WX 808 ; N uni04A3 ; G 1079
1103
+ U 1188 ; WX 1103 ; N uni04A4 ; G 1080
1104
+ U 1189 ; WX 874 ; N uni04A5 ; G 1081
1105
+ U 1190 ; WX 1273 ; N uni04A6 ; G 1082
1106
+ U 1191 ; WX 1017 ; N uni04A7 ; G 1083
1107
+ U 1192 ; WX 952 ; N uni04A8 ; G 1084
1108
+ U 1193 ; WX 858 ; N uni04A9 ; G 1085
1109
+ U 1194 ; WX 734 ; N uni04AA ; G 1086
1110
+ U 1195 ; WX 593 ; N uni04AB ; G 1087
1111
+ U 1196 ; WX 682 ; N uni04AC ; G 1088
1112
+ U 1197 ; WX 580 ; N uni04AD ; G 1089
1113
+ U 1198 ; WX 724 ; N uni04AE ; G 1090
1114
+ U 1199 ; WX 652 ; N uni04AF ; G 1091
1115
+ U 1200 ; WX 724 ; N uni04B0 ; G 1092
1116
+ U 1201 ; WX 652 ; N uni04B1 ; G 1093
1117
+ U 1202 ; WX 771 ; N uni04B2 ; G 1094
1118
+ U 1203 ; WX 645 ; N uni04B3 ; G 1095
1119
+ U 1204 ; WX 1112 ; N uni04B4 ; G 1096
1120
+ U 1205 ; WX 1000 ; N uni04B5 ; G 1097
1121
+ U 1206 ; WX 808 ; N uni04B6 ; G 1098
1122
+ U 1207 ; WX 687 ; N uni04B7 ; G 1099
1123
+ U 1208 ; WX 808 ; N uni04B8 ; G 1100
1124
+ U 1209 ; WX 687 ; N uni04B9 ; G 1101
1125
+ U 1210 ; WX 808 ; N uni04BA ; G 1102
1126
+ U 1211 ; WX 712 ; N uni04BB ; G 1103
1127
+ U 1212 ; WX 1026 ; N uni04BC ; G 1104
1128
+ U 1213 ; WX 810 ; N uni04BD ; G 1105
1129
+ U 1214 ; WX 1026 ; N uni04BE ; G 1106
1130
+ U 1215 ; WX 810 ; N uni04BF ; G 1107
1131
+ U 1216 ; WX 372 ; N uni04C0 ; G 1108
1132
+ U 1217 ; WX 1224 ; N uni04C1 ; G 1109
1133
+ U 1218 ; WX 995 ; N uni04C2 ; G 1110
1134
+ U 1219 ; WX 775 ; N uni04C3 ; G 1111
1135
+ U 1220 ; WX 630 ; N uni04C4 ; G 1112
1136
+ U 1221 ; WX 951 ; N uni04C5 ; G 1113
1137
+ U 1222 ; WX 805 ; N uni04C6 ; G 1114
1138
+ U 1223 ; WX 837 ; N uni04C7 ; G 1115
1139
+ U 1224 ; WX 691 ; N uni04C8 ; G 1116
1140
+ U 1225 ; WX 957 ; N uni04C9 ; G 1117
1141
+ U 1226 ; WX 807 ; N uni04CA ; G 1118
1142
+ U 1227 ; WX 808 ; N uni04CB ; G 1119
1143
+ U 1228 ; WX 687 ; N uni04CC ; G 1120
1144
+ U 1229 ; WX 1115 ; N uni04CD ; G 1121
1145
+ U 1230 ; WX 933 ; N uni04CE ; G 1122
1146
+ U 1231 ; WX 343 ; N uni04CF ; G 1123
1147
+ U 1232 ; WX 774 ; N uni04D0 ; G 1124
1148
+ U 1233 ; WX 675 ; N uni04D1 ; G 1125
1149
+ U 1234 ; WX 774 ; N uni04D2 ; G 1126
1150
+ U 1235 ; WX 675 ; N uni04D3 ; G 1127
1151
+ U 1236 ; WX 1085 ; N uni04D4 ; G 1128
1152
+ U 1237 ; WX 1048 ; N uni04D5 ; G 1129
1153
+ U 1238 ; WX 683 ; N uni04D6 ; G 1130
1154
+ U 1239 ; WX 678 ; N uni04D7 ; G 1131
1155
+ U 1240 ; WX 849 ; N uni04D8 ; G 1132
1156
+ U 1241 ; WX 678 ; N uni04D9 ; G 1133
1157
+ U 1242 ; WX 849 ; N uni04DA ; G 1134
1158
+ U 1243 ; WX 678 ; N uni04DB ; G 1135
1159
+ U 1244 ; WX 1224 ; N uni04DC ; G 1136
1160
+ U 1245 ; WX 995 ; N uni04DD ; G 1137
1161
+ U 1246 ; WX 710 ; N uni04DE ; G 1138
1162
+ U 1247 ; WX 581 ; N uni04DF ; G 1139
1163
+ U 1248 ; WX 772 ; N uni04E0 ; G 1140
1164
+ U 1249 ; WX 641 ; N uni04E1 ; G 1141
1165
+ U 1250 ; WX 837 ; N uni04E2 ; G 1142
1166
+ U 1251 ; WX 701 ; N uni04E3 ; G 1143
1167
+ U 1252 ; WX 837 ; N uni04E4 ; G 1144
1168
+ U 1253 ; WX 701 ; N uni04E5 ; G 1145
1169
+ U 1254 ; WX 850 ; N uni04E6 ; G 1146
1170
+ U 1255 ; WX 687 ; N uni04E7 ; G 1147
1171
+ U 1256 ; WX 850 ; N uni04E8 ; G 1148
1172
+ U 1257 ; WX 687 ; N uni04E9 ; G 1149
1173
+ U 1258 ; WX 850 ; N uni04EA ; G 1150
1174
+ U 1259 ; WX 687 ; N uni04EB ; G 1151
1175
+ U 1260 ; WX 734 ; N uni04EC ; G 1152
1176
+ U 1261 ; WX 593 ; N uni04ED ; G 1153
1177
+ U 1262 ; WX 771 ; N uni04EE ; G 1154
1178
+ U 1263 ; WX 652 ; N uni04EF ; G 1155
1179
+ U 1264 ; WX 771 ; N uni04F0 ; G 1156
1180
+ U 1265 ; WX 652 ; N uni04F1 ; G 1157
1181
+ U 1266 ; WX 771 ; N uni04F2 ; G 1158
1182
+ U 1267 ; WX 652 ; N uni04F3 ; G 1159
1183
+ U 1268 ; WX 808 ; N uni04F4 ; G 1160
1184
+ U 1269 ; WX 687 ; N uni04F5 ; G 1161
1185
+ U 1270 ; WX 637 ; N uni04F6 ; G 1162
1186
+ U 1271 ; WX 522 ; N uni04F7 ; G 1163
1187
+ U 1272 ; WX 1036 ; N uni04F8 ; G 1164
1188
+ U 1273 ; WX 904 ; N uni04F9 ; G 1165
1189
+ U 1274 ; WX 666 ; N uni04FA ; G 1166
1190
+ U 1275 ; WX 543 ; N uni04FB ; G 1167
1191
+ U 1276 ; WX 771 ; N uni04FC ; G 1168
1192
+ U 1277 ; WX 645 ; N uni04FD ; G 1169
1193
+ U 1278 ; WX 771 ; N uni04FE ; G 1170
1194
+ U 1279 ; WX 645 ; N uni04FF ; G 1171
1195
  U 1280 ; WX 762 ; N uni0500 ; G 1172
1196
  U 1281 ; WX 608 ; N uni0501 ; G 1173
1197
  U 1282 ; WX 1159 ; N uni0502 ; G 1174
1202
  U 1287 ; WX 693 ; N uni0507 ; G 1179
1203
  U 1288 ; WX 1242 ; N uni0508 ; G 1180
1204
  U 1289 ; WX 1017 ; N uni0509 ; G 1181
1205
+ U 1290 ; WX 1289 ; N uni050A ; G 1182
1206
+ U 1291 ; WX 1013 ; N uni050B ; G 1183
1207
+ U 1292 ; WX 839 ; N uni050C ; G 1184
1208
+ U 1293 ; WX 638 ; N uni050D ; G 1185
1209
+ U 1294 ; WX 938 ; N uni050E ; G 1186
1210
+ U 1295 ; WX 803 ; N uni050F ; G 1187
1211
  U 1296 ; WX 696 ; N uni0510 ; G 1188
1212
  U 1297 ; WX 557 ; N uni0511 ; G 1189
1213
  U 1298 ; WX 831 ; N uni0512 ; G 1190
1218
  U 1303 ; WX 979 ; N uni0517 ; G 1195
1219
  U 1304 ; WX 1082 ; N uni0518 ; G 1196
1220
  U 1305 ; WX 1013 ; N uni0519 ; G 1197
1221
+ U 1306 ; WX 850 ; N uni051A ; G 1198
1222
+ U 1307 ; WX 716 ; N uni051B ; G 1199
1223
+ U 1308 ; WX 1103 ; N uni051C ; G 1200
1224
+ U 1309 ; WX 924 ; N uni051D ; G 1201
1225
  U 1312 ; WX 1267 ; N uni0520 ; G 1202
1226
  U 1313 ; WX 1059 ; N uni0521 ; G 1203
1227
  U 1314 ; WX 1273 ; N uni0522 ; G 1204
1237
  U 1335 ; WX 812 ; N uni0537 ; G 1214
1238
  U 1336 ; WX 812 ; N uni0538 ; G 1215
1239
  U 1337 ; WX 975 ; N uni0539 ; G 1216
1240
+ U 1338 ; WX 984 ; N uni053A ; G 1217
1241
+ U 1339 ; WX 812 ; N uni053B ; G 1218
1242
+ U 1340 ; WX 710 ; N uni053C ; G 1219
1243
+ U 1341 ; WX 1078 ; N uni053D ; G 1220
1244
+ U 1342 ; WX 1136 ; N uni053E ; G 1221
1245
+ U 1343 ; WX 812 ; N uni053F ; G 1222
1246
  U 1344 ; WX 710 ; N uni0540 ; G 1223
1247
  U 1345 ; WX 757 ; N uni0541 ; G 1224
1248
  U 1346 ; WX 984 ; N uni0542 ; G 1225
1253
  U 1351 ; WX 812 ; N uni0547 ; G 1230
1254
  U 1352 ; WX 812 ; N uni0548 ; G 1231
1255
  U 1353 ; WX 812 ; N uni0549 ; G 1232
1256
+ U 1354 ; WX 958 ; N uni054A ; G 1233
1257
+ U 1355 ; WX 777 ; N uni054B ; G 1234
1258
+ U 1356 ; WX 984 ; N uni054C ; G 1235
1259
+ U 1357 ; WX 812 ; N uni054D ; G 1236
1260
+ U 1358 ; WX 984 ; N uni054E ; G 1237
1261
+ U 1359 ; WX 720 ; N uni054F ; G 1238
1262
  U 1360 ; WX 812 ; N uni0550 ; G 1239
1263
  U 1361 ; WX 793 ; N uni0551 ; G 1240
1264
  U 1362 ; WX 895 ; N uni0552 ; G 1241
1267
  U 1365 ; WX 850 ; N uni0555 ; G 1244
1268
  U 1366 ; WX 720 ; N uni0556 ; G 1245
1269
  U 1369 ; WX 366 ; N uni0559 ; G 1246
1270
+ U 1370 ; WX 380 ; N uni055A ; G 1247
1271
+ U 1371 ; WX 550 ; N uni055B ; G 1248
1272
+ U 1372 ; WX 550 ; N uni055C ; G 1249
1273
+ U 1373 ; WX 380 ; N uni055D ; G 1250
1274
+ U 1374 ; WX 546 ; N uni055E ; G 1251
1275
+ U 1375 ; WX 521 ; N uni055F ; G 1252
1276
  U 1377 ; WX 1042 ; N uni0561 ; G 1253
1277
  U 1378 ; WX 712 ; N uni0562 ; G 1254
1278
  U 1379 ; WX 866 ; N uni0563 ; G 1255
1282
  U 1383 ; WX 653 ; N uni0567 ; G 1259
1283
  U 1384 ; WX 712 ; N uni0568 ; G 1260
1284
  U 1385 ; WX 811 ; N uni0569 ; G 1261
1285
+ U 1386 ; WX 817 ; N uni056A ; G 1262
1286
+ U 1387 ; WX 712 ; N uni056B ; G 1263
1287
+ U 1388 ; WX 498 ; N uni056C ; G 1264
1288
+ U 1389 ; WX 1018 ; N uni056D ; G 1265
1289
+ U 1390 ; WX 716 ; N uni056E ; G 1266
1290
+ U 1391 ; WX 712 ; N uni056F ; G 1267
1291
  U 1392 ; WX 712 ; N uni0570 ; G 1268
1292
  U 1393 ; WX 716 ; N uni0571 ; G 1269
1293
  U 1394 ; WX 819 ; N uni0572 ; G 1270
1298
  U 1399 ; WX 559 ; N uni0577 ; G 1275
1299
  U 1400 ; WX 712 ; N uni0578 ; G 1276
1300
  U 1401 ; WX 559 ; N uni0579 ; G 1277
1301
+ U 1402 ; WX 1042 ; N uni057A ; G 1278
1302
+ U 1403 ; WX 559 ; N uni057B ; G 1279
1303
+ U 1404 ; WX 863 ; N uni057C ; G 1280
1304
+ U 1405 ; WX 712 ; N uni057D ; G 1281
1305
+ U 1406 ; WX 813 ; N uni057E ; G 1282
1306
+ U 1407 ; WX 1042 ; N uni057F ; G 1283
1307
  U 1408 ; WX 712 ; N uni0580 ; G 1284
1308
  U 1409 ; WX 716 ; N uni0581 ; G 1285
1309
  U 1410 ; WX 571 ; N uni0582 ; G 1286
1313
  U 1414 ; WX 720 ; N uni0586 ; G 1290
1314
  U 1415 ; WX 862 ; N uni0587 ; G 1291
1315
  U 1417 ; WX 400 ; N uni0589 ; G 1292
1316
+ U 1418 ; WX 487 ; N uni058A ; G 1293
1317
+ U 1456 ; WX 0 ; N uni05B0 ; G 1294
1318
+ U 1457 ; WX 0 ; N uni05B1 ; G 1295
1319
+ U 1458 ; WX 0 ; N uni05B2 ; G 1296
1320
+ U 1459 ; WX 0 ; N uni05B3 ; G 1297
1321
+ U 1460 ; WX 0 ; N uni05B4 ; G 1298
1322
+ U 1461 ; WX 0 ; N uni05B5 ; G 1299
1323
+ U 1462 ; WX 0 ; N uni05B6 ; G 1300
1324
+ U 1463 ; WX 0 ; N uni05B7 ; G 1301
1325
+ U 1464 ; WX 0 ; N uni05B8 ; G 1302
1326
+ U 1465 ; WX 0 ; N uni05B9 ; G 1303
1327
+ U 1466 ; WX 0 ; N uni05BA ; G 1304
1328
+ U 1467 ; WX 0 ; N uni05BB ; G 1305
1329
+ U 1468 ; WX 0 ; N uni05BC ; G 1306
1330
+ U 1469 ; WX 0 ; N uni05BD ; G 1307
1331
+ U 1470 ; WX 415 ; N uni05BE ; G 1308
1332
+ U 1471 ; WX 0 ; N uni05BF ; G 1309
1333
+ U 1472 ; WX 372 ; N uni05C0 ; G 1310
1334
+ U 1473 ; WX 0 ; N uni05C1 ; G 1311
1335
+ U 1474 ; WX 0 ; N uni05C2 ; G 1312
1336
+ U 1475 ; WX 372 ; N uni05C3 ; G 1313
1337
+ U 1478 ; WX 497 ; N uni05C6 ; G 1314
1338
+ U 1479 ; WX 0 ; N uni05C7 ; G 1315
1339
+ U 1488 ; WX 751 ; N uni05D0 ; G 1316
1340
+ U 1489 ; WX 673 ; N uni05D1 ; G 1317
1341
+ U 1490 ; WX 537 ; N uni05D2 ; G 1318
1342
+ U 1491 ; WX 654 ; N uni05D3 ; G 1319
1343
+ U 1492 ; WX 712 ; N uni05D4 ; G 1320
1344
+ U 1493 ; WX 343 ; N uni05D5 ; G 1321
1345
+ U 1494 ; WX 491 ; N uni05D6 ; G 1322
1346
+ U 1495 ; WX 712 ; N uni05D7 ; G 1323
1347
+ U 1496 ; WX 724 ; N uni05D8 ; G 1324
1348
+ U 1497 ; WX 343 ; N uni05D9 ; G 1325
1349
+ U 1498 ; WX 649 ; N uni05DA ; G 1326
1350
+ U 1499 ; WX 650 ; N uni05DB ; G 1327
1351
+ U 1500 ; WX 679 ; N uni05DC ; G 1328
1352
+ U 1501 ; WX 712 ; N uni05DD ; G 1329
1353
+ U 1502 ; WX 775 ; N uni05DE ; G 1330
1354
+ U 1503 ; WX 343 ; N uni05DF ; G 1331
1355
+ U 1504 ; WX 497 ; N uni05E0 ; G 1332
1356
+ U 1505 ; WX 773 ; N uni05E1 ; G 1333
1357
+ U 1506 ; WX 678 ; N uni05E2 ; G 1334
1358
+ U 1507 ; WX 718 ; N uni05E3 ; G 1335
1359
+ U 1508 ; WX 687 ; N uni05E4 ; G 1336
1360
+ U 1509 ; WX 628 ; N uni05E5 ; G 1337
1361
+ U 1510 ; WX 751 ; N uni05E6 ; G 1338
1362
+ U 1511 ; WX 729 ; N uni05E7 ; G 1339
1363
+ U 1512 ; WX 649 ; N uni05E8 ; G 1340
1364
+ U 1513 ; WX 949 ; N uni05E9 ; G 1341
1365
+ U 1514 ; WX 751 ; N uni05EA ; G 1342
1366
+ U 1520 ; WX 664 ; N uni05F0 ; G 1343
1367
+ U 1521 ; WX 664 ; N uni05F1 ; G 1344
1368
+ U 1522 ; WX 663 ; N uni05F2 ; G 1345
1369
+ U 1523 ; WX 444 ; N uni05F3 ; G 1346
1370
+ U 1524 ; WX 710 ; N uni05F4 ; G 1347
1371
  U 1542 ; WX 667 ; N uni0606 ; G 1348
1372
  U 1543 ; WX 667 ; N uni0607 ; G 1349
1373
  U 1545 ; WX 884 ; N uni0609 ; G 1350
1374
+ U 1546 ; WX 1157 ; N uni060A ; G 1351
1375
+ U 1548 ; WX 380 ; N uni060C ; G 1352
1376
+ U 1557 ; WX 0 ; N uni0615 ; G 1353
1377
+ U 1563 ; WX 400 ; N uni061B ; G 1354
1378
+ U 1567 ; WX 580 ; N uni061F ; G 1355
1379
  U 1569 ; WX 511 ; N uni0621 ; G 1356
1380
  U 1570 ; WX 343 ; N uni0622 ; G 1357
1381
  U 1571 ; WX 343 ; N uni0623 ; G 1358
1385
  U 1575 ; WX 343 ; N uni0627 ; G 1362
1386
  U 1576 ; WX 1005 ; N uni0628 ; G 1363
1387
  U 1577 ; WX 590 ; N uni0629 ; G 1364
1388
+ U 1578 ; WX 1005 ; N uni062A ; G 1365
1389
+ U 1579 ; WX 1005 ; N uni062B ; G 1366
1390
+ U 1580 ; WX 721 ; N uni062C ; G 1367
1391
+ U 1581 ; WX 721 ; N uni062D ; G 1368
1392
+ U 1582 ; WX 721 ; N uni062E ; G 1369
1393
+ U 1583 ; WX 513 ; N uni062F ; G 1370
1394
  U 1584 ; WX 513 ; N uni0630 ; G 1371
1395
  U 1585 ; WX 576 ; N uni0631 ; G 1372
1396
  U 1586 ; WX 576 ; N uni0632 ; G 1373
1401
  U 1591 ; WX 1039 ; N uni0637 ; G 1378
1402
  U 1592 ; WX 1039 ; N uni0638 ; G 1379
1403
  U 1593 ; WX 683 ; N uni0639 ; G 1380
1404
+ U 1594 ; WX 683 ; N uni063A ; G 1381
1405
  U 1600 ; WX 342 ; N uni0640 ; G 1382
1406
  U 1601 ; WX 1162 ; N uni0641 ; G 1383
1407
  U 1602 ; WX 894 ; N uni0642 ; G 1384
1412
  U 1607 ; WX 590 ; N uni0647 ; G 1389
1413
  U 1608 ; WX 622 ; N uni0648 ; G 1390
1414
  U 1609 ; WX 917 ; N uni0649 ; G 1391
1415
+ U 1610 ; WX 917 ; N uni064A ; G 1392
1416
+ U 1611 ; WX 0 ; N uni064B ; G 1393
1417
+ U 1612 ; WX 0 ; N uni064C ; G 1394
1418
+ U 1613 ; WX 0 ; N uni064D ; G 1395
1419
+ U 1614 ; WX 0 ; N uni064E ; G 1396
1420
+ U 1615 ; WX 0 ; N uni064F ; G 1397
1421
+ U 1616 ; WX 0 ; N uni0650 ; G 1398
1422
+ U 1617 ; WX 0 ; N uni0651 ; G 1399
1423
+ U 1618 ; WX 0 ; N uni0652 ; G 1400
1424
+ U 1619 ; WX 0 ; N uni0653 ; G 1401
1425
+ U 1620 ; WX 0 ; N uni0654 ; G 1402
1426
+ U 1621 ; WX 0 ; N uni0655 ; G 1403
1427
+ U 1623 ; WX 0 ; N uni0657 ; G 1404
1428
+ U 1626 ; WX 500 ; N uni065A ; G 1405
1429
  U 1632 ; WX 610 ; N uni0660 ; G 1406
1430
  U 1633 ; WX 610 ; N uni0661 ; G 1407
1431
  U 1634 ; WX 610 ; N uni0662 ; G 1408
1436
  U 1639 ; WX 610 ; N uni0667 ; G 1413
1437
  U 1640 ; WX 610 ; N uni0668 ; G 1414
1438
  U 1641 ; WX 610 ; N uni0669 ; G 1415
1439
+ U 1642 ; WX 610 ; N uni066A ; G 1416
1440
+ U 1643 ; WX 374 ; N uni066B ; G 1417
1441
+ U 1644 ; WX 380 ; N uni066C ; G 1418
1442
+ U 1645 ; WX 545 ; N uni066D ; G 1419
1443
+ U 1646 ; WX 1005 ; N uni066E ; G 1420
1444
+ U 1647 ; WX 894 ; N uni066F ; G 1421
1445
+ U 1648 ; WX 0 ; N uni0670 ; G 1422
1446
  U 1652 ; WX 292 ; N uni0674 ; G 1423
1447
  U 1657 ; WX 1005 ; N uni0679 ; G 1424
1448
+ U 1658 ; WX 1005 ; N uni067A ; G 1425
1449
+ U 1659 ; WX 1005 ; N uni067B ; G 1426
1450
+ U 1660 ; WX 1005 ; N uni067C ; G 1427
1451
+ U 1661 ; WX 1005 ; N uni067D ; G 1428
1452
+ U 1662 ; WX 1005 ; N uni067E ; G 1429
1453
+ U 1663 ; WX 1005 ; N uni067F ; G 1430
1454
  U 1664 ; WX 1005 ; N uni0680 ; G 1431
1455
  U 1665 ; WX 721 ; N uni0681 ; G 1432
1456
  U 1666 ; WX 721 ; N uni0682 ; G 1433
1461
  U 1671 ; WX 721 ; N uni0687 ; G 1438
1462
  U 1672 ; WX 445 ; N uni0688 ; G 1439
1463
  U 1673 ; WX 445 ; N uni0689 ; G 1440
1464
+ U 1674 ; WX 445 ; N uni068A ; G 1441
1465
+ U 1675 ; WX 445 ; N uni068B ; G 1442
1466
+ U 1676 ; WX 445 ; N uni068C ; G 1443
1467
+ U 1677 ; WX 445 ; N uni068D ; G 1444
1468
+ U 1678 ; WX 445 ; N uni068E ; G 1445
1469
+ U 1679 ; WX 445 ; N uni068F ; G 1446
1470
  U 1680 ; WX 445 ; N uni0690 ; G 1447
1471
  U 1681 ; WX 576 ; N uni0691 ; G 1448
1472
  U 1682 ; WX 576 ; N uni0692 ; G 1449
1477
  U 1687 ; WX 576 ; N uni0697 ; G 1454
1478
  U 1688 ; WX 576 ; N uni0698 ; G 1455
1479
  U 1689 ; WX 576 ; N uni0699 ; G 1456
1480
+ U 1690 ; WX 1380 ; N uni069A ; G 1457
1481
+ U 1691 ; WX 1380 ; N uni069B ; G 1458
1482
+ U 1692 ; WX 1380 ; N uni069C ; G 1459
1483
+ U 1693 ; WX 1345 ; N uni069D ; G 1460
1484
+ U 1694 ; WX 1345 ; N uni069E ; G 1461
1485
+ U 1695 ; WX 1039 ; N uni069F ; G 1462
1486
+ U 1696 ; WX 683 ; N uni06A0 ; G 1463
1487
+ U 1697 ; WX 1162 ; N uni06A1 ; G 1464
1488
+ U 1698 ; WX 1162 ; N uni06A2 ; G 1465
1489
+ U 1699 ; WX 1162 ; N uni06A3 ; G 1466
1490
+ U 1700 ; WX 1162 ; N uni06A4 ; G 1467
1491
+ U 1701 ; WX 1162 ; N uni06A5 ; G 1468
1492
+ U 1702 ; WX 1162 ; N uni06A6 ; G 1469
1493
+ U 1703 ; WX 894 ; N uni06A7 ; G 1470
1494
+ U 1704 ; WX 894 ; N uni06A8 ; G 1471
1495
+ U 1705 ; WX 1024 ; N uni06A9 ; G 1472
1496
+ U 1706 ; WX 1271 ; N uni06AA ; G 1473
1497
+ U 1707 ; WX 1024 ; N uni06AB ; G 1474
1498
+ U 1708 ; WX 917 ; N uni06AC ; G 1475
1499
+ U 1709 ; WX 917 ; N uni06AD ; G 1476
1500
+ U 1710 ; WX 917 ; N uni06AE ; G 1477
1501
+ U 1711 ; WX 1024 ; N uni06AF ; G 1478
1502
+ U 1712 ; WX 1024 ; N uni06B0 ; G 1479
1503
+ U 1713 ; WX 1024 ; N uni06B1 ; G 1480
1504
+ U 1714 ; WX 1024 ; N uni06B2 ; G 1481
1505
+ U 1715 ; WX 1024 ; N uni06B3 ; G 1482
1506
+ U 1716 ; WX 1024 ; N uni06B4 ; G 1483
1507
+ U 1717 ; WX 868 ; N uni06B5 ; G 1484
1508
+ U 1718 ; WX 868 ; N uni06B6 ; G 1485
1509
+ U 1719 ; WX 868 ; N uni06B7 ; G 1486
1510
+ U 1720 ; WX 868 ; N uni06B8 ; G 1487
1511
+ U 1721 ; WX 854 ; N uni06B9 ; G 1488
1512
+ U 1722 ; WX 854 ; N uni06BA ; G 1489
1513
+ U 1723 ; WX 854 ; N uni06BB ; G 1490
1514
+ U 1724 ; WX 854 ; N uni06BC ; G 1491
1515
+ U 1725 ; WX 854 ; N uni06BD ; G 1492
1516
+ U 1726 ; WX 938 ; N uni06BE ; G 1493
1517
+ U 1727 ; WX 721 ; N uni06BF ; G 1494
1518
+ U 1734 ; WX 622 ; N uni06C6 ; G 1495
1519
+ U 1740 ; WX 917 ; N uni06CC ; G 1496
1520
+ U 1742 ; WX 917 ; N uni06CE ; G 1497
1521
+ U 1749 ; WX 590 ; N uni06D5 ; G 1498
1522
+ U 1776 ; WX 610 ; N uni06F0 ; G 1499
1523
+ U 1777 ; WX 610 ; N uni06F1 ; G 1500
1524
+ U 1778 ; WX 610 ; N uni06F2 ; G 1501
1525
+ U 1779 ; WX 610 ; N uni06F3 ; G 1502
1526
+ U 1780 ; WX 610 ; N uni06F4 ; G 1503
1527
+ U 1781 ; WX 610 ; N uni06F5 ; G 1504
1528
+ U 1782 ; WX 610 ; N uni06F6 ; G 1505
1529
+ U 1783 ; WX 610 ; N uni06F7 ; G 1506
1530
+ U 1784 ; WX 610 ; N uni06F8 ; G 1507
1531
+ U 1785 ; WX 610 ; N uni06F9 ; G 1508
1532
+ U 1984 ; WX 696 ; N uni07C0 ; G 1509
1533
+ U 1985 ; WX 696 ; N uni07C1 ; G 1510
1534
+ U 1986 ; WX 696 ; N uni07C2 ; G 1511
1535
+ U 1987 ; WX 696 ; N uni07C3 ; G 1512
1536
+ U 1988 ; WX 696 ; N uni07C4 ; G 1513
1537
+ U 1989 ; WX 696 ; N uni07C5 ; G 1514
1538
+ U 1990 ; WX 696 ; N uni07C6 ; G 1515
1539
+ U 1991 ; WX 696 ; N uni07C7 ; G 1516
1540
+ U 1992 ; WX 696 ; N uni07C8 ; G 1517
1541
+ U 1993 ; WX 696 ; N uni07C9 ; G 1518
1542
+ U 1994 ; WX 343 ; N uni07CA ; G 1519
1543
+ U 1995 ; WX 547 ; N uni07CB ; G 1520
1544
+ U 1996 ; WX 543 ; N uni07CC ; G 1521
1545
+ U 1997 ; WX 652 ; N uni07CD ; G 1522
1546
+ U 1998 ; WX 691 ; N uni07CE ; G 1523
1547
+ U 1999 ; WX 691 ; N uni07CF ; G 1524
1548
+ U 2000 ; WX 594 ; N uni07D0 ; G 1525
1549
+ U 2001 ; WX 691 ; N uni07D1 ; G 1526
1550
+ U 2002 ; WX 904 ; N uni07D2 ; G 1527
1551
+ U 2003 ; WX 551 ; N uni07D3 ; G 1528
1552
+ U 2004 ; WX 551 ; N uni07D4 ; G 1529
1553
+ U 2005 ; WX 627 ; N uni07D5 ; G 1530
1554
+ U 2006 ; WX 688 ; N uni07D6 ; G 1531
1555
+ U 2007 ; WX 444 ; N uni07D7 ; G 1532
1556
+ U 2008 ; WX 1022 ; N uni07D8 ; G 1533
1557
+ U 2009 ; WX 506 ; N uni07D9 ; G 1534
1558
+ U 2010 ; WX 826 ; N uni07DA ; G 1535
1559
+ U 2011 ; WX 691 ; N uni07DB ; G 1536
1560
+ U 2012 ; WX 652 ; N uni07DC ; G 1537
1561
+ U 2013 ; WX 912 ; N uni07DD ; G 1538
1562
+ U 2014 ; WX 627 ; N uni07DE ; G 1539
1563
+ U 2015 ; WX 707 ; N uni07DF ; G 1540
1564
+ U 2016 ; WX 506 ; N uni07E0 ; G 1541
1565
+ U 2017 ; WX 652 ; N uni07E1 ; G 1542
1566
+ U 2018 ; WX 574 ; N uni07E2 ; G 1543
1567
+ U 2019 ; WX 627 ; N uni07E3 ; G 1544
1568
+ U 2020 ; WX 627 ; N uni07E4 ; G 1545
1569
+ U 2021 ; WX 627 ; N uni07E5 ; G 1546
1570
+ U 2022 ; WX 574 ; N uni07E6 ; G 1547
1571
+ U 2023 ; WX 574 ; N uni07E7 ; G 1548
1572
+ U 2027 ; WX 0 ; N uni07EB ; G 1549
1573
+ U 2028 ; WX 0 ; N uni07EC ; G 1550
1574
+ U 2029 ; WX 0 ; N uni07ED ; G 1551
1575
+ U 2030 ; WX 0 ; N uni07EE ; G 1552
1576
+ U 2031 ; WX 0 ; N uni07EF ; G 1553
1577
+ U 2032 ; WX 0 ; N uni07F0 ; G 1554
1578
+ U 2033 ; WX 0 ; N uni07F1 ; G 1555
1579
+ U 2034 ; WX 0 ; N uni07F2 ; G 1556
1580
+ U 2035 ; WX 0 ; N uni07F3 ; G 1557
1581
+ U 2036 ; WX 380 ; N uni07F4 ; G 1558
1582
+ U 2037 ; WX 380 ; N uni07F5 ; G 1559
1583
+ U 2040 ; WX 691 ; N uni07F8 ; G 1560
1584
+ U 2041 ; WX 691 ; N uni07F9 ; G 1561
1585
+ U 2042 ; WX 415 ; N uni07FA ; G 1562
1586
+ U 3647 ; WX 696 ; N uni0E3F ; G 1563
1587
+ U 3713 ; WX 790 ; N uni0E81 ; G 1564
1588
+ U 3714 ; WX 748 ; N uni0E82 ; G 1565
1589
+ U 3716 ; WX 749 ; N uni0E84 ; G 1566
1590
+ U 3719 ; WX 569 ; N uni0E87 ; G 1567
1591
+ U 3720 ; WX 742 ; N uni0E88 ; G 1568
1592
+ U 3722 ; WX 744 ; N uni0E8A ; G 1569
1593
+ U 3725 ; WX 761 ; N uni0E8D ; G 1570
1594
+ U 3732 ; WX 706 ; N uni0E94 ; G 1571
1595
+ U 3733 ; WX 704 ; N uni0E95 ; G 1572
1596
+ U 3734 ; WX 747 ; N uni0E96 ; G 1573
1597
+ U 3735 ; WX 819 ; N uni0E97 ; G 1574
1598
+ U 3737 ; WX 730 ; N uni0E99 ; G 1575
1599
+ U 3738 ; WX 727 ; N uni0E9A ; G 1576
1600
+ U 3739 ; WX 727 ; N uni0E9B ; G 1577
1601
+ U 3740 ; WX 922 ; N uni0E9C ; G 1578
1602
+ U 3741 ; WX 827 ; N uni0E9D ; G 1579
1603
+ U 3742 ; WX 866 ; N uni0E9E ; G 1580
1604
+ U 3743 ; WX 866 ; N uni0E9F ; G 1581
1605
+ U 3745 ; WX 836 ; N uni0EA1 ; G 1582
1606
+ U 3746 ; WX 761 ; N uni0EA2 ; G 1583
1607
+ U 3747 ; WX 770 ; N uni0EA3 ; G 1584
1608
+ U 3749 ; WX 769 ; N uni0EA5 ; G 1585
1609
+ U 3751 ; WX 713 ; N uni0EA7 ; G 1586
1610
+ U 3754 ; WX 827 ; N uni0EAA ; G 1587
1611
+ U 3755 ; WX 1031 ; N uni0EAB ; G 1588
1612
+ U 3757 ; WX 724 ; N uni0EAD ; G 1589
1613
+ U 3758 ; WX 784 ; N uni0EAE ; G 1590
1614
+ U 3759 ; WX 934 ; N uni0EAF ; G 1591
1615
+ U 3760 ; WX 688 ; N uni0EB0 ; G 1592
1616
+ U 3761 ; WX 0 ; N uni0EB1 ; G 1593
1617
+ U 3762 ; WX 610 ; N uni0EB2 ; G 1594
1618
+ U 3763 ; WX 610 ; N uni0EB3 ; G 1595
1619
+ U 3764 ; WX 0 ; N uni0EB4 ; G 1596
1620
+ U 3765 ; WX 0 ; N uni0EB5 ; G 1597
1621
+ U 3766 ; WX 0 ; N uni0EB6 ; G 1598
1622
+ U 3767 ; WX 0 ; N uni0EB7 ; G 1599
1623
+ U 3768 ; WX 0 ; N uni0EB8 ; G 1600
1624
+ U 3769 ; WX 0 ; N uni0EB9 ; G 1601
1625
+ U 3771 ; WX 0 ; N uni0EBB ; G 1602
1626
+ U 3772 ; WX 0 ; N uni0EBC ; G 1603
1627
+ U 3773 ; WX 670 ; N uni0EBD ; G 1604
1628
+ U 3776 ; WX 516 ; N uni0EC0 ; G 1605
1629
+ U 3777 ; WX 860 ; N uni0EC1 ; G 1606
1630
+ U 3778 ; WX 516 ; N uni0EC2 ; G 1607
1631
+ U 3779 ; WX 650 ; N uni0EC3 ; G 1608
1632
+ U 3780 ; WX 632 ; N uni0EC4 ; G 1609
1633
+ U 3782 ; WX 759 ; N uni0EC6 ; G 1610
1634
+ U 3784 ; WX 0 ; N uni0EC8 ; G 1611
1635
+ U 3785 ; WX 0 ; N uni0EC9 ; G 1612
1636
+ U 3786 ; WX 0 ; N uni0ECA ; G 1613
1637
+ U 3787 ; WX 0 ; N uni0ECB ; G 1614
1638
+ U 3788 ; WX 0 ; N uni0ECC ; G 1615
1639
+ U 3789 ; WX 0 ; N uni0ECD ; G 1616
1640
+ U 3792 ; WX 771 ; N uni0ED0 ; G 1617
1641
+ U 3793 ; WX 771 ; N uni0ED1 ; G 1618
1642
+ U 3794 ; WX 693 ; N uni0ED2 ; G 1619
1643
+ U 3795 ; WX 836 ; N uni0ED3 ; G 1620
1644
+ U 3796 ; WX 729 ; N uni0ED4 ; G 1621
1645
+ U 3797 ; WX 729 ; N uni0ED5 ; G 1622
1646
+ U 3798 ; WX 849 ; N uni0ED6 ; G 1623
1647
+ U 3799 ; WX 790 ; N uni0ED7 ; G 1624
1648
+ U 3800 ; WX 759 ; N uni0ED8 ; G 1625
1649
+ U 3801 ; WX 910 ; N uni0ED9 ; G 1626
1650
+ U 3804 ; WX 1363 ; N uni0EDC ; G 1627
1651
+ U 3805 ; WX 1363 ; N uni0EDD ; G 1628
1652
+ U 4256 ; WX 918 ; N uni10A0 ; G 1629
1653
+ U 4257 ; WX 744 ; N uni10A1 ; G 1630
1654
+ U 4258 ; WX 739 ; N uni10A2 ; G 1631
1655
+ U 4259 ; WX 837 ; N uni10A3 ; G 1632
1656
+ U 4260 ; WX 649 ; N uni10A4 ; G 1633
1657
+ U 4261 ; WX 773 ; N uni10A5 ; G 1634
1658
+ U 4262 ; WX 857 ; N uni10A6 ; G 1635
1659
+ U 4263 ; WX 889 ; N uni10A7 ; G 1636
1660
+ U 4264 ; WX 530 ; N uni10A8 ; G 1637
1661
+ U 4265 ; WX 633 ; N uni10A9 ; G 1638
1662
+ U 4266 ; WX 857 ; N uni10AA ; G 1639
1663
+ U 4267 ; WX 900 ; N uni10AB ; G 1640
1664
+ U 4268 ; WX 643 ; N uni10AC ; G 1641
1665
+ U 4269 ; WX 903 ; N uni10AD ; G 1642
1666
+ U 4270 ; WX 814 ; N uni10AE ; G 1643
1667
+ U 4271 ; WX 752 ; N uni10AF ; G 1644
1668
+ U 4272 ; WX 869 ; N uni10B0 ; G 1645
1669
+ U 4273 ; WX 643 ; N uni10B1 ; G 1646
1670
+ U 4274 ; WX 643 ; N uni10B2 ; G 1647
1671
+ U 4275 ; WX 886 ; N uni10B3 ; G 1648
1672
+ U 4276 ; WX 886 ; N uni10B4 ; G 1649
1673
+ U 4277 ; WX 733 ; N uni10B5 ; G 1650
1674
+ U 4278 ; WX 653 ; N uni10B6 ; G 1651
1675
+ U 4279 ; WX 643 ; N uni10B7 ; G 1652
1676
+ U 4280 ; WX 646 ; N uni10B8 ; G 1653
1677
+ U 4281 ; WX 643 ; N uni10B9 ; G 1654
1678
+ U 4282 ; WX 790 ; N uni10BA ; G 1655
1679
+ U 4283 ; WX 902 ; N uni10BB ; G 1656
1680
+ U 4284 ; WX 633 ; N uni10BC ; G 1657
1681
+ U 4285 ; WX 619 ; N uni10BD ; G 1658
1682
+ U 4286 ; WX 643 ; N uni10BE ; G 1659
1683
+ U 4287 ; WX 778 ; N uni10BF ; G 1660
1684
+ U 4288 ; WX 892 ; N uni10C0 ; G 1661
1685
+ U 4289 ; WX 601 ; N uni10C1 ; G 1662
1686
+ U 4290 ; WX 742 ; N uni10C2 ; G 1663
1687
+ U 4291 ; WX 616 ; N uni10C3 ; G 1664
1688
+ U 4292 ; WX 633 ; N uni10C4 ; G 1665
1689
+ U 4293 ; WX 742 ; N uni10C5 ; G 1666
1690
+ U 4304 ; WX 553 ; N uni10D0 ; G 1667
1691
+ U 4305 ; WX 552 ; N uni10D1 ; G 1668
1692
+ U 4306 ; WX 596 ; N uni10D2 ; G 1669
1693
+ U 4307 ; WX 815 ; N uni10D3 ; G 1670
1694
+ U 4308 ; WX 562 ; N uni10D4 ; G 1671
1695
+ U 4309 ; WX 563 ; N uni10D5 ; G 1672
1696
+ U 4310 ; WX 553 ; N uni10D6 ; G 1673
1697
+ U 4311 ; WX 827 ; N uni10D7 ; G 1674
1698
+ U 4312 ; WX 553 ; N uni10D8 ; G 1675
1699
+ U 4313 ; WX 543 ; N uni10D9 ; G 1676
1700
+ U 4314 ; WX 1074 ; N uni10DA ; G 1677
1701
+ U 4315 ; WX 563 ; N uni10DB ; G 1678
1702
+ U 4316 ; WX 563 ; N uni10DC ; G 1679
1703
+ U 4317 ; WX 812 ; N uni10DD ; G 1680
1704
+ U 4318 ; WX 552 ; N uni10DE ; G 1681
1705
+ U 4319 ; WX 591 ; N uni10DF ; G 1682
1706
+ U 4320 ; WX 822 ; N uni10E0 ; G 1683
1707
+ U 4321 ; WX 563 ; N uni10E1 ; G 1684
1708
+ U 4322 ; WX 690 ; N uni10E2 ; G 1685
1709
+ U 4323 ; WX 583 ; N uni10E3 ; G 1686
1710
+ U 4324 ; WX 813 ; N uni10E4 ; G 1687
1711
+ U 4325 ; WX 562 ; N uni10E5 ; G 1688
1712
+ U 4326 ; WX 813 ; N uni10E6 ; G 1689
1713
+ U 4327 ; WX 563 ; N uni10E7 ; G 1690
1714
+ U 4328 ; WX 563 ; N uni10E8 ; G 1691
1715
+ U 4329 ; WX 563 ; N uni10E9 ; G 1692
1716
+ U 4330 ; WX 632 ; N uni10EA ; G 1693
1717
+ U 4331 ; WX 563 ; N uni10EB ; G 1694
1718
+ U 4332 ; WX 563 ; N uni10EC ; G 1695
1719
+ U 4333 ; WX 552 ; N uni10ED ; G 1696
1720
+ U 4334 ; WX 563 ; N uni10EE ; G 1697
1721
+ U 4335 ; WX 563 ; N uni10EF ; G 1698
1722
+ U 4336 ; WX 558 ; N uni10F0 ; G 1699
1723
+ U 4337 ; WX 604 ; N uni10F1 ; G 1700
1724
+ U 4338 ; WX 552 ; N uni10F2 ; G 1701
1725
+ U 4339 ; WX 552 ; N uni10F3 ; G 1702
1726
+ U 4340 ; WX 553 ; N uni10F4 ; G 1703
1727
+ U 4341 ; WX 605 ; N uni10F5 ; G 1704
1728
+ U 4342 ; WX 852 ; N uni10F6 ; G 1705
1729
+ U 4343 ; WX 635 ; N uni10F7 ; G 1706
1730
+ U 4344 ; WX 563 ; N uni10F8 ; G 1707
1731
+ U 4345 ; WX 596 ; N uni10F9 ; G 1708
1732
+ U 4346 ; WX 542 ; N uni10FA ; G 1709
1733
+ U 4347 ; WX 684 ; N uni10FB ; G 1710
1734
+ U 4348 ; WX 368 ; N uni10FC ; G 1711
1735
  U 5121 ; WX 774 ; N uni1401 ; G 1712
1736
  U 5122 ; WX 774 ; N uni1402 ; G 1713
1737
  U 5123 ; WX 774 ; N uni1403 ; G 1714
1740
  U 5126 ; WX 905 ; N uni1406 ; G 1717
1741
  U 5127 ; WX 905 ; N uni1407 ; G 1718
1742
  U 5129 ; WX 905 ; N uni1409 ; G 1719
1743
+ U 5130 ; WX 905 ; N uni140A ; G 1720
1744
+ U 5131 ; WX 905 ; N uni140B ; G 1721
1745
+ U 5132 ; WX 1018 ; N uni140C ; G 1722
1746
+ U 5133 ; WX 1009 ; N uni140D ; G 1723
1747
+ U 5134 ; WX 1018 ; N uni140E ; G 1724
1748
+ U 5135 ; WX 1009 ; N uni140F ; G 1725
1749
  U 5136 ; WX 1018 ; N uni1410 ; G 1726
1750
  U 5137 ; WX 1009 ; N uni1411 ; G 1727
1751
  U 5138 ; WX 1149 ; N uni1412 ; G 1728
1756
  U 5143 ; WX 1149 ; N uni1417 ; G 1733
1757
  U 5144 ; WX 1142 ; N uni1418 ; G 1734
1758
  U 5145 ; WX 1149 ; N uni1419 ; G 1735
1759
+ U 5146 ; WX 1142 ; N uni141A ; G 1736
1760
+ U 5147 ; WX 905 ; N uni141B ; G 1737
1761
+ U 5149 ; WX 310 ; N uni141D ; G 1738
1762
+ U 5150 ; WX 529 ; N uni141E ; G 1739
1763
+ U 5151 ; WX 425 ; N uni141F ; G 1740
1764
  U 5152 ; WX 425 ; N uni1420 ; G 1741
1765
  U 5153 ; WX 395 ; N uni1421 ; G 1742
1766
  U 5154 ; WX 395 ; N uni1422 ; G 1743
1771
  U 5159 ; WX 310 ; N uni1427 ; G 1748
1772
  U 5160 ; WX 395 ; N uni1428 ; G 1749
1773
  U 5161 ; WX 395 ; N uni1429 ; G 1750
1774
+ U 5162 ; WX 395 ; N uni142A ; G 1751
1775
+ U 5163 ; WX 1213 ; N uni142B ; G 1752
1776
+ U 5164 ; WX 986 ; N uni142C ; G 1753
1777
+ U 5165 ; WX 1216 ; N uni142D ; G 1754
1778
+ U 5166 ; WX 1297 ; N uni142E ; G 1755
1779
+ U 5167 ; WX 774 ; N uni142F ; G 1756
1780
  U 5168 ; WX 774 ; N uni1430 ; G 1757
1781
  U 5169 ; WX 774 ; N uni1431 ; G 1758
1782
  U 5170 ; WX 774 ; N uni1432 ; G 1759
1786
  U 5175 ; WX 886 ; N uni1437 ; G 1763
1787
  U 5176 ; WX 886 ; N uni1438 ; G 1764
1788
  U 5177 ; WX 886 ; N uni1439 ; G 1765
1789
+ U 5178 ; WX 1018 ; N uni143A ; G 1766
1790
+ U 5179 ; WX 1009 ; N uni143B ; G 1767
1791
+ U 5180 ; WX 1018 ; N uni143C ; G 1768
1792
+ U 5181 ; WX 1009 ; N uni143D ; G 1769
1793
+ U 5182 ; WX 1018 ; N uni143E ; G 1770
1794
+ U 5183 ; WX 1009 ; N uni143F ; G 1771
1795
  U 5184 ; WX 1149 ; N uni1440 ; G 1772
1796
  U 5185 ; WX 1140 ; N uni1441 ; G 1773
1797
  U 5186 ; WX 1149 ; N uni1442 ; G 1774
1802
  U 5191 ; WX 1142 ; N uni1447 ; G 1779
1803
  U 5192 ; WX 886 ; N uni1448 ; G 1780
1804
  U 5193 ; WX 576 ; N uni1449 ; G 1781
1805
+ U 5194 ; WX 229 ; N uni144A ; G 1782
1806
+ U 5196 ; WX 812 ; N uni144C ; G 1783
1807
+ U 5197 ; WX 812 ; N uni144D ; G 1784
1808
+ U 5198 ; WX 812 ; N uni144E ; G 1785
1809
+ U 5199 ; WX 812 ; N uni144F ; G 1786
1810
  U 5200 ; WX 815 ; N uni1450 ; G 1787
1811
  U 5201 ; WX 815 ; N uni1451 ; G 1788
1812
  U 5202 ; WX 815 ; N uni1452 ; G 1789
1816
  U 5207 ; WX 1056 ; N uni1457 ; G 1793
1817
  U 5208 ; WX 1048 ; N uni1458 ; G 1794
1818
  U 5209 ; WX 1056 ; N uni1459 ; G 1795
1819
+ U 5210 ; WX 1048 ; N uni145A ; G 1796
1820
+ U 5211 ; WX 1056 ; N uni145B ; G 1797
1821
+ U 5212 ; WX 1048 ; N uni145C ; G 1798
1822
+ U 5213 ; WX 1060 ; N uni145D ; G 1799
1823
+ U 5214 ; WX 1054 ; N uni145E ; G 1800
1824
+ U 5215 ; WX 1060 ; N uni145F ; G 1801
1825
  U 5216 ; WX 1054 ; N uni1460 ; G 1802
1826
  U 5217 ; WX 1060 ; N uni1461 ; G 1803
1827
  U 5218 ; WX 1052 ; N uni1462 ; G 1804
1832
  U 5223 ; WX 1005 ; N uni1467 ; G 1809
1833
  U 5224 ; WX 1005 ; N uni1468 ; G 1810
1834
  U 5225 ; WX 1023 ; N uni1469 ; G 1811
1835
+ U 5226 ; WX 1017 ; N uni146A ; G 1812
1836
+ U 5227 ; WX 743 ; N uni146B ; G 1813
1837
+ U 5228 ; WX 743 ; N uni146C ; G 1814
1838
+ U 5229 ; WX 743 ; N uni146D ; G 1815
1839
+ U 5230 ; WX 743 ; N uni146E ; G 1816
1840
+ U 5231 ; WX 743 ; N uni146F ; G 1817
1841
  U 5232 ; WX 743 ; N uni1470 ; G 1818
1842
  U 5233 ; WX 743 ; N uni1471 ; G 1819
1843
  U 5234 ; WX 743 ; N uni1472 ; G 1820
1848
  U 5239 ; WX 975 ; N uni1477 ; G 1825
1849
  U 5240 ; WX 980 ; N uni1478 ; G 1826
1850
  U 5241 ; WX 975 ; N uni1479 ; G 1827
1851
+ U 5242 ; WX 1029 ; N uni147A ; G 1828
1852
+ U 5243 ; WX 975 ; N uni147B ; G 1829
1853
+ U 5244 ; WX 1029 ; N uni147C ; G 1830
1854
+ U 5245 ; WX 975 ; N uni147D ; G 1831
1855
+ U 5246 ; WX 980 ; N uni147E ; G 1832
1856
+ U 5247 ; WX 975 ; N uni147F ; G 1833
1857
  U 5248 ; WX 980 ; N uni1480 ; G 1834
1858
  U 5249 ; WX 975 ; N uni1481 ; G 1835
1859
  U 5250 ; WX 980 ; N uni1482 ; G 1836
1864
  U 5255 ; WX 938 ; N uni1487 ; G 1841
1865
  U 5256 ; WX 938 ; N uni1488 ; G 1842
1866
  U 5257 ; WX 743 ; N uni1489 ; G 1843
1867
+ U 5258 ; WX 743 ; N uni148A ; G 1844
1868
+ U 5259 ; WX 743 ; N uni148B ; G 1845
1869
+ U 5260 ; WX 743 ; N uni148C ; G 1846
1870
+ U 5261 ; WX 743 ; N uni148D ; G 1847
1871
+ U 5262 ; WX 743 ; N uni148E ; G 1848
1872
+ U 5263 ; WX 743 ; N uni148F ; G 1849
1873
  U 5264 ; WX 743 ; N uni1490 ; G 1850
1874
  U 5265 ; WX 743 ; N uni1491 ; G 1851
1875
  U 5266 ; WX 1029 ; N uni1492 ; G 1852
1880
  U 5271 ; WX 975 ; N uni1497 ; G 1857
1881
  U 5272 ; WX 1029 ; N uni1498 ; G 1858
1882
  U 5273 ; WX 975 ; N uni1499 ; G 1859
1883
+ U 5274 ; WX 1029 ; N uni149A ; G 1860
1884
+ U 5275 ; WX 975 ; N uni149B ; G 1861
1885
+ U 5276 ; WX 1029 ; N uni149C ; G 1862
1886
+ U 5277 ; WX 975 ; N uni149D ; G 1863
1887
+ U 5278 ; WX 1029 ; N uni149E ; G 1864
1888
+ U 5279 ; WX 975 ; N uni149F ; G 1865
1889
+ U 5280 ; WX 1029 ; N uni14A0 ; G 1866
1890
+ U 5281 ; WX 501 ; N uni14A1 ; G 1867
1891
+ U 5282 ; WX 501 ; N uni14A2 ; G 1868
1892
+ U 5283 ; WX 626 ; N uni14A3 ; G 1869
1893
+ U 5284 ; WX 626 ; N uni14A4 ; G 1870
1894
+ U 5285 ; WX 626 ; N uni14A5 ; G 1871
1895
+ U 5286 ; WX 626 ; N uni14A6 ; G 1872
1896
+ U 5287 ; WX 626 ; N uni14A7 ; G 1873
1897
+ U 5288 ; WX 626 ; N uni14A8 ; G 1874
1898
+ U 5289 ; WX 626 ; N uni14A9 ; G 1875
1899
+ U 5290 ; WX 626 ; N uni14AA ; G 1876
1900
+ U 5291 ; WX 626 ; N uni14AB ; G 1877
1901
+ U 5292 ; WX 881 ; N uni14AC ; G 1878
1902
+ U 5293 ; WX 854 ; N uni14AD ; G 1879
1903
+ U 5294 ; WX 863 ; N uni14AE ; G 1880
1904
+ U 5295 ; WX 874 ; N uni14AF ; G 1881
1905
+ U 5296 ; WX 863 ; N uni14B0 ; G 1882
1906
+ U 5297 ; WX 874 ; N uni14B1 ; G 1883
1907
+ U 5298 ; WX 881 ; N uni14B2 ; G 1884
1908
+ U 5299 ; WX 874 ; N uni14B3 ; G 1885
1909
+ U 5300 ; WX 881 ; N uni14B4 ; G 1886
1910
+ U 5301 ; WX 874 ; N uni14B5 ; G 1887
1911
+ U 5302 ; WX 863 ; N uni14B6 ; G 1888
1912
+ U 5303 ; WX 874 ; N uni14B7 ; G 1889
1913
+ U 5304 ; WX 863 ; N uni14B8 ; G 1890
1914
+ U 5305 ; WX 874 ; N uni14B9 ; G 1891
1915
+ U 5306 ; WX 863 ; N uni14BA ; G 1892
1916
+ U 5307 ; WX 436 ; N uni14BB ; G 1893
1917
+ U 5308 ; WX 548 ; N uni14BC ; G 1894
1918
+ U 5309 ; WX 436 ; N uni14BD ; G 1895
1919
+ U 5312 ; WX 988 ; N uni14C0 ; G 1896
1920
+ U 5313 ; WX 988 ; N uni14C1 ; G 1897
1921
+ U 5314 ; WX 988 ; N uni14C2 ; G 1898
1922
+ U 5315 ; WX 988 ; N uni14C3 ; G 1899
1923
+ U 5316 ; WX 931 ; N uni14C4 ; G 1900
1924
+ U 5317 ; WX 931 ; N uni14C5 ; G 1901
1925
+ U 5318 ; WX 931 ; N uni14C6 ; G 1902
1926
+ U 5319 ; WX 931 ; N uni14C7 ; G 1903
1927
+ U 5320 ; WX 931 ; N uni14C8 ; G 1904
1928
+ U 5321 ; WX 1238 ; N uni14C9 ; G 1905
1929
+ U 5322 ; WX 1247 ; N uni14CA ; G 1906
1930
+ U 5323 ; WX 1200 ; N uni14CB ; G 1907
1931
+ U 5324 ; WX 1228 ; N uni14CC ; G 1908
1932
+ U 5325 ; WX 1200 ; N uni14CD ; G 1909
1933
+ U 5326 ; WX 1228 ; N uni14CE ; G 1910
1934
+ U 5327 ; WX 931 ; N uni14CF ; G 1911
1935
+ U 5328 ; WX 660 ; N uni14D0 ; G 1912
1936
+ U 5329 ; WX 497 ; N uni14D1 ; G 1913
1937
+ U 5330 ; WX 660 ; N uni14D2 ; G 1914
1938
+ U 5331 ; WX 988 ; N uni14D3 ; G 1915
1939
+ U 5332 ; WX 988 ; N uni14D4 ; G 1916
1940
+ U 5333 ; WX 988 ; N uni14D5 ; G 1917
1941
+ U 5334 ; WX 988 ; N uni14D6 ; G 1918
1942
+ U 5335 ; WX 931 ; N uni14D7 ; G 1919
1943
+ U 5336 ; WX 931 ; N uni14D8 ; G 1920
1944
+ U 5337 ; WX 931 ; N uni14D9 ; G 1921
1945
+ U 5338 ; WX 931 ; N uni14DA ; G 1922
1946
+ U 5339 ; WX 931 ; N uni14DB ; G 1923
1947
+ U 5340 ; WX 1231 ; N uni14DC ; G 1924
1948
+ U 5341 ; WX 1247 ; N uni14DD ; G 1925
1949
+ U 5342 ; WX 1283 ; N uni14DE ; G 1926
1950
+ U 5343 ; WX 1228 ; N uni14DF ; G 1927
1951
+ U 5344 ; WX 1283 ; N uni14E0 ; G 1928
1952
+ U 5345 ; WX 1228 ; N uni14E1 ; G 1929
1953
+ U 5346 ; WX 1228 ; N uni14E2 ; G 1930
1954
+ U 5347 ; WX 1214 ; N uni14E3 ; G 1931
1955
+ U 5348 ; WX 1228 ; N uni14E4 ; G 1932
1956
+ U 5349 ; WX 1214 ; N uni14E5 ; G 1933
1957
+ U 5350 ; WX 1283 ; N uni14E6 ; G 1934
1958
+ U 5351 ; WX 1228 ; N uni14E7 ; G 1935
1959
+ U 5352 ; WX 1283 ; N uni14E8 ; G 1936
1960
+ U 5353 ; WX 1228 ; N uni14E9 ; G 1937
1961
+ U 5354 ; WX 660 ; N uni14EA ; G 1938
1962
+ U 5356 ; WX 886 ; N uni14EC ; G 1939
1963
+ U 5357 ; WX 730 ; N uni14ED ; G 1940
1964
+ U 5358 ; WX 730 ; N uni14EE ; G 1941
1965
+ U 5359 ; WX 730 ; N uni14EF ; G 1942
1966
+ U 5360 ; WX 730 ; N uni14F0 ; G 1943
1967
+ U 5361 ; WX 730 ; N uni14F1 ; G 1944
1968
+ U 5362 ; WX 730 ; N uni14F2 ; G 1945
1969
+ U 5363 ; WX 730 ; N uni14F3 ; G 1946
1970
+ U 5364 ; WX 730 ; N uni14F4 ; G 1947
1971
+ U 5365 ; WX 730 ; N uni14F5 ; G 1948
1972
+ U 5366 ; WX 998 ; N uni14F6 ; G 1949
1973
+ U 5367 ; WX 958 ; N uni14F7 ; G 1950
1974
+ U 5368 ; WX 967 ; N uni14F8 ; G 1951
1975
+ U 5369 ; WX 989 ; N uni14F9 ; G 1952
1976
+ U 5370 ; WX 967 ; N uni14FA ; G 1953
1977
+ U 5371 ; WX 989 ; N uni14FB ; G 1954
1978
+ U 5372 ; WX 998 ; N uni14FC ; G 1955
1979
+ U 5373 ; WX 958 ; N uni14FD ; G 1956
1980
+ U 5374 ; WX 998 ; N uni14FE ; G 1957
1981
+ U 5375 ; WX 958 ; N uni14FF ; G 1958
1982
  U 5376 ; WX 967 ; N uni1500 ; G 1959
1983
  U 5377 ; WX 989 ; N uni1501 ; G 1960
1984
  U 5378 ; WX 967 ; N uni1502 ; G 1961
1997
  U 5399 ; WX 1209 ; N uni1517 ; G 1974
1998
  U 5400 ; WX 1202 ; N uni1518 ; G 1975
1999
  U 5401 ; WX 1209 ; N uni1519 ; G 1976
2000
+ U 5402 ; WX 1202 ; N uni151A ; G 1977
2001
+ U 5403 ; WX 1209 ; N uni151B ; G 1978
2002
+ U 5404 ; WX 1202 ; N uni151C ; G 1979
2003
+ U 5405 ; WX 1431 ; N uni151D ; G 1980
2004
+ U 5406 ; WX 1420 ; N uni151E ; G 1981
2005
+ U 5407 ; WX 1431 ; N uni151F ; G 1982
2006
  U 5408 ; WX 1420 ; N uni1520 ; G 1983
2007
  U 5409 ; WX 1431 ; N uni1521 ; G 1984
2008
  U 5410 ; WX 1420 ; N uni1522 ; G 1985
2013
  U 5415 ; WX 776 ; N uni1527 ; G 1990
2014
  U 5416 ; WX 776 ; N uni1528 ; G 1991
2015
  U 5417 ; WX 776 ; N uni1529 ; G 1992
2016
+ U 5418 ; WX 776 ; N uni152A ; G 1993
2017
+ U 5419 ; WX 776 ; N uni152B ; G 1994
2018
+ U 5420 ; WX 776 ; N uni152C ; G 1995
2019
+ U 5421 ; WX 776 ; N uni152D ; G 1996
2020
+ U 5422 ; WX 776 ; N uni152E ; G 1997
2021
+ U 5423 ; WX 1003 ; N uni152F ; G 1998
2022
  U 5424 ; WX 1003 ; N uni1530 ; G 1999
2023
  U 5425 ; WX 1013 ; N uni1531 ; G 2000
2024
  U 5426 ; WX 996 ; N uni1532 ; G 2001
2029
  U 5431 ; WX 1003 ; N uni1537 ; G 2006
2030
  U 5432 ; WX 1003 ; N uni1538 ; G 2007
2031
  U 5433 ; WX 1013 ; N uni1539 ; G 2008
2032
+ U 5434 ; WX 996 ; N uni153A ; G 2009
2033
+ U 5435 ; WX 1013 ; N uni153B ; G 2010
2034
+ U 5436 ; WX 996 ; N uni153C ; G 2011
2035
+ U 5437 ; WX 1013 ; N uni153D ; G 2012
2036
+ U 5438 ; WX 495 ; N uni153E ; G 2013
2037
  U 5440 ; WX 395 ; N uni1540 ; G 2014
2038
  U 5441 ; WX 510 ; N uni1541 ; G 2015
2039
  U 5442 ; WX 1033 ; N uni1542 ; G 2016
2044
  U 5447 ; WX 976 ; N uni1547 ; G 2021
2045
  U 5448 ; WX 733 ; N uni1548 ; G 2022
2046
  U 5449 ; WX 733 ; N uni1549 ; G 2023
2047
+ U 5450 ; WX 733 ; N uni154A ; G 2024
2048
+ U 5451 ; WX 733 ; N uni154B ; G 2025
2049
+ U 5452 ; WX 733 ; N uni154C ; G 2026
2050
+ U 5453 ; WX 733 ; N uni154D ; G 2027
2051
+ U 5454 ; WX 1003 ; N uni154E ; G 2028
2052
+ U 5455 ; WX 959 ; N uni154F ; G 2029
2053
  U 5456 ; WX 495 ; N uni1550 ; G 2030
2054
  U 5458 ; WX 886 ; N uni1552 ; G 2031
2055
  U 5459 ; WX 774 ; N uni1553 ; G 2032
2059
  U 5463 ; WX 928 ; N uni1557 ; G 2036
2060
  U 5464 ; WX 928 ; N uni1558 ; G 2037
2061
  U 5465 ; WX 928 ; N uni1559 ; G 2038
2062
+ U 5466 ; WX 928 ; N uni155A ; G 2039
2063
+ U 5467 ; WX 1172 ; N uni155B ; G 2040
2064
+ U 5468 ; WX 1142 ; N uni155C ; G 2041
2065
+ U 5469 ; WX 602 ; N uni155D ; G 2042
2066
+ U 5470 ; WX 812 ; N uni155E ; G 2043
2067
+ U 5471 ; WX 812 ; N uni155F ; G 2044
2068
  U 5472 ; WX 812 ; N uni1560 ; G 2045
2069
  U 5473 ; WX 812 ; N uni1561 ; G 2046
2070
  U 5474 ; WX 812 ; N uni1562 ; G 2047
2075
  U 5479 ; WX 815 ; N uni1567 ; G 2052
2076
  U 5480 ; WX 1060 ; N uni1568 ; G 2053
2077
  U 5481 ; WX 1052 ; N uni1569 ; G 2054
2078
+ U 5482 ; WX 548 ; N uni156A ; G 2055
2079
  U 5492 ; WX 977 ; N uni1574 ; G 2056
2080
  U 5493 ; WX 977 ; N uni1575 ; G 2057
2081
  U 5494 ; WX 977 ; N uni1576 ; G 2058
2082
  U 5495 ; WX 977 ; N uni1577 ; G 2059
2083
  U 5496 ; WX 977 ; N uni1578 ; G 2060
2084
  U 5497 ; WX 977 ; N uni1579 ; G 2061
2085
+ U 5498 ; WX 977 ; N uni157A ; G 2062
2086
+ U 5499 ; WX 618 ; N uni157B ; G 2063
2087
+ U 5500 ; WX 837 ; N uni157C ; G 2064
2088
+ U 5501 ; WX 510 ; N uni157D ; G 2065
2089
+ U 5502 ; WX 1238 ; N uni157E ; G 2066
2090
+ U 5503 ; WX 1238 ; N uni157F ; G 2067
2091
  U 5504 ; WX 1238 ; N uni1580 ; G 2068
2092
  U 5505 ; WX 1238 ; N uni1581 ; G 2069
2093
  U 5506 ; WX 1238 ; N uni1582 ; G 2070
2094
  U 5507 ; WX 1238 ; N uni1583 ; G 2071
2095
  U 5508 ; WX 1238 ; N uni1584 ; G 2072
2096
  U 5509 ; WX 989 ; N uni1585 ; G 2073
2097
+ U 5514 ; WX 977 ; N uni158A ; G 2074
2098
+ U 5515 ; WX 977 ; N uni158B ; G 2075
2099
+ U 5516 ; WX 977 ; N uni158C ; G 2076
2100
+ U 5517 ; WX 977 ; N uni158D ; G 2077
2101
+ U 5518 ; WX 1591 ; N uni158E ; G 2078
2102
+ U 5519 ; WX 1591 ; N uni158F ; G 2079
2103
  U 5520 ; WX 1591 ; N uni1590 ; G 2080
2104
  U 5521 ; WX 1295 ; N uni1591 ; G 2081
2105
  U 5522 ; WX 1295 ; N uni1592 ; G 2082
2107
  U 5524 ; WX 1591 ; N uni1594 ; G 2084
2108
  U 5525 ; WX 848 ; N uni1595 ; G 2085
2109
  U 5526 ; WX 1273 ; N uni1596 ; G 2086
2110
+ U 5536 ; WX 988 ; N uni15A0 ; G 2087
2111
+ U 5537 ; WX 988 ; N uni15A1 ; G 2088
2112
+ U 5538 ; WX 931 ; N uni15A2 ; G 2089
2113
+ U 5539 ; WX 931 ; N uni15A3 ; G 2090
2114
+ U 5540 ; WX 931 ; N uni15A4 ; G 2091
2115
+ U 5541 ; WX 931 ; N uni15A5 ; G 2092
2116
+ U 5542 ; WX 660 ; N uni15A6 ; G 2093
2117
+ U 5543 ; WX 776 ; N uni15A7 ; G 2094
2118
+ U 5544 ; WX 776 ; N uni15A8 ; G 2095
2119
+ U 5545 ; WX 776 ; N uni15A9 ; G 2096
2120
+ U 5546 ; WX 776 ; N uni15AA ; G 2097
2121
+ U 5547 ; WX 776 ; N uni15AB ; G 2098
2122
+ U 5548 ; WX 776 ; N uni15AC ; G 2099
2123
+ U 5549 ; WX 776 ; N uni15AD ; G 2100
2124
+ U 5550 ; WX 495 ; N uni15AE ; G 2101
2125
+ U 5551 ; WX 743 ; N uni15AF ; G 2102
2126
+ U 5598 ; WX 830 ; N uni15DE ; G 2103
2127
+ U 5601 ; WX 830 ; N uni15E1 ; G 2104
2128
  U 5702 ; WX 496 ; N uni1646 ; G 2105
2129
  U 5703 ; WX 496 ; N uni1647 ; G 2106
2130
+ U 5742 ; WX 413 ; N uni166E ; G 2107
2131
+ U 5743 ; WX 1238 ; N uni166F ; G 2108
2132
  U 5744 ; WX 1591 ; N uni1670 ; G 2109
2133
  U 5745 ; WX 2016 ; N uni1671 ; G 2110
2134
  U 5746 ; WX 2016 ; N uni1672 ; G 2111
2146
  U 5767 ; WX 936 ; N uni1687 ; G 2123
2147
  U 5768 ; WX 1254 ; N uni1688 ; G 2124
2148
  U 5769 ; WX 1559 ; N uni1689 ; G 2125
2149
+ U 5770 ; WX 1871 ; N uni168A ; G 2126
2150
+ U 5771 ; WX 569 ; N uni168B ; G 2127
2151
+ U 5772 ; WX 877 ; N uni168C ; G 2128
2152
+ U 5773 ; WX 1187 ; N uni168D ; G 2129
2153
+ U 5774 ; WX 1497 ; N uni168E ; G 2130
2154
+ U 5775 ; WX 1807 ; N uni168F ; G 2131
2155
  U 5776 ; WX 637 ; N uni1690 ; G 2132
2156
  U 5777 ; WX 945 ; N uni1691 ; G 2133
2157
  U 5778 ; WX 1240 ; N uni1692 ; G 2134
2162
  U 5783 ; WX 789 ; N uni1697 ; G 2139
2163
  U 5784 ; WX 1234 ; N uni1698 ; G 2140
2164
  U 5785 ; WX 1559 ; N uni1699 ; G 2141
2165
+ U 5786 ; WX 740 ; N uni169A ; G 2142
2166
+ U 5787 ; WX 638 ; N uni169B ; G 2143
2167
+ U 5788 ; WX 638 ; N uni169C ; G 2144
2168
+ U 7424 ; WX 652 ; N uni1D00 ; G 2145
2169
+ U 7425 ; WX 833 ; N uni1D01 ; G 2146
2170
+ U 7426 ; WX 1048 ; N uni1D02 ; G 2147
2171
+ U 7427 ; WX 608 ; N uni1D03 ; G 2148
2172
+ U 7428 ; WX 593 ; N uni1D04 ; G 2149
2173
+ U 7429 ; WX 676 ; N uni1D05 ; G 2150
2174
+ U 7430 ; WX 676 ; N uni1D06 ; G 2151
2175
+ U 7431 ; WX 559 ; N uni1D07 ; G 2152
2176
+ U 7432 ; WX 557 ; N uni1D08 ; G 2153
2177
+ U 7433 ; WX 343 ; N uni1D09 ; G 2154
2178
+ U 7434 ; WX 494 ; N uni1D0A ; G 2155
2179
+ U 7435 ; WX 665 ; N uni1D0B ; G 2156
2180
+ U 7436 ; WX 539 ; N uni1D0C ; G 2157
2181
+ U 7437 ; WX 817 ; N uni1D0D ; G 2158
2182
+ U 7438 ; WX 701 ; N uni1D0E ; G 2159
2183
+ U 7439 ; WX 687 ; N uni1D0F ; G 2160
2184
+ U 7440 ; WX 593 ; N uni1D10 ; G 2161
2185
+ U 7441 ; WX 660 ; N uni1D11 ; G 2162
2186
+ U 7442 ; WX 660 ; N uni1D12 ; G 2163
2187
+ U 7443 ; WX 660 ; N uni1D13 ; G 2164
2188
+ U 7444 ; WX 1094 ; N uni1D14 ; G 2165
2189
+ U 7446 ; WX 687 ; N uni1D16 ; G 2166
2190
+ U 7447 ; WX 687 ; N uni1D17 ; G 2167
2191
+ U 7448 ; WX 556 ; N uni1D18 ; G 2168
2192
+ U 7449 ; WX 642 ; N uni1D19 ; G 2169
2193
+ U 7450 ; WX 642 ; N uni1D1A ; G 2170
2194
+ U 7451 ; WX 580 ; N uni1D1B ; G 2171
2195
+ U 7452 ; WX 634 ; N uni1D1C ; G 2172
2196
+ U 7453 ; WX 737 ; N uni1D1D ; G 2173
2197
+ U 7454 ; WX 948 ; N uni1D1E ; G 2174
2198
+ U 7455 ; WX 695 ; N uni1D1F ; G 2175
2199
+ U 7456 ; WX 652 ; N uni1D20 ; G 2176
2200
+ U 7457 ; WX 924 ; N uni1D21 ; G 2177
2201
+ U 7458 ; WX 582 ; N uni1D22 ; G 2178
2202
+ U 7459 ; WX 646 ; N uni1D23 ; G 2179
2203
+ U 7462 ; WX 539 ; N uni1D26 ; G 2180
2204
+ U 7463 ; WX 652 ; N uni1D27 ; G 2181
2205
+ U 7464 ; WX 691 ; N uni1D28 ; G 2182
2206
+ U 7465 ; WX 556 ; N uni1D29 ; G 2183
2207
+ U 7466 ; WX 781 ; N uni1D2A ; G 2184
2208
+ U 7467 ; WX 732 ; N uni1D2B ; G 2185
2209
+ U 7468 ; WX 487 ; N uni1D2C ; G 2186
2210
+ U 7469 ; WX 683 ; N uni1D2D ; G 2187
2211
+ U 7470 ; WX 480 ; N uni1D2E ; G 2188
2212
+ U 7472 ; WX 523 ; N uni1D30 ; G 2189
2213
+ U 7473 ; WX 430 ; N uni1D31 ; G 2190
2214
+ U 7474 ; WX 430 ; N uni1D32 ; G 2191
2215
+ U 7475 ; WX 517 ; N uni1D33 ; G 2192
2216
+ U 7476 ; WX 527 ; N uni1D34 ; G 2193
2217
+ U 7477 ; WX 234 ; N uni1D35 ; G 2194
2218
+ U 7478 ; WX 234 ; N uni1D36 ; G 2195
2219
+ U 7479 ; WX 488 ; N uni1D37 ; G 2196
2220
+ U 7480 ; WX 401 ; N uni1D38 ; G 2197
2221
+ U 7481 ; WX 626 ; N uni1D39 ; G 2198
2222
+ U 7482 ; WX 527 ; N uni1D3A ; G 2199
2223
+ U 7483 ; WX 527 ; N uni1D3B ; G 2200
2224
+ U 7484 ; WX 535 ; N uni1D3C ; G 2201
2225
+ U 7485 ; WX 509 ; N uni1D3D ; G 2202
2226
+ U 7486 ; WX 461 ; N uni1D3E ; G 2203
2227
+ U 7487 ; WX 485 ; N uni1D3F ; G 2204
2228
+ U 7488 ; WX 430 ; N uni1D40 ; G 2205
2229
+ U 7489 ; WX 511 ; N uni1D41 ; G 2206
2230
+ U 7490 ; WX 695 ; N uni1D42 ; G 2207
2231
+ U 7491 ; WX 458 ; N uni1D43 ; G 2208
2232
+ U 7492 ; WX 458 ; N uni1D44 ; G 2209
2233
+ U 7493 ; WX 479 ; N uni1D45 ; G 2210
2234
+ U 7494 ; WX 712 ; N uni1D46 ; G 2211
2235
+ U 7495 ; WX 479 ; N uni1D47 ; G 2212
2236
+ U 7496 ; WX 479 ; N uni1D48 ; G 2213
2237
+ U 7497 ; WX 479 ; N uni1D49 ; G 2214
2238
+ U 7498 ; WX 479 ; N uni1D4A ; G 2215
2239
+ U 7499 ; WX 386 ; N uni1D4B ; G 2216
2240
+ U 7500 ; WX 386 ; N uni1D4C ; G 2217
2241
+ U 7501 ; WX 479 ; N uni1D4D ; G 2218
2242
+ U 7502 ; WX 219 ; N uni1D4E ; G 2219
2243
+ U 7503 ; WX 487 ; N uni1D4F ; G 2220
2244
+ U 7504 ; WX 664 ; N uni1D50 ; G 2221
2245
+ U 7505 ; WX 456 ; N uni1D51 ; G 2222
2246
+ U 7506 ; WX 488 ; N uni1D52 ; G 2223
2247
+ U 7507 ; WX 414 ; N uni1D53 ; G 2224
2248
+ U 7508 ; WX 488 ; N uni1D54 ; G 2225
2249
+ U 7509 ; WX 488 ; N uni1D55 ; G 2226
2250
+ U 7510 ; WX 479 ; N uni1D56 ; G 2227
2251
+ U 7511 ; WX 388 ; N uni1D57 ; G 2228
2252
+ U 7512 ; WX 456 ; N uni1D58 ; G 2229
2253
+ U 7513 ; WX 462 ; N uni1D59 ; G 2230
2254
+ U 7514 ; WX 664 ; N uni1D5A ; G 2231
2255
+ U 7515 ; WX 501 ; N uni1D5B ; G 2232
2256
+ U 7517 ; WX 451 ; N uni1D5D ; G 2233
2257
+ U 7518 ; WX 429 ; N uni1D5E ; G 2234
2258
+ U 7519 ; WX 433 ; N uni1D5F ; G 2235
2259
+ U 7520 ; WX 493 ; N uni1D60 ; G 2236
2260
+ U 7521 ; WX 406 ; N uni1D61 ; G 2237
2261
+ U 7522 ; WX 219 ; N uni1D62 ; G 2238
2262
+ U 7523 ; WX 315 ; N uni1D63 ; G 2239
2263
+ U 7524 ; WX 456 ; N uni1D64 ; G 2240
2264
+ U 7525 ; WX 501 ; N uni1D65 ; G 2241
2265
+ U 7526 ; WX 451 ; N uni1D66 ; G 2242
2266
+ U 7527 ; WX 429 ; N uni1D67 ; G 2243
2267
+ U 7528 ; WX 451 ; N uni1D68 ; G 2244
2268
+ U 7529 ; WX 493 ; N uni1D69 ; G 2245
2269
+ U 7530 ; WX 406 ; N uni1D6A ; G 2246
2270
+ U 7543 ; WX 716 ; N uni1D77 ; G 2247
2271
+ U 7544 ; WX 527 ; N uni1D78 ; G 2248
2272
+ U 7547 ; WX 545 ; N uni1D7B ; G 2249
2273
+ U 7549 ; WX 747 ; N uni1D7D ; G 2250
2274
+ U 7557 ; WX 514 ; N uni1D85 ; G 2251
2275
+ U 7579 ; WX 479 ; N uni1D9B ; G 2252
2276
+ U 7580 ; WX 414 ; N uni1D9C ; G 2253
2277
+ U 7581 ; WX 414 ; N uni1D9D ; G 2254
2278
+ U 7582 ; WX 488 ; N uni1D9E ; G 2255
2279
+ U 7583 ; WX 386 ; N uni1D9F ; G 2256
2280
+ U 7584 ; WX 377 ; N uni1DA0 ; G 2257
2281
+ U 7585 ; WX 348 ; N uni1DA1 ; G 2258
2282
+ U 7586 ; WX 479 ; N uni1DA2 ; G 2259
2283
+ U 7587 ; WX 456 ; N uni1DA3 ; G 2260
2284
+ U 7588 ; WX 347 ; N uni1DA4 ; G 2261
2285
+ U 7589 ; WX 281 ; N uni1DA5 ; G 2262
2286
+ U 7590 ; WX 347 ; N uni1DA6 ; G 2263
2287
+ U 7591 ; WX 347 ; N uni1DA7 ; G 2264
2288
+ U 7592 ; WX 431 ; N uni1DA8 ; G 2265
2289
+ U 7593 ; WX 326 ; N uni1DA9 ; G 2266
2290
+ U 7594 ; WX 330 ; N uni1DAA ; G 2267
2291
+ U 7595 ; WX 370 ; N uni1DAB ; G 2268
2292
+ U 7596 ; WX 664 ; N uni1DAC ; G 2269
2293
+ U 7597 ; WX 664 ; N uni1DAD ; G 2270
2294
+ U 7598 ; WX 562 ; N uni1DAE ; G 2271
2295
+ U 7599 ; WX 562 ; N uni1DAF ; G 2272
2296
+ U 7600 ; WX 448 ; N uni1DB0 ; G 2273
2297
+ U 7601 ; WX 488 ; N uni1DB1 ; G 2274
2298
+ U 7602 ; WX 542 ; N uni1DB2 ; G 2275
2299
+ U 7603 ; WX 422 ; N uni1DB3 ; G 2276
2300
+ U 7604 ; WX 396 ; N uni1DB4 ; G 2277
2301
+ U 7605 ; WX 388 ; N uni1DB5 ; G 2278
2302
+ U 7606 ; WX 583 ; N uni1DB6 ; G 2279
2303
+ U 7607 ; WX 494 ; N uni1DB7 ; G 2280
2304
+ U 7608 ; WX 399 ; N uni1DB8 ; G 2281
2305
+ U 7609 ; WX 451 ; N uni1DB9 ; G 2282
2306
+ U 7610 ; WX 501 ; N uni1DBA ; G 2283
2307
+ U 7611 ; WX 417 ; N uni1DBB ; G 2284
2308
+ U 7612 ; WX 523 ; N uni1DBC ; G 2285
2309
+ U 7613 ; WX 470 ; N uni1DBD ; G 2286
2310
+ U 7614 ; WX 455 ; N uni1DBE ; G 2287
2311
+ U 7615 ; WX 425 ; N uni1DBF ; G 2288
2312
+ U 7620 ; WX 0 ; N uni1DC4 ; G 2289
2313
+ U 7621 ; WX 0 ; N uni1DC5 ; G 2290
2314
+ U 7622 ; WX 0 ; N uni1DC6 ; G 2291
2315
+ U 7623 ; WX 0 ; N uni1DC7 ; G 2292
2316
+ U 7624 ; WX 0 ; N uni1DC8 ; G 2293
2317
+ U 7625 ; WX 0 ; N uni1DC9 ; G 2294
2318
+ U 7680 ; WX 774 ; N uni1E00 ; G 2295
2319
+ U 7681 ; WX 675 ; N uni1E01 ; G 2296
2320
+ U 7682 ; WX 762 ; N uni1E02 ; G 2297
2321
+ U 7683 ; WX 716 ; N uni1E03 ; G 2298
2322
+ U 7684 ; WX 762 ; N uni1E04 ; G 2299
2323
+ U 7685 ; WX 716 ; N uni1E05 ; G 2300
2324
+ U 7686 ; WX 762 ; N uni1E06 ; G 2301
2325
+ U 7687 ; WX 716 ; N uni1E07 ; G 2302
2326
+ U 7688 ; WX 734 ; N uni1E08 ; G 2303
2327
+ U 7689 ; WX 593 ; N uni1E09 ; G 2304
2328
+ U 7690 ; WX 830 ; N uni1E0A ; G 2305
2329
+ U 7691 ; WX 716 ; N uni1E0B ; G 2306
2330
+ U 7692 ; WX 830 ; N uni1E0C ; G 2307
2331
+ U 7693 ; WX 716 ; N uni1E0D ; G 2308
2332
+ U 7694 ; WX 830 ; N uni1E0E ; G 2309
2333
+ U 7695 ; WX 716 ; N uni1E0F ; G 2310
2334
+ U 7696 ; WX 830 ; N uni1E10 ; G 2311
2335
+ U 7697 ; WX 716 ; N uni1E11 ; G 2312
2336
+ U 7698 ; WX 830 ; N uni1E12 ; G 2313
2337
+ U 7699 ; WX 716 ; N uni1E13 ; G 2314
2338
+ U 7700 ; WX 683 ; N uni1E14 ; G 2315
2339
+ U 7701 ; WX 678 ; N uni1E15 ; G 2316
2340
+ U 7702 ; WX 683 ; N uni1E16 ; G 2317
2341
+ U 7703 ; WX 678 ; N uni1E17 ; G 2318
2342
+ U 7704 ; WX 683 ; N uni1E18 ; G 2319
2343
+ U 7705 ; WX 678 ; N uni1E19 ; G 2320
2344
+ U 7706 ; WX 683 ; N uni1E1A ; G 2321
2345
+ U 7707 ; WX 678 ; N uni1E1B ; G 2322
2346
+ U 7708 ; WX 683 ; N uni1E1C ; G 2323
2347
+ U 7709 ; WX 678 ; N uni1E1D ; G 2324
2348
+ U 7710 ; WX 683 ; N uni1E1E ; G 2325
2349
+ U 7711 ; WX 435 ; N uni1E1F ; G 2326
2350
+ U 7712 ; WX 821 ; N uni1E20 ; G 2327
2351
+ U 7713 ; WX 716 ; N uni1E21 ; G 2328
2352
+ U 7714 ; WX 837 ; N uni1E22 ; G 2329
2353
+ U 7715 ; WX 712 ; N uni1E23 ; G 2330
2354
+ U 7716 ; WX 837 ; N uni1E24 ; G 2331
2355
+ U 7717 ; WX 712 ; N uni1E25 ; G 2332
2356
+ U 7718 ; WX 837 ; N uni1E26 ; G 2333
2357
+ U 7719 ; WX 712 ; N uni1E27 ; G 2334
2358
+ U 7720 ; WX 837 ; N uni1E28 ; G 2335
2359
+ U 7721 ; WX 712 ; N uni1E29 ; G 2336
2360
+ U 7722 ; WX 837 ; N uni1E2A ; G 2337
2361
+ U 7723 ; WX 712 ; N uni1E2B ; G 2338
2362
+ U 7724 ; WX 372 ; N uni1E2C ; G 2339
2363
+ U 7725 ; WX 343 ; N uni1E2D ; G 2340
2364
+ U 7726 ; WX 372 ; N uni1E2E ; G 2341
2365
+ U 7727 ; WX 343 ; N uni1E2F ; G 2342
2366
+ U 7728 ; WX 775 ; N uni1E30 ; G 2343
2367
+ U 7729 ; WX 665 ; N uni1E31 ; G 2344
2368
+ U 7730 ; WX 775 ; N uni1E32 ; G 2345
2369
+ U 7731 ; WX 665 ; N uni1E33 ; G 2346
2370
+ U 7732 ; WX 775 ; N uni1E34 ; G 2347
2371
+ U 7733 ; WX 665 ; N uni1E35 ; G 2348
2372
+ U 7734 ; WX 637 ; N uni1E36 ; G 2349
2373
+ U 7735 ; WX 343 ; N uni1E37 ; G 2350
2374
+ U 7736 ; WX 637 ; N uni1E38 ; G 2351
2375
+ U 7737 ; WX 343 ; N uni1E39 ; G 2352
2376
+ U 7738 ; WX 637 ; N uni1E3A ; G 2353
2377
+ U 7739 ; WX 343 ; N uni1E3B ; G 2354
2378
+ U 7740 ; WX 637 ; N uni1E3C ; G 2355
2379
+ U 7741 ; WX 343 ; N uni1E3D ; G 2356
2380
+ U 7742 ; WX 995 ; N uni1E3E ; G 2357
2381
+ U 7743 ; WX 1042 ; N uni1E3F ; G 2358
2382
+ U 7744 ; WX 995 ; N uni1E40 ; G 2359
2383
+ U 7745 ; WX 1042 ; N uni1E41 ; G 2360
2384
+ U 7746 ; WX 995 ; N uni1E42 ; G 2361
2385
+ U 7747 ; WX 1042 ; N uni1E43 ; G 2362
2386
+ U 7748 ; WX 837 ; N uni1E44 ; G 2363
2387
+ U 7749 ; WX 712 ; N uni1E45 ; G 2364
2388
+ U 7750 ; WX 837 ; N uni1E46 ; G 2365
2389
+ U 7751 ; WX 712 ; N uni1E47 ; G 2366
2390
+ U 7752 ; WX 837 ; N uni1E48 ; G 2367
2391
+ U 7753 ; WX 712 ; N uni1E49 ; G 2368
2392
+ U 7754 ; WX 837 ; N uni1E4A ; G 2369
2393
+ U 7755 ; WX 712 ; N uni1E4B ; G 2370
2394
+ U 7756 ; WX 850 ; N uni1E4C ; G 2371
2395
+ U 7757 ; WX 687 ; N uni1E4D ; G 2372
2396
+ U 7758 ; WX 850 ; N uni1E4E ; G 2373
2397
+ U 7759 ; WX 687 ; N uni1E4F ; G 2374
2398
+ U 7760 ; WX 850 ; N uni1E50 ; G 2375
2399
+ U 7761 ; WX 687 ; N uni1E51 ; G 2376
2400
+ U 7762 ; WX 850 ; N uni1E52 ; G 2377
2401
+ U 7763 ; WX 687 ; N uni1E53 ; G 2378
2402
+ U 7764 ; WX 733 ; N uni1E54 ; G 2379
2403
+ U 7765 ; WX 716 ; N uni1E55 ; G 2380
2404
+ U 7766 ; WX 733 ; N uni1E56 ; G 2381
2405
+ U 7767 ; WX 716 ; N uni1E57 ; G 2382
2406
+ U 7768 ; WX 770 ; N uni1E58 ; G 2383
2407
+ U 7769 ; WX 493 ; N uni1E59 ; G 2384
2408
+ U 7770 ; WX 770 ; N uni1E5A ; G 2385
2409
+ U 7771 ; WX 493 ; N uni1E5B ; G 2386
2410
+ U 7772 ; WX 770 ; N uni1E5C ; G 2387
2411
+ U 7773 ; WX 493 ; N uni1E5D ; G 2388
2412
+ U 7774 ; WX 770 ; N uni1E5E ; G 2389
2413
+ U 7775 ; WX 493 ; N uni1E5F ; G 2390
2414
+ U 7776 ; WX 720 ; N uni1E60 ; G 2391
2415
+ U 7777 ; WX 595 ; N uni1E61 ; G 2392
2416
+ U 7778 ; WX 720 ; N uni1E62 ; G 2393
2417
+ U 7779 ; WX 595 ; N uni1E63 ; G 2394
2418
+ U 7780 ; WX 720 ; N uni1E64 ; G 2395
2419
+ U 7781 ; WX 595 ; N uni1E65 ; G 2396
2420
+ U 7782 ; WX 720 ; N uni1E66 ; G 2397
2421
+ U 7783 ; WX 595 ; N uni1E67 ; G 2398
2422
+ U 7784 ; WX 720 ; N uni1E68 ; G 2399
2423
+ U 7785 ; WX 595 ; N uni1E69 ; G 2400
2424
+ U 7786 ; WX 682 ; N uni1E6A ; G 2401
2425
+ U 7787 ; WX 478 ; N uni1E6B ; G 2402
2426
+ U 7788 ; WX 682 ; N uni1E6C ; G 2403
2427
+ U 7789 ; WX 478 ; N uni1E6D ; G 2404
2428
+ U 7790 ; WX 682 ; N uni1E6E ; G 2405
2429
+ U 7791 ; WX 478 ; N uni1E6F ; G 2406
2430
+ U 7792 ; WX 682 ; N uni1E70 ; G 2407
2431
+ U 7793 ; WX 478 ; N uni1E71 ; G 2408
2432
+ U 7794 ; WX 812 ; N uni1E72 ; G 2409
2433
+ U 7795 ; WX 712 ; N uni1E73 ; G 2410
2434
+ U 7796 ; WX 812 ; N uni1E74 ; G 2411
2435
+ U 7797 ; WX 712 ; N uni1E75 ; G 2412
2436
+ U 7798 ; WX 812 ; N uni1E76 ; G 2413
2437
+ U 7799 ; WX 712 ; N uni1E77 ; G 2414
2438
+ U 7800 ; WX 812 ; N uni1E78 ; G 2415
2439
+ U 7801 ; WX 712 ; N uni1E79 ; G 2416
2440
+ U 7802 ; WX 812 ; N uni1E7A ; G 2417
2441
+ U 7803 ; WX 712 ; N uni1E7B ; G 2418
2442
+ U 7804 ; WX 774 ; N uni1E7C ; G 2419
2443
+ U 7805 ; WX 652 ; N uni1E7D ; G 2420
2444
+ U 7806 ; WX 774 ; N uni1E7E ; G 2421
2445
+ U 7807 ; WX 652 ; N uni1E7F ; G 2422
2446
+ U 7808 ; WX 1103 ; N Wgrave ; G 2423
2447
+ U 7809 ; WX 924 ; N wgrave ; G 2424
2448
+ U 7810 ; WX 1103 ; N Wacute ; G 2425
2449
+ U 7811 ; WX 924 ; N wacute ; G 2426
2450
+ U 7812 ; WX 1103 ; N Wdieresis ; G 2427
2451
+ U 7813 ; WX 924 ; N wdieresis ; G 2428
2452
+ U 7814 ; WX 1103 ; N uni1E86 ; G 2429
2453
+ U 7815 ; WX 924 ; N uni1E87 ; G 2430
2454
+ U 7816 ; WX 1103 ; N uni1E88 ; G 2431
2455
+ U 7817 ; WX 924 ; N uni1E89 ; G 2432
2456
+ U 7818 ; WX 771 ; N uni1E8A ; G 2433
2457
+ U 7819 ; WX 645 ; N uni1E8B ; G 2434
2458
+ U 7820 ; WX 771 ; N uni1E8C ; G 2435
2459
+ U 7821 ; WX 645 ; N uni1E8D ; G 2436
2460
+ U 7822 ; WX 724 ; N uni1E8E ; G 2437
2461
+ U 7823 ; WX 652 ; N uni1E8F ; G 2438
2462
+ U 7824 ; WX 725 ; N uni1E90 ; G 2439
2463
+ U 7825 ; WX 582 ; N uni1E91 ; G 2440
2464
+ U 7826 ; WX 725 ; N uni1E92 ; G 2441
2465
+ U 7827 ; WX 582 ; N uni1E93 ; G 2442
2466
+ U 7828 ; WX 725 ; N uni1E94 ; G 2443
2467
+ U 7829 ; WX 582 ; N uni1E95 ; G 2444
2468
+ U 7830 ; WX 712 ; N uni1E96 ; G 2445
2469
+ U 7831 ; WX 478 ; N uni1E97 ; G 2446
2470
+ U 7832 ; WX 924 ; N uni1E98 ; G 2447
2471
+ U 7833 ; WX 652 ; N uni1E99 ; G 2448
2472
+ U 7834 ; WX 675 ; N uni1E9A ; G 2449
2473
+ U 7835 ; WX 435 ; N uni1E9B ; G 2450
2474
+ U 7836 ; WX 435 ; N uni1E9C ; G 2451
2475
+ U 7837 ; WX 435 ; N uni1E9D ; G 2452
2476
+ U 7838 ; WX 896 ; N uni1E9E ; G 2453
2477
+ U 7839 ; WX 687 ; N uni1E9F ; G 2454
2478
+ U 7840 ; WX 774 ; N uni1EA0 ; G 2455
2479
+ U 7841 ; WX 675 ; N uni1EA1 ; G 2456
2480
+ U 7842 ; WX 774 ; N uni1EA2 ; G 2457
2481
+ U 7843 ; WX 675 ; N uni1EA3 ; G 2458
2482
+ U 7844 ; WX 774 ; N uni1EA4 ; G 2459
2483
+ U 7845 ; WX 675 ; N uni1EA5 ; G 2460
2484
+ U 7846 ; WX 774 ; N uni1EA6 ; G 2461
2485
+ U 7847 ; WX 675 ; N uni1EA7 ; G 2462
2486
+ U 7848 ; WX 774 ; N uni1EA8 ; G 2463
2487
+ U 7849 ; WX 675 ; N uni1EA9 ; G 2464
2488
+ U 7850 ; WX 774 ; N uni1EAA ; G 2465
2489
+ U 7851 ; WX 675 ; N uni1EAB ; G 2466
2490
+ U 7852 ; WX 774 ; N uni1EAC ; G 2467
2491
+ U 7853 ; WX 675 ; N uni1EAD ; G 2468
2492
+ U 7854 ; WX 774 ; N uni1EAE ; G 2469
2493
+ U 7855 ; WX 675 ; N uni1EAF ; G 2470
2494
+ U 7856 ; WX 774 ; N uni1EB0 ; G 2471
2495
+ U 7857 ; WX 675 ; N uni1EB1 ; G 2472
2496
+ U 7858 ; WX 774 ; N uni1EB2 ; G 2473
2497
+ U 7859 ; WX 675 ; N uni1EB3 ; G 2474
2498
+ U 7860 ; WX 774 ; N uni1EB4 ; G 2475
2499
+ U 7861 ; WX 675 ; N uni1EB5 ; G 2476
2500
+ U 7862 ; WX 774 ; N uni1EB6 ; G 2477
2501
+ U 7863 ; WX 675 ; N uni1EB7 ; G 2478
2502
+ U 7864 ; WX 683 ; N uni1EB8 ; G 2479
2503
+ U 7865 ; WX 678 ; N uni1EB9 ; G 2480
2504
+ U 7866 ; WX 683 ; N uni1EBA ; G 2481
2505
+ U 7867 ; WX 678 ; N uni1EBB ; G 2482
2506
+ U 7868 ; WX 683 ; N uni1EBC ; G 2483
2507
+ U 7869 ; WX 678 ; N uni1EBD ; G 2484
2508
+ U 7870 ; WX 683 ; N uni1EBE ; G 2485
2509
+ U 7871 ; WX 678 ; N uni1EBF ; G 2486
2510
+ U 7872 ; WX 683 ; N uni1EC0 ; G 2487
2511
+ U 7873 ; WX 678 ; N uni1EC1 ; G 2488
2512
+ U 7874 ; WX 683 ; N uni1EC2 ; G 2489
2513
+ U 7875 ; WX 678 ; N uni1EC3 ; G 2490
2514
+ U 7876 ; WX 683 ; N uni1EC4 ; G 2491
2515
+ U 7877 ; WX 678 ; N uni1EC5 ; G 2492
2516
+ U 7878 ; WX 683 ; N uni1EC6 ; G 2493
2517
+ U 7879 ; WX 678 ; N uni1EC7 ; G 2494
2518
+ U 7880 ; WX 372 ; N uni1EC8 ; G 2495
2519
+ U 7881 ; WX 343 ; N uni1EC9 ; G 2496
2520
+ U 7882 ; WX 372 ; N uni1ECA ; G 2497
2521
+ U 7883 ; WX 343 ; N uni1ECB ; G 2498
2522
+ U 7884 ; WX 850 ; N uni1ECC ; G 2499
2523
+ U 7885 ; WX 687 ; N uni1ECD ; G 2500
2524
+ U 7886 ; WX 850 ; N uni1ECE ; G 2501
2525
+ U 7887 ; WX 687 ; N uni1ECF ; G 2502
2526
+ U 7888 ; WX 850 ; N uni1ED0 ; G 2503
2527
+ U 7889 ; WX 687 ; N uni1ED1 ; G 2504
2528
+ U 7890 ; WX 850 ; N uni1ED2 ; G 2505
2529
+ U 7891 ; WX 687 ; N uni1ED3 ; G 2506
2530
+ U 7892 ; WX 850 ; N uni1ED4 ; G 2507
2531
+ U 7893 ; WX 687 ; N uni1ED5 ; G 2508
2532
+ U 7894 ; WX 850 ; N uni1ED6 ; G 2509
2533
+ U 7895 ; WX 687 ; N uni1ED7 ; G 2510
2534
+ U 7896 ; WX 850 ; N uni1ED8 ; G 2511
2535
+ U 7897 ; WX 687 ; N uni1ED9 ; G 2512
2536
+ U 7898 ; WX 874 ; N uni1EDA ; G 2513
2537
+ U 7899 ; WX 687 ; N uni1EDB ; G 2514
2538
+ U 7900 ; WX 874 ; N uni1EDC ; G 2515
2539
+ U 7901 ; WX 687 ; N uni1EDD ; G 2516
2540
+ U 7902 ; WX 874 ; N uni1EDE ; G 2517
2541
+ U 7903 ; WX 687 ; N uni1EDF ; G 2518
2542
+ U 7904 ; WX 874 ; N uni1EE0 ; G 2519
2543
+ U 7905 ; WX 687 ; N uni1EE1 ; G 2520
2544
+ U 7906 ; WX 874 ; N uni1EE2 ; G 2521
2545
+ U 7907 ; WX 687 ; N uni1EE3 ; G 2522
2546
+ U 7908 ; WX 812 ; N uni1EE4 ; G 2523
2547
+ U 7909 ; WX 712 ; N uni1EE5 ; G 2524
2548
+ U 7910 ; WX 812 ; N uni1EE6 ; G 2525
2549
+ U 7911 ; WX 712 ; N uni1EE7 ; G 2526
2550
+ U 7912 ; WX 835 ; N uni1EE8 ; G 2527
2551
+ U 7913 ; WX 712 ; N uni1EE9 ; G 2528
2552
+ U 7914 ; WX 835 ; N uni1EEA ; G 2529
2553
+ U 7915 ; WX 712 ; N uni1EEB ; G 2530
2554
+ U 7916 ; WX 835 ; N uni1EEC ; G 2531
2555
+ U 7917 ; WX 712 ; N uni1EED ; G 2532
2556
+ U 7918 ; WX 835 ; N uni1EEE ; G 2533
2557
+ U 7919 ; WX 712 ; N uni1EEF ; G 2534
2558
+ U 7920 ; WX 835 ; N uni1EF0 ; G 2535
2559
+ U 7921 ; WX 712 ; N uni1EF1 ; G 2536
2560
+ U 7922 ; WX 724 ; N Ygrave ; G 2537
2561
+ U 7923 ; WX 652 ; N ygrave ; G 2538
2562
+ U 7924 ; WX 724 ; N uni1EF4 ; G 2539
2563
+ U 7925 ; WX 652 ; N uni1EF5 ; G 2540
2564
+ U 7926 ; WX 724 ; N uni1EF6 ; G 2541
2565
+ U 7927 ; WX 652 ; N uni1EF7 ; G 2542
2566
+ U 7928 ; WX 724 ; N uni1EF8 ; G 2543
2567
+ U 7929 ; WX 652 ; N uni1EF9 ; G 2544
2568
+ U 7930 ; WX 953 ; N uni1EFA ; G 2545
2569
+ U 7931 ; WX 644 ; N uni1EFB ; G 2546
2570
+ U 7936 ; WX 687 ; N uni1F00 ; G 2547
2571
+ U 7937 ; WX 687 ; N uni1F01 ; G 2548
2572
+ U 7938 ; WX 687 ; N uni1F02 ; G 2549
2573
+ U 7939 ; WX 687 ; N uni1F03 ; G 2550
2574
+ U 7940 ; WX 687 ; N uni1F04 ; G 2551
2575
+ U 7941 ; WX 687 ; N uni1F05 ; G 2552
2576
+ U 7942 ; WX 687 ; N uni1F06 ; G 2553
2577
+ U 7943 ; WX 687 ; N uni1F07 ; G 2554
2578
+ U 7944 ; WX 774 ; N uni1F08 ; G 2555
2579
+ U 7945 ; WX 774 ; N uni1F09 ; G 2556
2580
+ U 7946 ; WX 1041 ; N uni1F0A ; G 2557
2581
+ U 7947 ; WX 1043 ; N uni1F0B ; G 2558
2582
+ U 7948 ; WX 935 ; N uni1F0C ; G 2559
2583
+ U 7949 ; WX 963 ; N uni1F0D ; G 2560
2584
+ U 7950 ; WX 835 ; N uni1F0E ; G 2561
2585
+ U 7951 ; WX 859 ; N uni1F0F ; G 2562
2586
+ U 7952 ; WX 557 ; N uni1F10 ; G 2563
2587
+ U 7953 ; WX 557 ; N uni1F11 ; G 2564
2588
+ U 7954 ; WX 557 ; N uni1F12 ; G 2565
2589
+ U 7955 ; WX 557 ; N uni1F13 ; G 2566
2590
+ U 7956 ; WX 557 ; N uni1F14 ; G 2567
2591
+ U 7957 ; WX 557 ; N uni1F15 ; G 2568
2592
+ U 7960 ; WX 792 ; N uni1F18 ; G 2569
2593
+ U 7961 ; WX 794 ; N uni1F19 ; G 2570
2594
+ U 7962 ; WX 1100 ; N uni1F1A ; G 2571
2595
+ U 7963 ; WX 1096 ; N uni1F1B ; G 2572
2596
+ U 7964 ; WX 1023 ; N uni1F1C ; G 2573
2597
+ U 7965 ; WX 1052 ; N uni1F1D ; G 2574
2598
+ U 7968 ; WX 712 ; N uni1F20 ; G 2575
2599
+ U 7969 ; WX 712 ; N uni1F21 ; G 2576
2600
+ U 7970 ; WX 712 ; N uni1F22 ; G 2577
2601
+ U 7971 ; WX 712 ; N uni1F23 ; G 2578
2602
+ U 7972 ; WX 712 ; N uni1F24 ; G 2579
2603
+ U 7973 ; WX 712 ; N uni1F25 ; G 2580
2604
+ U 7974 ; WX 712 ; N uni1F26 ; G 2581
2605
+ U 7975 ; WX 712 ; N uni1F27 ; G 2582
2606
+ U 7976 ; WX 945 ; N uni1F28 ; G 2583
2607
+ U 7977 ; WX 951 ; N uni1F29 ; G 2584
2608
+ U 7978 ; WX 1250 ; N uni1F2A ; G 2585
2609
+ U 7979 ; WX 1250 ; N uni1F2B ; G 2586
2610
+ U 7980 ; WX 1180 ; N uni1F2C ; G 2587
2611
+ U 7981 ; WX 1206 ; N uni1F2D ; G 2588
2612
+ U 7982 ; WX 1054 ; N uni1F2E ; G 2589
2613
+ U 7983 ; WX 1063 ; N uni1F2F ; G 2590
2614
+ U 7984 ; WX 390 ; N uni1F30 ; G 2591
2615
+ U 7985 ; WX 390 ; N uni1F31 ; G 2592
2616
+ U 7986 ; WX 390 ; N uni1F32 ; G 2593
2617
+ U 7987 ; WX 390 ; N uni1F33 ; G 2594
2618
+ U 7988 ; WX 390 ; N uni1F34 ; G 2595
2619
+ U 7989 ; WX 390 ; N uni1F35 ; G 2596
2620
+ U 7990 ; WX 390 ; N uni1F36 ; G 2597
2621
+ U 7991 ; WX 390 ; N uni1F37 ; G 2598
2622
+ U 7992 ; WX 483 ; N uni1F38 ; G 2599
2623
+ U 7993 ; WX 489 ; N uni1F39 ; G 2600
2624
+ U 7994 ; WX 777 ; N uni1F3A ; G 2601
2625
+ U 7995 ; WX 785 ; N uni1F3B ; G 2602
2626
+ U 7996 ; WX 712 ; N uni1F3C ; G 2603
2627
+ U 7997 ; WX 738 ; N uni1F3D ; G 2604
2628
+ U 7998 ; WX 604 ; N uni1F3E ; G 2605
2629
+ U 7999 ; WX 604 ; N uni1F3F ; G 2606
2630
+ U 8000 ; WX 687 ; N uni1F40 ; G 2607
2631
+ U 8001 ; WX 687 ; N uni1F41 ; G 2608
2632
+ U 8002 ; WX 687 ; N uni1F42 ; G 2609
2633
+ U 8003 ; WX 687 ; N uni1F43 ; G 2610
2634
+ U 8004 ; WX 687 ; N uni1F44 ; G 2611
2635
+ U 8005 ; WX 687 ; N uni1F45 ; G 2612
2636
+ U 8008 ; WX 892 ; N uni1F48 ; G 2613
2637
+ U 8009 ; WX 933 ; N uni1F49 ; G 2614
2638
+ U 8010 ; WX 1221 ; N uni1F4A ; G 2615
2639
+ U 8011 ; WX 1224 ; N uni1F4B ; G 2616
2640
+ U 8012 ; WX 1053 ; N uni1F4C ; G 2617
2641
+ U 8013 ; WX 1082 ; N uni1F4D ; G 2618
2642
+ U 8016 ; WX 675 ; N uni1F50 ; G 2619
2643
+ U 8017 ; WX 675 ; N uni1F51 ; G 2620
2644
+ U 8018 ; WX 675 ; N uni1F52 ; G 2621
2645
+ U 8019 ; WX 675 ; N uni1F53 ; G 2622
2646
+ U 8020 ; WX 675 ; N uni1F54 ; G 2623
2647
+ U 8021 ; WX 675 ; N uni1F55 ; G 2624
2648
+ U 8022 ; WX 675 ; N uni1F56 ; G 2625
2649
+ U 8023 ; WX 675 ; N uni1F57 ; G 2626
2650
+ U 8025 ; WX 930 ; N uni1F59 ; G 2627
2651
+ U 8027 ; WX 1184 ; N uni1F5B ; G 2628
2652
+ U 8029 ; WX 1199 ; N uni1F5D ; G 2629
2653
+ U 8031 ; WX 1049 ; N uni1F5F ; G 2630
2654
+ U 8032 ; WX 869 ; N uni1F60 ; G 2631
2655
+ U 8033 ; WX 869 ; N uni1F61 ; G 2632
2656
+ U 8034 ; WX 869 ; N uni1F62 ; G 2633
2657
+ U 8035 ; WX 869 ; N uni1F63 ; G 2634
2658
+ U 8036 ; WX 869 ; N uni1F64 ; G 2635
2659
+ U 8037 ; WX 869 ; N uni1F65 ; G 2636
2660
+ U 8038 ; WX 869 ; N uni1F66 ; G 2637
2661
+ U 8039 ; WX 869 ; N uni1F67 ; G 2638
2662
+ U 8040 ; WX 909 ; N uni1F68 ; G 2639
2663
+ U 8041 ; WX 958 ; N uni1F69 ; G 2640
2664
+ U 8042 ; WX 1246 ; N uni1F6A ; G 2641
2665
+ U 8043 ; WX 1251 ; N uni1F6B ; G 2642
2666
+ U 8044 ; WX 1076 ; N uni1F6C ; G 2643
2667
+ U 8045 ; WX 1105 ; N uni1F6D ; G 2644
2668
+ U 8046 ; WX 1028 ; N uni1F6E ; G 2645
2669
+ U 8047 ; WX 1076 ; N uni1F6F ; G 2646
2670
+ U 8048 ; WX 687 ; N uni1F70 ; G 2647
2671
+ U 8049 ; WX 687 ; N uni1F71 ; G 2648
2672
+ U 8050 ; WX 557 ; N uni1F72 ; G 2649
2673
+ U 8051 ; WX 557 ; N uni1F73 ; G 2650
2674
+ U 8052 ; WX 712 ; N uni1F74 ; G 2651
2675
+ U 8053 ; WX 712 ; N uni1F75 ; G 2652
2676
+ U 8054 ; WX 390 ; N uni1F76 ; G 2653
2677
+ U 8055 ; WX 390 ; N uni1F77 ; G 2654
2678
+ U 8056 ; WX 687 ; N uni1F78 ; G 2655
2679
+ U 8057 ; WX 687 ; N uni1F79 ; G 2656
2680
+ U 8058 ; WX 675 ; N uni1F7A ; G 2657
2681
+ U 8059 ; WX 675 ; N uni1F7B ; G 2658
2682
+ U 8060 ; WX 869 ; N uni1F7C ; G 2659
2683
+ U 8061 ; WX 869 ; N uni1F7D ; G 2660
2684
+ U 8064 ; WX 687 ; N uni1F80 ; G 2661
2685
+ U 8065 ; WX 687 ; N uni1F81 ; G 2662
2686
+ U 8066 ; WX 687 ; N uni1F82 ; G 2663
2687
+ U 8067 ; WX 687 ; N uni1F83 ; G 2664
2688
+ U 8068 ; WX 687 ; N uni1F84 ; G 2665
2689
+ U 8069 ; WX 687 ; N uni1F85 ; G 2666
2690
+ U 8070 ; WX 687 ; N uni1F86 ; G 2667
2691
+ U 8071 ; WX 687 ; N uni1F87 ; G 2668
2692
+ U 8072 ; WX 774 ; N uni1F88 ; G 2669
2693
+ U 8073 ; WX 774 ; N uni1F89 ; G 2670
2694
+ U 8074 ; WX 1041 ; N uni1F8A ; G 2671
2695
+ U 8075 ; WX 1043 ; N uni1F8B ; G 2672
2696
+ U 8076 ; WX 935 ; N uni1F8C ; G 2673
2697
+ U 8077 ; WX 963 ; N uni1F8D ; G 2674
2698
+ U 8078 ; WX 835 ; N uni1F8E ; G 2675
2699
+ U 8079 ; WX 859 ; N uni1F8F ; G 2676
2700
+ U 8080 ; WX 712 ; N uni1F90 ; G 2677
2701
+ U 8081 ; WX 712 ; N uni1F91 ; G 2678
2702
+ U 8082 ; WX 712 ; N uni1F92 ; G 2679
2703
+ U 8083 ; WX 712 ; N uni1F93 ; G 2680
2704
+ U 8084 ; WX 712 ; N uni1F94 ; G 2681
2705
+ U 8085 ; WX 712 ; N uni1F95 ; G 2682
2706
+ U 8086 ; WX 712 ; N uni1F96 ; G 2683
2707
+ U 8087 ; WX 712 ; N uni1F97 ; G 2684
2708
+ U 8088 ; WX 945 ; N uni1F98 ; G 2685
2709
+ U 8089 ; WX 951 ; N uni1F99 ; G 2686
2710
+ U 8090 ; WX 1250 ; N uni1F9A ; G 2687
2711
+ U 8091 ; WX 1250 ; N uni1F9B ; G 2688
2712
+ U 8092 ; WX 1180 ; N uni1F9C ; G 2689
2713
+ U 8093 ; WX 1206 ; N uni1F9D ; G 2690
2714
+ U 8094 ; WX 1054 ; N uni1F9E ; G 2691
2715
+ U 8095 ; WX 1063 ; N uni1F9F ; G 2692
2716
+ U 8096 ; WX 869 ; N uni1FA0 ; G 2693
2717
+ U 8097 ; WX 869 ; N uni1FA1 ; G 2694
2718
+ U 8098 ; WX 869 ; N uni1FA2 ; G 2695
2719
+ U 8099 ; WX 869 ; N uni1FA3 ; G 2696
2720
+ U 8100 ; WX 869 ; N uni1FA4 ; G 2697
2721
+ U 8101 ; WX 869 ; N uni1FA5 ; G 2698
2722
+ U 8102 ; WX 869 ; N uni1FA6 ; G 2699
2723
+ U 8103 ; WX 869 ; N uni1FA7 ; G 2700
2724
+ U 8104 ; WX 909 ; N uni1FA8 ; G 2701
2725
+ U 8105 ; WX 958 ; N uni1FA9 ; G 2702
2726
+ U 8106 ; WX 1246 ; N uni1FAA ; G 2703
2727
+ U 8107 ; WX 1251 ; N uni1FAB ; G 2704
2728
+ U 8108 ; WX 1076 ; N uni1FAC ; G 2705
2729
+ U 8109 ; WX 1105 ; N uni1FAD ; G 2706
2730
+ U 8110 ; WX 1028 ; N uni1FAE ; G 2707
2731
+ U 8111 ; WX 1076 ; N uni1FAF ; G 2708
2732
+ U 8112 ; WX 687 ; N uni1FB0 ; G 2709
2733
+ U 8113 ; WX 687 ; N uni1FB1 ; G 2710
2734
+ U 8114 ; WX 687 ; N uni1FB2 ; G 2711
2735
+ U 8115 ; WX 687 ; N uni1FB3 ; G 2712
2736
+ U 8116 ; WX 687 ; N uni1FB4 ; G 2713
2737
+ U 8118 ; WX 687 ; N uni1FB6 ; G 2714
2738
+ U 8119 ; WX 687 ; N uni1FB7 ; G 2715
2739
+ U 8120 ; WX 774 ; N uni1FB8 ; G 2716
2740
+ U 8121 ; WX 774 ; N uni1FB9 ; G 2717
2741
+ U 8122 ; WX 876 ; N uni1FBA ; G 2718
2742
+ U 8123 ; WX 797 ; N uni1FBB ; G 2719
2743
+ U 8124 ; WX 774 ; N uni1FBC ; G 2720
2744
+ U 8125 ; WX 500 ; N uni1FBD ; G 2721
2745
+ U 8126 ; WX 500 ; N uni1FBE ; G 2722
2746
+ U 8127 ; WX 500 ; N uni1FBF ; G 2723
2747
+ U 8128 ; WX 500 ; N uni1FC0 ; G 2724
2748
+ U 8129 ; WX 500 ; N uni1FC1 ; G 2725
2749
+ U 8130 ; WX 712 ; N uni1FC2 ; G 2726
2750
+ U 8131 ; WX 712 ; N uni1FC3 ; G 2727
2751
+ U 8132 ; WX 712 ; N uni1FC4 ; G 2728
2752
+ U 8134 ; WX 712 ; N uni1FC6 ; G 2729
2753
+ U 8135 ; WX 712 ; N uni1FC7 ; G 2730
2754
+ U 8136 ; WX 929 ; N uni1FC8 ; G 2731
2755
+ U 8137 ; WX 846 ; N uni1FC9 ; G 2732
2756
+ U 8138 ; WX 1080 ; N uni1FCA ; G 2733
2757
+ U 8139 ; WX 1009 ; N uni1FCB ; G 2734
2758
+ U 8140 ; WX 837 ; N uni1FCC ; G 2735
2759
+ U 8141 ; WX 500 ; N uni1FCD ; G 2736
2760
+ U 8142 ; WX 500 ; N uni1FCE ; G 2737
2761
+ U 8143 ; WX 500 ; N uni1FCF ; G 2738
2762
+ U 8144 ; WX 390 ; N uni1FD0 ; G 2739
2763
+ U 8145 ; WX 390 ; N uni1FD1 ; G 2740
2764
+ U 8146 ; WX 390 ; N uni1FD2 ; G 2741
2765
+ U 8147 ; WX 390 ; N uni1FD3 ; G 2742
2766
+ U 8150 ; WX 390 ; N uni1FD6 ; G 2743
2767
+ U 8151 ; WX 390 ; N uni1FD7 ; G 2744
2768
+ U 8152 ; WX 372 ; N uni1FD8 ; G 2745
2769
+ U 8153 ; WX 372 ; N uni1FD9 ; G 2746
2770
+ U 8154 ; WX 621 ; N uni1FDA ; G 2747
2771
+ U 8155 ; WX 563 ; N uni1FDB ; G 2748
2772
+ U 8157 ; WX 500 ; N uni1FDD ; G 2749
2773
+ U 8158 ; WX 500 ; N uni1FDE ; G 2750
2774
+ U 8159 ; WX 500 ; N uni1FDF ; G 2751
2775
+ U 8160 ; WX 675 ; N uni1FE0 ; G 2752
2776
+ U 8161 ; WX 675 ; N uni1FE1 ; G 2753
2777
+ U 8162 ; WX 675 ; N uni1FE2 ; G 2754
2778
+ U 8163 ; WX 675 ; N uni1FE3 ; G 2755
2779
+ U 8164 ; WX 716 ; N uni1FE4 ; G 2756
2780
+ U 8165 ; WX 716 ; N uni1FE5 ; G 2757
2781
+ U 8166 ; WX 675 ; N uni1FE6 ; G 2758
2782
+ U 8167 ; WX 675 ; N uni1FE7 ; G 2759
2783
+ U 8168 ; WX 724 ; N uni1FE8 ; G 2760
2784
+ U 8169 ; WX 724 ; N uni1FE9 ; G 2761
2785
+ U 8170 ; WX 1020 ; N uni1FEA ; G 2762
2786
+ U 8171 ; WX 980 ; N uni1FEB ; G 2763
2787
+ U 8172 ; WX 838 ; N uni1FEC ; G 2764
2788
+ U 8173 ; WX 500 ; N uni1FED ; G 2765
2789
+ U 8174 ; WX 500 ; N uni1FEE ; G 2766
2790
+ U 8175 ; WX 500 ; N uni1FEF ; G 2767
2791
+ U 8178 ; WX 869 ; N uni1FF2 ; G 2768
2792
+ U 8179 ; WX 869 ; N uni1FF3 ; G 2769
2793
+ U 8180 ; WX 869 ; N uni1FF4 ; G 2770
2794
+ U 8182 ; WX 869 ; N uni1FF6 ; G 2771
2795
+ U 8183 ; WX 869 ; N uni1FF7 ; G 2772
2796
+ U 8184 ; WX 1065 ; N uni1FF8 ; G 2773
2797
+ U 8185 ; WX 891 ; N uni1FF9 ; G 2774
2798
+ U 8186 ; WX 1084 ; N uni1FFA ; G 2775
2799
+ U 8187 ; WX 894 ; N uni1FFB ; G 2776
2800
+ U 8188 ; WX 850 ; N uni1FFC ; G 2777
2801
+ U 8189 ; WX 500 ; N uni1FFD ; G 2778
2802
+ U 8190 ; WX 500 ; N uni1FFE ; G 2779
2803
  U 8192 ; WX 500 ; N uni2000 ; G 2780
2804
  U 8193 ; WX 1000 ; N uni2001 ; G 2781
2805
  U 8194 ; WX 500 ; N uni2002 ; G 2782
2810
  U 8199 ; WX 696 ; N uni2007 ; G 2787
2811
  U 8200 ; WX 380 ; N uni2008 ; G 2788
2812
  U 8201 ; WX 200 ; N uni2009 ; G 2789
2813
+ U 8202 ; WX 100 ; N uni200A ; G 2790
2814
+ U 8203 ; WX 0 ; N uni200B ; G 2791
2815
+ U 8204 ; WX 0 ; N uni200C ; G 2792
2816
+ U 8205 ; WX 0 ; N uni200D ; G 2793
2817
+ U 8206 ; WX 0 ; N uni200E ; G 2794
2818
+ U 8207 ; WX 0 ; N uni200F ; G 2795
2819
  U 8208 ; WX 415 ; N uni2010 ; G 2796
2820
  U 8209 ; WX 415 ; N uni2011 ; G 2797
2821
+ U 8210 ; WX 696 ; N figuredash ; G 2798
2822
+ U 8211 ; WX 500 ; N endash ; G 2799
2823
+ U 8212 ; WX 1000 ; N emdash ; G 2800
2824
  U 8213 ; WX 1000 ; N uni2015 ; G 2801
2825
  U 8214 ; WX 500 ; N uni2016 ; G 2802
2826
+ U 8215 ; WX 500 ; N underscoredbl ; G 2803
2827
+ U 8216 ; WX 380 ; N quoteleft ; G 2804
2828
+ U 8217 ; WX 380 ; N quoteright ; G 2805
2829
+ U 8218 ; WX 380 ; N quotesinglbase ; G 2806
2830
+ U 8219 ; WX 380 ; N quotereversed ; G 2807
2831
+ U 8220 ; WX 657 ; N quotedblleft ; G 2808
2832
+ U 8221 ; WX 657 ; N quotedblright ; G 2809
2833
+ U 8222 ; WX 657 ; N quotedblbase ; G 2810
2834
+ U 8223 ; WX 657 ; N uni201F ; G 2811
2835
+ U 8224 ; WX 500 ; N dagger ; G 2812
2836
+ U 8225 ; WX 500 ; N daggerdbl ; G 2813
2837
+ U 8226 ; WX 639 ; N bullet ; G 2814
2838
  U 8227 ; WX 639 ; N uni2023 ; G 2815
2839
+ U 8228 ; WX 333 ; N onedotenleader ; G 2816
2840
+ U 8229 ; WX 667 ; N twodotenleader ; G 2817
2841
+ U 8230 ; WX 1000 ; N ellipsis ; G 2818
2842
  U 8231 ; WX 348 ; N uni2027 ; G 2819
2843
+ U 8232 ; WX 0 ; N uni2028 ; G 2820
2844
+ U 8233 ; WX 0 ; N uni2029 ; G 2821
2845
+ U 8234 ; WX 0 ; N uni202A ; G 2822
2846
+ U 8235 ; WX 0 ; N uni202B ; G 2823
2847
+ U 8236 ; WX 0 ; N uni202C ; G 2824
2848
+ U 8237 ; WX 0 ; N uni202D ; G 2825
2849
+ U 8238 ; WX 0 ; N uni202E ; G 2826
2850
+ U 8239 ; WX 200 ; N uni202F ; G 2827
2851
+ U 8240 ; WX 1440 ; N perthousand ; G 2828
2852
  U 8241 ; WX 1887 ; N uni2031 ; G 2829
2853
+ U 8242 ; WX 264 ; N minute ; G 2830
2854
+ U 8243 ; WX 447 ; N second ; G 2831
2855
  U 8244 ; WX 630 ; N uni2034 ; G 2832
2856
  U 8245 ; WX 264 ; N uni2035 ; G 2833
2857
  U 8246 ; WX 447 ; N uni2036 ; G 2834
2858
  U 8247 ; WX 630 ; N uni2037 ; G 2835
2859
  U 8248 ; WX 733 ; N uni2038 ; G 2836
2860
+ U 8249 ; WX 412 ; N guilsinglleft ; G 2837
2861
+ U 8250 ; WX 412 ; N guilsinglright ; G 2838
2862
+ U 8251 ; WX 972 ; N uni203B ; G 2839
2863
+ U 8252 ; WX 627 ; N exclamdbl ; G 2840
2864
+ U 8253 ; WX 580 ; N uni203D ; G 2841
2865
+ U 8254 ; WX 500 ; N uni203E ; G 2842
2866
+ U 8255 ; WX 828 ; N uni203F ; G 2843
2867
  U 8256 ; WX 828 ; N uni2040 ; G 2844
2868
  U 8257 ; WX 329 ; N uni2041 ; G 2845
2869
  U 8258 ; WX 1023 ; N uni2042 ; G 2846
2870
  U 8259 ; WX 500 ; N uni2043 ; G 2847
2871
+ U 8260 ; WX 167 ; N fraction ; G 2848
2872
  U 8261 ; WX 457 ; N uni2045 ; G 2849
2873
  U 8262 ; WX 457 ; N uni2046 ; G 2850
2874
  U 8263 ; WX 1030 ; N uni2047 ; G 2851
2875
  U 8264 ; WX 829 ; N uni2048 ; G 2852
2876
  U 8265 ; WX 829 ; N uni2049 ; G 2853
2877
+ U 8266 ; WX 513 ; N uni204A ; G 2854
2878
+ U 8267 ; WX 636 ; N uni204B ; G 2855
2879
+ U 8268 ; WX 500 ; N uni204C ; G 2856
2880
+ U 8269 ; WX 500 ; N uni204D ; G 2857
2881
+ U 8270 ; WX 523 ; N uni204E ; G 2858
2882
+ U 8271 ; WX 400 ; N uni204F ; G 2859
2883
  U 8272 ; WX 828 ; N uni2050 ; G 2860
2884
  U 8273 ; WX 523 ; N uni2051 ; G 2861
2885
  U 8274 ; WX 556 ; N uni2052 ; G 2862
2890
  U 8279 ; WX 813 ; N uni2057 ; G 2867
2891
  U 8280 ; WX 838 ; N uni2058 ; G 2868
2892
  U 8281 ; WX 838 ; N uni2059 ; G 2869
2893
+ U 8282 ; WX 380 ; N uni205A ; G 2870
2894
+ U 8283 ; WX 872 ; N uni205B ; G 2871
2895
+ U 8284 ; WX 838 ; N uni205C ; G 2872
2896
+ U 8285 ; WX 380 ; N uni205D ; G 2873
2897
+ U 8286 ; WX 380 ; N uni205E ; G 2874
2898
+ U 8287 ; WX 222 ; N uni205F ; G 2875
2899
+ U 8288 ; WX 0 ; N uni2060 ; G 2876
2900
+ U 8289 ; WX 0 ; N uni2061 ; G 2877
2901
+ U 8290 ; WX 0 ; N uni2062 ; G 2878
2902
+ U 8291 ; WX 0 ; N uni2063 ; G 2879
2903
+ U 8292 ; WX 0 ; N uni2064 ; G 2880
2904
+ U 8298 ; WX 0 ; N uni206A ; G 2881
2905
+ U 8299 ; WX 0 ; N uni206B ; G 2882
2906
+ U 8300 ; WX 0 ; N uni206C ; G 2883
2907
+ U 8301 ; WX 0 ; N uni206D ; G 2884
2908
+ U 8302 ; WX 0 ; N uni206E ; G 2885
2909
+ U 8303 ; WX 0 ; N uni206F ; G 2886
2910
  U 8304 ; WX 438 ; N uni2070 ; G 2887
2911
  U 8305 ; WX 219 ; N uni2071 ; G 2888
2912
  U 8308 ; WX 438 ; N uni2074 ; G 2889
2915
  U 8311 ; WX 438 ; N uni2077 ; G 2892
2916
  U 8312 ; WX 438 ; N uni2078 ; G 2893
2917
  U 8313 ; WX 438 ; N uni2079 ; G 2894
2918
+ U 8314 ; WX 528 ; N uni207A ; G 2895
2919
+ U 8315 ; WX 528 ; N uni207B ; G 2896
2920
+ U 8316 ; WX 528 ; N uni207C ; G 2897
2921
+ U 8317 ; WX 288 ; N uni207D ; G 2898
2922
+ U 8318 ; WX 288 ; N uni207E ; G 2899
2923
+ U 8319 ; WX 456 ; N uni207F ; G 2900
2924
  U 8320 ; WX 438 ; N uni2080 ; G 2901
2925
  U 8321 ; WX 438 ; N uni2081 ; G 2902
2926
  U 8322 ; WX 438 ; N uni2082 ; G 2903
2931
  U 8327 ; WX 438 ; N uni2087 ; G 2908
2932
  U 8328 ; WX 438 ; N uni2088 ; G 2909
2933
  U 8329 ; WX 438 ; N uni2089 ; G 2910
2934
+ U 8330 ; WX 528 ; N uni208A ; G 2911
2935
+ U 8331 ; WX 528 ; N uni208B ; G 2912
2936
+ U 8332 ; WX 528 ; N uni208C ; G 2913
2937
+ U 8333 ; WX 288 ; N uni208D ; G 2914
2938
+ U 8334 ; WX 288 ; N uni208E ; G 2915
2939
  U 8336 ; WX 458 ; N uni2090 ; G 2916
2940
  U 8337 ; WX 479 ; N uni2091 ; G 2917
2941
  U 8338 ; WX 488 ; N uni2092 ; G 2918
2942
  U 8339 ; WX 413 ; N uni2093 ; G 2919
2943
  U 8340 ; WX 479 ; N uni2094 ; G 2920
2944
+ U 8352 ; WX 929 ; N uni20A0 ; G 2921
2945
+ U 8353 ; WX 696 ; N colonmonetary ; G 2922
2946
+ U 8354 ; WX 696 ; N uni20A2 ; G 2923
2947
+ U 8355 ; WX 696 ; N franc ; G 2924
2948
+ U 8356 ; WX 696 ; N lira ; G 2925
2949
+ U 8357 ; WX 1042 ; N uni20A5 ; G 2926
2950
+ U 8358 ; WX 837 ; N uni20A6 ; G 2927
2951
+ U 8359 ; WX 1518 ; N peseta ; G 2928
2952
+ U 8360 ; WX 1205 ; N uni20A8 ; G 2929
2953
+ U 8361 ; WX 1103 ; N uni20A9 ; G 2930
2954
+ U 8362 ; WX 904 ; N uni20AA ; G 2931
2955
+ U 8363 ; WX 696 ; N dong ; G 2932
2956
+ U 8364 ; WX 696 ; N Euro ; G 2933
2957
+ U 8365 ; WX 696 ; N uni20AD ; G 2934
2958
+ U 8366 ; WX 696 ; N uni20AE ; G 2935
2959
+ U 8367 ; WX 1392 ; N uni20AF ; G 2936
2960
+ U 8368 ; WX 696 ; N uni20B0 ; G 2937
2961
+ U 8369 ; WX 696 ; N uni20B1 ; G 2938
2962
+ U 8370 ; WX 696 ; N uni20B2 ; G 2939
2963
+ U 8371 ; WX 696 ; N uni20B3 ; G 2940
2964
+ U 8372 ; WX 859 ; N uni20B4 ; G 2941
2965
+ U 8373 ; WX 696 ; N uni20B5 ; G 2942
2966
+ U 8376 ; WX 696 ; N uni20B8 ; G 2943
2967
+ U 8377 ; WX 696 ; N uni20B9 ; G 2944
2968
+ U 8400 ; WX 0 ; N uni20D0 ; G 2945
2969
+ U 8401 ; WX 0 ; N uni20D1 ; G 2946
2970
+ U 8406 ; WX 0 ; N uni20D6 ; G 2947
2971
+ U 8407 ; WX 0 ; N uni20D7 ; G 2948
2972
+ U 8411 ; WX 0 ; N uni20DB ; G 2949
2973
+ U 8412 ; WX 0 ; N uni20DC ; G 2950
2974
+ U 8417 ; WX 0 ; N uni20E1 ; G 2951
2975
  U 8448 ; WX 1120 ; N uni2100 ; G 2952
2976
  U 8449 ; WX 1170 ; N uni2101 ; G 2953
2977
  U 8450 ; WX 734 ; N uni2102 ; G 2954
2982
  U 8455 ; WX 614 ; N uni2107 ; G 2959
2983
  U 8456 ; WX 698 ; N uni2108 ; G 2960
2984
  U 8457 ; WX 1086 ; N uni2109 ; G 2961
2985
+ U 8459 ; WX 1073 ; N uni210B ; G 2962
2986
+ U 8460 ; WX 913 ; N uni210C ; G 2963
2987
+ U 8461 ; WX 888 ; N uni210D ; G 2964
2988
+ U 8462 ; WX 712 ; N uni210E ; G 2965
2989
+ U 8463 ; WX 712 ; N uni210F ; G 2966
2990
  U 8464 ; WX 597 ; N uni2110 ; G 2967
2991
+ U 8465 ; WX 697 ; N Ifraktur ; G 2968
2992
  U 8466 ; WX 856 ; N uni2112 ; G 2969
2993
  U 8467 ; WX 472 ; N uni2113 ; G 2970
2994
  U 8468 ; WX 974 ; N uni2114 ; G 2971
2995
  U 8469 ; WX 837 ; N uni2115 ; G 2972
2996
  U 8470 ; WX 1203 ; N uni2116 ; G 2973
2997
  U 8471 ; WX 1000 ; N uni2117 ; G 2974
2998
+ U 8472 ; WX 697 ; N weierstrass ; G 2975
2999
  U 8473 ; WX 750 ; N uni2119 ; G 2976
3000
+ U 8474 ; WX 850 ; N uni211A ; G 2977
3001
+ U 8475 ; WX 938 ; N uni211B ; G 2978
3002
+ U 8476 ; WX 814 ; N Rfraktur ; G 2979
3003
+ U 8477 ; WX 801 ; N uni211D ; G 2980
3004
+ U 8478 ; WX 896 ; N prescription ; G 2981
3005
+ U 8479 ; WX 710 ; N uni211F ; G 2982
3006
  U 8480 ; WX 1020 ; N uni2120 ; G 2983
3007
  U 8481 ; WX 1281 ; N uni2121 ; G 2984
3008
+ U 8482 ; WX 1000 ; N trademark ; G 2985
3009
  U 8483 ; WX 755 ; N uni2123 ; G 2986
3010
  U 8484 ; WX 754 ; N uni2124 ; G 2987
3011
  U 8485 ; WX 578 ; N uni2125 ; G 2988
3013
  U 8487 ; WX 850 ; N uni2127 ; G 2990
3014
  U 8488 ; WX 763 ; N uni2128 ; G 2991
3015
  U 8489 ; WX 338 ; N uni2129 ; G 2992
3016
+ U 8490 ; WX 775 ; N uni212A ; G 2993
3017
+ U 8491 ; WX 774 ; N uni212B ; G 2994
3018
+ U 8492 ; WX 928 ; N uni212C ; G 2995
3019
+ U 8493 ; WX 818 ; N uni212D ; G 2996
3020
+ U 8494 ; WX 854 ; N estimated ; G 2997
3021
+ U 8495 ; WX 636 ; N uni212F ; G 2998
3022
  U 8496 ; WX 729 ; N uni2130 ; G 2999
3023
  U 8497 ; WX 808 ; N uni2131 ; G 3000
3024
  U 8498 ; WX 683 ; N uni2132 ; G 3001
3025
  U 8499 ; WX 1184 ; N uni2133 ; G 3002
3026
  U 8500 ; WX 465 ; N uni2134 ; G 3003
3027
+ U 8501 ; WX 794 ; N aleph ; G 3004
3028
  U 8502 ; WX 731 ; N uni2136 ; G 3005
3029
  U 8503 ; WX 494 ; N uni2137 ; G 3006
3030
  U 8504 ; WX 684 ; N uni2138 ; G 3007
3031
  U 8505 ; WX 380 ; N uni2139 ; G 3008
3032
+ U 8506 ; WX 945 ; N uni213A ; G 3009
3033
+ U 8507 ; WX 1348 ; N uni213B ; G 3010
3034
+ U 8508 ; WX 790 ; N uni213C ; G 3011
3035
+ U 8509 ; WX 737 ; N uni213D ; G 3012
3036
+ U 8510 ; WX 654 ; N uni213E ; G 3013
3037
+ U 8511 ; WX 863 ; N uni213F ; G 3014
3038
  U 8512 ; WX 840 ; N uni2140 ; G 3015
3039
  U 8513 ; WX 775 ; N uni2141 ; G 3016
3040
  U 8514 ; WX 557 ; N uni2142 ; G 3017
3045
  U 8519 ; WX 678 ; N uni2147 ; G 3022
3046
  U 8520 ; WX 343 ; N uni2148 ; G 3023
3047
  U 8521 ; WX 343 ; N uni2149 ; G 3024
3048
+ U 8523 ; WX 872 ; N uni214B ; G 3025
3049
+ U 8526 ; WX 547 ; N uni214E ; G 3026
3050
  U 8528 ; WX 1035 ; N uni2150 ; G 3027
3051
  U 8529 ; WX 1035 ; N uni2151 ; G 3028
3052
  U 8530 ; WX 1483 ; N uni2152 ; G 3029
3053
+ U 8531 ; WX 1035 ; N onethird ; G 3030
3054
+ U 8532 ; WX 1035 ; N twothirds ; G 3031
3055
  U 8533 ; WX 1035 ; N uni2155 ; G 3032
3056
  U 8534 ; WX 1035 ; N uni2156 ; G 3033
3057
  U 8535 ; WX 1035 ; N uni2157 ; G 3034
3058
  U 8536 ; WX 1035 ; N uni2158 ; G 3035
3059
  U 8537 ; WX 1035 ; N uni2159 ; G 3036
3060
+ U 8538 ; WX 1035 ; N uni215A ; G 3037
3061
+ U 8539 ; WX 1035 ; N oneeighth ; G 3038
3062
+ U 8540 ; WX 1035 ; N threeeighths ; G 3039
3063
+ U 8541 ; WX 1035 ; N fiveeighths ; G 3040
3064
+ U 8542 ; WX 1035 ; N seveneighths ; G 3041
3065
+ U 8543 ; WX 615 ; N uni215F ; G 3042
3066
  U 8544 ; WX 372 ; N uni2160 ; G 3043
3067
  U 8545 ; WX 659 ; N uni2161 ; G 3044
3068
  U 8546 ; WX 945 ; N uni2162 ; G 3045
3073
  U 8551 ; WX 1672 ; N uni2167 ; G 3050
3074
  U 8552 ; WX 1121 ; N uni2168 ; G 3051
3075
  U 8553 ; WX 771 ; N uni2169 ; G 3052
3076
+ U 8554 ; WX 1120 ; N uni216A ; G 3053
3077
+ U 8555 ; WX 1407 ; N uni216B ; G 3054
3078
+ U 8556 ; WX 637 ; N uni216C ; G 3055
3079
+ U 8557 ; WX 734 ; N uni216D ; G 3056
3080
+ U 8558 ; WX 830 ; N uni216E ; G 3057
3081
+ U 8559 ; WX 995 ; N uni216F ; G 3058
3082
  U 8560 ; WX 343 ; N uni2170 ; G 3059
3083
  U 8561 ; WX 607 ; N uni2171 ; G 3060
3084
  U 8562 ; WX 872 ; N uni2172 ; G 3061
3089
  U 8567 ; WX 1491 ; N uni2177 ; G 3066
3090
  U 8568 ; WX 969 ; N uni2178 ; G 3067
3091
  U 8569 ; WX 645 ; N uni2179 ; G 3068
3092
+ U 8570 ; WX 969 ; N uni217A ; G 3069
3093
+ U 8571 ; WX 1233 ; N uni217B ; G 3070
3094
+ U 8572 ; WX 343 ; N uni217C ; G 3071
3095
+ U 8573 ; WX 593 ; N uni217D ; G 3072
3096
+ U 8574 ; WX 716 ; N uni217E ; G 3073
3097
+ U 8575 ; WX 1042 ; N uni217F ; G 3074
3098
  U 8576 ; WX 1289 ; N uni2180 ; G 3075
3099
  U 8577 ; WX 830 ; N uni2181 ; G 3076
3100
  U 8578 ; WX 1289 ; N uni2182 ; G 3077
3102
  U 8580 ; WX 593 ; N uni2184 ; G 3079
3103
  U 8581 ; WX 734 ; N uni2185 ; G 3080
3104
  U 8585 ; WX 1035 ; N uni2189 ; G 3081
3105
+ U 8592 ; WX 838 ; N arrowleft ; G 3082
3106
+ U 8593 ; WX 838 ; N arrowup ; G 3083
3107
+ U 8594 ; WX 838 ; N arrowright ; G 3084
3108
+ U 8595 ; WX 838 ; N arrowdown ; G 3085
3109
+ U 8596 ; WX 838 ; N arrowboth ; G 3086
3110
+ U 8597 ; WX 838 ; N arrowupdn ; G 3087
3111
  U 8598 ; WX 838 ; N uni2196 ; G 3088
3112
  U 8599 ; WX 838 ; N uni2197 ; G 3089
3113
  U 8600 ; WX 838 ; N uni2198 ; G 3090
3114
  U 8601 ; WX 838 ; N uni2199 ; G 3091
3115
+ U 8602 ; WX 838 ; N uni219A ; G 3092
3116
+ U 8603 ; WX 838 ; N uni219B ; G 3093
3117
+ U 8604 ; WX 838 ; N uni219C ; G 3094
3118
+ U 8605 ; WX 838 ; N uni219D ; G 3095
3119
+ U 8606 ; WX 838 ; N uni219E ; G 3096
3120
+ U 8607 ; WX 838 ; N uni219F ; G 3097
3121
+ U 8608 ; WX 838 ; N uni21A0 ; G 3098
3122
+ U 8609 ; WX 838 ; N uni21A1 ; G 3099
3123
+ U 8610 ; WX 838 ; N uni21A2 ; G 3100
3124
+ U 8611 ; WX 838 ; N uni21A3 ; G 3101
3125
+ U 8612 ; WX 838 ; N uni21A4 ; G 3102
3126
+ U 8613 ; WX 838 ; N uni21A5 ; G 3103
3127
+ U 8614 ; WX 838 ; N uni21A6 ; G 3104
3128
+ U 8615 ; WX 838 ; N uni21A7 ; G 3105
3129
+ U 8616 ; WX 838 ; N arrowupdnbse ; G 3106
3130
+ U 8617 ; WX 838 ; N uni21A9 ; G 3107
3131
+ U 8618 ; WX 838 ; N uni21AA ; G 3108
3132
+ U 8619 ; WX 838 ; N uni21AB ; G 3109
3133
+ U 8620 ; WX 838 ; N uni21AC ; G 3110
3134
+ U 8621 ; WX 838 ; N uni21AD ; G 3111
3135
+ U 8622 ; WX 838 ; N uni21AE ; G 3112
3136
+ U 8623 ; WX 838 ; N uni21AF ; G 3113
3137
+ U 8624 ; WX 838 ; N uni21B0 ; G 3114
3138
+ U 8625 ; WX 838 ; N uni21B1 ; G 3115
3139
+ U 8626 ; WX 838 ; N uni21B2 ; G 3116
3140
+ U 8627 ; WX 838 ; N uni21B3 ; G 3117
3141
+ U 8628 ; WX 838 ; N uni21B4 ; G 3118
3142
+ U 8629 ; WX 838 ; N carriagereturn ; G 3119
3143
+ U 8630 ; WX 838 ; N uni21B6 ; G 3120
3144
+ U 8631 ; WX 838 ; N uni21B7 ; G 3121
3145
+ U 8632 ; WX 838 ; N uni21B8 ; G 3122
3146
+ U 8633 ; WX 838 ; N uni21B9 ; G 3123
3147
+ U 8634 ; WX 838 ; N uni21BA ; G 3124
3148
+ U 8635 ; WX 838 ; N uni21BB ; G 3125
3149
+ U 8636 ; WX 838 ; N uni21BC ; G 3126
3150
+ U 8637 ; WX 838 ; N uni21BD ; G 3127
3151
+ U 8638 ; WX 838 ; N uni21BE ; G 3128
3152
+ U 8639 ; WX 838 ; N uni21BF ; G 3129
3153
+ U 8640 ; WX 838 ; N uni21C0 ; G 3130
3154
+ U 8641 ; WX 838 ; N uni21C1 ; G 3131
3155
+ U 8642 ; WX 838 ; N uni21C2 ; G 3132
3156
+ U 8643 ; WX 838 ; N uni21C3 ; G 3133
3157
+ U 8644 ; WX 838 ; N uni21C4 ; G 3134
3158
+ U 8645 ; WX 838 ; N uni21C5 ; G 3135
3159
+ U 8646 ; WX 838 ; N uni21C6 ; G 3136
3160
+ U 8647 ; WX 838 ; N uni21C7 ; G 3137
3161
+ U 8648 ; WX 838 ; N uni21C8 ; G 3138
3162
+ U 8649 ; WX 838 ; N uni21C9 ; G 3139
3163
+ U 8650 ; WX 838 ; N uni21CA ; G 3140
3164
+ U 8651 ; WX 838 ; N uni21CB ; G 3141
3165
+ U 8652 ; WX 838 ; N uni21CC ; G 3142
3166
+ U 8653 ; WX 838 ; N uni21CD ; G 3143
3167
+ U 8654 ; WX 838 ; N uni21CE ; G 3144
3168
+ U 8655 ; WX 838 ; N uni21CF ; G 3145
3169
+ U 8656 ; WX 838 ; N arrowdblleft ; G 3146
3170
+ U 8657 ; WX 838 ; N arrowdblup ; G 3147
3171
+ U 8658 ; WX 838 ; N arrowdblright ; G 3148
3172
+ U 8659 ; WX 838 ; N arrowdbldown ; G 3149
3173
+ U 8660 ; WX 838 ; N arrowdblboth ; G 3150
3174
+ U 8661 ; WX 838 ; N uni21D5 ; G 3151
3175
+ U 8662 ; WX 838 ; N uni21D6 ; G 3152
3176
+ U 8663 ; WX 838 ; N uni21D7 ; G 3153
3177
+ U 8664 ; WX 838 ; N uni21D8 ; G 3154
3178
+ U 8665 ; WX 838 ; N uni21D9 ; G 3155
3179
+ U 8666 ; WX 838 ; N uni21DA ; G 3156
3180
+ U 8667 ; WX 838 ; N uni21DB ; G 3157
3181
+ U 8668 ; WX 838 ; N uni21DC ; G 3158
3182
+ U 8669 ; WX 838 ; N uni21DD ; G 3159
3183
+ U 8670 ; WX 838 ; N uni21DE ; G 3160
3184
+ U 8671 ; WX 838 ; N uni21DF ; G 3161
3185
+ U 8672 ; WX 838 ; N uni21E0 ; G 3162
3186
+ U 8673 ; WX 838 ; N uni21E1 ; G 3163
3187
+ U 8674 ; WX 838 ; N uni21E2 ; G 3164
3188
+ U 8675 ; WX 838 ; N uni21E3 ; G 3165
3189
+ U 8676 ; WX 838 ; N uni21E4 ; G 3166
3190
+ U 8677 ; WX 838 ; N uni21E5 ; G 3167
3191
+ U 8678 ; WX 838 ; N uni21E6 ; G 3168
3192
+ U 8679 ; WX 838 ; N uni21E7 ; G 3169
3193
+ U 8680 ; WX 838 ; N uni21E8 ; G 3170
3194
+ U 8681 ; WX 838 ; N uni21E9 ; G 3171
3195
+ U 8682 ; WX 838 ; N uni21EA ; G 3172
3196
+ U 8683 ; WX 838 ; N uni21EB ; G 3173
3197
+ U 8684 ; WX 838 ; N uni21EC ; G 3174
3198
+ U 8685 ; WX 838 ; N uni21ED ; G 3175
3199
+ U 8686 ; WX 838 ; N uni21EE ; G 3176
3200
+ U 8687 ; WX 838 ; N uni21EF ; G 3177
3201
+ U 8688 ; WX 838 ; N uni21F0 ; G 3178
3202
+ U 8689 ; WX 838 ; N uni21F1 ; G 3179
3203
+ U 8690 ; WX 838 ; N uni21F2 ; G 3180
3204
+ U 8691 ; WX 838 ; N uni21F3 ; G 3181
3205
+ U 8692 ; WX 838 ; N uni21F4 ; G 3182
3206
+ U 8693 ; WX 838 ; N uni21F5 ; G 3183
3207
+ U 8694 ; WX 838 ; N uni21F6 ; G 3184
3208
+ U 8695 ; WX 838 ; N uni21F7 ; G 3185
3209
+ U 8696 ; WX 838 ; N uni21F8 ; G 3186
3210
+ U 8697 ; WX 838 ; N uni21F9 ; G 3187
3211
+ U 8698 ; WX 838 ; N uni21FA ; G 3188
3212
+ U 8699 ; WX 838 ; N uni21FB ; G 3189
3213
+ U 8700 ; WX 838 ; N uni21FC ; G 3190
3214
+ U 8701 ; WX 838 ; N uni21FD ; G 3191
3215
+ U 8702 ; WX 838 ; N uni21FE ; G 3192
3216
+ U 8703 ; WX 838 ; N uni21FF ; G 3193
3217
+ U 8704 ; WX 774 ; N universal ; G 3194
3218
  U 8705 ; WX 696 ; N uni2201 ; G 3195
3219
+ U 8706 ; WX 544 ; N partialdiff ; G 3196
3220
+ U 8707 ; WX 683 ; N existential ; G 3197
3221
  U 8708 ; WX 683 ; N uni2204 ; G 3198
3222
+ U 8709 ; WX 856 ; N emptyset ; G 3199
3223
+ U 8710 ; WX 697 ; N increment ; G 3200
3224
+ U 8711 ; WX 697 ; N gradient ; G 3201
3225
+ U 8712 ; WX 896 ; N element ; G 3202
3226
+ U 8713 ; WX 896 ; N notelement ; G 3203
3227
+ U 8714 ; WX 750 ; N uni220A ; G 3204
3228
+ U 8715 ; WX 896 ; N suchthat ; G 3205
3229
+ U 8716 ; WX 896 ; N uni220C ; G 3206
3230
+ U 8717 ; WX 750 ; N uni220D ; G 3207
3231
+ U 8718 ; WX 636 ; N uni220E ; G 3208
3232
+ U 8719 ; WX 787 ; N product ; G 3209
3233
  U 8720 ; WX 787 ; N uni2210 ; G 3210
3234
+ U 8721 ; WX 718 ; N summation ; G 3211
3235
+ U 8722 ; WX 838 ; N minus ; G 3212
3236
  U 8723 ; WX 838 ; N uni2213 ; G 3213
3237
  U 8724 ; WX 696 ; N uni2214 ; G 3214
3238
  U 8725 ; WX 365 ; N uni2215 ; G 3215
3239
  U 8726 ; WX 696 ; N uni2216 ; G 3216
3240
+ U 8727 ; WX 838 ; N asteriskmath ; G 3217
3241
  U 8728 ; WX 626 ; N uni2218 ; G 3218
3242
  U 8729 ; WX 380 ; N uni2219 ; G 3219
3243
+ U 8730 ; WX 667 ; N radical ; G 3220
3244
+ U 8731 ; WX 667 ; N uni221B ; G 3221
3245
+ U 8732 ; WX 667 ; N uni221C ; G 3222
3246
+ U 8733 ; WX 712 ; N proportional ; G 3223
3247
+ U 8734 ; WX 833 ; N infinity ; G 3224
3248
+ U 8735 ; WX 838 ; N orthogonal ; G 3225
3249
+ U 8736 ; WX 896 ; N angle ; G 3226
3250
  U 8737 ; WX 896 ; N uni2221 ; G 3227
3251
  U 8738 ; WX 838 ; N uni2222 ; G 3228
3252
  U 8739 ; WX 500 ; N uni2223 ; G 3229
3253
  U 8740 ; WX 500 ; N uni2224 ; G 3230
3254
  U 8741 ; WX 500 ; N uni2225 ; G 3231
3255
  U 8742 ; WX 500 ; N uni2226 ; G 3232
3256
+ U 8743 ; WX 812 ; N logicaland ; G 3233
3257
+ U 8744 ; WX 812 ; N logicalor ; G 3234
3258
+ U 8745 ; WX 812 ; N intersection ; G 3235
3259
+ U 8746 ; WX 812 ; N union ; G 3236
3260
+ U 8747 ; WX 610 ; N integral ; G 3237
3261
+ U 8748 ; WX 929 ; N uni222C ; G 3238
3262
+ U 8749 ; WX 1295 ; N uni222D ; G 3239
3263
+ U 8750 ; WX 563 ; N uni222E ; G 3240
3264
+ U 8751 ; WX 977 ; N uni222F ; G 3241
3265
  U 8752 ; WX 1313 ; N uni2230 ; G 3242
3266
  U 8753 ; WX 563 ; N uni2231 ; G 3243
3267
  U 8754 ; WX 563 ; N uni2232 ; G 3244
3268
  U 8755 ; WX 563 ; N uni2233 ; G 3245
3269
+ U 8756 ; WX 696 ; N therefore ; G 3246
3270
  U 8757 ; WX 696 ; N uni2235 ; G 3247
3271
  U 8758 ; WX 294 ; N uni2236 ; G 3248
3272
  U 8759 ; WX 696 ; N uni2237 ; G 3249
3273
  U 8760 ; WX 838 ; N uni2238 ; G 3250
3274
  U 8761 ; WX 838 ; N uni2239 ; G 3251
3275
+ U 8762 ; WX 838 ; N uni223A ; G 3252
3276
+ U 8763 ; WX 838 ; N uni223B ; G 3253
3277
+ U 8764 ; WX 838 ; N similar ; G 3254
3278
+ U 8765 ; WX 838 ; N uni223D ; G 3255
3279
+ U 8766 ; WX 838 ; N uni223E ; G 3256
3280
+ U 8767 ; WX 838 ; N uni223F ; G 3257
3281
  U 8768 ; WX 375 ; N uni2240 ; G 3258
3282
  U 8769 ; WX 838 ; N uni2241 ; G 3259
3283
  U 8770 ; WX 838 ; N uni2242 ; G 3260
3284
  U 8771 ; WX 838 ; N uni2243 ; G 3261
3285
  U 8772 ; WX 838 ; N uni2244 ; G 3262
3286
+ U 8773 ; WX 838 ; N congruent ; G 3263
3287
  U 8774 ; WX 838 ; N uni2246 ; G 3264
3288
  U 8775 ; WX 838 ; N uni2247 ; G 3265
3289
+ U 8776 ; WX 838 ; N approxequal ; G 3266
3290
  U 8777 ; WX 838 ; N uni2249 ; G 3267
3291
+ U 8778 ; WX 838 ; N uni224A ; G 3268
3292
+ U 8779 ; WX 838 ; N uni224B ; G 3269
3293
+ U 8780 ; WX 838 ; N uni224C ; G 3270
3294
+ U 8781 ; WX 838 ; N uni224D ; G 3271
3295
+ U 8782 ; WX 838 ; N uni224E ; G 3272
3296
+ U 8783 ; WX 838 ; N uni224F ; G 3273
3297
  U 8784 ; WX 838 ; N uni2250 ; G 3274
3298
  U 8785 ; WX 838 ; N uni2251 ; G 3275
3299
  U 8786 ; WX 838 ; N uni2252 ; G 3276
3304
  U 8791 ; WX 838 ; N uni2257 ; G 3281
3305
  U 8792 ; WX 838 ; N uni2258 ; G 3282
3306
  U 8793 ; WX 838 ; N uni2259 ; G 3283
3307
+ U 8794 ; WX 838 ; N uni225A ; G 3284
3308
+ U 8795 ; WX 838 ; N uni225B ; G 3285
3309
+ U 8796 ; WX 838 ; N uni225C ; G 3286
3310
+ U 8797 ; WX 838 ; N uni225D ; G 3287
3311
+ U 8798 ; WX 838 ; N uni225E ; G 3288
3312
+ U 8799 ; WX 838 ; N uni225F ; G 3289
3313
+ U 8800 ; WX 838 ; N notequal ; G 3290
3314
+ U 8801 ; WX 838 ; N equivalence ; G 3291
3315
  U 8802 ; WX 838 ; N uni2262 ; G 3292
3316
  U 8803 ; WX 838 ; N uni2263 ; G 3293
3317
+ U 8804 ; WX 838 ; N lessequal ; G 3294
3318
+ U 8805 ; WX 838 ; N greaterequal ; G 3295
3319
  U 8806 ; WX 838 ; N uni2266 ; G 3296
3320
  U 8807 ; WX 838 ; N uni2267 ; G 3297
3321
  U 8808 ; WX 841 ; N uni2268 ; G 3298
3322
  U 8809 ; WX 841 ; N uni2269 ; G 3299
3323
+ U 8810 ; WX 1047 ; N uni226A ; G 3300
3324
+ U 8811 ; WX 1047 ; N uni226B ; G 3301
3325
+ U 8812 ; WX 500 ; N uni226C ; G 3302
3326
+ U 8813 ; WX 838 ; N uni226D ; G 3303
3327
+ U 8814 ; WX 838 ; N uni226E ; G 3304
3328
+ U 8815 ; WX 838 ; N uni226F ; G 3305
3329
  U 8816 ; WX 838 ; N uni2270 ; G 3306
3330
  U 8817 ; WX 838 ; N uni2271 ; G 3307
3331
  U 8818 ; WX 838 ; N uni2272 ; G 3308
3336
  U 8823 ; WX 838 ; N uni2277 ; G 3313
3337
  U 8824 ; WX 838 ; N uni2278 ; G 3314
3338
  U 8825 ; WX 838 ; N uni2279 ; G 3315
3339
+ U 8826 ; WX 838 ; N uni227A ; G 3316
3340
+ U 8827 ; WX 838 ; N uni227B ; G 3317
3341
+ U 8828 ; WX 838 ; N uni227C ; G 3318
3342
+ U 8829 ; WX 838 ; N uni227D ; G 3319
3343
+ U 8830 ; WX 838 ; N uni227E ; G 3320
3344
+ U 8831 ; WX 838 ; N uni227F ; G 3321
3345
  U 8832 ; WX 838 ; N uni2280 ; G 3322
3346
  U 8833 ; WX 838 ; N uni2281 ; G 3323
3347
+ U 8834 ; WX 838 ; N propersubset ; G 3324
3348
+ U 8835 ; WX 838 ; N propersuperset ; G 3325
3349
+ U 8836 ; WX 838 ; N notsubset ; G 3326
3350
  U 8837 ; WX 838 ; N uni2285 ; G 3327
3351
+ U 8838 ; WX 838 ; N reflexsubset ; G 3328
3352
+ U 8839 ; WX 838 ; N reflexsuperset ; G 3329
3353
  U 8840 ; WX 838 ; N uni2288 ; G 3330
3354
  U 8841 ; WX 838 ; N uni2289 ; G 3331
3355
+ U 8842 ; WX 838 ; N uni228A ; G 3332
3356
+ U 8843 ; WX 838 ; N uni228B ; G 3333
3357
+ U 8844 ; WX 812 ; N uni228C ; G 3334
3358
+ U 8845 ; WX 812 ; N uni228D ; G 3335
3359
+ U 8846 ; WX 812 ; N uni228E ; G 3336
3360
+ U 8847 ; WX 838 ; N uni228F ; G 3337
3361
  U 8848 ; WX 838 ; N uni2290 ; G 3338
3362
  U 8849 ; WX 838 ; N uni2291 ; G 3339
3363
  U 8850 ; WX 838 ; N uni2292 ; G 3340
3364
  U 8851 ; WX 796 ; N uni2293 ; G 3341
3365
  U 8852 ; WX 796 ; N uni2294 ; G 3342
3366
+ U 8853 ; WX 838 ; N circleplus ; G 3343
3367
  U 8854 ; WX 838 ; N uni2296 ; G 3344
3368
+ U 8855 ; WX 838 ; N circlemultiply ; G 3345
3369
  U 8856 ; WX 838 ; N uni2298 ; G 3346
3370
  U 8857 ; WX 838 ; N uni2299 ; G 3347
3371
+ U 8858 ; WX 838 ; N uni229A ; G 3348
3372
+ U 8859 ; WX 838 ; N uni229B ; G 3349
3373
+ U 8860 ; WX 838 ; N uni229C ; G 3350
3374
+ U 8861 ; WX 838 ; N uni229D ; G 3351
3375
+ U 8862 ; WX 838 ; N uni229E ; G 3352
3376
+ U 8863 ; WX 838 ; N uni229F ; G 3353
3377
+ U 8864 ; WX 838 ; N uni22A0 ; G 3354
3378
+ U 8865 ; WX 838 ; N uni22A1 ; G 3355
3379
+ U 8866 ; WX 914 ; N uni22A2 ; G 3356
3380
+ U 8867 ; WX 914 ; N uni22A3 ; G 3357
3381
+ U 8868 ; WX 914 ; N uni22A4 ; G 3358
3382
+ U 8869 ; WX 914 ; N perpendicular ; G 3359
3383
+ U 8870 ; WX 542 ; N uni22A6 ; G 3360
3384
+ U 8871 ; WX 542 ; N uni22A7 ; G 3361
3385
+ U 8872 ; WX 914 ; N uni22A8 ; G 3362
3386
+ U 8873 ; WX 914 ; N uni22A9 ; G 3363
3387
+ U 8874 ; WX 914 ; N uni22AA ; G 3364
3388
+ U 8875 ; WX 914 ; N uni22AB ; G 3365
3389
+ U 8876 ; WX 914 ; N uni22AC ; G 3366
3390
+ U 8877 ; WX 914 ; N uni22AD ; G 3367
3391
+ U 8878 ; WX 914 ; N uni22AE ; G 3368
3392
+ U 8879 ; WX 914 ; N uni22AF ; G 3369
3393
+ U 8880 ; WX 838 ; N uni22B0 ; G 3370
3394
+ U 8881 ; WX 838 ; N uni22B1 ; G 3371
3395
+ U 8882 ; WX 838 ; N uni22B2 ; G 3372
3396
+ U 8883 ; WX 838 ; N uni22B3 ; G 3373
3397
+ U 8884 ; WX 838 ; N uni22B4 ; G 3374
3398
+ U 8885 ; WX 838 ; N uni22B5 ; G 3375
3399
+ U 8886 ; WX 1000 ; N uni22B6 ; G 3376
3400
+ U 8887 ; WX 1000 ; N uni22B7 ; G 3377
3401
+ U 8888 ; WX 838 ; N uni22B8 ; G 3378
3402
+ U 8889 ; WX 838 ; N uni22B9 ; G 3379
3403
+ U 8890 ; WX 542 ; N uni22BA ; G 3380
3404
+ U 8891 ; WX 812 ; N uni22BB ; G 3381
3405
+ U 8892 ; WX 812 ; N uni22BC ; G 3382
3406
+ U 8893 ; WX 812 ; N uni22BD ; G 3383
3407
+ U 8894 ; WX 838 ; N uni22BE ; G 3384
3408
+ U 8895 ; WX 838 ; N uni22BF ; G 3385
3409
+ U 8896 ; WX 843 ; N uni22C0 ; G 3386
3410
+ U 8897 ; WX 843 ; N uni22C1 ; G 3387
3411
+ U 8898 ; WX 843 ; N uni22C2 ; G 3388
3412
+ U 8899 ; WX 843 ; N uni22C3 ; G 3389
3413
+ U 8900 ; WX 494 ; N uni22C4 ; G 3390
3414
+ U 8901 ; WX 380 ; N dotmath ; G 3391
3415
+ U 8902 ; WX 626 ; N uni22C6 ; G 3392
3416
+ U 8903 ; WX 838 ; N uni22C7 ; G 3393
3417
+ U 8904 ; WX 1000 ; N uni22C8 ; G 3394
3418
+ U 8905 ; WX 1000 ; N uni22C9 ; G 3395
3419
+ U 8906 ; WX 1000 ; N uni22CA ; G 3396
3420
+ U 8907 ; WX 1000 ; N uni22CB ; G 3397
3421
+ U 8908 ; WX 1000 ; N uni22CC ; G 3398
3422
+ U 8909 ; WX 838 ; N uni22CD ; G 3399
3423
+ U 8910 ; WX 812 ; N uni22CE ; G 3400
3424
+ U 8911 ; WX 812 ; N uni22CF ; G 3401
3425
+ U 8912 ; WX 838 ; N uni22D0 ; G 3402
3426
+ U 8913 ; WX 838 ; N uni22D1 ; G 3403
3427
+ U 8914 ; WX 838 ; N uni22D2 ; G 3404
3428
+ U 8915 ; WX 838 ; N uni22D3 ; G 3405
3429
+ U 8916 ; WX 838 ; N uni22D4 ; G 3406
3430
+ U 8917 ; WX 838 ; N uni22D5 ; G 3407
3431
+ U 8918 ; WX 838 ; N uni22D6 ; G 3408
3432
+ U 8919 ; WX 838 ; N uni22D7 ; G 3409
3433
+ U 8920 ; WX 1422 ; N uni22D8 ; G 3410
3434
+ U 8921 ; WX 1422 ; N uni22D9 ; G 3411
3435
+ U 8922 ; WX 838 ; N uni22DA ; G 3412
3436
+ U 8923 ; WX 838 ; N uni22DB ; G 3413
3437
+ U 8924 ; WX 838 ; N uni22DC ; G 3414
3438
+ U 8925 ; WX 838 ; N uni22DD ; G 3415
3439
+ U 8926 ; WX 838 ; N uni22DE ; G 3416
3440
+ U 8927 ; WX 838 ; N uni22DF ; G 3417
3441
+ U 8928 ; WX 838 ; N uni22E0 ; G 3418
3442
+ U 8929 ; WX 838 ; N uni22E1 ; G 3419
3443
+ U 8930 ; WX 838 ; N uni22E2 ; G 3420
3444
+ U 8931 ; WX 838 ; N uni22E3 ; G 3421
3445
+ U 8932 ; WX 838 ; N uni22E4 ; G 3422
3446
+ U 8933 ; WX 838 ; N uni22E5 ; G 3423
3447
+ U 8934 ; WX 838 ; N uni22E6 ; G 3424
3448
+ U 8935 ; WX 838 ; N uni22E7 ; G 3425
3449
+ U 8936 ; WX 838 ; N uni22E8 ; G 3426
3450
+ U 8937 ; WX 838 ; N uni22E9 ; G 3427
3451
+ U 8938 ; WX 838 ; N uni22EA ; G 3428
3452
+ U 8939 ; WX 838 ; N uni22EB ; G 3429
3453
+ U 8940 ; WX 838 ; N uni22EC ; G 3430
3454
+ U 8941 ; WX 838 ; N uni22ED ; G 3431
3455
+ U 8942 ; WX 1000 ; N uni22EE ; G 3432
3456
+ U 8943 ; WX 1000 ; N uni22EF ; G 3433
3457
+ U 8944 ; WX 1000 ; N uni22F0 ; G 3434
3458
+ U 8945 ; WX 1000 ; N uni22F1 ; G 3435
3459
+ U 8946 ; WX 1158 ; N uni22F2 ; G 3436
3460
+ U 8947 ; WX 896 ; N uni22F3 ; G 3437
3461
+ U 8948 ; WX 750 ; N uni22F4 ; G 3438
3462
+ U 8949 ; WX 896 ; N uni22F5 ; G 3439
3463
+ U 8950 ; WX 896 ; N uni22F6 ; G 3440
3464
+ U 8951 ; WX 750 ; N uni22F7 ; G 3441
3465
+ U 8952 ; WX 896 ; N uni22F8 ; G 3442
3466
+ U 8953 ; WX 896 ; N uni22F9 ; G 3443
3467
+ U 8954 ; WX 1158 ; N uni22FA ; G 3444
3468
+ U 8955 ; WX 896 ; N uni22FB ; G 3445
3469
+ U 8956 ; WX 750 ; N uni22FC ; G 3446
3470
+ U 8957 ; WX 896 ; N uni22FD ; G 3447
3471
+ U 8958 ; WX 750 ; N uni22FE ; G 3448
3472
+ U 8959 ; WX 896 ; N uni22FF ; G 3449
3473
  U 8960 ; WX 602 ; N uni2300 ; G 3450
3474
  U 8961 ; WX 602 ; N uni2301 ; G 3451
3475
+ U 8962 ; WX 716 ; N house ; G 3452
3476
  U 8963 ; WX 838 ; N uni2303 ; G 3453
3477
  U 8964 ; WX 838 ; N uni2304 ; G 3454
3478
  U 8965 ; WX 838 ; N uni2305 ; G 3455
3480
  U 8967 ; WX 488 ; N uni2307 ; G 3457
3481
  U 8968 ; WX 457 ; N uni2308 ; G 3458
3482
  U 8969 ; WX 457 ; N uni2309 ; G 3459
3483
+ U 8970 ; WX 457 ; N uni230A ; G 3460
3484
+ U 8971 ; WX 457 ; N uni230B ; G 3461
3485
+ U 8972 ; WX 809 ; N uni230C ; G 3462
3486
+ U 8973 ; WX 809 ; N uni230D ; G 3463
3487
+ U 8974 ; WX 809 ; N uni230E ; G 3464
3488
+ U 8975 ; WX 809 ; N uni230F ; G 3465
3489
+ U 8976 ; WX 838 ; N revlogicalnot ; G 3466
3490
  U 8977 ; WX 539 ; N uni2311 ; G 3467
3491
  U 8984 ; WX 928 ; N uni2318 ; G 3468
3492
  U 8985 ; WX 838 ; N uni2319 ; G 3469
3493
+ U 8988 ; WX 469 ; N uni231C ; G 3470
3494
+ U 8989 ; WX 469 ; N uni231D ; G 3471
3495
+ U 8990 ; WX 469 ; N uni231E ; G 3472
3496
+ U 8991 ; WX 469 ; N uni231F ; G 3473
3497
+ U 8992 ; WX 610 ; N integraltp ; G 3474
3498
+ U 8993 ; WX 610 ; N integralbt ; G 3475
3499
  U 8996 ; WX 1152 ; N uni2324 ; G 3476
3500
  U 8997 ; WX 1152 ; N uni2325 ; G 3477
3501
  U 8998 ; WX 1414 ; N uni2326 ; G 3478
3502
  U 8999 ; WX 1152 ; N uni2327 ; G 3479
3503
  U 9000 ; WX 1443 ; N uni2328 ; G 3480
3504
+ U 9003 ; WX 1414 ; N uni232B ; G 3481
3505
+ U 9004 ; WX 873 ; N uni232C ; G 3482
3506
  U 9075 ; WX 390 ; N uni2373 ; G 3483
3507
  U 9076 ; WX 716 ; N uni2374 ; G 3484
3508
  U 9077 ; WX 869 ; N uni2375 ; G 3485
3509
+ U 9082 ; WX 687 ; N uni237A ; G 3486
3510
+ U 9085 ; WX 863 ; N uni237D ; G 3487
3511
  U 9095 ; WX 1152 ; N uni2387 ; G 3488
3512
  U 9108 ; WX 873 ; N uni2394 ; G 3489
3513
+ U 9115 ; WX 500 ; N uni239B ; G 3490
3514
+ U 9116 ; WX 500 ; N uni239C ; G 3491
3515
+ U 9117 ; WX 500 ; N uni239D ; G 3492
3516
+ U 9118 ; WX 500 ; N uni239E ; G 3493
3517
+ U 9119 ; WX 500 ; N uni239F ; G 3494
3518
+ U 9120 ; WX 500 ; N uni23A0 ; G 3495
3519
+ U 9121 ; WX 500 ; N uni23A1 ; G 3496
3520
+ U 9122 ; WX 500 ; N uni23A2 ; G 3497
3521
+ U 9123 ; WX 500 ; N uni23A3 ; G 3498
3522
+ U 9124 ; WX 500 ; N uni23A4 ; G 3499
3523
+ U 9125 ; WX 500 ; N uni23A5 ; G 3500
3524
+ U 9126 ; WX 500 ; N uni23A6 ; G 3501
3525
+ U 9127 ; WX 750 ; N uni23A7 ; G 3502
3526
+ U 9128 ; WX 750 ; N uni23A8 ; G 3503
3527
+ U 9129 ; WX 750 ; N uni23A9 ; G 3504
3528
+ U 9130 ; WX 750 ; N uni23AA ; G 3505
3529
+ U 9131 ; WX 750 ; N uni23AB ; G 3506
3530
+ U 9132 ; WX 750 ; N uni23AC ; G 3507
3531
+ U 9133 ; WX 750 ; N uni23AD ; G 3508
3532
+ U 9134 ; WX 610 ; N uni23AE ; G 3509
3533
+ U 9166 ; WX 838 ; N uni23CE ; G 3510
3534
+ U 9167 ; WX 945 ; N uni23CF ; G 3511
3535
+ U 9187 ; WX 873 ; N uni23E3 ; G 3512
3536
+ U 9189 ; WX 769 ; N uni23E5 ; G 3513
3537
+ U 9192 ; WX 696 ; N uni23E8 ; G 3514
3538
  U 9250 ; WX 716 ; N uni2422 ; G 3515
3539
  U 9251 ; WX 716 ; N uni2423 ; G 3516
3540
  U 9312 ; WX 847 ; N uni2460 ; G 3517
3547
  U 9319 ; WX 847 ; N uni2467 ; G 3524
3548
  U 9320 ; WX 847 ; N uni2468 ; G 3525
3549
  U 9321 ; WX 847 ; N uni2469 ; G 3526
3550
+ U 9600 ; WX 769 ; N upblock ; G 3527
3551
  U 9601 ; WX 769 ; N uni2581 ; G 3528
3552
  U 9602 ; WX 769 ; N uni2582 ; G 3529
3553
  U 9603 ; WX 769 ; N uni2583 ; G 3530
3554
+ U 9604 ; WX 769 ; N dnblock ; G 3531
3555
  U 9605 ; WX 769 ; N uni2585 ; G 3532
3556
  U 9606 ; WX 769 ; N uni2586 ; G 3533
3557
  U 9607 ; WX 769 ; N uni2587 ; G 3534
3558
+ U 9608 ; WX 769 ; N block ; G 3535
3559
  U 9609 ; WX 769 ; N uni2589 ; G 3536
3560
+ U 9610 ; WX 769 ; N uni258A ; G 3537
3561
+ U 9611 ; WX 769 ; N uni258B ; G 3538
3562
+ U 9612 ; WX 769 ; N lfblock ; G 3539
3563
+ U 9613 ; WX 769 ; N uni258D ; G 3540
3564
+ U 9614 ; WX 769 ; N uni258E ; G 3541
3565
+ U 9615 ; WX 769 ; N uni258F ; G 3542
3566
+ U 9616 ; WX 769 ; N rtblock ; G 3543
3567
+ U 9617 ; WX 769 ; N ltshade ; G 3544
3568
+ U 9618 ; WX 769 ; N shade ; G 3545
3569
+ U 9619 ; WX 769 ; N dkshade ; G 3546
3570
  U 9620 ; WX 769 ; N uni2594 ; G 3547
3571
  U 9621 ; WX 769 ; N uni2595 ; G 3548
3572
  U 9622 ; WX 769 ; N uni2596 ; G 3549
3573
  U 9623 ; WX 769 ; N uni2597 ; G 3550
3574
  U 9624 ; WX 769 ; N uni2598 ; G 3551
3575
  U 9625 ; WX 769 ; N uni2599 ; G 3552
3576
+ U 9626 ; WX 769 ; N uni259A ; G 3553
3577
+ U 9627 ; WX 769 ; N uni259B ; G 3554
3578
+ U 9628 ; WX 769 ; N uni259C ; G 3555
3579
+ U 9629 ; WX 769 ; N uni259D ; G 3556
3580
+ U 9630 ; WX 769 ; N uni259E ; G 3557
3581
+ U 9631 ; WX 769 ; N uni259F ; G 3558
3582
+ U 9632 ; WX 945 ; N filledbox ; G 3559
3583
+ U 9633 ; WX 945 ; N H22073 ; G 3560
3584
+ U 9634 ; WX 945 ; N uni25A2 ; G 3561
3585
+ U 9635 ; WX 945 ; N uni25A3 ; G 3562
3586
+ U 9636 ; WX 945 ; N uni25A4 ; G 3563
3587
+ U 9637 ; WX 945 ; N uni25A5 ; G 3564
3588
+ U 9638 ; WX 945 ; N uni25A6 ; G 3565
3589
+ U 9639 ; WX 945 ; N uni25A7 ; G 3566
3590
+ U 9640 ; WX 945 ; N uni25A8 ; G 3567
3591
+ U 9641 ; WX 945 ; N uni25A9 ; G 3568
3592
+ U 9642 ; WX 678 ; N H18543 ; G 3569
3593
+ U 9643 ; WX 678 ; N H18551 ; G 3570
3594
+ U 9644 ; WX 945 ; N filledrect ; G 3571
3595
+ U 9645 ; WX 945 ; N uni25AD ; G 3572
3596
+ U 9646 ; WX 550 ; N uni25AE ; G 3573
3597
+ U 9647 ; WX 550 ; N uni25AF ; G 3574
3598
+ U 9648 ; WX 769 ; N uni25B0 ; G 3575
3599
+ U 9649 ; WX 769 ; N uni25B1 ; G 3576
3600
+ U 9650 ; WX 769 ; N triagup ; G 3577
3601
+ U 9651 ; WX 769 ; N uni25B3 ; G 3578
3602
+ U 9652 ; WX 502 ; N uni25B4 ; G 3579
3603
+ U 9653 ; WX 502 ; N uni25B5 ; G 3580
3604
+ U 9654 ; WX 769 ; N uni25B6 ; G 3581
3605
+ U 9655 ; WX 769 ; N uni25B7 ; G 3582
3606
+ U 9656 ; WX 502 ; N uni25B8 ; G 3583
3607
+ U 9657 ; WX 502 ; N uni25B9 ; G 3584
3608
+ U 9658 ; WX 769 ; N triagrt ; G 3585
3609
+ U 9659 ; WX 769 ; N uni25BB ; G 3586
3610
+ U 9660 ; WX 769 ; N triagdn ; G 3587
3611
+ U 9661 ; WX 769 ; N uni25BD ; G 3588
3612
+ U 9662 ; WX 502 ; N uni25BE ; G 3589
3613
+ U 9663 ; WX 502 ; N uni25BF ; G 3590
3614
+ U 9664 ; WX 769 ; N uni25C0 ; G 3591
3615
+ U 9665 ; WX 769 ; N uni25C1 ; G 3592
3616
+ U 9666 ; WX 502 ; N uni25C2 ; G 3593
3617
+ U 9667 ; WX 502 ; N uni25C3 ; G 3594
3618
+ U 9668 ; WX 769 ; N triaglf ; G 3595
3619
+ U 9669 ; WX 769 ; N uni25C5 ; G 3596
3620
+ U 9670 ; WX 769 ; N uni25C6 ; G 3597
3621
+ U 9671 ; WX 769 ; N uni25C7 ; G 3598
3622
+ U 9672 ; WX 769 ; N uni25C8 ; G 3599
3623
+ U 9673 ; WX 873 ; N uni25C9 ; G 3600
3624
+ U 9674 ; WX 494 ; N lozenge ; G 3601
3625
+ U 9675 ; WX 873 ; N circle ; G 3602
3626
+ U 9676 ; WX 873 ; N uni25CC ; G 3603
3627
+ U 9677 ; WX 873 ; N uni25CD ; G 3604
3628
+ U 9678 ; WX 873 ; N uni25CE ; G 3605
3629
+ U 9679 ; WX 873 ; N H18533 ; G 3606
3630
+ U 9680 ; WX 873 ; N uni25D0 ; G 3607
3631
+ U 9681 ; WX 873 ; N uni25D1 ; G 3608
3632
+ U 9682 ; WX 873 ; N uni25D2 ; G 3609
3633
+ U 9683 ; WX 873 ; N uni25D3 ; G 3610
3634
+ U 9684 ; WX 873 ; N uni25D4 ; G 3611
3635
+ U 9685 ; WX 873 ; N uni25D5 ; G 3612
3636
+ U 9686 ; WX 527 ; N uni25D6 ; G 3613
3637
+ U 9687 ; WX 527 ; N uni25D7 ; G 3614
3638
+ U 9688 ; WX 840 ; N invbullet ; G 3615
3639
+ U 9689 ; WX 970 ; N invcircle ; G 3616
3640
+ U 9690 ; WX 970 ; N uni25DA ; G 3617
3641
+ U 9691 ; WX 970 ; N uni25DB ; G 3618
3642
+ U 9692 ; WX 387 ; N uni25DC ; G 3619
3643
+ U 9693 ; WX 387 ; N uni25DD ; G 3620
3644
+ U 9694 ; WX 387 ; N uni25DE ; G 3621
3645
+ U 9695 ; WX 387 ; N uni25DF ; G 3622
3646
+ U 9696 ; WX 769 ; N uni25E0 ; G 3623
3647
+ U 9697 ; WX 769 ; N uni25E1 ; G 3624
3648
+ U 9698 ; WX 769 ; N uni25E2 ; G 3625
3649
+ U 9699 ; WX 769 ; N uni25E3 ; G 3626
3650
+ U 9700 ; WX 769 ; N uni25E4 ; G 3627
3651
+ U 9701 ; WX 769 ; N uni25E5 ; G 3628
3652
+ U 9702 ; WX 639 ; N openbullet ; G 3629
3653
+ U 9703 ; WX 945 ; N uni25E7 ; G 3630
3654
+ U 9704 ; WX 945 ; N uni25E8 ; G 3631
3655
+ U 9705 ; WX 945 ; N uni25E9 ; G 3632
3656
+ U 9706 ; WX 945 ; N uni25EA ; G 3633
3657
+ U 9707 ; WX 945 ; N uni25EB ; G 3634
3658
+ U 9708 ; WX 769 ; N uni25EC ; G 3635
3659
+ U 9709 ; WX 769 ; N uni25ED ; G 3636
3660
+ U 9710 ; WX 769 ; N uni25EE ; G 3637
3661
+ U 9711 ; WX 1119 ; N uni25EF ; G 3638
3662
+ U 9712 ; WX 945 ; N uni25F0 ; G 3639
3663
+ U 9713 ; WX 945 ; N uni25F1 ; G 3640
3664
+ U 9714 ; WX 945 ; N uni25F2 ; G 3641
3665
+ U 9715 ; WX 945 ; N uni25F3 ; G 3642
3666
+ U 9716 ; WX 873 ; N uni25F4 ; G 3643
3667
+ U 9717 ; WX 873 ; N uni25F5 ; G 3644
3668
+ U 9718 ; WX 873 ; N uni25F6 ; G 3645
3669
+ U 9719 ; WX 873 ; N uni25F7 ; G 3646
3670
+ U 9720 ; WX 769 ; N uni25F8 ; G 3647
3671
+ U 9721 ; WX 769 ; N uni25F9 ; G 3648
3672
+ U 9722 ; WX 769 ; N uni25FA ; G 3649
3673
+ U 9723 ; WX 830 ; N uni25FB ; G 3650
3674
+ U 9724 ; WX 830 ; N uni25FC ; G 3651
3675
+ U 9725 ; WX 732 ; N uni25FD ; G 3652
3676
+ U 9726 ; WX 732 ; N uni25FE ; G 3653
3677
+ U 9727 ; WX 769 ; N uni25FF ; G 3654
3678
  U 9728 ; WX 896 ; N uni2600 ; G 3655
3679
  U 9729 ; WX 1000 ; N uni2601 ; G 3656
3680
  U 9730 ; WX 896 ; N uni2602 ; G 3657
3685
  U 9735 ; WX 573 ; N uni2607 ; G 3662
3686
  U 9736 ; WX 896 ; N uni2608 ; G 3663
3687
  U 9737 ; WX 896 ; N uni2609 ; G 3664
3688
+ U 9738 ; WX 888 ; N uni260A ; G 3665
3689
+ U 9739 ; WX 888 ; N uni260B ; G 3666
3690
+ U 9740 ; WX 671 ; N uni260C ; G 3667
3691
+ U 9741 ; WX 1013 ; N uni260D ; G 3668
3692
+ U 9742 ; WX 1246 ; N uni260E ; G 3669
3693
+ U 9743 ; WX 1250 ; N uni260F ; G 3670
3694
  U 9744 ; WX 896 ; N uni2610 ; G 3671
3695
  U 9745 ; WX 896 ; N uni2611 ; G 3672
3696
  U 9746 ; WX 896 ; N uni2612 ; G 3673
3701
  U 9751 ; WX 896 ; N uni2617 ; G 3678
3702
  U 9752 ; WX 896 ; N uni2618 ; G 3679
3703
  U 9753 ; WX 896 ; N uni2619 ; G 3680
3704
+ U 9754 ; WX 896 ; N uni261A ; G 3681
3705
+ U 9755 ; WX 896 ; N uni261B ; G 3682
3706
+ U 9756 ; WX 896 ; N uni261C ; G 3683
3707
+ U 9757 ; WX 609 ; N uni261D ; G 3684
3708
+ U 9758 ; WX 896 ; N uni261E ; G 3685
3709
+ U 9759 ; WX 609 ; N uni261F ; G 3686
3710
  U 9760 ; WX 896 ; N uni2620 ; G 3687
3711
  U 9761 ; WX 896 ; N uni2621 ; G 3688
3712
  U 9762 ; WX 896 ; N uni2622 ; G 3689
3717
  U 9767 ; WX 784 ; N uni2627 ; G 3694
3718
  U 9768 ; WX 545 ; N uni2628 ; G 3695
3719
  U 9769 ; WX 896 ; N uni2629 ; G 3696
3720
+ U 9770 ; WX 896 ; N uni262A ; G 3697
3721
+ U 9771 ; WX 896 ; N uni262B ; G 3698
3722
+ U 9772 ; WX 710 ; N uni262C ; G 3699
3723
+ U 9773 ; WX 896 ; N uni262D ; G 3700
3724
+ U 9774 ; WX 896 ; N uni262E ; G 3701
3725
+ U 9775 ; WX 896 ; N uni262F ; G 3702
3726
  U 9776 ; WX 896 ; N uni2630 ; G 3703
3727
  U 9777 ; WX 896 ; N uni2631 ; G 3704
3728
  U 9778 ; WX 896 ; N uni2632 ; G 3705
3733
  U 9783 ; WX 896 ; N uni2637 ; G 3710
3734
  U 9784 ; WX 896 ; N uni2638 ; G 3711
3735
  U 9785 ; WX 896 ; N uni2639 ; G 3712
3736
+ U 9786 ; WX 896 ; N smileface ; G 3713
3737
+ U 9787 ; WX 896 ; N invsmileface ; G 3714
3738
+ U 9788 ; WX 896 ; N sun ; G 3715
3739
+ U 9789 ; WX 896 ; N uni263D ; G 3716
3740
+ U 9790 ; WX 896 ; N uni263E ; G 3717
3741
+ U 9791 ; WX 614 ; N uni263F ; G 3718
3742
+ U 9792 ; WX 732 ; N female ; G 3719
3743
  U 9793 ; WX 732 ; N uni2641 ; G 3720
3744
+ U 9794 ; WX 896 ; N male ; G 3721
3745
  U 9795 ; WX 896 ; N uni2643 ; G 3722
3746
  U 9796 ; WX 896 ; N uni2644 ; G 3723
3747
  U 9797 ; WX 896 ; N uni2645 ; G 3724
3749
  U 9799 ; WX 896 ; N uni2647 ; G 3726
3750
  U 9800 ; WX 896 ; N uni2648 ; G 3727
3751
  U 9801 ; WX 896 ; N uni2649 ; G 3728
3752
+ U 9802 ; WX 896 ; N uni264A ; G 3729
3753
+ U 9803 ; WX 896 ; N uni264B ; G 3730
3754
+ U 9804 ; WX 896 ; N uni264C ; G 3731
3755
+ U 9805 ; WX 896 ; N uni264D ; G 3732
3756
+ U 9806 ; WX 896 ; N uni264E ; G 3733
3757
+ U 9807 ; WX 896 ; N uni264F ; G 3734
3758
  U 9808 ; WX 896 ; N uni2650 ; G 3735
3759
  U 9809 ; WX 896 ; N uni2651 ; G 3736
3760
  U 9810 ; WX 896 ; N uni2652 ; G 3737
3765
  U 9815 ; WX 896 ; N uni2657 ; G 3742
3766
  U 9816 ; WX 896 ; N uni2658 ; G 3743
3767
  U 9817 ; WX 896 ; N uni2659 ; G 3744
3768
+ U 9818 ; WX 896 ; N uni265A ; G 3745
3769
+ U 9819 ; WX 896 ; N uni265B ; G 3746
3770
+ U 9820 ; WX 896 ; N uni265C ; G 3747
3771
+ U 9821 ; WX 896 ; N uni265D ; G 3748
3772
+ U 9822 ; WX 896 ; N uni265E ; G 3749
3773
+ U 9823 ; WX 896 ; N uni265F ; G 3750
3774
+ U 9824 ; WX 896 ; N spade ; G 3751
3775
  U 9825 ; WX 896 ; N uni2661 ; G 3752
3776
  U 9826 ; WX 896 ; N uni2662 ; G 3753
3777
+ U 9827 ; WX 896 ; N club ; G 3754
3778
  U 9828 ; WX 896 ; N uni2664 ; G 3755
3779
+ U 9829 ; WX 896 ; N heart ; G 3756
3780
+ U 9830 ; WX 896 ; N diamond ; G 3757
3781
  U 9831 ; WX 896 ; N uni2667 ; G 3758
3782
  U 9832 ; WX 896 ; N uni2668 ; G 3759
3783
  U 9833 ; WX 472 ; N uni2669 ; G 3760
3784
+ U 9834 ; WX 638 ; N musicalnote ; G 3761
3785
+ U 9835 ; WX 896 ; N musicalnotedbl ; G 3762
3786
+ U 9836 ; WX 896 ; N uni266C ; G 3763
3787
+ U 9837 ; WX 472 ; N uni266D ; G 3764
3788
+ U 9838 ; WX 357 ; N uni266E ; G 3765
3789
+ U 9839 ; WX 484 ; N uni266F ; G 3766
3790
  U 9840 ; WX 748 ; N uni2670 ; G 3767
3791
  U 9841 ; WX 766 ; N uni2671 ; G 3768
3792
  U 9842 ; WX 896 ; N uni2672 ; G 3769
3797
  U 9847 ; WX 896 ; N uni2677 ; G 3774
3798
  U 9848 ; WX 896 ; N uni2678 ; G 3775
3799
  U 9849 ; WX 896 ; N uni2679 ; G 3776
3800
+ U 9850 ; WX 896 ; N uni267A ; G 3777
3801
+ U 9851 ; WX 896 ; N uni267B ; G 3778
3802
+ U 9852 ; WX 896 ; N uni267C ; G 3779
3803
+ U 9853 ; WX 896 ; N uni267D ; G 3780
3804
+ U 9854 ; WX 896 ; N uni267E ; G 3781
3805
+ U 9855 ; WX 896 ; N uni267F ; G 3782
3806
  U 9856 ; WX 869 ; N uni2680 ; G 3783
3807
  U 9857 ; WX 869 ; N uni2681 ; G 3784
3808
  U 9858 ; WX 869 ; N uni2682 ; G 3785
3813
  U 9863 ; WX 896 ; N uni2687 ; G 3790
3814
  U 9864 ; WX 896 ; N uni2688 ; G 3791
3815
  U 9865 ; WX 896 ; N uni2689 ; G 3792
3816
+ U 9866 ; WX 896 ; N uni268A ; G 3793
3817
+ U 9867 ; WX 896 ; N uni268B ; G 3794
3818
+ U 9868 ; WX 896 ; N uni268C ; G 3795
3819
+ U 9869 ; WX 896 ; N uni268D ; G 3796
3820
+ U 9870 ; WX 896 ; N uni268E ; G 3797
3821
+ U 9871 ; WX 896 ; N uni268F ; G 3798
3822
  U 9872 ; WX 896 ; N uni2690 ; G 3799
3823
  U 9873 ; WX 896 ; N uni2691 ; G 3800
3824
  U 9874 ; WX 896 ; N uni2692 ; G 3801
3829
  U 9879 ; WX 896 ; N uni2697 ; G 3806
3830
  U 9880 ; WX 896 ; N uni2698 ; G 3807
3831
  U 9881 ; WX 896 ; N uni2699 ; G 3808
3832
+ U 9882 ; WX 896 ; N uni269A ; G 3809
3833
+ U 9883 ; WX 896 ; N uni269B ; G 3810
3834
+ U 9884 ; WX 896 ; N uni269C ; G 3811
3835
+ U 9888 ; WX 896 ; N uni26A0 ; G 3812
3836
+ U 9889 ; WX 702 ; N uni26A1 ; G 3813
3837
+ U 9890 ; WX 1004 ; N uni26A2 ; G 3814
3838
+ U 9891 ; WX 1089 ; N uni26A3 ; G 3815
3839
+ U 9892 ; WX 1175 ; N uni26A4 ; G 3816
3840
+ U 9893 ; WX 903 ; N uni26A5 ; G 3817
3841
+ U 9894 ; WX 838 ; N uni26A6 ; G 3818
3842
+ U 9895 ; WX 838 ; N uni26A7 ; G 3819
3843
+ U 9896 ; WX 838 ; N uni26A8 ; G 3820
3844
+ U 9897 ; WX 838 ; N uni26A9 ; G 3821
3845
+ U 9898 ; WX 838 ; N uni26AA ; G 3822
3846
+ U 9899 ; WX 838 ; N uni26AB ; G 3823
3847
+ U 9900 ; WX 838 ; N uni26AC ; G 3824
3848
+ U 9901 ; WX 838 ; N uni26AD ; G 3825
3849
+ U 9902 ; WX 838 ; N uni26AE ; G 3826
3850
+ U 9903 ; WX 838 ; N uni26AF ; G 3827
3851
+ U 9904 ; WX 844 ; N uni26B0 ; G 3828
3852
+ U 9905 ; WX 838 ; N uni26B1 ; G 3829
3853
+ U 9906 ; WX 732 ; N uni26B2 ; G 3830
3854
+ U 9907 ; WX 732 ; N uni26B3 ; G 3831
3855
+ U 9908 ; WX 732 ; N uni26B4 ; G 3832
3856
+ U 9909 ; WX 732 ; N uni26B5 ; G 3833
3857
+ U 9910 ; WX 850 ; N uni26B6 ; G 3834
3858
+ U 9911 ; WX 732 ; N uni26B7 ; G 3835
3859
+ U 9912 ; WX 732 ; N uni26B8 ; G 3836
3860
+ U 9920 ; WX 838 ; N uni26C0 ; G 3837
3861
+ U 9921 ; WX 838 ; N uni26C1 ; G 3838
3862
+ U 9922 ; WX 838 ; N uni26C2 ; G 3839
3863
+ U 9923 ; WX 838 ; N uni26C3 ; G 3840
3864
  U 9985 ; WX 838 ; N uni2701 ; G 3841
3865
  U 9986 ; WX 838 ; N uni2702 ; G 3842
3866
  U 9987 ; WX 838 ; N uni2703 ; G 3843
3869
  U 9991 ; WX 838 ; N uni2707 ; G 3846
3870
  U 9992 ; WX 838 ; N uni2708 ; G 3847
3871
  U 9993 ; WX 838 ; N uni2709 ; G 3848
3872
+ U 9996 ; WX 838 ; N uni270C ; G 3849
3873
+ U 9997 ; WX 838 ; N uni270D ; G 3850
3874
+ U 9998 ; WX 838 ; N uni270E ; G 3851
3875
+ U 9999 ; WX 838 ; N uni270F ; G 3852
3876
  U 10000 ; WX 838 ; N uni2710 ; G 3853
3877
  U 10001 ; WX 838 ; N uni2711 ; G 3854
3878
  U 10002 ; WX 838 ; N uni2712 ; G 3855
3883
  U 10007 ; WX 838 ; N uni2717 ; G 3860
3884
  U 10008 ; WX 838 ; N uni2718 ; G 3861
3885
  U 10009 ; WX 838 ; N uni2719 ; G 3862
3886
+ U 10010 ; WX 838 ; N uni271A ; G 3863
3887
+ U 10011 ; WX 838 ; N uni271B ; G 3864
3888
+ U 10012 ; WX 838 ; N uni271C ; G 3865
3889
+ U 10013 ; WX 838 ; N uni271D ; G 3866
3890
+ U 10014 ; WX 838 ; N uni271E ; G 3867
3891
+ U 10015 ; WX 838 ; N uni271F ; G 3868
3892
  U 10016 ; WX 838 ; N uni2720 ; G 3869
3893
  U 10017 ; WX 838 ; N uni2721 ; G 3870
3894
  U 10018 ; WX 838 ; N uni2722 ; G 3871
3898
  U 10022 ; WX 838 ; N uni2726 ; G 3875
3899
  U 10023 ; WX 838 ; N uni2727 ; G 3876
3900
  U 10025 ; WX 838 ; N uni2729 ; G 3877
3901
+ U 10026 ; WX 838 ; N uni272A ; G 3878
3902
+ U 10027 ; WX 838 ; N uni272B ; G 3879
3903
+ U 10028 ; WX 838 ; N uni272C ; G 3880
3904
+ U 10029 ; WX 838 ; N uni272D ; G 3881
3905
+ U 10030 ; WX 838 ; N uni272E ; G 3882
3906
+ U 10031 ; WX 838 ; N uni272F ; G 3883
3907
  U 10032 ; WX 838 ; N uni2730 ; G 3884
3908
  U 10033 ; WX 838 ; N uni2731 ; G 3885
3909
  U 10034 ; WX 838 ; N uni2732 ; G 3886
3914
  U 10039 ; WX 838 ; N uni2737 ; G 3891
3915
  U 10040 ; WX 838 ; N uni2738 ; G 3892
3916
  U 10041 ; WX 838 ; N uni2739 ; G 3893
3917
+ U 10042 ; WX 838 ; N uni273A ; G 3894
3918
+ U 10043 ; WX 838 ; N uni273B ; G 3895
3919
+ U 10044 ; WX 838 ; N uni273C ; G 3896
3920
+ U 10045 ; WX 838 ; N uni273D ; G 3897
3921
+ U 10046 ; WX 838 ; N uni273E ; G 3898
3922
+ U 10047 ; WX 838 ; N uni273F ; G 3899
3923
  U 10048 ; WX 838 ; N uni2740 ; G 3900
3924
  U 10049 ; WX 838 ; N uni2741 ; G 3901
3925
  U 10050 ; WX 838 ; N uni2742 ; G 3902
3930
  U 10055 ; WX 838 ; N uni2747 ; G 3907
3931
  U 10056 ; WX 838 ; N uni2748 ; G 3908
3932
  U 10057 ; WX 838 ; N uni2749 ; G 3909
3933
+ U 10058 ; WX 838 ; N uni274A ; G 3910
3934
+ U 10059 ; WX 838 ; N uni274B ; G 3911
3935
+ U 10061 ; WX 896 ; N uni274D ; G 3912
3936
+ U 10063 ; WX 896 ; N uni274F ; G 3913
3937
  U 10064 ; WX 896 ; N uni2750 ; G 3914
3938
  U 10065 ; WX 896 ; N uni2751 ; G 3915
3939
  U 10066 ; WX 896 ; N uni2752 ; G 3916
3940
  U 10070 ; WX 896 ; N uni2756 ; G 3917
3941
  U 10072 ; WX 838 ; N uni2758 ; G 3918
3942
  U 10073 ; WX 838 ; N uni2759 ; G 3919
3943
+ U 10074 ; WX 838 ; N uni275A ; G 3920
3944
+ U 10075 ; WX 347 ; N uni275B ; G 3921
3945
+ U 10076 ; WX 347 ; N uni275C ; G 3922
3946
+ U 10077 ; WX 587 ; N uni275D ; G 3923
3947
+ U 10078 ; WX 587 ; N uni275E ; G 3924
3948
  U 10081 ; WX 838 ; N uni2761 ; G 3925
3949
  U 10082 ; WX 838 ; N uni2762 ; G 3926
3950
  U 10083 ; WX 838 ; N uni2763 ; G 3927
3954
  U 10087 ; WX 838 ; N uni2767 ; G 3931
3955
  U 10088 ; WX 838 ; N uni2768 ; G 3932
3956
  U 10089 ; WX 838 ; N uni2769 ; G 3933
3957
+ U 10090 ; WX 838 ; N uni276A ; G 3934
3958
+ U 10091 ; WX 838 ; N uni276B ; G 3935
3959
+ U 10092 ; WX 838 ; N uni276C ; G 3936
3960
+ U 10093 ; WX 838 ; N uni276D ; G 3937
3961
+ U 10094 ; WX 838 ; N uni276E ; G 3938
3962
+ U 10095 ; WX 838 ; N uni276F ; G 3939
3963
  U 10096 ; WX 838 ; N uni2770 ; G 3940
3964
  U 10097 ; WX 838 ; N uni2771 ; G 3941
3965
  U 10098 ; WX 838 ; N uni2772 ; G 3942
3970
  U 10103 ; WX 847 ; N uni2777 ; G 3947
3971
  U 10104 ; WX 847 ; N uni2778 ; G 3948
3972
  U 10105 ; WX 847 ; N uni2779 ; G 3949
3973
+ U 10106 ; WX 847 ; N uni277A ; G 3950
3974
+ U 10107 ; WX 847 ; N uni277B ; G 3951
3975
+ U 10108 ; WX 847 ; N uni277C ; G 3952
3976
+ U 10109 ; WX 847 ; N uni277D ; G 3953
3977
+ U 10110 ; WX 847 ; N uni277E ; G 3954
3978
+ U 10111 ; WX 847 ; N uni277F ; G 3955
3979
  U 10112 ; WX 838 ; N uni2780 ; G 3956
3980
  U 10113 ; WX 838 ; N uni2781 ; G 3957
3981
  U 10114 ; WX 838 ; N uni2782 ; G 3958
3986
  U 10119 ; WX 838 ; N uni2787 ; G 3963
3987
  U 10120 ; WX 838 ; N uni2788 ; G 3964
3988
  U 10121 ; WX 838 ; N uni2789 ; G 3965
3989
+ U 10122 ; WX 838 ; N uni278A ; G 3966
3990
+ U 10123 ; WX 838 ; N uni278B ; G 3967
3991
+ U 10124 ; WX 838 ; N uni278C ; G 3968
3992
+ U 10125 ; WX 838 ; N uni278D ; G 3969
3993
+ U 10126 ; WX 838 ; N uni278E ; G 3970
3994
+ U 10127 ; WX 838 ; N uni278F ; G 3971
3995
  U 10128 ; WX 838 ; N uni2790 ; G 3972
3996
  U 10129 ; WX 838 ; N uni2791 ; G 3973
3997
  U 10130 ; WX 838 ; N uni2792 ; G 3974
3999
  U 10132 ; WX 838 ; N uni2794 ; G 3976
4000
  U 10136 ; WX 838 ; N uni2798 ; G 3977
4001
  U 10137 ; WX 838 ; N uni2799 ; G 3978
4002
+ U 10138 ; WX 838 ; N uni279A ; G 3979
4003
+ U 10139 ; WX 838 ; N uni279B ; G 3980
4004
+ U 10140 ; WX 838 ; N uni279C ; G 3981
4005
+ U 10141 ; WX 838 ; N uni279D ; G 3982
4006
+ U 10142 ; WX 838 ; N uni279E ; G 3983
4007
+ U 10143 ; WX 838 ; N uni279F ; G 3984
4008
+ U 10144 ; WX 838 ; N uni27A0 ; G 3985
4009
+ U 10145 ; WX 838 ; N uni27A1 ; G 3986
4010
+ U 10146 ; WX 838 ; N uni27A2 ; G 3987
4011
+ U 10147 ; WX 838 ; N uni27A3 ; G 3988
4012
+ U 10148 ; WX 838 ; N uni27A4 ; G 3989
4013
+ U 10149 ; WX 838 ; N uni27A5 ; G 3990
4014
+ U 10150 ; WX 838 ; N uni27A6 ; G 3991
4015
+ U 10151 ; WX 838 ; N uni27A7 ; G 3992
4016
+ U 10152 ; WX 838 ; N uni27A8 ; G 3993
4017
+ U 10153 ; WX 838 ; N uni27A9 ; G 3994
4018
+ U 10154 ; WX 838 ; N uni27AA ; G 3995
4019
+ U 10155 ; WX 838 ; N uni27AB ; G 3996
4020
+ U 10156 ; WX 838 ; N uni27AC ; G 3997
4021
+ U 10157 ; WX 838 ; N uni27AD ; G 3998
4022
+ U 10158 ; WX 838 ; N uni27AE ; G 3999
4023
+ U 10159 ; WX 838 ; N uni27AF ; G 4000
4024
+ U 10161 ; WX 838 ; N uni27B1 ; G 4001
4025
+ U 10162 ; WX 838 ; N uni27B2 ; G 4002
4026
+ U 10163 ; WX 838 ; N uni27B3 ; G 4003
4027
+ U 10164 ; WX 838 ; N uni27B4 ; G 4004
4028
+ U 10165 ; WX 838 ; N uni27B5 ; G 4005
4029
+ U 10166 ; WX 838 ; N uni27B6 ; G 4006
4030
+ U 10167 ; WX 838 ; N uni27B7 ; G 4007
4031
+ U 10168 ; WX 838 ; N uni27B8 ; G 4008
4032
+ U 10169 ; WX 838 ; N uni27B9 ; G 4009
4033
+ U 10170 ; WX 838 ; N uni27BA ; G 4010
4034
+ U 10171 ; WX 838 ; N uni27BB ; G 4011
4035
+ U 10172 ; WX 838 ; N uni27BC ; G 4012
4036
+ U 10173 ; WX 838 ; N uni27BD ; G 4013
4037
+ U 10174 ; WX 838 ; N uni27BE ; G 4014
4038
+ U 10181 ; WX 457 ; N uni27C5 ; G 4015
4039
+ U 10182 ; WX 457 ; N uni27C6 ; G 4016
4040
+ U 10208 ; WX 494 ; N uni27E0 ; G 4017
4041
+ U 10214 ; WX 487 ; N uni27E6 ; G 4018
4042
+ U 10215 ; WX 487 ; N uni27E7 ; G 4019
4043
+ U 10216 ; WX 457 ; N uni27E8 ; G 4020
4044
+ U 10217 ; WX 457 ; N uni27E9 ; G 4021
4045
+ U 10218 ; WX 721 ; N uni27EA ; G 4022
4046
+ U 10219 ; WX 721 ; N uni27EB ; G 4023
4047
+ U 10224 ; WX 838 ; N uni27F0 ; G 4024
4048
+ U 10225 ; WX 838 ; N uni27F1 ; G 4025
4049
+ U 10226 ; WX 838 ; N uni27F2 ; G 4026
4050
+ U 10227 ; WX 838 ; N uni27F3 ; G 4027
4051
+ U 10228 ; WX 1157 ; N uni27F4 ; G 4028
4052
+ U 10229 ; WX 1434 ; N uni27F5 ; G 4029
4053
+ U 10230 ; WX 1434 ; N uni27F6 ; G 4030
4054
+ U 10231 ; WX 1434 ; N uni27F7 ; G 4031
4055
+ U 10232 ; WX 1434 ; N uni27F8 ; G 4032
4056
+ U 10233 ; WX 1434 ; N uni27F9 ; G 4033
4057
+ U 10234 ; WX 1434 ; N uni27FA ; G 4034
4058
+ U 10235 ; WX 1434 ; N uni27FB ; G 4035
4059
+ U 10236 ; WX 1434 ; N uni27FC ; G 4036
4060
+ U 10237 ; WX 1434 ; N uni27FD ; G 4037
4061
+ U 10238 ; WX 1434 ; N uni27FE ; G 4038
4062
+ U 10239 ; WX 1434 ; N uni27FF ; G 4039
4063
  U 10240 ; WX 781 ; N uni2800 ; G 4040
4064
  U 10241 ; WX 781 ; N uni2801 ; G 4041
4065
  U 10242 ; WX 781 ; N uni2802 ; G 4042
4070
  U 10247 ; WX 781 ; N uni2807 ; G 4047
4071
  U 10248 ; WX 781 ; N uni2808 ; G 4048
4072
  U 10249 ; WX 781 ; N uni2809 ; G 4049
4073
+ U 10250 ; WX 781 ; N uni280A ; G 4050
4074
+ U 10251 ; WX 781 ; N uni280B ; G 4051
4075
+ U 10252 ; WX 781 ; N uni280C ; G 4052
4076
+ U 10253 ; WX 781 ; N uni280D ; G 4053
4077
+ U 10254 ; WX 781 ; N uni280E ; G 4054
4078
+ U 10255 ; WX 781 ; N uni280F ; G 4055
4079
  U 10256 ; WX 781 ; N uni2810 ; G 4056
4080
  U 10257 ; WX 781 ; N uni2811 ; G 4057
4081
  U 10258 ; WX 781 ; N uni2812 ; G 4058
4086
  U 10263 ; WX 781 ; N uni2817 ; G 4063
4087
  U 10264 ; WX 781 ; N uni2818 ; G 4064
4088
  U 10265 ; WX 781 ; N uni2819 ; G 4065
4089
+ U 10266 ; WX 781 ; N uni281A ; G 4066
4090
+ U 10267 ; WX 781 ; N uni281B ; G 4067
4091
+ U 10268 ; WX 781 ; N uni281C ; G 4068
4092
+ U 10269 ; WX 781 ; N uni281D ; G 4069
4093
+ U 10270 ; WX 781 ; N uni281E ; G 4070
4094
+ U 10271 ; WX 781 ; N uni281F ; G 4071
4095
  U 10272 ; WX 781 ; N uni2820 ; G 4072
4096
  U 10273 ; WX 781 ; N uni2821 ; G 4073
4097
  U 10274 ; WX 781 ; N uni2822 ; G 4074
4102
  U 10279 ; WX 781 ; N uni2827 ; G 4079
4103
  U 10280 ; WX 781 ; N uni2828 ; G 4080
4104
  U 10281 ; WX 781 ; N uni2829 ; G 4081
4105
+ U 10282 ; WX 781 ; N uni282A ; G 4082
4106
+ U 10283 ; WX 781 ; N uni282B ; G 4083
4107
+ U 10284 ; WX 781 ; N uni282C ; G 4084
4108
+ U 10285 ; WX 781 ; N uni282D ; G 4085
4109
+ U 10286 ; WX 781 ; N uni282E ; G 4086
4110
+ U 10287 ; WX 781 ; N uni282F ; G 4087
4111
  U 10288 ; WX 781 ; N uni2830 ; G 4088
4112
  U 10289 ; WX 781 ; N uni2831 ; G 4089
4113
  U 10290 ; WX 781 ; N uni2832 ; G 4090
4118
  U 10295 ; WX 781 ; N uni2837 ; G 4095
4119
  U 10296 ; WX 781 ; N uni2838 ; G 4096
4120
  U 10297 ; WX 781 ; N uni2839 ; G 4097
4121
+ U 10298 ; WX 781 ; N uni283A ; G 4098
4122
+ U 10299 ; WX 781 ; N uni283B ; G 4099
4123
+ U 10300 ; WX 781 ; N uni283C ; G 4100
4124
+ U 10301 ; WX 781 ; N uni283D ; G 4101
4125
+ U 10302 ; WX 781 ; N uni283E ; G 4102
4126
+ U 10303 ; WX 781 ; N uni283F ; G 4103
4127
  U 10304 ; WX 781 ; N uni2840 ; G 4104
4128
  U 10305 ; WX 781 ; N uni2841 ; G 4105
4129
  U 10306 ; WX 781 ; N uni2842 ; G 4106
4134
  U 10311 ; WX 781 ; N uni2847 ; G 4111
4135
  U 10312 ; WX 781 ; N uni2848 ; G 4112
4136
  U 10313 ; WX 781 ; N uni2849 ; G 4113
4137
+ U 10314 ; WX 781 ; N uni284A ; G 4114
4138
+ U 10315 ; WX 781 ; N uni284B ; G 4115
4139
+ U 10316 ; WX 781 ; N uni284C ; G 4116
4140
+ U 10317 ; WX 781 ; N uni284D ; G 4117
4141
+ U 10318 ; WX 781 ; N uni284E ; G 4118
4142
+ U 10319 ; WX 781 ; N uni284F ; G 4119
4143
  U 10320 ; WX 781 ; N uni2850 ; G 4120
4144
  U 10321 ; WX 781 ; N uni2851 ; G 4121
4145
  U 10322 ; WX 781 ; N uni2852 ; G 4122
4150
  U 10327 ; WX 781 ; N uni2857 ; G 4127
4151
  U 10328 ; WX 781 ; N uni2858 ; G 4128
4152
  U 10329 ; WX 781 ; N uni2859 ; G 4129
4153
+ U 10330 ; WX 781 ; N uni285A ; G 4130
4154
+ U 10331 ; WX 781 ; N uni285B ; G 4131
4155
+ U 10332 ; WX 781 ; N uni285C ; G 4132
4156
+ U 10333 ; WX 781 ; N uni285D ; G 4133
4157
+ U 10334 ; WX 781 ; N uni285E ; G 4134
4158
+ U 10335 ; WX 781 ; N uni285F ; G 4135
4159
  U 10336 ; WX 781 ; N uni2860 ; G 4136
4160
  U 10337 ; WX 781 ; N uni2861 ; G 4137
4161
  U 10338 ; WX 781 ; N uni2862 ; G 4138
4166
  U 10343 ; WX 781 ; N uni2867 ; G 4143
4167
  U 10344 ; WX 781 ; N uni2868 ; G 4144
4168
  U 10345 ; WX 781 ; N uni2869 ; G 4145
4169
+ U 10346 ; WX 781 ; N uni286A ; G 4146
4170
+ U 10347 ; WX 781 ; N uni286B ; G 4147
4171
+ U 10348 ; WX 781 ; N uni286C ; G 4148
4172
+ U 10349 ; WX 781 ; N uni286D ; G 4149
4173
+ U 10350 ; WX 781 ; N uni286E ; G 4150
4174
+ U 10351 ; WX 781 ; N uni286F ; G 4151
4175
  U 10352 ; WX 781 ; N uni2870 ; G 4152
4176
  U 10353 ; WX 781 ; N uni2871 ; G 4153
4177
  U 10354 ; WX 781 ; N uni2872 ; G 4154
4182
  U 10359 ; WX 781 ; N uni2877 ; G 4159
4183
  U 10360 ; WX 781 ; N uni2878 ; G 4160
4184
  U 10361 ; WX 781 ; N uni2879 ; G 4161
4185
+ U 10362 ; WX 781 ; N uni287A ; G 4162
4186
+ U 10363 ; WX 781 ; N uni287B ; G 4163
4187
+ U 10364 ; WX 781 ; N uni287C ; G 4164
4188
+ U 10365 ; WX 781 ; N uni287D ; G 4165
4189
+ U 10366 ; WX 781 ; N uni287E ; G 4166
4190
+ U 10367 ; WX 781 ; N uni287F ; G 4167
4191
  U 10368 ; WX 781 ; N uni2880 ; G 4168
4192
  U 10369 ; WX 781 ; N uni2881 ; G 4169
4193
  U 10370 ; WX 781 ; N uni2882 ; G 4170
4198
  U 10375 ; WX 781 ; N uni2887 ; G 4175
4199
  U 10376 ; WX 781 ; N uni2888 ; G 4176
4200
  U 10377 ; WX 781 ; N uni2889 ; G 4177
4201
+ U 10378 ; WX 781 ; N uni288A ; G 4178
4202
+ U 10379 ; WX 781 ; N uni288B ; G 4179
4203
+ U 10380 ; WX 781 ; N uni288C ; G 4180
4204
+ U 10381 ; WX 781 ; N uni288D ; G 4181
4205
+ U 10382 ; WX 781 ; N uni288E ; G 4182
4206
+ U 10383 ; WX 781 ; N uni288F ; G 4183
4207
  U 10384 ; WX 781 ; N uni2890 ; G 4184
4208
  U 10385 ; WX 781 ; N uni2891 ; G 4185
4209
  U 10386 ; WX 781 ; N uni2892 ; G 4186
4214
  U 10391 ; WX 781 ; N uni2897 ; G 4191
4215
  U 10392 ; WX 781 ; N uni2898 ; G 4192
4216
  U 10393 ; WX 781 ; N uni2899 ; G 4193
4217
+ U 10394 ; WX 781 ; N uni289A ; G 4194
4218
+ U 10395 ; WX 781 ; N uni289B ; G 4195
4219
+ U 10396 ; WX 781 ; N uni289C ; G 4196
4220
+ U 10397 ; WX 781 ; N uni289D ; G 4197
4221
+ U 10398 ; WX 781 ; N uni289E ; G 4198
4222
+ U 10399 ; WX 781 ; N uni289F ; G 4199
4223
+ U 10400 ; WX 781 ; N uni28A0 ; G 4200
4224
+ U 10401 ; WX 781 ; N uni28A1 ; G 4201
4225
+ U 10402 ; WX 781 ; N uni28A2 ; G 4202
4226
+ U 10403 ; WX 781 ; N uni28A3 ; G 4203
4227
+ U 10404 ; WX 781 ; N uni28A4 ; G 4204
4228
+ U 10405 ; WX 781 ; N uni28A5 ; G 4205
4229
+ U 10406 ; WX 781 ; N uni28A6 ; G 4206
4230
+ U 10407 ; WX 781 ; N uni28A7 ; G 4207
4231
+ U 10408 ; WX 781 ; N uni28A8 ; G 4208
4232
+ U 10409 ; WX 781 ; N uni28A9 ; G 4209
4233
+ U 10410 ; WX 781 ; N uni28AA ; G 4210
4234
+ U 10411 ; WX 781 ; N uni28AB ; G 4211
4235
+ U 10412 ; WX 781 ; N uni28AC ; G 4212
4236
+ U 10413 ; WX 781 ; N uni28AD ; G 4213
4237
+ U 10414 ; WX 781 ; N uni28AE ; G 4214
4238
+ U 10415 ; WX 781 ; N uni28AF ; G 4215
4239
+ U 10416 ; WX 781 ; N uni28B0 ; G 4216
4240
+ U 10417 ; WX 781 ; N uni28B1 ; G 4217
4241
+ U 10418 ; WX 781 ; N uni28B2 ; G 4218
4242
+ U 10419 ; WX 781 ; N uni28B3 ; G 4219
4243
+ U 10420 ; WX 781 ; N uni28B4 ; G 4220
4244
+ U 10421 ; WX 781 ; N uni28B5 ; G 4221
4245
+ U 10422 ; WX 781 ; N uni28B6 ; G 4222
4246
+ U 10423 ; WX 781 ; N uni28B7 ; G 4223
4247
+ U 10424 ; WX 781 ; N uni28B8 ; G 4224
4248
+ U 10425 ; WX 781 ; N uni28B9 ; G 4225
4249
+ U 10426 ; WX 781 ; N uni28BA ; G 4226
4250
+ U 10427 ; WX 781 ; N uni28BB ; G 4227
4251
+ U 10428 ; WX 781 ; N uni28BC ; G 4228
4252
+ U 10429 ; WX 781 ; N uni28BD ; G 4229
4253
+ U 10430 ; WX 781 ; N uni28BE ; G 4230
4254
+ U 10431 ; WX 781 ; N uni28BF ; G 4231
4255
+ U 10432 ; WX 781 ; N uni28C0 ; G 4232
4256
+ U 10433 ; WX 781 ; N uni28C1 ; G 4233
4257
+ U 10434 ; WX 781 ; N uni28C2 ; G 4234
4258
+ U 10435 ; WX 781 ; N uni28C3 ; G 4235
4259
+ U 10436 ; WX 781 ; N uni28C4 ; G 4236
4260
+ U 10437 ; WX 781 ; N uni28C5 ; G 4237
4261
+ U 10438 ; WX 781 ; N uni28C6 ; G 4238
4262
+ U 10439 ; WX 781 ; N uni28C7 ; G 4239
4263
+ U 10440 ; WX 781 ; N uni28C8 ; G 4240
4264
+ U 10441 ; WX 781 ; N uni28C9 ; G 4241
4265
+ U 10442 ; WX 781 ; N uni28CA ; G 4242
4266
+ U 10443 ; WX 781 ; N uni28CB ; G 4243
4267
+ U 10444 ; WX 781 ; N uni28CC ; G 4244
4268
+ U 10445 ; WX 781 ; N uni28CD ; G 4245
4269
+ U 10446 ; WX 781 ; N uni28CE ; G 4246
4270
+ U 10447 ; WX 781 ; N uni28CF ; G 4247
4271
+ U 10448 ; WX 781 ; N uni28D0 ; G 4248
4272
+ U 10449 ; WX 781 ; N uni28D1 ; G 4249
4273
+ U 10450 ; WX 781 ; N uni28D2 ; G 4250
4274
+ U 10451 ; WX 781 ; N uni28D3 ; G 4251
4275
+ U 10452 ; WX 781 ; N uni28D4 ; G 4252
4276
+ U 10453 ; WX 781 ; N uni28D5 ; G 4253
4277
+ U 10454 ; WX 781 ; N uni28D6 ; G 4254
4278
+ U 10455 ; WX 781 ; N uni28D7 ; G 4255
4279
+ U 10456 ; WX 781 ; N uni28D8 ; G 4256
4280
+ U 10457 ; WX 781 ; N uni28D9 ; G 4257
4281
+ U 10458 ; WX 781 ; N uni28DA ; G 4258
4282
+ U 10459 ; WX 781 ; N uni28DB ; G 4259
4283
+ U 10460 ; WX 781 ; N uni28DC ; G 4260
4284
+ U 10461 ; WX 781 ; N uni28DD ; G 4261
4285
+ U 10462 ; WX 781 ; N uni28DE ; G 4262
4286
+ U 10463 ; WX 781 ; N uni28DF ; G 4263
4287
+ U 10464 ; WX 781 ; N uni28E0 ; G 4264
4288
+ U 10465 ; WX 781 ; N uni28E1 ; G 4265
4289
+ U 10466 ; WX 781 ; N uni28E2 ; G 4266
4290
+ U 10467 ; WX 781 ; N uni28E3 ; G 4267
4291
+ U 10468 ; WX 781 ; N uni28E4 ; G 4268
4292
+ U 10469 ; WX 781 ; N uni28E5 ; G 4269
4293
+ U 10470 ; WX 781 ; N uni28E6 ; G 4270
4294
+ U 10471 ; WX 781 ; N uni28E7 ; G 4271
4295
+ U 10472 ; WX 781 ; N uni28E8 ; G 4272
4296
+ U 10473 ; WX 781 ; N uni28E9 ; G 4273
4297
+ U 10474 ; WX 781 ; N uni28EA ; G 4274
4298
+ U 10475 ; WX 781 ; N uni28EB ; G 4275
4299
+ U 10476 ; WX 781 ; N uni28EC ; G 4276
4300
+ U 10477 ; WX 781 ; N uni28ED ; G 4277
4301
+ U 10478 ; WX 781 ; N uni28EE ; G 4278
4302
+ U 10479 ; WX 781 ; N uni28EF ; G 4279
4303
+ U 10480 ; WX 781 ; N uni28F0 ; G 4280
4304
+ U 10481 ; WX 781 ; N uni28F1 ; G 4281
4305
+ U 10482 ; WX 781 ; N uni28F2 ; G 4282
4306
+ U 10483 ; WX 781 ; N uni28F3 ; G 4283
4307
+ U 10484 ; WX 781 ; N uni28F4 ; G 4284
4308
+ U 10485 ; WX 781 ; N uni28F5 ; G 4285
4309
+ U 10486 ; WX 781 ; N uni28F6 ; G 4286
4310
+ U 10487 ; WX 781 ; N uni28F7 ; G 4287
4311
+ U 10488 ; WX 781 ; N uni28F8 ; G 4288
4312
+ U 10489 ; WX 781 ; N uni28F9 ; G 4289
4313
+ U 10490 ; WX 781 ; N uni28FA ; G 4290
4314
+ U 10491 ; WX 781 ; N uni28FB ; G 4291
4315
+ U 10492 ; WX 781 ; N uni28FC ; G 4292
4316
+ U 10493 ; WX 781 ; N uni28FD ; G 4293
4317
+ U 10494 ; WX 781 ; N uni28FE ; G 4294
4318
+ U 10495 ; WX 781 ; N uni28FF ; G 4295
4319
  U 10502 ; WX 838 ; N uni2906 ; G 4296
4320
  U 10503 ; WX 838 ; N uni2907 ; G 4297
4321
+ U 10506 ; WX 838 ; N uni290A ; G 4298
4322
+ U 10507 ; WX 838 ; N uni290B ; G 4299
4323
  U 10560 ; WX 838 ; N uni2940 ; G 4300
4324
  U 10561 ; WX 838 ; N uni2941 ; G 4301
4325
  U 10627 ; WX 753 ; N uni2983 ; G 4302
4326
  U 10628 ; WX 753 ; N uni2984 ; G 4303
4327
+ U 10702 ; WX 838 ; N uni29CE ; G 4304
4328
+ U 10703 ; WX 1046 ; N uni29CF ; G 4305
4329
+ U 10704 ; WX 1046 ; N uni29D0 ; G 4306
4330
+ U 10705 ; WX 1000 ; N uni29D1 ; G 4307
4331
+ U 10706 ; WX 1000 ; N uni29D2 ; G 4308
4332
+ U 10707 ; WX 1000 ; N uni29D3 ; G 4309
4333
+ U 10708 ; WX 1000 ; N uni29D4 ; G 4310
4334
+ U 10709 ; WX 1000 ; N uni29D5 ; G 4311
4335
+ U 10731 ; WX 494 ; N uni29EB ; G 4312
4336
+ U 10746 ; WX 838 ; N uni29FA ; G 4313
4337
+ U 10747 ; WX 838 ; N uni29FB ; G 4314
4338
+ U 10752 ; WX 1000 ; N uni2A00 ; G 4315
4339
+ U 10753 ; WX 1000 ; N uni2A01 ; G 4316
4340
+ U 10754 ; WX 1000 ; N uni2A02 ; G 4317
4341
+ U 10764 ; WX 1661 ; N uni2A0C ; G 4318
4342
+ U 10765 ; WX 563 ; N uni2A0D ; G 4319
4343
+ U 10766 ; WX 563 ; N uni2A0E ; G 4320
4344
+ U 10767 ; WX 563 ; N uni2A0F ; G 4321
4345
+ U 10768 ; WX 563 ; N uni2A10 ; G 4322
4346
+ U 10769 ; WX 563 ; N uni2A11 ; G 4323
4347
+ U 10770 ; WX 563 ; N uni2A12 ; G 4324
4348
+ U 10771 ; WX 563 ; N uni2A13 ; G 4325
4349
+ U 10772 ; WX 563 ; N uni2A14 ; G 4326
4350
+ U 10773 ; WX 563 ; N uni2A15 ; G 4327
4351
+ U 10774 ; WX 563 ; N uni2A16 ; G 4328
4352
+ U 10775 ; WX 563 ; N uni2A17 ; G 4329
4353
+ U 10776 ; WX 563 ; N uni2A18 ; G 4330
4354
+ U 10777 ; WX 563 ; N uni2A19 ; G 4331
4355
+ U 10778 ; WX 563 ; N uni2A1A ; G 4332
4356
+ U 10779 ; WX 563 ; N uni2A1B ; G 4333
4357
+ U 10780 ; WX 563 ; N uni2A1C ; G 4334
4358
+ U 10799 ; WX 838 ; N uni2A2F ; G 4335
4359
+ U 10877 ; WX 838 ; N uni2A7D ; G 4336
4360
+ U 10878 ; WX 838 ; N uni2A7E ; G 4337
4361
+ U 10879 ; WX 838 ; N uni2A7F ; G 4338
4362
+ U 10880 ; WX 838 ; N uni2A80 ; G 4339
4363
+ U 10881 ; WX 838 ; N uni2A81 ; G 4340
4364
+ U 10882 ; WX 838 ; N uni2A82 ; G 4341
4365
+ U 10883 ; WX 838 ; N uni2A83 ; G 4342
4366
+ U 10884 ; WX 838 ; N uni2A84 ; G 4343
4367
+ U 10885 ; WX 838 ; N uni2A85 ; G 4344
4368
+ U 10886 ; WX 838 ; N uni2A86 ; G 4345
4369
+ U 10887 ; WX 838 ; N uni2A87 ; G 4346
4370
+ U 10888 ; WX 838 ; N uni2A88 ; G 4347
4371
+ U 10889 ; WX 838 ; N uni2A89 ; G 4348
4372
+ U 10890 ; WX 838 ; N uni2A8A ; G 4349
4373
+ U 10891 ; WX 838 ; N uni2A8B ; G 4350
4374
+ U 10892 ; WX 838 ; N uni2A8C ; G 4351
4375
+ U 10893 ; WX 838 ; N uni2A8D ; G 4352
4376
+ U 10894 ; WX 838 ; N uni2A8E ; G 4353
4377
+ U 10895 ; WX 838 ; N uni2A8F ; G 4354
4378
+ U 10896 ; WX 838 ; N uni2A90 ; G 4355
4379
+ U 10897 ; WX 838 ; N uni2A91 ; G 4356
4380
+ U 10898 ; WX 838 ; N uni2A92 ; G 4357
4381
+ U 10899 ; WX 838 ; N uni2A93 ; G 4358
4382
+ U 10900 ; WX 838 ; N uni2A94 ; G 4359
4383
+ U 10901 ; WX 838 ; N uni2A95 ; G 4360
4384
+ U 10902 ; WX 838 ; N uni2A96 ; G 4361
4385
+ U 10903 ; WX 838 ; N uni2A97 ; G 4362
4386
+ U 10904 ; WX 838 ; N uni2A98 ; G 4363
4387
+ U 10905 ; WX 838 ; N uni2A99 ; G 4364
4388
+ U 10906 ; WX 838 ; N uni2A9A ; G 4365
4389
+ U 10907 ; WX 838 ; N uni2A9B ; G 4366
4390
+ U 10908 ; WX 838 ; N uni2A9C ; G 4367
4391
+ U 10909 ; WX 838 ; N uni2A9D ; G 4368
4392
+ U 10910 ; WX 838 ; N uni2A9E ; G 4369
4393
+ U 10911 ; WX 838 ; N uni2A9F ; G 4370
4394
+ U 10912 ; WX 838 ; N uni2AA0 ; G 4371
4395
+ U 10926 ; WX 838 ; N uni2AAE ; G 4372
4396
+ U 10927 ; WX 838 ; N uni2AAF ; G 4373
4397
+ U 10928 ; WX 838 ; N uni2AB0 ; G 4374
4398
+ U 10929 ; WX 838 ; N uni2AB1 ; G 4375
4399
+ U 10930 ; WX 838 ; N uni2AB2 ; G 4376
4400
+ U 10931 ; WX 838 ; N uni2AB3 ; G 4377
4401
+ U 10932 ; WX 838 ; N uni2AB4 ; G 4378
4402
+ U 10933 ; WX 838 ; N uni2AB5 ; G 4379
4403
+ U 10934 ; WX 838 ; N uni2AB6 ; G 4380
4404
+ U 10935 ; WX 838 ; N uni2AB7 ; G 4381
4405
+ U 10936 ; WX 838 ; N uni2AB8 ; G 4382
4406
+ U 10937 ; WX 838 ; N uni2AB9 ; G 4383
4407
+ U 10938 ; WX 838 ; N uni2ABA ; G 4384
4408
+ U 11001 ; WX 838 ; N uni2AF9 ; G 4385
4409
+ U 11002 ; WX 838 ; N uni2AFA ; G 4386
4410
+ U 11008 ; WX 838 ; N uni2B00 ; G 4387
4411
+ U 11009 ; WX 838 ; N uni2B01 ; G 4388
4412
+ U 11010 ; WX 838 ; N uni2B02 ; G 4389
4413
+ U 11011 ; WX 838 ; N uni2B03 ; G 4390
4414
+ U 11012 ; WX 838 ; N uni2B04 ; G 4391
4415
+ U 11013 ; WX 838 ; N uni2B05 ; G 4392
4416
+ U 11014 ; WX 838 ; N uni2B06 ; G 4393
4417
+ U 11015 ; WX 838 ; N uni2B07 ; G 4394
4418
+ U 11016 ; WX 838 ; N uni2B08 ; G 4395
4419
+ U 11017 ; WX 838 ; N uni2B09 ; G 4396
4420
+ U 11018 ; WX 838 ; N uni2B0A ; G 4397
4421
+ U 11019 ; WX 838 ; N uni2B0B ; G 4398
4422
+ U 11020 ; WX 838 ; N uni2B0C ; G 4399
4423
+ U 11021 ; WX 838 ; N uni2B0D ; G 4400
4424
+ U 11022 ; WX 838 ; N uni2B0E ; G 4401
4425
+ U 11023 ; WX 838 ; N uni2B0F ; G 4402
4426
+ U 11024 ; WX 838 ; N uni2B10 ; G 4403
4427
+ U 11025 ; WX 838 ; N uni2B11 ; G 4404
4428
+ U 11026 ; WX 945 ; N uni2B12 ; G 4405
4429
+ U 11027 ; WX 945 ; N uni2B13 ; G 4406
4430
+ U 11028 ; WX 945 ; N uni2B14 ; G 4407
4431
+ U 11029 ; WX 945 ; N uni2B15 ; G 4408
4432
+ U 11030 ; WX 769 ; N uni2B16 ; G 4409
4433
+ U 11031 ; WX 769 ; N uni2B17 ; G 4410
4434
+ U 11032 ; WX 769 ; N uni2B18 ; G 4411
4435
+ U 11033 ; WX 769 ; N uni2B19 ; G 4412
4436
+ U 11034 ; WX 945 ; N uni2B1A ; G 4413
4437
+ U 11039 ; WX 869 ; N uni2B1F ; G 4414
4438
+ U 11040 ; WX 869 ; N uni2B20 ; G 4415
4439
+ U 11041 ; WX 873 ; N uni2B21 ; G 4416
4440
+ U 11042 ; WX 873 ; N uni2B22 ; G 4417
4441
+ U 11043 ; WX 873 ; N uni2B23 ; G 4418
4442
+ U 11044 ; WX 1119 ; N uni2B24 ; G 4419
4443
+ U 11091 ; WX 869 ; N uni2B53 ; G 4420
4444
+ U 11092 ; WX 869 ; N uni2B54 ; G 4421
4445
+ U 11360 ; WX 637 ; N uni2C60 ; G 4422
4446
+ U 11361 ; WX 360 ; N uni2C61 ; G 4423
4447
+ U 11362 ; WX 637 ; N uni2C62 ; G 4424
4448
+ U 11363 ; WX 733 ; N uni2C63 ; G 4425
4449
+ U 11364 ; WX 770 ; N uni2C64 ; G 4426
4450
+ U 11365 ; WX 675 ; N uni2C65 ; G 4427
4451
+ U 11366 ; WX 478 ; N uni2C66 ; G 4428
4452
+ U 11367 ; WX 956 ; N uni2C67 ; G 4429
4453
+ U 11368 ; WX 712 ; N uni2C68 ; G 4430
4454
+ U 11369 ; WX 775 ; N uni2C69 ; G 4431
4455
+ U 11370 ; WX 665 ; N uni2C6A ; G 4432
4456
+ U 11371 ; WX 725 ; N uni2C6B ; G 4433
4457
+ U 11372 ; WX 582 ; N uni2C6C ; G 4434
4458
+ U 11373 ; WX 860 ; N uni2C6D ; G 4435
4459
+ U 11374 ; WX 995 ; N uni2C6E ; G 4436
4460
+ U 11375 ; WX 774 ; N uni2C6F ; G 4437
4461
+ U 11376 ; WX 860 ; N uni2C70 ; G 4438
4462
+ U 11377 ; WX 778 ; N uni2C71 ; G 4439
4463
+ U 11378 ; WX 1221 ; N uni2C72 ; G 4440
4464
+ U 11379 ; WX 1056 ; N uni2C73 ; G 4441
4465
+ U 11380 ; WX 652 ; N uni2C74 ; G 4442
4466
+ U 11381 ; WX 698 ; N uni2C75 ; G 4443
4467
+ U 11382 ; WX 565 ; N uni2C76 ; G 4444
4468
+ U 11383 ; WX 782 ; N uni2C77 ; G 4445
4469
+ U 11385 ; WX 538 ; N uni2C79 ; G 4446
4470
+ U 11386 ; WX 687 ; N uni2C7A ; G 4447
4471
+ U 11387 ; WX 559 ; N uni2C7B ; G 4448
4472
+ U 11388 ; WX 219 ; N uni2C7C ; G 4449
4473
+ U 11389 ; WX 487 ; N uni2C7D ; G 4450
4474
+ U 11390 ; WX 720 ; N uni2C7E ; G 4451
4475
+ U 11391 ; WX 725 ; N uni2C7F ; G 4452
4476
+ U 11568 ; WX 691 ; N uni2D30 ; G 4453
4477
+ U 11569 ; WX 941 ; N uni2D31 ; G 4454
4478
+ U 11570 ; WX 941 ; N uni2D32 ; G 4455
4479
+ U 11571 ; WX 725 ; N uni2D33 ; G 4456
4480
+ U 11572 ; WX 725 ; N uni2D34 ; G 4457
4481
+ U 11573 ; WX 725 ; N uni2D35 ; G 4458
4482
+ U 11574 ; WX 676 ; N uni2D36 ; G 4459
4483
+ U 11575 ; WX 774 ; N uni2D37 ; G 4460
4484
+ U 11576 ; WX 774 ; N uni2D38 ; G 4461
4485
+ U 11577 ; WX 683 ; N uni2D39 ; G 4462
4486
+ U 11578 ; WX 683 ; N uni2D3A ; G 4463
4487
+ U 11579 ; WX 802 ; N uni2D3B ; G 4464
4488
+ U 11580 ; WX 989 ; N uni2D3C ; G 4465
4489
+ U 11581 ; WX 761 ; N uni2D3D ; G 4466
4490
+ U 11582 ; WX 623 ; N uni2D3E ; G 4467
4491
+ U 11583 ; WX 761 ; N uni2D3F ; G 4468
4492
+ U 11584 ; WX 941 ; N uni2D40 ; G 4469
4493
+ U 11585 ; WX 941 ; N uni2D41 ; G 4470
4494
+ U 11586 ; WX 373 ; N uni2D42 ; G 4471
4495
+ U 11587 ; WX 740 ; N uni2D43 ; G 4472
4496
+ U 11588 ; WX 837 ; N uni2D44 ; G 4473
4497
+ U 11589 ; WX 914 ; N uni2D45 ; G 4474
4498
+ U 11590 ; WX 672 ; N uni2D46 ; G 4475
4499
+ U 11591 ; WX 737 ; N uni2D47 ; G 4476
4500
+ U 11592 ; WX 680 ; N uni2D48 ; G 4477
4501
+ U 11593 ; WX 683 ; N uni2D49 ; G 4478
4502
+ U 11594 ; WX 602 ; N uni2D4A ; G 4479
4503
+ U 11595 ; WX 1039 ; N uni2D4B ; G 4480
4504
+ U 11596 ; WX 778 ; N uni2D4C ; G 4481
4505
+ U 11597 ; WX 837 ; N uni2D4D ; G 4482
4506
+ U 11598 ; WX 683 ; N uni2D4E ; G 4483
4507
+ U 11599 ; WX 372 ; N uni2D4F ; G 4484
4508
+ U 11600 ; WX 778 ; N uni2D50 ; G 4485
4509
+ U 11601 ; WX 373 ; N uni2D51 ; G 4486
4510
+ U 11602 ; WX 725 ; N uni2D52 ; G 4487
4511
+ U 11603 ; WX 691 ; N uni2D53 ; G 4488
4512
+ U 11604 ; WX 941 ; N uni2D54 ; G 4489
4513
+ U 11605 ; WX 941 ; N uni2D55 ; G 4490
4514
+ U 11606 ; WX 837 ; N uni2D56 ; G 4491
4515
+ U 11607 ; WX 373 ; N uni2D57 ; G 4492
4516
+ U 11608 ; WX 836 ; N uni2D58 ; G 4493
4517
+ U 11609 ; WX 941 ; N uni2D59 ; G 4494
4518
+ U 11610 ; WX 941 ; N uni2D5A ; G 4495
4519
+ U 11611 ; WX 734 ; N uni2D5B ; G 4496
4520
+ U 11612 ; WX 876 ; N uni2D5C ; G 4497
4521
+ U 11613 ; WX 771 ; N uni2D5D ; G 4498
4522
+ U 11614 ; WX 734 ; N uni2D5E ; G 4499
4523
+ U 11615 ; WX 683 ; N uni2D5F ; G 4500
4524
+ U 11616 ; WX 774 ; N uni2D60 ; G 4501
4525
+ U 11617 ; WX 837 ; N uni2D61 ; G 4502
4526
+ U 11618 ; WX 683 ; N uni2D62 ; G 4503
4527
+ U 11619 ; WX 850 ; N uni2D63 ; G 4504
4528
+ U 11620 ; WX 697 ; N uni2D64 ; G 4505
4529
+ U 11621 ; WX 850 ; N uni2D65 ; G 4506
4530
+ U 11631 ; WX 716 ; N uni2D6F ; G 4507
4531
+ U 11800 ; WX 580 ; N uni2E18 ; G 4508
4532
+ U 11810 ; WX 457 ; N uni2E22 ; G 4509
4533
+ U 11811 ; WX 457 ; N uni2E23 ; G 4510
4534
+ U 11812 ; WX 457 ; N uni2E24 ; G 4511
4535
+ U 11813 ; WX 457 ; N uni2E25 ; G 4512
4536
+ U 11822 ; WX 580 ; N uni2E2E ; G 4513
4537
+ U 19904 ; WX 896 ; N uni4DC0 ; G 4514
4538
+ U 19905 ; WX 896 ; N uni4DC1 ; G 4515
4539
+ U 19906 ; WX 896 ; N uni4DC2 ; G 4516
4540
+ U 19907 ; WX 896 ; N uni4DC3 ; G 4517
4541
+ U 19908 ; WX 896 ; N uni4DC4 ; G 4518
4542
+ U 19909 ; WX 896 ; N uni4DC5 ; G 4519
4543
+ U 19910 ; WX 896 ; N uni4DC6 ; G 4520
4544
+ U 19911 ; WX 896 ; N uni4DC7 ; G 4521
4545
+ U 19912 ; WX 896 ; N uni4DC8 ; G 4522
4546
+ U 19913 ; WX 896 ; N uni4DC9 ; G 4523
4547
+ U 19914 ; WX 896 ; N uni4DCA ; G 4524
4548
+ U 19915 ; WX 896 ; N uni4DCB ; G 4525
4549
+ U 19916 ; WX 896 ; N uni4DCC ; G 4526
4550
+ U 19917 ; WX 896 ; N uni4DCD ; G 4527
4551
+ U 19918 ; WX 896 ; N uni4DCE ; G 4528
4552
+ U 19919 ; WX 896 ; N uni4DCF ; G 4529
4553
+ U 19920 ; WX 896 ; N uni4DD0 ; G 4530
4554
+ U 19921 ; WX 896 ; N uni4DD1 ; G 4531
4555
+ U 19922 ; WX 896 ; N uni4DD2 ; G 4532
4556
+ U 19923 ; WX 896 ; N uni4DD3 ; G 4533
4557
+ U 19924 ; WX 896 ; N uni4DD4 ; G 4534
4558
+ U 19925 ; WX 896 ; N uni4DD5 ; G 4535
4559
+ U 19926 ; WX 896 ; N uni4DD6 ; G 4536
4560
+ U 19927 ; WX 896 ; N uni4DD7 ; G 4537
4561
+ U 19928 ; WX 896 ; N uni4DD8 ; G 4538
4562
+ U 19929 ; WX 896 ; N uni4DD9 ; G 4539
4563
+ U 19930 ; WX 896 ; N uni4DDA ; G 4540
4564
+ U 19931 ; WX 896 ; N uni4DDB ; G 4541
4565
+ U 19932 ; WX 896 ; N uni4DDC ; G 4542
4566
+ U 19933 ; WX 896 ; N uni4DDD ; G 4543
4567
+ U 19934 ; WX 896 ; N uni4DDE ; G 4544
4568
+ U 19935 ; WX 896 ; N uni4DDF ; G 4545
4569
+ U 19936 ; WX 896 ; N uni4DE0 ; G 4546
4570
+ U 19937 ; WX 896 ; N uni4DE1 ; G 4547
4571
+ U 19938 ; WX 896 ; N uni4DE2 ; G 4548
4572
+ U 19939 ; WX 896 ; N uni4DE3 ; G 4549
4573
+ U 19940 ; WX 896 ; N uni4DE4 ; G 4550
4574
+ U 19941 ; WX 896 ; N uni4DE5 ; G 4551
4575
+ U 19942 ; WX 896 ; N uni4DE6 ; G 4552
4576
+ U 19943 ; WX 896 ; N uni4DE7 ; G 4553
4577
+ U 19944 ; WX 896 ; N uni4DE8 ; G 4554
4578
+ U 19945 ; WX 896 ; N uni4DE9 ; G 4555
4579
+ U 19946 ; WX 896 ; N uni4DEA ; G 4556
4580
+ U 19947 ; WX 896 ; N uni4DEB ; G 4557
4581
+ U 19948 ; WX 896 ; N uni4DEC ; G 4558
4582
+ U 19949 ; WX 896 ; N uni4DED ; G 4559
4583
+ U 19950 ; WX 896 ; N uni4DEE ; G 4560
4584
+ U 19951 ; WX 896 ; N uni4DEF ; G 4561
4585
+ U 19952 ; WX 896 ; N uni4DF0 ; G 4562
4586
+ U 19953 ; WX 896 ; N uni4DF1 ; G 4563
4587
+ U 19954 ; WX 896 ; N uni4DF2 ; G 4564
4588
+ U 19955 ; WX 896 ; N uni4DF3 ; G 4565
4589
+ U 19956 ; WX 896 ; N uni4DF4 ; G 4566
4590
+ U 19957 ; WX 896 ; N uni4DF5 ; G 4567
4591
+ U 19958 ; WX 896 ; N uni4DF6 ; G 4568
4592
+ U 19959 ; WX 896 ; N uni4DF7 ; G 4569
4593
+ U 19960 ; WX 896 ; N uni4DF8 ; G 4570
4594
+ U 19961 ; WX 896 ; N uni4DF9 ; G 4571
4595
+ U 19962 ; WX 896 ; N uni4DFA ; G 4572
4596
+ U 19963 ; WX 896 ; N uni4DFB ; G 4573
4597
+ U 19964 ; WX 896 ; N uni4DFC ; G 4574
4598
+ U 19965 ; WX 896 ; N uni4DFD ; G 4575
4599
+ U 19966 ; WX 896 ; N uni4DFE ; G 4576
4600
+ U 19967 ; WX 896 ; N uni4DFF ; G 4577
4601
+ U 42564 ; WX 720 ; N uniA644 ; G 4578
4602
+ U 42565 ; WX 595 ; N uniA645 ; G 4579
4603
+ U 42566 ; WX 436 ; N uniA646 ; G 4580
4604
+ U 42567 ; WX 440 ; N uniA647 ; G 4581
4605
+ U 42572 ; WX 1405 ; N uniA64C ; G 4582
4606
+ U 42573 ; WX 1173 ; N uniA64D ; G 4583
4607
+ U 42576 ; WX 1234 ; N uniA650 ; G 4584
4608
+ U 42577 ; WX 1027 ; N uniA651 ; G 4585
4609
+ U 42580 ; WX 1174 ; N uniA654 ; G 4586
4610
+ U 42581 ; WX 972 ; N uniA655 ; G 4587
4611
+ U 42582 ; WX 1093 ; N uniA656 ; G 4588
4612
+ U 42583 ; WX 958 ; N uniA657 ; G 4589
4613
+ U 42594 ; WX 1085 ; N uniA662 ; G 4590
4614
+ U 42595 ; WX 924 ; N uniA663 ; G 4591
4615
+ U 42596 ; WX 1096 ; N uniA664 ; G 4592
4616
+ U 42597 ; WX 912 ; N uniA665 ; G 4593
4617
+ U 42598 ; WX 1260 ; N uniA666 ; G 4594
4618
+ U 42599 ; WX 997 ; N uniA667 ; G 4595
4619
+ U 42600 ; WX 850 ; N uniA668 ; G 4596
4620
+ U 42601 ; WX 687 ; N uniA669 ; G 4597
4621
+ U 42602 ; WX 1037 ; N uniA66A ; G 4598
4622
+ U 42603 ; WX 868 ; N uniA66B ; G 4599
4623
+ U 42604 ; WX 1406 ; N uniA66C ; G 4600
4624
+ U 42605 ; WX 1106 ; N uniA66D ; G 4601
4625
+ U 42606 ; WX 961 ; N uniA66E ; G 4602
4626
+ U 42634 ; WX 963 ; N uniA68A ; G 4603
4627
+ U 42635 ; WX 787 ; N uniA68B ; G 4604
4628
+ U 42636 ; WX 682 ; N uniA68C ; G 4605
4629
+ U 42637 ; WX 580 ; N uniA68D ; G 4606
4630
+ U 42644 ; WX 808 ; N uniA694 ; G 4607
4631
+ U 42645 ; WX 712 ; N uniA695 ; G 4608
4632
+ U 42760 ; WX 500 ; N uniA708 ; G 4609
4633
+ U 42761 ; WX 500 ; N uniA709 ; G 4610
4634
+ U 42762 ; WX 500 ; N uniA70A ; G 4611
4635
+ U 42763 ; WX 500 ; N uniA70B ; G 4612
4636
+ U 42764 ; WX 500 ; N uniA70C ; G 4613
4637
+ U 42765 ; WX 500 ; N uniA70D ; G 4614
4638
+ U 42766 ; WX 500 ; N uniA70E ; G 4615
4639
+ U 42767 ; WX 500 ; N uniA70F ; G 4616
4640
+ U 42768 ; WX 500 ; N uniA710 ; G 4617
4641
+ U 42769 ; WX 500 ; N uniA711 ; G 4618
4642
+ U 42770 ; WX 500 ; N uniA712 ; G 4619
4643
+ U 42771 ; WX 500 ; N uniA713 ; G 4620
4644
+ U 42772 ; WX 500 ; N uniA714 ; G 4621
4645
+ U 42773 ; WX 500 ; N uniA715 ; G 4622
4646
+ U 42774 ; WX 500 ; N uniA716 ; G 4623
4647
+ U 42779 ; WX 400 ; N uniA71B ; G 4624
4648
+ U 42780 ; WX 400 ; N uniA71C ; G 4625
4649
+ U 42781 ; WX 287 ; N uniA71D ; G 4626
4650
+ U 42782 ; WX 287 ; N uniA71E ; G 4627
4651
+ U 42783 ; WX 287 ; N uniA71F ; G 4628
4652
+ U 42786 ; WX 444 ; N uniA722 ; G 4629
4653
+ U 42787 ; WX 390 ; N uniA723 ; G 4630
4654
+ U 42788 ; WX 540 ; N uniA724 ; G 4631
4655
+ U 42789 ; WX 540 ; N uniA725 ; G 4632
4656
+ U 42790 ; WX 837 ; N uniA726 ; G 4633
4657
+ U 42791 ; WX 712 ; N uniA727 ; G 4634
4658
+ U 42792 ; WX 1031 ; N uniA728 ; G 4635
4659
+ U 42793 ; WX 857 ; N uniA729 ; G 4636
4660
+ U 42794 ; WX 696 ; N uniA72A ; G 4637
4661
+ U 42795 ; WX 557 ; N uniA72B ; G 4638
4662
+ U 42800 ; WX 559 ; N uniA730 ; G 4639
4663
+ U 42801 ; WX 595 ; N uniA731 ; G 4640
4664
+ U 42802 ; WX 1349 ; N uniA732 ; G 4641
4665
+ U 42803 ; WX 1052 ; N uniA733 ; G 4642
4666
+ U 42804 ; WX 1284 ; N uniA734 ; G 4643
4667
+ U 42805 ; WX 1064 ; N uniA735 ; G 4644
4668
+ U 42806 ; WX 1216 ; N uniA736 ; G 4645
4669
+ U 42807 ; WX 1054 ; N uniA737 ; G 4646
4670
+ U 42808 ; WX 1079 ; N uniA738 ; G 4647
4671
+ U 42809 ; WX 922 ; N uniA739 ; G 4648
4672
+ U 42810 ; WX 1079 ; N uniA73A ; G 4649
4673
+ U 42811 ; WX 922 ; N uniA73B ; G 4650
4674
+ U 42812 ; WX 1035 ; N uniA73C ; G 4651
4675
+ U 42813 ; WX 922 ; N uniA73D ; G 4652
4676
+ U 42814 ; WX 698 ; N uniA73E ; G 4653
4677
+ U 42815 ; WX 549 ; N uniA73F ; G 4654
4678
+ U 42822 ; WX 850 ; N uniA746 ; G 4655
4679
+ U 42823 ; WX 542 ; N uniA747 ; G 4656
4680
+ U 42824 ; WX 683 ; N uniA748 ; G 4657
4681
+ U 42825 ; WX 531 ; N uniA749 ; G 4658
4682
+ U 42826 ; WX 918 ; N uniA74A ; G 4659
4683
+ U 42827 ; WX 814 ; N uniA74B ; G 4660
4684
+ U 42830 ; WX 1406 ; N uniA74E ; G 4661
4685
+ U 42831 ; WX 1106 ; N uniA74F ; G 4662
4686
+ U 42832 ; WX 733 ; N uniA750 ; G 4663
4687
+ U 42833 ; WX 716 ; N uniA751 ; G 4664
4688
+ U 42834 ; WX 948 ; N uniA752 ; G 4665
4689
+ U 42835 ; WX 937 ; N uniA753 ; G 4666
4690
+ U 42838 ; WX 850 ; N uniA756 ; G 4667
4691
+ U 42839 ; WX 716 ; N uniA757 ; G 4668
4692
+ U 42852 ; WX 738 ; N uniA764 ; G 4669
4693
+ U 42853 ; WX 716 ; N uniA765 ; G 4670
4694
+ U 42854 ; WX 738 ; N uniA766 ; G 4671
4695
+ U 42855 ; WX 716 ; N uniA767 ; G 4672
4696
+ U 42880 ; WX 637 ; N uniA780 ; G 4673
4697
+ U 42881 ; WX 343 ; N uniA781 ; G 4674
4698
+ U 42882 ; WX 837 ; N uniA782 ; G 4675
4699
+ U 42883 ; WX 712 ; N uniA783 ; G 4676
4700
+ U 42889 ; WX 400 ; N uniA789 ; G 4677
4701
+ U 42890 ; WX 386 ; N uniA78A ; G 4678
4702
+ U 42891 ; WX 456 ; N uniA78B ; G 4679
4703
+ U 42892 ; WX 306 ; N uniA78C ; G 4680
4704
+ U 42893 ; WX 808 ; N uniA78D ; G 4681
4705
+ U 43003 ; WX 683 ; N uniA7FB ; G 4682
4706
+ U 43004 ; WX 733 ; N uniA7FC ; G 4683
4707
+ U 43005 ; WX 995 ; N uniA7FD ; G 4684
4708
+ U 43006 ; WX 372 ; N uniA7FE ; G 4685
4709
+ U 43007 ; WX 1325 ; N uniA7FF ; G 4686
4710
+ U 61184 ; WX 216 ; N uni02E5.5 ; G 4687
4711
+ U 61185 ; WX 242 ; N uni02E6.5 ; G 4688
4712
+ U 61186 ; WX 267 ; N uni02E7.5 ; G 4689
4713
+ U 61187 ; WX 277 ; N uni02E8.5 ; G 4690
4714
+ U 61188 ; WX 282 ; N uni02E9.5 ; G 4691
4715
+ U 61189 ; WX 242 ; N uni02E5.4 ; G 4692
4716
+ U 61190 ; WX 216 ; N uni02E6.4 ; G 4693
4717
+ U 61191 ; WX 242 ; N uni02E7.4 ; G 4694
4718
+ U 61192 ; WX 267 ; N uni02E8.4 ; G 4695
4719
+ U 61193 ; WX 277 ; N uni02E9.4 ; G 4696
4720
+ U 61194 ; WX 267 ; N uni02E5.3 ; G 4697
4721
+ U 61195 ; WX 242 ; N uni02E6.3 ; G 4698
4722
+ U 61196 ; WX 216 ; N uni02E7.3 ; G 4699
4723
+ U 61197 ; WX 242 ; N uni02E8.3 ; G 4700
4724
+ U 61198 ; WX 267 ; N uni02E9.3 ; G 4701
4725
+ U 61199 ; WX 277 ; N uni02E5.2 ; G 4702
4726
+ U 61200 ; WX 267 ; N uni02E6.2 ; G 4703
4727
+ U 61201 ; WX 242 ; N uni02E7.2 ; G 4704
4728
+ U 61202 ; WX 216 ; N uni02E8.2 ; G 4705
4729
+ U 61203 ; WX 242 ; N uni02E9.2 ; G 4706
4730
+ U 61204 ; WX 282 ; N uni02E5.1 ; G 4707
4731
+ U 61205 ; WX 277 ; N uni02E6.1 ; G 4708
4732
+ U 61206 ; WX 267 ; N uni02E7.1 ; G 4709
4733
+ U 61207 ; WX 242 ; N uni02E8.1 ; G 4710
4734
+ U 61208 ; WX 216 ; N uni02E9.1 ; G 4711
4735
+ U 61209 ; WX 282 ; N stem ; G 4712
4736
+ U 63173 ; WX 687 ; N uniF6C5 ; G 4713
4737
+ U 64256 ; WX 810 ; N uniFB00 ; G 4714
4738
+ U 64257 ; WX 741 ; N fi ; G 4715
4739
+ U 64258 ; WX 741 ; N fl ; G 4716
4740
+ U 64259 ; WX 1115 ; N uniFB03 ; G 4717
4741
+ U 64260 ; WX 1116 ; N uniFB04 ; G 4718
4742
+ U 64261 ; WX 808 ; N uniFB05 ; G 4719
4743
+ U 64262 ; WX 1020 ; N uniFB06 ; G 4720
4744
+ U 64275 ; WX 1388 ; N uniFB13 ; G 4721
4745
+ U 64276 ; WX 1384 ; N uniFB14 ; G 4722
4746
+ U 64277 ; WX 1378 ; N uniFB15 ; G 4723
4747
+ U 64278 ; WX 1384 ; N uniFB16 ; G 4724
4748
+ U 64279 ; WX 1713 ; N uniFB17 ; G 4725
4749
+ U 64285 ; WX 343 ; N uniFB1D ; G 4726
4750
+ U 64286 ; WX 0 ; N uniFB1E ; G 4727
4751
+ U 64287 ; WX 663 ; N uniFB1F ; G 4728
4752
+ U 64288 ; WX 720 ; N uniFB20 ; G 4729
4753
+ U 64289 ; WX 963 ; N uniFB21 ; G 4730
4754
+ U 64290 ; WX 890 ; N uniFB22 ; G 4731
4755
+ U 64291 ; WX 988 ; N uniFB23 ; G 4732
4756
+ U 64292 ; WX 963 ; N uniFB24 ; G 4733
4757
+ U 64293 ; WX 938 ; N uniFB25 ; G 4734
4758
+ U 64294 ; WX 988 ; N uniFB26 ; G 4735
4759
+ U 64295 ; WX 988 ; N uniFB27 ; G 4736
4760
+ U 64296 ; WX 976 ; N uniFB28 ; G 4737
4761
+ U 64297 ; WX 838 ; N uniFB29 ; G 4738
4762
+ U 64298 ; WX 949 ; N uniFB2A ; G 4739
4763
+ U 64299 ; WX 949 ; N uniFB2B ; G 4740
4764
+ U 64300 ; WX 949 ; N uniFB2C ; G 4741
4765
+ U 64301 ; WX 949 ; N uniFB2D ; G 4742
4766
+ U 64302 ; WX 751 ; N uniFB2E ; G 4743
4767
+ U 64303 ; WX 751 ; N uniFB2F ; G 4744
4768
+ U 64304 ; WX 751 ; N uniFB30 ; G 4745
4769
+ U 64305 ; WX 673 ; N uniFB31 ; G 4746
4770
+ U 64306 ; WX 537 ; N uniFB32 ; G 4747
4771
+ U 64307 ; WX 654 ; N uniFB33 ; G 4748
4772
+ U 64308 ; WX 712 ; N uniFB34 ; G 4749
4773
+ U 64309 ; WX 438 ; N uniFB35 ; G 4750
4774
+ U 64310 ; WX 491 ; N uniFB36 ; G 4751
4775
+ U 64312 ; WX 724 ; N uniFB38 ; G 4752
4776
+ U 64313 ; WX 438 ; N uniFB39 ; G 4753
4777
+ U 64314 ; WX 649 ; N uniFB3A ; G 4754
4778
+ U 64315 ; WX 650 ; N uniFB3B ; G 4755
4779
+ U 64316 ; WX 679 ; N uniFB3C ; G 4756
4780
+ U 64318 ; WX 775 ; N uniFB3E ; G 4757
4781
+ U 64320 ; WX 497 ; N uniFB40 ; G 4758
4782
+ U 64321 ; WX 773 ; N uniFB41 ; G 4759
4783
+ U 64323 ; WX 718 ; N uniFB43 ; G 4760
4784
+ U 64324 ; WX 687 ; N uniFB44 ; G 4761
4785
+ U 64326 ; WX 751 ; N uniFB46 ; G 4762
4786
+ U 64327 ; WX 729 ; N uniFB47 ; G 4763
4787
+ U 64328 ; WX 649 ; N uniFB48 ; G 4764
4788
+ U 64329 ; WX 949 ; N uniFB49 ; G 4765
4789
+ U 64330 ; WX 751 ; N uniFB4A ; G 4766
4790
+ U 64331 ; WX 343 ; N uniFB4B ; G 4767
4791
+ U 64332 ; WX 673 ; N uniFB4C ; G 4768
4792
+ U 64333 ; WX 650 ; N uniFB4D ; G 4769
4793
+ U 64334 ; WX 687 ; N uniFB4E ; G 4770
4794
+ U 64335 ; WX 651 ; N uniFB4F ; G 4771
4795
+ U 64338 ; WX 1005 ; N uniFB52 ; G 4772
4796
+ U 64339 ; WX 1059 ; N uniFB53 ; G 4773
4797
+ U 64340 ; WX 375 ; N uniFB54 ; G 4774
4798
+ U 64341 ; WX 408 ; N uniFB55 ; G 4775
4799
+ U 64342 ; WX 1005 ; N uniFB56 ; G 4776
4800
+ U 64343 ; WX 1059 ; N uniFB57 ; G 4777
4801
+ U 64344 ; WX 375 ; N uniFB58 ; G 4778
4802
+ U 64345 ; WX 408 ; N uniFB59 ; G 4779
4803
+ U 64346 ; WX 1005 ; N uniFB5A ; G 4780
4804
+ U 64347 ; WX 1059 ; N uniFB5B ; G 4781
4805
+ U 64348 ; WX 375 ; N uniFB5C ; G 4782
4806
+ U 64349 ; WX 408 ; N uniFB5D ; G 4783
4807
+ U 64350 ; WX 1005 ; N uniFB5E ; G 4784
4808
+ U 64351 ; WX 1059 ; N uniFB5F ; G 4785
4809
+ U 64352 ; WX 375 ; N uniFB60 ; G 4786
4810
+ U 64353 ; WX 408 ; N uniFB61 ; G 4787
4811
+ U 64354 ; WX 1005 ; N uniFB62 ; G 4788
4812
+ U 64355 ; WX 1059 ; N uniFB63 ; G 4789
4813
+ U 64356 ; WX 375 ; N uniFB64 ; G 4790
4814
+ U 64357 ; WX 408 ; N uniFB65 ; G 4791
4815
+ U 64358 ; WX 1005 ; N uniFB66 ; G 4792
4816
+ U 64359 ; WX 1059 ; N uniFB67 ; G 4793
4817
+ U 64360 ; WX 375 ; N uniFB68 ; G 4794
4818
+ U 64361 ; WX 408 ; N uniFB69 ; G 4795
4819
+ U 64362 ; WX 1162 ; N uniFB6A ; G 4796
4820
+ U 64363 ; WX 1191 ; N uniFB6B ; G 4797
4821
+ U 64364 ; WX 655 ; N uniFB6C ; G 4798
4822
+ U 64365 ; WX 720 ; N uniFB6D ; G 4799
4823
+ U 64366 ; WX 1162 ; N uniFB6E ; G 4800
4824
+ U 64367 ; WX 1191 ; N uniFB6F ; G 4801
4825
+ U 64368 ; WX 655 ; N uniFB70 ; G 4802
4826
+ U 64369 ; WX 720 ; N uniFB71 ; G 4803
4827
+ U 64370 ; WX 721 ; N uniFB72 ; G 4804
4828
+ U 64371 ; WX 721 ; N uniFB73 ; G 4805
4829
+ U 64372 ; WX 721 ; N uniFB74 ; G 4806
4830
+ U 64373 ; WX 721 ; N uniFB75 ; G 4807
4831
+ U 64374 ; WX 721 ; N uniFB76 ; G 4808
4832
+ U 64375 ; WX 721 ; N uniFB77 ; G 4809
4833
+ U 64376 ; WX 721 ; N uniFB78 ; G 4810
4834
+ U 64377 ; WX 721 ; N uniFB79 ; G 4811
4835
+ U 64378 ; WX 721 ; N uniFB7A ; G 4812
4836
+ U 64379 ; WX 721 ; N uniFB7B ; G 4813
4837
+ U 64380 ; WX 721 ; N uniFB7C ; G 4814
4838
+ U 64381 ; WX 721 ; N uniFB7D ; G 4815
4839
+ U 64382 ; WX 721 ; N uniFB7E ; G 4816
4840
+ U 64383 ; WX 721 ; N uniFB7F ; G 4817
4841
+ U 64384 ; WX 721 ; N uniFB80 ; G 4818
4842
+ U 64385 ; WX 721 ; N uniFB81 ; G 4819
4843
+ U 64386 ; WX 513 ; N uniFB82 ; G 4820
4844
+ U 64387 ; WX 578 ; N uniFB83 ; G 4821
4845
+ U 64388 ; WX 513 ; N uniFB84 ; G 4822
4846
+ U 64389 ; WX 578 ; N uniFB85 ; G 4823
4847
+ U 64390 ; WX 513 ; N uniFB86 ; G 4824
4848
+ U 64391 ; WX 578 ; N uniFB87 ; G 4825
4849
+ U 64392 ; WX 513 ; N uniFB88 ; G 4826
4850
+ U 64393 ; WX 578 ; N uniFB89 ; G 4827
4851
+ U 64394 ; WX 576 ; N uniFB8A ; G 4828
4852
+ U 64395 ; WX 622 ; N uniFB8B ; G 4829
4853
+ U 64396 ; WX 576 ; N uniFB8C ; G 4830
4854
+ U 64397 ; WX 622 ; N uniFB8D ; G 4831
4855
+ U 64398 ; WX 1024 ; N uniFB8E ; G 4832
4856
+ U 64399 ; WX 1024 ; N uniFB8F ; G 4833
4857
+ U 64400 ; WX 582 ; N uniFB90 ; G 4834
4858
+ U 64401 ; WX 582 ; N uniFB91 ; G 4835
4859
+ U 64402 ; WX 1024 ; N uniFB92 ; G 4836
4860
+ U 64403 ; WX 1024 ; N uniFB93 ; G 4837
4861
+ U 64404 ; WX 582 ; N uniFB94 ; G 4838
4862
+ U 64405 ; WX 582 ; N uniFB95 ; G 4839
4863
+ U 64406 ; WX 1024 ; N uniFB96 ; G 4840
4864
+ U 64407 ; WX 1024 ; N uniFB97 ; G 4841
4865
+ U 64408 ; WX 582 ; N uniFB98 ; G 4842
4866
+ U 64409 ; WX 582 ; N uniFB99 ; G 4843
4867
+ U 64410 ; WX 1024 ; N uniFB9A ; G 4844
4868
+ U 64411 ; WX 1024 ; N uniFB9B ; G 4845
4869
+ U 64412 ; WX 582 ; N uniFB9C ; G 4846
4870
+ U 64413 ; WX 582 ; N uniFB9D ; G 4847
4871
+ U 64414 ; WX 854 ; N uniFB9E ; G 4848
4872
+ U 64415 ; WX 900 ; N uniFB9F ; G 4849
4873
+ U 64416 ; WX 854 ; N uniFBA0 ; G 4850
4874
+ U 64417 ; WX 900 ; N uniFBA1 ; G 4851
4875
+ U 64418 ; WX 375 ; N uniFBA2 ; G 4852
4876
+ U 64419 ; WX 408 ; N uniFBA3 ; G 4853
4877
+ U 64426 ; WX 938 ; N uniFBAA ; G 4854
4878
+ U 64427 ; WX 880 ; N uniFBAB ; G 4855
4879
+ U 64428 ; WX 693 ; N uniFBAC ; G 4856
4880
+ U 64429 ; WX 660 ; N uniFBAD ; G 4857
4881
+ U 64467 ; WX 824 ; N uniFBD3 ; G 4858
4882
+ U 64468 ; WX 843 ; N uniFBD4 ; G 4859
4883
+ U 64469 ; WX 476 ; N uniFBD5 ; G 4860
4884
+ U 64470 ; WX 552 ; N uniFBD6 ; G 4861
4885
+ U 64473 ; WX 622 ; N uniFBD9 ; G 4862
4886
+ U 64474 ; WX 627 ; N uniFBDA ; G 4863
4887
+ U 64488 ; WX 375 ; N uniFBE8 ; G 4864
4888
+ U 64489 ; WX 408 ; N uniFBE9 ; G 4865
4889
+ U 64508 ; WX 917 ; N uniFBFC ; G 4866
4890
+ U 64509 ; WX 1012 ; N uniFBFD ; G 4867
4891
+ U 64510 ; WX 375 ; N uniFBFE ; G 4868
4892
+ U 64511 ; WX 408 ; N uniFBFF ; G 4869
4893
+ U 65024 ; WX 0 ; N uniFE00 ; G 4870
4894
+ U 65025 ; WX 0 ; N uniFE01 ; G 4871
4895
+ U 65026 ; WX 0 ; N uniFE02 ; G 4872
4896
+ U 65027 ; WX 0 ; N uniFE03 ; G 4873
4897
+ U 65028 ; WX 0 ; N uniFE04 ; G 4874
4898
+ U 65029 ; WX 0 ; N uniFE05 ; G 4875
4899
+ U 65030 ; WX 0 ; N uniFE06 ; G 4876
4900
+ U 65031 ; WX 0 ; N uniFE07 ; G 4877
4901
+ U 65032 ; WX 0 ; N uniFE08 ; G 4878
4902
+ U 65033 ; WX 0 ; N uniFE09 ; G 4879
4903
+ U 65034 ; WX 0 ; N uniFE0A ; G 4880
4904
+ U 65035 ; WX 0 ; N uniFE0B ; G 4881
4905
+ U 65036 ; WX 0 ; N uniFE0C ; G 4882
4906
+ U 65037 ; WX 0 ; N uniFE0D ; G 4883
4907
+ U 65038 ; WX 0 ; N uniFE0E ; G 4884
4908
+ U 65039 ; WX 0 ; N uniFE0F ; G 4885
4909
+ U 65056 ; WX 0 ; N uniFE20 ; G 4886
4910
+ U 65057 ; WX 0 ; N uniFE21 ; G 4887
4911
+ U 65058 ; WX 0 ; N uniFE22 ; G 4888
4912
+ U 65059 ; WX 0 ; N uniFE23 ; G 4889
4913
+ U 65136 ; WX 342 ; N uniFE70 ; G 4890
4914
+ U 65137 ; WX 342 ; N uniFE71 ; G 4891
4915
+ U 65138 ; WX 342 ; N uniFE72 ; G 4892
4916
+ U 65139 ; WX 346 ; N uniFE73 ; G 4893
4917
+ U 65140 ; WX 342 ; N uniFE74 ; G 4894
4918
+ U 65142 ; WX 342 ; N uniFE76 ; G 4895
4919
+ U 65143 ; WX 342 ; N uniFE77 ; G 4896
4920
+ U 65144 ; WX 342 ; N uniFE78 ; G 4897
4921
+ U 65145 ; WX 342 ; N uniFE79 ; G 4898
4922
+ U 65146 ; WX 342 ; N uniFE7A ; G 4899
4923
+ U 65147 ; WX 342 ; N uniFE7B ; G 4900
4924
+ U 65148 ; WX 342 ; N uniFE7C ; G 4901
4925
+ U 65149 ; WX 342 ; N uniFE7D ; G 4902
4926
+ U 65150 ; WX 342 ; N uniFE7E ; G 4903
4927
+ U 65151 ; WX 342 ; N uniFE7F ; G 4904
4928
+ U 65152 ; WX 511 ; N uniFE80 ; G 4905
4929
+ U 65153 ; WX 343 ; N uniFE81 ; G 4906
4930
+ U 65154 ; WX 375 ; N uniFE82 ; G 4907
4931
+ U 65155 ; WX 343 ; N uniFE83 ; G 4908
4932
+ U 65156 ; WX 375 ; N uniFE84 ; G 4909
4933
+ U 65157 ; WX 622 ; N uniFE85 ; G 4910
4934
+ U 65158 ; WX 627 ; N uniFE86 ; G 4911
4935
+ U 65159 ; WX 343 ; N uniFE87 ; G 4912
4936
+ U 65160 ; WX 375 ; N uniFE88 ; G 4913
4937
+ U 65161 ; WX 917 ; N uniFE89 ; G 4914
4938
+ U 65162 ; WX 917 ; N uniFE8A ; G 4915
4939
+ U 65163 ; WX 375 ; N uniFE8B ; G 4916
4940
+ U 65164 ; WX 408 ; N uniFE8C ; G 4917
4941
+ U 65165 ; WX 343 ; N uniFE8D ; G 4918
4942
+ U 65166 ; WX 375 ; N uniFE8E ; G 4919
4943
+ U 65167 ; WX 1005 ; N uniFE8F ; G 4920
4944
+ U 65168 ; WX 1059 ; N uniFE90 ; G 4921
4945
+ U 65169 ; WX 375 ; N uniFE91 ; G 4922
4946
+ U 65170 ; WX 408 ; N uniFE92 ; G 4923
4947
+ U 65171 ; WX 590 ; N uniFE93 ; G 4924
4948
+ U 65172 ; WX 606 ; N uniFE94 ; G 4925
4949
+ U 65173 ; WX 1005 ; N uniFE95 ; G 4926
4950
+ U 65174 ; WX 1059 ; N uniFE96 ; G 4927
4951
+ U 65175 ; WX 375 ; N uniFE97 ; G 4928
4952
+ U 65176 ; WX 408 ; N uniFE98 ; G 4929
4953
+ U 65177 ; WX 1005 ; N uniFE99 ; G 4930
4954
+ U 65178 ; WX 1059 ; N uniFE9A ; G 4931
4955
+ U 65179 ; WX 375 ; N uniFE9B ; G 4932
4956
+ U 65180 ; WX 408 ; N uniFE9C ; G 4933
4957
+ U 65181 ; WX 721 ; N uniFE9D ; G 4934
4958
+ U 65182 ; WX 721 ; N uniFE9E ; G 4935
4959
+ U 65183 ; WX 721 ; N uniFE9F ; G 4936
4960
+ U 65184 ; WX 721 ; N uniFEA0 ; G 4937
4961
+ U 65185 ; WX 721 ; N uniFEA1 ; G 4938
4962
+ U 65186 ; WX 721 ; N uniFEA2 ; G 4939
4963
+ U 65187 ; WX 721 ; N uniFEA3 ; G 4940
4964
+ U 6518