Отсечение при рисовании точек с использованием Каира - PullRequest
1 голос
/ 23 февраля 2012

У меня есть простая программа в Каире, которая пытается нарисовать диагональ, состоящую из точек, в формате PNG 600x600.Тем не менее, выходные данные кажутся усеченными всякий раз, когда я пытаюсь отобразить все точки, используя один вызов cairo_stroke ().

В частности, рассмотрим следующую программу:

#include <cairo/cairo.h>

int main(int argc, char **argv)
{
    cairo_surface_t *surface =
        cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 300, 300);
    cairo_t *cr = cairo_create(surface);
    cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
    cairo_set_source_rgb(cr, 0, 0, 0);
    cairo_set_line_width(cr, 5);
    for (double x = 0.0; x <= 300; x += 10) {
        cairo_move_to(cr, x, x);
        cairo_close_path(cr);
        cairo_stroke(cr);
    }
    cairo_surface_write_to_png(surface, "output.png");
    cairo_destroy(cr);
    cairo_surface_destroy(surface);
    return 0;
}

, которая генерируетследующий правильный вывод:

here

Если я переместу

cairo_stroke(cr);

за пределы цикла for, вместо этого будет сгенерирован следующий неверный вывод:

output.

Может кто-нибудь еще объяснить, почему вторая попытка не удалась?Я подозреваю, что здесь что-то не так ...

1 Ответ

1 голос
/ 10 октября 2012


    #include <cairo/cairo.h>

    int main(int argc, char **argv)
    {
        cairo_surface_t *surface =
            cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 300, 300);

        cairo_t *cr = cairo_create(surface);
        cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
        cairo_set_source_rgb(cr, 0, 0, 0);
        cairo_set_line_width(cr, 5);

        for (double x = 0.0; x <= 300; x += 10) {
            cairo_move_to(cr, x, x);
            cairo_close_path(cr);
        }

        cairo_stroke(cr); /* moved here */

        cairo_surface_write_to_png(surface, "output.png");
        cairo_destroy(cr);
        cairo_surface_destroy(surface);

        return 0;
    }


Перемещение cairo_stroke(cr) за пределы цикла for, по-видимому, генерирует одинаковый вывод в Cairo версии 1.10.1.

Скомпилировано как: gcc test.c `pkg-config --libs --cflagsgtk + -2.0` -std = c99 -lcairo

...