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();

}
示例#2
0
文件: rsxutil.c 项目: Estwald/PSDK3v2
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;
}