Beispiel #1
0
   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);
}
Beispiel #2
0
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,&note_from,&note_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() );

	}
	



}