unsigned int wxSVGCanvas::GetGradientStops(const wxSVGSVGElement& svgElem, wxSVGGradientElement* gradElem, float opacity) { if (gradElem == NULL) return 0; // Search for the most referenced gradient (we assume that this is the one that contain stops) while (true) { wxString grad_href = gradElem->GetHref(); if (grad_href.length() <= 1 || grad_href.GetChar(0) != wxT('#')) break; wxSVGElement* tmp = (wxSVGSVGElement*) svgElem.GetElementById(grad_href.substr(1)); if (tmp == NULL || (tmp->GetDtd() != wxSVG_LINEARGRADIENT_ELEMENT && tmp->GetDtd() != wxSVG_RADIALGRADIENT_ELEMENT)) break; gradElem = (wxSVGGradientElement*) tmp; } // Count number of stop element wxSVGStopElement* stop_elem = (wxSVGStopElement*) gradElem->GetChildren(); unsigned int stop_count = 0; while (stop_elem) { if (stop_elem->GetDtd() == wxSVG_STOP_ELEMENT) stop_count++; stop_elem = (wxSVGStopElement*) stop_elem->GetNext(); } if (stop_count == 0) return 0; // Allocate enough stops AllocateGradientStops(stop_count); // Fill the stops stop_elem = (wxSVGStopElement*) gradElem->GetChildren(); int i = 0; while (stop_elem) { if (stop_elem->GetDtd() == wxSVG_STOP_ELEMENT) SetStopValue(i++, stop_elem->GetOffset(), stop_elem->GetStopOpacity() * opacity, stop_elem->GetStopColor().GetRGBColor()); stop_elem = (wxSVGStopElement*) stop_elem->GetNext(); } return stop_count; }
unsigned int wxSVGCanvas::GetGradientStops(const wxSVGSVGElement& svgElem, wxSVGGradientElement* gradElem, float opacity) { if (gradElem == NULL) return 0; // Search for the most referenced gradient (we assume that this is the one that contain stops) while (true) { wxString grad_href = gradElem->GetHref(); if (grad_href.length() <= 1 || grad_href.GetChar(0) != wxT('#')) break; wxSVGElement* tmp = (wxSVGSVGElement*) svgElem.GetElementById(grad_href.substr(1)); if (tmp == NULL || (tmp->GetDtd() != wxSVG_LINEARGRADIENT_ELEMENT && tmp->GetDtd() != wxSVG_RADIALGRADIENT_ELEMENT)) break; gradElem = (wxSVGGradientElement*) tmp; } // Count number of stop element wxSVGStopElement* stop_elem = (wxSVGStopElement*) gradElem->GetChildren(); unsigned int stop_count = 0; while (stop_elem) { if (stop_elem->GetDtd() == wxSVG_STOP_ELEMENT) stop_count++; stop_elem = (wxSVGStopElement*) stop_elem->GetNext(); } if (stop_count == 0) return 0; // Allocate enough stops AllocateGradientStops(stop_count); // Fill the stops stop_elem = (wxSVGStopElement*) gradElem->GetChildren(); int i = 0; while (stop_elem) { if (stop_elem->GetDtd() == wxSVG_STOP_ELEMENT) { wxSVGColor color = stop_elem->GetStopColor(); // no color, default is black if (color.GetColorType() == wxSVG_COLORTYPE_UNKNOWN) color = wxSVGColor(0,0,0); SetStopValue(i++, stop_elem->GetOffset(), stop_elem->GetStopOpacity() * opacity, color.GetRGBColor()); stop_elem = (wxSVGStopElement*) stop_elem->GetNext(); } return stop_count; } 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); }