void enigma_rotor_window::draw(Cairo::RefPtr<Cairo::Context> cr) { vector<double> dashes; // Pattern used to draw a dashed line (15 pixels of line followed by 15 "empty" pixels) dashes.push_back(15.0); dashes.push_back(15.0); if (has_ellipse) { cr->save(); // Draw background ellipse cr->set_source_rgb(bkg_r, bkg_g, bkg_b); draw_ellipse(cr, x, y, ellipse_width, ellipse_height); cr->fill(); // Draw black border of background ellipse cr->set_source_rgb(BLACK); cr->set_line_width(1.2); draw_ellipse(cr, x, y, ellipse_width, ellipse_height); cr->stroke(); cr->restore(); } cr->save(); // Draw a line of width rotor_rim_width in the dash background colour cr->set_line_width(rotor_rim_width); cr->set_source_rgb(dash_bkg_r, dash_bkg_g, dash_bkg_b); cr->move_to(x + window_size, y - (2 * window_size)); cr->line_to(x + window_size, y + (2 * window_size)); cr->stroke(); // Draw a dashed line in the dash colour inside the previously drawn line // This creates the impression of "notches" on the handle/rim cr->set_source_rgb(dash_r, dash_g, dash_b); cr->set_dash(dashes, ((wheel_pos - 'A') & 1) * 15); // modifying the offset creates illusion of movement cr->move_to(x + window_size, y - (2 * window_size)); cr->line_to(x + window_size, y + (2 * window_size)); cr->stroke(); // Draw border around handle/rim cr->set_line_width(2.0); cr->unset_dash(); cr->set_source_rgb(DARK_GREY); cr->rectangle(x + padded_size, y - (2 * window_size), rotor_rim_width, (4 * window_size)); cr->stroke(); cr->restore(); draw_wheel_pos(cr, wheel_pos); if (has_ellipse) { // Draw screws upper->draw(cr); lower->draw(cr); } }
void MapDrawArea::DrawObstacles(const Cairo::RefPtr<Cairo::Context>& cr) { // Get size characteristics of the window Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width(); const int height = allocation.get_height(); const int lesser = MIN(width, height); // We should be able to just store the obstacles and path once // Do need to update based on the window size std::vector<Coord> vObstacles = guiMapData.copyObstacles(); Coord maxXY = guiMapData.copyMaxCoord(); Coord originCoord = guiMapData.copyStartCoord(); Coord goalCoord = guiMapData.copyEndCoord(); // These have to be updated each iteration originCoord.x = int( float(width)*float(originCoord.x)/float(maxXY.x) ); originCoord.y = int( float(height)*float(originCoord.y)/float(maxXY.y) ); goalCoord.x = int( float(width)*float(goalCoord.x)/float(maxXY.x) ); goalCoord.y = int( float(height)*float(goalCoord.y)/float(maxXY.y) ); // Draw obstacles std::vector<Coord> scaledObstacleCoord; std::vector<Coord> rawObstacleCoord = guiMapData.copyObstacles(); Coord stdCoord; // Adjust obstacle values based on window size for(std::vector<Coord>::const_iterator itr=rawObstacleCoord.begin();itr!=rawObstacleCoord.end();++itr) { stdCoord.x = int( float(width)*float(itr->x)/float(maxXY.x) ); stdCoord.y = int( height*float(itr->y)/float(maxXY.y) ); scaledObstacleCoord.push_back(stdCoord); } cr->save(); cr->set_source_rgb(0.0, 0.0, 0.0); // black for obstacles cr->set_line_width(lesser * 0.005); cr->set_line_cap(Cairo::LINE_CAP_ROUND); // Plot obstacles for(std::vector<Coord>::iterator itr=scaledObstacleCoord.begin();itr != scaledObstacleCoord.end();++itr) { cr->move_to( itr->x,itr->y ); cr->line_to( itr->x,itr->y ); cr->stroke(); } // Plot start/end coord cr->save(); cr->set_line_width(lesser * 0.015); cr->set_source_rgb(1.0, 0.0, 0.0); // red for start point cr->move_to( originCoord.x,originCoord.y ); cr->line_to( originCoord.x,originCoord.y ); cr->stroke(); cr->save(); cr->set_source_rgb(0.0, 1.0, 0.0); // green for end point cr->move_to( goalCoord.x,goalCoord.y ); cr->line_to( goalCoord.x,goalCoord.y ); cr->stroke(); }
void cairo::draw_face_edge_sequences( const Cairo::RefPtr<Cairo::Context>& cr, const Geodesics::surface_type::edge_descriptor& edge, const Geodesics& m_geodesics ) { const auto e0out = Geodesics::edge_handle( edge, m_geodesics.get_surface() ); const auto e0w = m_geodesics.edge_windows( e0out ); const auto e0in = e0out.opposite(); const coord_t e0len = e0out.length(); // draw base draw_edge_sequences( cr, e0w.first, e0w.second, m_geodesics ); // draw lower left edge if( ! e0in.second ) return ; auto e1out = e0in.first.next().opposite(); if( e1out.second ) { auto e1w = m_geodesics.edge_windows( e1out.first ); const coord_t e1len = e1out.first.length(); cr->save(); cr->rotate( - e0in.first.next_inner_angle() ); cr->translate( e1len, 0. ); cr->rotate( M_PI ); //cr->scale( -1., -1. ); draw_edge_sequences( cr, e1w.first, e1w.second, m_geodesics ); cr->restore(); } // draw lower right edge const Geodesics::edge_handle e2in = e0in.first.previous(); const auto e2out = e2in.opposite(); if( ! e2out.second ) return; auto e2w = m_geodesics.edge_windows( e2out.first ); cr->save(); cr->translate( e0len, 0. ); cr->rotate( e2in.next_inner_angle() ); cr->scale( -1., -1. ); draw_edge_sequences( cr, e2w.first, e2w.second, m_geodesics ); cr->restore(); }
void Window::draw(Cairo::RefPtr<Cairo::Context> ctx) { ctx->save(); ctx->set_source_rgb(0.9, 0.9, 0.9); ctx->paint(); ctx->restore(); ctx->save(); ctx->set_line_width(1.0); ctx->rectangle(0, 0, width, height); ctx->stroke(); ctx->restore(); }
bool Canvas::on_expose_event(GdkEventExpose * evt) { Glib::RefPtr<Gdk::Window> window = get_window(); if (!window) return false; // no window yet? if (!seen_first_expose_event) { seen_first_expose_event = true; main->controlsWindow().starting_position(); } Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context(); if (!surface) return true; // Haven't rendered yet? Nothing we can do if (evt) { cr->rectangle(evt->area.x, evt->area.y, evt->area.width, evt->area.height); cr->clip(); } cr->set_source(surface, 0, 0); cr->paint(); if (main->dragrect.is_active() && main->dragrect.surface_valid()) { cr->save(); cr->set_source(main->dragrect.get_surface(), 0, 0); cr->paint(); cr->restore(); } if (main->hud_active()) { Cairo::RefPtr<Cairo::Surface>& sfc = main->get_hud_surface(); if (sfc) cr->set_source(sfc, 0, 0); // TODO HUD position cr->paint(); } return true; }
bool RegionChooser::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) { double clipx1, clipx2, clipy1, clipy2; cr->get_clip_extents(clipx1, clipy1, clipx2, clipy2); #endif cr->save(); cr->set_line_width(1); #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 const Gdk::Color bg = get_style()->get_bg(Gtk::STATE_NORMAL); #else const Gdk::RGBA bg = get_style_context()->get_background_color(); #endif Gdk::Cairo::set_source_rgba(cr, bg); cr->paint(); if (clipy2 > h1) { draw_keyboard(cr, clipx1, clipx2); } if (clipy1 < h1 && instrument) { draw_regions(cr, clipx1, clipx2); } cr->restore(); return true; }
void ActivityDrawingArea::drawAxis() { // draw a reference axis and pod info Glib::RefPtr < Gdk::Window > window = get_window(); Cairo::RefPtr < Cairo::Context > cr = window->create_cairo_context(); Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width(); const int height = allocation.get_height(); //draw axis cr->save(); cr->set_line_width(2.0); this->setSourceRGB(cr, currentColourScheme.getAxisColour()); cr->set_font_size(12); cr->move_to(0, height / 2); cr->line_to(width, height / 2); cr->move_to(190, 25 + height / 2); cr->show_text("20"); cr->move_to(390, 25 + height / 2); cr->show_text("40"); cr->move_to(590, 25 + height / 2); cr->show_text("60"); cr->move_to(790, 25 + height / 2); cr->show_text("80"); cr->stroke(); cr->restore(); }
void Renderer_Dragbox::render_vfunc( const Glib::RefPtr<Gdk::Window>& drawable, const Gdk::Rectangle& /*expose_area*/ ) { assert(get_work_area()); if(!get_work_area()) return; // const synfig::Vector focus_point(get_work_area()->get_focus_point()); // Warning : Unused focus_point int drawable_w = drawable->get_width(); int drawable_h = drawable->get_height(); Cairo::RefPtr<Cairo::Context> cr = drawable->create_cairo_context(); const synfig::Vector::value_type window_startx(get_work_area()->get_window_tl()[0]); const synfig::Vector::value_type window_starty(get_work_area()->get_window_tl()[1]); const float pw(get_pw()),ph(get_ph()); const synfig::Point& curr_point(get_curr_point()); const synfig::Point& drag_point(get_drag_point()); { cr->save(); cr->set_line_cap(Cairo::LINE_CAP_BUTT); cr->set_line_join(Cairo::LINE_JOIN_MITER); cr->set_antialias(Cairo::ANTIALIAS_NONE); cr->set_line_width(1.0); cr->set_source_rgb(0,0,0); std::valarray<double> dashes(2); dashes[0]=5.0; dashes[1]=5.0; cr->set_dash(dashes, 0); Point tl(std::min(drag_point[0],curr_point[0]),std::min(drag_point[1],curr_point[1])); Point br(std::max(drag_point[0],curr_point[0]),std::max(drag_point[1],curr_point[1])); tl[0]=(tl[0]-window_startx)/pw; tl[1]=(tl[1]-window_starty)/ph; br[0]=(br[0]-window_startx)/pw; br[1]=(br[1]-window_starty)/ph; if(tl[0]>br[0]) swap(tl[0],br[0]); if(tl[1]>br[1]) swap(tl[1],br[1]); cr->rectangle( tl[0], tl[1], br[0]-tl[0], br[1]-tl[1] ); cr->stroke(); cr->restore(); } }
void Drawable::draw(const Cairo::RefPtr<Cairo::Context>& context, ImageBuffer& buff) { context->save(); // std::cout << getImageName() << std::endl; auto image = buff.getImage(getImageName(), flipped_, scaleX, scaleY); // int width = image->get_width(); // int height = image->get_height(); proto::Position pos = getPosition(); int x = c_.scaleWidth(pos.x); int y = c_.scaleHeight(pos.y); // Gdk::Cairo::set_source_pixbuf(context, image, pos.x + width / 2, // pos.y - height / 2); Gdk::Cairo::set_source_pixbuf(context, image, x, offset_ + y); context->paint(); // context->set_source_rgb(0.8, 0.0, 0.0); // context->move_to(pos.x, pos.y); // context->line_to(pos.x + width / 2, pos.y - height / 2); // context->line_to(pos.x + width / 2, pos.y + height / 2); // context->line_to(pos.x - width / 2, pos.y + height / 2); // context->line_to(pos.x - width / 2, pos.y - height / 2); // context->line_to(pos.x + width / 2, pos.y - height / 2); // context->stroke(); context->restore(); }
bool Balls::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) { Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width(); const int height = allocation.get_height(); cr->save(); cr->scale(width, height); cr->set_line_width(0.001); for (auto ball : balls_) { cr->set_source_rgb(ball.color_r,ball.color_g,ball.color_b); cr->arc(ball.p.x,ball.p.y, ball.rad, 0,2*M_PI); cr->fill(); cr->stroke(); } cr->restore(); const Ball &ball1 = balls_[balls_.size()-1]; std::ostringstream info; info << "x = " << ball1.p.x << "\ny = " << ball1.p.y; infobox_.show(cr,width,height,info.str()); return true; }
void ItemView::drawReminderIcon(const Cairo::RefPtr<Cairo::Context>& cr, const int width, const int height) { cr->save(); //draw reminder icon cr->set_antialias(Cairo::ANTIALIAS_NONE); if (data.isReminder()) { Gtk::Image* image = Resources::res->imgReminderIcon; if (getColorMode() == COLOR_ALARM) image = Resources::res->imgReminderOnIcon; const Glib::RefPtr<Gdk::Pixbuf> icon = image->get_pixbuf(); const int iconLeft = (TIME_WIDTH * 0.5) - (icon->get_width() * 0.5); const int iconTop = (height - icon->get_height()) - (PADDING * 3); Gdk::Cairo::set_source_pixbuf(cr, icon, iconLeft, iconTop); cr->rectangle(iconLeft, iconTop, icon->get_width(), icon->get_height()); cr->fill(); } cr->restore(); }
void NodeRenderer::label(const Cairo::RefPtr<Cairo::Context>& cr, std::list<shared_ptr<Label> >& labels, AssetCache& cache) { // nothing to print if (s->text.str().size() == 0 || s->font_size <= 0) return; cr->save(); cr->set_font_size(s->font_size); cr->set_font_face(cache.getFont( s->font_family.str(), s->font_style == Style::STYLE_ITALIC ? Cairo::FONT_SLANT_ITALIC : Cairo::FONT_SLANT_NORMAL, s->font_weight == Style::WEIGHT_BOLD ? Cairo::FONT_WEIGHT_BOLD : Cairo::FONT_WEIGHT_NORMAL )); Cairo::TextExtents textSize; cr->get_text_extents(s->text.str(), textSize); addLabel(labels, location + FloatPoint(0.0, s->text_offset), textSize); cr->restore(); }
void MapDrawArea::DrawOptimalPath(const Cairo::RefPtr<Cairo::Context>& cr) { // This is where we draw on the window Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width(); const int height = allocation.get_height(); const int lesser = MIN(width, height); const Coord maxXY = guiMapData.copyMaxCoord(); // Copy the optimal path to the draw area std::vector<Coord> optimalPath = guiMapData.copyOptPath(); // Plot the path cr->save(); cr->set_source_rgb(1.0, 0.08, 0.58); // pink for path cr->set_line_width(lesser * 0.005); cr->set_line_cap(Cairo::LINE_CAP_ROUND); for(std::vector<Coord>::iterator itr=optimalPath.begin();itr != optimalPath.end();++itr) { cr->move_to( int( float(width)*float(itr->x)/float(maxXY.x) ),int( height*float(itr->y)/float(maxXY.y))); cr->line_to( int( float(width)*float(itr->x)/float(maxXY.x) ),int( height*float(itr->y)/float(maxXY.y))); cr->stroke(); } }
void HomVectorDrawer::draw(Cairo::RefPtr<Cairo::Context>& context) { context->save(); HomPoint start, end; if (m_offset) { start = HomPoint( m_offset->x(), m_offset->y() ); end = HomPoint( m_offset->x() + m_vector->x(), m_offset->y() + m_vector->y() ); } else { start = HomPoint( 0.0, 0.0 ); end = HomPoint( m_vector->x(), m_vector->y() ); } context->move_to( start.x(), start.y() ); context->line_to( end.x() , end.y() ); context->arc( end.x(), end.y(), 0.06, 0.0, 2.0 * M_PI); context->fill(); context->stroke(); context->restore(); }
void Simple_GOL_Area::draw_grid(const Cairo::RefPtr<Cairo::Context>& cr, int window_width, int window_height) { int data_amount = sim_data->get_size(); if (data_amount != 0) { //sim_data->set_width(20); double step_value_x = double(window_width)/double(sim_data->get_width()); double step_value_y = double(window_height)/double(sim_data->get_height()); cr->save(); cr->set_line_width(1.0); cr->set_source_rgb(0.5,0.5,1); cr->move_to(0,0); for(double i=0; i<window_width; i = i+ step_value_x) { cr->move_to(i, 0); cr->line_to(i, window_height); } for(double i=0; i<window_height; i = i+step_value_y) { cr->move_to(0, i); cr->line_to(window_width, i); } cr->stroke(); cr->restore(); } }
void renderLabels(const char* path) { BOOST_TEST_MESSAGE("Render: " << path); Cairo::RefPtr<Cairo::Surface> surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, META_TILE_SIZE * TILE_SIZE, META_TILE_SIZE * TILE_SIZE); Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create(surface); cr->set_source_rgba(0.0, 0.0, 0.0, 1.0); cr->save(); cr->set_source_rgba(1.0, 1.0, 1.0, 1.0); cr->paint(); cr->restore(); std::vector<std::pair<string, FloatPoint>> toPlace; toPlace.push_back(std::pair<string, FloatPoint>("Karlsruhe", FloatPoint(40, 200))); toPlace.push_back(std::pair<string, FloatPoint>("Mannheim", FloatPoint(400, 200))); toPlace.push_back(std::pair<string, FloatPoint>("Stuttgard", FloatPoint(200, 260))); toPlace.push_back(std::pair<string, FloatPoint>("München", FloatPoint(380, 660))); toPlace.push_back(std::pair<string, FloatPoint>("Pforzheim", FloatPoint(200, 600))); toPlace.push_back(std::pair<string, FloatPoint>("Wien", FloatPoint(240, 680))); toPlace.push_back(std::pair<string, FloatPoint>("Paris", FloatPoint(40, 880))); toPlace.push_back(std::pair<string, FloatPoint>("Rom", FloatPoint(-40, 880))); toPlace.push_back(std::pair<string, FloatPoint>("Nothing", FloatPoint(400, 760))); toPlace.push_back(std::pair<string, FloatPoint>("To See", FloatPoint(720, 880))); toPlace.push_back(std::pair<string, FloatPoint>("Here", FloatPoint(720, 560))); toPlace.push_back(std::pair<string, FloatPoint>("Bielefeld", FloatPoint(420, 840))); renderer->renderLabels(cr, toPlace); BOOST_TEST_MESSAGE("Writing."); surface->flush(); surface->write_to_png(path); }
void CairoPlugin::init() { int height, width; preferredSize(width, height); m_img = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, height); m_store = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, height); m_ctx = Cairo::Context::create(m_img); Cairo::RefPtr < Cairo::Context > ctx = Cairo::Context::create(m_store); ctx->save(); ctx->set_source_rgb(1.0, 1.0, 1.0); ctx->set_operator(Cairo::OPERATOR_SOURCE); ctx->paint(); ctx->set_operator(Cairo::OPERATOR_OVER); ctx->restore(); m_ctx->save(); m_ctx->set_source_rgb(1.0, 1.0, 1.0); m_ctx->set_operator(Cairo::OPERATOR_SOURCE); m_ctx->paint(); m_ctx->set_operator(Cairo::OPERATOR_OVER); m_ctx->restore(); m_init = false; m_need = true; }
void Format7DrawingArea::DrawDisabledText(Cairo::RefPtr<Cairo::Context> refCairo) { refCairo->save(); // Set the font parameters refCairo->select_font_face( "monospace", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_BOLD ); refCairo->set_font_size( 10 ); // Set draw color to black refCairo->set_source_rgb(0.0, 0.0, 0.0); // Print current cursor position char cursorPosition[128]; sprintf( cursorPosition, "Custom Image is not supported by this camera."); // Get width / height of widget int width; int height; get_window()->get_size( width, height ); Cairo::TextExtents textExtents; refCairo->get_text_extents( cursorPosition, textExtents ); refCairo->move_to( (width/2) - (textExtents.width/2), (height/2) + textExtents.height + (textExtents.height/2)); refCairo->show_text( cursorPosition ); refCairo->restore(); }
void NodeRenderer::icon(const Cairo::RefPtr<Cairo::Context>& cr, AssetCache& cache) { // path to icon not set if (s->icon_image.str().size() == 0 || s->icon_width == 0.0 || s->icon_height == 0.0) return; cr->save(); Cairo::RefPtr<Cairo::ImageSurface> image = cache.getImage(s->icon_image.str()); double width = s->icon_width < 0 ? image->get_width() : s->icon_width; double height = s->icon_height < 0 ? image->get_height() : s->icon_height; double x0 = floor(location.x - width/2.0); double y0 = floor(location.y - height/2.0); cr->translate(x0, y0); cr->scale(width / image->get_width(), height / image->get_height()); cr->set_source(image, 0, 0); if (s->icon_opacity < 1.0) cr->paint_with_alpha(s->icon_opacity); else cr->paint(); cr->restore(); }
bool on_expose_event(GdkEventExpose* ev) { Glib::RefPtr< Gdk::Window > window = get_window(); if (window) { Cairo::RefPtr< Cairo::Context > ctx = window->create_cairo_context(); Gtk::Allocation alloc = get_allocation(); const int height = alloc.get_height(); const int width = alloc.get_width(); ctx->scale(width, height); //escala para que ocupe siempre toda la pantalla. Notar que es ancho y después alto. ctx->set_line_width(ANCHO_LINEA); // contorno ctx->move_to(0.0, 1.0); // muevo hacia el punto inicial, que arbitrariamente elegí que fuera el de la izquierda abajo ctx->line_to(0.0, 0.0); // línea hacia el punto de arriba a la izquierda ctx->line_to(1.0, 0.0); // línea hacia el punto de arriba a la derecha ctx->line_to(1.0, 1.0); // línea hacia el punto de abajo a la derecha ctx->close_path(); // cierro el camino ctx->save(); // salvo porque voy a cambiar el color ctx->set_source_rgb(1.0, 1.0, 1.0); // seteo el color al blanco ctx->fill_preserve(); // relleno todo el cuadrado, preservando el camino para dibujar el contorno ctx->restore(); ctx->stroke(); // pinto el camino en negro // triángulo azul de abajo ctx->move_to(0.0, 1.0); // muevo hacia el punto inicial, que arbitrariamente elegí que fuera el de la izquierda ctx->line_to(0.5, 0.5); // línea hacia el punto del medio ctx->line_to(1.0, 1.0); // línea hacia el punto de abajo a la derecha ctx->close_path(); // cierro el camino ctx->save(); // salvo porque voy a cambiar el color ctx->set_source_rgb(0.0, 0.0, 1.0); // seteo el color al azul ctx->fill_preserve(); // relleno todo triángulo, preservando el camino para dibujar el contorno ctx->restore(); ctx->stroke(); // pinto el camino en negro // triángulo azul de arriba ctx->move_to(0.0, 0.0); // muevo hacia el punto inicial, que arbitrariamente elegí que fuera el de la izquierda ctx->line_to(0.5, 0.5); // línea hacia el punto del medio ctx->line_to(1.0, 0.0); // línea hacia el punto de arriba a la derecha ctx->close_path(); // cierro el camino ctx->save(); // salvo porque voy a cambiar el color ctx->set_source_rgb(0.0, 0.0, 1.0); // seteo el color al azul ctx->fill_preserve(); // relleno todo triángulo, preservando el camino para dibujar el contorno ctx->restore(); ctx->stroke(); // pinto el camino en negro } return true; }
int main() { #ifdef CAIRO_HAS_PDF_SURFACE std::string filename = "image.pdf"; int width = 600; int height = 400; Cairo::RefPtr<Cairo::PdfSurface> surface = Cairo::PdfSurface::create( filename, width, height); Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create(surface); cr->save(); // save the state of the context cr->set_source_rgb(0.86, 0.85, 0.47); cr->paint(); // fill image with the color cr->restore(); // color is back to black now cr->save(); // draw a border around the image cr->set_line_width(20.0); // make the line wider cr->rectangle(0.0, 0.0, cairo_image_surface_get_width(surface->cobj()), height); cr->stroke(); cr->set_source_rgba(0.0, 0.0, 0.0, 0.7); // draw a circle in the center of the image cr->arc(width / 2.0, height / 2.0, height / 4.0, 0.0, 2.0 * M_PI); cr->stroke(); // draw a diagonal line cr->move_to(width / 4.0, height / 4.0); cr->line_to(width * 3.0 / 4.0, height * 3.0 / 4.0); cr->stroke(); cr->restore(); cr->show_page(); std::cout << "Wrote PDF file \"" << filename << "\"" << std::endl; return 0; #else std::cout << "You must compile cairo with PDF support for this example to work." << std::endl; return 1; #endif }
void ActivityDrawingArea::drawPoints(std::map<double, double> & ps, const double reference_line) { //std::cout<<"ActivityDrawingArea::drawPoints: " <<std::endl; // This is where we draw on the window Glib::RefPtr < Gdk::Window > window = get_window(); Cairo::RefPtr < Cairo::Context > cr = window->create_cairo_context(); cr->save(); Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width(); const int height = allocation.get_height(); cr->set_line_width(2.0); // std::cout<<"ActivityDrawingArea::drawPoints: colour: "<<"("<<main_colour[0]<<","<<main_colour[1]<<","<< main_colour[2] <<std::endl; this->setSourceRGB(cr, currentColourScheme.getMainColour()); //scale the drawing in x and y double maxy = 0; std::map<double, double>::iterator it_ps = ps.begin(); while (it_ps != ps.end()) { if (it_ps->second < 0 && -(it_ps->second) > maxy) { maxy = -(it_ps->second); } else if (it_ps->second > 0 && (it_ps->second) > maxy) { maxy = (it_ps->second); } ++it_ps; } double scaley = 0.2 * (double) ActivityDrawingArea::ACTIVITY_HEIGHT / maxy; double scalex = 10; it_ps = ps.begin(); if (it_ps != ps.end()) { cr->move_to(scalex * it_ps->first, (0.5 * height) - (scaley * it_ps->second)); } else { cr->move_to(0, height / 2); } while (it_ps != ps.end()) { // std::cout<<"ActivityDrawingArea::drawPoints: " << it_ps->first <<","<<-it_ps->second<<std::endl; cr->line_to((scalex * it_ps->first), (0.5 * height) - (scaley * it_ps->second)); ++it_ps; } cr->stroke(); // draw reference line if not zero if (reference_line>0.00001 || reference_line < -0.00001) { Gdk::Color temp_colour(currentColourScheme.getMainColour()); this->setSourceRGB(cr, Gdk::Color("tomato")); cr->set_line_width(1.0); const std::vector<double> dashed= { 1.0 }; cr->set_dash(dashed, 1); double scaled_reference_line = (0.5 * height) - (scaley * reference_line); double neg_scaled_reference_line = (0.5 * height) + (scaley * reference_line); cr->move_to(0, scaled_reference_line); cr->line_to(width, scaled_reference_line); cr->move_to(0, neg_scaled_reference_line); cr->line_to(width, neg_scaled_reference_line); cr->stroke(); } cr->restore(); }
void Renderer_BBox::render_vfunc( const Glib::RefPtr<Gdk::Window>& drawable, const Gdk::Rectangle& /*expose_area*/ ) { assert(get_work_area()); if(!get_work_area()) return; Cairo::RefPtr<Cairo::Context> cr = drawable->create_cairo_context(); const synfig::Vector::value_type window_startx(get_work_area()->get_window_tl()[0]); const synfig::Vector::value_type window_starty(get_work_area()->get_window_tl()[1]); const float pw(get_pw()),ph(get_ph()); const synfig::Point curr_point(get_bbox().get_min()); const synfig::Point drag_point(get_bbox().get_max()); if(get_bbox().area()<10000000000000000.0 && get_bbox().area()>0.00000000000000001) { Point tl(std::min(drag_point[0],curr_point[0]),std::min(drag_point[1],curr_point[1])); Point br(std::max(drag_point[0],curr_point[0]),std::max(drag_point[1],curr_point[1])); tl[0]=(tl[0]-window_startx)/pw; tl[1]=(tl[1]-window_starty)/ph; br[0]=(br[0]-window_startx)/pw; br[1]=(br[1]-window_starty)/ph; if(tl[0]>br[0]) swap(tl[0],br[0]); if(tl[1]>br[1]) swap(tl[1],br[1]); cr->save(); cr->set_line_cap(Cairo::LINE_CAP_BUTT); cr->set_line_join(Cairo::LINE_JOIN_MITER); cr->set_line_width(1.0); cr->set_source_rgb(1.0,1.0,1.0); // Operator difference was added in Cairo 1.9.4 // It currently isn't supported by Cairomm #if CAIRO_VERSION >= 10904 cairo_set_operator(cr->cobj(), CAIRO_OPERATOR_DIFFERENCE); #else // Fallback: set color to black cr->set_source_rgb(0,0,0); #endif cr->rectangle( int(tl[0])+0.5, int(tl[1])+0.5, int(br[0]-tl[0]+1), int(br[1]-tl[1]+1) ); cr->stroke(); cr->restore(); } }
int drawCairo(const string& fname, const valarray<double>& Xin, const valarray<double>& Yin, const Hull& hull) { #ifdef CAIRO_HAS_SVG_SURFACE unsigned n=Xin.size(); assert(Yin.size()==n); // normalise coords to range 0-1 valarray<double> X=Xin, Y=Yin; X-=X.min(); Y-=Y.min(); X/=X.max(); Y/=Y.max(); Cairo::RefPtr<Cairo::SvgSurface> surface = Cairo::SvgSurface::create(fname, width+2*border, height+2*border); Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create(surface); cr->save(); // save the state of the context cr->set_source_rgba(0.0, 0.0, 0.0, 0.7); // draw a circle at each coordinate for(unsigned i=0;i<n;i++) { dot(cr,xcoord(X[i]),ycoord(Y[i])); } cr->set_source_rgba(0.0, 0.0, 0.0, 0.3); cr->move_to(xcoord(X[hull[0]]),ycoord(Y[hull[0]])); for(unsigned i=1;i<hull.size();i++) { cr->line_to(xcoord(X[hull[i]]),ycoord(Y[hull[i]])); } cr->line_to(xcoord(X[hull[0]]),ycoord(Y[hull[0]])); cr->stroke(); cr->set_source_rgba(0.0, 0.0, 0.0, 1.); for(vector<unsigned>::const_iterator i=hull.begin();i!=hull.end();++i) { unsigned j=*i; stringstream ss; ss<<j; printf("p[%d]=(%f,%f)\n",j,X[j],Y[j]); cr->move_to(xcoord(X[j]),ycoord(Y[j])); cr->show_text(ss.str()); cr->stroke(); } cr->restore(); cr->show_page(); cout << "Wrote SVG file \"" << fname << "\"" << endl; return 0; #else cout << "You must compile cairo with SVG support for this example to work." << endl; return 1; #endif }
int main() { Cairo::RefPtr<Cairo::ImageSurface> surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, 600, 400); Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create(surface); cr->save(); // save the state of the context cr->set_source_rgb(0.86, 0.85, 0.47); cr->paint(); // fill image with the color cr->restore(); // color is back to black now cr->save(); // draw a border around the image cr->set_line_width(20.0); // make the line wider cr->rectangle(0.0, 0.0, surface->get_width(), surface->get_height()); cr->stroke(); cr->set_source_rgba(0.0, 0.0, 0.0, 0.7); // draw a circle in the center of the image cr->arc(surface->get_width() / 2.0, surface->get_height() / 2.0, surface->get_height() / 4.0, 0.0, 2.0 * M_PI); cr->stroke(); // draw a diagonal line cr->move_to(surface->get_width() / 4.0, surface->get_height() / 4.0); cr->line_to(surface->get_width() * 3.0 / 4.0, surface->get_height() * 3.0 / 4.0); cr->stroke(); cr->restore(); #ifdef CAIRO_HAS_PNG_FUNCTIONS std::string filename = "image.png"; surface->write_to_png(filename); std::cout << "Wrote png file \"" << filename << "\"" << std::endl; #else std::cout << "You must compile cairo with PNG support for this example to work." << std::endl; #endif }
void Format7DrawingArea::DrawImageDimensionsText( Cairo::RefPtr<Cairo::Context> refCairo, unsigned int left, unsigned int top, unsigned int width, unsigned int height ) { refCairo->save(); // Set the font parameters refCairo->select_font_face( "monospace", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_BOLD ); refCairo->set_font_size( 10 ); // Set draw color to black refCairo->set_source_rgb(0.0, 0.0, 0.0); // Get width / height of widget int widgetWidth = 0; int widgetHeight = 0; get_window()->get_size( widgetWidth, widgetHeight ); // Create text for image offset char imageOffsets[128]; sprintf( imageOffsets, "Start: (%d,%d) End: (%d,%d)", left, top, left + width, top + height ); Cairo::TextExtents offsetExtents; refCairo->get_text_extents(imageOffsets, offsetExtents); // Draw the offset text refCairo->move_to( (widgetWidth/2) - (offsetExtents.width/2), (widgetHeight/2) - offsetExtents.height - (offsetExtents.height/2)); refCairo->show_text( imageOffsets ); // Create text for image dimensions char imageDimensions[128]; sprintf( imageDimensions, "Dimensions: %d x %d", width, height); Cairo::TextExtents dimensionsExtents; refCairo->get_text_extents(imageDimensions, dimensionsExtents); // Draw the dimensions text refCairo->move_to( (widgetWidth/2) - (dimensionsExtents.width/2), (widgetHeight/2) + dimensionsExtents.height + (dimensionsExtents.height/2)); refCairo->show_text( imageDimensions ); refCairo->restore(); }
void DependencyArrow::draw(const Cairo::RefPtr<Cairo::Context>& context) const { // the way to compute the (tcx, tcy) single control point of the // quadratic double dX = mControlPoint.getX() - mOrigin->getX(); double dY = mControlPoint.getY() - mOrigin->getY(); double d1 = std::sqrt(dX * dX + dY * dY); double d = d1; dX = mDestination->getX() - mControlPoint.getX(); dY = mDestination->getY() - mControlPoint.getY(); d += std::sqrt(dX * dX + dY * dY); double t = d1/d; double t1 = 1.0 - t; double tSq = t * t; double denom = 2.0 * t * t1; double tcx = (mControlPoint.getX() - t1 * t1 * mOrigin->getX() - tSq * mDestination->getX()) / denom; double tcy = (mControlPoint.getY() - t1 * t1 * mOrigin->getY() - tSq * mDestination->getY()) / denom; // from the single point of the quadratic to the both of the cubic double tcxq1 = mOrigin->getX() + 2. * (tcx - mOrigin->getX()) / 3.; double tcyq1 = mOrigin->getY() + 2. * (tcy - mOrigin->getY()) / 3.; double tcxq2 = mDestination->getX() + 2. * (tcx - mDestination->getX()) / 3.; double tcyq2 = mDestination->getY() + 2. * (tcy - mDestination->getY()) / 3.; // and now to draw, std::valarray< double > dashes(2); double angle = atan2 (mDestination->getY() - tcyq2, mDestination->getX() - tcxq2) + M_PI; double x1 = mDestination->getX() + 9 * std::cos(angle - 0.35); double y1 = mDestination->getY() + 9 * std::sin(angle - 0.35); double x2 = mDestination->getX() + 9 * std::cos(angle + 0.35); double y2 = mDestination->getY() + 9 * std::sin(angle + 0.35); dashes[0] = 8.0; dashes[1] = 3.0; context->save(); context->set_line_width(1); context->move_to(mDestination->getX(), mDestination->getY()); context->line_to(x1,y1); context->line_to(x2,y2); context->line_to(mDestination->getX(), mDestination->getY()); context->fill(); context->set_dash(dashes,0.); context->move_to(mOrigin->getX(), mOrigin->getY()); context->curve_to(tcxq1, tcyq1, tcxq2, tcyq2, mDestination->getX(), mDestination->getY()); context->stroke(); context->restore(); }
void Anchor::draw(const Cairo::RefPtr<Cairo::Context>& context) const { context->save(); context->move_to(mX,mY); context->set_source_rgb(0., 1., 0.); context->rectangle(mX, mY, ANCHOR_WIDTH, ANCHOR_HEIGHT); context->fill(); context->restore(); }
void ICLayerLineString::draw(Cairo::RefPtr<Cairo::Context> cr, double scale, std::set<int> select, bool DisplayID, double Alpha) { std::map<int, ICLayerObject*>::iterator it; for (it = m_ICLayerObject.begin(); it != m_ICLayerObject.end(); it++) { if ((*it).second->selfIdExisting()) { bool isSelect = false; if (!select.empty()) { std::set<int>::iterator it2; it2 = select.find((*it).first); if (it2 != select.end() && (*it2) == (*it).first) { drawLine(cr, (*it).second->getOGRGeometryObject(), scale, true); isSelect = true; } else drawLine(cr, (*it).second->getOGRGeometryObject(), scale, false); } else drawLine(cr, (*it).second->getOGRGeometryObject(), scale, false); if (DisplayID) { Cairo::TextExtents extents; std::stringstream str; str << (*it).first; std::string text = str.str(); cr->select_font_face("Bitstream Vera Sans, Arial", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_NORMAL); cr->set_font_size(12 / scale); Cairo::FontOptions font_options; font_options.set_hint_style(Cairo::HINT_STYLE_NONE); font_options.set_hint_metrics(Cairo::HINT_METRICS_OFF); font_options.set_antialias(Cairo::ANTIALIAS_GRAY); cr->set_font_options(font_options); cr->save(); cr->get_text_extents(text, extents); cr->move_to((*it).second->getCentroid().first, (*it).second->getCentroid().second); cr->scale(1, -1); if (isSelect) cr->set_source_rgba(0, 0, 0, Alpha); cr->show_text(text); cr->stroke(); cr->restore(); } } } }
void enigma_rotor_window::draw_wheel_pos(Cairo::RefPtr<Cairo::Context> cr, gunichar new_pos) { wheel_pos = new_pos; const char *trans_2 = "00000000011111111112222222"; const char *trans_1 = "12345678901234567890123456"; int win_size = ((int)(padded_size)) - 1; cr->save(); // Draw background of rotor window as a rectangle filled with the rotor background colour cr->set_source_rgb(rotor_r, rotor_g, rotor_b); cr->rectangle(x - win_size / 2, y - win_size / 2, win_size, win_size); // Set path cr->fill_preserve(); // Fill everyting inside the path and preserve the path // Draw black border around the path, i.e. the rectangle that represents the rotor window cr->set_line_width(1.0); cr->set_source_rgb(BLACK); cr->stroke(); cr->restore(); cr->save(); // Set colour in which to draw the rotor position if (!is_greek) cr->set_source_rgb(BLACK); // Default is black else cr->set_source_rgb(RED); // The greek wheel on M4 has red markings if (!is_numeric) { // rotor position is displayed as character A-Z print_char(cr, x, y, new_pos, font_size_char); } else { // rotor position is displayed as a number 01, 02, ..., 26 print_char(cr, x - char_width_numeric / 2, y, trans_2[new_pos - 'A'], font_size_numeric); print_char(cr, x + char_width_numeric / 2, y, trans_1[new_pos - 'A'], font_size_numeric); } cr->restore(); }