Download raw body.
rasops32: fix fonts on byte swapped framebuffers
On Thu, Oct 08, 2026 at 11:33:57AM -0000, Crystal Kolipe wrote:
> The attached patch replaces the union-based type punning with bit-shifting.
Here is a cleaner version. The elaborate array initialisation using:
> ((uint64_t)((uint64_t)b * 0x100000001)) ^ (((i & 1)) * R_DH)
> ^ (((i & 2) >> 1) * R_DL)
... in the previous version was left over from trying to do the calculation on
the fly for each pixel pair, (which was significantly slower).
--- rasops32.c
+++ rasops32.c
@@ -68,10 +68,7 @@
uint32_t fb, clr[2];
struct rasops_info *ri;
int64_t *rp;
- union {
- int64_t q[4];
- int32_t d[4][2];
- } u;
+ uint64_t u_dot_q[4];
u_char *fr;
ri = (struct rasops_info *)cookie;
@@ -93,11 +90,12 @@
b = ri->ri_devcmap[(attr >> 16) & 0xf];
f = ri->ri_devcmap[(attr >> 24) & 0xf];
- u.d[0][0] = b; u.d[0][1] = b;
- u.d[1][0] = b; u.d[1][1] = f;
- u.d[2][0] = f; u.d[2][1] = b;
- u.d[3][0] = f; u.d[3][1] = f;
+ u_dot_q[0] = (uint64_t)b | (uint64_t)b << 32;
+ u_dot_q[1] = (uint64_t)b | (uint64_t)f << 32;
+ u_dot_q[2] = (uint64_t)f | (uint64_t)b << 32;
+ u_dot_q[3] = (uint64_t)f | (uint64_t)f << 32;
+
if (uc == ' ') {
while (height--) {
/* the general, pixel-at-a-time case is fast enough */
@@ -115,9 +113,9 @@
case 6:
while (height--) {
fb = fr[0];
- rp[0] = u.q[fb >> 6];
- rp[1] = u.q[(fb >> 4) & 3];
- rp[2] = u.q[(fb >> 2) & 3];
+ rp[0] = u_dot_q[fb >> 6];
+ rp[1] = u_dot_q[(fb >> 4) & 3];
+ rp[2] = u_dot_q[(fb >> 2) & 3];
rp += step;
fr += 1;
}
@@ -126,10 +124,10 @@
case 8:
while (height--) {
fb = fr[0];
- rp[0] = u.q[fb >> 6];
- rp[1] = u.q[(fb >> 4) & 3];
- rp[2] = u.q[(fb >> 2) & 3];
- rp[3] = u.q[fb & 3];
+ rp[0] = u_dot_q[fb >> 6];
+ rp[1] = u_dot_q[(fb >> 4) & 3];
+ rp[2] = u_dot_q[(fb >> 2) & 3];
+ rp[3] = u_dot_q[fb & 3];
rp += step;
fr += 1;
}
@@ -138,13 +136,13 @@
case 12:
while (height--) {
fb = fr[0];
- rp[0] = u.q[fb >> 6];
- rp[1] = u.q[(fb >> 4) & 3];
- rp[2] = u.q[(fb >> 2) & 3];
- rp[3] = u.q[fb & 3];
+ rp[0] = u_dot_q[fb >> 6];
+ rp[1] = u_dot_q[(fb >> 4) & 3];
+ rp[2] = u_dot_q[(fb >> 2) & 3];
+ rp[3] = u_dot_q[fb & 3];
fb = fr[1];
- rp[4] = u.q[fb >> 6];
- rp[5] = u.q[(fb >> 4) & 3];
+ rp[4] = u_dot_q[fb >> 6];
+ rp[5] = u_dot_q[(fb >> 4) & 3];
rp += step;
fr += 2;
}
@@ -153,15 +151,15 @@
case 16:
while (height--) {
fb = fr[0];
- rp[0] = u.q[fb >> 6];
- rp[1] = u.q[(fb >> 4) & 3];
- rp[2] = u.q[(fb >> 2) & 3];
- rp[3] = u.q[fb & 3];
+ rp[0] = u_dot_q[fb >> 6];
+ rp[1] = u_dot_q[(fb >> 4) & 3];
+ rp[2] = u_dot_q[(fb >> 2) & 3];
+ rp[3] = u_dot_q[fb & 3];
fb = fr[1];
- rp[4] = u.q[fb >> 6];
- rp[5] = u.q[(fb >> 4) & 3];
- rp[6] = u.q[(fb >> 2) & 3];
- rp[7] = u.q[fb & 3];
+ rp[4] = u_dot_q[fb >> 6];
+ rp[5] = u_dot_q[(fb >> 4) & 3];
+ rp[6] = u_dot_q[(fb >> 2) & 3];
+ rp[7] = u_dot_q[fb & 3];
rp += step;
fr += 2;
}
@@ -170,25 +168,25 @@
case 32:
while (height--) {
fb = fr[0];
- rp[0] = u.q[fb >> 6];
- rp[1] = u.q[(fb >> 4) & 3];
- rp[2] = u.q[(fb >> 2) & 3];
- rp[3] = u.q[fb & 3];
+ rp[0] = u_dot_q[fb >> 6];
+ rp[1] = u_dot_q[(fb >> 4) & 3];
+ rp[2] = u_dot_q[(fb >> 2) & 3];
+ rp[3] = u_dot_q[fb & 3];
fb = fr[1];
- rp[4] = u.q[fb >> 6];
- rp[5] = u.q[(fb >> 4) & 3];
- rp[6] = u.q[(fb >> 2) & 3];
- rp[7] = u.q[fb & 3];
+ rp[4] = u_dot_q[fb >> 6];
+ rp[5] = u_dot_q[(fb >> 4) & 3];
+ rp[6] = u_dot_q[(fb >> 2) & 3];
+ rp[7] = u_dot_q[fb & 3];
fb = fr[2];
- rp[8] = u.q[fb >> 6];
- rp[9] = u.q[(fb >> 4) & 3];
- rp[10] = u.q[(fb >> 2) & 3];
- rp[11] = u.q[fb & 3];
+ rp[8] = u_dot_q[fb >> 6];
+ rp[9] = u_dot_q[(fb >> 4) & 3];
+ rp[10] = u_dot_q[(fb >> 2) & 3];
+ rp[11] = u_dot_q[fb & 3];
fb = fr[3];
- rp[12] = u.q[fb >> 6];
- rp[13] = u.q[(fb >> 4) & 3];
- rp[14] = u.q[(fb >> 2) & 3];
- rp[15] = u.q[fb & 3];
+ rp[12] = u_dot_q[fb >> 6];
+ rp[13] = u_dot_q[(fb >> 4) & 3];
+ rp[14] = u_dot_q[(fb >> 2) & 3];
+ rp[15] = u_dot_q[fb & 3];
rp += step;
fr += 4;
}
rasops32: fix fonts on byte swapped framebuffers