2 * Copyright 2006, Haiku. All rights reserved.
3 * Distributed under the terms of the MIT License.
6 * Stephan Aßmus <superstippi@gmx.de>
13 #include "GradientTransformable.h"
15 #include "SVGGradients.h"
21 SVGGradient::SVGGradient()
25 fGradientUnits(UNSPECIFIED
)
30 SVGGradient::~SVGGradient()
36 SVGGradient::SetID(const char* id
)
43 SVGGradient::ID() const
50 SVGGradient::AddStop(float offset
, rgba8 color
)
53 fGradient
= MakeGradient();
55 rgb_color c
= { color
.r
, color
.g
, color
.b
, color
.a
};
56 fGradient
->AddColor(c
, offset
);
61 SVGGradient::SetTransformation(const trans_affine
& transform
)
63 //printf("SVGGradient::SetTransformation()\n");
65 fGradient
= MakeGradient();
67 fGradient
->multiply(transform
);
72 SVGGradient::GetGradient(BRect objectBounds
)
75 Gradient
* gradient
= new Gradient(*fGradient
);
77 IdentifyGradientUnits();
78 if (fGradientUnits
== OBJECT_BOUNDING_BOX
) {
79 gradient
->FitToBounds(objectBounds
);
87 // IdentifyGradientUnits
89 SVGGradient::IdentifyGradientUnits()
91 if (fGradientUnits
== UNSPECIFIED
) {
93 if (FindString("gradientUnits", &units
) >= B_OK
) {
94 if (strcmp(units
, "objectBoundingBox") == 0)
95 fGradientUnits
= OBJECT_BOUNDING_BOX
;
101 SVGLinearGradient::SVGLinearGradient()
107 SVGLinearGradient::~SVGLinearGradient()
113 SVGLinearGradient::MakeGradient() const
115 //printf("SVGLinearGradient::MakeGradient()\n");
118 Gradient
* gradient
= new Gradient(true);
119 gradient
->SetType(GRADIENT_LINEAR
);
120 gradient
->SetInterpolation(INTERPOLATION_LINEAR
);
121 // setup the gradient transform
122 BPoint
start(-64.0, -64.0);
123 BPoint
end(64.0, -64.0);
125 if (FindString("x1", &coordinate
) >= B_OK
)
126 start
.x
= atof(coordinate
.String());
127 if (FindString("y1", &coordinate
) >= B_OK
)
128 start
.y
= atof(coordinate
.String());
129 if (FindString("x2", &coordinate
) >= B_OK
)
130 end
.x
= atof(coordinate
.String());
131 if (FindString("y2", &coordinate
) >= B_OK
)
132 end
.y
= atof(coordinate
.String());
134 // the transformed parallelogram
140 parl
[4] = end
.x
- (end
.y
- start
.y
);
141 parl
[5] = end
.y
+ (end
.x
- start
.x
);
143 trans_affine
transform(-64.0, -64.0, 64.0, 64.0, parl
);
144 gradient
->multiply(transform
);
150 SVGRadialGradient::SVGRadialGradient()
156 SVGRadialGradient::~SVGRadialGradient()
162 SVGRadialGradient::MakeGradient() const
164 //printf("SVGRadialGradient::MakeGradient()\n");
165 // TODO: handle userSpaceOnUse/objectBoundingBox
166 Gradient
* gradient
= new Gradient(true);
167 gradient
->SetType(GRADIENT_CIRCULAR
);
168 gradient
->SetInterpolation(INTERPOLATION_LINEAR
);
175 if (FindString("cx", &value
) >= B_OK
)
176 cx
= atof(value
.String());
177 if (FindString("cy", &value
) >= B_OK
)
178 cy
= atof(value
.String());
179 if (FindString("r", &value
) >= B_OK
)
180 r
= atof(value
.String());
182 // the transformed parallelogram
191 trans_affine
transform(-64.0, -64.0, 64.0, 64.0, parl
);
192 gradient
->multiply(transform
);