void TopFindQuestionablePoints(struct qg_data *data) { char *pt, *end; int low, high; if ( data->fv!=NULL ) data->freetype_context = _FreeTypeFontContext(data->fv->sf,NULL,data->fv,data->layer, ff_ttf,0,NULL); else data->freetype_context = _FreeTypeFontContext(data->sc->parent,data->sc,NULL,data->layer, ff_ttf,0,NULL); if ( data->freetype_context==NULL ) { data->error = qg_nofont; return; } data->qg = NULL; data->cur = data->max = 0; data->error = qg_ok; for ( pt=data->pixelsizes; *pt; pt=end ) { low = strtol(pt,&end,10); if ( pt==end ) { data->error = qg_notnumber; return; } while ( *end==' ' ) ++end; if ( *end=='-' ) { pt = end+1; high = strtol(pt,&end,10); if ( pt==end ) { data->error = qg_notnumber; return; } if ( high<low ) { data->error = qg_badrange; return; } } else high = low; if ( low<2 || low>4096 || high<2 || high>4096 ) { data->error = qg_badnumber; return; } while ( *end==' ' ) ++end; if ( *end==',' ) ++end; for ( data->cur_size = low; data->cur_size <= high; ++ data->cur_size ) { if ( data->fv!=NULL ) { int enc, gid; for ( enc=0; enc<data->fv->map->enccount; ++enc ) { if ( data->fv->selected[enc] && (gid = data->fv->map->map[enc])!=-1 && (data->sc = data->fv->sf->glyphs[gid])!=NULL ) SCFindQuestionablePoints(data); } } else { SCFindQuestionablePoints(data); } } } FreeTypeFreeContext(data->freetype_context); data->freetype_context = NULL; }
void CVGridFitChar(CharView *cv) { void *single_glyph_context; SplineFont *sf = cv->b.sc->parent; int layer = CVLayer((CharViewBase *) cv); SplinePointListsFree(cv->b.gridfit); cv->b.gridfit = NULL; FreeType_FreeRaster(cv->raster); cv->raster = NULL; single_glyph_context = _FreeTypeFontContext(sf,cv->b.sc,NULL,layer, sf->layers[layer].order2?ff_ttf:ff_otf,0,NULL); if ( single_glyph_context==NULL ) { LogError(_("Freetype rasterization failed.\n") ); return; } if ( cv->b.sc->layers[layer].refs!=NULL ) SCNumberPoints(cv->b.sc,layer); cv->raster = FreeType_GetRaster(single_glyph_context,cv->b.sc->orig_pos, cv->ft_pointsizey, cv->ft_pointsizex, cv->ft_dpi, cv->ft_depth ); cv->b.gridfit = FreeType_GridFitChar(single_glyph_context,cv->b.sc->orig_pos, cv->ft_pointsizey, cv->ft_pointsizex, cv->ft_dpi, &cv->b.ft_gridfitwidth, cv->b.sc, cv->ft_depth, true ); FreeTypeFreeContext(single_glyph_context); GDrawRequestExpose(cv->v,NULL,false); if ( cv->b.sc->instructions_out_of_date && cv->b.sc->ttf_instrs_len!=0 ) ff_post_notice(_("Instructions out of date"), _("The points have been changed. This may mean that the truetype instructions now refer to the wrong points and they may cause unexpected results.")); }
static void AnchorD_FreeChar(AnchorDlg *a) { int i; BDFCharFree(a->bdfc); a->bdfc = NULL; for ( i=0; i<a->cnt; ++i ) BDFCharFree(a->apmatch[i].bdfc); free(a->apmatch); a->apmatch = NULL; if ( a->freetypecontext!=NULL ) { FreeTypeFreeContext(a->freetypecontext); a->freetypecontext = NULL; } }
int ExportImage(char *filename,SplineChar *sc, int layer, int format, int pixelsize, int bitsperpixel) { /* 0=*.xbm, 1=*.bmp, 2=*.png, 3=*.xpm, 4=*.c(fontforge-internal) */ struct _GImage base; GImage gi; GClut clut; BDFChar *bdfc; int ret; int tot, i; uint8 *pt, *end; int scale; void *freetypecontext; double emsize = sc->parent->ascent+sc->parent->descent; if ( autohint_before_generate && sc->changedsincelasthinted && !sc->manualhints ) SplineCharAutoHint(sc,layer,NULL); memset(&gi,'\0', sizeof(gi)); memset(&base,'\0', sizeof(base)); memset(&clut,'\0', sizeof(clut)); gi.u.image = &base; if ( bitsperpixel==1 ) { if ( (freetypecontext = FreeTypeFontContext(sc->parent,sc,NULL,layer))==NULL ) bdfc = SplineCharRasterize(sc,layer,pixelsize); else { bdfc = SplineCharFreeTypeRasterize(freetypecontext,sc->orig_pos,pixelsize,72,1); FreeTypeFreeContext(freetypecontext); } BCRegularizeBitmap(bdfc); /* People don't seem to like having a minimal bounding box for their */ /* images. */ BCExpandBitmapToEmBox(bdfc, 0, (int) rint(sc->parent->ascent*pixelsize/emsize)-pixelsize, (int) rint(sc->width*pixelsize/emsize), (int) rint(sc->parent->ascent*pixelsize/emsize)); /* Sigh. Bitmaps use a different defn of set than images do. make it consistant */ tot = bdfc->bytes_per_line*(bdfc->ymax-bdfc->ymin+1); for ( pt = bdfc->bitmap, end = pt+tot; pt<end; *pt++ ^= 0xff ); base.image_type = it_mono; base.data = bdfc->bitmap; base.bytes_per_line = bdfc->bytes_per_line; base.width = bdfc->xmax-bdfc->xmin+1; base.height = bdfc->ymax-bdfc->ymin+1; base.trans = -1; if ( format==0 ) ret = !GImageWriteXbm(&gi,filename); #ifndef _NO_LIBPNG else if ( format==2 ) ret = GImageWritePng(&gi,filename,false); #endif else if ( format==3 ) ret = !GImageWriteXpm(&gi,filename); else if ( format==4 ) ret = !GImageWriteGImage(&gi,filename); else ret = GImageWriteBmp(&gi,filename); BDFCharFree(bdfc); } else { if ( (freetypecontext = FreeTypeFontContext(sc->parent,sc,NULL,layer))==NULL ) bdfc = SplineCharAntiAlias(sc,pixelsize,layer,(1<<(bitsperpixel/2))); else { bdfc = SplineCharFreeTypeRasterize(freetypecontext,sc->orig_pos,pixelsize,72,bitsperpixel); FreeTypeFreeContext(freetypecontext); } BCRegularizeGreymap(bdfc); BCExpandBitmapToEmBox(bdfc, 0, (int) rint(sc->parent->ascent*pixelsize/emsize) - pixelsize, (int) rint(sc->width*pixelsize/emsize), (int) rint(sc->parent->ascent*pixelsize/emsize)); base.image_type = it_index; base.data = bdfc->bitmap; base.bytes_per_line = bdfc->bytes_per_line; base.width = bdfc->xmax-bdfc->xmin+1; base.height = bdfc->ymax-bdfc->ymin+1; base.clut = &clut; base.trans = -1; clut.clut_len = 1<<bitsperpixel; clut.is_grey = true; clut.trans_index = -1; scale = 255/((1<<bitsperpixel)-1); scale = COLOR_CREATE(scale,scale,scale); for ( i=0; i< 1<<bitsperpixel; ++i ) clut.clut[(1<<bitsperpixel)-1 - i] = i*scale; #ifndef _NO_LIBPNG if ( format==2 ) ret = GImageWritePng(&gi,filename,false); else #endif ret = GImageWriteBmp(&gi,filename); BDFCharFree(bdfc); } return( ret ); }