filt_pipeline.c

来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· C语言 代码 · 共 140 行

C
140
字号
#include "fitz-base.h"#include "fitz-stream.h"#define noDEBUG 1typedef struct fz_pipeline_s fz_pipeline;fz_error * fz_processpipeline(fz_filter *filter, fz_buffer *in, fz_buffer *out);struct fz_pipeline_s{	fz_filter super;	fz_filter *head;	fz_buffer *buffer;	fz_filter *tail;	int tailneedsin;};fz_error *fz_chainpipeline(fz_filter **fp, fz_filter *head, fz_filter *tail, fz_buffer *buf){	FZ_NEWFILTER(fz_pipeline, p, pipeline);	p->head = fz_keepfilter(head);	p->tail = fz_keepfilter(tail);	p->tailneedsin = 1;	p->buffer = fz_keepbuffer(buf);	return fz_okay;}voidfz_unchainpipeline(fz_filter *filter, fz_filter **oldfp, fz_buffer **oldbp){	fz_pipeline *p = (fz_pipeline*)filter;	*oldfp = fz_keepfilter(p->head);	*oldbp = fz_keepbuffer(p->buffer);	fz_dropfilter(filter);}fz_error *fz_newpipeline(fz_filter **fp, fz_filter *head, fz_filter *tail){	fz_error *error;	FZ_NEWFILTER(fz_pipeline, p, pipeline);	p->head = fz_keepfilter(head);	p->tail = fz_keepfilter(tail);	p->tailneedsin = 1;	error = fz_newbuffer(&p->buffer, FZ_BUFSIZE);	if (error)	{	    fz_free(p);	    return fz_rethrow(error, "cannot create buffer");	}	return fz_okay;}voidfz_droppipeline(fz_filter *filter){	fz_pipeline *p = (fz_pipeline*)filter;	fz_dropfilter(p->head);	fz_dropfilter(p->tail);	fz_dropbuffer(p->buffer);}fz_error *fz_processpipeline(fz_filter *filter, fz_buffer *in, fz_buffer *out){	fz_pipeline *p = (fz_pipeline*)filter;	fz_error *e;	if (p->buffer->eof)		goto tail;	if (p->tailneedsin && p->head->produced)		goto tail;head:	e = fz_process(p->head, in, p->buffer);	if (e == fz_ioneedin)		return fz_ioneedin;	else if (e == fz_ioneedout)	{		if (p->tailneedsin && !p->head->produced)		{			fz_error *be = nil;			if (p->buffer->rp > p->buffer->bp)				be = fz_rewindbuffer(p->buffer);			else				be = fz_growbuffer(p->buffer);			if (be)				return be;			goto head;		}		goto tail;	}	else if (e == fz_iodone)		goto tail;	else if (e)		return fz_rethrow(e, "cannot process head filter");	else		return fz_okay;tail:	e = fz_process(p->tail, p->buffer, out);	if (e == fz_ioneedin)	{		if (p->buffer->eof)			return fz_throw("ioerror: premature eof in pipeline");		p->tailneedsin = 1;		goto head;	}	else if (e == fz_ioneedout)	{		p->tailneedsin = 0;		return fz_ioneedout;	}	else if (e == fz_iodone)		return fz_iodone;	else if (e)		return fz_rethrow(e, "cannot process tail filter");	else		return fz_okay;}

⌨️ 快捷键说明

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