spec/prawn/svg/elements/gradient_spec.rb in prawn-svg-0.35.1 vs spec/prawn/svg/elements/gradient_spec.rb in prawn-svg-0.36.0

- old
+ new

@@ -1,14 +1,14 @@ require 'spec_helper' describe Prawn::SVG::Elements::Gradient do let(:document) { Prawn::SVG::Document.new(svg, [800, 600], { width: 800, height: 600 }) } - let(:element) { Prawn::SVG::Elements::Gradient.new(document, document.root, [], fake_state) } + let(:root_element) { Prawn::SVG::Elements::Root.new(document, document.root, []) } + let(:element) { document.gradients['flag'] } before do - allow(element).to receive(:assert_compatible_prawn_version) - element.process + root_element.process end describe 'object bounding box with linear gradient' do let(:svg) do <<-SVG @@ -25,21 +25,24 @@ end it 'returns correct gradient arguments for an element' do arguments = element.gradient_arguments(double(bounding_box: [100, 100, 200, 0])) expect(arguments).to eq( - from: [100.0, 100.0], - to: [120.0, 0.0], - stops: [[0, 'ff0000'], [0.25, 'ff0000'], [0.5, 'ffffff'], [0.75, '0000ff'], [1, '0000ff']], - apply_transformations: true + from: [0.0, 0.0], + to: [0.2, 1.0], + wrap: :pad, + matrix: Matrix[[100.0, 0.0, 100.0], [0.0, -100.0, 100.0], [0.0, 0.0, 1.0]], + bounding_box: [100, 100, 200, 0], + stops: [ + { offset: 0, color: 'ff0000', opacity: 1.0 }, + { offset: 0.25, color: 'ff0000', opacity: 1.0 }, + { offset: 0.5, color: 'ffffff', opacity: 1.0 }, + { offset: 0.75, color: '0000ff', opacity: 1.0 }, + { offset: 1, color: '0000ff', opacity: 1.0 } + ] ) end - - it "returns nil if the element doesn't have a bounding box" do - arguments = element.gradient_arguments(double(bounding_box: nil)) - expect(arguments).to be nil - end end describe 'object bounding box with radial gradient' do let(:svg) do <<-SVG @@ -56,16 +59,24 @@ end it 'returns correct gradient arguments for an element' do arguments = element.gradient_arguments(double(bounding_box: [100, 100, 200, 0])) expect(arguments).to eq( - from: [150, 80], - to: [100, 80], - r1: 0, - r2: Math.sqrt(((0.8 * 100)**2) + ((0.8 * 100)**2)), - stops: [[0, 'ff0000'], [0.25, 'ff0000'], [0.5, 'ffffff'], [0.75, '0000ff'], [1, '0000ff']], - apply_transformations: true + from: [0.5, 0.2], + to: [0.0, 0.2], + r1: 0, + r2: 0.8, + wrap: :pad, + matrix: Matrix[[100.0, 0.0, 100.0], [0.0, -100.0, 100.0], [0.0, 0.0, 1.0]], + bounding_box: [100, 100, 200, 0], + stops: [ + { offset: 0, color: 'ff0000', opacity: 1.0 }, + { offset: 0.25, color: 'ff0000', opacity: 1.0 }, + { offset: 0.5, color: 'ffffff', opacity: 1.0 }, + { offset: 0.75, color: '0000ff', opacity: 1.0 }, + { offset: 1, color: '0000ff', opacity: 1.0 } + ] ) end end describe 'user space on use with linear gradient' do @@ -77,16 +88,18 @@ </linearGradient> SVG end it 'returns correct gradient arguments for an element' do - arguments = element.gradient_arguments(double) + arguments = element.gradient_arguments(double(bounding_box: [100, 100, 200, 0])) expect(arguments).to eq( - from: [100.0, 100.0], - to: [200.0, 0.0], - stops: [[0, 'ff0000'], [1, '0000ff']], - apply_transformations: true + from: [100.0, 500.0], + to: [200.0, 600.0], + stops: [{ offset: 0, color: 'ff0000', opacity: 1.0 }, { offset: 1, color: '0000ff', opacity: 1.0 }], + matrix: Matrix[[1.0, 0.0, 0.0], [0.0, -1.0, 600.0], [0.0, 0.0, 1.0]], + wrap: :pad, + bounding_box: [100, 100, 200, 0] ) end end describe 'user space on use with radial gradient' do @@ -98,39 +111,82 @@ </radialGradient> SVG end it 'returns correct gradient arguments for an element' do - arguments = element.gradient_arguments(double) + arguments = element.gradient_arguments(double(bounding_box: [100, 100, 200, 0])) expect(arguments).to eq( - from: [100.0, 100.0], - to: [200.0, 0.0], - r1: 0, - r2: 150, - stops: [[0, 'ff0000'], [1, '0000ff']], - apply_transformations: true + from: [100.0, 500.0], + to: [200.0, 600.0], + r1: 0, + r2: 150.0, + stops: [{ offset: 0, color: 'ff0000', opacity: 1.0 }, { offset: 1, color: '0000ff', opacity: 1.0 }], + matrix: Matrix[[1.0, 0.0, 0.0], [0.0, -1.0, 600.0], [0.0, 0.0, 1.0]], + wrap: :pad, + bounding_box: [100, 100, 200, 0] ) end end context 'when gradientTransform is specified' do let(:svg) do <<-SVG - <linearGradient id="flag" gradientTransform="translateX(10) scale(2)" x1="0" y1="0" x2="10" y2="10"> + <linearGradient id="flag" gradientTransform="translateX(0.5) scale(2)" x1="0" y1="0" x2="1" y2="1"> <stop offset="0" stop-color="red"/> <stop offset="1" stop-color="blue"/> </linearGradient> SVG end it 'passes in the transform via the apply_transformations option' do - arguments = element.gradient_arguments(double(bounding_box: [0, 0, 10, 10])) + arguments = element.gradient_arguments(double(bounding_box: [100, 100, 200, 0])) expect(arguments).to eq( - from: [0, 0], - to: [10, 10], - stops: [[0, 'ff0000'], [1, '0000ff']], - apply_transformations: [2, 0, 0, 2, 10, 0] + from: [0.0, 0.0], + to: [1.0, 1.0], + stops: [{ offset: 0, color: 'ff0000', opacity: 1.0 }, { offset: 1, color: '0000ff', opacity: 1.0 }], + matrix: Matrix[[200.0, 0.0, 150.0], [0.0, -200.0, 100.0], [0.0, 0.0, 1.0]], + wrap: :pad, + bounding_box: [100, 100, 200, 0] + ) + end + end + + context 'when a gradient is linked to another' do + let(:svg) do + <<-SVG + <svg> + <linearGradient id="flag" gradientUnits="userSpaceOnUse" x1="100" y1="500" x2="200" y2="600"> + <stop offset="0" stop-color="red"/> + <stop offset="1" stop-color="blue"/> + </linearGradient> + + <linearGradient id="flag-2" href="#flag" x1="150" x2="220" /> + + <linearGradient id="flag-3" href="#flag-2" x1="170" /> + </svg> + SVG + end + + it 'correctly inherits the attributes from the parent element' do + arguments = document.gradients['flag-2'].gradient_arguments(double(bounding_box: [100, 100, 200, 0])) + expect(arguments).to eq( + from: [150.0, 500.0], + to: [220.0, 600.0], + stops: [{ offset: 0, color: 'ff0000', opacity: 1.0 }, { offset: 1, color: '0000ff', opacity: 1.0 }], + matrix: Matrix[[1.0, 0.0, 0.0], [0.0, -1.0, 600.0], [0.0, 0.0, 1.0]], + wrap: :pad, + bounding_box: [100, 100, 200, 0] + ) + + arguments = document.gradients['flag-3'].gradient_arguments(double(bounding_box: [100, 100, 200, 0])) + expect(arguments).to eq( + from: [170.0, 500.0], + to: [220.0, 600.0], + stops: [{ offset: 0, color: 'ff0000', opacity: 1.0 }, { offset: 1, color: '0000ff', opacity: 1.0 }], + matrix: Matrix[[1.0, 0.0, 0.0], [0.0, -1.0, 600.0], [0.0, 0.0, 1.0]], + wrap: :pad, + bounding_box: [100, 100, 200, 0] ) end end end