Библиотека-художник изображений для bytekot телеграм бота, для генерации изображения из текстового представления байткода с подсветкой. Так же планируется использование в javap-viewer.
Суть проста, библиотека экспоузит наружу (пока что) один единственный метод, paint (и free_image_data) принимающий аргумент "си строки", input и возвращает структуру с данными, первый собственно сам jvm байткод,
второй это путь, куда будет сохранена картинка (в зависимости от ОС, относительный и абсолютный путь, зависят от прямого слеша или точки с прямым слешем).
- Любые баг-фиксы, улучшения приветствуются :) https://github.com/bytekodex/bytekot-painter/pulls
- Любые баг репорты, предложения, так же приветствуются https://github.com/bytekodex/bytekot-painter/issues
Готовый образ (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- JDK (Или JRE) 11 версии и выше.
- Rust 1.76.0 и выше.
- Сфетчите гитовые сабмодули
git submodule init && git submodule update- Сгенерируем antlr лексер и парсер
java -jar rust-antlr.jar -Dlanguage=Rust antlr/JBytecodeParser.g4 antlr/JBytecodeLexer.g4 -o ./src/antlr/- Соберем библиотеку (по умолчанию генерируется динамическая библиотека
.dllна винде и.soна linux)
cargo build --release- Скомпилированная библиотека будет в
./target/releaseс названиемbytekot_painter.dllили на linuxlibbytekot_painter.so
docker build -t bytecodex/bytekot-painter:v1.1.3 .Входные параметры: Байткод java.util.jar.JarEntry полученный с javap с аргументом -c.
Результат:
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 функция, которая принимает в себя указатель на массив и его длинну.
- Rust, лицензирован с MIT и Apache 2.0
- Antlr4, лицензирован с BSD 3
- Skia, лицензирован с BSD 3
- Jetbrains AI, использован для названий коммитов

