Skip to content
This repository has been archived by the owner on Jun 4, 2022. It is now read-only.

Commit

Permalink
Merge branch 'master' into releases
Browse files Browse the repository at this point in the history
  • Loading branch information
be5invis committed Jul 18, 2016
2 parents 077e101 + 9b0df1e commit 092301f
Show file tree
Hide file tree
Showing 58 changed files with 1,069 additions and 993 deletions.
48 changes: 29 additions & 19 deletions lib/font/caryll-font.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,42 +170,52 @@ caryll_buffer *caryll_write_font(caryll_font *font, caryll_dump_options *dumpopt
caryll_buffer *bufglyf = bufnew();
caryll_buffer *bufloca = bufnew();
if (font->glyf && font->head) {
caryll_write_glyf(font->glyf, font->head, bufglyf, bufloca);
caryll_write_glyf(font->glyf, font->head, bufglyf, bufloca, dumpopts);
}
sfnt_builder_push_table(builder, 'loca', bufloca);
sfnt_builder_push_table(builder, 'glyf', bufglyf);
} else {
caryll_cff_parse_result r = {font->CFF_, font->glyf};
sfnt_builder_push_table(builder, 'CFF ', caryll_write_CFF(r));
sfnt_builder_push_table(builder, 'CFF ', caryll_write_CFF(r, dumpopts));
}

sfnt_builder_push_table(builder, 'head', caryll_write_head(font->head));
sfnt_builder_push_table(builder, 'hhea', caryll_write_hhea(font->hhea));
sfnt_builder_push_table(builder, 'OS/2', caryll_write_OS_2(font->OS_2));
sfnt_builder_push_table(builder, 'maxp', caryll_write_maxp(font->maxp));
sfnt_builder_push_table(builder, 'name', caryll_write_name(font->name));
sfnt_builder_push_table(builder, 'post', caryll_write_post(font->post, font->glyph_order));
sfnt_builder_push_table(builder, 'cmap', caryll_write_cmap(font->cmap));
if (font->fpgm) sfnt_builder_push_table(builder, 'fpgm', caryll_write_fpgm_prep(font->fpgm));
if (font->prep) sfnt_builder_push_table(builder, 'prep', caryll_write_fpgm_prep(font->prep));
if (font->cvt_) sfnt_builder_push_table(builder, 'cvt ', caryll_write_cvt(font->cvt_));
if (font->gasp) sfnt_builder_push_table(builder, 'gasp', caryll_write_gasp(font->gasp));
sfnt_builder_push_table(builder, 'head', caryll_write_head(font->head, dumpopts));
sfnt_builder_push_table(builder, 'hhea', caryll_write_hhea(font->hhea, dumpopts));
sfnt_builder_push_table(builder, 'OS/2', caryll_write_OS_2(font->OS_2, dumpopts));
sfnt_builder_push_table(builder, 'maxp', caryll_write_maxp(font->maxp, dumpopts));
sfnt_builder_push_table(builder, 'name', caryll_write_name(font->name, dumpopts));
sfnt_builder_push_table(builder, 'post',
caryll_write_post(font->post, font->glyph_order, dumpopts));
sfnt_builder_push_table(builder, 'cmap', caryll_write_cmap(font->cmap, dumpopts));
if (font->fpgm)
sfnt_builder_push_table(builder, 'fpgm', caryll_write_fpgm_prep(font->fpgm, dumpopts));
if (font->prep)
sfnt_builder_push_table(builder, 'prep', caryll_write_fpgm_prep(font->prep, dumpopts));
if (font->cvt_)
sfnt_builder_push_table(builder, 'cvt ', caryll_write_cvt(font->cvt_, dumpopts));
if (font->gasp)
sfnt_builder_push_table(builder, 'gasp', caryll_write_gasp(font->gasp, dumpopts));

sfnt_builder_push_table(builder, 'hmtx',
caryll_write_hmtx(font->hmtx, font->hhea->numberOfMetrics,
font->maxp->numGlyphs - font->hhea->numberOfMetrics));
font->maxp->numGlyphs - font->hhea->numberOfMetrics,
dumpopts));

if (font->vhea) sfnt_builder_push_table(builder, 'vhea', caryll_write_vhea(font->vhea));
if (font->vhea)
sfnt_builder_push_table(builder, 'vhea', caryll_write_vhea(font->vhea, dumpopts));
if (font->vmtx) {
sfnt_builder_push_table(
builder, 'vmtx',
caryll_write_vmtx(font->vmtx, font->vhea->numOfLongVerMetrics,
font->maxp->numGlyphs - font->vhea->numOfLongVerMetrics));
font->maxp->numGlyphs - font->vhea->numOfLongVerMetrics, dumpopts));
}

if (font->GSUB) sfnt_builder_push_table(builder, 'GSUB', caryll_write_otl(font->GSUB));
if (font->GPOS) sfnt_builder_push_table(builder, 'GPOS', caryll_write_otl(font->GPOS));
if (font->GDEF) sfnt_builder_push_table(builder, 'GDEF', caryll_write_GDEF(font->GDEF));
if (font->GSUB)
sfnt_builder_push_table(builder, 'GSUB', caryll_write_otl(font->GSUB, dumpopts));
if (font->GPOS)
sfnt_builder_push_table(builder, 'GPOS', caryll_write_otl(font->GPOS, dumpopts));
if (font->GDEF)
sfnt_builder_push_table(builder, 'GDEF', caryll_write_GDEF(font->GDEF, dumpopts));

if (dumpopts->dummy_DSIG) {
caryll_buffer *dsig = bufnew();
Expand Down
4 changes: 0 additions & 4 deletions lib/fontops/otl/chaining.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,10 +214,6 @@ void classify_around(otl_lookup *lookup, uint16_t j) {
}
endcheck:
if (compatibleCount > 1) {
fprintf(stderr, "[Autoclassifier] %d subtables in %s are "
"class-compatible to subtable %d.",
compatibleCount, lookup->name, j);
fprintf(stderr, " Class count : B%d I%d F%d.\n", classno_b, classno_i, classno_f);
compatibility[j] = true;
free(subtable0->rules);
NEW_N(subtable0->rules, compatibleCount + 1);
Expand Down
127 changes: 127 additions & 0 deletions lib/libcff/cff-charset.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
#include "cff-charset.h"

void parse_charset(uint8_t *data, int32_t offset, uint16_t nchars, CFF_Charset *charsets) {
uint32_t i;
if (offset == CFF_CHARSET_ISOADOBE)
charsets->t = CFF_CHARSET_ISOADOBE;
else if (offset == CFF_CHARSET_EXPERT)
charsets->t = CFF_CHARSET_EXPERT;
else if (offset == CFF_CHARSET_EXPERTSUBSET)
charsets->t = CFF_CHARSET_EXPERTSUBSET;
else {
// NOTE: gid 1 will always be named as .notdef
switch (data[offset]) {
case 0:
charsets->t = CFF_CHARSET_FORMAT0;
{
charsets->s = nchars - 1;
charsets->f0.glyph = calloc(nchars - 1, sizeof(uint16_t));

for (i = 0; i < charsets->s; i++)
charsets->f0.glyph[i] = gu2(data, offset + 1 + i * 2);
}
break;
case 1:
charsets->t = CFF_CHARSET_FORMAT1;
{
uint32_t size;
uint32_t glyphsEncodedSofar = 1;
for (i = 0; glyphsEncodedSofar < nchars; i++) {
glyphsEncodedSofar += 1 + gu1(data, offset + 3 + i * 3);
}

size = i;
charsets->s = size;
charsets->f1.range1 = calloc(i + 1, sizeof(charset_range1));
for (i = 0; i < size; i++) {
charsets->f1.range1[i].first = gu2(data, offset + 1 + i * 3);
charsets->f1.range1[i].nleft = gu1(data, offset + 3 + i * 3);
}
}
break;
case 2:
charsets->t = CFF_CHARSET_FORMAT2;
{
uint32_t size;
uint32_t glyphsEncodedSofar = 1;
for (i = 0; glyphsEncodedSofar < nchars; i++) {
glyphsEncodedSofar += 1 + gu2(data, offset + 3 + i * 4);
}

size = i;
charsets->s = size;
charsets->f2.range2 = calloc(i + 1, sizeof(charset_range2));

for (i = 0; i < size; i++) {
charsets->f2.range2[i].first = gu2(data, offset + 1 + i * 4);
charsets->f2.range2[i].nleft = gu2(data, offset + 3 + i * 4);
}
}
break;
}
}
}

caryll_buffer *compile_charset(CFF_Charset cset) {
switch (cset.t) {
case CFF_CHARSET_ISOADOBE:
case CFF_CHARSET_EXPERT:
case CFF_CHARSET_EXPERTSUBSET: {
return bufnew();
}
case CFF_CHARSET_FORMAT0: {
caryll_buffer *blob = bufnew();
blob->size = 1 + cset.s * 2;
blob->data = calloc(blob->size, sizeof(uint8_t));
blob->data[0] = 0;
for (uint32_t i = 0; i < cset.s; i++)
blob->data[1 + 2 * i] = cset.f0.glyph[i] / 256,
blob->data[2 + 2 * i] = cset.f0.glyph[i] % 256;
blob->cursor = blob->size;
return blob;
}
case CFF_CHARSET_FORMAT1: {
caryll_buffer *blob = bufnew();
blob->size = 1 + cset.s * 3;
blob->data = calloc(blob->size, sizeof(uint8_t));
blob->data[0] = 1;
for (uint32_t i = 0; i < cset.s; i++)
blob->data[1 + 3 * i] = cset.f1.range1[i].first / 256,
blob->data[2 + 3 * i] = cset.f1.range1[i].first % 256,
blob->data[3 + 3 * i] = cset.f1.range1[i].nleft;
return blob;
}
case CFF_CHARSET_FORMAT2: {
caryll_buffer *blob = bufnew();
blob->size = 1 + cset.s * 4;
blob->data = calloc(blob->size, sizeof(uint8_t));
blob->data[0] = 2;
for (uint32_t i = 0; i < cset.s; i++)
blob->data[1 + 4 * i] = cset.f2.range2[i].first / 256,
blob->data[2 + 4 * i] = cset.f2.range2[i].first % 256,
blob->data[3 + 4 * i] = cset.f2.range2[i].nleft / 256,
blob->data[4 + 4 * i] = cset.f2.range2[i].nleft % 256;
blob->cursor = blob->size;
return blob;
}
}
return NULL;
}

void close_charset(CFF_Charset cset) {
switch (cset.t) {
case CFF_CHARSET_EXPERT:
case CFF_CHARSET_EXPERTSUBSET:
case CFF_CHARSET_ISOADOBE:
break;
case CFF_CHARSET_FORMAT0:
if (cset.f0.glyph != NULL) free(cset.f0.glyph);
break;
case CFF_CHARSET_FORMAT1:
if (cset.f1.range1 != NULL) free(cset.f1.range1);
break;
case CFF_CHARSET_FORMAT2:
if (cset.f2.range2 != NULL) free(cset.f2.range2);
break;
}
}
62 changes: 62 additions & 0 deletions lib/libcff/cff-charset.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#ifndef CARYLL_CFF_CHARSET_H
#define CARYLL_CFF_CHARSET_H

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <support/util.h>
#include "cff-util.h"
#include "cff-value.h"

enum {
CFF_CHARSET_ISOADOBE = 0,
CFF_CHARSET_UNSPECED = 0,
CFF_CHARSET_EXPERT = 1,
CFF_CHARSET_EXPERTSUBSET = 2,
CFF_CHARSET_FORMAT0 = 3,
CFF_CHARSET_FORMAT1 = 4,
CFF_CHARSET_FORMAT2 = 5,
};

// CFF Charset Structures
typedef struct {
uint8_t format;
uint16_t *glyph;
} charset_f0;

typedef struct {
uint16_t first;
uint8_t nleft;
} charset_range1;

typedef struct {
uint8_t format;
charset_range1 *range1;
} charset_f1;

typedef struct {
uint16_t first;
uint16_t nleft;
} charset_range2;

typedef struct {
uint8_t format;
charset_range2 *range2;
} charset_f2;

typedef struct {
uint32_t t;
uint32_t s; // size
union {
charset_f0 f0;
charset_f1 f1;
charset_f2 f2;
};
} CFF_Charset;

void close_charset(CFF_Charset cset);
void parse_charset(uint8_t *data, int32_t offset, uint16_t nchars, CFF_Charset *charsets);
caryll_buffer *compile_charset(CFF_Charset cset);

#endif
Loading

0 comments on commit 092301f

Please sign in to comment.