private void Fax3Encode2DRow()
{
int a0 = 0;
int a1 = (Pixel(dataBp, offsetData, 0) != 0 ? 0 : Finddiff(dataBp, offsetData, 0, rowpixels, 0));
int b1 = (Pixel(refline, 0, 0) != 0 ? 0 : Finddiff(refline, 0, 0, rowpixels, 0));
int a2, b2;
for (;;) {
b2 = Finddiff2(refline, 0, b1, rowpixels, Pixel(refline, 0,b1));
if (b2 >= a1) {
int d = b1 - a1;
if (!(-3 <= d && d <= 3)) { /* horizontal mode */
a2 = Finddiff2(dataBp, offsetData, a1, rowpixels, Pixel(dataBp, offsetData,a1));
Putcode(horizcode);
if (a0+a1 == 0 || Pixel(dataBp, offsetData, a0) == 0) {
Putspan(a1-a0, TIFFFaxWhiteCodes);
Putspan(a2-a1, TIFFFaxBlackCodes);
} else {
Putspan(a1-a0, TIFFFaxBlackCodes);
Putspan(a2-a1, TIFFFaxWhiteCodes);
}
a0 = a2;
} else { /* vertical mode */
Putcode(vcodes[d+3]);
a0 = a1;
}
} else { /* pass mode */
Putcode(passcode);
a0 = b2;
}
if (a0 >= rowpixels)
break;
a1 = Finddiff(dataBp, offsetData, a0, rowpixels, Pixel(dataBp, offsetData,a0));
b1 = Finddiff(refline, 0, a0, rowpixels, Pixel(dataBp, offsetData,a0) ^ 1);
b1 = Finddiff(refline, 0, b1, rowpixels, Pixel(dataBp, offsetData,a0));
}
}