示例#1
0
void IHDRParse(struct XPng* xpng, struct XBitmap* xbitmap, const unsigned char* stream,const char* bmpFileName)
{
	int pixelFormat;

	xpng->m_header.width= BYTE_TO_INT(stream);
	xpng->m_header.height = BYTE_TO_INT(stream+4);
	xpng->m_header.bitDepth = BYTE_TO_CHAR(stream+8);
	xpng->m_header.colorType = BYTE_TO_CHAR(stream+9);
	xpng->m_header.compressionMethod = BYTE_TO_CHAR(stream+10);
	xpng->m_header.filterMode = BYTE_TO_CHAR(stream+11);
	xpng->m_header.interlaceMethod = BYTE_TO_CHAR(stream+12);
	printf("HEAD parsing %d %d %02x %02x %02x %02x %02x\n",
		xpng->m_header.width,xpng->m_header.height,
		xpng->m_header.bitDepth,xpng->m_header.colorType, 
		xpng->m_header.compressionMethod,xpng->m_header.filterMode,
		xpng->m_header.interlaceMethod);


	xpng->m_ColorMapTablePos = 0;
	xpng->m_bPaletted = false;


	if(xpng->m_header.colorType==COLORTYPE_COLOR_ALPHA)
	{
		xpng->m_ColorMapTableCur = colorMapTable_RGBA_2_BGRA;
		xpng->m_ColorMapTableLen = sizeof(colorMapTable_RGBA_2_BGRA) / sizeof(colorMapTable_RGBA_2_BGRA[0]);	// 결국은 4
		pixelFormat = PIXELFORMAT_32;
	}
	else if(xpng->m_header.colorType==COLORTYPE_COLOR)
	{
		xpng->m_ColorMapTableCur = colorMapTable_RGB_2_BGR;
		xpng->m_ColorMapTableLen = sizeof(colorMapTable_RGB_2_BGR) / sizeof(colorMapTable_RGB_2_BGR[0]);		// 결국은 3
		pixelFormat = PIXELFORMAT_24;
	}
	else if(xpng->m_header.colorType==COLORTYPE_COLOR_PAL)
	{
		// 빨레트를 쓴다. ALPHA 는 없다. 그래서 RGB 2 BGR 사용
		xpng->m_ColorMapTableCur = colorMapTable_RGB_2_BGR;
		xpng->m_ColorMapTableLen = sizeof(colorMapTable_RGB_2_BGR) / sizeof(colorMapTable_RGB_2_BGR[0]);		// 결국은 3
		xpng->m_bPaletted = true;
		pixelFormat = PIXELFORMAT_32;
	}
	else
	{
	}

	CreateDib(xbitmap, xpng->m_header.width, xpng->m_header.height, pixelFormat);

	SetDecodeData(xpng, xbitmap->m_pixel, xbitmap->m_stride, xbitmap->m_paddingByte, xbitmap->m_pixelFormat / 8);


	// BMP Header 생성
	MakeBMPHeader(xbitmap, bmpFileName);
}
示例#2
0
int ParsePng(const unsigned char* buffer, const unsigned char *stream, const char* bmpFileName)
{
	int chunkLength;
	int marker;
	int end_marker = 0;

	// xpng, bitmap 초기화
	struct XPng *xpng;
	struct XBitmap *xbitmap;

	xpng = (struct XPng *)malloc(sizeof(struct XPng));
	Init_png(xpng);

	xbitmap = (struct XBitmap *)malloc(sizeof(struct XBitmap));
	Init_Bmp(xbitmap);

	// xpng 의 멤버인 inflate 초기화
	xpng->m_pInflate = (struct XInflate *)calloc(1, sizeof(struct XInflate));
	Init_inf(xpng->m_pInflate);

	// end_marker를 만날때까지 돈다
	while(!end_marker)
	{
		chunkLength = BYTE_TO_INT(stream); // 청크의 길이
		marker = BYTE_TO_INT(stream+4);	   // 청크명

		switch(marker)
		{
		case IHDR:
			stream += 4 + 4; // data length(4) + chunk length(4)

			printf("HEAD parsing..length : %d\n", chunkLength);
			IHDRParse(xpng, xbitmap, stream, bmpFileName);
			stream += chunkLength; // chunk size
			break;

		case sRGB:
			stream += 4 + 4; // data length(4) + chunk length(4)
			printf("sRGB parsing..length : %d\n", chunkLength);
			stream += chunkLength; // chunk size
			break;

		case pHYs:
			stream += 4 + 4; // data length(4) + chunk length(4)
			printf("pHYs parsing..length : %d\n", chunkLength);
			stream += chunkLength; // chunk size
			break;

		case gAMA:
			stream += 4 + 4; // data length(4) + chunk length(4)
			printf("gAMA parsing..length : %d\n", chunkLength);
			stream += chunkLength; // chunk size
			break;

		case PLTE:
			stream += 4 + 4; // data length(4) + chunk length(4)
			printf("PLTE parsing..length : %d\n", chunkLength);
			PLTEParse(xpng, stream, chunkLength);
			stream += chunkLength; // chunk size
			break;

		case IDAT:
			stream += 4 + 4; // data length(4) + chunk length(4)
			printf("IDAT parsing..length : %d\n", chunkLength);

			if(!xpng->m_bEnd)
			{
				stream += 2;
				chunkLength -= 2;

				xpng->m_filter_b_dummy = (unsigned char*)calloc(1, xpng->m_imageStride);

				// IDATParse 안에서 true로 바꾼다
				//xpng->m_bEnd = true;
			}

			IDATParse(xpng, xpng->m_pInflate, xbitmap, stream, chunkLength);

			stream += chunkLength; // chunk size
			break;

		case tIME:
			stream += 4 + 4; // data length(4) + chunk length(4)
			printf("tIME parsing..length : %d\n", chunkLength);
			stream += chunkLength; // chunk size
			break;

		case tEXt:
			stream += 4 + 4; // data length(4) + chunk length(4)
			printf("tEXt parsing..length : %d\n", chunkLength);
			stream += chunkLength; // chunk size
			break;

		case IEND:
			end_marker = 1;

			IENDParse(xbitmap);

			printf("IEND.....\n");
			break;
		default:

			break;
		}

		stream += 4; // CRC(4)


	}

	// png, bitmap 해제
	Destroy_inf(xpng->m_pInflate);
	Destory_png(xpng);
	free(xpng);

	Destroy_Bmp(xbitmap);
	free(xbitmap);



	return 1;
}
void FORTE_F_BYTE_TO_INT::executeEvent(int pa_nEIID){
  if(scm_nEventREQID == pa_nEIID){
	  OUT() = BYTE_TO_INT(IN());
	  sendOutputEvent(scm_nEventCNFID);
  }
}