void wxSVGCanvas::GetRadialGradientTransform(wxSVGPoint& focus, wxSVGMatrix& matrix, const wxSVGRadialGradientElement& gradElem, wxSVGCanvasPath& path, bool scale) { double r, cx, cy, fx, fy; r = gradElem.GetR().GetAnimVal(); cx = gradElem.GetCx().GetAnimVal(); cy = gradElem.GetCy().GetAnimVal(); fx = gradElem.GetFx().GetAnimVal(); fy = gradElem.GetFy().GetAnimVal(); if (gradElem.GetGradientUnits().GetAnimVal() == wxSVG_UNIT_TYPE_UNKNOWN || gradElem.GetGradientUnits().GetAnimVal() == wxSVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { wxSVGRect bbox = path.GetBBox(); r = r*sqrt(bbox.GetWidth()*bbox.GetWidth() + bbox.GetHeight()*bbox.GetHeight()); cx = bbox.GetX() + cx*bbox.GetWidth(); cy = bbox.GetY() + cy*bbox.GetHeight(); fx = bbox.GetX() + fx*bbox.GetWidth(); fy = bbox.GetY() + fy*bbox.GetHeight(); } // Compute gradient transformation matrix const wxSVGTransformList& transforms = gradElem.GetGradientTransform().GetAnimVal(); for (int i=0; i<(int)transforms.Count(); i++) matrix = matrix.Multiply(transforms[i].GetMatrix()); // Apply Gradient parameters to transformation matrix = matrix.Translate(cx, cy); //.Scale(r); if (scale) matrix = matrix.Scale(r); // Change Focus reference to gradient reference focus.SetX((fx - cx) / r); focus.SetY((fy - cy) / r); }
void wxSVGCanvas::GetLinearGradientVector(wxSVGPoint& p1, wxSVGPoint& p2, const wxSVGLinearGradientElement& gradElem, wxSVGCanvasPath& path) { p1.SetX(gradElem.GetX1().GetAnimVal()); p1.SetY(gradElem.GetY1().GetAnimVal()); p2.SetX(gradElem.GetX2().GetAnimVal()); p2.SetY(gradElem.GetY2().GetAnimVal()); if (gradElem.GetGradientUnits().GetAnimVal() == wxSVG_UNIT_TYPE_UNKNOWN || gradElem.GetGradientUnits().GetAnimVal() == wxSVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { wxSVGRect bbox = path.GetBBox(); p1.SetX(bbox.GetX() + p1.GetX()*bbox.GetWidth()); p1.SetY(bbox.GetY() + p1.GetY()*bbox.GetHeight()); p2.SetX(bbox.GetX() + p2.GetX()*bbox.GetWidth()); p2.SetY(bbox.GetY() + p2.GetY()*bbox.GetHeight()); } // Compute gradient transformation matrix wxSVGMatrix lg_matrix; const wxSVGTransformList& transforms = gradElem.GetGradientTransform().GetAnimVal(); for (int i=0; i<(int)transforms.Count(); i++) lg_matrix = lg_matrix.Multiply(transforms[i].GetMatrix()); p1 = p1.MatrixTransform(lg_matrix); p2 = p2.MatrixTransform(lg_matrix); }