Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ImportedProjects
SVG
Commits
87e7be2d
"vscode:/vscode.git/clone" did not exist on "1585c700a80de458ee8c5204bfa6b6bb14db0fb7"
Commit
87e7be2d
authored
May 20, 2014
by
tebjan
Browse files
Merge branch 'master' of github.com:vvvv/SVG
parents
540bfa57
f796142f
Changes
7
Hide whitespace changes
Inline
Side-by-side
Source/DataTypes/SvgUnitConverter.cs
View file @
87e7be2d
...
@@ -23,6 +23,13 @@ namespace Svg
...
@@ -23,6 +23,13 @@ namespace Svg
throw
new
ArgumentOutOfRangeException
(
"value must be a string."
);
throw
new
ArgumentOutOfRangeException
(
"value must be a string."
);
}
}
//support exponents (the SVG that comes back from IE may be an exponent ugh!!!)
if
((
value
as
string
).
Contains
(
"e"
))
{
var
d
=
Decimal
.
Parse
((
string
)
value
,
System
.
Globalization
.
NumberStyles
.
Float
);
value
=
d
.
ToString
();
}
// http://www.w3.org/TR/CSS21/syndata.html#values
// http://www.w3.org/TR/CSS21/syndata.html#values
// http://www.w3.org/TR/SVG11/coords.html#Units
// http://www.w3.org/TR/SVG11/coords.html#Units
...
...
Source/Painting/SvgColourConverter.cs
View file @
87e7be2d
...
@@ -38,9 +38,21 @@ namespace Svg
...
@@ -38,9 +38,21 @@ namespace Svg
try
try
{
{
int
start
=
colour
.
IndexOf
(
"("
)
+
1
;
int
start
=
colour
.
IndexOf
(
"("
)
+
1
;
string
[]
values
=
colour
.
Substring
(
start
,
colour
.
IndexOf
(
")"
)
-
start
).
Split
(
new
char
[]{
','
,
' '
},
StringSplitOptions
.
RemoveEmptyEntries
);
//get the values from the RGB string
string
[]
values
=
colour
.
Substring
(
start
,
colour
.
IndexOf
(
")"
)
-
start
).
Split
(
new
char
[]{
','
,
' '
},
StringSplitOptions
.
RemoveEmptyEntries
);
return
System
.
Drawing
.
Color
.
FromArgb
(
int
.
Parse
(
values
[
0
]),
int
.
Parse
(
values
[
1
]),
int
.
Parse
(
values
[
2
]));
//determine the alpha value if this is an RGBA (it will be the 4th value if there is one)
int
alphaValue
=
255
;
if
(
values
.
Length
>
3
)
{
//the alpha portion of the rgba is not an int 0-255 it is a decimal between 0 and 1
//so we have to determine the corosponding byte value
alphaValue
=
(
int
)(
decimal
.
Parse
(
values
[
3
])
*
255
);
}
Color
colorpart
=
System
.
Drawing
.
Color
.
FromArgb
(
alphaValue
,
int
.
Parse
(
values
[
0
]),
int
.
Parse
(
values
[
1
]),
int
.
Parse
(
values
[
2
]));
return
colorpart
;
}
}
catch
catch
{
{
...
...
Source/Painting/SvgGradientServer.cs
View file @
87e7be2d
using
System
;
using
System.Collections.Generic
;
using
System.Collections.Generic
;
using
System.Collections
;
using
System.Text
;
using
System.Drawing
;
using
System.Drawing
;
using
System.Drawing.Drawing2D
;
using
System.Drawing.Drawing2D
;
...
@@ -104,15 +101,16 @@ namespace Svg
...
@@ -104,15 +101,16 @@ namespace Svg
/// </summary>
/// </summary>
/// <param name="owner">The parent <see cref="SvgVisualElement"/>.</param>
/// <param name="owner">The parent <see cref="SvgVisualElement"/>.</param>
/// <param name="opacity">The opacity of the colour blend.</param>
/// <param name="opacity">The opacity of the colour blend.</param>
protected
ColorBlend
GetColourBlend
(
SvgVisualElement
owner
,
float
opacity
)
protected
ColorBlend
GetColourBlend
(
SvgVisualElement
owner
,
float
opacity
,
bool
radial
)
{
{
ColorBlend
blend
=
new
ColorBlend
();
int
colourBlends
=
this
.
Stops
.
Count
;
int
colourBlends
=
this
.
Stops
.
Count
;
bool
insertStart
=
false
;
bool
insertStart
=
false
;
bool
insertEnd
=
false
;
bool
insertEnd
=
false
;
//gradient.Transform = renderingElement.Transforms.Matrix;
//gradient.Transform = renderingElement.Transforms.Matrix;
//stops should be processed in reverse order if it's a radial gradient
// May need to increase the number of colour blends because the range *must* be from 0.0 to 1.0.
// May need to increase the number of colour blends because the range *must* be from 0.0 to 1.0.
// E.g. 0.5 - 0.8 isn't valid therefore the rest need to be calculated.
// E.g. 0.5 - 0.8 isn't valid therefore the rest need to be calculated.
...
@@ -120,8 +118,15 @@ namespace Svg
...
@@ -120,8 +118,15 @@ namespace Svg
if
(
this
.
Stops
[
0
].
Offset
.
Value
>
0
)
if
(
this
.
Stops
[
0
].
Offset
.
Value
>
0
)
{
{
colourBlends
++;
colourBlends
++;
// Indicate that a colour has to be dynamically added at the start
insertStart
=
true
;
if
(
radial
)
{
insertEnd
=
true
;
}
else
{
insertStart
=
true
;
}
}
}
// If the last stop doesn't end at 1 a stop
// If the last stop doesn't end at 1 a stop
...
@@ -129,12 +134,17 @@ namespace Svg
...
@@ -129,12 +134,17 @@ namespace Svg
if
(
lastValue
<
100
||
lastValue
<
1
)
if
(
lastValue
<
100
||
lastValue
<
1
)
{
{
colourBlends
++;
colourBlends
++;
// Indicate that a colour has to be dynamically added at the end
if
(
radial
)
insertEnd
=
true
;
{
insertStart
=
true
;
}
else
{
insertEnd
=
true
;
}
}
}
blend
.
Positions
=
new
float
[
colourBlends
];
ColorBlend
blend
=
new
ColorBlend
(
colourBlends
);
blend
.
Colors
=
new
Color
[
colourBlends
];
// Set positions and colour values
// Set positions and colour values
int
actualStops
=
0
;
int
actualStops
=
0
;
...
@@ -144,15 +154,24 @@ namespace Svg
...
@@ -144,15 +154,24 @@ namespace Svg
for
(
int
i
=
0
;
i
<
colourBlends
;
i
++)
for
(
int
i
=
0
;
i
<
colourBlends
;
i
++)
{
{
mergedOpacity
=
opacity
*
this
.
Stops
[
actualStops
].
Opacity
;
var
currentStop
=
this
.
Stops
[
radial
?
this
.
Stops
.
Count
-
1
-
actualStops
:
actualStops
];
position
=
(
this
.
Stops
[
actualStops
].
Offset
.
ToDeviceValue
(
owner
)
/
owner
.
Bounds
.
Width
);
colour
=
Color
.
FromArgb
((
int
)(
mergedOpacity
*
255
),
this
.
Stops
[
actualStops
++].
Colour
);
mergedOpacity
=
opacity
*
currentStop
.
Opacity
;
position
=
radial
?
1
-
(
currentStop
.
Offset
.
ToDeviceValue
(
owner
)
/
owner
.
Bounds
.
Width
)
:
(
currentStop
.
Offset
.
ToDeviceValue
(
owner
)
/
owner
.
Bounds
.
Width
);
colour
=
Color
.
FromArgb
((
int
)(
mergedOpacity
*
255
),
currentStop
.
Colour
);
actualStops
++;
// Insert this colour before itself at position 0
// Insert this colour before itself at position 0
if
(
insertStart
&&
i
==
0
)
if
(
insertStart
&&
i
==
0
)
{
{
blend
.
Positions
[
i
]
=
0.0f
;
blend
.
Positions
[
i
]
=
0.0f
;
blend
.
Colors
[
i
++]
=
colour
;
blend
.
Colors
[
i
]
=
colour
;
i
++;
}
}
blend
.
Positions
[
i
]
=
position
;
blend
.
Positions
[
i
]
=
position
;
...
@@ -161,8 +180,10 @@ namespace Svg
...
@@ -161,8 +180,10 @@ namespace Svg
// Insert this colour after itself at position 0
// Insert this colour after itself at position 0
if
(
insertEnd
&&
i
==
colourBlends
-
2
)
if
(
insertEnd
&&
i
==
colourBlends
-
2
)
{
{
blend
.
Positions
[
i
+
1
]
=
1.0f
;
i
++;
blend
.
Colors
[++
i
]
=
colour
;
blend
.
Positions
[
i
]
=
1.0f
;
blend
.
Colors
[
i
]
=
colour
;
}
}
}
}
...
@@ -184,12 +205,12 @@ namespace Svg
...
@@ -184,12 +205,12 @@ namespace Svg
public
override
SvgElement
DeepCopy
<
T
>()
public
override
SvgElement
DeepCopy
<
T
>()
{
{
var
newObj
=
base
.
DeepCopy
<
T
>()
as
SvgGradientServer
;
var
newObj
=
base
.
DeepCopy
<
T
>()
as
SvgGradientServer
;
newObj
.
SpreadMethod
=
this
.
SpreadMethod
;
newObj
.
SpreadMethod
=
this
.
SpreadMethod
;
newObj
.
GradientUnits
=
this
.
GradientUnits
;
newObj
.
GradientUnits
=
this
.
GradientUnits
;
newObj
.
InheritGradient
=
this
.
InheritGradient
;
newObj
.
InheritGradient
=
this
.
InheritGradient
;
return
newObj
;
return
newObj
;
}
}
}
}
}
}
\ No newline at end of file
Source/Painting/SvgLinearGradientServer.cs
View file @
87e7be2d
...
@@ -109,7 +109,7 @@ namespace Svg
...
@@ -109,7 +109,7 @@ namespace Svg
}
}
LinearGradientBrush
gradient
=
new
LinearGradientBrush
(
start
,
end
,
Color
.
Transparent
,
Color
.
Transparent
);
LinearGradientBrush
gradient
=
new
LinearGradientBrush
(
start
,
end
,
Color
.
Transparent
,
Color
.
Transparent
);
gradient
.
InterpolationColors
=
base
.
GetColourBlend
(
owner
,
opacity
);
gradient
.
InterpolationColors
=
base
.
GetColourBlend
(
owner
,
opacity
,
false
);
// Needed to fix an issue where the gradient was being wrapped when though it had the correct bounds
// Needed to fix an issue where the gradient was being wrapped when though it had the correct bounds
gradient
.
WrapMode
=
WrapMode
.
TileFlipX
;
gradient
.
WrapMode
=
WrapMode
.
TileFlipX
;
...
...
Source/Painting/SvgRadialGradientServer.cs
View file @
87e7be2d
using
System
;
using
System.Collections.Generic
;
using
System.Text
;
using
System.Drawing
;
using
System.Drawing
;
using
System.Drawing.Drawing2D
;
using
System.Drawing.Drawing2D
;
...
@@ -33,14 +30,36 @@ namespace Svg
...
@@ -33,14 +30,36 @@ namespace Svg
[
SvgAttribute
(
"fx"
)]
[
SvgAttribute
(
"fx"
)]
public
SvgUnit
FocalX
public
SvgUnit
FocalX
{
{
get
{
return
this
.
Attributes
.
GetAttribute
<
SvgUnit
>(
"fx"
);
}
get
{
var
value
=
this
.
Attributes
.
GetAttribute
<
SvgUnit
>(
"fx"
);
if
(
value
.
IsEmpty
||
value
.
IsNone
)
{
value
=
this
.
CenterX
;
}
return
value
;
}
set
{
this
.
Attributes
[
"fx"
]
=
value
;
}
set
{
this
.
Attributes
[
"fx"
]
=
value
;
}
}
}
[
SvgAttribute
(
"fy"
)]
[
SvgAttribute
(
"fy"
)]
public
SvgUnit
FocalY
public
SvgUnit
FocalY
{
{
get
{
return
this
.
Attributes
.
GetAttribute
<
SvgUnit
>(
"fy"
);
}
get
{
var
value
=
this
.
Attributes
.
GetAttribute
<
SvgUnit
>(
"fy"
);
if
(
value
.
IsEmpty
||
value
.
IsNone
)
{
value
=
this
.
CenterY
;
}
return
value
;
}
set
{
this
.
Attributes
[
"fy"
]
=
value
;
}
set
{
this
.
Attributes
[
"fy"
]
=
value
;
}
}
}
...
@@ -57,26 +76,35 @@ namespace Svg
...
@@ -57,26 +76,35 @@ namespace Svg
public
override
Brush
GetBrush
(
SvgVisualElement
renderingElement
,
float
opacity
)
public
override
Brush
GetBrush
(
SvgVisualElement
renderingElement
,
float
opacity
)
{
{
float
radius
=
this
.
Radius
.
ToDeviceValue
(
renderingElement
);
if
(
radius
<=
0
)
{
return
null
;
}
GraphicsPath
path
=
new
GraphicsPath
();
GraphicsPath
path
=
new
GraphicsPath
();
float
left
=
this
.
CenterX
.
ToDeviceValue
(
renderingElement
);
float
left
=
this
.
CenterX
.
ToDeviceValue
(
renderingElement
);
float
top
=
this
.
CenterY
.
ToDeviceValue
(
renderingElement
,
true
);
float
top
=
this
.
CenterY
.
ToDeviceValue
(
renderingElement
,
true
);
float
radius
=
this
.
Radius
.
ToDeviceValue
(
renderingElement
);
RectangleF
boundingBox
=
(
this
.
GradientUnits
==
SvgCoordinateUnits
.
ObjectBoundingBox
)
?
renderingElement
.
Bounds
:
renderingElement
.
OwnerDocument
.
GetDimensions
();
RectangleF
boundingBox
=
(
this
.
GradientUnits
==
SvgCoordinateUnits
.
ObjectBoundingBox
)
?
renderingElement
.
Bounds
:
renderingElement
.
OwnerDocument
.
GetDimensions
();
if
(
radius
>
0
)
path
.
AddEllipse
(
{
boundingBox
.
Left
+
left
-
radius
,
path
.
AddEllipse
(
left
-
radius
,
top
-
radius
,
radius
*
2
,
radius
*
2
);
boundingBox
.
Top
+
top
-
radius
,
radius
*
2
,
radius
*
2
);
PathGradientBrush
brush
=
new
PathGradientBrush
(
path
);
PathGradientBrush
brush
=
new
PathGradientBrush
(
path
);
ColorBlend
blend
=
base
.
GetColourBlend
(
renderingElement
,
opacity
);
ColorBlend
blend
=
base
.
GetColourBlend
(
renderingElement
,
opacity
,
true
);
brush
.
InterpolationColors
=
blend
;
brush
.
InterpolationColors
=
blend
;
brush
.
CenterPoint
=
new
PointF
(
this
.
FocalX
.
ToDeviceValue
(
renderingElement
),
this
.
FocalY
.
ToDeviceValue
(
renderingElement
,
true
));
brush
.
CenterPoint
=
new
PointF
(
boundingBox
.
Left
+
this
.
FocalX
.
ToDeviceValue
(
renderingElement
),
boundingBox
.
Top
+
this
.
FocalY
.
ToDeviceValue
(
renderingElement
,
true
));
return
brush
;
return
brush
;
}
return
null
;
}
}
...
@@ -89,13 +117,14 @@ namespace Svg
...
@@ -89,13 +117,14 @@ namespace Svg
public
override
SvgElement
DeepCopy
<
T
>()
public
override
SvgElement
DeepCopy
<
T
>()
{
{
var
newObj
=
base
.
DeepCopy
<
T
>()
as
SvgRadialGradientServer
;
var
newObj
=
base
.
DeepCopy
<
T
>()
as
SvgRadialGradientServer
;
newObj
.
CenterX
=
this
.
CenterX
;
newObj
.
CenterX
=
this
.
CenterX
;
newObj
.
CenterY
=
this
.
CenterY
;
newObj
.
CenterY
=
this
.
CenterY
;
newObj
.
Radius
=
this
.
Radius
;
newObj
.
Radius
=
this
.
Radius
;
newObj
.
FocalX
=
this
.
FocalX
;
newObj
.
FocalX
=
this
.
FocalX
;
newObj
.
FocalY
=
this
.
FocalY
;
newObj
.
FocalY
=
this
.
FocalY
;
return
newObj
;
return
newObj
;
}
}
}
}
}
}
\ No newline at end of file
Source/SvgElementFactory.cs
View file @
87e7be2d
...
@@ -134,6 +134,19 @@ namespace Svg
...
@@ -134,6 +134,19 @@ namespace Svg
SetPropertyValue
(
element
,
style
[
0
].
Trim
(),
style
[
1
].
Trim
(),
document
);
SetPropertyValue
(
element
,
style
[
0
].
Trim
(),
style
[
1
].
Trim
(),
document
);
}
}
//defaults for text can come from the document
if
(
element
.
ElementName
==
"text"
)
{
if
(!
styles
.
Contains
(
"font-size"
)
&&
document
.
CustomAttributes
.
ContainsKey
(
"font-size"
)
&&
document
.
CustomAttributes
[
"font-size"
]
!=
null
)
{
SetPropertyValue
(
element
,
"font-size"
,
document
.
CustomAttributes
[
"font-size"
],
document
);
}
if
(!
styles
.
Contains
(
"font-family"
)
&&
document
.
CustomAttributes
.
ContainsKey
(
"font-family"
)
&&
document
.
CustomAttributes
[
"font-family"
]
!=
null
)
{
SetPropertyValue
(
element
,
"font-family"
,
document
.
CustomAttributes
[
"font-family"
],
document
);
}
}
continue
;
continue
;
}
}
...
@@ -176,7 +189,14 @@ namespace Svg
...
@@ -176,7 +189,14 @@ namespace Svg
try
try
{
{
descriptor
.
SetValue
(
element
,
descriptor
.
Converter
.
ConvertFrom
(
document
,
CultureInfo
.
InvariantCulture
,
attributeValue
));
if
(
attributeName
==
"opacity"
&&
attributeValue
==
"undefined"
)
{
attributeValue
=
"1"
;
}
descriptor
.
SetValue
(
element
,
descriptor
.
Converter
.
ConvertFrom
(
document
,
CultureInfo
.
InvariantCulture
,
attributeValue
));
}
}
catch
catch
{
{
...
...
Source/Text/SvgText.cs
View file @
87e7be2d
...
@@ -19,6 +19,8 @@ namespace Svg
...
@@ -19,6 +19,8 @@ namespace Svg
{
{
private
SvgUnit
_x
;
private
SvgUnit
_x
;
private
SvgUnit
_y
;
private
SvgUnit
_y
;
private
SvgUnit
_dy
;
private
SvgUnit
_dx
;
private
SvgUnit
_letterSpacing
;
private
SvgUnit
_letterSpacing
;
private
SvgUnit
_wordSpacing
;
private
SvgUnit
_wordSpacing
;
private
SvgUnit
_fontSize
;
private
SvgUnit
_fontSize
;
...
@@ -47,6 +49,8 @@ namespace Svg
...
@@ -47,6 +49,8 @@ namespace Svg
{
{
this
.
_fontFamily
=
DefaultFontFamily
;
this
.
_fontFamily
=
DefaultFontFamily
;
this
.
_fontSize
=
new
SvgUnit
(
0.0f
);
this
.
_fontSize
=
new
SvgUnit
(
0.0f
);
this
.
_dy
=
new
SvgUnit
(
0.0f
);
this
.
_dx
=
new
SvgUnit
(
0.0f
);
}
}
/// <summary>
/// <summary>
...
@@ -97,6 +101,25 @@ namespace Svg
...
@@ -97,6 +101,25 @@ namespace Svg
}
}
}
}
/// <summary>
/// Gets or sets the dX.
/// </summary>
/// <value>The dX.</value>
[
SvgAttribute
(
"dx"
)]
public
virtual
SvgUnit
Dx
{
get
{
return
this
.
_dx
;
}
set
{
if
(
_dx
!=
value
)
{
this
.
_dx
=
value
;
this
.
IsPathDirty
=
true
;
OnAttributeChanged
(
new
AttributeEventArgs
{
Attribute
=
"dx"
,
Value
=
value
});
}
}
}
/// <summary>
/// <summary>
/// Gets or sets the Y.
/// Gets or sets the Y.
/// </summary>
/// </summary>
...
@@ -116,6 +139,25 @@ namespace Svg
...
@@ -116,6 +139,25 @@ namespace Svg
}
}
}
}
/// <summary>
/// Gets or sets the dY.
/// </summary>
/// <value>The dY.</value>
[
SvgAttribute
(
"dy"
)]
public
virtual
SvgUnit
Dy
{
get
{
return
this
.
_dy
;
}
set
{
if
(
_dy
!=
value
)
{
this
.
_dy
=
value
;
this
.
IsPathDirty
=
true
;
OnAttributeChanged
(
new
AttributeEventArgs
{
Attribute
=
"dy"
,
Value
=
value
});
}
}
}
/// <summary>
/// <summary>
/// Specifies spacing behavior between text characters.
/// Specifies spacing behavior between text characters.
/// </summary>
/// </summary>
...
@@ -270,7 +312,8 @@ namespace Svg
...
@@ -270,7 +312,8 @@ namespace Svg
get
get
{
{
// Make sure the path is always null if there is no text
// Make sure the path is always null if there is no text
if
(
string
.
IsNullOrWhiteSpace
(
this
.
Text
))
//if there is a TSpan inside of this text element then path should not be null (even if this text is empty!)
if
(
string
.
IsNullOrWhiteSpace
(
this
.
Text
)
&&
this
.
Children
.
Where
(
x
=>
x
is
SvgTextSpan
).
Select
(
x
=>
x
as
SvgTextSpan
).
Count
()
==
0
)
return
_path
=
null
;
return
_path
=
null
;
//NOT SURE WHAT THIS IS ABOUT - Path gets created again anyway - WTF?
//NOT SURE WHAT THIS IS ABOUT - Path gets created again anyway - WTF?
// When an empty string is passed to GraphicsPath, it rises an InvalidArgumentException...
// When an empty string is passed to GraphicsPath, it rises an InvalidArgumentException...
...
@@ -290,7 +333,7 @@ namespace Svg
...
@@ -290,7 +333,7 @@ namespace Svg
_path
.
StartFigure
();
_path
.
StartFigure
();
if
(!
string
.
IsNullOrEmpty
(
this
.
Text
))
if
(!
string
.
IsNullOrEmpty
(
this
.
Text
))
DrawString
(
_path
,
this
.
X
,
this
.
Y
,
SvgUnit
.
Empty
,
SvgUnit
.
Empt
y
,
font
,
fontSize
,
this
.
Text
);
DrawString
(
_path
,
this
.
X
,
this
.
Y
,
this
.
Dx
,
this
.
D
y
,
font
,
fontSize
,
this
.
Text
);
foreach
(
var
tspan
in
this
.
Children
.
Where
(
x
=>
x
is
SvgTextSpan
).
Select
(
x
=>
x
as
SvgTextSpan
))
foreach
(
var
tspan
in
this
.
Children
.
Where
(
x
=>
x
is
SvgTextSpan
).
Select
(
x
=>
x
as
SvgTextSpan
))
{
{
...
@@ -320,7 +363,7 @@ namespace Svg
...
@@ -320,7 +363,7 @@ namespace Svg
private
static
string
ValidateFontFamily
(
string
fontFamilyList
)
private
static
string
ValidateFontFamily
(
string
fontFamilyList
)
{
{
// Split font family list on "," and then trim start and end spaces and quotes.
// Split font family list on "," and then trim start and end spaces and quotes.
var
fontParts
=
fontFamilyList
.
Split
(
new
[]
{
','
}).
Select
(
fontName
=>
fontName
.
Trim
(
new
[]
{
'"'
,
' '
}));
var
fontParts
=
fontFamilyList
.
Split
(
new
[]
{
','
}).
Select
(
fontName
=>
fontName
.
Trim
(
new
[]
{
'"'
,
' '
,
'\''
}));
var
families
=
System
.
Drawing
.
FontFamily
.
Families
;
var
families
=
System
.
Drawing
.
FontFamily
.
Families
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment