Advertisement
genete

New Cairo operator: STRAIGHT

Oct 2nd, 2012
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <cairo.h>
  2.  
  3. int main (int argc, char *argv[])
  4. {
  5.    
  6.     float alpha=0.65;
  7.     float alpha_circle=0.8;
  8.    
  9.     cairo_surface_t *surface;
  10.     cairo_t* cr;
  11.     surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 480, 270);
  12.     cr=cairo_create(surface);
  13.    
  14.     // Draw Circle
  15.     cairo_save(cr);
  16.     cairo_set_source_rgba(cr, 1.0, 0.5, 0.5, 1.0);
  17.     cairo_move_to(cr, 140.0+70.0, 117.0);
  18.     cairo_arc(cr, 140.0, 117.0, 70.0, 0.0, 2*3.14159);
  19.     cairo_clip(cr);
  20.     cairo_paint_with_alpha(cr, alpha_circle);
  21.     cairo_restore(cr);
  22.    
  23.     //Prepare rectangle
  24.     cairo_save(cr);
  25.     cairo_set_source_rgba(cr, 0.26, 1.0, 1.0, 1.0);
  26.     cairo_rectangle(cr, 164.0, 114.0, 186.0, 103.0);
  27.     cairo_clip(cr);
  28.    
  29.     // this section of code performs the following operator:
  30.     // aR = aA*alpha + (1-alpha)*aB
  31.     // xR = (xaA*alpha + (1-alpha)*xaB)/xR
  32.     // When alpha =0.0 aR = aB and xR = xB
  33.     // When alpha =1.0 aR = aA and xR = xA
  34.     {
  35.         cairo_save(cr);
  36.        
  37.         cairo_surface_t* dest=cairo_get_target(cr);
  38.         cairo_surface_flush(dest);
  39.         cairo_surface_t* destimage=cairo_surface_map_to_image(dest, NULL);
  40.         int w=cairo_image_surface_get_width(destimage);
  41.         int h=cairo_image_surface_get_height(destimage);
  42.         cairo_surface_t* newdest=cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h);
  43.        
  44.         cairo_t* destcr=cairo_create(newdest);
  45.         cairo_set_source_surface(destcr, destimage, 0, 0);
  46.         cairo_paint_with_alpha(destcr, 1.0-alpha);
  47.         cairo_destroy(destcr);
  48.        
  49.         destcr=cairo_create(destimage);
  50.         cairo_set_source_surface(destcr, newdest, 0, 0);
  51.         cairo_set_operator(destcr, CAIRO_OPERATOR_SOURCE);
  52.         cairo_paint(destcr);
  53.         cairo_destroy(destcr);
  54.        
  55.         cairo_surface_unmap_image(dest, destimage);
  56.         cairo_surface_mark_dirty(dest);
  57.        
  58.         cairo_surface_destroy(newdest);
  59.         cairo_restore(cr);
  60.     }
  61.     //
  62.    
  63.     // Effectively draw the retangle
  64.     cairo_set_operator(cr, CAIRO_OPERATOR_ADD);
  65.     cairo_paint_with_alpha(cr, alpha);
  66.    
  67.     cairo_restore(cr);
  68.     cairo_destroy(cr);
  69.    
  70.     cairo_surface_write_to_png(surface, "straight-cairo-full.png");
  71.     cairo_surface_destroy(surface);
  72.    
  73.     return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement