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); }
static VALUE tre_traverse(VALUE pattern, VALUE string, long char_offset, VALUE params, VALUE ignore_case, VALUE multi_line, int num_captures, VALUE repeat) { // Compile once regex_t preg; tre_compile_regex(&preg, pattern, ignore_case, multi_line); // Build regaparams regaparams_t aparams; tre_build_aparams(&aparams, params); // Match data regamatch_t match; regmatch_t pmatch[num_captures + 1]; // memset(&match, 0, sizeof(match)); match.nmatch = num_captures + 1; match.pmatch = pmatch; // Scan VALUE arr = rb_ary_new(); long char_offset_acc = char_offset; // rb_global_variable(&arr); while (1) { // Get substring to start with long char_len = CHAR_LENGTH(string) - char_offset; if (char_len <= 0) break; string = rb_str_substr(string, char_offset, char_len); int result = tre_reganexec(&preg, StringValuePtr(string), RSTRING_LEN(string), &match, aparams, 0); if (result == REG_NOMATCH) break; // Fill in array with ranges VALUE subarr; if (match.nmatch == 1) subarr = arr; // Faking.. kind of. else { subarr = rb_ary_new(); // rb_global_variable(&subarr); } unsigned int i; for (i = 0; i < match.nmatch; ++i) // No match if (match.pmatch[i].rm_so == -1) rb_ary_push(subarr, Qnil); // Match => Range else { VALUE range = rb_range_new( LONG2NUM( char_offset_acc + BYTE_TO_CHAR(string, match.pmatch[i].rm_so) ), LONG2NUM( char_offset_acc + BYTE_TO_CHAR(string, match.pmatch[i].rm_eo) ), 1); // rb_global_variable(&range); rb_ary_push(subarr, range); } if (match.nmatch > 1) rb_ary_push(arr, subarr); // Stop or proceed if (repeat == Qfalse) break; else { char_offset = BYTE_TO_CHAR(string, match.pmatch[0].rm_eo); if (char_offset == 0) char_offset = 1; // Weird case char_offset_acc += char_offset; } } // Free once tre_regfree(&preg); return arr; }