Overlay Surfaces (覆盖表面)
生活随笔
收集整理的這篇文章主要介紹了
Overlay Surfaces (覆盖表面)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
覆蓋表面(Overlay Surfaces) 覆蓋表面是具有特殊硬件支持能力的表面,通常用于顯示活動視頻、錄制視頻或靜止位圖而不需要位塊傳輸到主表面或改變主表面的內容。對覆蓋表面的字此完全由硬件提供,DirectDraw支持顯示設備驅動程序所支持的特性,DirectDraw不仿真覆蓋表面。可以將覆蓋表面想象為一片塑料紙,我們可以在這片塑料上畫圖并可將其放置在顯示器前面。塑料紙覆蓋在顯示器前面時,你可以看到覆蓋和主表面,移去塑 料紙后,主表面并沒有改變。覆蓋表面的工作原理同透明塑料紙覆蓋的原理很相似。的顯示一個覆蓋表面時,就是告訴設備驅動程序在哪里怎樣使覆蓋表面可見。當顯示設備掃描線重畫到顯示器上時,它檢查主表面上的每一個像素,看是否被覆蓋所代替。如果是,顯示設備就從覆蓋表面中抽取相關像素的數據替代。 使用這種方法,顯示適配卡在顯示器上生成主表面和覆蓋表面的合成表面,產生透明和拉伸效果而不需要改變每個表面的內容。合成表面被送入視頻數據流直接送到顯示器。因為這種處理和像素替代是硬件級的操作,所以不存在明顯的性能損失。另外,這種方法還使得能夠用不同的像素格式無縫地合成主表面和覆蓋表面。創建覆蓋表面需要在DDSCAPS結構中指定DDSCAPS_OVERLAY標志,然后調用IDirectDraw2::CreateSurface方法覆蓋表面只能在支配內存中創建,因此還必須包含DDSCAPS_VIDEOMEMORY標志。同其他類型的表面一樣,通過包含合適的標志,可以創建單一的覆蓋表面也可以創建由多個覆蓋組成的翻轉鏈。 你可以調用IDirectDraw2::GetCaps方法來獲取有關支持的覆蓋特性的信息。該方法用描述所有的特性信息填充一個DDCAPS結構。在報告硬件特性時,設備驅動程序設置dwCaps成員的標志來指明何時強制執行硬件提供的某種類型的約束。獲得的驅動程序的能力后,通過檢查dwCaps成員的標志可知道提供的約束的信息。DDCAPS結構包含了9個成員,這9個成員描述了覆蓋表面的約束信息。下標列出了同覆蓋相關的成員既它們的標志。 成員 標志 dwMaxVisibleOverlays 該成員始終有效 dwCurrVisibleOverlays 該成員始終有效 dwAlignBoundarySrc DDCAPS_ALIGNBOUNDARYSRC dwAlignSizeSrc DDCAPS_ALIGNSIZESRC dwAlignBoundaryDest DDCAPS_ALIGNBOUNDARYDESdwAlignSizeDest DDCAPS_ALIGNSIZEDEST dwMinOverlayStretch DDCAPS_OVERLAYSTRETCH dwMaxOverlayStretch DDCAPS_OVERLAYSTRETCH dwMaxVisibleOverlays和dwCurrVisibleOverlays成員指明了硬件可以顯示的覆蓋的最大數目,以及當前有多少個可見。dwAlignBoundarySrc、dwAlignSizeSrc、dwAlignBoundaryDest、dwAlignSizeDest和dwAlignStrideAlign成員是硬件報告的矩形的位置和大小的約束。這些成員的值指明了在顯示覆蓋表面時如何確定源矩形和目的矩形的大小和位置。dwMinOverlayStretch和dwMaxOverlayStretch是有關拉伸因子的信息。 a、源矩形和目的矩形(Source and Destination Rectangles)要顯示一個覆蓋表面,需調用IDirectDrawSurface3::UpdateOverlay方法,在dwFlags參數中指定DDOVER_SHOW標志。該方法要求你在lpSrcRect和lpDestRect參數中指定一個源矩形和目的矩形。若使用整個表面,將lpSrcRect參數設為NULL即可。目的矩形是在主表面上產生覆蓋表面的位置。 源、目的矩形不必大小相同。一般讓目的矩形必源矩形大一些或小一些都可以,硬件在顯示時會自動地壓縮或拉伸。要想成功地顯示一個覆蓋表面,可能需要調整源、目的矩形的大小和位置,這一過程是否必要依賴于設備驅動程序的限制。 b、邊界和大小調整(Boundary and Size Alignment) 由于不同硬件的限制,一些設備驅動程序對用于顯示覆蓋表面的源矩形和目的矩形的大小和位置做了約束。要找出設備應用的約束,可調用IDirectDraw2::GetCaps方法,然后檢查DDCAPS結構中同覆蓋相關的dwCaps成員的標志。下標列出了指定邊界和大小調整約束的成員和標志。 類別 標志 成員 邊界約束 DDCAPS_ALIGNBOUNDARYSRC dwAlignBoundarySrc DDCAPS_ALIGNBOUNDARYDEST dwAlignBoundaryDest 大小約束 DDCAPS_ALIGNSIZESRC dwAlignSizeSrc DDCAPS_ALIGNSIZEDEST dwAlignSizeDest 約束有兩種,邊界約束和大小約束。兩種約束都以像素的方式表示,并且能夠用于源矩形和目的矩形。當然,由于覆蓋表面和主表面的像素格式的不同,這些約束也可以不一樣。 邊界約束影響源矩形和目的矩形放置的位置。dwAlignBoundarySrc和dwAlignBoundaryDest成員的值告訴你如何調整相關矩形的左上角。 矩形左上角的X坐標(RECT結構中的left成員)必須是報告出的值的整數倍。 大小約束影響源矩形和目的矩形的有效寬度。dwAlignSizeSrc和dwAlignSizeDest成員的值以像素的格式指出怎樣調整相關矩形的寬。如果按照一個最小拉伸因子拉伸矩形,應確保拉伸后的矩形仍然是大小調整過的。拉伸矩形之后,通過向上圓整來調整寬度,就可以保持最小的拉伸因子。 c、最大和最小拉伸因子(Minimum and Maximum Stretch Factors) 由于硬件的局限性,一些設備限制了目的矩形同相關的源矩形寬度的比較。DirectDraw將這些約束作為拉伸因子。一個拉伸因子就是源矩形同目的矩形的寬度之間的比率。若驅動程序提供有關拉伸因子的信息,在調用IDirectDraw2::GetCaps方法時后,它將在DDCAPS結構中設置DDCAPS_OVERLAYSTRETCH標志。注意,拉伸因子都已經乘以1000,所以值為1300的拉伸因子實際上是1.3。 不壓縮和拉伸覆蓋目的矩形的設備所報告出的最大最小拉伸因子通常是0。 最小拉伸因子指出目的矩形比源矩形寬多少或窄多少。如果最小拉伸因子大于1000,就必須增加目的矩形的寬度。例如,若拉伸因子為1300,則目的矩形的寬度應該至少是源矩形寬度的1.3倍。如果拉伸因子小于1000,目的矩形就比源矩形的寬度要小。最大拉伸因子是目的矩形能夠拉伸的最大倍數。例如,若最大拉伸因子是2000,則目的矩形的寬度最多可以是源矩形寬度的2倍。若最大拉伸因子小于1000, 目的矩形就需要壓縮。經過拉伸之后,目的矩形必須遵守設備要求的任何大小調整約束。因此,最后在大小調整之前拉伸目的矩形。硬件并不要求調整目的矩形的高度。你可以增加矩形的高度來保持方向比率的不變。 d、覆蓋Color Key 象其它類型的表面一樣,覆蓋表面也使用源、目的Color Key來控制表面之間的透明位塊傳輸操作。因為覆蓋表面的顯示不是通過位塊傳輸完成的,所以在調用IDirectDrawSurface3::UpdateOverlay方法時就需要采取不同的辦法來控制覆蓋表面顯示在主表面上的方式。答案就是覆蓋Color Key。同位塊傳輸相關的Color Key相似,覆蓋Color Key也有源Color Key和目的Color Key,可通過調用方法 IDirectDrawSurface3::SetColorKey并利用DDCKEY_DESTOVERLAY標志來設置源Color Key和目的Color Key。覆蓋表面能夠將位塊傳輸和覆蓋Color Key結合在一起來控制位塊傳輸操作和覆蓋顯示操作,兩種不同類型的Color Key并不互相沖突。 IDirectDrawSurface3::UpdateOverlay方法用源Color Key檢查覆蓋表面中哪個像素應該是透明的,允許主表面透過覆蓋表面顯示。同樣,該方法使用目的覆蓋Color Key來確定主表面顯示時哪部分允許倍覆蓋表面所覆蓋,其顯示效果同位塊傳輸Color Key相同。 e、 定位覆蓋表面(Positioning Overlay Surfaces) 在最先調用IDirectDrawSurface3::UpdateOverlay方法顯示一個覆蓋時,可以用方法 IDirectDrawSurface3::SetOverlayPosition來更新目的矩形。必須確保你指定的目的矩形的位置遵守邊界對齊約束, IDirectDraw2::SetOverlayPosition方法并不執行剪切工作,使用了可能引起覆蓋越界的坐標會使調用該方法失敗,并返回DDERR_INVALIDPOSITION。 f、創建覆蓋表面(Creating Overlay Surfaces) 象所有的表面一樣,你可以調用IDirectDraw2::CreateSurface方法來創建一個覆蓋表面。創建覆蓋表面還需要在相關的結構DDSCAPS中包含DDSCAPS_OVERLAY標志。覆蓋支持許多顯示設備,因此不能判斷一個給定的像素格式是否被大多數的驅動程序所支持,必須做好準備使之能工作于多種像素格式。你可以調用IDirectDraw2::GetFourCCCodes方法來獲得驅動程序支持的有關非RGB格式的信息。要創建一個覆蓋表面,最好使用最常用的像素格式,若給定的像素格式不被支持,DirectDraw會使用顯示設備所支持的其他像素格式。創建覆蓋表面翻轉鏈也是允許的。 g、翻轉覆蓋表面(Flipping Overlay Surfaces) 同其他類型的表面一樣,你可以創建覆蓋表面翻轉鏈。一旦創建了覆蓋的翻轉鏈,就可以調用方法IDirectDrawSurface3::Flip來翻轉這些覆蓋。軟件解壓在調用Flip方法顯示覆蓋表面時可使用DDFLIP_ODD和 DDFLIP_EVEN標志以減少運動贗象。如果驅動程序支持奇──偶翻轉,在獲得了驅動程序的能力后,DDCAPS2_CANFLIPODDEVEN標志將會在DDCAPS結構中設定。一旦設定了DDCAPS2_CANFLIPODDEVEN,就可在調用IDirectDrawSurface3::UpdateOverlay方法時包含DDOVER_BOB標志以通知驅動程序使用“Bob” 算法最小化運動贗象。此后,用DDFLIP_ODD或 DDFLIP_EVEN標志調用Flip時,驅動程序將會自動調整覆蓋的源矩形來彌補抖動贗象。 如果獲取硬件的能力后沒有設置DDCAPS2_CANFLIPODDEVEN標志,但在調用UpdateOverlay時又使用了 DDOVER_BOB標志,那么該調用將會失敗。
?
轉載于:https://www.cnblogs.com/azraelly/archive/2013/01/13/2858852.html
總結
以上是生活随笔為你收集整理的Overlay Surfaces (覆盖表面)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj 2182 Lost Cows 解
- 下一篇: Intel altera opencl