Permalink
Browse files

RVG

  • Loading branch information...
1 parent 391da1b commit ff68465ef84220046b16989a7edf7bb16e742360 rmagick committed Mar 12, 2005
View
@@ -0,0 +1,46 @@
+#--
+# $Id: clippath.rb,v 1.1 2005/03/12 17:02:00 rmagick Exp $
+# Copyright (C) 2005 Timothy P. Hunter
+#++
+class Magick::RVG
+
+ class ClipPath
+ include ShapeConstructors
+ include UseConstructors
+ include TextConstructors
+ include Describable
+ include Stylable
+ include Duplicatable
+
+ # Create a clipping path. Within the block create an outline
+ # from one or more paths, basic shapes, text objects, or +use+.
+ # Everything drawn within the outline will be displayed.
+ # Anything drawn outside the outline will not.
+ #
+ # If the clipping path contains a +use+, it
+ # must directly reference path, basic shape, or text objects.
+ #
+ # Attach the clipping path to an object with the :clip_path style.
+ def initialize(clip_path_units='userSpaceOnUse')
+ super()
+ if ! ['userSpaceOnUse', 'objectBoundingBox'].include?(clip_path_units)
+ raise ArgumentError, "undefined value for clip path units: #{clip_path_units}"
+ end
+ @clip_path_units = clip_path_units
+ @content = Content.new
+ yield(self) if block_given?
+ end
+
+ def add_primitives(gc, style) #:nodoc:
+ name = __id__.to_s
+ gc.define_clip_path(name) do
+ gc.clip_units(@clip_path_units)
+ @content.each { |element| element.add_primitives(gc) }
+ end
+ gc.clip_path(name)
+ end
+
+ end # class ClipPath
+
+end # class Magick::RVG
+
View
@@ -0,0 +1,129 @@
+#--
+# $Id: container.rb,v 1.1 2005/03/12 17:02:00 rmagick Exp $
+# Copyright (C) 2005 Timothy P. Hunter
+#++
+
+class Magick::RVG
+
+ # Content is simply an Array with a deep_copy method.
+ # When unit-testing, it also has a deep_equal method.
+ class Content < Array #:nodoc:
+
+ def deep_copy(h = {})
+ me = self.__id__
+ copy = h[me]
+ unless copy
+ copy = self.class.new
+ each do |c|
+ copy << case
+ when c.nil?
+ nil
+ when c.respond_to?(:deep_copy)
+ c.deep_copy(h)
+ when c.respond_to?(:dup)
+ c.dup rescue c
+ else
+ c
+ end
+ end
+ copy.freeze if frozen?
+ h[me] = copy
+ end
+ return copy
+ end
+
+ end # class Content
+
+ # Define a collection of shapes, text, etc. that can be reused.
+ # Group objects are _containers_. That is, styles and transforms defined
+ # on the group are used by contained objects such as shapes, text, and
+ # nested groups unless overridden by a nested container or the object itself.
+ # Groups can be reused with the RVG::UseConstructors#use method.
+ # Create groups within
+ # containers with the RVG::StructureConstructors#g method.
+ #
+ # Example:
+ # # All elements in the group will be translated by 50 in the
+ # # x-direction and 10 in the y-direction.
+ # rvg.g.translate(50, 10).styles(:stroke=>'red',:fill=>'none') do |grp|
+ # # The line will be red.
+ # grp.line(10,10, 20,20)
+ # # The circle will be blue.
+ # grp.circle(10, 20, 20).styles(:stroke=>'blue')
+ # end
+ class Group
+ include Stylable
+ include Transformable
+ include Embellishable
+ include Describable
+ include Duplicatable
+
+ def initialize
+ super
+ @content = Content.new
+ yield(self) if block_given?
+ end
+
+ def add_primitives(gc) #:nodoc:
+ gc.push
+ add_transform_primitives(gc)
+ add_style_primitives(gc)
+ @content.each { |element| element.add_primitives(gc) }
+ gc.pop
+ end
+
+ # Translate container according to #use arguments
+ def ref(x, y, width, height) #:nodoc:
+ translate(x, y) if (x != 0 || y != 0)
+ end
+
+ # Append an arbitrary object to the group's content. Called
+ # by #use to insert a non-container object into a group.
+ def <<(obj) #:nodoc:
+ @content << obj
+ end
+
+ end # class Group
+
+
+ # A Use object allows the re-use of RVG and RVG::Group
+ # objects within a container. Create a Use object with the
+ # RVG::UseConstructors#use method.
+ class Use
+ include Stylable
+ include Transformable
+ include Duplicatable
+
+ # In a container, Use objects are created indirectly via the
+ # RVG::UseConstructors#use method.
+ # The +x+ and +y+ arguments
+ # can be used to specify an additional translation for
+ # the group. The +width+ and +height+ arguments specify
+ # a width and height for referenced RVG objects.
+ def initialize(element, x=0, y=0, width=nil, height=nil)
+ super()
+
+ # If the element is not a group, defs, symbol, or rvg,
+ # wrap a group around it so it can get a transform and
+ # possibly a new viewport.
+ if ! element.respond_to?(:ref)
+ @element = Group.new
+ @element << element.deep_copy
+ else
+ @element = element.deep_copy
+ end
+ @element.ref(x, y, width, height)
+ end
+
+ def add_primitives(gc) #:nodoc:
+ gc.push
+ add_transform_primitives(gc)
+ add_style_primitives(gc)
+ @element.add_primitives(gc)
+ gc.pop
+ end
+
+ end # class Use
+
+end # class Magick::RVG
+
View
@@ -0,0 +1,54 @@
+class Magick::RVG
+
+ [PathData, Styles, Transforms].each do |c|
+ c.class_eval do
+ def deep_equal(other)
+ if self != other
+ puts "#{c.inspect} not equal.\nself:#{self} != other:#{other}"
+ return false
+ end
+ return true
+ end
+ end
+ end
+
+ [Shape, TextBase, Image, Group, Content, Use, ClipPath, Pattern, self].each do |c|
+ c.class_eval do
+ def deep_equal(other)
+ ivs = self.instance_variables
+
+ ivs.each do |iv|
+ itv = self.instance_variable_get(iv)
+ otv = other.instance_variable_get(iv)
+ if itv.respond_to?(:deep_equal)
+ if itv.equal?(otv)
+ puts "#{iv} has deep_equal but self.#{iv} and other.#{iv} are the same object."
+ return false
+ end
+ if !itv.deep_equal(otv)
+ puts "Not equal.\nself.#{iv}=#{itv.inspect}\nother.#{iv}=#{otv.inspect}"
+ return false
+ end
+ else
+ case itv
+ when Float, Symbol, TrueClass, FalseClass, Fixnum, NilClass
+ return false if itv != otv
+ else
+ if itv.equal?(otv)
+ puts "#{iv} is dup-able but self.#{iv} and other.#{iv} are the same object."
+ return false
+ end
+ if itv != otv
+ puts "Not equal.\nself.#{iv}=#{itv.inspect}\nother.#{iv}=#{otv.inspect}"
+ return false
+ end
+ end
+ end
+ end
+
+ return true
+ end
+ end
+ end
+
+end # class Magick::RVG
View
@@ -0,0 +1,51 @@
+#--
+# $Id: describable.rb,v 1.1 2005/03/12 17:02:00 rmagick Exp $
+# Copyright (C) 2005 Timothy P. Hunter
+#++
+
+class Magick::RVG
+
+ #--
+ # Corresponds to SVG's Description.class
+ #++
+ # This module defines a number of metadata attributes.
+ module Describable
+
+ private
+
+ def initialize(*args, &block) #:nodoc:
+ super
+ @title, @desc, @metadata = nil
+ end
+
+ public
+
+ # Sets the object description
+ attr_writer :desc
+ # Sets the object title
+ attr_writer :title
+ # Sets the object metadata
+ attr_writer :metadata
+
+ # Returns the title of this object. The RVG object title is stored as
+ # the 'title' property on the image
+ def title
+ @title.to_s
+ end
+
+ # Returns the description of this object. The RVG object description is
+ # stored as the 'desc' property on the image
+ def desc
+ @desc.to_s
+ end
+
+ # Returns additional metadata of this object. The RVG object metadata
+ # are stored as the 'metadata' property on the image
+ def metadata
+ @metadata.to_s
+ end
+
+ end # module Describable
+
+end # class Magick::RVG
+
Oops, something went wrong.

0 comments on commit ff68465

Please sign in to comment.