Esempio n. 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);
}
Esempio n. 2
0
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;
}