void RegionChooser::draw_digit(int key) { const int h = KEYBOARD_HEIGHT; const int w = get_width() - 1; Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create(get_pango_context()); char buf[30]; sprintf(buf, "<span size=\"8000\">%d</span>", key / 12 - 1); layout->set_markup(buf); Pango::Rectangle rectangle = layout->get_logical_extents(); double text_w = double(rectangle.get_width()) / Pango::SCALE; double text_h = double(rectangle.get_height()) / Pango::SCALE; double x = w * (key + 0.75) / 128.0; get_window()->draw_layout(get_style()->get_black_gc(), int(x - text_w / 2 + 1), int(h1 + h - text_h + 0.5), layout); }
int *width, int *height) const #else /** Get required size for cell. * @param widget widget * @param cell_area area of the cell * @param x_offset ignored * @param y_offset ignored * @param width upon return contains the required width of the cell * @param height upon return contains the required height of the cell */ void TwoLinesCellRenderer::get_size_vfunc(Gtk::Widget &widget, const Gdk::Rectangle *cell_area, int *x_offset, int *y_offset, int *width, int *height) const #endif { #ifdef GLIBMM_PROPERTIES_ENABLED // Compute text width Glib::RefPtr<Pango::Layout> layout_ptr = widget.create_pango_layout(__property_line1); Pango::Rectangle rect = layout_ptr->get_pixel_logical_extents(); int line1_width = property_xpad() * 2 + rect.get_width(); int line1_height = property_ypad() * 2 + rect.get_height(); int line2_height; if (__property_line2_enabled.get_value()) { Glib::RefPtr<Pango::Layout> layout2 = widget.create_pango_layout(__property_line2); #if GTK_VERSION_GE(3,0) Pango::FontDescription font2("sans 10"); #else Glib::RefPtr<Gtk::Style> style = widget.get_style(); Pango::FontDescription font2 = style->get_font(); #endif font2.set_size((int)roundf(Pango::SCALE_SMALL * font2.get_size())); layout2->set_font_description(font2); Pango::Rectangle rect2 = layout2->get_pixel_logical_extents(); layout2->set_ellipsize(Pango::ELLIPSIZE_END); line2_height = property_ypad() * 2 + rect2.get_height(); } else { line2_height = 0; } if (width) *width = line1_width; if (height) *height = line1_height + 4 + line2_height; #endif }
void RegionChooser::draw_digit(const Cairo::RefPtr<Cairo::Context>& cr, int key) { const int h = KEYBOARD_HEIGHT; const int w = get_width() - 1; Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create(get_pango_context()); char buf[30]; sprintf(buf, "<span size=\"8000\">%d</span>", key / 12 - 1); layout->set_markup(buf); Pango::Rectangle rectangle = layout->get_logical_extents(); double text_w = double(rectangle.get_width()) / Pango::SCALE; double text_h = double(rectangle.get_height()) / Pango::SCALE; double x = w * (key + 0.75) / 128.0; Gdk::Cairo::set_source_rgba(cr, black); cr->move_to(int(x - text_w / 2 + 1), int(h1 + h - text_h + 0.5)); #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 16) || GTKMM_MAJOR_VERSION < 2 pango_cairo_show_layout(cr->cobj(), layout->gobj()); #else layout->show_in_cairo_context(cr); #endif }
virtual bool on_expose_event(GdkEventExpose* ) { Glib::RefPtr<Gdk::Drawable> drawable = get_window(); vc.get_frame(pixbuf); drawable->draw_pixbuf(get_style()->get_bg_gc(Gtk::STATE_NORMAL), pixbuf->scale_simple(get_width(), get_height(), Gdk::INTERP_BILINEAR), 0, 0, 0, 0, -1 , -1, Gdk::RGB_DITHER_NONE, 0, 0); Gdk::Point rect[4], barcode_center; string str; bool res = decode_barcode(pixbuf, rect, str, 100); if (res) { Cairo::RefPtr<Cairo::Context> cr = drawable->create_cairo_context(); cr->set_line_width(3); cr->set_source_rgb(1, 0.0, 0.0); cr->move_to(rect[0].get_x(), rect[0].get_y() ); cr->line_to(rect[1].get_x(), rect[1].get_y() ); cr->line_to(rect[2].get_x(), rect[2].get_y() ); cr->line_to(rect[3].get_x(), rect[3].get_y() ); cr->line_to(rect[0].get_x(), rect[0].get_y() ); cr->stroke(); BarcodePropertyEstimation distance(get_width(), get_height(), rect[0].get_x(), rect[0].get_y(), rect[1].get_x(), rect[1].get_y(), rect[2].get_x(), rect[2].get_y(), rect[3].get_x(), rect[3].get_y()); Glib::RefPtr<Pango::Layout> pango_layout = Pango::Layout::create(cr); Pango::FontDescription desc("Arial Rounded MT Bold"); desc.set_size(14 * PANGO_SCALE); pango_layout->set_font_description(desc); pango_layout->set_alignment(Pango::ALIGN_CENTER); double dir = distance.calcDirection(); string dir_str; if (dir > 2.3) dir_str = "right"; else if (dir < -2.3) dir_str = "left"; else dir_str = "front"; double dist = distance.calcDistance(); string text = "Object ID: " + str + "\nDistance: " + lexical_cast<string>(int(dist * 100) / 100) + "." + lexical_cast<string>(int(dist * 100) % 100) + "\nDirection: " + dir_str; pango_layout->set_text(text); Gdk::Point* max_x, *min_x, *max_y, *min_y; boost::function<bool (Gdk::Point, Gdk::Point)> compare; compare = bind(less<int>(), bind(&Gdk::Point::get_x, _1), bind(&Gdk::Point::get_x, _2)); max_x = max_element(rect, rect + 4, compare); min_x = min_element(rect, rect + 4, compare); compare = bind(less<int>(), bind(&Gdk::Point::get_y, _1), bind(&Gdk::Point::get_y, _2)); max_y = max_element(rect, rect + 4, compare); min_y = min_element(rect, rect + 4, compare); barcode_center = Gdk::Point( (max_x->get_x() + min_x->get_x()) / 2, (max_y->get_y() + min_y->get_y()) / 2); const Pango::Rectangle extent = pango_layout->get_pixel_logical_extents(); cr->move_to(get_width() - extent.get_width() - 10, get_height() - extent.get_height() - 10); pango_layout->show_in_cairo_context(cr); DetectedBarcode barcode(str, dir_str, distance.calcDistance()); vector<DetectedBarcode> vec; vec.push_back(barcode); ostringstream ostr; xmlpp::Document document1; listDetectedBarcodesToXML(document1.create_root_node("ObjectList"), vec); document1.write_to_stream(ostr, "UTF-8"); mut.lock(); strXML = ostr.str(); mut.unlock(); } return true; }
bool DimRegionChooser::on_expose_event(GdkEventExpose* event) { if (!region) return true; // This is where we draw on the window Glib::RefPtr<Gdk::Window> window = get_window(); Glib::RefPtr<Pango::Context> context = get_pango_context(); Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create(context); window->clear(); // draw labels on the left (reflecting the dimension type) int y = 0; double maxwidth = 0; for (int i = 0 ; i < region->Dimensions ; i++) { int nbZones = region->pDimensionDefinitions[i].zones; if (nbZones) { const char* dstr; char dstrbuf[10]; switch (region->pDimensionDefinitions[i].dimension) { case gig::dimension_none: dstr="none"; break; case gig::dimension_samplechannel: dstr="samplechannel"; break; case gig::dimension_layer: dstr="layer"; break; case gig::dimension_velocity: dstr="velocity"; break; case gig::dimension_channelaftertouch: dstr="channelaftertouch"; break; case gig::dimension_releasetrigger: dstr="releasetrigger"; break; case gig::dimension_keyboard: dstr="keyboard"; break; case gig::dimension_roundrobin: dstr="roundrobin"; break; case gig::dimension_random: dstr="random"; break; case gig::dimension_smartmidi: dstr="smartmidi"; break; case gig::dimension_roundrobinkeyboard: dstr="roundrobinkeyboard"; break; case gig::dimension_modwheel: dstr="modwheel"; break; case gig::dimension_breath: dstr="breath"; break; case gig::dimension_foot: dstr="foot"; break; case gig::dimension_portamentotime: dstr="portamentotime"; break; case gig::dimension_effect1: dstr="effect1"; break; case gig::dimension_effect2: dstr="effect2"; break; case gig::dimension_genpurpose1: dstr="genpurpose1"; break; case gig::dimension_genpurpose2: dstr="genpurpose2"; break; case gig::dimension_genpurpose3: dstr="genpurpose3"; break; case gig::dimension_genpurpose4: dstr="genpurpose4"; break; case gig::dimension_sustainpedal: dstr="sustainpedal"; break; case gig::dimension_portamento: dstr="portamento"; break; case gig::dimension_sostenutopedal: dstr="sostenutopedal"; break; case gig::dimension_softpedal: dstr="softpedal"; break; case gig::dimension_genpurpose5: dstr="genpurpose5"; break; case gig::dimension_genpurpose6: dstr="genpurpose6"; break; case gig::dimension_genpurpose7: dstr="genpurpose7"; break; case gig::dimension_genpurpose8: dstr="genpurpose8"; break; case gig::dimension_effect1depth: dstr="effect1depth"; break; case gig::dimension_effect2depth: dstr="effect2depth"; break; case gig::dimension_effect3depth: dstr="effect3depth"; break; case gig::dimension_effect4depth: dstr="effect4depth"; break; case gig::dimension_effect5depth: dstr="effect5depth"; break; default: sprintf(dstrbuf, "%d", region->pDimensionDefinitions[i].dimension); dstr = dstrbuf; break; } layout->set_text(dstr); Pango::Rectangle rectangle = layout->get_logical_extents(); double text_w = double(rectangle.get_width()) / Pango::SCALE; if (text_w > maxwidth) maxwidth = text_w; double text_h = double(rectangle.get_height()) / Pango::SCALE; Glib::RefPtr<const Gdk::GC> fg = get_style()->get_fg_gc(get_state()); window->draw_layout(fg, 4, int(y + (h - text_h) / 2 + 0.5), layout); } y += h; } // draw dimensions' zones areas y = 0; int bitpos = 0; label_width = int(maxwidth + 10); for (int i = 0 ; i < region->Dimensions ; i++) { int nbZones = region->pDimensionDefinitions[i].zones; if (nbZones) { // draw focus rectangle around dimension's label and zones if (has_focus() && focus_line == i) { Gdk::Rectangle farea(0, y, 150, 20); get_style()->paint_focus(window, get_state(), farea, *this, "", 0, y, label_width, 20); } Glib::RefPtr<const Gdk::GC> black = get_style()->get_black_gc(); // draw top and bottom lines of dimension's zones window->draw_line(black, label_width, y, w - 1, y); window->draw_line(black, w - 1, y + h - 1, label_width, y + h - 1); // erase whole dimension's zones area window->draw_rectangle(get_style()->get_white_gc(), true, label_width + 1, y + 1, (w - label_width - 2), h - 2); int c = 0; if (dimregno >= 0) { int mask = ~(((1 << region->pDimensionDefinitions[i].bits) - 1) << bitpos); c = dimregno & mask; // mask away this dimension } bool customsplits = ((region->pDimensionDefinitions[i].split_type == gig::split_type_normal && region->pDimensionRegions[c]->DimensionUpperLimits[i]) || (region->pDimensionDefinitions[i].dimension == gig::dimension_velocity && region->pDimensionRegions[c]->VelocityUpperLimit)); // draw dimension's zone borders if (customsplits) { window->draw_line(black, label_width, y + 1, label_width, y + h - 2); for (int j = 0 ; j < nbZones ; j++) { gig::DimensionRegion *d = region->pDimensionRegions[c + (j << bitpos)]; int upperLimit = d->DimensionUpperLimits[i]; if (!upperLimit) upperLimit = d->VelocityUpperLimit; int v = upperLimit + 1; int x = int((w - label_width - 1) * v / 128.0 + 0.5); window->draw_line(black, label_width + x, y + 1, label_width + x, y + h - 2); } } else { for (int j = 0 ; j <= nbZones ; j++) { int x = int((w - label_width - 1) * j / double(nbZones) + 0.5); window->draw_line(black, label_width + x, y + 1, label_width + x, y + h - 2); } } // draw fill for currently selected zone if (dimregno >= 0) { gc->set_foreground(red); int dr = (dimregno >> bitpos) & ((1 << region->pDimensionDefinitions[i].bits) - 1); if (customsplits) { int x1 = 0; for (int j = 0 ; j < nbZones ; j++) { gig::DimensionRegion *d = region->pDimensionRegions[c + (j << bitpos)]; int upperLimit = d->DimensionUpperLimits[i]; if (!upperLimit) upperLimit = d->VelocityUpperLimit; int v = upperLimit + 1; int x2 = int((w - label_width - 1) * v / 128.0 + 0.5); if (j == dr && x1 < x2) { window->draw_rectangle(gc, true, label_width + x1 + 1, y + 1, (x2 - x1) - 1, h - 2); break; } x1 = x2; } } else { if (dr < nbZones) { int x1 = int((w - label_width - 1) * dr / double(nbZones) + 0.5); int x2 = int((w - label_width - 1) * (dr + 1) / double(nbZones) + 0.5); window->draw_rectangle(gc, true, label_width + x1 + 1, y + 1, (x2 - x1) - 1, h - 2); } } } y += h; } bitpos += region->pDimensionDefinitions[i].bits; }
virtual bool on_expose_event(GdkEventExpose* ) { Glib::RefPtr<Gdk::Drawable> drawable = get_window(); vc.get_frame(pixbuf); drawable->draw_pixbuf(get_style()->get_bg_gc(Gtk::STATE_NORMAL), pixbuf, 0, 0, 0, 0, -1 , -1, Gdk::RGB_DITHER_NONE, 0, 0); Gdk::Point rect[4], barcode_center; string str; bool res = decode_barcode(pixbuf, rect, str, 500); if (res) { Cairo::RefPtr<Cairo::Context> cr = drawable->create_cairo_context(); cr->set_line_width(3); cr->set_source_rgb(1, 0.0, 0.0); cr->move_to(rect[0].get_x(), rect[0].get_y()); cr->line_to(rect[1].get_x(), rect[1].get_y()); cr->line_to(rect[2].get_x(), rect[2].get_y()); cr->line_to(rect[3].get_x(), rect[3].get_y()); cr->line_to(rect[0].get_x(), rect[0].get_y()); cr->stroke(); DataMtxPlace distance(get_width(), get_height(), rect[0].get_x(), rect[0].get_y(), rect[1].get_x(), rect[1].get_y(), rect[2].get_x(), rect[2].get_y(), rect[3].get_x(), rect[3].get_y()); cout << "Distance: " << distance.calcDistance() << "\tSquare: " << distance.calcSquare() << "\tDirection: " << distance.calcDirection() << endl; Glib::RefPtr<Pango::Layout> pango_layout = Pango::Layout::create(cr); Pango::FontDescription desc("Arial Rounded MT Bold"); desc.set_size(14 * PANGO_SCALE); pango_layout->set_font_description(desc); pango_layout->set_alignment(Pango::ALIGN_CENTER); string text = "Msg: " + str + "\nDist: " + lexical_cast<string>(distance.calcDistance()) + "\nDir: " + lexical_cast<string>(distance.calcDirection()); pango_layout->set_text(text); Gdk::Point* max_x, *min_x, *max_y, *min_y; boost::function<bool (Gdk::Point, Gdk::Point)> compare; compare = bind(less<int>(), bind(&Gdk::Point::get_x, _1), bind(&Gdk::Point::get_x, _2)); max_x = max_element(rect, rect + 4, compare); min_x = min_element(rect, rect + 4, compare); compare = bind(less<int>(), bind(&Gdk::Point::get_y, _1), bind(&Gdk::Point::get_y, _2)); max_y = max_element(rect, rect + 4, compare); min_y = min_element(rect, rect + 4, compare); barcode_center = Gdk::Point( (max_x->get_x() + min_x->get_x()) / 2, (max_y->get_y() + min_y->get_y()) / 2); const Pango::Rectangle extent = pango_layout->get_pixel_logical_extents(); cr->move_to(barcode_center.get_x() - extent.get_width() / 2, barcode_center.get_y() - extent.get_height() / 2); pango_layout->show_in_cairo_context(cr); // cr->set_source_rgba(0, 0, 0, 0.6); // // int i = 0; // if (center_barcode.get_x() < get_width() / 3) // i = 0; // else if (center_barcode.get_x() > (2 * get_width() / 3)) // i = 2; // else // i = 1; // // cr->rectangle(i * get_width() / 3, 0, i * get_width() / 3 + get_width() / 3, get_height()); // cr->fill_preserve(); } // cr->set_source_rgba(0, 0, 0, 0.6); // cr->move_to(get_width() / 3, 0); // cr->line_to(get_width() / 3, get_height()); // cr->move_to(2 * get_width() / 3, 0); // cr->line_to(2 * get_width() / 3, get_height()); // cr->stroke(); return true; }