簡體   English   中英

如何在開羅繪制切片的圖像?

[英]How to draw a sliced image in Cairo?

我目前正在使用以下代碼繪制切片的圖像:

static void DrawImage(cairo_t *ctx,int x,int y,int w,int h,cairo_surface_t *img){
    cairo_set_source_surface(ctx, img, 0, 0);
    cairo_rectangle(ctx, x, y, w, h);
    cairo_clip(ctx);
    cairo_paint(ctx);
    cairo_reset_clip(ctx);
}

void DrawThreeSliceImage(cairo_t* ctx,Point p,int width,cairo_surface_t *a,cairo_surface_t *b,cairo_surface_t *c){
    DrawImage(ctx, p.x, p.y, cairo_image_surface_get_width(a), cairo_image_surface_get_height(a),a);
    DrawImage(ctx, p.x+cairo_image_surface_get_width(a), p.y, width-(cairo_image_surface_get_width(a)+cairo_image_surface_get_width(c)), cairo_image_surface_get_height(b),b);
    DrawImage(ctx, p.x+(width-cairo_image_surface_get_width(c)), p.y, cairo_image_surface_get_width(c), cairo_image_surface_get_height(c),c);
}

但是,沒有輸出。 我嘗試渲染到xlib和png曲面,但似乎都無法正常工作,因此無法繪制任何內容。 另外,我已將輸入表面寫入png文件,它們似乎正在工作。

謝謝。

對於那些可能遇到類似問題的人,此代碼對我有用:

void DrawImage(cairo_t *ctx,int x,int y,int w,int h,cairo_surface_t *img){
    /*if((w||h) || (w==cairo_image_surface_get_width(img)&&h==cairo_image_surface_get_height(img))){
        cairo_save(ctx);
        cairo_translate(ctx, x, y);
        cairo_scale(ctx, ((double)w)/((double)cairo_image_surface_get_width(img)), ((double)h)/((double)cairo_image_surface_get_height(img)));
        cairo_pattern_t *pattern=cairo_pattern_create_for_surface(img);
        cairo_pattern_set_extend(pattern, CAIRO_EXTEND_PAD);
        cairo_set_source(ctx, pattern);
        cairo_rectangle(ctx, 0,0, cairo_image_surface_get_width(img), cairo_image_surface_get_height(img));
        cairo_fill(ctx);
        cairo_pattern_destroy(pattern);
        cairo_restore(ctx);
    }else{
        cairo_set_source_surface(ctx, img, x,y);
        cairo_rectangle(ctx, x,y, cairo_image_surface_get_width(img), cairo_image_surface_get_height(img));
        cairo_fill(ctx);
    }*/
    cairo_save(ctx);
    cairo_translate(ctx, x, y);
    cairo_pattern_t *pattern=cairo_pattern_create_for_surface(img);
    cairo_pattern_set_extend(pattern, CAIRO_EXTEND_PAD);
    cairo_set_source(ctx, pattern);
    cairo_rectangle(ctx, 0, 0, w?w:cairo_image_surface_get_width(img), h?h:cairo_image_surface_get_height(img));
    cairo_fill(ctx);
    cairo_pattern_destroy(pattern);
    cairo_restore(ctx);
}

void DrawThreeSliceImage(cairo_t* ctx,Point p,int width,cairo_surface_t* imgs[3]){
#define a   (imgs[0])
#define b   (imgs[1])
#define c   (imgs[2])
    DrawImage(ctx, p.x, p.y, cairo_image_surface_get_width(a), cairo_image_surface_get_height(a),a);
    DrawImage(ctx, p.x+cairo_image_surface_get_width(a), p.y, width-(cairo_image_surface_get_width(a)+cairo_image_surface_get_width(c)), cairo_image_surface_get_height(b),b);
    DrawImage(ctx, p.x+(width-cairo_image_surface_get_width(c)), p.y, cairo_image_surface_get_width(c), cairo_image_surface_get_height(c),c);
#undef a
#undef b
#undef c
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM