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,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/emf_plus/records/primitives/point_array"
4
+
5
+ module Emf
6
+ module EmfPlus
7
+ module Records
8
+ # EmfPlusDrawLines (2.3.4.10). C compressed, L closes the shape, P relative points; ObjectID is the pen.
9
+ class DrawLines < Base
10
+ include ShapeFlags
11
+
12
+ TYPE = 0x400D
13
+
14
+ class DrawLinesBody < Body
15
+ endian :little
16
+ mandatory_parameter :flags
17
+ uint32 :item_count
18
+ point_array :point_data,
19
+ point_count: :item_count,
20
+ relative: -> { flags.anybits?(ShapeFlags::RELATIVE_FLAG) },
21
+ compressed: -> { flags.anybits?(ShapeFlags::COMPRESSED_FLAG) }
22
+ end
23
+ BODY = DrawLinesBody
24
+
25
+ def pen_id = emf_object_id
26
+ def flag_fields = super.merge(close_shape: 0x2000)
27
+
28
+ def close_shape? = flags.anybits?(0x2000)
29
+ def count = body.item_count
30
+ def points = body.point_data.points
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module EmfPlus
5
+ module Records
6
+ # EmfPlusDrawPath (2.3.4.11). ObjectID is the path; the pen is the body's PenId.
7
+ class DrawPath < Base
8
+ include ShapeFlags
9
+
10
+ TYPE = 0x4015
11
+
12
+ class DrawPathBody < Body
13
+ endian :little
14
+ uint32 :pen_id
15
+ end
16
+ BODY = DrawPathBody
17
+
18
+ def path_id = emf_object_id
19
+ def pen_id = body.pen_id
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/binary/float32_le"
4
+ require "emf/emf_plus/records/primitives/rect_array"
5
+
6
+ module Emf
7
+ module EmfPlus
8
+ module Records
9
+ # EmfPlusDrawPie (2.3.4.12). C selects Rect over RectF; ObjectID is the pen.
10
+ class DrawPie < Base
11
+ include ShapeFlags
12
+
13
+ TYPE = 0x4011
14
+
15
+ class DrawPieBody < Body
16
+ endian :little
17
+ mandatory_parameter :flags
18
+ float32_le :start_angle
19
+ float32_le :sweep_angle
20
+ rect_array :rect_data,
21
+ rect_count: 1,
22
+ compressed: -> { flags.anybits?(ShapeFlags::COMPRESSED_FLAG) }
23
+ end
24
+ BODY = DrawPieBody
25
+
26
+ def pen_id = emf_object_id
27
+ def start_angle = body.start_angle
28
+ def sweep_angle = body.sweep_angle
29
+ def rect = body.rect_data.rects.first
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/emf_plus/records/primitives/rect_array"
4
+
5
+ module Emf
6
+ module EmfPlus
7
+ module Records
8
+ # EmfPlusDrawRects (2.3.4.13). C selects Rect over RectF; ObjectID is the pen.
9
+ class DrawRects < Base
10
+ include ShapeFlags
11
+
12
+ TYPE = 0x400B
13
+
14
+ class DrawRectsBody < Body
15
+ endian :little
16
+ mandatory_parameter :flags
17
+ uint32 :item_count
18
+ rect_array :rect_data,
19
+ rect_count: :item_count,
20
+ compressed: -> { flags.anybits?(ShapeFlags::COMPRESSED_FLAG) }
21
+ end
22
+ BODY = DrawRectsBody
23
+
24
+ def pen_id = emf_object_id
25
+ def count = body.item_count
26
+ def rects = body.rect_data.rects
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/emf_plus/records/primitives/rect_f"
4
+
5
+ module Emf
6
+ module EmfPlus
7
+ module Records
8
+ # EmfPlusDrawString (2.3.4.14). AlignmentPadding (up to 3 bytes, ignored on
9
+ # read) stays in `trailing`.
10
+ class DrawString < Base
11
+ TYPE = 0x401C
12
+ SOLID_COLOR_FLAG = 0x8000
13
+ OBJECT_ID_MASK = 0x00FF
14
+
15
+ class DrawStringBody < Body
16
+ endian :little
17
+ uint32 :brush_id
18
+ uint32 :format_id
19
+ uint32 :char_count
20
+ rect_f :layout_rect
21
+ string :string_data, read_length: -> { char_count * 2 }
22
+ end
23
+ BODY = DrawStringBody
24
+
25
+ def flag_fields = { solid_color: SOLID_COLOR_FLAG, font_object_id: OBJECT_ID_MASK }
26
+
27
+ def solid_color? = flags.anybits?(SOLID_COLOR_FLAG)
28
+ def font_object_id = flags & OBJECT_ID_MASK
29
+ def brush_id = body.brush_id
30
+ def format_id = body.format_id
31
+ def length = body.char_count
32
+ def layout_rect = body.layout_rect.then { |r| [r.x, r.y, r.width, r.height] }
33
+
34
+ def text
35
+ body.string_data.to_s.dup.force_encoding(Encoding::UTF_16LE)
36
+ .encode(Encoding::UTF_8, invalid: :replace, undef: :replace)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module EmfPlus
5
+ module Records
6
+ # EmfPlusEndContainer (2.3.7.3): closes the container identified by StackIndex.
7
+ class EndContainer < Base
8
+ TYPE = 0x4029
9
+
10
+ class EndContainerBody < Body
11
+ endian :little
12
+ uint32 :stack_index
13
+ end
14
+ BODY = EndContainerBody
15
+
16
+ def stack_index = body.stack_index.to_i
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module EmfPlus
5
+ module Records
6
+ # EmfPlusEndOfFile (2.3.3.1): no body.
7
+ class EndOfFile < Base
8
+ TYPE = 0x4002
9
+
10
+ class EndOfFileBody < Body
11
+ endian :little
12
+ end
13
+ BODY = EndOfFileBody
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/emf_plus/records/primitives/argb"
4
+
5
+ module Emf
6
+ module EmfPlus
7
+ module Records
8
+ # The S flag of a fill record says whether BrushId is an ARGB colour or
9
+ # an EmfPlusBrush index in the object table.
10
+ module FillBrush
11
+ SOLID_COLOR_FLAG = 0x8000
12
+
13
+ def flag_fields = super.merge(solid_color: SOLID_COLOR_FLAG)
14
+
15
+ def solid_color? = flags.anybits?(SOLID_COLOR_FLAG)
16
+ def brush_id = body.brush_id
17
+ def brush_color = Primitives::ARGB.read([brush_id].pack("V"))
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/binary/float32_le"
4
+ require "emf/emf_plus/records/primitives/point_array"
5
+
6
+ module Emf
7
+ module EmfPlus
8
+ module Records
9
+ # EmfPlusFillClosedCurve (2.3.4.15). S solid colour brush, C compressed, W winding fill, P relative points.
10
+ class FillClosedCurve < Base
11
+ include ShapeFlags
12
+ include FillBrush
13
+
14
+ TYPE = 0x4016
15
+
16
+ class FillClosedCurveBody < Body
17
+ endian :little
18
+ mandatory_parameter :flags
19
+ uint32 :brush_id
20
+ float32_le :tension
21
+ uint32 :item_count
22
+ point_array :point_data,
23
+ point_count: :item_count,
24
+ relative: -> { flags.anybits?(ShapeFlags::RELATIVE_FLAG) },
25
+ compressed: -> { flags.anybits?(ShapeFlags::COMPRESSED_FLAG) }
26
+ end
27
+ BODY = FillClosedCurveBody
28
+
29
+ def flag_fields = super.merge(winding: 0x2000)
30
+
31
+ def winding? = flags.anybits?(0x2000)
32
+ def tension = body.tension
33
+ def count = body.item_count
34
+ def points = body.point_data.points
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/emf_plus/records/primitives/rect_array"
4
+
5
+ module Emf
6
+ module EmfPlus
7
+ module Records
8
+ # EmfPlusFillEllipse (2.3.4.16). S solid colour brush, C selects Rect over RectF.
9
+ class FillEllipse < Base
10
+ include ShapeFlags
11
+ include FillBrush
12
+
13
+ TYPE = 0x400E
14
+
15
+ class FillEllipseBody < Body
16
+ endian :little
17
+ mandatory_parameter :flags
18
+ uint32 :brush_id
19
+ rect_array :rect_data,
20
+ rect_count: 1,
21
+ compressed: -> { flags.anybits?(ShapeFlags::COMPRESSED_FLAG) }
22
+ end
23
+ BODY = FillEllipseBody
24
+
25
+ def rect = body.rect_data.rects.first
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module EmfPlus
5
+ module Records
6
+ # EmfPlusFillPath (2.3.4.17). S solid colour brush; ObjectID is the path.
7
+ class FillPath < Base
8
+ include ShapeFlags
9
+ include FillBrush
10
+
11
+ TYPE = 0x4014
12
+
13
+ class FillPathBody < Body
14
+ endian :little
15
+ uint32 :brush_id
16
+ end
17
+ BODY = FillPathBody
18
+
19
+ def path_id = emf_object_id
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/binary/float32_le"
4
+ require "emf/emf_plus/records/primitives/rect_array"
5
+
6
+ module Emf
7
+ module EmfPlus
8
+ module Records
9
+ # EmfPlusFillPie (2.3.4.18). S solid colour brush, C selects Rect over RectF.
10
+ class FillPie < Base
11
+ include ShapeFlags
12
+ include FillBrush
13
+
14
+ TYPE = 0x4010
15
+
16
+ class FillPieBody < Body
17
+ endian :little
18
+ mandatory_parameter :flags
19
+ uint32 :brush_id
20
+ float32_le :start_angle
21
+ float32_le :sweep_angle
22
+ rect_array :rect_data,
23
+ rect_count: 1,
24
+ compressed: -> { flags.anybits?(ShapeFlags::COMPRESSED_FLAG) }
25
+ end
26
+ BODY = FillPieBody
27
+
28
+ def start_angle = body.start_angle
29
+ def sweep_angle = body.sweep_angle
30
+ def rect = body.rect_data.rects.first
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/emf_plus/records/primitives/point_array"
4
+
5
+ module Emf
6
+ module EmfPlus
7
+ module Records
8
+ # EmfPlusFillPolygon (2.3.4.19). S solid colour brush, C compressed, P relative points.
9
+ class FillPolygon < Base
10
+ include ShapeFlags
11
+ include FillBrush
12
+
13
+ TYPE = 0x400C
14
+
15
+ class FillPolygonBody < Body
16
+ endian :little
17
+ mandatory_parameter :flags
18
+ uint32 :brush_id
19
+ uint32 :item_count
20
+ point_array :point_data,
21
+ point_count: :item_count,
22
+ relative: -> { flags.anybits?(ShapeFlags::RELATIVE_FLAG) },
23
+ compressed: -> { flags.anybits?(ShapeFlags::COMPRESSED_FLAG) }
24
+ end
25
+ BODY = FillPolygonBody
26
+
27
+ def count = body.item_count
28
+ def points = body.point_data.points
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/emf_plus/records/primitives/rect_array"
4
+
5
+ module Emf
6
+ module EmfPlus
7
+ module Records
8
+ # EmfPlusFillRects (2.3.4.20). S solid colour brush, C selects Rect over RectF.
9
+ class FillRects < Base
10
+ include ShapeFlags
11
+ include FillBrush
12
+
13
+ TYPE = 0x400A
14
+
15
+ class FillRectsBody < Body
16
+ endian :little
17
+ mandatory_parameter :flags
18
+ uint32 :brush_id
19
+ uint32 :item_count
20
+ rect_array :rect_data,
21
+ rect_count: :item_count,
22
+ compressed: -> { flags.anybits?(ShapeFlags::COMPRESSED_FLAG) }
23
+ end
24
+ BODY = FillRectsBody
25
+
26
+ def count = body.item_count
27
+ def rects = body.rect_data.rects
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module EmfPlus
5
+ module Records
6
+ # EmfPlusFillRegion (2.3.4.21). S solid colour brush; ObjectID is the region.
7
+ class FillRegion < Base
8
+ include ShapeFlags
9
+ include FillBrush
10
+
11
+ TYPE = 0x4013
12
+
13
+ class FillRegionBody < Body
14
+ endian :little
15
+ uint32 :brush_id
16
+ end
17
+ BODY = FillRegionBody
18
+
19
+ def region_id = emf_object_id
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module EmfPlus
5
+ module Records
6
+ # EmfPlusGetDC (2.3.3.2): no body. Following EMF records are drawable
7
+ # until the next EMF+ record, so its position in the stream matters.
8
+ class GetDC < Base
9
+ TYPE = 0x4004
10
+
11
+ class GetDCBody < Body
12
+ endian :little
13
+ end
14
+ BODY = GetDCBody
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module EmfPlus
5
+ module Records
6
+ # EmfPlusHeader (2.3.3.3). Record Flags bit D marks EMF+ Dual; the V bit
7
+ # of EmfPlusFlags marks a video reference device.
8
+ class Header < Base
9
+ TYPE = 0x4001
10
+ GRAPHICS_SIGNATURE = 0xDBC01
11
+ DUAL_FLAG = 0x0001
12
+ VIDEO_FLAG = 0x00000001
13
+
14
+ class HeaderBody < Body
15
+ endian :little
16
+ uint32 :graphics_version
17
+ uint32 :emf_plus_flags
18
+ uint32 :logical_dpi_x
19
+ uint32 :logical_dpi_y
20
+ end
21
+ BODY = HeaderBody
22
+
23
+ def flag_fields = { dual: DUAL_FLAG }
24
+
25
+ def dual? = flags.anybits?(DUAL_FLAG)
26
+ def video? = body.emf_plus_flags.anybits?(VIDEO_FLAG)
27
+ def graphics_signature = body.graphics_version >> 12
28
+ def graphics_version = body.graphics_version & 0xFFF
29
+ def valid_signature? = graphics_signature == GRAPHICS_SIGNATURE
30
+ def logical_dpi_x = body.logical_dpi_x
31
+ def logical_dpi_y = body.logical_dpi_y
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/emf_plus/records/primitives/transform_matrix"
4
+
5
+ module Emf
6
+ module EmfPlus
7
+ module Records
8
+ # EmfPlusMultiplyWorldTransform (2.3.9.1): multiplies the world transform by MatrixData.
9
+ class MultiplyWorldTransform < Base
10
+ include PostMultiplyFlag
11
+
12
+ TYPE = 0x402C
13
+
14
+ class MultiplyWorldTransformBody < Body
15
+ endian :little
16
+ transform_matrix :matrix
17
+ end
18
+ BODY = MultiplyWorldTransformBody
19
+
20
+ def matrix = body.matrix
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module EmfPlus
5
+ module Records
6
+ # EmfPlusObject (2.3.5.1). ObjectData stays opaque. When the C flag is
7
+ # set the body starts with TotalObjectSize (counted inside DataSize and
8
+ # repeated in every chunk); see ObjectChain for joining chunks.
9
+ class Object < Base
10
+ TYPE = 0x4008
11
+ CONTINUED_FLAG = 0x8000
12
+ TYPE_MASK = 0x7F00
13
+ ID_MASK = 0x00FF
14
+
15
+ class ObjectBody < Body
16
+ endian :little
17
+ mandatory_parameter :data_size
18
+ mandatory_parameter :flags
19
+ uint32 :total_object_size, onlyif: -> { flags.anybits?(CONTINUED_FLAG) }
20
+ string :object_data, read_length: -> { data_size - (flags.anybits?(CONTINUED_FLAG) ? 4 : 0) }
21
+ end
22
+ BODY = ObjectBody
23
+
24
+ def object_type = (flags & TYPE_MASK) >> 8
25
+ def emf_object_id = flags & ID_MASK
26
+ def continued? = flags.anybits?(CONTINUED_FLAG)
27
+ def total_object_size = continued? ? body.total_object_size.to_i : nil
28
+ def object_data = body.object_data.to_s
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "emf/binary/float32_le"
4
+
5
+ module Emf
6
+ module EmfPlus
7
+ module Records
8
+ # EmfPlusOffsetClip (2.3.1.1): translates the clipping region by dx, dy.
9
+ class OffsetClip < Base
10
+ TYPE = 0x4035
11
+
12
+ class OffsetClipBody < Body
13
+ endian :little
14
+ float32_le :dx
15
+ float32_le :dy
16
+ end
17
+ BODY = OffsetClipBody
18
+
19
+ def dx = body.dx
20
+ def dy = body.dy
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bindata"
4
+
5
+ module Emf
6
+ module EmfPlus
7
+ module Records
8
+ module Primitives
9
+ # EmfPlusARGB (2.2.2.1): bytes are stored blue, green, red, alpha.
10
+ class ARGB < Body
11
+ endian :little
12
+ uint8 :blue
13
+ uint8 :green
14
+ uint8 :red
15
+ uint8 :alpha
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bindata"
4
+ require "emf/emf_plus/records/primitives/bitmap_data"
5
+ require "emf/emf_plus/records/primitives/compressed_image"
6
+
7
+ module Emf
8
+ module EmfPlus
9
+ module Records
10
+ module Primitives
11
+ # EmfPlusBitmap (2.2.2.2). BitmapDataType 0 is pixel data, 1 is a
12
+ # compressed image; any other value keeps its bytes in unrecognized_data.
13
+ class Bitmap < Body
14
+ PIXEL = 0
15
+ COMPRESSED = 1
16
+ INDEXED_FLAG = 0x10000
17
+
18
+ endian :little
19
+ int32 :width
20
+ int32 :height
21
+ int32 :stride
22
+ uint32 :pixel_format
23
+ uint32 :bitmap_type
24
+ bitmap_data :bitmap_data, onlyif: -> { bitmap_type == PIXEL },
25
+ indexed: -> { pixel_format.anybits?(INDEXED_FLAG) }
26
+ compressed_image :compressed_image, onlyif: -> { bitmap_type == COMPRESSED }
27
+ rest :unrecognized_data, onlyif: -> { ![PIXEL, COMPRESSED].include?(bitmap_type) }
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bindata"
4
+ require "emf/emf_plus/records/primitives/palette"
5
+
6
+ module Emf
7
+ module EmfPlus
8
+ module Records
9
+ module Primitives
10
+ # EmfPlusBitmapData (2.2.2.3). The parent EmfPlusBitmap says whether
11
+ # its PixelFormat has the I flag, which makes Colors mandatory.
12
+ class BitmapData < Body
13
+ endian :little
14
+ mandatory_parameter :indexed
15
+ palette :colors, onlyif: :indexed
16
+ rest :pixel_data
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bindata"
4
+ require "emf/binary/float32_le"
5
+ require "emf/emf_plus/records/primitives/bounded_array"
6
+ require "emf/emf_plus/records/primitives/argb"
7
+
8
+ module Emf
9
+ module EmfPlus
10
+ module Records
11
+ module Primitives
12
+ # EmfPlusBlendColors (2.2.2.4).
13
+ class BlendColors < Body
14
+ endian :little
15
+ uint32 :position_count
16
+ bounded_array :blend_positions, type: :float32_le, element_size: 4, initial_length: :position_count
17
+ bounded_array :blend_colors, type: :argb, element_size: 4, initial_length: :position_count
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end