1 1.8 rin /* $NetBSD: rasops_putchar.h,v 1.8 2019/08/10 01:24:17 rin Exp $ */ 2 1.1 rin 3 1.1 rin /* NetBSD: rasops8.c,v 1.41 2019/07/25 03:02:44 rin Exp */ 4 1.1 rin /*- 5 1.1 rin * Copyright (c) 1999 The NetBSD Foundation, Inc. 6 1.1 rin * All rights reserved. 7 1.1 rin * 8 1.1 rin * This code is derived from software contributed to The NetBSD Foundation 9 1.1 rin * by Andrew Doran. 10 1.1 rin * 11 1.1 rin * Redistribution and use in source and binary forms, with or without 12 1.1 rin * modification, are permitted provided that the following conditions 13 1.1 rin * are met: 14 1.1 rin * 1. Redistributions of source code must retain the above copyright 15 1.1 rin * notice, this list of conditions and the following disclaimer. 16 1.1 rin * 2. Redistributions in binary form must reproduce the above copyright 17 1.1 rin * notice, this list of conditions and the following disclaimer in the 18 1.1 rin * documentation and/or other materials provided with the distribution. 19 1.1 rin * 20 1.1 rin * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 1.1 rin * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 1.1 rin * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 1.1 rin * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 1.1 rin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 1.1 rin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 1.1 rin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 1.1 rin * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 1.1 rin * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 1.1 rin * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 1.1 rin * POSSIBILITY OF SUCH DAMAGE. 31 1.1 rin */ 32 1.1 rin 33 1.1 rin #if RASOPS_DEPTH != 8 && RASOPS_DEPTH != 15 && RASOPS_DEPTH != 24 && \ 34 1.1 rin RASOPS_DEPTH != 32 35 1.1 rin #error "Depth not supported" 36 1.1 rin #endif 37 1.1 rin 38 1.5 rin #if RASOPS_DEPTH == 8 39 1.5 rin #define COLOR_TYPE uint8_t 40 1.1 rin #elif RASOPS_DEPTH == 15 41 1.5 rin #define COLOR_TYPE uint16_t 42 1.1 rin #else 43 1.5 rin #define COLOR_TYPE uint32_t 44 1.5 rin #endif 45 1.5 rin 46 1.5 rin #if RASOPS_DEPTH != 24 47 1.6 rin #define PIXEL_TYPE COLOR_TYPE 48 1.6 rin #define PIXEL_BYTES sizeof(PIXEL_TYPE) 49 1.8 rin #define SET_COLOR(p, index) *(p)++ = clr[index] 50 1.6 rin #define SET_RGB(p, r, g, b) \ 51 1.6 rin *(p)++ = (((r) >> (8 - ri->ri_rnum)) << ri->ri_rpos) | \ 52 1.6 rin (((g) >> (8 - ri->ri_gnum)) << ri->ri_gpos) | \ 53 1.6 rin (((b) >> (8 - ri->ri_bnum)) << ri->ri_bpos) 54 1.1 rin #endif 55 1.1 rin 56 1.1 rin #if RASOPS_DEPTH == 24 57 1.6 rin #define PIXEL_TYPE uint8_t 58 1.5 rin #define PIXEL_BYTES 3 59 1.8 rin #define SET_COLOR(p, index) \ 60 1.1 rin do { \ 61 1.5 rin COLOR_TYPE c = clr[index]; \ 62 1.1 rin *(p)++ = c >> 16; \ 63 1.1 rin *(p)++ = c >> 8; \ 64 1.1 rin *(p)++ = c; \ 65 1.1 rin } while (0 /* CONSTCOND */) 66 1.6 rin #define SET_RGB(p, r, g, b) \ 67 1.6 rin do { \ 68 1.6 rin (p)[R_OFF] = (r); \ 69 1.6 rin (p)[G_OFF] = (g); \ 70 1.6 rin (p)[B_OFF] = (b); \ 71 1.6 rin (p) += 3; \ 72 1.6 rin } while (0 /* CONSTCOND */) 73 1.6 rin #endif 74 1.6 rin 75 1.6 rin #define AV(p, w) (((w) * (p)[1] + (0xff - (w)) * (p)[0]) >> 8) 76 1.6 rin 77 1.6 rin #if BYTE_ORDER == LITTLE_ENDIAN 78 1.6 rin #define R_OFF (ri->ri_rpos / 8) 79 1.6 rin #define G_OFF (ri->ri_gpos / 8) 80 1.6 rin #define B_OFF (ri->ri_bpos / 8) 81 1.6 rin #else /* BIG_ENDIAN XXX not tested */ 82 1.6 rin #define R_OFF (2 - ri->ri_rpos / 8) 83 1.6 rin #define G_OFF (2 - ri->ri_gpos / 8) 84 1.6 rin #define B_OFF (2 - ri->ri_bpos / 8) 85 1.6 rin #endif 86 1.6 rin 87 1.6 rin #define NAME(depth) NAME1(depth) 88 1.6 rin #ifndef RASOPS_AA 89 1.6 rin #define NAME1(depth) rasops ## depth ## _putchar 90 1.6 rin #else 91 1.6 rin #define NAME1(depth) rasops ## depth ## _putchar_aa 92 1.1 rin #endif 93 1.1 rin 94 1.1 rin /* 95 1.1 rin * Put a single character. 96 1.1 rin */ 97 1.1 rin static void 98 1.6 rin NAME(RASOPS_DEPTH)(void *cookie, int row, int col, u_int uc, long attr) 99 1.1 rin { 100 1.2 rin struct rasops_info *ri = (struct rasops_info *)cookie; 101 1.2 rin struct wsdisplay_font *font = PICK_FONT(ri, uc); 102 1.6 rin int height, width, cnt; 103 1.8 rin uint8_t *fr; 104 1.5 rin COLOR_TYPE clr[2]; 105 1.6 rin PIXEL_TYPE *dp, *rp, *hp; 106 1.1 rin 107 1.5 rin hp = NULL; /* XXX GCC */ 108 1.1 rin 109 1.7 rin if (__predict_false(!CHAR_IN_FONT(uc, font))) 110 1.1 rin return; 111 1.1 rin 112 1.1 rin #ifdef RASOPS_CLIPPING 113 1.1 rin /* Catches 'row < 0' case too */ 114 1.1 rin if ((unsigned)row >= (unsigned)ri->ri_rows) 115 1.1 rin return; 116 1.1 rin 117 1.1 rin if ((unsigned)col >= (unsigned)ri->ri_cols) 118 1.1 rin return; 119 1.1 rin #endif 120 1.1 rin 121 1.1 rin height = font->fontheight; 122 1.1 rin width = font->fontwidth; 123 1.1 rin 124 1.8 rin rp = (PIXEL_TYPE *)(ri->ri_bits + FBOFFSET(ri, row, col)); 125 1.8 rin if (ri->ri_hwbits) 126 1.8 rin hp = (PIXEL_TYPE *)(ri->ri_hwbits + FBOFFSET(ri, row, col)); 127 1.8 rin 128 1.8 rin clr[0] = (COLOR_TYPE)ATTR_BG(ri, attr); 129 1.8 rin clr[1] = (COLOR_TYPE)ATTR_FG(ri, attr); 130 1.1 rin 131 1.1 rin if (uc == ' ') { 132 1.1 rin while (height--) { 133 1.1 rin dp = rp; 134 1.5 rin for (cnt = width; cnt; cnt--) 135 1.8 rin SET_COLOR(dp, 0); 136 1.5 rin if (ri->ri_hwbits) { 137 1.5 rin uint16_t bytes = width * PIXEL_BYTES; 138 1.5 rin /* XXX GCC */ 139 1.5 rin memcpy(hp, rp, bytes); 140 1.6 rin DELTA(hp, ri->ri_stride, PIXEL_TYPE *); 141 1.1 rin } 142 1.6 rin DELTA(rp, ri->ri_stride, PIXEL_TYPE *); 143 1.1 rin } 144 1.1 rin } else { 145 1.1 rin fr = FONT_GLYPH(uc, font, ri); 146 1.6 rin 147 1.6 rin #ifdef RASOPS_AA 148 1.6 rin int off[2]; 149 1.6 rin uint8_t r[2], g[2], b[2]; 150 1.6 rin 151 1.6 rin /* 152 1.6 rin * This is independent to positions/lengths of RGB in pixel. 153 1.6 rin */ 154 1.6 rin off[0] = (((uint32_t)attr >> 16) & 0xf) * 3; 155 1.6 rin off[1] = (((uint32_t)attr >> 24) & 0xf) * 3; 156 1.6 rin 157 1.6 rin r[0] = rasops_cmap[off[0]]; 158 1.6 rin r[1] = rasops_cmap[off[1]]; 159 1.6 rin g[0] = rasops_cmap[off[0] + 1]; 160 1.6 rin g[1] = rasops_cmap[off[1] + 1]; 161 1.6 rin b[0] = rasops_cmap[off[0] + 2]; 162 1.6 rin b[1] = rasops_cmap[off[1] + 2]; 163 1.6 rin #endif 164 1.1 rin 165 1.1 rin while (height--) { 166 1.1 rin dp = rp; 167 1.6 rin 168 1.6 rin #ifndef RASOPS_AA 169 1.8 rin uint32_t fb = rasops_be32uatoh(fr); 170 1.6 rin fr += ri->ri_font->stride; 171 1.6 rin 172 1.8 rin for (cnt = width; cnt; cnt--) { 173 1.8 rin SET_COLOR(dp, (fb >> 31) & 1); 174 1.1 rin fb <<= 1; 175 1.1 rin } 176 1.8 rin #else /* RASOPS_AA */ 177 1.8 rin for (cnt = width; cnt; cnt--) { 178 1.6 rin int w = *fr++; 179 1.6 rin if (w == 0xff) 180 1.8 rin SET_COLOR(dp, 1); 181 1.6 rin else if (w == 0) 182 1.8 rin SET_COLOR(dp, 0); 183 1.6 rin else 184 1.6 rin SET_RGB(dp, 185 1.6 rin AV(r, w), AV(g, w), AV(b, w)); 186 1.6 rin } 187 1.6 rin #endif 188 1.5 rin if (ri->ri_hwbits) { 189 1.5 rin uint16_t bytes = width * PIXEL_BYTES; 190 1.5 rin /* XXX GCC */ 191 1.5 rin memcpy(hp, rp, bytes); 192 1.6 rin DELTA(hp, ri->ri_stride, PIXEL_TYPE *); 193 1.5 rin } 194 1.6 rin DELTA(rp, ri->ri_stride, PIXEL_TYPE *); 195 1.1 rin } 196 1.1 rin } 197 1.1 rin 198 1.1 rin /* Do underline */ 199 1.1 rin if ((attr & WSATTR_UNDERLINE) != 0) { 200 1.6 rin DELTA(rp, - ri->ri_stride * ri->ri_ul.off, PIXEL_TYPE *); 201 1.6 rin if (ri->ri_hwbits) 202 1.6 rin DELTA(hp, - ri->ri_stride * ri->ri_ul.off, 203 1.6 rin PIXEL_TYPE *); 204 1.8 rin 205 1.6 rin for (height = ri->ri_ul.height; height; height--) { 206 1.6 rin DELTA(rp, - ri->ri_stride, PIXEL_TYPE *); 207 1.6 rin dp = rp; 208 1.6 rin for (cnt = width; cnt; cnt--) 209 1.8 rin SET_COLOR(dp, 1); 210 1.6 rin if (ri->ri_hwbits) { 211 1.6 rin DELTA(hp, - ri->ri_stride, PIXEL_TYPE *); 212 1.6 rin uint16_t bytes = width * PIXEL_BYTES; 213 1.6 rin /* XXX GCC */ 214 1.6 rin memcpy(hp, rp, bytes); 215 1.6 rin } 216 1.1 rin } 217 1.1 rin } 218 1.1 rin } 219 1.1 rin 220 1.5 rin #undef COLOR_TYPE 221 1.6 rin 222 1.6 rin #undef PIXEL_TYPE 223 1.5 rin #undef PIXEL_BYTES 224 1.8 rin #undef SET_COLOR 225 1.6 rin #undef SET_RGB 226 1.6 rin 227 1.6 rin #undef AV 228 1.6 rin 229 1.6 rin #undef R_OFF 230 1.6 rin #undef G_OFF 231 1.6 rin #undef B_OFF 232 1.6 rin 233 1.6 rin #undef NAME 234 1.6 rin #undef NAME1 235