Библиотека-художник изображений для 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, использован для названий коммитов