//---------------------------------------------------------- void ofGLRenderer::draw(const ofPath & shape) const{ ofColor prevColor; if(shape.getUseShapeColor()){ prevColor = ofGetStyle().color; } ofGLRenderer * mut_this = const_cast<ofGLRenderer*>(this); if(shape.isFilled()){ const ofMesh & mesh = shape.getTessellation(); if(shape.getUseShapeColor()){ mut_this->setColor( shape.getFillColor(),shape.getFillColor().a); } draw(mesh,OF_MESH_FILL); } if(shape.hasOutline()){ float lineWidth = ofGetStyle().lineWidth; if(shape.getUseShapeColor()){ mut_this->setColor( shape.getStrokeColor(), shape.getStrokeColor().a); } mut_this->setLineWidth( shape.getStrokeWidth() ); const vector<ofPolyline> & outlines = shape.getOutline(); for(int i=0; i<(int)outlines.size(); i++) draw(outlines[i]); mut_this->setLineWidth(lineWidth); } if(shape.getUseShapeColor()){ mut_this->setColor(prevColor); } }
//---------------------------------------------------------- void ofGLRenderer::draw(ofPath & shape){ ofColor prevColor; if(shape.getUseShapeColor()){ prevColor = ofGetStyle().color; } if(shape.isFilled()){ ofMesh & mesh = shape.getTessellation(); if(shape.getUseShapeColor()){ setColor( shape.getFillColor() * ofGetStyle().color,shape.getFillColor().a/255. * ofGetStyle().color.a); } draw(mesh); } if(shape.hasOutline()){ float lineWidth = ofGetStyle().lineWidth; if(shape.getUseShapeColor()){ setColor( shape.getStrokeColor() * ofGetStyle().color, shape.getStrokeColor().a/255. * ofGetStyle().color.a); } setLineWidth( shape.getStrokeWidth() ); vector<ofPolyline> & outlines = shape.getOutline(); for(int i=0; i<(int)outlines.size(); i++) draw(outlines[i]); setLineWidth(lineWidth); } if(shape.getUseShapeColor()){ setColor(prevColor); } }
//----------------------------------------------------------------------------------- void ofxCairoTexture::draw(ofPath & shape){ cairo_new_path(cr); vector<ofSubPath> & paths = shape.getSubPaths(); for(int i=0;i<(int)paths.size();i++){ draw(paths[i]); } cairo_fill_rule_t cairo_poly_mode; if(shape.getWindingMode()==OF_POLY_WINDING_ODD) cairo_poly_mode=CAIRO_FILL_RULE_EVEN_ODD; else cairo_poly_mode=CAIRO_FILL_RULE_WINDING; cairo_set_fill_rule(cr,cairo_poly_mode); ofColor prevColor; if(shape.getUseShapeColor()){ //printf("using color!\n"); prevColor = ofGetStyle().color; } if(shape.isFilled()){ if(shape.getUseShapeColor()){ ofColor c = shape.getFillColor() * ofGetStyle().color; c.a = shape.getFillColor().a/255. * ofGetStyle().color.a; //printf("color %i %i %i %i!\n", shape.getFillColor().r, shape.getFillColor().g, shape.getFillColor().b, shape.getFillColor().a); //printf("style %f %f %f %f!\n", (float)ofGetStyle().color.r/255.0, (float)ofGetStyle().color.g/255.0, (float)ofGetStyle().color.b/255.0, (float)ofGetStyle().color.a/255.0); //printf("alpha %f %f!\n", (float)c.a, ofGetStyle().color.a); cairo_set_source_rgba(cr, (float)c.r/255.0, (float)c.g/255.0, (float)c.b/255.0, (float)c.a/255.0); } if(shape.hasOutline()){ cairo_fill_preserve( cr ); }else{ cairo_fill(cr); } } if(shape.hasOutline()){ float lineWidth = ofGetStyle().lineWidth; if(shape.getUseShapeColor()){ ofColor c = shape.getFillColor() * ofGetStyle().color; c.a = shape.getFillColor().a/255. * ofGetStyle().color.a; cairo_set_source_rgba(cr, (float)c.r/255.0, (float)c.g/255.0, (float)c.b/255.0, (float)c.a/255.0); } cairo_set_line_width( cr, shape.getStrokeWidth() ); cairo_stroke( cr ); cairo_set_line_width( cr, lineWidth ); } if(shape.getUseShapeColor()){ setColor(prevColor); } ofPopStyle(); }
void ofCairoRenderer::draw(ofPath & shape){ cairo_new_path(cr); vector<ofPath::Command> & commands = shape.getCommands(); for(int i=0;i<(int)commands.size();i++){ draw(commands[i]); } cairo_fill_rule_t cairo_poly_mode; if(shape.getWindingMode()==OF_POLY_WINDING_ODD) cairo_poly_mode=CAIRO_FILL_RULE_EVEN_ODD; else cairo_poly_mode=CAIRO_FILL_RULE_WINDING; cairo_set_fill_rule(cr,cairo_poly_mode); ofColor prevColor; if(shape.getUseShapeColor()){ prevColor = ofGetStyle().color; } if(shape.isFilled()){ if(shape.getUseShapeColor()){ ofColor c = shape.getFillColor(); c.a = shape.getFillColor().a; cairo_set_source_rgba(cr, (float)c.r/255.0, (float)c.g/255.0, (float)c.b/255.0, (float)c.a/255.0); } if(shape.hasOutline()){ cairo_fill_preserve( cr ); }else{ cairo_fill(cr); } } if(shape.hasOutline()){ float lineWidth = ofGetStyle().lineWidth; if(shape.getUseShapeColor()){ ofColor c = shape.getStrokeColor(); c.a = shape.getStrokeColor().a; cairo_set_source_rgba(cr, (float)c.r/255.0, (float)c.g/255.0, (float)c.b/255.0, (float)c.a/255.0); } cairo_set_line_width( cr, shape.getStrokeWidth() ); cairo_stroke( cr ); cairo_set_line_width( cr, lineWidth ); } if(shape.getUseShapeColor()){ setColor(prevColor); } }
void ofxSVG::setupShape(struct svgtiny_shape * shape, ofPath & path){ float * p = shape->path; path.setFilled(false); if(shape->fill != svgtiny_TRANSPARENT){ path.setFilled(true); path.setFillHexColor(shape->fill); ofColor color = path.getFillColor(); color.a = shape->opacity*255; path.setColor(color); path.setPolyWindingMode(OF_POLY_WINDING_ODD); } if(shape->stroke != svgtiny_TRANSPARENT){ path.setStrokeWidth(shape->stroke_width); path.setStrokeHexColor(shape->stroke); } for(int i = 0; i < (int)shape->path_length;){ if(p[i] == svgtiny_PATH_MOVE){ path.moveTo(p[i + 1], p[i + 2]); i += 3; } else if(p[i] == svgtiny_PATH_CLOSE){ path.close(); i += 1; } else if(p[i] == svgtiny_PATH_LINE){ path.lineTo(p[i + 1], p[i + 2]); i += 3; } else if(p[i] == svgtiny_PATH_BEZIER){ path.bezierTo(p[i + 1], p[i + 2], p[i + 3], p[i + 4], p[i + 5], p[i + 6]); i += 7; } else{ ofLogError("ofxSVG") << "setupShape(): SVG parse error"; i += 1; } } ofRectangle pathBoundingBox = getBoundingBoxOfPath(path); if(pathBoundingBox.getArea() != 0.0){ if(boundingBox.getArea() == 0.0){ boundingBox = pathBoundingBox; } else{ boundingBox.growToInclude(pathBoundingBox); } } }
void ShapeContentFill::pop(ofPath& path) { ofPushStyle(); path.setFilled(true); ofColor prev = path.getFillColor(); float opacity = prev.a/255.f*opacity_; path.setFillColor(ofColor(color_, opacity*255)); ofEnableBlendMode(blend_mode_); path.draw(); path.setFillColor(prev); ofPopStyle(); }
void ShapeContentGroup::pop(ofPath& path) { if(transform_.isDirty()) { transform_.refreshMatrix(); } transform_.pushMatrix(); ofColor prev_st = path.getStrokeColor(); ofColor prev_fi = path.getFillColor(); float opacity_st = prev_st.a/255.f*opacity_; float opacity_fi = prev_fi.a/255.f*opacity_; path.setStrokeColor(ofColor(prev_st, opacity_st*255)); path.setFillColor(ofColor(prev_fi, opacity_fi*255)); for(vector<ShapeContent*>::reverse_iterator it = content_.rbegin(); it != content_.rend(); ++it) { (*it)->pop(path); } path.setStrokeColor(prev_st); path.setFillColor(prev_fi); transform_.popMatrix(); }