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 flip() { if(!first_fb) waitflip(); else gcmResetFlipStatus(); gcmSetFlip(context,curr_fb); rsxFlushBuffer(context); gcmSetWaitFlip(context); curr_fb ^= 1; set_render_target(curr_fb); first_fb = 0; }