亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gif.cpp

?? 《精通 vc++ 圖像編程》的源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// Gif.cpp: implementation of the CGif class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include <io.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#include "Gif.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Global variables
//
GIF89 Gif89 = {-1,-1,-1,0};
GIFSCREEN GifScreen;
static unsigned long masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,
                                  0x001F, 0x003F, 0x007F, 0x00FF,
                                  0x01FF, 0x03FF, 0x07FF, 0x0FFF,
                                  0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGif::CGif()
{
	ZeroDataBlock = FALSE;
	m_strGIFError = "No Error"; // yet
	m_pDib = NULL;
	cur_accum = 0;
	cur_bits = 0;
	maxbits = BITS;
	maxmaxcode = (code_int)1 << BITS;
	free_ent = 0;
	clear_flg = 0;

	m_pDib = NULL;
}

CGif::CGif(CDib *pDib)
{
	ZeroDataBlock = FALSE;
	m_strGIFError = "No Error"; // yet
	m_pDib = NULL;
	cur_accum = 0;
	cur_bits = 0;
	maxbits = BITS;
	maxmaxcode = (code_int)1 << BITS;
	free_ent = 0;
	clear_flg = 0;

	m_pDib = NULL;

	SetDib(pDib);
}

CGif::~CGif()
{
	if (m_pDib != NULL)
		delete m_pDib;
}

// free allocate memory
void CGif::FreeBuffer(BYTE *Buffer)
{
	delete[] Buffer;
}

// get error string
CString CGif::GetErrorString()
{
	return m_strGIFError;
}

// load gif file
BOOL CGif::Load(LPCTSTR lpstrFileName)
{
	UINT uWidth, uHeight, uWidthDW;

	// read the GIF to a packed buffer of RGB bytes
	BYTE *lpTmpBuffer = ReadGIFFile(lpstrFileName, &uWidth, &uHeight);
	if (lpTmpBuffer == NULL)
		return FALSE;

	// do this before DWORD-alignment!!!
	// swap red and blue for display
	BGRFromRGB(lpTmpBuffer, uWidth, uHeight);

	// now DWORD-align for display
	BYTE *lpBuffer = MakeDwordAlign(lpTmpBuffer, uWidth, uHeight, &uWidthDW);
	FreeBuffer(lpTmpBuffer);

	// flip for display
	VertFlipBuf(lpBuffer, uWidthDW, uHeight);

	BITMAPINFOHEADER bmiHeader;
	bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmiHeader.biWidth = uWidth;
	bmiHeader.biHeight = uHeight;
	bmiHeader.biPlanes = 1;
	bmiHeader.biBitCount = 24;
	bmiHeader.biCompression = BI_RGB;
	bmiHeader.biSizeImage = 0;
	bmiHeader.biXPelsPerMeter = 0;
	bmiHeader.biYPelsPerMeter = 0;
	bmiHeader.biClrUsed = 0;
	bmiHeader.biClrImportant = 0;

    // Allocate enough memory for the new CF_DIB, and copy bits 
	DWORD dwHeaderSize = sizeof(BITMAPINFOHEADER);
	DWORD dwBitsSize = WIDTHBYTES(uWidth*24) * uHeight;
    HDIB hDIB = GlobalAlloc(GHND, dwHeaderSize + dwBitsSize); 
	if (hDIB == NULL)
		return FALSE;

    LPBYTE lpDIB = (LPBYTE)GlobalLock(hDIB); 
    memcpy(lpDIB, (LPBYTE)&bmiHeader, dwHeaderSize); 
    memcpy(FindDIBBits((LPBYTE)lpDIB), lpBuffer, dwBitsSize); 
	FreeBuffer(lpBuffer);

	if (m_pDib != NULL)
		delete m_pDib;

	m_pDib = new CDib();
	m_pDib->Attach(hDIB);

	return TRUE;
}

// save gif file
BOOL CGif::Save(LPCTSTR lpstrFileName, CDib* pDib)
{
	if (pDib == NULL)
		pDib = m_pDib;
	if (pDib == NULL)
		return FALSE;

	HDIB hDib = CopyHandle(pDib->GetHandle());
	if (hDib == NULL)
		return FALSE;

	CDib* pDibTmp = new CDib;
	pDibTmp->Attach(hDib);

	//if (pDibTmp->GetBitCount() != 24)
	//	pDibTmp->ConvertFormat(24);

	UINT uWidth  = pDibTmp->GetWidth();
	UINT uHeight = pDibTmp->GetHeight();

	// convert to 8-bit image
	if (pDibTmp->GetBitCount() != 8)
		pDibTmp->ColorQuantize(8);

	// get 256 color r, g, b
	PALETTEENTRY PaletteColors[256];
	pDibTmp->GetPalette()->GetPaletteEntries(0, 256, PaletteColors);
	int red[256], blue[256], green[256];
	for (int i=0;i<256;i++) 
	{
		red[i]   = PaletteColors[i].peRed;
		green[i] = PaletteColors[i].peGreen;
		blue[i]  = PaletteColors[i].peBlue;
	}

	// convert from DIB format (DWORD aligned, vertically flipped, red and blue swapped)
	BYTE *tmp = ClearDwordAlign(pDibTmp->GetBitsPtr(), uWidth, uHeight, 8);
	if (tmp == NULL)
		return FALSE;

	// convert from DIB
	VertFlipBuf(tmp, uWidth, uHeight);

	BOOL bSuccess = WriteGIFFile(lpstrFileName,
							tmp, uWidth, uHeight,
							0,		// background color
							red, green, blue);

	delete pDibTmp;
	FreeBuffer(tmp);

	return bSuccess;
}

LPBYTE CGif::ReadGIFFile(LPCTSTR lpstrFileName, UINT *uWidth, UINT *uHeight)
{
	BYTE			buf[16];
	BYTE			c;
	BYTE			localColorMap[3][MAXCOLORMAPSIZE];
	int				useGlobalColormap;
	int				bitPixel;
	int				imageCount	=0;
	char			version[4];
	FILE 			*fd;          
	int 			w=0;
	int				h=0;	

	CString strFileName = lpstrFileName;
	if (strFileName.IsEmpty()) 
	{
		m_strGIFError="No Name Given";
		return NULL;
	}

	BYTE *bigBuf;

	fd=fopen(lpstrFileName,"rb");
	if (fd==NULL) 
	{                       
		m_strGIFError="Cant open GIF :\n" + strFileName;
		return NULL;
	}

	// read GIF file header
	if (!ReadOK(fd,buf,6)) 
	{
		m_strGIFError="Error reading GIF Magic #\n"+strFileName;
		fclose(fd);
		return NULL;
	}
	
	// need the string "GIF" in the header
	if (strncmp((char *)buf,"GIF",3)!=0) 
	{
		m_strGIFError="Error, "+strFileName+" is not a valid .GIF file";
		fclose(fd);
		return NULL;
	}	

	strncpy(version,(char *)(buf+3),3);
	version[3]='\0';

	// only handle v 87a and 89a
	if ((strcmp(version,"87a")!=0)&&(strcmp(version,"89a")!=0)) 
	{
		m_strGIFError="Error, Bad GIF Version number";
		fclose(fd);
		return NULL;
	}	

	// screen description
	if (!ReadOK(fd,buf,7)) 
	{
		m_strGIFError="Error, failed to GIF read screen descriptor.\nGiving up";
		fclose(fd);
		return NULL;
	}

	GifScreen.Width		=	LM_to_uint((BYTE)buf[0],(BYTE)buf[1]);
	GifScreen.Height	=	LM_to_uint((BYTE)buf[2],(BYTE)buf[3]);
	GifScreen.BitPixel	=	2 << ((BYTE)buf[4] & 0x07);
	GifScreen.ColorResolution = ((((BYTE)buf[4] & 0x70) >> 3) + 1);
	GifScreen.BackGround=	(BYTE)buf[5];									// background color...
	GifScreen.AspectRatio=	(BYTE)buf[6];
            

	// read colormaps
	if (BitSet((BYTE)buf[4],LOCALCOLORMAP)) 
	{
		if (!ReadColorMap(fd,GifScreen.BitPixel,GifScreen.ColorMap)) 
		{
			m_strGIFError="Error reading GIF colormap";
			fclose(fd);
			return NULL;                                             
		}
	}

	// non-square pixels, so what?	
	if ((GifScreen.AspectRatio!=0 ) && (GifScreen.AspectRatio!=49)) 
	{
		m_strGIFError="Non-square pixels in GIF image.\nIgnoring that fact...";
	}

	// there can be multiple images in a GIF file... uh?
	// what the hell do we do with multiple images?
	// so, we'll be interested in just the first image, cause we're lazy

	for(;;) 
	{	
		// read a byte;
		if (!ReadOK(fd,&c,1)) 
		{
			m_strGIFError="Unexpected EOF in GIF.\nGiving up";
			fclose(fd);
			return NULL; 
		}
	
		// image terminator
		if (c==';') 
		{
		}
	
		if (c=='!') 
		{
			if (!ReadOK(fd,&c,1)) 
			{
				m_strGIFError="Error on extension read.\nGiving up";
				fclose(fd);
				return NULL;       
			}
			DoExtension(fd,c);
			continue;
		}
	
		if (c!=',') 
		{
			// Ignoring c
			continue;
		}
	
		// read image header
		if (!ReadOK(fd,buf,9)) 
		{
			m_strGIFError="Error on dimension read\nGiving up";
			fclose(fd);
			return NULL;                     
		}
	
		useGlobalColormap=!BitSet((BYTE)buf[8],LOCALCOLORMAP);
	
		bitPixel=1<<(((BYTE)buf[8]&0x07)+1);
	
	    // let's see if we have enough mem to continue?

		long bufsize;

		if ((int)buf[5]>4) 
		{
			//AfxMessageBox("This GIF file claims to be > 2000 bytes wide!",MB_OK | MB_ICONINFORMATION);
		}
		if ((int)buf[7]>4) 
		{
			//AfxMessageBox("This GIF file claims to be > 2000 bytes high!",MB_OK | MB_ICONINFORMATION);
		}		                                                       
		
		w=LM_to_uint((BYTE)buf[4],(BYTE)buf[5]);		
		h=LM_to_uint((BYTE)buf[6],(BYTE)buf[7]);
		
		if ((w<0) || (h<0)) 
		{
			m_strGIFError="Negative image dimensions!\nGiving up";
			fclose(fd);
			return NULL;
		}
				
		bufsize=(long)w*(long)h;
		bufsize*=3;
		bigBuf= (BYTE *) new char [bufsize];
		
		if (bigBuf==NULL) 
		{
			m_strGIFError="Out of Memory in GIFRead";
			fclose(fd);
			return NULL;
		}
			
		if (!useGlobalColormap) 
		{
			if (!ReadColorMap(fd,bitPixel,localColorMap)) 
			{
				m_strGIFError="Error reading GIF colormap\nGiving up";
				delete [] bigBuf;
				fclose(fd);
				return NULL;                     
			}
	
		 	//read image
			if (!ReadImage(fd, bigBuf, w, h, localColorMap, BitSet((BYTE)buf[8],INTERLACE))) 
			{
				m_strGIFError="Error reading GIF file\nLocalColorMap\nGiving up";
				delete [] bigBuf;
				fclose(fd);
				return NULL; 				
			}
		} 
		else 
		{
			if (!ReadImage(fd, bigBuf, w, h, GifScreen.ColorMap, BitSet((BYTE)buf[8],INTERLACE))) 
			{
				m_strGIFError="Error reading GIF file\nGIFScreen Colormap\nGiving up";
				delete [] bigBuf;
				fclose(fd);
				return NULL; 			
			}
		}
		break;
	}

	*uWidth=w;
	*uHeight=h;
		
	fclose(fd);
	return bigBuf;
}

int CGif::ReadColorMap(FILE *fd, int number, BYTE buffer[3][MAXCOLORMAPSIZE])
{
	int 	i;
	BYTE rgb[3];
	
	for (i=0;i < number; ++i) 
	{
		if (!ReadOK(fd,rgb,sizeof(rgb))) 
		{
			return FALSE;
		}
		
		buffer[CM_RED][i]=rgb[0];
		buffer[CM_GREEN][i]=rgb[1];
		buffer[CM_BLUE][i]=rgb[2];
	}	
	return TRUE;
}

int CGif::DoExtension(FILE *fd, int label)
{
	static char buf[256];
	char	*str;

	switch(label) 
	{
	case 0x01  :
		str="Plain Text Ext";
		break;
	case 0xff :
		str= "Appl ext";
		break;
	case 0xfe :
		str="Comment Ext";
		while (GetDataBlock(fd,(BYTE *)buf)!=0);
		return FALSE;
	case 0XF9 :
		str="Graphic Ctrl Ext";
		(void)GetDataBlock(fd,(BYTE *)buf);
		Gif89.disposal	=(buf[0]>>2)		&0x7;
		Gif89.inputFlag	=(buf[0]>>1)		&0x1;
		Gif89.delayTime	=LM_to_uint(buf[1],buf[2]);
		if ((buf[0]&0x1)!=0)
			Gif89.transparent=buf[3];
	
		while (GetDataBlock(fd,(BYTE *)buf)!=0);
		return FALSE;
	default :
		str=buf;
		sprintf(buf,"UNKNOWN (0x%02x)",label);
		break;
	}
	
	while (GetDataBlock(fd,(BYTE *)buf)!=0);

	return FALSE;
}

int CGif::GetDataBlock(FILE *fd, BYTE *buf)
{
	BYTE count;

	if (!ReadOK(fd,&count,1)) 
	{
		//m_strGIFError="Error in GIF DataBlock Size";
		return -1;
	}

	ZeroDataBlock=count==0;

	if ((count!=0) && (!ReadOK(fd,buf,count))) 
	{
		//m_strGIFError="Error reading GIF datablock";
		return -1;
	}
	return count;
}

int CGif::GetCode(FILE *fd, int code_size, int flag)
{
	static BYTE buf[280];
	static int curbit, lastbit, done, last_byte;
	int i,j,ret;
	BYTE count;

	if (flag) 
	{
		curbit=0;
		lastbit=0;
		done=FALSE;
		return 0;
	}

	if ((curbit+code_size) >=lastbit) 
	{
		if (done) 
		{
			if (curbit >=lastbit) 
			{
				//m_strGIFError="Ran off the end of my bits";
				return 0;
			}
			return -1;
		}
		buf[0]=buf[last_byte-2];	
		buf[1]=buf[last_byte-1];

		if ((count=GetDataBlock(fd,&buf[2]))==0)
			done=TRUE;

		last_byte=2+count;

		curbit=(curbit - lastbit) + 16;

		lastbit = (2+count)*8;
	}
	ret=0;
	for (i=curbit,j=0; j<code_size;++i,++j)
		ret|=((buf[i/8]&(1<<(i% 8)))!=0)<<j;

	curbit+=code_size;

	return ret;
}

int CGif::LZWReadByte(FILE *fd, int flag, int input_code_size)
{
	static int fresh=FALSE;
	int code, incode;
	static int code_size, set_code_size;
	static int max_code, max_code_size;
	static int firstcode, oldcode;
	static int clear_code, end_code;

	static unsigned short  next[1<<MAX_LZW_BITS];
	static BYTE  vals[1<<MAX_LZW_BITS];
	static BYTE  stack [1<<(MAX_LZW_BITS+1)];
	static BYTE  *sp;
	
	register int i;

	if (flag) 
	{
		set_code_size=input_code_size;
		code_size=set_code_size+1;
		clear_code=1<<set_code_size;
		end_code = clear_code+1;
		max_code = clear_code+2;
		max_code_size=2*clear_code;

		GetCode(fd,0,TRUE);

		fresh=TRUE;
	
		for(i=0;i<clear_code;++i) 
		{
			next[i]=0;
			vals[i]=i;
		}

		for (;i<(1<<MAX_LZW_BITS);++i)
			next[i]=vals[0]=0;
	
		sp=stack;

		return 0;
	} 
	else if (fresh) 
	{
			fresh=FALSE;
			do 
			{
				firstcode=oldcode=GetCode(fd,code_size,FALSE);
			} while (firstcode==clear_code);
			return firstcode;
		}

		if (sp > stack)
			return *--sp;

		while ((code= GetCode(fd,code_size,FALSE)) >=0) 
		{
			if (code==clear_code) 
			{
				for (i=0;i<clear_code;++i) 
				{
					next[i]=0;
					vals[i]=i;
				}
				for (;i<(1<<MAX_LZW_BITS);++i)	
					next[i]=vals[i]=0;
				code_size=set_code_size+1;
				max_code_size=2*clear_code;
				max_code=clear_code+2;
				sp=stack;
				firstcode=oldcode=GetCode(fd,code_size,FALSE);
				return firstcode;
			} 
			else if (code==end_code) 
			{
				int count;
				BYTE buf[260];
		
				if (ZeroDataBlock)
					return -2;

				while ((count=GetDataBlock(fd,buf)) >0);

				if (count!=0)
					//AfxMessageBox("Missing EOD in GIF data stream (common occurrence)",MB_OK);
				return -2;	
			}

			incode = code;

			if (code >= max_code) 
			{
				*sp++=firstcode;
				code=oldcode;
			}

			while (code >=clear_code) 
			{
				*sp++=vals[code];
				if (code==(int)next[code]) 
				{
					//m_strGIFError="Circular table entry, big GIF Error!";
					return -1;
				}
				code=next[code];
			}

			*sp++ = firstcode=vals[code];

			if ((code=max_code) <(1<<MAX_LZW_BITS)) 
			{
				next[code]=oldcode;
				vals[code]=firstcode;
				++max_code;
				if ((max_code >=max_code_size) &&
					(max_code_size < (1<<MAX_LZW_BITS))) 
				{
					 max_code_size*=2;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费人成网站在线观看欧美高清| 日韩欧美另类在线| 亚洲视频 欧洲视频| av在线播放不卡| 国产精品高潮呻吟| 色素色在线综合| 首页综合国产亚洲丝袜| 91精品国产综合久久精品app| 日本三级亚洲精品| 久久这里只有精品首页| 高清成人免费视频| 亚洲欧美日韩国产手机在线 | 同产精品九九九| 欧美一级黄色大片| 精品无人区卡一卡二卡三乱码免费卡| 精品国产一区二区三区忘忧草| 国产精品99久久久久久似苏梦涵| 国产精品嫩草影院av蜜臀| 日本韩国欧美在线| 极品尤物av久久免费看| 国产精品福利电影一区二区三区四区| 在线精品视频免费观看| 韩国成人在线视频| 亚洲色图制服诱惑| 欧美xxxxx裸体时装秀| 99久久综合99久久综合网站| 午夜精品久久久久久久久久久| www国产亚洲精品久久麻豆| 色综合久久久网| 国产呦萝稀缺另类资源| 一区二区三区四区亚洲| 日韩精品一区二区三区视频| av电影天堂一区二区在线| 蜜桃精品视频在线| 亚洲欧美一区二区三区国产精品| 欧美一区二区免费观在线| 91论坛在线播放| 国产精品一二三区在线| 日韩中文字幕亚洲一区二区va在线| 国产亚洲va综合人人澡精品| 欧美日韩国产一级片| 成人va在线观看| 久久er精品视频| 亚洲一二三区不卡| 中文字幕一区二区视频| 精品久久久久久久久久久久久久久| 色哟哟一区二区在线观看| 国产91在线|亚洲| 日韩国产一二三区| 一区二区三区日韩在线观看| 欧美激情在线观看视频免费| 日韩欧美国产系列| 69堂精品视频| 在线观看一区二区视频| 99久久伊人久久99| 成人黄色小视频在线观看| 国产综合色视频| 另类小说视频一区二区| 日韩av一区二区在线影视| 亚洲愉拍自拍另类高清精品| 国产精品视频一二| 中文字幕av一区二区三区免费看| 精品精品国产高清a毛片牛牛 | 国产精品一区二区不卡| 久久精品国产精品亚洲精品| 视频一区视频二区在线观看| 亚洲成人av在线电影| 亚洲一区av在线| 亚洲精品午夜久久久| 亚洲欧洲日产国码二区| 国产精品全国免费观看高清| 久久久久久久性| 久久久久国产精品麻豆ai换脸 | 中文幕一区二区三区久久蜜桃| 2017欧美狠狠色| 欧美精品一区二区三区久久久| 精品欧美黑人一区二区三区| 久久人人爽人人爽| 国产亲近乱来精品视频 | 91精品国产91热久久久做人人| 欧美嫩在线观看| 日韩一区二区视频| 精品国产凹凸成av人导航| 久久综合色婷婷| 国产日产欧产精品推荐色| 中文字幕亚洲电影| 一区二区三区在线免费视频| 亚洲国产美女搞黄色| 午夜精品福利在线| 久久99国产精品久久99| 国产91丝袜在线观看| 色偷偷成人一区二区三区91| 精品视频在线免费| 欧美变态tickling挠脚心| 欧美国产1区2区| 亚洲综合免费观看高清完整版| 午夜在线成人av| 久久99精品久久久久久动态图| 国产精品一区二区在线播放| av在线免费不卡| 欧美精品色综合| 久久久99免费| 亚洲精品写真福利| 免费观看成人av| 成人av电影在线播放| 欧美日韩国产a| 国产欧美日韩视频在线观看| 亚洲一区二区三区四区在线免费观看 | 理论电影国产精品| 99国产精品视频免费观看| 欧美人伦禁忌dvd放荡欲情| 久久久久久久免费视频了| 亚洲综合在线观看视频| 精品一区二区三区蜜桃| 日韩精品一区二区三区视频 | 91免费在线看| 欧美一区二区性放荡片| 国产精品欧美一区喷水| 亚洲一级二级三级| 国产主播一区二区| 欧美性猛片xxxx免费看久爱| 精品国产一区二区三区久久影院| 亚洲伦理在线精品| 国产精品综合在线视频| 欧美日韩小视频| 中文字幕一区二区三区在线观看| 日本中文字幕一区二区有限公司| 成人精品gif动图一区| 欧美一卡2卡三卡4卡5免费| 亚洲黄色性网站| 国产福利91精品一区| 69成人精品免费视频| 国产精品久久久久久久久搜平片| 蜜桃视频一区二区三区| 欧美中文字幕久久| 中文字幕一区视频| 国产精品18久久久| 欧美tickling网站挠脚心| 天天综合色天天| 色婷婷精品久久二区二区蜜臀av| 久久久国产精品麻豆| 极品尤物av久久免费看| 欧美一二三四在线| 午夜精品久久久久久久久久久| 色综合欧美在线视频区| 中文字幕在线一区二区三区| 国产一区二区网址| 日韩一区二区不卡| 日本不卡不码高清免费观看| 欧美日本免费一区二区三区| 亚洲欧美精品午睡沙发| 成人动漫一区二区三区| 国产日本欧洲亚洲| 国产91色综合久久免费分享| 精品国产伦一区二区三区观看方式 | 精一区二区三区| 欧美日韩免费视频| 亚洲一区二区3| 色菇凉天天综合网| 国产精品久久久久影院| 国产成a人无v码亚洲福利| 久久只精品国产| 国产一区在线观看麻豆| 久久老女人爱爱| 国产一区二区三区电影在线观看| 欧美成人aa大片| 久久精品国产精品亚洲红杏| 精品免费国产二区三区| 韩国欧美一区二区| 久久精品日韩一区二区三区| 国产精品888| 欧美国产精品一区二区| 91原创在线视频| 亚洲一区在线观看免费| 欧美日韩一区小说| 亚洲成av人影院| 日韩一区和二区| 极品美女销魂一区二区三区免费| 久久嫩草精品久久久久| 成人午夜电影久久影院| 中文字幕一区二区三区在线观看| 色综合久久精品| 日韩精品一级中文字幕精品视频免费观看| 欧美三级资源在线| 久久er精品视频| 中文乱码免费一区二区| 91福利国产精品| 蜜芽一区二区三区| 国产色一区二区| 一本久道中文字幕精品亚洲嫩| 亚洲大片一区二区三区| www久久久久| 日本韩国欧美一区二区三区| 午夜电影网亚洲视频| 久久久精品免费免费| 色噜噜夜夜夜综合网| 久久国产精品99久久人人澡| 日本一区二区免费在线| 欧美怡红院视频| 国内不卡的二区三区中文字幕|