LINUX.ORG.RU

Более опытные товарищи поправят, если такой способ существует на чистом gtk, я бы посоветовал копать в сторону clutter, может там что-нибудь такое можно.

CrossFire ★★★★★
()

Создаёшь свой виджет, переопределяешь обработчик expose и вперед. Или цель - рисовать в чужом окне?

yoghurt ★★★★★
()
Ответ на: комментарий от CrossFire

>Более опытные товарищи поправят, если такой способ существует на чистом gtk, я бы посоветовал копать в сторону clutter, может там что-нибудь такое можно.
Клаттер двигает готовые окошки и их модифицирует. Это ВМ такой. Рисование все происходит в кайро.

petrosha ★★★★★
()
Ответ на: комментарий от mono

>Когда Clutter стал WM'ом?
Ок, надо было поставить табличку «Сарказм»
Но тем не менее, сам клаттер ничего не рисует.

petrosha ★★★★★
()
Ответ на: комментарий от CrossFire

>Точно Clutter и Mutter не перепутал?
Муттер сделан с помощью Клаттер, который оперирует гтк окнами, которые рисуются кайром...

я нигде не ошибся?

petrosha ★★★★★
()
Ответ на: комментарий от petrosha

Сарказм? Что по-твоему Clutter? Почему он ничего не рисует?

CrossFire ★★★★★
()
Ответ на: комментарий от petrosha

Ошибся. Clutter — свободная графическая библиотека для создания аппаратно ускоренных пользовательских интерфейсов. Он использует OpenGL или OpenGL ES для рендеринга. Mutter тут ну вообще никаким боком.

CrossFire ★★★★★
()
Ответ на: комментарий от Eddy_Em

Я, наверно, не совсем точно сформулировал вопрос. Расскажу подробно: у меня есть gtk-окно cо всякими виджетами и drawingarea, в которой я рисую openGL-ем. Так вот, в области этой самой drawingarea мне надо добавить еще несколько линий и окружностей, позиции и размер которых можно менять. Это я и хочу сделать с помощью Cairo

Vitaly1988
() автор топика
Ответ на: комментарий от CrossFire

>Clutter — свободная графическая библиотека для создания аппаратно ускоренных пользовательских интерфейсов.
http://docs.clutter-project.org/docs/clutter/stable/
Найди тут рисовальное АПИ.

Mutter тут ну вообще никаким боком.

1. Ну ты сам про него начал.
2. Цитато - Mutter is the window manager for which GNOME Shell is a plugin in GNOME 3, replacing Metacity[1]. Mutter is the Short form of Metacity Clutter[2]. It uses a graphics library called Clutter. It also supports OpenGL by Clutter.

Я не претендую на абсолютную правду, но Клаттер вроде бы расчитан на работу с Actors и основной его функционал - вертеть, крутить и тп эти самые экторы. А рисовать эти ЭКторы предлагается с помощью кайро. И они очень похожи на ГТК шные виджеты.



petrosha ★★★★★
()
Ответ на: комментарий от Vitaly1988

Я и сам такое делал, но поверх openGL'я рисовать при помощи cairo не советую, если у вас графика «тяжелая», лучше использовать «рисовалку» gtk, которая, хоть и deprecated, зато позволяет использовать маску XOR, благодаря чему подложку не надо перерисовывать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от petrosha

>>Clutter — свободная графическая библиотека для создания аппаратно >>ускоренных пользовательских интерфейсов.

http://docs.clutter-project.org/docs/clutter/stable/

Найди тут рисовальное АПИ.



Цитата с википедии, если что.


Клаттер двигает готовые окошки и их модифицирует. Это ВМ такой


Клаттер не ВМ, я и спросил, мб с Mutter перепутал, единственный ВМ с похожим названием.

CrossFire ★★★★★
()
Ответ на: комментарий от CrossFire

>Клаттер не ВМ, я и спросил, мб с Mutter перепутал, единственный ВМ с похожим названием.
Я имел ввиду что клаттер «двигает» акторы. ВМ надо было взять в ковычечки.

Что касается аппаратно ускоренной библиотеки создания пользовательских интерфейсов, то это таки правда:) Вопрос что библиотека делает для создания этих интерфейсов, а для чего используются другие библиотеки.

Собственно, фиг с ним, более интересным для меня было то, что клаттер использует гобжекты.

petrosha ★★★★★
()
Ответ на: комментарий от Eddy_Em

С трудом представляю как наложить XOR-маску... Можете дать какую-нибудь ссылку на пример как это реализуется?

Vitaly1988
() автор топика
Ответ на: комментарий от Vitaly1988

Ну вот, например:

        GdkDrawable *d = window->drawingArea->window;
        static GdkGC *gc = NULL;
        if(!gc){
                gc = gdk_gc_new(d);
                gdk_gc_set_foreground(gc, &(window->drawingArea->style->white));
                gdk_gc_set_function(gc, GDK_XOR);
        }
        if(c->drawingMode == DRAW_QUAD){ // рисуем прямоугольник
                draw_rect(d, gc, x_1,y_1, xold,yold);
                draw_rect(d, gc, x_1,y_1, x_2,y_2);
        }
        else{ // рисуем линию
                // сначала стираем старую линию и концевой крест
                gdk_draw_line(d, gc, x_1,y_1, xold,yold);
                draw_cross(d, gc, xold, yold);
                // а затем рисуем новую
                gdk_draw_line(d, gc, x_1,y_1, x_2,y_2);
                draw_cross(d, gc, x_2, y_2);
                get_data(X0, X, Y0, Y, window);
                bot_X = 0.; top_X = gXm;
                gchar str[80];
                g_snprintf(str, 79, "length=%.1f, angle=%.1fdegr",
                                        sqrt((X-X0)*(X-X0)+(Y-Y0)*(Y-Y0)),
                                        atan2(Y-Y0,X-X0)/M_PI*180.);
                set_status_text(StatusText, str, window->parent);
                set_status_text(StatusText, "", window);
                Gconfigure(window->graphWindow);
                gdk_window_invalidate_rect(window->graphWindow->drawingArea->window,
                        NULL, TRUE);
        }
(я так рисую линию трека или прямоугольник вокруг выделенной области).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Попробовал вывести линию поверх openGL-я - линия выводится, но мерцает (похоже, при перерировке в openGl) С cairo - тот же самый эффект...

Vitaly1988
() автор топика
Ответ на: комментарий от Vitaly1988

Естественно, вам надо в обработчик сигнала отрисовки (expose) добавить рисование нужных линий после обновления содержимого виджета с openGL'ем.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Куда только не засовывал рисование этих линий...) Упростил свой код: рисую прямоугольник в openGL, прямоугольник в Cairo и линию в GDK. Если можно, посмотрите, пожалуйста, в чем проблема..

#include <glade/glade.h>
#include <gtk/gtk.h>
#include <gtk/gtkgl.h>
#include <GL/gl.h>

  GdkGLConfig *glconfig;
  GladeXML *xml;
  GtkWidget *window1;
  GtkWidget *drawingarea1;

static gboolean idle (GtkWidget *widget)
{
 /* Invalidate the whole window. */
  gdk_window_invalidate_rect (widget->window, &widget->allocation, FALSE);
  /* Update synchronously. */
  gdk_window_process_updates (widget->window, FALSE);
  return TRUE;
}


gboolean on_window1_delete_event (GtkWidget *widget,GdkEvent  *event, gpointer   user_data)
{
  gtk_main_quit ();
  return FALSE;
}

void on_drawingarea1_realize (GtkWidget *widget, gpointer   user_data)
{ 
  GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
  GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);

  if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))  /*** OpenGL BEGIN ***/
    return;

	  glViewport (0, 0, 900, 900);
	  glMatrixMode (GL_PROJECTION);
	  glLoadIdentity ();
	  glOrtho (-900/2, 900/2, -900/2, 900/2, -1, 1);
	  glMatrixMode (GL_MODELVIEW);
	  glLoadIdentity();
 	  g_timeout_add_full (GDK_PRIORITY_REDRAW,0,
                                 (GSourceFunc) idle,
                                 widget,
                                 NULL);

  gdk_gl_drawable_gl_end (gldrawable);  /*** OpenGL END ***/

}


gboolean
on_drawingarea1_expose_event (GtkWidget *widget, GdkEventExpose  *event, gpointer user_data)
{  
  GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
  GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget); 

  if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))/*** OpenGL BEGIN ***/
    return;

glColor3f(0.0,1,0.0);
glBegin(GL_QUADS);
 glVertex2f(0, -100);
 glVertex2f(0, 100);
 glVertex2f(200,100);
 glVertex2f(200,-100);
glEnd();

  gdk_gl_drawable_swap_buffers (gldrawable);  /* Swap buffers */
  gdk_gl_drawable_gl_end (gldrawable);  /*** OpenGL END ***/


//Рисуем прямоугольник в кайро///
  cairo_t *cr;
  cr = gdk_cairo_create (widget->window);
    
    cairo_rectangle (cr, 440, 450, 100, 10);
    cairo_stroke_preserve(cr);
    cairo_set_source_rgb(cr, 1, 0, 0); 

  cairo_fill(cr);
  cairo_destroy(cr);

//Рисуем линию в GDK//
 gdk_draw_line (widget->window,
		widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
                  0, 0, 500, 500);

  return TRUE;
}



int
main (int   argc,      char *argv[])
{
  gtk_init (&argc, &argv);
  gtk_gl_init (&argc, &argv);
  glconfig = gdk_gl_config_new_by_mode (
					GDK_GL_MODE_RGB    |
                                        GDK_GL_MODE_DEPTH  |
                                        GDK_GL_MODE_DOUBLE
				       );

  xml = glade_xml_new ("simple.glade", NULL, NULL);
  glade_xml_signal_autoconnect (xml);
  window1 = glade_xml_get_widget (xml, "window1");
  drawingarea1 = glade_xml_get_widget (xml, "drawingarea1");
  gtk_window_fullscreen(GTK_WINDOW (window1));
  gtk_widget_set_gl_capability (drawingarea1,
                                glconfig,
                                NULL,
                                TRUE,
                                GDK_GL_RGBA_TYPE);
  gtk_widget_show (window1);
  gtk_main ();
  return 0;
}
Vitaly1988
() автор топика
Ответ на: комментарий от Vitaly1988

А в чем проблема-то? Вообще не рисует, или не рисует только что-то определенное? Функция on_drawingarea1_realize, я так понимаю, сигнал realize обрабатывает? Может, стоит этот сигнал «выбросить», а ее поставить на обработку сигнала configure?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Рисует все, но с мерцанием(причем GDK и Cairo мерцают синхронно). Да, on_drawingarea1_realize для сигнала realize. Попробую выбросить...

Vitaly1988
() автор топика
Ответ на: комментарий от Vitaly1988

Мерцает он у вас потому, что вы зачем-то обрабатываете сигнал idle. Уберите его, перерисовывать картинку надо только когда вам ее действительно надо перерисовывать, а не 100500 раз в секунду.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

В OpenGl у меня на самом деле анимация - и перерисовка необходима, тут я оставил только квадрат, чтобы не загромождать код

Vitaly1988
() автор топика
Ответ на: комментарий от Vitaly1988

Ну вы тогда хотя бы скорость отрисовки ограничьте: в openGL'ном виджете-то вы swapbuffers делаете, а вот другая графика будет мерцать.

А почему бы вам не рисовать прямо средствами openGL?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Скорость отрисовки и так маленькая по сравнению с необходимой. Пробовал рисовать эти линии в OpenGL, но я не очищаю цветовой буфер, чтобы сохранить на экране уже нарисованные объекты. Поэтому при поворотах и движении этих линий, за ними остаются ненужные следы - на месте предыдущего положения..

Vitaly1988
() автор топика
Ответ на: комментарий от Vitaly1988

пробовал включать буфер аккумулятора, чтобы иметь возможность очищать цветовой буфер, но так все ужасно тормозит из-за большого количества рисуемых объектов

Vitaly1988
() автор топика
Ответ на: комментарий от Vitaly1988

пробовал еще рисовать линии в прозрачном всплывающем окне, но, линии рисуются с той же прозрачностью.

Vitaly1988
() автор топика
Ответ на: комментарий от Vitaly1988

может быть существует что-то вроде всплывающих линий?

Vitaly1988
() автор топика
Ответ на: комментарий от Vitaly1988

Может, воспользуетесь VBO?

Мне тут недавно подсказали вместо списков VBO использовать, скорость сильно возросла: картинка из ~18млн треугольников вращается вполне сносно, без тормозов.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

> Подсказываю - есть.
Спасибо за столь подробный ответ!

Vitaly1988
() автор топика
Ответ на: комментарий от Eddy_Em

Встроенная видеокарта Intel gma x4500. VBO вроде бы поддерживается, но нет своей памяти - берет ее из оперативки... Особого прироста производительности не заметил.

Vitaly1988
() автор топика

man set_app_paintable(TRUE)

после этого можешь подключиться к сигналу отрисовки, и орудовать чего пожелаешь. сложенные виджеты не подвержены этому флагу

ckotinko ☆☆☆
()
Ответ на: комментарий от Vitaly1988

Просто прочитав ваше

В OpenGl у меня на самом деле анимация

я решил, что у вас нормальная видеокарта. А на интеловских недовидеокартах не анимация, а медленное слайдшоу...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Есть идея перенести рисование в OpenGl непосредственно в главное окно(если такое возможно???), а в drawingarea рисовать эти самые линии заливая всю незарисованную область прозрачным фоном. Как Вы думаете, поможет?

Vitaly1988
() автор топика
Ответ на: комментарий от Vitaly1988

С первого раза не получилось.. При запуске выдает такую вот ошибку:

GdkGLExt-CRITICAL **: gdk_gl_drawable_gl_begin: assertion `GDK_IS_GL_DRAWABLE (gldrawable)' failed

The program 'simple' received an X Window System error. This probably reflects a bug in the program. The error was 'BadMatch (invalid parameter attributes)'. (Details: serial 1748 error_code 8 request_code 155 minor_code 11) (Note to programmers: normally, X errors are reported asynchronously; that is, you will receive the error a while after causing it. To debug your program, run it with the --sync command line option to change this behavior. You can then get a meaningful backtrace from your debugger if you break on the gdk_x_error() function.)

Vitaly1988
() автор топика
Ответ на: комментарий от Vitaly1988

Посмотрите здесь (файлы opengl.c и tracking.c), может поможет..

Есть идея перенести рисование в OpenGl непосредственно в главное окно(если такое возможно???), а в drawingarea рисовать эти самые линии заливая всю незарисованную область прозрачным фоном.

Не получится. Либо рисуете openGL'ем в отдельном glut'овом окне, либо - при помощи gtgglext'а в drawingarea.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.