/** Invoked when the animated value of an animatable attribute has changed. */
 public void handleAnimatedAttributeChanged(AnimatedLiveAttributeValue alav) {
   if (alav.getNamespaceURI() == null) {
     String ln = alav.getLocalName();
     if (ln.equals(SVG_CX_ATTRIBUTE)
         || ln.equals(SVG_CY_ATTRIBUTE)
         || ln.equals(SVG_R_ATTRIBUTE)) {
       buildShape(ctx, e, (ShapeNode) node);
       handleGeometryChanged();
       return;
     }
   }
   super.handleAnimatedAttributeChanged(alav);
 }
 protected void handleCSSPropertyChanged(int property) {
   switch (property) {
     case SVGCSSEngine.MARKER_START_INDEX:
     case SVGCSSEngine.MARKER_MID_INDEX:
     case SVGCSSEngine.MARKER_END_INDEX:
       if (!hasNewShapePainter) {
         hasNewShapePainter = true;
         ShapeNode shapeNode = (ShapeNode) node;
         shapeNode.setShapePainter(createShapePainter(ctx, e, shapeNode));
       }
       break;
     default:
       super.handleCSSPropertyChanged(property);
   }
 }