ref: f342f5a5600a41bcf634e59af2a8f951cb24afb6
dir: /f_runlength.c/
#include <u.h>
#include <libc.h>
#include "pdf.h"
/* 7.4.5 RunLengthDecode filter */
static int
flreadall(void *aux, Buffer *bi, Buffer *bo)
{
int sz, i;
uchar *p;
USED(aux);
p = bufdata(bi, &sz);
for(; sz > 0;){
i = *p++;
sz--;
if(i == 0x80) /* EOD */
break;
if(i > 0x80){
if(sz < 1){
werrstr("no byte to repeat");
return -1;
}
for(i = 257 - i; i > 0; i--)
bufput(bo, p, 1);
p++;
}else{
i++;
if(i > sz){
werrstr("short data");
return -1;
}
bufput(bo, p, i);
p += i;
sz -= i;
}
}
bi->off = bi->sz;
return 0;
}
Filter filterRunLength = {
.name = "RunLengthDecode",
.readall = flreadall,
};