tag:blogger.com,1999:blog-21172701367321583102024-03-20T06:13:23.322+08:00Real Checko's Blogcheckohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.comBlogger774125tag:blogger.com,1999:blog-2117270136732158310.post-59376466131234783232011-08-22T11:52:00.004+08:002011-08-22T11:56:44.597+08:00原來是為了古老的"Large Array, 32M memory" 問題google 一下。<br>
<br />找到這裡 <a href="http://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-pb/492/VirtualAlloc-still-has-a-32MB-limit">http://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-pb/492/VirtualAlloc-still-has-a-32MB-limit</a>
<br />
<br />原來是有只個有用的回覆。<br>
<br />後來卻變成 eMVP 對 MS share code license 的討論了..<br>
<br />兩點:
<br />1. share code 的fair use可不可以用來 作support 時使用。值得花這麼多時間討論嗎?用來解決那個 32M , large array limit 不是很好?
<br />2. 原來大部分的問都是因為 "沒有 source code,所以我不知道" ...
<br />
<br />checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com3tag:blogger.com,1999:blog-2117270136732158310.post-69875029306710801892011-02-25T20:12:00.002+08:002011-02-25T20:35:39.386+08:00Buildrel -- sharing violation奇怪,在某些 workspace 作 buildrel 會出現 sharing violation。<br />所以去找 buildrel.bat ==> 在 C:\WINCE500\PUBLIC\COMMON\OAK\MISC 找到。<br /><br />打開後,在第 20 行加上 echo on,再 run 一次 buildrel,這樣每個動作就都會印出來。<br />然後找到..<br /><code>C:\WINCE500\PLATFORM\SMDK2416>xcopy /q /c <br />C:\WINCE500\PBWorkspaces\Core2416\WINCE500\smdk2416_ARMV4I\oak\Files\nlscpg.txt <br />C:\WINCE500\PBWorkspaces\Core2416\RelDir\smdk2416_ARMV4I_Release<br />Sharing violation<br />0 File(s) copied<br /></code><br /><br />這個看起來好像是一個 FAQ 了: <a href="http://social.msdn.microsoft.com/Forums/en-US/winembplatdev/thread/49926e06-d048-4b95-827f-ab17e97d8f88/">http://social.msdn.microsoft.com/Forums/en-US/winembplatdev/thread/49926e06-d048-4b95-827f-ab17e97d8f88/</a><br />而且好像就發生在 nlscpg.txt 這個檔。<br /><br />MS 好像沒有要 fix 的意思。<br />只有在 buildrel 的 document 有一項:<br />如果發生 sharing violation error,請用 copy 不要用 copylink<br /><br />!!! 天那!! copy 的話要花好久時間 !!checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-7669228121722845142010-10-25T09:30:00.002+08:002010-10-25T09:36:22.194+08:00New (?) Blog終於又可以回到 linux 了。<br /><br />就跟當初因為 Windows CE 而轉換 blog一樣,這次也要轉換 blog (反正 blogger 新開 blog 不用錢 X)<br /><br /><a href="http://r40eubuntu.blogspot.com/">R40eUbuntu</a><br /><br />這麼奇怪的名字是因為當初是 R40e 的維護記錄。後來就當做 linux 相關blog 記錄。<br /><br /><br />* 希望我以後再也不用更新這個 site 的資料.. (>_<)checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-40211195413837618652010-10-22T10:03:00.001+08:002010-10-22T10:08:54.026+08:00倫敦交易所創下最快交易記錄記得這一連串的事件 -- <a href="http://realchecko.blogspot.com/search?q=%E5%80%AB%E6%95%A6">倫敦交易所</a><br /><br />今天的新聞: <a href="http://www.computerworlduk.com/news/networking/3244936/london-stock-exchange-smashes-world-record-trade-speed-with-linux/">倫敦交易所創下最快交易記錄</a><br /><br />但是..好像還只是試運轉.checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-27157456030896553662010-09-24T16:53:00.001+08:002010-09-24T16:59:37.415+08:00latest ffmpeg rev can play logged 1seg TS使用 v0.6 以後 (2010 09 23) 的 ffmpeg <br />ffplay 可以播放 1seg log stream..checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com1tag:blogger.com,1999:blog-2117270136732158310.post-39507995959932161182010-09-17T17:07:00.005+08:002010-09-17T17:41:34.420+08:00write code to parse logged 1SEG TS Data. with ISO/IEC 13818-1所包含的 PID 有:<br /><ul><li>0x0010</li><li>0x0011</li><li>0x0014</li><li>0x0024</li><li>0x0301<br /></li><li>0x0400</li><li>0x0500</li><li>0x0600</li><li>0x1FC8</li><li>0x1FFF</li></ul>下面是兩個同樣 log 10M 的 STREAM。<br />COLORBAR:<br /><code>0010: 202<br />0011: 101<br />0014: 40<br />0024: 202<br />0301: 3486<br />0400:21145<br />0500: 9451<br />1FC8: 1008<br />1FFF:20144<br /></code><br />TESTVIDEO<br /><code>0010: 202<br />0011: 101<br />0014: 40<br />0024: 202<br />0400:35010<br />0500: 9450<br />0600: 3486<br />1FC8: 1009<br />1FFF: 6276<br /></code><br />下面是 log 1M 的 TESTVIDEO<br /><code>0010: 20<br />0011: 10<br />0014: 4<br />0024: 20<br />0400: 3499<br />0500: 946<br />0600: 349<br />1FC8: 101<br />1FFF: 635<br /></code><br />當 CN 低時,會有 error,這時候 bit : transport_error_indicator 就會是 1. 有時候,該 packet 的 pid 就不在上述範圍內。<br /><br />Color Bar TEST STREAM 有很多 priority packet (priority bit = 1)。<br />一般影片的 TEST STREAM 就沒有 priority packet。<br />priority packet 的 pid 是 0x0301 和 0x0010。0x0010 同時是 start packet.checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-9189113997183560302010-09-16T13:51:00.001+08:002010-09-16T13:53:58.674+08:00use VLC to play 1SEG TS file用 VLC 1.0.2:<br /><code><br />vlc --ts-extra-pmt=15=0x400:27 log.trp<br /></code><br />可以撥 save 起來的 1SEG TS file.checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-59466353865931665222010-09-15T15:32:00.003+08:002010-09-15T15:39:14.464+08:00Serial TS (Transport Stream) bus signal definitionSerial Type Transport Stream 的信號 pin 有:<br /><ul><li>TSCLK : clock</li><li>TSO : Data</li><li>TSEN : TS valid (有點類似 chip select)</li><li>TSPAC : Syn Byte (在送出 sync byte 的data 時會有動作)</li><li>TSER : TS Packet Error flag (packet 有 error 時會有動作)</li></ul>Transport Stream 分為 3 部份:<br /><pre><br /> Sync --- Stream Data -- Pariry<br /></pre><br />其中 Sync + Stream Data == 188 byte<br />Parity 有 16 byte<br /><br />一般的 chip 可以指定 TSEN 要不要把 parity 的data 也算進去。<br />另外,除了 stream packet 外,在沒有信號,或是有 error 時,會有 NULL packet。<br />也可以決定在送 null packet 時,clock 要不要動作。checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-71703329479321496972010-09-14T10:21:00.002+08:002010-09-14T10:27:08.945+08:00奇怪mcu的I2C奇怪波形<div>悲哀的cheap mcu,送出的 I2C 撥波行徑然是..</div><a href="http://www.flickr.com/photos/checkoblog/4988240473/" title="poormcubadi2cwave by Checko's Blog Image, on Flickr"><img src="http://farm5.static.flickr.com/4146/4988240473_83002b6a04.jpg" width="500" height="428" alt="poormcubadi2cwave" /></a><div>可以看到在 START command 前,會送出一個 CLK, SDA 都是 Low 的 plus,然後 start condition 後, SDA 竟然會有一個 high-puls。</div><div>雖然這樣沒有違反 I2C wave form standard(?)</div><div>ref : <a href="http://en.wikipedia.org/wiki/I%C2%B2C">wik</a>i </div><div><br /></div><div>但是有些 chip 就是不吃這樣的波形呀。</div><div><br /></div><div>能偷就偷,不知道這種 chip design house 的品質是怎樣做出來的...</div>checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-68201579910028298752010-09-09T15:07:00.002+08:002010-09-13T14:36:06.556+08:00ULPI -- USB interface standardUSB Controller 與 PHY 的介面原為 22 pin 以上的 UTMI 介面。<br />後來為了減少 pin count,重新定義了12 pin 的 ULPI (UTMP+ Low Pin Interface)介面。<br /><br />從此,USB controller 與 PHY 只要是標準 ULPI 介面的,都可以互換。<br /><br />ULPI 的標準竟然含一個 由 PHY 輸出的 CLKOUT(60MHz)。<br />也就是說,ULPI 標準,規定了 crystal 要裝在 PHY 那一端。(?)<br /><br />ULPI 也規定了內部的 register map,所以才能達到 chip 可以互換的要求。<br />規定了四類 register:<br /><ul><li>ID</li><li>Mode</li><li>Interrupt</li><li>Extra<br /></li></ul>checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-80541117980463793632010-09-07T17:22:00.002+08:002010-09-07T17:30:33.298+08:00接上 USB ActiveSync 後,一連線上就中斷,然後反覆。<br /><br />這是因為由 KITL image 換成 NOKITL後,沒有重新sysgen 的關係。<br /><code>>blddemo clean -q</code>後,就可以了。checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-77279249632529130352010-09-03T12:01:00.003+08:002010-09-03T19:00:47.949+08:00OpenGL ES 筆記 - IIIfrom : http://www.sunsetlakesoftware.com/2008/08/05/lessons-molecules-opengl-es<br /><hr /><br />原來的OpenGL 包涵很多none-effecicent api,OpenGL ES 把所有none-effiicienct api 都拿掉了。<br /><br /><span style="font-weight: bold;">Config</span><br /><br />EGLConfig 是要告訴 OpenGL 目前這個hardware platform surface 的 rendering format。<br />使用 eglGetConfigs( ) 可以取出目前這個platform 所有 support 的 rendering format。<br /><br />要決定 config 有很多複雜的動作:<br /><br />詢問目前 platform support 的 config 有哪些。<br />設定目前要用的config<br /><br />config 是由一堆 attrib 組成,EGL 用一維 array 來代表:分別是<br /><code>{attrib1,value1,attrib2,value2...EGL_NONE};</code><br /><br /><span style="font-weight: bold;">Attrib</span><br /><br />EGL_BUFFER_SIZE<br /><blockquote>Color buffer depth (bit 數)<br />= RED_SIZE + GREEN_SIZE + BLUE_SIZE + ALPHA_SIZE<br /></blockquote><br /><hr /><br />輸入Vertex array 與 繪圖<br /><br />畫圖的動作分成兩部份:<br /><ul><li>將 定義 Vertext Point 的 Array 丟進 OpenGL</li><li>要 OpenGL 以 XXX 的順序畫圖</li></ul>所以需要提供兩種資料:<br /><ul><li>Vertex point array</li><li>Vertex Draw Sequence</li></ul>第一個資料用 glVertexPointers( ) function 來送入 OpenGL。<br />第二個資料用 glDrawElements( ) 時傳入。<br /><code>void glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);</code>其中 size 是每一個 vertex 的 coordinate number -- 就是一個Vertex 需要幾筆資料來表示。因為是3維座標,所以寫 3 (default 是 4).<br /><br /><code>void glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);</code>其中 indices 就是繪出的順序。<br />indices 的內容通常是:<code>{0,4,1,0,9,4,9,5,4}</code>這是說,先由點 0,4,1 畫出一個三角形,再用點 0,9,4 話一個,然後是點 9,5,4 的三角形。checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-38612677106146151372010-09-03T11:35:00.002+08:002010-09-03T12:01:39.065+08:00OpenGL ES 筆記 - II一樣,ref http://blog.jayway.com<br /><hr /><br />OpenGL ES 採用 右手直角座標 -- 也就是說<br /><blockquote>右手方向是 X<br />上方是Y<br />背後是 Z<br /><br />而初始的 view 位置就是在 0.0.0<br /></blockquote>Transformation 就是把要描繪的物體在座標軸上轉換,有以下的轉換動作:<br /><ol><li>Translate 平移 </li><li>Rotate 旋轉</li><li>Scale 放大/縮小</li></ol>以上的動作都有一function 可以作,參數分別是對 x, y ,z 軸的參數,其中 Rotate 的參數單位是 degree。<br /><br /><hr />checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-11805167232098305002010-09-03T09:49:00.004+08:002010-09-03T11:30:09.068+08:00OpenGL ES 筆記一堆opengl 的筆記。<br />ref:<br />http://wiki.forum.nokia.com/<br />http://blog.jayway.com/<br /><hr /><br /><span style="font-weight: bold;">OpenGL 的繪圖步驟:</span><br /><ol><li>取得 <span style="color: rgb(204, 0, 0);">display</span> --- 就是 pc monitor,或是手機的 lcd panel.<br /></li><li><span style="color: rgb(255, 0, 0);">initializ</span>e EGL<br /></li><li>選一個 <span style="color: rgb(255, 0, 0);">config</span>/mode</li><li>create一個 <span style="color: rgb(255, 0, 0);">context</span></li><li>create一個 用來繪圖的 <span style="color: rgb(255, 0, 0);">surface</span></li><li><span style="color: rgb(255, 0, 0);">enable</span> 剛剛create的 context</li></ol><span style="font-weight: bold;">OpenGL ES 繪圖基本元素(Primitives)</span><br /><ol><li>Vertex ( Vertices) : 最小的基本繪圖單位,就是兩線交會的點。(point)<br />Vertex 在 OpenGL ES 中被用作描繪3D model 的元素,也被用來指定 camera , light 的位置。</li><li>Edge : 連接兩個 Vertex 的直線</li><li>Face : 由三個 Vertex 包成的三角形區域。<br />當要定義一個face 時,他的三個vertex 的順序是很重要的,vertex 順序被用來判定face 的正面和背面(右手定則?)。有時候,可以指定只 render 正面,好節省時間。</li></ol>定義一個多邊形 (Polygon)<br /><blockquote>多邊型的每個面要被拆解成一個一個的三角型,然後把每個三角形的端點(vertex) 寫出來就可以。<br /><br />所以寫出來,會是一個array:<br /><code>{<br />-1.0f, 1.0f, 0.0f, // 0 Top Left<br />-1.0f, -1.0f, 0.0f, // 1 Bottom Left<br />1.0f, -1.0f, 0.0f, // 2 Bottom Right<br />1.0f, 1.0f, 0.0f // 3. Top Right<br />}</code><br /><br />把 vortex 訂出來後,還需要一個資料,告訴OpenGL 哪幾點構成一個 triangle,這個資料叫 indices:<br /><code>{<br />0,1,2, // 第一個triangle 由 vertex 0.1.2 構成<br />0,2,3<br />};<br /></code></blockquote><span style="font-weight: bold;">OpenGL ES 描繪的方式 (render primitive)</span><br /><blockquote>剛剛 OpenGL ES 的 primitives 定義 "描述物體的基本元素",現在要講得是如何把這些 "描述" 畫出來。</blockquote><ol><li>GL_POINTS : 只描出 定義的點</li><li>GL_LINE_STRIP : 依順序描出點之間的線</li><li>GL_LINE_LOOP : 和 GL_LINE_STRIP 一樣,但是再加一條 : 最後一點到第一點的線</li><li>GL_LINES : 兩兩描出一線</li><li>GL_TRIANGLES : 每三點描出一triangle</li><li>GL_TRIANGLE_STRIP :有點難,就是每三點描出一triangle外,再包圍起來。</li><li>GL_TRIANGLE_FAN : 一樣,有點難,每三點描出一 triangle外,再用扇形圍起來。</li></ol>所以一般常用的rendering primitives 是 GL_TRIANGLEScheckohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-92133435564500323612010-08-23T11:14:00.006+08:002010-08-23T11:32:09.339+08:00抱怨:PANASONIC DVD 錄放影機 一過保就壞了去年 5 月底買的 PANASONIC DVD 錄放影機 DMR ES15,5200。<br />結果保固一年一過就壞了,而且是壞在最貴的雷射頭。修理1900。 超過原價的 1/3 。<br /><br />這樣的設計功力應該才是最厲害的...剛好過保固就壞。<br /><hr><br />L 提供的: http://se.sunfar.com.tw/promo/9908/05.htm 順發延長保固 -- 就像 apple care, IBM, Dell 一樣,可以加買保固。checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-64954357046646423052010-08-12T15:42:00.003+08:002010-08-12T17:08:47.873+08:00Modify DDCAPS for CE 6.0DDCAPS 是 platform builder 提供,偵測 platform 支援 directdraw 的程度。<br />但是 CE 6.0 後,DirectDraw interface 大幅改變,所以這個 code 就不能用了。要修改後才行。<br /><br />修改後的 code:<br /><br /><code>Index: ddcaps.c<br />===================================================================<br />--- ddcaps.c (revision 23142)<br />+++ ddcaps.c (working copy)<br />@@ -74,7 +74,7 @@<br /> LPDWORD caps;<br /> LPCAPSDEFSTYPE defs;<br /><br />-} gCaps[10];<br />+} gCaps[12];<br /><br />struct<br />{<br />@@ -102,131 +102,83 @@<br />LPDIRECTDRAW lpDD; // DirectDraw object<br /><br />// Map caps bits to readable strings<br />-CAPSDEFSTYPE ddCapsDefs[MAX_BOXES] =<br />-{<br />- {TEXT("3D"), DDCAPS_3D},<br />- {TEXT("ALIGNBOUNDARYDEST"), DDCAPS_ALIGNBOUNDARYDEST},<br />- {TEXT("ALIGNSIZEDEST"), DDCAPS_ALIGNSIZEDEST},<br />- {TEXT("ALIGNBOUNDARYSRC"), DDCAPS_ALIGNBOUNDARYSRC},<br />- {TEXT("ALIGNSIZESRC"), DDCAPS_ALIGNSIZESRC},<br />- {TEXT("ALIGNSTRIDE"), DDCAPS_ALIGNSTRIDE},<br />- {TEXT("BLT"), DDCAPS_BLT},<br />- {TEXT("BLTQUEUE"), DDCAPS_BLTQUEUE},<br />- {TEXT("BLTFOURCC"), DDCAPS_BLTFOURCC},<br />- {TEXT("BLTSTRETCH"), DDCAPS_BLTSTRETCH},<br />- {TEXT("GDI"), DDCAPS_GDI},<br />- {TEXT("OVERLAY"), DDCAPS_OVERLAY},<br />- {TEXT("OVERLAYCANTCLIP"), DDCAPS_OVERLAYCANTCLIP},<br />- {TEXT("OVERLAYFOURCC"), DDCAPS_OVERLAYFOURCC},<br />- {TEXT("OVERLAYSTRETCH"), DDCAPS_OVERLAYSTRETCH},<br />- {TEXT("PALETTE"), DDCAPS_PALETTE},<br />- {TEXT("PALETTEVSYNC"), DDCAPS_PALETTEVSYNC},<br />- {TEXT("READSCANLINE"), DDCAPS_READSCANLINE},<br />- {TEXT("STEREOVIEW"), DDCAPS_STEREOVIEW},<br />- {TEXT("VBI"), DDCAPS_VBI},<br />- {TEXT("ZBLTS"), DDCAPS_ZBLTS},<br />- {TEXT("ZOVERLAYS"), DDCAPS_ZOVERLAYS},<br />- {TEXT("COLORKEY"), DDCAPS_COLORKEY},<br />- {TEXT("ALPHA"), DDCAPS_ALPHA},<br />- {TEXT("CKEYHWASSIST"), DDCAPS_COLORKEYHWASSIST},<br />- {TEXT("NOHARDWARE"), DDCAPS_NOHARDWARE},<br />- {TEXT("BLTCOLORFILL"), DDCAPS_BLTCOLORFILL},<br />- {TEXT("BANKSWITCHED"), DDCAPS_BANKSWITCHED},<br />- {TEXT("BLTDEPTHFILL"), DDCAPS_BLTDEPTHFILL},<br />- {TEXT("CANCLIP"), DDCAPS_CANCLIP},<br />- {TEXT("CANCLIPSTRETCHED"), DDCAPS_CANCLIPSTRETCHED},<br />-};<br /><br />+<br />CAPSDEFSTYPE CKeyCapsDefs[MAX_BOXES] =<br />{<br />- {TEXT("DESTBLT"), DDCKEYCAPS_DESTBLT},<br />- {TEXT("DESTBLTCLRSPACE"), DDCKEYCAPS_DESTBLTCLRSPACE},<br />+ {TEXT("BOTHBLT"), DDCKEYCAPS_BOTHBLT},<br />+ {TEXT("DESTBLT"), DDCKEYCAPS_DESTBLT },<br />+ {TEXT("DESTBLTCLRSPACE"), DDCKEYCAPS_DESTBLTCLRSPACE },<br /> {TEXT("DESTBLTCLRSPACEYUV"), DDCKEYCAPS_DESTBLTCLRSPACEYUV},<br />- {TEXT("DESTBLTYUV"), DDCKEYCAPS_DESTBLTYUV},<br />- {TEXT("DESTOVERLAY"), DDCKEYCAPS_DESTOVERLAY},<br />- {TEXT("DESTOVERLAYCLRSPACE"), DDCKEYCAPS_DESTOVERLAYCLRSPACE},<br />- {TEXT("DESTOVERLAYCLRSPACEYUV"), DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV},<br />- {TEXT("DESTOVERLAYONEACTIVE"), DDCKEYCAPS_DESTOVERLAYONEACTIVE},<br />- {TEXT("DESTOVERLAYYUV"), DDCKEYCAPS_DESTOVERLAYYUV},<br />- {TEXT("SRCBLT"), DDCKEYCAPS_SRCBLT},<br />+ {TEXT("SRCBLT"), DDCKEYCAPS_SRCBLT },<br /> {TEXT("SRCBLTCLRSPACE"), DDCKEYCAPS_SRCBLTCLRSPACE},<br />- {TEXT("SRCBLTCLRSPACEYUV"), DDCKEYCAPS_SRCBLTCLRSPACEYUV},<br />- {TEXT("SRCBLTYUV"), DDCKEYCAPS_SRCBLTYUV},<br />- {TEXT("SRCOVERLAY"), DDCKEYCAPS_SRCOVERLAY},<br />- {TEXT("SRCOVERLAYCLRSPACE"), DDCKEYCAPS_SRCOVERLAYCLRSPACE},<br />- {TEXT("SRCOVERLAYCLRSPACEYUV"), DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV},<br />- {TEXT("SRCOVERLAYONEACTIVE"), DDCKEYCAPS_SRCOVERLAYONEACTIVE},<br />- {TEXT("SRCOVERLAYYUV"), DDCKEYCAPS_SRCOVERLAYYUV}<br />+ {TEXT("SRCBLTCLRSPACEYUV"), DDCKEYCAPS_SRCBLTCLRSPACEYUV },<br />};<br /><br />-CAPSDEFSTYPE FXCapsDefs[MAX_BOXES] =<br />-{<br />- { TEXT("BLTARITHSTRETCHY"), DDFXCAPS_BLTARITHSTRETCHY },<br />- { TEXT("BLTARITHSTRETCHYN"), DDFXCAPS_BLTARITHSTRETCHYN },<br />- { TEXT("BLTMIRRORLEFTRIGHT"), DDFXCAPS_BLTMIRRORLEFTRIGHT },<br />- { TEXT("BLTMIRRORUPDOWN"), DDFXCAPS_BLTMIRRORUPDOWN },<br />- { TEXT("BLTROTATION"), DDFXCAPS_BLTROTATION },<br />- { TEXT("BLTROTATION90"), DDFXCAPS_BLTROTATION90 },<br />- { TEXT("BLTSHRINKX"), DDFXCAPS_BLTSHRINKX },<br />- { TEXT("BLTSHRINKXN"), DDFXCAPS_BLTSHRINKXN },<br />- { TEXT("BLTSHRINKY"), DDFXCAPS_BLTSHRINKY },<br />- { TEXT("BLTSHRINKYN"), DDFXCAPS_BLTSHRINKYN },<br />- { TEXT("BLTSTRETCHX"), DDFXCAPS_BLTSTRETCHX },<br />- { TEXT("BLTSTRETCHXN"), DDFXCAPS_BLTSTRETCHXN },<br />- { TEXT("BLTSTRETCHY"), DDFXCAPS_BLTSTRETCHY },<br />- { TEXT("BLTSTRETCHYN"), DDFXCAPS_BLTSTRETCHYN },<br />- { TEXT("OVERLAYARITHSTRETCHY"), DDFXCAPS_OVERLAYARITHSTRETCHY },<br />- { TEXT("OVERLAYARITHSTRETCHYN"), DDFXCAPS_OVERLAYARITHSTRETCHYN },<br />- { TEXT("OVERLAYSHRINKX"), DDFXCAPS_OVERLAYSHRINKX },<br />- { TEXT("OVERLAYSHRINKXN"), DDFXCAPS_OVERLAYSHRINKXN },<br />- { TEXT("OVERLAYSHRINKY"), DDFXCAPS_OVERLAYSHRINKY },<br />- { TEXT("OVERLAYSHRINKYN"), DDFXCAPS_OVERLAYSHRINKYN },<br />- { TEXT("OVERLAYSTRETCHX"), DDFXCAPS_OVERLAYSTRETCHX },<br />- { TEXT("OVERLAYSTRETCHXN"), DDFXCAPS_OVERLAYSTRETCHXN },<br />- { TEXT("OVERLAYSTRETCHY"), DDFXCAPS_OVERLAYSTRETCHY },<br />- { TEXT("OVERLAYSTRETCHYN"), DDFXCAPS_OVERLAYSTRETCHYN },<br />- { TEXT("OVERLAYMIRRORLEFTRIGHT"), DDFXCAPS_OVERLAYMIRRORLEFTRIGHT },<br />- { TEXT("OVERLAYMIRRORUPDOWN"), DDFXCAPS_OVERLAYMIRRORUPDOWN },<br />-};<br />-<br />CAPSDEFSTYPE PalCapsDefs[MAX_BOXES] =<br />{<br />- {TEXT("1BIT"), DDPCAPS_1BIT},<br />- {TEXT("2BIT"), DDPCAPS_2BIT},<br />- {TEXT("4BIT"), DDPCAPS_4BIT},<br />- {TEXT("8BITENTRIES"), DDPCAPS_8BITENTRIES},<br />- {TEXT("8BIT"), DDPCAPS_8BIT},<br />- {TEXT("ALLOW256"), DDPCAPS_ALLOW256},<br />- {TEXT("INITIALIZE"), DDPCAPS_INITIALIZE},<br />+ {TEXT("ALPHA"), DDPCAPS_ALPHA},<br /> {TEXT("PRIMARYSURFACE"), DDPCAPS_PRIMARYSURFACE},<br />- {TEXT("PRIMARYSURFACELEFT"), DDPCAPS_PRIMARYSURFACELEFT},<br />- {TEXT("VSYNC"), DDPCAPS_VSYNC}<br />-};<br />+ };<br /><br />-CAPSDEFSTYPE SurfCapsDefs[MAX_BOXES] =<br />+CAPSDEFSTYPE BltCapsDefs[MAX_BOXES] =<br />{<br />- {TEXT("3DDEVICE"), DDSCAPS_3DDEVICE},<br />- {TEXT("ALPHA"), DDSCAPS_ALPHA},<br />- {TEXT("BACKBUFFER"), DDSCAPS_BACKBUFFER},<br />- {TEXT("COMPLEX"), DDSCAPS_COMPLEX},<br />- {TEXT("FLIP"), DDSCAPS_FLIP},<br />- {TEXT("FRONTBUFFER"), DDSCAPS_FRONTBUFFER},<br />- {TEXT("MIPMAP"), DDSCAPS_MIPMAP},<br />- {TEXT("OFFSCREENPLAIN"), DDSCAPS_OFFSCREENPLAIN},<br />- {TEXT("OVERLAY"), DDSCAPS_OVERLAY},<br />- {TEXT("PALETTE"), DDSCAPS_PALETTE},<br />- {TEXT("PRIMARYSURFACE"), DDSCAPS_PRIMARYSURFACE},<br />- {TEXT("PRIMARYSURFACELEFT"), DDSCAPS_PRIMARYSURFACELEFT},<br />- {TEXT("SYSTEMMEMORY"), DDSCAPS_SYSTEMMEMORY},<br />- {TEXT("TEXTURE"), DDSCAPS_TEXTURE},<br />- {TEXT("VIDEOMEMORY"), DDSCAPS_VIDEOMEMORY},<br />- {TEXT("VISIBLE"), DDSCAPS_VISIBLE},<br />- {TEXT("WRITEONLY"), DDSCAPS_WRITEONLY},<br />- {TEXT("ZBUFFER"), DDSCAPS_ZBUFFER}<br />-};<br />+ { TEXT("READSYSMEM"), DDBLTCAPS_READSYSMEM },<br />+ { TEXT("WRITESYSMEM"), DDBLTCAPS_WRITESYSMEM },<br />+ { TEXT("FOURCCTORGB"), DDBLTCAPS_FOURCCTORGB },<br />+ { TEXT("COPYFOURCC"), DDBLTCAPS_COPYFOURCC },<br />+ { TEXT("FILLFOURCC"), DDBLTCAPS_FILLFOURCC },<br />+ };<br /><br />+CAPSDEFSTYPE AlphaCapsDefs[MAX_BOXES] =<br />+{<br />+ { TEXT("ALPHAPIXELS"), DDALPHACAPS_ALPHAPIXELS },<br />+ { TEXT("PREMULT"), DDALPHACAPS_PREMULT },<br />+ { TEXT("NONPREMULT"), DDALPHACAPS_NONPREMULT },<br />+ { TEXT("ALPHAFILL"), DDALPHACAPS_ALPHAFILL },<br />+ { TEXT("ALPHANEG"), DDALPHACAPS_ALPHANEG },<br />+ };<br /><br />+CAPSDEFSTYPE OverlayCapsDefs[MAX_BOXES] =<br />+{<br />+ {TEXT("FLIP"), DDOVERLAYCAPS_FLIP},<br />+ {TEXT("FOURCC"), DDOVERLAYCAPS_FOURCC},<br />+ {TEXT("ZORDER"), DDOVERLAYCAPS_ZORDER},<br />+ {TEXT("MIRRORLEFTRIGHT"), DDOVERLAYCAPS_MIRRORLEFTRIGHT},<br />+ {TEXT("MIRRORUPDOWN"), DDOVERLAYCAPS_MIRRORUPDOWN},<br />+ {TEXT("CKEYSRC"), DDOVERLAYCAPS_CKEYSRC},<br />+ {TEXT("CKEYSRCCLRSPACE"), DDOVERLAYCAPS_CKEYSRCCLRSPACE},<br />+ {TEXT("CKEYSRCCLRSPACEYUV"), DDOVERLAYCAPS_CKEYSRCCLRSPACEYUV},<br />+ {TEXT("CKEYDEST"), DDOVERLAYCAPS_CKEYDEST},<br />+ {TEXT("CKEYDESTCLRSPACE"), DDOVERLAYCAPS_CKEYDESTCLRSPACE},<br />+ {TEXT("CKEYDESTCLRSPACEYUV"), DDOVERLAYCAPS_CKEYDESTCLRSPACEYUV},<br />+ {TEXT("CKEYBOTH"), DDOVERLAYCAPS_CKEYBOTH},<br />+ {TEXT("ALPHADEST"), DDOVERLAYCAPS_ALPHADEST},<br />+ {TEXT("ALPHASRC"), DDOVERLAYCAPS_ALPHASRC},<br />+ {TEXT("ALPHADESTNEG"), DDOVERLAYCAPS_ALPHADESTNEG},<br />+ {TEXT("ALPHASRCNEG"), DDOVERLAYCAPS_ALPHASRCNEG},<br />+ {TEXT("ALPHACONSTANT"), DDOVERLAYCAPS_ALPHACONSTANT},<br />+ {TEXT("ALPHAPREMULT"), DDOVERLAYCAPS_ALPHAPREMULT},<br />+ {TEXT("ALPHANONPREMULT"), DDOVERLAYCAPS_ALPHANONPREMULT},<br />+ {TEXT("ALPHAANDKEYDEST"), DDOVERLAYCAPS_ALPHAANDKEYDEST},<br />+ {TEXT("OVERLAYSUPPORT"), DDOVERLAYCAPS_OVERLAYSUPPORT},<br />+ };<br /><br />+ CAPSDEFSTYPE MiscCapsDefs[MAX_BOXES] =<br />+{<br />+ {TEXT("READSCANLINE"), DDMISCCAPS_READSCANLINE},<br />+ {TEXT("READMONITORFREQ"), DDMISCCAPS_READMONITORFREQ},<br />+ {TEXT("READVBLANKSTATUS"), DDMISCCAPS_READVBLANKSTATUS},<br />+ {TEXT("FLIPINTERVAL"), DDMISCCAPS_FLIPINTERVAL},<br />+ {TEXT("FLIPODDEVEN"), DDMISCCAPS_FLIPODDEVEN},<br />+ {TEXT("FLIPVSYNCWITHVBI"), DDMISCCAPS_FLIPVSYNCWITHVBI},<br />+ {TEXT("COLORCONTROLOVERLAY"), DDMISCCAPS_COLORCONTROLOVERLAY},<br />+ {TEXT("COLORCONTROLPRIMARY"), DDMISCCAPS_COLORCONTROLPRIMARY},<br />+ {TEXT("GAMMACONTROLOVERLAY"), DDMISCCAPS_GAMMACONTROLOVERLAY},<br />+ {TEXT("GAMMACONTROLPRIMARY"), DDMISCCAPS_GAMMACONTROLPRIMARY}<br />+ };<br />+<br />+<br />//*------------------------------------------------------------------------<br />//| Dlg_OnCommand<br />//*------------------------------------------------------------------------<br />@@ -254,14 +206,16 @@<br /> int i;<br /> TCHAR szTitle[256];<br /> static TCHAR *rgszCaps[] = {<br />- TEXT("Direct Draw Caps Bits"),<br /> TEXT("Direct Draw Color Key Caps Bits"),<br />- TEXT("Direct Draw FX Caps Bits"),<br /> TEXT("Direct Draw Palette Caps Bits"),<br />- TEXT("Direct Draw Surface Caps Bits")};<br />+ TEXT("Direct Draw Blt Caps Bits"),<br />+ TEXT("Direct Draw Alpha Caps Bits"),<br />+ TEXT("Direct Draw Overlay Caps Bits"),<br />+ TEXT("Direct Draw Misc Caps Bits") <br />+ };<br /><br />- wsprintf(szTitle, TEXT("%s (%s)"), rgszCaps[Which%5],<br />- (Which < 5) ? TEXT("HAL") : TEXT("HEL"));<br />+ wsprintf(szTitle, TEXT("%s (%s)"), rgszCaps[Which%6],<br />+ (Which < 6) ? TEXT("HAL") : TEXT("HEL"));<br /> SetWindowText(hwnd, szTitle);<br /><br /> ShowWindow(GetDlgItem(hwnd, IDC_RESTORE), SW_HIDE);<br />@@ -285,11 +239,8 @@<br /> return TRUE;<br />}<br /><br />-//*------------------------------------------------------------------------<br />-//| ddCapsDlg_Proc<br />-//*------------------------------------------------------------------------<br />BOOL CALLBACK<br />-ddCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />+CKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />{<br /> BOOL fProcessed = TRUE;<br /><br />@@ -306,11 +257,8 @@<br /> return (fProcessed);<br />}<br /><br />-//*------------------------------------------------------------------------<br />-//| CKeyCapsDlg_Proc<br />-//*------------------------------------------------------------------------<br />BOOL CALLBACK<br />-CKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />+PalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />{<br /> BOOL fProcessed = TRUE;<br /><br />@@ -327,15 +275,12 @@<br /> return (fProcessed);<br />}<br /><br />-//*------------------------------------------------------------------------<br />-//| SurfCapsDlg_Proc<br />-//*------------------------------------------------------------------------<br />BOOL CALLBACK<br />-SurfCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />+BltCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />{<br /> BOOL fProcessed = TRUE;<br /><br />- Which = 4;<br />+ Which = 2;<br /> switch (uMsg)<br /> {<br /> HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);<br />@@ -348,15 +293,12 @@<br /> return (fProcessed);<br />}<br /><br />-//*------------------------------------------------------------------------<br />-//| FXCapsDlg_Proc<br />-//*------------------------------------------------------------------------<br />BOOL CALLBACK<br />-FXCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />+AlphaCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />{<br /> BOOL fProcessed = TRUE;<br /><br />- Which = 2;<br />+ Which = 3;<br /> switch (uMsg)<br /> {<br /> HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);<br />@@ -370,15 +312,12 @@<br />}<br /><br /><br />-//*------------------------------------------------------------------------<br />-//| PalCapsDlg_Proc<br />-//*------------------------------------------------------------------------<br />BOOL CALLBACK<br />-PalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />+OverlayCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />{<br /> BOOL fProcessed = TRUE;<br /><br />- Which = 3;<br />+ Which = 4;<br /> switch (uMsg)<br /> {<br /> HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);<br />@@ -391,12 +330,8 @@<br /> return (fProcessed);<br />}<br /><br />-<br />-//*------------------------------------------------------------------------<br />-//| HELddCapsDlg_Proc<br />-//*------------------------------------------------------------------------<br />BOOL CALLBACK<br />-HELddCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />+MiscCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />{<br /> BOOL fProcessed = TRUE;<br /><br />@@ -413,9 +348,7 @@<br /> return (fProcessed);<br />}<br /><br />-//*------------------------------------------------------------------------<br />-//| HELCKeyCapsDlg_Proc<br />-//*------------------------------------------------------------------------<br />+<br />BOOL CALLBACK<br />HELCKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />{<br />@@ -434,15 +367,12 @@<br /> return (fProcessed);<br />}<br /><br />-//*------------------------------------------------------------------------<br />-//| HELSurfCapsDlg_Proc<br />-//*------------------------------------------------------------------------<br />BOOL CALLBACK<br />-HELSurfCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />+HELPalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />{<br /> BOOL fProcessed = TRUE;<br /><br />- Which = 9;<br />+ Which = 7;<br /> switch (uMsg)<br /> {<br /> HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);<br />@@ -455,15 +385,12 @@<br /> return (fProcessed);<br />}<br /><br />-//*------------------------------------------------------------------------<br />-//| HELFXCapsDlg_Proc<br />-//*------------------------------------------------------------------------<br />BOOL CALLBACK<br />-HELFXCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />+HELBltCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />{<br /> BOOL fProcessed = TRUE;<br /><br />- Which = 7;<br />+ Which = 8;<br /> switch (uMsg)<br /> {<br /> HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);<br />@@ -476,16 +403,31 @@<br /> return (fProcessed);<br />}<br /><br />+BOOL CALLBACK<br />+HELAlphaCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />+{<br />+ BOOL fProcessed = TRUE;<br /><br />-//*------------------------------------------------------------------------<br />-//| HELPalCapsDlg_Proc<br />-//*------------------------------------------------------------------------<br />+ Which = 9;<br />+ switch (uMsg)<br />+ {<br />+ HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);<br />+ HANDLE_MSG(hDlg, WM_COMMAND, Dlg_OnCommand);<br />+<br />+ default:<br />+ fProcessed = FALSE;<br />+ break;<br />+ }<br />+ return (fProcessed);<br />+}<br />+<br />+<br />BOOL CALLBACK<br />-HELPalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />+HELOverlayCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />{<br /> BOOL fProcessed = TRUE;<br /><br />- Which = 8;<br />+ Which = 10;<br /> switch (uMsg)<br /> {<br /> HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);<br />@@ -498,7 +440,24 @@<br /> return (fProcessed);<br />}<br /><br />+BOOL CALLBACK<br />+HELMiscCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)<br />+{<br />+ BOOL fProcessed = TRUE;<br /><br />+ Which = 11;<br />+ switch (uMsg)<br />+ {<br />+ HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);<br />+ HANDLE_MSG(hDlg, WM_COMMAND, Dlg_OnCommand);<br />+<br />+ default:<br />+ fProcessed = FALSE;<br />+ break;<br />+ }<br />+ return (fProcessed);<br />+}<br />+<br />//*------------------------------------------------------------------------<br />//| DDEnumCallback<br />//*------------------------------------------------------------------------<br />@@ -539,7 +498,7 @@<br />//*------------------------------------------------------------------------<br />static int gCurMode = 0;<br /><br />-DWORD DDAPI<br />+DWORD CALLBACK<br />EnumModesCallback(LPDDSURFACEDESC pddsd, LPVOID context)<br />{<br /> Modes[ModeCnt].dwWidth = pddsd->dwWidth;<br />@@ -568,6 +527,8 @@<br />//| nCmdShow - Integer value specifying how to start app.,<br />//| (Iconic [7] or Normal [1,5])<br />//*------------------------------------------------------------------------<br />+typedef HRESULT (WINAPI * LPDIRECTDRAWENUMERATEEX)(LPDDENUMCALLBACKEX lpCallback, LPVOID lpContext, DWORD dwFlags);<br />+<br />int WINAPI<br />WinMain(HINSTANCE hInstance,<br /> HINSTANCE hPrevInstance,<br />@@ -586,22 +547,22 @@<br /><br /> // You need to do a GetModuleHandle and GetProcAddress in order to get the<br /> // DirectDrawEnumerateEx<br />- hDDrawDLL = GetModuleHandle(TEXT("DDRAW"));<br />+ hDDrawDLL = LoadLibrary(TEXT("DDRAW.dll"));<br /> if (!hDDrawDLL)<br /> {<br /> OutputDebugString(TEXT("LoadLibrary() failed - ddcaps: Can't list display modes"));<br /> return (-1);<br /> }<br /> pDirectDrawEnumerateEx = (LPDIRECTDRAWENUMERATEEX )<br />- GetProcAddress(hDDrawDLL,TEXT("DirectDrawEnumerateExW"));<br />+ GetProcAddress(hDDrawDLL,TEXT("DirectDrawEnumerateEx"));<br /><br /> if (pDirectDrawEnumerateEx)<br /> pDirectDrawEnumerateEx( DDEnumCallbackEx, (LPVOID) NULL,<br /> DDENUM_ATTACHEDSECONDARYDEVICES |<br />- DDENUM_DETACHEDSECONDARYDEVICES |<br />- DDENUM_NONDISPLAYDEVICES);<br />+ DDENUM_DETACHEDSECONDARYDEVICES<br />+ );<br /> else // Old DirectDraw, so do it the old way<br />- DirectDrawEnumerate(DDEnumCallback, NULL);<br />+ MessageBox(NULL,TEXT("EnumerateEx Call Fail"),TEXT("Error"),MB_OK);<br /><br /> ddrval = DirectDrawCreate(gpSelectedDriverGUID, &lpDD, NULL);<br /> if (ddrval != DD_OK)<br />@@ -635,35 +596,41 @@<br /><br /> lpDD->lpVtbl->GetCaps(lpDD, &ddcapsHAL, &ddcapsHEL);<br /><br />- gCaps[0].caps = &(ddcapsHAL.dwCaps);<br />- gCaps[0].defs = ddCapsDefs;<br />+ gCaps[0].caps = &(ddcapsHAL.dwCKeyCaps);<br />+ gCaps[0].defs = CKeyCapsDefs;<br /><br />- gCaps[1].caps = &(ddcapsHAL.dwCKeyCaps);<br />- gCaps[1].defs = CKeyCapsDefs;<br />+ gCaps[1].caps = &(ddcapsHAL.dwPalCaps);<br />+ gCaps[1].defs = PalCapsDefs;<br /><br />- gCaps[2].caps = &(ddcapsHAL.dwFXCaps);<br />- gCaps[2].defs = FXCapsDefs;<br />+ gCaps[2].caps = &(ddcapsHAL.dwBltCaps);<br />+ gCaps[2].defs = BltCapsDefs;<br /><br />- gCaps[3].caps = &(ddcapsHAL.dwPalCaps);<br />- gCaps[3].defs = PalCapsDefs;<br />+ gCaps[3].caps = &(ddcapsHAL.dwAlphaCaps);<br />+ gCaps[3].defs = AlphaCapsDefs;<br /><br />- gCaps[4].caps = &(ddcapsHAL.ddsCaps.dwCaps);<br />- gCaps[4].defs = SurfCapsDefs;<br />+ gCaps[4].caps = &(ddcapsHAL.dwOverlayCaps);<br />+ gCaps[4].defs = OverlayCapsDefs;<br /><br />- gCaps[5].caps = &(ddcapsHEL.dwCaps);<br />- gCaps[5].defs = ddCapsDefs;<br />+ gCaps[5].caps = &(ddcapsHAL.dwMiscCaps);<br />+ gCaps[5].defs = MiscCapsDefs;<br /><br /> gCaps[6].caps = &(ddcapsHEL.dwCKeyCaps);<br /> gCaps[6].defs = CKeyCapsDefs;<br /><br />- gCaps[7].caps = &(ddcapsHEL.dwFXCaps);<br />- gCaps[7].defs = FXCapsDefs;<br />+ gCaps[7].caps = &(ddcapsHEL.dwPalCaps);<br />+ gCaps[7].defs = PalCapsDefs;<br /><br />- gCaps[8].caps = &(ddcapsHEL.dwPalCaps);<br />- gCaps[8].defs = PalCapsDefs;<br />+ gCaps[8].caps = &(ddcapsHEL.dwBltCaps);<br />+ gCaps[8].defs = BltCapsDefs;<br /><br />- gCaps[9].caps = &(ddcapsHEL.ddsCaps.dwCaps);<br />- gCaps[9].defs = SurfCapsDefs;<br />+ gCaps[9].caps = &(ddcapsHEL.dwAlphaCaps);<br />+ gCaps[9].defs = AlphaCapsDefs;<br />+<br />+ gCaps[10].caps = &(ddcapsHEL.dwOverlayCaps);<br />+ gCaps[10].defs = OverlayCapsDefs;<br />+<br />+ gCaps[11].caps = &(ddcapsHEL.dwMiscCaps);<br />+ gCaps[11].defs = MiscCapsDefs;<br />}<br /><br /><br />@@ -794,56 +761,63 @@<br /> DialogBox(ghInstance, TEXT("About"), hWnd, (DLGPROC)AboutDlgProc);<br /> break;<br /><br />- case ID_VIEW_DRIVERCAPS:<br />- CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br />- NULL, ddCapsDlg_Proc);<br />- break;<br />-<br />+<br /> case ID_VIEW_DRIVERCOLORKEYCAPS:<br /> CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br /> NULL, CKeyCapsDlg_Proc);<br /> break;<br /><br />- case ID_VIEW_DRIVERFXCAPS:<br />+ case ID_VIEW_DRIVERPALETTECAPS:<br /> CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br />- NULL, FXCapsDlg_Proc);<br />+ NULL, PalCapsDlg_Proc);<br /> break;<br /><br />- case ID_VIEW_DRIVERPALETTECAPS:<br />+ case ID_VIEW_DRIVERBLTCAPS:<br /> CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br />- NULL, PalCapsDlg_Proc);<br />+ NULL, BltCapsDlg_Proc);<br /> break;<br /><br />- case ID_VIEW_DRIVERSURFACECAPS:<br />+ case ID_VIEW_DRIVERALPHACAPS:<br /> CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br />- NULL, SurfCapsDlg_Proc);<br />+ NULL, AlphaCapsDlg_Proc);<br /> break;<br /><br />- case ID_VIEW_HELCAPS:<br />+ case ID_VIEW_DRIVEROVERLAYCAPS:<br /> CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br />- NULL, HELddCapsDlg_Proc);<br />+ NULL, OverlayCapsDlg_Proc);<br /> break;<br />+ <br />+ case ID_VIEW_DRIVERMISCCAPS:<br />+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br />+ NULL, OverlayCapsDlg_Proc);<br />+ break;<br /><br />+//----------------<br /> case ID_VIEW_HELCOLORKEYCAPS:<br /> CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br /> NULL, HELCKeyCapsDlg_Proc);<br /> break;<br /><br />- case ID_VIEW_HELFXCAPS:<br />- CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br />- NULL, HELFXCapsDlg_Proc);<br />- break;<br />-<br /> case ID_VIEW_HELPALETTECAPS:<br /> CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br /> NULL, HELPalCapsDlg_Proc);<br /> break;<br />-<br />- case ID_VIEW_HELSURFACECAPS:<br />+ case ID_VIEW_HELBLTCAPS:<br /> CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br />- NULL, HELSurfCapsDlg_Proc);<br />+ NULL, HELBltCapsDlg_Proc);<br /> break;<br />-<br />+ case ID_VIEW_HELALPHACAPS:<br />+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br />+ NULL, HELAlphaCapsDlg_Proc);<br />+ break;<br />+ case ID_VIEW_HELOVERLAYCAPS:<br />+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br />+ NULL, HELOverlayCapsDlg_Proc);<br />+ break;<br />+ case ID_VIEW_HELMISCCAPS:<br />+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),<br />+ NULL, HELMiscCapsDlg_Proc);<br />+ break;<br /> case ID_PRINTF_LISTBOX:<br /> if (HIWORD(wParam) == LBN_DBLCLK)<br /> {<br />@@ -852,18 +826,18 @@<br /> if (sel < (UINT)ModeCnt)<br /> {<br /> ddrval = lpDD->lpVtbl->SetCooperativeLevel(lpDD,<br />- hWnd,<br />- DDSCL_EXCLUSIVE |<br />- DDSCL_NOWINDOWCHANGES |<br />+ hWnd,<br />+ DDSCL_NORMAL |<br /> DDSCL_FULLSCREEN);<br /> if (ddrval == DD_OK)<br /> {<br /> ddrval = lpDD->lpVtbl->SetDisplayMode(lpDD,<br />- Modes[sel].dwWidth,<br />- Modes[sel].dwHeight,<br />- Modes[sel].dwBPP);<br />+ Modes[sel].dwWidth,<br />+ Modes[sel].dwHeight,<br />+ Modes[sel].dwBPP,0,0);<br /> ddrval = lpDD->lpVtbl->SetCooperativeLevel(lpDD,<br />- hWnd, DDSCL_NORMAL);<br />+ hWnd,<br />+ DDSCL_NORMAL);<br /> }<br /> }<br /> }<br />Index: ddcaps.rc<br />===================================================================<br />--- ddcaps.rc (revision 23142)<br />+++ ddcaps.rc (working copy)<br />@@ -66,19 +66,21 @@<br /> END<br /> POPUP "&Driver"<br /> BEGIN<br />- MENUITEM "Driver &Caps", ID_VIEW_DRIVERCAPS<br /> MENUITEM "Driver C&olor Key Caps", ID_VIEW_DRIVERCOLORKEYCAPS<br />- MENUITEM "Driver &FX Caps", ID_VIEW_DRIVERFXCAPS<br /> MENUITEM "Driver &Palette Caps", ID_VIEW_DRIVERPALETTECAPS<br />- MENUITEM "Driver &Surface Caps", ID_VIEW_DRIVERSURFACECAPS<br />+ MENUITEM "Driver &Blt Caps", ID_VIEW_DRIVERBLTCAPS<br />+ MENUITEM "Driver &Alpha Caps", ID_VIEW_DRIVERALPHACAPS<br />+ MENUITEM "Driver &Overlay Caps", ID_VIEW_DRIVEROVERLAYCAPS<br />+ MENUITEM "Driver &Misc Caps", ID_VIEW_DRIVERMISCCAPS<br /> END<br /> POPUP "&HEL"<br /> BEGIN<br />- MENUITEM "HEL &Caps", ID_VIEW_HELCAPS<br /> MENUITEM "HEL C&olor Key Caps", ID_VIEW_HELCOLORKEYCAPS<br />- MENUITEM "HEL &FX Caps", ID_VIEW_HELFXCAPS<br /> MENUITEM "HEL &Palette Caps", ID_VIEW_HELPALETTECAPS<br />- MENUITEM "HEL &Surface Caps", ID_VIEW_HELSURFACECAPS<br />+ MENUITEM "HEL &Blt Caps", ID_VIEW_HELBLTCAPS<br />+ MENUITEM "HEL &Alpha Caps", ID_VIEW_HELALPHACAPS<br />+ MENUITEM "HEL &Overlay Caps", ID_VIEW_HELOVERLAYCAPS<br />+ MENUITEM "HEL &Misc Caps", ID_VIEW_HELMISCCAPS<br /> END<br />END<br /><br />@@ -228,7 +230,7 @@<br />BEGIN<br /> DEFPUSHBUTTON "&OK",IDOK,132,58,50,14<br /> LTEXT "DirectDraw Caps Viewer for Windows CE",-1,15,14,165,8<br />- LTEXT "Copyright ?1995-2003 Microsoft Corporation",-1,15,28,<br />+ LTEXT "Copyright ?1995-2003 Microsoft Corporation",-1,15,28,<br /> 165,8<br /> LTEXT "Version",-1,15,42,24,8<br /> LTEXT "1.0",-1,40,42,66,8<br />Index: lbprintf.c<br />===================================================================<br />--- lbprintf.c (revision 23142)<br />+++ lbprintf.c (working copy)<br />@@ -49,102 +49,8 @@<br />//<br />// Error string table<br />//<br />-static ERRLIST elErrors[] =<br />-{<br />- { DD_OK ,TEXT("DD_OK") },<br />- { DDERR_ALREADYINITIALIZED ,TEXT("DDERR_ALREADYINITIALIZED")},<br />- { DDERR_CANNOTATTACHSURFACE ,TEXT("DDERR_CANNOTATTACHSURFACE")},<br />- { DDERR_CANNOTDETACHSURFACE ,TEXT("DDERR_CANNOTDETACHSURFACE")},<br />- { DDERR_CURRENTLYNOTAVAIL ,TEXT("DDERR_CURRENTLYNOTAVAIL")},<br />- { DDERR_EXCEPTION ,TEXT("DDERR_EXCEPTION")},<br />- { DDERR_GENERIC ,TEXT("DDERR_GENERIC")},<br />- { DDERR_HEIGHTALIGN ,TEXT("DDERR_HEIGHTALIGN")},<br />- { DDERR_INCOMPATIBLEPRIMARY ,TEXT("DDERR_INCOMPATIBLEPRIMARY")},<br />- { DDERR_INVALIDCAPS ,TEXT("DDERR_INVALIDCAPS")},<br />- { DDERR_INVALIDCLIPLIST ,TEXT("DDERR_INVALIDCLIPLIST")},<br />- { DDERR_INVALIDMODE ,TEXT("DDERR_INVALIDMODE")},<br />- { DDERR_INVALIDOBJECT ,TEXT("DDERR_INVALIDOBJECT")},<br />- { DDERR_INVALIDPARAMS ,TEXT("DDERR_INVALIDPARAMS")},<br />- { DDERR_INVALIDPIXELFORMAT ,TEXT("DDERR_INVALIDPIXELFORMAT")},<br />- { DDERR_INVALIDRECT ,TEXT("DDERR_INVALIDRECT")},<br />- { DDERR_LOCKEDSURFACES ,TEXT("DDERR_LOCKEDSURFACES")},<br />- { DDERR_NO3D ,TEXT("DDERR_NO3D")},<br />- { DDERR_NOALPHAHW ,TEXT("DDERR_NOALPHAHW")},<br />- { DDERR_NOCLIPLIST ,TEXT("DDERR_NOCLIPLIST")},<br />- { DDERR_NOCOLORCONVHW ,TEXT("DDERR_NOCOLORCONVHW")},<br />- { DDERR_NOCOOPERATIVELEVELSET ,TEXT("DDERR_NOCOOPERATIVELEVELSET")},<br />- { DDERR_NOCOLORKEY ,TEXT("DDERR_NOCOLORKEY")},<br />- { DDERR_NOCOLORKEYHW ,TEXT("DDERR_NOCOLORKEYHW")},<br />- { DDERR_NOEXCLUSIVEMODE ,TEXT("DDERR_NOEXCLUSIVEMODE")},<br />- { DDERR_NOFLIPHW ,TEXT("DDERR_NOFLIPHW")},<br />- { DDERR_NOGDI ,TEXT("DDERR_NOGDI")},<br />- { DDERR_NOMIRRORHW ,TEXT("DDERR_NOMIRRORHW")},<br />- { DDERR_NOTFOUND ,TEXT("DDERR_NOTFOUND")},<br />- { DDERR_NOOVERLAYHW ,TEXT("DDERR_NOOVERLAYHW")},<br />- { DDERR_NORASTEROPHW ,TEXT("DDERR_NORASTEROPHW")},<br />- { DDERR_NOROTATIONHW ,TEXT("DDERR_NOROTATIONHW")},<br />- { DDERR_NOSTRETCHHW ,TEXT("DDERR_NOSTRETCHHW")},<br />- { DDERR_NOT4BITCOLOR ,TEXT("DDERR_NOT4BITCOLOR")},<br />- { DDERR_NOT4BITCOLORINDEX ,TEXT("DDERR_NOT4BITCOLORINDEX")},<br />- { DDERR_NOT8BITCOLOR ,TEXT("DDERR_NOT8BITCOLOR")},<br />- { DDERR_NOTEXTUREHW ,TEXT("DDERR_NOTEXTUREHW")},<br />- { DDERR_NOVSYNCHW ,TEXT("DDERR_NOVSYNCHW")},<br />- { DDERR_NOZBUFFERHW ,TEXT("DDERR_NOZBUFFERHW")},<br />- { DDERR_NOZOVERLAYHW ,TEXT("DDERR_NOZOVERLAYHW")},<br />- { DDERR_OUTOFCAPS ,TEXT("DDERR_OUTOFCAPS")},<br />- { DDERR_OUTOFMEMORY ,TEXT("DDERR_OUTOFMEMORY")},<br />- { DDERR_OUTOFVIDEOMEMORY ,TEXT("DDERR_OUTOFVIDEOMEMORY")},<br />- { DDERR_OVERLAYCANTCLIP ,TEXT("DDERR_OVERLAYCANTCLIP")},<br />- { DDERR_OVERLAYCOLORKEYONLYONEACTIVE,TEXT("DDERR_OVERLAYCOLORKEYONLYONEACTIVE")},<br />- { DDERR_PALETTEBUSY ,TEXT("DDERR_PALETTEBUSY")},<br />- { DDERR_COLORKEYNOTSET ,TEXT("DDERR_COLORKEYNOTSET")},<br />- { DDERR_SURFACEALREADYATTACHED ,TEXT("DDERR_SURFACEALREADYATTACHED")},<br />- { DDERR_SURFACEALREADYDEPENDENT ,TEXT("DDERR_SURFACEALREADYDEPENDENT")},<br />- { DDERR_SURFACEBUSY ,TEXT("DDERR_SURFACEBUSY")},<br />- { DDERR_SURFACEISOBSCURED ,TEXT("DDERR_SURFACEISOBSCURED")},<br />- { DDERR_SURFACELOST ,TEXT("DDERR_SURFACELOST")},<br />- { DDERR_SURFACENOTATTACHED ,TEXT("DDERR_SURFACENOTATTACHED")},<br />- { DDERR_TOOBIGHEIGHT ,TEXT("DDERR_TOOBIGHEIGHT")},<br />- { DDERR_TOOBIGSIZE ,TEXT("DDERR_TOOBIGSIZE")},<br />- { DDERR_TOOBIGWIDTH ,TEXT("DDERR_TOOBIGWIDTH")},<br />- { DDERR_UNSUPPORTED ,TEXT("DDERR_UNSUPPORTED")},<br />- { DDERR_UNSUPPORTEDFORMAT ,TEXT("DDERR_UNSUPPORTEDFORMAT")},<br />- { DDERR_UNSUPPORTEDMASK ,TEXT("DDERR_UNSUPPORTEDMASK")},<br />- { DDERR_VERTICALBLANKINPROGRESS ,TEXT("DDERR_VERTICALBLANKINPROGRESS")},<br />- { DDERR_WASSTILLDRAWING ,TEXT("DDERR_WASSTILLDRAWING")},<br />- { DDERR_XALIGN ,TEXT("DDERR_XALIGN")},<br />- { DDERR_INVALIDDIRECTDRAWGUID ,TEXT("DDERR_INVALIDDIRECTDRAWGUID")},<br />- { DDERR_DIRECTDRAWALREADYCREATED ,TEXT("DDERR_DIRECTDRAWALREADYCREATED")},<br />- { DDERR_NODIRECTDRAWHW ,TEXT("DDERR_NODIRECTDRAWHW")},<br />- { DDERR_PRIMARYSURFACEALREADYEXISTS ,TEXT("DDERR_PRIMARYSURFACEALREADYEXISTS")},<br />- { DDERR_NOEMULATION ,TEXT("DDERR_NOEMULATION")},<br />- { DDERR_REGIONTOOSMALL ,TEXT("DDERR_REGIONTOOSMALL")},<br />- { DDERR_CLIPPERISUSINGHWND ,TEXT("DDERR_CLIPERISUSINGHWND")},<br />- { DDERR_NOCLIPPERATTACHED ,TEXT("DDERR_NOCLIPPERATTACHED")},<br />- { DDERR_NOHWND ,TEXT("DDERR_NOHWND")},<br />- { DDERR_HWNDSUBCLASSED ,TEXT("DDERR_HWNDSUBCLASSED")},<br />- { DDERR_HWNDALREADYSET ,TEXT("DDERR_HWNDALREADYSET")},<br />- { DDERR_NOPALETTEATTACHED ,TEXT("DDERR_NOPALETTEATTACHED")},<br />- { DDERR_NOPALETTEHW ,TEXT("DDERR_NOPALETTEHW")},<br />- { DDERR_BLTFASTCANTCLIP ,TEXT("DDERR_BLTFASTCANTCLIP")},<br />- { DDERR_NOBLTHW ,TEXT("DDERR_NOBLTHW")},<br />- { DDERR_NODDROPSHW ,TEXT("DDERR_NODDROPSHW")},<br />- { DDERR_OVERLAYNOTVISIBLE ,TEXT("DDERR_OVERLAYNOTVISIBLE")},<br />- { DDERR_NOOVERLAYDEST ,TEXT("DDERR_NOOVERLAYDEST")},<br />- { DDERR_INVALIDPOSITION ,TEXT("DDERR_INVALIDPOSITION")},<br />- { DDERR_NOTAOVERLAYSURFACE ,TEXT("DDERR_NOTAOVERLAYSURFACE")},<br />- { DDERR_EXCLUSIVEMODEALREADYSET ,TEXT("DDERR_EXCLUSIVEMODEALREADYSET")},<br />- { DDERR_NOTFLIPPABLE ,TEXT("DDERR_NOTFLIPPABLE")},<br />- { DDERR_CANTDUPLICATE ,TEXT("DDERR_CANTDUPLICATE")},<br />- { DDERR_NOTLOCKED ,TEXT("DDERR_NOTLOCKED")},<br />- { DDERR_CANTCREATEDC ,TEXT("DDERR_CANTCREATEDC")},<br />- { DDERR_NODC ,TEXT("DDERR_NODC")},<br />- { DDERR_WRONGMODE ,TEXT("DDERR_WRONGMODE")},<br />- { DDERR_IMPLICITLYCREATED ,TEXT("DDERR_IMPLICITLYCREATED")},<br />-};<br /><br /><br />-<br />HWND LBCreate( HWND hWnd, HINSTANCE hInst, DWORD pos, BOOL debug )<br />{<br /> hWndListBox = CreateWindow(<br />@@ -198,28 +104,3 @@<br />}<br /><br /><br />-static LPTSTR getErrorString( HRESULT ddrval )<br />-{<br />- int i;<br />-<br />- for( i=0;i<sizeof( elErrors )/sizeof( elErrors[0] );i++ )<br />- {<br />- if( ddrval == elErrors[i].rval )<br />- {<br />- return elErrors[i].str;<br />- }<br />- }<br />-<br />- return TEXT("Unknown Error Code");<br />-}<br />-<br />-<br />-void __cdecl LBPrintfRC( HRESULT ddrval, LPTSTR fmt, ... )<br />-{<br />- TCHAR buff[512];<br />-<br />- wvsprintf( buff, fmt, (LPVOID)(&fmt+1) );<br />-<br />- LBPrintf( TEXT("%s, rc=%ld (0x%08lx:%s)"), buff, LOWORD( ddrval ),<br />- ddrval, getErrorString( ddrval ) );<br />-}<br />Index: resource.h<br />===================================================================<br />--- resource.h (revision 23142)<br />+++ resource.h (working copy)<br />@@ -70,16 +70,19 @@<br />#define IDC_COMBO_DRIVERS 1035<br />#define ID_FILE_RESTORE 40001<br />#define ID_FILE_EXIT 40002<br />-#define ID_VIEW_DRIVERCAPS 40003<br />-#define ID_VIEW_DRIVERCOLORKEYCAPS 40004<br />-#define ID_VIEW_DRIVERFXCAPS 40005<br />-#define ID_VIEW_DRIVERPALETTECAPS 40006<br />-#define ID_VIEW_DRIVERSURFACECAPS 40007<br />-#define ID_VIEW_HELCAPS 40008<br />+#define ID_VIEW_DRIVERCOLORKEYCAPS 40003<br />+#define ID_VIEW_DRIVERPALETTECAPS 40004<br />+#define ID_VIEW_DRIVERBLTCAPS 40005<br />+#define ID_VIEW_DRIVERALPHACAPS 40006<br />+#define ID_VIEW_DRIVEROVERLAYCAPS 40007<br />+#define ID_VIEW_DRIVERMISCCAPS 40008<br />#define ID_VIEW_HELCOLORKEYCAPS 40009<br />-#define ID_VIEW_HELFXCAPS 40010<br />-#define ID_VIEW_HELPALETTECAPS 40011<br />-#define ID_VIEW_HELSURFACECAPS 40012<br />+#define ID_VIEW_HELPALETTECAPS 40010<br />+#define ID_VIEW_HELBLTCAPS 40011<br />+#define ID_VIEW_HELALPHACAPS 40012<br />+#define ID_VIEW_HELOVERLAYCAPS 40013<br />+#define ID_VIEW_HELMISCCAPS 40014<br />+<br />#define IDC_STATIC -1<br /><br />// Next default values for new objects<br /></code><br /><br />source 所在位置是 C:\WINCE600\PUBLIC\DIRECTX\SDK\SAMPLES\DXMISC\DDCAPS<br /><br />build ddcaps 的 command 是:<br /><code> sysgen -p directx ddcaps</code><br />因為 ddcaps 是在 public 下的 directx 目錄,所以 -p 後面要寫 directx ,意思是(path = directx)。<br />project name 就是 ddcaps.checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-82948680141288494572010-08-12T11:56:00.004+08:002010-11-30T17:12:38.565+08:00DirectDraw Capability in CE 6.0要知道系統哪些 DirectDraw Function 是 hardware support,哪些是用 software emulate,<br />可以用 <a href="http://msdn.microsoft.com/en-us/library/ee491685.aspx">IDirectDraw::GetCaps</a> 來取得 ddraw capability 列表:<br /><code>HRESULT GetCaps(<br />LPDDCAPS lpDDDriverCaps,<br />LPDDCAPS lpDDEmulCaps<br />);</code><br />傳進去的兩個 argument 都是用來取出 capability 的 structure pointer,結構完全一樣,一個是 hardware support list,一個是 software emulation list<br /><ul><li>lpDDDriverCaps : hardware</li><li>lpDDEmulCaps : software</li></ul>Support List structure 的definition 是 <a href="http://msdn.microsoft.com/en-us/library/ee490705.aspx">DDCAPS</a>:<br /><code><br />typedef struct _DDCAPS {<br />DWORD dwSize;<br />DWORD dwCKeyCaps;<br />DWORD dwPalCaps;<br />DWORD dwBltCaps;<br />DWORD dwAlphaCaps;<br />DWORD dwOverlayCaps;<br />DWORD dwVidMemTotal;<br />DWORD dwVidMemFree;<br />DWORD dwVidMemStride;<br />DWORD dwMaxVisibleOverlays;<br />DWORD dwCurrVisibleOverlays;<br />DWORD dwNumFourCCCodes;<br />DWORD dwAlignBoundarySrc;<br />DWORD dwAlignSizeSrc;<br />DWORD dwAlignBoundaryDest;<br />DWORD dwAlignSizeDest;<br />DWORD dwRops[DD_ROP_SPACE];<br />DWORD dwMinOverlayStretch;<br />DWORD dwMaxOverlayStretch;<br />DWORD dwMiscCaps;<br />} DDCAPS,FAR *LPDDCAPS;<br /></code><br />每個 DWORD的每個 bit 都代表一個 function,宣告在 ddraw.h (C:\WINCE600\PUBLIC\COMMON\SDK\INC\ddraw.h)<br /><br />platform builder public folder 附有一個 DDCAPS 的 sample program,可以列出 platform ddraw hardware/software support .<br />很悲慘的是,ddcaps structure 在 CE 6.0 大幅修改,所以DDCAPS sample code 在 6.0 不能 build 了!!<br />看這一篇: <a href="http://msdn.microsoft.com/en-us/library/ee491224.aspx">DirectDraw Migration</a>.<br /><br /><hr /><br /><br />我做了修改: <a href="http://realchecko.blogspot.com/2010/08/modify-ddcaps-for-ce-60.html">Modify DDCAPS for CE 6.0</a>checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-45417268791274977262010-08-11T16:48:00.003+08:002010-08-11T17:15:30.849+08:00CListBox : ListBox control in WTLWTL 也包裝了一些 common control,例如 ListBox,名稱叫 CListBox, 在 atlctrls.h.<br /><br />像 前面的 example : <a href="http://realchecko.blogspot.com/2010/05/win32-listbox-control.html">http://realchecko.blogspot.com/2010/05/win32-listbox-control.html</a><br />改用 WTL 來寫,就是:<br /><code>#pragma once<br />#define WINVER 0x0600<br /><br />#include <atlbase.h><br />#include <atlapp.h><br />#include <atlwin.h><br />#include <atlctrls.h><br /><br />#include "resource.h"<br /><br />class CMainDialog : public CDialogImpl<CMainDialog><br />{<br />public:<br /> enum {IDD = IDD_DIALOG1 };<br /> int addi;<br /> CListBox list;<br /><br /><br /> BEGIN_MSG_MAP(CMainDialog)<br /> MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)<br /> COMMAND_ID_HANDLER(IDCANCEL, OnCancel)<br /> COMMAND_ID_HANDLER(IDC_BTNADD,OnBtnAdd)<br /> END_MSG_MAP()<br /><br /> LRESULT OnInitDialog(UINT,WPARAM,LPARAM,BOOL&)<br /> {<br /> addi=0;<br /> RETAILMSG(1,(TEXT("OnInitDialog\r\n")));<br /> list.Attach(GetDlgItem(IDC_LIST1));<br /> return TRUE;<br /> }<br /><br /><br /> LRESULT OnCancel(WORD,WORD wID,HWND,BOOL&)<br /> {<br /> ::PostQuitMessage(wID);<br /> return 0;<br /> }<br /><br /> LRESULT OnBtnAdd(WORD,WORD wID,HWND,BOOL& hHandled)<br /> {<br /> TCHAR outmsg[10];<br /> swprintf(outmsg,_T("%d"),addi++);<br /> list.AddString(outmsg);<br /> int cnt = list.GetCount();<br /> if(cnt>30)<br /> list.DeleteString(0);<br /> cnt = list.GetCount();<br /> if(cnt>=14)<br /> list.SetTopIndex(cnt-14);<br /> RETAILMSG(1,(TEXT("Button Add\r\n")));<br /> return TRUE;<br /> }<br /><br />};<br /><br />CAppModule _Module;<br /><br />int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE,LPTSTR lpstrCmdLine,int nCmdShow)<br />{<br /> HRESULT hRes = ::CoInitializeEx(NULL,COINIT_MULTITHREADED);<br /> ::DefWindowProc(NULL,0,0,0L);<br /> AtlInitCommonControls(NULL);<br /> hRes = _Module.Init(NULL,hInstance);<br /><br /> CMainDialog dlgMain;<br /> hRes = dlgMain.DoModal();<br /> ::CoUninitialize();<br /><br /> return hRes;<br />}<br /></code><br />可以看到,大概是用 Attach( GetDlgItem(IDC_LIST1)) 把 WTL class: CListBox 和 ListBox control 建立關係。<br /><br />相關的說明: <a href="http://www.cchsu.com/arthur/prg_bg5/wtl3.htm">http://www.cchsu.com/arthur/prg_bg5/wtl3.htm</a>checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-27779240715800906322010-08-10T15:35:00.003+08:002010-08-10T16:24:49.598+08:00Build Assembly code in VS2005這是參考 tcpmp 的 project 檔。<br /><br />大概也跟 eVC 一樣,就是為 assembly.asm 加上 custom build command.<br /><ol><li>先把 assembly code 的 source file 寫好</li><li>開啟 VS2005,把 assembly file 加到 source folder 中</li><li>在 assembly file 按右鍵,選 properties</li><li>Custom Build Step -- General --Command Line,, 寫<code>armasm.exe -cpu xscale "$(InputPath)" "$(IntDir)/$(InputName).obj"</code></li><li>Output 寫<code>$(IntDir)/$(InputName).obj</code></li></ol>checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-37643104603300538972010-08-09T18:50:00.008+08:002010-08-10T11:27:06.168+08:00CpuId - 紀錄一下因為 CE 6.0 沒有辦法 SetKMode,所以只好... 寫一個 driver,然後 load 進去..,<br /><br />這就是 copy 自 tcpmp getcpuid 的 code 後,run 起來:<br /><ul><li>我們的: 4117B362,1D152152,0,0</li><li>測試的: 410FB764,1D992992,0,0</li></ul>第一個,cpu id<br /><br />4117B362:ref(<a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html">http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html</a>)<br />所以是 ARM1136, rev2<br /><br />410FB764: ref (<a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html">http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html</a>)<br />所以是 ARM1176 , rev 4<br /><br />第二個,cache type register<br /><br />ref : <a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/I67616.html">http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/I67616.html</a><br /><br /><ul><li>[31:29] : always 0</li><li>[28:25] : ctype - cache type b1110 means "write back","register 7 operation","format C"</li><li>[24] : separate D and I cache</li><li>[23:12] : D cache size</li><li>[11:0] : I cache size</li></ul>其中 D 和 I cache size encoding format:<br /><ul><li>[11] : P</li><li>[10:9] : always 0</li><li>[8:6] : size</li><li>[5:3] : association (way)<br /></li><li>[2] : M</li><li>[1:0] Length</li></ul>所以<br />1D152152 : 16K, 4 way, len=32 bytes.<br />1D992992: 32K, 4 way, len=32 bytes.<br /><hr /><br />driver code<br /><br />GETID.C:<br /><code>#include <windows.h><br />#include <drvlib.h><br /><br /><br />//----- Code Control -----<br />#define GID_DEBUG<br /><br />#ifdef DEBUG<br />DBGPARAM dpCurSettings = { TEXT("Getid"), {<br /> TEXT("Verbose"), TEXT(""), TEXT(""), TEXT(""),<br /> TEXT(""), TEXT(""), TEXT(""), TEXT(""),<br /> TEXT(""), TEXT(""), TEXT(""), TEXT(""),<br /> TEXT(""), TEXT(""), TEXT(""), TEXT("")},<br />0x00000000<br />};<br />#endif<br /><br />extern void GetCpuId(int,DWORD*);<br /><br />void SafeGetCpuId(int Id, DWORD* p)<br />{<br />memset(p,0,4*sizeof(DWORD));<br /> GetCpuId(Id,p);<br />}<br /><br /><br />//--- GID_Init<br />DWORD GID_Init(DWORD dwContext)<br />{<br /> DWORD CpuId[4];<br /> DWORD dwErr;<br /> TCHAR outmsg[60];<br /><br /> RETAILMSG(1, (TEXT("[GID] GID_Init+\r\n")));<br /><br /> SafeGetCpuId(0,CpuId);<br />RETAILMSG(1,(TEXT("%X,%X,%X,%X\r\n"),CpuId[0],CpuId[1],CpuId[2],CpuId[3]));<br />swprintf(outmsg,TEXT("%X,%X,%X,%X"),CpuId[0],CpuId[1],CpuId[2],CpuId[3]);<br /><br />MessageBox(NULL,outmsg,TEXT("GID"),MB_OK);<br /><br /><br />RETAILMSG(1, (TEXT("[GID] GID_Init OK \r\n")));<br />return TRUE;<br /><br />}<br /><br /><br /><br />//--- GID_Deinit<br />BOOL GID_Deinit(DWORD dwContext)<br />{<br />RETAILMSG(1, (TEXT("[GID] GID_Deinit+\r\n")));<br /><br /><br />return TRUE;<br />}<br /><br /><br /><br />//--- GID_Open<br />DWORD GID_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)<br />{<br />RETAILMSG(1, (TEXT("[GID] GID_Open+\r\n")));<br /><br />return dwData;<br />}<br /><br /><br /><br />//--- GID_Close<br />BOOL GID_Close(DWORD Handle)<br />{<br />RETAILMSG(1, (TEXT("[GID] GID_Close+\r\n")));<br /><br />return TRUE;<br />}<br /><br /><br /><br />//--- GID_Read<br />DWORD GID_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)<br />{<br />RETAILMSG(1, (TEXT("[GID] GID_Read+\r\n")));<br />return 0;<br />}<br /><br /><br /><br />//--- GID_Write<br />DWORD GID_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)<br />{<br />RETAILMSG(1, (TEXT("[GID] GID_Write+\r\n")));<br /><br /><br />return 0;<br />}<br /><br /><br /><br />//--- GID_Seek<br />DWORD GID_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)<br />{<br />RETAILMSG(1, (TEXT("[GID] GID_Seek+\r\n")));<br /><br />return (DWORD) -1;<br />}<br /><br /><br /><br />//--- GID_IOControl<br />BOOL GID_IOControl(<br /> DWORD Handle,<br /> DWORD dwCode,<br /> PBYTE pBufIn,<br /> DWORD dwLenIn,<br /> PBYTE pBufOut,<br /> DWORD dwLenOut,<br /> PDWORD pdwActualOut<br /> )<br />{<br /><br />RETAILMSG(1, (TEXT("[GID] GID_IOControl+\r\n")));<br />return (FALSE);<br />}<br /><br />BOOL<br />GID_DllEntry(<br />HINSTANCE hinstDll, /*@parm Instance pointer. */<br />DWORD dwReason, /*@parm Reason routine is called. */<br />LPVOID lpReserved /*@parm system parameter. */<br />)<br />{<br />if (dwReason == DLL_PROCESS_ATTACH)<br />{<br /> DisableThreadLibraryCalls((HMODULE) hinstDll);<br />}<br /><br /><br />return (TRUE);<br />}<br /></code><br /><br />arm.s<br /><code> INCLUDE kxarm.h<br /><br />EXPORT GetCpuId<br /><br />TEXTAREA<br /><br />LEAF_ENTRY GetCpuId<br /> export GetCpuId<br />mrs r0,cpsr<br /><br />and r0,r0,#15<br />cmp r0,#15<br />bne UserMode<br />mrc p15,0,r0,c0,c0,0<br />nop<br />nop<br />mrc p15,0,r2,c0,c0,1<br />nop<br />nop<br />str r0,[r1,#0]<br />str r2,[r1,#4]<br />UserMode<br />mov pc,lr<br /></code><br />ref (<a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html">http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.htm</a>l) CpuID 取的是 opcode2 = 0 和 1 : cpu id 跟 cache type.<br />GETID.DEF<br /><code>LIBRARY getid<br /><br />EXPORTS<br />GID_Init<br />GID_Deinit<br />GID_Open<br />GID_Close<br />GID_Read<br />GID_Write<br />GID_IOControl<br /></code><br />sources<br /><code><br />TARGETNAME=getid<br />TARGETTYPE=DYNLINK<br />RELEASETYPE=PLATFORM<br /><br />DLLENTRY=GID_DllEntry<br />DEFFILE=$(_TARGETPLATROOT)\SRC\DRIVERS\getid\getid.def<br /><br />PREPROCESSDEFFILE=1<br />SYNCHRONIZE_DRAIN=1<br />WINCEREL=1<br /><br />TARGETLIBS= \<br />$(_COMMONSDKROOT)\LIB\$(_CPUINDPATH)\coredll.lib \<br /><br />SOURCELIBS= \<br /><br />SOURCES= \<br />getid.c \<br />arm.s<br /></code><br /><br />load driver 的程式就是以前哪個 activedriverex( ). 改一下 dll name 就可以<br /><hr /><br />ref <a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/I67616.html">http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/I67616.html</a><br />用<br /><h3 class="title"> c0, Core feature ID registers<br /></h3>好像可以得到更多 cpu featurecheckohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-87538252879790418062010-08-07T17:14:00.003+08:002010-08-07T19:39:13.422+08:00to replace t3t3<br /><ul><li>500萬 1/2.4" CCD</li><li>3x optical zoom</li><li> 38 - 114 mm<br /></li><li> F3.5 - F4.4</li><li>640 x 480, 30 fps m jpg</li><li>2.5" lcd</li></ul><span id="show"><span style="color:#555555;">COOLPIX S620 nt 5980<br /></span></span><ul><li><span id="show"><span style="color:#555555;">1,220 萬 </span></span><span id="show"><span style="color:#555555;">1/2.33 英寸 CCD</span></span></li><li><span id="show"><span style="color:#555555;">4倍變焦 </span></span><span style="font-family:Arial,Helvetica;font-size:-1;"><span class="13px_normal">28-112mm</span></span></li><li><span style="font-family:Arial,Helvetica;font-size:-1;"><span class="13px_normal">F2.7-5.8</span></span></li><li><span style="font-family:Arial,Helvetica;font-size:-1;"><span class="13px_normal">640 x 480@30fps mjpeg<br /></span></span></li><li><span style="font-family:Arial,Helvetica;font-size:-1;"><span class="13px_normal">2.7" lcd<br /></span></span></li><li>VR 光學防震</li></ul><span class="text20">OLYMPUS FE-4030 nt 5900<br /></span><ul><li>1400 萬像素</li><li>4X 26 mm 至 105 mm</li><li>2.6 (wide) – 5.9 (tele)</li><li>640 x 480 @ 30/15 fps mjpeg</li><li>2.7" lcd</li></ul><span class="smalltxt"><span class="bold">OLYMPUS μ1070 nt 4999 (costco)<br /></span></span><ul><li>1,200萬</li><li><span id="show"><span class="text13List" style="color:#666666;"><span style="font-size: 9pt; color: black; font-family: 新細明體;"><span>38mm</span><span>~114mm</span></span></span></span></li><li><span id="show"><span class="text13List" style="color:#666666;"><span style="font-size: 9pt; color: black; font-family: 新細明體;"><span>F3.5(W)~F5.0(T)</span></span></span></span></li><li>640 x 480 @ 30/15 fps mjpeg</li><li>2.7" lcd</li><li><span id="show"><span class="text13List" style="color:#666666;">CCD移動式手震校正</span></span></li></ul>FUJI <span class="text20">F72EXR nt 5990<br /></span><ul><li><br /></li></ul>checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-68725610159367566452010-08-05T11:56:00.004+08:002010-08-05T14:26:03.877+08:00pipeline bubble利用 assembly 來optimize speed 時,要注意,並不是 instruction line 短就夠了。<br />還要注意 pipline 的特性。<br /><br />pipeline 將指令分成幾個 stage:<br /><ul><li>fetch,</li><li> decode/register read,</li><li> alu,<br /></li><li>memory write,<br /></li><li>register update.</li></ul>如果這樣個 assembly codes:<br /><code> ldr r0,#1<br />add r3,r0,r1</code>第二行指令在 decode/register read 時,r0 還沒update,因為上一行才執行到alu operation。所以在pipeline中的第二行指令就要停下來,等兩個clock,等上一行指令執行到register update後,才可以繼續。<br />這樣,就白白浪費 2 個 clock 了。<br /><br />為了避免這樣的情況,寫 assembly 的時候,就可以在中間插入下面要作的 assembly code,不要白白浪費這兩個clock<br /><br />在 (很久)前面的文章:yuv - rgb color space convert 的 assembly code 可以看到。最後一個作者的assembly code 就有做到這個(所以整個 code 的 flow 變得不好trace)。實測的結果,也是最快的。<br /><hr />在 Wiki 里也有<a href="http://en.wikipedia.org/wiki/Compiler_optimization">說明</a>:<br /><dl><dt><b><a href="http://en.wikipedia.org/wiki/Instruction_scheduling" title="Instruction scheduling">instruction scheduling</a></b></dt><dd>Instruction scheduling is an important optimization for modern <a href="http://en.wikipedia.org/wiki/Instruction_pipeline" title="Instruction pipeline">pipelined</a> processors, which avoids stalls or bubbles in the pipeline by clustering instructions with no dependencies together, while being careful to preserve the original semantics.</dd></dl>checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com2tag:blogger.com,1999:blog-2117270136732158310.post-92107316363777242662010-08-04T18:48:00.003+08:002010-08-04T18:51:57.168+08:00OEM 自訂 cache mode --- CE 6.0這一篇 ( <a href="http://support.microsoft.com/kb/977855">http://support.microsoft.com/kb/977855/</a> ) 超新的... An update that enables the Windows Embedded CE 6.0 kernel to support different cache mode bits is available<br /><br />是 Microsoft as Windows Embedded CE 6.0 Platform Builder Monthly Update (June 2010). 才支援。<br /><br />就是在 5.0 以前都有 support 的 OEMARMCacheMode( ) 回報 .checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-13455911985569881692010-08-04T11:14:00.004+08:002010-08-04T18:37:36.228+08:00cachecache 是一小塊和cpu時脈一樣的記憶體,作為 cpu 與 主記憶體間的 buffer。<br />當 cpu 要讀取 memory 時, cache 先把 memory 的資料讀進 cache 中,然後再讓 cpu 讀取。<br /><br />cpu 每次讀取的單位是 int (32bit),但是 cache 為求效能,會一次讀入比 int 還多的資料。<br />cache 每次讀入的資料大小叫 line size,每次讀入的資料放入 一個 line。<br /><br />cache 就是利用這樣預先讀取的能力,讓cpu 下次需要讀取記憶體時,可以直接由 cache 拿,不需要再向 主記憶體 讀取。<br /><hr /><br />由於 cache 只有小小一塊,所以必須要有一個機制知道 cpu 需要存取記憶體時,那個 address的內容是不是已經在cache 里,如果在,是在 cache 的那一條 line ...<br /><br />最直覺的方法就是去找每一個 cache line 的 address,看看那一個 line 所以 cache 的 記憶體位址是不是 cpu 現在要的。<br /><br />這樣個 cache 叫 associative cache.<br /><br />但是這樣作很耗空間(電路),因為每一個 line 都要作一個 address比較電路。<br />所以就有比較便宜的作法.. 把 把 address 分成兩部份:<br /><br />tag, index<br /><br />以 32 bit 的 address line 為例,可以分成:<br /><ul><li>tag : 31~20</li><li>index : 19~0<br /></li></ul>這樣要找cache 時就可以反過來用,用 address的 0~19作 index,找到那個 cache index line 的 tag,然後跟 31~20比較就可以。<br /><br /><br />後來又有折衷的辦法,就是...每個 index 可以有兩個 tag欄位和lines,這樣,每20 條位址線,就可以共用兩條 cache line。 -- 這就叫 2 way cache.<br />=>這樣就是:拿 index 找到對應的 2 個 tag ,比較和 address bit 31-20 一步一樣。<br /><br />一此類推,可以有 4 way cache。<br /><hr />這一篇 (<a href="http://www.mirabilisdesign.com/Pages/Demonstrations/systemarchitecture/Cache_System/Functional_Cache_Model_Overview.html">http://www.mirabilisdesign.com/Pages/Demonstrations/systemarchitecture/Cache_System/Functional_Cache_Model_Overview.html</a>)雖然是 sim software 的說明,但是可以看到 ARM11 cache 的 impelement 圖例<br /><br />cache line size 是 16 words (address 0~3), index size 是 4096 (address 4~15), tag filed 是 address 16~31,<br /><br /><hr /><br /><br />所以 cache index size x byte size x way = cache sizecheckohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0tag:blogger.com,1999:blog-2117270136732158310.post-56545259242540086092010-08-02T09:36:00.000+08:002010-08-02T09:38:39.228+08:00這個網站很不錯,範圍很廣,軟體與實際的應用.. <a href="http://yukuan.blogspot.com/">http://yukuan.blogspot.com/</a>checkohttp://www.blogger.com/profile/03239306354367907990noreply@blogger.com0