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,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module Model
5
+ module Wmf
6
+ module Records
7
+ class GeometryRecord < Record
8
+ def initialize(type_id:, offset: nil, suffix: "".b)
9
+ super(type_id: type_id, offset: offset)
10
+ @suffix = suffix
11
+ end
12
+
13
+ attr_accessor :suffix
14
+ end
15
+
16
+ class ScaleExtRecord < GeometryRecord
17
+ WIRE_FIELDS = %i[y_denom y_num x_denom x_num].freeze
18
+ WIRE_TYPES = %i[int16 int16 int16 int16].freeze
19
+ WIRE_FORMAT = "s<4"
20
+ PAYLOAD_BYTES = 8
21
+
22
+ def initialize(type_id:, y_denom:, y_num:, x_denom:, x_num:, offset: nil, suffix: "".b)
23
+ super(type_id: type_id, offset: offset, suffix: suffix)
24
+ @y_denom = y_denom
25
+ @y_num = y_num
26
+ @x_denom = x_denom
27
+ @x_num = x_num
28
+ end
29
+
30
+ attr_accessor :y_denom, :y_num, :x_denom, :x_num
31
+ end
32
+
33
+ class ScaleWindowExt < ScaleExtRecord
34
+ def initialize(y_denom:, y_num:, x_denom:, x_num:, offset: nil, suffix: "".b, type_id: 0x0410)
35
+ super
36
+ end
37
+ end
38
+
39
+ class ScaleViewportExt < ScaleExtRecord
40
+ def initialize(y_denom:, y_num:, x_denom:, x_num:, offset: nil, suffix: "".b, type_id: 0x0412)
41
+ super
42
+ end
43
+ end
44
+
45
+ class ColorPointRecord < GeometryRecord
46
+ WIRE_FIELDS = %i[color y x].freeze
47
+ WIRE_TYPES = %i[uint32 int16 int16].freeze
48
+ WIRE_FORMAT = "Vs<2"
49
+ PAYLOAD_BYTES = 8
50
+
51
+ def initialize(type_id:, color:, y:, x:, offset: nil, suffix: "".b)
52
+ super(type_id: type_id, offset: offset, suffix: suffix)
53
+ @color = color
54
+ @y = y
55
+ @x = x
56
+ end
57
+
58
+ attr_accessor :color, :y, :x
59
+ end
60
+
61
+ class FloodFill < ColorPointRecord
62
+ def initialize(color:, y:, x:, offset: nil, suffix: "".b, type_id: 0x0419)
63
+ super
64
+ end
65
+ end
66
+
67
+ class SetPixel < ColorPointRecord
68
+ def initialize(color:, y:, x:, offset: nil, suffix: "".b, type_id: 0x041F)
69
+ super
70
+ end
71
+ end
72
+
73
+ class ExtFloodFill < ColorPointRecord
74
+ WIRE_FIELDS = %i[mode color y x].freeze
75
+ WIRE_TYPES = %i[uint16 uint32 int16 int16].freeze
76
+ WIRE_FORMAT = "vVs<2"
77
+ PAYLOAD_BYTES = 10
78
+
79
+ def initialize(mode:, color:, y:, x:, offset: nil, suffix: "".b, type_id: 0x0548)
80
+ super(type_id: type_id, color: color, y: y, x: x, offset: offset, suffix: suffix)
81
+ @mode = mode
82
+ end
83
+
84
+ attr_accessor :mode
85
+ end
86
+
87
+ class PatBlt < GeometryRecord
88
+ WIRE_FIELDS = %i[raster_operation height width y_left x_left].freeze
89
+ WIRE_TYPES = %i[uint32 int16 int16 int16 int16].freeze
90
+ WIRE_FORMAT = "Vs<4"
91
+ PAYLOAD_BYTES = 12
92
+
93
+ def initialize(raster_operation:, height:, width:, y_left:, x_left:, offset: nil, suffix: "".b, type_id: 0x061D)
94
+ super(type_id: type_id, offset: offset, suffix: suffix)
95
+ @raster_operation = raster_operation
96
+ @height = height
97
+ @width = width
98
+ @y_left = y_left
99
+ @x_left = x_left
100
+ end
101
+
102
+ attr_accessor :raster_operation, :height, :width, :y_left, :x_left
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module Model
5
+ module Wmf
6
+ class Header
7
+ def initialize(type:, version:, size_words:, number_of_objects:, max_record_words:, number_of_members:, placeable: nil)
8
+ @type = type
9
+ @version = version
10
+ @size_words = size_words
11
+ @number_of_objects = number_of_objects
12
+ @max_record_words = max_record_words
13
+ @number_of_members = number_of_members
14
+ @placeable = placeable
15
+ end
16
+
17
+ attr_reader :type, :version, :size_words, :number_of_objects, :max_record_words, :number_of_members, :placeable
18
+ end
19
+
20
+ class PlaceableHeader
21
+ def initialize(handle:, left:, top:, right:, bottom:, inch:, checksum:)
22
+ @handle = handle
23
+ @left = left
24
+ @top = top
25
+ @right = right
26
+ @bottom = bottom
27
+ @inch = inch
28
+ @checksum = checksum
29
+ end
30
+
31
+ attr_reader :handle, :checksum
32
+ attr_accessor :left, :top, :right, :bottom, :inch
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module Model
5
+ module Wmf
6
+ module Records
7
+ class ObjectRecord < Record
8
+ end
9
+
10
+ class CreatePenIndirect < ObjectRecord
11
+ WIRE_FIELDS = %i[pen_style width_x width_y color_ref].freeze
12
+ WIRE_FORMAT = "vs<2V"
13
+ WIRE_TYPES = %i[uint16 int16 int16 uint32].freeze
14
+ PAYLOAD_BYTES = 10
15
+
16
+ def initialize(pen_style:, width_x:, width_y:, color_ref:, offset: nil, type_id: 0x02FA)
17
+ super(type_id: type_id, offset: offset)
18
+ @pen_style = pen_style
19
+ @width_x = width_x
20
+ @width_y = width_y
21
+ @color_ref = color_ref
22
+ end
23
+
24
+ attr_accessor :pen_style, :width_x, :width_y, :color_ref
25
+ end
26
+
27
+ class CreateBrushIndirect < ObjectRecord
28
+ WIRE_FIELDS = %i[brush_style color_ref brush_hatch].freeze
29
+ WIRE_FORMAT = "vVv"
30
+ WIRE_TYPES = %i[uint16 uint32 uint16].freeze
31
+ PAYLOAD_BYTES = 8
32
+
33
+ def initialize(brush_style:, color_ref:, brush_hatch:, offset: nil, type_id: 0x02FC)
34
+ super(type_id: type_id, offset: offset)
35
+ @brush_style = brush_style
36
+ @color_ref = color_ref
37
+ @brush_hatch = brush_hatch
38
+ end
39
+
40
+ attr_accessor :brush_style, :color_ref, :brush_hatch
41
+ end
42
+
43
+ class ObjectReference < ObjectRecord
44
+ WIRE_FIELDS = %i[object_index].freeze
45
+ WIRE_FORMAT = "v"
46
+ WIRE_TYPES = %i[uint16].freeze
47
+ PAYLOAD_BYTES = 2
48
+
49
+ def initialize(type_id:, object_index:, offset: nil)
50
+ super(type_id: type_id, offset: offset)
51
+ @object_index = object_index
52
+ end
53
+
54
+ attr_accessor :object_index
55
+ end
56
+
57
+ class SelectObject < ObjectReference
58
+ def initialize(object_index:, offset: nil, type_id: 0x012D)
59
+ super
60
+ end
61
+ end
62
+
63
+ class DeleteObject < ObjectReference
64
+ def initialize(object_index:, offset: nil, type_id: 0x01F0)
65
+ super
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module Model
5
+ module Wmf
6
+ module Records
7
+ PaletteEntry = Struct.new(:red, :green, :blue, :flags, keyword_init: true)
8
+
9
+ class PaletteRecord < Record
10
+ def initialize(type_id:, start:, entries:, offset: nil, suffix: "".b)
11
+ super(type_id: type_id, offset: offset)
12
+ @start = start
13
+ @entries = entries
14
+ @suffix = suffix
15
+ end
16
+
17
+ attr_accessor :start, :entries, :suffix
18
+ end
19
+
20
+ class CreatePalette < PaletteRecord
21
+ def initialize(start:, entries:, offset: nil, suffix: "".b, type_id: 0x00F7)
22
+ super
23
+ end
24
+ end
25
+
26
+ class SetPalEntries < PaletteRecord
27
+ def initialize(start:, entries:, offset: nil, suffix: "".b, type_id: 0x0037)
28
+ super
29
+ end
30
+ end
31
+
32
+ class AnimatePalette < PaletteRecord
33
+ def initialize(start:, entries:, offset: nil, suffix: "".b, type_id: 0x0436)
34
+ super
35
+ end
36
+ end
37
+
38
+ class SelectPalette < ObjectReference
39
+ def initialize(object_index:, offset: nil, suffix: "".b, type_id: 0x0234)
40
+ super(type_id: type_id, offset: offset, object_index: object_index)
41
+ @suffix = suffix
42
+ end
43
+
44
+ attr_accessor :suffix
45
+ end
46
+
47
+ class ResizePalette < Record
48
+ def initialize(entry_count:, offset: nil, suffix: "".b, type_id: 0x0139)
49
+ super(type_id: type_id, offset: offset)
50
+ @entry_count = entry_count
51
+ @suffix = suffix
52
+ end
53
+
54
+ attr_accessor :entry_count, :suffix
55
+ end
56
+
57
+ class RealizePalette < Record
58
+ def initialize(offset: nil, suffix: "".b, type_id: 0x0035)
59
+ super(type_id: type_id, offset: offset)
60
+ @suffix = suffix
61
+ end
62
+
63
+ attr_accessor :suffix
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,247 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module Model
5
+ module Wmf
6
+ module Records
7
+ class Record < Emf::Model::Record
8
+ Emf::Model::Visitor.register_visit(:visit_wmf_record, self)
9
+
10
+ def initialize(type_id:, offset: nil)
11
+ super()
12
+ @type_id = type_id
13
+ @offset = offset
14
+ end
15
+
16
+ attr_reader :type_id, :offset, :declared_size_words
17
+
18
+ # The record's rdSize as written in the source file, in 16-bit words; nil for a record built in memory.
19
+ # Set by the parsers; it is not rewritten when the record is edited.
20
+ def declare_size(words)
21
+ @declared_size_words = words
22
+ self
23
+ end
24
+
25
+ def declared_size_bytes
26
+ @declared_size_words && (@declared_size_words * 2)
27
+ end
28
+
29
+ def accept(visitor)
30
+ visitor.visit_wmf_record(self)
31
+ end
32
+ end
33
+
34
+ class Eof < Record
35
+ def initialize(offset: nil)
36
+ super(type_id: 0, offset: offset)
37
+ end
38
+ end
39
+
40
+ class PointRecord < Record
41
+ WIRE_FIELDS = %i[y x].freeze
42
+
43
+ def initialize(type_id:, x:, y:, offset: nil)
44
+ super(type_id: type_id, offset: offset)
45
+ @x = x
46
+ @y = y
47
+ end
48
+
49
+ attr_accessor :x, :y
50
+ end
51
+
52
+ class MoveTo < PointRecord
53
+ def initialize(x:, y:, offset: nil, type_id: 0x0214)
54
+ super
55
+ end
56
+ end
57
+
58
+ class LineTo < PointRecord
59
+ def initialize(x:, y:, offset: nil, type_id: 0x0213)
60
+ super
61
+ end
62
+ end
63
+
64
+ class SetWindowOrg < PointRecord
65
+ def initialize(x:, y:, offset: nil, type_id: 0x020B)
66
+ super
67
+ end
68
+ end
69
+
70
+ class SetWindowExt < PointRecord
71
+ def initialize(x:, y:, offset: nil, type_id: 0x020C)
72
+ super
73
+ end
74
+ end
75
+
76
+ class SetViewportOrg < PointRecord
77
+ def initialize(x:, y:, offset: nil, type_id: 0x020D)
78
+ super
79
+ end
80
+ end
81
+
82
+ class SetViewportExt < PointRecord
83
+ def initialize(x:, y:, offset: nil, type_id: 0x020E)
84
+ super
85
+ end
86
+ end
87
+
88
+ class OffsetRecord < Record
89
+ WIRE_FIELDS = %i[y_offset x_offset].freeze
90
+
91
+ def initialize(type_id:, x_offset:, y_offset:, offset: nil)
92
+ super(type_id: type_id, offset: offset)
93
+ @x_offset = x_offset
94
+ @y_offset = y_offset
95
+ end
96
+
97
+ attr_accessor :x_offset, :y_offset
98
+ end
99
+
100
+ class OffsetWindowOrg < OffsetRecord
101
+ def initialize(x_offset:, y_offset:, offset: nil, type_id: 0x020F)
102
+ super
103
+ end
104
+ end
105
+
106
+ class OffsetViewportOrg < OffsetRecord
107
+ def initialize(x_offset:, y_offset:, offset: nil, type_id: 0x0211)
108
+ super
109
+ end
110
+ end
111
+
112
+ class RectangleRecord < Record
113
+ WIRE_FIELDS = %i[bottom right top left].freeze
114
+
115
+ def initialize(type_id:, left:, top:, right:, bottom:, offset: nil)
116
+ super(type_id: type_id, offset: offset)
117
+ @left = left
118
+ @top = top
119
+ @right = right
120
+ @bottom = bottom
121
+ end
122
+
123
+ attr_accessor :left, :top, :right, :bottom
124
+ end
125
+
126
+ class Rectangle < RectangleRecord
127
+ def initialize(left:, top:, right:, bottom:, offset: nil, type_id: 0x041B)
128
+ super
129
+ end
130
+ end
131
+
132
+ class Ellipse < RectangleRecord
133
+ def initialize(left:, top:, right:, bottom:, offset: nil, type_id: 0x0418)
134
+ super
135
+ end
136
+ end
137
+
138
+ class Arc < RectangleRecord
139
+ WIRE_FIELDS = %i[y_end_arc x_end_arc y_start_arc x_start_arc bottom right top left].freeze
140
+
141
+ def initialize(left:, top:, right:, bottom:, x_start_arc:, y_start_arc:, x_end_arc:, y_end_arc:,
142
+ offset: nil, type_id: 0x0817)
143
+ super(type_id: type_id, offset: offset, left: left, top: top, right: right, bottom: bottom)
144
+ @x_start_arc = x_start_arc
145
+ @y_start_arc = y_start_arc
146
+ @x_end_arc = x_end_arc
147
+ @y_end_arc = y_end_arc
148
+ end
149
+
150
+ attr_accessor :x_start_arc, :y_start_arc, :x_end_arc, :y_end_arc
151
+ end
152
+
153
+ class RadialRecord < RectangleRecord
154
+ WIRE_FIELDS = %i[y_radial2 x_radial2 y_radial1 x_radial1 bottom right top left].freeze
155
+
156
+ def initialize(type_id:, left:, top:, right:, bottom:, x_radial1:, y_radial1:, x_radial2:, y_radial2:, offset: nil)
157
+ super(type_id: type_id, offset: offset, left: left, top: top, right: right, bottom: bottom)
158
+ @x_radial1 = x_radial1
159
+ @y_radial1 = y_radial1
160
+ @x_radial2 = x_radial2
161
+ @y_radial2 = y_radial2
162
+ end
163
+
164
+ attr_accessor :x_radial1, :y_radial1, :x_radial2, :y_radial2
165
+ end
166
+
167
+ class Pie < RadialRecord
168
+ def initialize(left:, top:, right:, bottom:, x_radial1:, y_radial1:, x_radial2:, y_radial2:,
169
+ offset: nil, type_id: 0x081A)
170
+ super
171
+ end
172
+ end
173
+
174
+ class Chord < RadialRecord
175
+ def initialize(left:, top:, right:, bottom:, x_radial1:, y_radial1:, x_radial2:, y_radial2:,
176
+ offset: nil, type_id: 0x0830)
177
+ super
178
+ end
179
+ end
180
+
181
+ class RoundRect < RectangleRecord
182
+ WIRE_FIELDS = %i[height width bottom right top left].freeze
183
+
184
+ def initialize(left:, top:, right:, bottom:, width:, height:, offset: nil, type_id: 0x061C)
185
+ super(type_id: type_id, offset: offset, left: left, top: top, right: right, bottom: bottom)
186
+ @width = width
187
+ @height = height
188
+ end
189
+
190
+ attr_accessor :width, :height
191
+ end
192
+
193
+ PointS = Struct.new(:x, :y, keyword_init: true)
194
+
195
+ class PointArrayRecord < Record
196
+ def initialize(type_id:, points:, offset: nil)
197
+ super(type_id: type_id, offset: offset)
198
+ @points = points
199
+ end
200
+
201
+ attr_accessor :points
202
+ end
203
+
204
+ class Polygon < PointArrayRecord
205
+ def initialize(points:, offset: nil, type_id: 0x0324)
206
+ super
207
+ end
208
+ end
209
+
210
+ class Polyline < PointArrayRecord
211
+ def initialize(points:, offset: nil, type_id: 0x0325)
212
+ super
213
+ end
214
+ end
215
+
216
+ class PolyPolygon < PointArrayRecord
217
+ def initialize(points:, points_per_polygon:, offset: nil, type_id: 0x0538)
218
+ super(points: points, offset: offset, type_id: type_id)
219
+ @points_per_polygon = points_per_polygon
220
+ end
221
+
222
+ attr_accessor :points_per_polygon
223
+ end
224
+
225
+ class UnknownRecord < Record
226
+ def initialize(type_id:, raw_bytes:, offset: nil)
227
+ super(type_id: type_id, offset: offset)
228
+ @raw_bytes = raw_bytes.dup.freeze
229
+ end
230
+
231
+ attr_reader :raw_bytes
232
+ end
233
+ end
234
+ end
235
+ end
236
+ end
237
+
238
+ require "emf/model/wmf/object_records"
239
+ require "emf/model/wmf/font_record"
240
+ require "emf/model/wmf/text_records"
241
+ require "emf/model/wmf/state_records"
242
+ require "emf/model/wmf/palette_records"
243
+ require "emf/model/wmf/region_records"
244
+ require "emf/model/wmf/brush_records"
245
+ require "emf/model/wmf/bitmap_records"
246
+ require "emf/model/wmf/geometry_records"
247
+ require "emf/model/wmf/dc_escape_records"
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Emf
4
+ module Model
5
+ module Wmf
6
+ module Records
7
+ RegionBounds = Struct.new(:left, :top, :right, :bottom, keyword_init: true)
8
+ RegionScanLine = Struct.new(:left, :right, keyword_init: true)
9
+ RegionScan = Struct.new(:top, :bottom, :lines, keyword_init: true)
10
+
11
+ class CreateRegion < ObjectRecord
12
+ def initialize(next_in_chain:, object_count:, bounds:, scans:, offset: nil, suffix: "".b, type_id: 0x06FF)
13
+ super(type_id: type_id, offset: offset)
14
+ @next_in_chain = next_in_chain
15
+ @object_count = object_count
16
+ @bounds = bounds
17
+ @scans = scans
18
+ @suffix = suffix
19
+ end
20
+
21
+ attr_accessor :next_in_chain, :object_count, :bounds, :scans, :suffix
22
+ end
23
+
24
+ class FillRegion < ObjectRecord
25
+ WIRE_FIELDS = %i[region_index brush_index].freeze
26
+ WIRE_TYPES = %i[uint16 uint16].freeze
27
+ WIRE_FORMAT = "v2"
28
+
29
+ def initialize(region_index:, brush_index:, offset: nil, suffix: "".b, type_id: 0x0228)
30
+ super(type_id: type_id, offset: offset)
31
+ @region_index = region_index
32
+ @brush_index = brush_index
33
+ @suffix = suffix
34
+ end
35
+
36
+ attr_accessor :region_index, :brush_index, :suffix
37
+ end
38
+
39
+ class FrameRegion < FillRegion
40
+ WIRE_FIELDS = %i[region_index brush_index height width].freeze
41
+ WIRE_TYPES = %i[uint16 uint16 int16 int16].freeze
42
+ WIRE_FORMAT = "v2s<2"
43
+
44
+ def initialize(region_index:, brush_index:, height:, width:, offset: nil, suffix: "".b, type_id: 0x0429)
45
+ super(region_index: region_index, brush_index: brush_index, offset: offset, suffix: suffix, type_id: type_id)
46
+ @height = height
47
+ @width = width
48
+ end
49
+
50
+ attr_accessor :height, :width
51
+ end
52
+
53
+ class RegionReference < ObjectReference
54
+ def initialize(type_id:, object_index:, offset: nil, suffix: "".b)
55
+ super(type_id: type_id, object_index: object_index, offset: offset)
56
+ @suffix = suffix
57
+ end
58
+
59
+ attr_accessor :suffix
60
+ end
61
+
62
+ class InvertRegion < RegionReference
63
+ def initialize(object_index:, offset: nil, suffix: "".b, type_id: 0x012A)
64
+ super
65
+ end
66
+ end
67
+
68
+ class PaintRegion < RegionReference
69
+ def initialize(object_index:, offset: nil, suffix: "".b, type_id: 0x012B)
70
+ super
71
+ end
72
+ end
73
+
74
+ class SelectClipRegion < RegionReference
75
+ def initialize(object_index:, offset: nil, suffix: "".b, type_id: 0x012C)
76
+ super
77
+ end
78
+ end
79
+
80
+ class OffsetClipRgn < OffsetRecord
81
+ WIRE_TYPES = %i[int16 int16].freeze
82
+ WIRE_FORMAT = "s<2"
83
+
84
+ def initialize(x_offset:, y_offset:, offset: nil, suffix: "".b, type_id: 0x0220)
85
+ super(type_id: type_id, x_offset: x_offset, y_offset: y_offset, offset: offset)
86
+ @suffix = suffix
87
+ end
88
+
89
+ attr_accessor :suffix
90
+ end
91
+
92
+ class ExcludeClipRect < RectangleRecord
93
+ WIRE_TYPES = %i[int16 int16 int16 int16].freeze
94
+ WIRE_FORMAT = "s<4"
95
+
96
+ def initialize(left:, top:, right:, bottom:, offset: nil, suffix: "".b, type_id: 0x0415)
97
+ super(type_id: type_id, left: left, top: top, right: right, bottom: bottom, offset: offset)
98
+ @suffix = suffix
99
+ end
100
+
101
+ attr_accessor :suffix
102
+ end
103
+
104
+ class IntersectClipRect < ExcludeClipRect
105
+ def initialize(left:, top:, right:, bottom:, offset: nil, suffix: "".b, type_id: 0x0416)
106
+ super
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end