日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

microwindows位图解析

發(fā)布時間:2023/12/9 windows 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 microwindows位图解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

From: http://blog.csdn.net/bisword/article/details/2740054


1microwinodows圖形顯示框架


1.1 microwindows體系結(jié)構(gòu)

Microwindows 采用了分層結(jié)構(gòu)設(shè)計方法,其層次結(jié)構(gòu)如下圖所示。同時, 這里也列出 Microwindows 源代碼目錄樹下的主要目錄結(jié)構(gòu),以便于對照參考。

microwindows --bin

--Configs

nano-X /win32 API --demos

--drivers

engine --engine

色彩控制|blitting|區(qū)域剪裁|clipping|圖形繪制 microwindows-0.90 --fonts

--includes --lib

顯示驅(qū)動 | 鍵盤驅(qū)動 | 鼠標(biāo)/觸摸屏驅(qū)動 --mwin

--nanox


1 microwindows體系結(jié)構(gòu)

Microwindows 提 供 兩 種 類 型 的 API , 一 種 叫 Microwindows API,是與win32/WinCE GDI 相兼容的 API 接口,另一種叫 Nano-X API,是與 Linux 上著名的 X Window 相兼容的 API。實現(xiàn) Microwindows API 的程序放置在 mwin 目錄下,實現(xiàn) Nano-X API 的程序放置在 nanox 目錄下。

API層之下是設(shè)備無關(guān)的圖形引擎層,該層負責(zé)底層繪圖原語,實現(xiàn)各種圖形繪制, 各種圖像格式處理,字體處理等功能。該層的程序主要放置在 engine fonts 目錄下。

在最下層是設(shè)備驅(qū)動層,該層為各類設(shè)備提供驅(qū)動程序,目前包括顯示/觸摸屏,鼠標(biāo),鍵盤等設(shè)備的驅(qū)動程序,驅(qū)動層負責(zé)與物理設(shè)備進行交互通信,該層的程序都放置在 drivers 目錄下。

1.2 引擎層

1.2.1 引擎層剖析

圖形引擎層在 Microwindows 中起著承上啟下的作用,既對下層設(shè)備驅(qū)動的功能實行封裝,又為上層應(yīng)用編程接口 API 提供服務(wù),系統(tǒng)核心圖形繪制功能都是在該層實現(xiàn)的。由于我們這次我們主要講解的是關(guān)于圖像處理方面的知識,所以其他不相關(guān)的我們暫且不再涉及。以下我們從,圖形上下文,繪圖區(qū)域,裁剪,等方面介紹圖形引擎層的功能與實現(xiàn),并先列舉 engine 目錄下的關(guān)于圖像處理主要文件及其完成的功能以供參考:

Devdraw.c:主要的圖形繪制函數(shù),包括調(diào)色板操作,背景繪制,畫線,畫圓,多邊型與填充,位操作及圖形的放大和縮小等。

Devclip.c : 剪裁操作。

Devrgn.c :實現(xiàn)圖形的布爾操作。

Devpalx.c :處理 1,2,4,8 位調(diào)色板的映射。

Devpalgray4.c:處理 4 級灰度映射。

Devimage.c :處理對 GIP,BMP,JPEG,PPM,PNG,TIFF 等圖形格式的顯示操作。


Microwindows的中間層是圖形引擎層(也稱為設(shè)備與平臺無關(guān)層),圖形引擎層為應(yīng)用層提供了一系列的繪圖函數(shù),因為Microwindows系統(tǒng)中最核心的圖形函數(shù)是圖形引擎層通過調(diào)用下層的硬件設(shè)備驅(qū)動程序?qū)崿F(xiàn)的,所以該層與硬件無關(guān)。在microwindows的繪圖過程中用戶應(yīng)用程序通常不直接調(diào)用引擎層的繪圖函數(shù),而是通過調(diào)用最上層所提供的編程接口API,來實現(xiàn)圖像的繪制。這些繪制函數(shù)的命名遵循 GdXXX()的模式,第一個參數(shù)是 SCREENDEVICE 結(jié)構(gòu)的指針,device.h 中定義,描述了顯示器的底層特性,是顯示設(shè)備驅(qū)動程序的接口。SCREENDEVICE 結(jié)構(gòu)中包含了顯示設(shè)備的物理特性,比如橫向和縱向的大小,顯示模式,色彩,顯示內(nèi)存的大小等屬性,此外該結(jié)構(gòu)中也包含了各種和屏幕設(shè)備相關(guān)的操作的函數(shù)指針,所有的屏幕坐標(biāo)都是COORD類型的,以設(shè)備坐標(biāo)的方式指明,即對屏幕左上角的位移。顏色總是以RGB COLORVAL值的方式傳送給圖形引擎。他們可能在轉(zhuǎn)換為調(diào)色板的索引值后,作為PIXELVAL值被傳送給顯示硬件。在下面的底層驅(qū)動的章節(jié)中我會詳細介紹他們,下面我們對圖形引擎中的用到的概念進行解釋。


1.2.1.1 圖形上下文

Nano-X 中使用圖形上下文描述繪圖屬性。要在屏幕上繪圖,需要先調(diào)用GrNewGC()函數(shù)分配一個圖形上下文數(shù)據(jù)結(jié)構(gòu),然后返回數(shù)據(jù)結(jié)構(gòu)的 ID 值。圖形上下文實際上標(biāo)識了一個 GR_GC_INFO 結(jié)構(gòu)體,如下所示,這個結(jié)構(gòu)體包含了前景,背景,字體,繪圖模式和繪圖區(qū)域等信息,設(shè)置圖形上下文時使用函數(shù)進行操作,而不是對結(jié)構(gòu)體直接操作。


typedef struct {

GR_GC_ID gcid; /*圖形上下文ID */

int mode; /*繪畫模式*/

GR_REGION_ID region; /*繪畫區(qū)域*/

int xoff; /*x偏移量(以繪畫區(qū)域的左上角為參照)*/

int yoff; /*y偏移量*/

GR_FONT_ID font; /*字體大小設(shè)置*/

GR_COLOR foreground; /*前景色RGB值或像素值*/

GR_COLOR background; /* 背景色RGB值或像素值 */

GR_BOOL fgispixelval; /*如果前景色為像素值則定義為TRUE?*/

GR_BOOL bgispixelval; /* 如果背景色為像素值則定義為TRUE */

GR_BOOL usebackground; /*位圖作為背景 */

GR_BOOL exposure; /* GrCopyArea 發(fā)出顯示事件*/

} GR_GC_INFO;

1.2.1.2 繪圖區(qū)域

矩形區(qū)域被用來描述屏幕上點的集合。簡單的情況下,矩形區(qū)域可以使用一個長方形來描述,但是在復(fù)雜情況下可能要使用復(fù)雜的數(shù)據(jù)結(jié)構(gòu)描述。Microwindows 中繪圖區(qū)域使用互不重疊的矩形區(qū)域表示,因此對于一個不規(guī)則的凸邊形要使用多個不重疊的矩形拼和。


1.2.1.3裁剪

Microwindows 中裁剪和以上提及的繪圖區(qū)域有著密切的關(guān)系。任何時候, 圖形引擎都有一個繪圖區(qū)域,這個區(qū)域是由一系列的矩形組成的,所有對圖形的操作都是在這個區(qū)域進行。系統(tǒng)中實現(xiàn)裁剪有兩種方法,都使用了GdSetClipRects()函數(shù)將裁剪區(qū)域傳入圖形引擎, 此后所有的繪圖函數(shù)都要先判斷繪圖區(qū)域是否能被繪制,然后才進行繪制。


1.3底層驅(qū)動

人機交互系統(tǒng)必然都包含輸入/輸出設(shè)備,Microwindows 中控制的設(shè)備包括顯示器/屏輸出設(shè)備和鼠標(biāo)/鍵盤/觸摸屏等輸入設(shè)備。設(shè)備驅(qū)動程序的接口函數(shù)在 device.h 中定義,至少包含一個屏幕驅(qū)動程序,一個鼠標(biāo)驅(qū)動程序和一個鍵盤驅(qū)動程序。圖形引擎層能夠直接調(diào)用這些驅(qū)動程序進行相應(yīng)的硬件設(shè)備操作, 從而實現(xiàn)設(shè)備無關(guān)性, 使用這樣的層次結(jié)構(gòu)能保證添加其他的硬件設(shè)備時不影響整個系統(tǒng)的正常工作。


1.3.1屏幕驅(qū)動

microwindows屏幕驅(qū)動是基于Linux內(nèi)核中framebuffer,這要求在編譯內(nèi)核的時候選擇支持framebuffer編譯參數(shù)選項。它是通過fd=open(env="/dev/fb0")打開,用SCREENDEVICE的指針PSD指向這片顯存,然后對這片顯存根據(jù)屏幕的不同位色設(shè)置情況為中間引擎層提供相應(yīng)的圖形操作支持,包括畫點線、圖片顯示、屏幕拷貝以及中西文字的顯示等等。由于microwindows自身的特性他被被設(shè)計成能夠極其容易的向Microwindows中移植新硬件,因此必須提供一些訪問硬件的入口點,同時提供其他的函數(shù)保證只使用小部分的核心函數(shù)集就可以完成此任務(wù)。例如:屏幕驅(qū)動程序必須實現(xiàn)ReadPixel,DrawPixel,DrawHorzlineDrawVertLine。這些函數(shù)在顯存中讀取或?qū)懭胍粋€像素,或畫一條水平或垂直的線。位圖傳送允許Microwindows執(zhí)行屏幕外的作圖。Microwindows允許任何能在屏幕上進行的圖形操作在屏幕外進行,然后再將圖形傳送到物理顯存。下面我們就介紹顯示設(shè)備驅(qū)動使用的典型數(shù)據(jù)結(jié)構(gòu),參考該結(jié)構(gòu)可以幫助了解顯示設(shè)備的基本功能。


顯示驅(qū)動接口數(shù)據(jù)結(jié)構(gòu):

typedef struct _mwscreendevice {

MWCOORD xres; /* X screen res (real) */

MWCOORD yres; /* Y screen res (real) */

MWCOORD xvirtres; /* X drawing res (will be flipped in portrait mode) */

MWCOORD yvirtres; /* Y drawing res (will be flipped in portrait mode) */

int planes; /* # planes*/

int bpp; /* # bpp*/

int linelen; /* line length in bytes for bpp 1,2,4,8*/

/* line length in pixels for bpp 16, 24, 32*/

int size; /* size of memory allocated*/

long ncolors; /* # screen colors*/

int pixtype; /* format of pixel value*/

int flags; /* device flags*/

void * addr; /* address of memory allocated (memdc or fb)*/

PSD (*Open)(PSD psd);

void (*Close)(PSD psd);

void (*GetScreenInfo)(PSD psd,PMWSCREENINFO psi);

void (*SetPalette)(PSD psd,int first,int count,MWPALENTRY *pal);

void (*DrawPixel)(PSD psd,MWCOORD x,MWCOORD y,MWPIXELVAL c);

MWPIXELVAL (*ReadPixel)(PSD psd,MWCOORD x,MWCOORD y);

void (*DrawHorzLine)(PSD psd,MWCOORD x1,MWCOORD x2,MWCOORD y,MWPIXELVAL c);

void (*DrawVertLine)(PSD psd,MWCOORD x,MWCOORD y1,MWCOORD y2,

MWPIXELVAL c);

void (*FillRect)(PSD psd,MWCOORD x1,MWCOORD y1,MWCOORD x2,MWCOORD y2,MWPIXELVAL c);

PMWCOREFONT builtin_fonts;

/* *void (*DrawText)(PSD psd,MWCOORD x,MWCOORD y,const MWUCHAR *str,

int count, MWPIXELVAL fg, PMWFONT pfont);***/

void (*Blit)(PSD destpsd,MWCOORD destx,MWCOORD desty,MWCOORD w,

MWCOORD h,PSD srcpsd,MWCOORD srcx,MWCOORD srcy,long op);

void (*PreSelect)(PSD psd);

void (*DrawArea)(PSD psd, driver_gc_t *gc, int op);

int (*SetIOPermissions)(PSD psd);

PSD (*AllocateMemGC)(PSD psd);

MWBOOL (*MapMemGC)(PSD mempsd,MWCOORD w,MWCOORD h,int planes,int bpp,int linelen,int size,void *addr);

void (*FreeMemGC)(PSD mempsd);

void (*StretchBlit)(PSD destpsd,MWCOORD destx,MWCOORD desty,

MWCOORD destw,MWCOORD desth,PSD srcpsd,MWCOORD srcx,

MWCOORD srcy,MWCOORD srcw,MWCOORD srch,long op);

void (*SetPortrait)(PSD psd,int portraitmode);

int portrait; /* screen portrait mode*/

PSUBDRIVER orgsubdriver; /* original subdriver for portrait modes*/

void (*StretchBlitEx) (PSD dstpsd, PSD srcpsd,

MWCOORD dest_x_start, MWCOORD dest_y_start,

MWCOORD width, MWCOORD height,

int x_denominator, int y_denominator,

int src_x_fraction, int src_y_fraction,

int x_step_fraction, int y_step_fraction,

long op);

} SCREENDEVICE;

xres :表示屏幕的寬 (以像素為單位)

yres :表示屏幕的高 (以像素為單位)

planes :當(dāng)處于平面顯示模式時,planes 用于記錄所使用的平面數(shù),如平面模式相對的時

線性模式,此時該變量沒有意義。通常將其置為0

bpp :表示每個像素所使用的比特數(shù),可以為124815162432

linelen :對與1248比特每像素模式,它表示一行像素使用的字節(jié)數(shù),對于大于8

特每像素模式,它表示一行的像素總數(shù)。

size :表示該顯示模式下該設(shè)備使用的內(nèi)存數(shù)。linelen size 的存在主要是為了方便為內(nèi)

存屏幕設(shè)備分配內(nèi)存。

gr_foreground gr_background :表示該內(nèi)存屏幕的前景顏色和背景顏色,主要被一些

GDI 函數(shù)使用。

gr_mode :說明如何將像素畫到屏幕上,可選值為:MODE_SET MODE_XOR MODE_OR

MODE_AND MODE_MAX,比較常用的是MODE_SETMODE_XOR

flags :該屏幕設(shè)備的一些選項,比較重要的是 PSF_MEMORY 標(biāo)志,表示該屏幕設(shè)備代

表物理屏幕設(shè)備還是一個內(nèi)存屏幕設(shè)備。

addr :每個屏幕設(shè)備都有一塊內(nèi)存空間用來作為存儲像素。addr 變量記錄了這個空間的起

始地址。

下面的函數(shù)是屏幕驅(qū)動的接口函數(shù),我將會在下面驅(qū)動接口中解析他們,在這里就不再介紹。


1.3.2驅(qū)動接口

在上面的文章中我們看到這樣一句話:顯示驅(qū)動是整個系統(tǒng)中最為復(fù)雜的部分,但是驅(qū)動程序的復(fù)雜性卻換來了移植的方便性,microwindows是怎么讓復(fù)雜的顯示驅(qū)動來方便移動呢?就是因為系統(tǒng)的顯示驅(qū)動程序里只有幾個接口和硬件設(shè)備直接交互,其他程序提供核心的繪圖操作比如讀取像素,繪制像素,繪制更復(fù)雜的圖形等,這些繪圖操作對系統(tǒng)映射的顯存進行操作,讀寫像素點的信息。舉個通俗的例子,現(xiàn)在的轎車和以前的轎車在和剛開始發(fā)明的時候的駕駛方式幾乎沒有什么改變,都是離合,油門,方向盤,這個固定模式就好比我們的接口,他就是這樣,不管你的車性能多好,多高級,都是內(nèi)部的事,駕駛方式都是一樣的。來讓我們來看看microwindows的離合,油門,方向盤。在microwindows里們不論是畫多少位圖像的驅(qū)動我們都有統(tǒng)一的接口,都有統(tǒng)一的功能函數(shù)。下們就是microwindows驅(qū)動的接口,如果有一天我們中的那位發(fā)明一個microwidnows沒有的圖像格式,如果還要用microwindows的話,那么我們就要自己來寫驅(qū)動了,不過不要頭大,我們的驅(qū)動中只要包括下面接口中的函數(shù)就可以了,這就是microwindows的馬克思理論性,永遠沒有盡頭,永遠可以延伸和擴展。

typedef struct {

int (*Init)(PSD psd);

void (*DrawPixel)(PSD psd, int x, int y, gfx_pixel c);

gfx_pixel (*ReadPixel)(PSD psd, int x, int y);

void (*DrawHLine)(PSD psd, int x, int y, int w, gfx_pixel c);

void (*PutHLine) (GAL gal, int x, int y, int w, void* buf);

void (*GetHLine) (GAL gal, int x, int y, int w, void* buf);

void (*DrawVLine)(PSD psd, int x, int y, int w, gfx_pixel c);

void (*PutVLine) (GAL gal, int x, int y, int w, void* buf);

void (*GetVLine) (GAL gal, int x, int y, int w, void* buf);

void (*Blit)(PSD dstpsd, int dstx, int dsty, int w, int h, PSD srcpsd, int srcx, int srcy);

void (*PutBox)( GAL gal, int x, int y, int w, int h, void* buf );

void (*GetBox)( GAL gal, int x, int y, int w, int h, void* buf );

void (*PutBoxMask)( GAL gal, int x, int y, int w, int h, void *buf);

void (*CopyBox)(PSD psd,int x1, int y1, int w, int h, int x2, int y2);

} SUBDRIVER, *PSUBDRIVER;


下面介紹各接口函數(shù):

DrawPixel(PSD psd, int x, int y, gfx_pixel c)

功能:在給定的地址上畫一個像素點。

參數(shù)介紹:psd在這里我們對psd的應(yīng)用就是psd的基地址,x,y就是該點相對于基址的偏移量他的算法是這樣的。addr = x * pitch + y ,addr就是該點的所要畫的位置。gfx_pixelc就是傳遞過來的像素值,該函數(shù)解析后畫到addr這個位置。絢爛多彩的圖像就是靠勤勞的microwindows這樣一點一點畫出來了。

ReadPixel(PSD psd, int x, int y)

功能:在給定的地址上讀出一個像素值。

參數(shù)介紹:psd在該函數(shù)中的用處還是他所指向的顯存的基地址,x,y就是該點相對于基址的偏移量,他的算法和上面的方式是相同的,然后就是該函數(shù)把該點像素解析后返回該像素的RGB值。

DrawHorzLine(PSD psd,MWCOORD x1,MWCOORD x2,MWCOORD y,

MWPIXELVAL c):

功能:在兩點之間畫橫線。

參數(shù)介紹:psd的作用還是向程序提供基地址,雖然該函數(shù)有三個坐標(biāo)數(shù)據(jù),其實他代表的是兩個坐標(biāo)點,(x1,y),(x2,y).然后在y的位置從x1x2從左到右畫線。c就是畫線時的填充像素了。


DrawVertLine(PSD psd,MWCOORD x,MWCOORD y1,MWCOORD y2,

MWPIXELVAL c):

功能:在兩點之間畫豎線。

參數(shù)介紹:psd作用還是提供繪圖的基地址。x,y1,y2的意思是在(x,y1)(x,y2)兩點見畫豎線。

c的作用還是畫線時的像素填充值。提醒:不論是畫豎線還是橫線,我們的microwindows都沒有偷懶,把最后一點也畫了,也就是我們的線是有頭有尾是完整的。

FillRect(PSD psd,MWCOORD x1,MWCOORD y1,MWCOORD x2,MWCOORD y2,

MWPIXELVAL c):

功能:填充一個矩形,也就是畫一個實心的矩形。

參數(shù)介紹:聰明的我們也許看了上兩個這個就不用解釋了把,是的和你認為的一樣,就是在x1,y1,x2,y2的坐標(biāo)范圍內(nèi)用c的像素值來填充。

PutHLineGetHLinePutVLineGetVLinePutBoxGetBoxPutBoxMask

Get* 函數(shù)用于從屏幕拷貝像素到一塊內(nèi)存區(qū),而Put*函數(shù)用于將存放于內(nèi)存區(qū)的像素畫到屏幕上。PutBoxMask PutBox的唯一區(qū)別是要畫的像素如果是白色,就不會被畫到屏幕上,從而達到一種透明的效果。

BlitCopyBox

Blit 用于在不同的屏幕設(shè)備(物理的或者內(nèi)存的)之間拷貝一塊像素點,CopyBox則用于在同一屏幕上實現(xiàn)區(qū)域像素的拷貝。如果使用的是線性模式,Blit的實現(xiàn)非常簡單,直接memcpy 就可以了,而CopyBox 為了防止覆蓋問題,必須根據(jù)不同的情況,采用不同的拷貝方式,比如從底到頂?shù)卓截?#xff0c;當(dāng)新老位置在同一水平位置并且重復(fù)時,則需要利用緩沖間接拷貝。如果使用平面顯示模式,這里就比較復(fù)雜了。因為內(nèi)存設(shè)備總是采用線性模式的,所以就要判斷是物理設(shè)備還是內(nèi)存設(shè)備,再分別處理。這也大大地增加了fbvga16 實現(xiàn)的代碼。


1.3.3驅(qū)動選擇

我們知道,圖形顯示有個顯示模式的概念,一個像素可以用一位比特表示,也可以用24815162432個比特表示,另外,VGA16標(biāo)準(zhǔn)模式使用平面圖形模式,而VESA2.0使用的是線性圖形模式。所以即使是同樣基于Framebuffer 的驅(qū)動,不同的模式也要使用不同的驅(qū)動函數(shù):那么microwidnows是怎樣選擇驅(qū)動的呢。寫到這里我不禁要感慨一下,今天看到這篇文章的人是多么的幸福,有人已經(jīng)為你總結(jié)好了,可我可是一天幾行,請教無數(shù)善良的人們才知道的。

我說的這個內(nèi)容是在microwindows/src/nanox/srvmain.c中,當(dāng)我們啟動服務(wù)端后microwindows的初始化也就隨之開始了,通過GrOpenScreen我們來到了/microwindows/src/drivers/scr_fb.c中的fb_open內(nèi)部,我們就是通過select_fb_subdriver來進行選擇,剛才在fb_open屏幕驅(qū)動已經(jīng)對psd進行了初始化,他的過程是這樣的首先我們把framebuffer映射到我們申請的地址,然后通過FrameBuffer 中的ioctl函數(shù)
(下面有詳細解釋),framebuffer設(shè)備提供了若干 ioctl 命令,通過這些命令,可以獲得顯示設(shè)備的一些固定信息(比如顯示內(nèi)存大小)、與顯示模式相關(guān)的可變信息(比如分辨率、象素結(jié)構(gòu)、每掃描線的字節(jié)寬度),以及偽彩色模式下的調(diào)色板信息等等。然后microwindox根據(jù)ioctl函數(shù)返回的屏幕對psd進行初始化,然后根據(jù)psd->bpp的不同讓driver指針指向不同的驅(qū)動地址,來選擇對應(yīng)的驅(qū)動,也就說驅(qū)動的選擇是microwindows根據(jù)framebuffer的返回值來選擇對應(yīng)的驅(qū)動。就這樣microwindows草船借了箭.


2microwindows基于framebuffer顯像原理

2.1 framebuffer簡介

Framebuffer機制模仿顯卡的功能,將顯卡硬件結(jié)構(gòu)抽象掉,可以通過 Framebuffer的讀寫直接對顯存進行操作。用戶可以將Framebuffer看成是顯示內(nèi)存的一個映像,將其映射到進程地址空間之后,就可以直接進行讀寫操作,而寫操作可以立即反應(yīng)在屏幕上。FrameBuffer 設(shè)備還提供了若干 ioctl 命令,通過這些命令(上面的驅(qū)動選擇中用到)可以獲得顯示設(shè)備的一些固定信息(比如顯示內(nèi)存大小)、與顯示模式相關(guān)的可變信息(比如分辨率、象素結(jié)構(gòu)、每掃描線的字節(jié)寬度),以及偽彩色模式下的調(diào)色板信息。


2.2 framebuffermicrowindows圖形解析中的應(yīng)用

如果在microwidnows使用framebuffer我們首先會在microwidnows的預(yù)編譯選項中,選中framebuffer,然后運行microwidnow服務(wù)端在初始化過程中打開幀緩沖設(shè)備,過程如下:(microwindows-0.90/src/nanox/srvmain.c中的GsInitialize/GdOpenScreen/scrdev/fbopen()函數(shù)),

if(!(env = getenv("FRAMEBUFFER")))

{

env = "/dev/fb0";

}

fb = open(env, O_RDWR);

從上面代碼我們可以看到,我們首先得到framebuffer環(huán)境變量,然后我們打開了他,并返回了她的文件描述符。然后我們利用 mmap 功能將幀緩沖映射到用戶進程空間形成用戶能操作的顯存對顯存進行讀寫操作。通過程序我們看到mmapframebufer隱射到psd的地址空間,然后我們可以看到在microwindows所有的有關(guān)圖像處理的函數(shù)都是在psd申請的內(nèi)存內(nèi)進行,,就這樣microwindows通過寫這片內(nèi)存來實現(xiàn)對framebuffer的使用,而對framebuffer的任何操作馬上就反映屏幕上,就這樣microwindowsframebuffer來實現(xiàn)了所有的圖像顯示,就這樣microwindows讓我們看到了艷麗多彩的圖形界面。


3microwindows兩種繪圖區(qū)

4.1創(chuàng)建實窗口

創(chuàng)建實窗口使用GrNewWindow,當(dāng)然我們也可以調(diào)用GrNewInputWindow 函數(shù)
創(chuàng)間只輸入(input-only)的窗口,這些函數(shù)可以指定窗口的邊界和顏色,函數(shù)的返回值是窗口的ID,此ID可以被后來的圖形上下文和窗口操作函數(shù)使用,然后調(diào)用GrMapWindow 函數(shù)顯示窗口,我們也可以調(diào)用GrUnmapWindow 函數(shù)隱藏窗口。窗口的顯
示的前提示需要它的所有祖先窗口可視。再后來就是繪制窗口了,繪制窗口需要窗口號和圖形上下文作參數(shù),我們已經(jīng)在前面生成。再后來就是我們可以看到絢麗的圖像窗口了。

4.2 虛窗口(microwindows中的offscreen

Microwindows也支持一種從來不在屏幕上顯示的窗口,即像素映射(pixmap)。像素映射窗口有時也稱作虛窗口(offscreen),虛窗口不能在屏幕上顯示出來,但是可以使用GrCopyArea函數(shù)復(fù)制到別的窗口。有時在expose events期間,CPU太忙而無法保存顯示窗口的內(nèi)容,普通窗口在被遮掩時又從不保存它們的內(nèi)容,這時就可以使用像素映射。用GrNewPixmap函數(shù)可以生成一個像素映射。系統(tǒng)使用malloc分配的內(nèi)存地址代替用mmap分配的物理framebuffer地址。在系統(tǒng)不使用實際物理內(nèi)存地址的情況下(XMS窗口),必須寫兩套函數(shù),一套用于圖形系統(tǒng)硬件,一套用于內(nèi)存地址。另外,需要知道在兩種格式之間的復(fù)制方法。位的blitting函數(shù)必須要快。查看fblin8.cmempl4.c文件可以找到支持兩種顯示硬件類型的例子。我做過一個對于microwindows圖形引擎的修改,就是自己在devimage.c自己定義了一套繪圖函數(shù)和驅(qū)動,然后把圖像畫在自己申請的內(nèi)存中,然后把畫好后的圖像用GrArea拷貝到一個正在顯示的圖像界面上,結(jié)果獲得了成功,我想這是我對在屏幕外作圖最深刻的體會把。

4microwidows對圖片的解析


microwindows支持多種圖片格式,包括GIFJPEGBMPPNGXPMPBMPPM等等,那么microwindows是怎么對這些圖像進行選擇和解碼的呢?位圖是現(xiàn)在比較常見的圖像格式,那么我們就主要說一下microwindows對位圖的解碼過程。


3.1位圖的格式

bmp文件大體上分成四個部分:

第一部分:為位圖文件頭BITMAPFILEHEADER,是一個結(jié)構(gòu),其定義如下:

typedefstructtagBITMAPFILEHEADER{

WORD bfType;

DWORD bfSize;

WORD bfReserved1;

WORD bfReserved2;

DWORD bfOffBits;

} BITMAPFILEHEADER;

這個結(jié)構(gòu)的長度是固定的,為14個字節(jié)(WORD為無符號16位整數(shù),DWORD為無符號32位整數(shù)),各個域的說明如下:

bfType

指定文件類型,必須是0x424D,即字符串"BM",也就是說所有.bmp文件的頭兩個字節(jié)都是"BM"

bfSize

指定文件大小,包括這14個字節(jié)

bfReserved1bfReserved2

為保留字,不用考慮

bfOffBits

為從文件頭到實際的位圖數(shù)據(jù)的偏移字節(jié)數(shù),即圖3中前三個部分的長度之和。

第二部分:為位圖信息頭BITMAPINFOHEADER,也是一個結(jié)構(gòu),其定義如下:

typedef struct tagBITMAPINFOHEADER{

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount;

DWORD biCompression;

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

} BITMAPINFOHEADER; 這個結(jié)構(gòu)的長度是固定的,為40個字節(jié)(WORD為無符號16位整數(shù),DWORD無符號32位整數(shù),LONG32位整數(shù)),各個域的說明如下:

biSize

指定這個結(jié)構(gòu)的長度,為40

biWidth

指定圖象的寬度,單位是象素

biHeight

指定圖象的高度,單位是象素

biPlanes

必須是1,不用考慮

biBitCount

指定表示顏色時要用到的位數(shù),常用的值為1(黑白二色圖),416色圖),8256色),24(真彩色圖)(新的.bmp格式支持32位色,這里就不做討論了)。

biCompression

指定位圖是否壓縮,有效的值為BI_RGBBI_RLE8BI_RLE4BI_BITFIELDS(都是一些Windows定義好的常量)。要說明的是,Windows位圖可以采用RLE4,和RLE8的壓縮格式,但用的不多。我們今后所討論的只有第一種不壓縮的情況,即biCompressionBI_RGB的情況。

biSizeImage

指定實際的位圖數(shù)據(jù)占用的字節(jié)數(shù),其實也可以從以下的公式中計算出來:

biSizeImage=biWidth'*biHeight

要注意的是:上述公式中的biWidth'必須是4的整倍數(shù)(所以不是biWidth,而是biWidth',表示大于或等于biWidth的,離4最近的整倍數(shù)。舉個例子,如果biWidth=240,則biWidth'=240;如果biWidth=241biWidth'=244)如果 biCompressionBI_RGB,則該項可能為零

biXPelsPerMeter

指定目標(biāo)設(shè)備的水平分辨率,單位是每米的象素個數(shù)。

biYPelsPerMeter

指定目標(biāo)設(shè)備的垂直分辨率,單位同上。

biClrUsed

指定本圖象實際用到的顏色數(shù),如果該值為零,則用到的顏色數(shù)為2biBitCount次方。

biClrImportant

指定本圖象中重要的顏色數(shù),如果該值為零,則認為所有的顏色都是重要的。

第三部分:為調(diào)色板(Palette),當(dāng)然,這里是對那些需要調(diào)色板的位圖文件而言的。有些位圖,如真彩色圖,前面已經(jīng)講過,是不需要調(diào)色板的,BITMAPINFOHEADER后直接是位圖數(shù)據(jù)。

調(diào)色板實際上是一個數(shù)組,共有biClrUsed個元素(如果該值為零,則有2biBitCount次方個元素)。數(shù)組中每個元素的類型是一個RGBQUAD結(jié)構(gòu),占4個字節(jié),其定義如下:

typedef struct tagRGBQUAD{

BYTE rgbBlue; //該顏色的藍色分量

BYTE rgbGreen; //該顏色的綠色分量

BYTE rgbRed; //該顏色的紅色分量

BYTE rgbReserved; //保留值

} RGBQUAD;

第四部分:就是實際的圖象數(shù)據(jù)了。對于用到調(diào)色板的位圖,圖象數(shù)據(jù)就是該像素顏在調(diào)色板中的索引值,對于真彩色圖,圖象數(shù)據(jù)就是實際的R,G,B值。下面就2色,16色,256色位圖和真彩色位圖分別介紹。對于2色位圖,用1位就可以表示該像素的顏色(一般0表示黑,1表示白),所以一個字節(jié)可以表示8個像素對于16色位圖,用4位可以表示一個像素的顏色,所以一個字節(jié)可以表示2個像素。對于256色位圖,一個字節(jié)剛好可以表示1個像素。對于真彩色圖,三個字節(jié)才能表示1個像素。

3.2 microwindows對位圖的解碼

microwidnows對位圖的解碼是在/microwindows-0.90/src/engine/devimage.c文件中的loadBmp函數(shù)中進行的,下面我們就詳細分析這個函數(shù),激動人心的時候終于來了。

下面這個函數(shù)就是bmp的解碼函數(shù):

1.static int

2.LoadBMP(buffer_t *src, PMWIMAGEHDR pimage)

3.{

4. int h, i, compression;

5. int headsize;

6. MWUCHAR *imagebits;

7. BMPFILEHEAD bmpf;

8. BMPINFOHEAD bmpi;

9. BMPCOREHEAD bmpc;

10. MWUCHAR headbuffer[INFOHEADSIZE];

11.

12. bseek(src, 0, SEEK_SET);

13.

14. pimage->imagebits = NULL;

15. pimage->palette = NULL;

16.

17. /* read BMP file header*/

18. if (bread(src, &headbuffer, FILEHEADSIZE) != FILEHEADSIZE)

19. return(0);

20.

21. bmpf.bfType[0] = headbuffer[0];

22. bmpf.bfType[1] = headbuffer[1];

23.

24. /* Is it really a bmp file ? */


25. if (*(WORD*)&bmpf.bfType[0] != wswap(0x4D42)) /* 'BM' */

26. return 0; /* not bmp image*/

#if 0

通過18行我們知道FILEHEADSIZE1425行讀出數(shù)組的前兩個字節(jié),驗證是否是0x424D,如果是就是位圖,若不是位圖,退出。

#endif

27.

28. /*bmpf.bfSize = dwswap(dwread(&headbuffer[2]));*/

29. bmpf.bfOffBits = dwswap(dwread(&headbuffer[10]));

30. /* Read remaining header size */

31. if (bread(src,&headsize,sizeof(DWORD)) != sizeof(DWORD))

32. return 0; /* not bmp image*/

33. headsize = dwswap(headsize);

34.

35. /* might be windows or os/2 header */

36.

37. if(headsize == COREHEADSIZE) {

#if 0

如果headsize12證明這張位圖是有os/2系統(tǒng)產(chǎn)生的,OS/2Operating System 2的縮寫,意思為第二代的操作系統(tǒng)。在DOSPC上的巨大成功后,以及GUI圖形化界面的潮流影響下,IBMMicrosoft共同研制和推出了OS/2這一當(dāng)時先進的個人電腦上的新一代操作系統(tǒng)由于現(xiàn)在已不常見,我就不在敘述。

#endif

38.

39. /* read os/2 header */

40. if(bread(src, &headbuffer, COREHEADSIZE-sizeof(DWORD)) !=

41. COREHEADSIZE-sizeof(DWORD))

42. return 0; /* not bmp image*/

43.

44. /* Get data */

45. bmpc.bcWidth = wswap(*(WORD*)&headbuffer[0]);

46. bmpc.bcHeight = wswap(*(WORD*)&headbuffer[2]);

47. bmpc.bcPlanes = wswap(*(WORD*)&headbuffer[4]);

48. bmpc.bcBitCount = wswap(*(WORD*)&headbuffer[6]);

49.

50. pimage->width = (int)bmpc.bcWidth;

51. pimage->height = (int)bmpc.bcHeight;

52. pimage->bpp = bmpc.bcBitCount;

53.

54. if (pimage->bpp <= 8)

55. pimage->palsize = 1 << pimage->bpp;

56. else pimage->palsize = 0;

57. compression = BI_RGB;

58. } else {

59. /* read windows header */

60. if(bread(src, &headbuffer, INFOHEADSIZE-sizeof(DWORD)) !=

61. INFOHEADSIZE-sizeof(DWORD))

62. return 0; /* not bmp image*/

63.

64. /* Get data */

#if 0

把位圖信息頭數(shù)據(jù)讀取到bmpi中。

dswap的作用就是把little-endian格式轉(zhuǎn)換成主cpu的數(shù)據(jù)存放形式,little-endian是表示計算機字節(jié)順序的格式,所謂的字節(jié)順序指的是長度跨越多個字節(jié)的數(shù)據(jù)的存放形式. 比如我們讀書的習(xí)慣是從左到右的方式而cpu讀數(shù)的方式是從右到左的方式,所以我們在用計算機處理數(shù)據(jù)時,就必須發(fā)他轉(zhuǎn)換成正確的cpu讀數(shù)方式。

#endif

65. bmpi.BiWidth = dwswap(*(DWORD*)&headbuffer[0]);

66. bmpi.BiHeight = dwswap(*(DWORD*)&headbuffer[4]);

67. bmpi.BiPlanes = wswap(*(WORD*)&headbuffer[8]);

68. bmpi.BiBitCount = wswap(*(WORD*)&headbuffer[10]);

69. bmpi.BiCompression = dwswap(*(DWORD*)&headbuffer[12]);

70. bmpi.BiSizeImage = dwswap(*(DWORD*)&headbuffer[16]);

71. bmpi.BiXpelsPerMeter = dwswap(*(DWORD*)&headbuffer[20]);

72. bmpi.BiYpelsPerMeter = dwswap(*(DWORD*)&headbuffer[24]);

73. bmpi.BiClrUsed = dwswap(*(DWORD*)&headbuffer[28]);

74. bmpi.BiClrImportant = dwswap(*(DWORD*)&headbuffer[32]);

75.

76. pimage->width = (int)bmpi.BiWidth;

77. pimage->height = (int)bmpi.BiHeight;

78. pimage->bpp = bmpi.BiBitCount;

79. pimage->palsize = (int)bmpi.BiClrUsed;

80. if (pimage->palsize > 256)

81. pimage->palsize = 0;

82. else if(pimage->palsize == 0 && pimage->bpp <= 8)

83. pimage->palsize = 1 << pimage->bpp;

84. compression = bmpi.BiCompression;

85. }

86. pimage->compression = MWIMAGE_BGR; /* right side up, BGR order*/

87. pimage->planes = 1;

88.

89. /* currently only 1, 4, 8 and 24 bpp bitmaps*/

90. if(pimage->bpp > 8 && pimage->bpp != 24) {

91. EPRINTF("LoadBMP: image bpp not 1, 4, 8 or 24/n");

92. return 2; /* image loading error*/

93. }

94.

95. /* compute byte line size and bytes per pixel*/

96. ComputePitch(pimage->bpp, pimage->width, &pimage->pitch,

97. &pimage->bytesperpixel);

#if 0

計算行距pitch:如果你的應(yīng)用程序要寫視頻RAM,內(nèi)存中的位圖并不需要占據(jù)連續(xù)的內(nèi)存塊。在這種情況下,一條線的widthpitch含義是不同的。width是指內(nèi)存中位圖的一條線的開始和結(jié)束位置的內(nèi)存地址之差。這個距離只代表了內(nèi)存中位圖的寬度,它不包括位圖中到達下一條線開始位置所需要的任何額外的內(nèi)存。 pitch是指內(nèi)存中位圖的一條線到下一條線開始位置的內(nèi)存地址之差。

#endif

98.

99. /* Allocate image */

100. if( (pimage->imagebits = malloc(pimage->pitch*pimage->height)) == NULL)

101. goto err;

//為位圖分配內(nèi)存,注意:不是pimage->height *pimage ->height;

102. if( (pimage->palette = malloc(256*sizeof(MWPALENTRY))) == NULL)

103. goto err;

104.

105. /* get colormap*/

//生成顏色查找表

106. if(pimage->bpp <= 8) {

107. for(i=0; i<pimage->palsize; i++) {

108. pimage->palette[i].b = bgetc(src);

109. pimage->palette[i].g = bgetc(src);

110. pimage->palette[i].r = bgetc(src);

111. if(headsize != COREHEADSIZE)

112. bgetc(src);

113. }

114. }

115.

116. /* decode image data*/

117. bseek(src, bmpf.bfOffBits, SEEK_SET);

118.

119. h = pimage->height;

120. /* For every row ... */

//從右下角開始逐行向上讀取數(shù)據(jù)

121. while (--h >= 0) {

122. /* turn image rightside up*/

// imagebits指針移動到內(nèi)存的右下角

123. imagebits = pimage->imagebits + h*pimage->pitch;

124.

125. /* Get row data from file */

//解壓縮數(shù)據(jù),BI_RLE8,BI_RLE4均為數(shù)據(jù)壓縮格式

126. if(compression == BI_RLE8) {

127. if(!DecodeRLE8(imagebits, src))

128. break;

129. } else if(compression == BI_RLE4) {

130. if(!DecodeRLE4(imagebits, src))

131. break;

132. } else {

133. if(bread(src, imagebits, pimage->pitch) !=

134. pimage->pitch)

135. goto err;

136. }

137. }

138. return 1; /* bmp image ok*/

139.

140.err:

141. EPRINTF("LoadBMP: image loading error/n");

142. if(pimage->imagebits)

143. free(pimage->imagebits);

144. if(pimage->palette)

145. free(pimage->palette);

146. return 2; /* bmp image error*/

147.}


總結(jié)

以上是生活随笔為你收集整理的microwindows位图解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

91精品中文字幕 | 久久久久久久久久久久久影院 | 日批视频在线播放 | 蜜臀久久99精品久久久无需会员 | 日韩免费一区二区在线观看 | 日韩欧美视频一区二区 | 久久一区国产 | www.香蕉视频| 国产色视频网站 | 亚洲国产精品一区二区久久,亚洲午夜 | 免费网站色 | 97超视频| 欧美一级特黄aaaaaa大片在线观看 | 亚洲国产午夜精品 | av在线网站免费观看 | 精品福利视频在线 | 久久精品一二区 | 黄色a级片在线观看 | 在线观看黄网站 | 中文字幕二区在线观看 | 国产精品久久久久久久久搜平片 | 亚洲精色| 久久97精品 | 视频一区二区精品 | 日韩av高清 | 亚洲片在线资源 | 碰超在线 | 欧美国产一区在线 | 日韩黄在线观看 | av在线超碰 | 国产精品美女久久久久久网站 | 九九九热视频 | 九九视频免费观看视频精品 | 中文在线免费视频 | 九九欧美视频 | 国产69精品久久app免费版 | av福利在线看 | 久热免费在线观看 | 在线久草视频 | 国产福利一区二区三区在线观看 | 久久在线视频精品 | 日韩av一区二区三区在线观看 | 亚洲国产偷 | 久久成人亚洲欧美电影 | 国产精品美女久久久久久久 | 中文字幕亚洲在线观看 | 91漂亮少妇露脸在线播放 | 97人人模人人爽人人喊中文字 | 97香蕉久久国产在线观看 | 午夜在线看片 | 欧美精品二区 | 99电影 | 欧美日韩裸体免费视频 | 成年人免费观看在线视频 | 亚洲精品一区二区在线观看 | 亚洲码国产日韩欧美高潮在线播放 | 九九日韩| 国产午夜不卡 | 91丨九色丨国产女 | 九九热在线视频 | 国产香蕉视频在线播放 | 天堂视频中文在线 | 99c视频在线 | 久久在线 | 婷婷久草 | 亚洲高清视频在线播放 | 人人爽人人 | 天天天综合 | 国产区免费 | 很黄很黄的网站免费的 | 在线蜜桃视频 | 99热精品国产 | 啪啪肉肉污av国网站 | 国产成人中文字幕 | 九九热免费精品视频 | 成人avav| 欧美亚洲精品在线观看 | 亚洲成aⅴ人片久久青草影院 | 日韩一区二区三区在线看 | 免费观看全黄做爰大片国产 | 9999精品| 五月天婷婷在线观看视频 | 亚洲动漫在线观看 | 在线 欧美 日韩 | www狠狠操 | 天天爽夜夜爽精品视频婷婷 | 人人澡澡人人 | 天天干视频在线 | 日韩三区在线 | 久草在线最新免费 | 成人免费中文字幕 | 国产在线播放一区二区三区 | www.亚洲视频| 免费看污在线观看 | 久久国产精品一区二区三区四区 | 欧美伦理一区 | 婷婷丁香社区 | 五月婷婷中文字幕 | 国产精品正在播放 | av资源网在线播放 | 九九在线精品视频 | 日韩婷婷 | 五月天狠狠操 | 丰满少妇对白在线偷拍 | 国产婷婷色| 在线播放视频一区 | 超碰在线日本 | 亚洲综合色播 | 午夜婷婷在线播放 | 久久久久久国产精品免费 | 最新极品jizzhd欧美 | 日韩电影在线观看一区 | 国产精品成人一区二区三区 | 国产小视频免费在线网址 | 九9热这里真品2 | 91在线精品秘密一区二区 | 午夜婷婷在线观看 | 九九免费在线看完整版 | 久99久在线视频 | 亚洲国产网址 | freejavvideo日本免费 | 国产免费三级在线观看 | 亚洲免费黄色 | 欧美做受高潮电影o | 在线观看香蕉视频 | 国产精品一二三 | 99久高清在线观看视频99精品热在线观看视频 | 中文字幕精品一区二区三区电影 | 91视频久久久 | 一区二区久久 | 欧美成人基地 | 97影视| 国产专区第一页 | 婷婷丁香狠狠爱 | 亚洲在线国产 | 九九九九热精品免费视频点播观看 | 91麻豆产精品久久久久久 | 亚洲精品国久久99热 | 亚洲理论在线观看 | 国模精品在线 | 色综合色综合久久综合频道88 | 亚洲欧洲精品一区 | 日韩欧美高清一区二区 | 亚洲国产剧情 | 免费中文字幕视频 | 久久久.com| 亚洲成人av免费 | 欧美aa一级 | 永久免费av在线播放 | 最新中文在线视频 | 999超碰 | aaa毛片视频| 精品久久久久国产 | 日韩av一区二区三区四区 | 最近日本字幕mv免费观看在线 | 久久久久久看片 | 国产色啪 | 99精品国产福利在线观看免费 | 亚洲另类在线视频 | 伊人成人久久 | 亚洲六月丁香色婷婷综合久久 | a在线一区| 国产精品高 | 91麻豆精品国产91久久久无需广告 | 狠狠色丁香婷婷综合久久片 | 国产做a爱一级久久 | 九九激情视频 | 91综合色 | 久久亚洲精品电影 | 国产精品久久久久久久久久尿 | 久久精彩免费视频 | 亚洲精品视频偷拍 | 久久免费视频在线观看30 | 国产精品久久久久久久久久久免费 | 国产精品成人久久久久久久 | 人人干人人爽 | 国产精品淫片 | 一区二区三区在线电影 | 日韩欧美在线观看 | 天天射综合| 亚洲开心色 | 日韩精品一区二区三区不卡 | 婷婷色伊人| 激情久久五月 | 国产v在线观看 | 久久精品亚洲精品国产欧美 | 免费av成人在线 | 狠狠色丁香婷婷综合 | 欧美9999| 最近中文字幕免费视频 | 免费黄色网止 | 国内成人精品2018免费看 | 日韩一区二区免费播放 | 欧美成人精品欧美一级乱 | 日韩激情片在线观看 | 制服丝袜一区二区 | 日韩在线视频免费看 | 成年人在线观看视频免费 | 国产亚洲精品久久久久久移动网络 | 激情深爱.com | 国产91精品欧美 | 亚洲 欧美 91 | 91精品国产99久久久久久久 | 黄色的网站免费看 | 综合色在线观看 | 伊人资源视频在线 | 久久少妇免费视频 | 一区在线电影 | 国产99视频在线观看 | 在线99 | 看片在线亚洲 | 天天综合亚洲 | 久草电影在线 | 成人app在线播放 | 黄色在线视频网址 | 日日夜夜天天干 | 久草免费手机视频 | 久久久久一区二区三区 | 久久久国产精品成人免费 | 国产精品国产三级国产aⅴ入口 | 国产精品免费一区二区三区 | 99精品视频在线播放免费 | 久久99视频免费 | 在线看91| 国产a免费 | 欧美黄色免费 | 久久成人国产精品入口 | 91精品在线观看入口 | 在线免费观看视频一区二区三区 | 丁香婷婷综合五月 | 色之综合网 | 日韩特级片 | 成人免费大片黄在线播放 | 久久伊99综合婷婷久久伊 | 最近免费在线观看 | 日韩在线电影观看 | 欧美日韩一区二区久久 | 97超碰资源总站 | 成人午夜精品久久久久久久3d | 免费在线观看国产精品 | 亚洲精品在线视频网站 | 国产尤物一区二区三区 | 国产精品成人免费 | 亚洲欧美在线视频免费 | 在线精品亚洲一区二区 | 国产亚洲精品美女久久 | 免费观看黄 | 狠狠88综合久久久久综合网 | 久久玖 | 精产嫩模国品一二三区 | 日本精品一区二区三区在线观看 | 国产91av视频在线观看 | 九九视频这里只有精品 | 国内精品视频在线 | 国产精品v欧美精品 | 成人91av| 一区二三国产 | 国产精品一区二区久久精品爱微奶 | 欧美精品三级 | 天堂激情网 | 视频直播国产精品 | 日韩av不卡在线 | 国产精品www | 麻豆系列在线观看 | 欧美韩日视频 | 岛国av在线免费 | 在线观看视频一区二区三区 | 欧美日本在线视频 | 国内久久久久 | 麻豆网站免费观看 | 久久综合色天天久久综合图片 | 国产精品中文久久久久久久 | 国产91在线观 | 欧美日韩国产在线精品 | 99久久婷婷| 久久艹综合 | 又黄又刺激又爽的视频 | 久在线观看 | 97超碰人人 | 国产中文a| 欧美日韩国产网站 | 欧美黑人巨大xxxxx | 精精国产xxxx视频在线播放 | 色偷偷网站视频 | 中文字幕亚洲国产 | 中文在线www | 久草视频视频在线播放 | 免费看av片网站 | 97超碰成人在线 | av在线观 | 97精品国产97久久久久久免费 | 99re国产| av免费看在线 | 国产香蕉视频在线观看 | 激情视频一区二区三区 | 国产精品嫩草影院99网站 | 亚洲免费在线观看视频 | 亚洲成人精品久久久 | 国产精品久久久av | 欧美一级日韩三级 | 国产精品日韩欧美 | 国产精品va在线 | 日韩成片 | 五月综合色婷婷 | 免费在线观看国产黄 | 午夜av一区二区三区 | 亚洲春色综合另类校园电影 | 久久五月情影视 | 久久精品久久精品久久 | 一区二区三区高清不卡 | 热99在线视频 | 日日夜夜精品视频 | 黄色aaa级片| 粉嫩av一区二区三区四区在线观看 | 免费黄色网址大全 | 国产福利精品视频 | 99久热在线精品视频观看 | 久久精品123| 五月天堂色| 免费欧美精品 | 99视频在线播放 | 夜夜操网| 国产日韩欧美网站 | 欧美 高跟鞋交 xxxxhd | 日韩欧美国产精品 | 精品久久一区二区 | 日韩精品一区二区在线 | 一级片视频在线 | 午夜精品福利一区二区 | 亚洲精品伦理在线 | 亚洲欧美日韩一区二区三区在线观看 | 日韩视频二区 | 91成人亚洲 | 欧美激情精品久久久久 | av免费在线观看网站 | 97人人添人澡人人爽超碰动图 | 一区二区中文字幕在线 | 久久亚洲私人国产精品 | 婷婷久久综合九色综合 | 国产一级在线视频 | 蜜桃av久久久亚洲精品 | 最近中文字幕国语免费高清6 | 免费看一级黄色大全 | 午夜久久影院 | 丁香国产视频 | 久草视频在线免费播放 | 国产区网址 | 精品一区 在线 | 久久一区91 | 国产精品成人a免费观看 | 亚洲欧美偷拍另类 | 婷婷久久综合网 | 亚洲综合少妇 | 在线国产能看的 | 天天拍天天操 | 免费av在线网站 | 国产精品久久久久一区二区国产 | 日日综合| 日韩精品免费在线观看视频 | 91麻豆产精品久久久久久 | 亚洲欧美激情插 | 日日干天夜夜 | 成人亚洲综合 | 99视频精品在线 | 福利电影久久 | 久久久视屏| 最近日本韩国中文字幕 | 狠狠操精品 | 天天舔天天搞 | 国产精品96久久久久久吹潮 | 在线看国产视频 | 成人免费观看网站 | 国内少妇自拍视频一区 | 久草免费在线视频观看 | 国产精品国产精品 | 国产69久久精品成人看 | 欧美看片 | 欧美日韩国产色综合一二三四 | 亚洲最新av网站 | 91成人精品在线 | 在线中文字幕电影 | 999久久国产 | 国产日韩精品在线观看 | 亚洲国产97在线精品一区 | 天天插天天干天天操 | 五月婷av | 久久人人97超碰国产公开结果 | 久久激情五月激情 | 毛片播放网站 | 九九热精品视频在线观看 | 国产电影一区二区三区四区 | 亚洲黄色片一级 | 婷婷六月色 | 玖玖玖在线 | 麻豆视频免费网站 | 日韩欧美视频一区二区三区 | 欧美日本一区 | 亚洲精品视频在线免费播放 | 亚洲精品视频一二三 | 尤物一区二区三区 | 在线观看一区二区视频 | 国产精品久久久久久久久久久久午夜 | 欧美精品九九99久久 | 欧美成人播放 | 国产精品成人免费 | 午夜精品一区二区国产 | 国产破处视频在线播放 | 99精品一区 | 日本夜夜草视频网站 | 午夜av电影院 | a v在线视频 | 色婷婷狠狠五月综合天色拍 | 久久久免费观看视频 | 精品一区 在线 | 国产精彩视频 | 久草在线这里只有精品 | 91丨九色丨蝌蚪丨对白 | 久久美女精品 | 国产成人久久精品77777 | 日韩不卡高清视频 | 4438全国亚洲精品在线观看视频 | 99热超碰在线 | 人人干干人人 | 人人干干人人 | 日韩精品你懂的 | 亚洲精品成人免费 | 一区二区电影网 | 亚洲精品在线视频播放 | 九九在线免费视频 | 亚洲va欧美va人人爽 | 天堂素人在线 | 国产成人精品一区二区三区在线观看 | 国产高清日韩欧美 | 国产精品毛片一区二区在线看 | 成人在线免费视频观看 | 久久调教视频 | 91福利区一区二区三区 | www.亚洲精品视频 | 狠狠综合久久av | 91精品啪在线观看国产线免费 | 欧美午夜视频在线 | 日韩高清av在线 | 天天爽天天摸 | 伊人天堂网| 麻豆久久一区 | 中文字幕亚洲欧美日韩 | 91精品啪在线观看国产线免费 | 人人爽人人爽人人爽人人爽 | 日韩精品免费一线在线观看 | 99亚洲精品在线 | 开心色激情网 | 最近中文字幕免费视频 | 日韩中文字幕免费在线观看 | 亚洲乱亚洲乱亚洲 | 国产精品欧美久久久久天天影视 | 国产亚洲精品免费 | 国产xxxx| 色综合婷婷久久 | 99999精品视频 | 丁香六月激情 | 国产精品免费久久久久影院仙踪林 | 亚洲欧洲国产精品 | 国产在线观看你懂的 | 美女国产在线 | 成人精品视频久久久久 | 一区二区国产精品 | 久久久2o19精品 | 久久免费观看视频 | 国产一级黄色片免费看 | 操操操日日 | 天天干夜夜爱 | 伊人久久国产精品 | 久久久久久久久爱 | 最新一区二区三区 | 手机看片国产日韩 | 亚洲女人天堂成人av在线 | 国产免费视频一区二区裸体 | 亚洲视频,欧洲视频 | 亚洲国产激情 | 久保带人 | 亚洲成人精品久久 | 免费观看www7722午夜电影 | 友田真希x88av | 欧美日韩免费观看一区二区三区 | 国产美女网站视频 | 久久久久久久久久影院 | 久久久午夜视频 | www色| 成人小视频在线播放 | 久久激情视频 久久 | 成av人电影 | 国产精品永久免费 | 国产中文字幕第一页 | 国产色网站 | 黄色资源网站 | 日韩最新在线 | 色综合天天视频在线观看 | 国产精品一区二区在线 | 99国产精品一区二区 | 亚洲国产精品久久久久婷婷884 | 日韩av在线小说 | 亚洲久草视频 | 亚洲视频在线看 | 亚洲无线视频 | 96国产在线| 日本中文字幕在线播放 | 成人三级网站在线观看 | 亚洲一级电影 | 国产精品美女网站 | 国内精品久久久久久久久久久久 | 开心激情五月婷婷 | 久久久久久不卡 | av高清免费 | 在线视频99 | 色偷偷男人的天堂av | 日韩高清一区 | 欧美精品九九99久久 | 五月婷婷色播 | 射射射av | 国产精品99久久免费观看 | 亚洲网站在线 | 亚洲一区二区视频在线 | 综合色综合 | 国产视频精品久久 | 亚洲国产免费看 | 91精品国产91久久久久福利 | 国产午夜精品理论片在线 | 中文字幕人成人 | 亚洲精品www久久久 www国产精品com | 在线免费观看一区二区三区 | 久久久久麻豆 | 一区二区三区久久精品 | 久久精品欧美日韩精品 | 久久公开视频 | 99久久精品国产观看 | 国产精品丝袜在线 | 欧美a级在线免费观看 | 99成人免费视频 | 国产亚洲日 | a天堂最新版中文在线地址 久久99久久精品国产 | 91久久人澡人人添人人爽欧美 | 成人一区在线观看 | 国产精品嫩草在线 | 亚洲欧洲久久久 | 国内精品久久久精品电影院 | 免费av在线播放 | 91综合色| 成人午夜影院在线观看 | 黄色免费在线视频 | 国产成人在线观看免费 | 爱干视频 | 久久电影网站中文字幕 | 四虎精品成人免费网站 | 三级黄色在线观看 | 国产91在线 | 美洲 | 婷婷久月 | 亚洲天堂自拍视频 | 人人搞人人搞 | 中日韩免费视频 | 婷婷六月久久 | 六月丁香婷婷网 | 中文字幕在线观看视频网站 | 精品视频在线免费观看 | 国内久久看 | 97精品电影院 | 欧美九九视频 | 黄色在线免费观看网址 | 精品国产诱惑 | 国产一级一片免费播放放 | 天天干中文字幕 | 91香蕉视频在线下载 | 波多野结衣电影一区 | 中文一区二区三区在线观看 | 婷婷丁香激情网 | 日韩动态视频 | 日本三级人妇 | 国产日产亚洲精华av | 欧美日韩在线观看视频 | 黄色软件在线观看免费 | 国产资源站 | 天堂av中文字幕 | 9草在线| 日韩久久电影 | 国产日韩欧美在线 | 丁香视频五月 | 在线免费观看一区二区三区 | 天天添夜夜操 | 色综合久久精品 | 欧美日本一区 | 午夜视频在线网站 | 91精品视频免费看 | www.人人草| 国产免费视频在线 | 亚洲精品国产拍在线 | 日韩性色| 免费精品在线视频 | 日日干网址 | 久久精品视频在线观看免费 | 五月婷婷综合在线视频 | 丝袜美腿一区 | 啪啪激情网 | 奇米网在线观看 | 久久人人爽人人爽人人片av免费 | 91完整版在线观看 | 欧美91精品 | 97国产视频 | 久久综合影音 | 久久久黄视频 | 久草在线免费看视频 | 国产亚洲精品久久久久久无几年桃 | 91麻豆国产福利在线观看 | 天天射天天拍 | 欧美综合在线视频 | 国产精品一区二区av麻豆 | 夜夜澡人模人人添人人看 | 偷拍精偷拍精品欧洲亚洲网站 | 国产婷婷精品 | 中文字幕丝袜制服 | 女女av在线 | 人人超在线公开视频 | 五月天丁香综合 | 天天搞天天干 | 久久国产午夜精品理论片最新版本 | 国产69精品久久久久9999apgf | 亚洲国产欧美在线看片xxoo | 久久精品一区二区国产 | 韩日精品在线 | 99视频 | 97超碰资源总站 | 中文字幕久久久精品 | 午夜的福利 | 亚洲国产精品va在线看 | www免费在线观看 | 日精品在线观看 | 国产免费又粗又猛又爽 | 日韩午夜一级片 | 香蕉影视 | 免费看在线看www777 | 青青久草在线视频 | 18网站在线观看 | 国产精品国产三级在线专区 | 色香蕉网 | 五月婷婷丁香 | 亚洲精品中文在线资源 | 91在线免费播放视频 | 最近最新中文字幕视频 | 国产视频在线免费 | 久99久精品视频免费观看 | 久久久久区 | 嫩嫩影院理论片 | 视频一区二区免费 | 在线观看免费黄色 | 丝袜美腿av | 91亚色免费视频 | 亚洲国产欧美在线看片xxoo | 日韩欧美xx | wwwwww色| 国产视频一区在线免费观看 | av在线播放网址 | 亚洲精品一区二区久 | 日韩激情久久 | 日韩在线免费电影 | 成人小电影在线看 | 久久久久国产成人免费精品免费 | 丝袜美腿亚洲综合 | 亚洲一区二区精品在线 | 91成人网页版 | 欧美黑人xxxx猛性大交 | 国产午夜亚洲精品 | 日日夜夜狠狠 | 成年人视频免费在线播放 | www九九热| 日韩欧美综合精品 | 97精品国产91久久久久久久 | 国产美女黄网站免费 | 日韩欧美xxx | 又大又硬又黄又爽视频在线观看 | 亚洲男女精品 | 91chinesexxx | 欧美视频在线观看免费网址 | 玖玖视频免费在线 | 婷婷色综合 | 亚洲综合狠狠干 | 免费看黄色小说的网站 | 亚洲精品麻豆视频 | 日韩精品免费 | 欧美婷婷综合 | 国内小视频 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 欧美黄色免费 | 欧洲激情在线 | 99免费| 日韩一区二区免费视频 | 精品国产一区二区三区久久久 | 91香蕉亚洲精品 | 国产91影视| 国产在线观看二区 | 三级在线播放视频 | 欧美国产一区在线 | 国产精品99久久久精品 | 日本中文在线 | 美女视频久久久 | 免费在线观看av电影 | 欧美亚洲国产精品久久高清浪潮 | 免费久久精品视频 | 91亚洲狠狠婷婷综合久久久 | 亚洲国产欧美在线人成大黄瓜 | 久久国际影院 | 亚洲国产成人久久综合 | 国产中文字幕亚洲 | 日韩中文字 | 日本三级久久 | 超碰在线99 | 人人舔人人爱 | 99爱在线 | 国产一区在线免费 | 日韩二三区 | 国产伦理久久精品久久久久_ | 伊甸园永久入口www 99热 精品在线 | 青青河边草手机免费 | 成人a视频片观看免费 | 日韩激情免费视频 | 精品天堂av | 一区二区三区免费在线 | 久久精品视频在线免费观看 | 日韩理论电影在线观看 | 亚洲精品国产第一综合99久久 | 免费在线观看成年人视频 | 亚洲黄色免费 | 婷婷色综 | 亚洲精品无 | 99精品国产99久久久久久97 | 伊人影院av | 精品日韩中文字幕 | 欧美一二三区在线播放 | 中文字幕在线观 | 国产黄影院色大全免费 | 国产福利91精品一区二区三区 | 成人免费观看视频大全 | 四虎在线免费视频 | 婷婷激情在线 | 伊人影院得得 | 一区二区三区动漫 | 美女福利视频一区二区 | 欧美91片 | 欧美一二在线 | 久久久久久久久久久综合 | 国产精品一区二区三区在线免费观看 | 狠狠干夜夜爽 | 久久综合欧美精品亚洲一区 | 丁香5月婷婷 | 天天综合色天天综合 | 亚洲精品国精品久久99热一 | 久久久久久麻豆 | 亚洲天堂网站 | 日韩电影一区二区在线观看 | 91精品国产自产在线观看 | 国产日韩精品一区二区 | 婷婷在线看 | 人人插人人澡 | 99色在线观看 | 欧美日韩亚洲一 | 国产视频综合在线 | 亚洲午夜av电影 | 欧美精品首页 | 97国产小视频 | 爱爱一区 | 久久影视精品 | 日韩欧美一区二区三区在线观看 | 久久在草| 欧美精品免费在线 | 亚洲一区二区高潮无套美女 | 一级片免费观看视频 | 久久久久久毛片 | 四虎影视国产精品免费久久 | av千婊在线免费观看 | 国产日本亚洲高清 | 精品国产伦一区二区三区 | 精品国产自在精品国产精野外直播 | 国产高清永久免费 | 亚洲涩涩涩涩涩涩 | 久久免费视频一区 | 美女在线黄| 国产精品剧情 | 欧美日韩免费一区二区 | 色狠狠久久av五月综合 | 国产精品不卡一区 | 亚洲成人精品av | 米奇狠狠狠888 | 亚洲黄色小说网址 | 成人在线观看你懂的 | 网站在线观看你们懂的 | 欧美精品亚州精品 | 五月婷婷综合色拍 | 人人插人人舔 | 人人插人人草 | 国产中文在线字幕 | 国产麻豆精品95视频 | 在线观看91久久久久久 | 国产成人精品久久二区二区 | 亚洲 欧美变态 另类 综合 | 精品免费久久久久久 | 免费性网站 | 五月天色中色 | 国产无遮挡猛进猛出免费软件 | 国产精品久久嫩一区二区免费 | 欧美日韩精品在线免费观看 | 在线亚洲观看 | 黄色免费观看 | 4p变态网欧美系列 | 国产精品一区二区电影 | 在线激情av电影 | 亚洲日本一区二区在线 | 国产成人333kkk | 精品视频99 | 亚洲jizzjizz日本少妇 | 在线精品视频免费观看 | 在线观看中文字幕2021 | 97超碰在线久草超碰在线观看 | 日本精品视频一区二区 | 日韩精品久久久久久久电影99爱 | 国产一区电影在线观看 | 午夜日b视频 | 亚洲精品白浆高清久久久久久 | 超碰九九| 日韩电影久久久 | 国产综合精品一区二区三区 | 激情综合六月 | 午夜在线免费观看视频 | 亚洲粉嫩av | 国产精品一区二区三区观看 | 天天操福利视频 | 超碰97国产在线 | 国产成人精品一区二区 | ww视频在线观看 | 亚洲丁香久久久 | 日韩av中文在线 | 久久久蜜桃一区二区 | 国产精品一区二区久久精品爱涩 | 97品白浆高清久久久久久 | 国内揄拍国内精品 | 西西www4444大胆视频 | 九色91在线| 亚洲视频在线免费观看 | 欧美一级日韩三级 | 欧洲精品码一区二区三区免费看 | 午夜精品视频免费在线观看 | 欧美一级视频免费 | 国产极品尤物在线 | 首页av在线| 激情伊人 | 国产亚洲精品免费 | 久久国内视频 | 成人a级免费视频 | 四虎成人精品永久免费av | 天天躁天天狠天天透 | 亚洲女人天堂成人av在线 | 精品久久久久久亚洲综合网站 | 天堂在线视频免费观看 | 欧美日韩亚洲在线观看 | 精品免费久久 | 日韩乱码中文字幕 | 国产精品久久久久一区二区三区 | 黄色.com| 国产成人精品亚洲a | av黄色免费网站 | 91网站免费观看 | 天天色棕合合合合合合 | 欧美大片第1页 | 色综合网在线 | 婷婷色五| 免费毛片aaaaaa | 超碰97网站 | 国产精品美女久久久免费 | 久久久久久国产精品 | 欧美日韩三区二区 | 国产中文自拍 | 欧美精品乱码久久久久 | 激情五月伊人 | 在线91播放 | 国产精品99久久久久久小说 | 天天操天天操天天操 | 亚洲视频www| 亚洲 中文 在线 精品 | av高清免费在线 | 在线视频中文字幕一区 | 欧美日韩亚洲精品在线 | 日韩高清在线观看 | 99在线视频精品 | 在线观看av中文字幕 | 久久亚洲精品电影 | 色多多污污 | 日韩精品一区二区在线观看 | 永久免费在线 | 成在人线av | 国内精品久久久 | 久久深夜福利免费观看 | 又黄又爽免费视频 | 在线视频欧美精品 | 久久成人在线视频 | 成人午夜片av在线看 | 一级黄色毛片 | 亚洲精品在线视频网站 | 欧美一性一交一乱 | 在线观看国产一区二区 | 免费看一级黄色大全 | 欧美一级片免费观看 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 免费日韩一区二区三区 | 日本在线成人 | 69国产精品视频 | 国产伦精品一区二区三区照片91 | 黄色免费大全 | 在线综合色 | 中文字幕资源在线 | 97精品在线观看 | 99r精品视频在线观看 | 91人人爽久久涩噜噜噜 | 在线观看免费福利 | 久久综合久久久久88 | 久久久亚洲国产精品麻豆综合天堂 | 最近中文字幕大全中文字幕免费 | 成人av免费网站 | 久久婷婷国产色一区二区三区 | 日日干夜夜干 | 最新日韩中文字幕 | 久久这里只有精品9 | 国产精品一区二区免费看 | 亚洲成人免费 | 婷婷伊人综合 | 国产美女网站在线观看 | 久久九九网站 | 日韩精品一区二区电影 | 久久网站免费 | 久久久免费观看 | 99久久99久久精品 | 久久99亚洲精品久久久久 | 成人免费在线视频 | 久久综合精品国产一区二区三区 | 中文字幕一区二 | 午夜精品av在线 | 久久情爱 | 婷色| 久久久久久久福利 | 在线免费观看成人 | 九九热在线观看视频 | 亚洲爽爽网 | 国产高清av在线播放 | 日韩欧美视频在线免费观看 | 蜜臀av麻豆 | 久久99精品波多结衣一区 | 日韩欧美黄色网址 | 精品一区二区久久久久久久网站 | 二区视频在线 | 日本精品视频免费观看 | 欧美成人亚洲 | 色妞色视频一区二区三区四区 | 人人超碰在线 | 日韩午夜三级 | 毛片在线播放网址 | 四虎在线永久免费观看 | 在线观看免费 | 黄色精品一区二区 | 国产韩国精品一区二区三区 | 亚洲 欧美 91| av免费网 | 91看片网址 | 人人舔人人爽 | 婷婷激情在线 | 在线播放精品一区二区三区 | 婷婷四房综合激情五月 | 国产成人精品一区二区三区免费 | 91精品国产福利 | 久久久蜜桃 | 日本天天色 | 久久综合久久久 | 免费的成人av | 国产一区二区免费 | 亚洲日本韩国一区二区 | 99这里只有精品视频 | 亚洲国产美女精品久久久久∴ | 黄色电影小说 | 国产精品久久久久久久久久东京 | 午夜精品一区二区三区在线观看 | 国产精品k频道 | 国产在线观看免 | 久久免费一级片 | 亚洲欧美日韩精品久久久 | 日韩电影中文字幕在线观看 | 国产成人综 | 久久久久久久久久久影视 | 国产在线久草 | 久久免费的视频 | 日韩一区二区三区在线看 | 最近2019中文免费高清视频观看www99 | 一区二区 精品 | av亚洲产国偷v产偷v自拍小说 | 国产黄色高清 |