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

📄 lg31of.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
				syslog(LOG_INFO,"Failed to use image colormap");				return(1);			}			if(im.format != ITS) {				/* do RGB to YIQ conversion */				tmpptr=cmpptr;				for(i=0;i!=256;i++) {					tmp=tmpptr;					temp= *tmpptr * .30;					tmpptr++;					temp+= *tmpptr * .59;					tmpptr++;					temp+= *tmpptr * .11;					tmpptr++;					*tmp=(255-temp);				}			}			error = readXimgdat();			if(error) {				syslog(LOG_INFO,"Failed to use image data");				return(1);			}			if(im.spbxnm > MAXP_PIX_WIDTH) {				fprintf(output,"\033[11h\033[7 I");				fprintf(output,"\033[?21 J");				fprintf(output,"\033[?52l");				fprintf(output,"\033[1;3150s");				fprintf(output,"\033P9;0;10q\"1;1-");				rotated++;				if(im.spbxnm > MAXL_PIX_WIDTH) {					im.spbxnm = MAXL_PIX_WIDTH;				}				if(im.spbynm > MAXL_PIX_WIDTH) {					tmppagecount = im.spbynm/MAXP_PIX_WIDTH;					tmplinecount = MAXP_PIX_WIDTH;				}			}			if(im.spbxnm <= MAXP_PIX_WIDTH) {				fprintf(output,"\033[11h\033[7 I");				fprintf(output,"\033[?20 J");				fprintf(output,"\033[?52l");				fprintf(output,"\033[1;2400s");				fprintf(output,"\033P9;0;10q\"1;1-");				if(im.spbynm > MAXP_PIX_HEIGHT) {					tmppagecount = im.spbynm/MAXP_PIX_HEIGHT;					tmplinecount = MAXP_PIX_HEIGHT;				}			}			error = dosixel();			if(error) {				syslog(LOG_INFO,"Failed to 'sixelize' data");				fprintf(output, "\033\\");				fprintf(output, "\033c");				sleep(5);				fprintf(output, "\014");				fflush(output);				return(1);			}			break;		case TEXT_FILE:		case CTEXT_FILE:		case ATEXT_FILE:		case RTEXT_FILE:		case FTEXT_FILE:		default:			for (cp = buf[0], limit = buf[MAXREP]; cp < limit; *cp++ = ' ');			done = 0;			escflg = 0;		/* is escape/control sequence in progress? */			globi = 0;                        while (!done) {                            col = indent;                            esclen = 0;                            maxrep = -1;                            linedone = 0;                            while (!linedone) {                                ch = globi < in ? filestorage[globi++] : getc(input);                                if (((escflg==0)&&(ch==ESC))||escflg)                                        eschdl(output,ch);   /* deal with escape character */                                else                                       /* chetal: literal code added follows */                                      if ( literal && iscntrl(ch) && ( (ch != '\n')                                            && (ch != EOF) ) ){                                          cp = &buf[0][col];    /* Since literal mode..everything is the                                                   first row itself.*/                                          maxrep = 0;                                          if (is_7bit_cntrl(ch)){						if (ch == 0177){							*cp++ = '^';							*cp   = '?';							col ++;						} else{ /* It is < 040 */                                              		*cp++ = '^';	                                                *cp   = ch + '@';         	                                        col ++;                  	                        }                                          } else{ /* It is 8bit cntrl */						if ((unsigned char)ch < 0240){                                                        *cp++ = 'M';                                                        *cp++ = '-';							ch   &= 0177;                                                        *cp   = ch + '@';                                                        col  += 2;						} else {                                                        *cp++ = 'M';                                                        *cp++ = '-';                                                        *cp   = '?';                                                        col  += 2;						}					  }                                          if ( col > maxcol[0] )                                              maxcol[0] = col;                                          col++; /* col points to next blank entry in buf */                                      }                                      else { /* regular characters */                                          switch (ch) {                                          case EOF:                                                          linedone = done = 1;                                                  ch = '\n';                                                  break;                                            case '\f':                /* new page on form feed */                                                  lineno = length;                                          case '\n':                /* new line */                                                  if (maxrep < 0)                                                          maxrep = 0;                                                  putc('\r',output);   /* LITOUT eight bit fix */                                                  linedone = 1;                                                  break;                                            case '\b':                /* backspace */                                                  if (--col < indent)                                                          col = indent;                                                  break;                                            case '\r':                /* carriage return */                                                  col = indent;                                                  break;                                            case '\t':                /* tab */                                                  col = ((col - indent) | 07) + indent + 1;                                                  break;                                            case '\031':                /* end media */                                                  /*                                                  * lpd needs to use a different filter to                                                  * print data so stop what we are doing and                                                  * wait for lpd to restart us.                                                  */                                                  ch = globi < in ? filestorage[globi++] : getc(input);                                                  if (ch == '\1') {                                                          fflush(output);                                                          kill(getpid(), SIGSTOP);                                                          break;                                                  } else {                                                          if(globi <= in) {                                                                  globi--;                                                          } else {                                                                  ungetc(ch, input);                                                          }                                                          ch = '\031';                                                  }                                                    default:   /* everything else */                                                          addtobuf(ch);                                                          break;                                                  } /* end switch */                                    } /* end else */                            } /* end while not linedone */                            /* print out lines */                            for (i = 0; i <= maxrep; i++) {                                    for (cp = buf[i], limit = cp+maxcol[i]; cp <= limit;) {                                            putc(*cp, output);                                            *cp++ = ' ';                                    }                                    if (i < maxrep)                                            putc('\r', output);                                    else                                            putc(ch, output);                                    if (++lineno >= length) {                                            npages++;                                            lineno = 0;                                            if (length < 66)                                                    putc('\f',output);  /* FF for length < 66 */                                    }                                    maxcol[i] = -1;                            }                        }			if (lineno) {		/* be sure to end on a page boundary */				putc('\f',output);				npages++;			}  			fprintf(output,"\033\143");  /* reset printer defaults */			fflush(output);		     /* make sure reset goes out */			sleep(6);		/* some printers eat lines during reset so wait */			break;		}	return(0);}/****************************************************************  Adds the character specified to buffer - if it will fit on line*****************************************************************/addtobuf (ch)register char      ch;{	register char  *cp;        int  i;        if ((col >= (width + esclen) || iscntrl(ch)) && ch != ESC){                  col++;                  return(0);        }        cp = &buf[0][col];        for (i = 0; i < MAXREP; i++) {                  if (i > maxrep)                          maxrep = i;                  if (*cp == ' ') {                          *cp = ch;                          if (col > maxcol[i])                                  maxcol[i] = col;                          break;                  }                  cp += BUFWIDTH;        }        col++;        return(1);}/****************************************************************//*								*//*	eschdl - escape sequence handler			*//*								*//*	This routine intercepts escape sequences for the purpose*//*	of pass through.					*//*								*//****************************************************************/eschdl(o,c)int c;FILE  *o;{if(escflg==0)	{		/* set escflg=1 => ready to receive 2nd seqchar*/	escflg=1;	}else	switch(escflg)		{		case 1:		/* second character of escseq		*/			switch(c)				{				case E_NINE: /* added to buffer - hopefully in the correct place */                                        addtobuf (ESC);                                        addtobuf (PLD);                                        esclen += 2;                                        escflg = 0;                                        break;				case E_EIGHT: /* added to buffer - hopefully in the correct place */                                        addtobuf (ESC);                                        addtobuf (PLU);                                        esclen += 2;                                        escflg = 0;                                        break;				case E_SEVEN: /* added to buffer - hopefully in the correct place */                                        addtobuf (ESC);                                        addtobuf (FLU);                                        esclen += 2;                                        escflg = 0;                                        break;				case UCP:					escflg=2; /*ctrl str pass thru mode=8 */					lstchr=c;					putc(ESC,o);					putc(c,o);					break;				default:					escflg=3;  /* set seq pass thru mode*/					putc(ESC,o);					putc(c,o);					break;				}			break;		case 2:		/* ctrl string pass through mode	*/			if((lstchr==ESC) && (c==BSLH))				{				escflg=0;				lstchr=0;				}			else lstchr=c;	/* save it for next pass */			putc(c,o);			break;		case 3:			if(escend(c))				escflg=0;/* turn off esc handler if at end  */			putc(c,o);			break;		}return(0);}/* If the file stream is of the XIMAGE_FILE type this routine is called   from lg31of.  The routine creates a sixel output stream to send   the printer based on the input data from an image file. Currently,   only a frame buffer image of raw red, green, blue points or a   GPX workstation "savimg"  image are valid data streams.  Sixel   output is initialized and then the processing begins.   The current design of the algorithm dithers the data to a 3 x 3 matrix   of points using the structure sixmap.*/dosixel(){	register int i;	int xcnt,ycnt,n = 1,iindex,ij=0;	unsigned char	*srcptr;	unsigned char	*nxtptr;	unsigned short sl;	unsigned int	temp;	struct sixmap *Sixmap;	struct sixmap *Sixmap_offset;	char *base_band,*pb;	int base_band_length = 0;	int count = 1;	char lastc = 0;	register char *cp;	srcptr=(unsigned char *)imgptr;	ycnt=im.spbynm;	if(im.format != ITS)		nxtptr=srcptr+im.spbxnm * n;	else		nxtptr=srcptr+(im.spbxnm * n * 3);	pb = base_band = (char *)malloc((unsigned) 6 * im.spbxnm);	Sixmap = base_sixmap;	Sixmap_offset = offset_sixmap;	while((ycnt/n) * n) {		xcnt=im.spbxnm;		base_band_length = 0;		base_band = pb;		while(xcnt>0) {			if(MAXL_PIX_WIDTH - xcnt < 0) {				if(im.format != ITS)					srcptr+=n;				else					srcptr+=n*3;				xcnt-=n;				continue;			}			if(im.format != ITS) {				sl = *(cmpptr + 3*(*srcptr));			} else {				/* need to convert to YIQ */				temp= *srcptr++ * .30;				temp+= *srcptr++ * .59;				temp+= *srcptr * .11;				temp=(255-temp);				sl = (unsigned short)temp;			}			iindex = (sl * 9) / 255;			for(i=0;i<3;i++) {				*(base_band+i) = SOFF;			}			if(!ij) {				*base_band++ = Sixmap[iindex].s0;				*base_band++ = Sixmap[iindex].s1;				*base_band++ = Sixmap[iindex].s2;			} else {				*base_band++ = Sixmap_offset[iindex].s0;				*base_band++ = Sixmap_offset[iindex].s1;				*base_band++ = Sixmap_offset[iindex].s2;			}			base_band_length+=3;			srcptr+=n;			xcnt-=n;		}		if(!ij) {			cp = pb;			lastc = *cp++;			for(i=0;i < base_band_length;i++) {			    if(*cp != lastc) {				if(count >= 4)				    fprintf(output,"!%d%c",count,lastc);				else				    while(count--)putc(lastc,output);				count = 1;				lastc = *cp;			    } else count++;			    cp++;			}			fprintf(output,"$");			count = 1;			ij++;		} else {			cp = pb;			lastc = *cp++;			for(i=0;i < base_band_length;i++) {				if(*cp != lastc) {					if(count >= 4)					    fprintf(output,"!%d%c",count,lastc);					else					    while(count--)						    putc(lastc,output);					count = 1;					lastc = *cp;				} else					count++;				cp++;			}			count = 1;			ij = 0;			fprintf(output,"-");		}	srcptr=nxtptr;	if(im.format != ITS)		nxtptr=srcptr+im.spbxnm * n;	else		nxtptr=srcptr+(im.spbxnm * n * 3);	ycnt-= n;		if(tmppagecount) {		tmplinecount--;		if(tmplinecount == 0) {			fprintf(output,"+");			tmppagecount--;			if(im.spbxnm >= MAXL_PIX_WIDTH) {				if(im.spbynm > MAXL_PIX_WIDTH) {					tmplinecount = MAXP_PIX_WIDTH;				}			}			if(im.spbxnm <= MAXP_PIX_WIDTH) {				if(im.spbynm > MAXP_PIX_HEIGHT) {					tmplinecount = MAXP_PIX_HEIGHT;				}			}		}	}	}	fprintf(output,"+");	fprintf(output,"\033\\");	return(0);}readXimghdr(){	register int tmp;	size=HEDLEN*512;	bcopy(filestorage+globi, (char *)&im, (int)size);	globi = globi + size;	if(im.imgflg != IMGFLG)		return(1);	if(im.format != QDSS || im.spbgnm != 1) {		if(im.format != ITS)			return(1);	}	if(im.format == ITS) {		tmp = im.spbxnm;		im.spbxnm = im.spbynm;		im.spbynm = tmp;		im.spblen = im.spblen * 3;	}	return(0);}readXimgcmp(){	if(im.format == ITS)		return(0);	size=im.cmplen*512;	if(size==0)		return(1);	if((cmpptr=(short *) malloc(size))==NULL)		return(1);	bcopy(filestorage+globi, (char *)cmpptr, (int)size);	globi = globi + size;	return(0);}readXimgdat(){	size=im.spblen*512;	if((imgptr=(char *) malloc(size))==NULL)		return(1);	bcopy(&filestorage[globi],imgptr,in-globi);	fread(imgptr+(in-globi), (char)size-(in-globi), 1, input);	return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -