emf 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +224 -19
  3. data/exe/emf +12 -0
  4. data/lib/emf/backend.rb +60 -0
  5. data/lib/emf/binary/class_field_accessors.rb +49 -0
  6. data/lib/emf/binary/float32_le.rb +54 -0
  7. data/lib/emf/binary/types.rb +40 -6
  8. data/lib/emf/conformance/context.rb +36 -0
  9. data/lib/emf/conformance/diagnostic.rb +18 -0
  10. data/lib/emf/conformance/manifest/emf_bitmap_misc.yml +622 -0
  11. data/lib/emf/conformance/manifest/emf_control_buffers.yml +61 -0
  12. data/lib/emf/conformance/manifest/emf_core.yml +117 -0
  13. data/lib/emf/conformance/manifest/emf_corpus_rules.yml +21 -0
  14. data/lib/emf/conformance/manifest/emf_objects_geometry.yml +229 -0
  15. data/lib/emf/conformance/manifest/emf_plus.yml +357 -0
  16. data/lib/emf/conformance/manifest/emf_plus_core.yml +33 -0
  17. data/lib/emf/conformance/manifest/emf_state_path.yml +403 -0
  18. data/lib/emf/conformance/manifest/emf_text.yml +97 -0
  19. data/lib/emf/conformance/manifest/wmf.yml +874 -0
  20. data/lib/emf/conformance/manifest.rb +79 -0
  21. data/lib/emf/conformance/profile.rb +35 -0
  22. data/lib/emf/conformance/record_types.rb +24 -0
  23. data/lib/emf/conformance/registry.rb +76 -0
  24. data/lib/emf/conformance/report.rb +83 -0
  25. data/lib/emf/conformance/rule.rb +16 -0
  26. data/lib/emf/conformance/rules/emf_bitmap.rb +357 -0
  27. data/lib/emf/conformance/rules/emf_comment_escape.rb +309 -0
  28. data/lib/emf/conformance/rules/emf_control_buffers.rb +137 -0
  29. data/lib/emf/conformance/rules/emf_corpus_named.rb +83 -0
  30. data/lib/emf/conformance/rules/emf_framing.rb +94 -0
  31. data/lib/emf/conformance/rules/emf_geometry.rb +282 -0
  32. data/lib/emf/conformance/rules/emf_header.rb +114 -0
  33. data/lib/emf/conformance/rules/emf_objects.rb +291 -0
  34. data/lib/emf/conformance/rules/emf_parse_recovery.rb +97 -0
  35. data/lib/emf/conformance/rules/emf_path_clip.rb +165 -0
  36. data/lib/emf/conformance/rules/emf_plus.rb +75 -0
  37. data/lib/emf/conformance/rules/emf_plus_common.rb +58 -0
  38. data/lib/emf/conformance/rules/emf_plus_drawing.rb +78 -0
  39. data/lib/emf/conformance/rules/emf_plus_effects.rb +104 -0
  40. data/lib/emf/conformance/rules/emf_plus_fields.rb +169 -0
  41. data/lib/emf/conformance/rules/emf_plus_fields_b.rb +102 -0
  42. data/lib/emf/conformance/rules/emf_plus_framing.rb +172 -0
  43. data/lib/emf/conformance/rules/emf_plus_objects.rb +97 -0
  44. data/lib/emf/conformance/rules/emf_plus_payloads.rb +320 -0
  45. data/lib/emf/conformance/rules/emf_plus_properties.rb +96 -0
  46. data/lib/emf/conformance/rules/emf_plus_state.rb +77 -0
  47. data/lib/emf/conformance/rules/emf_state.rb +244 -0
  48. data/lib/emf/conformance/rules/emf_text.rb +221 -0
  49. data/lib/emf/conformance/rules/emf_transform.rb +85 -0
  50. data/lib/emf/conformance/rules/wmf_buffers.rb +259 -0
  51. data/lib/emf/conformance/rules/wmf_framing.rb +146 -0
  52. data/lib/emf/conformance/rules/wmf_layout_records.rb +112 -0
  53. data/lib/emf/conformance/rules/wmf_objects.rb +168 -0
  54. data/lib/emf/conformance/rules/wmf_records.rb +191 -0
  55. data/lib/emf/conformance/rules/wmf_rejections.rb +184 -0
  56. data/lib/emf/conformance/runner.rb +61 -0
  57. data/lib/emf/conformance/ternary_raster_operations.rb +52 -0
  58. data/lib/emf/conformance.rb +31 -0
  59. data/lib/emf/emf_plus/effects/blur.rb +24 -0
  60. data/lib/emf/emf_plus/effects/brightness_contrast.rb +22 -0
  61. data/lib/emf/emf_plus/effects/color_balance.rb +24 -0
  62. data/lib/emf/emf_plus/effects/color_curve.rb +24 -0
  63. data/lib/emf/emf_plus/effects/color_lookup_table.rb +26 -0
  64. data/lib/emf/emf_plus/effects/color_matrix.rb +23 -0
  65. data/lib/emf/emf_plus/effects/effect.rb +50 -0
  66. data/lib/emf/emf_plus/effects/hue_saturation_lightness.rb +24 -0
  67. data/lib/emf/emf_plus/effects/levels.rb +24 -0
  68. data/lib/emf/emf_plus/effects/opaque.rb +19 -0
  69. data/lib/emf/emf_plus/effects/red_eye_correction.rb +35 -0
  70. data/lib/emf/emf_plus/effects/sharpen.rb +24 -0
  71. data/lib/emf/emf_plus/effects/tint.rb +22 -0
  72. data/lib/emf/emf_plus/effects.rb +45 -0
  73. data/lib/emf/emf_plus/frame.rb +41 -0
  74. data/lib/emf/emf_plus/links/effect_link.rb +16 -0
  75. data/lib/emf/emf_plus/links/get_dc_span.rb +18 -0
  76. data/lib/emf/emf_plus/links/link_error.rb +15 -0
  77. data/lib/emf/emf_plus/links.rb +77 -0
  78. data/lib/emf/emf_plus/object_chain.rb +108 -0
  79. data/lib/emf/emf_plus/object_table.rb +182 -0
  80. data/lib/emf/emf_plus/objects/brush.rb +296 -0
  81. data/lib/emf/emf_plus/objects/custom_line_cap.rb +106 -0
  82. data/lib/emf/emf_plus/objects/font.rb +47 -0
  83. data/lib/emf/emf_plus/objects/image.rb +68 -0
  84. data/lib/emf/emf_plus/objects/image_attributes.rb +28 -0
  85. data/lib/emf/emf_plus/objects/opaque.rb +19 -0
  86. data/lib/emf/emf_plus/objects/parts.rb +103 -0
  87. data/lib/emf/emf_plus/objects/path.rb +21 -0
  88. data/lib/emf/emf_plus/objects/pen.rb +132 -0
  89. data/lib/emf/emf_plus/objects/region.rb +39 -0
  90. data/lib/emf/emf_plus/objects/string_format.rb +55 -0
  91. data/lib/emf/emf_plus/objects/typed.rb +50 -0
  92. data/lib/emf/emf_plus/objects.rb +46 -0
  93. data/lib/emf/emf_plus/parser.rb +64 -2
  94. data/lib/emf/emf_plus/records/base.rb +107 -0
  95. data/lib/emf/emf_plus/records/begin_container.rb +31 -0
  96. data/lib/emf/emf_plus/records/begin_container_no_params.rb +20 -0
  97. data/lib/emf/emf_plus/records/body.rb +16 -0
  98. data/lib/emf/emf_plus/records/clear.rb +22 -0
  99. data/lib/emf/emf_plus/records/clip_transform_flags.rb +26 -0
  100. data/lib/emf/emf_plus/records/comment.rb +21 -0
  101. data/lib/emf/emf_plus/records/draw_arc.rb +33 -0
  102. data/lib/emf/emf_plus/records/draw_beziers.rb +31 -0
  103. data/lib/emf/emf_plus/records/draw_closed_curve.rb +34 -0
  104. data/lib/emf/emf_plus/records/draw_curve.rb +38 -0
  105. data/lib/emf/emf_plus/records/draw_driver_string.rb +61 -0
  106. data/lib/emf/emf_plus/records/draw_ellipse.rb +28 -0
  107. data/lib/emf/emf_plus/records/draw_image.rb +42 -0
  108. data/lib/emf/emf_plus/records/draw_image_points.rb +62 -0
  109. data/lib/emf/emf_plus/records/draw_lines.rb +34 -0
  110. data/lib/emf/emf_plus/records/draw_path.rb +23 -0
  111. data/lib/emf/emf_plus/records/draw_pie.rb +33 -0
  112. data/lib/emf/emf_plus/records/draw_rects.rb +30 -0
  113. data/lib/emf/emf_plus/records/draw_string.rb +41 -0
  114. data/lib/emf/emf_plus/records/end_container.rb +20 -0
  115. data/lib/emf/emf_plus/records/end_of_file.rb +17 -0
  116. data/lib/emf/emf_plus/records/fill_brush.rb +21 -0
  117. data/lib/emf/emf_plus/records/fill_closed_curve.rb +38 -0
  118. data/lib/emf/emf_plus/records/fill_ellipse.rb +29 -0
  119. data/lib/emf/emf_plus/records/fill_path.rb +23 -0
  120. data/lib/emf/emf_plus/records/fill_pie.rb +34 -0
  121. data/lib/emf/emf_plus/records/fill_polygon.rb +32 -0
  122. data/lib/emf/emf_plus/records/fill_rects.rb +31 -0
  123. data/lib/emf/emf_plus/records/fill_region.rb +23 -0
  124. data/lib/emf/emf_plus/records/get_dc.rb +18 -0
  125. data/lib/emf/emf_plus/records/header.rb +35 -0
  126. data/lib/emf/emf_plus/records/multiply_world_transform.rb +24 -0
  127. data/lib/emf/emf_plus/records/object.rb +32 -0
  128. data/lib/emf/emf_plus/records/offset_clip.rb +24 -0
  129. data/lib/emf/emf_plus/records/primitives/argb.rb +20 -0
  130. data/lib/emf/emf_plus/records/primitives/bitmap.rb +32 -0
  131. data/lib/emf/emf_plus/records/primitives/bitmap_data.rb +21 -0
  132. data/lib/emf/emf_plus/records/primitives/blend_colors.rb +22 -0
  133. data/lib/emf/emf_plus/records/primitives/blend_factors.rb +21 -0
  134. data/lib/emf/emf_plus/records/primitives/bounded_array.rb +38 -0
  135. data/lib/emf/emf_plus/records/primitives/byte_reader.rb +25 -0
  136. data/lib/emf/emf_plus/records/primitives/character_range.rb +20 -0
  137. data/lib/emf/emf_plus/records/primitives/compressed_image.rb +17 -0
  138. data/lib/emf/emf_plus/records/primitives/focus_scale_data.rb +20 -0
  139. data/lib/emf/emf_plus/records/primitives/graphics_version.rb +21 -0
  140. data/lib/emf/emf_plus/records/primitives/language_identifier.rb +22 -0
  141. data/lib/emf/emf_plus/records/primitives/metafile.rb +19 -0
  142. data/lib/emf/emf_plus/records/primitives/palette.rb +21 -0
  143. data/lib/emf/emf_plus/records/primitives/path.rb +89 -0
  144. data/lib/emf/emf_plus/records/primitives/path_point_type.rb +21 -0
  145. data/lib/emf/emf_plus/records/primitives/path_point_type_rle.rb +23 -0
  146. data/lib/emf/emf_plus/records/primitives/point.rb +18 -0
  147. data/lib/emf/emf_plus/records/primitives/point_array.rb +42 -0
  148. data/lib/emf/emf_plus/records/primitives/point_f.rb +19 -0
  149. data/lib/emf/emf_plus/records/primitives/point_r.rb +19 -0
  150. data/lib/emf/emf_plus/records/primitives/rect.rb +20 -0
  151. data/lib/emf/emf_plus/records/primitives/rect_array.rb +24 -0
  152. data/lib/emf/emf_plus/records/primitives/rect_f.rb +21 -0
  153. data/lib/emf/emf_plus/records/primitives/region_node.rb +68 -0
  154. data/lib/emf/emf_plus/records/primitives/region_node_child_nodes.rb +22 -0
  155. data/lib/emf/emf_plus/records/primitives/region_node_path.rb +37 -0
  156. data/lib/emf/emf_plus/records/primitives/relative_coordinate.rb +32 -0
  157. data/lib/emf/emf_plus/records/primitives/string_format_data.rb +23 -0
  158. data/lib/emf/emf_plus/records/primitives/transform_matrix.rb +23 -0
  159. data/lib/emf/emf_plus/records/primitives.rb +41 -0
  160. data/lib/emf/emf_plus/records/reset_clip.rb +17 -0
  161. data/lib/emf/emf_plus/records/reset_world_transform.rb +17 -0
  162. data/lib/emf/emf_plus/records/restore.rb +20 -0
  163. data/lib/emf/emf_plus/records/rotate_world_transform.rb +24 -0
  164. data/lib/emf/emf_plus/records/save.rb +20 -0
  165. data/lib/emf/emf_plus/records/scale_world_transform.rb +26 -0
  166. data/lib/emf/emf_plus/records/serializable_object.rb +32 -0
  167. data/lib/emf/emf_plus/records/set_anti_alias_mode.rb +25 -0
  168. data/lib/emf/emf_plus/records/set_clip_path.rb +20 -0
  169. data/lib/emf/emf_plus/records/set_clip_rect.rb +24 -0
  170. data/lib/emf/emf_plus/records/set_clip_region.rb +20 -0
  171. data/lib/emf/emf_plus/records/set_compositing_mode.rb +21 -0
  172. data/lib/emf/emf_plus/records/set_compositing_quality.rb +21 -0
  173. data/lib/emf/emf_plus/records/set_interpolation_mode.rb +21 -0
  174. data/lib/emf/emf_plus/records/set_page_transform.rb +25 -0
  175. data/lib/emf/emf_plus/records/set_pixel_offset_mode.rb +21 -0
  176. data/lib/emf/emf_plus/records/set_rendering_origin.rb +22 -0
  177. data/lib/emf/emf_plus/records/set_text_contrast.rb +24 -0
  178. data/lib/emf/emf_plus/records/set_text_rendering_hint.rb +21 -0
  179. data/lib/emf/emf_plus/records/set_ts_clip.rb +40 -0
  180. data/lib/emf/emf_plus/records/set_ts_graphics.rb +88 -0
  181. data/lib/emf/emf_plus/records/set_world_transform.rb +22 -0
  182. data/lib/emf/emf_plus/records/shape_flags.rb +23 -0
  183. data/lib/emf/emf_plus/records/translate_world_transform.rb +26 -0
  184. data/lib/emf/emf_plus/records/unknown.rb +20 -0
  185. data/lib/emf/emf_plus/records.rb +107 -0
  186. data/lib/emf/emf_plus/serializer.rb +9 -2
  187. data/lib/emf/emf_plus/stream/conformance.rb +68 -0
  188. data/lib/emf/emf_plus/stream/editor.rb +21 -0
  189. data/lib/emf/emf_plus/stream/emf_gap.rb +20 -0
  190. data/lib/emf/emf_plus/stream/link_index.rb +30 -0
  191. data/lib/emf/emf_plus/stream/rebuild.rb +47 -0
  192. data/lib/emf/emf_plus/stream/record_handle.rb +26 -0
  193. data/lib/emf/emf_plus/stream/segment.rb +70 -0
  194. data/lib/emf/emf_plus/stream.rb +153 -0
  195. data/lib/emf/emf_plus.rb +9 -0
  196. data/lib/emf/emr/binary/dib_header.rb +142 -0
  197. data/lib/emf/emr/binary/ext_text_out_fields.rb +43 -0
  198. data/lib/emf/emr/binary/extended_pen_buffers.rb +23 -0
  199. data/lib/emf/emr/binary/fast_fill.rb +1164 -0
  200. data/lib/emf/emr/binary/font.rb +159 -0
  201. data/lib/emf/emr/binary/lazy_utf16_array.rb +82 -0
  202. data/lib/emf/emr/binary/pack_plan.rb +144 -0
  203. data/lib/emf/emr/binary/pack_plan_check.rb +75 -0
  204. data/lib/emf/emr/binary/pack_plan_exact.rb +130 -0
  205. data/lib/emf/emr/binary/pack_plan_generate.rb +116 -0
  206. data/lib/emf/emr/binary/pack_plan_values.rb +92 -0
  207. data/lib/emf/emr/binary/palette_body.rb +19 -0
  208. data/lib/emf/emr/binary/palette_entry.rb +18 -0
  209. data/lib/emf/emr/binary/record.rb +33 -0
  210. data/lib/emf/emr/binary/records/alpha_blend.rb +43 -0
  211. data/lib/emf/emr/binary/records/angle_arc.rb +2 -2
  212. data/lib/emf/emr/binary/records/bit_blt.rb +14 -0
  213. data/lib/emf/emr/binary/records/color_correct_palette.rb +55 -1
  214. data/lib/emf/emr/binary/records/colormatch_to_target_w.rb +76 -1
  215. data/lib/emf/emr/binary/records/create_colorspace.rb +67 -1
  216. data/lib/emf/emr/binary/records/create_colorspace_w.rb +90 -1
  217. data/lib/emf/emr/binary/records/create_dib_pattern_brush_pt.rb +14 -0
  218. data/lib/emf/emr/binary/records/create_font_indirect_w.rb +6 -2
  219. data/lib/emf/emr/binary/records/create_mono_brush.rb +14 -0
  220. data/lib/emf/emr/binary/records/create_palette.rb +19 -1
  221. data/lib/emf/emr/binary/records/delete_colorspace.rb +22 -1
  222. data/lib/emf/emr/binary/records/draw_escape.rb +45 -1
  223. data/lib/emf/emr/binary/records/ellipse.rb +1 -1
  224. data/lib/emf/emr/binary/records/eof.rb +9 -0
  225. data/lib/emf/emr/binary/records/ext_create_pen.rb +80 -1
  226. data/lib/emf/emr/binary/records/ext_escape.rb +45 -1
  227. data/lib/emf/emr/binary/records/ext_flood_fill.rb +9 -2
  228. data/lib/emf/emr/binary/records/ext_select_clip_rgn.rb +9 -1
  229. data/lib/emf/emr/binary/records/ext_text_out_a.rb +16 -3
  230. data/lib/emf/emr/binary/records/ext_text_out_w.rb +14 -3
  231. data/lib/emf/emr/binary/records/fill_rgn.rb +11 -2
  232. data/lib/emf/emr/binary/records/force_ufi_mapping.rb +38 -1
  233. data/lib/emf/emr/binary/records/frame_rgn.rb +12 -2
  234. data/lib/emf/emr/binary/records/gls_bounded_record.rb +61 -1
  235. data/lib/emf/emr/binary/records/gls_record.rb +42 -1
  236. data/lib/emf/emr/binary/records/gradient_fill.rb +7 -0
  237. data/lib/emf/emr/binary/records/invert_rgn.rb +11 -3
  238. data/lib/emf/emr/binary/records/mask_blt.rb +66 -0
  239. data/lib/emf/emr/binary/records/named_escape.rb +78 -1
  240. data/lib/emf/emr/binary/records/paint_rgn.rb +11 -3
  241. data/lib/emf/emr/binary/records/pixel_format.rb +76 -1
  242. data/lib/emf/emr/binary/records/plg_blt.rb +66 -0
  243. data/lib/emf/emr/binary/records/poly_textout_a.rb +128 -1
  244. data/lib/emf/emr/binary/records/poly_textout_w.rb +128 -1
  245. data/lib/emf/emr/binary/records/raw.rb +3 -0
  246. data/lib/emf/emr/binary/records/realize_palette.rb +1 -0
  247. data/lib/emf/emr/binary/records/rectangle.rb +1 -1
  248. data/lib/emf/emr/binary/records/resize_palette.rb +16 -2
  249. data/lib/emf/emr/binary/records/round_rect.rb +2 -2
  250. data/lib/emf/emr/binary/records/select_palette.rb +1 -0
  251. data/lib/emf/emr/binary/records/set_color_adjustment.rb +136 -0
  252. data/lib/emf/emr/binary/records/set_colorspace.rb +22 -1
  253. data/lib/emf/emr/binary/records/set_dibits_to_device.rb +43 -0
  254. data/lib/emf/emr/binary/records/set_icm_profile_a.rb +71 -1
  255. data/lib/emf/emr/binary/records/set_icm_profile_w.rb +71 -1
  256. data/lib/emf/emr/binary/records/set_linked_ufis.rb +49 -1
  257. data/lib/emf/emr/binary/records/set_miter_limit.rb +1 -1
  258. data/lib/emf/emr/binary/records/set_palette_entries.rb +20 -2
  259. data/lib/emf/emr/binary/records/set_text_justification.rb +8 -2
  260. data/lib/emf/emr/binary/records/small_text_out.rb +55 -4
  261. data/lib/emf/emr/binary/records/stretch_blt.rb +14 -0
  262. data/lib/emf/emr/binary/records/stretch_dibits.rb +14 -0
  263. data/lib/emf/emr/binary/records/transparent_blt.rb +43 -0
  264. data/lib/emf/emr/binary/records.rb +4 -2
  265. data/lib/emf/emr/binary/region_data.rb +33 -0
  266. data/lib/emf/emr/binary/state_record_body.rb +33 -0
  267. data/lib/emf/emr/binary/thin_shell.rb +226 -0
  268. data/lib/emf/emr/binary/value_view/layout.rb +101 -0
  269. data/lib/emf/emr/binary/value_view/reader_source.rb +88 -0
  270. data/lib/emf/emr/binary/value_view.rb +173 -0
  271. data/lib/emf/emr/binary/variable_buffers.rb +87 -0
  272. data/lib/emf/emr/binary.rb +4 -0
  273. data/lib/emf/emr/filled_record.rb +77 -0
  274. data/lib/emf/emr/parser.rb +239 -50
  275. data/lib/emf/emr/serializer.rb +4 -5
  276. data/lib/emf/emr.rb +1 -0
  277. data/lib/emf/error.rb +24 -1
  278. data/lib/emf/model/diagnostic.rb +41 -0
  279. data/lib/emf/model/emr/header.rb +40 -1
  280. data/lib/emf/model/emr/records.rb +142 -6
  281. data/lib/emf/model/emr/wire_values.rb +43 -0
  282. data/lib/emf/model/emr.rb +1 -0
  283. data/lib/emf/model/geometry/color.rb +19 -1
  284. data/lib/emf/model/metafile.rb +22 -2
  285. data/lib/emf/model/wmf/bitmap_records.rb +155 -0
  286. data/lib/emf/model/wmf/brush_records.rb +45 -0
  287. data/lib/emf/model/wmf/dc_escape_records.rb +67 -0
  288. data/lib/emf/model/wmf/font_record.rb +40 -0
  289. data/lib/emf/model/wmf/geometry_records.rb +107 -0
  290. data/lib/emf/model/wmf/header.rb +36 -0
  291. data/lib/emf/model/wmf/object_records.rb +71 -0
  292. data/lib/emf/model/wmf/palette_records.rb +68 -0
  293. data/lib/emf/model/wmf/records.rb +247 -0
  294. data/lib/emf/model/wmf/region_records.rb +112 -0
  295. data/lib/emf/model/wmf/state_records.rb +188 -0
  296. data/lib/emf/model/wmf/text_records.rb +36 -0
  297. data/lib/emf/model/wmf.rb +11 -0
  298. data/lib/emf/model.rb +2 -0
  299. data/lib/emf/native/bitmap_fields.rb +58 -0
  300. data/lib/emf/native/diagnostic_contract.rb +39 -0
  301. data/lib/emf/native/diagnostics.rb +81 -0
  302. data/lib/emf/native/emf_plus_loader.rb +35 -0
  303. data/lib/emf/native/emf_plus_snapshot.rb +96 -0
  304. data/lib/emf/native/emf_plus_source.rb +20 -0
  305. data/lib/emf/native/emf_plus_stream.rb +150 -0
  306. data/lib/emf/native/fields.rb +369 -0
  307. data/lib/emf/native/font_fields.rb +87 -0
  308. data/lib/emf/native/gradient_fields.rb +23 -0
  309. data/lib/emf/native/header.rb +35 -0
  310. data/lib/emf/native/header_errors.rb +30 -0
  311. data/lib/emf/native/hydrator.rb +151 -0
  312. data/lib/emf/native/lazy_wire.rb +100 -0
  313. data/lib/emf/native/legacy_state_fields.rb +22 -0
  314. data/lib/emf/native/library_path.rb +68 -0
  315. data/lib/emf/native/loader.rb +120 -0
  316. data/lib/emf/native/palette_fields.rb +45 -0
  317. data/lib/emf/native/poly_text_fields.rb +116 -0
  318. data/lib/emf/native/resource_failure.rb +28 -0
  319. data/lib/emf/native/small_text_fields.rb +27 -0
  320. data/lib/emf/native/snapshot.rb +102 -0
  321. data/lib/emf/native/wmf_bitmap_fields.rb +58 -0
  322. data/lib/emf/native/wmf_brush_fields.rb +62 -0
  323. data/lib/emf/native/wmf_fields.rb +117 -0
  324. data/lib/emf/native/wmf_hydrator.rb +143 -0
  325. data/lib/emf/native/wmf_loading.rb +49 -0
  326. data/lib/emf/native/wmf_palette_fields.rb +60 -0
  327. data/lib/emf/native/wmf_region_fields.rb +92 -0
  328. data/lib/emf/native/wmf_rejection.rb +84 -0
  329. data/lib/emf/native/wmf_remaining_fields.rb +70 -0
  330. data/lib/emf/native/wmf_snapshot.rb +51 -0
  331. data/lib/emf/native/wmf_text_fields.rb +56 -0
  332. data/lib/emf/native.rb +61 -0
  333. data/lib/emf/parse_evidence.rb +57 -0
  334. data/lib/emf/resource_budget/bitmap.rb +66 -0
  335. data/lib/emf/resource_budget/gradient.rb +30 -0
  336. data/lib/emf/resource_budget/poly_text.rb +85 -0
  337. data/lib/emf/resource_budget.rb +382 -0
  338. data/lib/emf/resource_limits/emf_records.rb +130 -0
  339. data/lib/emf/resource_limits.rb +58 -0
  340. data/lib/emf/version.rb +1 -1
  341. data/lib/emf/visitors/dump.rb +4 -0
  342. data/lib/emf/visitors/stats.rb +6 -5
  343. data/lib/emf/wmf/binary.rb +150 -1
  344. data/lib/emf/wmf/bitmap_codec.rb +118 -0
  345. data/lib/emf/wmf/brush_codec.rb +102 -0
  346. data/lib/emf/wmf/dc_escape_codec.rb +75 -0
  347. data/lib/emf/wmf/dib.rb +187 -0
  348. data/lib/emf/wmf/embedded_emf.rb +137 -0
  349. data/lib/emf/wmf/escape_views.rb +89 -0
  350. data/lib/emf/wmf/evidence.rb +255 -0
  351. data/lib/emf/wmf/geometry_codec.rb +49 -0
  352. data/lib/emf/wmf/palette_codec.rb +85 -0
  353. data/lib/emf/wmf/parser.rb +147 -2
  354. data/lib/emf/wmf/recovery.rb +95 -0
  355. data/lib/emf/wmf/region_codec.rb +151 -0
  356. data/lib/emf/wmf/serializer.rb +164 -2
  357. data/lib/emf/wmf/text_codec.rb +123 -0
  358. data/lib/emf/wmf.rb +7 -0
  359. data/lib/emf.rb +13 -9
  360. metadata +287 -10
@@ -0,0 +1,357 @@
1
+ # EMF+ lens manifest rows for rules/emf_plus_{framing,properties,drawing,objects,state}.rb.
2
+ # Rows for emf_plus.rb (chunk 1) belong to that file's owner.
3
+ - id: emfplus.record.fixed_size
4
+ format: emf_plus
5
+ record_types: [EmfPlusOffsetClip, EmfPlusResetClip, EmfPlusSetClipPath, EmfPlusSetClipRect, EmfPlusSetClipRegion, EmfPlusEndOfFile, EmfPlusGetDC, EmfPlusHeader, EmfPlusClear, EmfPlusDrawPath, EmfPlusFillPath, EmfPlusFillRegion, EmfPlusSetAntiAliasMode, EmfPlusSetCompositingMode, EmfPlusSetCompositingQuality, EmfPlusSetInterpolationMode, EmfPlusSetPixelOffsetMode, EmfPlusSetRenderingOrigin, EmfPlusSetTextContrast, EmfPlusSetTextRenderingHint, EmfPlusBeginContainer, EmfPlusBeginContainerNoParams, EmfPlusEndContainer, EmfPlusRestore, EmfPlusSave, EmfPlusMultiplyWorldTransform, EmfPlusResetWorldTransform, EmfPlusRotateWorldTransform, EmfPlusScaleWorldTransform, EmfPlusSetPageTransform, EmfPlusSetWorldTransform, EmfPlusTranslateWorldTransform]
6
+ citation: "MS-EMFPLUS 2.3"
7
+ status: implemented
8
+ reason: null
9
+ # The exact Size 12 / DataSize 0 SetPageTransform is emfplus.record.page_transform_bodyless, not this rule.
10
+ - id: emfplus.record.page_transform_bodyless
11
+ format: emf_plus
12
+ record_types: [EmfPlusSetPageTransform]
13
+ citation: "MS-EMFPLUS 2.3"
14
+ status: implemented
15
+ reason: null
16
+ # Silent where a formula rule (ellipse_size, draw.driver_string, draw.string, draw.image, object.serializable,
17
+ # terminal.graphics, terminal.clip) states the same DataSize; stays for the rest. An unaligned but exact DataSize is
18
+ # emfplus.record.data_size_alignment, not this rule.
19
+ - id: emfplus.record.data_size
20
+ format: emf_plus
21
+ record_types: [every typed record not in the fixed-size set]
22
+ citation: "MS-EMFPLUS 2.3"
23
+ status: implemented
24
+ reason: null
25
+ - id: emfplus.record.data_size_alignment
26
+ format: emf_plus
27
+ record_types: [all]
28
+ citation: "MS-EMFPLUS 2.3.3"
29
+ status: implemented
30
+ reason: null
31
+ # Silent where emfplus.draw.driver_string, draw.string or draw.image already states that the count runs past DataSize.
32
+ # Also reports the malformed-body error that emfplus.stream.framing would otherwise repeat without an offset.
33
+ - id: emfplus.record.body_bounds
34
+ format: emf_plus
35
+ record_types: [all defined types]
36
+ citation: "MS-EMFPLUS 2.3"
37
+ status: implemented
38
+ reason: null
39
+ - id: emfplus.header.signature
40
+ format: emf_plus
41
+ record_types: [EmfPlusHeader]
42
+ citation: "MS-EMFPLUS 2.2.2.19"
43
+ status: implemented
44
+ reason: null
45
+ - id: emfplus.eof.placement
46
+ format: emf_plus
47
+ record_types: [EmfPlusEndOfFile]
48
+ citation: "MS-EMFPLUS 1.3"
49
+ status: implemented
50
+ reason: null
51
+ - id: emfplus.property.enum
52
+ format: emf_plus
53
+ record_types: [EmfPlusSetAntiAliasMode, EmfPlusSetTextRenderingHint, EmfPlusSetInterpolationMode, EmfPlusSetPixelOffsetMode, EmfPlusSetCompositingMode, EmfPlusSetClipRect, EmfPlusSetClipPath, EmfPlusSetClipRegion]
54
+ citation: "MS-EMFPLUS 2.3.6"
55
+ status: implemented
56
+ reason: null
57
+ - id: emfplus.property.compositing_quality
58
+ format: emf_plus
59
+ record_types: [EmfPlusSetCompositingQuality]
60
+ citation: "MS-EMFPLUS 2.3.6.4"
61
+ status: implemented
62
+ reason: null
63
+ - id: emfplus.property.text_contrast
64
+ format: emf_plus
65
+ record_types: [EmfPlusSetTextContrast]
66
+ citation: "MS-EMFPLUS 2.3.6.7"
67
+ status: implemented
68
+ reason: null
69
+ - id: emfplus.transform.page_unit
70
+ format: emf_plus
71
+ record_types: [EmfPlusSetPageTransform, EmfPlusBeginContainer]
72
+ citation: "MS-EMFPLUS 2.3.9"
73
+ status: implemented
74
+ reason: null
75
+ - id: emfplus.transform.page_unit_discouraged
76
+ format: emf_plus
77
+ record_types: [EmfPlusSetPageTransform, EmfPlusBeginContainer]
78
+ citation: "MS-EMFPLUS 2.3.9"
79
+ status: implemented
80
+ reason: null
81
+ - id: emfplus.draw.count
82
+ format: emf_plus
83
+ record_types: [EmfPlusDrawBeziers, EmfPlusDrawClosedCurve, EmfPlusDrawCurve, EmfPlusDrawLines, EmfPlusFillClosedCurve, EmfPlusFillPolygon, EmfPlusDrawImagePoints, EmfPlusDrawRects, EmfPlusFillRects]
84
+ citation: "MS-EMFPLUS 2.3.4"
85
+ status: implemented
86
+ reason: null
87
+ - id: emfplus.draw.ellipse_size
88
+ format: emf_plus
89
+ record_types: [EmfPlusDrawEllipse, EmfPlusFillEllipse]
90
+ citation: "MS-EMFPLUS 2.3.4"
91
+ status: implemented
92
+ reason: null
93
+ - id: emfplus.draw.image_source_unit
94
+ format: emf_plus
95
+ record_types: [EmfPlusDrawImage, EmfPlusDrawImagePoints]
96
+ citation: "MS-EMFPLUS 2.3.4"
97
+ status: implemented
98
+ reason: null
99
+ - id: emfplus.object.empty_slot
100
+ format: emf_plus
101
+ record_types: [every drawing and clip record that references an object]
102
+ citation: "MS-EMFPLUS 2.3.4"
103
+ status: implemented
104
+ reason: null
105
+ - id: emfplus.object.wrong_type
106
+ format: emf_plus
107
+ record_types: [every drawing and clip record that references an object]
108
+ citation: "MS-EMFPLUS 2.3.4"
109
+ status: implemented
110
+ reason: null
111
+ - id: emfplus.object.id_range
112
+ format: emf_plus
113
+ record_types: [every drawing and clip record that references an object]
114
+ citation: "MS-EMFPLUS 2.3.4"
115
+ status: implemented
116
+ reason: null
117
+ - id: emfplus.object.optional_empty_slot
118
+ format: emf_plus
119
+ record_types: [EmfPlusDrawString, EmfPlusDrawImage, EmfPlusDrawImagePoints, EmfPlusSetClipRegion]
120
+ citation: "MS-EMFPLUS 2.3.4"
121
+ status: implemented
122
+ reason: null
123
+ - id: emfplus.object.optional_id_range
124
+ format: emf_plus
125
+ record_types: [EmfPlusDrawString, EmfPlusDrawImage, EmfPlusDrawImagePoints]
126
+ citation: "MS-EMFPLUS 2.3.4"
127
+ status: implemented
128
+ reason: null
129
+ # Owns the missing and non-adjacent effect LinkError; emfplus.stream.framing no longer repeats it.
130
+ - id: emfplus.object.effect_missing
131
+ format: emf_plus
132
+ record_types: [EmfPlusDrawImagePoints]
133
+ citation: "MS-EMFPLUS 2.3.4.9"
134
+ status: implemented
135
+ reason: null
136
+ - id: emfplus.state.restore_unmatched
137
+ format: emf_plus
138
+ record_types: [EmfPlusSave, EmfPlusRestore]
139
+ citation: "MS-EMFPLUS 2.3.7"
140
+ status: implemented
141
+ reason: null
142
+ - id: emfplus.state.restore_unknown_state
143
+ format: emf_plus
144
+ record_types: [EmfPlusSave, EmfPlusRestore]
145
+ citation: "MS-EMFPLUS 2.3.7"
146
+ status: implemented
147
+ reason: null
148
+ - id: emfplus.state.end_container_unmatched
149
+ format: emf_plus
150
+ record_types: [EmfPlusBeginContainer, EmfPlusBeginContainerNoParams, EmfPlusEndContainer]
151
+ citation: "MS-EMFPLUS 2.3.7"
152
+ status: implemented
153
+ reason: null
154
+ - id: emfplus.record.reserved_flag_bits
155
+ format: emf_plus
156
+ record_types: [all]
157
+ citation: "MS-EMFPLUS 2.3"
158
+ status: not_checkable
159
+ reason: "the spec says reserved Flags bits (X) MUST be ignored and unused Flags SHOULD be zero, so a set bit is not a violation"
160
+ - id: emfplus.transform.finite_values
161
+ format: emf_plus
162
+ record_types: [EmfPlusSetWorldTransform, EmfPlusMultiplyWorldTransform, EmfPlusTranslateWorldTransform, EmfPlusScaleWorldTransform, EmfPlusRotateWorldTransform]
163
+ citation: "MS-EMFPLUS 2.3.9"
164
+ status: not_checkable
165
+ reason: "the transform sections state no finiteness or range requirement for the float fields (a search of ch02 for finite/NaN/infinity finds none about them)"
166
+ - id: emfplus.transform.page_scale
167
+ format: emf_plus
168
+ record_types: [EmfPlusSetPageTransform]
169
+ citation: "MS-EMFPLUS 2.3.9"
170
+ status: not_checkable
171
+ reason: "PageScale is described only as a scale factor; no range is stated in the section read"
172
+ - id: emfplus.draw.angles
173
+ format: emf_plus
174
+ record_types: [EmfPlusDrawArc, EmfPlusDrawPie, EmfPlusFillPie]
175
+ citation: "MS-EMFPLUS 2.3.4"
176
+ status: not_checkable
177
+ reason: "StartAngle and SweepAngle accept any value (interpreted modulo 360 / clamped by the consumer), so no value is a violation"
178
+ - id: emfplus.draw.curve_segments
179
+ format: emf_plus
180
+ record_types: [EmfPlusDrawCurve]
181
+ citation: "MS-EMFPLUS 2.3.4"
182
+ status: not_checkable
183
+ reason: "Offset and NumSegments have no stated relation to Count in the section read"
184
+ - id: emfplus.draw.compressed_flag_with_relative
185
+ format: emf_plus
186
+ record_types: [EmfPlusDrawLines, EmfPlusDrawBeziers, EmfPlusDrawClosedCurve, EmfPlusFillPolygon, EmfPlusFillClosedCurve, EmfPlusDrawImagePoints]
187
+ citation: "MS-EMFPLUS 2.3.4"
188
+ status: not_checkable
189
+ reason: "when P (relative) is set the C flag is undefined and MUST be ignored, so C with P is not a violation"
190
+ - id: emfplus.draw.size_formula
191
+ format: emf_plus
192
+ record_types: [all counted drawing records]
193
+ citation: "MS-EMFPLUS 2.3.4"
194
+ status: not_checkable
195
+ reason: "the Size/DataSize formulas (Count * element size + fixed part) are exactly what emfplus.record.data_size checks against the decoded body, so they have no separate rule"
196
+ - id: emfplus.object.definition
197
+ format: emf_plus
198
+ record_types: [EmfPlusObject]
199
+ citation: "MS-EMFPLUS 2.3.5"
200
+ status: not_checkable
201
+ reason: "object chain and definition-ID problems are ObjectTable#errors, already reported with the stream's framing errors as emfplus.stream.framing (emf_plus.rb); a second rule would duplicate it"
202
+ - id: emfplus.state.unclosed
203
+ format: emf_plus
204
+ record_types: [EmfPlusSave, EmfPlusBeginContainer, EmfPlusBeginContainerNoParams]
205
+ citation: "MS-EMFPLUS 2.3.7"
206
+ status: not_checkable
207
+ reason: "no requirement read that a Save or container must be closed by the end of the stream"
208
+ - id: emfplus.state.clip_transform
209
+ format: emf_plus
210
+ record_types: [EmfPlusSetClipRect, EmfPlusSetWorldTransform]
211
+ citation: "MS-EMFPLUS 2.3.1"
212
+ status: not_checkable
213
+ reason: "no clip or transform constraint that depends on earlier state was read; the lens would have to replay the graphics state"
214
+ - id: emfplus.comment.private_data
215
+ format: emf_plus
216
+ record_types: [EmfPlusComment]
217
+ citation: "MS-EMFPLUS 2.3.2.1"
218
+ status: not_checkable
219
+ reason: "the payload is application-defined and opaque; only its DataSize is checked, by emfplus.record.data_size_alignment"
220
+ - id: emfplus.draw.driver_string
221
+ format: emf_plus
222
+ record_types: [EmfPlusDrawDriverString]
223
+ citation: "MS-EMFPLUS 2.3.4.6"
224
+ status: implemented
225
+ reason: null
226
+ - id: emfplus.draw.driver_string_matrix
227
+ format: emf_plus
228
+ record_types: [EmfPlusDrawDriverString]
229
+ citation: "MS-EMFPLUS 2.3.4.6"
230
+ status: implemented
231
+ reason: null
232
+ - id: emfplus.draw.driver_string_options
233
+ format: emf_plus
234
+ record_types: [EmfPlusDrawDriverString]
235
+ citation: "MS-EMFPLUS 2.3.4.6"
236
+ status: implemented
237
+ reason: null
238
+ - id: emfplus.draw.driver_string_glyphs
239
+ format: emf_plus
240
+ record_types: [EmfPlusDrawDriverString]
241
+ citation: "MS-EMFPLUS 2.3.4.6"
242
+ status: not_checkable
243
+ reason: "a glyph index is valid only against the font's glyph table, which lives in the font file and is not carried by EmfPlusFont; GlyphPos against the glyph array is by-construction one-to-one, since both arrays are sized by GlyphCount (emfplus.draw.driver_string). The RealizedAdvance sentence (GlyphPos holds the first glyph only) contradicts the DataSize formula that counts GlyphCount positions, so no clause is enforced from it"
244
+ - id: emfplus.draw.string
245
+ format: emf_plus
246
+ record_types: [EmfPlusDrawString]
247
+ citation: "MS-EMFPLUS 2.3.4.14"
248
+ status: implemented
249
+ reason: null
250
+ - id: emfplus.draw.string_format
251
+ format: emf_plus
252
+ record_types: [EmfPlusDrawString]
253
+ citation: "MS-EMFPLUS 2.3.4.14"
254
+ status: not_checkable
255
+ reason: "the public EmfPlusFont and EmfPlusStringFormat objects now decode (Objects::Font, Objects::StringFormat) and are bound-checked by emfplus.object.payload; the record text states no MUST tying Length, LayoutRect or FormatID to their contents"
256
+ - id: emfplus.draw.image
257
+ format: emf_plus
258
+ record_types: [EmfPlusDrawImage, EmfPlusDrawImagePoints]
259
+ citation: "MS-EMFPLUS 2.3.4.8"
260
+ status: implemented
261
+ reason: null
262
+ - id: emfplus.image.fields
263
+ format: emf_plus
264
+ record_types: [EmfPlusObject]
265
+ citation: "MS-EMFPLUS 2.2.1.4"
266
+ status: implemented
267
+ reason: null
268
+ - id: emfplus.image.pixel_data
269
+ format: emf_plus
270
+ record_types: [EmfPlusObject]
271
+ citation: "MS-EMFPLUS 2.2.2.3"
272
+ status: implemented
273
+ reason: null
274
+ - id: emfplus.object.type
275
+ format: emf_plus
276
+ record_types: [EmfPlusObject]
277
+ citation: "MS-EMFPLUS 2.3.5.1"
278
+ status: implemented
279
+ reason: null
280
+ - id: emfplus.object.payload
281
+ format: emf_plus
282
+ record_types: [EmfPlusObject]
283
+ citation: "MS-EMFPLUS 2.3.5.1"
284
+ status: implemented
285
+ reason: null
286
+ - id: emfplus.object.fields
287
+ format: emf_plus
288
+ record_types: [EmfPlusObject]
289
+ citation: "MS-EMFPLUS 2.2.1"
290
+ status: implemented
291
+ reason: null
292
+ - id: emfplus.object.pen_line_fields
293
+ format: emf_plus
294
+ record_types: [EmfPlusObject]
295
+ citation: "MS-EMFPLUS 2.2.2.34"
296
+ status: implemented
297
+ reason: null
298
+ - id: emfplus.object.serializable
299
+ format: emf_plus
300
+ record_types: [EmfPlusSerializableObject]
301
+ citation: "MS-EMFPLUS 2.3.5.2"
302
+ status: implemented
303
+ reason: null
304
+ - id: emfplus.object.serializable_guid
305
+ format: emf_plus
306
+ record_types: [EmfPlusSerializableObject]
307
+ citation: "MS-EMFPLUS 2.3.5.2"
308
+ status: implemented
309
+ reason: null
310
+ - id: emfplus.object.serializable_buffer
311
+ format: emf_plus
312
+ record_types: [EmfPlusSerializableObject]
313
+ citation: "MS-EMFPLUS 2.3.5.2"
314
+ status: implemented
315
+ reason: null
316
+ - id: emfplus.object.effect_parameters
317
+ format: emf_plus
318
+ record_types: [EmfPlusSerializableObject]
319
+ citation: "MS-EMFPLUS 2.2.3"
320
+ status: implemented
321
+ reason: null
322
+ - id: emfplus.terminal.graphics
323
+ format: emf_plus
324
+ record_types: [EmfPlusSetTSGraphics]
325
+ citation: "MS-EMFPLUS 2.3.8.2"
326
+ status: implemented
327
+ reason: null
328
+ - id: emfplus.terminal.graphics_palette
329
+ format: emf_plus
330
+ record_types: [EmfPlusSetTSGraphics]
331
+ citation: "MS-EMFPLUS 2.3.8.2"
332
+ status: implemented
333
+ reason: null
334
+ - id: emfplus.terminal.graphics_enums
335
+ format: emf_plus
336
+ record_types: [EmfPlusSetTSGraphics]
337
+ citation: "MS-EMFPLUS 2.3.8.2"
338
+ status: implemented
339
+ reason: null
340
+ - id: emfplus.terminal.clip
341
+ format: emf_plus
342
+ record_types: [EmfPlusSetTSClip]
343
+ citation: "MS-EMFPLUS 2.3.8.1"
344
+ status: implemented
345
+ reason: null
346
+ - id: emfplus.terminal.clip_compressed
347
+ format: emf_plus
348
+ record_types: [EmfPlusSetTSClip]
349
+ citation: "MS-EMFPLUS 2.3.8.1"
350
+ status: blocked:model
351
+ reason: "with C set the rectangles stay raw bytes (SetTSClip#rect_data): the model does not decode the 1-or-2-byte delta scheme, whose first-rectangle reference and two-byte sign rule the text does not give, and which contradicts the 4-bytes-per-rectangle DataSize formula; emfplus.terminal.clip checks only the lower bound both readings imply"
352
+ - id: emfplus.stroke_fill_path.fields
353
+ format: emf_plus
354
+ record_types: [EmfPlusStrokeFillPath]
355
+ citation: "MS-EMFPLUS 2.1.1.1"
356
+ status: blocked:model
357
+ reason: "0x4037 appears in MS-EMFPLUS only as a RecordType enumeration entry and a one-line description, with no record layout, so the model decodes it as Records::Unknown and there are no public fields to check; emfplus.record.stroke_fill_path (emf_plus.rb) reports its presence"
@@ -0,0 +1,33 @@
1
+ # Chunk-1 EMF+ rules (record typing, header placement, stream framing).
2
+ - id: emfplus.record.reserved_type
3
+ format: emf_plus
4
+ record_types: []
5
+ citation: "MS-EMFPLUS 2.1.1.1"
6
+ status: implemented
7
+ reason: null
8
+ - id: emfplus.record.stroke_fill_path
9
+ format: emf_plus
10
+ record_types: []
11
+ citation: "MS-EMFPLUS 2.1.1.1"
12
+ status: implemented
13
+ reason: null
14
+ - id: emfplus.record.unknown_type
15
+ format: emf_plus
16
+ record_types: []
17
+ citation: "MS-EMFPLUS 2.1.1.1"
18
+ status: implemented
19
+ reason: null
20
+ - id: emfplus.header.placement
21
+ format: emf_plus
22
+ record_types: [EmfPlusHeader]
23
+ citation: "MS-EMFPLUS 2.3.3.3"
24
+ status: implemented
25
+ reason: null
26
+ # Drops the copy of a defect that emfplus.record.body_bounds (undecodable body, located) or
27
+ # emfplus.object.effect_missing already reports.
28
+ - id: emfplus.stream.framing
29
+ format: emf_plus
30
+ record_types: []
31
+ citation: "MS-EMFPLUS 2.3"
32
+ status: implemented
33
+ reason: null