layout.h (2558B)
1 /* layout.h - disposicion 2D de una expresion (fracciones apiladas, raices, exponentes) 2 * con una metrica abstracta: pixeles (PicoCalc / ventana) o celdas (terminal). 3 * Dos pasadas iterativas (medir y ubicar), sin recursion. El resultado es una lista 4 * de items para dibujar y la posicion de cada hueco del cursor. */ 5 #ifndef LAYOUT_H 6 #define LAYOUT_H 7 #include <stdint.h> 8 #include <stdbool.h> 9 #include "expr.h" 10 11 /* codigos de glifo propios (en la fuente de la calculadora van en 0x80..0x9F) */ 12 enum { 13 CF_PI = 0x80, CF_SQRT, CF_SUPMINUS, CF_LE, CF_GE, CF_NE, CF_ARROW, CF_ANGLE, 14 CF_XHAT, CF_YHAT, CF_XBAR, CF_YBAR, CF_BOX, CF_SIGMA, CF_SIGMAS, CF_THETA, CF_INF, 15 CF_SD, CF_TRI_R, CF_TRI_D, CF_TRI_U, CF_TRI_L, CF_SMALLE, 16 CF_LARROW, CF_UARROW, CF_DARROW, CF_CBRT, CF_APPROX, CF_BIGPI, CF_INTEG, CF_PRIME, CF_DPRIME 17 }; 18 int cf_code(int codepoint); /* unicode -> glifo (? si no hay) */ 19 int cf_utf8(int code, char *out); /* glifo -> utf-8 (para la terminal) */ 20 int cf_decode(const char *utf8, uint8_t *codes, int max); /* texto -> glifos */ 21 22 typedef struct { 23 int8_t cw[2], asc[2], desc[2]; /* por nivel: 0 normal, 1 chico (exponentes, indices) */ 24 int8_t ax[2]; /* altura del eje de la fraccion sobre la linea base */ 25 int8_t gap, bar, pad; /* fraccion: separacion, grosor de la barra, margen */ 26 int8_t rad_w, rad_gap; /* raiz: ancho del signo, separacion sobre el contenido */ 27 int8_t raise[2]; /* cuanto sube un exponente (segun el nivel de la base) */ 28 int8_t drop; /* cuanto baja la base de un log */ 29 int8_t abs_w; /* ancho de cada barra de valor absoluto */ 30 bool cells; /* terminal: exponentes simples en linea (superindices) */ 31 } Metric; 32 33 enum { LI_GLYPH, LI_HBAR, LI_RAD, LI_PAREN, LI_ABS, LI_BOX, LI_INTEG, LI_BIGOP }; /* BIGOP: code 'S' Σ, 'P' Π */ 34 typedef struct { uint8_t kind, code, lvl; int16_t x, y, w, h; } LItem; /* y = arriba */ 35 36 #define LAYOUT_ITEMS 220 37 typedef struct { 38 LItem it[LAYOUT_ITEMS]; 39 int n; 40 int16_t w, asc, desc; /* caja total (la base en y = asc) */ 41 int16_t gx[EXPR_MAX + 1], gy[EXPR_MAX + 1], gh[EXPR_MAX + 1]; /* huecos del cursor */ 42 uint8_t glvl[EXPR_MAX + 1]; 43 } Layout; 44 45 void layout_expr(const Expr *e, const Metric *m, Layout *out); 46 /* cursor arriba/abajo: el hueco de la fila de arriba/abajo mas cercano en x (o -1) */ 47 int layout_cursor_vert(const Layout *L, const Expr *e, int cur, int dir); 48 49 #endif