Changeset 6a87f28 in mainline for uspace/lib/gfxfont/src


Ignore:
Timestamp:
2021-02-25T16:48:13Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bac8acab
Parents:
26853ebc
Message:

First attempt at printing text in text-mode via GFX

Location:
uspace/lib/gfxfont/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/gfxfont/src/font.c

    r26853ebc r6a87f28  
    180180}
    181181
     182/** Create dummy font for printing text in text mode.
     183 *
     184 * @param tface Typeface
     185 * @param rfont Place to store pointer to new font
     186 *
     187 * @return EOK on success, EINVAL if parameters are invald,
     188 *         ENOMEM if insufficient resources, EIO if graphic device connection
     189 *         was lost
     190 */
     191errno_t gfx_font_create_textmode(gfx_typeface_t *tface, gfx_font_t **rfont)
     192{
     193        gfx_font_props_t props;
     194        gfx_font_metrics_t metrics;
     195
     196        gfx_font_props_init(&props);
     197        props.size = 1;
     198        props.flags = gff_text_mode;
     199
     200        gfx_font_metrics_init(&metrics);
     201        metrics.ascent = 0;
     202        metrics.descent = 0;
     203        metrics.leading = 1;
     204
     205        return gfx_font_create(tface, &props, &metrics, rfont);
     206}
     207
    182208/** Open font.
    183209 *
     
    229255void gfx_font_get_metrics(gfx_font_t *font, gfx_font_metrics_t *metrics)
    230256{
    231         *metrics = font->metrics;
     257        if (font != NULL) {
     258                *metrics = font->metrics;
     259        } else {
     260                metrics->ascent = 0;
     261                metrics->descent = 0;
     262                metrics->leading = 1;
     263        }
    232264}
    233265
  • uspace/lib/gfxfont/src/text.c

    r26853ebc r6a87f28  
    3535
    3636#include <errno.h>
     37#include <gfx/bitmap.h>
    3738#include <gfx/font.h>
    3839#include <gfx/glyph.h>
    3940#include <gfx/text.h>
     41#include <io/pixelmap.h>
    4042#include <mem.h>
     43#include <str.h>
     44#include "../private/font.h"
     45#include "../private/typeface.h"
    4146
    4247/** Initialize text formatting structure.
     
    6671        gfx_coord_t width;
    6772        errno_t rc;
     73
     74        if ((font->finfo->props.flags & gff_text_mode) != 0)
     75                return str_width(str);
    6876
    6977        width = 0;
     
    8391
    8492        return width;
     93}
     94
     95/** Print string using text characters in text mode.
     96 *
     97 * @param font Font
     98 * @param pos Position of top-left corner of text
     99 * @param str String
     100 * @return EOK on success or an error code
     101 */
     102static errno_t gfx_puttext_textmode(gfx_font_t *font, gfx_coord2_t *pos,
     103    const char *str)
     104{
     105        gfx_context_t *gc = font->typeface->gc;
     106        gfx_bitmap_params_t params;
     107        gfx_bitmap_t *bitmap;
     108        gfx_bitmap_alloc_t alloc;
     109        pixelmap_t pmap;
     110        gfx_coord_t x;
     111        pixel_t pixel;
     112        errno_t rc;
     113
     114        /*
     115         * NOTE: Creating and destroying bitmap each time is not probably
     116         * the most efficient way.
     117         */
     118
     119        gfx_bitmap_params_init(&params);
     120        params.rect.p0.x = 0;
     121        params.rect.p0.y = 0;
     122        params.rect.p1.x = str_width(str);
     123        params.rect.p1.y = 1;
     124
     125        rc = gfx_bitmap_create(gc, &params, NULL, &bitmap);
     126        if (rc != EOK)
     127                return rc;
     128
     129        rc = gfx_bitmap_get_alloc(bitmap, &alloc);
     130        if (rc != EOK) {
     131                gfx_bitmap_destroy(bitmap);
     132                return rc;
     133        }
     134
     135        pmap.width = params.rect.p1.x;
     136        pmap.height = 1;
     137        pmap.data = alloc.pixels;
     138
     139        for (x = 0; x < params.rect.p1.x; x++) {
     140                pixel = PIXEL(str[x], 0xff, 0xff, 0xff);
     141                pixelmap_put_pixel(&pmap, x, 0, pixel);
     142        }
     143
     144        rc = gfx_bitmap_render(bitmap, NULL, pos);
     145
     146        gfx_bitmap_destroy(bitmap);
     147        return rc;
    85148}
    86149
     
    141204        }
    142205
     206        /* Text mode */
     207        if ((font->finfo->props.flags & gff_text_mode) != 0)
     208                return gfx_puttext_textmode(font, &cpos, str);
     209
    143210        cp = str;
    144211        while (*cp != '\0') {
Note: See TracChangeset for help on using the changeset viewer.