gtkmm отрисовывает одиночные пиксели

Ссылаясь на пример в документации для Gtkmms GdkRGB< /а>:

#include <gtk/gtk.h>
#define IMAGE_WIDTH 256
#define IMAGE_HEIGHT    256
guchar rgbbuf[IMAGE_WIDTH * IMAGE_HEIGHT * 3];
gboolean on_darea_expose (GtkWidget *widget,
          GdkEventExpose *event,
          gpointer user_data);
int
main (int argc, char *argv[])
{
  GtkWidget *window, *darea;
  gint x, y;
  guchar *pos;
  gtk_init (&argc, &argv);
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  darea = gtk_drawing_area_new ();
  gtk_widget_set_size_request (darea, IMAGE_WIDTH, IMAGE_HEIGHT);
  gtk_container_add (GTK_CONTAINER (window), darea);
  gtk_signal_connect (GTK_OBJECT (darea), "expose-event",
                  GTK_SIGNAL_FUNC (on_darea_expose), NULL);
  gtk_widget_show_all (window);
  /* Set up the RGB buffer. */
  pos = rgbbuf;
  for (y = 0; y < IMAGE_HEIGHT; y++)
    {
      for (x = 0; x < IMAGE_WIDTH; x++)
    {
      *pos++ = x - x % 32;          /* Red. */
      *pos++ = (x / 32) * 4 + y - y % 32;   /* Green. */
      *pos++ = y - y % 32;          /* Blue. */
    }
    }
  gtk_main ();
  return 0;
}
gboolean
on_darea_expose (GtkWidget *widget,
     GdkEventExpose *event,
     gpointer user_data)
{
  gdk_draw_rgb_image (widget->window, widget->style->fg_gc[GTK_STATE_NORMAL],
          0, 0, IMAGE_WIDTH, IMAGE_HEIGHT,
          GDK_RGB_DITHER_MAX, rgbbuf, IMAGE_WIDTH * 3);
  return TRUE;
}

Но они говорят, что «gdk_draw_rgb_image устарел и не должен использоваться в новом коде».

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

По сути, я просто хотел бы «нарисовать» массив пикселей, который я хотел бы изменить раньше. Cairo — хороший инструмент, но не подходящий для моей цели. Поэтому rectangle не вариант.

Разве это больше не возможно?

Ну, пример, о котором я упоминал ранее, работает, но я предпочитаю не использовать устаревшие библиотеки для нового кода.

Как еще я могу рисовать свои пиксели тогда? И это пример gtk. Мы используем GtkMM, и я хотел бы знать, есть ли аналог этому.

Большое спасибо и лучшие пожелания


person Atmocreations    schedule 29.10.2011    source источник


Ответы (2)


Вы должны использовать cairo.

Все функции рисования GDK устарели и удалены в GDK 3.

Вы можете использовать GdkPixbuf http://developer.gnome.org/gdk-pixbuf/unstable//gdk-pixbuf-The-GdkPixbuf-Structure.html#GdkPixbuf с функциями взаимодействия Cairo gdk_cairo_set_source_pixbuf и gdk_cairo_rectangle http://developer.gnome.org/gdk3/stable/gdk3-Cairo-Interaction.html.

person chill    schedule 05.11.2011
comment
это может хорошо работать в gtk, но в cairomm нет метода с именем set_source_* в Cairo::Context, принимающего Pixbuf в качестве аргумента. - person Atmocreations; 09.11.2011
comment
@Atmocreations, в cairomm можно использовать Cairo::Context::set_source с Cairo::SurfacePattern, обернутым вокруг Cairo::ImageSurface. - person chill; 09.11.2011

Вы можете создать свой собственный "put_pixels(.. .)", как описано здесь. Вам нужно будет работать с пиксельным буфером.

Я также использовал этот подход.

person ArchLinuxTux    schedule 29.01.2018