Changeset ea459d4 in mainline for uspace/lib/gfxfont/src/typeface.c


Ignore:
Timestamp:
2020-09-24T14:25:21Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
120031a5
Parents:
aaf962e6
git-author:
Jiri Svoboda <jiri@…> (2020-09-22 17:25:10)
git-committer:
Jiri Svoboda <jiri@…> (2020-09-24 14:25:21)
Message:

Reading typeface from TPF file

File:
1 edited

Legend:

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

    raaf962e6 rea459d4  
    3838#include <errno.h>
    3939#include <gfx/bitmap.h>
     40#include <gfx/font.h>
    4041#include <gfx/glyph.h>
    4142#include <gfx/typeface.h>
     
    7879void gfx_typeface_destroy(gfx_typeface_t *tface)
    7980{
     81        gfx_font_info_t *finfo;
     82
     83        if (tface->riffr != NULL)
     84                (void) riff_rclose(tface->riffr);
     85
     86        finfo = gfx_typeface_first_font(tface);
     87        while (finfo != NULL) {
     88                if (finfo->font != NULL)
     89                        gfx_font_close(finfo->font);
     90                list_remove(&finfo->lfonts);
     91                free(finfo);
     92
     93                finfo = gfx_typeface_first_font(tface);
     94        }
     95
    8096        free(tface);
    8197}
     
    111127
    112128        return list_get_instance(link, gfx_font_info_t, lfonts);
     129}
     130
     131/** Open typeface from a TPF file.
     132 *
     133 * @param gc Graphic context
     134 * @param fname File name
     135 * @param rtface Place to store pointer to open typeface
     136 * @return EOK on success or an error code
     137 */
     138errno_t gfx_typeface_open(gfx_context_t *gc, const char *fname,
     139    gfx_typeface_t **rtface)
     140{
     141        riffr_t *riffr = NULL;
     142        gfx_typeface_t *tface = NULL;
     143        errno_t rc;
     144        riff_rchunk_t riffck;
     145        uint32_t format;
     146
     147        rc = gfx_typeface_create(gc, &tface);
     148        if (rc != EOK)
     149                goto error;
     150
     151        rc = riff_ropen(fname, &riffck, &riffr);
     152        if (rc != EOK)
     153                goto error;
     154
     155        rc = riff_read_uint32(&riffck, &format);
     156        if (rc != EOK)
     157                goto error;
     158
     159        if (format != FORM_TPFC) {
     160                rc = ENOTSUP;
     161                goto error;
     162        }
     163
     164        while (true) {
     165                rc = gfx_font_info_load(tface, &riffck);
     166                if (rc == ENOENT)
     167                        break;
     168
     169                if (rc != EOK)
     170                        goto error;
     171        }
     172
     173        rc = riff_rchunk_end(&riffck);
     174        if (rc != EOK)
     175                goto error;
     176
     177        tface->riffr = riffr;
     178        *rtface = tface;
     179        return EOK;
     180error:
     181        if (riffr != NULL)
     182                riff_rclose(riffr);
     183        if (tface != NULL)
     184                gfx_typeface_destroy(tface);
     185        return rc;
     186}
     187
     188/** Make sure all typeface fonts are loaded.
     189 *
     190 * @param tface Typeface
     191 * @return EOK on success or an error code
     192 */
     193static errno_t gfx_typeface_loadin(gfx_typeface_t *tface)
     194{
     195        gfx_font_t *font;
     196        gfx_font_info_t *finfo;
     197        errno_t rc;
     198
     199        finfo = gfx_typeface_first_font(tface);
     200        while (finfo != NULL) {
     201                /* Open font to make sure it is loaded */
     202                rc = gfx_font_open(finfo, &font);
     203                if (rc != EOK)
     204                        return rc;
     205
     206                /* Don't need this anymore */
     207                (void)font;
     208
     209                finfo = gfx_typeface_next_font(finfo);
     210        }
     211
     212        return EOK;
    113213}
    114214
     
    125225        gfx_font_info_t *finfo;
    126226        riff_wchunk_t riffck;
     227
     228        /*
     229         * Make sure all fonts are loaded before writing (in case
     230         * we are writing into our original backing file).
     231         */
     232        rc = gfx_typeface_loadin(tface);
     233        if (rc != EOK)
     234                return rc;
    127235
    128236        rc = riff_wopen(fname, &riffw);
Note: See TracChangeset for help on using the changeset viewer.