Каирская маскировка - мне чего-то не хватает? - PullRequest
3 голосов
/ 22 июня 2010

Итак, я пытаюсь создать маску в Каире, но не могу ее изменить. Ниже у меня есть простая программа, основанная на этой: 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;
}

1 Ответ

4 голосов
/ 23 июня 2010

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

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

...