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.
- checksums.yaml +4 -4
- data/README.adoc +224 -19
- data/exe/emf +12 -0
- data/lib/emf/backend.rb +60 -0
- data/lib/emf/binary/class_field_accessors.rb +49 -0
- data/lib/emf/binary/float32_le.rb +54 -0
- data/lib/emf/binary/types.rb +40 -6
- data/lib/emf/conformance/context.rb +36 -0
- data/lib/emf/conformance/diagnostic.rb +18 -0
- data/lib/emf/conformance/manifest/emf_bitmap_misc.yml +622 -0
- data/lib/emf/conformance/manifest/emf_control_buffers.yml +61 -0
- data/lib/emf/conformance/manifest/emf_core.yml +117 -0
- data/lib/emf/conformance/manifest/emf_corpus_rules.yml +21 -0
- data/lib/emf/conformance/manifest/emf_objects_geometry.yml +229 -0
- data/lib/emf/conformance/manifest/emf_plus.yml +357 -0
- data/lib/emf/conformance/manifest/emf_plus_core.yml +33 -0
- data/lib/emf/conformance/manifest/emf_state_path.yml +403 -0
- data/lib/emf/conformance/manifest/emf_text.yml +97 -0
- data/lib/emf/conformance/manifest/wmf.yml +874 -0
- data/lib/emf/conformance/manifest.rb +79 -0
- data/lib/emf/conformance/profile.rb +35 -0
- data/lib/emf/conformance/record_types.rb +24 -0
- data/lib/emf/conformance/registry.rb +76 -0
- data/lib/emf/conformance/report.rb +83 -0
- data/lib/emf/conformance/rule.rb +16 -0
- data/lib/emf/conformance/rules/emf_bitmap.rb +357 -0
- data/lib/emf/conformance/rules/emf_comment_escape.rb +309 -0
- data/lib/emf/conformance/rules/emf_control_buffers.rb +137 -0
- data/lib/emf/conformance/rules/emf_corpus_named.rb +83 -0
- data/lib/emf/conformance/rules/emf_framing.rb +94 -0
- data/lib/emf/conformance/rules/emf_geometry.rb +282 -0
- data/lib/emf/conformance/rules/emf_header.rb +114 -0
- data/lib/emf/conformance/rules/emf_objects.rb +291 -0
- data/lib/emf/conformance/rules/emf_parse_recovery.rb +97 -0
- data/lib/emf/conformance/rules/emf_path_clip.rb +165 -0
- data/lib/emf/conformance/rules/emf_plus.rb +75 -0
- data/lib/emf/conformance/rules/emf_plus_common.rb +58 -0
- data/lib/emf/conformance/rules/emf_plus_drawing.rb +78 -0
- data/lib/emf/conformance/rules/emf_plus_effects.rb +104 -0
- data/lib/emf/conformance/rules/emf_plus_fields.rb +169 -0
- data/lib/emf/conformance/rules/emf_plus_fields_b.rb +102 -0
- data/lib/emf/conformance/rules/emf_plus_framing.rb +172 -0
- data/lib/emf/conformance/rules/emf_plus_objects.rb +97 -0
- data/lib/emf/conformance/rules/emf_plus_payloads.rb +320 -0
- data/lib/emf/conformance/rules/emf_plus_properties.rb +96 -0
- data/lib/emf/conformance/rules/emf_plus_state.rb +77 -0
- data/lib/emf/conformance/rules/emf_state.rb +244 -0
- data/lib/emf/conformance/rules/emf_text.rb +221 -0
- data/lib/emf/conformance/rules/emf_transform.rb +85 -0
- data/lib/emf/conformance/rules/wmf_buffers.rb +259 -0
- data/lib/emf/conformance/rules/wmf_framing.rb +146 -0
- data/lib/emf/conformance/rules/wmf_layout_records.rb +112 -0
- data/lib/emf/conformance/rules/wmf_objects.rb +168 -0
- data/lib/emf/conformance/rules/wmf_records.rb +191 -0
- data/lib/emf/conformance/rules/wmf_rejections.rb +184 -0
- data/lib/emf/conformance/runner.rb +61 -0
- data/lib/emf/conformance/ternary_raster_operations.rb +52 -0
- data/lib/emf/conformance.rb +31 -0
- data/lib/emf/emf_plus/effects/blur.rb +24 -0
- data/lib/emf/emf_plus/effects/brightness_contrast.rb +22 -0
- data/lib/emf/emf_plus/effects/color_balance.rb +24 -0
- data/lib/emf/emf_plus/effects/color_curve.rb +24 -0
- data/lib/emf/emf_plus/effects/color_lookup_table.rb +26 -0
- data/lib/emf/emf_plus/effects/color_matrix.rb +23 -0
- data/lib/emf/emf_plus/effects/effect.rb +50 -0
- data/lib/emf/emf_plus/effects/hue_saturation_lightness.rb +24 -0
- data/lib/emf/emf_plus/effects/levels.rb +24 -0
- data/lib/emf/emf_plus/effects/opaque.rb +19 -0
- data/lib/emf/emf_plus/effects/red_eye_correction.rb +35 -0
- data/lib/emf/emf_plus/effects/sharpen.rb +24 -0
- data/lib/emf/emf_plus/effects/tint.rb +22 -0
- data/lib/emf/emf_plus/effects.rb +45 -0
- data/lib/emf/emf_plus/frame.rb +41 -0
- data/lib/emf/emf_plus/links/effect_link.rb +16 -0
- data/lib/emf/emf_plus/links/get_dc_span.rb +18 -0
- data/lib/emf/emf_plus/links/link_error.rb +15 -0
- data/lib/emf/emf_plus/links.rb +77 -0
- data/lib/emf/emf_plus/object_chain.rb +108 -0
- data/lib/emf/emf_plus/object_table.rb +182 -0
- data/lib/emf/emf_plus/objects/brush.rb +296 -0
- data/lib/emf/emf_plus/objects/custom_line_cap.rb +106 -0
- data/lib/emf/emf_plus/objects/font.rb +47 -0
- data/lib/emf/emf_plus/objects/image.rb +68 -0
- data/lib/emf/emf_plus/objects/image_attributes.rb +28 -0
- data/lib/emf/emf_plus/objects/opaque.rb +19 -0
- data/lib/emf/emf_plus/objects/parts.rb +103 -0
- data/lib/emf/emf_plus/objects/path.rb +21 -0
- data/lib/emf/emf_plus/objects/pen.rb +132 -0
- data/lib/emf/emf_plus/objects/region.rb +39 -0
- data/lib/emf/emf_plus/objects/string_format.rb +55 -0
- data/lib/emf/emf_plus/objects/typed.rb +50 -0
- data/lib/emf/emf_plus/objects.rb +46 -0
- data/lib/emf/emf_plus/parser.rb +64 -2
- data/lib/emf/emf_plus/records/base.rb +107 -0
- data/lib/emf/emf_plus/records/begin_container.rb +31 -0
- data/lib/emf/emf_plus/records/begin_container_no_params.rb +20 -0
- data/lib/emf/emf_plus/records/body.rb +16 -0
- data/lib/emf/emf_plus/records/clear.rb +22 -0
- data/lib/emf/emf_plus/records/clip_transform_flags.rb +26 -0
- data/lib/emf/emf_plus/records/comment.rb +21 -0
- data/lib/emf/emf_plus/records/draw_arc.rb +33 -0
- data/lib/emf/emf_plus/records/draw_beziers.rb +31 -0
- data/lib/emf/emf_plus/records/draw_closed_curve.rb +34 -0
- data/lib/emf/emf_plus/records/draw_curve.rb +38 -0
- data/lib/emf/emf_plus/records/draw_driver_string.rb +61 -0
- data/lib/emf/emf_plus/records/draw_ellipse.rb +28 -0
- data/lib/emf/emf_plus/records/draw_image.rb +42 -0
- data/lib/emf/emf_plus/records/draw_image_points.rb +62 -0
- data/lib/emf/emf_plus/records/draw_lines.rb +34 -0
- data/lib/emf/emf_plus/records/draw_path.rb +23 -0
- data/lib/emf/emf_plus/records/draw_pie.rb +33 -0
- data/lib/emf/emf_plus/records/draw_rects.rb +30 -0
- data/lib/emf/emf_plus/records/draw_string.rb +41 -0
- data/lib/emf/emf_plus/records/end_container.rb +20 -0
- data/lib/emf/emf_plus/records/end_of_file.rb +17 -0
- data/lib/emf/emf_plus/records/fill_brush.rb +21 -0
- data/lib/emf/emf_plus/records/fill_closed_curve.rb +38 -0
- data/lib/emf/emf_plus/records/fill_ellipse.rb +29 -0
- data/lib/emf/emf_plus/records/fill_path.rb +23 -0
- data/lib/emf/emf_plus/records/fill_pie.rb +34 -0
- data/lib/emf/emf_plus/records/fill_polygon.rb +32 -0
- data/lib/emf/emf_plus/records/fill_rects.rb +31 -0
- data/lib/emf/emf_plus/records/fill_region.rb +23 -0
- data/lib/emf/emf_plus/records/get_dc.rb +18 -0
- data/lib/emf/emf_plus/records/header.rb +35 -0
- data/lib/emf/emf_plus/records/multiply_world_transform.rb +24 -0
- data/lib/emf/emf_plus/records/object.rb +32 -0
- data/lib/emf/emf_plus/records/offset_clip.rb +24 -0
- data/lib/emf/emf_plus/records/primitives/argb.rb +20 -0
- data/lib/emf/emf_plus/records/primitives/bitmap.rb +32 -0
- data/lib/emf/emf_plus/records/primitives/bitmap_data.rb +21 -0
- data/lib/emf/emf_plus/records/primitives/blend_colors.rb +22 -0
- data/lib/emf/emf_plus/records/primitives/blend_factors.rb +21 -0
- data/lib/emf/emf_plus/records/primitives/bounded_array.rb +38 -0
- data/lib/emf/emf_plus/records/primitives/byte_reader.rb +25 -0
- data/lib/emf/emf_plus/records/primitives/character_range.rb +20 -0
- data/lib/emf/emf_plus/records/primitives/compressed_image.rb +17 -0
- data/lib/emf/emf_plus/records/primitives/focus_scale_data.rb +20 -0
- data/lib/emf/emf_plus/records/primitives/graphics_version.rb +21 -0
- data/lib/emf/emf_plus/records/primitives/language_identifier.rb +22 -0
- data/lib/emf/emf_plus/records/primitives/metafile.rb +19 -0
- data/lib/emf/emf_plus/records/primitives/palette.rb +21 -0
- data/lib/emf/emf_plus/records/primitives/path.rb +89 -0
- data/lib/emf/emf_plus/records/primitives/path_point_type.rb +21 -0
- data/lib/emf/emf_plus/records/primitives/path_point_type_rle.rb +23 -0
- data/lib/emf/emf_plus/records/primitives/point.rb +18 -0
- data/lib/emf/emf_plus/records/primitives/point_array.rb +42 -0
- data/lib/emf/emf_plus/records/primitives/point_f.rb +19 -0
- data/lib/emf/emf_plus/records/primitives/point_r.rb +19 -0
- data/lib/emf/emf_plus/records/primitives/rect.rb +20 -0
- data/lib/emf/emf_plus/records/primitives/rect_array.rb +24 -0
- data/lib/emf/emf_plus/records/primitives/rect_f.rb +21 -0
- data/lib/emf/emf_plus/records/primitives/region_node.rb +68 -0
- data/lib/emf/emf_plus/records/primitives/region_node_child_nodes.rb +22 -0
- data/lib/emf/emf_plus/records/primitives/region_node_path.rb +37 -0
- data/lib/emf/emf_plus/records/primitives/relative_coordinate.rb +32 -0
- data/lib/emf/emf_plus/records/primitives/string_format_data.rb +23 -0
- data/lib/emf/emf_plus/records/primitives/transform_matrix.rb +23 -0
- data/lib/emf/emf_plus/records/primitives.rb +41 -0
- data/lib/emf/emf_plus/records/reset_clip.rb +17 -0
- data/lib/emf/emf_plus/records/reset_world_transform.rb +17 -0
- data/lib/emf/emf_plus/records/restore.rb +20 -0
- data/lib/emf/emf_plus/records/rotate_world_transform.rb +24 -0
- data/lib/emf/emf_plus/records/save.rb +20 -0
- data/lib/emf/emf_plus/records/scale_world_transform.rb +26 -0
- data/lib/emf/emf_plus/records/serializable_object.rb +32 -0
- data/lib/emf/emf_plus/records/set_anti_alias_mode.rb +25 -0
- data/lib/emf/emf_plus/records/set_clip_path.rb +20 -0
- data/lib/emf/emf_plus/records/set_clip_rect.rb +24 -0
- data/lib/emf/emf_plus/records/set_clip_region.rb +20 -0
- data/lib/emf/emf_plus/records/set_compositing_mode.rb +21 -0
- data/lib/emf/emf_plus/records/set_compositing_quality.rb +21 -0
- data/lib/emf/emf_plus/records/set_interpolation_mode.rb +21 -0
- data/lib/emf/emf_plus/records/set_page_transform.rb +25 -0
- data/lib/emf/emf_plus/records/set_pixel_offset_mode.rb +21 -0
- data/lib/emf/emf_plus/records/set_rendering_origin.rb +22 -0
- data/lib/emf/emf_plus/records/set_text_contrast.rb +24 -0
- data/lib/emf/emf_plus/records/set_text_rendering_hint.rb +21 -0
- data/lib/emf/emf_plus/records/set_ts_clip.rb +40 -0
- data/lib/emf/emf_plus/records/set_ts_graphics.rb +88 -0
- data/lib/emf/emf_plus/records/set_world_transform.rb +22 -0
- data/lib/emf/emf_plus/records/shape_flags.rb +23 -0
- data/lib/emf/emf_plus/records/translate_world_transform.rb +26 -0
- data/lib/emf/emf_plus/records/unknown.rb +20 -0
- data/lib/emf/emf_plus/records.rb +107 -0
- data/lib/emf/emf_plus/serializer.rb +9 -2
- data/lib/emf/emf_plus/stream/conformance.rb +68 -0
- data/lib/emf/emf_plus/stream/editor.rb +21 -0
- data/lib/emf/emf_plus/stream/emf_gap.rb +20 -0
- data/lib/emf/emf_plus/stream/link_index.rb +30 -0
- data/lib/emf/emf_plus/stream/rebuild.rb +47 -0
- data/lib/emf/emf_plus/stream/record_handle.rb +26 -0
- data/lib/emf/emf_plus/stream/segment.rb +70 -0
- data/lib/emf/emf_plus/stream.rb +153 -0
- data/lib/emf/emf_plus.rb +9 -0
- data/lib/emf/emr/binary/dib_header.rb +142 -0
- data/lib/emf/emr/binary/ext_text_out_fields.rb +43 -0
- data/lib/emf/emr/binary/extended_pen_buffers.rb +23 -0
- data/lib/emf/emr/binary/fast_fill.rb +1164 -0
- data/lib/emf/emr/binary/font.rb +159 -0
- data/lib/emf/emr/binary/lazy_utf16_array.rb +82 -0
- data/lib/emf/emr/binary/pack_plan.rb +144 -0
- data/lib/emf/emr/binary/pack_plan_check.rb +75 -0
- data/lib/emf/emr/binary/pack_plan_exact.rb +130 -0
- data/lib/emf/emr/binary/pack_plan_generate.rb +116 -0
- data/lib/emf/emr/binary/pack_plan_values.rb +92 -0
- data/lib/emf/emr/binary/palette_body.rb +19 -0
- data/lib/emf/emr/binary/palette_entry.rb +18 -0
- data/lib/emf/emr/binary/record.rb +33 -0
- data/lib/emf/emr/binary/records/alpha_blend.rb +43 -0
- data/lib/emf/emr/binary/records/angle_arc.rb +2 -2
- data/lib/emf/emr/binary/records/bit_blt.rb +14 -0
- data/lib/emf/emr/binary/records/color_correct_palette.rb +55 -1
- data/lib/emf/emr/binary/records/colormatch_to_target_w.rb +76 -1
- data/lib/emf/emr/binary/records/create_colorspace.rb +67 -1
- data/lib/emf/emr/binary/records/create_colorspace_w.rb +90 -1
- data/lib/emf/emr/binary/records/create_dib_pattern_brush_pt.rb +14 -0
- data/lib/emf/emr/binary/records/create_font_indirect_w.rb +6 -2
- data/lib/emf/emr/binary/records/create_mono_brush.rb +14 -0
- data/lib/emf/emr/binary/records/create_palette.rb +19 -1
- data/lib/emf/emr/binary/records/delete_colorspace.rb +22 -1
- data/lib/emf/emr/binary/records/draw_escape.rb +45 -1
- data/lib/emf/emr/binary/records/ellipse.rb +1 -1
- data/lib/emf/emr/binary/records/eof.rb +9 -0
- data/lib/emf/emr/binary/records/ext_create_pen.rb +80 -1
- data/lib/emf/emr/binary/records/ext_escape.rb +45 -1
- data/lib/emf/emr/binary/records/ext_flood_fill.rb +9 -2
- data/lib/emf/emr/binary/records/ext_select_clip_rgn.rb +9 -1
- data/lib/emf/emr/binary/records/ext_text_out_a.rb +16 -3
- data/lib/emf/emr/binary/records/ext_text_out_w.rb +14 -3
- data/lib/emf/emr/binary/records/fill_rgn.rb +11 -2
- data/lib/emf/emr/binary/records/force_ufi_mapping.rb +38 -1
- data/lib/emf/emr/binary/records/frame_rgn.rb +12 -2
- data/lib/emf/emr/binary/records/gls_bounded_record.rb +61 -1
- data/lib/emf/emr/binary/records/gls_record.rb +42 -1
- data/lib/emf/emr/binary/records/gradient_fill.rb +7 -0
- data/lib/emf/emr/binary/records/invert_rgn.rb +11 -3
- data/lib/emf/emr/binary/records/mask_blt.rb +66 -0
- data/lib/emf/emr/binary/records/named_escape.rb +78 -1
- data/lib/emf/emr/binary/records/paint_rgn.rb +11 -3
- data/lib/emf/emr/binary/records/pixel_format.rb +76 -1
- data/lib/emf/emr/binary/records/plg_blt.rb +66 -0
- data/lib/emf/emr/binary/records/poly_textout_a.rb +128 -1
- data/lib/emf/emr/binary/records/poly_textout_w.rb +128 -1
- data/lib/emf/emr/binary/records/raw.rb +3 -0
- data/lib/emf/emr/binary/records/realize_palette.rb +1 -0
- data/lib/emf/emr/binary/records/rectangle.rb +1 -1
- data/lib/emf/emr/binary/records/resize_palette.rb +16 -2
- data/lib/emf/emr/binary/records/round_rect.rb +2 -2
- data/lib/emf/emr/binary/records/select_palette.rb +1 -0
- data/lib/emf/emr/binary/records/set_color_adjustment.rb +136 -0
- data/lib/emf/emr/binary/records/set_colorspace.rb +22 -1
- data/lib/emf/emr/binary/records/set_dibits_to_device.rb +43 -0
- data/lib/emf/emr/binary/records/set_icm_profile_a.rb +71 -1
- data/lib/emf/emr/binary/records/set_icm_profile_w.rb +71 -1
- data/lib/emf/emr/binary/records/set_linked_ufis.rb +49 -1
- data/lib/emf/emr/binary/records/set_miter_limit.rb +1 -1
- data/lib/emf/emr/binary/records/set_palette_entries.rb +20 -2
- data/lib/emf/emr/binary/records/set_text_justification.rb +8 -2
- data/lib/emf/emr/binary/records/small_text_out.rb +55 -4
- data/lib/emf/emr/binary/records/stretch_blt.rb +14 -0
- data/lib/emf/emr/binary/records/stretch_dibits.rb +14 -0
- data/lib/emf/emr/binary/records/transparent_blt.rb +43 -0
- data/lib/emf/emr/binary/records.rb +4 -2
- data/lib/emf/emr/binary/region_data.rb +33 -0
- data/lib/emf/emr/binary/state_record_body.rb +33 -0
- data/lib/emf/emr/binary/thin_shell.rb +226 -0
- data/lib/emf/emr/binary/value_view/layout.rb +101 -0
- data/lib/emf/emr/binary/value_view/reader_source.rb +88 -0
- data/lib/emf/emr/binary/value_view.rb +173 -0
- data/lib/emf/emr/binary/variable_buffers.rb +87 -0
- data/lib/emf/emr/binary.rb +4 -0
- data/lib/emf/emr/filled_record.rb +77 -0
- data/lib/emf/emr/parser.rb +239 -50
- data/lib/emf/emr/serializer.rb +4 -5
- data/lib/emf/emr.rb +1 -0
- data/lib/emf/error.rb +24 -1
- data/lib/emf/model/diagnostic.rb +41 -0
- data/lib/emf/model/emr/header.rb +40 -1
- data/lib/emf/model/emr/records.rb +142 -6
- data/lib/emf/model/emr/wire_values.rb +43 -0
- data/lib/emf/model/emr.rb +1 -0
- data/lib/emf/model/geometry/color.rb +19 -1
- data/lib/emf/model/metafile.rb +22 -2
- data/lib/emf/model/wmf/bitmap_records.rb +155 -0
- data/lib/emf/model/wmf/brush_records.rb +45 -0
- data/lib/emf/model/wmf/dc_escape_records.rb +67 -0
- data/lib/emf/model/wmf/font_record.rb +40 -0
- data/lib/emf/model/wmf/geometry_records.rb +107 -0
- data/lib/emf/model/wmf/header.rb +36 -0
- data/lib/emf/model/wmf/object_records.rb +71 -0
- data/lib/emf/model/wmf/palette_records.rb +68 -0
- data/lib/emf/model/wmf/records.rb +247 -0
- data/lib/emf/model/wmf/region_records.rb +112 -0
- data/lib/emf/model/wmf/state_records.rb +188 -0
- data/lib/emf/model/wmf/text_records.rb +36 -0
- data/lib/emf/model/wmf.rb +11 -0
- data/lib/emf/model.rb +2 -0
- data/lib/emf/native/bitmap_fields.rb +58 -0
- data/lib/emf/native/diagnostic_contract.rb +39 -0
- data/lib/emf/native/diagnostics.rb +81 -0
- data/lib/emf/native/emf_plus_loader.rb +35 -0
- data/lib/emf/native/emf_plus_snapshot.rb +96 -0
- data/lib/emf/native/emf_plus_source.rb +20 -0
- data/lib/emf/native/emf_plus_stream.rb +150 -0
- data/lib/emf/native/fields.rb +369 -0
- data/lib/emf/native/font_fields.rb +87 -0
- data/lib/emf/native/gradient_fields.rb +23 -0
- data/lib/emf/native/header.rb +35 -0
- data/lib/emf/native/header_errors.rb +30 -0
- data/lib/emf/native/hydrator.rb +151 -0
- data/lib/emf/native/lazy_wire.rb +100 -0
- data/lib/emf/native/legacy_state_fields.rb +22 -0
- data/lib/emf/native/library_path.rb +68 -0
- data/lib/emf/native/loader.rb +120 -0
- data/lib/emf/native/palette_fields.rb +45 -0
- data/lib/emf/native/poly_text_fields.rb +116 -0
- data/lib/emf/native/resource_failure.rb +28 -0
- data/lib/emf/native/small_text_fields.rb +27 -0
- data/lib/emf/native/snapshot.rb +102 -0
- data/lib/emf/native/wmf_bitmap_fields.rb +58 -0
- data/lib/emf/native/wmf_brush_fields.rb +62 -0
- data/lib/emf/native/wmf_fields.rb +117 -0
- data/lib/emf/native/wmf_hydrator.rb +143 -0
- data/lib/emf/native/wmf_loading.rb +49 -0
- data/lib/emf/native/wmf_palette_fields.rb +60 -0
- data/lib/emf/native/wmf_region_fields.rb +92 -0
- data/lib/emf/native/wmf_rejection.rb +84 -0
- data/lib/emf/native/wmf_remaining_fields.rb +70 -0
- data/lib/emf/native/wmf_snapshot.rb +51 -0
- data/lib/emf/native/wmf_text_fields.rb +56 -0
- data/lib/emf/native.rb +61 -0
- data/lib/emf/parse_evidence.rb +57 -0
- data/lib/emf/resource_budget/bitmap.rb +66 -0
- data/lib/emf/resource_budget/gradient.rb +30 -0
- data/lib/emf/resource_budget/poly_text.rb +85 -0
- data/lib/emf/resource_budget.rb +382 -0
- data/lib/emf/resource_limits/emf_records.rb +130 -0
- data/lib/emf/resource_limits.rb +58 -0
- data/lib/emf/version.rb +1 -1
- data/lib/emf/visitors/dump.rb +4 -0
- data/lib/emf/visitors/stats.rb +6 -5
- data/lib/emf/wmf/binary.rb +150 -1
- data/lib/emf/wmf/bitmap_codec.rb +118 -0
- data/lib/emf/wmf/brush_codec.rb +102 -0
- data/lib/emf/wmf/dc_escape_codec.rb +75 -0
- data/lib/emf/wmf/dib.rb +187 -0
- data/lib/emf/wmf/embedded_emf.rb +137 -0
- data/lib/emf/wmf/escape_views.rb +89 -0
- data/lib/emf/wmf/evidence.rb +255 -0
- data/lib/emf/wmf/geometry_codec.rb +49 -0
- data/lib/emf/wmf/palette_codec.rb +85 -0
- data/lib/emf/wmf/parser.rb +147 -2
- data/lib/emf/wmf/recovery.rb +95 -0
- data/lib/emf/wmf/region_codec.rb +151 -0
- data/lib/emf/wmf/serializer.rb +164 -2
- data/lib/emf/wmf/text_codec.rb +123 -0
- data/lib/emf/wmf.rb +7 -0
- data/lib/emf.rb +13 -9
- 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
|