Mercurial > dwindows
comparison gtk3/dw.c @ 1930:fe04bcfd5b65
GTK3: Need to use cairo region in that new code or else drawing functions
crash.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Fri, 02 Jun 2017 23:25:15 +0000 |
parents | 25da63f0eddc |
children | 3a5571255ee6 |
comparison
equal
deleted
inserted
replaced
1929:25da63f0eddc | 1930:fe04bcfd5b65 |
---|---|
7170 { | 7170 { |
7171 int _locked_by_me = FALSE; | 7171 int _locked_by_me = FALSE; |
7172 cairo_t *cr = NULL; | 7172 cairo_t *cr = NULL; |
7173 #if GTK_CHECK_VERSION(3,22,0) | 7173 #if GTK_CHECK_VERSION(3,22,0) |
7174 GdkDrawingContext *dc = NULL; | 7174 GdkDrawingContext *dc = NULL; |
7175 cairo_region_t *clip = NULL; | |
7175 #endif | 7176 #endif |
7176 | 7177 |
7177 DW_MUTEX_LOCK; | 7178 DW_MUTEX_LOCK; |
7178 if(handle) | 7179 if(handle) |
7179 { | 7180 { |
7183 { | 7184 { |
7184 DW_MUTEX_UNLOCK; | 7185 DW_MUTEX_UNLOCK; |
7185 return; | 7186 return; |
7186 } | 7187 } |
7187 #if GTK_CHECK_VERSION(3,22,0) | 7188 #if GTK_CHECK_VERSION(3,22,0) |
7188 dc = gdk_window_begin_draw_frame(window, NULL); | 7189 clip = gdk_window_get_clip_region(window); |
7190 dc = gdk_window_begin_draw_frame(window, clip); | |
7189 cr = gdk_drawing_context_get_cairo_context(dc); | 7191 cr = gdk_drawing_context_get_cairo_context(dc); |
7190 #else | 7192 #else |
7191 cr = gdk_cairo_create(window); | 7193 cr = gdk_cairo_create(window); |
7192 #endif | 7194 #endif |
7193 } | 7195 } |
7200 gdk_cairo_set_source_rgba(cr, foreground); | 7202 gdk_cairo_set_source_rgba(cr, foreground); |
7201 cairo_set_line_width(cr, 1); | 7203 cairo_set_line_width(cr, 1); |
7202 cairo_move_to(cr, x, y); | 7204 cairo_move_to(cr, x, y); |
7203 cairo_stroke(cr); | 7205 cairo_stroke(cr); |
7204 #if GTK_CHECK_VERSION(3,22,0) | 7206 #if GTK_CHECK_VERSION(3,22,0) |
7207 if(clip) | |
7208 cairo_region_destroy(clip); | |
7205 /* If we are using a drawing context... | 7209 /* If we are using a drawing context... |
7206 * we don't own the cairo context so don't destroy it. | 7210 * we don't own the cairo context so don't destroy it. |
7207 */ | 7211 */ |
7208 if(!dc) | 7212 if(dc) |
7213 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc); | |
7214 else | |
7209 #endif | 7215 #endif |
7210 cairo_destroy(cr); | 7216 cairo_destroy(cr); |
7211 } | 7217 } |
7212 DW_MUTEX_UNLOCK; | 7218 DW_MUTEX_UNLOCK; |
7213 } | 7219 } |
7225 { | 7231 { |
7226 int _locked_by_me = FALSE; | 7232 int _locked_by_me = FALSE; |
7227 cairo_t *cr = NULL; | 7233 cairo_t *cr = NULL; |
7228 #if GTK_CHECK_VERSION(3,22,0) | 7234 #if GTK_CHECK_VERSION(3,22,0) |
7229 GdkDrawingContext *dc = NULL; | 7235 GdkDrawingContext *dc = NULL; |
7236 cairo_region_t *clip = NULL; | |
7230 #endif | 7237 #endif |
7231 | 7238 |
7232 DW_MUTEX_LOCK; | 7239 DW_MUTEX_LOCK; |
7233 if(handle) | 7240 if(handle) |
7234 { | 7241 { |
7238 { | 7245 { |
7239 DW_MUTEX_UNLOCK; | 7246 DW_MUTEX_UNLOCK; |
7240 return; | 7247 return; |
7241 } | 7248 } |
7242 #if GTK_CHECK_VERSION(3,22,0) | 7249 #if GTK_CHECK_VERSION(3,22,0) |
7243 dc = gdk_window_begin_draw_frame(window, NULL); | 7250 clip = gdk_window_get_clip_region(window); |
7251 dc = gdk_window_begin_draw_frame(window, clip); | |
7244 cr = gdk_drawing_context_get_cairo_context(dc); | 7252 cr = gdk_drawing_context_get_cairo_context(dc); |
7245 #else | 7253 #else |
7246 cr = gdk_cairo_create(window); | 7254 cr = gdk_cairo_create(window); |
7247 #endif | 7255 #endif |
7248 } | 7256 } |
7256 cairo_set_line_width(cr, 1); | 7264 cairo_set_line_width(cr, 1); |
7257 cairo_move_to(cr, x1, y1); | 7265 cairo_move_to(cr, x1, y1); |
7258 cairo_line_to(cr, x2, y2); | 7266 cairo_line_to(cr, x2, y2); |
7259 cairo_stroke(cr); | 7267 cairo_stroke(cr); |
7260 #if GTK_CHECK_VERSION(3,22,0) | 7268 #if GTK_CHECK_VERSION(3,22,0) |
7269 if(clip) | |
7270 cairo_region_destroy(clip); | |
7261 /* If we are using a drawing context... | 7271 /* If we are using a drawing context... |
7262 * we don't own the cairo context so don't destroy it. | 7272 * we don't own the cairo context so don't destroy it. |
7263 */ | 7273 */ |
7264 if(!dc) | 7274 if(dc) |
7275 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc); | |
7276 else | |
7265 #endif | 7277 #endif |
7266 cairo_destroy(cr); | 7278 cairo_destroy(cr); |
7267 } | 7279 } |
7268 DW_MUTEX_UNLOCK; | 7280 DW_MUTEX_UNLOCK; |
7269 } | 7281 } |
7282 int _locked_by_me = FALSE; | 7294 int _locked_by_me = FALSE; |
7283 cairo_t *cr = NULL; | 7295 cairo_t *cr = NULL; |
7284 int z; | 7296 int z; |
7285 #if GTK_CHECK_VERSION(3,22,0) | 7297 #if GTK_CHECK_VERSION(3,22,0) |
7286 GdkDrawingContext *dc = NULL; | 7298 GdkDrawingContext *dc = NULL; |
7299 cairo_region_t *clip = NULL; | |
7287 #endif | 7300 #endif |
7288 | 7301 |
7289 DW_MUTEX_LOCK; | 7302 DW_MUTEX_LOCK; |
7290 if(handle) | 7303 if(handle) |
7291 { | 7304 { |
7295 { | 7308 { |
7296 DW_MUTEX_UNLOCK; | 7309 DW_MUTEX_UNLOCK; |
7297 return; | 7310 return; |
7298 } | 7311 } |
7299 #if GTK_CHECK_VERSION(3,22,0) | 7312 #if GTK_CHECK_VERSION(3,22,0) |
7300 dc = gdk_window_begin_draw_frame(window, NULL); | 7313 clip = gdk_window_get_clip_region(window); |
7314 dc = gdk_window_begin_draw_frame(window, clip); | |
7301 cr = gdk_drawing_context_get_cairo_context(dc); | 7315 cr = gdk_drawing_context_get_cairo_context(dc); |
7302 #else | 7316 #else |
7303 cr = gdk_cairo_create(window); | 7317 cr = gdk_cairo_create(window); |
7304 #endif | 7318 #endif |
7305 } | 7319 } |
7321 } | 7335 } |
7322 if(flags & DW_DRAW_FILL) | 7336 if(flags & DW_DRAW_FILL) |
7323 cairo_fill(cr); | 7337 cairo_fill(cr); |
7324 cairo_stroke(cr); | 7338 cairo_stroke(cr); |
7325 #if GTK_CHECK_VERSION(3,22,0) | 7339 #if GTK_CHECK_VERSION(3,22,0) |
7340 if(clip) | |
7341 cairo_region_destroy(clip); | |
7326 /* If we are using a drawing context... | 7342 /* If we are using a drawing context... |
7327 * we don't own the cairo context so don't destroy it. | 7343 * we don't own the cairo context so don't destroy it. |
7328 */ | 7344 */ |
7329 if(!dc) | 7345 if(dc) |
7346 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc); | |
7347 else | |
7330 #endif | 7348 #endif |
7331 cairo_destroy(cr); | 7349 cairo_destroy(cr); |
7332 } | 7350 } |
7333 DW_MUTEX_UNLOCK; | 7351 DW_MUTEX_UNLOCK; |
7334 } | 7352 } |
7347 { | 7365 { |
7348 int _locked_by_me = FALSE; | 7366 int _locked_by_me = FALSE; |
7349 cairo_t *cr = NULL; | 7367 cairo_t *cr = NULL; |
7350 #if GTK_CHECK_VERSION(3,22,0) | 7368 #if GTK_CHECK_VERSION(3,22,0) |
7351 GdkDrawingContext *dc = NULL; | 7369 GdkDrawingContext *dc = NULL; |
7370 cairo_region_t *clip = NULL; | |
7352 #endif | 7371 #endif |
7353 | 7372 |
7354 DW_MUTEX_LOCK; | 7373 DW_MUTEX_LOCK; |
7355 if(handle) | 7374 if(handle) |
7356 { | 7375 { |
7360 { | 7379 { |
7361 DW_MUTEX_UNLOCK; | 7380 DW_MUTEX_UNLOCK; |
7362 return; | 7381 return; |
7363 } | 7382 } |
7364 #if GTK_CHECK_VERSION(3,22,0) | 7383 #if GTK_CHECK_VERSION(3,22,0) |
7365 dc = gdk_window_begin_draw_frame(window, NULL); | 7384 clip = gdk_window_get_clip_region(window); |
7385 dc = gdk_window_begin_draw_frame(window, clip); | |
7366 cr = gdk_drawing_context_get_cairo_context(dc); | 7386 cr = gdk_drawing_context_get_cairo_context(dc); |
7367 #else | 7387 #else |
7368 cr = gdk_cairo_create(window); | 7388 cr = gdk_cairo_create(window); |
7369 #endif | 7389 #endif |
7370 } | 7390 } |
7385 cairo_line_to(cr, x + width, y); | 7405 cairo_line_to(cr, x + width, y); |
7386 if(flags & DW_DRAW_FILL) | 7406 if(flags & DW_DRAW_FILL) |
7387 cairo_fill(cr); | 7407 cairo_fill(cr); |
7388 cairo_stroke(cr); | 7408 cairo_stroke(cr); |
7389 #if GTK_CHECK_VERSION(3,22,0) | 7409 #if GTK_CHECK_VERSION(3,22,0) |
7410 if(clip) | |
7411 cairo_region_destroy(clip); | |
7390 /* If we are using a drawing context... | 7412 /* If we are using a drawing context... |
7391 * we don't own the cairo context so don't destroy it. | 7413 * we don't own the cairo context so don't destroy it. |
7392 */ | 7414 */ |
7393 if(!dc) | 7415 if(dc) |
7416 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc); | |
7417 else | |
7394 #endif | 7418 #endif |
7395 cairo_destroy(cr); | 7419 cairo_destroy(cr); |
7396 } | 7420 } |
7397 DW_MUTEX_UNLOCK; | 7421 DW_MUTEX_UNLOCK; |
7398 } | 7422 } |
7414 { | 7438 { |
7415 int _locked_by_me = FALSE; | 7439 int _locked_by_me = FALSE; |
7416 cairo_t *cr = NULL; | 7440 cairo_t *cr = NULL; |
7417 #if GTK_CHECK_VERSION(3,22,0) | 7441 #if GTK_CHECK_VERSION(3,22,0) |
7418 GdkDrawingContext *dc = NULL; | 7442 GdkDrawingContext *dc = NULL; |
7443 cairo_region_t *clip = NULL; | |
7419 #endif | 7444 #endif |
7420 | 7445 |
7421 DW_MUTEX_LOCK; | 7446 DW_MUTEX_LOCK; |
7422 if(handle) | 7447 if(handle) |
7423 { | 7448 { |
7427 { | 7452 { |
7428 DW_MUTEX_UNLOCK; | 7453 DW_MUTEX_UNLOCK; |
7429 return; | 7454 return; |
7430 } | 7455 } |
7431 #if GTK_CHECK_VERSION(3,22,0) | 7456 #if GTK_CHECK_VERSION(3,22,0) |
7432 dc = gdk_window_begin_draw_frame(window, NULL); | 7457 clip = gdk_window_get_clip_region(window); |
7458 dc = gdk_window_begin_draw_frame(window, clip); | |
7433 cr = gdk_drawing_context_get_cairo_context(dc); | 7459 cr = gdk_drawing_context_get_cairo_context(dc); |
7434 #else | 7460 #else |
7435 cr = gdk_cairo_create(window); | 7461 cr = gdk_cairo_create(window); |
7436 #endif | 7462 #endif |
7437 } | 7463 } |
7464 } | 7490 } |
7465 if(flags & DW_DRAW_FILL) | 7491 if(flags & DW_DRAW_FILL) |
7466 cairo_fill(cr); | 7492 cairo_fill(cr); |
7467 cairo_stroke(cr); | 7493 cairo_stroke(cr); |
7468 #if GTK_CHECK_VERSION(3,22,0) | 7494 #if GTK_CHECK_VERSION(3,22,0) |
7495 if(clip) | |
7496 cairo_region_destroy(clip); | |
7469 /* If we are using a drawing context... | 7497 /* If we are using a drawing context... |
7470 * we don't own the cairo context so don't destroy it. | 7498 * we don't own the cairo context so don't destroy it. |
7471 */ | 7499 */ |
7472 if(!dc) | 7500 if(dc) |
7501 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc); | |
7502 else | |
7473 #endif | 7503 #endif |
7474 cairo_destroy(cr); | 7504 cairo_destroy(cr); |
7475 } | 7505 } |
7476 DW_MUTEX_UNLOCK; | 7506 DW_MUTEX_UNLOCK; |
7477 } | 7507 } |
7490 cairo_t *cr = NULL; | 7520 cairo_t *cr = NULL; |
7491 PangoFontDescription *font; | 7521 PangoFontDescription *font; |
7492 char *tmpname, *fontname = "monospace 10"; | 7522 char *tmpname, *fontname = "monospace 10"; |
7493 #if GTK_CHECK_VERSION(3,22,0) | 7523 #if GTK_CHECK_VERSION(3,22,0) |
7494 GdkDrawingContext *dc = NULL; | 7524 GdkDrawingContext *dc = NULL; |
7525 cairo_region_t *clip = NULL; | |
7495 #endif | 7526 #endif |
7496 | 7527 |
7497 if(!text) | 7528 if(!text) |
7498 return; | 7529 return; |
7499 | 7530 |
7506 { | 7537 { |
7507 DW_MUTEX_UNLOCK; | 7538 DW_MUTEX_UNLOCK; |
7508 return; | 7539 return; |
7509 } | 7540 } |
7510 #if GTK_CHECK_VERSION(3,22,0) | 7541 #if GTK_CHECK_VERSION(3,22,0) |
7511 dc = gdk_window_begin_draw_frame(window, NULL); | 7542 clip = gdk_window_get_clip_region(window); |
7543 dc = gdk_window_begin_draw_frame(window, clip); | |
7512 cr = gdk_drawing_context_get_cairo_context(dc); | 7544 cr = gdk_drawing_context_get_cairo_context(dc); |
7513 #else | 7545 #else |
7514 cr = gdk_cairo_create(window); | 7546 cr = gdk_cairo_create(window); |
7515 #endif | 7547 #endif |
7516 if((tmpname = (char *)g_object_get_data(G_OBJECT(handle), "_dw_fontname"))) | 7548 if((tmpname = (char *)g_object_get_data(G_OBJECT(handle), "_dw_fontname"))) |
7567 g_object_unref(context); | 7599 g_object_unref(context); |
7568 } | 7600 } |
7569 pango_font_description_free(font); | 7601 pango_font_description_free(font); |
7570 } | 7602 } |
7571 #if GTK_CHECK_VERSION(3,22,0) | 7603 #if GTK_CHECK_VERSION(3,22,0) |
7604 if(clip) | |
7605 cairo_region_destroy(clip); | |
7572 /* If we are using a drawing context... | 7606 /* If we are using a drawing context... |
7573 * we don't own the cairo context so don't destroy it. | 7607 * we don't own the cairo context so don't destroy it. |
7574 */ | 7608 */ |
7575 if(!dc) | 7609 if(dc) |
7610 gdk_window_end_draw_frame(gtk_widget_get_window(handle), dc); | |
7611 else | |
7576 #endif | 7612 #endif |
7577 cairo_destroy(cr); | 7613 cairo_destroy(cr); |
7578 } | 7614 } |
7579 DW_MUTEX_UNLOCK; | 7615 DW_MUTEX_UNLOCK; |
7580 } | 7616 } |
7916 int _locked_by_me = FALSE; | 7952 int _locked_by_me = FALSE; |
7917 cairo_t *cr = NULL; | 7953 cairo_t *cr = NULL; |
7918 int retval = DW_ERROR_GENERAL; | 7954 int retval = DW_ERROR_GENERAL; |
7919 #if GTK_CHECK_VERSION(3,22,0) | 7955 #if GTK_CHECK_VERSION(3,22,0) |
7920 GdkDrawingContext *dc = NULL; | 7956 GdkDrawingContext *dc = NULL; |
7957 cairo_region_t *clip = NULL; | |
7921 #endif | 7958 #endif |
7922 | 7959 |
7923 if((!dest && (!destp || !destp->image)) || (!src && (!srcp || !srcp->image))) | 7960 if((!dest && (!destp || !destp->image)) || (!src && (!srcp || !srcp->image))) |
7924 return retval; | 7961 return retval; |
7925 | 7962 |
7932 { | 7969 { |
7933 DW_MUTEX_UNLOCK; | 7970 DW_MUTEX_UNLOCK; |
7934 return retval; | 7971 return retval; |
7935 } | 7972 } |
7936 #if GTK_CHECK_VERSION(3,22,0) | 7973 #if GTK_CHECK_VERSION(3,22,0) |
7937 dc = gdk_window_begin_draw_frame(window, NULL); | 7974 clip = gdk_window_get_clip_region(window); |
7975 dc = gdk_window_begin_draw_frame(window, clip); | |
7938 cr = gdk_drawing_context_get_cairo_context(dc); | 7976 cr = gdk_drawing_context_get_cairo_context(dc); |
7939 #else | 7977 #else |
7940 cr = gdk_cairo_create(window); | 7978 cr = gdk_cairo_create(window); |
7941 #endif | 7979 #endif |
7942 } | 7980 } |
7960 cairo_set_source_surface (cr, srcp->image, (xdest + xsrc) / xscale, (ydest + ysrc) / yscale); | 7998 cairo_set_source_surface (cr, srcp->image, (xdest + xsrc) / xscale, (ydest + ysrc) / yscale); |
7961 | 7999 |
7962 cairo_rectangle(cr, xdest / xscale, ydest / yscale, width, height); | 8000 cairo_rectangle(cr, xdest / xscale, ydest / yscale, width, height); |
7963 cairo_fill(cr); | 8001 cairo_fill(cr); |
7964 #if GTK_CHECK_VERSION(3,22,0) | 8002 #if GTK_CHECK_VERSION(3,22,0) |
8003 if(clip) | |
8004 cairo_region_destroy(clip); | |
7965 /* If we are using a drawing context... | 8005 /* If we are using a drawing context... |
7966 * we don't own the cairo context so don't destroy it. | 8006 * we don't own the cairo context so don't destroy it. |
7967 */ | 8007 */ |
7968 if(!dc) | 8008 if(dc) |
8009 gdk_window_end_draw_frame(gtk_widget_get_window(dest), dc); | |
8010 else | |
7969 #endif | 8011 #endif |
7970 cairo_destroy(cr); | 8012 cairo_destroy(cr); |
7971 retval = DW_ERROR_NONE; | 8013 retval = DW_ERROR_NONE; |
7972 } | 8014 } |
7973 DW_MUTEX_UNLOCK; | 8015 DW_MUTEX_UNLOCK; |