static int DecodeACSign(WinZipJPEGDecompressor *self,int comp,unsigned int k,int absvalue, const WinZipJPEGBlock *current,const WinZipJPEGBlock *north,const WinZipJPEGBlock *west, const WinZipJPEGQuantizationTable *quantization) { // Decode sign. (5.6.6.4) // Calculate sign context, or decode with fixed probability. (5.6.6.4.1) int predictedsign; if(IsFirstRowOrColumn(k)) { int bdr=BDR(k,current,north,west,quantization); if(bdr==0) return NextBitFromWinZipJPEGArithmeticDecoder(&self->decoder,&self->fixedcontext); predictedsign=(bdr<0); } else if(k==4) { int sign1=Sign(north->c[k]); int sign2=Sign(west->c[k]); if(sign1+sign2==0) return NextBitFromWinZipJPEGArithmeticDecoder(&self->decoder,&self->fixedcontext); predictedsign=(sign1+sign2<0); } else if(IsSecondRow(k)) { if(north->c[k]==0) return NextBitFromWinZipJPEGArithmeticDecoder(&self->decoder,&self->fixedcontext); predictedsign=(north->c[k]<0); } else if(IsSecondColumn(k)) { if(west->c[k]==0) return NextBitFromWinZipJPEGArithmeticDecoder(&self->decoder,&self->fixedcontext); predictedsign=(west->c[k]<0); } else { return NextBitFromWinZipJPEGArithmeticDecoder(&self->decoder,&self->fixedcontext); } static const int n_for_k[64]={ 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 0,11,12, 13,14, 0, 0,15,16, 17,18, 0, 0, 0,19,20, 21,22, 0, 0, 0, 0,23,24, 25, 0, 0, 0, 0, 0,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; int n=n_for_k[k]; int signcontext1=Min(Category(absvalue)/2,2); return NextBitFromWinZipJPEGArithmeticDecoder(&self->decoder, &self->acsignbins[comp][n][signcontext1][predictedsign]); }
static void CompressACSign(JPEGCompressor *self,int comp,unsigned int k,int absvalue, const JPEGBlock *current,const JPEGBlock *north,const JPEGBlock *west, const JPEGQuantizationTable *quantization) { int sign=current->c[k]<0; // Calculate sign context, or compress with fixed probability. int predictedsign; if(IsFirstRowOrColumn(k)) { int bdr=BDR(k,current,north,west,quantization); if(bdr==0) { WriteBit(&self->encoder,sign,0x800); return; } predictedsign=(bdr<0); } else if(k==4) { int sign1=Sign(north->c[k]); int sign2=Sign(west->c[k]); if(sign1+sign2==0) { WriteBit(&self->encoder,sign,0x800); return; } predictedsign=(sign1+sign2<0); } else if(IsSecondRow(k)) { if(north->c[k]==0) { WriteBit(&self->encoder,sign,0x800); return; } predictedsign=(north->c[k]<0); } else if(IsSecondColumn(k)) { if(west->c[k]==0) { WriteBit(&self->encoder,sign,0x800); return; } predictedsign=(west->c[k]<0); } else { WriteBit(&self->encoder,sign,0x800); return; } static const int n_for_k[64]={ 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 0,11,12, 13,14, 0, 0,15,16, 17,18, 0, 0, 0,19,20, 21,22, 0, 0, 0, 0,23,24, 25, 0, 0, 0, 0, 0,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; int n=n_for_k[k]; int signcontext1=Min(Category(absvalue)/2,2); WriteDynamicBit(&self->encoder,sign, &self->acsignbins[comp][n][signcontext1][predictedsign], self->acsignshift); }