📄 gif_interface.c
字号:
*/
/* 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 + -