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,117 @@
1
+ # Chunk-1 EMF rules: framing, header, EOF, parse recovery. Empty record_types = not tied to one record type.
2
+ - id: emf.record.size_alignment
3
+ format: emf
4
+ record_types: []
5
+ citation: "MS-EMF 2.3"
6
+ status: implemented
7
+ reason: null
8
+ - id: emf.record.undefined_type
9
+ format: emf
10
+ record_types: []
11
+ citation: "MS-EMF 2.1.1"
12
+ status: implemented
13
+ reason: null
14
+ - id: emf.eof.missing
15
+ format: emf
16
+ record_types: [EMR_EOF]
17
+ citation: "MS-EMF 2.3.4.1"
18
+ status: implemented
19
+ reason: null
20
+ - id: emf.eof.size_last
21
+ format: emf
22
+ record_types: [EMR_EOF]
23
+ citation: "MS-EMF 2.3.4.1"
24
+ status: implemented
25
+ reason: null
26
+ - id: emf.eof.trailing_bytes
27
+ format: emf
28
+ record_types: [EMR_EOF]
29
+ citation: "MS-EMF 2.3.4.1"
30
+ status: implemented
31
+ reason: null
32
+ - id: emf.comment.data_size
33
+ format: emf
34
+ record_types: [EMR_COMMENT]
35
+ citation: "MS-EMF 2.3.3"
36
+ status: implemented
37
+ reason: null
38
+ - id: emf.header.signature
39
+ format: emf
40
+ record_types: [EMR_HEADER]
41
+ citation: "MS-EMF 2.2.9"
42
+ status: implemented
43
+ reason: null
44
+ - id: emf.header.size_bounds
45
+ format: emf
46
+ record_types: [EMR_HEADER]
47
+ citation: "MS-EMF 2.3.4.2"
48
+ status: implemented
49
+ reason: null
50
+ - id: emf.header.bytes
51
+ format: emf
52
+ record_types: [EMR_HEADER]
53
+ citation: "MS-EMF 2.2.9"
54
+ status: implemented
55
+ reason: null
56
+ - id: emf.header.records
57
+ format: emf
58
+ record_types: [EMR_HEADER]
59
+ citation: "MS-EMF 2.2.9"
60
+ status: implemented
61
+ reason: null
62
+ - id: emf.header.handles
63
+ format: emf
64
+ record_types: [EMR_HEADER]
65
+ citation: "MS-EMF 2.2.9"
66
+ status: implemented
67
+ reason: null
68
+ - id: emf.header.description_bounds
69
+ format: emf
70
+ record_types: [EMR_HEADER]
71
+ citation: "MS-EMF 2.2.9"
72
+ status: implemented
73
+ reason: null
74
+ - id: emf.header.pixel_format_bounds
75
+ format: emf
76
+ record_types: [EMR_HEADER]
77
+ citation: "MS-EMF 2.2.10"
78
+ status: implemented
79
+ reason: null
80
+ - id: emf.record.truncated_header
81
+ format: emf
82
+ record_types: []
83
+ citation: "MS-EMF 2.3"
84
+ status: implemented
85
+ reason: null
86
+ - id: emf.record.size_minimum
87
+ format: emf
88
+ record_types: []
89
+ citation: "MS-EMF 2.3"
90
+ status: implemented
91
+ reason: null
92
+ - id: emf.record.size_bounds
93
+ format: emf
94
+ record_types: []
95
+ citation: "MS-EMF 2.3"
96
+ status: implemented
97
+ reason: null
98
+ # Where emf.exttextout.string_bounds, emf.exttextout.dx_bounds or emf.record.exttextout_fixed_part fires on the same
99
+ # EXTTEXTOUT record, that rule reports the defect and this one stays silent.
100
+ - id: emf.record.array_exceeds_size
101
+ format: emf
102
+ record_types: []
103
+ citation: "MS-EMF 2.3"
104
+ status: implemented
105
+ reason: null
106
+ - id: emf.record.undecodable
107
+ format: emf
108
+ record_types: []
109
+ citation: "MS-EMF 2.3"
110
+ status: implemented
111
+ reason: null
112
+ - id: emf.parse.unparseable
113
+ format: emf
114
+ record_types: [EMR_HEADER]
115
+ citation: "MS-EMF 2.3.4.2"
116
+ status: implemented
117
+ reason: null
@@ -0,0 +1,21 @@
1
+ - id: emf.select_object.corpus_corruption
2
+ format: emf
3
+ record_types: [EMR_SELECTOBJECT]
4
+ citation: "MS-EMF 2.3.8.5"
5
+ status: not_checkable
6
+ reason: "bad_corrupted_2014-12-07-140817.emf (README: corrupted EMR_SELECTOBJECT) has 28 SELECTOBJECT records, all Size 12 with a handle that is below header Handles, a defined stock index (0, 5, 7, 8, 13) or a live created object, and none is 0; no stream property distinguishes the corruption, so no rule can name it"
7
+ # Deliberately split from emf.state.fixed_size by wire kind: that rule reads a decoded record and this one a Raw one,
8
+ # so they never fire together. Also checks the record types with a layout size (EMR_PIXELFORMAT and
9
+ # EMR_FORCEUFIMAPPING excepted: emf.opaque.fixed_size owns a Size below their layout), which record_types does not list.
10
+ - id: emf.record.fixed_size_raw
11
+ format: emf
12
+ record_types: [EMR_SETMAPPERFLAGS, EMR_SETCOLORADJUSTMENT, EMR_RESTOREDC, EMR_SETARCDIRECTION, EMR_SETICMMODE, EMR_SETLAYOUT]
13
+ citation: "MS-EMF 2.3.11"
14
+ status: implemented
15
+ reason: null
16
+ - id: emf.record.exttextout_fixed_part
17
+ format: emf
18
+ record_types: [EMR_EXTTEXTOUTA, EMR_EXTTEXTOUTW]
19
+ citation: "MS-EMF 2.2.5"
20
+ status: implemented
21
+ reason: null
@@ -0,0 +1,229 @@
1
+ # Rule manifest for the object and geometry families (issue #37, W09 and W11).
2
+ - id: emf.object.fixed_size
3
+ format: emf
4
+ record_types: [EMR_CREATEPEN, EMR_CREATEBRUSHINDIRECT, EMR_SELECTPALETTE, EMR_SETCOLORSPACE, EMR_COLORCORRECTPALETTE]
5
+ citation: "MS-EMF 2.3.7"
6
+ status: implemented
7
+ reason: null
8
+ - id: emf.object.font_size
9
+ format: emf
10
+ record_types: [EMR_EXTCREATEFONTINDIRECTW]
11
+ citation: "MS-EMF 2.3.7.8"
12
+ status: implemented
13
+ reason: null
14
+ - id: emf.object.pen_style
15
+ format: emf
16
+ record_types: [EMR_CREATEPEN, EMR_EXTCREATEPEN]
17
+ citation: "MS-EMF 2.1.25"
18
+ status: implemented
19
+ reason: null
20
+ - id: emf.object.pen_cosmetic_width
21
+ format: emf
22
+ record_types: [EMR_CREATEPEN, EMR_EXTCREATEPEN]
23
+ citation: "MS-EMF 2.2.19"
24
+ status: implemented
25
+ reason: null
26
+ - id: emf.object.brush_style
27
+ format: emf
28
+ record_types: [EMR_CREATEBRUSHINDIRECT]
29
+ citation: "MS-EMF 2.3.7.1"
30
+ status: implemented
31
+ reason: null
32
+ - id: emf.object.extpen_brush
33
+ format: emf
34
+ record_types: [EMR_EXTCREATEPEN]
35
+ citation: "MS-EMF 2.2.20"
36
+ status: implemented
37
+ reason: null
38
+ - id: emf.object.palette_version
39
+ format: emf
40
+ record_types: [EMR_CREATEPALETTE]
41
+ citation: "MS-EMF 2.3.7.6"
42
+ status: implemented
43
+ reason: null
44
+ - id: emf.object.palette_entries
45
+ format: emf
46
+ record_types: [EMR_CREATEPALETTE, EMR_RESIZEPALETTE]
47
+ citation: "MS-EMF 2.3.8.4"
48
+ status: implemented
49
+ reason: null
50
+ - id: emf.object.palette_size
51
+ format: emf
52
+ record_types: [EMR_CREATEPALETTE, EMR_SETPALETTEENTRIES]
53
+ citation: "MS-EMF 2.3.7.6"
54
+ status: implemented
55
+ reason: null
56
+ - id: emf.object.index_zero
57
+ format: emf
58
+ record_types: [EMR_SELECTOBJECT, EMR_DELETEOBJECT, EMR_SELECTPALETTE]
59
+ citation: "MS-EMF 2.3.8.5"
60
+ status: implemented
61
+ reason: null
62
+ - id: emf.object.delete_stock
63
+ format: emf
64
+ record_types: [EMR_DELETEOBJECT]
65
+ citation: "MS-EMF 2.3.8.3"
66
+ status: implemented
67
+ reason: null
68
+ - id: emf.object.handle_range
69
+ format: emf
70
+ record_types: [EMR_SELECTOBJECT, EMR_DELETEOBJECT, EMR_SELECTPALETTE, EMR_SETPALETTEENTRIES, EMR_RESIZEPALETTE, EMR_SETCOLORSPACE, EMR_DELETECOLORSPACE]
71
+ citation: "MS-EMF 2.3.8"
72
+ status: implemented
73
+ reason: null
74
+ - id: emf.object.lifecycle
75
+ format: emf
76
+ record_types: [EMR_SELECTOBJECT, EMR_DELETEOBJECT, EMR_SELECTPALETTE, EMR_SETPALETTEENTRIES, EMR_RESIZEPALETTE, EMR_SETCOLORSPACE, EMR_DELETECOLORSPACE]
77
+ citation: "MS-EMF 2.3.8"
78
+ status: implemented
79
+ reason: null
80
+ - id: emf.geometry.point_array_size
81
+ format: emf
82
+ record_types: [EMR_POLYBEZIER, EMR_POLYGON, EMR_POLYLINE, EMR_POLYBEZIERTO, EMR_POLYLINETO, EMR_POLYBEZIER16, EMR_POLYGON16, EMR_POLYLINE16, EMR_POLYBEZIERTO16, EMR_POLYLINETO16]
83
+ citation: "MS-EMF 2.3.5"
84
+ status: implemented
85
+ reason: null
86
+ - id: emf.geometry.bezier_count
87
+ format: emf
88
+ record_types: [EMR_POLYBEZIER, EMR_POLYBEZIERTO, EMR_POLYBEZIER16, EMR_POLYBEZIERTO16]
89
+ citation: "MS-EMF 2.3.5.16"
90
+ status: implemented
91
+ reason: null
92
+ - id: emf.geometry.poly_poly_size
93
+ format: emf
94
+ record_types: [EMR_POLYPOLYLINE, EMR_POLYPOLYGON, EMR_POLYPOLYLINE16, EMR_POLYPOLYGON16]
95
+ citation: "MS-EMF 2.3.5.28"
96
+ status: implemented
97
+ reason: null
98
+ - id: emf.geometry.poly_poly_counts
99
+ format: emf
100
+ record_types: [EMR_POLYPOLYLINE, EMR_POLYPOLYGON, EMR_POLYPOLYLINE16, EMR_POLYPOLYGON16]
101
+ citation: "MS-EMF 2.3.5.28"
102
+ status: implemented
103
+ reason: null
104
+ - id: emf.geometry.poly_draw_size
105
+ format: emf
106
+ record_types: [EMR_POLYDRAW, EMR_POLYDRAW16]
107
+ citation: "MS-EMF 2.3.5.20"
108
+ status: implemented
109
+ reason: null
110
+ - id: emf.geometry.poly_draw_types
111
+ format: emf
112
+ record_types: [EMR_POLYDRAW, EMR_POLYDRAW16]
113
+ citation: "MS-EMF 2.1.26"
114
+ status: implemented
115
+ reason: null
116
+ - id: emf.geometry.gradient_mode
117
+ format: emf
118
+ record_types: [EMR_GRADIENTFILL]
119
+ citation: "MS-EMF 2.1.15"
120
+ status: implemented
121
+ reason: null
122
+ - id: emf.geometry.gradient_size
123
+ format: emf
124
+ record_types: [EMR_GRADIENTFILL]
125
+ citation: "MS-EMF 2.3.5.12"
126
+ status: implemented
127
+ reason: null
128
+ - id: emf.geometry.gradient_index
129
+ format: emf
130
+ record_types: [EMR_GRADIENTFILL]
131
+ citation: "MS-EMF 2.2.7"
132
+ status: implemented
133
+ reason: null
134
+ - id: emf.region.header
135
+ format: emf
136
+ record_types: [EMR_FILLRGN, EMR_FRAMERGN, EMR_INVERTRGN, EMR_PAINTRGN, EMR_EXTSELECTCLIPRGN]
137
+ citation: "MS-EMF 2.2.25"
138
+ status: implemented
139
+ reason: null
140
+ - id: emf.region.rects
141
+ format: emf
142
+ record_types: [EMR_FILLRGN, EMR_FRAMERGN, EMR_INVERTRGN, EMR_PAINTRGN, EMR_EXTSELECTCLIPRGN]
143
+ citation: "MS-EMF 2.2.25"
144
+ status: implemented
145
+ reason: null
146
+ - id: emf.region.size
147
+ format: emf
148
+ record_types: [EMR_FILLRGN, EMR_FRAMERGN, EMR_INVERTRGN, EMR_PAINTRGN, EMR_EXTSELECTCLIPRGN]
149
+ citation: "MS-EMF 2.3.5"
150
+ status: implemented
151
+ reason: null
152
+ - id: emf.object.fixed_size.unstated
153
+ format: emf
154
+ record_types: [EMR_SELECTOBJECT, EMR_DELETEOBJECT, EMR_RESIZEPALETTE, EMR_DELETECOLORSPACE]
155
+ citation: "MS-EMF 2.3.8"
156
+ status: not_checkable
157
+ reason: "the spec states no Size value for these records; a record shorter than its fields is caught by emf.record.size_minimum"
158
+ - id: emf.geometry.fixed_size.unstated
159
+ format: emf
160
+ record_types: [EMR_ANGLEARC, EMR_ARC, EMR_ARCTO, EMR_CHORD, EMR_ELLIPSE, EMR_EXTFLOODFILL, EMR_LINETO, EMR_PIE, EMR_RECTANGLE, EMR_ROUNDRECT, EMR_SETPIXELV, EMR_FILLPATH, EMR_STROKEANDFILLPATH, EMR_STROKEPATH]
161
+ citation: "MS-EMF 2.3.5"
162
+ status: not_checkable
163
+ reason: "the spec states no Size value for these fixed-layout records; shorter records are caught by emf.record.size_minimum and surplus bytes have no normative text"
164
+ - id: emf.geometry.polygon_min_points
165
+ format: emf
166
+ record_types: [EMR_POLYGON, EMR_POLYGON16, EMR_POLYLINE, EMR_POLYLINE16, EMR_POLYLINETO, EMR_POLYLINETO16]
167
+ citation: "MS-EMF 2.3.5"
168
+ status: not_checkable
169
+ reason: "the spec says 'two or more vertexes' only in descriptive prose; no MUST gives a minimum Count"
170
+ - id: emf.geometry.polygon_fill_draw_semantics
171
+ format: emf
172
+ record_types: [EMR_POLYGON, EMR_POLYBEZIER, EMR_POLYDRAW, EMR_POLYPOLYGON, EMR_GRADIENTFILL]
173
+ citation: "MS-EMF 2.3.5"
174
+ status: not_checkable
175
+ reason: "drawing with the current pen, brush and fill mode is playback behaviour (SHOULD), not a property of the bytes"
176
+ - id: emf.geometry.gradient_alpha_ignored
177
+ format: emf
178
+ record_types: [EMR_GRADIENTFILL]
179
+ citation: "MS-EMF 2.3.5.12"
180
+ status: not_checkable
181
+ reason: "the Alpha fields of TriVertex MUST be ignored by the renderer; nothing in the stream can violate it"
182
+ - id: emf.object.extpen_style_entries
183
+ format: emf
184
+ record_types: [EMR_EXTCREATEPEN]
185
+ citation: "MS-EMF 2.2.20"
186
+ status: not_checkable
187
+ reason: "NumStyleEntries SHOULD be zero unless PenStyle is PS_USERSTYLE; SHOULD-level advice, not enforced"
188
+ - id: emf.object.extpen_dib
189
+ format: emf
190
+ record_types: [EMR_EXTCREATEPEN, EMR_CREATEMONOBRUSH, EMR_CREATEDIBPATTERNBRUSHPT]
191
+ citation: "MS-EMF 2.3.7"
192
+ status: not_checkable
193
+ reason: "offBmi/cbBmi/offBits/cbBits bounds and DIB contents are assigned to the bitmap-buffer rules (emf_bitmap), not checked in this lane"
194
+ - id: emf.object.colorspace_content
195
+ format: emf
196
+ record_types: [EMR_CREATECOLORSPACE, EMR_CREATECOLORSPACEW]
197
+ citation: "MS-EMF 2.3.7.2"
198
+ status: not_checkable
199
+ reason: "LogColorSpace and LogColorSpaceW are defined in MS-WMF 2.2.2.11/2.2.2.12, which is not among the reference documents read for this lane; only the handle is checked"
200
+ - id: emf.object.font_content
201
+ format: emf
202
+ record_types: [EMR_EXTCREATEFONTINDIRECTW]
203
+ citation: "MS-EMF 2.2.13"
204
+ status: not_checkable
205
+ reason: "LogFont/LogFontExDv field enums were not read for this lane; only the record size is checked"
206
+ - id: emf.object.palette_entry_reserved
207
+ format: emf
208
+ record_types: [EMR_CREATEPALETTE, EMR_SETPALETTEENTRIES]
209
+ citation: "MS-EMF 2.2.18"
210
+ status: not_checkable
211
+ reason: "the Reserved byte of a LogPaletteEntry MUST be ignored; nothing can violate it"
212
+ - id: emf.object.palette_start
213
+ format: emf
214
+ record_types: [EMR_SETPALETTEENTRIES]
215
+ citation: "MS-EMF 2.3.8.8"
216
+ status: not_checkable
217
+ reason: "Start is checked against the palette size, which the lens does not track (palette sizes change through RESIZEPALETTE)"
218
+ - id: emf.object.select_playback
219
+ format: emf
220
+ record_types: [EMR_SELECTOBJECT, EMR_SELECTPALETTE, EMR_SETCOLORSPACE]
221
+ citation: "MS-EMF 2.3.8"
222
+ status: not_checkable
223
+ reason: "the selected object being used in later drawing is playback behaviour, not a property of the bytes"
224
+ - id: emf.object.deleted_selected_default
225
+ format: emf
226
+ record_types: [EMR_DELETEOBJECT, EMR_DELETECOLORSPACE]
227
+ citation: "MS-EMF 2.3.8.3"
228
+ status: not_checkable
229
+ reason: "restoring the default object when a selected object is deleted is playback behaviour"