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); } }
/** * Does something when the speed graph is drawn. */ bool GtkGraph::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) { cr->set_line_width(1.0); const double width = (double)get_allocation().get_width(); const double height = (double)get_allocation().get_height(); std::vector <double> dash = { 5 }; Gdk::Cairo::set_source_rgba(cr, get_style_context()->get_background_color()); double increment = (width - m_labelLength) / (m_displaySize-1); std::queue<double> download = lastElements(m_history[m_selected].first, m_displaySize); std::queue<double> upload = lastElements(m_history[m_selected].second, m_displaySize); unsigned order; if(max(download, upload) <= 10 * 1024) order = 1; else if(max(download, upload) <= 100 * 1024) order = 10; else if(max(download, upload) <= 1000 * 1024) order = 100; else order = 1000; int maxValue = max(download, upload) + (order * 1024) - (double)((int)(max(m_history[m_selected].first, m_history[m_selected].second)) % (order * 1024)); // draw curves //Gdk::Cairo::set_source_rgba(cr, get_style_context()->get_color()); Gdk::Cairo::set_source_rgba(cr, Gdk::RGBA(gt::Settings::settings["GraphUploadCurveColor"])); std::string label; if(gt::Settings::settings["ShowLegend"] != "No") { label = "Upload"; cr->move_to(10, (height-m_labelHeight) / 2 - 15); cr->text_path(label); cr->fill(); } upl = true; if(gt::Settings::settings["GraphUploadCurveStyle"] == "Dash") cr->set_dash(dash, 0); draw(download, (height-m_labelHeight), increment, maxValue, cr); cr->unset_dash(); upl = false; Gdk::Cairo::set_source_rgba(cr, Gdk::RGBA(gt::Settings::settings["GraphDownloadCurveColor"])); if(gt::Settings::settings["ShowLegend"] != "No") { label = "Download"; cr->move_to(10, (height-m_labelHeight) / 2 - 30); cr->text_path(label); cr->fill(); cr->stroke(); } if(gt::Settings::settings["GraphDownloadCurveStyle"] == "Dash") cr->set_dash(dash, 0); draw(upload, (height-m_labelHeight), increment, maxValue, cr); cr->unset_dash(); // draw grid Gdk::Cairo::set_source_rgba(cr, Gdk::RGBA(gt::Settings::settings["GraphBorderColor"])); for(unsigned i = 0, val = 0;i<6;++i) { Gdk::Cairo::set_source_rgba(cr, Gdk::RGBA(gt::Settings::settings["GraphBorderColor"])); cr->move_to(i * ((width-m_labelLength)/5), height); std::string label = timestr(val); cr->text_path(label); cr->fill(); val += m_displaySize/5; Gdk::Cairo::set_source_rgba(cr, Gdk::RGBA(gt::Settings::settings["GraphHLineColor"])); cr->move_to(i * ((width-m_labelLength)/5), (height-m_labelHeight)+2); cr->line_to(i * ((width-m_labelLength)/5), gt::Settings::settings["ShowGrid"] == "Yes" ? 0 : (height-m_labelHeight)); cr->stroke(); cr->set_line_width(1.0); } cr->stroke(); cr->move_to(0, (height-m_labelHeight)); cr->line_to(width, (height-m_labelHeight)); cr->move_to(0, (height-m_labelHeight)); cr->line_to(0, 0); cr->move_to(width - m_labelLength, 0); cr->line_to(width - m_labelLength, (height-m_labelHeight)); cr->stroke(); int lValue = maxValue + 5 - (maxValue % 5); for(int i = 1; i <= 6; ++i) { Gdk::Cairo::set_source_rgba(cr, Gdk::RGBA(gt::Settings::settings["GraphBorderColor"])); std::string label = speedstr(lValue - ((lValue / 5) * (i - 1))); cr->move_to(width - m_labelLength +2, 10 + (((height-m_labelHeight -10) / 5) * (i - 1))); cr->text_path(label); cr->fill(); Gdk::Cairo::set_source_rgba(cr, Gdk::RGBA(gt::Settings::settings["GraphHLineColor"])); cr->set_line_width(0.6); cr->move_to(width - m_labelLength +2, 13 + (((height-m_labelHeight-13) / 5) * (i - 1))); cr->line_to(gt::Settings::settings["ShowGrid"] == "Yes" ? 0 : width - m_labelLength, 13 + (((height-m_labelHeight-13) / 5) * (i - 1))); cr->stroke(); cr->set_line_width(1.0); } Gdk::Cairo::set_source_rgba(cr, Gdk::RGBA(gt::Settings::settings["GraphBorderColor"])); cr->move_to(width - 37, (height-m_labelHeight) - 5); cr->text_path("0B/s"); cr->fill(); return true; }
void ImageDrawable::drawImage(const Cairo::RefPtr<Cairo::Context> &cr, const Gtk::Allocation &allocation) { auto image = images->current(); auto surface = image->getPrimary(); int rwidth, rheight; double rscale; double rx, ry; //cout << "image " << iwidth << "x" << iheight << " " << iorientation.first << "," << iorientation.second << endl; calcRenderedImage(image, allocation, rwidth, rheight, rscale, rx, ry); cr->translate(rx, ry); cr->scale(rscale, rscale); waiting = !surface; if (image->isPrimaryFailed()) { // TODO display fancy failed indicator cr->set_source_rgb(0.75, 0.5, 0.5); cr->rectangle(0, 0, rwidth, rheight); cr->clip(); cr->paint(); return; } else if (!surface) { // TODO display fancy loading animation cr->set_source_rgb(0.5, 0.75, 0.5); cr->rectangle(0, 0, rwidth, rheight); cr->clip(); cr->paint(); return; } switch (image->getOrientation().first) { case Image::Rotate::ROTATE_NONE: break; case Image::Rotate::ROTATE_90: cr->translate(image->height(), 0); cr->rotate_degrees(90); break; case Image::Rotate::ROTATE_180: cr->translate(image->width(), image->height()); cr->rotate_degrees(180); break; case Image::Rotate::ROTATE_270: cr->translate(0, image->width()); cr->rotate_degrees(270); break; } if (image->getOrientation().second) { cr->translate(image->width(), 0); cr->scale(-1, 1); } auto pattern = Cairo::SurfacePattern::create(surface); pattern->set_filter(Cairo::Filter::FILTER_FAST); cr->set_source(pattern); //auto start = chrono::steady_clock::now(); cr->paint(); //auto stop = chrono::steady_clock::now(); //cout << "paint " << chrono::duration_cast<chrono::milliseconds>(stop - start).count() << "ms" << endl; if (afPoints) { //start = chrono::steady_clock::now(); auto properties = image->getProperties(); valarray<double> dashes(5.0 / rscale, 5.0 / rscale); cr->save(); cr->set_operator(static_cast<Cairo::Operator>(CAIRO_OPERATOR_DIFFERENCE)); for (auto &rect : properties.focusPoints) { if (properties.focusPointsActive.find(rect) != properties.focusPointsActive.cend()) { cr->set_source_rgb(1, 0, 1); cr->set_line_width(4.0 / rscale); cr->unset_dash(); } else if (properties.focusPointsSelected.find(rect) != properties.focusPointsSelected.cend()) { cr->set_source_rgb(1, 0, 0); cr->set_line_width(2.0 / rscale); cr->unset_dash(); } else { cr->set_source_rgb(1, 1, 1); cr->set_line_width(1.0 / rscale); cr->set_dash(dashes, 0); } cr->rectangle(rect.x, rect.y, rect.width, rect.height); cr->stroke(); } cr->restore(); //stop = chrono::steady_clock::now(); //cout << "afpaint " << chrono::duration_cast<chrono::milliseconds>(stop - start).count() << "ms" << endl; } }
void FrequencyGraph( Cairo::RefPtr<Cairo::Context> cr, bool active, float x, float y, float xS, float yS, EqualizerState state) { cr->set_line_cap( Cairo::LINE_CAP_ROUND ); cr->set_line_join( Cairo::LINE_JOIN_ROUND); int xSize = xS; int ySize = yS; // works but a bit simple cr -> move_to( x , y ); cr -> line_to( x + xSize, y ); cr -> line_to( x + xSize, y + ySize ); cr -> line_to( x , y + ySize ); cr -> close_path(); // Draw outline shape cr -> set_source_rgb (0.1,0.1,0.1); cr -> fill(); // draw "frequency guides" std::valarray< double > dashes(2); dashes[0] = 2.0; dashes[1] = 2.0; cr->set_dash (dashes, 0.0); cr->set_line_width(1.0); cr->set_source_rgb (0.4,0.4,0.4); for ( int i = 0; i < 4; i++ ) { cr->move_to( x + ((xSize / 4.f)*i), y ); cr->line_to( x + ((xSize / 4.f)*i), y + ySize ); } for ( int i = 0; i < 4; i++ ) { cr->move_to( x , y + ((ySize / 4.f)*i) ); cr->line_to( x +xSize, y + ((ySize / 4.f)*i) ); } cr->stroke(); cr->unset_dash(); // set colour based on active or not if ( active ) setColour(cr, COLOUR_BLUE_1, 0.2 ); else setColour(cr, COLOUR_GREY_1, 0.2 ); int tmpX = x; int tmpY = y; // precalculate some variables float oldGainPix = (ySize / 60.f) * (state.gain[0] - 0.5 ) * 40; float oldXLoc = 0; float qPix = ((xSize * 0.2) / 3.f ); //float oldCutoff = 0; // move to bottom left, draw line to middle left cr->move_to( tmpX, tmpY + ySize ); cr->line_to( tmpX, tmpY + (ySize * 0.5) - oldGainPix ); for ( int i = 0; i < 4; i++ ) { //float cutoff = state.cutoffFreq[i] / 20000; float gainPix = (ySize / 60.f) * (state.gain[i] - 0.5 ) * 40; float xLoc = xSize * 0.2 * (i+1); //std::cout << "I: " << i << " GainPix: " << gainPix << " tmpY - gainPix" << tmpY - gainPix << std::endl; cr->curve_to( tmpX + oldXLoc + qPix, tmpY + (ySize * 0.5) - oldGainPix ,// control point 1 tmpX + xLoc - qPix , tmpY + (ySize * 0.5) - gainPix , // control point 2 tmpX + xLoc , tmpY + (ySize * 0.5) - gainPix ); // end of curve // update variables for next iter oldGainPix = gainPix; oldXLoc = xLoc; //oldCutoff = cutoff; } // last bit of curve to the right edge cr->curve_to( tmpX + oldXLoc + qPix, tmpY + (ySize * 0.5) - oldGainPix, // control point 1 tmpX + xSize - qPix, tmpY + (ySize * 0.5) - oldGainPix, // control point 2 tmpX + xSize , tmpY + (ySize * 0.5) - oldGainPix); // end of curve cr->line_to( tmpX + xSize , tmpY + ySize ); cr->close_path(); cr->fill_preserve(); cr->set_line_width(2.5); if ( active ) setColour(cr, COLOUR_BLUE_1 ); else setColour(cr, COLOUR_GREY_1 ); cr->stroke(); // outline cr->rectangle( x, y , xS, yS ); cr->set_line_width(3); if ( active ) setColour(cr, COLOUR_GREY_2 ); else setColour(cr, COLOUR_GREY_3 ); cr->stroke(); //std::cout << "LupppWidget::FrequencyGraph() called!" << std::endl; }
bool GHighPass::on_expose_event(GdkEventExpose* event) { // This is where we draw on the window Glib::RefPtr<Gdk::Window> window = get_window(); if(window) // Only run if Window does exist { Gtk::Allocation allocation = get_allocation(); int width = allocation.get_width(); int height = allocation.get_height(); // clip to the area indicated by the expose event so that we only redraw // the portion of the window that needs to be redrawn Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context(); cr->rectangle(event->area.x, event->area.y, event->area.width, event->area.height); cr->clip(); cr->rectangle(event->area.x, event->area.y, event->area.width, event->area.height); setColour(cr, COLOUR_GREY_3 ); cr->fill(); //cout << "HighPass getting state ID " << ID << endl; float cutoffRangeZeroOne = stateStore->effectState.at(ID).values[0]; cutoff = cutoffRangeZeroOne; bool active = stateStore->effectState.at(ID).active; bool globalUnit = stateStore->effectState.at(ID).globalUnit; int x = 0; int y = 0; xSize = 73; ySize = 37; // works but a bit simple cr -> move_to( x , y ); cr -> line_to( x + xSize, y ); cr -> line_to( x + xSize, y + ySize ); cr -> line_to( x , y + ySize ); cr -> close_path(); // Draw outline shape cr -> set_source_rgb (0.1,0.1,0.1); cr -> fill(); // draw "frequency guides" std::valarray< double > dashes(2); dashes[0] = 2.0; dashes[1] = 2.0; cr->set_dash (dashes, 0.0); cr->set_line_width(1.0); cr->set_source_rgb (0.4,0.4,0.4); for ( int i = 0; i < 3; i++ ) { cr->move_to( x + ((xSize / 3.f)*i), y ); cr->line_to( x + ((xSize / 3.f)*i), y + ySize ); } for ( int i = 0; i < 3; i++ ) { cr->move_to( x , y + ((ySize / 3.f)*i) ); cr->line_to( x +xSize, y + ((ySize / 3.f)*i) ); } cr->stroke(); cr->unset_dash(); // move to bottom left, draw line to middle left cr->move_to( x + xSize-2 , y + ySize ); cr->line_to( x + xSize-2 , y + (ySize/2)); int startHorizontalLine = xSize* (cutoff + 0.4); if ( startHorizontalLine > 75 ) startHorizontalLine = 75; cr->line_to( startHorizontalLine, y + (ySize/2) ); // horizontal line to start of curve int xSize1CP1 = xSize* (cutoff +0.1); int xSize1CP2 = xSize* (cutoff +0.08); int xSize1End = xSize* cutoff; if ( xSize1CP1 > 75 ) xSize1CP1 = 75; if ( xSize1CP2 > 75 ) xSize1CP2 = 75; if ( xSize1End > 75 ) xSize1End = 75; cr->curve_to( xSize1CP1, y+(ySize*0.5), // control point 1 xSize1CP2, y+(ySize*0.3), // control point 2 xSize1End, y+(ySize*0.3)); // end of curve 1, start curve 2 int xSize2CP1 = xSize* (cutoff - 0.03); int xSize2CP2 = xSize* (cutoff - 0.08); int xSize2End = xSize* (cutoff - 0.15); if ( xSize2CP1 > 75 ) xSize2CP1 = 75; if ( xSize2CP2 > 75 ) xSize2CP2 = 75; if ( xSize2End > 75 ) xSize2End = 75; cr->curve_to( xSize2CP1, y+(ySize*0.3), // control point 1 xSize2CP2, y+(ySize*0.3), // control point 2 xSize2End, y+(ySize) ); // end of curve on floor if (active) setColour(cr, COLOUR_BLUE_1, 0.2 ); else setColour(cr, COLOUR_GREY_1, 0.2 ); cr->close_path(); cr->fill_preserve(); // stroke cutoff line cr->set_line_width(2.5); if ( active ) setColour(cr, COLOUR_BLUE_1 ); else setColour(cr, COLOUR_GREY_1 ); cr->stroke(); // click center if ( globalUnit ) { if ( active ) setColour(cr, COLOUR_GREEN_1, 0.9 ); else setColour(cr, COLOUR_GREY_1,0.9 ); cr->move_to( xSize * cutoff - 5, ySize*q - 5 ); cr->line_to( xSize * cutoff + 5, ySize*q + 5 ); cr->move_to( xSize * cutoff - 5, ySize*q + 5 ); cr->line_to( xSize * cutoff + 5, ySize*q - 5 ); cr->stroke(); } else { if ( active ) setColour(cr, COLOUR_ORANGE_1, 0.9 ); else setColour(cr, COLOUR_GREY_1, 0.9 ); cr->arc( xSize*cutoff, ySize*q, 7, 0, 6.2830 ); cr->stroke(); } // dials Dial(cr, active, 70, 140, cutoffRangeZeroOne, DIAL_MODE_NORMAL); Dial(cr, active, 150,140, q , DIAL_MODE_NORMAL); // outline setColour(cr, COLOUR_GREY_3 ); cr->rectangle( x, y , xSize, ySize ); cr->set_line_width(3); setColour(cr, COLOUR_GREY_2 ); cr->stroke(); /* if ( state.selected ) { cr->rectangle(0, 0, 74, 216); setColour( cr, COLOUR_PURPLE_1 ); cr->set_line_width(1); cr->stroke(); } */ } return true; }