19 #ifndef _RD_DRAWING_TO_CAIRO_H_ 20 #define _RD_DRAWING_TO_CAIRO_H_ 28 void setColorCairo(
int atNum,cairo_t *cr){
32 cairo_set_source_rgb (cr, 0.0, 0.0, 1.0);
35 cairo_set_source_rgb (cr, 1.0, 0.0, 0.0);
38 cairo_set_source_rgb (cr, 0.2, 0.8, 0.8);
41 cairo_set_source_rgb (cr, 1.0, 0.5, 0.0);
44 cairo_set_source_rgb (cr, 0.8, 0.8, 0.0);
47 cairo_set_source_rgb (cr, 0.0, 0.8, 0.0);
50 cairo_set_source_rgb (cr, 0.5, 0.3, 0.1);
53 cairo_set_source_rgb (cr, 0.5, 0.5, 0.5);
56 cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
59 void drawLineCairo(std::vector<int>::const_iterator &pos,
63 cairo_set_line_width(cr,width*10);
68 cairo_set_dash(cr,0,0,0);
71 dashes[0]=5.0;dashes[1]=20.0;
72 cairo_set_dash(cr,dashes,
sizeof(dashes)/
sizeof(dashes[0]),0);
75 dashes[0]=20.0;dashes[1]=20.0;
76 cairo_set_dash(cr,dashes,
sizeof(dashes)/
sizeof(dashes[0]),0);
85 setColorCairo(an1,cr);
86 cairo_move_to(cr,xp1,yp1);
87 cairo_line_to(cr,xp2,yp2);
90 int mx = xp1+(xp2-xp1)/2;
91 int my = yp1+(yp2-yp1)/2;
93 setColorCairo(an1,cr);
94 cairo_move_to(cr,xp1,yp1);
95 cairo_line_to(cr,mx,my);
97 setColorCairo(an2,cr);
98 cairo_move_to(cr,mx,my);
99 cairo_line_to(cr,xp2,yp2);
103 void drawAtomCairo(std::vector<int>::const_iterator &pos,
108 double xp=
static_cast<double>(*pos++);
109 double yp=
static_cast<double>(*pos++);
111 std::string label=
"";
112 for(
unsigned int i=0;i<slen;++i){
117 cairo_text_extents_t extents;
118 cairo_text_extents(cr,label.c_str(),&extents);
119 double twidth=extents.width,theight=extents.height;
141 cairo_set_source_rgb (cr, 1.0, 1., 1.);
144 twidth+20,theight+20);
148 cairo_move_to(cr,xp,yp);
149 setColorCairo(atNum,cr);
150 cairo_show_text(cr,label.c_str());
158 int width,
int height,
159 int fontSize=12,
int maxDotsPerAngstrom=60){
163 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
164 cairo_rectangle(cr,0,0,width,height);
167 cairo_select_font_face (cr,
"sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
169 std::vector<int>::const_iterator pos=drawing.begin();
172 std::cerr<<
"no RESOLUTION token found"<<std::endl;
179 std::cerr<<
"no bounds token found"<<std::endl;
190 xSize=
static_cast<double>(dwidth)/resolution;
191 ySize=
static_cast<double>(dheight)/resolution;
194 if(dwidth>width || dheight>height){
195 if(static_cast<double>(dwidth)/width >
static_cast<double>(dheight)/height){
196 scale =
static_cast<double>(width)/dwidth;
198 scale =
static_cast<double>(height)/dheight;
201 if(width/xSize > height/ySize){
202 if( width/xSize > maxDotsPerAngstrom ){
203 scale = maxDotsPerAngstrom*xSize/width;
206 if( height/ySize > maxDotsPerAngstrom ){
207 scale = maxDotsPerAngstrom*ySize/height;
214 .5*(width-dwidth*scale),
215 .5*(height-dheight*scale));
216 cairo_scale(cr,scale,scale);
219 double dFontSize=1.5*maxDotsPerAngstrom*fontSize/14;
220 cairo_set_font_size (cr, dFontSize);
222 while(pos!=drawing.end()){
226 drawLineCairo(pos,cr);
229 drawAtomCairo(pos,cr);
232 std::cerr<<
"unrecognized token: "<<token<<std::endl;
void DrawingToCairo(const std::vector< int > &drawing, cairo_t *cr, int width, int height, int fontSize=12, int maxDotsPerAngstrom=60)
Includes a bunch of functionality for handling Atom and Bond queries.
#define PRECONDITION(expr, mess)