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,403 @@
1
+ # State, transform, path bracket and clipping rule manifest (issue #37 W08, W10).
2
+ - id: emf.state.fixed_size
3
+ format: emf
4
+ record_types:
5
+ - EMR_SETMAPPERFLAGS
6
+ - EMR_SETCOLORADJUSTMENT
7
+ - EMR_RESTOREDC
8
+ - EMR_SETARCDIRECTION
9
+ - EMR_SETICMMODE
10
+ - EMR_SETLAYOUT
11
+ citation: MS-EMF 2.3.11
12
+ status: implemented
13
+ reason:
14
+ # For EMR_PIXELFORMAT and EMR_FORCEUFIMAPPING only an oversized record is reported here; a Size below the layout is
15
+ # emf.opaque.fixed_size.
16
+ - id: emf.state.layout_size
17
+ format: emf
18
+ record_types:
19
+ - EMR_SETWINDOWEXTEX
20
+ - EMR_SETWINDOWORGEX
21
+ - EMR_SETVIEWPORTEXTEX
22
+ - EMR_SETVIEWPORTORGEX
23
+ - EMR_SETBRUSHORGEX
24
+ - EMR_SETMAPMODE
25
+ - EMR_SETBKMODE
26
+ - EMR_SETPOLYFILLMODE
27
+ - EMR_SETROP2
28
+ - EMR_SETSTRETCHBLTMODE
29
+ - EMR_SETTEXTALIGN
30
+ - EMR_SETTEXTCOLOR
31
+ - EMR_SETBKCOLOR
32
+ - EMR_MOVETOEX
33
+ - EMR_SCALEVIEWPORTEXTEX
34
+ - EMR_SCALEWINDOWEXTEX
35
+ - EMR_SAVEDC
36
+ - EMR_REALIZEPALETTE
37
+ - EMR_SETMITERLIMIT
38
+ - EMR_PIXELFORMAT
39
+ - EMR_FORCEUFIMAPPING
40
+ - EMR_SETTEXTJUSTIFICATION
41
+ citation: MS-EMF 2.3.11
42
+ status: implemented
43
+ reason:
44
+ - id: emf.state.map_mode
45
+ format: emf
46
+ record_types:
47
+ - EMR_SETMAPMODE
48
+ citation: MS-EMF 2.3.11.19
49
+ status: implemented
50
+ reason:
51
+ - id: emf.state.bk_mode
52
+ format: emf
53
+ record_types:
54
+ - EMR_SETBKMODE
55
+ citation: MS-EMF 2.3.11.11
56
+ status: implemented
57
+ reason:
58
+ - id: emf.state.poly_fill_mode
59
+ format: emf
60
+ record_types:
61
+ - EMR_SETPOLYFILLMODE
62
+ citation: MS-EMF 2.3.11.22
63
+ status: implemented
64
+ reason:
65
+ - id: emf.state.rop2
66
+ format: emf
67
+ record_types:
68
+ - EMR_SETROP2
69
+ citation: MS-EMF 2.3.11.23
70
+ status: implemented
71
+ reason:
72
+ - id: emf.state.stretch_mode
73
+ format: emf
74
+ record_types:
75
+ - EMR_SETSTRETCHBLTMODE
76
+ citation: MS-EMF 2.3.11.24
77
+ status: implemented
78
+ reason:
79
+ - id: emf.state.arc_direction
80
+ format: emf
81
+ record_types:
82
+ - EMR_SETARCDIRECTION
83
+ citation: MS-EMF 2.3.11.9
84
+ status: implemented
85
+ reason:
86
+ - id: emf.state.icm_mode
87
+ format: emf
88
+ record_types:
89
+ - EMR_SETICMMODE
90
+ citation: MS-EMF 2.3.11.14
91
+ status: implemented
92
+ reason:
93
+ - id: emf.state.layout_mode
94
+ format: emf
95
+ record_types:
96
+ - EMR_SETLAYOUT
97
+ citation: MS-EMF 2.3.11.17
98
+ status: implemented
99
+ reason:
100
+ - id: emf.state.mapper_flags
101
+ format: emf
102
+ record_types:
103
+ - EMR_SETMAPPERFLAGS
104
+ citation: MS-EMF 2.3.11.20
105
+ status: implemented
106
+ reason:
107
+ - id: emf.state.text_align
108
+ format: emf
109
+ record_types:
110
+ - EMR_SETTEXTALIGN
111
+ citation: MS-EMF 2.3.11.25
112
+ status: implemented
113
+ reason:
114
+ - id: emf.state.scale_viewport_ext
115
+ format: emf
116
+ record_types:
117
+ - EMR_SCALEVIEWPORTEXTEX
118
+ citation: MS-EMF 2.3.11.7
119
+ status: implemented
120
+ reason:
121
+ - id: emf.state.scale_window_ext
122
+ format: emf
123
+ record_types:
124
+ - EMR_SCALEWINDOWEXTEX
125
+ citation: MS-EMF 2.3.11.8
126
+ status: implemented
127
+ reason:
128
+ - id: emf.state.restoredc_negative
129
+ format: emf
130
+ record_types:
131
+ - EMR_RESTOREDC
132
+ citation: MS-EMF 2.3.11.6
133
+ status: implemented
134
+ reason:
135
+ - id: emf.state.color_adjustment
136
+ format: emf
137
+ record_types:
138
+ - EMR_SETCOLORADJUSTMENT
139
+ citation: MS-EMF 2.2.2
140
+ status: implemented
141
+ reason:
142
+ - id: emf.state.pixel_format_version
143
+ format: emf
144
+ record_types:
145
+ - EMR_PIXELFORMAT
146
+ citation: MS-EMF 2.2.22
147
+ status: implemented
148
+ reason:
149
+ - id: emf.state.color_match_target
150
+ format: emf
151
+ record_types:
152
+ - EMR_COLORMATCHTOTARGETW
153
+ citation: MS-EMF 2.3.11.1
154
+ status: implemented
155
+ reason:
156
+ - id: emf.state.profile_bounds
157
+ format: emf
158
+ record_types:
159
+ - EMR_SETICMPROFILEA
160
+ - EMR_SETICMPROFILEW
161
+ - EMR_COLORMATCHTOTARGETW
162
+ citation: MS-EMF 2.3.11.15
163
+ status: implemented
164
+ reason:
165
+ - id: emf.state.linked_ufis_bounds
166
+ format: emf
167
+ record_types:
168
+ - EMR_SETLINKEDUFIS
169
+ citation: MS-EMF 2.3.11.18
170
+ status: implemented
171
+ reason:
172
+ - id: emf.transform.fixed_size
173
+ format: emf
174
+ record_types:
175
+ - EMR_SETWORLDTRANSFORM
176
+ - EMR_MODIFYWORLDTRANSFORM
177
+ citation: MS-EMF 2.3.12
178
+ status: implemented
179
+ reason:
180
+ - id: emf.transform.modify_mode
181
+ format: emf
182
+ record_types:
183
+ - EMR_MODIFYWORLDTRANSFORM
184
+ citation: MS-EMF 2.3.12.1
185
+ status: implemented
186
+ reason:
187
+ - id: emf.transform.finite_matrix
188
+ format: emf
189
+ record_types:
190
+ - EMR_SETWORLDTRANSFORM
191
+ - EMR_MODIFYWORLDTRANSFORM
192
+ citation: MS-EMF 2.2.28
193
+ status: implemented
194
+ reason:
195
+ - id: emf.path.fixed_size
196
+ format: emf
197
+ record_types:
198
+ - EMR_ABORTPATH
199
+ - EMR_BEGINPATH
200
+ - EMR_CLOSEFIGURE
201
+ - EMR_ENDPATH
202
+ - EMR_FLATTENPATH
203
+ - EMR_WIDENPATH
204
+ citation: MS-EMF 2.3.10
205
+ status: implemented
206
+ reason:
207
+ - id: emf.path.begin_nested
208
+ format: emf
209
+ record_types:
210
+ - EMR_BEGINPATH
211
+ citation: MS-EMF 2.3.10
212
+ status: implemented
213
+ reason:
214
+ - id: emf.path.unclosed
215
+ format: emf
216
+ record_types:
217
+ - EMR_BEGINPATH
218
+ citation: MS-EMF 2.3.10
219
+ status: implemented
220
+ reason:
221
+ - id: emf.path.end_unopened
222
+ format: emf
223
+ record_types:
224
+ - EMR_ENDPATH
225
+ citation: MS-EMF 2.3.10
226
+ status: implemented
227
+ reason:
228
+ - id: emf.path.closefigure_outside
229
+ format: emf
230
+ record_types:
231
+ - EMR_CLOSEFIGURE
232
+ citation: MS-EMF 2.3.10
233
+ status: implemented
234
+ reason:
235
+ - id: emf.clip.layout_size
236
+ format: emf
237
+ record_types:
238
+ - EMR_EXCLUDECLIPRECT
239
+ - EMR_INTERSECTCLIPRECT
240
+ - EMR_OFFSETCLIPRGN
241
+ - EMR_SELECTCLIPPATH
242
+ - EMR_SETMETARGN
243
+ citation: MS-EMF 2.3.2
244
+ status: implemented
245
+ reason:
246
+ - id: emf.clip.select_clip_path_mode
247
+ format: emf
248
+ record_types:
249
+ - EMR_SELECTCLIPPATH
250
+ citation: MS-EMF 2.3.2.5
251
+ status: implemented
252
+ reason:
253
+ - id: emf.clip.ext_select_clip_rgn_mode
254
+ format: emf
255
+ record_types:
256
+ - EMR_EXTSELECTCLIPRGN
257
+ citation: MS-EMF 2.3.2.2
258
+ status: implemented
259
+ reason:
260
+ - id: emf.dc.restore_depth
261
+ format: emf
262
+ record_types:
263
+ - EMR_SAVEDC
264
+ - EMR_RESTOREDC
265
+ citation: MS-EMF 2.3.11.6
266
+ status: implemented
267
+ reason:
268
+ - id: emf.state.setmiterlimit.value
269
+ format: emf
270
+ record_types:
271
+ - EMR_SETMITERLIMIT
272
+ citation: MS-EMF 2.3.11.21
273
+ status: not_checkable
274
+ reason: the section types MiterLimit as an unsigned integer while the wire exposes
275
+ a float32; the section states no range, so no clause is checkable
276
+ - id: emf.state.pixel_format_flags
277
+ format: emf
278
+ record_types:
279
+ - EMR_PIXELFORMAT
280
+ citation: MS-EMF 2.2.22
281
+ status: deferred
282
+ reason: PFD_DOUBLEBUFFER and PFD_SUPPORT_GDI MUST NOT both be set. dw_flags is exposed and
283
+ readable, but the converted reference text drops the flag bit values (the flag diagram
284
+ labels cannot be mapped to bit positions from the text alone, and no fixture carries
285
+ an EMR_PIXELFORMAT to measure them), so the check waits for the wingdi.h constants
286
+ - id: emf.state.icm_profile_flags_encoding
287
+ format: emf
288
+ record_types:
289
+ - EMR_SETICMPROFILEA
290
+ - EMR_SETICMPROFILEW
291
+ citation: MS-EMF 2.3.11.15
292
+ status: not_checkable
293
+ reason: dwFlags values and the ASCII/UTF-16LE content of the name are not constrained
294
+ by the section beyond the cbName+cbData length (checked by emf.state.profile_bounds)
295
+ - id: emf.state.color_adjustment_ranges
296
+ format: emf
297
+ record_types:
298
+ - EMR_SETCOLORADJUSTMENT
299
+ citation: MS-EMF 2.2.2
300
+ status: not_checkable
301
+ reason: gamma, contrast, brightness, colorfulness and tint ranges are SHOULD, and
302
+ Values is any combination of the ColorAdjustment enumeration; only Size and IlluminantIndex
303
+ are normative (checked)
304
+ - id: emf.state.color_match_delete_transform
305
+ format: emf
306
+ record_types:
307
+ - EMR_COLORMATCHTOTARGETW
308
+ citation: MS-EMF 2.3.11.1
309
+ status: not_checkable
310
+ reason: CS_DELETE_TRANSFORM SHOULD NOT be used before an EMR_SETICMMODE is a SHOULD
311
+ NOT sequence statement
312
+ - id: emf.state.scale_fixed_mapping_mode
313
+ format: emf
314
+ record_types:
315
+ - EMR_SCALEVIEWPORTEXTEX
316
+ - EMR_SCALEWINDOWEXTEX
317
+ citation: MS-EMF 2.3.11.7
318
+ status: not_checkable
319
+ reason: the extent MUST NOT change under a fixed-scale mapping mode is playback
320
+ behaviour of the device context, not a property of the record stream
321
+ - id: emf.state.ufi_content
322
+ format: emf
323
+ record_types:
324
+ - EMR_FORCEUFIMAPPING
325
+ - EMR_SETLINKEDUFIS
326
+ citation: MS-EMF 2.3.11.2
327
+ status: not_checkable
328
+ reason: UniversalFontId checksum and index have no stated value constraints; SETLINKEDUFIS
329
+ Reserved MUST be ignored
330
+ - id: emf.state.point_size_values
331
+ format: emf
332
+ record_types:
333
+ - EMR_SETWINDOWEXTEX
334
+ - EMR_SETWINDOWORGEX
335
+ - EMR_SETVIEWPORTEXTEX
336
+ - EMR_SETVIEWPORTORGEX
337
+ - EMR_SETBRUSHORGEX
338
+ - EMR_MOVETOEX
339
+ - EMR_SETTEXTCOLOR
340
+ - EMR_SETBKCOLOR
341
+ - EMR_SETTEXTJUSTIFICATION
342
+ - EMR_REALIZEPALETTE
343
+ - EMR_SAVEDC
344
+ citation: MS-EMF 2.3.11
345
+ status: not_checkable
346
+ reason: the sections state no value constraint beyond the fixed layout (checked
347
+ by emf.state.layout_size)
348
+ - id: emf.state.invert_rgn_data
349
+ format: emf
350
+ record_types:
351
+ - EMR_INVERTRGN
352
+ citation: MS-EMF 2.3.11.3
353
+ status: not_checkable
354
+ reason: an RgnDataSize larger than the record is recovered by the parser as a Raw
355
+ record and reported by emf.record.array_exceeds_size; RegionData internals belong
356
+ to the region rules of W11
357
+ - id: emf.clip.ext_select_clip_rgn_data
358
+ format: emf
359
+ record_types:
360
+ - EMR_EXTSELECTCLIPRGN
361
+ citation: MS-EMF 2.3.2.2
362
+ status: not_checkable
363
+ reason: an RgnDataSize larger than the record is reported by emf.record.array_exceeds_size;
364
+ RGN_COPY may omit RgnData (SHOULD); RegionData internals belong to the region
365
+ rules of W11
366
+ - id: emf.clip.rect_values
367
+ format: emf
368
+ record_types:
369
+ - EMR_EXCLUDECLIPRECT
370
+ - EMR_INTERSECTCLIPRECT
371
+ - EMR_OFFSETCLIPRGN
372
+ citation: MS-EMF 2.3.2.1
373
+ status: not_checkable
374
+ reason: the sections state no value constraint on the rectangle or offset beyond
375
+ the fixed layout (checked by emf.clip.layout_size)
376
+ - id: emf.clip.select_clip_path_needs_path
377
+ format: emf
378
+ record_types:
379
+ - EMR_SELECTCLIPPATH
380
+ citation: MS-EMF 2.3.2.5
381
+ status: not_checkable
382
+ reason: the section states no requirement that a path bracket exist or be closed
383
+ when the record is processed
384
+ - id: emf.path.records_inside_bracket
385
+ format: emf
386
+ record_types:
387
+ - EMR_FLATTENPATH
388
+ - EMR_WIDENPATH
389
+ - EMR_FILLPATH
390
+ - EMR_STROKEPATH
391
+ - EMR_STROKEANDFILLPATH
392
+ citation: MS-EMF 2.3.10
393
+ status: not_checkable
394
+ reason: the section does not say these records must occur inside or outside a bracket;
395
+ only BEGINPATH nesting and bracket closure carry MUST
396
+ - id: emf.state.restoredc_positive_depth
397
+ format: emf
398
+ record_types:
399
+ - EMR_RESTOREDC
400
+ citation: MS-EMF 2.3.11.6
401
+ status: not_checkable
402
+ reason: a non-negative SavedDC is reported by emf.state.restoredc_negative; its
403
+ depth is not interpreted
@@ -0,0 +1,97 @@
1
+ # EMF text records (work item W12). Offsets, counts and option bits are read from the record bytes.
2
+ - id: emf.exttextout.string_bounds
3
+ format: emf
4
+ record_types: [EMR_EXTTEXTOUTA, EMR_EXTTEXTOUTW]
5
+ citation: "MS-EMF 2.2.5"
6
+ status: implemented
7
+ reason: null
8
+ - id: emf.exttextout.string_offset_alignment
9
+ format: emf
10
+ record_types: [EMR_EXTTEXTOUTA, EMR_EXTTEXTOUTW]
11
+ citation: "MS-EMF 2.2.5"
12
+ status: implemented
13
+ reason: null
14
+ - id: emf.exttextout.dx_bounds
15
+ format: emf
16
+ record_types: [EMR_EXTTEXTOUTA, EMR_EXTTEXTOUTW]
17
+ citation: "MS-EMF 2.2.5"
18
+ status: implemented
19
+ reason: null
20
+ - id: emf.exttextout.dx_offset_alignment
21
+ format: emf
22
+ record_types: [EMR_EXTTEXTOUTA, EMR_EXTTEXTOUTW]
23
+ citation: "MS-EMF 2.2.5"
24
+ status: implemented
25
+ reason: null
26
+ - id: emf.exttextout.string_encoding
27
+ format: emf
28
+ record_types: [EMR_EXTTEXTOUTW]
29
+ citation: "MS-EMF 2.2.5"
30
+ status: implemented
31
+ reason: null
32
+ - id: emf.exttextout.options_defined
33
+ format: emf
34
+ record_types: [EMR_EXTTEXTOUTA, EMR_EXTTEXTOUTW]
35
+ citation: "MS-EMF 2.1.11"
36
+ status: implemented
37
+ reason: null
38
+ - id: emf.exttextout.chars_count
39
+ format: emf
40
+ record_types: [EMR_EXTTEXTOUTA, EMR_EXTTEXTOUTW]
41
+ citation: "MS-EMF 2.2.5"
42
+ status: not_checkable
43
+ reason: "Chars is the only length of OutputString (no terminator or second count exists to compare); what can be checked is that Chars characters lie inside the record, which string_bounds covers."
44
+ - id: emf.exttextout.string_encoding_ansi
45
+ format: emf
46
+ record_types: [EMR_EXTTEXTOUTA]
47
+ citation: "MS-EMF 2.2.5"
48
+ status: not_checkable
49
+ reason: "The 8-bit characters are ASCII per the spec but the producer's code page is the selected font charset, which the record does not carry, so no byte value is invalid."
50
+ - id: emf.exttextout.bounds_ignored
51
+ format: emf
52
+ record_types: [EMR_EXTTEXTOUTA, EMR_EXTTEXTOUTW]
53
+ citation: "MS-EMF EMR_EXTTEXTOUTA Record"
54
+ status: not_checkable
55
+ reason: "The Bounds rectangle MUST be ignored on receipt, and exScale/eyScale only SHOULD be used when iGraphicsMode is GM_COMPATIBLE, so neither field carries a checkable requirement."
56
+ - id: emf.smalltextout.text_string
57
+ format: emf
58
+ record_types: [EMR_SMALLTEXTOUT]
59
+ citation: "MS-EMF 2.3.5.37"
60
+ status: implemented
61
+ reason: null
62
+ - id: emf.smalltextout.options_defined
63
+ format: emf
64
+ record_types: [EMR_SMALLTEXTOUT]
65
+ citation: "MS-EMF 2.1.11"
66
+ status: implemented
67
+ reason: null
68
+ - id: emf.smalltextout.char_width
69
+ format: emf
70
+ record_types: [EMR_SMALLTEXTOUT]
71
+ citation: "MS-EMF EMR_SMALLTEXTOUT Record"
72
+ status: not_checkable
73
+ reason: "The spec contradicts itself: the cChars bullet says 16-bit characters while TextString says 8- or 16-bit by fuOptions (ETO_SMALL_CHARS), so no single normative width exists; text_string uses the fuOptions width."
74
+ - id: emf.smalltextout.bounds_presence
75
+ format: emf
76
+ record_types: [EMR_SMALLTEXTOUT]
77
+ citation: "MS-EMF EMR_SMALLTEXTOUT Record"
78
+ status: not_checkable
79
+ reason: "The spec states no condition under which the optional Bounds rectangle is present beyond ETO_NO_RECT, which text_string already follows to locate TextString."
80
+ - id: emf.polytextout.strings
81
+ format: emf
82
+ record_types: [EMR_POLYTEXTOUTA, EMR_POLYTEXTOUTW]
83
+ citation: "MS-EMF 2.3.5.32"
84
+ status: implemented
85
+ reason: null
86
+ - id: emf.polytextout.dx
87
+ format: emf
88
+ record_types: [EMR_POLYTEXTOUTA, EMR_POLYTEXTOUTW]
89
+ citation: "MS-EMF 2.3.5.32"
90
+ status: implemented
91
+ reason: null
92
+ - id: emf.polytextout.options_defined
93
+ format: emf
94
+ record_types: [EMR_POLYTEXTOUTA, EMR_POLYTEXTOUTW]
95
+ citation: "MS-EMF 2.1.11"
96
+ status: implemented
97
+ reason: null