Простой пример Cairo / Quartz C ++ - PullRequest
0 голосов
/ 01 декабря 2018

Мне нужно создать и запустить простое интерактивное приложение C ++ Cairo (графика) на MacOS, что, вероятно, означает использование бэкэнда Quartz.

Мне очень глупо спрашивать об этом, но я не могу найти простоепример в интернете.Все использует Какао (что является ObjectiveC) или Swift.

Вот то, что у меня есть до сих пор, и это правильно связывает, но ничего не делает ... но я уверен, что мне не хватает некоторых вещей:

#include <cairo/cairo-quartz.h>
#include <cairo/cairo.h>

int main()
{
    cairo_surface_t* surface = cairo_quartz_surface_create (
              CAIRO_FORMAT_RGB24
            , 640
            , 480
            );

    cairo_t* cr = cairo_create(surface);

    // What next?  How do I get the window to show up?
    // What do I use for my event loop?
}

Команда для сборки:

clang++ $(pkg-config --cflags --libs cairo) main.cpp

(Очевидно, это предполагает, что вы правильно установили Cairo)

1 Ответ

0 голосов
/ 01 декабря 2018

Каир не знает о окнах или циклах событий.Он просто знает, как рисовать на «поверхностях», где поверхность несколько кругово определяется как «то, что Каир может нарисовать».Он может создавать различные системные независимые поверхности, такие как растровые изображения в памяти, PDF-файлы и файлы PostScript, и может оборачивать поверхность вокруг некоторых системно-зависимых целей рисования, таких как Quartz CGContext, Windows HDC илиX11 Drawable.

Если вы хотите создать интерактивное приложение, вам нужно использовать какую-то другую систему для создания экранной цели рисования и реагирования на ввод пользователя.Затем вы можете обернуть экранную цель рисования системы в cairo_surface_t и использовать Cairo для рисования.

Таким образом, вы можете использовать собственные платформы MacOS Cocoa для взаимодействия и использовать cairo_quartz_surface_create_for_cg_context для переноса cairo_surface_t вокруг macOS-нативного CGContext.Какао-приложения, как правило, обеспечивают лучший пользовательский опыт в macOS.

Или вы можете использовать кроссплатформенную систему Qt для взаимодействия и использовать cairo_qt_surface_create, чтобы обернуть cairo_surface_t вокруг QPainter.Qt - это система C ++, так что это может быть вашим самым простым решением.

Или вы можете использовать SDL с помощниками cairosdl.

Или для любой среды, котораяобеспечивает доступ к простым растровым изображениям RGB, вы можете использовать cairo_image_surface_create_for_data, чтобы обернуть cairo_surface_t вокруг растрового изображения.

Или, для любой среды, которая может импортировать простое растровое изображение RGB, вы можете использовать cairo_image_surface_create для созданиярастровое изображение, а затем передать его системе, используя системный API.

...