LINUX.ORG.RU

PlutoVG 1.0.0

 , , ,


3

2

11 марта состоялся первый значительный выпуск 1.0.0 библиотеки двухмерной векторной графики PlutoVG, написанной на языке C и распространяемой по лицензии MIT. У библиотеки нет сторонних зависимостей.

Возможности библиотеки:

  • стили рисования линий;
  • сплошное, градиентное и текстурное закрашивание;
  • шрифты и текст;
  • обрезка и композиция;
  • трансформации;
  • изображения.

Библиотека используется в других проектах автора: LunaSVG и PlutoSVG.

Изменения:

  • Использование SemVer для нумерации версий.
  • Добавлены макросы PLUTOVG_EMPTY_POINT и PLUTOVG_EMPTY_RECT.

Код:

#include <plutovg.h>

int main(void)
{
    const int width = 150;
    const int height = 150;

    const float center_x = width / 2.f;
    const float center_y = height / 2.f;
    const float face_radius = 70;
    const float mouth_radius = 50;
    const float eye_radius = 10;
    const float eye_offset_x = 25;
    const float eye_offset_y = 20;
    const float eye_x = center_x - eye_offset_x;
    const float eye_y = center_y - eye_offset_y;

    plutovg_surface_t* surface = plutovg_surface_create(width, height);
    plutovg_canvas_t* canvas = plutovg_canvas_create(surface);

    plutovg_canvas_save(canvas);
    plutovg_canvas_arc(canvas, center_x, center_y, face_radius, 0, PLUTOVG_TWO_PI, 0);
    plutovg_canvas_set_rgb(canvas, 1, 1, 0);
    plutovg_canvas_fill_preserve(canvas);
    plutovg_canvas_set_rgb(canvas, 0, 0, 0);
    plutovg_canvas_set_line_width(canvas, 5);
    plutovg_canvas_stroke(canvas);
    plutovg_canvas_restore(canvas);

    plutovg_canvas_save(canvas);
    plutovg_canvas_arc(canvas, eye_x, eye_y, eye_radius, 0, PLUTOVG_TWO_PI, 0);
    plutovg_canvas_arc(canvas, center_x + eye_offset_x, eye_y, eye_radius, 0, PLUTOVG_TWO_PI, 0);
    plutovg_canvas_set_rgb(canvas, 0, 0, 0);
    plutovg_canvas_fill(canvas);
    plutovg_canvas_restore(canvas);

    plutovg_canvas_save(canvas);
    plutovg_canvas_arc(canvas, center_x, center_y, mouth_radius, 0, PLUTOVG_PI, 0);
    plutovg_canvas_set_rgb(canvas, 0, 0, 0);
    plutovg_canvas_set_line_width(canvas, 5);
    plutovg_canvas_stroke(canvas);
    plutovg_canvas_restore(canvas);

    plutovg_surface_write_to_png(surface, "smiley.png");
    plutovg_canvas_destroy(canvas);
    plutovg_surface_destroy(surface);
    return 0;
}

рисует 😃 и сохраняет его в файле smiley.png. :)

>>> Список изменений на GitHub

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от AP

Сравнил тушканчика с годзиллами. :)

dataman ★★★★★
() автор топика
Ответ на: комментарий от olelookoe

Тем, что векторная?

Ну и:

Package: libgd-dev
Depends: libavif-dev | base-files (<< 11.1~), libfontconfig-dev, libfreetype6-dev, libgd3 (= 2.3.3-12+b1), libheif-dev | base-files (<< 11.1~), libimagequant-dev, libjpeg-dev, libpng-dev, libraqm-dev, libtiff-dev, libvpx-dev, libwebp-dev, libx11-dev, libxpm-dev, libz-dev
dataman ★★★★★
() автор топика
Ответ на: комментарий от Anoxemian

Естественно меньше. Равно как и строчка «Hello world» занимает меньше байт, чем программа, её выводящая.

Это не самодостаточный формат, ему нужен ещё программный код, чтобы отрендерить.

CrX ★★★★★
()
Ответ на: комментарий от Anoxemian

Рендер в самой либе, да (рендер в PNG), не в простыне в ОП. Но по-моему, очевидно, что векторное изображение в xml-формате, специально созданном для хранения векторных изображений будет занимать меньше строк, чем оно же примитивами на C. Хотя тут ещё как строки считать. Если краткую запись не использовать, и каждый закрывающий тег на отдельной строке делать, то в SVG будет больше :)

Кстати, на основе сабжа есть и либы для рендеринга SVG.

CrX ★★★★★
()
Ответ на: комментарий от CrX

Кстати, на основе сабжа есть и либы для рендеринга SVG.

Да, и я уже писал в PlutoVG 0.0.10 и LunaSVG 3.1.0 (комментарий):

Кстати, больше года назад в Dear ImGui 1.89.8 добавили поддержку рендеринга SVG-шрифтов OpenType с помощью LunaSVG:

Requires enabling IMGUI_ENABLE_FREETYPE_LUNASVG along with IMGUI_ENABLE_FREETYPE, and providing headers/libraries for lunasvg.

dataman ★★★★★
() автор топика

Глянул в ГитХаб проекта. Предыдущий релиз, версия 0.0.13, две недели назад. Актуальный релиз 1.0.0 - три дня назад. Охренеть, как быстро растут чужие дети…

densss ★★★★★
()
Ответ на: комментарий от LightDiver

А почему не на раст? Это потом переписывать всеравно придется.

Так перепиши и предложи.

AlexVR ★★★★★
()
Ответ на: комментарий от LightDiver

Потому что те, кому это нужно, уже давно используют один из 100500 готовых крейтов.
А те, кому и не нужно, паясничают на ЛОРе.

dataman ★★★★★
() автор топика

И как у него с трансформациями и вращениями, удобно? Матрицу преобразования можно получить из композиции последовательных преобразований, или это не в задачах библиотеки? Тексты вертит хорошо?

blex ★★★
()
Ответ на: комментарий от Somebody

Что не так? SVG был создан для чего-то другого? Или что там может быть несерьёзно?

CrX ★★★★★
()

что подразумевается под стилями линий? умеет так:

—text—text—text—text—text—

умеет масштабировать стиль в модельных, а не в экранных координатах?

zamtmn ★★
()
Ответ на: комментарий от zamtmn

что подразумевается под стилями линий?

Там вообще-то:

Path Filling, Stroking and Dashing

Но я решил избежать вопросов «что за заполнение, штрихование и прочерчивание путей?». :)

dataman ★★★★★
() автор топика
Ответ на: комментарий от dataman

Stroking and Dashing

т.е. обычный пунктирчик по маске в экранных размерах

zamtmn ★★
()

Так, я правильно понял, что эта либа просто рисует в память и не требует OpenGL/Vulkan/Metal/DirectX/etc?

Эх, где ж ты была 10 лет назад…

WatchCat ★★★★★
()
Ответ на: комментарий от WatchCat

просто рисует в память и не требует OpenGL/Vulkan/Metal/DirectX/etc?

Да.

Эх, где ж ты была 10 лет назад…

Вполне возможно, что её автор тогда был слишком молод. :)

dataman ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.