2010-06-22 5 views
3

Так что я пытаюсь создать маску в Каире, но не могу заставить ее иметь какое-либо значение. Ниже у меня есть простая программа, основанная здесь: http://snipplr.com/view/22584/cairo-hello-world-examble/.Каирская маскировка - есть ли что-то, что мне не хватает?

Я устанавливаю полностью прозрачную маску, поэтому ничего не нужно рисовать, но это, похоже, не имеет никакого эффекта - текст все равно нарисован. Мой код ниже. Что мне не хватает?

Спасибо!

int main(int argc, char* argv[]) 
{        
    cairo_surface_t* surface;  
    cairo_t* cr;     

    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 200, 40); 
    cr = cairo_create (surface); 

    //**** 
    // Here I create a pattern with an alpha of zero and set it to be cairo's mask 
    // According to http://www.cairographics.org/manual/cairo-context.html#cairo-mask 
    // "Opaque areas of pattern are painted with the source, transparent areas are not painted." 
    // Shouldn't this make it so nothing gets drawn? 
    //**** 

    cairo_pattern_t* nothing = cairo_pattern_create_rgba(0,0,0,0); 
    cairo_mask (cr, nothing); 

    cairo_text_extents_t te; 
    cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); 
    cairo_select_font_face (cr, "Georgia", 
          CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); 
    cairo_set_font_size (cr, 20.0); 
    cairo_text_extents (cr, "hello cairo!", &te); 
    cairo_move_to (cr, 20, 20); 
    cairo_show_text (cr, "hello cairo!"); 
    cairo_fill(cr); 

    // An image gets drawn that says "hello cairo!" in big letters 
    cairo_surface_write_to_png(surface, "hello_cairo.png"); 

    return 0; 
} 

ответ

4

Хорошо, я понял. Я ожидал, что cairo_mask() будет вести себя как cairo_clip(). (в cairo_clip() он устанавливает путь клипа, который зажимает каждый элемент, нарисованный впоследствии)

cairo_mask объясняется очень просто: «cairo_mask - Paint fill source fill pattern с использованием шаблона маски альфа-канала». Это именно то, что он делает - заполняет весь экран текущим шаблоном заполнения и смешивает его с любой альфой для этого пикселя на маске.

+0

Я знаю, что прошло много времени, но cairo_mask так же, как opacityMask в xps? – Michele