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