Recent

Author Topic: wrong GTK and MacOS TBGRAPixel bytes sequence.  (Read 2525 times)

mohsenti

  • Jr. Member
  • **
  • Posts: 58
wrong GTK and MacOS TBGRAPixel bytes sequence.
« on: September 17, 2016, 12:03:36 am »
Hi,
I develop application with bgrabimap git when using direct access to pixels with bgrabitmap.Data Blue and Red byte are in wrong sequence.
I add -dBGRABITMAP_BGRAPIXEL to package and problem solve.

example source :

Code: Pascal  [Select][+][-]
  1. program TransparentGtkWindow;
  2.  
  3. uses
  4.   glib2,
  5.   gdk2,
  6.   gtk2,
  7.   gtk2def,
  8.   gtk2proc,
  9.   gtk2int,
  10.   gdk2pixbuf,
  11.   gtk2extra,
  12.   cairo,
  13.   pango,
  14.   pangocairo,
  15.   BGRABitmap,
  16.   BGRABitmapTypes,
  17.   Classes,
  18.   SysUtils,
  19.   Graphics;
  20.  
  21. var
  22.   Bitmap: TBGRABitmap;
  23.  
  24.   procedure gdk_window_input_shape_combine_mask(window: PGdkWindow; mask: PGdkBitmap; x, y: GInt); cdecl; external gdklib;
  25.   function gtk_widget_get_window(widget: PGtkWidget): PGdkWindow; cdecl; external gtklib;
  26.  
  27.   procedure Destroy(widget: PGtkWidget; Data: pgpointer); cdecl;
  28.   begin
  29.     gtk_main_quit;
  30.   end;
  31.  
  32.   procedure SplashExpose(widget: PGtkWidget; event: PGdkEventExpose; userdata: GPointer); cdecl;
  33.   var
  34.     cr: Pcairo_t;
  35.  
  36.     surface: Pcairo_surface_t;
  37.   begin
  38.     cr := gdk_cairo_create(widget^.window);
  39.     cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
  40.     surface := cairo_image_surface_create_for_data(PByte(Bitmap.Data), CAIRO_FORMAT_ARGB32, Bitmap.Width, Bitmap.Height, cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, Bitmap.Width));
  41.     cairo_set_source_surface(cr, surface, 100, 100);
  42.     cairo_paint(cr);
  43.     cairo_destroy(cr);
  44.   end;
  45.  
  46.   procedure SplashScreenChanged(widget: PGtkWidget; old_screen: PGdkScreen; userdata: GPointer); cdecl;
  47.   var
  48.     Screen: PGdkScreen;
  49.     Colormap: PGdkColormap;
  50.   begin
  51.     Screen := gtk_widget_get_screen(widget);
  52.     Colormap := gdk_screen_get_rgba_colormap(Screen);
  53.     gtk_widget_set_colormap(widget, Colormap);
  54.   end;
  55.  
  56.  
  57. var
  58.   window, fixed_container, button: PGtkWidget;
  59.  
  60.   procedure clicked(win: PGtkWindow; event: PGdkEventButton; userdata: gpointer); cdecl;
  61.   begin
  62.     gtk_window_set_decorated(GTK_WINDOW(window), not gtk_window_get_decorated(GTK_WINDOW(window)));
  63.   end;
  64.  
  65. begin
  66.  
  67.   Bitmap := TBGRABitmap.Create(100, 100);
  68.   Bitmap.FillEllipseAntialias(100, 100, 100, 100, BGRA(255, 0, 0, 125));
  69.  
  70.   gtk_init(@argc, @argv);
  71.   window := gtk_window_new(GTK_WINDOW_TOPLEVEL);
  72.   gtk_widget_set_size_request(window, 500, 500);
  73.   gtk_widget_set_app_paintable(window, True);
  74.  
  75.   g_signal_connect(G_OBJECT(window), 'destroy',
  76.     GTK_SIGNAL_FUNC(@Destroy), NULL);
  77.   g_signal_connect(G_OBJECT(window), 'expose-event',
  78.     G_CALLBACK(@SplashExpose), NULL);
  79.   g_signal_connect(G_OBJECT(window), 'screen-changed',
  80.     G_CALLBACK(@SplashScreenChanged), nil);
  81.  
  82.   gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK);
  83.  
  84.   fixed_container := gtk_fixed_new();
  85.   gtk_container_add(GTK_CONTAINER(window), fixed_container);
  86.   button := gtk_button_new_with_label('button');
  87.   g_signal_connect(G_OBJECT(button), 'button-press-event', G_CALLBACK(@clicked), NULL);
  88.   gtk_widget_set_size_request(button, 150, 150);
  89.   gtk_container_add(GTK_CONTAINER(fixed_container), button);
  90.  
  91.   SplashScreenChanged(window, nil, nil);
  92.  
  93.   gtk_window_set_decorated(GTK_WINDOW(window), False);
  94.  
  95.   gtk_widget_show_all(window);
  96.   gtk_main;
  97. end.
  98.  

circular

  • Hero Member
  • *****
  • Posts: 4462
    • Personal webpage
Re: wrong GTK and MacOS TBGRAPixel bytes sequence.
« Reply #1 on: September 17, 2016, 10:34:56 am »
Yes, you can do that. Or you can call SwapRedBlue before and after using the data depending on the value of TBGRAPixel_RGBAOrder.

Cairo and gtk seem to have a different channel order.
Conscience is the debugger of the mind

 

TinyPortal © 2005-2018