LINUX.ORG.RU

C++20 и 2D Graphics

 ,


0

9

Исходник: https://isocpp.org/files/img/wg21-timeline-2017-11.png

Оказывается, все проблемы C++ уже решены, и теперь можно приступать к самой важной части системного языка - 2D графике.

Вопрос: что за безумие происходит в комитете C++? Зачем системному языку, да и вообще любому языку, 2D графика в std? Тем более, по слухам, они собираются использовать убогий cairo.

Из подобных языков приходит в голову только tcl/tk и red.

★★★★★

Последнее исправление: RazrFalcon (всего исправлений: 1)

Ответ на: комментарий от Virtuos86

два типа строк

В C++ их тоже два: string и string_view. И в Qt: QString и QStringRef. В других системных языках также.

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

Многословность сишки вне конкуренции.

Хотя там два лагеря: любители asrbf() и rsvg_cairo_surface_from_pixbuf.

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

Хотя там два лагеря: любители asrbf() и rsvg_cairo_surface_from_pixbuf.

Ну это как раз на многословность не влияет. Если написать Cairo::SvgSurface::from_pixbuf то выигрыша не будет. И даже на С можно писать относительно компактно при наличии удобного набора функций.

anonymous
()
Ответ на: комментарий от Virtuos86

Я думаю, что Раст многословен сам по себе. Те же unwrap'ы, as'касты, лайфтаймы, спорадические пляски с владением, вынуждающие использовать воркэраунды, два типа строк.

OK. Кажется, я понял. Я воспринял ваши слова как то, что у Rust-а многословный синтаксис (что не так, по-моему). Вы же говорите про многословность кода, которая зависит не только (и не столько от синтаксиса), сколько от других вещей, включая API. В такой формулировке соглашусь.

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

А так писать и не нужно.

Как минимум на Rust где-то так именно и нужно писать. Только вместо from_pixbuf там должно быть from_data или что-то такое.

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

С этой же сигнатурой конструктора - не было бы.

«несколько конструкторов на выбор»

Ну, если ты сравниваешь краткость по вызову функций с разной сигнатурой... ну окей, чо.

Можно, конечно, было бы добавить Rect::new_xywh, но это тоже не самое прямое решение.

Это добавление еще одного конструктора (да, в Rust их тоже может быть больше одного).

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

https://github.com/RazrFalcon/pangocairo-rs/blob/master/examples/rotated.rs

vs

https://developer.gnome.org/pango/stable/pango-Cairo-Rendering.html#rotated-e...

Специально скопипастю кусок:

PangoLayout *layout;
PangoFontDescription *desc;
layout = pango_cairo_create_layout(cr);
pango_layout_set_text(layout, "Text", -1);
desc = pango_font_description_from_string("Sans Bold 27");
pango_layout_set_font_description(layout, desc);
pango_font_description_free(desc);
vs
let font = pango::FontDescription::from_string("Sans Bold 27");
let layout = cr.create_pango_layout();
layout.set_text("Hello");
layout.set_font_description(Some(&font));

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

Но, специально для тебя, повторю:

* в C++ уже есть инструменты, которые облегчают жизнь программисту;

[...]

Я спрашивал о том, зачем менять сырой указатель на unique_ptr в уже работающем коде, который больше не разрабыатыватся активно. По мне, это улучшайзинг ради улучшайзинга.

Т.е. основная мысль в том, что неудача с распараллеливанием не из-за того, что C++ не позволяет писать параллельный код. А в том, что у Mozill-ы говнокод.

Еще раз (последний, честно-честно): перед Мозиллой стояла задача - распараллелить браузер. Предположим, они начали ее решать с приведения кодовой базы в современный вид, всё по канонам C++11. После того, как они это сделали бы, они бы никак не облегчили решение своей основной задачи - параллелизации, потому что даже C++11 никак не помогает в параллелизации.

Ну и будешь продолжать тупить — будешь общаться сам с собой.

Без проблем.

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

Ада? На место ады раст не пустят лет 50 еще. Если вообще пустят.

На место Ады пустят всё, что станет популярным. Вот Си++ уже пустили.

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

Ну, если ты сравниваешь краткость по вызову функций с разной сигнатурой... ну окей, чо.

Даже для одинаковых было бы: Rect({x, y}, {w, h}), что короче. Но дело не в этом, дело опять же в том, что ограничение языка влияет на код и на подходы к его написанию. В С++ если поискать Rect:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms534495(v=vs.85).aspx https://docs.opencv.org/java/2.4.9/org/opencv/core/Rect.html http://doc.qt.io/qt-5/qrect.html https://www.sfml-dev.org/documentation/2.0/classsf_1_1Rect.php ...

Везде будет несколько конструкторов. Это типично для С++. В Rust как минимум часть разработчиков обходятся одним.

Это добавление еще одного конструктора (да, в Rust их тоже может быть больше одного).

Может, но нет.

anonymous
()
Ответ на: комментарий от RazrFalcon

Специально скопипастю кусок:

Совмещаем определение переменной и ее инициализацию, добавлением в типы указатели не «методы» и все не так страшно:

PangoFontDescription *desc = pango_font_description_from_string("Sans Bold 27");
PangoLayout *layout = pango_cairo_create_layout(cr);
layout->set_text("Text", -1);
layout->set_font_description(desc);
pango_font_description_free(desc);

vs:

let font = pango::FontDescription::from_string("Sans Bold 27");
let layout = cr.create_pango_layout();
layout.set_text("Hello");
layout.set_font_description(Some(&font));

Абсолютно валидный код на С, хоть и не такой как предлагают авторы библиотеки. А если еще и расширения GCC использовать, С11 и добавить макросы, то можно вообще свести все к:

let desc = pango_font_description("Sans Bold 27")
let layout = pango_cairo_create_layout(cr);
layout->set_text("Text", -1);
layout->set_font_description(desc);
anonymous
()
Ответ на: комментарий от RazrFalcon

Специально скопипастю кусок:

Количество скобок одинаково, лол. Причем, сишный код монотонно чистый и понятный, хоть и многословный. А в расте рано или поздно (но всегда) начинется дрочь вприсядку со всеми мыслимыми закорючками. Выше приводили кусок из сервы, вот это оно.

bread
()
Ответ на: комментарий от tailgunner

Я спрашивал о том, зачем менять сырой указатель на unique_ptr в уже работающем коде, который больше не разрабыатыватся активно. По мне, это улучшайзинг ради улучшайзинга.

Не нужно менять голый указатель. Поскольку его там изначально не должно было быть. Как и такого левого конструктора копирования.

И эти рекомендации появились задолго до 2009-го года.

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

Тогда уточните, что вы подразумеваете под буквой. В одну букву такую «й» превращает уже движок текстового лайоута.

Советую научиться различать «букву» и «unicode codepoint».

В С вообще нет std.

Надеюсь, ты это не серьезно.

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

Да-да. Продолжайте держать публику в курсе.

Посмотрю на тебя, когда к тебе приедет код с лямбдой внутри лямбда-предиката.

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

Вспомнил шутку своего детства. Я знаю кунгфу, карате, ушу, айкидо и множество других страшных слов.

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

Абсолютно валидный код на С

Хотя нет, вру, валидный, но на стандартном С бессмысленный.

anonymous
()
Ответ на: комментарий от RazrFalcon

Просто лол.

Теперь ты знаешь как выглядела твоя попытка изобразить что-то через кортежи и From ;)

anonymous
()
Ответ на: комментарий от RazrFalcon

Я хотя бы понимаю, что такой код ужасен.

«В пользовательском коде такое никто писать не будет, а вот упростить API либы - самое оно.» (c)

А вы «упростили» код до убогого состояния

Еще и накосячил. Но, если таки говорить про возможности С, то добавив чуть магии из расширений, костылей и оберток я таки сделал компилябельный пример, где данная часть кода выглядит так:

let layout = PangoCairo.create_layout(cr);
let desc = Pango.create_font_description("Sans Bold 27");
layout.set_text("Text");
layout.set_font_description(desc);

Вполне себе (что осталось за сценой показывать не буду - сильно страшное :)), хотя я и понимаю, что сишники меня за такой код отпинали бы, да и сам я никогда такое в реально используемый проект не запихнул бы.

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

«В пользовательском коде такое никто писать не будет, а вот упростить API либы - самое оно.» (c)

И как из этого следует, что я одобряю подобный код?

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

«В пользовательском коде такое никто писать не будет, а вот упростить API либы - самое оно.» (c)

То, что ты демонстрируешь - это не упрощение API, а дро^Wбессмысленная акробатика.

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

То, что ты демонстрируешь - это не упрощение API, а дро^Wбессмысленная акробатика.

И я это написал несколько раз, но видно тебе не хватило.

anonymous
()
Ответ на: комментарий от RazrFalcon

И как из этого следует, что я одобряю подобный код?

«упростить API либы - самое оно» - не? Ну и что касается примера выше, то я согласен, что на С многословней, но в том числе по той же причине, по какой код на расте бывает многословней кода на С++, - есть идиоматический код, а есть, как тут выше написали, «дрочево». Можно из С попробовать сделать что-то похожее внешне на код из Rust, можно на Rust пытаться повторить код на С++, можно на С++ изображать рефлексию и пр., но все это будет костыльно, переусложнено и вряд ли найдет понимание и распространение. Хотя, если это в виде хобби для развлечения - почему бы и нет.

anonymous
()
Ответ на: комментарий от bread

Количество скобок одинаково, лол.

Не хочется даже представлять, насколько надо быть ушибленным на голову, чтобы читаемость кода определять по количеству скобок.

Причем, сишный код монотонно чистый и понятный, хоть и многословный.

Кто сказал «Лисп»? Код не должен быть монотонным, иначе он станет похож на обычный текст. Но обычный текст нормально читать бегло, пропуская малозначительные слова, при этом улавливая большую часть сути, а с кодом такое чревато упущением важных деталей.

А в расте рано или поздно (но всегда) начинется дрочь вприсядку со всеми мыслимыми закорючками. Выше приводили кусок из сервы, вот это оно.

Ох уж эти ушибленные бейсиком погроммисты.

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

Посмотрю на тебя, когда к тебе приедет код с лямбдой внутри лямбда-предиката.

Речь про что-то вот такое:

struct place {
  string name_;
  long price_;
  int rating_;
};
...
vector<place> places{ {"Moscow", 1500, 3}, {"Paris", 3000, 5}, ...};
sort(begin(places), end(places), [](const auto & a, const auto & b) {
    const auto t = [](const auto & p) { return tie(p.rating_, p.price_, p.name_); };
    return t(a) < t(b);
  });
?

Если да, то что в этом страшного?

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

И я это написал несколько раз, но видно тебе не хватило.

Мне хватило, чтобы понять - тебе нравится заниматься... бессмысленной акробатикой на публике. Но кто-то же должен был сказать, что твоя бессмысленная акробатика бессмысленна.

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

Мне хватило, чтобы понять - тебе нравится заниматься... бессмысленной акробатикой на публике. Но кто-то же должен был сказать, что твоя бессмысленная акробатика бессмысленна.

Твой треп бессмысленнен еще больше и обычно сводится к занудным нравоучениям, моя акробатика и примеры кода на Rust хотя бы позволяют разнообразить обсуждение, а ты зануда :Р

anonymous
()
Ответ на: комментарий от RazrFalcon

есть идиоматический код
Покажите пример работы с std::variant. Всё сразу станет на места.

Ну идиоматический код на С++ как раз обычно пишется без std::variant, но ладно:

#include <iostream>
#include <variant>
using namespace std;

int main() {
    variant<int, string> v = "123";

    if( holds_alternative<int>(v) )
        cout << "Integer: " << get<int>(v) << endl;
    else if( holds_alternative<string>(v) )
        cout << "String: " << get<string>(v) << endl;
}

Да, многословней Rust, но опять же никто так не пишет (в том числе потому-что неудобно, спорить не буду).

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

Хотя вот так чуть короче будет:

#include <iostream>
#include <variant>
using namespace std;

int main() {
    variant<int, string> v = "123";

    if( auto n = get_if<int>(&v) )
        cout << "Integer: " << *n << endl;
    else if( auto s = get_if<string>(&v) )
        cout << "String: " << *s << endl;
}
anonymous
()
Ответ на: комментарий от RazrFalcon

А с модификацией?

v = 123;
v ="123";

if(auto s = get_if<string>(&v))
    s->clear();

Или это о другом?

anonymous
()
Ответ на: комментарий от RazrFalcon

Лайоутом занимается HarfBuzz и Pango.

Лэйаутом может заниматься кто угодно. Но какие у вас претензии к stb?

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

Вспомнил шутку своего детства. Я знаю кунгфу, карате, ушу, айкидо и множество других страшных слов.

пока ты брызгал тут слюной я выучил Kotlin и взялся за SCALA

ThinkDifferent
()

Жаль что сигналы-слоты не в плане. И чего-нибудь бы про асинхронность, не такое деревянное как std::async.

anonymous
()
Ответ на: комментарий от Virtuos86

Не хочется даже представлять, насколько надо быть ушибленным на голову, чтобы читаемость кода определять по количеству скобок.

Так ты напряги извилину и прикинь, что скобки - это переключение контекста внимания. Чем больше таких переключений, тем сложнее восприятие. Ну если математику проходил в пту, должен это интуитивно осознавать. Так что оцениваю я не мифическую читаемость, а именно сложность восприятия структуры кода. Читаемость можно уронить в пол на любом языке, достаточно безумных идентификаторов.

bread
()
Ответ на: комментарий от ThinkDifferent

Советую хаскель перед скалой. Два выходных впереди, как раз профессионально выучишь.

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

Советую хаскель перед скалой. Два выходных впереди, как раз профессионально выучишь.

спасибо, но на новогодних каникулах

ThinkDifferent
()
Ответ на: комментарий от eao197

Ну да, если вручную имитировать Variant и не пользоваться шаблонами и готовыми библиотеками, то удивительно, что разрыв всего в 50%.

Вы не знаете программирования и языков о которых говорите сразу видно, RazrFalcon разбирается лучше. Пороху еще не нюхали, слушайте лучше его. Сразу видно кто профи, а кто нет и у кого кругозор шире.

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

Вы не знаете программирования
Пороху еще не нюхали

Спасибо! Вы сделали мой день.

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

Не хочется даже представлять, насколько надо быть ушибленным на голову, чтобы читаемость кода определять по количеству скобок.

Так ты напряги извилину и прикинь, что скобки - это переключение контекста внимания. Чем больше таких переключений, тем сложнее восприятие.

Бла-бла. Когда друг друга вложено несколько пар скобок — возможно, когда две-три пары — нет, потому что это обычное дело.

PangoLayout *layout;
PangoFontDescription *desc;
layout = pango_cairo_create_layout(cr); // два раза упоминается `layout`
pango_layout_set_text(layout, "Text", -1);  // два раза упоминается `layout`
description = pango_font_description_from_string("Sans Bold 27");  // два раза упоминаются `layout` и `description`
pango_layout_set_font_description(layout, description);  // два раза упоминаются `layout` и `description`
pango_font_description_free(description);  // два раза упоминается `description`
^Вот это имеет значение. А чтобы скобки не мешались, надо использовать форматирование кода.

если математику проходил в пту

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

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

Он слишком примитивный для моих задач.

Вы так и не пояснили, в чем же его примитивность.
stb_truetype заменяет freetype2.
stb_image грузит JPG, PNG, TGA, BMP, PSD, GIF, HDR, PIC. Пусть и с ограничениями, но задачу выполняет.

Вы каким-то боком вначале приплели сюда лэйауты, потом заговорили о какой-то примитивности. Но в действительности примитивны ваши отмазки.

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

Вы не знаете программирования и языков о которых говорите сразу видно, RazrFalcon разбирается лучше. Пороху еще не нюхали, слушайте лучше его. Сразу видно кто профи, а кто нет и у кого кругозор шире.

Шутка года.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.