⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t1aaset.c

📁 source code: Covert TXT to PDF
💻 C
📖 第 1 页 / 共 3 页
字号:
      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 + -