• <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>
            Cpper
            C/C++高級工程師 Android高級軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語言 程序猿

            給BGE加上了富文本顯示功能
            相關代碼如下:
            void GLTextRenderer::render(const Color& color,const String& string,const FloatRect& area,bool isMultiLine,
                    Horizontal hAlignment,Vertical vAlignment,
            bool rich)
            {
                
            if(typeFace_ != 0 && !rich)
                {
                    typeFace_
            ->setColor(color);
                    
            if(isMultiLine)
                    {
                        renderMultiline(color,
            string,area,hAlignment);
                    }
                    
            else
                    {
                        Vector2f position(typeFace_
            ->penX(string,area,hAlignment),baseLineY(area,vAlignment));
                        typeFace_
            ->render(string,position);
                    }
                }
                
            else if(typeFace_)
                {
                    
            if(!isMultiLine)
                    {
                        auto cmdlist 
            = parseString(string);
                        Vector2f position(typeFace_
            ->penX(string,area,hAlignment),baseLineY(area,vAlignment));
                        typeFace_
            ->render(String(),position,cmdlist);
                    }
                    
            else
                    {
                        auto cmdlist 
            = parseString(string);
                        renderMultiline(color,cmdlist,area,hAlignment);
                    }
                }
            }
            這里的parseString用于解析類似html的問題
            函數實現如下:
            std::list<textRenderCmdUnit> TextRenderer::parseString(const String& content)
            {
                String text(content);
                std::list
            <textRenderCmdUnit> cmdList;

                String current;
                auto list 
            = text.split('<');
                
            for(int i=0;i<list.size();i++)
                {
                    current 
            = list[i];
                    
            if(current.startWith(L"/>"))
                    {
                        textRenderCmdUnit unit;
                        unit.undo 
            = true;
                        cmdList.push_back(unit);

                        String remain 
            = current.substr(2);
                        
            if(!remain.empty())
                        {
                            unit.text 
            = remain;
                            unit.undo 
            = false;
                            cmdList.push_back(unit);
                        }
                    }
                    
            else if(current.find('>'!= String::InvalidPos)
                    {
                        textRenderCmdUnit unit;
                        unit.tag 
            = current.substr(0,current.find('>'));
                        unit.undo 
            = false;
                        cmdList.push_back(unit);

                        int32_t find 
            = current.find('>');
                        
            if(find < current.size()-1)
                        {
                            unit.tag.clear();
                            unit.text 
            = current.substr(find+1);
                            cmdList.push_back(unit);
                        }
                    }
                    
            else
                    {
                        textRenderCmdUnit unit;
                        unit.text 
            = current;
                        unit.undo 
            = false;
                        cmdList.push_back(unit);
                    }
                }

                
            return cmdList;
            }
            以下用于渲染富文本

            void TypeFace::render(const FloatRect& area,const std::list<textRenderCmdUnit>& queue,Horizontal hAlignment,float vpos)
            {
                
            const float availableWidth = area.width_ - 2.0f;

                textRenderCmdUnit unit;

                String line,lineRemain;

                String tag;
                std::queue
            <String> cmdStack;

                
            float y = vpos;
                
            float x = penX(String(),area,hAlignment);

                auto itr 
            = queue.begin();
                
            while(itr != queue.end())
                {
                    unit 
            = *itr;
                    
            if(unit.undo)
                    {
                        
            if(!cmdStack.empty())
                        {
                            tag 
            = cmdStack.front();
                            cmdStack.pop();

                            
            if(tag == "bold")
                                bold_ 
            = false;
                            
            else if(tag == "italic")
                                italic_ 
            = false;
                            
            else if(tag == "underline")
                                underline_ 
            = false;
                            
            else
                                applyColor(tag);
                        }
                    }
                    
            else if(!unit.tag.empty())
                    {
                        tag 
            = unit.tag;
                        cmdStack.push(tag);

                        
            if(tag == "bold")
                            bold_ 
            = true;
                        
            else if(tag == "italic")
                            italic_ 
            = true;
                        
            else if(tag == "underline")
                            underline_ 
            = true;
                        
            else
                            applyColor(tag);
                    }
                    
            else
                    {
                        line 
            += unit.text;

                        
            while(true)
                        {
                            size_t pos 
            = hitCharacterIndex(line,availableWidth-x);
                            
            if(pos == 0)
                            {
                                x 
            = penX(String(),area,hAlignment);
                                y 
            += lineHeight();
                                
            continue;
                            }

                            
            if(pos == String::InvalidPos)
                                pos 
            = line.size();

                            String current 
            = line.substr(0,pos);
                            lineRemain 
            = line.substr(pos);
                            line 
            = current;

                            auto linefeed 
            = line.get().find_first_of('\n');
                            
            if(linefeed != std::basic_string<uint32_t>::npos)
                            {
                                line 
            = line.substr(0,linefeed);
                                lineRemain 
            = line.substr(linefeed+1+ lineRemain;
                            }

                            render(line,Vector2f(x,y),std::list
            <textRenderCmdUnit>());
                            x 
            += width(line);

                            
            if(linefeed != String::InvalidPos)
                            {
                                x 
            = penX(String(),area,hAlignment);
                                y 
            += lineHeight();
                            }
                            line 
            = lineRemain;

                            
            if(lineRemain.empty())
                                
            break;
                        }
                    }
                    itr 
            ++;
                }
            }
            以下渲染單色文本
            void TypeFace::renderGlyphs(const std::list<textRenderCmdUnit>& cmd)
            {
                Vector2f position(
            0.0f,0.0f);
                size_t leftChar 
            = 0;

                textRenderCmdUnit unit;

                String tag;
                std::queue
            <String> cmdStack;

                std::list
            <textRenderCmdUnit>::const_iterator itr = cmd.begin();
                
            while(itr != cmd.end())
                {
                    unit 
            = *itr;
                    
            if(unit.tag.empty() && !unit.undo)
                    {
                        position 
            = renderGlyphs(unit.text,position);
                    }
                    
            else if(!unit.tag.empty())
                    {
                        tag 
            = unit.tag;
                        cmdStack.push(tag);

                        
            if(tag == "bold")
                            bold_ 
            = true;
                        
            else if(tag == "italic")
                            italic_ 
            = true;
                        
            else if(tag == "underline")
                            underline_ 
            = true;
                        
            else
                            applyColor(tag);
                    }
                    
            else if(unit.undo)
                    {
                        
            if(!cmdStack.empty())
                        {
                            tag 
            = cmdStack.front();
                            cmdStack.pop();

                            
            if(tag == "bold")
                                bold_ 
            = false;
                            
            else if(tag == "italic")
                                italic_ 
            = false;
                            
            else if(tag == "underline")
                                underline_ 
            = false;
                            
            else
                                applyColor(tag);
                        }
                    }

                    itr 
            ++;
                }
            }
            可以看出 支持的文本格式為<Tag>Text</>
            一個例子是:
            <Blue>這段代碼主要測試BGE的富文本顯示功能\n</Blue><Red>需要指出的是當前只要能支持多行顯示和多顏色顯示功能即可(不考慮下劃線斜體以及加粗顯示)。</Red><White>這句話將被顯示為白色</><Blue>這句話應該被藍色字體</Blue><Green>綠色字體</><Cyan>Cyan色</>";
            最終顯示如下:
            posted @ 2016-02-22 17:46 ccsdu2009 閱讀(774) | 評論 (0)編輯 收藏
             
            解釋:
            GraphicsItem 重載 mousePressEvent(QGraphicsSceneMouseEvent* event)后處理完之后需要執行event->accpet().
            posted @ 2016-02-05 09:18 ccsdu2009 閱讀(1314) | 評論 (0)編輯 收藏
             
            推薦一款開源庫glc
            glc是一款基于Qt和opengl的3D仿真程序,可以是用來渲染3ds,obj,stl等模型以及常見幾何體對象
            支持對象拾取等功能
            學習了一天感覺基本還行.
            主頁:http://www.glc-lib.net/
            posted @ 2016-01-29 17:11 ccsdu2009 閱讀(699) | 評論 (0)編輯 收藏
             
            算是基本完成了,先上一個截圖


            可以說GUI所需要的當前基本都是實現了

            再上一個使用例子:
            #include <BGE/All>

            using namespace bge;

            int main(int argc, char* argv[])
            {
                FileSystem::instance().initial(argv[0]);
                FileSystem::instance().setResourcePackage("data.zip");
                WindowManager::instance().initialize("simkai.ttf",true);

                Device* device = Device::create();
                device->initial();
                device->createWindow(640,480,bge::String("BGE Window"));

                WindowManager::instance().propertyScheme()->load(":skin1.xml");

                Window* window = WindowManager::instance().createWindow(":grid-layout-window.xml");
                WindowManager::instance().addWindow(window);

                while(device->isRunning())
                {
                    device->preRender();
                    WindowManager::instance().update();
                    device->swapBuffers();
                    device->pollEvents();
                }

                WindowManager::instance().terminate();
                device->closeWindow();
                device->terminate();
                device->deleteLater();
                return 0;
            }

            個人感覺寫的還是比較清晰,沒什么需要特別說明的
            使用的開源庫有libpng,glfw,freetype,sigslot,physfs
            不過代碼有點大,有興趣的可以留個郵箱

            posted @ 2016-01-22 15:41 ccsdu2009 閱讀(4114) | 評論 (10)編輯 收藏
             
            先上一個使用例子
            #include <BGE/All>

            using namespace bge;

            Window
            * createButton(const std::string& name,const String& text)
            {
                Button
            * button = new Button(0,text);
                button
            ->setName(name);
                button
            ->setSize(Vector2f(92,42));
                
            return button;
            }

            int main(int argc, char* argv[])
            {
                FileSystem::instance().initial(argv[
            0]);
                FileSystem::instance().setResourcePackage(
            "data.zip");
                WindowManager::instance().initialize(
            "simkai.ttf",false);

                Device
            * device = Device::create();
                device
            ->initial();
                device
            ->createWindow(640,480,bge::String("BGE Window"));

                Panel
            * panel = new Panel(FloatRect(30,30,192,180),0);
                GridLayout
            * layout = new GridLayout();
                panel
            ->setLayout(layout);
                std::vector
            <float> widths;
                widths.push_back(
            0.0f);
                layout
            ->setColumnWidths(widths);

                std::vector
            <float> heights;
                
            for(int k = 0; k < 3++k)
                    heights.push_back(
            48.0f);
                heights.push_back(
            0.0f);
                layout
            ->setRowHeights(heights);

                GridCellInfo info;
                info.columnIndex_ 
            = 0; info.rowIndex_ = 0; layout->addWindow(createButton("button1",L"按鍵"),info);
                info.columnIndex_ 
            = 1; info.rowIndex_ = 0; layout->addWindow(createButton("button2",L"按鍵"),info);
                info.columnIndex_ 
            = 0; info.rowIndex_ = 1; layout->addWindow(createButton("button3",L"按鍵"),info);
                info.columnIndex_ 
            = 1; info.rowIndex_ = 1; layout->addWindow(createButton("button4",L"按鍵"),info);
                info.columnIndex_ 
            = 0;
                info.rowIndex_ 
            = 2;
                info.horizontalSpan_ 
            = 2;
                Window
            * edit = new EditField(NULL,L"Edit Text");
                edit
            ->setSize(Vector2f(196,36));
                layout
            ->addWindow(edit,info);
                info.columnIndex_ 
            = 0;
                info.rowIndex_ 
            = 3;
                info.horizontalSpan_ 
            = 3;
                layout
            ->arrangeWithin();

                FrameWindow
            * window = new FrameWindow();
                window
            ->enableMovement();
                window
            ->setText(L"BGE窗體");
                window
            ->setClientPanel(panel);

                WindowManager::instance().addWindow(window);

                
            while(device->isRunning())
                {
                    device
            ->preRender();
                    WindowManager::instance().update();
                    device
            ->swapBuffers();
                    device
            ->pollEvents();
                }

                WindowManager::instance().terminate();
                device
            ->closeWindow();
                device
            ->terminate();
                device
            ->deleteLater();
                
            return 0;
            }

            在開發上參考了Qt等軟件,當前支持常見控件 支持控件序列化 整體換膚 控件換膚
            上面的代碼顯示的截圖如下:
            http://images2015.cnblogs.com/blog/676118/201601/676118-20160120092402484-466039328.png
            不過當前還有一點小問題 修改完了再上代碼
            做這個不為什么 就是幾年前一直想做個
            posted @ 2016-01-20 09:34 ccsdu2009 閱讀(2041) | 評論 (3)編輯 收藏
             
            #include <BGE/all>

            using namespace bge;

            int main(int argc,char* argv[])
            {
                
            //!初始化文件系統
                FileSystem::instance()->initial(argv[0]);
                
            //!加載壓縮包
                FileSystem::instance()->setResourcePackage("data.zip");
                
            //!初始化UI管理器,設定默認字體,并設定自動刪除控件
                WindowManager::instance().initialize("simkai.ttf",true);

                
            //!生成和初始化窗口設備
                Device* device = bgeCreateDevice();
                device
            ->initial();
                device
            ->createWindow(640,480,bge::String("BGE Window"));
                
                
            //!從資源文件加載控件包含子控件和控件屬性
                Window* window = WindowManager::instance().create("window.xml");
                bge::WindowManager::instance().addWindow(listbox);

                
            while(device->isRunning())
                {
                    
            //!預渲染設備
                    device->perRender();
                    
            //!窗體更新
                    bge::WindowManager::instance().update();
                    
                    device
            ->swapBuffers();
                    device
            ->pollEvents();
                }

                
            //!銷毀窗體管理器
                bge::WindowManager::instance().terminate();
                
            //!關閉并銷毀設備
                device->closeWindow();
                device
            ->terminate();
                device
            ->deleteLater();

                system(
            "pause");
                
            return 0;
            }

            還沒做完,用法如上,很簡練吧:D

            什么?對整體視效不滿意?
            試下這個:
            WindowManager::instance().propertyScheme()->load("skin.xml");
            想定制某個控件的視效?
            Button* button = window->findChild("ok");
            button->loadAppearance("button.xml","blue");

            posted @ 2016-01-07 16:20 ccsdu2009 閱讀(767) | 評論 (0)編輯 收藏
             
            libpng比較另類,解碼方式比較奇特,這里記錄下
            以下代碼為使用虛擬IOReader的方式,稍做修改就基于FILE使用
            代碼很詳細,不需額外解釋
            PNGImage::PNGImage(const std::string& filename):
                ReferenceCountedImage(filename),
                data_(
            0)
            {
                IOReader
            * reader = FileSystem::instance()->readFile(filename);
                
            if(reader == 0)
                    
            return;

                png_structp png_ptr 
            = png_create_read_struct(PNG_LIBPNG_VER_STRING, 000);
                
            if(png_ptr == 0)
                {
                    reader
            ->close();
                    reader
            ->deleteLater();
                }

                png_infop info_ptr 
            = png_create_info_struct(png_ptr);
                
            if(info_ptr == 0)
                {
                    png_destroy_read_struct(
            &png_ptr, png_infopp(0), png_infopp(0));
                    reader
            ->close();
                    reader
            ->deleteLater();
                }

                
            if(setjmp(png_jmpbuf(png_ptr)))
                {
                    png_destroy_read_struct(
            &png_ptr,png_infopp(0),png_infopp(0));
                    reader
            ->close();
                    reader
            ->deleteLater();
                }

                png_set_read_fn( png_ptr,reader,(png_rw_ptr)user_read_data);

                png_set_sig_bytes(png_ptr,
            0);

                png_read_png(png_ptr,info_ptr,PNG_TRANSFORM_IDENTITY,
            0);
                
            const unsigned int width = png_get_image_width(png_ptr,info_ptr);
                
            const unsigned int height = png_get_image_height(png_ptr,info_ptr);
                
            const unsigned int bit_depth = png_get_bit_depth(png_ptr,info_ptr);
                
            if(bit_depth != 8)
                {
                    reader
            ->close();
                    reader
            ->deleteLater();
                    png_destroy_info_struct(png_ptr,png_infopp(
            &info_ptr));
                    png_destroy_read_struct(
            &png_ptr,png_infopp(0), png_infopp(0));
                }

                
            const png_byte colorType = png_get_color_type(png_ptr, info_ptr);
                
            if((colorType != PNG_COLOR_TYPE_RGB) && (colorType != PNG_COLOR_TYPE_RGB_ALPHA))
                {
                    reader
            ->close();
                    reader
            ->deleteLater();
                    png_destroy_info_struct(png_ptr, png_infopp(
            &info_ptr));
                    png_destroy_read_struct(
            &png_ptr, png_infopp(0), png_infopp(0));
                }

                
            const int bytesPerPixel = (colorType == PNG_COLOR_TYPE_RGB) ? 3 : 4;
                
            const int stride = bytesPerPixel * width;

                unsigned 
            char* data = new unsigned char[stride * height];
                png_bytep
            * row_pointers = png_get_rows(png_ptr, info_ptr);
                
            for(unsigned int i = 0; i < height; ++i)
                {
                    
            const unsigned int row = height - i - 1;
                    memcpy(data 
            + (row * stride), row_pointers[i], stride);
                }

                size_.x_ 
            = width;
                size_.y_ 
            = height;
                numberOfBitsPerPixel_ 
            = bytesPerPixel * 8;
                data_ 
            = data;

                reader
            ->close();
                reader
            ->deleteLater();
                png_destroy_info_struct(png_ptr, png_infopp(
            &info_ptr));
                png_destroy_read_struct(
            &png_ptr, png_infopp(0), png_infopp(0));
            }
            posted @ 2015-12-29 11:12 ccsdu2009 閱讀(3836) | 評論 (0)編輯 收藏
             
            代碼如下:
            class ArrowItem : public QGraphicsItem
            {
            public:
                
            const static float LINE_WIDTH;
                
            const static float ARROW_SIZE;
            public:
                ArrowItem(QGraphicsItem
            * parent = 0);
                
            ~ArrowItem();
                
            void setData(const QPointF& from,const QRectF& rect);
            public:
                QRectF boundingRect()
            const;
                
            void paint(QPainter* painter,const QStyleOptionGraphicsItem* style,QWidget* widget);
            private:
                QPointF computeTo(
            const QPointF& from,const QRectF& to);
            private:
                
            bool mValid;
                QPointF mFrom;
                QPointF mTo;
                QPointF mP1;
                QPointF mP2;
                QRectF  mRect;
            };

            const float ArrowItem::LINE_WIDTH = 1.5f;
            const float ArrowItem::ARROW_SIZE = 8.0f;

            ArrowItem::ArrowItem(QGraphicsItem
            * parent):
            QGraphicsItem(parent),
            mValid(
            false)
            {
            }

            ArrowItem::
            ~ArrowItem()
            {
            }

            QPointF ArrowItem::computeTo(
            const QPointF& from,const QRectF& to)
            {
                QPointF center(to.center());
                QPointF top(center.x(),to.top());
                QPointF right(to.right(),center.y());
                QPointF bottom(center.x(),to.bottom());
                QPointF left(to.left(),center.y());

                
            //left
                if(from.x() < to.left())
                {
                    
            if(from.y() < to.top())
                    {
                        QLineF line1(from,top);
                        QLineF line2(from,left);
                        
            return line1.length() > line2.length() ? left : top;
                    }
                    
            else if(from.y() > to.bottom())
                    {
                        QLineF line1(from,left);
                        QLineF line2(from,bottom);
                        
            return line1.length() > line2.length() ? bottom : left;
                    }
                    
            return left;
                }
                
            //right
                if(from.x() > to.right())
                {
                    
            if(from.y() < to.top())
                    {
                        QLineF line1(from,top);
                        QLineF line2(from,right);
                        
            return line1.length() > line2.length() ? right : top;
                    }
                    
            else if(from.y() > to.bottom())
                    {
                        QLineF line1(from,bottom);
                        QLineF line2(from,right);
                        
            return line1.length() > line2.length() ? right : bottom;
                    }
                    
            return right;
                }

                
            if(from.y() < to.top())
                    
            return top;
                
            else if(from.y() > to.bottom())
                    
            return bottom;

                Q_ASSERT(
            0);
                
            return QPointF();
            }

            void ArrowItem::setData(const QPointF& from,const QRectF& rect)
            {
                mValid 
            = true;
                mFrom 
            = from;
                mRect 
            = rect;

                
            if(rect.contains(from))
                {
                    mValid 
            = false;
                    
            return;
                }

                mTo 
            = computeTo(mFrom,mRect);

                QLineF line(mFrom,mTo);
                qreal angle 
            = ::acos(line.dx()/line.length());

                
            if(line.dy() >= 0)
                    angle 
            = 3.14159*2 - angle;

                mP1 
            = mTo + QPointF(sin(angle-PI/3)*ARROW_SIZE,cos(angle-PI/3)*ARROW_SIZE);
                mP2 
            = mTo + QPointF(sin(angle-PI+PI/3)*ARROW_SIZE,cos(angle-PI+PI/3)*ARROW_SIZE);
            }

            QRectF ArrowItem::boundingRect()
            const
            {
                qreal extra 
            = (LINE_WIDTH + ARROW_SIZE)/2.0;
                QRectF rect
            = QRectF(mFrom,QSizeF(mTo.x()-mFrom.x(),mTo.y()-mFrom.y())).normalized().
                    adjusted(
            -extra,-extra,extra,extra);
                
            return rect;
            }

            void ArrowItem::paint(QPainter* painter,const QStyleOptionGraphicsItem* style,QWidget* widget)
            {
                
            if(!mValid)
                    
            return;
                painter
            ->setRenderHint(QPainter::Antialiasing);
                QPen p(QColor::fromRgb(
            79,136,187));
                painter
            ->setBrush(QBrush(p.color()));
                p.setWidthF(LINE_WIDTH);
                painter
            ->setPen(p);
                painter
            ->drawLine(mFrom,mTo);
                painter
            ->drawPolygon(QPolygonF()<<mTo<<mP1<<mP2);
            }

            void ArrowItem::setData(const QPointF& from,const QRectF& rect)
            該函數第一個參數為箭頭起點,rect為箭頭指向的矩形框,該函數會自動計算箭頭終點和箭頭相關參數
            該代碼經過測試 - 完全可以使用
            參考:
            http://www.cnblogs.com/liulun/p/3833006.html
            posted @ 2015-12-15 13:10 ccsdu2009 閱讀(9864) | 評論 (0)編輯 收藏
             
                QFont font;
                font.setPointSize(
            15);
                
                
            for(int i=0;i<15;i++)
                {
                    
            for(int j=0;j<18;j++)
                    {
                        QPointF p(
            -2400+20+(RECT_WIDTH+30)*i,-1500+20+(RECT_HEIGHT+30)*j);
                        QGraphicsRectItem
            * item = new QGraphicsRectItem(p.x(),p.y(),RECT_WIDTH,RECT_HEIGHT);
                        item
            ->setToolTip("click me");
                        item
            ->setBrush(QColor(79,136,187,255));
                        scene
            ->addItem(item);

                        QGraphicsTextItem
            * text = new QGraphicsTextItem(item);
                        text
            ->setPlainText(QString("%1,%2").arg(i).arg(j));
                        QRectF rect 
            = text->boundingRect();
                        text
            ->setDefaultTextColor(QColor(255,255,255));
                        p.setX(p.x() 
            + RECT_WIDTH/2 - rect.width()/2);
                        text
            ->setPos(p);
                        text
            ->setFont(font);
                    }
                }
            按照經驗以為
            QGraphicsRectItem會有setText接口,之后覺得應該定制一個QGraphicsItem
            搜了下原來
            QGraphicsRectItem是樹狀結構可以增加子項
            因此就好辦多了,代碼如上
            posted @ 2015-12-10 17:12 ccsdu2009 閱讀(2975) | 評論 (0)編輯 收藏
             
            更新不多,主要是取消了插接結構,把所有的編解碼和音效都合入了主庫
            dll合計不超過1M

            支持常見音頻格式和音效,使用超級方便
            下載在這里:/Files/gaimor/gaudio-sdk-2.2.1.0.zip
            posted @ 2015-12-10 16:37 ccsdu2009 閱讀(483) | 評論 (0)編輯 收藏
            僅列出標題
            共38頁: First 4 5 6 7 8 9 10 11 12 Last 
             
            一级做a爰片久久毛片毛片| 久久久久久国产a免费观看不卡| 欧美日韩中文字幕久久久不卡 | 99久久精品国产一区二区三区| 久久久久se色偷偷亚洲精品av | 久久久久99精品成人片三人毛片| 精品久久无码中文字幕| 久久久久无码精品国产不卡| 久久国语露脸国产精品电影| 伊人久久无码精品中文字幕| 亚洲伊人久久综合影院| 久久只这里是精品66| 久久亚洲国产成人影院网站| 欧洲国产伦久久久久久久| 欧美亚洲另类久久综合婷婷| 亚洲а∨天堂久久精品| 久久久久这里只有精品| 亚洲Av无码国产情品久久| 欧美伊人久久大香线蕉综合| 久久人人爽人人人人片av| 成人久久免费网站| 精品久久久久久久无码| 久久91精品国产91久久麻豆| 久久久91精品国产一区二区三区 | 免费精品久久天干天干| 久久久久久国产精品美女| 久久综合国产乱子伦精品免费| 99精品久久精品| 久久亚洲国产欧洲精品一| 久久久艹| 久久亚洲AV成人无码国产 | 久久中文娱乐网| 久久久中文字幕日本| 久久久无码精品亚洲日韩京东传媒 | 久久99国产综合精品| 狠狠人妻久久久久久综合蜜桃| 欧美色综合久久久久久| 日产精品久久久久久久| 91久久精品视频| 久久人妻无码中文字幕| 国产精品福利一区二区久久|