Cairo 图形指南 (4) —— 裁剪与遮蔽

本文深入探讨Cairo图形库中的裁剪和遮蔽技术。通过示例展示裁剪如何限定图像显示区域,如使用cairo_clip()设定裁剪域,以及裁剪矩形的动态交集效果。同时解释了遮蔽的概念,作为图形过滤器决定源的可见部分。
摘要由CSDN通过智能技术生成

在这一篇中讲述裁剪(Clipping)与遮蔽(Masking)。

裁剪

在下面的示例中,对一幅图像进行裁剪。


#include <cairo.h>
#include <gtk/gtk.h>
#include <math.h>
 
cairo_surface_t *image;
 
staticgboolean
on_expose_event(GtkWidget *widget,
    GdkEventExpose *event,
    gpointer data)
{
  cairo_t *cr;
 
  staticgint pos_x = 128;
  staticgint pos_y = 128;
  gint radius = 40; 
 
  staticgint delta[] = { 3, 3 };
 
  cr = gdk_cairo_create(widget->window);
 
  gint width, height;
  gtk_window_get_size(GTK_WINDOW(widget), &width, &height);
 
  if(pos_x < 0 + radius) {
      delta[0] =rand() % 4 + 5;
  }else if (pos_x > width - radius) {
      delta[0] = -(rand() % 4 + 5);
  }
 
  if(pos_y < 0 + radius) {
      delta[1] =rand() % 4 + 5;
  }else if (pos_y > height - radius) {
      delta[1] = -(rand() % 4 + 5);
  }
 
  pos_x += delta[0];
  pos_y += delta[1];
 
  cairo_set_source_surface(cr, image, 1, 1);
  cairo_arc(cr, pos_x, pos_y, radius, 0, 2*M_PI);
  cairo_clip(cr);
  cairo_paint(cr);
 
  cairo_destroy(cr);
 
  returnFALSE;
}
 
staticgboolean
time_handler (GtkWidget *widget)
{
  if(widget->window == NULL) returnFALSE;
  gtk_widget_queue_draw(widget);
  returnTRUE;
}
 
int main(int argc,char *argv[])
{
  GtkWidget *window;
  gint width, height; 
 
  image = cairo_image_surface_create_from_png("turnacastle.png");
  width = cairo_image_surface_get_width(image);
  height = cairo_image_surface_get_height(image);
 
 
  gtk_init(&argc, &argv);
 
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 
  g_signal_connect(G_OBJECT(window),"expose-event",
      G_CALLBACK(on_expose_event), NULL);
  g_signal_connect(G_OBJECT(window),"destroy",
      G_CALLBACK(gtk_main_quit), NULL);
 
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), width+2, height+2);
 
  gtk_widget_set_app_paintable(window, TRUE);
  gtk_widget_show_all(window);
  g_timeout_add(100, (GSourceFunc) time_handler, (gpointer) window);
 
  gtk_main();
 
  cairo_surface_destroy(image);
 
  return0;


在这一示例中,在窗口中会有一个圆形区域不断移动,并且在该区域显示位于其下的图像,仿佛是通过一个孔洞观看图像。


if (pos_x < 0 + radius) {
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值