«Claude Monet» это не только ресторан французской кухни

Пару недель назад совершенно случайно прочитал статью про Клода Моне: «Почему Клод Моне уничтожал свои картины?». Статья отличная, рекомендую! Во время чтения свербила мысль, что Клод Моне — что-то очень знакомое.. А ведь именно так называется ресторан из сериала «Кухня».

От Моне до Сезанна

Под впечатлением от статьи и сериала решили посетить выставку «От Моне до Сезанна. Французские импрессионисты», что проходит в Ленэкспо.

От Моне до Сезанна

Под классическую музыку на фоне картин танцуют балерины. Выглядит — превосходно!

От Моне до Сезанна

От Моне до Сезанна

От Моне до Сезанна

Приятно, что французские импрессионисты писали свои картины в «низком разрешении», потому что мой мобильник только так и умеет фотографировать.

От Моне до Сезанна

От Моне до Сезанна

От Моне до Сезанна

Пиксели на экране размером с пятикопеечную монету, но это совершенно незаметно.

От Моне до Сезанна

Выставка проводится в Ленэкспо, павильон №3. Спешите посетить, выставка в Петербурге заканчивается 31-го марта!

Сайт выставки: http://monet-cezanne.ru/. Билеты продаются при входе в павильон.

P.S. Вопрос в пустоту: что думают люди, которые фотографируют проекцию картины на экран со вспышкой?

Использование библиотеки FreeType для растеризации символов

Всем поклонникам OpenSource приложений известна библиотека растеризации шрифтов FreeType. Её используют практически все графические приложения под GNU/Linux. Давайте освоим эту библиотеку.

Основные объекты FreeType:

  • FT_Library — основной объект библиотеки, который нужно инициализировать перед работой
  • FT_Face — представляет загруженный шрифт со всеми его характеристиками, который загружается с помощью FT_Library
  • FT_Glyph — глиф шрифта, который создается при помощи FT_Face

Таким образом, для отображения символа нам надо создать объект типа FT_Library, затем загрузить шрифт в объект типа FT_Face, после этого рисовать символы при помощи FT_Glyph.

Символ из шрифта можно извлечь двумя способами:

  1. Получить информацию для его рисования кривыми
  2. Получить готовое изображение

Первый способ нам неинтересен, будем использовать сразу второй. Поехали (проверка ошибок убрана для упрощения кода):

#include <ft2build.h>
#include FT_FREETYPE_H

int main()
{
    // Библиотека FreeType
    FT_Library library = 0;

    // Инициализация библиотеки
    FT_Init_FreeType(&library);

    // Шрифт
    FT_Face face = 0;

    // Загрузка шрифта
    FT_New_Face(library, "tahoma.ttf", 0, &face);

    // Установка размера пикселя
    FT_Set_Pixel_Sizes(face, 24, 12);

    // Код символа (юникод)
    const FT_ULong charCode = L'W';

    // Загрузка глифа из шрифта с его отрисовкой
    FT_Load_Char(face, charCode, FT_LOAD_RENDER);

    // Получение готового к использованию глифа
    FT_GlyphSlot glyph = face->glyph;

    // Получение размеров глифа
    const int width = glyph->bitmap.width;
    const int height = glyph->bitmap.rows;
    const int pitch = glyph->bitmap.pitch;

    // Вывод символа в консоли
    for (int y = 0; y < height; ++y)
    {
        for (int x = 0; x < width; ++x)
        {
            // Получение прозрачности точки (x, y)
            const int a = glyph->bitmap.buffer[y * pitch + x];

            if (a > 127)
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }
        }
        printf("\n");
    }

    // Удаление шрифта
    FT_Done_Face(face);
    face = 0;

    // Удаление библиотеки
    FT_Done_FreeType(library);
    library = 0;
}

Консоль:

**        ***      ***
 **      ****      **
 **      ****     ***
  **    **  **    **
  **    *   **   ***
   **  **    **  **
   **  *      * ***
    ****      ****
    ***        ***

Отличная работа, но для вывода слова из нескольких букв простого изображения символа недостаточно. Необходимо иметь следующую информацию:

  • положение горизонтальной базовой линии (например, «W» — внизу, «y» — примерно середина высоты)
  • межстрочный интервал (если вы хотите вывести многострочный текст)
  • кернинг (расстояние между различными буквами)

Эти параметры доступны через структуру FT_Face. Подробнее о работе с текстом — в следующей части!

Выводим текст в OpenGL/ES 2.0

Перед каждый разработчиком, если он пишет приложение графическое на своём движке, рано или поздно встаёт вопрос: каким образом вывести текст. Напомню, что OpenGL/ES умеет только рисовать треугольники и накладывать на них текстуру.

Существуют три основных подхода:

Готовые текстовые битмапы

Все надписи, которые встречаются в игре, рисуются заранее в текстуру. Такой вариант самый быстрый и простой в реализации для программиста. Фактически, вам надо взять текстуру и ее нарисовать (надеюсь вы это уже умеете).
Даёт полный простор для творчества, можно рисовать любую надпись, любым стилем и цветом.
Для оптимизации можно все надписи поместить в одну текстуру и рисовать все надписи на экране в один проход. При локализации необходимо рисовать другую текстуру с переведенным текстом.

Плюсы:

  • Максимальная производительность
  • Полная свобода дизайна (любые стили и эффекты)
  • Всю работу делает художник/дизайнер

Минусы:

  • Медленная локализация
  • Большой расход памяти
  • Нельзя динамически менять текст

Текстура с символами (текстурный атлас)

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

Плюсы:

  • Относительно высокая производительность
  • Быстрая локализация (сгенерировать новую текстуру для языка)
  • Шрифт в любом стиле
  • Динамическое изменение надписи

Минусы:

  • Необходимо написать генератор этих текстур
  • Для разных языков нужны разные атласы
  • Локализация увеличивает размер приложения

Динамическая генерация из файла шрифта

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

Текстуру можно создавать двумя способами: заполнить её всеми используемыми символами (26 — латинский алфавит, 33 — кириллица) или добавлять символ только тогда, когда он понадобится. Уже сложившейся традицией для генерации символа из шрифта является использование библиотеки FreeType.

Плюсы:

  • Минимальный расход памяти (один файл шрифта)
  • Простая локализация
  • Полная динамичность текста
  • Поддержка всех языков

Минусы:

  • Требует больше CPU при первом использовании символов
  • Ограниченный стиль (зависит от шрифта)
  • Сложная реализация

Подробнее о работе с FreeType (+ практический пример) читайте в моём следующем посте: «Использование библиотеки FreeType для растеризации символов».

Музей LEGO в Петербурге

Посетили в выходные музей LEGO на Вознесенском 44-46. Стоимость билета 300 рублей для взрослых, детям до трёх лет — бесплатно.

Что можно сказать по результатам посещения — отличное место!

Самолет. Музей LEGO

Рекомендую обязательно посетить вместе с детьми.

Звездные войны. Музей LEGO

В экспозициях спрятаны фигурки разбойника в белой шляпе и маске на лице. За десять найденных фигурок дают значок. Всего таких фигурок в музее пятнадцать. Нашедшему всех дают ещё один подарок.

Зимний дворец. Музей LEGO

По залу носятся дети и периодически слышны возгласы: «Мы нашли семь!», «Осталось пять!», «Вот-вот, смотри!».

Мотоциклы. Музей LEGO

Мы нашли всех и каждого сфотографировали, но я вам ничего не покажу, чтобы не испортить сюрприз. Дам только подсказку: фигурки есть в каждом стенде, кроме одного. Этого стенда, кстати, на моих фотографиях нет.

Пушка. Музей LEGO

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

Тысячелетний сокол. Музей LEGO

Приходите, не пожалеете!

Кран. Музей LEGO

Если вам понравилась запись, читайте также про посещение гранд макета России.

Как перевести бабушку через КАД

crossy-road КАД опасное для пешеходов место, поэтому тренироваться в этом нелёгком деле лучше на симуляторе.

Представляю вашему вниманию игру Crossy Road. Задача игры — перевести кубического персонажа а-ля Minecraft через шоссе, реку и железную дорогу.

Установил я эту игру давно, а вот запустил только после восторженных отзывов коллеги (привет, Юра!).

На выбор доступны: Франкенштейн, собака, улитка и ещё куча разных существ. У многих есть своя фишка: кит-хипстер фоткает, корова-тусовщица танцует, дохлая рыбка делает шлёп-шлёп, а ржавый робот искрит. В общем, качайте — не пожалеете. К разработчикам игры не имею отношения, а жаль. (:

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

Для нетерпеливых и состоятельных пацанов есть возможность купить персонажа сразу за 50 настоящих рублей.

Ссылки на игру: для Android, для iOS.

Личный блог Евгения Жирнова