Example #1
0
  void
  SVGGElement::glTraverseBranch(svgl::Context * svglContext, svgl::GLInfo* glinfo, Branch::iterator& cur, Branch::iterator& end)
  {
    glPushMatrix();
    SVGTransformable::glTraverse(svglContext, glinfo);

    float opacity=1;
    svg::SVGClipPathElement *clippath_element=0;
    SVGFilterElement* filter_element = 0;
    bool snap_done=false;
    svgl::MultiPassManager multiPassManager;

    const css::CSSStyle* style = getStyle().getValue().getStyle();
    if(style) {
      opacity = style->getOpacity();
      if (opacity!=1) {
	svgl::BoundingBoxManager bboxManager;
	bboxManager.glPreTraverse(glinfo);
	glPushMatrix();
	glTraverseBoundingBoxChildren(svglContext, glinfo);
	glPopMatrix();
	float xminf,yminf,xmaxf,ymaxf;
	snap_done = bboxManager.glPostTraverse(glinfo, &xminf, &yminf, &xmaxf, &ymaxf);
	if(snap_done) {
	  multiPassManager.push(glinfo, xminf, yminf, xmaxf, ymaxf);
	}
      }

      clippath_element = getSVGClipPathElement(svglContext->externalEntityManager, getOwnerDocument());
      if(clippath_element)
	clippath_element->glPreTraverse(svglContext, glinfo);

#if 1
      filter_element = getSVGFilterElement(svglContext->externalEntityManager, getOwnerDocument());
      if(filter_element)
	filter_element->glPreTraverse(svglContext, glinfo, dynamic_cast<SVGElement*>(this));
#endif

    }

    ++cur;
    if(cur!=end) {
      SVGElement * elem = *cur;
      elem->glTraverseBranch(svglContext, glinfo, cur, end);
    }

    if( snap_done ) {
      float alpha_save  = glinfo->alpha;
      glinfo->alpha = opacity;
      multiPassManager.pop(glinfo);
      glinfo->alpha = alpha_save;
    }

    if(filter_element) {
      filter_element->glPostTraverse(svglContext, glinfo, dynamic_cast<SVGElement*>(this));
    }

    if(clippath_element) {
      clippath_element->glPostTraverse(svglContext, glinfo);
    }
  
    glPopMatrix();

  }