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


Ignore:
Timestamp:
2020-09-24T14:25:21Z (4 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/glyph.c

    raaf962e6 rea459d4  
    315315}
    316316
     317/** Load glyph metrics from RIFF TPF file.
     318 *
     319 * @param parent Parent chunk
     320 * @param metrics Place to store glyph metrics
     321 * @return EOK on success or an error code
     322 */
     323static errno_t gfx_glyph_metrics_load(riff_rchunk_t *parent,
     324    gfx_glyph_metrics_t *metrics)
     325{
     326        errno_t rc;
     327        riff_rchunk_t mtrck;
     328        size_t nread;
     329
     330        rc = riff_rchunk_match(parent, CKID_gmtr, &mtrck);
     331        if (rc != EOK)
     332                return rc;
     333
     334        rc = riff_read(&mtrck, (void *) metrics, sizeof(*metrics), &nread);
     335        if (rc != EOK || nread != sizeof(*metrics))
     336                return EIO;
     337
     338        rc = riff_rchunk_end(&mtrck);
     339        if (rc != EOK)
     340                return rc;
     341
     342        return EOK;
     343}
     344
    317345/** Save glyph metrics to RIFF TPF file.
    318346 *
     
    342370}
    343371
     372/** Load glyph patterns from RIFF TPF file.
     373 *
     374 * @param parent Parent chunk
     375 * @param glyph Glyph
     376 * @return EOK on success or an error code
     377 */
     378static errno_t gfx_glyph_patterns_load(riff_rchunk_t *parent,
     379    gfx_glyph_t *glyph)
     380{
     381        errno_t rc;
     382        riff_rchunk_t patck;
     383        uint32_t cksize;
     384        size_t i;
     385        size_t nread;
     386        char *buf = NULL;
     387
     388        rc = riff_rchunk_match(parent, CKID_gpat, &patck);
     389        if (rc != EOK)
     390                goto error;
     391
     392        cksize = riff_rchunk_size(&patck);
     393        buf = malloc(cksize);
     394        if (buf == NULL) {
     395                rc = ENOMEM;
     396                goto error;
     397        }
     398
     399        rc = riff_read(&patck, buf, cksize, &nread);
     400        if (rc != EOK || nread != cksize)
     401                goto error;
     402
     403        i = 0;
     404        while (i < cksize) {
     405                rc = gfx_glyph_set_pattern(glyph, &buf[i]);
     406                if (rc != EOK)
     407                        goto error;
     408
     409                i += str_size(&buf[i]) + 1;
     410        }
     411
     412        rc = riff_rchunk_end(&patck);
     413        if (rc != EOK)
     414                goto error;
     415
     416        free(buf);
     417        return EOK;
     418error:
     419        if (buf != NULL)
     420                free(buf);
     421        return rc;
     422}
    344423/** Save glyph patterns to RIFF TPF file.
    345424 *
     
    377456}
    378457
     458/** Load glyph rectangle/origin from RIFF TPF file.
     459 *
     460 * @param parent Parent chunk
     461 * @param glyph Glyph
     462 * @return EOK on success or an error code
     463 */
     464static errno_t gfx_glyph_rectangle_origin_load(riff_rchunk_t *parent,
     465    gfx_glyph_t *glyph)
     466{
     467        errno_t rc;
     468        riff_rchunk_t rorck;
     469        size_t nread;
     470
     471        rc = riff_rchunk_match(parent, CKID_gror, &rorck);
     472        if (rc != EOK)
     473                return rc;
     474
     475        rc = riff_read(&rorck, (void *) &glyph->rect, sizeof(glyph->rect),
     476            &nread);
     477        if (rc != EOK || nread != sizeof(glyph->rect))
     478                return EIO;
     479
     480        rc = riff_read(&rorck, (void *) &glyph->origin, sizeof(glyph->origin),
     481            &nread);
     482        if (rc != EOK || nread != sizeof(glyph->origin))
     483                return EIO;
     484
     485        rc = riff_rchunk_end(&rorck);
     486        if (rc != EOK)
     487                return rc;
     488
     489        return EOK;
     490}
     491
    379492/** Save glyph rectangle/origin to RIFF TPF file.
    380493 *
     
    408521}
    409522
     523/** Load glyph from RIFF TPF file.
     524 *
     525 * @param font Containing font
     526 * @param parent Parent chunk
     527 * @return EOK on success or an error code
     528 */
     529errno_t gfx_glyph_load(gfx_font_t *font, riff_rchunk_t *parent)
     530{
     531        errno_t rc;
     532        gfx_glyph_metrics_t metrics;
     533        gfx_glyph_t *glyph = NULL;
     534        riff_rchunk_t glyphck;
     535
     536        rc = riff_rchunk_list_match(parent, LTYPE_glph, &glyphck);
     537        if (rc != EOK)
     538                goto error;
     539
     540        rc = gfx_glyph_metrics_load(&glyphck, &metrics);
     541        if (rc != EOK)
     542                goto error;
     543
     544        rc = gfx_glyph_create(font, &metrics, &glyph);
     545        if (rc != EOK)
     546                goto error;
     547
     548        rc = gfx_glyph_patterns_load(&glyphck, glyph);
     549        if (rc != EOK)
     550                goto error;
     551
     552        rc = gfx_glyph_rectangle_origin_load(&glyphck, glyph);
     553        if (rc != EOK)
     554                goto error;
     555
     556        rc = riff_rchunk_end(&glyphck);
     557        if (rc != EOK)
     558                goto error;
     559
     560        return EOK;
     561error:
     562        if (glyph != NULL)
     563                gfx_glyph_destroy(glyph);
     564        return rc;
     565}
     566
    410567/** Save glyph into RIFF TPF file.
    411568 *
    412569 * @param glyph Glyph
    413570 * @param riffw RIFF writer
     571 * @return EOK on success or an error code
    414572 */
    415573errno_t gfx_glyph_save(gfx_glyph_t *glyph, riffw_t *riffw)
Note: See TracChangeset for help on using the changeset viewer.