Mercurial > dwindows
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 } |