comparison gtk4/dw.c @ 2280:7902be60c542

GTK4: More work on the draw and bitblt functions... still doesn't work though. Everything looks like it is working, but no display on the widget.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 03 Feb 2021 06:40:36 +0000
parents 70d666a0636f
children 0e93b09ed0e1
comparison
equal deleted inserted replaced
2279:70d666a0636f 2280:7902be60c542
5472 */ 5472 */
5473 void dw_draw_point(HWND handle, HPIXMAP pixmap, int x, int y) 5473 void dw_draw_point(HWND handle, HPIXMAP pixmap, int x, int y)
5474 { 5474 {
5475 cairo_t *cr = NULL; 5475 cairo_t *cr = NULL;
5476 GdkDrawContext *dc = NULL; 5476 GdkDrawContext *dc = NULL;
5477 const cairo_region_t *clip = NULL;
5478 5477
5479 if(handle) 5478 if(handle)
5480 { 5479 {
5481 GtkNative *native = gtk_widget_get_native(handle); 5480 GtkNative *native = gtk_widget_get_native(handle);
5482 GdkSurface *surface = gtk_native_get_surface(native); 5481 GdkSurface *surface = gtk_native_get_surface(native);
5483 5482
5484 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface)))) 5483 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface))))
5485 { 5484 {
5486 clip = gdk_draw_context_get_frame_region(dc); 5485 cairo_region_t *region = cairo_region_create();
5487 gdk_draw_context_begin_frame(dc, clip); 5486 gdk_draw_context_begin_frame(dc, region);
5488 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc)); 5487 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc));
5488 cairo_region_destroy(region);
5489 } 5489 }
5490 else 5490 else
5491 return; 5491 return;
5492 } 5492 }
5493 else if(pixmap) 5493 else if(pixmap)
5521 */ 5521 */
5522 void dw_draw_line(HWND handle, HPIXMAP pixmap, int x1, int y1, int x2, int y2) 5522 void dw_draw_line(HWND handle, HPIXMAP pixmap, int x1, int y1, int x2, int y2)
5523 { 5523 {
5524 cairo_t *cr = NULL; 5524 cairo_t *cr = NULL;
5525 GdkDrawContext *dc = NULL; 5525 GdkDrawContext *dc = NULL;
5526 const cairo_region_t *clip = NULL;
5527 5526
5528 if(handle) 5527 if(handle)
5529 { 5528 {
5530 GtkNative *native = gtk_widget_get_native(handle); 5529 GtkNative *native = gtk_widget_get_native(handle);
5531 GdkSurface *surface = gtk_native_get_surface(native); 5530 GdkSurface *surface = gtk_native_get_surface(native);
5532 5531
5533 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface)))) 5532 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface))))
5534 { 5533 {
5535 clip = gdk_draw_context_get_frame_region(dc); 5534 cairo_region_t *region = cairo_region_create();
5536 gdk_draw_context_begin_frame(dc, clip); 5535 gdk_draw_context_begin_frame(dc, region);
5537 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc)); 5536 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc));
5537 cairo_region_destroy(region);
5538 } 5538 }
5539 else 5539 else
5540 return; 5540 return;
5541 } 5541 }
5542 else if(pixmap) 5542 else if(pixmap)
5548 gdk_cairo_set_source_rgba(cr, foreground); 5548 gdk_cairo_set_source_rgba(cr, foreground);
5549 cairo_set_line_width(cr, 1); 5549 cairo_set_line_width(cr, 1);
5550 cairo_move_to(cr, x1, y1); 5550 cairo_move_to(cr, x1, y1);
5551 cairo_line_to(cr, x2, y2); 5551 cairo_line_to(cr, x2, y2);
5552 cairo_stroke(cr); 5552 cairo_stroke(cr);
5553 /* If we are using a drawing context... 5553 /* If we are using a drawing context...
5554 * we don't own the cairo context so don't destroy it. 5554 * we don't own the cairo context so don't destroy it.
5555 */ 5555 */
5556 if(dc) 5556 if(dc)
5557 gdk_draw_context_end_frame(dc); 5557 gdk_draw_context_end_frame(dc);
5558 else 5558 else
5572 void dw_draw_polygon(HWND handle, HPIXMAP pixmap, int flags, int npoints, int *x, int *y) 5572 void dw_draw_polygon(HWND handle, HPIXMAP pixmap, int flags, int npoints, int *x, int *y)
5573 { 5573 {
5574 cairo_t *cr = NULL; 5574 cairo_t *cr = NULL;
5575 int z; 5575 int z;
5576 GdkDrawContext *dc = NULL; 5576 GdkDrawContext *dc = NULL;
5577 const cairo_region_t *clip = NULL;
5578 5577
5579 if(handle) 5578 if(handle)
5580 { 5579 {
5581 GtkNative *native = gtk_widget_get_native(handle); 5580 GtkNative *native = gtk_widget_get_native(handle);
5582 GdkSurface *surface = gtk_native_get_surface(native); 5581 GdkSurface *surface = gtk_native_get_surface(native);
5583 5582
5584 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface)))) 5583 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface))))
5585 { 5584 {
5586 clip = gdk_draw_context_get_frame_region(dc); 5585 cairo_region_t *region = cairo_region_create();
5587 gdk_draw_context_begin_frame(dc, clip); 5586 gdk_draw_context_begin_frame(dc, region);
5588 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc)); 5587 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc));
5588 cairo_region_destroy(region);
5589 } 5589 }
5590 else 5590 else
5591 return; 5591 return;
5592 } 5592 }
5593 else if(pixmap) 5593 else if(pixmap)
5607 cairo_line_to(cr, x[z], y[z]); 5607 cairo_line_to(cr, x[z], y[z]);
5608 } 5608 }
5609 if(flags & DW_DRAW_FILL) 5609 if(flags & DW_DRAW_FILL)
5610 cairo_fill(cr); 5610 cairo_fill(cr);
5611 cairo_stroke(cr); 5611 cairo_stroke(cr);
5612 /* If we are using a drawing context... 5612 /* If we are using a drawing context...
5613 * we don't own the cairo context so don't destroy it. 5613 * we don't own the cairo context so don't destroy it.
5614 */ 5614 */
5615 if(dc) 5615 if(dc)
5616 gdk_draw_context_end_frame(dc); 5616 gdk_draw_context_end_frame(dc);
5617 else 5617 else
5631 */ 5631 */
5632 void dw_draw_rect(HWND handle, HPIXMAP pixmap, int flags, int x, int y, int width, int height) 5632 void dw_draw_rect(HWND handle, HPIXMAP pixmap, int flags, int x, int y, int width, int height)
5633 { 5633 {
5634 cairo_t *cr = NULL; 5634 cairo_t *cr = NULL;
5635 GdkDrawContext *dc = NULL; 5635 GdkDrawContext *dc = NULL;
5636 const cairo_region_t *clip = NULL;
5637 5636
5638 if(handle) 5637 if(handle)
5639 { 5638 {
5640 GtkNative *native = gtk_widget_get_native(handle); 5639 GtkNative *native = gtk_widget_get_native(handle);
5641 GdkSurface *surface = gtk_native_get_surface(native); 5640 GdkSurface *surface = gtk_native_get_surface(native);
5642 5641
5643 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface)))) 5642 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface))))
5644 { 5643 {
5645 clip = gdk_draw_context_get_frame_region(dc); 5644 cairo_region_t *region = cairo_region_create();
5646 gdk_draw_context_begin_frame(dc, clip); 5645 gdk_draw_context_begin_frame(dc, region);
5647 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc)); 5646 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc));
5647 cairo_region_destroy(region);
5648 } 5648 }
5649 else 5649 else
5650 return; 5650 return;
5651 } 5651 }
5652 else if(pixmap) 5652 else if(pixmap)
5665 cairo_line_to(cr, x + width, y + height); 5665 cairo_line_to(cr, x + width, y + height);
5666 cairo_line_to(cr, x + width, y); 5666 cairo_line_to(cr, x + width, y);
5667 if(flags & DW_DRAW_FILL) 5667 if(flags & DW_DRAW_FILL)
5668 cairo_fill(cr); 5668 cairo_fill(cr);
5669 cairo_stroke(cr); 5669 cairo_stroke(cr);
5670 /* If we are using a drawing context... 5670 /* If we are using a drawing context...
5671 * we don't own the cairo context so don't destroy it. 5671 * we don't own the cairo context so don't destroy it.
5672 */ 5672 */
5673 if(dc) 5673 if(dc)
5674 gdk_draw_context_end_frame(dc); 5674 gdk_draw_context_end_frame(dc);
5675 else 5675 else
5692 */ 5692 */
5693 void API dw_draw_arc(HWND handle, HPIXMAP pixmap, int flags, int xorigin, int yorigin, int x1, int y1, int x2, int y2) 5693 void API dw_draw_arc(HWND handle, HPIXMAP pixmap, int flags, int xorigin, int yorigin, int x1, int y1, int x2, int y2)
5694 { 5694 {
5695 cairo_t *cr = NULL; 5695 cairo_t *cr = NULL;
5696 GdkDrawContext *dc = NULL; 5696 GdkDrawContext *dc = NULL;
5697 const cairo_region_t *clip = NULL;
5698 5697
5699 if(handle) 5698 if(handle)
5700 { 5699 {
5701 GtkNative *native = gtk_widget_get_native(handle); 5700 GtkNative *native = gtk_widget_get_native(handle);
5702 GdkSurface *surface = gtk_native_get_surface(native); 5701 GdkSurface *surface = gtk_native_get_surface(native);
5703 5702
5704 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface)))) 5703 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface))))
5705 { 5704 {
5706 clip = gdk_draw_context_get_frame_region(dc); 5705 cairo_region_t *region = cairo_region_create();
5707 gdk_draw_context_begin_frame(dc, clip); 5706 gdk_draw_context_begin_frame(dc, region);
5708 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc)); 5707 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc));
5708 cairo_region_destroy(region);
5709 } 5709 }
5710 else 5710 else
5711 return; 5711 return;
5712 } 5712 }
5713 else if(pixmap) 5713 else if(pixmap)
5738 cairo_arc(cr, xorigin, yorigin, r, a1, a2); 5738 cairo_arc(cr, xorigin, yorigin, r, a1, a2);
5739 } 5739 }
5740 if(flags & DW_DRAW_FILL) 5740 if(flags & DW_DRAW_FILL)
5741 cairo_fill(cr); 5741 cairo_fill(cr);
5742 cairo_stroke(cr); 5742 cairo_stroke(cr);
5743 /* If we are using a drawing context... 5743 /* If we are using a drawing context...
5744 * we don't own the cairo context so don't destroy it. 5744 * we don't own the cairo context so don't destroy it.
5745 */ 5745 */
5746 if(dc) 5746 if(dc)
5747 gdk_draw_context_end_frame(dc); 5747 gdk_draw_context_end_frame(dc);
5748 else 5748 else
5762 { 5762 {
5763 cairo_t *cr = NULL; 5763 cairo_t *cr = NULL;
5764 PangoFontDescription *font; 5764 PangoFontDescription *font;
5765 char *tmpname, *fontname = "monospace 10"; 5765 char *tmpname, *fontname = "monospace 10";
5766 GdkDrawContext *dc = NULL; 5766 GdkDrawContext *dc = NULL;
5767 const cairo_region_t *clip = NULL;
5768 5767
5769 if(!text) 5768 if(!text)
5770 return; 5769 return;
5771 5770
5772 if(handle) 5771 if(handle)
5774 GtkNative *native = gtk_widget_get_native(handle); 5773 GtkNative *native = gtk_widget_get_native(handle);
5775 GdkSurface *surface = gtk_native_get_surface(native); 5774 GdkSurface *surface = gtk_native_get_surface(native);
5776 5775
5777 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface)))) 5776 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface))))
5778 { 5777 {
5779 clip = gdk_draw_context_get_frame_region(dc); 5778 cairo_region_t *region = cairo_region_create();
5780 gdk_draw_context_begin_frame(dc, clip); 5779 gdk_draw_context_begin_frame(dc, region);
5781 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc)); 5780 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc));
5781 cairo_region_destroy(region);
5782 } 5782 }
5783 else 5783 else
5784 return; 5784 return;
5785 if((tmpname = (char *)g_object_get_data(G_OBJECT(handle), "_dw_fontname"))) 5785 if((tmpname = (char *)g_object_get_data(G_OBJECT(handle), "_dw_fontname")))
5786 fontname = tmpname; 5786 fontname = tmpname;
6158 */ 6158 */
6159 int API dw_pixmap_stretch_bitblt(HWND dest, HPIXMAP destp, int xdest, int ydest, int width, int height, HWND src, HPIXMAP srcp, int xsrc, int ysrc, int srcwidth, int srcheight) 6159 int API dw_pixmap_stretch_bitblt(HWND dest, HPIXMAP destp, int xdest, int ydest, int width, int height, HWND src, HPIXMAP srcp, int xsrc, int ysrc, int srcwidth, int srcheight)
6160 { 6160 {
6161 cairo_t *cr = NULL; 6161 cairo_t *cr = NULL;
6162 int retval = DW_ERROR_GENERAL; 6162 int retval = DW_ERROR_GENERAL;
6163 GdkDrawingContext *dc = NULL; 6163 GdkDrawContext *dc = NULL;
6164 cairo_region_t *clip = NULL;
6165 6164
6166 if((!dest && (!destp || !destp->image)) || (!src && (!srcp || !srcp->image))) 6165 if((!dest && (!destp || !destp->image)) || (!src && (!srcp || !srcp->image)))
6167 return retval; 6166 return retval;
6168 6167
6169 if(dest) 6168 if(dest)
6170 { 6169 {
6171 /* TODO: Figure out how to do this in GTK4 with no GdkWindow */ 6170 GtkNative *native = gtk_widget_get_native(dest);
6172 #if GTK3 6171 GdkSurface *surface = gtk_native_get_surface(native);
6173 GdkWindow *window = gtk_widget_get_window(dest); 6172
6174 /* Safety check for non-existant windows */ 6173 if((dc = GDK_DRAW_CONTEXT(gdk_surface_create_cairo_context(surface))))
6175 if(!window || !GDK_IS_WINDOW(window)) 6174 {
6175 cairo_region_t *region = cairo_region_create();
6176 gdk_draw_context_begin_frame(dc, region);
6177 cr = gdk_cairo_context_cairo_create(GDK_CAIRO_CONTEXT(dc));
6178 cairo_region_destroy(region);
6179 }
6180 else
6176 return retval; 6181 return retval;
6177 clip = gdk_window_get_clip_region(window);
6178 dc = gdk_window_begin_draw_frame(window, clip);
6179 cr = gdk_drawing_context_get_cairo_context(dc);
6180 #endif
6181 } 6182 }
6182 else if(destp) 6183 else if(destp)
6183 cr = cairo_create(destp->image); 6184 cr = cairo_create(destp->image);
6184 6185
6185 if(cr) 6186 if(cr)
6201 else if(srcp) 6202 else if(srcp)
6202 cairo_set_source_surface (cr, srcp->image, (xdest + xsrc) / xscale, (ydest + ysrc) / yscale); 6203 cairo_set_source_surface (cr, srcp->image, (xdest + xsrc) / xscale, (ydest + ysrc) / yscale);
6203 6204
6204 cairo_rectangle(cr, xdest / xscale, ydest / yscale, width, height); 6205 cairo_rectangle(cr, xdest / xscale, ydest / yscale, width, height);
6205 cairo_fill(cr); 6206 cairo_fill(cr);
6206 if(clip)
6207 cairo_region_destroy(clip);
6208 /* TODO: Figure out how to do this in GTK4 with no GdkWindow */
6209 #if GTK3
6210 /* If we are using a drawing context... 6207 /* If we are using a drawing context...
6211 * we don't own the cairo context so don't destroy it. 6208 * we don't own the cairo context so don't destroy it.
6212 */ 6209 */
6213 if(dc) 6210 if(dc)
6214 gdk_window_end_draw_frame(gtk_widget_get_window(dest), dc); 6211 gdk_draw_context_end_frame(dc);
6215 else 6212 else
6216 #else
6217 if(!dc)
6218 #endif
6219 cairo_destroy(cr); 6213 cairo_destroy(cr);
6220 retval = DW_ERROR_NONE; 6214 retval = DW_ERROR_NONE;
6221 } 6215 }
6222 return retval; 6216 return retval;
6223 } 6217 }