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

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

FreeType in OpenCASCADE

Posted on 2017-10-22 21:18 eryar 閱讀(2387) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

FreeType in OpenCASCADE

eryar@163.com

Abstract. FreeType is required for text display in the 3D viewer. FreeType is a software font engine that is designed to be small, efficient, highly customizable, and portable while capable of producing high-quality output(glyph images). It can be used in graphics libraries, display servers, font conversion tools, text image generation tools, and many other products as well. The blog is focus on the FreeType usage in OpenCASCADE to convert text to BRep shape.

Key Words. FreeType, OpenCASCADE, Text, BRep

1.Introduction

FreeType 2被設(shè)計為一種占用空間小的、高效的、高度可定制的、并且可以產(chǎn)生可移植的高品質(zhì)輸出(符號圖像)??梢员挥迷谥T如圖像庫、展出服務(wù)器、字體轉(zhuǎn)換工具、圖像文字產(chǎn)生工具等多種其它產(chǎn)品上。

注意FreeType 2是一種字體服務(wù)而沒有提供為實現(xiàn)文字布局或圖形化處理這樣高階的功能使用的API(比如帶色文字渲染之類的)。然而,它提供一個簡單的、易用的并且統(tǒng)一的接口實現(xiàn)對多種字體文件的訪問,從而大大簡化了這些高級的任務(wù)。

FreeType 2的發(fā)行遵循兩個開源許可:我們自己的BSD樣式的FreeType License和GPL(通用公共許可證)。它可以被用在任何程序中,無論是專有與否。

在常見的圖形庫中,如OpenSceneGraph, OpenCASCADE, HOOPS, Qt,等涉及到文字處理的,都會用到FreeType. 在一些游戲開發(fā)中,也會用到FreeType.本文主要對FreeType的用法作簡單介紹,這樣對FreeType有個直觀認識。然后再介紹FreeType對文字輪廓的表示方法,及如何生成三維文字。

在OpenCASCADE中文字可以二維的方式顯示,也可以三維的方式顯示,三維方式可以有線框和渲染模式,如下圖所示:

wps_clip_image-5702

Figure 1. 2D Text in Length Dimension

wps_clip_image-18777

Figure 2. 3D Wireframe Text in Dimension

wps_clip_image-31985

Figure 3. 3D Shading Text in Dimension

2.FreeType Usage

在FreeType的官網(wǎng)上有詳細的教程說明FreeType的用法,網(wǎng)址為:https://www.freetype.org/freetype2/docs/tutorial/index.html

主要的步驟如下:

v 包含頭文件 Header Files;

v 庫的初始化 Library Initialization;

v 加載字體 Loading a Font Face;

v 訪問字體數(shù)據(jù) Accessing the Face Data;

v 設(shè)置當前像素大小 Setting the Current Pixel Size;

v 加載文字 Loading a Glyph Image;

v 簡單的顯示 Simple Text Rendering; 

下面代碼是上述過程的一個實現(xiàn),忽略了錯誤處理:

#include <ft2build.h>
#include FT_FREETYPE_H
#pragma comment(lib, "freetype.lib")
void test(void)
{
    FT_Face aFace = NULL;
    FT_Library aLibrary = NULL;
    // Library Initialization.
    FT_Init_FreeType(&aLibrary);
    // Loading a Font Face.
    FT_New_Face(aLibrary, "C:/Windows/Fonts/arial.ttf", 0, &aFace);
    // Setting the Current Pixel Size.
    FT_Set_Char_Size(
          aFace,    /* handle to face object           */
          0,       /* char_width in 1/64th of points  */
          16*64,   /* char_height in 1/64th of points */
          300,     /* horizontal device resolution    */
          300 );   /* vertical device resolution      */
    // Loading a Glyph Image
    // a. Converting a Character Code Into a Glyph Index
    FT_UInt aGlyphIndex = FT_Get_Char_Index( aFace, 'A' );
    // b. Loading a Glyph From the Face
    // Once you have a glyph index, you can load the corresponding glyph image.
    FT_Load_Glyph(
          aFace,            /* handle to face object */
          aGlyphIndex,      /* glyph index           */
          FT_LOAD_DEFAULT); /* load flags            */
    // Simple Text Rendering
    FT_GlyphSlot aGlyphSlot = aFace->glyph;
}
int main(int argc, char* argv[])
{
    test();
    return 0;
}

 

wps_clip_image-11299

調(diào)試程序可以看出Face中已經(jīng)有了一些數(shù)據(jù)。

3.FreeType Outlines

FreeType中的一個文字輪廓Outline是由二維空間閉合的線圍成。每一個輪廓線是由一系列的直線段和Bezier曲線組成。根據(jù)字體文件格式的不同,他們可能是二階或三階多項式。二階的通常稱為quadratic或conic弧,他們用于TrueType格式。三階的稱為cubic弧,通常用于PostScript Type1, CFF, 和CFF2格式中。詳細描述見:

https://www.freetype.org/freetype2/docs/glyphs/glyphs-6.html

Bezier曲線是B樣條曲線的一個特例,他的特點就是曲線的階數(shù)與控制點的個數(shù)相關(guān),即給定控制頂點就可以確定Bezier曲線。所以O(shè)penCASCADE中對于Bezier曲線有這樣的構(gòu)造函數(shù):

wps_clip_image-28489

每一段曲線弧都由起點start,終點end和控制頂點control points來描述。描述輪廓線的每個點都有一個特定的標記Tag來區(qū)別是線段還是Bezier曲線。

wps_clip_image-26515

wps_clip_image-23987

兩個連續(xù)的on點確定了線段的兩個端點;

在兩個on點之間的一個conic off點組成了一個conic Bezier曲線;

在兩個on點之間的兩個cubic off點組成了一個cubic Bezier曲線;

理解了上述內(nèi)容就可以得到文字的輪廓線了。OpenCASCADE中對輪廓線的處理代碼如下所示:

// =======================================================================
// function : renderGlyph
// purpose  :
// =======================================================================
Standard_Boolean Font_BRepFont::renderGlyph (const Standard_Utf32Char theChar,
                                             TopoDS_Shape&            theShape)
{
  theShape.Nullify();
  if (!loadGlyph (theChar)
   || myFTFace->glyph->format != FT_GLYPH_FORMAT_OUTLINE)
  {
    return Standard_False;
  }
  else if (myCache.Find (theChar, theShape))
  {
    return !theShape.IsNull();
  }
  FT_Outline& anOutline = myFTFace->glyph->outline;
  if (!anOutline.n_contours)
    return Standard_False;
  TopLoc_Location aLoc;
  TopoDS_Face aFaceDraft;
  myBuilder.MakeFace (aFaceDraft, mySurface, myPrecision);
  // Get orientation is useless since it doesn't retrieve any in-font information and just computes orientation.
  // Because it fails in some cases - leave this to ShapeFix.
  //const FT_Orientation anOrient = FT_Outline_Get_Orientation (&anOutline);
  for (short aContour = 0, aStartIndex = 0; aContour < anOutline.n_contours; ++aContour)
  {
    const FT_Vector* aPntList = &anOutline.points[aStartIndex];
    const char* aTags      = &anOutline.tags[aStartIndex];
    const short anEndIndex = anOutline.contours[aContour];
    const short aPntsNb    = (anEndIndex - aStartIndex) + 1;
    aStartIndex = anEndIndex + 1;
    if (aPntsNb < 3)
    {
      // closed contour can not be constructed from < 3 points
      continue;
    }
    BRepBuilderAPI_MakeWire aWireMaker;
    gp_XY aPntPrev;
    gp_XY aPntCurr = readFTVec (aPntList[aPntsNb - 1]);
    gp_XY aPntNext = readFTVec (aPntList[0]);
    Standard_Integer aLinePnts = (FT_CURVE_TAG(aTags[aPntsNb - 1]) == FT_Curve_Tag_On) ? 1 : 0;
    gp_XY aPntLine1 = aPntCurr;
    // see http://freetype.sourceforge.net/freetype2/docs/glyphs/glyphs-6.html
    // for a full description of FreeType tags.
    for (short aPntId = 0; aPntId < aPntsNb; ++aPntId)
    {
      aPntPrev = aPntCurr;
      aPntCurr = aPntNext;
      aPntNext = readFTVec (aPntList[(aPntId + 1) % aPntsNb]);
      // process tags
      if (FT_CURVE_TAG(aTags[aPntId]) == FT_Curve_Tag_On)
      {
        if (aLinePnts < 1)
        {
          aPntLine1 = aPntCurr;
          aLinePnts = 1;
          continue;
        }
        const gp_XY         aDirVec  = aPntCurr - aPntLine1;
        const Standard_Real aLen     = aDirVec.Modulus();
        if (aLen <= myPrecision)
        {
          aPntLine1 = aPntCurr;
          aLinePnts = 1;
          continue;
        }
        if (myIsCompositeCurve)
        {
          Handle(Geom2d_TrimmedCurve) aLine = GCE2d_MakeSegment (gp_Pnt2d (aPntLine1), gp_Pnt2d (aPntCurr));
          myConcatMaker.Add (aLine, myPrecision);
        }
        else
        {
          Handle(Geom_Curve)  aCurve3d;
          Handle(Geom2d_Line) aCurve2d = new Geom2d_Line (gp_Pnt2d (aPntLine1), gp_Dir2d (aDirVec));
          if (to3d (aCurve2d, GeomAbs_C1, aCurve3d))
          {
            TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d, 0.0, aLen);
            myBuilder.UpdateEdge (anEdge, aCurve2d, mySurface, aLoc, myPrecision);
            aWireMaker.Add (anEdge);
          }
        }
        aPntLine1 = aPntCurr;
      }
      else if (FT_CURVE_TAG(aTags[aPntId]) == FT_Curve_Tag_Conic)
      {
        aLinePnts = 0;
        gp_XY aPntPrev2 = aPntPrev;
        gp_XY aPntNext2 = aPntNext;
        // previous point is either the real previous point (an "on" point),
        // or the midpoint between the current one and the previous "conic off" point
        if (FT_CURVE_TAG(aTags[(aPntId - 1 + aPntsNb) % aPntsNb]) == FT_Curve_Tag_Conic)
        {
          aPntPrev2 = (aPntCurr + aPntPrev) * 0.5;
        }
        // next point is either the real next point or the midpoint
        if (FT_CURVE_TAG(aTags[(aPntId + 1) % aPntsNb]) == FT_Curve_Tag_Conic)
        {
          aPntNext2 = (aPntCurr + aPntNext) * 0.5;
        }
        my3Poles.SetValue (1, aPntPrev2);
        my3Poles.SetValue (2, aPntCurr);
        my3Poles.SetValue (3, aPntNext2);
        Handle(Geom2d_BezierCurve) aBezierArc = new Geom2d_BezierCurve (my3Poles);
        if (myIsCompositeCurve)
        {
          myConcatMaker.Add (aBezierArc, myPrecision);
        }
        else
        {
          Handle(Geom_Curve) aCurve3d;
          if (to3d (aBezierArc, GeomAbs_C1, aCurve3d))
          {
            TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d);
            myBuilder.UpdateEdge (anEdge, aBezierArc, mySurface, aLoc, myPrecision);
            aWireMaker.Add (anEdge);
          }
        }
      }
      else if (FT_CURVE_TAG(aTags[aPntId])                 == FT_Curve_Tag_Cubic
            && FT_CURVE_TAG(aTags[(aPntId + 1) % aPntsNb]) == FT_Curve_Tag_Cubic)
      {
        aLinePnts = 0;
        my4Poles.SetValue (1, aPntPrev);
        my4Poles.SetValue (2, aPntCurr);
        my4Poles.SetValue (3, aPntNext);
        my4Poles.SetValue (4, gp_Pnt2d(readFTVec (aPntList[(aPntId + 2) % aPntsNb])));
        Handle(Geom2d_BezierCurve) aBezier = new Geom2d_BezierCurve (my4Poles);
        if (myIsCompositeCurve)
        {
          myConcatMaker.Add (aBezier, myPrecision);
        }
        else
        {
          Handle(Geom_Curve) aCurve3d;
          if (to3d (aBezier, GeomAbs_C1, aCurve3d))
          {
            TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d);
            myBuilder.UpdateEdge (anEdge, aBezier, mySurface, aLoc, myPrecision);
            aWireMaker.Add (anEdge);
          }
        }
      }
    }
    if (myIsCompositeCurve)
    {
      Handle(Geom2d_BSplineCurve) aDraft2d = myConcatMaker.BSplineCurve();
      if (aDraft2d.IsNull())
      {
        continue;
      }
      const gp_Pnt2d aFirstPnt = aDraft2d->StartPoint();
      const gp_Pnt2d aLastPnt  = aDraft2d->EndPoint();
      if (!aFirstPnt.IsEqual (aLastPnt, myPrecision))
      {
        Handle(Geom2d_TrimmedCurve) aLine = GCE2d_MakeSegment (aLastPnt, aFirstPnt);
        myConcatMaker.Add (aLine, myPrecision);
      }
      Handle(Geom2d_BSplineCurve) aCurve2d = myConcatMaker.BSplineCurve();
      Handle(Geom_Curve)          aCurve3d;
      if (to3d (aCurve2d, GeomAbs_C0, aCurve3d))
      {
        TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d);
        myBuilder.UpdateEdge (anEdge, aCurve2d, mySurface, aLoc, myPrecision);
        aWireMaker.Add (anEdge);
      }
      myConcatMaker.Clear();
    }
    else
    {
      if (!aWireMaker.IsDone())
      {
        continue;
      }
      TopoDS_Vertex aFirstV, aLastV;
      TopExp::Vertices (aWireMaker.Wire(), aFirstV, aLastV);
      gp_Pnt aFirstPoint = BRep_Tool::Pnt (aFirstV);
      gp_Pnt aLastPoint  = BRep_Tool::Pnt (aLastV);
      if (!aFirstPoint.IsEqual (aLastPoint, myPrecision))
      {
        aWireMaker.Add (BRepLib_MakeEdge (aFirstV, aLastV));
      }
    }
    if (!aWireMaker.IsDone())
    {
      continue;
    }
    TopoDS_Wire aWireDraft = aWireMaker.Wire();
    //if (anOrient == FT_ORIENTATION_FILL_LEFT)
    //{
    // According to the TrueType specification, clockwise contours must be filled
    aWireDraft.Reverse();
    //}
    myBuilder.Add (aFaceDraft, aWireDraft);
  }
  myFixer.Init (aFaceDraft);
  myFixer.Perform();
  theShape = myFixer.Result();
  if (!theShape.IsNull()
  &&  theShape.ShapeType() != TopAbs_FACE)
  {
    // shape fix can not fix orientation within the single call
    TopoDS_Compound aComp;
    myBuilder.MakeCompound (aComp);
    for (TopExp_Explorer aFaceIter (theShape, TopAbs_FACE); aFaceIter.More(); aFaceIter.Next())
    {
      TopoDS_Face aFace = TopoDS::Face (aFaceIter.Current());
      myFixer.Init (aFace);
      myFixer.Perform();
      myBuilder.Add (aComp, myFixer.Result());
    }
    theShape = aComp;
  }
  myCache.Bind (theChar, theShape);
  return !theShape.IsNull();
}

 

4.Text 3D

在一些圖形庫中都可以生成三維文字,如下圖所示:

wps_clip_image-12745

理解了FreeType的用法后,實現(xiàn)上述功能也是很簡單的。這里簡要說明實現(xiàn)步驟:

l 使用FreeType得到文字的輪廓線;

l 將閉合的輪廓線生成Wire->Face;

l 將輪廓線生成的Face進行拉伸得到Solid體。

在OpenCASCADE中得到文字輪廓線生成的Face的類是:Font_BRepFont。下面給出示例得到指定文字的面。

#include <BRepTools.hxx>
#include <Font_BRepFont.hxx>
#include <Font_BRepTextBuilder.hxx>
#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKG2d.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKGeomBase.lib")
#pragma comment(lib, "TKGeomAlgo.lib")
#pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKTopAlgo.lib")
#pragma comment(lib, "TKService.lib")
void text2brep()
{
    Font_BRepFont aBrepFont("C:/Windows/Fonts/arial.ttf", 3.5);
    Font_BRepTextBuilder aTextBuilder;
    TopoDS_Shape aTextShape = aTextBuilder.Perform(aBrepFont, NCollection_String("eryar@163.com"));
    BRepTools::Dump(aTextShape, std::cout);
    BRepTools::Write(aTextShape, "d:/text.brep");
}
int main(int argc, char* argv[])
{
    text2brep();
    return 0;
}

在Draw Test Harness中顯示出文字的輪廓text.brep如下圖所示:

wps_clip_image-22486

如果要顯示出文字的填充效果,則需要有三角化工具將文字輪廓網(wǎng)格化。OpenCASCADE中將輪廓生成Wire->Face,即可以生成顯示數(shù)據(jù)了:

wps_clip_image-28082

5.Conclusion

FreeType的文字處理功能很強大,幾乎所有的三維造型內(nèi)核中文字的處理都是使用的FreeType。

FreeType的文字輪廓使用了線段和Bezier曲線來表達,Bezier曲線是B樣條曲線的特例。理解Bezier曲線就可以自己繪制文字輪廓了。

FreeType使用簡單,可以方便得到文字的輪廓數(shù)據(jù)。將輪廓數(shù)據(jù)生成Face即可以拉伸出三維文字效果。

6.References

1. https://www.freetype.org/freetype2/docs/tutorial/index.html

2. http://www.shnenglu.com/eryar/archive/2014/08/17/OpenCascade_Text_Rendering.html

3. https://www.freetype.org/freetype2/docs/glyphs/glyphs-6.html

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区视频在线| 亚洲激情二区| 欧美国产视频一区二区| 久久国产精品99久久久久久老狼| 欧美激情亚洲另类| 久久亚洲综合色| 国产女优一区| 亚洲男人av电影| 亚洲一区不卡| 欧美美女bb生活片| 亚洲高清久久久| 亚洲第一级黄色片| 久久黄金**| 久久aⅴ乱码一区二区三区| 欧美日韩伊人| 亚洲理论电影网| 夜夜嗨av色综合久久久综合网| 久久久久看片| 男女av一区三区二区色多| 国产情人综合久久777777| 一区二区三区波多野结衣在线观看| 最新成人av在线| 欧美国产一区视频在线观看| 免费久久99精品国产自| 好看不卡的中文字幕| 欧美亚洲免费电影| 久久九九免费视频| 国产亚洲精品久久久久久| 欧美亚洲三区| 欧美a级在线| 亚洲国产一区二区三区高清 | 亚洲大胆人体视频| 亚洲国产精品女人久久久| 美女主播一区| 亚洲欧洲精品一区| 亚洲性感美女99在线| 欧美性事免费在线观看| 一本色道久久加勒比88综合| 午夜精品久久久久久久白皮肤| 国产精品va在线| 欧美一区二区视频观看视频| 久久综合免费视频影院| 亚洲黑丝在线| 欧美日韩一区二区三区| 亚洲一区不卡| 乱人伦精品视频在线观看| 亚洲国产欧美一区二区三区同亚洲 | 亚洲品质自拍| 亚洲女同同性videoxma| 国产日韩精品久久久| 久久这里只有精品视频首页| 亚洲国产另类久久精品| 亚洲一区二区三区免费在线观看| 国产精品美女在线| 久久综合网hezyo| 99精品视频免费观看视频| 欧美中文字幕视频| 亚洲国产综合在线| 国产精品成人免费| 久久精品久久99精品久久| 亚洲福利视频在线| 欧美一二三视频| 亚洲国产日韩美| 国产精品夜夜夜一区二区三区尤| 久久精品一本| 一本色道久久综合精品竹菊| 久久精品日韩欧美| 一区二区三区 在线观看视频| 国产欧美一区二区三区久久人妖| 蜜臀久久久99精品久久久久久 | 亚洲欧洲另类国产综合| 久久精品国产清自在天天线| 日韩午夜高潮| 狠狠色丁香久久婷婷综合丁香 | 伊人色综合久久天天五月婷| 欧美久久一区| 久久精品亚洲一区| 亚洲视频每日更新| 亚洲国产成人久久综合一区| 久久经典综合| 亚洲一区视频在线观看视频| 亚洲国内自拍| 海角社区69精品视频| 国产精品午夜电影| 欧美日韩亚洲国产精品| 免费久久99精品国产| 亚洲欧美视频一区| 亚洲视频视频在线| 日韩视频在线观看| 亚洲区国产区| 亚洲黄色免费网站| 久久综合给合| 久久久精品动漫| 午夜精品久久久久99热蜜桃导演| 一本久道综合久久精品| 亚洲狠狠丁香婷婷综合久久久| 国产自产高清不卡| 国产日韩亚洲欧美| 国产欧美日韩在线播放| 国产精品免费区二区三区观看| 欧美日韩精品欧美日韩精品| 欧美大秀在线观看| 欧美高清视频一区二区三区在线观看| 久久精品国产一区二区电影| 亚洲欧美在线一区二区| 亚洲欧美日韩国产综合精品二区| 一本久道久久综合婷婷鲸鱼| 99精品欧美一区二区蜜桃免费| 日韩视频免费观看高清完整版| 亚洲国产精品福利| 91久久综合亚洲鲁鲁五月天| 亚洲黄色三级| 亚洲美女视频在线观看| 一区二区三区精品视频| 一区二区三区色| 亚洲专区在线视频| 久久爱另类一区二区小说| 久久精品国产免费观看| 久久久久久久精| 另类综合日韩欧美亚洲| 欧美成人中文字幕在线| 欧美日韩精品二区| 国产精品久久久久高潮| 国产三级欧美三级日产三级99| 国产一区二区三区在线观看精品| 伊人色综合久久天天| 亚洲精选中文字幕| 亚洲午夜精品视频| 久久高清国产| 亚洲国产高清在线观看视频| 亚洲美女一区| 欧美一区二区三区男人的天堂| 久久免费的精品国产v∧| 欧美v国产在线一区二区三区| 欧美日韩亚洲综合| 国产丝袜一区二区| 91久久精品一区| 亚洲综合不卡| 免费观看亚洲视频大全| 亚洲精品在线三区| 欧美一区二区三区播放老司机| 久久亚洲一区二区三区四区| 欧美日韩福利| 精久久久久久久久久久| 日韩午夜激情电影| 久久精品夜色噜噜亚洲aⅴ| 亚洲电影免费观看高清| 亚洲欧美日韩国产综合在线| 六月丁香综合| 国产欧美一区二区在线观看| 亚洲欧洲精品天堂一级| 性8sex亚洲区入口| 亚洲黄色成人| 久久国产精品一区二区三区四区| 欧美激情一区二区三区高清视频| 国产美女精品人人做人人爽| 9国产精品视频| 能在线观看的日韩av| 亚洲制服少妇| 欧美日本一道本| 亚洲第一精品久久忘忧草社区| 亚洲一区制服诱惑| 亚洲国产成人午夜在线一区| 亚洲自拍16p| 欧美日韩一级黄| 亚洲黄色一区| 麻豆免费精品视频| 午夜国产精品视频免费体验区| 欧美激情视频一区二区三区不卡| 国产一区视频观看| 午夜精品久久久久| 99亚洲一区二区| 欧美国产日韩一区| 亚洲激情网站免费观看| 免费成人黄色片| 欧美在线日韩在线| 国产日产亚洲精品| 欧美一级播放| 亚洲一区二区在| 欧美午夜激情小视频| 亚洲私人影院在线观看| 亚洲日本无吗高清不卡| 麻豆精品一区二区av白丝在线| 国产自产在线视频一区| 久久成人亚洲| 欧美一级大片在线观看| 国产精品二区影院| 亚洲免费视频一区二区| 一本久道久久综合中文字幕| 欧美精品性视频| 一本色道久久综合亚洲精品婷婷 | 久久久蜜桃一区二区人| 亚洲欧美中文字幕| 国产日韩一区二区| 久久国产精品毛片| 欧美在线啊v| 在线播放中文一区| 欧美华人在线视频| 欧美激情第一页xxx| 在线视频精品|