void SoftwareRendererImp::draw_rect( Rect& rect ) { Color c; // draw as two triangles float x = rect.position.x; float y = rect.position.y; float w = rect.dimension.x; float h = rect.dimension.y; Vector2D p0 = transform(Vector2D( x , y )); Vector2D p1 = transform(Vector2D( x + w , y )); Vector2D p2 = transform(Vector2D( x , y + h )); Vector2D p3 = transform(Vector2D( x + w , y + h )); // draw fill c = rect.style.fillColor; if (c.a != 0 ) { rasterize_triangle( p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, c ); rasterize_triangle( p2.x, p2.y, p1.x, p1.y, p3.x, p3.y, c ); } // draw outline c = rect.style.strokeColor; if( c.a != 0 ) { rasterize_line( p0.x, p0.y, p1.x, p1.y, c ); rasterize_line( p1.x, p1.y, p3.x, p3.y, c ); rasterize_line( p3.x, p3.y, p2.x, p2.y, c ); rasterize_line( p2.x, p2.y, p0.x, p0.y, c ); } }
void SoftwareRendererImp::draw_svg(SVG& svg) { // set top level transformation transformation = canvas_to_screen; // draw all elements for (size_t i = 0; i < svg.elements.size(); ++i) { draw_element(svg.elements[i]); } // draw canvas outline Vector2D a = transform(Vector2D(0, 0)); a.x--; a.y++; Vector2D b = transform(Vector2D(svg.width, 0)); b.x++; b.y++; Vector2D c = transform(Vector2D(0, svg.height)); c.x--; c.y--; Vector2D d = transform(Vector2D(svg.width, svg.height)); d.x++; d.y--; rasterize_line(a.x, a.y, b.x, b.y, Color::Black); rasterize_line(a.x, a.y, c.x, c.y, Color::Black); rasterize_line(d.x, d.y, b.x, b.y, Color::Black); rasterize_line(d.x, d.y, c.x, c.y, Color::Black); // resolve and send to render target resolve(); }
void SoftwareRendererImp::draw_svg( SVG& svg ) { // set top level transformation transformation = canvas_to_screen; //allocate array for new target size_t super_w, super_h, super_size; super_w = this->target_w * sample_rate; super_h = this->target_h * sample_rate; unsigned char* old_buf = this->render_target; unsigned char* super_buf = new unsigned char [super_w * super_h * 4]; set_render_target( super_buf, super_w, super_h ); clear_target(); /* printf("before rendering:\n"); for (size_t i = 0; i < super_w * super_h; i++ ) { if (super_buf[i] != 255) { printf("super_buf[%zu] = %u\n", i, super_buf[i]); } } */ // draw all elements for ( size_t i = 0; i < svg.elements.size(); ++i ) { transformation = canvas_to_screen; draw_element(svg.elements[i]); } // draw canvas outline Vector2D a = transform(Vector2D( 0 , 0 )); a.x--; a.y++; Vector2D b = transform(Vector2D(svg.width, 0 )); b.x++; b.y++; Vector2D c = transform(Vector2D( 0 ,svg.height)); c.x--; c.y--; Vector2D d = transform(Vector2D(svg.width,svg.height)); d.x++; d.y--; rasterize_line(a.x, a.y, b.x, b.y, Color::Black); rasterize_line(a.x, a.y, c.x, c.y, Color::Black); rasterize_line(d.x, d.y, b.x, b.y, Color::Black); rasterize_line(d.x, d.y, c.x, c.y, Color::Black); this->sample_buffer = super_buf; /* printf("after rendering:\n"); for (size_t i = 0; i < super_w * super_h; i++ ) { if (super_buf[i] != 255) { printf("super_buf[%zu] = %u\n", i, super_buf[i]); } } */ set_render_target( old_buf, super_w / sample_rate, super_h / sample_rate); clear_target(); // resolve and send to render target resolve(); }
void SoftwareRendererImp::draw_line( Line& line ) { Vector2D p0 = transform(line.from); Vector2D p1 = transform(line.to); rasterize_line( p0.x, p0.y, p1.x, p1.y, line.style.strokeColor ); }
void SoftwareRendererImp::draw_polygon(Polygon& polygon) { Color c; // draw fill c = polygon.style.fillColor; if (c.a != 0) { // triangulate vector < Vector2D > triangles; triangulate(polygon, triangles); // draw as triangles for (size_t i = 0; i < triangles.size(); i += 3) { Vector2D p0 = transform(triangles[i + 0]); Vector2D p1 = transform(triangles[i + 1]); Vector2D p2 = transform(triangles[i + 2]); rasterize_triangle(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, c); } } // draw outline c = polygon.style.strokeColor; if (c.a != 0) { int nPoints = polygon.points.size(); for (int i = 0; i < nPoints; i++) { Vector2D p0 = transform(polygon.points[(i + 0) % nPoints]); Vector2D p1 = transform(polygon.points[(i + 1) % nPoints]); rasterize_line(p0.x, p0.y, p1.x, p1.y, c); } } }
void SoftwareRendererImp::draw_polyline( Polyline& polyline ) { Color c = polyline.style.strokeColor; if( c.a != 0 ) { int nPoints = polyline.points.size(); for( int i = 0; i < nPoints - 1; i++ ) { Vector2D p0 = transform(polyline.points[(i+0) % nPoints]); Vector2D p1 = transform(polyline.points[(i+1) % nPoints]); rasterize_line( p0.x, p0.y, p1.x, p1.y, c ); } } }
void SoftwareRendererImp::draw_polygon( Polygon& polygon ) { Color c; std::cout << polygon.transform << std::endl; // draw fill c = polygon.style.fillColor; if( c.a != 0 ) { // triangulate vector<Vector2D> triangles; triangulate( polygon, triangles ); // draw as triangles for (size_t i = 0; i < triangles.size(); i += 3) { Vector2D p0 = transform(triangles[i + 0]); Vector2D p1 = transform(triangles[i + 1]); Vector2D p2 = transform(triangles[i + 2]); //for debug /* if (p0.x <= 400 && p0.y <= 200) { printf("upper left polygon: (%f, %f, %f, %f, %f, %f)\n", p0.x, p0.y, p1.x, p1.y, p2.x, p2.y); } */ rasterize_triangle( p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, c ); } } // draw outline c = polygon.style.strokeColor; if( c.a != 0 ) { int nPoints = polygon.points.size(); for( int i = 0; i < nPoints; i++ ) { Vector2D p0 = transform(polygon.points[(i+0) % nPoints]); Vector2D p1 = transform(polygon.points[(i+1) % nPoints]); rasterize_line( p0.x, p0.y, p1.x, p1.y, c ); } } }
void painter::rasterize_polygon_border(FIBITMAP* bitmap, polygon& p) { for (unsigned int i = 0; i < p.outer().size() - 1; ++i) rasterize_line(bitmap, p.outer()[i], p.outer()[i + 1]); rasterize_line(bitmap, p.outer()[0], p.outer()[p.outer().size() - 1]); }