mmplugins/imagingplugins/codecs/TIFFCodec/TIFFFax.cpp
changeset 0 40261b775718
child 14 cd271b19d824
equal deleted inserted replaced
-1:000000000000 0:40261b775718
       
     1 // Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include "TIFFFax.h"
       
    17 
       
    18 const TInt KMaxHuffmanCodeLength = 13;
       
    19 LOCAL_C inline TUint32 GetMostSignificantBits(TUint32 aBits,TInt aNumBits)
       
    20 	{
       
    21 	return(aBits>>(32-aNumBits));
       
    22 	}
       
    23 
       
    24 
       
    25 // CTiffFax1dDecoder.
       
    26 CTiffFax1dDecoder::~CTiffFax1dDecoder()
       
    27 	{
       
    28 	delete []iRunData;
       
    29 	delete iImageProcessor;
       
    30 	}
       
    31 
       
    32 void CTiffFax1dDecoder::ConstructL(const TTiffImageData& aImageData)
       
    33 	{
       
    34 	iImageData = &aImageData;
       
    35 
       
    36 	if((iImageData->iBitsPerSample>1) || (iImageData->iSamplesPerPixel>1))
       
    37 		User::Leave(KErrNotSupported);
       
    38 
       
    39 	if(iImageData->iFillOrder==2)
       
    40 		iReverseBitsInByte = ETrue;
       
    41 
       
    42 	// note officially should check for iImageData->iPhotometricInterpretation==EBlackIsZero
       
    43 	// and reverse black, white interpretation, but some TIFF writers break this rule and other
       
    44 	// readers ignore it
       
    45 	iBlack = KRgbBlack;
       
    46 	iWhite = KRgbWhite;
       
    47 
       
    48 	iRowWidth = iImageData->iSizeInPixels.iWidth;
       
    49 	iRowNumber = 0;
       
    50 	iRunData = new (ELeave) TInt[iRowWidth+2];
       
    51 	}
       
    52 
       
    53 void CTiffFax1dDecoder::DoNewFrameL(CFbsBitmap& aBitmap, TBool aDisableErrorDiffusion, TInt aReductionFactor)
       
    54 	{
       
    55 	delete iImageProcessor;
       
    56 	iImageProcessor = NULL;
       
    57 
       
    58 	iImageProcessor = ImageProcessorUtility::NewImageProcessorL(aBitmap, aReductionFactor, EGray2, aDisableErrorDiffusion);
       
    59 	iImageProcessor->PrepareL(aBitmap,iImageData->iSizeInPixels);
       
    60 	}
       
    61 
       
    62 void CTiffFax1dDecoder::NewStripL(TInt aNumBytes)
       
    63 	{
       
    64 	if(!aNumBytes)
       
    65 		aNumBytes = KMaxTInt;
       
    66 
       
    67 	iRowsRemaining = iImageData->iRowsPerStrip;
       
    68 
       
    69 	TInt maxRows = iImageData->iSizeInPixels.iHeight-iRowNumber;
       
    70 	if( (iRowsRemaining>maxRows) || (iRowsRemaining<=0) )
       
    71 		iRowsRemaining = maxRows;
       
    72 
       
    73 	iPixelsStoredInRow = 0;
       
    74 
       
    75 	iBitCache = 0;
       
    76 	iBitCacheLength = 0;
       
    77 
       
    78 	iCodeType = ETiffFaxWhiteRun;
       
    79 
       
    80 	CTiffFax1dDecoder::NewRow();
       
    81 	}
       
    82 
       
    83 void CTiffFax1dDecoder::NewRow()
       
    84 	{
       
    85 	iColor = ETiffFaxWhiteRun;
       
    86 	iRunDataIndex = 0;
       
    87 	iRunData[0] = 0;
       
    88 	}
       
    89 
       
    90 TBool CTiffFax1dDecoder::ProcessStripL(TBufPtr8* aSrc)
       
    91 	{
       
    92 	const TUint8* sourceBuffer = aSrc->Ptr();
       
    93 	iSourcePtr = sourceBuffer;
       
    94 	iSourcePtrLimit = iSourcePtr+aSrc->Length();
       
    95 
       
    96 	UseBits(0);
       
    97 
       
    98 	FOREVER
       
    99 		{
       
   100 		switch(ProcessNextCode())
       
   101 			{
       
   102 		case ETiffFaxUnderflow:
       
   103 			aSrc->Shift(iSourcePtr-sourceBuffer);
       
   104 			return(EFalse);
       
   105 
       
   106 		case ETiffFaxInvalid:
       
   107 			User::Leave(KErrCorrupt);
       
   108 
       
   109 		case ETiffFaxEndOfLine:
       
   110 			if(iPixelsStoredInRow==0)
       
   111 				continue;
       
   112 
       
   113 			if(iPixelsStoredInRow!=iRowWidth)
       
   114 				User::Leave(KErrCorrupt);
       
   115 
       
   116 			NewRow();
       
   117 
       
   118 			iPixelsStoredInRow = 0;
       
   119 			iRowNumber++;
       
   120 			iRowsRemaining--;
       
   121 			continue;
       
   122 
       
   123 		case ETiffFaxPixelRun:
       
   124 			if(!iCodeCount)
       
   125 				continue;
       
   126 
       
   127 			{
       
   128 			TInt n = iPixelsStoredInRow+iCodeCount;
       
   129 
       
   130 			if(n>iRowWidth)
       
   131 				User::Leave(KErrCorrupt);
       
   132 
       
   133 			if(iCodeType==ETiffFaxBlackRun)
       
   134 				{
       
   135 				iImageProcessor->SetMonoPixelRun(0,iCodeCount);
       
   136 
       
   137 				if(!(iRunDataIndex&1))
       
   138 					iRunDataIndex++;
       
   139 				}
       
   140 			else
       
   141 				{
       
   142 				iImageProcessor->SetMonoPixelRun(255,iCodeCount);
       
   143 
       
   144 				if(iRunDataIndex&1)
       
   145 					iRunDataIndex++;
       
   146 				}
       
   147 
       
   148 			iPixelsStoredInRow = n;
       
   149 			iRunData[iRunDataIndex] = n;
       
   150 
       
   151 			if((n!=iRowWidth) || (iRowsRemaining!=1))	// Continue if not last pixel of image
       
   152 				continue;
       
   153 			}
       
   154 
       
   155 			// else drop through....
       
   156 
       
   157 		case ETiffFaxEndOfFax:
       
   158 			iImageProcessor->FlushPixels();
       
   159 			return(ETrue);
       
   160 			}
       
   161 		}
       
   162 	}
       
   163 
       
   164 LOCAL_D const TUint8 KByteFlip[256] =
       
   165 	{
       
   166 	0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0,0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0,
       
   167 	0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8,0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8,
       
   168 	0x04,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4,0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4,
       
   169 	0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec,0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc,
       
   170 	0x02,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2,0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2,
       
   171 	0x0a,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea,0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa,
       
   172 	0x06,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6,0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6,
       
   173 	0x0e,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee,0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe,
       
   174 	0x01,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1,0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1,
       
   175 	0x09,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9,0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9,
       
   176 	0x05,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5,0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5,
       
   177 	0x0d,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed,0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd,
       
   178 	0x03,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3,0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3,
       
   179 	0x0b,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb,0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb,
       
   180 	0x07,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7,0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7,
       
   181 	0x0f,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef,0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff
       
   182 	};
       
   183 
       
   184 void CTiffFax1dDecoder::UseBits(TInt aNumBits)
       
   185 	{
       
   186 	ASSERT(aNumBits<=iBitCacheLength);
       
   187 
       
   188 	TInt		validBits = iBitCacheLength-aNumBits;
       
   189 	TUint32		bits = iBitCache<<aNumBits;
       
   190 
       
   191 	if(validBits>=KMaxHuffmanCodeLength)
       
   192 		{
       
   193 		iBitCache = bits;
       
   194 		iBitCacheLength = validBits;
       
   195 		return;
       
   196 		}
       
   197 
       
   198 	TInt shift = 32-validBits;
       
   199 	const TUint8* ptr = iSourcePtr;
       
   200 
       
   201 	TInt numBytes = shift>>3;
       
   202 	TInt maxBytes = iSourcePtrLimit-ptr;
       
   203 	if(numBytes>maxBytes)
       
   204 		numBytes = maxBytes;
       
   205 
       
   206 	iBitCacheLength = validBits+numBytes*8;
       
   207 
       
   208 	const TUint8* ptrLimit = ptr+numBytes;
       
   209 
       
   210 	if(iReverseBitsInByte)
       
   211 		{
       
   212 		while(ptr<ptrLimit)
       
   213 			{
       
   214 			TInt byte = *(ptr++);
       
   215 			byte = KByteFlip[byte]; // reverse bits within byte
       
   216 			shift -= 8;
       
   217 			bits |= byte<<shift;
       
   218 			}
       
   219 		}
       
   220 	else
       
   221 		{
       
   222 		while(ptr<ptrLimit)
       
   223 			{
       
   224 			TInt byte = *(ptr++);
       
   225 			shift -= 8;
       
   226 			bits |= byte<<shift;
       
   227 			}
       
   228 	}
       
   229 
       
   230 	iBitCache = bits;
       
   231 	iSourcePtr = ptr;
       
   232 
       
   233 	return;
       
   234 	}
       
   235 
       
   236 TTiffFaxState CTiffFax1dDecoder::Decode1d()
       
   237 	{
       
   238 	if(iBitCache&0xff000000)
       
   239 		{
       
   240 		if(iColor==ETiffFaxWhiteRun)
       
   241 			return(DecodeWhite());
       
   242 		else
       
   243 			return(DecodeBlack());
       
   244 		}
       
   245 	else
       
   246 		return(DecodeEndOfLine());
       
   247 	}
       
   248 
       
   249 #define HUFFMAN_DECODE_ENTRY(aCount,aNumBits) (aCount<<4)+aNumBits
       
   250 LOCAL_D const TUint16 White0000[16] =
       
   251 	{
       
   252 		HUFFMAN_DECODE_ENTRY(0		,0),
       
   253 		HUFFMAN_DECODE_ENTRY(0		,0),
       
   254 		HUFFMAN_DECODE_ENTRY(29		,8),
       
   255 		HUFFMAN_DECODE_ENTRY(30		,8),
       
   256 		HUFFMAN_DECODE_ENTRY(45		,8),
       
   257 		HUFFMAN_DECODE_ENTRY(46		,8),
       
   258 		HUFFMAN_DECODE_ENTRY(22		,7),
       
   259 		HUFFMAN_DECODE_ENTRY(22		,7),
       
   260 
       
   261 		HUFFMAN_DECODE_ENTRY(23		,7),
       
   262 		HUFFMAN_DECODE_ENTRY(23		,7),
       
   263 		HUFFMAN_DECODE_ENTRY(47		,8),
       
   264 		HUFFMAN_DECODE_ENTRY(48		,8),
       
   265 		HUFFMAN_DECODE_ENTRY(13		,6),
       
   266 		HUFFMAN_DECODE_ENTRY(13		,6),
       
   267 		HUFFMAN_DECODE_ENTRY(13		,6),
       
   268 		HUFFMAN_DECODE_ENTRY(13		,6)
       
   269 	};
       
   270 
       
   271 LOCAL_D const TUint16 White0001[16] =
       
   272 	{
       
   273 		HUFFMAN_DECODE_ENTRY(20		,7),
       
   274 		HUFFMAN_DECODE_ENTRY(20		,7),
       
   275 		HUFFMAN_DECODE_ENTRY(33		,8),
       
   276 		HUFFMAN_DECODE_ENTRY(34		,8),
       
   277 		HUFFMAN_DECODE_ENTRY(35		,8),
       
   278 		HUFFMAN_DECODE_ENTRY(36		,8),
       
   279 		HUFFMAN_DECODE_ENTRY(37		,8),
       
   280 		HUFFMAN_DECODE_ENTRY(38		,8),
       
   281 
       
   282 		HUFFMAN_DECODE_ENTRY(19		,7),
       
   283 		HUFFMAN_DECODE_ENTRY(19		,7),
       
   284 		HUFFMAN_DECODE_ENTRY(31		,8),
       
   285 		HUFFMAN_DECODE_ENTRY(32		,8),
       
   286 		HUFFMAN_DECODE_ENTRY(1		,6),
       
   287 		HUFFMAN_DECODE_ENTRY(1		,6),
       
   288 		HUFFMAN_DECODE_ENTRY(1		,6),
       
   289 		HUFFMAN_DECODE_ENTRY(1		,6)
       
   290 	};
       
   291 
       
   292 LOCAL_D const TUint16 White0010[16] =
       
   293 	{
       
   294 		HUFFMAN_DECODE_ENTRY(12		,6),
       
   295 		HUFFMAN_DECODE_ENTRY(12		,6),
       
   296 		HUFFMAN_DECODE_ENTRY(12		,6),
       
   297 		HUFFMAN_DECODE_ENTRY(12		,6),
       
   298 		HUFFMAN_DECODE_ENTRY(53		,8),
       
   299 		HUFFMAN_DECODE_ENTRY(54		,8),
       
   300 		HUFFMAN_DECODE_ENTRY(26		,7),
       
   301 		HUFFMAN_DECODE_ENTRY(26		,7),
       
   302 
       
   303 		HUFFMAN_DECODE_ENTRY(39		,8),
       
   304 		HUFFMAN_DECODE_ENTRY(40		,8),
       
   305 		HUFFMAN_DECODE_ENTRY(41		,8),
       
   306 		HUFFMAN_DECODE_ENTRY(42		,8),
       
   307 		HUFFMAN_DECODE_ENTRY(43		,8),
       
   308 		HUFFMAN_DECODE_ENTRY(44		,8),
       
   309 		HUFFMAN_DECODE_ENTRY(21		,7),
       
   310 		HUFFMAN_DECODE_ENTRY(21		,7)
       
   311 	};
       
   312 
       
   313 LOCAL_D const TUint16 White0011[16] =
       
   314 	{
       
   315 		HUFFMAN_DECODE_ENTRY(28		,7),
       
   316 		HUFFMAN_DECODE_ENTRY(28		,7),
       
   317 		HUFFMAN_DECODE_ENTRY(61		,8),
       
   318 		HUFFMAN_DECODE_ENTRY(62		,8),
       
   319 		HUFFMAN_DECODE_ENTRY(63		,8),
       
   320 		HUFFMAN_DECODE_ENTRY(0		,8),
       
   321 		HUFFMAN_DECODE_ENTRY(320	,8),
       
   322 		HUFFMAN_DECODE_ENTRY(384	,8),
       
   323 
       
   324 		HUFFMAN_DECODE_ENTRY(10		,5),
       
   325 		HUFFMAN_DECODE_ENTRY(10		,5),
       
   326 		HUFFMAN_DECODE_ENTRY(10		,5),
       
   327 		HUFFMAN_DECODE_ENTRY(10		,5),
       
   328 		HUFFMAN_DECODE_ENTRY(10		,5),
       
   329 		HUFFMAN_DECODE_ENTRY(10		,5),
       
   330 		HUFFMAN_DECODE_ENTRY(10		,5),
       
   331 		HUFFMAN_DECODE_ENTRY(10		,5)
       
   332 	};
       
   333 
       
   334 LOCAL_D const TUint16 White0100[32] =
       
   335 	{
       
   336 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   337 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   338 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   339 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   340 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   341 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   342 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   343 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   344 
       
   345 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   346 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   347 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   348 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   349 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   350 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   351 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   352 		HUFFMAN_DECODE_ENTRY(11		,5),
       
   353 
       
   354 		HUFFMAN_DECODE_ENTRY(27		,7),
       
   355 		HUFFMAN_DECODE_ENTRY(27		,7),
       
   356 		HUFFMAN_DECODE_ENTRY(27		,7),
       
   357 		HUFFMAN_DECODE_ENTRY(27		,7),
       
   358 		HUFFMAN_DECODE_ENTRY(59		,8),
       
   359 		HUFFMAN_DECODE_ENTRY(59		,8),
       
   360 		HUFFMAN_DECODE_ENTRY(60		,8),
       
   361 		HUFFMAN_DECODE_ENTRY(60		,8),
       
   362 
       
   363 		HUFFMAN_DECODE_ENTRY(1472	,9),
       
   364 		HUFFMAN_DECODE_ENTRY(1536	,9),
       
   365 		HUFFMAN_DECODE_ENTRY(1600	,9),
       
   366 		HUFFMAN_DECODE_ENTRY(1728	,9),
       
   367 		HUFFMAN_DECODE_ENTRY(18		,7),
       
   368 		HUFFMAN_DECODE_ENTRY(18		,7),
       
   369 		HUFFMAN_DECODE_ENTRY(18		,7),
       
   370 		HUFFMAN_DECODE_ENTRY(18		,7)
       
   371 	};
       
   372 
       
   373 LOCAL_D const TUint16 White0101[16] =
       
   374 	{
       
   375 		HUFFMAN_DECODE_ENTRY(24		,7),
       
   376 		HUFFMAN_DECODE_ENTRY(24		,7),
       
   377 		HUFFMAN_DECODE_ENTRY(49		,8),
       
   378 		HUFFMAN_DECODE_ENTRY(50		,8),
       
   379 		HUFFMAN_DECODE_ENTRY(51		,8),
       
   380 		HUFFMAN_DECODE_ENTRY(52		,8),
       
   381 		HUFFMAN_DECODE_ENTRY(25		,7),
       
   382 		HUFFMAN_DECODE_ENTRY(25		,7),
       
   383 
       
   384 		HUFFMAN_DECODE_ENTRY(55		,8),
       
   385 		HUFFMAN_DECODE_ENTRY(56		,8),
       
   386 		HUFFMAN_DECODE_ENTRY(57		,8),
       
   387 		HUFFMAN_DECODE_ENTRY(58		,8),
       
   388 		HUFFMAN_DECODE_ENTRY(192	,6),
       
   389 		HUFFMAN_DECODE_ENTRY(192	,6),
       
   390 		HUFFMAN_DECODE_ENTRY(192	,6),
       
   391 		HUFFMAN_DECODE_ENTRY(192	,6)
       
   392 	};
       
   393 
       
   394 LOCAL_D const TUint16 White0110[32] =
       
   395 	{
       
   396 		HUFFMAN_DECODE_ENTRY(1664	,6),
       
   397 		HUFFMAN_DECODE_ENTRY(1664	,6),
       
   398 		HUFFMAN_DECODE_ENTRY(1664	,6),
       
   399 		HUFFMAN_DECODE_ENTRY(1664	,6),
       
   400 		HUFFMAN_DECODE_ENTRY(1664	,6),
       
   401 		HUFFMAN_DECODE_ENTRY(1664	,6),
       
   402 		HUFFMAN_DECODE_ENTRY(1664	,6),
       
   403 		HUFFMAN_DECODE_ENTRY(1664	,6),
       
   404 
       
   405 		HUFFMAN_DECODE_ENTRY(448	,8),
       
   406 		HUFFMAN_DECODE_ENTRY(448	,8),
       
   407 		HUFFMAN_DECODE_ENTRY(512	,8),
       
   408 		HUFFMAN_DECODE_ENTRY(512	,8),
       
   409 		HUFFMAN_DECODE_ENTRY(704	,9),
       
   410 		HUFFMAN_DECODE_ENTRY(768	,9),
       
   411 		HUFFMAN_DECODE_ENTRY(640	,8),
       
   412 		HUFFMAN_DECODE_ENTRY(640	,8),
       
   413 
       
   414 		HUFFMAN_DECODE_ENTRY(576	,8),
       
   415 		HUFFMAN_DECODE_ENTRY(576	,8),
       
   416 		HUFFMAN_DECODE_ENTRY(832	,9),
       
   417 		HUFFMAN_DECODE_ENTRY(896	,9),
       
   418 		HUFFMAN_DECODE_ENTRY(960	,9),
       
   419 		HUFFMAN_DECODE_ENTRY(1024	,9),
       
   420 		HUFFMAN_DECODE_ENTRY(1088	,9),
       
   421 		HUFFMAN_DECODE_ENTRY(1152	,9),
       
   422 
       
   423 		HUFFMAN_DECODE_ENTRY(1216	,9),
       
   424 		HUFFMAN_DECODE_ENTRY(1280	,9),
       
   425 		HUFFMAN_DECODE_ENTRY(1344	,9),
       
   426 		HUFFMAN_DECODE_ENTRY(1408	,9),
       
   427 		HUFFMAN_DECODE_ENTRY(256	,7),
       
   428 		HUFFMAN_DECODE_ENTRY(256	,7),
       
   429 		HUFFMAN_DECODE_ENTRY(256	,7),
       
   430 		HUFFMAN_DECODE_ENTRY(256	,7)
       
   431 	};
       
   432 
       
   433 LOCAL_D const TUint16 White0111[1] =
       
   434 	{
       
   435 		HUFFMAN_DECODE_ENTRY(2		,4)
       
   436 	};
       
   437 
       
   438 LOCAL_D const TUint16 White1000[1] =
       
   439 	{
       
   440 		HUFFMAN_DECODE_ENTRY(3		,4)
       
   441 	};
       
   442 
       
   443 LOCAL_D const TUint16 White1001[2] =
       
   444 	{
       
   445 		HUFFMAN_DECODE_ENTRY(128	,5),
       
   446 		HUFFMAN_DECODE_ENTRY(8		,5)
       
   447 	};
       
   448 
       
   449 LOCAL_D const TUint16 White1010[4] =
       
   450 	{
       
   451 		HUFFMAN_DECODE_ENTRY(9		,5),
       
   452 		HUFFMAN_DECODE_ENTRY(9		,5),
       
   453 		HUFFMAN_DECODE_ENTRY(16		,6),
       
   454 		HUFFMAN_DECODE_ENTRY(17		,6)
       
   455 	};
       
   456 
       
   457 LOCAL_D const TUint16 White1011[1] =
       
   458 	{
       
   459 		HUFFMAN_DECODE_ENTRY(4		,4)
       
   460 	};
       
   461 
       
   462 LOCAL_D const TUint16 White1100[1] =
       
   463 	{
       
   464 		HUFFMAN_DECODE_ENTRY(5		,4)
       
   465 	};
       
   466 
       
   467 LOCAL_D const TUint16 White1101[4] =
       
   468 	{
       
   469 		HUFFMAN_DECODE_ENTRY(14		,6),
       
   470 		HUFFMAN_DECODE_ENTRY(15		,6),
       
   471 		HUFFMAN_DECODE_ENTRY(64		,5),
       
   472 		HUFFMAN_DECODE_ENTRY(64		,5)
       
   473 	};
       
   474 
       
   475 LOCAL_D const TUint16 White1110[1] =
       
   476 	{
       
   477 		HUFFMAN_DECODE_ENTRY(6		,4)
       
   478 	};
       
   479 
       
   480 LOCAL_D const TUint16 White1111[1] =
       
   481 	{
       
   482 		HUFFMAN_DECODE_ENTRY(7		,4)
       
   483 	};
       
   484 
       
   485 LOCAL_D const TUint16 Black0001[4] =
       
   486 	{
       
   487 		HUFFMAN_DECODE_ENTRY(9		,6),
       
   488 		HUFFMAN_DECODE_ENTRY(8		,6),
       
   489 		HUFFMAN_DECODE_ENTRY(7		,5),
       
   490 		HUFFMAN_DECODE_ENTRY(7		,5)
       
   491 	};
       
   492 
       
   493 LOCAL_D const TUint16 Black0010[1] =
       
   494 	{
       
   495 		HUFFMAN_DECODE_ENTRY(6		,4)
       
   496 	};
       
   497 
       
   498 LOCAL_D const TUint16 Black0011[1] =
       
   499 	{
       
   500 		HUFFMAN_DECODE_ENTRY(5		,4)
       
   501 	};
       
   502 
       
   503 LOCAL_D const TUint16 Black010x[1] =
       
   504 	{
       
   505 		HUFFMAN_DECODE_ENTRY(1		,3)
       
   506 	};
       
   507 
       
   508 LOCAL_D const TUint16 Black011x[1] =
       
   509 	{
       
   510 		HUFFMAN_DECODE_ENTRY(4		,3)
       
   511 	};
       
   512 
       
   513 LOCAL_D const TUint16 Black10xx[1] =
       
   514 	{
       
   515 		HUFFMAN_DECODE_ENTRY(3		,2)
       
   516 	};
       
   517 
       
   518 LOCAL_D const TUint16 Black11xx[1] =
       
   519 	{
       
   520 		HUFFMAN_DECODE_ENTRY(2		,2)
       
   521 	};
       
   522 
       
   523 LOCAL_D const TUint16 Black0000_0010[32] =
       
   524 	{
       
   525 		HUFFMAN_DECODE_ENTRY(18		,10),
       
   526 		HUFFMAN_DECODE_ENTRY(18		,10),
       
   527 		HUFFMAN_DECODE_ENTRY(18		,10),
       
   528 		HUFFMAN_DECODE_ENTRY(18		,10),
       
   529 		HUFFMAN_DECODE_ENTRY(18		,10),
       
   530 		HUFFMAN_DECODE_ENTRY(18		,10),
       
   531 		HUFFMAN_DECODE_ENTRY(18		,10),
       
   532 		HUFFMAN_DECODE_ENTRY(18		,10),
       
   533 
       
   534 		HUFFMAN_DECODE_ENTRY(52		,12),
       
   535 		HUFFMAN_DECODE_ENTRY(52		,12),
       
   536 		HUFFMAN_DECODE_ENTRY(640	,13),
       
   537 		HUFFMAN_DECODE_ENTRY(704	,13),
       
   538 		HUFFMAN_DECODE_ENTRY(768	,13),
       
   539 		HUFFMAN_DECODE_ENTRY(832	,13),
       
   540 		HUFFMAN_DECODE_ENTRY(55		,12),
       
   541 		HUFFMAN_DECODE_ENTRY(55		,12),
       
   542 
       
   543 		HUFFMAN_DECODE_ENTRY(56		,12),
       
   544 		HUFFMAN_DECODE_ENTRY(56		,12),
       
   545 		HUFFMAN_DECODE_ENTRY(1280	,13),
       
   546 		HUFFMAN_DECODE_ENTRY(1344	,13),
       
   547 		HUFFMAN_DECODE_ENTRY(1408	,13),
       
   548 		HUFFMAN_DECODE_ENTRY(1472	,13),
       
   549 		HUFFMAN_DECODE_ENTRY(59		,12),
       
   550 		HUFFMAN_DECODE_ENTRY(59		,12),
       
   551 
       
   552 		HUFFMAN_DECODE_ENTRY(60		,12),
       
   553 		HUFFMAN_DECODE_ENTRY(60		,12),
       
   554 		HUFFMAN_DECODE_ENTRY(1536	,13),
       
   555 		HUFFMAN_DECODE_ENTRY(1600	,13),
       
   556 		HUFFMAN_DECODE_ENTRY(24		,11),
       
   557 		HUFFMAN_DECODE_ENTRY(24		,11),
       
   558 		HUFFMAN_DECODE_ENTRY(24		,11),
       
   559 		HUFFMAN_DECODE_ENTRY(24		,11)
       
   560 	};
       
   561 
       
   562 LOCAL_D const TUint16 Black0000_0011[32] =
       
   563 	{
       
   564 		HUFFMAN_DECODE_ENTRY(25		,11),
       
   565 		HUFFMAN_DECODE_ENTRY(25		,11),
       
   566 		HUFFMAN_DECODE_ENTRY(25		,11),
       
   567 		HUFFMAN_DECODE_ENTRY(25		,11),
       
   568 		HUFFMAN_DECODE_ENTRY(1664	,13),
       
   569 		HUFFMAN_DECODE_ENTRY(1728	,13),
       
   570 		HUFFMAN_DECODE_ENTRY(320	,12),
       
   571 		HUFFMAN_DECODE_ENTRY(320	,12),
       
   572 
       
   573 		HUFFMAN_DECODE_ENTRY(384	,12),
       
   574 		HUFFMAN_DECODE_ENTRY(384	,12),
       
   575 		HUFFMAN_DECODE_ENTRY(448	,12),
       
   576 		HUFFMAN_DECODE_ENTRY(448	,12),
       
   577 		HUFFMAN_DECODE_ENTRY(512	,13),
       
   578 		HUFFMAN_DECODE_ENTRY(576	,13),
       
   579 		HUFFMAN_DECODE_ENTRY(53		,12),
       
   580 		HUFFMAN_DECODE_ENTRY(53		,12),
       
   581 
       
   582 		HUFFMAN_DECODE_ENTRY(54		,12),
       
   583 		HUFFMAN_DECODE_ENTRY(54		,12),
       
   584 		HUFFMAN_DECODE_ENTRY(896	,13),
       
   585 		HUFFMAN_DECODE_ENTRY(960	,13),
       
   586 		HUFFMAN_DECODE_ENTRY(1024	,13),
       
   587 		HUFFMAN_DECODE_ENTRY(1088	,13),
       
   588 		HUFFMAN_DECODE_ENTRY(1152	,13),
       
   589 		HUFFMAN_DECODE_ENTRY(1216	,13),
       
   590 
       
   591 		HUFFMAN_DECODE_ENTRY(64		,10),
       
   592 		HUFFMAN_DECODE_ENTRY(64		,10),
       
   593 		HUFFMAN_DECODE_ENTRY(64		,10),
       
   594 		HUFFMAN_DECODE_ENTRY(64		,10),
       
   595 		HUFFMAN_DECODE_ENTRY(64		,10),
       
   596 		HUFFMAN_DECODE_ENTRY(64		,10),
       
   597 		HUFFMAN_DECODE_ENTRY(64		,10),
       
   598 		HUFFMAN_DECODE_ENTRY(64		,10)
       
   599 	};
       
   600 
       
   601 LOCAL_D const TUint16 Black0000_0100[1] =
       
   602 	{
       
   603 		HUFFMAN_DECODE_ENTRY(13		,8)
       
   604 	};
       
   605 
       
   606 LOCAL_D const TUint16 Black0000_0101[16] =
       
   607 	{
       
   608 		HUFFMAN_DECODE_ENTRY(23		,11),
       
   609 		HUFFMAN_DECODE_ENTRY(23		,11),
       
   610 		HUFFMAN_DECODE_ENTRY(50		,12),
       
   611 		HUFFMAN_DECODE_ENTRY(51		,12),
       
   612 		HUFFMAN_DECODE_ENTRY(44		,12),
       
   613 		HUFFMAN_DECODE_ENTRY(45		,12),
       
   614 		HUFFMAN_DECODE_ENTRY(46		,12),
       
   615 		HUFFMAN_DECODE_ENTRY(47		,12),
       
   616 
       
   617 		HUFFMAN_DECODE_ENTRY(57		,12),
       
   618 		HUFFMAN_DECODE_ENTRY(58		,12),
       
   619 		HUFFMAN_DECODE_ENTRY(61		,12),
       
   620 		HUFFMAN_DECODE_ENTRY(256	,12),
       
   621 		HUFFMAN_DECODE_ENTRY(16		,10),
       
   622 		HUFFMAN_DECODE_ENTRY(16		,10),
       
   623 		HUFFMAN_DECODE_ENTRY(16		,10),
       
   624 		HUFFMAN_DECODE_ENTRY(16		,10)
       
   625 	};
       
   626 
       
   627 LOCAL_D const TUint16 Black0000_0110[16] =
       
   628 	{
       
   629 		HUFFMAN_DECODE_ENTRY(17		,10),
       
   630 		HUFFMAN_DECODE_ENTRY(17		,10),
       
   631 		HUFFMAN_DECODE_ENTRY(17		,10),
       
   632 		HUFFMAN_DECODE_ENTRY(17		,10),
       
   633 		HUFFMAN_DECODE_ENTRY(48		,12),
       
   634 		HUFFMAN_DECODE_ENTRY(49		,12),
       
   635 		HUFFMAN_DECODE_ENTRY(62		,12),
       
   636 		HUFFMAN_DECODE_ENTRY(63		,12),
       
   637 
       
   638 		HUFFMAN_DECODE_ENTRY(30		,12),
       
   639 		HUFFMAN_DECODE_ENTRY(31		,12),
       
   640 		HUFFMAN_DECODE_ENTRY(32		,12),
       
   641 		HUFFMAN_DECODE_ENTRY(33		,12),
       
   642 		HUFFMAN_DECODE_ENTRY(40		,12),
       
   643 		HUFFMAN_DECODE_ENTRY(41		,12),
       
   644 		HUFFMAN_DECODE_ENTRY(22		,11),
       
   645 		HUFFMAN_DECODE_ENTRY(22		,11)
       
   646 	};
       
   647 
       
   648 LOCAL_D const TUint16 Black0000_0111[1] =
       
   649 	{
       
   650 		HUFFMAN_DECODE_ENTRY(14		,8)
       
   651 	};
       
   652 
       
   653 LOCAL_D const TUint16 Black0000_100x[1] =
       
   654 	{
       
   655 		HUFFMAN_DECODE_ENTRY(10		,7)
       
   656 	};
       
   657 
       
   658 LOCAL_D const TUint16 Black0000_101x[1] =
       
   659 	{
       
   660 		HUFFMAN_DECODE_ENTRY(11		,7)
       
   661 	};
       
   662 
       
   663 LOCAL_D const TUint16 Black0000_1100[16] =
       
   664 	{
       
   665 		HUFFMAN_DECODE_ENTRY(15		,9),
       
   666 		HUFFMAN_DECODE_ENTRY(15		,9),
       
   667 		HUFFMAN_DECODE_ENTRY(15		,9),
       
   668 		HUFFMAN_DECODE_ENTRY(15		,9),
       
   669 		HUFFMAN_DECODE_ENTRY(15		,9),
       
   670 		HUFFMAN_DECODE_ENTRY(15		,9),
       
   671 		HUFFMAN_DECODE_ENTRY(15		,9),
       
   672 		HUFFMAN_DECODE_ENTRY(15		,9),
       
   673 
       
   674 		HUFFMAN_DECODE_ENTRY(128	,12),
       
   675 		HUFFMAN_DECODE_ENTRY(192	,12),
       
   676 		HUFFMAN_DECODE_ENTRY(26		,12),
       
   677 		HUFFMAN_DECODE_ENTRY(27		,12),
       
   678 		HUFFMAN_DECODE_ENTRY(28		,12),
       
   679 		HUFFMAN_DECODE_ENTRY(29		,12),
       
   680 		HUFFMAN_DECODE_ENTRY(19		,11),
       
   681 		HUFFMAN_DECODE_ENTRY(19		,11)
       
   682 	};
       
   683 
       
   684 LOCAL_D const TUint16 Black0000_1101[16] =
       
   685 	{
       
   686 		HUFFMAN_DECODE_ENTRY(20		,11),
       
   687 		HUFFMAN_DECODE_ENTRY(20		,11),
       
   688 		HUFFMAN_DECODE_ENTRY(34		,12),
       
   689 		HUFFMAN_DECODE_ENTRY(35		,12),
       
   690 		HUFFMAN_DECODE_ENTRY(36		,12),
       
   691 		HUFFMAN_DECODE_ENTRY(37		,12),
       
   692 		HUFFMAN_DECODE_ENTRY(38		,12),
       
   693 		HUFFMAN_DECODE_ENTRY(39		,12),
       
   694 
       
   695 		HUFFMAN_DECODE_ENTRY(21		,11),
       
   696 		HUFFMAN_DECODE_ENTRY(21		,11),
       
   697 		HUFFMAN_DECODE_ENTRY(42		,12),
       
   698 		HUFFMAN_DECODE_ENTRY(43		,12),
       
   699 		HUFFMAN_DECODE_ENTRY(0		,10),
       
   700 		HUFFMAN_DECODE_ENTRY(0		,10),
       
   701 		HUFFMAN_DECODE_ENTRY(0		,10),
       
   702 		HUFFMAN_DECODE_ENTRY(0		,10)
       
   703 	};
       
   704 
       
   705 LOCAL_D const TUint16 Black0000_111x[1] =
       
   706 	{
       
   707 		HUFFMAN_DECODE_ENTRY(12		,7)
       
   708 	};
       
   709 
       
   710 LOCAL_D const TUint16 Common0000_0001[16] =
       
   711 	{
       
   712 		HUFFMAN_DECODE_ENTRY(1792	,11),
       
   713 		HUFFMAN_DECODE_ENTRY(1792	,11),
       
   714 		HUFFMAN_DECODE_ENTRY(1984	,12),
       
   715 		HUFFMAN_DECODE_ENTRY(2048	,12),
       
   716 		HUFFMAN_DECODE_ENTRY(2112	,12),
       
   717 		HUFFMAN_DECODE_ENTRY(2176	,12),
       
   718 		HUFFMAN_DECODE_ENTRY(2240	,12),
       
   719 		HUFFMAN_DECODE_ENTRY(2304	,12),
       
   720 		HUFFMAN_DECODE_ENTRY(1856	,11),
       
   721 		HUFFMAN_DECODE_ENTRY(1856	,11),
       
   722 		HUFFMAN_DECODE_ENTRY(1920	,11),
       
   723 		HUFFMAN_DECODE_ENTRY(1920	,11),
       
   724 		HUFFMAN_DECODE_ENTRY(2368	,12),
       
   725 		HUFFMAN_DECODE_ENTRY(2432	,12),
       
   726 		HUFFMAN_DECODE_ENTRY(2496	,12),
       
   727 		HUFFMAN_DECODE_ENTRY(2560	,12)
       
   728 	};
       
   729 
       
   730 class THuffmanTable
       
   731 	{
       
   732 public:
       
   733 	const TUint16*	iCodes;
       
   734 	TInt			iIndexBits;	// Number of bits to use for indexing into iCodes
       
   735 	};
       
   736 
       
   737 LOCAL_D const THuffmanTable WhiteTables[32] =
       
   738 	{
       
   739 		{White0000,4},
       
   740 		{White0001,4},
       
   741 		{White0010,4},
       
   742 		{White0011,4},
       
   743 		{White0100,5},
       
   744 		{White0101,4},
       
   745 		{White0110,5},
       
   746 		{White0111,0},
       
   747 		{White1000,0},	
       
   748 		{White1001,1},	
       
   749 		{White1010,2},	
       
   750 		{White1011,0},	
       
   751 		{White1100,0},	
       
   752 		{White1101,2},
       
   753 		{White1110,0},	
       
   754 		{White1111,0},	
       
   755 	};
       
   756 
       
   757 LOCAL_D const THuffmanTable BlackTables[16] =
       
   758 	{
       
   759 		{NULL,0},
       
   760 		{Black0001,2},
       
   761 		{Black0010,0},
       
   762 		{Black0011,0},
       
   763 		{Black010x,0},
       
   764 		{Black010x,0},
       
   765 		{Black011x,0},
       
   766 		{Black011x,0},
       
   767 		{Black10xx,0},
       
   768 		{Black10xx,0},
       
   769 		{Black10xx,0},
       
   770 		{Black10xx,0},
       
   771 		{Black11xx,0},
       
   772 		{Black11xx,0},
       
   773 		{Black11xx,0},
       
   774 		{Black11xx,0},
       
   775 	};
       
   776 
       
   777 LOCAL_D const THuffmanTable BlackTables0000[16] =
       
   778 	{
       
   779 		{NULL,0},
       
   780 		{Common0000_0001,4},
       
   781 		{Black0000_0010,5},
       
   782 		{Black0000_0011,5},
       
   783 		{Black0000_0100,0},
       
   784 		{Black0000_0101,4},
       
   785 		{Black0000_0110,4},
       
   786 		{Black0000_0111,0},
       
   787 		{Black0000_100x,0},
       
   788 		{Black0000_100x,0},
       
   789 		{Black0000_101x,0},
       
   790 		{Black0000_101x,0},
       
   791 		{Black0000_1100,4},
       
   792 		{Black0000_1101,4},
       
   793 		{Black0000_111x,0},
       
   794 		{Black0000_111x,0},
       
   795 	};
       
   796 
       
   797 TTiffFaxState CTiffFax1dDecoder::DecodeWhite()
       
   798 	{
       
   799 	TUint32	bits = iBitCache;
       
   800 	TUint16	code;
       
   801 
       
   802 	if(bits>=0x02000000)
       
   803 		{
       
   804 		const THuffmanTable* table = &WhiteTables[GetMostSignificantBits(bits,4)];
       
   805 		bits &= ~0xf0000000; // zero the 4 most significant bits
       
   806 		code  = table->iCodes[GetMostSignificantBits(bits,4+table->iIndexBits)];
       
   807 		}
       
   808 	else if(bits>=0x01000000)
       
   809 		{
       
   810 		bits &= ~0xff000000; // zero the 8 most significant bits
       
   811 		code = Common0000_0001[GetMostSignificantBits(bits,8+4)];
       
   812 		}
       
   813 	else
       
   814 		return(ETiffFaxInvalid);
       
   815 
       
   816 	TInt numBits = code&15;
       
   817 
       
   818 	if(numBits>iBitCacheLength)
       
   819 		return(ETiffFaxUnderflow);
       
   820 
       
   821 	UseBits(numBits);
       
   822 
       
   823 	iCodeType = ETiffFaxWhiteRun;
       
   824 	iCodeCount = code>>4;
       
   825 
       
   826 	if(iCodeCount<64)
       
   827 		iColor = ETiffFaxBlackRun;
       
   828 
       
   829 	return(ETiffFaxPixelRun);
       
   830 	}
       
   831 
       
   832 TTiffFaxState CTiffFax1dDecoder::DecodeBlack()
       
   833 	{
       
   834 	TUint32	bits = iBitCache;
       
   835 	TUint16	code;
       
   836 
       
   837 	if(bits&0xf0000000)
       
   838 		{
       
   839 		const THuffmanTable* table = &BlackTables[GetMostSignificantBits(bits,4)];
       
   840 		bits &= ~0xf0000000; // zero the 4 most significant bits
       
   841 		code  = table->iCodes[GetMostSignificantBits(bits,4+table->iIndexBits)];
       
   842 		}
       
   843 	else if(bits&0xff000000)
       
   844 		{
       
   845 		const THuffmanTable* table = &BlackTables0000[GetMostSignificantBits(bits,8)];
       
   846 		bits &= ~0xff000000; // zero the 8 most significant bits
       
   847 		code  = table->iCodes[GetMostSignificantBits(bits,8+table->iIndexBits)];
       
   848 		}
       
   849 	else
       
   850 		return(ETiffFaxInvalid);
       
   851 
       
   852 	TInt numBits = code&15;
       
   853 
       
   854 	if(numBits>iBitCacheLength)
       
   855 		return(ETiffFaxUnderflow);
       
   856 
       
   857 	UseBits(numBits);
       
   858 
       
   859 	iCodeType = ETiffFaxBlackRun;
       
   860 	iCodeCount = code>>4;
       
   861 
       
   862 	if(iCodeCount<64)
       
   863 		iColor = ETiffFaxWhiteRun;
       
   864 
       
   865 	return(ETiffFaxPixelRun);
       
   866 	}
       
   867 
       
   868 TTiffFaxState CTiffFax1dDecoder::DecodeEndOfLine()
       
   869 	{
       
   870 	if(iBitCache>=0x00200000)
       
   871 		return(ETiffFaxInvalid);
       
   872 
       
   873 	FOREVER
       
   874 		{
       
   875 		if(iBitCacheLength<12)
       
   876 			return(ETiffFaxUnderflow);
       
   877 		if(iBitCache&0x00100000)
       
   878 			break;
       
   879 		UseBits(1);
       
   880 		}
       
   881 
       
   882 	UseBits(12);
       
   883 
       
   884 	iColor = ETiffFaxWhiteRun;
       
   885 
       
   886 	iCodeCount = 1;
       
   887 
       
   888 	if(iCodeType==ETiffFaxEndOfLineCode)
       
   889 		return(ETiffFaxEndOfFax);
       
   890 
       
   891 	iCodeType = ETiffFaxEndOfLineCode;
       
   892 	return(ETiffFaxEndOfLine);
       
   893 	}
       
   894 
       
   895 
       
   896 // CTiffFax2dDecoder.
       
   897 CTiffFax2dDecoder::~CTiffFax2dDecoder()
       
   898 	{
       
   899 	delete []iReferenceRunData;
       
   900 	}
       
   901 
       
   902 void CTiffFax2dDecoder::ConstructL(const TTiffImageData& aImageData)
       
   903 	{
       
   904 	CTiffFax1dDecoder::ConstructL(aImageData);
       
   905 	iReferenceRunData = new (ELeave) TInt[iRowWidth+2];
       
   906 	}
       
   907 
       
   908 void CTiffFax2dDecoder::NewStripL(TInt aNumBytes)
       
   909 	{
       
   910 	CTiffFax1dDecoder::NewStripL(aNumBytes);
       
   911 	CTiffFax2dDecoder::NewRow();
       
   912 	}
       
   913 
       
   914 void CTiffFax2dDecoder::NewRow()
       
   915 	{
       
   916 	if(iRunDataIndex&1)
       
   917 		iRunDataIndex++;
       
   918 	iRunData[iRunDataIndex] = iRowWidth;
       
   919 	iRunData[iRunDataIndex+1] = iRowWidth;
       
   920 
       
   921 	TInt* temp = iReferenceRunData;
       
   922 	iReferenceRunData = iRunData;
       
   923 	iRunData = temp;
       
   924 
       
   925 	iReferenceRunDataIndex = 0;
       
   926 	iHorizontalCodeCount = 0;
       
   927 	iA0 = 0;
       
   928 
       
   929 	CTiffFax1dDecoder::NewRow();
       
   930 	}
       
   931 
       
   932 TTiffFaxState CTiffFax2dDecoder::Decode2d()
       
   933 	{
       
   934 	if(iHorizontalCodeCount)
       
   935 		return(DecodeHorizontal());
       
   936 
       
   937 	TUint32	bits = iBitCache;
       
   938 	TInt validBits;
       
   939 	TInt verticalOffset;
       
   940 
       
   941 	switch(GetMostSignificantBits(bits,3))
       
   942 		{
       
   943 	case 0:
       
   944 
       
   945 		switch(GetMostSignificantBits(bits,7))
       
   946 			{
       
   947 		case 0:
       
   948 		case 1:
       
   949 			return(DecodeEndOfLine());
       
   950 		case 2:
       
   951 			verticalOffset = -3;
       
   952 			validBits = 7;
       
   953 			break;
       
   954 		case 3:
       
   955 			verticalOffset = 3;
       
   956 			validBits = 7;
       
   957 			break;
       
   958 		case 4:
       
   959 		case 5:
       
   960 			verticalOffset = -2;
       
   961 			validBits = 6;
       
   962 			break;
       
   963 		case 6:
       
   964 		case 7:
       
   965 			verticalOffset = 2;
       
   966 			validBits = 6;
       
   967 			break;
       
   968 		default:
       
   969 			if(iBitCacheLength<4)
       
   970 				return(ETiffFaxUnderflow);
       
   971 			UseBits(4);
       
   972 			return(DecodePass());
       
   973 			}
       
   974 
       
   975 		break;
       
   976 
       
   977 	case 1:
       
   978 		if(iBitCacheLength<3)
       
   979 			return(ETiffFaxUnderflow);
       
   980 		UseBits(3);
       
   981 		iHorizontalCodeCount = 2;
       
   982 		return(DecodeHorizontal());
       
   983 
       
   984 	case 2:
       
   985 
       
   986 		verticalOffset = -1;
       
   987 		validBits = 3;
       
   988 		break;
       
   989 
       
   990 	case 3:
       
   991 
       
   992 		verticalOffset = 1;
       
   993 		validBits = 3;
       
   994 		break;
       
   995 
       
   996 	default:
       
   997 
       
   998 		verticalOffset = 0;
       
   999 		validBits = 1;
       
  1000 		break;
       
  1001 		}
       
  1002 
       
  1003 	if(validBits>iBitCacheLength)
       
  1004 		return(ETiffFaxUnderflow);
       
  1005 
       
  1006 	UseBits(validBits);
       
  1007 
       
  1008 	return(DecodeVertical(verticalOffset));
       
  1009 	}
       
  1010 
       
  1011 TTiffFaxState CTiffFax2dDecoder::DecodeHorizontal()
       
  1012 	{
       
  1013 	TTiffFaxState returnValue;
       
  1014 
       
  1015 	returnValue = Decode1d();
       
  1016 	if(returnValue!=ETiffFaxPixelRun)
       
  1017 		return(returnValue);
       
  1018 
       
  1019 	iA0 += iCodeCount;
       
  1020 
       
  1021 	if(iCodeCount<64)
       
  1022 		iHorizontalCodeCount--;
       
  1023 
       
  1024 	if(iHorizontalCodeCount)
       
  1025 		return(ETiffFaxPixelRun);
       
  1026 
       
  1027 	TInt n = iA0;
       
  1028 	if(n>=iRowWidth)
       
  1029 		n = iRowWidth-1;
       
  1030 
       
  1031 	TInt i = iReferenceRunDataIndex;
       
  1032 
       
  1033 	while(iReferenceRunData[i]<=n)
       
  1034 		i++;
       
  1035 
       
  1036 	if(iColor==ETiffFaxBlackRun)
       
  1037 		{
       
  1038 		if(!(i&1))
       
  1039 			i++;
       
  1040 		}
       
  1041 	else
       
  1042 		{
       
  1043 		if(i&1)
       
  1044 			i++;
       
  1045 		}
       
  1046 
       
  1047 	iReferenceRunDataIndex = i;
       
  1048 
       
  1049 	return(ETiffFaxPixelRun);
       
  1050 	}
       
  1051 
       
  1052 TTiffFaxState CTiffFax2dDecoder::DecodeVertical(TInt aDifference)
       
  1053 	{
       
  1054 	iA0 = iReferenceRunData[iReferenceRunDataIndex]+aDifference;
       
  1055 
       
  1056 	iCodeCount = iA0-iPixelsStoredInRow;
       
  1057 	iCodeType = iColor;
       
  1058 
       
  1059 	if(iColor==ETiffFaxWhiteRun)
       
  1060 		iColor = ETiffFaxBlackRun;
       
  1061 	else
       
  1062 		iColor = ETiffFaxWhiteRun;
       
  1063 
       
  1064 	TInt n = iA0;
       
  1065 	if(n>=iRowWidth)
       
  1066 		n = iRowWidth-1;
       
  1067 
       
  1068 	TInt i = iReferenceRunDataIndex;
       
  1069 
       
  1070 	if(i)
       
  1071 		i--;
       
  1072 	else
       
  1073 		i++;
       
  1074 
       
  1075 	while(iReferenceRunData[i]<=n)
       
  1076 		i += 2;
       
  1077 
       
  1078 	iReferenceRunDataIndex = i;
       
  1079 
       
  1080 	return(ETiffFaxPixelRun);
       
  1081 	}
       
  1082 
       
  1083 TTiffFaxState CTiffFax2dDecoder::DecodePass()
       
  1084 	{
       
  1085 	iA0 = iReferenceRunData[iReferenceRunDataIndex+1];
       
  1086 	iReferenceRunDataIndex += 2;
       
  1087 
       
  1088 	iCodeCount = iA0-iPixelsStoredInRow;
       
  1089 	iCodeType = iColor;
       
  1090 
       
  1091 	return(ETiffFaxPixelRun);
       
  1092 	}
       
  1093 
       
  1094 
       
  1095 // CTiffGroup3Fax1dDecoder.
       
  1096 CTiffGroup3Fax1dDecoder* CTiffGroup3Fax1dDecoder::NewL(const TTiffImageData& aImageData)
       
  1097 	{
       
  1098 	if(aImageData.iT4Options & ~TTiffIfdEntry::ET4ContainsPaddedEols)
       
  1099 		User::Leave(KErrNotSupported);
       
  1100 
       
  1101 	CTiffGroup3Fax1dDecoder* decoder = new (ELeave) CTiffGroup3Fax1dDecoder;
       
  1102 
       
  1103 	CleanupStack::PushL(decoder);
       
  1104 	decoder->ConstructL(aImageData);
       
  1105 	CleanupStack::Pop();
       
  1106 
       
  1107 	return(decoder);
       
  1108 	}
       
  1109 
       
  1110 TTiffFaxState CTiffGroup3Fax1dDecoder::ProcessNextCode()
       
  1111 	{
       
  1112 	return(Decode1d());
       
  1113 	}
       
  1114 
       
  1115 
       
  1116 // CTiffGroup3Fax2dDecoder.
       
  1117 CTiffGroup3Fax2dDecoder* CTiffGroup3Fax2dDecoder::NewL(const TTiffImageData& aImageData)
       
  1118 	{
       
  1119 	if( (aImageData.iT4Options&~TTiffIfdEntry::ET4ContainsPaddedEols) != TTiffIfdEntry::ET4TwoDimentionalCoding )
       
  1120 		User::Leave(KErrNotSupported);
       
  1121 
       
  1122 	CTiffGroup3Fax2dDecoder* decoder = new (ELeave) CTiffGroup3Fax2dDecoder;
       
  1123 
       
  1124 	CleanupStack::PushL(decoder);
       
  1125 	decoder->ConstructL(aImageData);
       
  1126 	CleanupStack::Pop();
       
  1127 
       
  1128 	return(decoder);
       
  1129 	}
       
  1130 
       
  1131 void CTiffGroup3Fax2dDecoder::NewStripL(TInt aNumBytes)
       
  1132 	{
       
  1133 	CTiffFax2dDecoder::NewStripL(aNumBytes);
       
  1134 	iState = E1d;
       
  1135 	}
       
  1136 
       
  1137 TTiffFaxState CTiffGroup3Fax2dDecoder::ProcessNextCode()
       
  1138 	{
       
  1139 	if(iState!=ESelect1d2d)
       
  1140 		{
       
  1141 		TTiffFaxState returnValue;
       
  1142 
       
  1143 		if(iState==E1d)
       
  1144 			returnValue = Decode1d();
       
  1145 		else
       
  1146 			returnValue = Decode2d();
       
  1147 
       
  1148 		if(returnValue!=ETiffFaxEndOfLine)
       
  1149 			return(returnValue);
       
  1150 
       
  1151 		iState = ESelect1d2d;
       
  1152 		}
       
  1153 	
       
  1154 	if(!iBitCacheLength)
       
  1155 		return(ETiffFaxUnderflow);
       
  1156 
       
  1157 	if(iBitCache&(1<<31))
       
  1158 		iState = E1d;
       
  1159 	else
       
  1160 		iState = E2d;
       
  1161 
       
  1162 	UseBits(1);
       
  1163 
       
  1164 	return(ETiffFaxEndOfLine);
       
  1165 	}
       
  1166 
       
  1167 void CTiffGroup3Fax2dDecoder::NewRow()
       
  1168 	{
       
  1169 	if(iState==E1d)
       
  1170 		CTiffFax1dDecoder::NewRow();
       
  1171 	else
       
  1172 		CTiffFax2dDecoder::NewRow();
       
  1173 	}
       
  1174 
       
  1175 
       
  1176 // CTiffGroup4FaxDecoder.
       
  1177 CTiffGroup4FaxDecoder* CTiffGroup4FaxDecoder::NewL(const TTiffImageData& aImageData)
       
  1178 	{
       
  1179 	if(aImageData.iT6Options!=0)
       
  1180 		User::Leave(KErrNotSupported);
       
  1181 
       
  1182 	CTiffGroup4FaxDecoder* decoder = new (ELeave) CTiffGroup4FaxDecoder;
       
  1183 
       
  1184 	CleanupStack::PushL(decoder);
       
  1185 	decoder->ConstructL(aImageData);
       
  1186 	CleanupStack::Pop();
       
  1187 
       
  1188 	return(decoder);
       
  1189 	}
       
  1190 
       
  1191 TTiffFaxState CTiffGroup4FaxDecoder::ProcessNextCode()
       
  1192 	{
       
  1193 	if((iA0==iRowWidth) && (iHorizontalCodeCount==0))
       
  1194 		return(ETiffFaxEndOfLine);
       
  1195 
       
  1196 	return(Decode2d());
       
  1197 	}
       
  1198