mirror of
https://github.com/kovidgoyal/kitty.git
synced 2026-07-03 11:12:30 +08:00
Fix display of glyph data
This commit is contained in:
@@ -136,8 +136,8 @@ static id_type font_group_id_counter = 0;
|
||||
static void initialize_font_group(FontGroup *fg);
|
||||
|
||||
static void
|
||||
display_rgba_data(const pixel *b, unsigned width, unsigned height) {
|
||||
print_rgba32(b, width, height);
|
||||
display_glyph(const pixel *b, unsigned width, unsigned height) {
|
||||
print_argb32(b, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -357,7 +357,7 @@ calculate_underline_exclusion_zones(pixel *buf, const FontGroup *fg, DecorationG
|
||||
}
|
||||
thickness = MAX(1u, thickness);
|
||||
if (0) printf("dg: %u %u cell_height: %u scaled_cell_height: %u\n", dg.top, dg.height, fg->fcm.cell_height, scaled_metrics.cell_height);
|
||||
if (0) { display_rgba_data(buf, fg->fcm.cell_width, fg->fcm.cell_height); printf("\n"); }
|
||||
if (0) { display_glyph(buf, fg->fcm.cell_width, fg->fcm.cell_height); printf("\n"); }
|
||||
unsigned max_overlap = 0;
|
||||
#define is_rendered(x, y) ((buf[(y) * fg->fcm.cell_width + (x)] & 0x000000ff) > 0)
|
||||
for (unsigned x = 0; x < fg->fcm.cell_width; x++) {
|
||||
@@ -387,7 +387,7 @@ current_send_sprite_to_gpu(FontGroup *fg, pixel *buf, DecorationMetadata dec, Fo
|
||||
if (dec.underline_region.height && OPT(underline_exclusion).thickness > 0) calculate_underline_exclusion_zones(
|
||||
buf, fg, dec.underline_region, scaled_metrics);
|
||||
send_sprite_to_gpu((FONTS_DATA_HANDLE)fg, ans, buf, dec.start_idx);
|
||||
if (0) { printf("Sprite: %u dec_idx: %u\n", ans, dec.start_idx); display_rgba_data(buf, fg->fcm.cell_width, fg->fcm.cell_height); printf("\n"); }
|
||||
if (0) { printf("Sprite: %u dec_idx: %u\n", ans, dec.start_idx); display_glyph(buf, fg->fcm.cell_width, fg->fcm.cell_height); printf("\n"); }
|
||||
return ans;
|
||||
}
|
||||
|
||||
@@ -1221,12 +1221,12 @@ render_group(
|
||||
scaled_canvas_width = canvas_width;
|
||||
} else memcpy(fg->canvas.buf, canvas, sizeof(pixel) * canvas_width * scaled_metrics.cell_height);
|
||||
canvas = fg->canvas.buf;
|
||||
if (0) { print_rgba32(fg->canvas.buf, canvas_width, unscaled_metrics.cell_height); printf("\n"); }
|
||||
}
|
||||
apply_horizontal_alignment(
|
||||
canvas, rf, center_glyph, ri, canvas_width,
|
||||
scaled_metrics.cell_height, num_scaled_cells, num_glyphs, was_colored);
|
||||
if (PyErr_Occurred()) PyErr_Print();
|
||||
// display_glyph(canvas, canvas_width, unscaled_metrics.cell_height); printf("\n");
|
||||
|
||||
fg->fcm = unscaled_metrics; // needed for current_send_sprite_to_gpu()
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ fprint_rgba32(FILE *fp, const uint32_t *rgba, uint32_t width, uint32_t height) {
|
||||
offset += chunk;
|
||||
const bool last = (offset >= total_bytes);
|
||||
if (first) {
|
||||
fprintf(fp, "\x1b_Ga=T,f=32,s=%u,v=%u,m=%d;", width, height, last ? 0 : 1);
|
||||
fprintf(fp, "\x1b_Ga=T,q=2,f=32,s=%u,v=%u,m=%d;", width, height, last ? 0 : 1);
|
||||
first = false;
|
||||
} else fprintf(fp, "\x1b_Gm=%d;", last ? 0 : 1);
|
||||
fwrite(b64_buf, 1, b64_len, fp);
|
||||
@@ -36,24 +36,24 @@ fprint_rgba32(FILE *fp, const uint32_t *rgba, uint32_t width, uint32_t height) {
|
||||
|
||||
static inline void
|
||||
fprint_argb32(FILE *fp, const uint32_t *rgba, uint32_t width, uint32_t height) {
|
||||
const uint8_t *data = (const uint8_t *)rgba;
|
||||
const size_t total_bytes = (size_t)width * height * sizeof(uint32_t);
|
||||
uint8_t b64_buf[4096], rgba_buf[3072];
|
||||
uint8_t b64_buf[4096];
|
||||
uint32_t rgba_buf[3072/4];
|
||||
size_t offset = 0;
|
||||
bool first = true;
|
||||
while (offset < total_bytes) {
|
||||
size_t chunk = total_bytes - offset;
|
||||
if (chunk > sizeof(rgba_buf)) chunk = sizeof(rgba_buf);
|
||||
size_t b64_len = sizeof(b64_buf);
|
||||
for (size_t i = 0; i < chunk; i++) {
|
||||
uint32_t argb = data[offset + i];
|
||||
for (size_t i = 0; i < chunk/4; i++) {
|
||||
uint32_t argb = rgba[offset/4 + i];
|
||||
rgba_buf[i] = ((argb & 0x00FFFFFF) << 8) | ((argb & 0xFF000000) >> 24);
|
||||
}
|
||||
base64_encode8(rgba_buf, chunk, b64_buf, &b64_len, false);
|
||||
base64_encode8((const uint8_t*)rgba_buf, chunk, b64_buf, &b64_len, false);
|
||||
offset += chunk;
|
||||
const bool last = (offset >= total_bytes);
|
||||
if (first) {
|
||||
fprintf(fp, "\x1b_Ga=T,f=32,s=%u,v=%u,m=%d;", width, height, last ? 0 : 1);
|
||||
fprintf(fp, "\x1b_Ga=T,q=2,f=32,s=%u,v=%u,m=%d;", width, height, last ? 0 : 1);
|
||||
first = false;
|
||||
} else fprintf(fp, "\x1b_Gm=%d;", last ? 0 : 1);
|
||||
fwrite(b64_buf, 1, b64_len, fp);
|
||||
@@ -61,7 +61,37 @@ fprint_argb32(FILE *fp, const uint32_t *rgba, uint32_t width, uint32_t height) {
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
fprint_abgr32(FILE *fp, const uint32_t *src, uint32_t width, uint32_t height) {
|
||||
const size_t total_bytes = (size_t)width * height * sizeof(uint32_t);
|
||||
uint8_t b64_buf[4096];
|
||||
uint32_t rgba_buf[3072/4];
|
||||
size_t offset = 0;
|
||||
bool first = true;
|
||||
while (offset < total_bytes) {
|
||||
size_t chunk = total_bytes - offset;
|
||||
if (chunk > sizeof(rgba_buf)) chunk = sizeof(rgba_buf);
|
||||
size_t b64_len = sizeof(b64_buf);
|
||||
for (size_t i = 0; i < chunk/4; i++) {
|
||||
uint32_t abgr = src[offset/4 + i];
|
||||
rgba_buf[i] = __builtin_bswap32(abgr);
|
||||
}
|
||||
base64_encode8((const uint8_t*)rgba_buf, chunk, b64_buf, &b64_len, false);
|
||||
offset += chunk;
|
||||
const bool last = (offset >= total_bytes);
|
||||
if (first) {
|
||||
fprintf(fp, "\x1b_Ga=T,q=2,f=32,s=%u,v=%u,m=%d;", width, height, last ? 0 : 1);
|
||||
first = false;
|
||||
} else fprintf(fp, "\x1b_Gm=%d;", last ? 0 : 1);
|
||||
fwrite(b64_buf, 1, b64_len, fp);
|
||||
fputs("\x1b\\", fp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static inline void
|
||||
print_rgba32(const uint32_t *rgba, uint32_t width, uint32_t height) { fprint_rgba32(stdout, rgba, width, height); }
|
||||
static inline void
|
||||
print_argb32(const uint32_t *rgba, uint32_t width, uint32_t height) { fprint_argb32(stdout, rgba, width, height); }
|
||||
static inline void
|
||||
print_abgr32(const uint32_t *rgba, uint32_t width, uint32_t height) { fprint_abgr32(stdout, rgba, width, height); }
|
||||
|
||||
Reference in New Issue
Block a user