青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

永遠也不完美的程序

不斷學習,不斷實踐,不斷的重構……

常用鏈接

統計

積分與排名

好友鏈接

最新評論

FreeType2字體轉換到D3D紋理


Font.h

#ifndef __Font_H__
#define __Font_H__

#include 
<vector>
#include 
<D3D9.h>

typedef unsigned 
char uint8;

template
<typename T> struct TRect
{
    T left, top, right, bottom;
    TRect() {}
    TRect(T 
const & l, T const & t, T const & r, T const & b)
        : left(l), top(t), right(r), bottom(b)
    {
    }
    TRect(TRect 
const & o)
        : left(o.left), top(o.top), right(o.right), bottom(o.bottom)
    {
    }
    TRect 
& operator=(TRect const & o)
    {
        left 
= o.left;
        top 
= o.top;
        right 
= o.right;
        bottom 
= o.bottom;
        
return *this;
    }
    T width() 
const
    {
        
return right - left;
    }
    T height() 
const
    {
        
return bottom - top;
    }
};

typedef unsigned 
int uint32;
typedef TRect
<float> FloatRect;

class Font
{
public:
    Font(IDirect3DDevice9
* device);
    typedef uint32 CodePoint;
    typedef FloatRect UVRect;
    typedef std::pair
<CodePoint, CodePoint> PairCodePoint;
    typedef std::vector
<PairCodePoint> VectorPairCodePoint;

    
struct GlyphInfo
    {
        CodePoint codePoint;
//codePoint碼
        UVRect uvRect;//紋理區域
        float aspectRatio;

        GlyphInfo():codePoint(
0),uvRect(UVRect(0000)),aspectRatio(1)
        { 
        }
        GlyphInfo(CodePoint _code, 
const UVRect& _rect, float _aspect) : codePoint(_code), uvRect(_rect), aspectRatio(_aspect)
        { 
        }
    };

    typedef std::vector
<GlyphInfo> VectorGlyphInfo;

    
struct RangeInfo
    {
        CodePoint first;
        CodePoint second;
        VectorGlyphInfo range;

        RangeInfo(CodePoint _first, CodePoint _second) : first(_first), second(_second) { }
    };


    
enum constCodePoints
    {
        FONT_CODE_SELECT 
= 0,
        FONT_CODE_TAB 
= 0x0009,
        FONT_CODE_LF 
= 0x000A,
        FONT_CODE_CR 
= 0x000D,
        FONT_CODE_SPACE 
= 0x0020,
        FONT_CODE_LATIN_START 
= 0x0021,
        FONT_CODE_NEL 
= 0x0085,
        FONT_CODE_LATIN_END 
= 0x00A6,
    };

    typedef std::vector
<RangeInfo> VectorRangeInfo;


    
bool loadFont();

    inline 
bool checkHidePointCode(CodePoint _id)
    {
        
for (VectorPairCodePoint::iterator iter=mVectorHideCodePoint.begin(); iter!=mVectorHideCodePoint.end(); ++iter) {
            
if ((_id >= iter->first) && (_id <= iter->second)) return true;
        }
        
return false;
    }

public:
    VectorPairCodePoint mVectorHideCodePoint;
    
//字體范圍
    VectorRangeInfo mVectorRangeInfo;
    
    uint8 mCountSpaceTab;
    uint8 mCharSpacer;

    GlyphInfo mSpaceGlyphInfo, mTabGlyphInfo, mSelectGlyphInfo, mSelectDeactiveGlyphInfo, mCursorGlyphInfo;
    
    IDirect3DDevice9
* p;
};

#endif

Font.cpp

#include 
"Font.h"
#include 
<d3dx9tex.h>
#include 
<windows.h>
#include 
<ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H

const unsigned char FONT_MASK_SELECT = 0x88;
const unsigned char FONT_MASK_SELECT_DEACTIVE = 0x60;
const unsigned char FONT_MASK_SPACE = 0x00;
const unsigned char FONT_MASK_CHAR = 0xFF;    
const size_t FONT_TEXTURE_WIDTH = 1024;

typedef unsigned 
char uchar;

Font::Font(IDirect3DDevice9
* device)
{
    p 
= device;
    mCharSpacer 
= 5;
    mCountSpaceTab 
= 4;
}

bool Font::loadFont()
{
    
if (mVectorRangeInfo.empty())
        mVectorRangeInfo.push_back(RangeInfo(FONT_CODE_LATIN_START, FONT_CODE_LATIN_END));


    FT_Library ftLibrary;
//定義FT庫

    
//第一步:初始化庫 
    if(FT_Init_FreeType(&ftLibrary))
        MessageBox(NULL,
"FreeType初始化庫時發生了一個錯誤!", NULL, NULL);


    
//第二步:裝載一個字體face (可以從一個字體文件裝載, 也可以內存裝載)
    
//字體文件裝載:
    FT_Face face;
    
if(FT_New_Face(ftLibrary, "msyh.ttf"0&face)) 
        MessageBox(NULL,
"Could not open font face!",NULL,NULL);

    
//內存裝載:
    
//FT_New_Memory_Face( library,
    
//buffer, /* 緩存的第一個字節 */ 
    
//size, /* 緩存的大小(以字節表示) */ 
    
//0, /* face索引 */ 
    
//&face ); 內存裝載


    
//第三步:設置當前象素尺寸
    
//當一個新的face對象建立時,對于可伸縮字體格式,size對象默認值為字符大小水平和垂直均為10象素。
    
//對于定長字體格式,這個大小是未定義的,這就是你必須在裝載一個字形前設置該值的原因。 
    
//設置FreeType2字體大小
    
//FT_Set_Char_Size( 
    
//    face, /* face對象的句柄 */ 
    
//    0, /* 以1/64點為單位的字符寬度 */ 
    
//    16*64, /* 以1/64點為單位的字符高度 */ 
    
//    300, /* 設備水平分辨率 */ 
    
//    300 ); /* 設備垂直分辨率 */ 
    FT_F26Dot6 ftSize = (FT_F26Dot6)(24 * (1 << 6));
    
if(FT_Set_Char_Size( face, ftSize, 07272))
        MessageBox(NULL,
"Could not set char size!",NULL,NULL);


    
int max_height = 0, max_width = 0, max_bear = 0;

    
//讀取字體
    FT_Error ftResult = FT_Load_Char( face, 97, FT_LOAD_RENDER );
    
if(ftResult)
        MessageBox(NULL ,
"cannot load character 97", NULL, NULL);
    FT_Int advance 
= (face->glyph->advance.x >> 6 ) + ( face->glyph->metrics.horiBearingX >> 6 );

    
//位圖指針
    unsigned char* buffer = face->glyph->bitmap.buffer;
    
if(NULL == buffer)
        MessageBox(NULL,
"位圖指針error", NULL, NULL);


    
//計算 最大寬, 高  
    size_t glyphCount = 4;
    size_t l 
= glyphCount * (advance + 5), m = 0;


    
//在這里計算字體紋理需要的大小
    for (VectorRangeInfo::iterator iter=mVectorRangeInfo.begin(); iter!=mVectorRangeInfo.end(); ++iter) {
        
for (CodePoint index=iter->first; index<=iter->second; ++index, ++glyphCount) {

            
if (checkHidePointCode(index)) continue;
            
//讀取字體(單個)
            if (FT_Load_Char( face, index, FT_LOAD_RENDER )) continue;
            
//這里判斷是否有這個CodePoint碼
            if (NULL == face->glyph->bitmap.buffer) continue;

            
//應該是字寬 
            FT_Int advance = (face->glyph->advance.x >> 6 ) + ( face->glyph->metrics.horiBearingX >> 6 );

            
if ( ( 2 * ( face->glyph->bitmap.rows << 6 ) - face->glyph->metrics.horiBearingY ) > max_height )
                max_height 
= ( 2 * ( face->glyph->bitmap.rows << 6 ) - face->glyph->metrics.horiBearingY );

            
if ( face->glyph->metrics.horiBearingY > max_bear )
                max_bear 
= face->glyph->metrics.horiBearingY;

            
if ( (face->glyph->advance.x >> 6 ) + ( face->glyph->metrics.horiBearingX >> 6 ) > max_width)
                max_width 
= (face->glyph->advance.x >> 6 ) + ( face->glyph->metrics.horiBearingX >> 6 );

            l 
+= (advance + 5);
            
if ( (FONT_TEXTURE_WIDTH - 1< (l + advance) ) { m ++; l = 0;}

        }
    }

    max_height 
>>= 6;
    max_bear 
>>= 6;

    size_t finalWidth 
= FONT_TEXTURE_WIDTH;//字體紋理的寬度
    size_t finalHeight = (m+1* (max_height + 5);//字體紋理的高度

    
//字節對齊
    size_t needHeight = 1;
    
while (needHeight < finalHeight) needHeight <<= 1;
    finalHeight 
= needHeight;

    
//字體文理寬高比例
    float textureAspect = (float)finalWidth / (float)finalHeight;


    
//圖象格式A8L8
    const size_t pixel_bytes = 2;
    size_t data_width 
= finalWidth * pixel_bytes;
    size_t data_size 
= finalWidth * finalHeight * pixel_bytes;//字體紋理需要的字節數

    
//字體位圖指針
    uchar* imageData = new uchar[data_size];

    
//8位表示亮度8位表示alpha值
    for (size_t i = 0; i < data_size; i += pixel_bytes) {
        imageData[i 
+ 0= 0x00//亮度
        imageData[i + 1= 0x00//alpha值
    }
    l 
= 0;
    m 
= 0;


    ftResult 
= FT_Load_Char( face, 97, FT_LOAD_RENDER );
    
if (ftResult) 
        MessageBox(NULL, 
"cannot load character ", NULL, NULL);
    advance 
= (face->glyph->advance.x >> 6 ) + ( face->glyph->metrics.horiBearingX >> 6 );
    buffer 
= face->glyph->bitmap.buffer;

    
//得到y的空隙
    int y_bearnig = max_bear - ( face->glyph->metrics.horiBearingY >> 6 );

    
///////////////////////////////////////////////////////////////////////////////////////
    //設置空格符紋理
    for (int j = 0; j < face->glyph->bitmap.rows; j++ ) {
        
int row = j + (int)m + y_bearnig;
        uchar
* pDest = &imageData[(row * data_width) + l * pixel_bytes];//找起點
        for (int k = 0; k < face->glyph->bitmap.width; k++ ) {
            
*pDest++= FONT_MASK_CHAR;
            
*pDest++= FONT_MASK_SPACE;
            buffer
++;
        }
    }
    
//設置空格符紋理坐標
    mSpaceGlyphInfo.codePoint = FONT_CODE_SPACE;
    mSpaceGlyphInfo.uvRect.left 
= (float)l / (float)finalWidth;  // u1
    mSpaceGlyphInfo.uvRect.top = (float)m / (float)finalHeight;  // v1
    mSpaceGlyphInfo.uvRect.right = (float)( l + ( face->glyph->advance.x >> 6 ) ) / (float)finalWidth; // u2
    mSpaceGlyphInfo.uvRect.bottom = ( m + max_height ) / (float)finalHeight; // v2
    mSpaceGlyphInfo.aspectRatio = textureAspect * (mSpaceGlyphInfo.uvRect.right - mSpaceGlyphInfo.uvRect.left)  / (mSpaceGlyphInfo.uvRect.bottom - mSpaceGlyphInfo.uvRect.top);

    
///////////////////////////////////////////////////////////////////////////////////////

    mTabGlyphInfo 
= mSpaceGlyphInfo;
    mTabGlyphInfo.aspectRatio 
= textureAspect * (float)mCountSpaceTab;

    l 
+= (advance + mCharSpacer);
    
if ( (FONT_TEXTURE_WIDTH - 1< (l + advance) ) { m += max_height + mCharSpacer;l = 0;}

    
///////////////////////////////////////////////////////////////////////////////////////
    for (int j = 0; j < face->glyph->bitmap.rows; j++ ) {
        
int row = j + (int)m + y_bearnig;
        uchar
* pDest = &imageData[(row * data_width) + l * pixel_bytes];
        
for(int k = 0; k < face->glyph->bitmap.width; k++ ) {
            
*pDest++= FONT_MASK_CHAR;
            
*pDest++= FONT_MASK_SELECT;
            buffer
++;
        }
    }

    mSelectGlyphInfo.codePoint 
= FONT_CODE_SELECT;
    mSelectGlyphInfo.uvRect.left 
= (float)l / (float)finalWidth;  // u1
    mSelectGlyphInfo.uvRect.top = (float)m / (float)finalHeight;  // v1
    mSelectGlyphInfo.uvRect.right = (float)( l + ( face->glyph->advance.x >> 6 ) ) / (float)finalWidth; // u2
    mSelectGlyphInfo.uvRect.bottom = ( m + max_height ) / (float)finalHeight; // v2
    mSelectGlyphInfo.aspectRatio = textureAspect * (mSelectGlyphInfo.uvRect.right - mSelectGlyphInfo.uvRect.left)  / (mSelectGlyphInfo.uvRect.bottom - mSelectGlyphInfo.uvRect.top);

    
//l+= 本字寬+字空 
    l += (advance + mCharSpacer);
    
//如果到頭容不下一個字
    if ( (FONT_TEXTURE_WIDTH - 1< (l + advance) ) { m += max_height + mCharSpacer;l = 0;}

    
///////////////////////////////////////////////////////////////////////////////////////
    for (int j = 0; j < face->glyph->bitmap.rows; j++ ) {
        
int row = j + (int)m + y_bearnig;
        uchar
* pDest = &imageData[(row * data_width) + l * pixel_bytes];
        
for(int k = 0; k < face->glyph->bitmap.width; k++ ) {
            
*pDest++= FONT_MASK_CHAR;
            
*pDest++= FONT_MASK_SELECT_DEACTIVE;
            buffer
++;
        }
    }

    mSelectDeactiveGlyphInfo.codePoint 
= FONT_CODE_SELECT;
    mSelectDeactiveGlyphInfo.uvRect.left 
= (float)l / (float)finalWidth;  // u1
    mSelectDeactiveGlyphInfo.uvRect.top = (float)m / (float)finalHeight;  // v1
    mSelectDeactiveGlyphInfo.uvRect.right = (float)( l + ( face->glyph->advance.x >> 6 ) ) / (float)finalWidth; // u2
    mSelectDeactiveGlyphInfo.uvRect.bottom = ( m + max_height ) / (float)finalHeight; // v2
    mSelectDeactiveGlyphInfo.aspectRatio = textureAspect * (mSelectDeactiveGlyphInfo.uvRect.right - mSelectDeactiveGlyphInfo.uvRect.left)  / (mSelectDeactiveGlyphInfo.uvRect.bottom - mSelectDeactiveGlyphInfo.uvRect.top);

    l 
+= (advance + mCharSpacer);
    
if ( (FONT_TEXTURE_WIDTH - 1< (l + advance) ) { m += max_height + mCharSpacer;l = 0;}

    
///////////////////////////////////////////////////////////////////////////////////////

    
for (int j = 0; j < face->glyph->bitmap.rows; j++ ) {
        
int row = j + (int)m + y_bearnig;
        uchar
* pDest = &imageData[(row * data_width) + l * pixel_bytes];
        
for(int k = 0; k < face->glyph->bitmap.width; k++ ) {
            
*pDest++= FONT_MASK_CHAR;
            
*pDest++= FONT_MASK_CHAR;
            buffer
++;
        }
    }

    mCursorGlyphInfo.codePoint 
= FONT_CODE_SELECT;
    mCursorGlyphInfo.uvRect.left 
= (float)l / (float)finalWidth;  // u1
    mCursorGlyphInfo.uvRect.top = (float)m / (float)finalHeight;  // v1
    mCursorGlyphInfo.uvRect.right = (float)( l + ( face->glyph->advance.x >> 6 ) ) / (float)finalWidth; // u2
    mCursorGlyphInfo.uvRect.bottom = ( m + max_height ) / (float)finalHeight; // v2
    mCursorGlyphInfo.aspectRatio = textureAspect * (mCursorGlyphInfo.uvRect.right - mCursorGlyphInfo.uvRect.left)  / (mCursorGlyphInfo.uvRect.bottom - mCursorGlyphInfo.uvRect.top);

    l 
+= (advance + mCharSpacer);
    
if ( (FONT_TEXTURE_WIDTH - 1< (l + advance) ) { m += max_height + mCharSpacer;l = 0;}
    
///////////////////////////////////////////////////////////////////////////////////////

    
for (VectorRangeInfo::iterator iter=mVectorRangeInfo.begin(); iter!=mVectorRangeInfo.end(); ++iter) 
    {

        iter
->range.resize(iter->second - iter->first + 1);
        size_t pos 
= 0;

        
for (CodePoint index=iter->first; index<=iter->second; ++index, ++pos) {

            
if (checkHidePointCode(index)) continue;

            GlyphInfo 
& info = iter->range.at(pos);

            ftResult 
= FT_Load_Char( face, index, FT_LOAD_RENDER );
            
if (ftResult) {
                MessageBox(NULL, 
"cannot load character ", NULL, NULL);
                
continue;
            }

            FT_Int advance 
= (face->glyph->advance.x >> 6 ) + ( face->glyph->metrics.horiBearingX >> 6 );
            
//位圖指針
            unsigned char* buffer = face->glyph->bitmap.buffer;

            
if (NULL == buffer) {
                MessageBox(NULL, 
"Freetype returned null for character ", NULL, NULL);
                
continue;
            }

            
int y_bearnig = max_bear - ( face->glyph->metrics.horiBearingY >> 6 );

            
for(int j = 0; j < face->glyph->bitmap.rows; j++ ) {//TTF字體紋理高度
                int row = j + (int)m + y_bearnig;
                uchar
* pDest = &imageData[(row * data_width) + l * pixel_bytes];
                
for(int k = 0; k < face->glyph->bitmap.width; k++ ) 
                {
                    
if(true)//WBW TEST
                    {
                        
*pDest++= *buffer;
                    }
                    
else
                    {
                        
*pDest++= FONT_MASK_CHAR;
                    }
                    
*pDest++= *buffer;//D3DFMT_A8L8
                    buffer++;


                }
            }
            
//CodePoint碼(字符對應的紋理坐標)a,b,c,d,e. . .一,二,三. . .
            info.codePoint = index;
            info.uvRect.left 
= (float)l / (float)finalWidth;  // u1
            info.uvRect.top = (float)m / (float)finalHeight;  // v1
            info.uvRect.right = (float)( l + ( face->glyph->advance.x >> 6 ) ) / (float)finalWidth; // u2
            info.uvRect.bottom = ( m + max_height ) / (float)finalHeight; // v2
            info.aspectRatio = textureAspect * (info.uvRect.right - info.uvRect.left)  / (info.uvRect.bottom - info.uvRect.top);

            l 
+= (advance + mCharSpacer);
            
if ( (FONT_TEXTURE_WIDTH - 1< (l + advance) ) { m += max_height + mCharSpacer;l = 0;}

        }
    }

    
//保存到D3D紋理
    IDirect3DTexture9*      _tex;
    HRESULT hr 
= 0;

    hr 
= ::D3DXCreateTexture(
        p,
        finalWidth, finalHeight,
        
0
        
0
        D3DFMT_A8L8,
//紋理格式
        D3DPOOL_MANAGED, &_tex);

    
if(FAILED(hr))
        ::MessageBox(NULL,
"D3DXCreateTexture error", NULL, NULL);

    D3DSURFACE_DESC textureDesc; 
    _tex
->GetLevelDesc(0&textureDesc);

    
if(textureDesc.Format != D3DFMT_A8L8) 
        
return false;

    D3DLOCKED_RECT lockedRect;
    _tex
->LockRect(0&lockedRect,00);         

    
//使用類型要對應(unsigned short --- D3DFMT_A8L8)
    unsigned short* imageData2 = (unsigned short*)lockedRect.pBits;

    
for(int i = 0; i < finalHeight; i++){
        
for(int j = 0; j < finalWidth; j++){

            
//Pitch數據的總長度
            int index = i * lockedRect.Pitch / 2/*D3DFMT_A8L8 二字節*/ + j;
            
//if(i < finalHeight/2)
            
//    imageData2[index] = 0x00;
            
//else
            
//    imageData2[index] = 0xFF;
            imageData2[index] = imageData[index*2];

        }
    }

    _tex
->UnlockRect(0);

    
//保存紋理
    hr = ::D3DXSaveTextureToFile("test.jpg", D3DXIFF_JPG, _tex, NULL);
    
if(D3DERR_INVALIDCALL == hr)
        ::MessageBox(NULL,NULL,NULL,NULL);

    
return true;
}

 

posted on 2008-12-16 21:50 狂爛球 閱讀(2833) 評論(2)  編輯 收藏 引用 所屬分類: 圖形編程

評論

# re: FreeType2字體轉換到D3D紋理 2009-08-09 10:37 102

美好卻不完美  回復  更多評論   

# re: FreeType2字體轉換到D3D紋理 [未登錄] 2012-09-03 19:22 li

H  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美大片91| 欧美.www| 欧美激情视频一区二区三区在线播放 | 国产欧美亚洲日本| 久久久久久久激情视频| 亚洲肉体裸体xxxx137| 国产精品色网| 午夜欧美大尺度福利影院在线看| 老巨人导航500精品| **欧美日韩vr在线| 欧美在线一二三四区| 欧美jjzz| 亚洲欧美一区二区视频| 亚洲大片av| 国产嫩草影院久久久久 | 午夜精品婷婷| 亚洲国产成人在线播放| 午夜一区二区三区不卡视频| 国产在线欧美日韩| 欧美日韩综合精品| 欧美激情二区三区| 狼人社综合社区| 亚洲欧美中文在线视频| 亚洲国产一区二区三区高清| 久久久精彩视频| 久久av一区二区三区| 亚洲性人人天天夜夜摸| 一本大道久久精品懂色aⅴ| 亚洲第一在线| 一区二区三区在线观看欧美| 国产精品一区二区三区成人| 欧美日韩精品一本二本三本| 欧美国产日本在线| 欧美国产免费| 国产精品高潮呻吟| 欧美日韩一区在线观看视频| 亚洲综合精品自拍| 亚洲一区二区三区精品在线| 99av国产精品欲麻豆| 亚洲精品乱码久久久久久蜜桃91| 国产综合欧美| 亚洲精品偷拍| 亚洲视频免费| 午夜精品一区二区三区在线播放| 欧美一区视频在线| 久久综合激情| 亚洲精品久久久久久一区二区| 最新高清无码专区| 亚洲欧美日韩国产一区二区三区| 欧美一区二区三区久久精品茉莉花 | 蜜月aⅴ免费一区二区三区| 麻豆国产精品va在线观看不卡| 免费观看在线综合| 日韩一级黄色片| 久久精品国产成人| 欧美日韩大片| 一区免费视频| 亚洲一区二区在线视频| 美女精品网站| 午夜精品久久久久久| 欧美精品一区二区三区视频| 国产精品嫩草影院一区二区| 亚洲黄色尤物视频| 欧美一区二区三区在线观看 | 夜夜嗨av一区二区三区网站四季av | 久久精品国产亚洲5555| 欧美日本免费| 亚洲欧洲一区二区天堂久久 | 久久久久综合网| 欧美午夜在线视频| 亚洲精品一二| 亚洲三级免费观看| 欧美激情1区2区3区| 影音欧美亚洲| 蜜臀va亚洲va欧美va天堂| 亚洲欧美综合另类中字| 国产精品久久一区主播| 制服诱惑一区二区| 一区二区av在线| 欧美视频三区在线播放| 亚洲性图久久| 一区二区三区欧美在线| 欧美三级乱码| 久久精品国产精品亚洲综合| 亚洲网址在线| 在线播放一区| 亚洲精品1区2区| 欧美日韩在线视频观看| 性做久久久久久免费观看欧美| 亚洲一区三区电影在线观看| 国产欧美韩国高清| 另类天堂视频在线观看| 欧美精品一区二区三| 亚洲一区二区在线看| 欧美一区视频在线| 99成人在线| 欧美在线不卡视频| 夜夜躁日日躁狠狠久久88av| 一区二区三区高清不卡| 狠狠色噜噜狠狠色综合久| 欧美激情一区二区三区在线视频观看| 欧美日韩八区| 欧美成人一区二区三区在线观看| 欧美成人蜜桃| 裸体一区二区| 国产精品一区二区a| 亚洲国产清纯| 在线日本成人| 欧美高清在线精品一区| 欧美日韩高清在线观看| 久热国产精品视频| 国产麻豆精品久久一二三| 欧美精品二区| 久久免费99精品久久久久久| 欧美午夜久久| 99精品免费网| 亚洲五月六月| 欧美色图一区二区三区| 欧美激情第六页| 亚洲成色777777女色窝| 久久精品av麻豆的观看方式| 欧美一区二区三区四区视频 | 国产精品久久久久久影视| 美女尤物久久精品| 亚洲黄色片网站| 蜜月aⅴ免费一区二区三区| 久久综合久久综合久久综合| 国产一区二区日韩精品| 香港久久久电影| 久久国产精品72免费观看| 国产精品一区二区久久久| 欧美一区二区在线免费观看| 久久久久五月天| 亚洲激情六月丁香| 欧美三级电影网| 欧美在线观看天堂一区二区三区| 久久精品三级| 日韩视频在线免费观看| 欧美日韩亚洲一区二区三区在线 | 亚洲第一天堂无码专区| 男人的天堂亚洲| 99精品欧美一区二区三区| 午夜欧美视频| 精品成人久久| 欧美gay视频| 亚洲欧美一区二区三区极速播放 | 91久久精品国产| 国产精品激情电影| 久久久欧美精品sm网站| 中文欧美日韩| 一区二区亚洲精品| 欧美日韩福利| 老鸭窝毛片一区二区三区| 亚洲在线观看视频网站| 亚洲国产日日夜夜| 免费亚洲网站| 久久精品综合一区| 亚洲伊人伊色伊影伊综合网| 精品成人国产| 国内精品久久久久久 | 亚洲影院在线| 91久久久在线| 最新亚洲视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 日韩亚洲欧美高清| 欧美成人精品激情在线观看| 久久久久成人精品免费播放动漫| 日韩亚洲欧美精品| 亚洲免费观看在线观看| 亚洲高清视频在线观看| 在线视频国产日韩| 亚洲韩国青草视频| 亚洲毛片av在线| 亚洲美女av黄| 亚洲中午字幕| 欧美一级理论片| 久久久久久久91| 欧美激情在线| 一道本一区二区| 欧美亚洲一区二区在线| 欧美一级大片在线免费观看| 久久精品日产第一区二区| 久久久久一区二区| 欧美高清成人| 国产精品久久一区二区三区| 国产麻豆日韩欧美久久| 在线观看国产精品网站| 亚洲人成啪啪网站| 亚洲小说春色综合另类电影| 午夜在线视频观看日韩17c| 欧美一区二区三区久久精品茉莉花| 久久九九热免费视频| 欧美77777| 亚洲欧美日本国产专区一区| 久久免费视频在线观看| 欧美精品一区在线播放| 国产视频在线一区二区| 欧美日韩久久精品| 精品9999| 久久精品国产欧美亚洲人人爽|