⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gif_interface.c

📁 ucOS 模拟环境
💻 C
📖 第 1 页 / 共 2 页
字号:
   */
	/* if output is not  ture color then create color map and color index */
	
	/*   */
	if(!input_init(ucGifParameter))
		return FALSE;
	ptr = ucGifParameter->uReInfor->ucDataOutBuf;
	if((ucGifParameter->ucGetFileHeader != TRUE))
	{
		if (*is_interlaced) {
		/* We request the big array now, but can't access it until the pipeline
		 * controller causes all the big arrays to be allocated.  Hence, the
		 * actual work of reading the image is postponed until the first call
		 * of get_input_row.
		 */
		
		load_interlaced_image(cinfo, ucGifParameter->uReInfor->ucDataOutBuf);
		}
		else
		{
			cur_col = 0;
			for( row = 0; row < *height; )
			{
				if(*zoomflag)
				{
					if(half_find(height_record,(int)(cinfo->image_height -1),row))
					{	
						get_input_row( cinfo, ucGifParameter->uReInfor->ucDataOutBuf,cur_col );
						cur_col++;
					}
					else
					{
						//skip the area//
						for (count = 0; count <  *width; count++) 
							c = LZWReadByte(cinfo);

					}
					row++;
				}else
				{
					get_input_row( cinfo, ucGifParameter->uReInfor->ucDataOutBuf,row );
					row++;
				}
			}
		
		}
	}
	ucGifParameter->uReInfor->ucDataOutBuf = ptr;
	/* Return info about the image. */
	/*start change to gray output*/
	if(ucGifParameter->ucGetFileHeader == TRUE)
		goto END;
   //if color resolution is 1 then become gray 
   if( (ucGifParameter->ucOutColorResolution == 1) && (!ucGifParameter->ucOutGrayscale) )
      ucGifParameter->ucOutGrayscale = 1;
      
	if(!init_gif_color_space(ucGifParameter))
		goto NOTQUANTIZER;
		//initialize 
	if(ucGifParameter->ucSmooth)
	{
		ptr = (uchar*)(ucGifParameter->uReInfor->ucDataOutBuf);
		smooth_guess (cinfo,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf) ,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf));
		ucGifParameter->uReInfor->ucDataOutBuf = ptr;
	}

	if(ucGifParameter->ucOutGrayscale)
	{	
      
	   cinfo->quantize_colors = TRUE;
#if GRAY_TANSFER == 1

		for(count = 0; count < cinfo->image_height; count++)
		{
			ptr = ucGifParameter->uReInfor->ucDataOutBuf;
			memcpy(tempbuf,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width*NUMCOLORS), cinfo->image_width*NUMCOLORS);
			gif_gray(cinfo->image_width, 1 ,tempbuf,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width*NUMCOLORS),ucGifParameter->ucOutGrayscale);
			ucGifParameter->uReInfor->ucDataOutBuf =ptr;
		}
#else
		for(count = 0; count < cinfo->image_height; count++)
		{
			ptr = ucGifParameter->uReInfor->ucDataOutBuf;
			memcpy(tempbuf,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width*NUMCOLORS), cinfo->image_width*NUMCOLORS);
			gif_gray1(cinfo->image_width, 1 ,tempbuf,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width),ucGifParameter->ucOutGrayscale);
			ucGifParameter->uReInfor->ucDataOutBuf = ptr;
		}
#endif

	}
	ucGifParameter->uReInfor->ulDataOutBufLen = cinfo->image_height * cinfo->image_width * NUMCOLORS;
	ucGifParameter->uReInfor->usSorImageHigh = cinfo->image_height;
	ucGifParameter->uReInfor->usSorImageWidth = cinfo->image_width;
	//if not gray data out and number color is 0 then convert to  colors
   
	if(cinfo->desired_number_of_colors && cinfo->quantize_colors )
	{
		if(cinfo->dither_mode == GIF_NONE_DITHER)
			cinfo->dither_mode = GIF_DITHER_NONE;
#if GRAY_TANSFER == 1
		if(ucGifParameter->ucOutGrayscale)
		{
			if(! Gif_init_gray(cinfo))
			{
				goto NOTQUANTIZER;
			}
			for(count = 0 ; count <  cinfo->image_height; count ++)
				{
					ptr =ucGifParameter->uReInfor->ucDataOutBuf;
					memset(tempbuf,0,sizeof(tempbuf));
					memcpy(tempbuf,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width*3), cinfo->image_width*NUMCOLORS);
					memset((uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width),0, cinfo->image_width);
					if(! gif_start_gray(cinfo, 1 ,tempbuf,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width)))
					{
						goto NOTQUANTIZER;
					}
					ucGifParameter->uReInfor->ucDataOutBuf =ptr;
			
   			}
		}
		else
		{
#endif
			//color surport////
		#ifdef PASS_ONE_SURPORT
				//if initizatize not sucessfully 
				if(!Gif_init_1pass_quantizer(cinfo))
				{
					goto NOTQUANTIZER;
				}
			
				for(count = 0 ; count <  cinfo->image_height; count ++)
				{
					ptr = ucGifParameter->uReInfor->ucDataOutBuf ;
					memset(tempbuf,0,sizeof(tempbuf));
					memcpy(tempbuf,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width*cinfo->out_color_components), cinfo->image_width*cinfo->out_color_components);
					memset((uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width),0, cinfo->image_width);
					if(! gif_start_pass_1_quant(cinfo, 1 ,tempbuf,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width)))
					{
						goto NOTQUANTIZER;
					}
					ucGifParameter->uReInfor->ucDataOutBuf =ptr;
				}
			
		#else
			{
#ifdef STACK_USED
				uchar gram[1<<5][1<<6][1<<5];
				//pass two surport
				memset(gram,0,32*32*64);
#else
            uchar gram[2][2][2];
#endif
				if(!gif_init_2pass_quantizer(cinfo, &gram[0][0][0]))
				{
					return FALSE;
				}
				gif_prescan_quantize(cinfo,ucGifParameter->uReInfor->ucDataOutBuf,cinfo->image_height);
				if(!gif_select_colors(cinfo,cinfo->desired_number_of_colors))
				{
					return FALSE;
				}
				for(count = 0 ; count <  cinfo->image_height; count ++)
				{
            		memset(tempbuf,0,sizeof(tempbuf));
					ptr = ucGifParameter->uReInfor->ucDataOutBuf;
					memcpy(tempbuf,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width*NUMCOLORS), cinfo->image_width*NUMCOLORS);
					memset((uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width),0, cinfo->image_width);
					gif_start_pass_2_quant(cinfo, 1 ,tempbuf,(uchar*)(ucGifParameter->uReInfor->ucDataOutBuf + count * cinfo->image_width));
					ucGifParameter->uReInfor->ucDataOutBuf = ptr;
				}
			}
		#endif
#if GRAY_TANSFER == 1
		}


#endif

		if(ucGifParameter->ucPaletteFalg)
		{
		
			if(!ucGifParameter->ucOutGrayscale)
			{
				if(ucGifParameter->ulPaletteBufLen > (ulong)(cinfo->desired_number_of_colors * cinfo->out_color_components))
				{
					ucGifParameter->uReInfor->ucSorColorResolution =ucGifParameter->ucOutColorResolution;
					if(!gif_get_colormap(cinfo,ucGifParameter->uReInfor->ucPaletteBuf))
					{
						return FALSE;
					}
					ucGifParameter->uReInfor->ulPaletteBufLen = cinfo->desired_number_of_colors * cinfo->out_color_components;
					ucGifParameter->uReInfor->ulDataOutBufLen = cinfo->image_height * cinfo->image_width;
					
				}
			}
			else
			{
#if GRAY_TANSFER == 1
				if(ucGifParameter->ulPaletteBufLen > (ulong)(256 * cinfo->out_color_components))
				{
					ucGifParameter->uReInfor->ucSorColorResolution =ucGifParameter->ucOutColorResolution;
					if(!gif_get_colormap_gray(cinfo,ucGifParameter->uReInfor->ucPaletteBuf))
					{
						return FALSE;
					}
					ucGifParameter->uReInfor->ulPaletteBufLen = 256 * cinfo->out_color_components;
					ucGifParameter->uReInfor->ulDataOutBufLen = cinfo->image_height * cinfo->image_width;
					
				}
#else
			if(ucGifParameter->ulPaletteBufLen > (ulong)(cinfo->desired_number_of_colors * cinfo->out_color_components))
				{
					ucGifParameter->uReInfor->ucSorColorResolution =ucGifParameter->ucOutColorResolution;
					if(!gif_get_colormap(cinfo,ucGifParameter->uReInfor->ucPaletteBuf))
					{
						return FALSE;
					}
					ucGifParameter->uReInfor->ulPaletteBufLen = cinfo->desired_number_of_colors * cinfo->out_color_components;
					ucGifParameter->uReInfor->ulDataOutBufLen = cinfo->image_height * cinfo->image_width;
					
				}
#endif
			}
			

		}else
		{
			gif_index_to_map(cinfo,ucGifParameter->uReInfor->ucDataOutBuf);
			ucGifParameter->uReInfor->ulDataOutBufLen = cinfo->image_height * cinfo->image_width * 3;
		}
		
	}
	else
	{
		ptr = ucGifParameter->uReInfor->ucDataOutBuf;
		gif_buffer_exchange(ucGifParameter->uReInfor->ucDataOutBuf,cinfo->image_width,cinfo->image_height);
		ucGifParameter->uReInfor->ucDataOutBuf = ptr;
	}
	//end gray translate//
	//now will add the condition for buffer data  order
	//if(condition)
#ifdef FLOAT_SURPORT		
	if((ZoomSize & 0xff )!= ((ZoomSize & 0xff00)>> 8) && (*g_ZoomType != IMAGE_GEOMETRY_NO_INTERPOLATE) && (!ucGifParameter->ucPaletteFalg ))
	{
			memset(tempbuf,0,sizeof(tempbuf));
			memcpy(tempbuf,ucGifParameter->uReInfor->ucDataOutBuf,cinfo->image_height * cinfo->image_width*NUMCOLORS);
			scale =  (float)(ZoomSize & 0xff ) / (float)((ZoomSize & 0xff00)>> 8);
			//start calculate the number which is record
			cinfo->image_height = (int)(scale* (*height));
			cinfo->image_width = (int)(scale* (*width));
			if(!Gif_Scale(tempbuf,*width,*height,ucGifParameter->uReInfor->ucDataOutBuf,cinfo->image_width,cinfo->image_height,*g_ZoomType))
			{
				cinfo->image_height = *height;
				cinfo->image_width =  *width;
			}
	}
#endif	
	goto END;
NOTQUANTIZER:
	gif_buffer_exchange(ucGifParameter->uReInfor->ucDataOutBuf,cinfo->image_width,cinfo->image_height);
END:
#ifdef PCVER
	closeFile();
#endif
	return TRUE;

}
//====================================================================================
// Function Name:	static void gif_buffer_exchange (uchar* DestBuffer, int width, int height)
// Purpose      : r b eXchange 	
// Parameter    :	
// Return       :	none
// Remarks      :	
// Change Log   :	
//                Author       Date       Description	
//              -----------------------------------------------	
//=====================================================================================
static void gif_buffer_exchange (uchar* DestBuffer, int width, int height)
{
	int index;
	register uchar temp1;
	for(index = 0; index <height * width * NUMCOLORS;)
	{
		temp1 = *(DestBuffer +index+ 0);
		*(DestBuffer+index +0) = *(DestBuffer+index +2);
		*(DestBuffer+index +2) = temp1;
		*(DestBuffer+index + 1) = *(DestBuffer+index +1);
		index += 3;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -