📄 xglyph.c
字号:
void showchar( Widget showcharbutton, XtPointer client_data, XtPointer call_data){ int i, j; Arg args[10]; sscanf( XawDialogGetValueString(dialogfontid),"%d", &FontID); sscanf( XawDialogGetValueString(dialogsize),"%f", &Size); sscanf( XawDialogGetValueString(dialogangle),"%f", &Angle); sscanf( XawDialogGetValueString(dialogtestcharacter), "%d", &TestChar); sscanf( XawDialogGetValueString(dialogdevres),"%d", &DeviceResolution); if (FontID<0 || FontID>=T1_Get_no_fonts()) { sprintf(statusstring, "t1lib: FontID out of range!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } if (CheckTransform()==0 && Angle==0.0){ matrixP=NULL; } else{ matrixP=T1_RotateMatrix( &matrix, Angle); } if (DeviceResolution!=last_resolution[FontID]){ /* Delete all size dependent data for that font */ for ( i=0; i<T1_Get_no_fonts(); i++) T1_DeleteAllSizes( i); /* Establish new device resolution */ T1_SetDeviceResolutions(DeviceResolution,DeviceResolution); /* Store current resolution */ last_resolution[FontID]=DeviceResolution; } i=sscanf( XawDialogGetValueString(dialogencfile),"%s", (char *)EncodingFile); if (i==EOF) EncodingFile[0]=0; if (strcmp(EncodingFile,LastEncodingFile)){ /* encoding has changed */ if (strcmp( EncodingFile, "")==0){ /* -> reset to internal encoding */ for (i=0; i<T1_Get_no_fonts(); i++){ T1_DeleteAllSizes(i); T1_ReencodeFont( i, NULL); } /* Take care that newly loaded fonts are encoded according to current encoding */ T1_SetDefaultEncoding( NULL); } else{ for (i=0; i<MAXENCODINGS; ){ if ( encstruct[i].encfilename != NULL) if (strcmp( encstruct[i].encfilename, EncodingFile)==0){ i++; break; } i++; } if (i==MAXENCODINGS){ /* Encoding from that file was not already loaded -> so load it */ i=0; while (encstruct[i].encfilename != NULL) i++; encstruct[i].encoding=T1_LoadEncoding(EncodingFile); encstruct[i].encfilename=(char *)malloc(strlen(EncodingFile)+1); if (encstruct[i].encoding==NULL){ free( encstruct[i].encfilename); encstruct[i].encfilename=NULL; } i++; } for (j=0; j<T1_Get_no_fonts(); j++){ T1_DeleteAllSizes(j); T1_ReencodeFont( j, encstruct[i-1].encoding); } /* Take care that newly loaded fonts are encoded according to current encoding */ T1_SetDefaultEncoding( encstruct[i-1].encoding); } strcpy( LastEncodingFile, EncodingFile); } sscanf( XawDialogGetValueString(dialogslant),"%f", &Slant); if (Slant!=lastSlant[FontID]){ /* Delete all size dependent data */ T1_DeleteAllSizes(FontID); T1_LoadFont(FontID); T1_SlantFont( FontID, Slant); lastSlant[FontID]=Slant; } sscanf( XawDialogGetValueString(dialogextent),"%f", &Extent); if (Extent!=lastExtent[FontID]){ /* Delete all size dependent data */ T1_DeleteAllSizes(FontID); T1_LoadFont(FontID); T1_ExtendFont( FontID, Extent); lastExtent[FontID]=Extent; } if (Size<=0.0){ sprintf(statusstring, "t1lib: Size must be positive!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } XSetForeground( display, DefaultGC( display, screennumber), black.pixel); XSetBackground( display, DefaultGC( display, screennumber), white.pixel); /* Reset T1_errno: */ T1_errno=0; gettimeofday(time_ptr_start, void_ptr); glyph=T1_SetChar( FontID, TestChar, Size, matrixP); gettimeofday(time_ptr_stop, void_ptr); if (glyph==NULL){ sprintf(statusstring, "t1lib: Couldn't generate Bitmap, T1_errno=%d!", T1_errno); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } height=glyph->metrics.ascent - glyph->metrics.descent; overallwidth=glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing; width=overallwidth; /* Prepare status message: */ sprintf(statusstring,"Elapsed time: %ld Microseconds\nLeftSideBearing: %d\nRightSideBearing: %d\nAscent: %d\nDescent: %d\nAdvanceX: %d\nAdvanceY: %d\nBits Per Pixel: %ld\nImage Size: %ld Bytes\nPostScript Fontname: %s\nCharactername: %s\nT1_errno: %d\n", time_diff(time_ptr_start,time_ptr_stop), glyph->metrics.leftSideBearing, glyph->metrics.rightSideBearing, glyph->metrics.ascent, glyph->metrics.descent, glyph->metrics.advanceX, glyph->metrics.advanceY, glyph->bpp, PAD(glyph->bpp*(glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing),XGLYPH_PAD)/8*(glyph->metrics.ascent-glyph->metrics.descent), T1_GetFontName(FontID), T1_GetCharName(FontID,(char)TestChar), T1_errno); if (glyph->bits !=NULL) { ximage=XCreateImage( display, DefaultVisual(display, screennumber), 1, /* depths for bitmap is 1 */ XYBitmap, /* XYBitmap or XYPixmap */ 0, /* No offset */ glyph->bits, width, height, t1_pad, /* lines padded to bytes */ 0 /*PAD(width,8)/8*/ /* number of bytes per line */ ); /* Force bit and byte order */ ximage->bitmap_bit_order=0; ximage->byte_order=0; XFreePixmap(display,pixmap); pixmap = XCreatePixmap(display, XtWindow(TopLevel), width, height, DefaultDepth(display,screennumber) ); XPutImage(display, pixmap, DefaultGC( display, screennumber), ximage, 0, 0, 0, 0, width, height ); XDestroyImage(ximage); } i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNbackgroundPixmap, XtUnspecifiedPixmap); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); i=0; XtSetArg( args[i], XtNwidth, width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, height + DOUBLEMARGIN); i++; if (glyph->bits != NULL) { XtSetArg( args[i], XtNbitmap, pixmap); i++; } else { XtSetArg( args[i], XtNbitmap, 0); i++; } XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetArg( args[i], XtNbackground, WhitePixel(display,screennumber)); i++; XtSetArg( args[i], XtNforeground, BlackPixel(display,screennumber)); i++; XtSetValues(OutputWindow ,args,i); i=0; XtSetArg( args[i], XtNwidth, width + DOUBLEMARGIN); i++; XtSetArg( args[i], XtNheight, height + DOUBLEMARGIN); i++; if (glyph->bits != NULL) { XtSetArg( args[i], XtNbitmap, pixmap); i++; } else { XtSetArg( args[i], XtNbitmap, 0); i++; } XtSetArg( args[i], XtNresize, 1);i++; XtSetArg( args[i], XtNinternalWidth, 0); i++; XtSetArg( args[i], XtNinternalHeight, 0); i++; XtSetValues(Output ,args,i); glyph->bits=NULL; /* Since XDestroyImage() free's this also! */}void showstring( Widget showstringbutton, XtPointer client_data, XtPointer call_data){ int i,j,k,l,m,none_found; Arg args[10]; char *theString='\0'; char *ligtheString='\0'; char *succs, *ligs; char buf_char; sscanf( XawDialogGetValueString(dialogfontid),"%d", &FontID); sscanf( XawDialogGetValueString(dialogsize),"%f", &Size); sscanf( XawDialogGetValueString(dialogangle),"%f", &Angle); sscanf( XawDialogGetValueString(dialogspace),"%ld", &Space); sscanf( XawDialogGetValueString(dialogdevres),"%d", &DeviceResolution); if (FontID<0 || FontID>=T1_Get_no_fonts()) { sprintf(statusstring, "t1lib: FontID out of range!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } if (CheckTransform()==0 && Angle==0.0){ matrixP=NULL; } else{ matrixP=T1_RotateMatrix( &matrix, Angle); } if (DeviceResolution!=last_resolution[FontID]){ /* Delete all size dependent data for that font */ for ( i=0; i<T1_Get_no_fonts(); i++) T1_DeleteAllSizes( i); /* Establish new device resolution */ T1_SetDeviceResolutions(DeviceResolution,DeviceResolution); /* Store current resolution */ last_resolution[FontID]=DeviceResolution; } i=sscanf( XawDialogGetValueString(dialogencfile),"%s", (char *)EncodingFile); if (i==EOF) EncodingFile[0]=0; if (strcmp(EncodingFile,LastEncodingFile)){ /* encoding has changed */ if (strcmp( EncodingFile, "")==0){ /* -> reset to internal encoding */ for (i=0; i<T1_Get_no_fonts(); i++){ T1_DeleteAllSizes(i); T1_ReencodeFont( i, NULL); } /* Take care that newly loaded fonts are encoded according to current encoding */ T1_SetDefaultEncoding( NULL); } else{ for (i=0; i<MAXENCODINGS; ){ if ( encstruct[i].encfilename != NULL) if (strcmp( encstruct[i].encfilename, EncodingFile)==0){ i++; break; } i++; } if (i==MAXENCODINGS){ /* Encoding from that file was not already loaded -> so load it */ i=0; while (encstruct[i].encfilename != NULL) i++; encstruct[i].encoding=T1_LoadEncoding(EncodingFile); encstruct[i].encfilename=(char *)malloc(strlen(EncodingFile)+1); if (encstruct[i].encoding==NULL){ free( encstruct[i].encfilename); encstruct[i].encfilename=NULL; } i++; } for (j=0; j<T1_Get_no_fonts(); j++){ T1_DeleteAllSizes(j); T1_ReencodeFont( j, encstruct[i-1].encoding); } /* Take care that newly loaded fonts are encoded according to current encoding */ T1_SetDefaultEncoding( encstruct[i-1].encoding); } strcpy( LastEncodingFile, EncodingFile); } sscanf( XawDialogGetValueString(dialogslant),"%f", &Slant); if (Slant!=lastSlant[FontID]){ /* Delete all size dependent data */ T1_DeleteAllSizes(FontID); T1_LoadFont(FontID); T1_SlantFont( FontID, Slant); lastSlant[FontID]=Slant; } sscanf( XawDialogGetValueString(dialogextent),"%f", &Extent); if (Extent!=lastExtent[FontID]){ /* Delete all size dependent data */ T1_DeleteAllSizes(FontID); T1_LoadFont(FontID); T1_ExtendFont( FontID, Extent); lastExtent[FontID]=Extent; } i=0; XtSetArg(args[i], XtNstring, &theString); i++; XtGetValues(dialogteststring,args,i); if (Size<=0.0){ sprintf(statusstring, "t1lib: Size must be positive!"); i=0; XtSetArg(args[i], XtNbitmap,NULL); i++; XtSetArg(args[i], XtNwidth,380); i++; XtSetArg(args[i], XtNheight, MESSAGEBOXHEIGHT); i++; XtSetArg(args[i], XtNlabel, statusstring); i++; XtSetValues(labelstatus,args,i); return; } /* Now comes the ligatur handling */ if (strcmp(theString,"")==0) theString=(char *) TestString; i=strlen(theString); ligtheString=(char *)malloc((i+1)*sizeof(char)); if (LigDetect){ for (j=0,m=0;j<i;j++,m++){ /* Loop through the characters */ if ((k=T1_QueryLigs( FontID, theString[j], &succs, &ligs))>0){ buf_char=theString[j]; while (k>0){ none_found=1; for (l=0;l<k;l++){ /* Loop through the ligatures */ if (succs[l]==theString[j+1]){ buf_char=ligs[l]; j++; none_found=0; break; } } if (none_found) break; k=T1_QueryLigs( FontID, buf_char, &succs, &ligs); } ligtheString[m]=buf_char; } else{ /* There are no ligatures */ ligtheString[m]=theString[j]; } } ligtheString[m]=0; } else { strcpy(ligtheString,theString); } /* { METRICSINFO metrics; metrics=T1_GetMetricsInfo(FontID,(char *)ligtheString,0,Space,(Modflag & T1_KERNING)); printf("String's width: %d\n", metrics.width); printf("String's BBox: llx = %d\n", metrics.bbox.llx); printf(" lly = %d\n", metrics.bbox.lly); printf(" urx = %d\n", metrics.bbox.urx); printf(" ury = %d\n", metrics.bbox.ury); printf("Number of chars in string: %d\n", metrics.numchars); for (i=0;i<metrics.numchars;i++) printf("Position of %d. character in string: %d afm-units\n", i+1, metrics.charpos[i]); } */ /* { int i,j; T1_COMP_CHAR_INFO *ccd; T1_COMP_PIECE *cp; printf("Number of composite characters in font: %d\n", j=T1_GetNoCompositeChars(FontID)); for (i=0; i<j; i++) { ccd=T1_GetCompCharDataByIndex( FontID, i); if (ccd==NULL) { printf("AFM-ind=%d, ccd=%p, T1_errno=%d\n", i, ccd, T1_errno); T1_errno=0; } else { printf( "AFM-ind=%d: Compchar %s (%d), has %d pieces:\n", i, ccd->compchar > -1 ? T1_GetCharName( FontID, ccd->compchar) : "not_enc", ccd->compchar, ccd->numPieces); printf( " basechar %s (%d)\n", ccd->pieces[0].piece > -1 ? T1_GetCharName( FontID, ccd->pieces[0].piece) : "not_enc", ccd->pieces[0].piece); printf( " accent %s (%d)\n", ccd->pieces[1].piece > -1 ? T1_GetCharName( FontID, ccd->pieces[1].piece) : "not_enc", ccd->pieces[1].piece); } T1_FreeCompCharData( ccd); } } */ XSetForeground( display, DefaultGC( display, screennumber), black.pixel); XSetBackground( display, DefaultGC( display, screennumber), white.pixel); /* Reset T1_errno: */ T1_errno=0; gettimeofday(time_ptr_start, void_ptr); if( extraflags & CHECK_CONCATGLYPHS){ glyph2=T1_SetString(FontID,(char *)ligtheString,0,Space,Modflag,Size,matrixP); glyph1=T1_CopyGlyph( glyph2); glyph2=T1_SetString(FontID+1,(char *)ligtheString,0,Space,Modflag,Size,matrixP); glyph=T1_ConcatGlyphs( glyph1, glyph2, 0, 0, Modflag); } else if( extraflags & CHECK_CONCATOUTLINES){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -