static void paint (GtkWidget *widget, GdkEventExpose *eev, void * dd) { //gint width, height; Detect * d = (Detect *) dd; cairo_t *cr; cairo_t *ci; //width = widget->allocation.width; //height = widget->allocation.height; // vykreslení kreslící plochy ci = cairo_create (surface); paint_selection (ci, d); cairo_destroy (ci); cr = gdk_cairo_create (widget->window); // nastavení pozadí kreslící plochy cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); cairo_paint (cr); cairo_set_source_surface(cr, surface, 0, 0); cairo_mask_surface(cr, surface, 0, 0); cairo_destroy(cr); }
void text_display::paintEvent(QPaintEvent *event) { int offset = get_offset(); int end_offset = get_rows() * get_columns() + offset; QPainter painter(this); QColor text = palette().color(QPalette::WindowText); painter.setPen(text); painter.setFont(editor_font::get_font()); painter.setClipping(true); const bookmark_map *bookmarks = buffer->get_bookmark_map(); if(bookmarks){ for(const auto &bookmark : *bookmarks){ selection bookmark_selection = selection::create_selection( buffer->snes_to_pc(bookmark.address), bookmark.size); //non-sequential just skip if(bookmark_selection.get_end_byte() < offset || bookmark_selection.get_start_byte() > end_offset){ continue; } paint_selection(painter, bookmark_selection, bookmark.color); } } if(editor->is_comparing()){ auto diffs = editor->get_diff(); for(auto &diff : *diffs){ if(diff.get_end_byte() < offset){ continue; }else if(diff.get_start_byte() > end_offset){ //sequential, break early break; } paint_selection(painter, diff, diff_color); } } selection selection_area = get_selection(); selection_color.setAlpha(170); if(selection_area.is_active()){ paint_selection(painter, selection_area, selection_color); } painter.setClipRegion(event->region()); if(!selection_area.is_active()){ painter.setClipping(false); QPoint cursor_position = nibble_to_screen(get_cursor_nibble()); if(cursor_state && focusPolicy() != Qt::NoFocus){ painter.fillRect(cursor_position.x(), cursor_position.y(), cursor_width, editor_font::get_height(), text); } QRect active_line(0, cursor_position.y(), get_line_characters() * editor_font::get_width(), editor_font::get_height()); painter.fillRect(active_line, selection_color); } for(int i = offset, row = 0; i < end_offset; i += get_columns(), row++){ int real_row = i / get_columns(); if(!row_cache.contains(real_row)){ int line_end = i + get_columns(); if(line_end > buffer->size()){ line_end = buffer->size(); } QString line; QTextStream string_stream(&line); get_line(i, line_end, string_stream); QStaticText *text = new QStaticText(line); text->setTextFormat(Qt::PlainText); row_cache.insert(real_row, text); } if(row * editor_font::get_height() >= event->rect().y()){ painter.drawStaticText(0, row * editor_font::get_height(), *row_cache.object(real_row)); } } }
void TrackEditorPattern::draw(const GUI::Point& p_pos,const GUI::Size& p_size,const GUI::Rect& p_exposed) { Editor::get_singleton()->set_window_rows( p_size.height / get_row_height() ); GUI::Painter &p=*get_painter(); // p.set_clip_rect(false,p_exposed); //p.set_clip_rect(true,p_exposed); p.draw_fill_rect(GUI::Point(0,0),size,color(COLOR_PATTERN_BG)); paint_frames(p); paint_selection(p,p_exposed.pos.y,p_exposed.pos.y+p_exposed.size.height); int visible_rows=Editor::get_singleton()->get_window_rows(); for (int i=0;i<visible_rows;i++) { Tick from=Editor::get_singleton()->get_row_ticks( Editor::get_singleton()->get_window_offset() + i ); Tick to=from+Editor::get_singleton()->get_ticks_per_row()-1; Tick adjust=0; /* Calculate Repeat, if exists */ bool repeat=false; int blk_idx = track->get_block_at_pos( from ); int prev=track->find_block_at_pos( from ); if (blk_idx<0 && prev>=0 && track->get_block( prev )->is_repeat_enabled()) repeat=true; //printf("row %i, blkidx %i , prev %i, repeat %i\n",i,blk_idx,prev,repeat); /* If repeat, adjust from and to */ if (repeat) { Tick block_from=track->get_block_pos( prev ); Tick block_len=track->get_block( prev )->get_length(); Tick new_tick_from=block_from+(from-block_from)%block_len; adjust=from-new_tick_from; to=new_tick_from+(to-from); from=new_tick_from; } NoteList nl; { int from_block=track->find_block_at_pos(from); int to_block=track->find_block_at_pos(to); for (int b=from_block;b<=to_block;b++) { if (b<0) continue; PatternTrack::PatternBlock *block = static_cast<PatternTrack::PatternBlock*>(track->get_block(b)); Tick block_pos = track->get_block_pos(b); Tick block_len = block->get_length(); if (block_pos+block_len < from ) continue; int note_from,note_to; //printf("tick %i-%i, notes %i-%i\n",from,to,note_from,note_to); if (block->get_notes_in_local_range(from-block_pos,to-block_pos,¬e_from,¬e_to)) { for (int n=note_from;n<=note_to;n++) { NoteListElement nle; nle.pos=block->get_note_pos(n); nle.pos.tick=nle.pos.tick+block_pos-from; nle.note=block->get_note(n); nl.push_back(nle); } } } } /* Then if repeat, adjust positions */ NoteList::iterator I=nl.begin(); if (repeat) { for(;I!=nl.end();I++) { I->pos.tick+=adjust; } } if (!nl.empty()) { paint_multiple_note_events( p,i , nl, repeat ); } //paint_cursor(p,i); } paint_row_lines(p); // printf("focus %i, track %i, row %i (%i-%i)\n",(int)has_focus(),(int)Editor::get_singleton()->get_cursor_track(),(int)Editor::get_singleton()->get_cursor_row(),(int)Editor::get_singleton()->get_window_offset(),(int)(Editor::get_singleton()->get_window_offset()+visible_rows)); if ( has_focus() && Editor::get_singleton()->get_cursor_track()==song->find_track_pos(track) && Editor::get_singleton()->get_cursor_row()>=Editor::get_singleton()->get_window_offset() && Editor::get_singleton()->get_cursor_row()<(Editor::get_singleton()->get_window_offset()+visible_rows)) { /* cursor is here */ paint_cursor( p, Editor::get_singleton()->get_cursor_row()-Editor::get_singleton()->get_window_offset() ); } }