📄 readjpg.c
字号:
if(nzeros >= 0){ if(acc[k] != 0) increment(h, acc, k, qt[k]<<Al); else if(nzeros-- == 0) acc[k] = pending; k++; continue; } rs = decode(h, acht); nibbles(rs, &rrrr, &ssss); if(ssss == 0){ if(rrrr < 15){ eobrun = 0; if(rrrr > 0) eobrun = receiveEOB(h, rrrr)-1; while(k <= Se){ increment(h, acc, k, qt[k]<<Al); k++; } break; } for(i=0; i<16; k++){ increment(h, acc, k, qt[k]<<Al); if(acc[k] == 0) i++; } continue; }else if(ssss != 1) jpgerror(h, "ReadJPG: ssss!=1 in progressive increment"); nzeros = rrrr; pending = receivebit(h); if(pending == 0) pending = -1; pending *= qt[k]<<Al; } } /* process restart marker, if present */ mcu++; if(ri>0 && mcu<nmcu && mcu%ri==0){ restart(h, mcu); eobrun = 0; nzeros = -1; } }}staticvoidprogressivescan(Header *h, int colorspace){ uchar *ss; int Ns, Ss, Ah, Al, c, comp, i; if(h->dccoeff[0] == nil) progressiveinit(h, colorspace); ss = h->ss; Ns = ss[0]; Ss = ss[1+2*Ns]; nibbles(ss[3+2*Ns], &Ah, &Al); c = ss[1]; comp = -1; for(i=0; i<h->Nf; i++) if(h->comp[i].C == c) comp = i; if(comp == -1) jpgerror(h, "ReadJPG: bad component index in scan header"); if(Ss == 0){ progressivedc(h, comp, Ah, Al); return; } if(Ah == 0){ progressiveac(h, comp, Al); return; } progressiveacinc(h, comp, Al);}enum { c1 = 2871, /* 1.402 * 2048 */ c2 = 705, /* 0.34414 * 2048 */ c3 = 1463, /* 0.71414 * 2048 */ c4 = 3629, /* 1.772 * 2048 */};staticvoidcolormap1(Header *h, int colorspace, Rawimage *image, int data[8*8], int mcu, int nacross){ uchar *pic; int x, y, dx, dy, minx, miny; int r, k, pici; USED(colorspace); pic = image->chans[0]; minx = 8*(mcu%nacross); dx = 8; if(minx+dx > h->X) dx = h->X-minx; miny = 8*(mcu/nacross); dy = 8; if(miny+dy > h->Y) dy = h->Y-miny; pici = miny*h->X+minx; k = 0; for(y=0; y<dy; y++){ for(x=0; x<dx; x++){ r = clamp[(data[k+x]+128)+CLAMPOFF]; pic[pici+x] = r; } pici += h->X; k += 8; }}staticvoidcolormapall1(Header *h, int colorspace, Rawimage *image, int data0[8*8], int data1[8*8], int data2[8*8], int mcu, int nacross){ uchar *rpic, *gpic, *bpic, *rp, *gp, *bp; int *p0, *p1, *p2; int x, y, dx, dy, minx, miny; int r, g, b, k, pici; int Y, Cr, Cb; rpic = image->chans[0]; gpic = image->chans[1]; bpic = image->chans[2]; minx = 8*(mcu%nacross); dx = 8; if(minx+dx > h->X) dx = h->X-minx; miny = 8*(mcu/nacross); dy = 8; if(miny+dy > h->Y) dy = h->Y-miny; pici = miny*h->X+minx; k = 0; for(y=0; y<dy; y++){ p0 = data0+k; p1 = data1+k; p2 = data2+k; rp = rpic+pici; gp = gpic+pici; bp = bpic+pici; if(colorspace == CYCbCr) for(x=0; x<dx; x++){ *rp++ = clamp[*p0++ + 128 + CLAMPOFF]; *gp++ = clamp[*p1++ + 128 + CLAMPOFF]; *bp++ = clamp[*p2++ + 128 + CLAMPOFF]; } else for(x=0; x<dx; x++){ Y = (*p0++ + 128) << 11; Cb = *p1++; Cr = *p2++; r = Y+c1*Cr; g = Y-c2*Cb-c3*Cr; b = Y+c4*Cb; *rp++ = clamp[(r>>11)+CLAMPOFF]; *gp++ = clamp[(g>>11)+CLAMPOFF]; *bp++ = clamp[(b>>11)+CLAMPOFF]; } pici += h->X; k += 8; }}staticvoidcolormap(Header *h, int colorspace, Rawimage *image, int *data0[8*8], int *data1[8*8], int *data2[8*8], int mcu, int nacross, int Hmax, int Vmax, int *H, int *V){ uchar *rpic, *gpic, *bpic; int x, y, dx, dy, minx, miny; int r, g, b, pici, H0, H1, H2; int t, b0, b1, b2, y0, y1, y2, x0, x1, x2; int Y, Cr, Cb; rpic = image->chans[0]; gpic = image->chans[1]; bpic = image->chans[2]; minx = 8*Hmax*(mcu%nacross); dx = 8*Hmax; if(minx+dx > h->X) dx = h->X-minx; miny = 8*Vmax*(mcu/nacross); dy = 8*Vmax; if(miny+dy > h->Y) dy = h->Y-miny; pici = miny*h->X+minx; H0 = H[0]; H1 = H[1]; H2 = H[2]; for(y=0; y<dy; y++){ t = y*V[0]; b0 = H0*(t/(8*Vmax)); y0 = 8*((t/Vmax)&7); t = y*V[1]; b1 = H1*(t/(8*Vmax)); y1 = 8*((t/Vmax)&7); t = y*V[2]; b2 = H2*(t/(8*Vmax)); y2 = 8*((t/Vmax)&7); x0 = 0; x1 = 0; x2 = 0; for(x=0; x<dx; x++){ if(colorspace == CYCbCr){ rpic[pici+x] = clamp[data0[b0][y0+x0++*H0/Hmax] + 128 + CLAMPOFF]; gpic[pici+x] = clamp[data1[b1][y1+x1++*H1/Hmax] + 128 + CLAMPOFF]; bpic[pici+x] = clamp[data2[b2][y2+x2++*H2/Hmax] + 128 + CLAMPOFF]; }else{ Y = (data0[b0][y0+x0++*H0/Hmax]+128)<<11; Cb = data1[b1][y1+x1++*H1/Hmax]; Cr = data2[b2][y2+x2++*H2/Hmax]; r = Y+c1*Cr; g = Y-c2*Cb-c3*Cr; b = Y+c4*Cb; rpic[pici+x] = clamp[(r>>11)+CLAMPOFF]; gpic[pici+x] = clamp[(g>>11)+CLAMPOFF]; bpic[pici+x] = clamp[(b>>11)+CLAMPOFF]; } if(x0*H0/Hmax >= 8){ x0 = 0; b0++; } if(x1*H1/Hmax >= 8){ x1 = 0; b1++; } if(x2*H2/Hmax >= 8){ x2 = 0; b2++; } } pici += h->X; }}/* * decode next 8-bit value from entropy-coded input. chart F-26 */staticintdecode(Header *h, Huffman *t){ int code, v, cnt, m, sr, i; int *maxcode; static int badcode; maxcode = t->maxcode; if(h->cnt < 8) nextbyte(h, 0); /* fast lookup */ code = (h->sr>>(h->cnt-8))&0xFF; v = t->value[code]; if(v >= 0){ h->cnt -= t->shift[code]; return v; } h->cnt -= 8; if(h->cnt == 0) nextbyte(h, 0); h->cnt--; cnt = h->cnt; m = 1<<cnt; sr = h->sr; code <<= 1; i = 9; for(;;i++){ if(sr & m) code |= 1; if(code <= maxcode[i]) break; code <<= 1; m >>= 1; if(m == 0){ sr = nextbyte(h, 0); m = 0x80; cnt = 8; } cnt--; } if(i >= 17){ if(badcode == 0) fprint(2, "badly encoded %dx%d JPEG file; ignoring bad value\n", h->X, h->Y); badcode = 1; i = 0; } h->cnt = cnt; return t->val[t->valptr[i]+(code-t->mincode[i])];}/* * load next byte of input */staticintnextbyte(Header *h, int marker){ int b, b2; if(h->peek >= 0){ b = h->peek; h->peek = -1; }else{ b = Bgetc(h->fd); if(b == Beof) jpgerror(h, "truncated file"); b &= 0xFF; } if(b == 0xFF){ if(marker) return b; b2 = Bgetc(h->fd); if(b2 != 0){ if(b2 == Beof) jpgerror(h, "truncated file"); b2 &= 0xFF; if(b2 == DNL) jpgerror(h, "ReadJPG: DNL marker unimplemented"); /* decoder is reading into marker; satisfy it and restore state */ Bungetc(h->fd); h->peek = b; } } h->cnt += 8; h->sr = (h->sr<<8) | b; return b;}/* * return next s bits of input, MSB first, and level shift it */staticintreceive(Header *h, int s){ int v, m; while(h->cnt < s) nextbyte(h, 0); h->cnt -= s; v = h->sr >> h->cnt; m = (1<<s); v &= m-1; /* level shift */ if(v < (m>>1)) v += ~(m-1)+1; return v;}/* * return next s bits of input, decode as EOB */staticintreceiveEOB(Header *h, int s){ int v, m; while(h->cnt < s) nextbyte(h, 0); h->cnt -= s; v = h->sr >> h->cnt; m = (1<<s); v &= m-1; /* level shift */ v += m; return v;}/* * return next bit of input */staticintreceivebit(Header *h){ if(h->cnt < 1) nextbyte(h, 0); h->cnt--; return (h->sr >> h->cnt) & 1;}/* * Scaled integer implementation. * inverse two dimensional DCT, Chen-Wang algorithm * (IEEE ASSP-32, pp. 803-816, Aug. 1984) * 32-bit integer arithmetic (8 bit coefficients) * 11 mults, 29 adds per DCT * * coefficients extended to 12 bit for IEEE1180-1990 compliance */enum { W1 = 2841, /* 2048*sqrt(2)*cos(1*pi/16)*/ W2 = 2676, /* 2048*sqrt(2)*cos(2*pi/16)*/ W3 = 2408, /* 2048*sqrt(2)*cos(3*pi/16)*/ W5 = 1609, /* 2048*sqrt(2)*cos(5*pi/16)*/ W6 = 1108, /* 2048*sqrt(2)*cos(6*pi/16)*/ W7 = 565, /* 2048*sqrt(2)*cos(7*pi/16)*/ W1pW7 = 3406, /* W1+W7*/ W1mW7 = 2276, /* W1-W7*/ W3pW5 = 4017, /* W3+W5*/ W3mW5 = 799, /* W3-W5*/ W2pW6 = 3784, /* W2+W6*/ W2mW6 = 1567, /* W2-W6*/ R2 = 181 /* 256/sqrt(2)*/};staticvoididct(int b[8*8]){ int x, y, eighty, v; int x0, x1, x2, x3, x4, x5, x6, x7, x8; int *p; /* transform horizontally*/ for(y=0; y<8; y++){ eighty = y<<3; /* if all non-DC components are zero, just propagate the DC term*/ p = b+eighty; if(p[1]==0) if(p[2]==0 && p[3]==0) if(p[4]==0 && p[5]==0) if(p[6]==0 && p[7]==0){ v = p[0]<<3; p[0] = v; p[1] = v; p[2] = v; p[3] = v; p[4] = v; p[5] = v; p[6] = v; p[7] = v; continue; } /* prescale*/ x0 = (p[0]<<11)+128; x1 = p[4]<<11; x2 = p[6]; x3 = p[2]; x4 = p[1]; x5 = p[7]; x6 = p[5]; x7 = p[3]; /* first stage*/ x8 = W7*(x4+x5); x4 = x8 + W1mW7*x4; x5 = x8 - W1pW7*x5; x8 = W3*(x6+x7); x6 = x8 - W3mW5*x6; x7 = x8 - W3pW5*x7; /* second stage*/ x8 = x0 + x1; x0 -= x1; x1 = W6*(x3+x2); x2 = x1 - W2pW6*x2; x3 = x1 + W2mW6*x3; x1 = x4 + x6; x4 -= x6; x6 = x5 + x7; x5 -= x7; /* third stage*/ x7 = x8 + x3; x8 -= x3; x3 = x0 + x2; x0 -= x2; x2 = (R2*(x4+x5)+128)>>8; x4 = (R2*(x4-x5)+128)>>8; /* fourth stage*/ p[0] = (x7+x1)>>8; p[1] = (x3+x2)>>8; p[2] = (x0+x4)>>8; p[3] = (x8+x6)>>8; p[4] = (x8-x6)>>8; p[5] = (x0-x4)>>8; p[6] = (x3-x2)>>8; p[7] = (x7-x1)>>8; } /* transform vertically*/ for(x=0; x<8; x++){ /* if all non-DC components are zero, just propagate the DC term*/ p = b+x; if(p[8*1]==0) if(p[8*2]==0 && p[8*3]==0) if(p[8*4]==0 && p[8*5]==0) if(p[8*6]==0 && p[8*7]==0){ v = (p[8*0]+32)>>6; p[8*0] = v; p[8*1] = v; p[8*2] = v; p[8*3] = v; p[8*4] = v; p[8*5] = v; p[8*6] = v; p[8*7] = v; continue; } /* prescale*/ x0 = (p[8*0]<<8)+8192; x1 = p[8*4]<<8; x2 = p[8*6]; x3 = p[8*2]; x4 = p[8*1]; x5 = p[8*7]; x6 = p[8*5]; x7 = p[8*3]; /* first stage*/ x8 = W7*(x4+x5) + 4; x4 = (x8+W1mW7*x4)>>3; x5 = (x8-W1pW7*x5)>>3; x8 = W3*(x6+x7) + 4; x6 = (x8-W3mW5*x6)>>3; x7 = (x8-W3pW5*x7)>>3; /* second stage*/ x8 = x0 + x1; x0 -= x1; x1 = W6*(x3+x2) + 4; x2 = (x1-W2pW6*x2)>>3; x3 = (x1+W2mW6*x3)>>3; x1 = x4 + x6; x4 -= x6; x6 = x5 + x7; x5 -= x7; /* third stage*/ x7 = x8 + x3; x8 -= x3; x3 = x0 + x2; x0 -= x2; x2 = (R2*(x4+x5)+128)>>8; x4 = (R2*(x4-x5)+128)>>8; /* fourth stage*/ p[8*0] = (x7+x1)>>14; p[8*1] = (x3+x2)>>14; p[8*2] = (x0+x4)>>14; p[8*3] = (x8+x6)>>14; p[8*4] = (x8-x6)>>14; p[8*5] = (x0-x4)>>14; p[8*6] = (x3-x2)>>14; p[8*7] = (x7-x1)>>14; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -