コード例 #1
0
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 );
  }

}
コード例 #2
0
    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();

    }
コード例 #3
0
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();

}
コード例 #4
0
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 );

}
コード例 #5
0
    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);
            }
        }
    }
コード例 #6
0
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 );
    }
  }
}
コード例 #7
0
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 );
    }
  }
}
コード例 #8
0
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]);
}