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,874 @@
1
+ # WMF requirement manifest (W20/W21). Stable ids; rows are implemented, blocked:model or not_checkable.
2
+ ---
3
+ - id: wmf.header.type
4
+ format: wmf
5
+ record_types: []
6
+ citation: MS-WMF 2.3.2.2 META_HEADER (Type); 2.1.1.18 MetafileType Enumeration
7
+ status: implemented
8
+ reason:
9
+ - id: wmf.header.version
10
+ format: wmf
11
+ record_types: []
12
+ citation: MS-WMF 2.3.2.2 META_HEADER (Version); 2.1.1.19 MetafileVersion Enumeration
13
+ status: implemented
14
+ reason:
15
+ - id: wmf.header.size
16
+ format: wmf
17
+ record_types: []
18
+ citation: MS-WMF 2.3.2.2 META_HEADER (SizeLow, SizeHigh)
19
+ status: implemented
20
+ reason:
21
+ - id: wmf.header.number_of_members
22
+ format: wmf
23
+ record_types: []
24
+ citation: MS-WMF 2.3.2.2 META_HEADER (NumberOfMembers)
25
+ status: implemented
26
+ reason:
27
+ - id: wmf.placeable.handle
28
+ format: wmf
29
+ record_types: []
30
+ citation: MS-WMF 2.3.2.3 META_PLACEABLE (HWmf)
31
+ status: implemented
32
+ reason:
33
+ - id: wmf.placeable.checksum
34
+ format: wmf
35
+ record_types: []
36
+ citation: MS-WMF 2.3.2.3 META_PLACEABLE (Checksum)
37
+ status: implemented
38
+ reason:
39
+ - id: wmf.eof.missing
40
+ format: wmf
41
+ record_types:
42
+ - META_EOF
43
+ citation: MS-WMF 2.3.2.1 META_EOF
44
+ status: implemented
45
+ reason:
46
+ - id: wmf.eof.not_last
47
+ format: wmf
48
+ record_types:
49
+ - META_EOF
50
+ citation: MS-WMF 2.3.2.1 META_EOF
51
+ status: implemented
52
+ reason:
53
+ - id: wmf.record.unknown_function
54
+ format: wmf
55
+ record_types: []
56
+ citation: MS-WMF 2.1.1.1 RecordType Enumeration; 2.3 WMF Records (unknown record types are ignored)
57
+ status: implemented
58
+ reason:
59
+ - id: wmf.eof.trailing_bytes
60
+ format: wmf
61
+ record_types: []
62
+ citation: MS-WMF 2.3.2.2 META_HEADER (SizeLow, SizeHigh)
63
+ status: implemented
64
+ reason:
65
+ - id: wmf.enum.bk_mode
66
+ format: wmf
67
+ record_types:
68
+ - META_SETBKMODE
69
+ citation: MS-WMF 2.1.1.20 MixMode Enumeration; 2.3.5.15 META_SETBKMODE (BkMode)
70
+ status: implemented
71
+ reason:
72
+ - id: wmf.enum.map_mode
73
+ format: wmf
74
+ record_types:
75
+ - META_SETMAPMODE
76
+ citation: MS-WMF 2.1.1.16 MapMode Enumeration; 2.3.5.17 META_SETMAPMODE (MapMode)
77
+ status: implemented
78
+ reason:
79
+ - id: wmf.enum.poly_fill_mode
80
+ format: wmf
81
+ record_types:
82
+ - META_SETPOLYFILLMODE
83
+ citation: MS-WMF 2.1.1.25 PolyFillMode Enumeration; 2.3.5.20 META_SETPOLYFILLMODE (PolyFillMode)
84
+ status: implemented
85
+ reason:
86
+ - id: wmf.enum.rop2
87
+ format: wmf
88
+ record_types:
89
+ - META_SETROP2
90
+ citation: MS-WMF 2.1.1.2 BinaryRasterOperation Enumeration; 2.3.5.22 META_SETROP2 (DrawMode)
91
+ status: implemented
92
+ reason:
93
+ - id: wmf.enum.stretch_blt_mode
94
+ format: wmf
95
+ record_types:
96
+ - META_SETSTRETCHBLTMODE
97
+ citation: MS-WMF 2.1.1.30 StretchMode Enumeration; 2.3.5.23 META_SETSTRETCHBLTMODE (StretchMode)
98
+ status: implemented
99
+ reason:
100
+ - id: wmf.enum.ext_flood_fill_mode
101
+ format: wmf
102
+ record_types:
103
+ - META_EXTFLOODFILL
104
+ citation: MS-WMF 2.1.1.9 FloodFill Enumeration; 2.3.3.4 META_EXTFLOODFILL (Mode)
105
+ status: implemented
106
+ reason:
107
+ - id: wmf.enum.brush_style
108
+ format: wmf
109
+ record_types:
110
+ - META_CREATEBRUSHINDIRECT
111
+ citation: MS-WMF 2.1.1.4 BrushStyle Enumeration; 2.3.4.1 META_CREATEBRUSHINDIRECT, 2.2.2.10 LogBrush Object (BrushStyle)
112
+ status: implemented
113
+ reason:
114
+ - id: wmf.enum.color_usage
115
+ format: wmf
116
+ record_types:
117
+ - META_DIBCREATEPATTERNBRUSH
118
+ - META_SETDIBTODEV
119
+ - META_STRETCHDIB
120
+ citation: MS-WMF 2.1.1.6 ColorUsage Enumeration; 2.3.4.8 META_DIBCREATEPATTERNBRUSH, 2.3.1.4 META_SETDIBTODEV, 2.3.1.6 META_STRETCHDIB (ColorUsage)
121
+ status: implemented
122
+ reason:
123
+ - id: wmf.enum.hatch_style
124
+ format: wmf
125
+ record_types:
126
+ - META_CREATEBRUSHINDIRECT
127
+ citation: MS-WMF 2.1.1.12 HatchStyle Enumeration; 2.2.2.10 LogBrush Object (BrushHatch), 2.3.4.1 META_CREATEBRUSHINDIRECT
128
+ status: implemented
129
+ reason:
130
+ - id: wmf.enum.pen_style
131
+ format: wmf
132
+ record_types:
133
+ - META_CREATEPENINDIRECT
134
+ citation: MS-WMF 2.1.1.23 PenStyle Enumeration; 2.2.1.4 Pen Object (PenStyle), 2.3.4.5 META_CREATEPENINDIRECT
135
+ status: implemented
136
+ reason:
137
+ - id: wmf.flags.text_align
138
+ format: wmf
139
+ record_types:
140
+ - META_SETTEXTALIGN
141
+ citation: MS-WMF 2.1.2.3 TextAlignmentMode Flags, 2.1.2.4 VerticalTextAlignmentMode Flags; 2.3.5.24 META_SETTEXTALIGN (TextAlignmentMode)
142
+ status: implemented
143
+ reason:
144
+ - id: wmf.flags.layout
145
+ format: wmf
146
+ record_types:
147
+ - META_SETLAYOUT
148
+ citation: MS-WMF 2.1.1.13 Layout Enumeration; 2.3.5.16 META_SETLAYOUT (Layout)
149
+ status: implemented
150
+ reason:
151
+ - id: wmf.fixed.layout_reserved
152
+ format: wmf
153
+ record_types:
154
+ - META_SETLAYOUT
155
+ citation: MS-WMF 2.3.5.16 META_SETLAYOUT (Reserved)
156
+ status: not_checkable
157
+ reason: the section says Reserved MUST be ignored, so no value is invalid
158
+ - id: wmf.array.point_count
159
+ format: wmf
160
+ record_types:
161
+ - META_POLYGON
162
+ - META_POLYLINE
163
+ citation: MS-WMF 2.3.3.14 META_POLYLINE, 2.3.3.15 META_POLYGON (NumberOfPoints)
164
+ status: implemented
165
+ reason:
166
+ - id: wmf.array.polypolygon_counts
167
+ format: wmf
168
+ record_types:
169
+ - META_POLYPOLYGON
170
+ citation: MS-WMF 2.2.2.17 PolyPolygon Object (NumberOfPolygons, aPointsPerPolygon); 2.3.3.16 META_POLYPOLYGON
171
+ status: implemented
172
+ reason:
173
+ - id: wmf.fixed.point_range
174
+ format: wmf
175
+ record_types:
176
+ - META_POLYGON
177
+ - META_POLYLINE
178
+ - META_POLYPOLYGON
179
+ citation: MS-WMF 2.2.2.16 PointS Object
180
+ status: implemented
181
+ reason:
182
+ - id: wmf.header.header_size
183
+ format: wmf
184
+ record_types: []
185
+ citation: MS-WMF 2.3.2.2 META_HEADER (HeaderSize)
186
+ status: blocked:model
187
+ reason: Model::Wmf::Header does not retain HeaderSize; the parser rejects any value
188
+ but 9 (reason 303) before a model exists
189
+ - id: wmf.header.max_record
190
+ format: wmf
191
+ record_types: []
192
+ citation: MS-WMF 2.3.2.2 META_HEADER (MaxRecord)
193
+ status: implemented
194
+ reason:
195
+ - id: wmf.header.size_matches_records
196
+ format: wmf
197
+ record_types: []
198
+ citation: MS-WMF 2.3.2.2 META_HEADER (SizeLow, SizeHigh)
199
+ status: implemented
200
+ reason:
201
+ - id: wmf.placeable.key
202
+ format: wmf
203
+ record_types: []
204
+ citation: MS-WMF 2.3.2.3 META_PLACEABLE (Key)
205
+ status: not_checkable
206
+ reason: the key is what selects the placeable layout, so an accepted model carrying
207
+ a placeable always had it
208
+ - id: wmf.placeable.reserved
209
+ format: wmf
210
+ record_types: []
211
+ citation: MS-WMF 2.3.2.3 META_PLACEABLE (Reserved)
212
+ status: blocked:model
213
+ reason: PlaceableHeader does not retain Reserved; the parser rejects nonzero (reason
214
+ 202) before a model exists
215
+ - id: wmf.placeable.bounding_box
216
+ format: wmf
217
+ record_types: []
218
+ citation: MS-WMF 2.3.2.3 META_PLACEABLE (BoundingBox, Inch)
219
+ status: not_checkable
220
+ reason: the specification states no validity constraint on BoundingBox or Inch values
221
+ - id: wmf.record.declared_size
222
+ format: wmf
223
+ record_types:
224
+ - META_ARC
225
+ - META_CHORD
226
+ - META_ELLIPSE
227
+ - META_PIE
228
+ - META_RECTANGLE
229
+ - META_ROUNDRECT
230
+ - META_LINETO
231
+ - META_MOVETO
232
+ - META_SETWINDOWORG
233
+ - META_SETWINDOWEXT
234
+ - META_SETVIEWPORTORG
235
+ - META_SETVIEWPORTEXT
236
+ - META_OFFSETWINDOWORG
237
+ - META_OFFSETVIEWPORTORG
238
+ citation: MS-WMF 2.3 (RecordSize)
239
+ status: implemented
240
+ reason:
241
+ - id: wmf.reject.r0101
242
+ format: wmf
243
+ record_types: []
244
+ citation: MS-WMF (none; implementation limit, the specification defines no input size bound)
245
+ status: not_checkable
246
+ reason: 'the specification states no input size bound (MS-WMF has no limit on a metafile), so no MUST can be violated; the 200 MiB cap is a parser resource limit and a larger input is reported as emf.parse.unparseable'
247
+ - id: wmf.reject.r0201
248
+ format: wmf
249
+ record_types: []
250
+ citation: MS-WMF 2.3.2.3 META_PLACEABLE
251
+ status: implemented
252
+ reason:
253
+ - id: wmf.reject.r0202
254
+ format: wmf
255
+ record_types: []
256
+ citation: MS-WMF 2.3.2.3 META_PLACEABLE
257
+ status: implemented
258
+ reason:
259
+ - id: wmf.reject.r0203
260
+ format: wmf
261
+ record_types: []
262
+ citation: MS-WMF 2.3.2.3 META_PLACEABLE
263
+ status: not_checkable
264
+ reason: 'the spec MUST holds, but the parser no longer rejects it: the placeable checksum disagrees with the header words, the model keeps the declared value and wmf.placeable.checksum reports it (an error when strict, a warning when tolerant), so no WMF failure with this reason exists to report'
265
+ - id: wmf.reject.r0301
266
+ format: wmf
267
+ record_types: []
268
+ citation: MS-WMF 2.3.2.2 META_HEADER
269
+ status: not_checkable
270
+ reason: 'the spec MUST holds, but the format detector turns such an input into an unrecognised signature before any WMF parse runs, so no WMF failure with this reason exists to report; the lens reports a wrong Type or HeaderSize as wmf.header.unrecognised and anything else as emf.parse.unparseable'
271
+ - id: wmf.reject.r0302
272
+ format: wmf
273
+ record_types: []
274
+ citation: MS-WMF 2.3.2.2 META_HEADER (Type); 2.1.1.18 MetafileType Enumeration
275
+ status: not_checkable
276
+ reason: 'the spec MUST holds, but the format detector turns such an input into an unrecognised signature before any WMF parse runs, so no WMF failure with this reason exists to report; the lens reports a wrong Type or HeaderSize as wmf.header.unrecognised and anything else as emf.parse.unparseable'
277
+ - id: wmf.reject.r0303
278
+ format: wmf
279
+ record_types: []
280
+ citation: MS-WMF 2.3.2.2 META_HEADER (HeaderSize)
281
+ status: not_checkable
282
+ reason: 'the spec MUST holds, but the format detector turns such an input into an unrecognised signature before any WMF parse runs, so no WMF failure with this reason exists to report; the lens reports a wrong Type or HeaderSize as wmf.header.unrecognised and anything else as emf.parse.unparseable'
283
+ - id: wmf.reject.r0304
284
+ format: wmf
285
+ record_types: []
286
+ citation: MS-WMF 2.3.2.2 META_HEADER (Version); 2.1.1.19 MetafileVersion Enumeration
287
+ status: implemented
288
+ reason:
289
+ - id: wmf.reject.r0305
290
+ format: wmf
291
+ record_types: []
292
+ citation: MS-WMF 2.3.2.2 META_HEADER (SizeLow, SizeHigh)
293
+ status: not_checkable
294
+ reason: 'the spec MUST holds, but the parser no longer rejects it: the header Size disagrees with the record stream, the model is kept and wmf.header.size_matches_records reports the drift (an error when strict, a warning when tolerant), so no WMF failure with this reason exists to report'
295
+ - id: wmf.reject.r0306
296
+ format: wmf
297
+ record_types: []
298
+ citation: MS-WMF 2.3.2.3 META_PLACEABLE (HWmf)
299
+ status: implemented
300
+ reason:
301
+ - id: wmf.reject.r0401
302
+ format: wmf
303
+ record_types: []
304
+ citation: MS-WMF (none; implementation limit, the specification defines no record count bound)
305
+ status: not_checkable
306
+ reason: 'the specification states no record count bound (MS-WMF 2.3 sets none), so no MUST can be violated; the one million record cap is a parser resource limit and a longer file is reported as emf.parse.unparseable'
307
+ - id: wmf.reject.r0402
308
+ format: wmf
309
+ record_types: []
310
+ citation: MS-WMF 2.3 WMF Records (RecordSize, RecordFunction)
311
+ status: implemented
312
+ reason:
313
+ - id: wmf.reject.r0403
314
+ format: wmf
315
+ record_types: []
316
+ citation: MS-WMF 2.3 (RecordSize)
317
+ status: implemented
318
+ reason:
319
+ - id: wmf.reject.r0404
320
+ format: wmf
321
+ record_types: []
322
+ citation: MS-WMF 2.3.2.1 META_EOF
323
+ status: not_checkable
324
+ reason: 'the spec MUST holds, but the parser no longer rejects it: the record walk ends at the first EOF and what follows is kept as trailing data, so a Size that reaches past that EOF is reported by wmf.header.size_matches_records and no WMF failure with this reason exists to report'
325
+ - id: wmf.reject.r0405
326
+ format: wmf
327
+ record_types: []
328
+ citation: MS-WMF 2.3.2.1 META_EOF
329
+ status: implemented
330
+ reason:
331
+ - id: wmf.reject.r0406
332
+ format: wmf
333
+ record_types: []
334
+ citation: MS-WMF 2.3.2.1 META_EOF (RecordSize)
335
+ status: not_checkable
336
+ reason: 'the spec MUST holds, but the parser no longer rejects it: an EOF record longer than three words still ends the stream, the model is kept and wmf.record.declared_size reports it (an error when strict, a warning when tolerant), so no WMF failure with this reason exists to report'
337
+ - id: wmf.reject.r0501
338
+ format: wmf
339
+ record_types: []
340
+ citation: MS-WMF 2.3 (RecordSize)
341
+ status: implemented
342
+ reason:
343
+ - id: wmf.reject.r0601
344
+ format: wmf
345
+ record_types: []
346
+ citation: MS-WMF 2.3.5 State Record Types
347
+ status: implemented
348
+ reason:
349
+ - id: wmf.reject.r0701
350
+ format: wmf
351
+ record_types: []
352
+ citation: MS-WMF 2.3.4.2 META_CREATEFONTINDIRECT, 2.2.1.2 Font Object
353
+ status: implemented
354
+ reason:
355
+ - id: wmf.reject.r0801
356
+ format: wmf
357
+ record_types: []
358
+ citation: MS-WMF 2.3.4 Object Record Types
359
+ status: implemented
360
+ reason:
361
+ - id: wmf.reject.r0901
362
+ format: wmf
363
+ record_types: []
364
+ citation: MS-WMF 2.3.3.14 META_POLYLINE, 2.3.3.15 META_POLYGON (NumberOfPoints), 2.2.2.17 PolyPolygon Object (NumberOfPolygons)
365
+ status: implemented
366
+ reason:
367
+ - id: wmf.reject.r0902
368
+ format: wmf
369
+ record_types: []
370
+ citation: MS-WMF 2.2.2.17 PolyPolygon Object (aPointsPerPolygon)
371
+ status: implemented
372
+ reason:
373
+ - id: wmf.reject.r0903
374
+ format: wmf
375
+ record_types: []
376
+ citation: MS-WMF 2.3.3.14 META_POLYLINE, 2.3.3.15 META_POLYGON (NumberOfPoints)
377
+ status: implemented
378
+ reason:
379
+ - id: wmf.reject.r0904
380
+ format: wmf
381
+ record_types: []
382
+ citation: MS-WMF 2.3.3.14 META_POLYLINE, 2.3.3.15 META_POLYGON (aPoints), 2.2.2.17 PolyPolygon Object (aPoints)
383
+ status: implemented
384
+ reason:
385
+ - id: wmf.reject.r1001
386
+ format: wmf
387
+ record_types: []
388
+ citation: MS-WMF 2.3.3.5 META_EXTTEXTOUT, 2.3.3.20 META_TEXTOUT
389
+ status: implemented
390
+ reason:
391
+ - id: wmf.reject.r1002
392
+ format: wmf
393
+ record_types: []
394
+ citation: MS-WMF 2.3.3.5 META_EXTTEXTOUT
395
+ status: implemented
396
+ reason:
397
+ - id: wmf.reject.r1003
398
+ format: wmf
399
+ record_types: []
400
+ citation: MS-WMF 2.3.3.5 META_EXTTEXTOUT, 2.3.3.20 META_TEXTOUT
401
+ status: not_checkable
402
+ reason: 'the spec MUST holds, but the parser no longer rejects it: a text record with a negative StringLength is kept verbatim as an opaque record and wmf.text.negative_length reports it (an error when strict, a warning when tolerant), so no WMF failure with this reason exists to report'
403
+ - id: wmf.reject.r1004
404
+ format: wmf
405
+ record_types: []
406
+ citation: MS-WMF 2.3.3.5 META_EXTTEXTOUT, 2.3.3.20 META_TEXTOUT
407
+ status: implemented
408
+ reason:
409
+ - id: wmf.reject.r1005
410
+ format: wmf
411
+ record_types: []
412
+ citation: MS-WMF 2.3.3.5 META_EXTTEXTOUT
413
+ status: implemented
414
+ reason:
415
+ - id: wmf.reject.r1101
416
+ format: wmf
417
+ record_types: []
418
+ citation: MS-WMF 2.2.1.3 Palette Object; 2.3.4.3 META_CREATEPALETTE, 2.3.5.19 META_SETPALENTRIES, 2.3.5.1 META_ANIMATEPALETTE, 2.3.4.11 META_SELECTPALETTE, 2.3.5.9 META_RESIZEPALETTE
419
+ status: implemented
420
+ reason:
421
+ - id: wmf.reject.r1102
422
+ format: wmf
423
+ record_types: []
424
+ citation: MS-WMF 2.2.1.3 Palette Object; 2.3.4.3 META_CREATEPALETTE, 2.3.5.19 META_SETPALENTRIES, 2.3.5.1 META_ANIMATEPALETTE
425
+ status: implemented
426
+ reason:
427
+ - id: wmf.reject.r1201
428
+ format: wmf
429
+ record_types: []
430
+ citation: MS-WMF 2.3.3.6 META_FILLREGION, 2.3.3.8 META_FRAMEREGION, 2.3.3.9 META_INVERTREGION, 2.3.3.11 META_PAINTREGION, 2.3.4.9 META_SELECTCLIPREGION, 2.3.5.5 META_OFFSETCLIPRGN
431
+ status: implemented
432
+ reason:
433
+ - id: wmf.reject.r1202
434
+ format: wmf
435
+ record_types: []
436
+ citation: MS-WMF 2.2.1.5 Region Object; 2.3.4.6 META_CREATEREGION
437
+ status: implemented
438
+ reason:
439
+ - id: wmf.reject.r1203
440
+ format: wmf
441
+ record_types: []
442
+ citation: MS-WMF 2.2.1.5 Region Object; 2.3.4.6 META_CREATEREGION
443
+ status: implemented
444
+ reason:
445
+ - id: wmf.reject.r1204
446
+ format: wmf
447
+ record_types: []
448
+ citation: MS-WMF 2.2.1.5 Region Object; 2.2.2.21 Scan Object
449
+ status: implemented
450
+ reason:
451
+ - id: wmf.reject.r1205
452
+ format: wmf
453
+ record_types: []
454
+ citation: MS-WMF 2.2.1.5 Region Object; 2.2.2.21 Scan Object
455
+ status: implemented
456
+ reason:
457
+ - id: wmf.reject.r1206
458
+ format: wmf
459
+ record_types: []
460
+ citation: MS-WMF 2.2.1.5 Region Object; 2.2.2.21 Scan Object
461
+ status: implemented
462
+ reason:
463
+ - id: wmf.reject.r1301
464
+ format: wmf
465
+ record_types: []
466
+ citation: MS-WMF 2.3.4.4 META_CREATEPATTERNBRUSH
467
+ status: implemented
468
+ reason:
469
+ - id: wmf.reject.r1302
470
+ format: wmf
471
+ record_types: []
472
+ citation: MS-WMF 2.3.4.4 META_CREATEPATTERNBRUSH
473
+ status: implemented
474
+ reason:
475
+ - id: wmf.reject.r1303
476
+ format: wmf
477
+ record_types: []
478
+ citation: MS-WMF 2.3.4.8 META_DIBCREATEPATTERNBRUSH
479
+ status: implemented
480
+ reason:
481
+ - id: wmf.reject.r1304
482
+ format: wmf
483
+ record_types: []
484
+ citation: MS-WMF 2.3.4.8 META_DIBCREATEPATTERNBRUSH (ColorUsage); 2.1.1.6 ColorUsage Enumeration
485
+ status: implemented
486
+ reason:
487
+ - id: wmf.reject.r1401
488
+ format: wmf
489
+ record_types: []
490
+ citation: MS-WMF 2.3.1 Bitmap Record Types
491
+ status: implemented
492
+ reason:
493
+ - id: wmf.reject.r1402
494
+ format: wmf
495
+ record_types: []
496
+ citation: MS-WMF 2.3.1 Bitmap Record Types
497
+ status: implemented
498
+ reason:
499
+ - id: wmf.reject.r1501
500
+ format: wmf
501
+ record_types: []
502
+ citation: MS-WMF 2.3.3.4 META_EXTFLOODFILL, 2.3.3.7 META_FLOODFILL, 2.3.3.19 META_SETPIXEL, 2.3.5.12 META_SCALEVIEWPORTEXT, 2.3.5.13 META_SCALEWINDOWEXT
503
+ status: implemented
504
+ reason:
505
+ - id: wmf.reject.r1502
506
+ format: wmf
507
+ record_types: []
508
+ citation: MS-WMF 2.3.3.4 META_EXTFLOODFILL (Mode); 2.1.1.9 FloodFill Enumeration
509
+ status: implemented
510
+ reason:
511
+ - id: wmf.reject.r1601
512
+ format: wmf
513
+ record_types: []
514
+ citation: MS-WMF 2.3.5.10 META_RESTOREDC
515
+ status: implemented
516
+ reason:
517
+ - id: wmf.reject.r1602
518
+ format: wmf
519
+ record_types: []
520
+ citation: MS-WMF 2.3.6.1 META_ESCAPE
521
+ status: implemented
522
+ reason:
523
+ - id: wmf.reject.r1603
524
+ format: wmf
525
+ record_types: []
526
+ citation: MS-WMF 2.3.6.1 META_ESCAPE
527
+ status: implemented
528
+ reason:
529
+ - id: wmf.reject.r1701
530
+ format: wmf
531
+ record_types: []
532
+ citation: MS-WMF 3.1.4.1 WMF Object Table; 2.3.2.2 META_HEADER (NumberOfObjects)
533
+ status: implemented
534
+ reason:
535
+ - id: wmf.reject.r1702
536
+ format: wmf
537
+ record_types: []
538
+ citation: MS-WMF 3.1.4.1 WMF Object Table; 2.3.4.10 META_SELECTOBJECT, 2.3.4.7 META_DELETEOBJECT
539
+ status: not_checkable
540
+ reason: 'the spec MUST holds, but the parser no longer rejects it: a reference to no live object is ignored, the record is kept and wmf.object.select_reference, wmf.object.delete_reference, wmf.object.palette_reference or wmf.object.region_reference reports it (an error when strict, a warning when tolerant), so no WMF failure with this reason exists to report'
541
+ - id: wmf.reject.r1703
542
+ format: wmf
543
+ record_types: []
544
+ citation: MS-WMF 2.3.4.11 META_SELECTPALETTE; 3.1.4.1 WMF Object Table
545
+ status: implemented
546
+ reason:
547
+ - id: wmf.reject.r1704
548
+ format: wmf
549
+ record_types: []
550
+ citation: MS-WMF 2.3.4.9 META_SELECTCLIPREGION; 3.1.4.1 WMF Object Table
551
+ status: implemented
552
+ reason:
553
+ - id: wmf.reject.r1705
554
+ format: wmf
555
+ record_types: []
556
+ citation: MS-WMF 2.3.3.6 META_FILLREGION, 2.3.3.8 META_FRAMEREGION (Region); 3.1.4.1 WMF Object Table
557
+ status: implemented
558
+ reason:
559
+ - id: wmf.reject.r1706
560
+ format: wmf
561
+ record_types: []
562
+ citation: MS-WMF 2.3.3.6 META_FILLREGION, 2.3.3.8 META_FRAMEREGION (Brush); 3.1.4.1 WMF Object Table
563
+ status: implemented
564
+ reason:
565
+ - id: wmf.reject.r1707
566
+ format: wmf
567
+ record_types: []
568
+ citation: MS-WMF 2.3.3.6 META_FILLREGION, 2.3.3.8 META_FRAMEREGION (Brush); 3.1.4.1 WMF Object Table
569
+ status: implemented
570
+ reason:
571
+ - id: wmf.reject.r1801
572
+ format: wmf
573
+ record_types: []
574
+ citation: MS-WMF 2.3.2.2 META_HEADER (MaxRecord)
575
+ status: not_checkable
576
+ reason: 'the spec MUST holds, but the parser no longer rejects it: the header MaxRecord disagrees with the largest record, the model is kept and wmf.header.max_record reports the drift (an error when strict, a warning when tolerant), so no WMF failure with this reason exists to report'
577
+ - id: wmf.object.capacity
578
+ format: wmf
579
+ record_types:
580
+ - META_CREATEPENINDIRECT
581
+ - META_CREATEBRUSHINDIRECT
582
+ - META_CREATEPATTERNBRUSH
583
+ - META_DIBCREATEPATTERNBRUSH
584
+ - META_CREATEFONTINDIRECT
585
+ - META_CREATEPALETTE
586
+ - META_CREATEREGION
587
+ citation: MS-WMF 3.1.4.1 WMF Object Table, 2.3.2.2 META_HEADER (NumberOfObjects)
588
+ status: implemented
589
+ reason:
590
+ - id: wmf.object.select_reference
591
+ format: wmf
592
+ record_types:
593
+ - META_SELECTOBJECT
594
+ citation: MS-WMF 2.3.4.10 META_SELECTOBJECT (ObjectIndex), 3.1.4.1; stock-object selectors (high bit 0x8000) are an implementation rule, MS-WMF defines no selector encoding
595
+ status: implemented
596
+ reason:
597
+ - id: wmf.object.delete_reference
598
+ format: wmf
599
+ record_types:
600
+ - META_DELETEOBJECT
601
+ citation: MS-WMF 2.3.4.7 META_DELETEOBJECT (ObjectIndex), 3.1.4.1; stock objects are never deleted (1.1 Glossary), the 0x8000 selector bit is an implementation rule
602
+ status: implemented
603
+ reason:
604
+ - id: wmf.object.palette_reference
605
+ format: wmf
606
+ record_types:
607
+ - META_SELECTPALETTE
608
+ citation: MS-WMF 2.3.4.11 META_SELECTPALETTE (Palette), 3.1.4.1
609
+ status: implemented
610
+ reason:
611
+ - id: wmf.object.region_reference
612
+ format: wmf
613
+ record_types:
614
+ - META_FILLREGION
615
+ - META_FRAMEREGION
616
+ - META_INVERTREGION
617
+ - META_PAINTREGION
618
+ - META_SELECTCLIPREGION
619
+ citation: MS-WMF 2.3.3.6 META_FILLREGION, 2.3.3.8 META_FRAMEREGION, 2.3.3.9 META_INVERTREGION,
620
+ 2.3.3.11 META_PAINTREGION, 2.3.4.9 META_SELECTCLIPREGION (Region), 3.1.4.1
621
+ status: implemented
622
+ reason:
623
+ - id: wmf.object.brush_reference
624
+ format: wmf
625
+ record_types:
626
+ - META_FILLREGION
627
+ - META_FRAMEREGION
628
+ citation: MS-WMF 2.3.3.6 META_FILLREGION, 2.3.3.8 META_FRAMEREGION (Brush), 3.1.4.1
629
+ status: implemented
630
+ reason:
631
+ - id: wmf.dc.restore_depth
632
+ format: wmf
633
+ record_types:
634
+ - META_SAVEDC
635
+ - META_RESTOREDC
636
+ citation: MS-WMF 2.3.5.10 META_RESTOREDC (nSavedDC), 2.3.5.11 META_SAVEDC, 3.1.5; the outcome of an nSavedDC that names no saved context is an implementation rule, MS-WMF defines none
637
+ status: implemented
638
+ reason:
639
+ - id: wmf.state.scale_divisor
640
+ format: wmf
641
+ record_types:
642
+ - META_SCALEWINDOWEXT
643
+ - META_SCALEVIEWPORTEXT
644
+ citation: MS-WMF 2.3.5.12 META_SCALEVIEWPORTEXT, 2.3.5.13 META_SCALEWINDOWEXT (xDenom, yDenom)
645
+ status: not_checkable
646
+ reason: MS-WMF 2.3.5.12 and 2.3.5.13 define the divisors as signed 16-bit amounts
647
+ with no MUST on a zero value, so a zero divisor is not a stated constraint
648
+ - id: wmf.bitmap.dib_layout
649
+ format: wmf
650
+ record_types:
651
+ - META_DIBBITBLT
652
+ - META_DIBSTRETCHBLT
653
+ - META_SETDIBTODEV
654
+ - META_STRETCHDIB
655
+ citation: MS-WMF 2.2.2.9 DeviceIndependentBitmap Object; 2.3.1.2.1 META_DIBBITBLT, 2.3.1.3.1 META_DIBSTRETCHBLT (Target), 2.3.1.4 META_SETDIBTODEV, 2.3.1.6 META_STRETCHDIB (DIB)
656
+ status: implemented
657
+ reason:
658
+ - id: wmf.bitmap.bitmap16_layout
659
+ format: wmf
660
+ record_types:
661
+ - META_BITBLT
662
+ - META_STRETCHBLT
663
+ citation: MS-WMF 2.2.2.1 Bitmap16 Object; 2.3.1.1.1 META_BITBLT, 2.3.1.5.1 META_STRETCHBLT (Target)
664
+ status: implemented
665
+ reason:
666
+ - id: wmf.text.length
667
+ format: wmf
668
+ record_types:
669
+ - META_TEXTOUT
670
+ - META_EXTTEXTOUT
671
+ citation: MS-WMF 2.3.3.20 META_TEXTOUT, 2.3.3.5 META_EXTTEXTOUT (StringLength, String)
672
+ status: implemented
673
+ reason:
674
+ - id: wmf.text.negative_length
675
+ format: wmf
676
+ record_types:
677
+ - META_TEXTOUT
678
+ - META_EXTTEXTOUT
679
+ citation: MS-WMF 2.3.3.20 META_TEXTOUT, 2.3.3.5 META_EXTTEXTOUT (StringLength, String)
680
+ status: implemented
681
+ reason:
682
+ - id: wmf.region.header
683
+ format: wmf
684
+ record_types:
685
+ - META_CREATEREGION
686
+ citation: MS-WMF 2.2.1.5 Region Object (ObjectCount, RegionSize); 2.3.4.6 META_CREATEREGION
687
+ status: implemented
688
+ reason:
689
+ - id: wmf.array.polygon_empty
690
+ format: wmf
691
+ record_types:
692
+ - META_POLYGON
693
+ citation: MS-WMF 2.3.3.15 META_POLYGON (NumberOfPoints)
694
+ status: implemented
695
+ reason:
696
+ - id: wmf.text.spacing_count
697
+ format: wmf
698
+ record_types:
699
+ - META_EXTTEXTOUT
700
+ citation: MS-WMF 2.3.3.5 META_EXTTEXTOUT (Dx)
701
+ status: implemented
702
+ reason:
703
+ - id: wmf.text.rectangle_options
704
+ format: wmf
705
+ record_types:
706
+ - META_EXTTEXTOUT
707
+ citation: MS-WMF 2.3.3.5 META_EXTTEXTOUT (fwOpts, Rectangle)
708
+ status: implemented
709
+ reason:
710
+ - id: wmf.palette.entry_count
711
+ format: wmf
712
+ record_types:
713
+ - META_CREATEPALETTE
714
+ - META_SETPALENTRIES
715
+ - META_ANIMATEPALETTE
716
+ - META_RESIZEPALETTE
717
+ citation: MS-WMF 2.3.4.3 META_CREATEPALETTE, 2.3.5.19 META_SETPALENTRIES, 2.3.5.1 META_ANIMATEPALETTE, 2.3.5.9 META_RESIZEPALETTE (NumberOfEntries); 2.2.1.3 Palette Object (NumberOfEntries)
718
+ status: implemented
719
+ reason:
720
+ - id: wmf.palette.entry_fields
721
+ format: wmf
722
+ record_types:
723
+ - META_CREATEPALETTE
724
+ - META_SETPALENTRIES
725
+ - META_ANIMATEPALETTE
726
+ citation: MS-WMF 2.2.2.13 PaletteEntry Object; 2.2.1.3 Palette Object (aPaletteEntries); 2.3.4.3 META_CREATEPALETTE, 2.3.5.19 META_SETPALENTRIES, 2.3.5.1 META_ANIMATEPALETTE
727
+ status: implemented
728
+ reason:
729
+ - id: wmf.palette.start
730
+ format: wmf
731
+ record_types:
732
+ - META_CREATEPALETTE
733
+ citation: MS-WMF 2.2.1.3 Palette Object (Start, MUST be 0x0300 for META_CREATEPALETTE); 2.3.4.3 META_CREATEPALETTE
734
+ status: implemented
735
+ reason:
736
+ - id: wmf.region.scan_counts
737
+ format: wmf
738
+ record_types:
739
+ - META_CREATEREGION
740
+ citation: MS-WMF 2.2.1.5 Region Object (ScanCount, aScans), 2.2.2.21 Scan Object; 2.3.4.6 META_CREATEREGION
741
+ status: implemented
742
+ reason:
743
+ - id: wmf.region.size
744
+ format: wmf
745
+ record_types:
746
+ - META_CREATEREGION
747
+ citation: MS-WMF 2.2.1.5 Region Object (RegionSize); 2.3.4.6 META_CREATEREGION
748
+ status: implemented
749
+ reason:
750
+ - id: wmf.escape.byte_count
751
+ format: wmf
752
+ record_types:
753
+ - META_ESCAPE
754
+ citation: MS-WMF 2.3.6.1 META_ESCAPE (ByteCount, EscapeData)
755
+ status: implemented
756
+ reason:
757
+ - id: wmf.escape.embedded_emf.segment
758
+ format: wmf
759
+ record_types:
760
+ - META_ESCAPE
761
+ - META_ESCAPE_ENHANCED_METAFILE
762
+ citation: MS-WMF 2.3.6.25 META_ESCAPE_ENHANCED_METAFILE
763
+ status: implemented
764
+ reason:
765
+ - id: wmf.escape.embedded_emf.sequence
766
+ format: wmf
767
+ record_types:
768
+ - META_ESCAPE
769
+ - META_ESCAPE_ENHANCED_METAFILE
770
+ citation: MS-WMF 2.3.6.25 META_ESCAPE_ENHANCED_METAFILE (CommentRecordCount, CurrentRecordSize, RemainingBytes, EnhancedMetafileDataSize)
771
+ status: implemented
772
+ reason:
773
+ - id: wmf.escape.embedded_emf.checksum
774
+ format: wmf
775
+ record_types:
776
+ - META_ESCAPE
777
+ - META_ESCAPE_ENHANCED_METAFILE
778
+ citation: MS-WMF 2.3.6.25 META_ESCAPE_ENHANCED_METAFILE (Checksum)
779
+ status: implemented
780
+ reason:
781
+ - id: wmf.escape.opaque_subtype
782
+ format: wmf
783
+ record_types:
784
+ - META_ESCAPE
785
+ citation: MS-WMF 2.3.6.1 META_ESCAPE (EscapeFunction); 2.1.1.17 MetafileEscapes Enumeration
786
+ status: not_checkable
787
+ reason: escape subtypes without a typed view, and recognized subtypes whose payload size differs from the table, are preserved as opaque bytes; the model cannot tell a vendor payload from a malformed one, so nothing is reported
788
+ - id: wmf.buffer.declared_size
789
+ format: wmf
790
+ record_types: []
791
+ citation: MS-WMF 2.3 (RecordSize)
792
+ status: implemented
793
+ reason:
794
+ - id: wmf.record.layout_size
795
+ format: wmf
796
+ record_types:
797
+ - META_FLOODFILL
798
+ - META_SETPIXEL
799
+ - META_PATBLT
800
+ - META_EXCLUDECLIPRECT
801
+ - META_INTERSECTCLIPRECT
802
+ - META_OFFSETCLIPRGN
803
+ - META_REALIZEPALETTE
804
+ - META_SETBKCOLOR
805
+ - META_SETMAPPERFLAGS
806
+ - META_SETRELABS
807
+ - META_SETTEXTCHAREXTRA
808
+ - META_SETTEXTCOLOR
809
+ - META_SETTEXTJUSTIFICATION
810
+ citation: MS-WMF 2.3.3.7, 2.3.3.12, 2.3.3.19, 2.3.5.2, 2.3.5.3, 2.3.5.5, 2.3.5.8, 2.3.5.14, 2.3.5.18, 2.3.5.21, 2.3.5.25, 2.3.5.26, 2.3.5.27 (RecordSize; the record lists no field after its last parameter)
811
+ status: implemented
812
+ reason:
813
+ - id: wmf.fixed.raster_operation
814
+ format: wmf
815
+ record_types:
816
+ - META_PATBLT
817
+ citation: MS-WMF 2.3.3.12 META_PATBLT (RasterOperation); 2.1.1.31 TernaryRasterOperation Enumeration
818
+ status: implemented
819
+ reason:
820
+ - id: wmf.fixed.colorref_reserved
821
+ format: wmf
822
+ record_types:
823
+ - META_FLOODFILL
824
+ - META_SETPIXEL
825
+ - META_SETBKCOLOR
826
+ - META_SETTEXTCOLOR
827
+ citation: MS-WMF 2.2.2.8 ColorRef Object (Reserved); 2.3.3.7 META_FLOODFILL, 2.3.3.19 META_SETPIXEL, 2.3.5.14 META_SETBKCOLOR, 2.3.5.26 META_SETTEXTCOLOR
828
+ status: implemented
829
+ reason:
830
+ - id: wmf.fixed.colorref_palette
831
+ format: wmf
832
+ record_types:
833
+ - META_FLOODFILL
834
+ - META_SETPIXEL
835
+ - META_SETBKCOLOR
836
+ - META_SETTEXTCOLOR
837
+ citation: MS-WMF 2.2.2.8 ColorRef Object (Reserved); 2.3.3.7 META_FLOODFILL, 2.3.3.19 META_SETPIXEL, 2.3.5.14 META_SETBKCOLOR, 2.3.5.26 META_SETTEXTCOLOR
838
+ status: implemented
839
+ reason:
840
+ - id: wmf.fixed.coordinate_values
841
+ format: wmf
842
+ record_types:
843
+ - META_ARC
844
+ - META_CHORD
845
+ - META_ELLIPSE
846
+ - META_PIE
847
+ - META_RECTANGLE
848
+ - META_ROUNDRECT
849
+ - META_LINETO
850
+ - META_MOVETO
851
+ - META_SETWINDOWORG
852
+ - META_SETWINDOWEXT
853
+ - META_SETVIEWPORTORG
854
+ - META_SETVIEWPORTEXT
855
+ - META_OFFSETWINDOWORG
856
+ - META_OFFSETVIEWPORTORG
857
+ - META_FLOODFILL
858
+ - META_SETPIXEL
859
+ - META_PATBLT
860
+ - META_EXCLUDECLIPRECT
861
+ - META_INTERSECTCLIPRECT
862
+ - META_OFFSETCLIPRGN
863
+ - META_SETTEXTCHAREXTRA
864
+ - META_SETTEXTJUSTIFICATION
865
+ - META_SETMAPPERFLAGS
866
+ citation: MS-WMF 2.3.3.1-2.3.3.19, 2.3.5.2-2.3.5.30 (coordinate, extent, offset, BreakCount, BreakExtra, CharExtra and MapperValues fields)
867
+ status: not_checkable
868
+ reason: 'each of these sections defines the coordinate, extent, offset or count fields only by type and meaning (a 16-bit signed or unsigned integer in logical or device units; META_SETMAPPERFLAGS says only that bit zero selects matching fonts) and states no MUST on their value, so no value is a violation'
869
+ - id: wmf.header.unrecognised
870
+ format: wmf
871
+ record_types: []
872
+ citation: "MS-WMF 2.3.2.2"
873
+ status: implemented
874
+ reason: null