Skip to content

Bytekot painter is a library written in rust for drawing image with bytecode and highlight it

License

Notifications You must be signed in to change notification settings

bytekodex/bytekot-painter

Repository files navigation

Bytekot painter

Quality Gate Status Security Rating Code Smells

Библиотека-художник изображений для bytekot телеграм бота, для генерации изображения из текстового представления байткода с подсветкой. Так же планируется использование в javap-viewer.

Суть проста, библиотека экспоузит наружу (пока что) один единственный метод, paintfree_image_data) принимающий аргумент "си строки", input и возвращает структуру с данными, первый собственно сам jvm байткод, второй это путь, куда будет сохранена картинка (в зависимости от ОС, относительный и абсолютный путь, зависят от прямого слеша или точки с прямым слешем).

Баги и улучшения

Готовый образ

Готовый образ (linux/amd64) доступен в официальном docker hub по имени bytecodex/bytekot-painter

docker push bytecodex/bytekot-painter:v1.1.3

Для multi-stage сборки, аналогичным образом (он содержит только файл динамической библиотеки и заголовочный файл (bytekot_painter.dll/so,bytekot_painter.h))

FROM bytecodex/bytekot-painter:v1.1.3 as bytekot-painter

Сборка

Bare Metal

Требования:

  • JDK (Или JRE) 11 версии и выше.
  • Rust 1.76.0 и выше.

Шаги

  1. Сфетчите гитовые сабмодули
git submodule init && git submodule update
  1. Сгенерируем antlr лексер и парсер
java -jar rust-antlr.jar -Dlanguage=Rust antlr/JBytecodeParser.g4 antlr/JBytecodeLexer.g4 -o ./src/antlr/
  1. Соберем библиотеку (по умолчанию генерируется динамическая библиотека .dll на винде и .so на linux)
cargo build --release
  1. Скомпилированная библиотека будет в ./target/release с названием bytekot_painter.dll или на linux libbytekot_painter.so

Docker

docker build -t bytecodex/bytekot-painter:v1.1.3 .

Пример результата

Входные параметры: Байткод java.util.jar.JarEntry полученный с javap с аргументом -c.

Результат:

API

API библиотеки очень простой, всего две функции, собственно, вот хедер для наглядности.

typedef struct ImageResult {
  const unsigned char *data;
  uintptr_t len;
  int status;
} ImageResult;

struct ImageResult paint(const char *input);

void free_image_data(unsigned char *ptr, uintptr_t len);

paint принимает обычную си строку с байткодом для обработки и всегда возвращает структуру ImageResult.

data Это указатель на данные массива, которые в последствии можно записать в файл, массив этих байтов является форматом png.

len Это длина массива.

status Это статус операции, ниже коды ошибок представленные кодом:

const ERR_SUCCESS: i32 = 0;
const ERR_TOO_LARGE_IMAGE: i32 = -1;
const ERR_RASTER_CREATION_FAILURE: i32 = -2;
const ERR_IMAGE_ENCODING_FAILURE: i32 = -3;

Отдельное пояснение, ERR_TOO_LARGE_IMAGE возвращается если высота больше 8192 или height * width > 27852800.

Соответственно для того чтобы не создавать утечку памяти, есть free_image_data функция, которая принимает в себя указатель на массив и его длинну.

Использованные технологии

About

Bytekot painter is a library written in rust for drawing image with bytecode and highlight it

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published