📄 t1aaset.c
字号:
else if (y == 3){ for (i = 0; i < size; i++) { ((T1_AA_TYPE32 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<<hcorr)|bcarry1)] + T1aa_h_count[(unsigned char)((in_ptr[i + width]<<hcorr)|bcarry2)] + T1aa_h_count[(unsigned char)((in_ptr[i + 2*width]<<hcorr)|bcarry3)])]; bcarry1=in_ptr[i]>>(8-hcorr); bcarry2=in_ptr[i+2*width]>>(8-hcorr); bcarry3=in_ptr[i+3*width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<<hcorr; bcarry2=in_ptr[width]<<hcorr; bcarry3=in_ptr[2*width]<<hcorr; } } else if (y == 2){ for (i = 0; i < size; i++) { ((T1_AA_TYPE32 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<<hcorr)|bcarry1)] + T1aa_h_count[(unsigned char)((in_ptr[i + width]<<hcorr)|bcarry2)])]; bcarry1=in_ptr[i]>>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<<hcorr; bcarry2=in_ptr[width]<<hcorr; } } else if (y == 1){ for (i = 0; i < size; i++) { ((T1_AA_TYPE32 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<<hcorr)|bcarry1)])]; bcarry1=in_ptr[i]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<<hcorr; } } if (mod) { if (y == 4) ((T1_AA_TYPE32 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2] + T1aa_h_count[bcarry3] + T1aa_h_count[bcarry4])]; else if (y == 3) ((T1_AA_TYPE32 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2] + T1aa_h_count[bcarry3])]; else if (y == 2) ((T1_AA_TYPE32 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2])]; else if (y == 1) ((T1_AA_TYPE32 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1])]; } } else if (T1aa_bpp == 32) { if (y == 4){ for (i = 0; i < size; i++) { count=T1aa_h_count[(unsigned char)((in_ptr[i]<<hcorr)|bcarry1)] + T1aa_h_count[(unsigned char)((in_ptr[i + width]<<hcorr)|bcarry2)] + T1aa_h_count[(unsigned char)((in_ptr[i + 2*width]<<hcorr)|bcarry3)] + T1aa_h_count[(unsigned char)((in_ptr[i + 3*width]<<hcorr)|bcarry4)]; ((T1_AA_TYPE32 *)optr)[2*i] = T1aa_h_lut[count % 17]; ((T1_AA_TYPE32 *)optr)[2*i+1] = T1aa_h_lut[count / 17]; bcarry1=in_ptr[i]>>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); bcarry4=in_ptr[i+3*width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<<hcorr; bcarry2=in_ptr[width]<<hcorr; bcarry3=in_ptr[2*width]<<hcorr; bcarry4=in_ptr[3*width]<<hcorr; } } else if (y == 3){ for (i = 0; i < size; i++) { count=T1aa_h_count[(unsigned char)((in_ptr[i]<<hcorr)|bcarry1)] + T1aa_h_count[(unsigned char)((in_ptr[i + width]<<hcorr)|bcarry2)] + T1aa_h_count[(unsigned char)((in_ptr[i + 2*width]<<hcorr)|bcarry3)]; ((T1_AA_TYPE32 *)optr)[2*i] = T1aa_h_lut[count % 17]; ((T1_AA_TYPE32 *)optr)[2*i+1] = T1aa_h_lut[count / 17]; bcarry1=in_ptr[i]>>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<<hcorr; bcarry2=in_ptr[width]<<hcorr; bcarry3=in_ptr[2*width]<<hcorr; } } else if (y == 2){ for (i = 0; i < size; i++) { count=T1aa_h_count[(unsigned char)((in_ptr[i]<<hcorr)|bcarry1)] + T1aa_h_count[(unsigned char)((in_ptr[i + width]<<hcorr)|bcarry2)]; ((T1_AA_TYPE32 *)optr)[2*i] = T1aa_h_lut[count % 17]; ((T1_AA_TYPE32 *)optr)[2*i+1] = T1aa_h_lut[count / 17]; bcarry1=in_ptr[i]>>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<<hcorr; bcarry2=in_ptr[width]<<hcorr; } } else if (y == 1){ for (i = 0; i < size; i++) { count=T1aa_h_count[(unsigned char)((in_ptr[i]<<hcorr)|bcarry1)]; ((T1_AA_TYPE32 *)optr)[2*i] = T1aa_h_lut[count % 17]; ((T1_AA_TYPE32 *)optr)[2*i+1] = T1aa_h_lut[count / 17]; bcarry1=in_ptr[i]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<<hcorr; } } if (mod) { if (y == 4){ count=T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2] + T1aa_h_count[bcarry3] + T1aa_h_count[bcarry4]; } else if (y == 3) count=T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2] + T1aa_h_count[bcarry3]; else if (y == 2) count=T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2]; else if (y == 1) count=T1aa_h_count[bcarry1]; ((T1_AA_TYPE32 *)optr)[2*i] = T1aa_h_lut[count % 17]; ((T1_AA_TYPE32 *)optr)[2*i+1] = T1aa_h_lut[count / 17]; } } } /* Copy to target if necessary */ if ((long)target_ptr & 3){ memcpy (target_ptr, align_buf, new_size); } }/* T1_DoLine(): Generate a scanline of bytes from a scanline of bits */static void T1_DoLine ( long wd, long paddedW, char *ptr, register char *target_ptr ){ register int j; register unsigned char *in_ptr; T1_AA_TYPE16 *starget_ptr; T1_AA_TYPE32 *ltarget_ptr; in_ptr=(unsigned char *)ptr; if (T1aa_bpp==8) { for ( j=0; j<wd; j++ ){ *target_ptr++=T1aa_n_lut[((in_ptr[j/8])>>j%8)&0x0F]; } } else if (T1aa_bpp==16) { starget_ptr=(T1_AA_TYPE16 *)target_ptr; for ( j=0; j<wd; j++){ *starget_ptr++=T1aa_n_lut[((in_ptr[j/8])>>j%8)&0x03]; } } else if (T1aa_bpp==32) { ltarget_ptr=(T1_AA_TYPE32 *)target_ptr; for ( j=0; j<wd; j++) *ltarget_ptr++=T1aa_n_lut[((in_ptr[j/8])>>j%8)&0x01]; } return;}/* T1_AASetChar(...): Generate the anti-aliased bitmap for a character */GLYPH *T1_AASetChar( int FontID, char charcode, float size, T1_TMATRIX *transform){ GLYPH *glyph; /* pointer to bitmap glyph */ static GLYPH aaglyph={NULL,{0,0,0,0,0,0},NULL,DEFAULTBPP};/* The anti-aliased glyph */ long asc, dsc, ht, wd; long i; long n_horz, n_horz_pad, n_vert, n_asc, n_dsc; long v_start, v_end; char *target_ptr; long offset; char *ptr; int y; long lsb, aalsb, aahstart; int memsize; LONG paddedW; int savelevel; FONTSIZEDEPS *font_ptr=NULL; unsigned char ucharcode; /* Reset character glyph, if necessary */ if (aaglyph.bits!=NULL){ free(aaglyph.bits); aaglyph.bits=NULL; } aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=0; aaglyph.metrics.advanceY=0; aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; aaglyph.bpp=T1aa_bpp; ucharcode=charcode; /* Check for smart antialiasing */ savelevel=T1aa_level; if (T1aa_SmartOn){ if (size>=T1aa_smartlimit2) { T1aa_level=T1_AA_NONE; } else if (size>=T1aa_smartlimit1) { T1aa_level=T1_AA_LOW; } else { T1aa_level=T1_AA_HIGH; } } /* The following code is only exectued if caching of antialiased chracters is enabled. */ /* Check if char is in cache */ if ((pFontBase->t1lib_flags & T1_AA_CACHING)) { if (transform==NULL){ /* if size/aa is not existent we create it */ if ((font_ptr=QueryFontSize( FontID, size, T1aa_level))==NULL){ /* We create the required size struct and leave the rest for T1_SetChar() */ font_ptr=CreateNewFontSize( FontID, size, T1aa_level); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; T1aa_level=savelevel; return(NULL); } } else {/* size is already existent in cache */ if (font_ptr->pFontCache[ucharcode].bits != NULL){ /* Character is already in Chache -> create a copy of cache and return a pointer to the result: */ memcpy( &aaglyph, &(font_ptr->pFontCache[ucharcode]), sizeof(GLYPH)); memsize = (aaglyph.metrics.ascent-aaglyph.metrics.descent) * PAD((aaglyph.metrics.rightSideBearing-aaglyph.metrics.leftSideBearing) * T1aa_bpp,pFontBase->bitmap_pad)/8; aaglyph.bits = (char *)malloc(memsize*sizeof( char)); if (aaglyph.bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; T1aa_level=savelevel; return(NULL); } memcpy( aaglyph.bits, font_ptr->pFontCache[ucharcode].bits, memsize); return(&(aaglyph)); } } } /* (transform==NULL) */ } /* T1_AA_CACHING */ /* First, call routine to rasterize character, all error checking is done in this function: */ if ((glyph=T1_SetChar( FontID, charcode, T1aa_level*size, transform))==NULL){ /* restore level */ T1aa_level=savelevel; return(NULL); /* An error occured */ } /* In case there are no black pixels, we simply set the dimensions and then return */ if ( glyph->bits == NULL) { aaglyph.bits=NULL; aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; /* restore level and return */ T1aa_level=savelevel; return(&aaglyph); } /* Get dimensions of bitmap: */ asc=glyph->metrics.ascent; dsc=glyph->metrics.descent; lsb=glyph->metrics.leftSideBearing; ht=asc-dsc; wd=glyph->metrics.rightSideBearing-lsb; if (T1aa_level==T1_AA_NONE){ /* we only convert bitmap to bytemap */ aaglyph=*glyph; aaglyph.bpp=T1aa_bpp; /* Compute scanline length and such */ n_horz_pad=PAD( wd*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* Allocate memory for glyph */ memsize = n_horz_pad*ht*8; /* aaglyph.bits = (char *)malloc(memsize*sizeof( char)); */ aaglyph.bits = (char *)malloc(memsize*sizeof( char)); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* restore level */ T1aa_level=savelevel; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)>>3; ptr=glyph->bits; target_ptr=aaglyph.bits; for (i = 0; i < ht; i++) { T1_DoLine ( wd, paddedW, ptr, target_ptr ); ptr += paddedW; target_ptr += n_horz_pad; } /* restore level */ T1aa_level=savelevel; return(&aaglyph); } /* Set some looping parameters for subsampling */ if (lsb<0){ aalsb=lsb/T1aa_level-1; aahstart=T1aa_level+(lsb%T1aa_level); } else{ aalsb=lsb/T1aa_level; aahstart=lsb%T1aa_level; } /* The horizontal number of steps: */ n_horz=(wd+aahstart+T1aa_level-1)/T1aa_level; /* And the padded value */ n_horz_pad=PAD( n_horz*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* vertical number of steps: */ if (asc % T1aa_level){ /* not aligned */ if ( asc > 0){ n_asc=asc/T1aa_level+1; v_start=asc % T1aa_level; } else{ n_asc=asc/T1aa_level; v_start=T1aa_level + (asc % T1aa_level); } } else{ n_asc=asc/T1aa_level; v_start=T1aa_level; } if (dsc % T1aa_level){ /* not aligned */ if ( dsc < 0){ n_dsc=dsc/T1aa_level-1; v_end=-(dsc % T1aa_level); } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level - (dsc % T1aa_level); } } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level; } /* the total number of lines: */ n_vert=n_asc-n_dsc; /* Allocate memory for glyph */ memsize = n_horz_pad*n_vert; /* Note: we allocate 12 bytes more than necessary */ aaglyph.bits = (char *)malloc(memsize*sizeof( char) +12); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* restore level */ T1aa_level=savelevel; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)/8; offset=0; target_ptr=aaglyph.bits; /* We must check for n_vert==1 because the computation above is not valid in this case */ if (n_vert==1) v_start=v_start < v_end ? v_start : v_end; ptr = glyph->bits; for (i = 0; i < n_vert; i++) { if (i==0) y=v_start; else if (i==n_vert-1) y=v_end; else y=T1aa_level; T1_AADoLine ( T1aa_level, wd, y, paddedW, ptr, target_ptr, aahstart ); ptr += y * paddedW; target_ptr += n_horz_pad; } /* .. and set them in aaglyph */ aaglyph.metrics.leftSideBearing=aalsb; aaglyph.metrics.rightSideBearing=aalsb + n_horz; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=n_asc; aaglyph.metrics.descent=n_dsc; aaglyph.pFontCacheInfo=NULL; if ((pFontBase->t1lib_flags & T1_AA_CACHING) && (transform==NULL)) { /* Put char into cache area */ memcpy( &(font_ptr->pFontCache[ucharcode]), &aaglyph, sizeof(GLYPH)); font_ptr->pFontCache[ucharcode].bits = (char *)malloc(memsize*sizeof( char)); if (font_ptr->pFontCache[ucharcode].bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; T1aa_level=savelevel; return(NULL); } memcpy( font_ptr->pFontCache[ucharcode].bits, aaglyph.bits, memsize); } /* restore level */ T1aa_level=savelevel; return(&aaglyph);}/* T1_AASetString(...): Generate the antialiased bitmap for a string of characters */GLYPH *T1_AASetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform){ GLYPH *glyph; /* pointer to bitmap glyph */ static GLYPH aastring_glyph={NULL,{0,0,0,0,0,0},NULL,DEFAULTBPP};/* The anti-aliased glyph */ long asc, dsc, ht, wd; long i; long n_horz, n_horz_pad, n_vert, n_asc, n_dsc; long v_start, v_end; char *target_ptr; long offset; char *ptr; int y; long lsb, aalsb, aahstart; int memsize; LONG paddedW; int savelevel; /* Reset character glyph, if necessary */ if (aastring_glyph.bits!=NULL){ free(aastring_glyph.bits); aastring_glyph.bits=NULL; } aastring_glyph.metrics.leftSideBearing=0; aastring_glyph.metrics.rightSideBearing=0; aastring_glyph.metrics.advanceX=0; aastring_glyph.metrics.advanceY=0; aastring_glyph.metrics.ascent=0; aastring_glyph.metrics.descent=0; aastring_glyph.pFontCacheInfo=NULL; aastring_glyph.bpp=T1aa_bpp; /* Check for smart antialiasing */ savelevel=T1aa_level; if (T1aa_SmartOn){ if (size>=T1aa_smartlimit2) { T1aa_level=T1_AA_NONE; } else if (size>=T1aa_smartlimit1) { T1aa_level=T1_AA_LOW; } else { T1aa_level=T1_AA_HIGH; } } /* First, call routine to rasterize character, all error checking is done in this function: */ if ((glyph=T1_SetString( FontID, string, len, spaceoff, modflag, T1aa_level*size, transform))==NULL){ /* restore level */ T1aa_level=savelevel; return(NULL); /* An error occured */ } /* In case there are no black pixels, we simply set the dimensions and then return */ if ( glyph->bits == NULL) { aastring_glyph.bits=NULL; aastring_glyph.metrics.leftSideBearing=0; aastring_glyph.metrics.rightSideBearing=0; aastring_glyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aastring_glyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aastring_glyph.metrics.ascent=0; aastring_glyph.metrics.descent=0; aastring_glyph.pFontCacheInfo=NULL; /* restore level and return */ T1aa_level=savelevel; return(&aastring_glyph); } /* Get dimensions of bitmap: */ asc=glyph->metrics.ascent; dsc=glyph->metrics.descent; lsb=glyph->metrics.leftSideBearing; ht=asc-dsc; wd=glyph->metrics.rightSideBearing-lsb; if (T1aa_level==T1_AA_NONE){ /* we only convert bitmap to bytemap */ aastring_glyph=*glyph; aastring_glyph.bpp=T1aa_bpp; /* Compute scanline length and such */ n_horz_pad=PAD( wd*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* Allocate memory for glyph */ memsize = n_horz_pad*ht*8; aastring_glyph.bits = (char *)malloc(memsize*sizeof( char)); if (aastring_glyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* restore level */ T1aa_level=savelevel; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)>>3; ptr=glyph->bits; target_ptr=aastring_glyph.bits; for (i = 0; i < ht; i++) { T1_DoLine ( wd, paddedW, ptr, target_ptr ); ptr += paddedW; target_ptr += n_horz_pad;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -