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); }
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); } }