Неочевидный функционал:
- открытие через аргумент командной строки.
- скролл колесиком, стрелками, PgUp, PgDown, скроллбар.
- горизонтальный скролл пока что только стрелками и shift+колесико.
В общем, потестируйте, и дайте обратную связь
Code: Select all
void render_DrawLen(pen_t *pen, char *buf, char *text, int len) {
int mask = pen->bold | (pen->italic << 1) | (pen->underline << 2) | (pen->strike << 3);
drawText(buf, pen->pos.x, pen->pos.y, text, len, pen->color + (0xFF << 24), ((mask * 0x100 + 0x03) * 0x100 + (int)(pen->font_size.x * pen->mul)) * 0x100 + (int)(pen->font_size.y * pen->mul));
pen->pos.x += (int)(pen->font_size.x * pen->mul) * len;
}
У меня есть один буфер, я сразу все на него рисую, а потом вывожу подпрямоугольники в окно. Вы, как я понял, предлагаете каждый раз заново отрисовывать в буфер, но только то, что необходимо в окне прямо сейчас? Мне кажется что так не очень эффективно - в моем способе просто вывести буфер, а здесь его надо каждый раз создавать. Хотя в любом случае вы лучше знаете про этоВот только буфер должен соответствовать размеру окна (рисовать только тот текст, который попадает в окно), а для этого нужна какая-нибудь связная структура документа (типа DOM или хотя бы список строк).
Графический буфер, при обновлении изображения, не создается заново, а стирается (заполняется цветом фона). Новый буфер создается только при изменении размера окна. В вашем случае, большой документ может не поместиться в буфере, или буфер не поместится в оперативной памяти.qullarwee wrote: ↑Sun Apr 16, 2023 7:30 pm У меня есть один буфер, я сразу все на него рисую, а потом вывожу подпрямоугольники в окно. Вы, как я понял, предлагаете каждый раз заново отрисовывать в буфер, но только то, что необходимо в окне прямо сейчас? Мне кажется что так не очень эффективно - в моем способе просто вывести буфер, а здесь его надо каждый раз создавать.
Значит используется кодировка utf-8. Длину символа можно определить по значению первого байта:
Code: Select all
// utf-8
int get_octet(char c) {
int octet = 0, bit = 7;
while (c & (1 << bit)) {
++octet;
--bit;
}
if (!octet) ++octet;
return octet;
}
void parse(char *filename) {
ksys_ufile_t ld = _ksys_load_file(filename);
if (ld.data == NULL) {
_ksys_exec("/sys/@notify", "'Marker\nFile not found!' -E -t");
exit(0);
}
int n = ld.size, octet;
data = ld.data;
//puts(data);
for (int i = 0; i < ld.size; i += octet) {
octet = get_octet(data[i]);
if (data[i] == '\n') {
render_NewLn(&pen);
if (pen.mode == header) {
pen.mul = 1;
pen.mode = plain;
}
if (pen.mode == quote) {
pen.color = 0xF7F7F7;
pen.mode = plain;
}
} else if (data[i] == '\\' && i + 1 < n) {
i++;
octet = get_octet(data[i]);
render_DrawLen(&pen, buffer, data + i, 1);
} else if (data[i] == '*' || data[i] == '_') {
if (i + 1 < n && data[i + 1] == data[i]) {
pen.bold ^= 1;
i++;
} else {
pen.italic ^= 1;
}
} else if (data[i] == '~' && i + 1 < n && data[i + 1] == '~') {
pen.strike ^= 1;
i++;
} else if (data[i] == '`') {
pen.underline ^= 1;
} else if ((i == 0 || (i > 0 && data[i - 1] == '\n')) && data[i] == '#') {
int cnt = 1;
while (i + cnt < n && data[i + cnt] == '#') cnt++;
if (cnt <= 6) {
pen.mode = header;
pen.mul = 1 + (6 - cnt) * 0.2;
i += cnt - 1;
while (i + 1 < n && data[i + 1] == ' ') i++;
}
} else if ((i == 0 || (i > 0 && data[i - 1] == '\n')) && data[i] == '>') {
pen.color = 0xF4FF00;
pen.mode = quote;
i++;
} else {
render_DrawLen(&pen, buffer, data + i, 1);
}
}
free(data);
}
Users browsing this forum: No registered users and 2 guests