From: Amine Khaldi Date: Mon, 11 Jul 2011 19:40:43 +0000 (+0000) Subject: * Sync with recent trunk (r52637). X-Git-Tag: backups/icu4ros-bringup@60647~248^2~55 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=9fa710c8135d9c18cd6e828bc696b4a3a8b95f9d * Sync with recent trunk (r52637). svn path=/branches/GSoC_2011/ThemesSupport/; revision=52643 --- 9fa710c8135d9c18cd6e828bc696b4a3a8b95f9d diff --cc apistatus.lst index 26997490887,26997490887..26997490887 mode 100755,100644..100644 --- a/apistatus.lst +++ b/apistatus.lst diff --cc base/applications/cacls/lang/da-DA.rc index 00000000000,4e53f85c574..4e53f85c574 mode 000000,100644..100644 --- a/base/applications/cacls/lang/da-DA.rc +++ b/base/applications/cacls/lang/da-DA.rc diff --cc base/applications/cacls/lang/es-ES.rc index 00000000000,f48fa9e410e..f48fa9e410e mode 000000,100644..100644 --- a/base/applications/cacls/lang/es-ES.rc +++ b/base/applications/cacls/lang/es-ES.rc diff --cc base/applications/cacls/lang/sv-SE.rc index 00000000000,e84cd92e6ad..e84cd92e6ad mode 000000,100644..100644 --- a/base/applications/cacls/lang/sv-SE.rc +++ b/base/applications/cacls/lang/sv-SE.rc diff --cc base/applications/calc/lang/sv-SE.rc index 00000000000,fbf1ab2a212..fbf1ab2a212 mode 000000,100644..100644 --- a/base/applications/calc/lang/sv-SE.rc +++ b/base/applications/calc/lang/sv-SE.rc diff --cc base/applications/calc/lang/zh-CN.rc index 00000000000,117d7b8f3ec..117d7b8f3ec mode 000000,100644..100644 --- a/base/applications/calc/lang/zh-CN.rc +++ b/base/applications/calc/lang/zh-CN.rc diff --cc base/applications/calc/resource.rc index 8b0d15e5b6a,00000000000..02f3ad1a1b8 mode 100644,000000..100644 --- a/base/applications/calc/resource.rc +++ b/base/applications/calc/resource.rc @@@ -1,64 -1,0 +1,69 @@@ +/* + * ReactOS Calc (global resource file) + * + * Copyright 2007, Carlo Bramini + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "resource.h" + +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif + +#ifndef DS_SHELLFONT +#define DS_SHELLFONT DS_SETFONT|DS_FIXEDSYS +#endif + +// Common resources + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +// Icons + +IDI_CALC_BIG ICON DISCARDABLE "res/calc.ico" +IDI_CALC_SMALL ICON DISCARDABLE "res/calc_sm.ico" + +// Bitmaps + +IDB_BITMAP_ROS BITMAP DISCARDABLE "res/ROS_logo.bmp" + + ++#include "lang/en-US.rc" ++#include "lang/nl-NL.rc" ++ ++// UTF-8 ++#pragma code_page(65001) +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" - #include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/ko-KR.rc" - #include "lang/nl-NL.rc" +#include "lang/no-NO.rc" +#include "lang/pl-PL.rc" +#include "lang/ro-RO.rc" +#include "lang/ru-RU.rc" +#include "lang/sk-SK.rc" ++#include "lang/sv-SE.rc" +#include "lang/th-TH.rc" +#include "lang/uk-UA.rc" ++#include "lang/zh-CN.rc" diff --cc base/applications/charmap/lang/sv-SE.rc index 00000000000,5ac57e01c78..5ac57e01c78 mode 000000,100644..100644 --- a/base/applications/charmap/lang/sv-SE.rc +++ b/base/applications/charmap/lang/sv-SE.rc diff --cc base/applications/cmdutils/doskey/lang/pl-PL.rc index 00000000000,ca54cc2febe..ca54cc2febe mode 000000,100644..100644 --- a/base/applications/cmdutils/doskey/lang/pl-PL.rc +++ b/base/applications/cmdutils/doskey/lang/pl-PL.rc diff --cc base/applications/cmdutils/doskey/lang/sv-SE.rc index 00000000000,a03b80a450a..a03b80a450a mode 000000,100644..100644 --- a/base/applications/cmdutils/doskey/lang/sv-SE.rc +++ b/base/applications/cmdutils/doskey/lang/sv-SE.rc diff --cc base/applications/cmdutils/more/lang/sv-SE.rc index 00000000000,81aa7bdc99f..81aa7bdc99f mode 000000,100644..100644 --- a/base/applications/cmdutils/more/lang/sv-SE.rc +++ b/base/applications/cmdutils/more/lang/sv-SE.rc diff --cc base/applications/cmdutils/xcopy/Es.rc index 00000000000,67c9eb8ba04..67c9eb8ba04 mode 000000,100644..100644 --- a/base/applications/cmdutils/xcopy/Es.rc +++ b/base/applications/cmdutils/xcopy/Es.rc diff --cc base/applications/dxdiag/lang/sv-SE.rc index 00000000000,bf737dda281..bf737dda281 mode 000000,100644..100644 --- a/base/applications/dxdiag/lang/sv-SE.rc +++ b/base/applications/dxdiag/lang/sv-SE.rc diff --cc base/applications/dxdiag/lang/uk-UA.rc index 00000000000,e5d7a0bc950..e5d7a0bc950 mode 000000,100644..100644 --- a/base/applications/dxdiag/lang/uk-UA.rc +++ b/base/applications/dxdiag/lang/uk-UA.rc diff --cc base/applications/dxdiag/rsrc.rc index 4fde55c20e1,00000000000..c61cd401b56 mode 100644,000000..100644 --- a/base/applications/dxdiag/rsrc.rc +++ b/base/applications/dxdiag/rsrc.rc @@@ -1,22 -1,0 +1,20 @@@ - - #include - #include "resource.h" - - LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL - +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/ko-KR.rc" +#include "lang/nl-NL.rc" +#include "lang/no-NO.rc" - #include "lang/pl-PL.rc" - #include "lang/ru-RU.rc" +#include "lang/sk-SK.rc" - #include "lang/ua-UA.rc" ++#include "lang/sv-SE.rc" +#include "lang/zh-CN.rc" +//#include "lang/zh-TW.rc" ++ ++// UTF-8 ++#pragma code_page(65001) ++#include "lang/pl-PL.rc" ++#include "lang/ru-RU.rc" ++#include "lang/uk-UA.rc" diff --cc base/applications/fontview/lang/sv-SE.rc index 00000000000,5756fbe216d..5756fbe216d mode 000000,100644..100644 --- a/base/applications/fontview/lang/sv-SE.rc +++ b/base/applications/fontview/lang/sv-SE.rc diff --cc base/applications/kbswitch/lang/sv-SE.rc index 00000000000,74f63bb7bc5..74f63bb7bc5 mode 000000,100644..100644 --- a/base/applications/kbswitch/lang/sv-SE.rc +++ b/base/applications/kbswitch/lang/sv-SE.rc diff --cc base/applications/logoff/lang/sv-SE.rc index 00000000000,37d8f9efec4..37d8f9efec4 mode 000000,100644..100644 --- a/base/applications/logoff/lang/sv-SE.rc +++ b/base/applications/logoff/lang/sv-SE.rc diff --cc base/applications/magnify/lang/sv-SE.rc index 00000000000,941808ec06c..941808ec06c mode 000000,100644..100644 --- a/base/applications/magnify/lang/sv-SE.rc +++ b/base/applications/magnify/lang/sv-SE.rc diff --cc base/applications/mmc/lang/sv-SE.rc index 00000000000,aad29a76fed..aad29a76fed mode 000000,100644..100644 --- a/base/applications/mmc/lang/sv-SE.rc +++ b/base/applications/mmc/lang/sv-SE.rc diff --cc base/applications/mplay32/lang/sv-SE.rc index 00000000000,42f5dc336d7..42f5dc336d7 mode 000000,100644..100644 --- a/base/applications/mplay32/lang/sv-SE.rc +++ b/base/applications/mplay32/lang/sv-SE.rc diff --cc base/applications/mplay32/rsrc.rc index 1bab33205be,00000000000..09b6fb1b593 mode 100644,000000..100644 --- a/base/applications/mplay32/rsrc.rc +++ b/base/applications/mplay32/rsrc.rc @@@ -1,17 -1,0 +1,21 @@@ +#include +#include "resource.h" + +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/it-IT.rc" +// #include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/nl-NL.rc" +#include "lang/no-NO.rc" ++#include "lang/sk-SK.rc" ++#include "lang/sv-SE.rc" ++ ++// UTF-8 ++#pragma code_page(65001) +#include "lang/pl-PL.rc" +#include "lang/ru-RU.rc" - #include "lang/sk-SK.rc" +#include "lang/uk-UA.rc" diff --cc base/applications/msconfig/lang/sv-SE.rc index 00000000000,968687f10bb..968687f10bb mode 000000,100644..100644 --- a/base/applications/msconfig/lang/sv-SE.rc +++ b/base/applications/msconfig/lang/sv-SE.rc diff --cc base/applications/mscutils/devmgmt/lang/sv-SE.rc index 00000000000,84b0652bbe6..84b0652bbe6 mode 000000,100644..100644 --- a/base/applications/mscutils/devmgmt/lang/sv-SE.rc +++ b/base/applications/mscutils/devmgmt/lang/sv-SE.rc diff --cc base/applications/mscutils/devmgmt/rsrc.rc index b4cec35fbf3,00000000000..ab085c0212e mode 100644,000000..100644 --- a/base/applications/mscutils/devmgmt/rsrc.rc +++ b/base/applications/mscutils/devmgmt/rsrc.rc @@@ -1,32 -1,0 +1,36 @@@ +#include +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +IDI_MAIN_ICON ICON "res/computer.ico" +IDB_ROOT_IMAGE BITMAP "res/root.bmp" + +/* main toolbar icons */ +IDB_PROP BITMAP DISCARDABLE "res/properties.bmp" +IDB_REFRESH BITMAP DISCARDABLE "res/refresh.bmp" +IDB_HELP BITMAP DISCARDABLE "res/help.bmp" +IDB_EXIT BITMAP DISCARDABLE "res/exit.bmp" + +#include "lang/bg-BG.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/ko-KR.rc" +#include "lang/no-NO.rc" - #include "lang/pl-PL.rc" +#include "lang/ro-RO.rc" - #include "lang/ru-RU.rc" +#include "lang/sk-SK.rc" ++#include "lang/sv-SE.rc" +#include "lang/th-TH.rc" ++ ++// UTF-8 ++#pragma code_page(65001) ++#include "lang/pl-PL.rc" ++#include "lang/ru-RU.rc" +#include "lang/uk-UA.rc" + diff --cc base/applications/mscutils/eventvwr/lang/sv-SE.rc index 00000000000,7dbd9718a69..7dbd9718a69 mode 000000,100644..100644 --- a/base/applications/mscutils/eventvwr/lang/sv-SE.rc +++ b/base/applications/mscutils/eventvwr/lang/sv-SE.rc diff --cc base/applications/mscutils/servman/lang/sv-SE.rc index 00000000000,39553bacfbf..39553bacfbf mode 000000,100644..100644 --- a/base/applications/mscutils/servman/lang/sv-SE.rc +++ b/base/applications/mscutils/servman/lang/sv-SE.rc diff --cc base/applications/mscutils/servman/rsrc.rc index 63b5dfbc32f,00000000000..0b4a23c2377 mode 100644,000000..100644 --- a/base/applications/mscutils/servman/rsrc.rc +++ b/base/applications/mscutils/servman/rsrc.rc @@@ -1,39 -1,0 +1,43 @@@ +#include +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +IDI_SM_ICON ICON "res/system.ico" + +/* main toolbar icons */ +IDB_PROP BITMAP DISCARDABLE "res/properties.bmp" +IDB_REFRESH BITMAP DISCARDABLE "res/refresh.bmp" +IDB_EXPORT BITMAP DISCARDABLE "res/export.bmp" +IDB_CREATE BITMAP DISCARDABLE "res/create.bmp" +IDB_DELETE BITMAP DISCARDABLE "res/delete.bmp" +IDB_START BITMAP DISCARDABLE "res/start.bmp" +IDB_STOP BITMAP DISCARDABLE "res/stop.bmp" +IDB_PAUSE BITMAP DISCARDABLE "res/pause.bmp" +IDB_RESTART BITMAP DISCARDABLE "res/restart.bmp" + +IDI_NODEPENDS ICON "res/nodepends.ico" +IDI_SERVICE ICON "res/system.ico" +IDI_DRIVER ICON "res/driver.ico" + +#include "lang/bg-BG.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/ko-KR.rc" +#include "lang/no-NO.rc" ++#include "lang/sk-SK.rc" ++#include "lang/sv-SE.rc" ++#include "lang/th-TH.rc" ++ ++// UTF-8 ++#pragma code_page(65001) +#include "lang/pl-PL.rc" +#include "lang/ro-RO.rc" +#include "lang/ru-RU.rc" - #include "lang/sk-SK.rc" - #include "lang/th-TH.rc" +#include "lang/uk-UA.rc" diff --cc base/applications/mspaint/CMakeLists.txt index 00000000000,dee6aa9f405..dee6aa9f405 mode 000000,100644..100644 --- a/base/applications/mspaint/CMakeLists.txt +++ b/base/applications/mspaint/CMakeLists.txt diff --cc base/applications/mspaint/drawing.h index 00000000000,b9f23ad4196..b9f23ad4196 mode 000000,100644..100644 --- a/base/applications/mspaint/drawing.h +++ b/base/applications/mspaint/drawing.h diff --cc base/applications/mspaint/help/Paint.chm index da3e9021996,da3e9021996..da3e9021996 Binary files differ diff --cc base/applications/mspaint/help/airbrush.png index 86aaf3fd527,86aaf3fd527..86aaf3fd527 Binary files differ diff --cc base/applications/mspaint/help/appwindow.png index 3552f5911d6,3552f5911d6..3552f5911d6 Binary files differ diff --cc base/applications/mspaint/help/bezier.png index d31307673bb,d31307673bb..d31307673bb Binary files differ diff --cc base/applications/mspaint/help/brush.png index 470d8d72582,470d8d72582..470d8d72582 Binary files differ diff --cc base/applications/mspaint/help/color.png index 80aed072b37,80aed072b37..80aed072b37 Binary files differ diff --cc base/applications/mspaint/help/ellipse.png index f2c8921e7e4,f2c8921e7e4..f2c8921e7e4 Binary files differ diff --cc base/applications/mspaint/help/fill.png index 1da4f22b005,1da4f22b005..1da4f22b005 Binary files differ diff --cc base/applications/mspaint/help/freesel.png index 695ba902225,695ba902225..695ba902225 Binary files differ diff --cc base/applications/mspaint/help/line.png index bc53d8e344a,bc53d8e344a..bc53d8e344a Binary files differ diff --cc base/applications/mspaint/help/palette.png index cfa07bd0809,cfa07bd0809..cfa07bd0809 Binary files differ diff --cc base/applications/mspaint/help/pen.png index 70c21277629,70c21277629..70c21277629 Binary files differ diff --cc base/applications/mspaint/help/rect.png index b3e4c025355,b3e4c025355..b3e4c025355 Binary files differ diff --cc base/applications/mspaint/help/rectsel.png index 72eb64dd9e4,72eb64dd9e4..72eb64dd9e4 Binary files differ diff --cc base/applications/mspaint/help/rrect.png index c1c278931bb,c1c278931bb..c1c278931bb Binary files differ diff --cc base/applications/mspaint/help/rubber.png index 9f123edbe65,9f123edbe65..9f123edbe65 Binary files differ diff --cc base/applications/mspaint/help/settings1.png index ee79d45667a,ee79d45667a..ee79d45667a Binary files differ diff --cc base/applications/mspaint/help/settings2.png index 35ccaa63037,35ccaa63037..35ccaa63037 Binary files differ diff --cc base/applications/mspaint/help/settings3.png index 238ead24ed0,238ead24ed0..238ead24ed0 Binary files differ diff --cc base/applications/mspaint/help/settings4.png index a90613e268d,a90613e268d..a90613e268d Binary files differ diff --cc base/applications/mspaint/help/settings5.png index 8a7e33a0677,8a7e33a0677..8a7e33a0677 Binary files differ diff --cc base/applications/mspaint/help/settings6.png index 564d3cf54bd,564d3cf54bd..564d3cf54bd Binary files differ diff --cc base/applications/mspaint/help/shape.png index 5535e1df5bd,5535e1df5bd..5535e1df5bd Binary files differ diff --cc base/applications/mspaint/help/text.png index bef563a35ef,bef563a35ef..bef563a35ef Binary files differ diff --cc base/applications/mspaint/help/toolbox.png index 287bd396409,287bd396409..287bd396409 Binary files differ diff --cc base/applications/mspaint/help/zoom.png index 6233ae09753,6233ae09753..6233ae09753 Binary files differ diff --cc base/applications/mspaint/icons/airbrush_cur.ico index aa1a09c5962,aa1a09c5962..aa1a09c5962 Binary files differ diff --cc base/applications/mspaint/icons/color_cur.ico index 49d536df9c6,49d536df9c6..49d536df9c6 Binary files differ diff --cc base/applications/mspaint/icons/fill_cur.ico index fa2679fe3f1,fa2679fe3f1..fa2679fe3f1 Binary files differ diff --cc base/applications/mspaint/icons/horzstretch.ico index 9704517df78,9704517df78..9704517df78 Binary files differ diff --cc base/applications/mspaint/icons/iconbar.bmp index 402209d2776,402209d2776..402209d2776 Binary files differ diff --cc base/applications/mspaint/icons/nontransparent.ico index 4b4b045b57f,4b4b045b57f..4b4b045b57f Binary files differ diff --cc base/applications/mspaint/icons/paint.ico index 2d4a0eea513,2d4a0eea513..2d4a0eea513 Binary files differ diff --cc base/applications/mspaint/icons/pen_cur.ico index 107e55551ec,107e55551ec..107e55551ec Binary files differ diff --cc base/applications/mspaint/icons/transparency.xcf index 63097b9b4f8,63097b9b4f8..63097b9b4f8 Binary files differ diff --cc base/applications/mspaint/icons/transparent.ico index d4f1c842012,d4f1c842012..d4f1c842012 Binary files differ diff --cc base/applications/mspaint/icons/vertstretch.ico index 73b80012617,73b80012617..73b80012617 Binary files differ diff --cc base/applications/mspaint/icons/zoom_cur.ico index 072b2c3a238,072b2c3a238..072b2c3a238 Binary files differ diff --cc base/applications/mspaint/lang/ru-RU.rc index 00000000000,7b151a2690c..7b151a2690c mode 000000,100644..100644 --- a/base/applications/mspaint/lang/ru-RU.rc +++ b/base/applications/mspaint/lang/ru-RU.rc diff --cc base/applications/mspaint/lang/uk-UA.rc index 00000000000,d52fa540e08..d52fa540e08 mode 000000,100644..100644 --- a/base/applications/mspaint/lang/uk-UA.rc +++ b/base/applications/mspaint/lang/uk-UA.rc diff --cc base/applications/mspaint/mouse.h index 00000000000,ea56ba8b6ba..ea56ba8b6ba mode 000000,100644..100644 --- a/base/applications/mspaint/mouse.h +++ b/base/applications/mspaint/mouse.h diff --cc base/applications/mspaint/mspaint.rbuild index 00000000000,7f1c410c66c..7f1c410c66c mode 000000,100644..100644 --- a/base/applications/mspaint/mspaint.rbuild +++ b/base/applications/mspaint/mspaint.rbuild diff --cc base/applications/mstsc/lang/sv-SE.rc index 00000000000,cd50843b379..cd50843b379 mode 000000,100644..100644 --- a/base/applications/mstsc/lang/sv-SE.rc +++ b/base/applications/mstsc/lang/sv-SE.rc diff --cc base/applications/mstsc/rsrc.rc index 6d1bedcd8b1,00000000000..98a48842385 mode 100644,000000..100644 --- a/base/applications/mstsc/rsrc.rc +++ b/base/applications/mstsc/rsrc.rc @@@ -1,30 -1,0 +1,34 @@@ +#include +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +IDI_MSTSC ICON "res/mstsc.ico" +IDI_LOGON ICON "res/logon.ico" +IDI_CONN ICON "res/connection.ico" +IDI_REMOTE ICON "res/remote.ico" +IDI_COLORS ICON "res/colors.ico" + +IDB_HEADER BITMAP "res/header.bmp" +IDB_SPECT BITMAP "res/spectrum.bmp" + +#include "lang/bg-BG.rc" +#include "lang/ca-ES.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/ko-KR.rc" +#include "lang/lt-LT.rc" +#include "lang/no-NO.rc" ++#include "lang/sk-SK.rc" ++#include "lang/sv-SE.rc" ++ ++// UTF-8 ++#pragma code_page(65001) +#include "lang/pl-PL.rc" +#include "lang/ru-RU.rc" - #include "lang/sk-SK.rc" +#include "lang/uk-UA.rc" diff --cc base/applications/network/ipconfig/lang/es-ES.rc index 00000000000,969900d3826..969900d3826 mode 000000,100644..100644 --- a/base/applications/network/ipconfig/lang/es-ES.rc +++ b/base/applications/network/ipconfig/lang/es-ES.rc diff --cc base/applications/network/ipconfig/lang/sv-SE.rc index 00000000000,35f7e1814b2..35f7e1814b2 mode 000000,100644..100644 --- a/base/applications/network/ipconfig/lang/sv-SE.rc +++ b/base/applications/network/ipconfig/lang/sv-SE.rc diff --cc base/applications/network/ping/lang/cs-CZ.rc index 00000000000,ebc948a987c..ebc948a987c mode 000000,100644..100644 --- a/base/applications/network/ping/lang/cs-CZ.rc +++ b/base/applications/network/ping/lang/cs-CZ.rc diff --cc base/applications/network/ping/lang/sv-SE.rc index 00000000000,135126c98a9..135126c98a9 mode 000000,100644..100644 --- a/base/applications/network/ping/lang/sv-SE.rc +++ b/base/applications/network/ping/lang/sv-SE.rc diff --cc base/applications/network/ping/lang/uk-UA.rc index 00000000000,e4a8ab3c026..e4a8ab3c026 mode 000000,100644..100644 --- a/base/applications/network/ping/lang/uk-UA.rc +++ b/base/applications/network/ping/lang/uk-UA.rc diff --cc base/applications/notepad/rsrc.rc index 535a52c8404,00000000000..6299b0d2e98 mode 100644,000000..100644 --- a/base/applications/notepad/rsrc.rc +++ b/base/applications/notepad/rsrc.rc @@@ -1,64 -1,0 +1,67 @@@ +/* + * Copyright 1997,98 Marcel Baur + * Copyright 2002 Sylvain Petreolle + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "main.h" +#include "winnls.h" +#include "commctrl.h" +#include "notepad_res.h" + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Editor\0" +#define REACTOS_STR_INTERNAL_NAME "notepad\0" +#define REACTOS_STR_ORIGINAL_FILENAME "notepad.exe\0" + +#include + + +IDI_NPICON ICON "res/notepad.ico" + +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/da-DK.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/eu-ES.rc" +#include "lang/fi-FI.rc" +#include "lang/fr-FR.rc" +#include "lang/hu-HU.rc" - #include "lang/hy-AM.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/lt-LT.rc" +#include "lang/nl-NL.rc" +#include "lang/no-NO.rc" - #include "lang/pl-PL.rc" +#include "lang/pt-PT.rc" - #include "lang/ro-RO.rc" - #include "lang/ru-RU.rc" +#include "lang/sk-SK.rc" +#include "lang/sl-SI.rc" +#include "lang/sv-SE.rc" +#include "lang/th-TH.rc" - #include "lang/uk-UA.rc" +#include "lang/zh-CN.rc" ++ ++// UTF-8 ++#pragma code_page(65001) ++#include "lang/hy-AM.rc" ++#include "lang/pl-PL.rc" ++#include "lang/ro-RO.rc" ++#include "lang/ru-RU.rc" ++#include "lang/uk-UA.rc" diff --cc base/applications/rapps/lang/fr-FR.rc index 00000000000,2376d97179a..2376d97179a mode 000000,100644..100644 --- a/base/applications/rapps/lang/fr-FR.rc +++ b/base/applications/rapps/lang/fr-FR.rc diff --cc base/applications/rapps/lang/sv-SE.rc index 00000000000,3681f7ac088..3681f7ac088 mode 000000,100644..100644 --- a/base/applications/rapps/lang/sv-SE.rc +++ b/base/applications/rapps/lang/sv-SE.rc diff --cc base/applications/rapps/rapps/doublecommander.txt index 00000000000,12169d2fd90..12169d2fd90 mode 000000,100644..100644 --- a/base/applications/rapps/rapps/doublecommander.txt +++ b/base/applications/rapps/rapps/doublecommander.txt diff --cc base/applications/rapps/rapps/firefox4.txt index 00000000000,650153b0176..650153b0176 mode 000000,100644..100644 --- a/base/applications/rapps/rapps/firefox4.txt +++ b/base/applications/rapps/rapps/firefox4.txt diff --cc base/applications/rapps/rapps/mirc6.txt index 00000000000,1debcaa7e62..1debcaa7e62 mode 000000,100644..100644 --- a/base/applications/rapps/rapps/mirc6.txt +++ b/base/applications/rapps/rapps/mirc6.txt diff --cc base/applications/rapps/rapps/python3.txt index 00000000000,d97ef7398ea..d97ef7398ea mode 000000,100644..100644 --- a/base/applications/rapps/rapps/python3.txt +++ b/base/applications/rapps/rapps/python3.txt diff --cc base/applications/rapps/rapps/sumatrapdf.txt index 00000000000,a28ff505811..a28ff505811 mode 000000,100644..100644 --- a/base/applications/rapps/rapps/sumatrapdf.txt +++ b/base/applications/rapps/rapps/sumatrapdf.txt diff --cc base/applications/rapps/rsrc.rc index 4be23905aea,00000000000..f780f0ab525 mode 100644,000000..100644 --- a/base/applications/rapps/rsrc.rc +++ b/base/applications/rapps/rsrc.rc @@@ -1,12 -1,0 +1,15 @@@ ++#pragma code_page(65001) +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" ++#include "lang/fr-FR.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/no-NO.rc" +#include "lang/pl-PL.rc" +#include "lang/ru-RU.rc" +#include "lang/sk-SK.rc" ++#include "lang/sv-SE.rc" +#include "lang/uk-UA.rc" diff --cc base/applications/regedit/clb/lang/fr-FR.rc index 00000000000,a532465a262..a532465a262 mode 000000,100644..100644 --- a/base/applications/regedit/clb/lang/fr-FR.rc +++ b/base/applications/regedit/clb/lang/fr-FR.rc diff --cc base/applications/regedit/rsrc.rc index 79db6af680c,00000000000..873dcf95234 mode 100644,000000..100644 --- a/base/applications/regedit/rsrc.rc +++ b/base/applications/regedit/rsrc.rc @@@ -1,54 -1,0 +1,57 @@@ +/* + * Regedit resources + * + * Copyright 2002 Robert Dickenson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include "resource.h" + + +/* define language neutral resources */ + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +/* include localised resources */ + +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/hu-HU.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/ko-KR.rc" +#include "lang/nl-NL.rc" +#include "lang/no-NO.rc" - #include "lang/pl-PL.rc" +#include "lang/pt-BR.rc" +#include "lang/pt-PT.rc" - #include "lang/ru-RU.rc" +#include "lang/sl-SI.rc" +#include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" +#include "lang/th-TH.rc" - #include "lang/uk-UA.rc" +#include "lang/zh-CN.rc" ++ ++// UTF-8 ++#pragma code_page(65001) ++#include "lang/pl-PL.rc" ++#include "lang/ru-RU.rc" ++#include "lang/uk-UA.rc" diff --cc base/applications/screensavers/3dtext/lang/sv-SE.rc index 00000000000,d0a33b7d501..d0a33b7d501 mode 000000,100644..100644 --- a/base/applications/screensavers/3dtext/lang/sv-SE.rc +++ b/base/applications/screensavers/3dtext/lang/sv-SE.rc diff --cc base/applications/screensavers/logon/lang/sv-SE.rc index 00000000000,7908353f741..7908353f741 mode 000000,100644..100644 --- a/base/applications/screensavers/logon/lang/sv-SE.rc +++ b/base/applications/screensavers/logon/lang/sv-SE.rc diff --cc base/applications/screensavers/logon/logon.rc index 14464dc7547,00000000000..4181f986869 mode 100644,000000..100644 --- a/base/applications/screensavers/logon/logon.rc +++ b/base/applications/screensavers/logon/logon.rc @@@ -1,31 -1,0 +1,36 @@@ +#include +#include +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Logon ScreenSaver\0" +#define REACTOS_STR_INTERNAL_NAME "logon\0" +#define REACTOS_STR_ORIGINAL_FILENAME "logon.scr\0" + +#include + +IDB_WORKSTATION BITMAP DISCARDABLE "res/0.bmp" +IDB_SERVER BITMAP DISCARDABLE "res/1.bmp" + +#include "lang/bg-BG.rc" +#include "lang/de-DE.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/eu-ES.rc" +#include "lang/fr-FR.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/ko-KR.rc" +#include "lang/lt-LT.rc" +#include "lang/nl-NL.rc" +#include "lang/no-NO.rc" - #include "lang/ro-RO.rc" +#include "lang/sk-SK.rc" - #include "lang/uk-UA.rc" ++#include "lang/sv-SE.rc" ++ ++// UTF-8 ++#pragma code_page(65001) ++#include "lang/pl-PL.rc" ++#include "lang/ro-RO.rc" +#include "lang/ru-RU.rc" ++#include "lang/uk-UA.rc" diff --cc base/applications/shutdown/lang/es-ES.rc index 00000000000,47a5f45296e..47a5f45296e mode 000000,100644..100644 --- a/base/applications/shutdown/lang/es-ES.rc +++ b/base/applications/shutdown/lang/es-ES.rc diff --cc base/applications/shutdown/lang/sv-SE.rc index 00000000000,8c4f2c8f838..8c4f2c8f838 mode 000000,100644..100644 --- a/base/applications/shutdown/lang/sv-SE.rc +++ b/base/applications/shutdown/lang/sv-SE.rc diff --cc base/applications/sndrec32/lang/cs-CZ.rc index 00000000000,a45c7881ed9..a45c7881ed9 mode 000000,100644..100644 --- a/base/applications/sndrec32/lang/cs-CZ.rc +++ b/base/applications/sndrec32/lang/cs-CZ.rc diff --cc base/applications/sndrec32/lang/fr-FR.rc index 00000000000,403069e0793..403069e0793 mode 000000,100644..100644 --- a/base/applications/sndrec32/lang/fr-FR.rc +++ b/base/applications/sndrec32/lang/fr-FR.rc diff --cc base/applications/sndrec32/lang/pl-PL.rc index 00000000000,8bf5b0f029c..8bf5b0f029c mode 000000,100644..100644 --- a/base/applications/sndrec32/lang/pl-PL.rc +++ b/base/applications/sndrec32/lang/pl-PL.rc diff --cc base/applications/sndrec32/lang/sv-SE.rc index 00000000000,519a8f4d746..519a8f4d746 mode 000000,100644..100644 --- a/base/applications/sndrec32/lang/sv-SE.rc +++ b/base/applications/sndrec32/lang/sv-SE.rc diff --cc base/applications/sndvol32/dialog.c index 00000000000,a46b4a365a0..a46b4a365a0 mode 000000,100644..100644 --- a/base/applications/sndvol32/dialog.c +++ b/base/applications/sndvol32/dialog.c diff --cc base/applications/taskmgr/lang/ro-RO.rc index 3983c3b5cba,00000000000..f735a9e6f10 mode 100644,000000..100644 --- a/base/applications/taskmgr/lang/ro-RO.rc +++ b/base/applications/taskmgr/lang/ro-RO.rc @@@ -1,671 -1,0 +1,669 @@@ +///////////////////////////////////////////////////////////////////////////// +// Romanian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL - #pragma code_page(65001) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_TASKMANAGER MENU DISCARDABLE +BEGIN + POPUP "&Fișier" + BEGIN + MENUITEM "&Program nou (Executare...)", ID_FILE_NEW + MENUITEM SEPARATOR + MENUITEM "I&eșire", ID_FILE_EXIT + END + POPUP "&Opțiuni" + BEGIN + MENUITEM "&Mereu deasupra", ID_OPTIONS_ALWAYSONTOP + , CHECKED + MENUITEM "&Minimizare când se face Salt", ID_OPTIONS_MINIMIZEONUSE + , CHECKED + MENUITEM "&Ascundere la minimizare", ID_OPTIONS_HIDEWHENMINIMIZED + , CHECKED + MENUITEM "&Afișare programe pe 16 biți", ID_OPTIONS_SHOW16BITTASKS + , CHECKED + END + POPUP "&Vizualizare" + BEGIN + MENUITEM "&Reîmprospătare", ID_VIEW_REFRESH + POPUP "&Viteză de reîmprospătare" + BEGIN + MENUITEM "&Ridicată", ID_VIEW_UPDATESPEED_HIGH + MENUITEM "&Normală", ID_VIEW_UPDATESPEED_NORMAL + , CHECKED + MENUITEM "&Mică", ID_VIEW_UPDATESPEED_LOW + MENUITEM "&Stagnantă", ID_VIEW_UPDATESPEED_PAUSED + + END + MENUITEM SEPARATOR + MENUITEM "Pictograme mari", ID_VIEW_LARGE + MENUITEM "Pictograme mici", ID_VIEW_SMALL + MENUITEM "&Detalii", ID_VIEW_DETAILS, CHECKED + MENUITEM "&Selectare coloane...", ID_VIEW_SELECTCOLUMNS + POPUP "&Istoric procesor" + BEGIN + MENUITEM "&Un grafic pentru toate procesoarele", ID_VIEW_CPUHISTORY_ONEGRAPHALL + + MENUITEM "Câte un grafic pentru fiecare procesor", ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU + , CHECKED + END + MENUITEM "&Afișare timpi kernel", ID_VIEW_SHOWKERNELTIMES + END + POPUP "&Ferestre" + BEGIN + MENUITEM "Aranjare orizontală", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "Aranjare verticală", ID_WINDOWS_TILEVERTICALLY + MENUITEM "&Minimizare", ID_WINDOWS_MINIMIZE + MENUITEM "Ma&ximizare", ID_WINDOWS_MAXIMIZE + MENUITEM "&În cascadă", ID_WINDOWS_CASCADE + MENUITEM "&Aducere în prim plan", ID_WINDOWS_BRINGTOFRONT + END + POPUP "&Ajutor" + BEGIN + MENUITEM "Topici de ajutor", ID_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "&Despre Gestionarul de Activități", ID_HELP_ABOUT + END +END + +IDR_WINDOWSMENU MENU DISCARDABLE +BEGIN + MENUITEM "Aranjare orizontală", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "Aranjare verticală", ID_WINDOWS_TILEVERTICALLY + MENUITEM "&Minimizare", ID_WINDOWS_MINIMIZE + MENUITEM "Ma&ximizare", ID_WINDOWS_MAXIMIZE + MENUITEM "&În cascadă", ID_WINDOWS_CASCADE + MENUITEM "&Aducere în prim plan", ID_WINDOWS_BRINGTOFRONT +END + +IDR_APPLICATION_PAGE_CONTEXT1 MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "&Program nou (Executare...)", ID_FILE_NEW + MENUITEM SEPARATOR + MENUITEM "Pictograme mari", ID_VIEW_LARGE + MENUITEM "Pictograme mici", ID_VIEW_SMALL + MENUITEM "&Detalii", ID_VIEW_DETAILS, CHECKED + END +END + +IDR_APPLICATION_PAGE_CONTEXT2 MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "&Salt la", ID_APPLICATION_PAGE_SWITCHTO + MENUITEM "&Aducere în prin plan", ID_WINDOWS_BRINGTOFRONT + MENUITEM SEPARATOR + MENUITEM "Aranjare orizontală", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "Aranjare verticală", ID_WINDOWS_TILEVERTICALLY + MENUITEM "&Minimizare", ID_WINDOWS_MINIMIZE + MENUITEM "Ma&ximizare", ID_WINDOWS_MAXIMIZE + MENUITEM "&În cascadă", ID_WINDOWS_CASCADE + MENUITEM SEPARATOR + MENUITEM "&Oprire program", ID_APPLICATION_PAGE_ENDTASK + MENUITEM "&Indicare proces", ID_APPLICATION_PAGE_GOTOPROCESS + + END +END + +IDR_TRAY_POPUP MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "&Restabilire", ID_RESTORE + MENUITEM "&Închidere", ID_FILE_EXIT + MENUITEM SEPARATOR + MENUITEM "&Mereu deasupra", ID_OPTIONS_ALWAYSONTOP + END +END + +IDR_PROCESS_PAGE_CONTEXT MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "&Oprire proces", ID_PROCESS_PAGE_ENDPROCESS + MENUITEM "Oprire a&rbore proces", ID_PROCESS_PAGE_ENDPROCESSTREE + + MENUITEM "&Depanare", ID_PROCESS_PAGE_DEBUG + MENUITEM SEPARATOR + POPUP "Setare &prioritate" + BEGIN + MENUITEM "&Timp real", ID_PROCESS_PAGE_SETPRIORITY_REALTIME + + MENUITEM "&Mare", ID_PROCESS_PAGE_SETPRIORITY_HIGH + + MENUITEM "&NormalăSpreMare", ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL + + MENUITEM "&Normală", ID_PROCESS_PAGE_SETPRIORITY_NORMAL + + MENUITEM "&NormalăSpreMică", ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL + + MENUITEM "&Mică", ID_PROCESS_PAGE_SETPRIORITY_LOW + + END + MENUITEM "Setare &afinitate", ID_PROCESS_PAGE_SETAFFINITY + MENUITEM "Edit Debug &Channels...", ID_PROCESS_PAGE_DEBUGCHANNELS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// +// TRANSLATORS: CAPTION must be the same as IDS_APP_TITLE to be brought back to focus when already opened + +IDD_TASKMGR_DIALOG DIALOGEX DISCARDABLE 0, 0, 264, 246 +STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | + WS_THICKFRAME +CAPTION "Gestionarul de activități" +MENU IDR_TASKMANAGER +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "Tab1",IDC_TAB,"SysTabControl32",WS_TABSTOP,3,3,257,228 +END + +IDD_APPLICATION_PAGE DIALOGEX DISCARDABLE 0, 0, 247, 210 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "List2",IDC_APPLIST,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 + PUSHBUTTON "&Program nou",IDC_NEWTASK,187,189,53,14 + PUSHBUTTON "&Salt la",IDC_SWITCHTO,131,189,53,14,WS_DISABLED + PUSHBUTTON "&Încheiere execuție",IDC_ENDTASK,75,189,53,14,WS_DISABLED +END + +IDD_PROCESS_PAGE DIALOGEX DISCARDABLE 0, 0, 247, 210 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | + WS_BORDER | WS_TABSTOP,7,7,233,177 + PUSHBUTTON "&Oprire proces",IDC_ENDPROCESS,171,189,69,14 + CONTROL "&Afișare procese de la toți utilizatorii",IDC_SHOWALLPROCESSES, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,191,111,10 +END + +//IDD_PERFORMANCE_PAGE DIALOGEX 0, 0, 247, 210 +IDD_PERFORMANCE_PAGE DIALOGEX DISCARDABLE 0, 0, 247, 210 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Uz proc.",IDC_CPU_USAGE_FRAME,5,5,60,54,0,WS_EX_TRANSPARENT + GROUPBOX "Uz mem.",IDC_MEM_USAGE_FRAME,5,63,60,54,BS_LEFTTEXT,WS_EX_TRANSPARENT + GROUPBOX "Total",IDC_TOTALS_FRAME,5,122,111,39,0,WS_EX_TRANSPARENT + GROUPBOX "Lucru (K)",IDC_COMMIT_CHARGE_FRAME,5,166,111,39,0,WS_EX_TRANSPARENT + GROUPBOX "Memorie fizică(K)",IDC_PHYSICAL_MEMORY_FRAME,131,122,111,39,0,WS_EX_TRANSPARENT + GROUPBOX "Memorie kernel (K)",IDC_KERNEL_MEMORY_FRAME,131,166,111,39,0,WS_EX_TRANSPARENT + LTEXT "Handles",IDS_TOTALS_HANDLE_COUNT,12,131,27,8 + LTEXT "Threads",IDS_TOTALS_THREAD_COUNT,12,140,27,8 + LTEXT "Procese",IDS_TOTALS_PROCESS_COUNT,12,149,34,8 + EDITTEXT IDC_TOTALS_HANDLE_COUNT,65,131,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_TOTALS_THREAD_COUNT,65,140,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_TOTALS_PROCESS_COUNT,65,149,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + LTEXT "Total",IDS_COMMIT_CHARGE_TOTAL,12,175,27,8 + LTEXT "Limită",IDS_COMMIT_CHARGE_LIMIT,12,184,15,8,NOT WS_BORDER + LTEXT "Vârf",IDS_COMMIT_CHARGE_PEAK,12,193,34,8 + EDITTEXT IDC_COMMIT_CHARGE_TOTAL,65,174,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_COMMIT_CHARGE_LIMIT,65,184,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_COMMIT_CHARGE_PEAK,65,193,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + LTEXT "Total",IDS_PHYSICAL_MEMORY_TOTAL,137,131,27,8 + LTEXT "Disponbil",IDS_PHYSICAL_MEMORY_AVAILABLE,137,140,30,8 + LTEXT "Memorie tampon",IDS_PHYSICAL_MEMORY_SYSTEM_CACHE,137,149,46,8 + EDITTEXT IDC_PHYSICAL_MEMORY_TOTAL,185,131,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_PHYSICAL_MEMORY_AVAILABLE,185,140,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_PHYSICAL_MEMORY_SYSTEM_CACHE,185,149,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + LTEXT "Totală",IDS_KERNEL_MEMORY_TOTAL,137,174,27,8 + LTEXT "Paged",IDS_KERNEL_MEMORY_PAGED,137,184,21,8 + LTEXT "Nonpaged",IDS_KERNEL_MEMORY_NONPAGED,137,193,34,8 + EDITTEXT IDC_KERNEL_MEMORY_TOTAL,185,174,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_KERNEL_MEMORY_PAGED,185,184,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_KERNEL_MEMORY_NONPAGED,185,193,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP + GROUPBOX "Istoric uz procesor",IDC_CPU_USAGE_HISTORY_FRAME,74,5,168,54,0,WS_EX_TRANSPARENT + GROUPBOX "Istoric uz memorie",IDC_MEMORY_USAGE_HISTORY_FRAME,74,63,168,54,0,WS_EX_TRANSPARENT + PUSHBUTTON "Afișaj uz procesor",IDC_CPU_USAGE_GRAPH,12,17,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE + PUSHBUTTON "Afișaj uz memorie",IDC_MEM_USAGE_GRAPH,12,75,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE + PUSHBUTTON "Istoric uz procesor",IDC_CPU_USAGE_HISTORY_GRAPH,81,17, + 153,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE + PUSHBUTTON "Istoric uz memorie",IDC_MEM_USAGE_HISTORY_GRAPH,81,75, + 153,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE +END + +IDD_DEBUG_CHANNELS_DIALOG DIALOGEX DISCARDABLE 0, 0, 247, 210 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Canale de depanare" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "List2",IDC_DEBUG_CHANNELS_LIST,"SysListView32",LVS_REPORT | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP | + LVS_SORTASCENDING,7,7,233,177 + PUSHBUTTON "Închidere",IDOK,171,189,69,14 +END + +IDD_AFFINITY_DIALOG DIALOGEX DISCARDABLE 0, 0, 231, 154 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Afinitate procesor" +FONT 8, "MS Shell Dlg" +BEGIN + DEFPUSHBUTTON "OK",IDOK,120,133,50,14 + PUSHBUTTON "Anulare",IDCANCEL,174,133,50,14 + LTEXT "Această setare controlează repartiția calculelor efectuate de fiecare procesor în parte.", + IDC_STATIC,5,5,220,16 + CONTROL "CPU 0",IDC_CPU0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 11,28,37,10 + CONTROL "CPU 1",IDC_CPU1,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,41,37,10 + CONTROL "CPU 2",IDC_CPU2,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,54,37,10 + CONTROL "CPU 3",IDC_CPU3,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,67,37,10 + CONTROL "CPU 4",IDC_CPU4,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,80,37,10 + CONTROL "CPU 5",IDC_CPU5,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,93,37,10 + CONTROL "CPU 6",IDC_CPU6,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,106,37,10 + CONTROL "CPU 7",IDC_CPU7,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,119,37,10 + CONTROL "CPU 8",IDC_CPU8,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,61,28,37,10 + CONTROL "CPU 9",IDC_CPU9,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,61,41,37,10 + CONTROL "CPU 10",IDC_CPU10,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,54,41,10 + CONTROL "CPU 11",IDC_CPU11,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,67,41,10 + CONTROL "CPU 12",IDC_CPU12,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,80,41,10 + CONTROL "CPU 13",IDC_CPU13,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,93,41,10 + CONTROL "CPU 14",IDC_CPU14,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,106,41,10 + CONTROL "CPU 15",IDC_CPU15,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,119,41,10 + CONTROL "CPU 16",IDC_CPU16,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,28,41,10 + CONTROL "CPU 17",IDC_CPU17,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,41,41,10 + CONTROL "CPU 18",IDC_CPU18,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,54,41,10 + CONTROL "CPU 19",IDC_CPU19,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,67,41,10 + CONTROL "CPU 20",IDC_CPU20,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,80,41,10 + CONTROL "CPU 21",IDC_CPU21,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,93,41,10 + CONTROL "CPU 22",IDC_CPU22,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,106,41,10 + CONTROL "CPU 23",IDC_CPU23,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,119,41,10 + CONTROL "CPU 24",IDC_CPU24,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,28,41,10 + CONTROL "CPU 25",IDC_CPU25,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,41,41,10 + CONTROL "CPU 26",IDC_CPU26,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,54,41,10 + CONTROL "CPU 27",IDC_CPU27,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,67,41,10 + CONTROL "CPU 28",IDC_CPU28,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,80,41,10 + CONTROL "CPU 29",IDC_CPU29,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,93,41,10 + CONTROL "CPU 30",IDC_CPU30,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,106,41,10 + CONTROL "CPU 31",IDC_CPU31,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,119,41,10 +END + +IDD_COLUMNS_DIALOG DIALOGEX DISCARDABLE 0, 0, 195, 199 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Alegeți coloanele" +FONT 8, "MS Shell Dlg" +BEGIN + DEFPUSHBUTTON "OK",IDOK,84,178,50,14 + PUSHBUTTON "Anulare",IDCANCEL,138,178,50,14 + LTEXT "Alegeți coloanele care vor apărea în fila Procese din Gestionarul de activități.", + IDC_STATIC,7,7,181,17 + CONTROL "&Nume imagine",IDC_IMAGENAME,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,7,28,56,10 + CONTROL "&PID (Identificator proces)",IDC_PID,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,39,88,10 + CONTROL "&Utilizare CPU",IDC_CPUUSAGE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,50,53,10 + CONTROL "T&imp CPU",IDC_CPUTIME,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,61,48,10 + CONTROL "&Utilizare memorie",IDC_MEMORYUSAGE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,72,63,10 + CONTROL "&Delta utilizare memorie",IDC_MEMORYUSAGEDELTA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,83,82,10 + CONTROL "V&ârf utilizare memorie",IDC_PEAKMEMORYUSAGE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,94,82,10 + CONTROL "&Erori pagină",IDC_PAGEFAULTS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,105,53,10 + CONTROL "&Obiecte utilizator",IDC_USEROBJECTS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,116,62,10 + CONTROL "Citiri I/O",IDC_IOREADS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,127,49,10 + CONTROL "Octeți citire I/O",IDC_IOREADBYTES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,138,65,10 + CONTROL "&ID sesiune",IDC_SESSIONID,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,149,50,10 + CONTROL "Nume utilizator",IDC_USERNAME,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,160,51,10 + CONTROL "Delta erori pagină",IDC_PAGEFAULTSDELTA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,28,72,10 + CONTROL "&Mărime memorie virtuală",IDC_VIRTUALMEMORYSIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,39,77,10 + CONTROL "Rezervă paginată",IDC_PAGEDPOOL,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,50,53,10 + CONTROL "Rezervă nepaginată",IDC_NONPAGEDPOOL,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,61,67,10 + CONTROL "Prioritate de bază",IDC_BASEPRIORITY,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,72,55,10 + CONTROL "&Număr identificatori",IDC_HANDLECOUNT,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,83,59,10 + CONTROL "&Număr subprocese",IDC_THREADCOUNT,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,94,59,10 + CONTROL "Obiecte GDI",IDC_GDIOBJECTS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,105,55,10 + CONTROL "Scrieri I/O",IDC_IOWRITES,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,116,49,10 + CONTROL "Octeți scriere I/O",IDC_IOWRITEBYTES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,127,65,10 + CONTROL "Alte I/O",IDC_IOOTHER,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,138,46,10 + CONTROL "Octeți alte I/O",IDC_IOOTHERBYTES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,149,65,10 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""resource.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_ABOUTBOX, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 252 + TOPMARGIN, 7 + BOTTOMMARGIN, 203 + END + + IDD_TASKMGR_DIALOG, DIALOG + BEGIN + LEFTMARGIN, 3 + RIGHTMARGIN, 260 + TOPMARGIN, 3 + BOTTOMMARGIN, 231 + END + + IDD_APPLICATION_PAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 240 + TOPMARGIN, 7 + BOTTOMMARGIN, 203 + END + + IDD_PROCESS_PAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 240 + TOPMARGIN, 7 + BOTTOMMARGIN, 203 + END + + IDD_PERFORMANCE_PAGE, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 242 + VERTGUIDE, 12 + VERTGUIDE, 65 + VERTGUIDE, 110 + TOPMARGIN, 5 + BOTTOMMARGIN, 205 + END + + IDD_AFFINITY_DIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 224 + VERTGUIDE, 11 + VERTGUIDE, 61 + VERTGUIDE, 116 + VERTGUIDE, 175 + TOPMARGIN, 7 + BOTTOMMARGIN, 147 + HORZGUIDE, 28 + HORZGUIDE, 38 + HORZGUIDE, 51 + HORZGUIDE, 64 + HORZGUIDE, 77 + HORZGUIDE, 90 + HORZGUIDE, 103 + HORZGUIDE, 116 + HORZGUIDE, 129 + END + + IDD_COLUMNS_DIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 188 + VERTGUIDE, 107 + TOPMARGIN, 7 + BOTTOMMARGIN, 192 + HORZGUIDE, 28 + END +END +#endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "Gestionarul de activități" + IDC_TASKMGR "Gestionarul de activități" + IDS_IDLE_PROCESS "Proces sistem inactiv" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_FILE_NEW "Pornește un nou program" + ID_OPTIONS_ALWAYSONTOP "Gestionarul rămâne deasupra celorlaltor ferestre până când e minimizat." + ID_OPTIONS_MINIMIZEONUSE + "Gestionarul se minimizează automat când se face un salt la o aplicație." + ID_OPTIONS_HIDEWHENMINIMIZED "Ascunde permanent Gestionarul când acesta se minimizează." + ID_VIEW_REFRESH "Forțează Gestionarul să se actualizeze acum, indiferent de setările de viteză." + ID_VIEW_LARGE "Afișează aplicații folosind pictograme mari" + ID_VIEW_SMALL "Afișează aplicații folosind pictograme mici" + ID_VIEW_DETAILS "Afișează informații despre fiecare aplicație" + ID_VIEW_UPDATESPEED_HIGH "Actualizează fereastra de două ori pe secundă" + ID_VIEW_UPDATESPEED_NORMAL "Actualizează fereastra o dată la două secunde" + ID_VIEW_UPDATESPEED_LOW "Actualizează fereastra o dată la patru secunde" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_VIEW_UPDATESPEED_PAUSED "Nu actualizează automat" + ID_WINDOWS_TILEHORIZONTALLY + "Aranjează ferestrele orizontal pe ecran" + ID_WINDOWS_TILEVERTICALLY "Aranjează ferestrele vertical pe ecran" + ID_WINDOWS_MINIMIZE "Minimizază ferestrele" + ID_WINDOWS_MAXIMIZE "Maximizează ferestrele" + ID_WINDOWS_CASCADE "Aranjează ferestrele astfel încât barele de titlu sunt în cascadă" + ID_WINDOWS_BRINGTOFRONT "Aduce fereastra în prin plan, fără a o activa" + ID_HELP_TOPICS "Afișează topicile de ajutor ale Gestionarului" + ID_HELP_ABOUT "Afișează informații despre program, versiune și drepturi de autor." + ID_FILE_EXIT "Închide Gestionarul de aplicații" + ID_OPTIONS_SHOW16BITTASKS + "Afișează aplicațiile pe 16 biți care rulează sub mediul ntvdm.exe" + ID_VIEW_SELECTCOLUMNS "Vă permite să selectați coloanele ce vor fi afișate în fila Procese" + ID_VIEW_SHOWKERNELTIMES "Afișează timpi kernel în graficele de performanță" + ID_VIEW_CPUHISTORY_ONEGRAPHALL + "Folosește un singur grafic pentru toate procesoarele" + ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "Folosește câte un grafic pentru fiecare procesor" + ID_APPLICATION_PAGE_SWITCHTO + "Aduce o fereastra unei aplicații în prin plan, activând-o." +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_ENDTASK "Anunță aplicația să să se închidă." + ID_GOTOPROCESS "Arată procesul aplicației selectate." + ID_RESTORE "Restabilește Gestionarul din starea ascunsă." + ID_PROCESS_PAGE_ENDPROCESS "Elimină procesul din sistem." + ID_PROCESS_PAGE_ENDPROCESSTREE + "Elimină procesul și toate procesele pornite de acesta." + ID_PROCESS_PAGE_DEBUG "Atașează aplicația de deparare de acest proces." + ID_PROCESS_PAGE_SETAFFINITY + "Controlează pe ce procesoare va putea rula acest proces." + ID_PROCESS_PAGE_SETPRIORITY_REALTIME + "Setează prioritatea" + ID_PROCESS_PAGE_SETPRIORITY_HIGH "Setează prioritatea" + ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL + "Setează prioritatea" + ID_PROCESS_PAGE_SETPRIORITY_NORMAL + "Setează prioritatea" + ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL + "Setează prioritatea" + ID_PROCESS_PAGE_SETPRIORITY_LOW "Setează prioritatea" +END + + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TAB_APPS "Aplicații" + IDS_TAB_PROCESSES "Procese" + IDS_TAB_PERFORMANCE "Performanță" + IDS_TAB_TASK "Aplicație" + IDS_TAB_STATUS "Stare" + IDS_TAB_IMAGENAME "Nume imagine" + IDS_TAB_PID "PID" + IDS_TAB_USERNAME "Nume utilizator" + IDS_TAB_SESSIONID "ID sesiune" + IDS_TAB_CPU "CPU" + IDS_TAB_CPUTIME "Timp CPU" + IDS_TAB_MEMUSAGE "Utilizare memorie" + IDS_TAB_PEAKMEMUSAGE "Vârf utilizare memorie" + IDS_TAB_MEMDELTA "Delta memorie" + IDS_TAB_PAGEFAULT "FP" + IDS_TAB_PFDELTA "Delta FP" + IDS_TAB_VMSIZE "Mărime VM" + IDS_TAB_PAGEDPOOL "Rezervă paginată" + IDS_TAB_NPPOOL "Rezervă nepaginată" + IDS_TAB_BASEPRI "Prioritate" + IDS_TAB_HANDLES "Identificatoare" + IDS_TAB_THREADS "Subprocese" + IDS_TAB_USERPBJECTS "Obiecte utilizator" + IDS_TAB_GDIOBJECTS "Obiecte GDI" + IDS_TAB_IOREADS "Citiri I/O" + IDS_TAB_IOWRITES "Scrieri I/O" + IDS_TAB_IOOTHER "Alte I/O" + IDS_TAB_IOREADBYTES "Octeți I/O citiți" + IDS_TAB_IOWRITESBYTES "Octeți I/O scriși" + IDS_TAB_IOOTHERBYTES "Octeți I/O (altele)" + IDS_MENU_SELECTCOLUMNS "&Alegere coloane..." + IDS_MENU_16BITTASK "&Afișare aplicații 16-biți" + IDS_MENU_WINDOWS "&Ferestre" + IDS_MENU_LARGEICONS "Pictograme mari" + IDS_MENU_SMALLICONS "Pictograme mici" + IDS_MENU_DETAILS "&Detalii" + IDS_MENU_ONEGRAPHALLCPUS "&Un grafic pt toate procesoarele" + IDS_MENU_ONEGRAPHPERCPU "Un grafic pe procesor" + IDS_MENU_CPUHISTORY "&Istoric CPU" + IDS_MENU_SHOWKERNELTIMES "&Afișare timpi kernel" + IDS_CREATENEWTASK "Creare activitate nouă" + IDS_CREATENEWTASK_DESC "Scrieți numele unui program, dosar, document sau pagină de web iar Gestionarul o va deschide imediat." + IDS_MSG_ACCESSPROCESSAFF "Nu se poate seta sau accesa afinitatea." + IDS_MSG_PROCESSONEPRO "Procesul trebuie să aibă o afinitate de cel puțin un procesor." + IDS_MSG_INVALIDOPTION "Opțiune invalidă" + IDS_MSG_UNABLEDEBUGPROCESS "Nu se poate depana procesul" + IDS_MSG_WARNINGDEBUG "AVERTISMENT: Procesul de depanare poate duce la pierderi de date.\nSigur vreți să atașați aplicația de depanare?" + IDS_MSG_TASKMGRWARNING "Avertisemnt Gestionar de Activități" + IDS_MSG_WARNINGTERMINATING "AVERTISMENT: Oprirea forțată a unui proces poate duce la pierderi\nde date sau la instabilitatea sistemului. \nProcesului nu îi va fi permis să își salveze starea\nsau datele înainte să fie oprit. Sigur vreți să \ndistrugeți procesul?" + IDS_MSG_UNABLETERMINATEPRO "Nu se poate opri procesul" + IDS_MSG_UNABLECHANGEPRIORITY "Nu se poate schimba prioritatea" + IDS_MSG_WARNINGCHANGEPRIORITY "AVERTISMENT: Schimbarea priorității poate duce la efecte precum\ninstabilitatea sistemului. Sigur\n vreți să schimbați prioritatea procesului?" + IDS_MSG_TRAYICONCPUUSAGE "Utilizare procesor: %d%%" + IDS_STATUS_MEMUSAGE "Utilizare memorie: %dK / %dK" + IDS_STATUS_CPUUSAGE "Utilizare CPU: %3d%%" + IDS_STATUS_PROCESSES "Procese: %d" + IDS_Not_Responding "Nu Răspunde" + IDS_Running "Rulează" +END + - +#pragma code_page(1252) +#endif // Romanian resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --cc base/services/eventlog/eventsource.c index 00000000000,61826668c38..61826668c38 mode 000000,100644..100644 --- a/base/services/eventlog/eventsource.c +++ b/base/services/eventlog/eventsource.c diff --cc base/setup/vmwinst/lang/sv-SE.rc index 00000000000,a2aba4ddc6b..a2aba4ddc6b mode 000000,100644..100644 --- a/base/setup/vmwinst/lang/sv-SE.rc +++ b/base/setup/vmwinst/lang/sv-SE.rc diff --cc base/setup/vmwinst/rsrc.rc index db0396060d0,00000000000..317d16b9565 mode 100644,000000..100644 --- a/base/setup/vmwinst/rsrc.rc +++ b/base/setup/vmwinst/rsrc.rc @@@ -1,32 -1,0 +1,36 @@@ +#include +#include "vmwinst.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +/* Bitmaps */ +IDB_WATERMARK BITMAP "resources/watermark.bmp" +IDB_HEADER BITMAP "resources/header.bmp" + +/* + * Everything specific to any language goes in one of the specific + * files. Note that you can and may override resources which also have + * a neutral version. This is to get localized bitmaps for example. + */ +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/da-DK.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/hu-HU.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/lt-LT.rc" +#include "lang/no-NO.rc" ++#include "lang/sv-SE.rc" ++#include "lang/zh-CN.rc" ++ ++// UTF-8 ++#pragma code_page(65001) +#include "lang/pl-PL.rc" +#include "lang/ru-RU.rc" +#include "lang/uk-UA.rc" - #include "lang/zh-CN.rc" diff --cc base/setup/welcome/res/title.bmp index 335383f3f1d,335383f3f1d..335383f3f1d mode 100755,100644..100644 Binary files differ diff --cc base/setup/welcome/resource.h index 6a96d2bcb80,6a96d2bcb80..6a96d2bcb80 mode 100755,100644..100644 --- a/base/setup/welcome/resource.h +++ b/base/setup/welcome/resource.h diff --cc base/setup/welcome/rsrc.rc index 89d1c126613,00000000000..946da11a6d6 mode 100644,000000..100644 --- a/base/setup/welcome/rsrc.rc +++ b/base/setup/welcome/rsrc.rc @@@ -1,65 -1,0 +1,68 @@@ +#include +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +/* Icons */ +IDI_MAIN ICON "res/welcome.ico" + +/* Bitmaps */ +IDB_TITLEBITMAP BITMAP DISCARDABLE "res/title.bmp" +//IDB_DEFAULTTOPICBITMAP BITMAP DISCARDABLE "res/default.bmp" + +//IDB_TOPICBITMAP0 BITMAP DISCARDABLE "res/topic0.bmp" +//IDB_TOPICBITMAP1 BITMAP DISCARDABLE "res/topic1.bmp" +//IDB_TOPICBITMAP2 BITMAP DISCARDABLE "res/topic2.bmp" +//IDB_TOPICBITMAP3 BITMAP DISCARDABLE "res/topic3.bmp" +//IDB_TOPICBITMAP4 BITMAP DISCARDABLE "res/topic4.bmp" +//IDB_TOPICBITMAP5 BITMAP DISCARDABLE "res/topic5.bmp" +//IDB_TOPICBITMAP6 BITMAP DISCARDABLE "res/topic6.bmp" +//IDB_TOPICBITMAP7 BITMAP DISCARDABLE "res/topic7.bmp" +//IDB_TOPICBITMAP8 BITMAP DISCARDABLE "res/topic8.bmp" +//IDB_TOPICBITMAP9 BITMAP DISCARDABLE "res/topic9.bmp" + + +/* Topic actions */ +STRINGTABLE DISCARDABLE +BEGIN + IDS_TOPICACTION0 "reactos.exe" + IDS_TOPICACTION1 "explorer.exe" + IDS_TOPICACTION2 "" /* this quits the app */ +// IDS_TOPICACTION3 "..." +// IDS_TOPICACTION4 "..." +// IDS_TOPICACTION5 "..." +// IDS_TOPICACTION6 "..." +// IDS_TOPICACTION7 "..." +// IDS_TOPICACTION8 "..." +// IDS_TOPICACTION9 "..." +END + + +/* Language-specific resources */ +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/da-DK.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/et-EE.rc" +#include "lang/fr-FR.rc" +#include "lang/hu-HU.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/lt-LT.rc" +#include "lang/no-NO.rc" +#include "lang/nl-NL.rc" - #include "lang/pl-PL.rc" +#include "lang/pt-BR.rc" +#include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" +#include "lang/th-TH.rc" ++#include "lang/zh-CN.rc" ++ ++// UTF-8 ++#pragma code_page(65001) ++#include "lang/pl-PL.rc" +#include "lang/ru-RU.rc" +#include "lang/uk-UA.rc" - #include "lang/zh-CN.rc" diff --cc base/setup/welcome/welcome.c index 001ec391360,001ec391360..001ec391360 mode 100755,100644..100644 --- a/base/setup/welcome/welcome.c +++ b/base/setup/welcome/welcome.c diff --cc base/setup/welcome/welcome.rc index 648c4d4c40a,648c4d4c40a..648c4d4c40a mode 100755,100644..100644 --- a/base/setup/welcome/welcome.rc +++ b/base/setup/welcome/welcome.rc diff --cc base/shell/cmd/lang/sv-SE.rc index 00000000000,e2630f21ce9..e2630f21ce9 mode 000000,100644..100644 --- a/base/shell/cmd/lang/sv-SE.rc +++ b/base/shell/cmd/lang/sv-SE.rc diff --cc base/system/format/format.c index 8c356e63e5d,8c356e63e5d..8c356e63e5d mode 100755,100644..100644 --- a/base/system/format/format.c +++ b/base/system/format/format.c diff --cc base/system/logonui/NT5design.c index 00000000000,6c4ff372672..6c4ff372672 mode 000000,100644..100644 --- a/base/system/logonui/NT5design.c +++ b/base/system/logonui/NT5design.c diff --cc base/system/logonui/NT6design.c index 00000000000,32782788cd6..32782788cd6 mode 000000,100644..100644 --- a/base/system/logonui/NT6design.c +++ b/base/system/logonui/NT6design.c diff --cc base/system/logonui/lang/en-US.rc index 00000000000,77cc40892c6..77cc40892c6 mode 000000,100644..100644 --- a/base/system/logonui/lang/en-US.rc +++ b/base/system/logonui/lang/en-US.rc diff --cc base/system/logonui/logonui.c index 00000000000,1f5cb1e9f91..1f5cb1e9f91 mode 000000,100644..100644 --- a/base/system/logonui/logonui.c +++ b/base/system/logonui/logonui.c diff --cc base/system/logonui/logonui.h index 00000000000,b0e36bfabd7..b0e36bfabd7 mode 000000,100644..100644 --- a/base/system/logonui/logonui.h +++ b/base/system/logonui/logonui.h diff --cc base/system/logonui/logonui.rbuild index 00000000000,d314ddbe883..d314ddbe883 mode 000000,100644..100644 --- a/base/system/logonui/logonui.rbuild +++ b/base/system/logonui/logonui.rbuild diff --cc base/system/logonui/logonui.rc index 00000000000,4b2ca7497cb..4b2ca7497cb mode 000000,100644..100644 --- a/base/system/logonui/logonui.rc +++ b/base/system/logonui/logonui.rc diff --cc base/system/logonui/res/100.bmp index 00000000000,a690d4c3206..a690d4c3206 mode 000000,100644..100644 Binary files differ diff --cc base/system/logonui/res/123.bmp index 00000000000,eb967d022df..eb967d022df mode 000000,100644..100644 Binary files differ diff --cc base/system/logonui/res/125.bmp index 00000000000,ae6ea10cb6a..ae6ea10cb6a mode 000000,100644..100644 Binary files differ diff --cc base/system/logonui/res/126.bmp index 00000000000,05e6ce7a8fc..05e6ce7a8fc mode 000000,100644..100644 Binary files differ diff --cc base/system/logonui/res/unknown.bmp index 00000000000,67410c64078..67410c64078 mode 000000,100644..100644 Binary files differ diff --cc base/system/logonui/res/unknown2.bmp index 00000000000,d73e722124b..d73e722124b mode 000000,100644..100644 Binary files differ diff --cc base/system/logonui/resource.h index 00000000000,da8c4e76104..da8c4e76104 mode 000000,100644..100644 --- a/base/system/logonui/resource.h +++ b/base/system/logonui/resource.h diff --cc base/system/logonui/rsrc.rc index 00000000000,f2521e79f63..f2521e79f63 mode 000000,100644..100644 --- a/base/system/logonui/rsrc.rc +++ b/base/system/logonui/rsrc.rc diff --cc base/system/runonce/lang/fr-FR.rc index 00000000000,8c5d3bb443e..8c5d3bb443e mode 000000,100644..100644 --- a/base/system/runonce/lang/fr-FR.rc +++ b/base/system/runonce/lang/fr-FR.rc diff --cc base/system/runonce/lang/pl-PL.rc index 00000000000,61e31eadead..61e31eadead mode 000000,100644..100644 --- a/base/system/runonce/lang/pl-PL.rc +++ b/base/system/runonce/lang/pl-PL.rc diff --cc base/system/subst/CMakeLists.txt index 00000000000,6b9c5828f74..6b9c5828f74 mode 000000,100644..100644 --- a/base/system/subst/CMakeLists.txt +++ b/base/system/subst/CMakeLists.txt diff --cc base/system/subst/lang/en-US.rc index 00000000000,9f9536165a5..9f9536165a5 mode 000000,100644..100644 --- a/base/system/subst/lang/en-US.rc +++ b/base/system/subst/lang/en-US.rc diff --cc base/system/subst/lang/es-ES.rc index 00000000000,7e2165f9480..7e2165f9480 mode 000000,100644..100644 --- a/base/system/subst/lang/es-ES.rc +++ b/base/system/subst/lang/es-ES.rc diff --cc base/system/subst/lang/it-IT.rc index 00000000000,cb3c6aed004..cb3c6aed004 mode 000000,100644..100644 --- a/base/system/subst/lang/it-IT.rc +++ b/base/system/subst/lang/it-IT.rc diff --cc base/system/subst/lang/pl-PL.rc index 00000000000,aebdb4bf784..aebdb4bf784 mode 000000,100644..100644 --- a/base/system/subst/lang/pl-PL.rc +++ b/base/system/subst/lang/pl-PL.rc diff --cc base/system/subst/lang/uk-UA.rc index 00000000000,ec4f18afa2f..ec4f18afa2f mode 000000,100644..100644 --- a/base/system/subst/lang/uk-UA.rc +++ b/base/system/subst/lang/uk-UA.rc diff --cc base/system/subst/resource.h index 00000000000,9baa5b31a61..9baa5b31a61 mode 000000,100644..100644 --- a/base/system/subst/resource.h +++ b/base/system/subst/resource.h diff --cc base/system/subst/rsrc.rc index 00000000000,46064e12d0e..46064e12d0e mode 000000,100644..100644 --- a/base/system/subst/rsrc.rc +++ b/base/system/subst/rsrc.rc diff --cc base/system/subst/subst.c index 00000000000,3bfad0cae3e..3bfad0cae3e mode 000000,100644..100644 --- a/base/system/subst/subst.c +++ b/base/system/subst/subst.c diff --cc base/system/subst/subst.rbuild index 00000000000,8b77abd857d..8b77abd857d mode 000000,100644..100644 --- a/base/system/subst/subst.rbuild +++ b/base/system/subst/subst.rbuild diff --cc base/system/subst/subst.rc index 00000000000,db0df66fd9d..db0df66fd9d mode 000000,100644..100644 --- a/base/system/subst/subst.rc +++ b/base/system/subst/subst.rc diff --cc base/system/winlogon/rsrc.rc index fdfc56db8ab,00000000000..057a75f7b3b mode 100644,000000..100644 --- a/base/system/winlogon/rsrc.rc +++ b/base/system/winlogon/rsrc.rc @@@ -1,28 -1,0 +1,31 @@@ +#include +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +/* IDI_WINLOGON ICON "resources/winlogon.ico" */ + +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/en-US.rc" +#include "lang/el-GR.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/hu-HU.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/lt-LT.rc" +#include "lang/no-NO.rc" +#include "lang/nl-NL.rc" ++#include "lang/sv-SE.rc" ++#include "lang/sk-SK.rc" ++#include "lang/zh-CN.rc" ++ ++// UTF-8 ++#pragma code_page(65001) +#include "lang/pl-PL.rc" +#include "lang/ro-RO.rc" +#include "lang/ru-RU.rc" - #include "lang/sv-SE.rc" - #include "lang/sk-SK.rc" +#include "lang/uk-UA.rc" - #include "lang/zh-CN.rc" diff --cc boot/armllb/hw/keyboard.c index 06d2c6706dd,06d2c6706dd..06d2c6706dd mode 100755,100644..100644 --- a/boot/armllb/hw/keyboard.c +++ b/boot/armllb/hw/keyboard.c diff --cc boot/armllb/hw/matrix.c index c1275c2e719,c1275c2e719..c1275c2e719 mode 100755,100644..100644 --- a/boot/armllb/hw/matrix.c +++ b/boot/armllb/hw/matrix.c diff --cc boot/armllb/hw/omap3-beagle/hwinfo.c index 8a7d5b54187,8a7d5b54187..8a7d5b54187 mode 100755,100644..100644 --- a/boot/armllb/hw/omap3-beagle/hwinfo.c +++ b/boot/armllb/hw/omap3-beagle/hwinfo.c diff --cc boot/armllb/hw/omap3-beagle/hwinit.c index 4c7c0c9c66b,4c7c0c9c66b..4c7c0c9c66b mode 100755,100644..100644 --- a/boot/armllb/hw/omap3-beagle/hwinit.c +++ b/boot/armllb/hw/omap3-beagle/hwinit.c diff --cc boot/armllb/hw/omap3-beagle/hwuart.c index 7f8669cf05a,7f8669cf05a..7f8669cf05a mode 100755,100644..100644 --- a/boot/armllb/hw/omap3-beagle/hwuart.c +++ b/boot/armllb/hw/omap3-beagle/hwuart.c diff --cc boot/armllb/hw/omap3-zoom2/hwinfo.c index 3fd7edcbaac,3fd7edcbaac..3fd7edcbaac mode 100755,100644..100644 --- a/boot/armllb/hw/omap3-zoom2/hwinfo.c +++ b/boot/armllb/hw/omap3-zoom2/hwinfo.c diff --cc boot/armllb/hw/omap3-zoom2/hwinit.c index 37749a68879,37749a68879..37749a68879 mode 100755,100644..100644 --- a/boot/armllb/hw/omap3-zoom2/hwinit.c +++ b/boot/armllb/hw/omap3-zoom2/hwinit.c diff --cc boot/armllb/hw/omap3-zoom2/hwlcd.c index 4b7dae217aa,4b7dae217aa..4b7dae217aa mode 100755,100644..100644 --- a/boot/armllb/hw/omap3-zoom2/hwlcd.c +++ b/boot/armllb/hw/omap3-zoom2/hwlcd.c diff --cc boot/armllb/hw/omap3-zoom2/hwsynkp.c index 39ccdcda4a6,39ccdcda4a6..39ccdcda4a6 mode 100755,100644..100644 --- a/boot/armllb/hw/omap3-zoom2/hwsynkp.c +++ b/boot/armllb/hw/omap3-zoom2/hwsynkp.c diff --cc boot/armllb/hw/omap3-zoom2/hwtwl40x.c index faca51789ad,faca51789ad..faca51789ad mode 100755,100644..100644 --- a/boot/armllb/hw/omap3-zoom2/hwtwl40x.c +++ b/boot/armllb/hw/omap3-zoom2/hwtwl40x.c diff --cc boot/armllb/hw/omap3-zoom2/hwuart.c index 52143dd1f4e,52143dd1f4e..52143dd1f4e mode 100755,100644..100644 --- a/boot/armllb/hw/omap3-zoom2/hwuart.c +++ b/boot/armllb/hw/omap3-zoom2/hwuart.c diff --cc boot/armllb/hw/serial.c index 7bb09cf744d,7bb09cf744d..7bb09cf744d mode 100755,100644..100644 --- a/boot/armllb/hw/serial.c +++ b/boot/armllb/hw/serial.c diff --cc boot/armllb/hw/time.c index ed78ea4607b,ed78ea4607b..ed78ea4607b mode 100755,100644..100644 --- a/boot/armllb/hw/time.c +++ b/boot/armllb/hw/time.c diff --cc boot/armllb/hw/versatile/hwclcd.c index 3131880338f,3131880338f..3131880338f mode 100755,100644..100644 --- a/boot/armllb/hw/versatile/hwclcd.c +++ b/boot/armllb/hw/versatile/hwclcd.c diff --cc boot/armllb/hw/versatile/hwinfo.c index c1dd350f884,c1dd350f884..c1dd350f884 mode 100755,100644..100644 --- a/boot/armllb/hw/versatile/hwinfo.c +++ b/boot/armllb/hw/versatile/hwinfo.c diff --cc boot/armllb/hw/versatile/hwinit.c index 20e38512dce,20e38512dce..20e38512dce mode 100755,100644..100644 --- a/boot/armllb/hw/versatile/hwinit.c +++ b/boot/armllb/hw/versatile/hwinit.c diff --cc boot/armllb/hw/versatile/hwkmi.c index 8e08023f551,8e08023f551..8e08023f551 mode 100755,100644..100644 --- a/boot/armllb/hw/versatile/hwkmi.c +++ b/boot/armllb/hw/versatile/hwkmi.c diff --cc boot/armllb/hw/versatile/hwuart.c index a3ae386957c,a3ae386957c..a3ae386957c mode 100755,100644..100644 --- a/boot/armllb/hw/versatile/hwuart.c +++ b/boot/armllb/hw/versatile/hwuart.c diff --cc boot/armllb/inc/envir.h index f3b52fb47f4,f3b52fb47f4..f3b52fb47f4 mode 100755,100644..100644 --- a/boot/armllb/inc/envir.h +++ b/boot/armllb/inc/envir.h diff --cc boot/armllb/inc/fw.h index 7bc86dd9b71,7bc86dd9b71..7bc86dd9b71 mode 100755,100644..100644 --- a/boot/armllb/inc/fw.h +++ b/boot/armllb/inc/fw.h diff --cc boot/armllb/inc/hw.h index 53eb6da1709,53eb6da1709..53eb6da1709 mode 100755,100644..100644 --- a/boot/armllb/inc/hw.h +++ b/boot/armllb/inc/hw.h diff --cc boot/armllb/inc/keyboard.h index 29d61513e37,29d61513e37..29d61513e37 mode 100755,100644..100644 --- a/boot/armllb/inc/keyboard.h +++ b/boot/armllb/inc/keyboard.h diff --cc boot/armllb/inc/omap3.h index f557fff6d98,f557fff6d98..f557fff6d98 mode 100755,100644..100644 --- a/boot/armllb/inc/omap3.h +++ b/boot/armllb/inc/omap3.h diff --cc boot/armllb/inc/precomp.h index a3f65e87dea,a3f65e87dea..a3f65e87dea mode 100755,100644..100644 --- a/boot/armllb/inc/precomp.h +++ b/boot/armllb/inc/precomp.h diff --cc boot/armllb/inc/serial.h index 317cfe32a45,317cfe32a45..317cfe32a45 mode 100755,100644..100644 --- a/boot/armllb/inc/serial.h +++ b/boot/armllb/inc/serial.h diff --cc boot/armllb/inc/versa.h index fae0835a82f,fae0835a82f..fae0835a82f mode 100755,100644..100644 --- a/boot/armllb/inc/versa.h +++ b/boot/armllb/inc/versa.h diff --cc boot/armllb/inc/video.h index c38ce4278f0,c38ce4278f0..c38ce4278f0 mode 100755,100644..100644 --- a/boot/armllb/inc/video.h +++ b/boot/armllb/inc/video.h diff --cc boot/armllb/main.c index 83c562252d4,83c562252d4..83c562252d4 mode 100755,100644..100644 --- a/boot/armllb/main.c +++ b/boot/armllb/main.c diff --cc boot/armllb/os/loader.c index 05689d93c77,05689d93c77..05689d93c77 mode 100755,100644..100644 --- a/boot/armllb/os/loader.c +++ b/boot/armllb/os/loader.c diff --cc boot/bootdata/CMakeLists.txt index 00000000000,85757698691..85757698691 mode 000000,100644..100644 --- a/boot/bootdata/CMakeLists.txt +++ b/boot/bootdata/CMakeLists.txt diff --cc boot/bootdata/autorun.inf index ecb42680c92,ecb42680c92..ecb42680c92 mode 100755,100644..100644 --- a/boot/bootdata/autorun.inf +++ b/boot/bootdata/autorun.inf diff --cc boot/bootdata/bootcd/unattend.inf index 00000000000,d75a3258789..d75a3258789 mode 000000,100644..100644 --- a/boot/bootdata/bootcd/unattend.inf +++ b/boot/bootdata/bootcd/unattend.inf diff --cc boot/bootdata/hivedef_i386.inf index aeb59c43efb,8e7b8329673..8e7b8329673 Binary files differ diff --cc boot/bootdata/hivesft_i386.inf index b04af498659,95a72dc2d8f..95a72dc2d8f Binary files differ diff --cc boot/bootdata/icon.ico index 1be85f581ff,1be85f581ff..1be85f581ff mode 100755,100644..100644 Binary files differ diff --cc boot/bootdata/packages/CMakeLists.txt index 00000000000,8380f9b5616..8380f9b5616 mode 000000,100644..100644 --- a/boot/bootdata/packages/CMakeLists.txt +++ b/boot/bootdata/packages/CMakeLists.txt diff --cc boot/freeldr/bootsect/dosmbr.S index 00000000000,49fce6338d8..49fce6338d8 mode 000000,100644..100644 --- a/boot/freeldr/bootsect/dosmbr.S +++ b/boot/freeldr/bootsect/dosmbr.S diff --cc boot/freeldr/bootsect/fat.S index 00000000000,e9eb2ee8982..e9eb2ee8982 mode 000000,100644..100644 --- a/boot/freeldr/bootsect/fat.S +++ b/boot/freeldr/bootsect/fat.S diff --cc boot/freeldr/bootsect/fat32.S index 00000000000,96ff1880564..96ff1880564 mode 000000,100644..100644 --- a/boot/freeldr/bootsect/fat32.S +++ b/boot/freeldr/bootsect/fat32.S diff --cc boot/freeldr/bootsect/isoboot.S index 00000000000,7feb495c179..7feb495c179 mode 000000,100644..100644 --- a/boot/freeldr/bootsect/isoboot.S +++ b/boot/freeldr/bootsect/isoboot.S diff --cc boot/freeldr/bootsect/isobtrt.S index 00000000000,03f761251c3..03f761251c3 mode 000000,100644..100644 --- a/boot/freeldr/bootsect/isobtrt.S +++ b/boot/freeldr/bootsect/isobtrt.S diff --cc boot/freeldr/freeldr/arch/amd64/entry.S index 00000000000,242275bb387..242275bb387 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/amd64/entry.S +++ b/boot/freeldr/freeldr/arch/amd64/entry.S diff --cc boot/freeldr/freeldr/arch/amd64/stubs.S index 00000000000,3f2e0e4a462..3f2e0e4a462 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/amd64/stubs.S +++ b/boot/freeldr/freeldr/arch/amd64/stubs.S diff --cc boot/freeldr/freeldr/arch/i386/entry.S index 00000000000,c117aa07c0e..c117aa07c0e mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/i386/entry.S +++ b/boot/freeldr/freeldr/arch/i386/entry.S diff --cc boot/freeldr/freeldr/arch/i386/i386idt.c index 00000000000,a4dd2e8b221..a4dd2e8b221 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/i386/i386idt.c +++ b/boot/freeldr/freeldr/arch/i386/i386idt.c diff --cc boot/freeldr/freeldr/arch/i386/i386pnp.cmake.S index 00000000000,1721d3ef0a5..1721d3ef0a5 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/i386/i386pnp.cmake.S +++ b/boot/freeldr/freeldr/arch/i386/i386pnp.cmake.S diff --cc boot/freeldr/freeldr/arch/i386/i386pxe.S index 00000000000,72f03a3bcca..72f03a3bcca mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/i386/i386pxe.S +++ b/boot/freeldr/freeldr/arch/i386/i386pxe.S diff --cc boot/freeldr/freeldr/arch/i386/linux.cmake.S index 00000000000,e605aea301b..e605aea301b mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/i386/linux.cmake.S +++ b/boot/freeldr/freeldr/arch/i386/linux.cmake.S diff --cc boot/freeldr/freeldr/arch/i386/multiboot.S index 00000000000,5c1e7241dd1..5c1e7241dd1 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/i386/multiboot.S +++ b/boot/freeldr/freeldr/arch/i386/multiboot.S diff --cc boot/freeldr/freeldr/arch/realmode/amd64.S index 00000000000,1958a5411b3..1958a5411b3 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/realmode/amd64.S +++ b/boot/freeldr/freeldr/arch/realmode/amd64.S diff --cc boot/freeldr/freeldr/arch/realmode/fathelp.inc index 00000000000,1825fbe96a6..1825fbe96a6 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/realmode/fathelp.inc +++ b/boot/freeldr/freeldr/arch/realmode/fathelp.inc diff --cc boot/freeldr/freeldr/arch/realmode/helpers.inc index 00000000000,dd1fd492748..dd1fd492748 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/realmode/helpers.inc +++ b/boot/freeldr/freeldr/arch/realmode/helpers.inc diff --cc boot/freeldr/freeldr/arch/realmode/i386.S index 00000000000,12c6afc84ee..12c6afc84ee mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/realmode/i386.S +++ b/boot/freeldr/freeldr/arch/realmode/i386.S diff --cc boot/freeldr/freeldr/arch/realmode/int386.inc index 00000000000,1fe18fb6062..1fe18fb6062 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/realmode/int386.inc +++ b/boot/freeldr/freeldr/arch/realmode/int386.inc diff --cc boot/freeldr/freeldr/arch/realmode/linux.inc index 00000000000,c8fb0e9a4a8..c8fb0e9a4a8 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/realmode/linux.inc +++ b/boot/freeldr/freeldr/arch/realmode/linux.inc diff --cc boot/freeldr/freeldr/arch/realmode/pnp.inc index 00000000000,19d8f30d073..19d8f30d073 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/realmode/pnp.inc +++ b/boot/freeldr/freeldr/arch/realmode/pnp.inc diff --cc boot/freeldr/freeldr/arch/realmode/pxe.inc index 00000000000,335604857e5..335604857e5 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/arch/realmode/pxe.inc +++ b/boot/freeldr/freeldr/arch/realmode/pxe.inc diff --cc boot/freeldr/freeldr/fs/pxe.c index 00000000000,1e7f3b5c6b9..1e7f3b5c6b9 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/fs/pxe.c +++ b/boot/freeldr/freeldr/fs/pxe.c diff --cc boot/freeldr/freeldr/include/arch/pc/pcbios.h index 00000000000,61ff8df5211..61ff8df5211 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/include/arch/pc/pcbios.h +++ b/boot/freeldr/freeldr/include/arch/pc/pcbios.h diff --cc boot/freeldr/freeldr/include/arch/pc/pxe.h index 00000000000,86f4cfe0bf4..86f4cfe0bf4 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/include/arch/pc/pxe.h +++ b/boot/freeldr/freeldr/include/arch/pc/pxe.h diff --cc boot/freeldr/freeldr/include/arch/pc/x86common.h index 00000000000,1e85f214630..1e85f214630 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/include/arch/pc/x86common.h +++ b/boot/freeldr/freeldr/include/arch/pc/x86common.h diff --cc boot/freeldr/freeldr/include/fs/pxe.h index 00000000000,5d2cc2abc42..5d2cc2abc42 mode 000000,100644..100644 --- a/boot/freeldr/freeldr/include/fs/pxe.h +++ b/boot/freeldr/freeldr/include/fs/pxe.h diff --cc cmake/CMakeMacros.cmake index 00000000000,00000000000..ef64eebd6e1 new file mode 100644 --- /dev/null +++ b/cmake/CMakeMacros.cmake @@@ -1,0 -1,0 +1,241 @@@ ++ ++macro(set_cpp) ++ include_directories(BEFORE ${REACTOS_SOURCE_DIR}/include/c++/stlport) ++ set(IS_CPP 1) ++ add_definitions( ++ -DNATIVE_CPP_INCLUDE=${REACTOS_SOURCE_DIR}/include/c++ ++ -DNATIVE_C_INCLUDE=${REACTOS_SOURCE_DIR}/include/crt) ++endmacro() ++ ++macro(add_dependency_node _node) ++ if(GENERATE_DEPENDENCY_GRAPH) ++ get_target_property(_type ${_node} TYPE) ++ if(_type MATCHES SHARED_LIBRARY OR ${_node} MATCHES ntoskrnl) ++ file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " \n") ++ endif() ++ endif() ++endmacro() ++ ++macro(add_dependency_edge _source _target) ++ if(GENERATE_DEPENDENCY_GRAPH) ++ get_target_property(_type ${_source} TYPE) ++ if(_type MATCHES SHARED_LIBRARY) ++ file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " \n") ++ endif() ++ endif() ++endmacro() ++ ++macro(add_dependency_header) ++ file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml "\n\n \n") ++endmacro() ++ ++macro(add_dependency_footer) ++ add_dependency_node(ntdll) ++ file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " \n\n") ++endmacro() ++ ++macro(add_message_headers) ++ foreach(_in_FILE ${ARGN}) ++ get_filename_component(FILE ${_in_FILE} NAME_WE) ++ macro_mc(${FILE}) ++ add_custom_command( ++ OUTPUT ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h ++ COMMAND ${COMMAND_MC} ++ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.mc) ++ set_source_files_properties( ++ ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc ++ PROPERTIES GENERATED TRUE) ++ add_custom_target(${FILE} ALL DEPENDS ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc) ++ endforeach() ++endmacro() ++ ++macro(dir_to_num dir var) ++ if(${dir} STREQUAL reactos/system32) ++ set(${var} 1) ++ elseif(${dir} STREQUAL reactos/system32/drivers) ++ set(${var} 2) ++ elseif(${dir} STREQUAL reactos/Fonts) ++ set(${var} 3) ++ elseif(${dir} STREQUAL reactos) ++ set(${var} 4) ++ elseif(${dir} STREQUAL reactos/system32/drivers/etc) ++ set(${var} 5) ++ elseif(${dir} STREQUAL reactos/inf) ++ set(${var} 6) ++ elseif(${dir} STREQUAL reactos/bin) ++ set(${var} 7) ++ elseif(${dir} STREQUAL reactos/media) ++ set(${var} 8) ++ else() ++ message(ERROR "Wrong destination: ${dir}") ++ endif() ++endmacro() ++ ++function(add_cd_file) ++ cmake_parse_arguments(_CD "NO_CAB" "DESTINATION;NAME_ON_CD;TARGET" "FILE;FOR" ${ARGN}) ++ if(NOT (_CD_TARGET OR _CD_FILE)) ++ message(FATAL_ERROR "You must provide a target or a file to install!") ++ endif() ++ ++ if(NOT _CD_DESTINATION) ++ message(FATAL_ERROR "You must provide a destination") ++ elseif(${_CD_DESTINATION} STREQUAL root) ++ set(_CD_DESTINATION "") ++ endif() ++ ++ if(NOT _CD_FOR) ++ message(FATAL_ERROR "You must provide a cd name (or "all" for all of them) to install the file on!") ++ endif() ++ ++ #get file if we need to ++ if(NOT _CD_FILE) ++ get_target_property(_CD_FILE ${_CD_TARGET} LOCATION) ++ endif() ++ ++ #do we add it to all CDs? ++ if(_CD_FOR STREQUAL all) ++ set(_CD_FOR "bootcd;livecd;regtest") ++ endif() ++ ++ #do we add it to bootcd? ++ list(FIND _CD_FOR bootcd __cd) ++ if(NOT __cd EQUAL -1) ++ #whether or not we should put it in reactos.cab or directly on cd ++ if(_CD_NO_CAB) ++ #directly on cd ++ foreach(item ${_CD_FILE}) ++ file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcd.cmake "file(COPY \"${item}\" DESTINATION \"\${CD_DIR}/${_CD_DESTINATION}\")\n") ++ endforeach() ++ if(_CD_NAME_ON_CD) ++ get_filename_component(__file ${_CD_FILE} NAME) ++ #rename it in the cd tree ++ file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcd.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n") ++ endif() ++ if(_CD_TARGET) ++ #manage dependency ++ add_dependencies(bootcd ${_CD_TARGET}) ++ endif() ++ else() ++ #add it in reactos.cab ++ dir_to_num(${_CD_DESTINATION} _num) ++ if(CMAKE_HOST_SYSTEM_NAME MATCHES Windows) ++ file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "${_CD_FILE} ${_num}\n") ++ else() ++ file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "\"${_CD_FILE}\" ${_num}\n") ++ endif() ++ if(_CD_TARGET) ++ #manage dependency ++ add_dependencies(reactos_cab ${_CD_TARGET}) ++ endif() ++ endif() ++ endif() #end bootcd ++ ++ #do we add it to livecd? ++ list(FIND _CD_FOR livecd __cd) ++ if(NOT __cd EQUAL -1) ++ #manage dependency ++ if(_CD_TARGET) ++ add_dependencies(livecd ${_CD_TARGET}) ++ endif() ++ foreach(item ${_CD_FILE}) ++ file(APPEND ${REACTOS_BINARY_DIR}/boot/livecd.cmake "file(COPY \"${item}\" DESTINATION \"\${CD_DIR}/${_CD_DESTINATION}\")\n") ++ endforeach() ++ if(_CD_NAME_ON_CD) ++ get_filename_component(__file ${_CD_FILE} NAME) ++ #rename it in the cd tree ++ file(APPEND ${REACTOS_BINARY_DIR}/boot/livecd.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n") ++ endif() ++ endif() #end livecd ++ ++ #do we add it to regtest? ++ list(FIND _CD_FOR regtest __cd) ++ if(NOT __cd EQUAL -1) ++ #whether or not we should put it in reactos.cab or directly on cd ++ if(_CD_NO_CAB) ++ #directly on cd ++ foreach(item ${_CD_FILE}) ++ file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcdregtest.cmake "file(COPY \"${item}\" DESTINATION \"\${CD_DIR}/${_CD_DESTINATION}\")\n") ++ endforeach() ++ if(_CD_NAME_ON_CD) ++ get_filename_component(__file ${_CD_FILE} NAME) ++ #rename it in the cd tree ++ file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcdregtest.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n") ++ endif() ++ if(_CD_TARGET) ++ #manage dependency ++ add_dependencies(bootcdregtest ${_CD_TARGET}) ++ endif() ++ else() ++ #add it in reactos.cab ++ #dir_to_num(${_CD_DESTINATION} _num) ++ #file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "${_CD_FILE} ${_num}\n") ++ #if(_CD_TARGET) ++ # #manage dependency ++ # add_dependencies(reactos_cab ${_CD_TARGET}) ++ #endif() ++ endif() ++ endif() #end bootcd ++endfunction() ++ ++# Create module_clean targets ++function(add_clean_target target) ++ if(CMAKE_GENERATOR MATCHES "Unix Makefiles" OR CMAKE_GENERATOR MATCHES "MinGW Makefiles") ++ set(CLEAN_COMMAND make clean) ++ elseif(CMAKE_GENERATOR MATCHES "NMake Makefiles") ++ set(CLEAN_COMMAND nmake clean) ++ endif() ++ add_custom_target(${target}_clean ++ COMMAND ${CLEAN_COMMAND} ++ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ++ COMMENT "Cleaning ${target}") ++endfunction() ++ ++if(NOT MSVC_IDE) ++ function(add_library name) ++ _add_library(${name} ${ARGN}) ++ add_clean_target(${name}) ++ endfunction() ++ ++ function(add_executable name) ++ _add_executable(${name} ${ARGN}) ++ add_clean_target(${name}) ++ endfunction() ++endif() ++ ++if(CMAKE_HOST_SYSTEM_NAME MATCHES Windows) ++ macro(to_win_path _cmake_path _native_path) ++ string(REPLACE "/" "\\" ${_native_path} "${_cmake_path}") ++ endmacro() ++ ++ macro(concatenate_files _file1 _file2 _output) ++ to_win_path("${_file1}" _real_file1) ++ to_win_path("${_file2}" _real_file2) ++ to_win_path("${_output}" _real_output) ++ add_custom_command( ++ OUTPUT ${_output} ++ COMMAND cmd.exe /C "copy /Y /B ${_real_file1} + ${_real_file2} ${_real_output} > nul" ++ DEPENDS ${_file1} ++ DEPENDS ${_file2}) ++ endmacro() ++else() ++ macro(concatenate_files _file1 _file2 _output) ++ add_custom_command( ++ OUTPUT ${_output} ++ COMMAND cat ${_file1} ${_file2} > ${_output} ++ DEPENDS ${_file1} ++ DEPENDS ${_file2}) ++ endmacro() ++endif() ++ ++macro(add_importlibs MODULE) ++ add_dependency_node(${MODULE}) ++ foreach(LIB ${ARGN}) ++ if ("${LIB}" MATCHES "msvcrt") ++ add_definitions(-D_DLL -D__USE_CRTIMP) ++ target_link_libraries(${MODULE} msvcrtex) ++ endif() ++ target_link_libraries(${MODULE} ${CMAKE_BINARY_DIR}/importlibs/lib${LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}) ++ add_dependencies(${MODULE} lib${LIB}) ++ add_dependency_edge(${MODULE} ${LIB}) ++ endforeach() ++endmacro() diff --cc cmake/CMakeParseArguments.cmake index 00000000000,7ce4c49ae5b..7ce4c49ae5b mode 000000,100644..100644 --- a/cmake/CMakeParseArguments.cmake +++ b/cmake/CMakeParseArguments.cmake diff --cc cmake/compilerflags.cmake index 00000000000,d6928a19103..d6928a19103 mode 000000,100644..100644 --- a/cmake/compilerflags.cmake +++ b/cmake/compilerflags.cmake diff --cc cmake/config-amd64.cmake index 31b0609b82c,00000000000..31b0609b82c mode 100644,000000..100644 --- a/cmake/config-amd64.cmake +++ b/cmake/config-amd64.cmake diff --cc cmake/config-arm.cmake index 02ae1497e36,00000000000..02ae1497e36 mode 100644,000000..100644 --- a/cmake/config-arm.cmake +++ b/cmake/config-arm.cmake diff --cc cmake/config.cmake index 4b5bd1150b0,00000000000..dbcc85a6a27 mode 100644,000000..100644 --- a/cmake/config.cmake +++ b/cmake/config.cmake @@@ -1,51 -1,0 +1,57 @@@ + +set(SARCH "pc" CACHE STRING +"Sub-architecture to build for. Specify one of: xbox") + +set(OARCH "pentium" CACHE STRING +"Generate instructions for this CPU type. Specify one of: + native, i386, i486, pentium, pentium-mmx, pentiumpro, i686, + pentium2, pentium3, pentium-m, pentium4, prescott, nocona, + core2, k6, k6-2, athlon, athlon-xp, opteron, opteron-sse3, + barcelona, winchip-c6, winchip2, c3, c3-2, geode") + +set(TUNE "i686" CACHE STRING +"Which CPU ReactOS should be optimized for.") + +set(OPTIMIZE "1" CACHE STRING +"What level of optimisation to use. + 0 = off + 1 = Default option, optimize for size (-Os) with some additional options + 2 = -Os + 3 = -O1 + 4 = -O2 + 5 = -O3") + - set(DBG TRUE CACHE BOOL - "Whether to compile for debugging.") - - set(KDBG TRUE CACHE BOOL - "Whether to compile in the integrated kernel debugger.") - +set(GDB FALSE CACHE BOOL +"Whether to compile for debugging with GDB. +If you don't use GDB, don't enable this.") + - set(_WINKD_ FALSE CACHE BOOL ++set(DBG TRUE CACHE BOOL ++"Whether to compile for debugging.") ++ ++if(MSVC) ++ set(KDBG FALSE CACHE BOOL ++"Whether to compile in the integrated kernel debugger.") ++ set(_WINKD_ TRUE CACHE BOOL ++"Whether to compile with the KD protocol.") ++else() ++ set(KDBG TRUE CACHE BOOL ++"Whether to compile in the integrated kernel debugger.") ++ set(_WINKD_ FALSE CACHE BOOL +"Whether to compile with the KD protocol.") ++endif() + +set(_ELF_ FALSE CACHE BOOL +"Whether to compile support for ELF files. +Do not enable unless you know what you're doing.") + +set(NSWPAT FALSE CACHE BOOL +"Whether to compile apps/libs with features covered software patents or not. +If you live in a country where software patents are valid/apply, don't +enable this (except they/you purchased a license from the patent owner). +This settings is disabled (0) by default.") + +set(BUILD_MP TRUE CACHE BOOL +"Whether to compile the multi processor versions for ntoskrnl and hal.") + +set(GENERATE_DEPENDENCY_GRAPH FALSE CACHE BOOL +"Whether to create a graphml dependency of dlls.") diff --cc cmake/msvc.cmake index 558fdf78fc4,00000000000..af42d92d9b1 mode 100644,000000..100644 --- a/cmake/msvc.cmake +++ b/cmake/msvc.cmake @@@ -1,208 -1,0 +1,221 @@@ + +if(${CMAKE_BUILD_TYPE} MATCHES Debug) + # no optimitation +elseif(OPTIMIZE STREQUAL "1") + add_definitions(/O1) +elseif(OPTIMIZE STREQUAL "2") + add_definitions(/O2) +elseif(OPTIMIZE STREQUAL "3") + add_definitions(/Ot /Ox /GS-) +elseif(OPTIMIZE STREQUAL "4") + add_definitions(/Os /Ox /GS-) +elseif(OPTIMIZE STREQUAL "5") + add_definitions(/GF /Gy /Ob2 /Os /Ox /GS-) +endif() + - add_definitions(/X /GR- /GS- /Zl) - add_definitions(-Dinline=__inline -D__STDC__=1) ++if(ARCH MATCHES i386) ++ add_definitions(/DWIN32 /D_WINDOWS) ++endif() ++ ++add_definitions(/Dinline=__inline /D__STDC__=1) ++ ++add_compiler_flags(/X /GR- /GS- /Zl /W3) + +if(${_MACHINE_ARCH_FLAG} MATCHES X86) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO") - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO") ++ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO /NODEFAULTLIB") ++ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO /NODEFAULTLIB") ++ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO /NODEFAULTLIB") +endif() + +if(${ARCH} MATCHES amd64) - add_definitions(-D__x86_64) ++ add_definitions(/D__x86_64) ++ set(SPEC2DEF_ARCH x86_64) ++else() ++ set(SPEC2DEF_ARCH i386) +endif() + - link_directories("${REACTOS_BINARY_DIR}/importlibs" ${REACTOS_BINARY_DIR}/lib/3rdparty/mingw) ++link_directories(${REACTOS_SOURCE_DIR}/importlibs ${REACTOS_BINARY_DIR}/importlibs ${REACTOS_BINARY_DIR}/lib/sdk/crt) ++ ++set(CMAKE_RC_COMPILE_OBJECT " /I${REACTOS_SOURCE_DIR}/include/psdk /I${REACTOS_BINARY_DIR}/include/psdk /I${REACTOS_SOURCE_DIR}/include /I${REACTOS_SOURCE_DIR}/include/reactos /I${REACTOS_BINARY_DIR}/include/reactos /I${REACTOS_SOURCE_DIR}/include/reactos/wine /I${REACTOS_SOURCE_DIR}/include/crt /I${REACTOS_SOURCE_DIR}/include/crt/mingw32 /fo ") ++ ++if(MSVC_IDE) ++ # Asm source files are not supported in VS generators yet. As a result, isn't recognized. ++ # We may temporarily use just the global defines, but this is not a solution as some modules (minihal for example) apply additional definitions to source files, so we get an incorrect build of such targets. ++ get_directory_property(definitions DEFINITIONS) ++ set(CMAKE_ASM_COMPILE_OBJECT ++ " /nologo /X /I${REACTOS_SOURCE_DIR}/include/asm /I${REACTOS_BINARY_DIR}/include/asm ${definitions} /D__ASM__ /D_USE_ML /EP /c > .tmp" ++ " /nologo /Cp /Fo /c /Ta .tmp") ++else() ++ # NMake Makefiles ++ set(CMAKE_ASM_COMPILE_OBJECT ++ " /nologo /X /I${REACTOS_SOURCE_DIR}/include/asm /I${REACTOS_BINARY_DIR}/include/asm /D__ASM__ /D_USE_ML /EP /c > .tmp" ++ " /nologo /Cp /Fo /c /Ta .tmp") ++endif() + +set(CMAKE_RC_CREATE_SHARED_LIBRARY ${CMAKE_C_CREATE_SHARED_LIBRARY}) +set(CMAKE_ASM_CREATE_SHARED_LIBRARY ${CMAKE_C_CREATE_SHARED_LIBRARY}) ++set(CMAKE_ASM_CREATE_STATIC_LIBRARY ${CMAKE_C_CREATE_STATIC_LIBRARY}) + - macro(add_pch _target_name _header_filename _src_list) - get_filename_component(FILE ${_header_filename} NAME) - set(_gch_filename "${_target_name}_${FILE}.gch") - add_custom_command( - OUTPUT ${_gch_filename} - COMMAND echo Ignoring precompiled header - DEPENDS ${_header_filename}) - endmacro() - - macro(add_linkerflag MODULE _flag) - set(NEW_LINKER_FLAGS ${_flag}) - get_target_property(LINKER_FLAGS ${MODULE} LINK_FLAGS) - if(LINKER_FLAGS) - set(NEW_LINKER_FLAGS "${LINKER_FLAGS} ${NEW_LINKER_FLAGS}") - endif() - set_target_properties(${MODULE} PROPERTIES LINK_FLAGS ${NEW_LINKER_FLAGS}) ++macro(add_pch _target_name _FILE) +endmacro() + +macro(set_entrypoint MODULE ENTRYPOINT) + if(${ENTRYPOINT} STREQUAL "0") + add_linkerflag(${MODULE} "/NOENTRY") + else() + add_linkerflag(${MODULE} "/ENTRY:${ENTRYPOINT}") + endif() +endmacro() + +macro(set_subsystem MODULE SUBSYSTEM) + add_linkerflag(${MODULE} "/subsystem:${SUBSYSTEM}") +endmacro() + +macro(set_image_base MODULE IMAGE_BASE) + add_linkerflag(${MODULE} "/BASE:${IMAGE_BASE}") +endmacro() + +macro(set_module_type MODULE TYPE) - add_dependencies(${MODULE} psdk buildno_header) ++ add_dependencies(${MODULE} psdk) + if(${TYPE} MATCHES nativecui) + set_subsystem(${MODULE} native) + set_entrypoint(${MODULE} NtProcessStartup@4) - endif() - if (${TYPE} MATCHES win32gui) ++ elseif (${TYPE} MATCHES win32gui) + set_subsystem(${MODULE} windows) - set_entrypoint(${MODULE} WinMainCRTStartup) + if(IS_UNICODE) - target_link_libraries(${MODULE} mingw_wmain) ++ set_entrypoint(${MODULE} wWinMainCRTStartup) + else() - target_link_libraries(${MODULE} mingw_main) - endif() - target_link_libraries(${MODULE} mingw_common msvcsup) - endif () - if (${TYPE} MATCHES win32cui) ++ set_entrypoint(${MODULE} WinMainCRTStartup) ++ endif(IS_UNICODE) ++ elseif (${TYPE} MATCHES win32cui) + set_subsystem(${MODULE} console) - set_entrypoint(${MODULE} mainCRTStartup) + if(IS_UNICODE) - target_link_libraries(${MODULE} mingw_wmain) ++ set_entrypoint(${MODULE} wmainCRTStartup) + else() - target_link_libraries(${MODULE} mingw_main) - endif() - target_link_libraries(${MODULE} mingw_common msvcsup) - endif () - if(${TYPE} MATCHES win32dll) ++ set_entrypoint(${MODULE} mainCRTStartup) ++ endif(IS_UNICODE) ++ elseif(${TYPE} MATCHES win32dll) + # Need this only because mingw library is broken + set_entrypoint(${MODULE} DllMainCRTStartup@12) + if(DEFINED baseaddress_${MODULE}) + set_image_base(${MODULE} ${baseaddress_${MODULE}}) + else() + message(STATUS "${MODULE} has no base address") + endif() - target_link_libraries(${MODULE} mingw_common mingw_dllmain msvcsup) + add_linkerflag(${MODULE} "/DLL") - endif() - if(${TYPE} MATCHES win32ocx) ++ elseif(${TYPE} MATCHES win32ocx) + set_entrypoint(${MODULE} DllMainCRTStartup@12) + set_target_properties(${MODULE} PROPERTIES SUFFIX ".ocx") - target_link_libraries(${MODULE} mingw_common mingw_dllmain msvcsup) + add_linkerflag(${MODULE} "/DLL") - endif() - if(${TYPE} MATCHES cpl) ++ elseif(${TYPE} MATCHES cpl) + set_entrypoint(${MODULE} DllMainCRTStartup@12) + set_target_properties(${MODULE} PROPERTIES SUFFIX ".cpl") - target_link_libraries(${MODULE} mingw_common mingw_dllmain msvcsup) + add_linkerflag(${MODULE} "/DLL") - endif() - if(${TYPE} MATCHES kernelmodedriver) ++ elseif(${TYPE} MATCHES kernelmodedriver) + set_target_properties(${MODULE} PROPERTIES SUFFIX ".sys") + set_entrypoint(${MODULE} DriverEntry@8) + set_subsystem(${MODULE} native) + set_image_base(${MODULE} 0x00010000) + add_linkerflag(${MODULE} "/DRIVER") + add_dependencies(${MODULE} bugcodes) - target_link_libraries(${MODULE} msvcsup) + endif() +endmacro() + - macro(set_unicode) - add_definitions(-DUNICODE -D_UNICODE) - set(IS_UNICODE 1) - endmacro() - +macro(set_rc_compiler) +# dummy, this workaround is only needed in mingw due to lack of RC support in cmake +endmacro() + +# Thanks MS for creating a stupid linker +macro(add_importlib_target _exports_file) + get_filename_component(_name ${_exports_file} NAME_WE) + get_target_property(_suffix ${_name} SUFFIX) + if(${_suffix} STREQUAL "_suffix-NOTFOUND") + get_target_property(_type ${_name} TYPE) + if(${_type} MATCHES EXECUTABLE) + set(_suffix ".exe") + else() + set(_suffix ".dll") + endif() + endif() + + # Generate the asm stub file and the export def file + add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/importlibs/lib${_name}_stubs.asm ${CMAKE_BINARY_DIR}/importlibs/lib${_name}_exp.def - COMMAND native-spec2def --ms --kill-at -r -n=${_name}${_suffix} -d=${CMAKE_BINARY_DIR}/importlibs/lib${_name}_exp.def -l=${CMAKE_BINARY_DIR}/importlibs/lib${_name}_stubs.asm ${CMAKE_CURRENT_SOURCE_DIR}/${_exports_file} ++ COMMAND native-spec2def --ms --kill-at -a=${SPEC2DEF_ARCH} --implib -n=${_name}${_suffix} -d=${CMAKE_BINARY_DIR}/importlibs/lib${_name}_exp.def -l=${CMAKE_BINARY_DIR}/importlibs/lib${_name}_stubs.asm ${CMAKE_CURRENT_SOURCE_DIR}/${_exports_file} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_exports_file}) + + # Assemble the stub file + add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/importlibs/lib${_name}_stubs.obj + COMMAND ${CMAKE_ASM_COMPILER} /nologo /Cp /Fo${CMAKE_BINARY_DIR}/importlibs/lib${_name}_stubs.obj /c /Ta ${CMAKE_BINARY_DIR}/importlibs/lib${_name}_stubs.asm + DEPENDS "${CMAKE_BINARY_DIR}/importlibs/lib${_name}_stubs.asm") + + # Add neccessary importlibs for redirections + set(_libraries "") + foreach(_lib ${ARGN}) + list(APPEND _libraries "${CMAKE_BINARY_DIR}/importlibs/${_lib}.lib") + list(APPEND _dependencies ${_lib}) + endforeach() + + # Build the importlib + add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/importlibs/lib${_name}.lib - COMMAND LINK /LIB /NOLOGO /MACHINE:X86 /DEF:${CMAKE_BINARY_DIR}/importlibs/lib${_name}_exp.def /OUT:${CMAKE_BINARY_DIR}/importlibs/lib${_name}.lib ${CMAKE_BINARY_DIR}/importlibs/lib${_name}_stubs.obj ${_libraries} ++ COMMAND LINK /LIB /NOLOGO /DEF:${CMAKE_BINARY_DIR}/importlibs/lib${_name}_exp.def /OUT:${CMAKE_BINARY_DIR}/importlibs/lib${_name}.lib ${CMAKE_BINARY_DIR}/importlibs/lib${_name}_stubs.obj ${_libraries} + DEPENDS ${CMAKE_BINARY_DIR}/importlibs/lib${_name}_stubs.obj ${CMAKE_BINARY_DIR}/importlibs/lib${_name}_exp.def) + + # Add the importlib target + add_custom_target( + lib${_name} + DEPENDS ${CMAKE_BINARY_DIR}/importlibs/lib${_name}.lib) + + add_dependencies(lib${_name} asm ${_dependencies}) +endmacro() + - macro(add_importlibs MODULE) - foreach(LIB ${ARGN}) - target_link_libraries(${MODULE} ${CMAKE_BINARY_DIR}/importlibs/lib${LIB}.lib) - add_dependencies(${MODULE} lib${LIB}) - endforeach() ++macro(add_delay_importlibs MODULE) ++ # TODO. For now forward to normal import libs ++ add_importlibs(${MODULE} ${ARGN}) +endmacro() + +macro(spec2def _dllname _spec_file) + get_filename_component(_file ${_spec_file} NAME_WE) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_file}.def ${CMAKE_CURRENT_BINARY_DIR}/${_file}_stubs.c - COMMAND native-spec2def --ms --kill-at -n=${_dllname} -d=${CMAKE_CURRENT_BINARY_DIR}/${_file}.def -s=${CMAKE_CURRENT_BINARY_DIR}/${_file}_stubs.c ${CMAKE_CURRENT_SOURCE_DIR}/${_spec_file} ++ COMMAND native-spec2def --ms --kill-at -a=${SPEC2DEF_ARCH} -n=${_dllname} -d=${CMAKE_CURRENT_BINARY_DIR}/${_file}.def -s=${CMAKE_CURRENT_BINARY_DIR}/${_file}_stubs.c ${CMAKE_CURRENT_SOURCE_DIR}/${_spec_file} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_spec_file}) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${_file}.def ${CMAKE_CURRENT_BINARY_DIR}/${_file}_stubs.c + PROPERTIES GENERATED TRUE) +endmacro() + +macro(macro_mc FILE) + set(COMMAND_MC mc -r ${REACTOS_BINARY_DIR}/include/reactos -h ${REACTOS_BINARY_DIR}/include/reactos ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.mc) +endmacro() + +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/importlibs) + +#pseh workaround +set(PSEH_LIB "pseh") + ++macro(CreateBootSectorTarget2 _target_name _asm_file _binary_file _base_address) ++ ++ set(_object_file ${_binary_file}.obj) ++ set(_temp_file ${_binary_file}.tmp) ++ ++ add_custom_command( ++ OUTPUT ${_temp_file} ++ COMMAND ${CMAKE_C_COMPILER} /nologo /X /I${REACTOS_SOURCE_DIR}/include/asm /I${REACTOS_BINARY_DIR}/include/asm /D__ASM__ /D_USE_ML /EP /c ${_asm_file} > ${_temp_file} ++ DEPENDS ${_asm_file}) ++ ++ add_custom_command( ++ OUTPUT ${_object_file} ++ COMMAND ml /nologo /Cp /Fo${_object_file} /c /Ta ${_temp_file} ++ DEPENDS ${_temp_file}) ++ ++ add_custom_command( ++ OUTPUT ${_binary_file} ++ COMMAND native-obj2bin ${_object_file} ${_binary_file} ${_base_address} ++ DEPENDS ${_object_file}) ++ ++ set_source_files_properties(${_object_file} ${_temp_file} ${_binary_file} PROPERTIES GENERATED TRUE) ++ ++ add_custom_target(${_target_name} ALL DEPENDS ${_binary_file}) ++endmacro() diff --cc configure.cmd index 0ac142052bf,64ba9a52087..64ba9a52087 mode 100644,100755..100644 --- a/configure.cmd +++ b/configure.cmd diff --cc configure.sh index 00000000000,f513358a2a9..f513358a2a9 mode 000000,100755..100755 --- a/configure.sh +++ b/configure.sh diff --cc dll/3rdparty/libpng/docs/libpng-manual.txt index 00000000000,46934084601..46934084601 mode 000000,100644..100644 --- a/dll/3rdparty/libpng/docs/libpng-manual.txt +++ b/dll/3rdparty/libpng/docs/libpng-manual.txt diff --cc dll/cpl/console/lang/fr-FR.rc index 00000000000,3cc34122141..3cc34122141 mode 000000,100644..100644 --- a/dll/cpl/console/lang/fr-FR.rc +++ b/dll/cpl/console/lang/fr-FR.rc diff --cc dll/cpl/desk/rsrc.rc index 54e3dd13247,00000000000..c4d7bf4d1fb mode 100644,000000..100644 --- a/dll/cpl/desk/rsrc.rc +++ b/dll/cpl/desk/rsrc.rc @@@ -1,23 -1,0 +1,26 @@@ +#include +#include "resource.h" + +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/hu-HU.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/nl-NL.rc" +#include "lang/no-NO.rc" ++#include "lang/sk-SK.rc" ++#include "lang/sv-SE.rc" ++#include "lang/zh-CN.rc" ++ ++// UTF-8 ++#pragma code_page(65001) +#include "lang/pl-PL.rc" +#include "lang/ro-RO.rc" +#include "lang/ru-RU.rc" - #include "lang/sk-SK.rc" - #include "lang/sv-SE.rc" +#include "lang/uk-UA.rc" - #include "lang/zh-CN.rc" diff --cc dll/cpl/inetcpl/CMakeLists.txt index 00000000000,df363f2f93d..df363f2f93d mode 000000,100644..100644 --- a/dll/cpl/inetcpl/CMakeLists.txt +++ b/dll/cpl/inetcpl/CMakeLists.txt diff --cc dll/cpl/inetcpl/content.c index 00000000000,8fb1729308e..8fb1729308e mode 000000,100644..100644 --- a/dll/cpl/inetcpl/content.c +++ b/dll/cpl/inetcpl/content.c diff --cc dll/cpl/inetcpl/general.c index 00000000000,1d8f027e042..1d8f027e042 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/general.c +++ b/dll/cpl/inetcpl/general.c diff --cc dll/cpl/inetcpl/inetcpl.c index 00000000000,751eccd468a..751eccd468a mode 000000,100644..100644 --- a/dll/cpl/inetcpl/inetcpl.c +++ b/dll/cpl/inetcpl/inetcpl.c diff --cc dll/cpl/inetcpl/inetcpl.h index 00000000000,bd1e55a5bab..bd1e55a5bab mode 000000,100644..100644 --- a/dll/cpl/inetcpl/inetcpl.h +++ b/dll/cpl/inetcpl/inetcpl.h diff --cc dll/cpl/inetcpl/inetcpl.ico index 00000000000,1eae208a702..1eae208a702 mode 000000,100644..100644 Binary files differ diff --cc dll/cpl/inetcpl/inetcpl.rbuild index 00000000000,f3abf389807..f3abf389807 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/inetcpl.rbuild +++ b/dll/cpl/inetcpl/inetcpl.rbuild diff --cc dll/cpl/inetcpl/inetcpl.rc index 00000000000,48b23738ed5..48b23738ed5 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/inetcpl.rc +++ b/dll/cpl/inetcpl/inetcpl.rc diff --cc dll/cpl/inetcpl/inetcpl.spec index 00000000000,eaf5e4d6e7d..eaf5e4d6e7d mode 000000,100644..100644 --- a/dll/cpl/inetcpl/inetcpl.spec +++ b/dll/cpl/inetcpl/inetcpl.spec diff --cc dll/cpl/inetcpl/inetcpl.svg index 00000000000,7b943b1ea64..7b943b1ea64 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/inetcpl.svg +++ b/dll/cpl/inetcpl/inetcpl.svg diff --cc dll/cpl/inetcpl/lang/He.rc index 00000000000,256ca084125..256ca084125 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/He.rc +++ b/dll/cpl/inetcpl/lang/He.rc diff --cc dll/cpl/inetcpl/lang/Sr.rc index 00000000000,0312d2a2b73..0312d2a2b73 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/Sr.rc +++ b/dll/cpl/inetcpl/lang/Sr.rc diff --cc dll/cpl/inetcpl/lang/de-DE.rc index 00000000000,5d278f140ca..5d278f140ca mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/de-DE.rc +++ b/dll/cpl/inetcpl/lang/de-DE.rc diff --cc dll/cpl/inetcpl/lang/en-US.rc index 00000000000,296864f56eb..296864f56eb mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/en-US.rc +++ b/dll/cpl/inetcpl/lang/en-US.rc diff --cc dll/cpl/inetcpl/lang/fr-FR.rc index 00000000000,6c55754b917..6c55754b917 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/fr-FR.rc +++ b/dll/cpl/inetcpl/lang/fr-FR.rc diff --cc dll/cpl/inetcpl/lang/it-IT.rc index 00000000000,566450c9eaa..566450c9eaa mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/it-IT.rc +++ b/dll/cpl/inetcpl/lang/it-IT.rc diff --cc dll/cpl/inetcpl/lang/ja-JP.rc index 00000000000,eb17a176748..eb17a176748 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/ja-JP.rc +++ b/dll/cpl/inetcpl/lang/ja-JP.rc diff --cc dll/cpl/inetcpl/lang/ko-KR.rc index 00000000000,401e227071b..401e227071b mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/ko-KR.rc +++ b/dll/cpl/inetcpl/lang/ko-KR.rc diff --cc dll/cpl/inetcpl/lang/lt-LT.rc index 00000000000,47d0fe21ae5..47d0fe21ae5 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/lt-LT.rc +++ b/dll/cpl/inetcpl/lang/lt-LT.rc diff --cc dll/cpl/inetcpl/lang/nl-NL.rc index 00000000000,5d5fb520de2..5d5fb520de2 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/nl-NL.rc +++ b/dll/cpl/inetcpl/lang/nl-NL.rc diff --cc dll/cpl/inetcpl/lang/pl-PL.rc index 00000000000,42f4f38eaea..42f4f38eaea mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/pl-PL.rc +++ b/dll/cpl/inetcpl/lang/pl-PL.rc diff --cc dll/cpl/inetcpl/lang/pt-PT.rc index 00000000000,5be8c1a6ba9..5be8c1a6ba9 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/pt-PT.rc +++ b/dll/cpl/inetcpl/lang/pt-PT.rc diff --cc dll/cpl/inetcpl/lang/ru-RU.rc index 00000000000,98b809d0328..98b809d0328 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/ru-RU.rc +++ b/dll/cpl/inetcpl/lang/ru-RU.rc diff --cc dll/cpl/inetcpl/lang/sv-SE.rc index 00000000000,997fd31a04e..997fd31a04e mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/sv-SE.rc +++ b/dll/cpl/inetcpl/lang/sv-SE.rc diff --cc dll/cpl/inetcpl/lang/uk-UA.rc index 00000000000,102fb0cc999..102fb0cc999 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/lang/uk-UA.rc +++ b/dll/cpl/inetcpl/lang/uk-UA.rc diff --cc dll/cpl/inetcpl/security.c index 00000000000,118718533b1..118718533b1 mode 000000,100644..100644 --- a/dll/cpl/inetcpl/security.c +++ b/dll/cpl/inetcpl/security.c diff --cc dll/cpl/powercfg/rsrc.rc index c3af70abf0d,00000000000..44313e08573 mode 100644,000000..100644 --- a/dll/cpl/powercfg/rsrc.rc +++ b/dll/cpl/powercfg/rsrc.rc @@@ -1,22 -1,0 +1,25 @@@ +#include +#include "resource.h" + +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/nl-NL.rc" +#include "lang/no-NO.rc" ++#include "lang/sk-SK.rc" ++#include "lang/th-TH.rc" ++#include "lang/zh-CN.rc" ++ ++// UTF-8 ++#pragma code_page(65001) +#include "lang/pl-PL.rc" +#include "lang/ro-RO.rc" +#include "lang/ru-RU.rc" - #include "lang/sk-SK.rc" - #include "lang/th-TH.rc" +#include "lang/uk-UA.rc" - #include "lang/zh-CN.rc" diff --cc dll/cpl/sysdm/rsrc.rc index a5f97a86d2e,00000000000..fb0bb921f14 mode 100644,000000..100644 --- a/dll/cpl/sysdm/rsrc.rc +++ b/dll/cpl/sysdm/rsrc.rc @@@ -1,27 -1,0 +1,30 @@@ +#include +#include "resource.h" + +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/no-NO.rc" ++#include "lang/sk-SK.rc" ++#include "lang/sv-SE.rc" ++#include "lang/zh-CN.rc" ++ ++// UTF-8 ++#pragma code_page(65001) +#include "lang/pl-PL.rc" +#include "lang/ro-RO.rc" +#include "lang/ru-RU.rc" - #include "lang/sk-SK.rc" - #include "lang/sv-SE.rc" +#include "lang/uk-UA.rc" - #include "lang/zh-CN.rc" + +/* +#include "lang/da-DK.rc" +#include "lang/hu-HU.rc" +#include "lang/nl-NL.rc" +*/ diff --cc dll/cpl/usrmgr/lang/fr-FR.rc index 00000000000,d98b04dd671..d98b04dd671 mode 000000,100644..100644 --- a/dll/cpl/usrmgr/lang/fr-FR.rc +++ b/dll/cpl/usrmgr/lang/fr-FR.rc diff --cc dll/cpl/usrmgr/lang/uk-UA.rc index 00000000000,25851627589..25851627589 mode 000000,100644..100644 --- a/dll/cpl/usrmgr/lang/uk-UA.rc +++ b/dll/cpl/usrmgr/lang/uk-UA.rc diff --cc dll/directx/wine/wined3d/state.c index 319237287af,00000000000..378e0f96827 mode 100644,000000..100644 --- a/dll/directx/wine/wined3d/state.c +++ b/dll/directx/wine/wined3d/state.c @@@ -1,5995 -1,0 +1,5900 @@@ +/* + * Direct3D state management + * + * Copyright 2002 Lionel Ulmer + * Copyright 2002-2005 Jason Edmeades + * Copyright 2003-2004 Raphael Junqueira + * Copyright 2004 Christian Costa + * Copyright 2005 Oliver Stieber + * Copyright 2006 Henri Verbeet + * Copyright 2006-2008 Stefan Dösinger for CodeWeavers - * Copyright 2009 Henri Verbeet for CodeWeavers ++ * Copyright 2009-2011 Henri Verbeet for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include +#ifdef HAVE_FLOAT_H +# include +#endif +#include "wined3d_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d); +WINE_DECLARE_DEBUG_CHANNEL(d3d_shader); + +/* GL locking for state handlers is done by the caller. */ + - static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context); ++static void state_blendop(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context); + - static void state_undefined(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_undefined(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + ERR("Undefined state.\n"); +} + - static void state_nop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_nop(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + TRACE("%s: nop in current pipe config.\n", debug_d3dstate(state)); +} + - static void state_fillmode(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_fillmode(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + WINED3DFILLMODE Value = stateblock->state.render_states[WINED3DRS_FILLMODE]; + + switch(Value) { + case WINED3DFILL_POINT: + glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); + checkGLcall("glPolygonMode(GL_FRONT_AND_BACK, GL_POINT)"); + break; + case WINED3DFILL_WIREFRAME: + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + checkGLcall("glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)"); + break; + case WINED3DFILL_SOLID: + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + checkGLcall("glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)"); + break; + default: + FIXME("Unrecognized WINED3DRS_FILLMODE value %d\n", Value); + } +} + - static void state_lighting(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_lighting(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + /* Lighting is not enabled if transformed vertices are drawn + * but lighting does not affect the stream sources, so it is not grouped for performance reasons. + * This state reads the decoded vertex declaration, so if it is dirty don't do anything. The + * vertex declaration applying function calls this function for updating + */ + + if(isStateDirty(context, STATE_VDECL)) { + return; + } + + if (stateblock->state.render_states[WINED3DRS_LIGHTING] + && !stateblock->device->strided_streams.position_transformed) + { + glEnable(GL_LIGHTING); + checkGLcall("glEnable GL_LIGHTING"); + } else { + glDisable(GL_LIGHTING); + checkGLcall("glDisable GL_LIGHTING"); + } +} + - static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_zenable(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + /* No z test without depth stencil buffers */ - if (!stateblock->device->depth_stencil) ++ if (!stateblock->device->fb.depth_stencil) + { + TRACE("No Z buffer - disabling depth test\n"); + glDisable(GL_DEPTH_TEST); /* This also disables z writing in gl */ + checkGLcall("glDisable GL_DEPTH_TEST"); + return; + } + + switch (stateblock->state.render_states[WINED3DRS_ZENABLE]) + { + case WINED3DZB_FALSE: + glDisable(GL_DEPTH_TEST); + checkGLcall("glDisable GL_DEPTH_TEST"); + break; + case WINED3DZB_TRUE: + glEnable(GL_DEPTH_TEST); + checkGLcall("glEnable GL_DEPTH_TEST"); + break; + case WINED3DZB_USEW: + glEnable(GL_DEPTH_TEST); + checkGLcall("glEnable GL_DEPTH_TEST"); + FIXME("W buffer is not well handled\n"); + break; + default: + FIXME("Unrecognized D3DZBUFFERTYPE value %#x.\n", + stateblock->state.render_states[WINED3DRS_ZENABLE]); + } +} + - static void state_cullmode(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_cullmode(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + /* glFrontFace() is set in context.c at context init and on an + * offscreen / onscreen rendering switch. */ + switch (stateblock->state.render_states[WINED3DRS_CULLMODE]) + { + case WINED3DCULL_NONE: + glDisable(GL_CULL_FACE); + checkGLcall("glDisable GL_CULL_FACE"); + break; + case WINED3DCULL_CW: + glEnable(GL_CULL_FACE); + checkGLcall("glEnable GL_CULL_FACE"); + glCullFace(GL_FRONT); + checkGLcall("glCullFace(GL_FRONT)"); + break; + case WINED3DCULL_CCW: + glEnable(GL_CULL_FACE); + checkGLcall("glEnable GL_CULL_FACE"); + glCullFace(GL_BACK); + checkGLcall("glCullFace(GL_BACK)"); + break; + default: + FIXME("Unrecognized/Unhandled WINED3DCULL value %#x.\n", + stateblock->state.render_states[WINED3DRS_CULLMODE]); + } +} + - static void state_shademode(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_shademode(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + switch (stateblock->state.render_states[WINED3DRS_SHADEMODE]) + { + case WINED3DSHADE_FLAT: + glShadeModel(GL_FLAT); + checkGLcall("glShadeModel(GL_FLAT)"); + break; + case WINED3DSHADE_GOURAUD: + glShadeModel(GL_SMOOTH); + checkGLcall("glShadeModel(GL_SMOOTH)"); + break; + case WINED3DSHADE_PHONG: + FIXME("WINED3DSHADE_PHONG isn't supported\n"); + break; + default: + FIXME("Unrecognized/Unhandled WINED3DSHADEMODE value %#x.\n", + stateblock->state.render_states[WINED3DRS_SHADEMODE]); + } +} + - static void state_ditherenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_ditherenable(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_DITHERENABLE]) + { + glEnable(GL_DITHER); + checkGLcall("glEnable GL_DITHER"); + } + else + { + glDisable(GL_DITHER); + checkGLcall("glDisable GL_DITHER"); + } +} + - static void state_zwritenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_zwritenable(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + /* TODO: Test if in d3d z writing is enabled even if ZENABLE is off. + * If yes, this has to be merged with ZENABLE and ZFUNC. */ + if (stateblock->state.render_states[WINED3DRS_ZWRITEENABLE]) + { + glDepthMask(1); + checkGLcall("glDepthMask(1)"); + } + else + { + glDepthMask(0); + checkGLcall("glDepthMask(0)"); + } +} + - static void state_zfunc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_zfunc(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + GLenum depth_func = CompareFunc(stateblock->state.render_states[WINED3DRS_ZFUNC]); + + if (!depth_func) return; + + if (depth_func == GL_EQUAL || depth_func == GL_NOTEQUAL) + { + static BOOL once; + /* There are a few issues with this: First, our inability to + * select a proper Z depth, most of the time we're stuck with + * D24S8, even if the app selects D32 or D16. There seem to be + * some other precision problems which have to be debugged to + * make NOTEQUAL and EQUAL work properly. */ + if (!once) + { + once = TRUE; + FIXME("D3DCMP_NOTEQUAL and D3DCMP_EQUAL do not work correctly yet.\n"); + } + } + + glDepthFunc(depth_func); + checkGLcall("glDepthFunc"); +} + - static void state_ambient(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_ambient(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + float col[4]; + D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_AMBIENT], col); + + TRACE("Setting ambient to (%f,%f,%f,%f)\n", col[0], col[1], col[2], col[3]); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, col); + checkGLcall("glLightModel for MODEL_AMBIENT"); +} + - static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static GLenum gl_blend_factor(WINED3DBLEND factor, const struct wined3d_format *dst_format) +{ - IWineD3DSurfaceImpl *target = stateblock->device->render_targets[0]; ++ switch (factor) ++ { ++ case WINED3DBLEND_ZERO: ++ return GL_ZERO; ++ case WINED3DBLEND_ONE: ++ return GL_ONE; ++ case WINED3DBLEND_SRCCOLOR: ++ return GL_SRC_COLOR; ++ case WINED3DBLEND_INVSRCCOLOR: ++ return GL_ONE_MINUS_SRC_COLOR; ++ case WINED3DBLEND_SRCALPHA: ++ return GL_SRC_ALPHA; ++ case WINED3DBLEND_INVSRCALPHA: ++ return GL_ONE_MINUS_SRC_ALPHA; ++ case WINED3DBLEND_DESTCOLOR: ++ return GL_DST_COLOR; ++ case WINED3DBLEND_INVDESTCOLOR: ++ return GL_ONE_MINUS_DST_COLOR; ++ /* To compensate for the lack of format switching with backbuffer ++ * offscreen rendering, and with onscreen rendering, we modify the ++ * alpha test parameters for (INV)DESTALPHA if the render target ++ * doesn't support alpha blending. A nonexistent alpha channel ++ * returns 1.0, so WINED3DBLEND_DESTALPHA becomes GL_ONE, and ++ * WINED3DBLEND_INVDESTALPHA becomes GL_ZERO. */ ++ case WINED3DBLEND_DESTALPHA: ++ return dst_format->alpha_mask ? GL_DST_ALPHA : GL_ONE; ++ case WINED3DBLEND_INVDESTALPHA: ++ return dst_format->alpha_mask ? GL_ONE_MINUS_DST_ALPHA : GL_ZERO; ++ case WINED3DBLEND_SRCALPHASAT: ++ return GL_SRC_ALPHA_SATURATE; ++ case WINED3DBLEND_BLENDFACTOR: ++ return GL_CONSTANT_COLOR_EXT; ++ case WINED3DBLEND_INVBLENDFACTOR: ++ return GL_ONE_MINUS_CONSTANT_COLOR_EXT; ++ default: ++ FIXME("Unhandled blend factor %#x.\n", factor); ++ return GL_NONE; ++ } ++} ++ ++static void state_blend(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) ++{ ++ struct wined3d_surface *target = stateblock->device->fb.render_targets[0]; + const struct wined3d_gl_info *gl_info = context->gl_info; - int srcBlend = GL_ZERO; - int dstBlend = GL_ZERO; ++ GLenum srcBlend, dstBlend; ++ WINED3DBLEND d3d_blend; + + /* According to the red book, GL_LINE_SMOOTH needs GL_BLEND with specific + * blending parameters to work. */ + if (stateblock->state.render_states[WINED3DRS_ALPHABLENDENABLE] + || stateblock->state.render_states[WINED3DRS_EDGEANTIALIAS] + || stateblock->state.render_states[WINED3DRS_ANTIALIASEDLINEENABLE]) + { + /* Disable blending in all cases even without pixelshaders. + * With blending on we could face a big performance penalty. + * The d3d9 visual test confirms the behavior. */ + if (context->render_offscreen - && !(target->resource.format->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING)) ++ && !(target->resource.format->flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING)) + { + glDisable(GL_BLEND); + checkGLcall("glDisable GL_BLEND"); + return; + } else { + glEnable(GL_BLEND); + checkGLcall("glEnable GL_BLEND"); + } + } else { + glDisable(GL_BLEND); + checkGLcall("glDisable GL_BLEND"); + /* Nothing more to do - get out */ + return; + }; + - switch (stateblock->state.render_states[WINED3DRS_DESTBLEND]) ++ /* WINED3DBLEND_BOTHSRCALPHA and WINED3DBLEND_BOTHINVSRCALPHA are legacy ++ * source blending values which are still valid up to d3d9. They should ++ * not occur as dest blend values. */ ++ d3d_blend = stateblock->state.render_states[WINED3DRS_SRCBLEND]; ++ if (d3d_blend == WINED3DBLEND_BOTHSRCALPHA) + { - case WINED3DBLEND_ZERO : dstBlend = GL_ZERO; break; - case WINED3DBLEND_ONE : dstBlend = GL_ONE; break; - case WINED3DBLEND_SRCCOLOR : dstBlend = GL_SRC_COLOR; break; - case WINED3DBLEND_INVSRCCOLOR : dstBlend = GL_ONE_MINUS_SRC_COLOR; break; - case WINED3DBLEND_SRCALPHA : dstBlend = GL_SRC_ALPHA; break; - case WINED3DBLEND_INVSRCALPHA : dstBlend = GL_ONE_MINUS_SRC_ALPHA; break; - case WINED3DBLEND_DESTCOLOR : dstBlend = GL_DST_COLOR; break; - case WINED3DBLEND_INVDESTCOLOR : dstBlend = GL_ONE_MINUS_DST_COLOR; break; - - /* To compensate the lack of format switching with backbuffer offscreen rendering, - * and with onscreen rendering, we modify the alpha test parameters for (INV)DESTALPHA - * if the render target doesn't support alpha blending. A nonexistent alpha channel - * returns 1.0, so D3DBLEND_DESTALPHA is GL_ONE, and D3DBLEND_INVDESTALPHA is GL_ZERO - */ - case WINED3DBLEND_DESTALPHA : - dstBlend = target->resource.format->alpha_mask ? GL_DST_ALPHA : GL_ONE; - break; - case WINED3DBLEND_INVDESTALPHA : - dstBlend = target->resource.format->alpha_mask ? GL_ONE_MINUS_DST_ALPHA : GL_ZERO; - break; - - case WINED3DBLEND_SRCALPHASAT : - dstBlend = GL_SRC_ALPHA_SATURATE; - WARN("Application uses SRCALPHASAT as dest blend factor, expect problems\n"); - break; - - /* WINED3DBLEND_BOTHSRCALPHA and WINED3DBLEND_BOTHINVSRCALPHA are legacy source blending - * values which are still valid up to d3d9. They should not occur as dest blend values - */ - case WINED3DBLEND_BOTHSRCALPHA : dstBlend = GL_SRC_ALPHA; - srcBlend = GL_SRC_ALPHA; - FIXME("WINED3DRS_DESTBLEND = WINED3DBLEND_BOTHSRCALPHA, what to do?\n"); - break; - - case WINED3DBLEND_BOTHINVSRCALPHA : dstBlend = GL_ONE_MINUS_SRC_ALPHA; - srcBlend = GL_ONE_MINUS_SRC_ALPHA; - FIXME("WINED3DRS_DESTBLEND = WINED3DBLEND_BOTHINVSRCALPHA, what to do?\n"); - break; - - case WINED3DBLEND_BLENDFACTOR : dstBlend = GL_CONSTANT_COLOR; break; - case WINED3DBLEND_INVBLENDFACTOR : dstBlend = GL_ONE_MINUS_CONSTANT_COLOR; break; - default: - FIXME("Unrecognized dst blend value %#x.\n", - stateblock->state.render_states[WINED3DRS_DESTBLEND]); ++ srcBlend = GL_SRC_ALPHA; ++ dstBlend = GL_ONE_MINUS_SRC_ALPHA; + } - - switch (stateblock->state.render_states[WINED3DRS_SRCBLEND]) ++ else if (d3d_blend == WINED3DBLEND_BOTHINVSRCALPHA) + { - case WINED3DBLEND_ZERO : srcBlend = GL_ZERO; break; - case WINED3DBLEND_ONE : srcBlend = GL_ONE; break; - case WINED3DBLEND_SRCCOLOR : srcBlend = GL_SRC_COLOR; break; - case WINED3DBLEND_INVSRCCOLOR : srcBlend = GL_ONE_MINUS_SRC_COLOR; break; - case WINED3DBLEND_SRCALPHA : srcBlend = GL_SRC_ALPHA; break; - case WINED3DBLEND_INVSRCALPHA : srcBlend = GL_ONE_MINUS_SRC_ALPHA; break; - case WINED3DBLEND_DESTCOLOR : srcBlend = GL_DST_COLOR; break; - case WINED3DBLEND_INVDESTCOLOR : srcBlend = GL_ONE_MINUS_DST_COLOR; break; - case WINED3DBLEND_SRCALPHASAT : srcBlend = GL_SRC_ALPHA_SATURATE; break; - - case WINED3DBLEND_DESTALPHA : - srcBlend = target->resource.format->alpha_mask ? GL_DST_ALPHA : GL_ONE; - break; - case WINED3DBLEND_INVDESTALPHA : - srcBlend = target->resource.format->alpha_mask ? GL_ONE_MINUS_DST_ALPHA : GL_ZERO; - break; - - case WINED3DBLEND_BOTHSRCALPHA : srcBlend = GL_SRC_ALPHA; - dstBlend = GL_ONE_MINUS_SRC_ALPHA; - break; - - case WINED3DBLEND_BOTHINVSRCALPHA : srcBlend = GL_ONE_MINUS_SRC_ALPHA; - dstBlend = GL_SRC_ALPHA; - break; - - case WINED3DBLEND_BLENDFACTOR : srcBlend = GL_CONSTANT_COLOR; break; - case WINED3DBLEND_INVBLENDFACTOR : srcBlend = GL_ONE_MINUS_CONSTANT_COLOR; break; - default: - FIXME("Unrecognized src blend value %#x.\n", - stateblock->state.render_states[WINED3DRS_SRCBLEND]); ++ srcBlend = GL_ONE_MINUS_SRC_ALPHA; ++ dstBlend = GL_SRC_ALPHA; ++ } ++ else ++ { ++ srcBlend = gl_blend_factor(d3d_blend, target->resource.format); ++ dstBlend = gl_blend_factor(stateblock->state.render_states[WINED3DRS_DESTBLEND], ++ target->resource.format); + } + + if (stateblock->state.render_states[WINED3DRS_EDGEANTIALIAS] + || stateblock->state.render_states[WINED3DRS_ANTIALIASEDLINEENABLE]) + { + glEnable(GL_LINE_SMOOTH); + checkGLcall("glEnable(GL_LINE_SMOOTH)"); + if(srcBlend != GL_SRC_ALPHA) { + WARN("WINED3DRS_EDGEANTIALIAS enabled, but unexpected src blending param\n"); + } + if(dstBlend != GL_ONE_MINUS_SRC_ALPHA && dstBlend != GL_ONE) { + WARN("WINED3DRS_EDGEANTIALIAS enabled, but unexpected dst blending param\n"); + } + } else { + glDisable(GL_LINE_SMOOTH); + checkGLcall("glDisable(GL_LINE_SMOOTH)"); + } + + /* Re-apply BLENDOP(ALPHA) because of a possible SEPARATEALPHABLENDENABLE change */ + if(!isStateDirty(context, STATE_RENDER(WINED3DRS_BLENDOP))) { + state_blendop(STATE_RENDER(WINED3DRS_BLENDOPALPHA), stateblock, context); + } + + if (stateblock->state.render_states[WINED3DRS_SEPARATEALPHABLENDENABLE]) + { - int srcBlendAlpha = GL_ZERO; - int dstBlendAlpha = GL_ZERO; ++ GLenum srcBlendAlpha, dstBlendAlpha; + + /* Separate alpha blending requires GL_EXT_blend_function_separate, so make sure it is around */ + if (!context->gl_info->supported[EXT_BLEND_FUNC_SEPARATE]) + { + WARN("Unsupported in local OpenGL implementation: glBlendFuncSeparateEXT\n"); + return; + } + - switch (stateblock->state.render_states[WINED3DRS_DESTBLENDALPHA]) ++ /* WINED3DBLEND_BOTHSRCALPHA and WINED3DBLEND_BOTHINVSRCALPHA are legacy ++ * source blending values which are still valid up to d3d9. They should ++ * not occur as dest blend values. */ ++ d3d_blend = stateblock->state.render_states[WINED3DRS_SRCBLENDALPHA]; ++ if (d3d_blend == WINED3DBLEND_BOTHSRCALPHA) + { - case WINED3DBLEND_ZERO : dstBlendAlpha = GL_ZERO; break; - case WINED3DBLEND_ONE : dstBlendAlpha = GL_ONE; break; - case WINED3DBLEND_SRCCOLOR : dstBlendAlpha = GL_SRC_COLOR; break; - case WINED3DBLEND_INVSRCCOLOR : dstBlendAlpha = GL_ONE_MINUS_SRC_COLOR; break; - case WINED3DBLEND_SRCALPHA : dstBlendAlpha = GL_SRC_ALPHA; break; - case WINED3DBLEND_INVSRCALPHA : dstBlendAlpha = GL_ONE_MINUS_SRC_ALPHA; break; - case WINED3DBLEND_DESTCOLOR : dstBlendAlpha = GL_DST_COLOR; break; - case WINED3DBLEND_INVDESTCOLOR : dstBlendAlpha = GL_ONE_MINUS_DST_COLOR; break; - case WINED3DBLEND_DESTALPHA : dstBlendAlpha = GL_DST_ALPHA; break; - case WINED3DBLEND_INVDESTALPHA : dstBlendAlpha = GL_DST_ALPHA; break; - case WINED3DBLEND_SRCALPHASAT : - dstBlend = GL_SRC_ALPHA_SATURATE; - WARN("Application uses SRCALPHASAT as dest blend factor, expect problems\n"); - break; - /* WINED3DBLEND_BOTHSRCALPHA and WINED3DBLEND_BOTHINVSRCALPHA are legacy source blending - * values which are still valid up to d3d9. They should not occur as dest blend values - */ - case WINED3DBLEND_BOTHSRCALPHA : - dstBlendAlpha = GL_SRC_ALPHA; - srcBlendAlpha = GL_SRC_ALPHA; - FIXME("WINED3DRS_DESTBLENDALPHA = WINED3DBLEND_BOTHSRCALPHA, what to do?\n"); - break; - case WINED3DBLEND_BOTHINVSRCALPHA : - dstBlendAlpha = GL_ONE_MINUS_SRC_ALPHA; - srcBlendAlpha = GL_ONE_MINUS_SRC_ALPHA; - FIXME("WINED3DRS_DESTBLENDALPHA = WINED3DBLEND_BOTHINVSRCALPHA, what to do?\n"); - break; - case WINED3DBLEND_BLENDFACTOR : dstBlendAlpha = GL_CONSTANT_COLOR; break; - case WINED3DBLEND_INVBLENDFACTOR : dstBlendAlpha = GL_ONE_MINUS_CONSTANT_COLOR; break; - default: - FIXME("Unrecognized dst blend alpha value %#x.\n", - stateblock->state.render_states[WINED3DRS_DESTBLENDALPHA]); ++ srcBlendAlpha = GL_SRC_ALPHA; ++ dstBlendAlpha = GL_ONE_MINUS_SRC_ALPHA; + } - - switch (stateblock->state.render_states[WINED3DRS_SRCBLENDALPHA]) ++ else if (d3d_blend == WINED3DBLEND_BOTHINVSRCALPHA) + { - case WINED3DBLEND_ZERO : srcBlendAlpha = GL_ZERO; break; - case WINED3DBLEND_ONE : srcBlendAlpha = GL_ONE; break; - case WINED3DBLEND_SRCCOLOR : srcBlendAlpha = GL_SRC_COLOR; break; - case WINED3DBLEND_INVSRCCOLOR : srcBlendAlpha = GL_ONE_MINUS_SRC_COLOR; break; - case WINED3DBLEND_SRCALPHA : srcBlendAlpha = GL_SRC_ALPHA; break; - case WINED3DBLEND_INVSRCALPHA : srcBlendAlpha = GL_ONE_MINUS_SRC_ALPHA; break; - case WINED3DBLEND_DESTCOLOR : srcBlendAlpha = GL_DST_COLOR; break; - case WINED3DBLEND_INVDESTCOLOR : srcBlendAlpha = GL_ONE_MINUS_DST_COLOR; break; - case WINED3DBLEND_SRCALPHASAT : srcBlendAlpha = GL_SRC_ALPHA_SATURATE; break; - case WINED3DBLEND_DESTALPHA : srcBlendAlpha = GL_DST_ALPHA; break; - case WINED3DBLEND_INVDESTALPHA : srcBlendAlpha = GL_DST_ALPHA; break; - case WINED3DBLEND_BOTHSRCALPHA : - srcBlendAlpha = GL_SRC_ALPHA; - dstBlendAlpha = GL_ONE_MINUS_SRC_ALPHA; - break; - case WINED3DBLEND_BOTHINVSRCALPHA : - srcBlendAlpha = GL_ONE_MINUS_SRC_ALPHA; - dstBlendAlpha = GL_SRC_ALPHA; - break; - case WINED3DBLEND_BLENDFACTOR : srcBlendAlpha = GL_CONSTANT_COLOR; break; - case WINED3DBLEND_INVBLENDFACTOR : srcBlendAlpha = GL_ONE_MINUS_CONSTANT_COLOR; break; - default: - FIXME("Unrecognized src blend alpha value %#x.\n", - stateblock->state.render_states[WINED3DRS_SRCBLENDALPHA]); ++ srcBlendAlpha = GL_ONE_MINUS_SRC_ALPHA; ++ dstBlendAlpha = GL_SRC_ALPHA; ++ } ++ else ++ { ++ srcBlendAlpha = gl_blend_factor(d3d_blend, target->resource.format); ++ dstBlendAlpha = gl_blend_factor(stateblock->state.render_states[WINED3DRS_DESTBLENDALPHA], ++ target->resource.format); + } + + GL_EXTCALL(glBlendFuncSeparateEXT(srcBlend, dstBlend, srcBlendAlpha, dstBlendAlpha)); + checkGLcall("glBlendFuncSeparateEXT"); + } else { + TRACE("glBlendFunc src=%x, dst=%x\n", srcBlend, dstBlend); + glBlendFunc(srcBlend, dstBlend); + checkGLcall("glBlendFunc"); + } + + /* colorkey fixup for stage 0 alphaop depends on WINED3DRS_ALPHABLENDENABLE state, + so it may need updating */ + if (stateblock->state.render_states[WINED3DRS_COLORKEYENABLE]) + stateblock_apply_state(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context); +} + - static void state_blendfactor_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_blendfactor_w(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + WARN("Unsupported in local OpenGL implementation: glBlendColorEXT\n"); +} + - static void state_blendfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_blendfactor(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + float col[4]; + + TRACE("Setting blend factor to %#x.\n", stateblock->state.render_states[WINED3DRS_BLENDFACTOR]); + D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_BLENDFACTOR], col); + GL_EXTCALL(glBlendColorEXT (col[0],col[1],col[2],col[3])); + checkGLcall("glBlendColor"); +} + - static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_alpha(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + int glParm = 0; + float ref; + BOOL enable_ckey = FALSE; + + TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context); + + /* Find out if the texture on the first stage has a ckey set + * The alpha state func reads the texture settings, even though alpha and texture are not grouped + * together. This is to avoid making a huge alpha+texture+texture stage+ckey block due to the hardly + * used WINED3DRS_COLORKEYENABLE state(which is d3d <= 3 only). The texture function will call alpha + * in case it finds some texture+colorkeyenable combination which needs extra care. + */ + if (stateblock->state.textures[0]) + { - IWineD3DBaseTextureImpl *texture = stateblock->state.textures[0]; - GLenum texture_dimensions = texture->baseTexture.target; ++ struct wined3d_texture *texture = stateblock->state.textures[0]; ++ GLenum texture_dimensions = texture->target; + + if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB) + { - IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0]; ++ struct wined3d_surface *surf = surface_from_resource(texture->sub_resources[0]); + + if (surf->CKeyFlags & WINEDDSD_CKSRCBLT) + { + /* The surface conversion does not do color keying conversion for surfaces that have an alpha + * channel on their own. Likewise, the alpha test shouldn't be set up for color keying if the + * surface has alpha bits */ + if (!surf->resource.format->alpha_mask) enable_ckey = TRUE; + } + } + } + + if (enable_ckey || context->last_was_ckey) + stateblock_apply_state(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context); + context->last_was_ckey = enable_ckey; + + if (stateblock->state.render_states[WINED3DRS_ALPHATESTENABLE] + || (stateblock->state.render_states[WINED3DRS_COLORKEYENABLE] && enable_ckey)) + { + glEnable(GL_ALPHA_TEST); + checkGLcall("glEnable GL_ALPHA_TEST"); + } else { + glDisable(GL_ALPHA_TEST); + checkGLcall("glDisable GL_ALPHA_TEST"); + /* Alpha test is disabled, don't bother setting the params - it will happen on the next + * enable call + */ + return; + } + + if (stateblock->state.render_states[WINED3DRS_COLORKEYENABLE] && enable_ckey) + { + glParm = GL_NOTEQUAL; + ref = 0.0f; + } else { + ref = ((float)stateblock->state.render_states[WINED3DRS_ALPHAREF]) / 255.0f; + glParm = CompareFunc(stateblock->state.render_states[WINED3DRS_ALPHAFUNC]); + } + if(glParm) { + glAlphaFunc(glParm, ref); + checkGLcall("glAlphaFunc"); + } +} + - static void state_clipping(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_clipping(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; + DWORD enable = 0xFFFFFFFF; + DWORD disable = 0x00000000; + + if (!stateblock->device->vs_clipping && use_vs(state)) + { + /* The spec says that opengl clipping planes are disabled when using shaders. Direct3D planes aren't, + * so that is an issue. The MacOS ATI driver keeps clipping planes activated with shaders in some + * conditions I got sick of tracking down. The shader state handler disables all clip planes because + * of that - don't do anything here and keep them disabled + */ + if (state->render_states[WINED3DRS_CLIPPLANEENABLE]) + { + static BOOL warned = FALSE; + if(!warned) { + FIXME("Clipping not supported with vertex shaders\n"); + warned = TRUE; + } + } + return; + } + + /* TODO: Keep track of previously enabled clipplanes to avoid unnecessary resetting + * of already set values + */ + + /* If enabling / disabling all + * TODO: Is this correct? Doesn't D3DRS_CLIPPING disable clipping on the viewport frustrum? + */ + if (state->render_states[WINED3DRS_CLIPPING]) + { + enable = state->render_states[WINED3DRS_CLIPPLANEENABLE]; + disable = ~state->render_states[WINED3DRS_CLIPPLANEENABLE]; + if (gl_info->supported[ARB_DEPTH_CLAMP]) + { + glDisable(GL_DEPTH_CLAMP); + checkGLcall("glDisable(GL_DEPTH_CLAMP)"); + } + } else { + disable = 0xffffffff; + enable = 0x00; + if (gl_info->supported[ARB_DEPTH_CLAMP]) + { + glEnable(GL_DEPTH_CLAMP); + checkGLcall("glEnable(GL_DEPTH_CLAMP)"); + } + else + { + FIXME("Clipping disabled, but ARB_depth_clamp isn't supported.\n"); + } + } + + if (enable & WINED3DCLIPPLANE0) { glEnable(GL_CLIP_PLANE0); checkGLcall("glEnable(clip plane 0)"); } + if (enable & WINED3DCLIPPLANE1) { glEnable(GL_CLIP_PLANE1); checkGLcall("glEnable(clip plane 1)"); } + if (enable & WINED3DCLIPPLANE2) { glEnable(GL_CLIP_PLANE2); checkGLcall("glEnable(clip plane 2)"); } + if (enable & WINED3DCLIPPLANE3) { glEnable(GL_CLIP_PLANE3); checkGLcall("glEnable(clip plane 3)"); } + if (enable & WINED3DCLIPPLANE4) { glEnable(GL_CLIP_PLANE4); checkGLcall("glEnable(clip plane 4)"); } + if (enable & WINED3DCLIPPLANE5) { glEnable(GL_CLIP_PLANE5); checkGLcall("glEnable(clip plane 5)"); } + + if (disable & WINED3DCLIPPLANE0) { glDisable(GL_CLIP_PLANE0); checkGLcall("glDisable(clip plane 0)"); } + if (disable & WINED3DCLIPPLANE1) { glDisable(GL_CLIP_PLANE1); checkGLcall("glDisable(clip plane 1)"); } + if (disable & WINED3DCLIPPLANE2) { glDisable(GL_CLIP_PLANE2); checkGLcall("glDisable(clip plane 2)"); } + if (disable & WINED3DCLIPPLANE3) { glDisable(GL_CLIP_PLANE3); checkGLcall("glDisable(clip plane 3)"); } + if (disable & WINED3DCLIPPLANE4) { glDisable(GL_CLIP_PLANE4); checkGLcall("glDisable(clip plane 4)"); } + if (disable & WINED3DCLIPPLANE5) { glDisable(GL_CLIP_PLANE5); checkGLcall("glDisable(clip plane 5)"); } + + /** update clipping status */ + if (enable) + { + stateblock->state.clip_status.ClipUnion = 0; + stateblock->state.clip_status.ClipIntersection = 0xFFFFFFFF; + } + else + { + stateblock->state.clip_status.ClipUnion = 0; + stateblock->state.clip_status.ClipIntersection = 0; + } +} + - static void state_blendop_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_blendop_w(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + WARN("Unsupported in local OpenGL implementation: glBlendEquation\n"); +} + - static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static GLenum gl_blend_op(WINED3DBLENDOP op) ++{ ++ switch (op) ++ { ++ case WINED3DBLENDOP_ADD: ++ return GL_FUNC_ADD_EXT; ++ case WINED3DBLENDOP_SUBTRACT: ++ return GL_FUNC_SUBTRACT_EXT; ++ case WINED3DBLENDOP_REVSUBTRACT: ++ return GL_FUNC_REVERSE_SUBTRACT_EXT; ++ case WINED3DBLENDOP_MIN: ++ return GL_MIN_EXT; ++ case WINED3DBLENDOP_MAX: ++ return GL_MAX_EXT; ++ default: ++ FIXME("Unhandled blend op %#x.\n", op); ++ return GL_NONE; ++ } ++} ++ ++static void state_blendop(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; - int blendEquation = GL_FUNC_ADD; - int blendEquationAlpha = GL_FUNC_ADD; ++ int blendEquation = GL_FUNC_ADD_EXT; ++ int blendEquationAlpha = GL_FUNC_ADD_EXT; + + /* BLENDOPALPHA requires GL_EXT_blend_equation_separate, so make sure it is around */ + if (stateblock->state.render_states[WINED3DRS_BLENDOPALPHA] + && !gl_info->supported[EXT_BLEND_EQUATION_SEPARATE]) + { + WARN("Unsupported in local OpenGL implementation: glBlendEquationSeparateEXT\n"); + return; + } + - switch (stateblock->state.render_states[WINED3DRS_BLENDOP]) - { - case WINED3DBLENDOP_ADD : blendEquation = GL_FUNC_ADD; break; - case WINED3DBLENDOP_SUBTRACT : blendEquation = GL_FUNC_SUBTRACT; break; - case WINED3DBLENDOP_REVSUBTRACT : blendEquation = GL_FUNC_REVERSE_SUBTRACT; break; - case WINED3DBLENDOP_MIN : blendEquation = GL_MIN; break; - case WINED3DBLENDOP_MAX : blendEquation = GL_MAX; break; - default: - FIXME("Unrecognized/Unhandled D3DBLENDOP value %#x.\n", - stateblock->state.render_states[WINED3DRS_BLENDOP]); - } - - switch (stateblock->state.render_states[WINED3DRS_BLENDOPALPHA]) - { - case WINED3DBLENDOP_ADD : blendEquationAlpha = GL_FUNC_ADD; break; - case WINED3DBLENDOP_SUBTRACT : blendEquationAlpha = GL_FUNC_SUBTRACT; break; - case WINED3DBLENDOP_REVSUBTRACT : blendEquationAlpha = GL_FUNC_REVERSE_SUBTRACT; break; - case WINED3DBLENDOP_MIN : blendEquationAlpha = GL_MIN; break; - case WINED3DBLENDOP_MAX : blendEquationAlpha = GL_MAX; break; - default: - FIXME("Unrecognized/Unhandled D3DBLENDOP value %#x\n", - stateblock->state.render_states[WINED3DRS_BLENDOPALPHA]); - } ++ blendEquation = gl_blend_op(stateblock->state.render_states[WINED3DRS_BLENDOP]); ++ blendEquationAlpha = gl_blend_op(stateblock->state.render_states[WINED3DRS_BLENDOPALPHA]); + + if (stateblock->state.render_states[WINED3DRS_SEPARATEALPHABLENDENABLE]) + { + TRACE("glBlendEquationSeparateEXT(%x, %x)\n", blendEquation, blendEquationAlpha); + GL_EXTCALL(glBlendEquationSeparateEXT(blendEquation, blendEquationAlpha)); + checkGLcall("glBlendEquationSeparateEXT"); + } else { + TRACE("glBlendEquation(%x)\n", blendEquation); + GL_EXTCALL(glBlendEquationEXT(blendEquation)); + checkGLcall("glBlendEquation"); + } +} + - static void state_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_specularenable(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + /* Originally this used glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR) + * and (GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR) to swap between enabled/disabled + * specular color. This is wrong: + * Separate specular color means the specular colour is maintained separately, whereas + * single color means it is merged in. However in both cases they are being used to + * some extent. + * To disable specular color, set it explicitly to black and turn off GL_COLOR_SUM_EXT + * NOTE: If not supported don't give FIXMEs the impact is really minimal and very few people are + * running 1.4 yet! + * + * + * If register combiners are enabled, enabling / disabling GL_COLOR_SUM has no effect. + * Instead, we need to setup the FinalCombiner properly. + * + * The default setup for the FinalCombiner is: + * + * + * GL_VARIABLE_A_NV GL_FOG, GL_UNSIGNED_IDENTITY_NV GL_ALPHA + * GL_VARIABLE_B_NV GL_SPARE0_PLUS_SECONDARY_COLOR_NV GL_UNSIGNED_IDENTITY_NV GL_RGB + * GL_VARIABLE_C_NV GL_FOG GL_UNSIGNED_IDENTITY_NV GL_RGB + * GL_VARIABLE_D_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB + * GL_VARIABLE_E_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB + * GL_VARIABLE_F_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB + * GL_VARIABLE_G_NV GL_SPARE0_NV GL_UNSIGNED_IDENTITY_NV GL_ALPHA + * + * That's pretty much fine as it is, except for variable B, which needs to take + * either GL_SPARE0_PLUS_SECONDARY_COLOR_NV or GL_SPARE0_NV, depending on + * whether WINED3DRS_SPECULARENABLE is enabled or not. + */ + + TRACE("Setting specular enable state and materials\n"); + if (stateblock->state.render_states[WINED3DRS_SPECULARENABLE]) + { + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float *)&stateblock->state.material.Specular); + checkGLcall("glMaterialfv"); + + if (stateblock->state.material.Power > gl_info->limits.shininess) + { + /* glMaterialf man page says that the material says that GL_SHININESS must be between 0.0 + * and 128.0, although in d3d neither -1 nor 129 produce an error. GL_NV_max_light_exponent + * allows bigger values. If the extension is supported, gl_info->limits.shininess contains the + * value reported by the extension, otherwise 128. For values > gl_info->limits.shininess clamp + * them, it should be safe to do so without major visual distortions. + */ + WARN("Material power = %f, limit %f\n", stateblock->state.material.Power, gl_info->limits.shininess); + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, gl_info->limits.shininess); + } + else + { + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, stateblock->state.material.Power); + } + checkGLcall("glMaterialf(GL_SHININESS)"); + + if (gl_info->supported[EXT_SECONDARY_COLOR]) + { + glEnable(GL_COLOR_SUM_EXT); + } + else + { + TRACE("Specular colors cannot be enabled in this version of opengl\n"); + } + checkGLcall("glEnable(GL_COLOR_SUM)"); + + if (gl_info->supported[NV_REGISTER_COMBINERS]) + { + GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_PLUS_SECONDARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB)); + checkGLcall("glFinalCombinerInputNV()"); + } + } else { + static const GLfloat black[] = {0.0f, 0.0f, 0.0f, 0.0f}; + + /* for the case of enabled lighting: */ + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &black[0]); + checkGLcall("glMaterialfv"); + + /* for the case of disabled lighting: */ + if (gl_info->supported[EXT_SECONDARY_COLOR]) + { + glDisable(GL_COLOR_SUM_EXT); + } + else + { + TRACE("Specular colors cannot be disabled in this version of opengl\n"); + } + checkGLcall("glDisable(GL_COLOR_SUM)"); + + if (gl_info->supported[NV_REGISTER_COMBINERS]) + { + GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB)); + checkGLcall("glFinalCombinerInputNV()"); + } + } + + TRACE("(%p) : Diffuse {%.8e, %.8e, %.8e, %.8e}\n", stateblock->device, + stateblock->state.material.Diffuse.r, stateblock->state.material.Diffuse.g, + stateblock->state.material.Diffuse.b, stateblock->state.material.Diffuse.a); + TRACE("(%p) : Ambient {%.8e, %.8e, %.8e, %.8e}\n", stateblock->device, + stateblock->state.material.Ambient.r, stateblock->state.material.Ambient.g, + stateblock->state.material.Ambient.b, stateblock->state.material.Ambient.a); + TRACE("(%p) : Specular {%.8e, %.8e, %.8e, %.8e}\n", stateblock->device, + stateblock->state.material.Specular.r, stateblock->state.material.Specular.g, + stateblock->state.material.Specular.b, stateblock->state.material.Specular.a); + TRACE("(%p) : Emissive {%.8e, %.8e, %.8e, %.8e}\n", stateblock->device, + stateblock->state.material.Emissive.r, stateblock->state.material.Emissive.g, + stateblock->state.material.Emissive.b, stateblock->state.material.Emissive.a); + + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float *)&stateblock->state.material.Ambient); + checkGLcall("glMaterialfv(GL_AMBIENT)"); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float *)&stateblock->state.material.Diffuse); + checkGLcall("glMaterialfv(GL_DIFFUSE)"); + glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float *)&stateblock->state.material.Emissive); + checkGLcall("glMaterialfv(GL_EMISSION)"); +} + - static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_texfactor(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + unsigned int i; + + /* Note the texture color applies to all textures whereas + * GL_TEXTURE_ENV_COLOR applies to active only + */ + float col[4]; + D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_TEXTUREFACTOR], col); + + /* And now the default texture color as well */ + for (i = 0; i < gl_info->limits.texture_stages; ++i) + { + /* Note the WINED3DRS value applies to all textures, but GL has one + * per texture, so apply it now ready to be used! + */ + GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i)); + checkGLcall("glActiveTextureARB"); + + glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]); + checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);"); + } +} + +static void renderstate_stencil_twosided(struct wined3d_context *context, GLint face, + GLint func, GLint ref, GLuint mask, GLint stencilFail, GLint depthFail, GLint stencilPass) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + + glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT); + checkGLcall("glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT)"); + GL_EXTCALL(glActiveStencilFaceEXT(face)); + checkGLcall("glActiveStencilFaceEXT(...)"); + glStencilFunc(func, ref, mask); + checkGLcall("glStencilFunc(...)"); + glStencilOp(stencilFail, depthFail, stencilPass); + checkGLcall("glStencilOp(...)"); +} + - static void state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_stencil(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + DWORD onesided_enable = FALSE; + DWORD twosided_enable = FALSE; + GLint func = GL_ALWAYS; + GLint func_ccw = GL_ALWAYS; + GLint ref = 0; + GLuint mask = 0; + GLint stencilFail = GL_KEEP; + GLint depthFail = GL_KEEP; + GLint stencilPass = GL_KEEP; + GLint stencilFail_ccw = GL_KEEP; + GLint depthFail_ccw = GL_KEEP; + GLint stencilPass_ccw = GL_KEEP; + + /* No stencil test without a stencil buffer. */ - if (!stateblock->device->depth_stencil) ++ if (!stateblock->device->fb.depth_stencil) + { + glDisable(GL_STENCIL_TEST); + checkGLcall("glDisable GL_STENCIL_TEST"); + return; + } + + onesided_enable = stateblock->state.render_states[WINED3DRS_STENCILENABLE]; + twosided_enable = stateblock->state.render_states[WINED3DRS_TWOSIDEDSTENCILMODE]; + if (!(func = CompareFunc(stateblock->state.render_states[WINED3DRS_STENCILFUNC]))) + func = GL_ALWAYS; + if (!(func_ccw = CompareFunc(stateblock->state.render_states[WINED3DRS_CCW_STENCILFUNC]))) + func_ccw = GL_ALWAYS; + ref = stateblock->state.render_states[WINED3DRS_STENCILREF]; + mask = stateblock->state.render_states[WINED3DRS_STENCILMASK]; + stencilFail = StencilOp(stateblock->state.render_states[WINED3DRS_STENCILFAIL]); + depthFail = StencilOp(stateblock->state.render_states[WINED3DRS_STENCILZFAIL]); + stencilPass = StencilOp(stateblock->state.render_states[WINED3DRS_STENCILPASS]); + stencilFail_ccw = StencilOp(stateblock->state.render_states[WINED3DRS_CCW_STENCILFAIL]); + depthFail_ccw = StencilOp(stateblock->state.render_states[WINED3DRS_CCW_STENCILZFAIL]); + stencilPass_ccw = StencilOp(stateblock->state.render_states[WINED3DRS_CCW_STENCILPASS]); + + TRACE("(onesided %d, twosided %d, ref %x, mask %x, " + "GL_FRONT: func: %x, fail %x, zfail %x, zpass %x " + "GL_BACK: func: %x, fail %x, zfail %x, zpass %x )\n", + onesided_enable, twosided_enable, ref, mask, + func, stencilFail, depthFail, stencilPass, + func_ccw, stencilFail_ccw, depthFail_ccw, stencilPass_ccw); + + if (twosided_enable && onesided_enable) { + glEnable(GL_STENCIL_TEST); + checkGLcall("glEnable GL_STENCIL_TEST"); + + if (gl_info->supported[EXT_STENCIL_TWO_SIDE]) + { + /* Apply back first, then front. This function calls glActiveStencilFaceEXT, + * which has an effect on the code below too. If we apply the front face + * afterwards, we are sure that the active stencil face is set to front, + * and other stencil functions which do not use two sided stencil do not have + * to set it back + */ + renderstate_stencil_twosided(context, GL_BACK, + func_ccw, ref, mask, stencilFail_ccw, depthFail_ccw, stencilPass_ccw); + renderstate_stencil_twosided(context, GL_FRONT, + func, ref, mask, stencilFail, depthFail, stencilPass); + } + else if (gl_info->supported[ATI_SEPARATE_STENCIL]) + { + GL_EXTCALL(glStencilFuncSeparateATI(func, func_ccw, ref, mask)); + checkGLcall("glStencilFuncSeparateATI(...)"); + GL_EXTCALL(glStencilOpSeparateATI(GL_FRONT, stencilFail, depthFail, stencilPass)); + checkGLcall("glStencilOpSeparateATI(GL_FRONT, ...)"); + GL_EXTCALL(glStencilOpSeparateATI(GL_BACK, stencilFail_ccw, depthFail_ccw, stencilPass_ccw)); + checkGLcall("glStencilOpSeparateATI(GL_BACK, ...)"); + } else { + ERR("Separate (two sided) stencil not supported on this version of opengl. Caps weren't honored?\n"); + } + } + else if(onesided_enable) + { + if (gl_info->supported[EXT_STENCIL_TWO_SIDE]) + { + glDisable(GL_STENCIL_TEST_TWO_SIDE_EXT); + checkGLcall("glDisable(GL_STENCIL_TEST_TWO_SIDE_EXT)"); + } + + /* This code disables the ATI extension as well, since the standard stencil functions are equal + * to calling the ATI functions with GL_FRONT_AND_BACK as face parameter + */ + glEnable(GL_STENCIL_TEST); + checkGLcall("glEnable GL_STENCIL_TEST"); + glStencilFunc(func, ref, mask); + checkGLcall("glStencilFunc(...)"); + glStencilOp(stencilFail, depthFail, stencilPass); + checkGLcall("glStencilOp(...)"); + } else { + glDisable(GL_STENCIL_TEST); + checkGLcall("glDisable GL_STENCIL_TEST"); + } +} + - static void state_stencilwrite2s(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_stencilwrite2s(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ - DWORD mask = stateblock->device->depth_stencil ? stateblock->state.render_states[WINED3DRS_STENCILWRITEMASK] : 0; ++ DWORD mask = stateblock->device->fb.depth_stencil ? stateblock->state.render_states[WINED3DRS_STENCILWRITEMASK] : 0; + const struct wined3d_gl_info *gl_info = context->gl_info; + + GL_EXTCALL(glActiveStencilFaceEXT(GL_BACK)); + checkGLcall("glActiveStencilFaceEXT(GL_BACK)"); + glStencilMask(mask); + checkGLcall("glStencilMask"); + GL_EXTCALL(glActiveStencilFaceEXT(GL_FRONT)); + checkGLcall("glActiveStencilFaceEXT(GL_FRONT)"); + glStencilMask(mask); +} + - static void state_stencilwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_stencilwrite(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ - DWORD mask = stateblock->device->depth_stencil ? stateblock->state.render_states[WINED3DRS_STENCILWRITEMASK] : 0; ++ DWORD mask = stateblock->device->fb.depth_stencil ? stateblock->state.render_states[WINED3DRS_STENCILWRITEMASK] : 0; + + glStencilMask(mask); + checkGLcall("glStencilMask"); +} + - static void state_fog_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_fog_vertexpart(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + + TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context); + + if (!stateblock->state.render_states[WINED3DRS_FOGENABLE]) return; + + /* Table fog on: Never use fog coords, and use per-fragment fog */ + if (stateblock->state.render_states[WINED3DRS_FOGTABLEMODE] != WINED3DFOG_NONE) + { + glHint(GL_FOG_HINT, GL_NICEST); + if(context->fog_coord) { + glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); + checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT)"); + context->fog_coord = FALSE; + } + return; + } + + /* Otherwise use per-vertex fog in any case */ + glHint(GL_FOG_HINT, GL_FASTEST); + + if (stateblock->state.render_states[WINED3DRS_FOGVERTEXMODE] == WINED3DFOG_NONE || context->last_was_rhw) + { + /* No fog at all, or transformed vertices: Use fog coord */ + if(!context->fog_coord) { + glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT); + checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT)"); + context->fog_coord = TRUE; + } + } else { + /* Otherwise, use the fragment depth */ + if(context->fog_coord) { + glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); + checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT)"); + context->fog_coord = FALSE; + } + } +} + - void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++void state_fogstartend(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + float fogstart, fogend; + union { + DWORD d; + float f; + } tmpvalue; + + switch(context->fog_source) { + case FOGSOURCE_VS: + fogstart = 1.0f; + fogend = 0.0f; + break; + + case FOGSOURCE_COORD: + fogstart = 255.0f; + fogend = 0.0f; + break; + + case FOGSOURCE_FFP: + tmpvalue.d = stateblock->state.render_states[WINED3DRS_FOGSTART]; + fogstart = tmpvalue.f; + tmpvalue.d = stateblock->state.render_states[WINED3DRS_FOGEND]; + fogend = tmpvalue.f; + /* In GL, fogstart == fogend disables fog, in D3D everything's fogged.*/ + if(fogstart == fogend) { + fogstart = -INFINITY; + fogend = 0.0f; + } + break; + + default: + /* This should not happen.context->fog_source is set in wined3d, not the app. + * Still this is needed to make the compiler happy + */ + ERR("Unexpected fog coordinate source\n"); + fogstart = 0.0f; + fogend = 0.0f; + } + + glFogf(GL_FOG_START, fogstart); + checkGLcall("glFogf(GL_FOG_START, fogstart)"); + TRACE("Fog Start == %f\n", fogstart); + + glFogf(GL_FOG_END, fogend); + checkGLcall("glFogf(GL_FOG_END, fogend)"); + TRACE("Fog End == %f\n", fogend); +} + - void state_fog_fragpart(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++void state_fog_fragpart(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_state *state = &stateblock->state; + enum fogsource new_source; + + TRACE("state_id %#x, stateblock %p, context %p\n", state_id, stateblock, context); + + if (!state->render_states[WINED3DRS_FOGENABLE]) + { + /* No fog? Disable it, and we're done :-) */ + glDisableWINE(GL_FOG); + checkGLcall("glDisable GL_FOG"); + return; + } + + /* Fog Rules: + * + * With fixed function vertex processing, Direct3D knows 2 different fog input sources. + * It can use the Z value of the vertex, or the alpha component of the specular color. + * This depends on the fog vertex, fog table and the vertex declaration. If the Z value + * is used, fogstart, fogend and the equation type are used, otherwise linear fog with + * start = 255, end = 0 is used. Obviously the msdn is not very clear on that. + * + * FOGTABLEMODE != NONE: + * The Z value is used, with the equation specified, no matter what vertex type. + * + * FOGTABLEMODE == NONE, FOGVERTEXMODE != NONE, untransformed: + * Per vertex fog is calculated using the specified fog equation and the parameters + * + * FOGTABLEMODE == NONE, FOGVERTEXMODE != NONE, transformed, OR + * FOGTABLEMODE == NONE, FOGVERTEXMODE == NONE, untransformed: + * Linear fog with start = 255.0, end = 0.0, input comes from the specular color + * + * + * Rules for vertex fog with shaders: + * + * When mixing fixed function functionality with the programmable pipeline, D3D expects + * the fog computation to happen during transformation while openGL expects it to happen + * during rasterization. Also, prior to pixel shader 3.0 D3D handles fog blending after + * the pixel shader while openGL always expects the pixel shader to handle the blending. + * To solve this problem, WineD3D does: + * 1) implement a linear fog equation and fog blending at the end of every pre 3.0 pixel + * shader, + * and 2) disables the fog computation (in either the fixed function or programmable + * rasterizer) if using a vertex program. + * + * D3D shaders can provide an explicit fog coordinate. This fog coordinate is used with + * D3DRS_FOGTABLEMODE==D3DFOG_NONE. The FOGVERTEXMODE is ignored, d3d always uses linear + * fog with start=1.0 and end=0.0 in this case. This is similar to fog coordinates in + * the specular color, a vertex shader counts as pretransformed geometry in this case. + * There are some GL differences between specular fog coords and vertex shaders though. + * + * With table fog the vertex shader fog coordinate is ignored. + * + * If a fogtablemode and a fogvertexmode are specified, table fog is applied (with or + * without shaders). + */ + + /* DX 7 sdk: "If both render states(vertex and table fog) are set to valid modes, + * the system will apply only pixel(=table) fog effects." + */ + if (state->render_states[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE) + { + if (use_vs(state)) + { + glFogi(GL_FOG_MODE, GL_LINEAR); + checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR)"); + new_source = FOGSOURCE_VS; + } + else + { + switch (state->render_states[WINED3DRS_FOGVERTEXMODE]) + { + /* If processed vertices are used, fall through to the NONE case */ + case WINED3DFOG_EXP: + if(!context->last_was_rhw) { + glFogi(GL_FOG_MODE, GL_EXP); + checkGLcall("glFogi(GL_FOG_MODE, GL_EXP)"); + new_source = FOGSOURCE_FFP; + break; + } + /* drop through */ + + case WINED3DFOG_EXP2: + if(!context->last_was_rhw) { + glFogi(GL_FOG_MODE, GL_EXP2); + checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2)"); + new_source = FOGSOURCE_FFP; + break; + } + /* drop through */ + + case WINED3DFOG_LINEAR: + if(!context->last_was_rhw) { + glFogi(GL_FOG_MODE, GL_LINEAR); + checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR)"); + new_source = FOGSOURCE_FFP; + break; + } + /* drop through */ + + case WINED3DFOG_NONE: + /* Both are none? According to msdn the alpha channel of the specular + * color contains a fog factor. Set it in drawStridedSlow. + * Same happens with Vertexfog on transformed vertices + */ + new_source = FOGSOURCE_COORD; + glFogi(GL_FOG_MODE, GL_LINEAR); + checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR)"); + break; + + default: + FIXME("Unexpected WINED3DRS_FOGVERTEXMODE %#x.\n", + state->render_states[WINED3DRS_FOGVERTEXMODE]); + new_source = FOGSOURCE_FFP; /* Make the compiler happy */ + } + } + } else { + new_source = FOGSOURCE_FFP; + + switch (state->render_states[WINED3DRS_FOGTABLEMODE]) + { + case WINED3DFOG_EXP: + glFogi(GL_FOG_MODE, GL_EXP); + checkGLcall("glFogi(GL_FOG_MODE, GL_EXP)"); + break; + + case WINED3DFOG_EXP2: + glFogi(GL_FOG_MODE, GL_EXP2); + checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2)"); + break; + + case WINED3DFOG_LINEAR: + glFogi(GL_FOG_MODE, GL_LINEAR); + checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR)"); + break; + + case WINED3DFOG_NONE: /* Won't happen */ + default: + FIXME("Unexpected WINED3DRS_FOGTABLEMODE %#x.\n", + state->render_states[WINED3DRS_FOGTABLEMODE]); + } + } + + glEnableWINE(GL_FOG); + checkGLcall("glEnable GL_FOG"); + if(new_source != context->fog_source) { + context->fog_source = new_source; + state_fogstartend(STATE_RENDER(WINED3DRS_FOGSTART), stateblock, context); + } +} + - static void state_rangefog_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_rangefog_w(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_RANGEFOGENABLE]) + WARN("Range fog enabled, but not supported by this opengl implementation\n"); +} + - static void state_rangefog(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_rangefog(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_RANGEFOGENABLE]) + { + glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_RADIAL_NV); + checkGLcall("glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_RADIAL_NV)"); + } else { + glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_PLANE_ABSOLUTE_NV); + checkGLcall("glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_PLANE_ABSOLUTE_NV)"); + } +} + - void state_fogcolor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++void state_fogcolor(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + float col[4]; + D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_FOGCOLOR], col); + glFogfv(GL_FOG_COLOR, &col[0]); + checkGLcall("glFog GL_FOG_COLOR"); +} + - void state_fogdensity(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++void state_fogdensity(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + union { + DWORD d; + float f; + } tmpvalue; + tmpvalue.d = stateblock->state.render_states[WINED3DRS_FOGDENSITY]; + glFogfv(GL_FOG_DENSITY, &tmpvalue.f); + checkGLcall("glFogf(GL_FOG_DENSITY, (float) Value)"); +} + - static void state_colormat(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_colormat(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_state *state = &stateblock->state; - IWineD3DDeviceImpl *device = stateblock->device; ++ struct wined3d_device *device = stateblock->device; + GLenum Parm = 0; + + /* Depends on the decoded vertex declaration to read the existence of diffuse data. + * The vertex declaration will call this function if the fixed function pipeline is used. + */ + + if(isStateDirty(context, STATE_VDECL)) { + return; + } + + context->num_untracked_materials = 0; + if ((device->strided_streams.use_map & (1 << WINED3D_FFP_DIFFUSE)) + && state->render_states[WINED3DRS_COLORVERTEX]) + { + TRACE("diff %d, amb %d, emis %d, spec %d\n", + state->render_states[WINED3DRS_DIFFUSEMATERIALSOURCE], + state->render_states[WINED3DRS_AMBIENTMATERIALSOURCE], + state->render_states[WINED3DRS_EMISSIVEMATERIALSOURCE], + state->render_states[WINED3DRS_SPECULARMATERIALSOURCE]); + + if (state->render_states[WINED3DRS_DIFFUSEMATERIALSOURCE] == WINED3DMCS_COLOR1) + { + if (state->render_states[WINED3DRS_AMBIENTMATERIALSOURCE] == WINED3DMCS_COLOR1) + Parm = GL_AMBIENT_AND_DIFFUSE; + else + Parm = GL_DIFFUSE; + if (state->render_states[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) + { + context->untracked_materials[context->num_untracked_materials] = GL_EMISSION; + context->num_untracked_materials++; + } + if (state->render_states[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) + { + context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR; + context->num_untracked_materials++; + } + } + else if (state->render_states[WINED3DRS_AMBIENTMATERIALSOURCE] == WINED3DMCS_COLOR1) + { + Parm = GL_AMBIENT; + if (state->render_states[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) + { + context->untracked_materials[context->num_untracked_materials] = GL_EMISSION; + context->num_untracked_materials++; + } + if (state->render_states[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) + { + context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR; + context->num_untracked_materials++; + } + } + else if (state->render_states[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) + { + Parm = GL_EMISSION; + if (state->render_states[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) + { + context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR; + context->num_untracked_materials++; + } + } + else if (state->render_states[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) + { + Parm = GL_SPECULAR; + } + } + + /* Nothing changed, return. */ + if (Parm == context->tracking_parm) return; + + if(!Parm) { + glDisable(GL_COLOR_MATERIAL); + checkGLcall("glDisable GL_COLOR_MATERIAL"); + } else { + glColorMaterial(GL_FRONT_AND_BACK, Parm); + checkGLcall("glColorMaterial(GL_FRONT_AND_BACK, Parm)"); + glEnable(GL_COLOR_MATERIAL); + checkGLcall("glEnable(GL_COLOR_MATERIAL)"); + } + + /* Apparently calls to glMaterialfv are ignored for properties we're + * tracking with glColorMaterial, so apply those here. */ + switch (context->tracking_parm) { + case GL_AMBIENT_AND_DIFFUSE: + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float *)&state->material.Ambient); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float *)&state->material.Diffuse); + checkGLcall("glMaterialfv"); + break; + + case GL_DIFFUSE: + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float *)&state->material.Diffuse); + checkGLcall("glMaterialfv"); + break; + + case GL_AMBIENT: + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float *)&state->material.Ambient); + checkGLcall("glMaterialfv"); + break; + + case GL_EMISSION: + glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float *)&state->material.Emissive); + checkGLcall("glMaterialfv"); + break; + + case GL_SPECULAR: + /* Only change material color if specular is enabled, otherwise it is set to black */ + if (state->render_states[WINED3DRS_SPECULARENABLE]) + { + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float *)&state->material.Specular); + checkGLcall("glMaterialfv"); + } else { + static const GLfloat black[] = {0.0f, 0.0f, 0.0f, 0.0f}; + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &black[0]); + checkGLcall("glMaterialfv"); + } + break; + } + + context->tracking_parm = Parm; +} + - static void state_linepattern(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_linepattern(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + union { + DWORD d; + WINED3DLINEPATTERN lp; + } tmppattern; + tmppattern.d = stateblock->state.render_states[WINED3DRS_LINEPATTERN]; + + TRACE("Line pattern: repeat %d bits %x\n", tmppattern.lp.wRepeatFactor, tmppattern.lp.wLinePattern); + + if (tmppattern.lp.wRepeatFactor) { + glLineStipple(tmppattern.lp.wRepeatFactor, tmppattern.lp.wLinePattern); + checkGLcall("glLineStipple(repeat, linepattern)"); + glEnable(GL_LINE_STIPPLE); + checkGLcall("glEnable(GL_LINE_STIPPLE);"); + } else { + glDisable(GL_LINE_STIPPLE); + checkGLcall("glDisable(GL_LINE_STIPPLE);"); + } +} + - static void state_zbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) - { - union { - DWORD d; - float f; - } tmpvalue; - - if (stateblock->state.render_states[WINED3DRS_ZBIAS]) - { - tmpvalue.d = stateblock->state.render_states[WINED3DRS_ZBIAS]; - TRACE("ZBias value %f\n", tmpvalue.f); - glPolygonOffset(0, -tmpvalue.f); - checkGLcall("glPolygonOffset(0, -Value)"); - glEnable(GL_POLYGON_OFFSET_FILL); - checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL);"); - glEnable(GL_POLYGON_OFFSET_LINE); - checkGLcall("glEnable(GL_POLYGON_OFFSET_LINE);"); - glEnable(GL_POLYGON_OFFSET_POINT); - checkGLcall("glEnable(GL_POLYGON_OFFSET_POINT);"); - } else { - glDisable(GL_POLYGON_OFFSET_FILL); - checkGLcall("glDisable(GL_POLYGON_OFFSET_FILL);"); - glDisable(GL_POLYGON_OFFSET_LINE); - checkGLcall("glDisable(GL_POLYGON_OFFSET_LINE);"); - glDisable(GL_POLYGON_OFFSET_POINT); - checkGLcall("glDisable(GL_POLYGON_OFFSET_POINT);"); - } - } - - - static void state_normalize(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_normalize(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if(isStateDirty(context, STATE_VDECL)) { + return; + } + /* Without vertex normals, we set the current normal to 0/0/0 to remove the diffuse factor + * from the opengl lighting equation, as d3d does. Normalization of 0/0/0 can lead to a division + * by zero and is not properly defined in opengl, so avoid it + */ + if (stateblock->state.render_states[WINED3DRS_NORMALIZENORMALS] + && (stateblock->device->strided_streams.use_map & (1 << WINED3D_FFP_NORMAL))) + { + glEnable(GL_NORMALIZE); + checkGLcall("glEnable(GL_NORMALIZE);"); + } else { + glDisable(GL_NORMALIZE); + checkGLcall("glDisable(GL_NORMALIZE);"); + } +} + - static void state_psizemin_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_psizemin_w(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + union { + DWORD d; + float f; + } tmpvalue; + + tmpvalue.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MIN]; + if (tmpvalue.f != 1.0f) + { + FIXME("WINED3DRS_POINTSIZE_MIN not supported on this opengl, value is %f\n", tmpvalue.f); + } + tmpvalue.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MAX]; + if (tmpvalue.f != 64.0f) + { + FIXME("WINED3DRS_POINTSIZE_MAX not supported on this opengl, value is %f\n", tmpvalue.f); + } + +} + - static void state_psizemin_ext(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_psizemin_ext(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + union + { + DWORD d; + float f; + } min, max; + + min.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MIN]; + max.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MAX]; + + /* Max point size trumps min point size */ + if(min.f > max.f) { + min.f = max.f; + } + + GL_EXTCALL(glPointParameterfEXT)(GL_POINT_SIZE_MIN_EXT, min.f); + checkGLcall("glPointParameterfEXT(...)"); + GL_EXTCALL(glPointParameterfEXT)(GL_POINT_SIZE_MAX_EXT, max.f); + checkGLcall("glPointParameterfEXT(...)"); +} + - static void state_psizemin_arb(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_psizemin_arb(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + union + { + DWORD d; + float f; + } min, max; + + min.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MIN]; + max.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MAX]; + + /* Max point size trumps min point size */ + if(min.f > max.f) { + min.f = max.f; + } + + GL_EXTCALL(glPointParameterfARB)(GL_POINT_SIZE_MIN_ARB, min.f); + checkGLcall("glPointParameterfARB(...)"); + GL_EXTCALL(glPointParameterfARB)(GL_POINT_SIZE_MAX_ARB, max.f); + checkGLcall("glPointParameterfARB(...)"); +} + - static void state_pscale(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_pscale(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + /* TODO: Group this with the viewport */ + /* + * POINTSCALEENABLE controls how point size value is treated. If set to + * true, the point size is scaled with respect to height of viewport. + * When set to false point size is in pixels. + */ + + /* Default values */ + GLfloat att[3] = {1.0f, 0.0f, 0.0f}; + union { + DWORD d; + float f; + } pointSize, A, B, C; + + pointSize.d = stateblock->state.render_states[WINED3DRS_POINTSIZE]; + A.d = stateblock->state.render_states[WINED3DRS_POINTSCALE_A]; + B.d = stateblock->state.render_states[WINED3DRS_POINTSCALE_B]; + C.d = stateblock->state.render_states[WINED3DRS_POINTSCALE_C]; + + if (stateblock->state.render_states[WINED3DRS_POINTSCALEENABLE]) + { + GLfloat scaleFactor; + DWORD h = stateblock->state.viewport.Height; + + if (pointSize.f < gl_info->limits.pointsize_min) + { + /* Minimum valid point size for OpenGL is driver specific. For Direct3D it is + * 0.0f. This means that OpenGL will clamp really small point sizes to the + * driver minimum. To correct for this we need to multiply by the scale factor when sizes + * are less than 1.0f. scale_factor = 1.0f / point_size. + */ + scaleFactor = pointSize.f / gl_info->limits.pointsize_min; + /* Clamp the point size, don't rely on the driver to do it. MacOS says min point size + * is 1.0, but then accepts points below that and draws too small points + */ + pointSize.f = gl_info->limits.pointsize_min; + } + else if(pointSize.f > gl_info->limits.pointsize_max) + { + /* gl already scales the input to glPointSize, + * d3d scales the result after the point size scale. + * If the point size is bigger than the max size, use the + * scaling to scale it bigger, and set the gl point size to max + */ + scaleFactor = pointSize.f / gl_info->limits.pointsize_max; + TRACE("scale: %f\n", scaleFactor); + pointSize.f = gl_info->limits.pointsize_max; + } else { + scaleFactor = 1.0f; + } + scaleFactor = powf(h * scaleFactor, 2); + + att[0] = A.f / scaleFactor; + att[1] = B.f / scaleFactor; + att[2] = C.f / scaleFactor; + } + + if (gl_info->supported[ARB_POINT_PARAMETERS]) + { + GL_EXTCALL(glPointParameterfvARB)(GL_POINT_DISTANCE_ATTENUATION_ARB, att); + checkGLcall("glPointParameterfvARB(GL_DISTANCE_ATTENUATION_ARB, ...)"); + } + else if (gl_info->supported[EXT_POINT_PARAMETERS]) + { + GL_EXTCALL(glPointParameterfvEXT)(GL_DISTANCE_ATTENUATION_EXT, att); + checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...)"); + } + else if(stateblock->state.render_states[WINED3DRS_POINTSCALEENABLE]) + { + WARN("POINT_PARAMETERS not supported in this version of opengl\n"); + } + + glPointSize(pointSize.f); + checkGLcall("glPointSize(...);"); +} + - static void state_debug_monitor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_debug_monitor(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + WARN("token: %#x\n", stateblock->state.render_states[WINED3DRS_DEBUGMONITORTOKEN]); +} + - static void state_colorwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_colorwrite(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + DWORD mask0 = stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE]; + DWORD mask1 = stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE1]; + DWORD mask2 = stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE2]; + DWORD mask3 = stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE3]; + + TRACE("Color mask: r(%d) g(%d) b(%d) a(%d)\n", + mask0 & WINED3DCOLORWRITEENABLE_RED ? 1 : 0, + mask0 & WINED3DCOLORWRITEENABLE_GREEN ? 1 : 0, + mask0 & WINED3DCOLORWRITEENABLE_BLUE ? 1 : 0, + mask0 & WINED3DCOLORWRITEENABLE_ALPHA ? 1 : 0); + glColorMask(mask0 & WINED3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE, + mask0 & WINED3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE, + mask0 & WINED3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE, + mask0 & WINED3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE); + checkGLcall("glColorMask(...)"); + + if (!((mask1 == mask0 && mask2 == mask0 && mask3 == mask0) + || (mask1 == 0xf && mask2 == 0xf && mask3 == 0xf))) + { + FIXME("WINED3DRS_COLORWRITEENABLE/1/2/3, %#x/%#x/%#x/%#x not yet implemented.\n", + mask0, mask1, mask2, mask3); + FIXME("Missing of cap D3DPMISCCAPS_INDEPENDENTWRITEMASKS wasn't honored?\n"); + } +} + +static void set_color_mask(const struct wined3d_gl_info *gl_info, UINT index, DWORD mask) +{ + GL_EXTCALL(glColorMaskIndexedEXT(index, + mask & WINED3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE, + mask & WINED3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE, + mask & WINED3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE, + mask & WINED3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE)); +} + - static void state_colorwrite0(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_colorwrite0(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + set_color_mask(context->gl_info, 0, stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE]); +} + - static void state_colorwrite1(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_colorwrite1(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + set_color_mask(context->gl_info, 1, stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE1]); +} + - static void state_colorwrite2(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_colorwrite2(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + set_color_mask(context->gl_info, 2, stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE2]); +} + - static void state_colorwrite3(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_colorwrite3(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + set_color_mask(context->gl_info, 3, stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE3]); +} + - static void state_localviewer(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_localviewer(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_LOCALVIEWER]) + { + glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); + checkGLcall("glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1)"); + } else { + glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0); + checkGLcall("glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0)"); + } +} + - static void state_lastpixel(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_lastpixel(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_LASTPIXEL]) + { + TRACE("Last Pixel Drawing Enabled\n"); + } else { + static BOOL warned; + if (!warned) { + FIXME("Last Pixel Drawing Disabled, not handled yet\n"); + warned = TRUE; + } else { + TRACE("Last Pixel Drawing Disabled, not handled yet\n"); + } + } +} + - static void state_pointsprite_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_pointsprite_w(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + static BOOL warned; + + /* TODO: NV_POINT_SPRITE */ + if (!warned && stateblock->state.render_states[WINED3DRS_POINTSPRITEENABLE]) + { + /* A FIXME, not a WARN because point sprites should be software emulated if not supported by HW */ + FIXME("Point sprites not supported\n"); + warned = TRUE; + } +} + - static void state_pointsprite(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_pointsprite(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; + + if (state->render_states[WINED3DRS_POINTSPRITEENABLE]) + { + static BOOL warned; + + if (gl_info->limits.point_sprite_units < gl_info->limits.textures && !warned) + { + if (use_ps(state) || state->lowest_disabled_stage > gl_info->limits.point_sprite_units) + { + FIXME("The app uses point sprite texture coordinates on more units than supported by the driver\n"); + warned = TRUE; + } + } + + glEnable(GL_POINT_SPRITE_ARB); + checkGLcall("glEnable(GL_POINT_SPRITE_ARB)"); + } else { + glDisable(GL_POINT_SPRITE_ARB); + checkGLcall("glDisable(GL_POINT_SPRITE_ARB)"); + } +} + - static void state_wrap(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_wrap(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + /** + http://www.cosc.brocku.ca/Offerings/3P98/course/lectures/texture/ + http://www.gamedev.net/reference/programming/features/rendererdll3/page2.asp + Discussion on the ways to turn on WRAPing to solve an OpenGL conversion problem. + http://www.flipcode.org/cgi-bin/fcmsg.cgi?thread_show=10248 + + so far as I can tell, wrapping and texture-coordinate generate go hand in hand, + */ + if (stateblock->state.render_states[WINED3DRS_WRAP0] + || stateblock->state.render_states[WINED3DRS_WRAP1] + || stateblock->state.render_states[WINED3DRS_WRAP2] + || stateblock->state.render_states[WINED3DRS_WRAP3] + || stateblock->state.render_states[WINED3DRS_WRAP4] + || stateblock->state.render_states[WINED3DRS_WRAP5] + || stateblock->state.render_states[WINED3DRS_WRAP6] + || stateblock->state.render_states[WINED3DRS_WRAP7] + || stateblock->state.render_states[WINED3DRS_WRAP8] + || stateblock->state.render_states[WINED3DRS_WRAP9] + || stateblock->state.render_states[WINED3DRS_WRAP10] + || stateblock->state.render_states[WINED3DRS_WRAP11] + || stateblock->state.render_states[WINED3DRS_WRAP12] + || stateblock->state.render_states[WINED3DRS_WRAP13] + || stateblock->state.render_states[WINED3DRS_WRAP14] + || stateblock->state.render_states[WINED3DRS_WRAP15]) + { + FIXME("(WINED3DRS_WRAP0) Texture wrapping not yet supported.\n"); + } +} + - static void state_msaa_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_msaa_w(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_MULTISAMPLEANTIALIAS]) + WARN("Multisample antialiasing not supported by gl\n"); +} + - static void state_msaa(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_msaa(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_MULTISAMPLEANTIALIAS]) + { + glEnable(GL_MULTISAMPLE_ARB); + checkGLcall("glEnable(GL_MULTISAMPLE_ARB)"); + } else { + glDisable(GL_MULTISAMPLE_ARB); + checkGLcall("glDisable(GL_MULTISAMPLE_ARB)"); + } +} + - static void state_scissor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_scissor(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_SCISSORTESTENABLE]) + { + glEnable(GL_SCISSOR_TEST); + checkGLcall("glEnable(GL_SCISSOR_TEST)"); + } else { + glDisable(GL_SCISSOR_TEST); + checkGLcall("glDisable(GL_SCISSOR_TEST)"); + } +} + +/* The Direct3D depth bias is specified in normalized depth coordinates. In + * OpenGL the bias is specified in units of "the smallest value that is + * guaranteed to produce a resolvable offset for a given implementation". To + * convert from D3D to GL we need to divide the D3D depth bias by that value. + * There's no practical way to retrieve that value from a given GL + * implementation, but the D3D application has essentially the same problem, - * which makes a guess of 1e-6f seem reasonable here. Note that - * SLOPESCALEDEPTHBIAS is a scaling factor for the depth slope, and doesn't - * need to be scaled. */ - static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++ * which makes a guess of the depth buffer format's highest possible value a ++ * reasonable guess. Note that SLOPESCALEDEPTHBIAS is a scaling factor for the ++ * depth slope, and doesn't need to be scaled. */ ++static void state_depthbias(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_SLOPESCALEDEPTHBIAS] + || stateblock->state.render_states[WINED3DRS_DEPTHBIAS]) + { ++ struct wined3d_surface *depth = stateblock->device->fb.depth_stencil; ++ float scale; ++ + union + { + DWORD d; + float f; + } scale_bias, const_bias; + + scale_bias.d = stateblock->state.render_states[WINED3DRS_SLOPESCALEDEPTHBIAS]; + const_bias.d = stateblock->state.render_states[WINED3DRS_DEPTHBIAS]; + + glEnable(GL_POLYGON_OFFSET_FILL); + checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL)"); + - glPolygonOffset(scale_bias.f, const_bias.f * 1e6f); ++ if (depth) ++ { ++ const struct wined3d_format *fmt = depth->resource.format; ++ scale = powf(2, fmt->depth_size) - 1; ++ TRACE("Depth format %s, using depthbias scale of %f\n", ++ debug_d3dformat(fmt->id), scale); ++ } ++ else ++ { ++ /* The context manager will reapply this state on a depth stencil change */ ++ TRACE("No depth stencil, using depthbias scale of 0.0\n"); ++ scale = 0; ++ } ++ ++ glPolygonOffset(scale_bias.f, const_bias.f * scale); + checkGLcall("glPolygonOffset(...)"); + } else { + glDisable(GL_POLYGON_OFFSET_FILL); + checkGLcall("glDisable(GL_POLYGON_OFFSET_FILL)"); + } +} + - static void state_zvisible(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_zvisible(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_ZVISIBLE]) + FIXME("WINED3DRS_ZVISIBLE not implemented.\n"); +} + - static void state_perspective(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_perspective(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_TEXTUREPERSPECTIVE]) + { + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + checkGLcall("glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)"); + } else { + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); + checkGLcall("glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST)"); + } +} + - static void state_stippledalpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_stippledalpha(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_STIPPLEDALPHA]) + FIXME(" Stippled Alpha not supported yet.\n"); +} + - static void state_antialias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_antialias(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_ANTIALIAS]) + FIXME("Antialias not supported yet.\n"); +} + - static void state_multisampmask(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_multisampmask(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_MULTISAMPLEMASK] != 0xffffffff) + FIXME("WINED3DRS_MULTISAMPLEMASK %#x not yet implemented.\n", + stateblock->state.render_states[WINED3DRS_MULTISAMPLEMASK]); +} + - static void state_patchedgestyle(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_patchedgestyle(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_PATCHEDGESTYLE] != WINED3DPATCHEDGE_DISCRETE) + FIXME("WINED3DRS_PATCHEDGESTYLE %#x not yet implemented.\n", + stateblock->state.render_states[WINED3DRS_PATCHEDGESTYLE]); +} + - static void state_patchsegments(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_patchsegments(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + union { + DWORD d; + float f; + } tmpvalue; + tmpvalue.f = 1.0f; + + if (stateblock->state.render_states[WINED3DRS_PATCHSEGMENTS] != tmpvalue.d) + { + static BOOL displayed = FALSE; + + tmpvalue.d = stateblock->state.render_states[WINED3DRS_PATCHSEGMENTS]; + if(!displayed) + FIXME("(WINED3DRS_PATCHSEGMENTS,%f) not yet implemented\n", tmpvalue.f); + + displayed = TRUE; + } +} + - static void state_positiondegree(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_positiondegree(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_POSITIONDEGREE] != WINED3DDEGREE_CUBIC) + FIXME("WINED3DRS_POSITIONDEGREE %#x not yet implemented.\n", + stateblock->state.render_states[WINED3DRS_POSITIONDEGREE]); +} + - static void state_normaldegree(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_normaldegree(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_NORMALDEGREE] != WINED3DDEGREE_LINEAR) + FIXME("WINED3DRS_NORMALDEGREE %#x not yet implemented.\n", + stateblock->state.render_states[WINED3DRS_NORMALDEGREE]); +} + - static void state_tessellation(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_tessellation(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_ENABLEADAPTIVETESSELLATION]) + FIXME("WINED3DRS_ENABLEADAPTIVETESSELLATION %#x not yet implemented.\n", + stateblock->state.render_states[WINED3DRS_ENABLEADAPTIVETESSELLATION]); +} + - static void state_nvdb(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_nvdb(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + union { + DWORD d; + float f; + } zmin, zmax; + + const struct wined3d_gl_info *gl_info = context->gl_info; + + if (stateblock->state.render_states[WINED3DRS_ADAPTIVETESS_X] == WINED3DFMT_NVDB) + { + zmin.d = stateblock->state.render_states[WINED3DRS_ADAPTIVETESS_Z]; + zmax.d = stateblock->state.render_states[WINED3DRS_ADAPTIVETESS_W]; + + /* If zmin is larger than zmax INVALID_VALUE error is generated. + * In d3d9 test is not performed in this case*/ + if (zmin.f <= zmax.f) + { + glEnable(GL_DEPTH_BOUNDS_TEST_EXT); + checkGLcall("glEnable(GL_DEPTH_BOUNDS_TEST_EXT)"); + GL_EXTCALL(glDepthBoundsEXT(zmin.f, zmax.f)); + checkGLcall("glDepthBoundsEXT(...)"); + } + else { + glDisable(GL_DEPTH_BOUNDS_TEST_EXT); + checkGLcall("glDisable(GL_DEPTH_BOUNDS_TEST_EXT)"); + } + } + else { + glDisable(GL_DEPTH_BOUNDS_TEST_EXT); + checkGLcall("glDisable(GL_DEPTH_BOUNDS_TEST_EXT)"); + } + + state_tessellation(state, stateblock, context); +} + - static void state_wrapu(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_wrapu(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_WRAPU]) + FIXME("Render state WINED3DRS_WRAPU not implemented yet.\n"); +} + - static void state_wrapv(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_wrapv(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_WRAPV]) + FIXME("Render state WINED3DRS_WRAPV not implemented yet.\n"); +} + - static void state_monoenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_monoenable(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_MONOENABLE]) + FIXME("Render state WINED3DRS_MONOENABLE not implemented yet.\n"); +} + - static void state_rop2(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_rop2(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_ROP2]) + FIXME("Render state WINED3DRS_ROP2 not implemented yet.\n"); +} + - static void state_planemask(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_planemask(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_PLANEMASK]) + FIXME("Render state WINED3DRS_PLANEMASK not implemented yet.\n"); +} + - static void state_subpixel(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_subpixel(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_SUBPIXEL]) + FIXME("Render state WINED3DRS_SUBPIXEL not implemented yet.\n"); +} + - static void state_subpixelx(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_subpixelx(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_SUBPIXELX]) + FIXME("Render state WINED3DRS_SUBPIXELX not implemented yet.\n"); +} + - static void state_stippleenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_stippleenable(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_STIPPLEENABLE]) + FIXME("Render state WINED3DRS_STIPPLEENABLE not implemented yet.\n"); +} + - static void state_mipmaplodbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_mipmaplodbias(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_MIPMAPLODBIAS]) + FIXME("Render state WINED3DRS_MIPMAPLODBIAS not implemented yet.\n"); +} + - static void state_anisotropy(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_anisotropy(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_ANISOTROPY]) + FIXME("Render state WINED3DRS_ANISOTROPY not implemented yet.\n"); +} + - static void state_flushbatch(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_flushbatch(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_FLUSHBATCH]) + FIXME("Render state WINED3DRS_FLUSHBATCH not implemented yet.\n"); +} + - static void state_translucentsi(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_translucentsi(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_TRANSLUCENTSORTINDEPENDENT]) + FIXME("Render state WINED3DRS_TRANSLUCENTSORTINDEPENDENT not implemented yet.\n"); +} + - static void state_extents(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_extents(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_EXTENTS]) + FIXME("Render state WINED3DRS_EXTENTS not implemented yet.\n"); +} + - static void state_ckeyblend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_ckeyblend(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_COLORKEYBLENDENABLE]) + FIXME("Render state WINED3DRS_COLORKEYBLENDENABLE not implemented yet.\n"); +} + - static void state_swvp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_swvp(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_SOFTWAREVERTEXPROCESSING]) + FIXME("Software vertex processing not implemented.\n"); +} + +/* Set texture operations up - The following avoids lots of ifdefs in this routine!*/ +#if defined (GL_VERSION_1_3) +# define useext(A) A +#elif defined (GL_EXT_texture_env_combine) +# define useext(A) A##_EXT +#elif defined (GL_ARB_texture_env_combine) +# define useext(A) A##_ARB +#endif + +static void get_src_and_opr(DWORD arg, BOOL is_alpha, GLenum* source, GLenum* operand) { + /* The WINED3DTA_ALPHAREPLICATE flag specifies the alpha component of the + * input should be used for all input components. The WINED3DTA_COMPLEMENT + * flag specifies the complement of the input should be used. */ + BOOL from_alpha = is_alpha || arg & WINED3DTA_ALPHAREPLICATE; + BOOL complement = arg & WINED3DTA_COMPLEMENT; + + /* Calculate the operand */ + if (complement) { + if (from_alpha) *operand = GL_ONE_MINUS_SRC_ALPHA; + else *operand = GL_ONE_MINUS_SRC_COLOR; + } else { + if (from_alpha) *operand = GL_SRC_ALPHA; + else *operand = GL_SRC_COLOR; + } + + /* Calculate the source */ + switch (arg & WINED3DTA_SELECTMASK) { + case WINED3DTA_CURRENT: *source = GL_PREVIOUS_EXT; break; + case WINED3DTA_DIFFUSE: *source = GL_PRIMARY_COLOR_EXT; break; + case WINED3DTA_TEXTURE: *source = GL_TEXTURE; break; + case WINED3DTA_TFACTOR: *source = GL_CONSTANT_EXT; break; + case WINED3DTA_SPECULAR: + /* + * According to the GL_ARB_texture_env_combine specs, SPECULAR is + * 'Secondary color' and isn't supported until base GL supports it + * There is no concept of temp registers as far as I can tell + */ + FIXME("Unhandled texture arg WINED3DTA_SPECULAR\n"); + *source = GL_TEXTURE; + break; + default: + FIXME("Unrecognized texture arg %#x\n", arg); + *source = GL_TEXTURE; + break; + } +} + +/* Setup the texture operations texture stage states */ +static void set_tex_op(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state, + BOOL isAlpha, int Stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) +{ + GLenum src1, src2, src3; + GLenum opr1, opr2, opr3; + GLenum comb_target; + GLenum src0_target, src1_target, src2_target; + GLenum opr0_target, opr1_target, opr2_target; + GLenum scal_target; + GLenum opr=0, invopr, src3_target, opr3_target; + BOOL Handled = FALSE; + + TRACE("Alpha?(%d), Stage:%d Op(%s), a1(%d), a2(%d), a3(%d)\n", isAlpha, Stage, debug_d3dtop(op), arg1, arg2, arg3); + + /* This is called by a state handler which has the gl lock held and a context for the thread */ + + /* Note: Operations usually involve two ars, src0 and src1 and are operations of + the form (a1 a2). However, some of the more complex operations + take 3 parameters. Instead of the (sensible) addition of a3, Microsoft added + in a third parameter called a0. Therefore these are operations of the form + a0 a1 a2, i.e., the new parameter goes to the front. + + However, below we treat the new (a0) parameter as src2/opr2, so in the actual + functions below, expect their syntax to differ slightly to those listed in the + manuals, i.e., replace arg1 with arg3, arg2 with arg1 and arg3 with arg2 + This affects WINED3DTOP_MULTIPLYADD and WINED3DTOP_LERP */ + + if (isAlpha) { + comb_target = useext(GL_COMBINE_ALPHA); + src0_target = useext(GL_SOURCE0_ALPHA); + src1_target = useext(GL_SOURCE1_ALPHA); + src2_target = useext(GL_SOURCE2_ALPHA); + opr0_target = useext(GL_OPERAND0_ALPHA); + opr1_target = useext(GL_OPERAND1_ALPHA); + opr2_target = useext(GL_OPERAND2_ALPHA); + scal_target = GL_ALPHA_SCALE; + } + else { + comb_target = useext(GL_COMBINE_RGB); + src0_target = useext(GL_SOURCE0_RGB); + src1_target = useext(GL_SOURCE1_RGB); + src2_target = useext(GL_SOURCE2_RGB); + opr0_target = useext(GL_OPERAND0_RGB); + opr1_target = useext(GL_OPERAND1_RGB); + opr2_target = useext(GL_OPERAND2_RGB); + scal_target = useext(GL_RGB_SCALE); + } + + /* If a texture stage references an invalid texture unit the stage just + * passes through the result from the previous stage */ + if (is_invalid_op(state, Stage, op, arg1, arg2, arg3)) + { + arg1 = WINED3DTA_CURRENT; + op = WINED3DTOP_SELECTARG1; + } + + if (isAlpha && !state->textures[Stage] && arg1 == WINED3DTA_TEXTURE) + { + get_src_and_opr(WINED3DTA_DIFFUSE, isAlpha, &src1, &opr1); + } else { + get_src_and_opr(arg1, isAlpha, &src1, &opr1); + } + get_src_and_opr(arg2, isAlpha, &src2, &opr2); + get_src_and_opr(arg3, isAlpha, &src3, &opr3); + + TRACE("ct(%x), 1:(%x,%x), 2:(%x,%x), 3:(%x,%x)\n", comb_target, src1, opr1, src2, opr2, src3, opr3); + + Handled = TRUE; /* Assume will be handled */ + + /* Other texture operations require special extensions: */ + if (gl_info->supported[NV_TEXTURE_ENV_COMBINE4]) + { + if (isAlpha) { + opr = GL_SRC_ALPHA; + invopr = GL_ONE_MINUS_SRC_ALPHA; + src3_target = GL_SOURCE3_ALPHA_NV; + opr3_target = GL_OPERAND3_ALPHA_NV; + } else { + opr = GL_SRC_COLOR; + invopr = GL_ONE_MINUS_SRC_COLOR; + src3_target = GL_SOURCE3_RGB_NV; + opr3_target = GL_OPERAND3_RGB_NV; + } + switch (op) { + case WINED3DTOP_DISABLE: /* Only for alpha */ + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, opr"); + break; + case WINED3DTOP_SELECTARG1: /* = a1 * 1 + 0 * 0 */ + case WINED3DTOP_SELECTARG2: /* = a2 * 1 + 0 * 0 */ + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + if (op == WINED3DTOP_SELECTARG1) { + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + } else { + glTexEnvi(GL_TEXTURE_ENV, src0_target, src2); + checkGLcall("GL_TEXTURE_ENV, src0_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2"); + } + glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, opr"); + break; + + case WINED3DTOP_MODULATE: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */ + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_MODULATE2X: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */ + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 2); + checkGLcall("GL_TEXTURE_ENV, scal_target, 2"); + break; + case WINED3DTOP_MODULATE4X: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */ + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 4); + checkGLcall("GL_TEXTURE_ENV, scal_target, 4"); + break; + + case WINED3DTOP_ADD: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + + case WINED3DTOP_ADDSIGNED: + glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)); + checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + + case WINED3DTOP_ADDSIGNED2X: + glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)); + checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 2); + checkGLcall("GL_TEXTURE_ENV, scal_target, 2"); + break; + + case WINED3DTOP_ADDSMOOTH: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, src1); + checkGLcall("GL_TEXTURE_ENV, src3_target, src1"); + switch (opr1) { + case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break; + case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + + case WINED3DTOP_BLENDDIFFUSEALPHA: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR)); + checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR)"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR)); + checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR)"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_BLENDTEXTUREALPHA: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_TEXTURE); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_TEXTURE"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_BLENDFACTORALPHA: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT)); + checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT)"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT)); + checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT)"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_BLENDTEXTUREALPHAPM: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_MODULATEALPHA_ADDCOLOR: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */ + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); /* a0 = src1/opr1 */ + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); /* a1 = 1 (see docs) */ + glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); /* a2 = arg2 */ + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); /* a3 = src1 alpha */ + glTexEnvi(GL_TEXTURE_ENV, src3_target, src1); + checkGLcall("GL_TEXTURE_ENV, src3_target, src1"); + switch (opr) { + case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_MODULATECOLOR_ADDALPHA: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src1); + checkGLcall("GL_TEXTURE_ENV, src2_target, src1"); + switch (opr1) { + case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, src1); + checkGLcall("GL_TEXTURE_ENV, src3_target, src1"); + switch (opr1) { + case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break; + case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + switch (opr1) { + case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break; + case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src1); + checkGLcall("GL_TEXTURE_ENV, src2_target, src1"); + switch (opr1) { + case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_MULTIPLYADD: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src3); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO); + checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src1); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src3_target, src2); + checkGLcall("GL_TEXTURE_ENV, src3_target, src3"); + glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + + case WINED3DTOP_BUMPENVMAP: + { + } + + case WINED3DTOP_BUMPENVMAPLUMINANCE: + FIXME("Implement bump environment mapping in GL_NV_texture_env_combine4 path\n"); + + default: + Handled = FALSE; + } + if (Handled) { + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV); + checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV"); + + return; + } + } /* GL_NV_texture_env_combine4 */ + + Handled = TRUE; /* Again, assume handled */ + switch (op) { + case WINED3DTOP_DISABLE: /* Only for alpha */ + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT); + checkGLcall("GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_SELECTARG1: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_SELECTARG2: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src2); + checkGLcall("GL_TEXTURE_ENV, src0_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_MODULATE: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_MODULATE2X: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 2); + checkGLcall("GL_TEXTURE_ENV, scal_target, 2"); + break; + case WINED3DTOP_MODULATE4X: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 4); + checkGLcall("GL_TEXTURE_ENV, scal_target, 4"); + break; + case WINED3DTOP_ADD: + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_ADDSIGNED: + glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)); + checkGLcall("GL_TEXTURE_ENV, comb_target, useext((GL_ADD_SIGNED)"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_ADDSIGNED2X: + glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)); + checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 2); + checkGLcall("GL_TEXTURE_ENV, scal_target, 2"); + break; + case WINED3DTOP_SUBTRACT: + if (gl_info->supported[ARB_TEXTURE_ENV_COMBINE]) + { + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_SUBTRACT); + checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_SUBTRACT)"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + } else { + FIXME("This version of opengl does not support GL_SUBTRACT\n"); + } + break; + + case WINED3DTOP_BLENDDIFFUSEALPHA: + glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)); + checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PRIMARY_COLOR)); + checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PRIMARY_COLOR"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_BLENDTEXTUREALPHA: + glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)); + checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_TEXTURE); + checkGLcall("GL_TEXTURE_ENV, src2_target, GL_TEXTURE"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_BLENDFACTORALPHA: + glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)); + checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_CONSTANT)); + checkGLcall("GL_TEXTURE_ENV, src2_target, GL_CONSTANT"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_BLENDCURRENTALPHA: + glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)); + checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PREVIOUS)); + checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PREVIOUS"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_DOTPRODUCT3: + if (gl_info->supported[ARB_TEXTURE_ENV_DOT3]) + { + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB"); + } + else if (gl_info->supported[EXT_TEXTURE_ENV_DOT3]) + { + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT"); + } else { + FIXME("This version of opengl does not support GL_DOT3\n"); + } + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_LERP: + glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)); + checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src2); + checkGLcall("GL_TEXTURE_ENV, src1_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src3); + checkGLcall("GL_TEXTURE_ENV, src2_target, src3"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr3); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr3"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; + case WINED3DTOP_ADDSMOOTH: + if (gl_info->supported[ATI_TEXTURE_ENV_COMBINE3]) + { + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + switch (opr1) { + case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break; + case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src1); + checkGLcall("GL_TEXTURE_ENV, src1_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + } else + Handled = FALSE; + break; + case WINED3DTOP_BLENDTEXTUREALPHAPM: + if (gl_info->supported[ATI_TEXTURE_ENV_COMBINE3]) + { + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_TEXTURE); + checkGLcall("GL_TEXTURE_ENV, src0_target, GL_TEXTURE"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_APHA"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src1); + checkGLcall("GL_TEXTURE_ENV, src1_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + } else + Handled = FALSE; + break; + case WINED3DTOP_MODULATEALPHA_ADDCOLOR: + if (gl_info->supported[ATI_TEXTURE_ENV_COMBINE3]) + { + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + switch (opr1) { + case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break; + case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src1); + checkGLcall("GL_TEXTURE_ENV, src1_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + } else + Handled = FALSE; + break; + case WINED3DTOP_MODULATECOLOR_ADDALPHA: + if (gl_info->supported[ATI_TEXTURE_ENV_COMBINE3]) + { + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src1); + checkGLcall("GL_TEXTURE_ENV, src1_target, src1"); + switch (opr1) { + case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break; + case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + } else + Handled = FALSE; + break; + case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR: + if (gl_info->supported[ATI_TEXTURE_ENV_COMBINE3]) + { + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + switch (opr1) { + case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break; + case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src1); + checkGLcall("GL_TEXTURE_ENV, src1_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + } else + Handled = FALSE; + break; + case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA: + if (gl_info->supported[ATI_TEXTURE_ENV_COMBINE3]) + { + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + switch (opr1) { + case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break; + case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src1); + checkGLcall("GL_TEXTURE_ENV, src1_target, src1"); + switch (opr1) { + case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break; + case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break; + case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break; + } + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + } else + Handled = FALSE; + break; + case WINED3DTOP_MULTIPLYADD: + if (gl_info->supported[ATI_TEXTURE_ENV_COMBINE3]) + { + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, src1_target, src3); + checkGLcall("GL_TEXTURE_ENV, src1_target, src3"); + glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr3); + checkGLcall("GL_TEXTURE_ENV, opr1_target, opr3"); + glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); + checkGLcall("GL_TEXTURE_ENV, src2_target, src2"); + glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2); + checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + } else + Handled = FALSE; + break; + case WINED3DTOP_BUMPENVMAPLUMINANCE: + case WINED3DTOP_BUMPENVMAP: + if (gl_info->supported[NV_TEXTURE_SHADER2]) + { + /* Technically texture shader support without register combiners is possible, but not expected to occur + * on real world cards, so for now a fixme should be enough + */ + FIXME("Implement bump mapping with GL_NV_texture_shader in non register combiner path\n"); + } + default: + Handled = FALSE; + } + + if (Handled) { + BOOL combineOK = TRUE; + if (gl_info->supported[NV_TEXTURE_ENV_COMBINE4]) + { + DWORD op2; + + if (isAlpha) + op2 = state->texture_states[Stage][WINED3DTSS_COLOROP]; + else + op2 = state->texture_states[Stage][WINED3DTSS_ALPHAOP]; + + /* Note: If COMBINE4 in effect can't go back to combine! */ + switch (op2) { + case WINED3DTOP_ADDSMOOTH: + case WINED3DTOP_BLENDTEXTUREALPHAPM: + case WINED3DTOP_MODULATEALPHA_ADDCOLOR: + case WINED3DTOP_MODULATECOLOR_ADDALPHA: + case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR: + case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA: + case WINED3DTOP_MULTIPLYADD: + /* Ignore those implemented in both cases */ + switch (op) { + case WINED3DTOP_SELECTARG1: + case WINED3DTOP_SELECTARG2: + combineOK = FALSE; + Handled = FALSE; + break; + default: + FIXME("Can't use COMBINE4 and COMBINE together, thisop=%s, otherop=%s, isAlpha(%d)\n", debug_d3dtop(op), debug_d3dtop(op2), isAlpha); + return; + } + } + } + + if (combineOK) { + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)); + checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)"); + + return; + } + } + + /* After all the extensions, if still unhandled, report fixme */ + FIXME("Unhandled texture operation %s\n", debug_d3dtop(op)); +} + + - static void tex_colorop(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void tex_colorop(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + DWORD stage = (state_id - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); + BOOL tex_used = stateblock->device->fixed_function_usage_map & (1 << stage); + DWORD mapped_stage = stateblock->device->texUnitMap[stage]; + const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; + + TRACE("Setting color op for stage %d\n", stage); + + /* Using a pixel shader? Don't care for anything here, the shader applying does it */ + if (use_ps(state)) return; + + if (stage != mapped_stage) WARN("Using non 1:1 mapping: %d -> %d!\n", stage, mapped_stage); + + if (mapped_stage != WINED3D_UNMAPPED_STAGE) + { + if (tex_used && mapped_stage >= gl_info->limits.textures) + { + FIXME("Attempt to enable unsupported stage!\n"); + return; + } + GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); + checkGLcall("glActiveTextureARB"); + } + + if (stage >= state->lowest_disabled_stage) + { + TRACE("Stage disabled\n"); + if (mapped_stage != WINED3D_UNMAPPED_STAGE) + { + /* Disable everything here */ + glDisable(GL_TEXTURE_2D); + checkGLcall("glDisable(GL_TEXTURE_2D)"); + glDisable(GL_TEXTURE_3D); + checkGLcall("glDisable(GL_TEXTURE_3D)"); + if (gl_info->supported[ARB_TEXTURE_CUBE_MAP]) + { + glDisable(GL_TEXTURE_CUBE_MAP_ARB); + checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)"); + } + if (gl_info->supported[ARB_TEXTURE_RECTANGLE]) + { + glDisable(GL_TEXTURE_RECTANGLE_ARB); + checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)"); + } + } + /* All done */ + return; + } + + /* The sampler will also activate the correct texture dimensions, so no + * need to do it here if the sampler for this stage is dirty. */ + if (!isStateDirty(context, STATE_SAMPLER(stage)) && tex_used) + texture_activate_dimensions(state->textures[stage], gl_info); + + set_tex_op(gl_info, state, FALSE, stage, + state->texture_states[stage][WINED3DTSS_COLOROP], + state->texture_states[stage][WINED3DTSS_COLORARG1], + state->texture_states[stage][WINED3DTSS_COLORARG2], + state->texture_states[stage][WINED3DTSS_COLORARG0]); +} + - void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++void tex_alphaop(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); + BOOL tex_used = stateblock->device->fixed_function_usage_map & (1 << stage); + DWORD mapped_stage = stateblock->device->texUnitMap[stage]; + const struct wined3d_gl_info *gl_info = context->gl_info; + DWORD op, arg1, arg2, arg0; + + TRACE("Setting alpha op for stage %d\n", stage); + /* Do not care for enabled / disabled stages, just assign the settings. colorop disables / enables required stuff */ + if (mapped_stage != WINED3D_UNMAPPED_STAGE) + { + if (tex_used && mapped_stage >= gl_info->limits.textures) + { + FIXME("Attempt to enable unsupported stage!\n"); + return; + } + GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); + checkGLcall("glActiveTextureARB"); + } + + op = stateblock->state.texture_states[stage][WINED3DTSS_ALPHAOP]; + arg1 = stateblock->state.texture_states[stage][WINED3DTSS_ALPHAARG1]; + arg2 = stateblock->state.texture_states[stage][WINED3DTSS_ALPHAARG2]; + arg0 = stateblock->state.texture_states[stage][WINED3DTSS_ALPHAARG0]; + + if (stateblock->state.render_states[WINED3DRS_COLORKEYENABLE] && !stage && stateblock->state.textures[0]) + { - IWineD3DBaseTextureImpl *texture = stateblock->state.textures[0]; - GLenum texture_dimensions = texture->baseTexture.target; ++ struct wined3d_texture *texture = stateblock->state.textures[0]; ++ GLenum texture_dimensions = texture->target; + + if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB) + { - IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0]; ++ struct wined3d_surface *surf = surface_from_resource(texture->sub_resources[0]); + + if (surf->CKeyFlags & WINEDDSD_CKSRCBLT && !surf->resource.format->alpha_mask) + { + /* Color keying needs to pass alpha values from the texture through to have the alpha test work + * properly. On the other hand applications can still use texture combiners apparently. This code + * takes care that apps cannot remove the texture's alpha channel entirely. + * + * The fixup is required for Prince of Persia 3D(prison bars), while Moto racer 2 requires + * D3DTOP_MODULATE to work on color keyed surfaces. Aliens vs Predator 1 uses color keyed textures + * and alpha component of diffuse color to draw things like translucent text and perform other + * blending effects. + * + * Aliens vs Predator 1 relies on diffuse alpha having an effect, so it cannot be ignored. To + * provide the behavior expected by the game, while emulating the colorkey, diffuse alpha must be + * modulated with texture alpha. OTOH, Moto racer 2 at some points sets alphaop/alphaarg to + * SELECTARG/CURRENT, yet puts garbage in diffuse alpha (zeroes). This works on native, because the + * game disables alpha test and alpha blending. Alpha test is overwritten by wine's for purposes of + * color-keying though, so this will lead to missing geometry if texture alpha is modulated (pixels + * fail alpha test). To get around this, ALPHABLENDENABLE state is checked: if the app enables alpha + * blending, it can be expected to provide meaningful values in diffuse alpha, so it should be + * modulated with texture alpha; otherwise, selecting diffuse alpha is ignored in favour of texture + * alpha. + * + * What to do with multitexturing? So far no app has been found that uses color keying with + * multitexturing */ + if (op == WINED3DTOP_DISABLE) + { + arg1 = WINED3DTA_TEXTURE; + op = WINED3DTOP_SELECTARG1; + } + else if(op == WINED3DTOP_SELECTARG1 && arg1 != WINED3DTA_TEXTURE) + { + if (stateblock->state.render_states[WINED3DRS_ALPHABLENDENABLE]) + { + arg2 = WINED3DTA_TEXTURE; + op = WINED3DTOP_MODULATE; + } + else arg1 = WINED3DTA_TEXTURE; + } + else if(op == WINED3DTOP_SELECTARG2 && arg2 != WINED3DTA_TEXTURE) + { + if (stateblock->state.render_states[WINED3DRS_ALPHABLENDENABLE]) + { + arg1 = WINED3DTA_TEXTURE; + op = WINED3DTOP_MODULATE; + } + else arg2 = WINED3DTA_TEXTURE; + } + } + } + } + + /* tex_alphaop is shared between the ffp and nvrc because the difference only comes down to + * this if block here, and the other code(color keying, texture unit selection) are the same + */ + TRACE("Setting alpha op for stage %d\n", stage); + if (gl_info->supported[NV_REGISTER_COMBINERS]) + { + set_tex_op_nvrc(gl_info, &stateblock->state, TRUE, stage, op, arg1, arg2, arg0, + mapped_stage, stateblock->state.texture_states[stage][WINED3DTSS_RESULTARG]); + } + else + { + set_tex_op(gl_info, &stateblock->state, TRUE, stage, op, arg1, arg2, arg0); + } +} + - static void transform_texture(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void transform_texture(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + DWORD texUnit = (state_id - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); + DWORD mapped_stage = stateblock->device->texUnitMap[texUnit]; + const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; + BOOL generated; + int coordIdx; + + /* Ignore this when a vertex shader is used, or if the streams aren't sorted out yet */ + if (use_vs(state) || isStateDirty(context, STATE_VDECL)) + { + TRACE("Using a vertex shader, or stream sources not sorted out yet, skipping\n"); + return; + } + + if (mapped_stage == WINED3D_UNMAPPED_STAGE) return; + if (mapped_stage >= gl_info->limits.textures) return; + + GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); + checkGLcall("glActiveTextureARB"); + generated = (state->texture_states[texUnit][WINED3DTSS_TEXCOORDINDEX] & 0xffff0000) != WINED3DTSS_TCI_PASSTHRU; + coordIdx = min(state->texture_states[texUnit][WINED3DTSS_TEXCOORDINDEX & 0x0000ffff], MAX_TEXTURES - 1); + + set_texture_matrix(&state->transforms[WINED3DTS_TEXTURE0 + texUnit].u.m[0][0], + state->texture_states[texUnit][WINED3DTSS_TEXTURETRANSFORMFLAGS], + generated, context->last_was_rhw, + stateblock->device->strided_streams.use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx)) + ? stateblock->device->strided_streams.elements[WINED3D_FFP_TEXCOORD0 + coordIdx].format->id + : WINED3DFMT_UNKNOWN, + stateblock->device->frag_pipe->ffp_proj_control); + + /* The sampler applying function calls us if this changes */ + if ((context->lastWasPow2Texture & (1 << texUnit)) && state->textures[texUnit]) + { + if(generated) { + FIXME("Non-power2 texture being used with generated texture coords\n"); + } + /* NP2 texcoord fixup is implemented for pixelshaders so only enable the + fixed-function-pipeline fixup via pow2Matrix when no PS is used. */ + if (!use_ps(state)) + { + TRACE("Non power two matrix multiply fixup\n"); - glMultMatrixf(state->textures[texUnit]->baseTexture.pow2Matrix); ++ glMultMatrixf(state->textures[texUnit]->pow2_matrix); + } + } +} + +static void unloadTexCoords(const struct wined3d_gl_info *gl_info) +{ + unsigned int texture_idx; + + for (texture_idx = 0; texture_idx < gl_info->limits.texture_stages; ++texture_idx) + { + GL_EXTCALL(glClientActiveTextureARB(GL_TEXTURE0_ARB + texture_idx)); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + } +} + - static void loadTexCoords(const struct wined3d_gl_info *gl_info, IWineD3DStateBlockImpl *stateblock, ++static void loadTexCoords(const struct wined3d_gl_info *gl_info, struct wined3d_stateblock *stateblock, + const struct wined3d_stream_info *si, GLuint *curVBO) +{ + unsigned int mapped_stage = 0; + unsigned int textureNo = 0; + + for (textureNo = 0; textureNo < gl_info->limits.texture_stages; ++textureNo) + { + int coordIdx = stateblock->state.texture_states[textureNo][WINED3DTSS_TEXCOORDINDEX]; + + mapped_stage = stateblock->device->texUnitMap[textureNo]; + if (mapped_stage == WINED3D_UNMAPPED_STAGE) continue; + + if (coordIdx < MAX_TEXTURES && (si->use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx)))) + { + const struct wined3d_stream_info_element *e = &si->elements[WINED3D_FFP_TEXCOORD0 + coordIdx]; + const struct wined3d_stream_state *stream = &stateblock->state.streams[e->stream_idx]; + + TRACE("Setting up texture %u, idx %d, cordindx %u, data %p\n", + textureNo, mapped_stage, coordIdx, e->data); + + if (*curVBO != e->buffer_object) + { + GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object)); + checkGLcall("glBindBufferARB"); + *curVBO = e->buffer_object; + } + + GL_EXTCALL(glClientActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); + checkGLcall("glClientActiveTextureARB"); + + /* The coords to supply depend completely on the fvf / vertex shader */ + glTexCoordPointer(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + } else { + GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + mapped_stage, 0, 0, 0, 1)); + } + } + if (gl_info->supported[NV_REGISTER_COMBINERS]) + { + /* The number of the mapped stages increases monotonically, so it's fine to use the last used one. */ + for (textureNo = mapped_stage + 1; textureNo < gl_info->limits.textures; ++textureNo) + { + GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + textureNo, 0, 0, 0, 1)); + } + } + + checkGLcall("loadTexCoords"); +} + - static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void tex_coordindex(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); + DWORD mapped_stage = stateblock->device->texUnitMap[stage]; + static const GLfloat s_plane[] = { 1.0f, 0.0f, 0.0f, 0.0f }; + static const GLfloat t_plane[] = { 0.0f, 1.0f, 0.0f, 0.0f }; + static const GLfloat r_plane[] = { 0.0f, 0.0f, 1.0f, 0.0f }; + static const GLfloat q_plane[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + const struct wined3d_gl_info *gl_info = context->gl_info; + + if (mapped_stage == WINED3D_UNMAPPED_STAGE) + { + TRACE("No texture unit mapped to stage %d. Skipping texture coordinates.\n", stage); + return; + } + + if (mapped_stage >= gl_info->limits.fragment_samplers) + { + WARN("stage %u not mapped to a valid texture unit (%u)\n", stage, mapped_stage); + return; + } + GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); + checkGLcall("glActiveTextureARB"); + + /* Values 0-7 are indexes into the FVF tex coords - See comments in DrawPrimitive + * + * FIXME: When using generated texture coordinates, the index value is used to specify the wrapping mode. + * eg. SetTextureStageState( 0, WINED3DTSS_TEXCOORDINDEX, WINED3DTSS_TCI_CAMERASPACEPOSITION | 1 ); + * means use the vertex position (camera-space) as the input texture coordinates + * for this texture stage, and the wrap mode set in the WINED3DRS_WRAP1 render + * state. We do not (yet) support the WINED3DRENDERSTATE_WRAPx values, nor tie them up + * to the TEXCOORDINDEX value + */ + switch (stateblock->state.texture_states[stage][WINED3DTSS_TEXCOORDINDEX] & 0xffff0000) + { + case WINED3DTSS_TCI_PASSTHRU: + /* Use the specified texture coordinates contained within the + * vertex format. This value resolves to zero. */ + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); + glDisable(GL_TEXTURE_GEN_R); + glDisable(GL_TEXTURE_GEN_Q); + checkGLcall("WINED3DTSS_TCI_PASSTHRU - Disable texgen."); + break; + + case WINED3DTSS_TCI_CAMERASPACEPOSITION: + /* CameraSpacePosition means use the vertex position, transformed to camera space, + * as the input texture coordinates for this stage's texture transformation. This + * equates roughly to EYE_LINEAR */ + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); + glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); + glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); + glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); + glPopMatrix(); + checkGLcall("WINED3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane."); + + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + checkGLcall("WINED3DTSS_TCI_CAMERASPACEPOSITION - Set texgen mode."); + + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glEnable(GL_TEXTURE_GEN_R); + checkGLcall("WINED3DTSS_TCI_CAMERASPACEPOSITION - Enable texgen."); + + break; + + case WINED3DTSS_TCI_CAMERASPACENORMAL: + /* Note that NV_TEXGEN_REFLECTION support is implied when + * ARB_TEXTURE_CUBE_MAP is supported */ + if (!gl_info->supported[NV_TEXGEN_REFLECTION]) + { + FIXME("WINED3DTSS_TCI_CAMERASPACENORMAL not supported.\n"); + break; + } + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); + glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); + glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); + glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); + glPopMatrix(); + checkGLcall("WINED3DTSS_TCI_CAMERASPACENORMAL - Set eye plane."); + + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); + glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV); + checkGLcall("WINED3DTSS_TCI_CAMERASPACENORMAL - Set texgen mode."); + + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glEnable(GL_TEXTURE_GEN_R); + checkGLcall("WINED3DTSS_TCI_CAMERASPACENORMAL - Enable texgen."); + + break; + + case WINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR: + /* Note that NV_TEXGEN_REFLECTION support is implied when + * ARB_TEXTURE_CUBE_MAP is supported */ + if (!gl_info->supported[NV_TEXGEN_REFLECTION]) + { + FIXME("WINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR not supported.\n"); + break; + } + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTexGenfv(GL_S, GL_EYE_PLANE, s_plane); + glTexGenfv(GL_T, GL_EYE_PLANE, t_plane); + glTexGenfv(GL_R, GL_EYE_PLANE, r_plane); + glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane); + glPopMatrix(); + checkGLcall("WINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR - Set eye plane."); + + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); + glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV); + checkGLcall("WINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR - Set texgen mode."); + + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glEnable(GL_TEXTURE_GEN_R); + checkGLcall("WINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR - Enable texgen."); + + break; + + case WINED3DTSS_TCI_SPHEREMAP: + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + checkGLcall("WINED3DTSS_TCI_SPHEREMAP - Set texgen mode."); + + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glDisable(GL_TEXTURE_GEN_R); + checkGLcall("WINED3DTSS_TCI_SPHEREMAP - Enable texgen."); + + break; + + default: + FIXME("Unhandled WINED3DTSS_TEXCOORDINDEX %#x.\n", + stateblock->state.texture_states[stage][WINED3DTSS_TEXCOORDINDEX]); + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); + glDisable(GL_TEXTURE_GEN_R); + glDisable(GL_TEXTURE_GEN_Q); + checkGLcall("Disable texgen."); + + break; + } + + /* Update the texture matrix */ + if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_TEXTURE0 + stage))) { + transform_texture(STATE_TEXTURESTAGE(stage, WINED3DTSS_TEXTURETRANSFORMFLAGS), stateblock, context); + } + + if(!isStateDirty(context, STATE_VDECL) && context->namedArraysLoaded) { + /* Reload the arrays if we are using fixed function arrays to reflect the selected coord input + * source. Call loadTexCoords directly because there is no need to reparse the vertex declaration + * and do all the things linked to it + * TODO: Tidy that up to reload only the arrays of the changed unit + */ + GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0; + + unloadTexCoords(gl_info); + loadTexCoords(gl_info, stateblock, &stateblock->device->strided_streams, &curVBO); + } +} + - static void shaderconstant(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void shaderconstant(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_state *state = &stateblock->state; - IWineD3DDeviceImpl *device = stateblock->device; ++ struct wined3d_device *device = stateblock->device; + + /* Vertex and pixel shader states will call a shader upload, don't do anything as long one of them + * has an update pending + */ + if(isStateDirty(context, STATE_VDECL) || + isStateDirty(context, STATE_PIXELSHADER)) { + return; + } + + device->shader_backend->shader_load_constants(context, use_ps(state), use_vs(state)); +} + - static void tex_bumpenvlscale(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void tex_bumpenvlscale(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); - IWineD3DPixelShaderImpl *ps = stateblock->state.pixel_shader; ++ const struct wined3d_shader *ps = stateblock->state.pixel_shader; + - if (ps && stage && (ps->baseShader.reg_maps.luminanceparams & (1 << stage))) ++ if (ps && stage && (ps->reg_maps.luminanceparams & (1 << stage))) + { + /* The pixel shader has to know the luminance scale. Do a constants update if it + * isn't scheduled anyway + */ + if(!isStateDirty(context, STATE_PIXELSHADERCONSTANT) && + !isStateDirty(context, STATE_PIXELSHADER)) { + shaderconstant(STATE_PIXELSHADERCONSTANT, stateblock, context); + } + } +} + - static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void sampler_texmatrix(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const DWORD sampler = state - STATE_SAMPLER(0); - IWineD3DBaseTextureImpl *texture = stateblock->state.textures[sampler]; ++ struct wined3d_texture *texture = stateblock->state.textures[sampler]; + + TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context); + + if(!texture) return; + /* The fixed function np2 texture emulation uses the texture matrix to fix up the coordinates - * basetexture_apply_state_changes() multiplies the set matrix with a fixup matrix. Before the ++ * wined3d_texture_apply_state_changes() multiplies the set matrix with a fixup matrix. Before the + * scaling is reapplied or removed, the texture matrix has to be reapplied + * + * The mapped stage is already active because the sampler() function below, which is part of the + * misc pipeline + */ - if(sampler < MAX_TEXTURES) { - const BOOL texIsPow2 = !texture->baseTexture.pow2Matrix_identity; ++ if (sampler < MAX_TEXTURES) ++ { ++ const BOOL texIsPow2 = !(texture->flags & WINED3D_TEXTURE_POW2_MAT_IDENT); + + if (texIsPow2 || (context->lastWasPow2Texture & (1 << sampler))) + { + if (texIsPow2) context->lastWasPow2Texture |= 1 << sampler; + else context->lastWasPow2Texture &= ~(1 << sampler); + transform_texture(STATE_TEXTURESTAGE(stateblock->device->texUnitMap[sampler], + WINED3DTSS_TEXTURETRANSFORMFLAGS), stateblock, context); + } + } +} + - static void sampler(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void sampler(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + DWORD sampler = state_id - STATE_SAMPLER(0); - DWORD mapped_stage = stateblock->device->texUnitMap[sampler]; ++ struct wined3d_device *device = stateblock->device; ++ DWORD mapped_stage = device->texUnitMap[sampler]; + const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; + union { + float f; + DWORD d; + } tmpvalue; + + TRACE("Sampler: %d\n", sampler); + /* Enabling and disabling texture dimensions is done by texture stage state / pixel shader setup, this function + * only has to bind textures and set the per texture states + */ + + if (mapped_stage == WINED3D_UNMAPPED_STAGE) + { + TRACE("No sampler mapped to stage %d. Returning.\n", sampler); + return; + } + + if (mapped_stage >= gl_info->limits.combined_samplers) + { + return; + } + GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); + checkGLcall("glActiveTextureARB"); + + if (state->textures[sampler]) + { - IWineD3DBaseTexture *texture = (IWineD3DBaseTexture *)state->textures[sampler]; ++ struct wined3d_texture *texture = state->textures[sampler]; + BOOL srgb = state->sampler_states[sampler][WINED3DSAMP_SRGBTEXTURE]; + - IWineD3DBaseTexture_BindTexture(texture, srgb); - basetexture_apply_state_changes(texture, - state->texture_states[sampler], - state->sampler_states[sampler], gl_info); ++ texture->texture_ops->texture_bind(texture, gl_info, srgb); ++ wined3d_texture_apply_state_changes(texture, state->sampler_states[sampler], gl_info); + + if (gl_info->supported[EXT_TEXTURE_LOD_BIAS]) + { + tmpvalue.d = state->sampler_states[sampler][WINED3DSAMP_MIPMAPLODBIAS]; + glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, + GL_TEXTURE_LOD_BIAS_EXT, + tmpvalue.f); - checkGLcall("glTexEnvi(GL_TEXTURE_LOD_BIAS_EXT, ...)"); ++ checkGLcall("glTexEnvf(GL_TEXTURE_LOD_BIAS_EXT, ...)"); + } + + if (!use_ps(state) && sampler < state->lowest_disabled_stage) + { + if (state->render_states[WINED3DRS_COLORKEYENABLE] && !sampler) + { + /* If color keying is enabled update the alpha test, it depends on the existence + * of a color key in stage 0 + */ + state_alpha(WINED3DRS_COLORKEYENABLE, stateblock, context); + } + } + + /* Trigger shader constant reloading (for NP2 texcoord fixup) */ - if (!state->textures[sampler]->baseTexture.pow2Matrix_identity) - { - IWineD3DDeviceImpl *d3ddevice = stateblock->device; - d3ddevice->shader_backend->shader_load_np2fixup_constants( - (IWineD3DDevice*)d3ddevice, use_ps(state), use_vs(state)); - } ++ if (!(texture->flags & WINED3D_TEXTURE_POW2_MAT_IDENT)) ++ device->shader_backend->shader_load_np2fixup_constants(device->shader_priv, gl_info, state); + } + else if (mapped_stage < gl_info->limits.textures) + { + if (sampler < state->lowest_disabled_stage) + { + /* TODO: What should I do with pixel shaders here ??? */ + if (state->render_states[WINED3DRS_COLORKEYENABLE] && !sampler) + { + /* If color keying is enabled update the alpha test, it depends on the existence + * of a color key in stage 0 + */ + state_alpha(WINED3DRS_COLORKEYENABLE, stateblock, context); + } + } /* Otherwise tex_colorop disables the stage */ - glBindTexture(GL_TEXTURE_2D, stateblock->device->dummyTextureName[sampler]); - checkGLcall("glBindTexture(GL_TEXTURE_2D, stateblock->device->dummyTextureName[sampler])"); ++ glBindTexture(GL_TEXTURE_2D, device->dummyTextureName[sampler]); ++ checkGLcall("glBindTexture(GL_TEXTURE_2D, device->dummyTextureName[sampler])"); + } +} + - void apply_pixelshader(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++void apply_pixelshader(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_state *state = &stateblock->state; - IWineD3DDeviceImpl *device = stateblock->device; ++ struct wined3d_device *device = stateblock->device; + BOOL use_vshader = use_vs(state); + BOOL use_pshader = use_ps(state); + unsigned int i; + + if (use_pshader) { + if(!context->last_was_pshader) { + /* Former draw without a pixel shader, some samplers + * may be disabled because of WINED3DTSS_COLOROP = WINED3DTOP_DISABLE + * make sure to enable them + */ + for(i=0; i < MAX_FRAGMENT_SAMPLERS; i++) { + if(!isStateDirty(context, STATE_SAMPLER(i))) { + sampler(STATE_SAMPLER(i), stateblock, context); + } + } + context->last_was_pshader = TRUE; + } else { + /* Otherwise all samplers were activated by the code above in earlier draws, or by sampler() + * if a different texture was bound. I don't have to do anything. + */ + } + } else { + /* Disabled the pixel shader - color ops weren't applied + * while it was enabled, so re-apply them. */ + for (i = 0; i < context->gl_info->limits.texture_stages; ++i) + { + if (!isStateDirty(context, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP))) + stateblock_apply_state(STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), stateblock, context); + } + context->last_was_pshader = FALSE; + } + + if(!isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) { + device->shader_backend->shader_select(context, use_pshader, use_vshader); + + if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vshader || use_pshader)) { + shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock, context); + } + } +} + - static void shader_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void shader_bumpenvmat(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); - IWineD3DPixelShaderImpl *ps = stateblock->state.pixel_shader; ++ const struct wined3d_shader *ps = stateblock->state.pixel_shader; + - if (ps && stage && (ps->baseShader.reg_maps.bumpmat & (1 << stage))) ++ if (ps && stage && (ps->reg_maps.bumpmat & (1 << stage))) + { + /* The pixel shader has to know the bump env matrix. Do a constants update if it isn't scheduled + * anyway + */ + if(!isStateDirty(context, STATE_PIXELSHADERCONSTANT) && + !isStateDirty(context, STATE_PIXELSHADER)) { + shaderconstant(STATE_PIXELSHADERCONSTANT, stateblock, context); + } + } +} + - static void transform_world(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void transform_world(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + /* This function is called by transform_view below if the view matrix was changed too + * + * Deliberately no check if the vertex declaration is dirty because the vdecl state + * does not always update the world matrix, only on a switch between transformed + * and untransformed draws. It *may* happen that the world matrix is set 2 times during one + * draw, but that should be rather rare and cheaper in total. + */ + glMatrixMode(GL_MODELVIEW); + checkGLcall("glMatrixMode"); + + if(context->last_was_rhw) { + glLoadIdentity(); + checkGLcall("glLoadIdentity()"); + } else { + /* In the general case, the view matrix is the identity matrix */ + if (stateblock->device->view_ident) + { + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]); + checkGLcall("glLoadMatrixf"); + } + else + { + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]); + checkGLcall("glLoadMatrixf"); + glMultMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]); + checkGLcall("glMultMatrixf"); + } + } +} + - static void clipplane(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void clipplane(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_state *state = &stateblock->state; + UINT index = state_id - STATE_CLIPPLANE(0); + + if (isStateDirty(context, STATE_TRANSFORM(WINED3DTS_VIEW)) || index >= context->gl_info->limits.clipplanes) + { + return; + } + ++ glMatrixMode(GL_MODELVIEW); ++ glPushMatrix(); ++ + /* Clip Plane settings are affected by the model view in OpenGL, the View transform in direct3d */ + if (!use_vs(state)) - { - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); + glLoadMatrixf(&state->transforms[WINED3DTS_VIEW].u.m[0][0]); - } + else - { + /* with vertex shaders, clip planes are not transformed in direct3d, + * in OpenGL they are still transformed by the model view. - * Use this to swap the y coordinate if necessary + */ - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); + glLoadIdentity(); - if (context->render_offscreen) glScalef(1.0f, -1.0f, 1.0f); - } + + TRACE("Clipplane [%.8e, %.8e, %.8e, %.8e]\n", + state->clip_planes[index][0], + state->clip_planes[index][1], + state->clip_planes[index][2], + state->clip_planes[index][3]); + glClipPlane(GL_CLIP_PLANE0 + index, state->clip_planes[index]); + checkGLcall("glClipPlane"); + + glPopMatrix(); +} + - static void transform_worldex(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void transform_worldex(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + UINT matrix = state - STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)); + GLenum glMat; + TRACE("Setting world matrix %d\n", matrix); + + if (matrix >= context->gl_info->limits.blends) + { + WARN("Unsupported blend matrix set\n"); + return; + } else if(isStateDirty(context, STATE_TRANSFORM(WINED3DTS_VIEW))) { + return; + } + + /* GL_MODELVIEW0_ARB: 0x1700 + * GL_MODELVIEW1_ARB: 0x850a + * GL_MODELVIEW2_ARB: 0x8722 + * GL_MODELVIEW3_ARB: 0x8723 + * etc + * GL_MODELVIEW31_ARB: 0x873F + */ + if(matrix == 1) glMat = GL_MODELVIEW1_ARB; + else glMat = GL_MODELVIEW2_ARB - 2 + matrix; + + glMatrixMode(glMat); + checkGLcall("glMatrixMode(glMat)"); + + /* World matrix 0 is multiplied with the view matrix because d3d uses 3 matrices while gl uses only 2. To avoid + * weighting the view matrix incorrectly it has to be multiplied into every gl modelview matrix + */ + if (stateblock->device->view_ident) + { + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(matrix)].u.m[0][0]); + checkGLcall("glLoadMatrixf"); + } + else + { + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]); + checkGLcall("glLoadMatrixf"); + glMultMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(matrix)].u.m[0][0]); + checkGLcall("glMultMatrixf"); + } +} + - static void state_vertexblend_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_vertexblend_w(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + WINED3DVERTEXBLENDFLAGS f = stateblock->state.render_states[WINED3DRS_VERTEXBLEND]; + static unsigned int once; + + if (f == WINED3DVBF_DISABLE) return; + + if (!once++) FIXME("Vertex blend flags %#x not supported.\n", f); + else WARN("Vertex blend flags %#x not supported.\n", f); +} + - static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void state_vertexblend(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + WINED3DVERTEXBLENDFLAGS val = stateblock->state.render_states[WINED3DRS_VERTEXBLEND]; + const struct wined3d_gl_info *gl_info = context->gl_info; + static unsigned int once; + + switch(val) { + case WINED3DVBF_1WEIGHTS: + case WINED3DVBF_2WEIGHTS: + case WINED3DVBF_3WEIGHTS: + glEnable(GL_VERTEX_BLEND_ARB); + checkGLcall("glEnable(GL_VERTEX_BLEND_ARB)"); + + /* D3D adds one more matrix which has weight (1 - sum(weights)). This is enabled at context + * creation with enabling GL_WEIGHT_SUM_UNITY_ARB. + */ + GL_EXTCALL(glVertexBlendARB(stateblock->state.render_states[WINED3DRS_VERTEXBLEND] + 1)); + + if (!stateblock->device->vertexBlendUsed) + { + unsigned int i; + for (i = 1; i < gl_info->limits.blends; ++i) + { + if (!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(i)))) + { + transform_worldex(STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(i)), stateblock, context); + } + } + stateblock->device->vertexBlendUsed = TRUE; + } + break; + + case WINED3DVBF_TWEENING: + case WINED3DVBF_0WEIGHTS: /* Indexed vertex blending, not supported. */ + if (!once++) FIXME("Vertex blend flags %#x not supported.\n", val); + else WARN("Vertex blend flags %#x not supported.\n", val); + /* Fall through. */ + case WINED3DVBF_DISABLE: + glDisable(GL_VERTEX_BLEND_ARB); + checkGLcall("glDisable(GL_VERTEX_BLEND_ARB)"); + break; + } +} + - static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void transform_view(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_light_info *light = NULL; + unsigned int k; + + /* If we are changing the View matrix, reset the light and clipping planes to the new view + * NOTE: We have to reset the positions even if the light/plane is not currently + * enabled, since the call to enable it will not reset the position. + * NOTE2: Apparently texture transforms do NOT need reapplying + */ + + glMatrixMode(GL_MODELVIEW); + checkGLcall("glMatrixMode(GL_MODELVIEW)"); + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]); + checkGLcall("glLoadMatrixf(...)"); + + /* Reset lights. TODO: Call light apply func */ - for (k = 0; k < stateblock->device->maxConcurrentLights; ++k) ++ for (k = 0; k < gl_info->limits.lights; ++k) + { + light = stateblock->state.lights[k]; + if(!light) continue; + glLightfv(GL_LIGHT0 + light->glIndex, GL_POSITION, light->lightPosn); + checkGLcall("glLightfv posn"); + glLightfv(GL_LIGHT0 + light->glIndex, GL_SPOT_DIRECTION, light->lightDirn); + checkGLcall("glLightfv dirn"); + } + + /* Reset Clipping Planes */ + for (k = 0; k < gl_info->limits.clipplanes; ++k) + { + if(!isStateDirty(context, STATE_CLIPPLANE(k))) { + clipplane(STATE_CLIPPLANE(k), stateblock, context); + } + } + + if(context->last_was_rhw) { + glLoadIdentity(); + checkGLcall("glLoadIdentity()"); + /* No need to update the world matrix, the identity is fine */ + return; + } + + /* Call the world matrix state, this will apply the combined WORLD + VIEW matrix + * No need to do it here if the state is scheduled for update. + */ + if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)))) { + transform_world(STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)), stateblock, context); + } + + /* Avoid looping over a number of matrices if the app never used the functionality */ + if (stateblock->device->vertexBlendUsed) + { + for (k = 1; k < gl_info->limits.blends; ++k) + { + if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(k)))) { + transform_worldex(STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(k)), stateblock, context); + } + } + } +} + - static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void transform_projection(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + glMatrixMode(GL_PROJECTION); + checkGLcall("glMatrixMode(GL_PROJECTION)"); + glLoadIdentity(); + checkGLcall("glLoadIdentity"); + + if (context->last_was_rhw) + { + double x = stateblock->state.viewport.X; + double y = stateblock->state.viewport.Y; + double w = stateblock->state.viewport.Width; + double h = stateblock->state.viewport.Height; + + TRACE("Calling glOrtho with x %.8e, y %.8e, w %.8e, h %.8e.\n", x, y, w, h); + if (context->render_offscreen) + glOrtho(x, x + w, -y, -y - h, 0.0, -1.0); + else + glOrtho(x, x + w, y + h, y, 0.0, -1.0); + checkGLcall("glOrtho"); + + /* D3D texture coordinates are flipped compared to OpenGL ones, so + * render everything upside down when rendering offscreen. */ + if (context->render_offscreen) + { + glScalef(1.0f, -1.0f, 1.0f); + checkGLcall("glScalef"); + } + + /* Window Coord 0 is the middle of the first pixel, so translate by 1/2 pixels */ + glTranslatef(63.0f / 128.0f, 63.0f / 128.0f, 0.0f); + checkGLcall("glTranslatef(63.0f / 128.0f, 63.0f / 128.0f, 0.0f)"); + } + else + { + /* The rule is that the window coordinate 0 does not correspond to the + beginning of the first pixel, but the center of the first pixel. + As a consequence if you want to correctly draw one line exactly from + the left to the right end of the viewport (with all matrices set to + be identity), the x coords of both ends of the line would be not + -1 and 1 respectively but (-1-1/viewport_widh) and (1-1/viewport_width) + instead. + + 1.0 / Width is used because the coord range goes from -1.0 to 1.0, then we + divide by the Width/Height, so we need the half range(1.0) to translate by + half a pixel. + + The other fun is that d3d's output z range after the transformation is [0;1], + but opengl's is [-1;1]. Since the z buffer is in range [0;1] for both, gl + scales [-1;1] to [0;1]. This would mean that we end up in [0.5;1] and loose a lot + of Z buffer precision and the clear values do not match in the z test. Thus scale + [0;1] to [-1;1], so when gl undoes that we utilize the full z range + */ + + /* + * Careful with the order of operations here, we're essentially working backwards: + * x = x + 1/w; + * y = (y - 1/h) * flip; + * z = z * 2 - 1; + * + * Becomes: + * glTranslatef(0.0, 0.0, -1.0); + * glScalef(1.0, 1.0, 2.0); + * + * glScalef(1.0, flip, 1.0); + * glTranslatef(1/w, -1/h, 0.0); + * + * This is equivalent to: + * glTranslatef(1/w, -flip/h, -1.0) + * glScalef(1.0, flip, 2.0); + */ + + /* Translate by slightly less than a half pixel to force a top-left + * filling convention. We want the difference to be large enough that + * it doesn't get lost due to rounding inside the driver, but small + * enough to prevent it from interfering with any anti-aliasing. */ + GLfloat xoffset = (63.0f / 64.0f) / stateblock->state.viewport.Width; + GLfloat yoffset = -(63.0f / 64.0f) / stateblock->state.viewport.Height; + + if (context->render_offscreen) + { + /* D3D texture coordinates are flipped compared to OpenGL ones, so + * render everything upside down when rendering offscreen. */ + glTranslatef(xoffset, -yoffset, -1.0f); + checkGLcall("glTranslatef(xoffset, -yoffset, -1.0f)"); + glScalef(1.0f, -1.0f, 2.0f); + } else { + glTranslatef(xoffset, yoffset, -1.0f); + checkGLcall("glTranslatef(xoffset, yoffset, -1.0f)"); + glScalef(1.0f, 1.0f, 2.0f); + } + checkGLcall("glScalef"); + + glMultMatrixf(&stateblock->state.transforms[WINED3DTS_PROJECTION].u.m[0][0]); + checkGLcall("glLoadMatrixf"); + } +} + +/* This should match any arrays loaded in loadVertexData. + * TODO: Only load / unload arrays if we have to. + */ +static inline void unloadVertexData(const struct wined3d_gl_info *gl_info) +{ + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + if (gl_info->supported[EXT_SECONDARY_COLOR]) + { + glDisableClientState(GL_SECONDARY_COLOR_ARRAY_EXT); + } + if (gl_info->supported[ARB_VERTEX_BLEND]) + { + glDisableClientState(GL_WEIGHT_ARRAY_ARB); + } + unloadTexCoords(gl_info); +} + +static inline void unload_numbered_array(struct wined3d_context *context, int i) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + + GL_EXTCALL(glDisableVertexAttribArrayARB(i)); + checkGLcall("glDisableVertexAttribArrayARB(reg)"); + + context->numbered_array_mask &= ~(1 << i); +} + +/* This should match any arrays loaded in loadNumberedArrays + * TODO: Only load / unload arrays if we have to. + */ +static inline void unloadNumberedArrays(struct wined3d_context *context) +{ + /* disable any attribs (this is the same for both GLSL and ARB modes) */ + GLint maxAttribs = 16; + int i; + + /* Leave all the attribs disabled */ + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &maxAttribs); + /* MESA does not support it right not */ + if (glGetError() != GL_NO_ERROR) + maxAttribs = 16; + for (i = 0; i < maxAttribs; ++i) { + unload_numbered_array(context, i); + } +} + - static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock, ++static void loadNumberedArrays(struct wined3d_stateblock *stateblock, + const struct wined3d_stream_info *stream_info, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0; + int i; + struct wined3d_buffer *vb; - DWORD_PTR shift_index; + + /* Default to no instancing */ + stateblock->device->instancedDraw = FALSE; + + for (i = 0; i < MAX_ATTRIBS; i++) + { + const struct wined3d_stream_state *stream; + + if (!(stream_info->use_map & (1 << i))) + { + if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i); + continue; + } + + stream = &stateblock->state.streams[stream_info->elements[i].stream_idx]; + + /* Do not load instance data. It will be specified using glTexCoord by drawprim */ + if (stream->flags & WINED3DSTREAMSOURCE_INSTANCEDATA) + { + if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i); + stateblock->device->instancedDraw = TRUE; + continue; + } + + TRACE_(d3d_shader)("Loading array %u [VBO=%u]\n", i, stream_info->elements[i].buffer_object); + + if (stream_info->elements[i].stride) + { + if (curVBO != stream_info->elements[i].buffer_object) + { + GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, stream_info->elements[i].buffer_object)); + checkGLcall("glBindBufferARB"); + curVBO = stream_info->elements[i].buffer_object; + } + /* Use the VBO to find out if a vertex buffer exists, not the vb + * pointer. vb can point to a user pointer data blob. In that case + * curVBO will be 0. If there is a vertex buffer but no vbo we + * won't be load converted attributes anyway. */ + vb = stream->buffer; - if (curVBO && vb->conversion_shift) - { - TRACE("Loading attribute from shifted buffer\n"); - TRACE("Attrib %d has original stride %d, new stride %d\n", - i, stream_info->elements[i].stride, vb->conversion_stride); - TRACE("Original offset %p, additional offset 0x%08x\n", - stream_info->elements[i].data, vb->conversion_shift[(DWORD_PTR)stream_info->elements[i].data]); - TRACE("Opengl type %#x\n", stream_info->elements[i].format->gl_vtx_type); - shift_index = ((DWORD_PTR)stream_info->elements[i].data + stream->offset); - shift_index = shift_index % stream_info->elements[i].stride; - GL_EXTCALL(glVertexAttribPointerARB(i, stream_info->elements[i].format->gl_vtx_format, - stream_info->elements[i].format->gl_vtx_type, - stream_info->elements[i].format->gl_normalized, - vb->conversion_stride, stream_info->elements[i].data + vb->conversion_shift[shift_index] - + stateblock->state.load_base_vertex_index * stream_info->elements[i].stride - + stream->offset)); - - } else { - GL_EXTCALL(glVertexAttribPointerARB(i, stream_info->elements[i].format->gl_vtx_format, - stream_info->elements[i].format->gl_vtx_type, - stream_info->elements[i].format->gl_normalized, - stream_info->elements[i].stride, stream_info->elements[i].data - + stateblock->state.load_base_vertex_index * stream_info->elements[i].stride - + stream->offset)); - } ++ GL_EXTCALL(glVertexAttribPointerARB(i, stream_info->elements[i].format->gl_vtx_format, ++ stream_info->elements[i].format->gl_vtx_type, ++ stream_info->elements[i].format->gl_normalized, ++ stream_info->elements[i].stride, stream_info->elements[i].data ++ + stateblock->state.load_base_vertex_index * stream_info->elements[i].stride ++ + stream->offset)); + + if (!(context->numbered_array_mask & (1 << i))) + { + GL_EXTCALL(glEnableVertexAttribArrayARB(i)); + context->numbered_array_mask |= (1 << i); + } + } + else + { + /* Stride = 0 means always the same values. + * glVertexAttribPointerARB doesn't do that. Instead disable the + * pointer and set up the attribute statically. But we have to + * figure out the system memory address. */ + const BYTE *ptr = stream_info->elements[i].data + stream->offset; + if (stream_info->elements[i].buffer_object) + { + vb = stream->buffer; + ptr += (ULONG_PTR)buffer_get_sysmem(vb, gl_info); + } + + if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i); + + switch (stream_info->elements[i].format->id) + { + case WINED3DFMT_R32_FLOAT: + GL_EXTCALL(glVertexAttrib1fvARB(i, (const GLfloat *)ptr)); + break; + case WINED3DFMT_R32G32_FLOAT: + GL_EXTCALL(glVertexAttrib2fvARB(i, (const GLfloat *)ptr)); + break; + case WINED3DFMT_R32G32B32_FLOAT: + GL_EXTCALL(glVertexAttrib3fvARB(i, (const GLfloat *)ptr)); + break; + case WINED3DFMT_R32G32B32A32_FLOAT: + GL_EXTCALL(glVertexAttrib4fvARB(i, (const GLfloat *)ptr)); + break; + + case WINED3DFMT_R8G8B8A8_UINT: + GL_EXTCALL(glVertexAttrib4NubvARB(i, ptr)); + break; + case WINED3DFMT_B8G8R8A8_UNORM: + if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA]) + { + const DWORD *src = (const DWORD *)ptr; + DWORD c = *src & 0xff00ff00; + c |= (*src & 0xff0000) >> 16; + c |= (*src & 0xff) << 16; + GL_EXTCALL(glVertexAttrib4NubvARB(i, (GLubyte *)&c)); + break; + } + /* else fallthrough */ + case WINED3DFMT_R8G8B8A8_UNORM: + GL_EXTCALL(glVertexAttrib4NubvARB(i, ptr)); + break; + + case WINED3DFMT_R16G16_SINT: + GL_EXTCALL(glVertexAttrib4svARB(i, (const GLshort *)ptr)); + break; + case WINED3DFMT_R16G16B16A16_SINT: + GL_EXTCALL(glVertexAttrib4svARB(i, (const GLshort *)ptr)); + break; + + case WINED3DFMT_R16G16_SNORM: + { + const GLshort s[4] = {((const GLshort *)ptr)[0], ((const GLshort *)ptr)[1], 0, 1}; + GL_EXTCALL(glVertexAttrib4NsvARB(i, s)); + break; + } + case WINED3DFMT_R16G16_UNORM: + { + const GLushort s[4] = {((const GLushort *)ptr)[0], ((const GLushort *)ptr)[1], 0, 1}; + GL_EXTCALL(glVertexAttrib4NusvARB(i, s)); + break; + } + case WINED3DFMT_R16G16B16A16_SNORM: + GL_EXTCALL(glVertexAttrib4NsvARB(i, (const GLshort *)ptr)); + break; + case WINED3DFMT_R16G16B16A16_UNORM: + GL_EXTCALL(glVertexAttrib4NusvARB(i, (const GLushort *)ptr)); + break; + + case WINED3DFMT_R10G10B10A2_UINT: + FIXME("Unsure about WINED3DDECLTYPE_UDEC3\n"); + /*glVertexAttrib3usvARB(i, (const GLushort *)ptr); Does not exist */ + break; + case WINED3DFMT_R10G10B10A2_SNORM: + FIXME("Unsure about WINED3DDECLTYPE_DEC3N\n"); + /*glVertexAttrib3NusvARB(i, (const GLushort *)ptr); Does not exist */ + break; + + case WINED3DFMT_R16G16_FLOAT: + /* Are those 16 bit floats. C doesn't have a 16 bit float type. I could read the single bits and calculate a 4 + * byte float according to the IEEE standard + */ + FIXME("Unsupported WINED3DDECLTYPE_FLOAT16_2\n"); + break; + case WINED3DFMT_R16G16B16A16_FLOAT: + FIXME("Unsupported WINED3DDECLTYPE_FLOAT16_4\n"); + break; + + default: + ERR("Unexpected declaration in stride 0 attributes\n"); + break; + + } + } + } + checkGLcall("Loading numbered arrays"); +} + +/* Used from 2 different functions, and too big to justify making it inlined */ - static void loadVertexData(const struct wined3d_context *context, IWineD3DStateBlockImpl *stateblock, ++static void loadVertexData(const struct wined3d_context *context, struct wined3d_stateblock *stateblock, + const struct wined3d_stream_info *si) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0; + const struct wined3d_stream_info_element *e; + const struct wined3d_stream_state *stream; + + TRACE("Using fast vertex array code\n"); + + /* This is fixed function pipeline only, and the fixed function pipeline doesn't do instancing */ + stateblock->device->instancedDraw = FALSE; + + /* Blend Data ---------------------------------------------- */ + if ((si->use_map & (1 << WINED3D_FFP_BLENDWEIGHT)) + || si->use_map & (1 << WINED3D_FFP_BLENDINDICES)) + { + e = &si->elements[WINED3D_FFP_BLENDWEIGHT]; + stream = &stateblock->state.streams[e->stream_idx]; + + if (gl_info->supported[ARB_VERTEX_BLEND]) + { + TRACE("Blend %u %p %u\n", e->format->component_count, + e->data + stateblock->state.load_base_vertex_index * e->stride, e->stride + stream->offset); + + glEnableClientState(GL_WEIGHT_ARRAY_ARB); + checkGLcall("glEnableClientState(GL_WEIGHT_ARRAY_ARB)"); + + GL_EXTCALL(glVertexBlendARB(e->format->component_count + 1)); + + if (curVBO != e->buffer_object) + { + GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object)); + checkGLcall("glBindBufferARB"); + curVBO = e->buffer_object; + } + + TRACE("glWeightPointerARB(%#x, %#x, %#x, %p);\n", + e->format->gl_vtx_format, + e->format->gl_vtx_type, + e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + GL_EXTCALL(glWeightPointerARB(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset)); + + checkGLcall("glWeightPointerARB"); + + if (si->use_map & (1 << WINED3D_FFP_BLENDINDICES)) + { + static BOOL warned; + if (!warned) + { + FIXME("blendMatrixIndices support\n"); + warned = TRUE; + } + } + } else { + /* TODO: support blends in drawStridedSlow + * No need to write a FIXME here, this is done after the general vertex decl decoding + */ + WARN("unsupported blending in openGl\n"); + } + } + else + { + if (gl_info->supported[ARB_VERTEX_BLEND]) + { + static const GLbyte one = 1; + GL_EXTCALL(glWeightbvARB(1, &one)); - checkGLcall("glWeightivARB(gl_info->max_blends, weights)"); ++ checkGLcall("glWeightbvARB(gl_info->max_blends, weights)"); + } + } + + /* Point Size ----------------------------------------------*/ + if (si->use_map & (1 << WINED3D_FFP_PSIZE)) + { + /* no such functionality in the fixed function GL pipeline */ + TRACE("Cannot change ptSize here in openGl\n"); + /* TODO: Implement this function in using shaders if they are available */ + } + + /* Vertex Pointers -----------------------------------------*/ + if (si->use_map & (1 << WINED3D_FFP_POSITION)) + { + e = &si->elements[WINED3D_FFP_POSITION]; + stream = &stateblock->state.streams[e->stream_idx]; + + if (curVBO != e->buffer_object) + { + GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object)); + checkGLcall("glBindBufferARB"); + curVBO = e->buffer_object; + } + + /* min(WINED3D_ATR_FORMAT(position),3) to Disable RHW mode as 'w' coord + handling for rhw mode should not impact screen position whereas in GL it does. + This may result in very slightly distorted textures in rhw mode. + There's always the other option of fixing the view matrix to + prevent w from having any effect. + + This only applies to user pointer sources, in VBOs the vertices are fixed up + */ + if (!e->buffer_object) + { + TRACE("glVertexPointer(3, %#x, %#x, %p);\n", e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + glVertexPointer(3 /* min(e->format->gl_vtx_format, 3) */, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + } + else + { + TRACE("glVertexPointer(%#x, %#x, %#x, %p);\n", + e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + glVertexPointer(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + } + checkGLcall("glVertexPointer(...)"); + glEnableClientState(GL_VERTEX_ARRAY); + checkGLcall("glEnableClientState(GL_VERTEX_ARRAY)"); + } + + /* Normals -------------------------------------------------*/ + if (si->use_map & (1 << WINED3D_FFP_NORMAL)) + { + e = &si->elements[WINED3D_FFP_NORMAL]; + stream = &stateblock->state.streams[e->stream_idx]; + + if (curVBO != e->buffer_object) + { + GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object)); + checkGLcall("glBindBufferARB"); + curVBO = e->buffer_object; + } + + TRACE("glNormalPointer(%#x, %#x, %p);\n", e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + glNormalPointer(e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + checkGLcall("glNormalPointer(...)"); + glEnableClientState(GL_NORMAL_ARRAY); + checkGLcall("glEnableClientState(GL_NORMAL_ARRAY)"); + + } else { + glNormal3f(0, 0, 0); + checkGLcall("glNormal3f(0, 0, 0)"); + } + + /* Diffuse Colour --------------------------------------------*/ + /* WARNING: Data here MUST be in RGBA format, so cannot */ + /* go directly into fast mode from app pgm, because */ + /* directx requires data in BGRA format. */ + /* currently fixupVertices swizzles the format, but this isn't*/ + /* very practical when using VBOs */ + /* NOTE: Unless we write a vertex shader to swizzle the colour*/ + /* , or the user doesn't care and wants the speed advantage */ + + if (si->use_map & (1 << WINED3D_FFP_DIFFUSE)) + { + e = &si->elements[WINED3D_FFP_DIFFUSE]; + stream = &stateblock->state.streams[e->stream_idx]; + + if (curVBO != e->buffer_object) + { + GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object)); + checkGLcall("glBindBufferARB"); + curVBO = e->buffer_object; + } + + TRACE("glColorPointer(%#x, %#x %#x, %p);\n", + e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + glColorPointer(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + checkGLcall("glColorPointer(4, GL_UNSIGNED_BYTE, ...)"); + glEnableClientState(GL_COLOR_ARRAY); + checkGLcall("glEnableClientState(GL_COLOR_ARRAY)"); + + } else { + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + checkGLcall("glColor4f(1, 1, 1, 1)"); + } + + /* Specular Colour ------------------------------------------*/ + if (si->use_map & (1 << WINED3D_FFP_SPECULAR)) + { + TRACE("setting specular colour\n"); + + e = &si->elements[WINED3D_FFP_SPECULAR]; + stream = &stateblock->state.streams[e->stream_idx]; + + if (gl_info->supported[EXT_SECONDARY_COLOR]) + { + GLenum type = e->format->gl_vtx_type; + GLint format = e->format->gl_vtx_format; + + if (curVBO != e->buffer_object) + { + GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object)); + checkGLcall("glBindBufferARB"); + curVBO = e->buffer_object; + } + + if (format != 4 || (gl_info->quirks & WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA)) + { + /* Usually specular colors only allow 3 components, since they have no alpha. In D3D, the specular alpha + * contains the fog coordinate, which is passed to GL with GL_EXT_fog_coord. However, the fixed function + * vertex pipeline can pass the specular alpha through, and pixel shaders can read it. So it GL accepts + * 4 component secondary colors use it + */ + TRACE("glSecondaryColorPointer(%#x, %#x, %#x, %p);\n", format, type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + GL_EXTCALL(glSecondaryColorPointerEXT(format, type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset)); + checkGLcall("glSecondaryColorPointerEXT(format, type, ...)"); + } + else + { + switch(type) + { + case GL_UNSIGNED_BYTE: + TRACE("glSecondaryColorPointer(3, GL_UNSIGNED_BYTE, %#x, %p);\n", e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + GL_EXTCALL(glSecondaryColorPointerEXT(3, GL_UNSIGNED_BYTE, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset)); + checkGLcall("glSecondaryColorPointerEXT(3, GL_UNSIGNED_BYTE, ...)"); + break; + + default: + FIXME("Add 4 component specular color pointers for type %x\n", type); + /* Make sure that the right color component is dropped */ + TRACE("glSecondaryColorPointer(3, %#x, %#x, %p);\n", type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + GL_EXTCALL(glSecondaryColorPointerEXT(3, type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset)); + checkGLcall("glSecondaryColorPointerEXT(3, type, ...)"); + } + } + glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT); + checkGLcall("glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT)"); + } + else + { + WARN("Specular colour is not supported in this GL implementation.\n"); + } + } + else + { + if (gl_info->supported[EXT_SECONDARY_COLOR]) + { + GL_EXTCALL(glSecondaryColor3fEXT)(0, 0, 0); + checkGLcall("glSecondaryColor3fEXT(0, 0, 0)"); + } + else + { + WARN("Specular colour is not supported in this GL implementation.\n"); + } + } + + /* Texture coords -------------------------------------------*/ + loadTexCoords(gl_info, stateblock, si, &curVBO); +} + - static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void streamsrc(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ - IWineD3DDeviceImpl *device = stateblock->device; ++ struct wined3d_device *device = stateblock->device; + BOOL load_numbered = use_vs(&stateblock->state) && !device->useDrawStridedSlow; + BOOL load_named = !use_vs(&stateblock->state) && !device->useDrawStridedSlow; + + if (context->numberedArraysLoaded && !load_numbered) + { + unloadNumberedArrays(context); + context->numberedArraysLoaded = FALSE; + context->numbered_array_mask = 0; + } + else if (context->namedArraysLoaded) + { + unloadVertexData(context->gl_info); + context->namedArraysLoaded = FALSE; + } + + if (load_numbered) + { + TRACE("Loading numbered arrays\n"); + loadNumberedArrays(stateblock, &device->strided_streams, context); + context->numberedArraysLoaded = TRUE; + } + else if (load_named) + { + TRACE("Loading vertex data\n"); + loadVertexData(context, stateblock, &device->strided_streams); + context->namedArraysLoaded = TRUE; + } +} + - static void vertexdeclaration(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void vertexdeclaration(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; ++ struct wined3d_device *device = stateblock->device; + BOOL useVertexShaderFunction = use_vs(state); + BOOL usePixelShaderFunction = use_ps(state); + BOOL updateFog = FALSE; - IWineD3DDeviceImpl *device = stateblock->device; + BOOL transformed; + BOOL wasrhw = context->last_was_rhw; + unsigned int i; + + transformed = device->strided_streams.position_transformed; - if(transformed != context->last_was_rhw && !useVertexShaderFunction) { ++ if (transformed != context->last_was_rhw && !useVertexShaderFunction) + updateFog = TRUE; - } - - /* Reapply lighting if it is not scheduled for reapplication already */ - if(!isStateDirty(context, STATE_RENDER(WINED3DRS_LIGHTING))) { - state_lighting(STATE_RENDER(WINED3DRS_LIGHTING), stateblock, context); - } + + if (transformed) { + context->last_was_rhw = TRUE; + } else { + + /* Untransformed, so relies on the view and projection matrices */ + context->last_was_rhw = FALSE; + /* This turns off the Z scale trick to 'disable' viewport frustum clipping in rhw mode*/ + device->untransformed = TRUE; - - /* Todo for sw shaders: Vertex Shader output is already transformed, so set up identity matrices - * Not needed as long as only hw shaders are supported - */ - - /* This sets the shader output position correction constants. - * TODO: Move to the viewport state - */ - if (useVertexShaderFunction) - { - GLfloat yoffset = -(63.0f / 64.0f) / stateblock->state.viewport.Height; - device->posFixup[1] = context->render_offscreen ? -1.0f : 1.0f; - device->posFixup[3] = device->posFixup[1] * yoffset; - } + } + + /* Don't have to apply the matrices when vertex shaders are used. When vshaders are turned + * off this function will be called again anyway to make sure they're properly set + */ + if(!useVertexShaderFunction) { + /* TODO: Move this mainly to the viewport state and only apply when the vp has changed + * or transformed / untransformed was switched + */ + if(wasrhw != context->last_was_rhw && + !isStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION)) && + !isStateDirty(context, STATE_VIEWPORT)) { + transform_projection(STATE_TRANSFORM(WINED3DTS_PROJECTION), stateblock, context); + } + /* World matrix needs reapplication here only if we're switching between rhw and non-rhw + * mode. + * + * If a vertex shader is used, the world matrix changed and then vertex shader unbound + * this check will fail and the matrix not applied again. This is OK because a simple + * world matrix change reapplies the matrix - These checks here are only to satisfy the + * needs of the vertex declaration. + * + * World and view matrix go into the same gl matrix, so only apply them when neither is + * dirty + */ + if(transformed != wasrhw && + !isStateDirty(context, STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0))) && + !isStateDirty(context, STATE_TRANSFORM(WINED3DTS_VIEW))) { + transform_world(STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)), stateblock, context); + } + + if(!isStateDirty(context, STATE_RENDER(WINED3DRS_COLORVERTEX))) { + state_colormat(STATE_RENDER(WINED3DRS_COLORVERTEX), stateblock, context); + } ++ if(!isStateDirty(context, STATE_RENDER(WINED3DRS_LIGHTING))) { ++ state_lighting(STATE_RENDER(WINED3DRS_LIGHTING), stateblock, context); ++ } + + if(context->last_was_vshader) { + updateFog = TRUE; + if(!device->vs_clipping && !isStateDirty(context, STATE_RENDER(WINED3DRS_CLIPPLANEENABLE))) { + state_clipping(STATE_RENDER(WINED3DRS_CLIPPLANEENABLE), stateblock, context); + } + for (i = 0; i < gl_info->limits.clipplanes; ++i) + { + clipplane(STATE_CLIPPLANE(i), stateblock, context); + } + } + if(!isStateDirty(context, STATE_RENDER(WINED3DRS_NORMALIZENORMALS))) { + state_normalize(STATE_RENDER(WINED3DRS_NORMALIZENORMALS), stateblock, context); + } + } else { + if(!context->last_was_vshader) { + static BOOL warned = FALSE; + if(!device->vs_clipping) { + /* Disable all clip planes to get defined results on all drivers. See comment in the + * state_clipping state handler + */ + for (i = 0; i < gl_info->limits.clipplanes; ++i) + { + glDisable(GL_CLIP_PLANE0 + i); + checkGLcall("glDisable(GL_CLIP_PLANE0 + i)"); + } + + if (!warned && stateblock->state.render_states[WINED3DRS_CLIPPLANEENABLE]) + { + FIXME("Clipping not supported with vertex shaders\n"); + warned = TRUE; + } + } + if(wasrhw) { + /* Apply the transform matrices when switching from rhw drawing to vertex shaders. Vertex + * shaders themselves do not need it, but the matrices are not reapplied automatically when + * switching back from vertex shaders to fixed function processing. So make sure we leave the + * fixed function vertex processing states back in a sane state before switching to shaders + */ + if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION))) { + transform_projection(STATE_TRANSFORM(WINED3DTS_PROJECTION), stateblock, context); + } + if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)))) { + transform_world(STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)), stateblock, context); + } + } + updateFog = TRUE; + + /* Vertex shader clipping ignores the view matrix. Update all clipplanes + * (Note: ARB shaders can read the clip planes for clipping emulation even if + * device->vs_clipping is false. + */ + for (i = 0; i < gl_info->limits.clipplanes; ++i) + { + clipplane(STATE_CLIPPLANE(i), stateblock, context); + } + } + } + + /* Vertex and pixel shaders are applied together for now, so let the last dirty state do the + * application + */ + if (!isStateDirty(context, STATE_PIXELSHADER)) { + device->shader_backend->shader_select(context, usePixelShaderFunction, useVertexShaderFunction); + + if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (useVertexShaderFunction || usePixelShaderFunction)) { + shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock, context); + } + } + + context->last_was_vshader = useVertexShaderFunction; + + if (updateFog) stateblock_apply_state(STATE_RENDER(WINED3DRS_FOGVERTEXMODE), stateblock, context); + + if(!useVertexShaderFunction) { + int i; + for(i = 0; i < MAX_TEXTURES; i++) { + if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_TEXTURE0 + i))) { + transform_texture(STATE_TEXTURESTAGE(i, WINED3DTSS_TEXTURETRANSFORMFLAGS), stateblock, context); + } + } + } +} + - static void viewport_miscpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void viewport_miscpart(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ - IWineD3DSurfaceImpl *target = stateblock->device->render_targets[0]; ++ struct wined3d_surface *target = stateblock->device->fb.render_targets[0]; + UINT width, height; + WINED3DVIEWPORT vp = stateblock->state.viewport; + - if(vp.Width > target->currentDesc.Width) vp.Width = target->currentDesc.Width; - if(vp.Height > target->currentDesc.Height) vp.Height = target->currentDesc.Height; ++ if (vp.Width > target->resource.width) ++ vp.Width = target->resource.width; ++ if (vp.Height > target->resource.height) ++ vp.Height = target->resource.height; + + glDepthRange(vp.MinZ, vp.MaxZ); + checkGLcall("glDepthRange"); + /* Note: GL requires lower left, DirectX supplies upper left. This is reversed when using offscreen rendering + */ + if (context->render_offscreen) + { + glViewport(vp.X, vp.Y, vp.Width, vp.Height); + } else { + target->get_drawable_size(context, &width, &height); + + glViewport(vp.X, + (height - (vp.Y + vp.Height)), + vp.Width, vp.Height); + } + + checkGLcall("glViewport"); +} + - static void viewport_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void viewport_vertexpart(DWORD state_id, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ - GLfloat yoffset = -(63.0f / 64.0f) / stateblock->state.viewport.Height; - - stateblock->device->posFixup[2] = (63.0f / 64.0f) / stateblock->state.viewport.Width; - stateblock->device->posFixup[3] = stateblock->device->posFixup[1] * yoffset; - + if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION))) { + transform_projection(STATE_TRANSFORM(WINED3DTS_PROJECTION), stateblock, context); + } + if(!isStateDirty(context, STATE_RENDER(WINED3DRS_POINTSCALEENABLE))) { + state_pscale(STATE_RENDER(WINED3DRS_POINTSCALEENABLE), stateblock, context); + } ++ /* Update the position fixup. */ + if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT)) + shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock, context); +} + - static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void light(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + UINT Index = state - STATE_ACTIVELIGHT(0); + const struct wined3d_light_info *lightInfo = stateblock->state.lights[Index]; + + if(!lightInfo) { + glDisable(GL_LIGHT0 + Index); + checkGLcall("glDisable(GL_LIGHT0 + Index)"); + } else { + float quad_att; + float colRGBA[] = {0.0f, 0.0f, 0.0f, 0.0f}; + + /* Light settings are affected by the model view in OpenGL, the View transform in direct3d*/ + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]); + + /* Diffuse: */ + colRGBA[0] = lightInfo->OriginalParms.Diffuse.r; + colRGBA[1] = lightInfo->OriginalParms.Diffuse.g; + colRGBA[2] = lightInfo->OriginalParms.Diffuse.b; + colRGBA[3] = lightInfo->OriginalParms.Diffuse.a; + glLightfv(GL_LIGHT0 + Index, GL_DIFFUSE, colRGBA); + checkGLcall("glLightfv"); + + /* Specular */ + colRGBA[0] = lightInfo->OriginalParms.Specular.r; + colRGBA[1] = lightInfo->OriginalParms.Specular.g; + colRGBA[2] = lightInfo->OriginalParms.Specular.b; + colRGBA[3] = lightInfo->OriginalParms.Specular.a; + glLightfv(GL_LIGHT0 + Index, GL_SPECULAR, colRGBA); + checkGLcall("glLightfv"); + + /* Ambient */ + colRGBA[0] = lightInfo->OriginalParms.Ambient.r; + colRGBA[1] = lightInfo->OriginalParms.Ambient.g; + colRGBA[2] = lightInfo->OriginalParms.Ambient.b; + colRGBA[3] = lightInfo->OriginalParms.Ambient.a; + glLightfv(GL_LIGHT0 + Index, GL_AMBIENT, colRGBA); + checkGLcall("glLightfv"); + + if ((lightInfo->OriginalParms.Range *lightInfo->OriginalParms.Range) >= FLT_MIN) { + quad_att = 1.4f/(lightInfo->OriginalParms.Range *lightInfo->OriginalParms.Range); + } else { + quad_att = 0.0f; /* 0 or MAX? (0 seems to be ok) */ + } + + /* Do not assign attenuation values for lights that do not use them. D3D apps are free to pass any junk, + * but gl drivers use them and may crash due to bad Attenuation values. Need for Speed most wanted sets + * Attenuation0 to NaN and crashes in the gl lib + */ + + switch (lightInfo->OriginalParms.Type) { + case WINED3DLIGHT_POINT: + /* Position */ + glLightfv(GL_LIGHT0 + Index, GL_POSITION, &lightInfo->lightPosn[0]); + checkGLcall("glLightfv"); + glLightf(GL_LIGHT0 + Index, GL_SPOT_CUTOFF, lightInfo->cutoff); + checkGLcall("glLightf"); + /* Attenuation - Are these right? guessing... */ + glLightf(GL_LIGHT0 + Index, GL_CONSTANT_ATTENUATION, lightInfo->OriginalParms.Attenuation0); + checkGLcall("glLightf"); + glLightf(GL_LIGHT0 + Index, GL_LINEAR_ATTENUATION, lightInfo->OriginalParms.Attenuation1); + checkGLcall("glLightf"); + if (quad_att < lightInfo->OriginalParms.Attenuation2) quad_att = lightInfo->OriginalParms.Attenuation2; + glLightf(GL_LIGHT0 + Index, GL_QUADRATIC_ATTENUATION, quad_att); + checkGLcall("glLightf"); + /* FIXME: Range */ + break; + + case WINED3DLIGHT_SPOT: + /* Position */ + glLightfv(GL_LIGHT0 + Index, GL_POSITION, &lightInfo->lightPosn[0]); + checkGLcall("glLightfv"); + /* Direction */ + glLightfv(GL_LIGHT0 + Index, GL_SPOT_DIRECTION, &lightInfo->lightDirn[0]); + checkGLcall("glLightfv"); + glLightf(GL_LIGHT0 + Index, GL_SPOT_EXPONENT, lightInfo->exponent); + checkGLcall("glLightf"); + glLightf(GL_LIGHT0 + Index, GL_SPOT_CUTOFF, lightInfo->cutoff); + checkGLcall("glLightf"); + /* Attenuation - Are these right? guessing... */ + glLightf(GL_LIGHT0 + Index, GL_CONSTANT_ATTENUATION, lightInfo->OriginalParms.Attenuation0); + checkGLcall("glLightf"); + glLightf(GL_LIGHT0 + Index, GL_LINEAR_ATTENUATION, lightInfo->OriginalParms.Attenuation1); + checkGLcall("glLightf"); + if (quad_att < lightInfo->OriginalParms.Attenuation2) quad_att = lightInfo->OriginalParms.Attenuation2; + glLightf(GL_LIGHT0 + Index, GL_QUADRATIC_ATTENUATION, quad_att); + checkGLcall("glLightf"); + /* FIXME: Range */ + break; + + case WINED3DLIGHT_DIRECTIONAL: + /* Direction */ + glLightfv(GL_LIGHT0 + Index, GL_POSITION, &lightInfo->lightPosn[0]); /* Note gl uses w position of 0 for direction! */ + checkGLcall("glLightfv"); + glLightf(GL_LIGHT0 + Index, GL_SPOT_CUTOFF, lightInfo->cutoff); + checkGLcall("glLightf"); + glLightf(GL_LIGHT0 + Index, GL_SPOT_EXPONENT, 0.0f); + checkGLcall("glLightf"); + break; + + default: + FIXME("Unrecognized light type %d\n", lightInfo->OriginalParms.Type); + } + + /* Restore the modelview matrix */ + glPopMatrix(); + + glEnable(GL_LIGHT0 + Index); + checkGLcall("glEnable(GL_LIGHT0 + Index)"); + } +} + - static void scissorrect(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void scissorrect(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ - IWineD3DSurfaceImpl *target = stateblock->device->render_targets[0]; ++ struct wined3d_surface *target = stateblock->device->fb.render_targets[0]; + RECT *pRect = &stateblock->state.scissor_rect; + UINT height; + UINT width; + + target->get_drawable_size(context, &width, &height); + /* Warning: glScissor uses window coordinates, not viewport coordinates, so our viewport correction does not apply + * Warning2: Even in windowed mode the coords are relative to the window, not the screen + */ + TRACE("(%p) Setting new Scissor Rect to %d:%d-%d:%d\n", stateblock->device, pRect->left, pRect->bottom - height, + pRect->right - pRect->left, pRect->bottom - pRect->top); + + if (context->render_offscreen) + { + glScissor(pRect->left, pRect->top, pRect->right - pRect->left, pRect->bottom - pRect->top); + } else { + glScissor(pRect->left, height - pRect->bottom, pRect->right - pRect->left, pRect->bottom - pRect->top); + } + checkGLcall("glScissor"); +} + - static void indexbuffer(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void indexbuffer(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + + if (stateblock->state.user_stream || !stateblock->state.index_buffer) + { + GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)); + } + else + { + struct wined3d_buffer *ib = stateblock->state.index_buffer; + GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ib->buffer_object)); + } +} + - static void frontface(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void frontface(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + if (context->render_offscreen) + { + glFrontFace(GL_CCW); + checkGLcall("glFrontFace(GL_CCW)"); + } else { + glFrontFace(GL_CW); + checkGLcall("glFrontFace(GL_CW)"); + } +} + ++static void psorigin_w(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) ++{ ++ static BOOL warned; ++ ++ if (!warned) ++ { ++ WARN("Point sprite coordinate origin switching not supported.\n"); ++ warned = TRUE; ++ } ++} ++ ++static void psorigin(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) ++{ ++ const struct wined3d_gl_info *gl_info = context->gl_info; ++ GLint origin = context->render_offscreen ? GL_LOWER_LEFT : GL_UPPER_LEFT; ++ ++ if (glPointParameteri) ++ { ++ glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, origin); ++ checkGLcall("glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, ...)"); ++ } ++ else if (gl_info->supported[NV_POINT_SPRITE]) ++ { ++ GL_EXTCALL(glPointParameteriNV(GL_POINT_SPRITE_COORD_ORIGIN, origin)); ++ checkGLcall("glPointParameteriNV(GL_POINT_SPRITE_COORD_ORIGIN, ...)"); ++ } ++} ++ +const struct StateEntryTemplate misc_state_template[] = { + { STATE_RENDER(WINED3DRS_SRCBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_DESTBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_EDGEANTIALIAS), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ANTIALIASEDLINEENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SEPARATEALPHABLENDENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SRCBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_BLENDOPALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_STREAMSRC, { STATE_VDECL, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_VDECL, { STATE_VDECL, streamsrc }, WINED3D_GL_EXT_NONE }, + { STATE_FRONTFACE, { STATE_FRONTFACE, frontface }, WINED3D_GL_EXT_NONE }, + { STATE_SCISSORRECT, { STATE_SCISSORRECT, scissorrect }, WINED3D_GL_EXT_NONE }, ++ { STATE_POINTSPRITECOORDORIGIN, { STATE_POINTSPRITECOORDORIGIN, psorigin }, WINED3D_GL_VERSION_2_0 }, ++ { STATE_POINTSPRITECOORDORIGIN, { STATE_POINTSPRITECOORDORIGIN, psorigin_w }, WINED3D_GL_EXT_NONE }, ++ + /* TODO: Move shader constant loading to vertex and fragment pipeline repectively, as soon as the pshader and + * vshader loadings are untied from each other + */ + { STATE_VERTEXSHADERCONSTANT, { STATE_VERTEXSHADERCONSTANT, shaderconstant }, WINED3D_GL_EXT_NONE }, + { STATE_PIXELSHADERCONSTANT, { STATE_VERTEXSHADERCONSTANT, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE }, + + { STATE_VIEWPORT, { STATE_VIEWPORT, viewport_miscpart }, WINED3D_GL_EXT_NONE }, + { STATE_INDEXBUFFER, { STATE_INDEXBUFFER, indexbuffer }, ARB_VERTEX_BUFFER_OBJECT }, + { STATE_INDEXBUFFER, { STATE_INDEXBUFFER, state_nop }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ANTIALIAS), { STATE_RENDER(WINED3DRS_ANTIALIAS), state_antialias }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_TEXTUREPERSPECTIVE), { STATE_RENDER(WINED3DRS_TEXTUREPERSPECTIVE), state_perspective }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ZENABLE), { STATE_RENDER(WINED3DRS_ZENABLE), state_zenable }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAPU), { STATE_RENDER(WINED3DRS_WRAPU), state_wrapu }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAPV), { STATE_RENDER(WINED3DRS_WRAPV), state_wrapv }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_FILLMODE), { STATE_RENDER(WINED3DRS_FILLMODE), state_fillmode }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SHADEMODE), { STATE_RENDER(WINED3DRS_SHADEMODE), state_shademode }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_LINEPATTERN), { STATE_RENDER(WINED3DRS_LINEPATTERN), state_linepattern }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_MONOENABLE), { STATE_RENDER(WINED3DRS_MONOENABLE), state_monoenable }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ROP2), { STATE_RENDER(WINED3DRS_ROP2), state_rop2 }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_PLANEMASK), { STATE_RENDER(WINED3DRS_PLANEMASK), state_planemask }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ZWRITEENABLE), { STATE_RENDER(WINED3DRS_ZWRITEENABLE), state_zwritenable }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ALPHAREF), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ALPHAFUNC), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_COLORKEYENABLE), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_LASTPIXEL), { STATE_RENDER(WINED3DRS_LASTPIXEL), state_lastpixel }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_CULLMODE), { STATE_RENDER(WINED3DRS_CULLMODE), state_cullmode }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ZFUNC), { STATE_RENDER(WINED3DRS_ZFUNC), state_zfunc }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_DITHERENABLE), { STATE_RENDER(WINED3DRS_DITHERENABLE), state_ditherenable }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SUBPIXEL), { STATE_RENDER(WINED3DRS_SUBPIXEL), state_subpixel }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SUBPIXELX), { STATE_RENDER(WINED3DRS_SUBPIXELX), state_subpixelx }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_STIPPLEDALPHA), { STATE_RENDER(WINED3DRS_STIPPLEDALPHA), state_stippledalpha }, WINED3D_GL_EXT_NONE }, - { STATE_RENDER(WINED3DRS_ZBIAS), { STATE_RENDER(WINED3DRS_ZBIAS), state_zbias }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_STIPPLEENABLE), { STATE_RENDER(WINED3DRS_STIPPLEENABLE), state_stippleenable }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_MIPMAPLODBIAS), { STATE_RENDER(WINED3DRS_MIPMAPLODBIAS), state_mipmaplodbias }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ANISOTROPY), { STATE_RENDER(WINED3DRS_ANISOTROPY), state_anisotropy }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_FLUSHBATCH), { STATE_RENDER(WINED3DRS_FLUSHBATCH), state_flushbatch }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_TRANSLUCENTSORTINDEPENDENT), { STATE_RENDER(WINED3DRS_TRANSLUCENTSORTINDEPENDENT), state_translucentsi }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_STENCILENABLE), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_STENCILREF), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_STENCILMASK), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_STENCILWRITEMASK), { STATE_RENDER(WINED3DRS_STENCILWRITEMASK), state_stencilwrite2s}, EXT_STENCIL_TWO_SIDE }, + { STATE_RENDER(WINED3DRS_STENCILWRITEMASK), { STATE_RENDER(WINED3DRS_STENCILWRITEMASK), state_stencilwrite }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_TWOSIDEDSTENCILMODE), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_CCW_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_CCW_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_CCW_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_CCW_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP0), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP1), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP2), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP3), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP4), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP5), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP6), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP7), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP8), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP9), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP10), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP11), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP12), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP13), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP14), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_WRAP15), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_EXTENTS), { STATE_RENDER(WINED3DRS_EXTENTS), state_extents }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_COLORKEYBLENDENABLE), { STATE_RENDER(WINED3DRS_COLORKEYBLENDENABLE), state_ckeyblend }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SOFTWAREVERTEXPROCESSING), { STATE_RENDER(WINED3DRS_SOFTWAREVERTEXPROCESSING), state_swvp }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_PATCHEDGESTYLE), { STATE_RENDER(WINED3DRS_PATCHEDGESTYLE), state_patchedgestyle}, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_PATCHSEGMENTS), { STATE_RENDER(WINED3DRS_PATCHSEGMENTS), state_patchsegments }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_POSITIONDEGREE), { STATE_RENDER(WINED3DRS_POSITIONDEGREE), state_positiondegree}, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_NORMALDEGREE), { STATE_RENDER(WINED3DRS_NORMALDEGREE), state_normaldegree }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_MINTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_MAXTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ADAPTIVETESS_X), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Y), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Z), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ADAPTIVETESS_W), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_nvdb }, EXT_DEPTH_BOUNDS_TEST }, + { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), state_msaa }, ARB_MULTISAMPLE }, + { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), state_msaa_w }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_MULTISAMPLEMASK), { STATE_RENDER(WINED3DRS_MULTISAMPLEMASK), state_multisampmask }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_DEBUGMONITORTOKEN), { STATE_RENDER(WINED3DRS_DEBUGMONITORTOKEN), state_debug_monitor }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite0 }, EXT_DRAW_BUFFERS2 }, + { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_BLENDOP), { STATE_RENDER(WINED3DRS_BLENDOP), state_blendop }, EXT_BLEND_MINMAX }, + { STATE_RENDER(WINED3DRS_BLENDOP), { STATE_RENDER(WINED3DRS_BLENDOP), state_blendop_w }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), { STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), state_scissor }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SLOPESCALEDEPTHBIAS), { STATE_RENDER(WINED3DRS_DEPTHBIAS), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), state_colorwrite1 }, EXT_DRAW_BUFFERS2 }, + { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), state_colorwrite2 }, EXT_DRAW_BUFFERS2 }, + { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), state_colorwrite3 }, EXT_DRAW_BUFFERS2 }, + { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_BLENDFACTOR), { STATE_RENDER(WINED3DRS_BLENDFACTOR), state_blendfactor }, EXT_BLEND_COLOR }, + { STATE_RENDER(WINED3DRS_BLENDFACTOR), { STATE_RENDER(WINED3DRS_BLENDFACTOR), state_blendfactor_w }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_DEPTHBIAS), { STATE_RENDER(WINED3DRS_DEPTHBIAS), state_depthbias }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ZVISIBLE), { STATE_RENDER(WINED3DRS_ZVISIBLE), state_zvisible }, WINED3D_GL_EXT_NONE }, + /* Samplers */ + { STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(8), { STATE_SAMPLER(8), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(9), { STATE_SAMPLER(9), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(10), { STATE_SAMPLER(10), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(11), { STATE_SAMPLER(11), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(12), { STATE_SAMPLER(12), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(13), { STATE_SAMPLER(13), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(14), { STATE_SAMPLER(14), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(15), { STATE_SAMPLER(15), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(16), /* Vertex sampler 0 */ { STATE_SAMPLER(16), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(17), /* Vertex sampler 1 */ { STATE_SAMPLER(17), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(18), /* Vertex sampler 2 */ { STATE_SAMPLER(18), sampler }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(19), /* Vertex sampler 3 */ { STATE_SAMPLER(19), sampler }, WINED3D_GL_EXT_NONE }, + {0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE }, +}; + +const struct StateEntryTemplate ffp_vertexstate_template[] = { + { STATE_VDECL, { STATE_VDECL, vertexdeclaration }, WINED3D_GL_EXT_NONE }, + { STATE_VSHADER, { STATE_VDECL, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_MATERIAL, { STATE_RENDER(WINED3DRS_SPECULARENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SPECULARENABLE), { STATE_RENDER(WINED3DRS_SPECULARENABLE), state_specularenable}, WINED3D_GL_EXT_NONE }, + /* Clip planes */ + { STATE_CLIPPLANE(0), { STATE_CLIPPLANE(0), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(1), { STATE_CLIPPLANE(1), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(2), { STATE_CLIPPLANE(2), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(3), { STATE_CLIPPLANE(3), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(4), { STATE_CLIPPLANE(4), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(5), { STATE_CLIPPLANE(5), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(6), { STATE_CLIPPLANE(6), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(7), { STATE_CLIPPLANE(7), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(8), { STATE_CLIPPLANE(8), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(9), { STATE_CLIPPLANE(9), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(10), { STATE_CLIPPLANE(10), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(11), { STATE_CLIPPLANE(11), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(12), { STATE_CLIPPLANE(12), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(13), { STATE_CLIPPLANE(13), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(14), { STATE_CLIPPLANE(14), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(15), { STATE_CLIPPLANE(15), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(16), { STATE_CLIPPLANE(16), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(17), { STATE_CLIPPLANE(17), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(18), { STATE_CLIPPLANE(18), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(19), { STATE_CLIPPLANE(19), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(20), { STATE_CLIPPLANE(20), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(21), { STATE_CLIPPLANE(21), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(22), { STATE_CLIPPLANE(22), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(23), { STATE_CLIPPLANE(23), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(24), { STATE_CLIPPLANE(24), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(25), { STATE_CLIPPLANE(25), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(26), { STATE_CLIPPLANE(26), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(27), { STATE_CLIPPLANE(27), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(28), { STATE_CLIPPLANE(28), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(29), { STATE_CLIPPLANE(29), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(30), { STATE_CLIPPLANE(30), clipplane }, WINED3D_GL_EXT_NONE }, + { STATE_CLIPPLANE(31), { STATE_CLIPPLANE(31), clipplane }, WINED3D_GL_EXT_NONE }, + /* Lights */ + { STATE_ACTIVELIGHT(0), { STATE_ACTIVELIGHT(0), light }, WINED3D_GL_EXT_NONE }, + { STATE_ACTIVELIGHT(1), { STATE_ACTIVELIGHT(1), light }, WINED3D_GL_EXT_NONE }, + { STATE_ACTIVELIGHT(2), { STATE_ACTIVELIGHT(2), light }, WINED3D_GL_EXT_NONE }, + { STATE_ACTIVELIGHT(3), { STATE_ACTIVELIGHT(3), light }, WINED3D_GL_EXT_NONE }, + { STATE_ACTIVELIGHT(4), { STATE_ACTIVELIGHT(4), light }, WINED3D_GL_EXT_NONE }, + { STATE_ACTIVELIGHT(5), { STATE_ACTIVELIGHT(5), light }, WINED3D_GL_EXT_NONE }, + { STATE_ACTIVELIGHT(6), { STATE_ACTIVELIGHT(6), light }, WINED3D_GL_EXT_NONE }, + { STATE_ACTIVELIGHT(7), { STATE_ACTIVELIGHT(7), light }, WINED3D_GL_EXT_NONE }, + /* Viewport */ + { STATE_VIEWPORT, { STATE_VIEWPORT, viewport_vertexpart }, WINED3D_GL_EXT_NONE }, + /* Transform states follow */ + { STATE_TRANSFORM(WINED3DTS_VIEW), { STATE_TRANSFORM(WINED3DTS_VIEW), transform_view }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_PROJECTION), { STATE_TRANSFORM(WINED3DTS_PROJECTION), transform_projection}, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE0), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE1), { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE2), { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE3), { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE4), { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE5), { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE6), { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE7), { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), transform_world }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 3)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 3)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 4)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 4)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 5)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 5)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 6)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 6)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 7)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 7)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 8)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 8)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 9)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 9)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 10)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 10)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 11)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 11)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 12)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 12)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 13)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 13)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 14)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 14)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 15)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 15)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 16)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 16)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 17)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 17)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 18)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 18)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 19)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 19)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 20)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 20)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 21)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 21)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 22)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 22)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 23)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 23)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 24)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 24)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 25)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 25)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 26)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 26)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 27)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 27)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 28)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 28)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 29)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 29)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 30)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 30)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 31)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 31)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 32)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 32)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 33)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 33)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 34)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 34)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 35)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 35)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 36)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 36)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 37)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 37)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 38)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 38)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 39)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 39)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 40)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 40)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 41)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 41)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 42)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 42)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 43)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 43)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 44)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 44)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 45)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 45)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 46)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 46)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 47)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 47)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 48)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 48)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 49)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 49)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 50)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 50)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 51)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 51)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 52)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 52)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 53)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 53)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 54)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 54)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 55)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 55)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 56)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 56)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 57)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 57)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 58)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 58)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 59)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 59)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 60)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 60)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 61)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 61)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 62)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 62)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 63)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 63)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 64)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 64)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 65)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 65)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 66)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 66)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 67)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 67)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 68)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 68)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 69)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 69)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 70)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 70)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 71)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 71)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 72)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 72)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 73)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 73)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 74)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 74)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 75)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 75)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 76)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 76)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 77)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 77)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 78)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 78)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 79)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 79)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 80)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 80)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 81)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 81)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 82)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 82)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 83)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 83)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 84)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 84)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 85)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 85)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 86)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 86)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 87)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 87)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 88)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 88)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 89)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 89)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 90)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 90)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 91)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 91)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 92)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 92)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 93)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 93)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 94)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 94)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 95)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 95)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 96)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 96)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 97)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 97)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 98)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 98)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 99)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 99)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(100)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(100)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(101)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(101)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(102)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(102)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(103)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(103)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(104)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(104)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(105)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(105)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(106)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(106)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(107)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(107)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(108)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(108)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(109)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(109)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(110)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(110)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(111)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(111)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(112)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(112)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(113)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(113)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(114)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(114)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(115)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(115)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(116)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(116)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(117)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(117)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(118)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(118)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(119)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(119)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(120)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(120)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(121)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(121)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(122)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(122)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(123)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(123)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(124)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(124)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(125)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(125)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(126)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(126)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(127)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(127)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(128)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(128)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(129)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(129)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(130)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(130)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(131)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(131)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(132)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(132)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(133)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(133)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(134)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(134)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(135)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(135)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(136)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(136)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(137)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(137)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(138)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(138)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(139)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(139)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(140)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(140)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(141)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(141)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(142)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(142)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(143)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(143)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(144)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(144)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(145)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(145)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(146)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(146)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(147)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(147)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(148)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(148)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(149)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(149)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(150)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(150)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(151)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(151)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(152)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(152)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(153)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(153)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(154)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(154)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(155)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(155)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(156)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(156)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(157)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(157)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(158)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(158)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(159)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(159)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(160)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(160)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(161)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(161)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(162)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(162)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(163)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(163)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(164)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(164)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(165)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(165)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(166)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(166)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(167)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(167)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(168)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(168)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(169)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(169)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(170)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(170)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(171)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(171)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(172)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(172)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(173)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(173)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(174)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(174)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(175)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(175)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(176)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(176)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(177)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(177)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(178)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(178)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(179)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(179)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(180)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(180)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(181)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(181)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(182)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(182)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(183)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(183)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(184)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(184)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(185)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(185)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(186)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(186)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(187)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(187)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(188)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(188)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(189)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(189)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(190)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(190)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(191)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(191)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(192)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(192)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(193)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(193)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(194)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(194)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(195)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(195)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(196)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(196)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(197)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(197)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(198)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(198)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(199)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(199)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(200)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(200)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(201)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(201)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(202)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(202)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(203)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(203)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(204)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(204)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(205)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(205)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(206)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(206)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(207)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(207)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(208)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(208)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(209)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(209)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(210)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(210)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(211)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(211)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(212)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(212)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(213)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(213)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(214)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(214)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(215)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(215)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(216)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(216)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(217)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(217)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(218)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(218)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(219)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(219)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(220)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(220)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(221)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(221)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(222)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(222)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(223)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(223)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(224)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(224)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(225)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(225)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(226)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(226)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(227)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(227)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(228)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(228)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(229)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(229)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(230)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(230)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(231)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(231)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(232)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(232)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(233)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(233)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(234)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(234)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(235)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(235)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(236)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(236)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(237)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(237)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(238)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(238)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(239)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(239)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(240)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(240)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(241)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(241)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(242)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(242)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(243)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(243)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(244)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(244)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(245)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(245)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(246)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(246)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(247)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(247)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(248)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(248)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(249)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(249)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(250)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(250)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(251)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(251)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(252)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(252)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(253)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(253)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(254)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(254)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)), transform_worldex }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(0, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(1, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(2, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(3, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(4, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(5, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(6, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(7, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, WINED3D_GL_EXT_NONE }, + /* Fog */ + { STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), state_rangefog }, NV_FOG_DISTANCE }, + { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), state_rangefog_w }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_CLIPPING), { STATE_RENDER(WINED3DRS_CLIPPING), state_clipping }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_CLIPPLANEENABLE), { STATE_RENDER(WINED3DRS_CLIPPING), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_LIGHTING), { STATE_RENDER(WINED3DRS_LIGHTING), state_lighting }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_AMBIENT), { STATE_RENDER(WINED3DRS_AMBIENT), state_ambient }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_COLORVERTEX), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_LOCALVIEWER), { STATE_RENDER(WINED3DRS_LOCALVIEWER), state_localviewer }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_NORMALIZENORMALS), { STATE_RENDER(WINED3DRS_NORMALIZENORMALS), state_normalize }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_DIFFUSEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SPECULARMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_AMBIENTMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_EMISSIVEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_VERTEXBLEND), { STATE_RENDER(WINED3DRS_VERTEXBLEND), state_vertexblend }, ARB_VERTEX_BLEND }, + { STATE_RENDER(WINED3DRS_VERTEXBLEND), { STATE_RENDER(WINED3DRS_VERTEXBLEND), state_vertexblend_w }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_POINTSIZE), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_arb }, ARB_POINT_PARAMETERS }, + { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_ext }, EXT_POINT_PARAMETERS }, + { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_w }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), { STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), state_pointsprite }, ARB_POINT_SPRITE }, + { STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), { STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), state_pointsprite_w }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_POINTSCALE_A), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_POINTSCALE_B), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_POINTSCALE_C), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), NULL }, ARB_POINT_PARAMETERS }, + { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), NULL }, EXT_POINT_PARAMETERS }, + { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_TWEENFACTOR), { STATE_RENDER(WINED3DRS_VERTEXBLEND), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_INDEXEDVERTEXBLENDENABLE), { STATE_RENDER(WINED3DRS_VERTEXBLEND), NULL }, WINED3D_GL_EXT_NONE }, + + /* Samplers for NP2 texture matrix adjustions. They are not needed if GL_ARB_texture_non_power_of_two is supported, + * so register a NULL state handler in that case to get the vertex part of sampler() skipped(VTF is handled in the misc states. + * otherwise, register sampler_texmatrix, which takes care of updating the texture matrix + */ + { STATE_SAMPLER(0), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, + { STATE_SAMPLER(0), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(1), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, + { STATE_SAMPLER(1), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(2), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, + { STATE_SAMPLER(2), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(3), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, + { STATE_SAMPLER(3), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(4), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, + { STATE_SAMPLER(4), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(5), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, + { STATE_SAMPLER(5), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(6), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, + { STATE_SAMPLER(6), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(7), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, + { STATE_SAMPLER(7), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, + {0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE }, +}; + +static const struct StateEntryTemplate ffp_fragmentstate_template[] = { + { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(0, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(1, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(2, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(3, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(4, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(5, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(6, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_TEXTURESTAGE(7, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_PIXELSHADER, { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler_texdim }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler_texdim }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texdim }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texdim }, WINED3D_GL_EXT_NONE }, + { STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, WINED3D_GL_EXT_NONE }, + {0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE }, +}; + - /* Context activation is done by the caller. */ - static void ffp_enable(IWineD3DDevice *iface, BOOL enable) { } ++/* Context activation and GL locking are done by the caller. */ ++static void ffp_enable(BOOL enable) {} + - static void ffp_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps) ++static void ffp_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps) +{ - pCaps->PrimitiveMiscCaps = 0; - pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD | - WINED3DTEXOPCAPS_ADDSIGNED | - WINED3DTEXOPCAPS_ADDSIGNED2X | - WINED3DTEXOPCAPS_MODULATE | - WINED3DTEXOPCAPS_MODULATE2X | - WINED3DTEXOPCAPS_MODULATE4X | - WINED3DTEXOPCAPS_SELECTARG1 | - WINED3DTEXOPCAPS_SELECTARG2 | - WINED3DTEXOPCAPS_DISABLE; ++ caps->PrimitiveMiscCaps = 0; ++ caps->TextureOpCaps = WINED3DTEXOPCAPS_ADD ++ | WINED3DTEXOPCAPS_ADDSIGNED ++ | WINED3DTEXOPCAPS_ADDSIGNED2X ++ | WINED3DTEXOPCAPS_MODULATE ++ | WINED3DTEXOPCAPS_MODULATE2X ++ | WINED3DTEXOPCAPS_MODULATE4X ++ | WINED3DTEXOPCAPS_SELECTARG1 ++ | WINED3DTEXOPCAPS_SELECTARG2 ++ | WINED3DTEXOPCAPS_DISABLE; + + if (gl_info->supported[ARB_TEXTURE_ENV_COMBINE] + || gl_info->supported[EXT_TEXTURE_ENV_COMBINE] + || gl_info->supported[NV_TEXTURE_ENV_COMBINE4]) + { - pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BLENDDIFFUSEALPHA | - WINED3DTEXOPCAPS_BLENDTEXTUREALPHA | - WINED3DTEXOPCAPS_BLENDFACTORALPHA | - WINED3DTEXOPCAPS_BLENDCURRENTALPHA | - WINED3DTEXOPCAPS_LERP | - WINED3DTEXOPCAPS_SUBTRACT; ++ caps->TextureOpCaps |= WINED3DTEXOPCAPS_BLENDDIFFUSEALPHA ++ | WINED3DTEXOPCAPS_BLENDTEXTUREALPHA ++ | WINED3DTEXOPCAPS_BLENDFACTORALPHA ++ | WINED3DTEXOPCAPS_BLENDCURRENTALPHA ++ | WINED3DTEXOPCAPS_LERP ++ | WINED3DTEXOPCAPS_SUBTRACT; + } + if (gl_info->supported[ATI_TEXTURE_ENV_COMBINE3] + || gl_info->supported[NV_TEXTURE_ENV_COMBINE4]) + { - pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_ADDSMOOTH | - WINED3DTEXOPCAPS_MULTIPLYADD | - WINED3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR | - WINED3DTEXOPCAPS_MODULATECOLOR_ADDALPHA | - WINED3DTEXOPCAPS_BLENDTEXTUREALPHAPM; ++ caps->TextureOpCaps |= WINED3DTEXOPCAPS_ADDSMOOTH ++ | WINED3DTEXOPCAPS_MULTIPLYADD ++ | WINED3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR ++ | WINED3DTEXOPCAPS_MODULATECOLOR_ADDALPHA ++ | WINED3DTEXOPCAPS_BLENDTEXTUREALPHAPM; + } + if (gl_info->supported[ARB_TEXTURE_ENV_DOT3]) - pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_DOTPRODUCT3; ++ caps->TextureOpCaps |= WINED3DTEXOPCAPS_DOTPRODUCT3; + - pCaps->MaxTextureBlendStages = gl_info->limits.textures; - pCaps->MaxSimultaneousTextures = gl_info->limits.textures; ++ caps->MaxTextureBlendStages = gl_info->limits.textures; ++ caps->MaxSimultaneousTextures = gl_info->limits.textures; +} + - static HRESULT ffp_fragment_alloc(IWineD3DDevice *iface) { return WINED3D_OK; } - static void ffp_fragment_free(IWineD3DDevice *iface) {} ++static HRESULT ffp_fragment_alloc(struct wined3d_device *device) { return WINED3D_OK; } ++static void ffp_fragment_free(struct wined3d_device *device) {} +static BOOL ffp_color_fixup_supported(struct color_fixup_desc fixup) +{ + if (TRACE_ON(d3d)) + { + TRACE("Checking support for fixup:\n"); + dump_color_fixup_desc(fixup); + } + + /* We only support identity conversions. */ + if (is_identity_fixup(fixup)) + { + TRACE("[OK]\n"); + return TRUE; + } + + TRACE("[FAILED]\n"); + return FALSE; +} + +const struct fragment_pipeline ffp_fragment_pipeline = { + ffp_enable, + ffp_fragment_get_caps, + ffp_fragment_alloc, + ffp_fragment_free, + ffp_color_fixup_supported, + ffp_fragmentstate_template, + FALSE /* we cannot disable projected textures. The vertex pipe has to do it */ +}; + +static unsigned int num_handlers(const APPLYSTATEFUNC *funcs) +{ + unsigned int i; + for(i = 0; funcs[i]; i++); + return i; +} + - static void multistate_apply_2(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void multistate_apply_2(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + stateblock->device->multistate_funcs[state][0](state, stateblock, context); + stateblock->device->multistate_funcs[state][1](state, stateblock, context); +} + - static void multistate_apply_3(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) ++static void multistate_apply_3(DWORD state, struct wined3d_stateblock *stateblock, struct wined3d_context *context) +{ + stateblock->device->multistate_funcs[state][0](state, stateblock, context); + stateblock->device->multistate_funcs[state][1](state, stateblock, context); + stateblock->device->multistate_funcs[state][2](state, stateblock, context); +} + +static void prune_invalid_states(struct StateEntry *state_table, const struct wined3d_gl_info *gl_info) +{ + unsigned int start, last, i; + + start = STATE_TEXTURESTAGE(gl_info->limits.texture_stages, 0); + last = STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE); + for (i = start; i <= last; ++i) + { + state_table[i].representative = 0; + state_table[i].apply = state_undefined; + } + + start = STATE_TRANSFORM(WINED3DTS_TEXTURE0 + gl_info->limits.texture_stages); + last = STATE_TRANSFORM(WINED3DTS_TEXTURE0 + MAX_TEXTURES - 1); + for (i = start; i <= last; ++i) + { + state_table[i].representative = 0; + state_table[i].apply = state_undefined; + } + + start = STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(gl_info->limits.blends)); + last = STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)); + for (i = start; i <= last; ++i) + { + state_table[i].representative = 0; + state_table[i].apply = state_undefined; + } +} + +static void validate_state_table(struct StateEntry *state_table) +{ + static const struct + { + DWORD first; + DWORD last; + } + rs_holes[] = + { + { 1, 1}, + { 3, 3}, + { 17, 18}, + { 21, 21}, + { 42, 45}, ++ { 47, 47}, + { 61, 127}, + {149, 150}, + {169, 169}, + {177, 177}, + {196, 197}, + { 0, 0}, + }; + static const DWORD simple_states[] = + { + STATE_MATERIAL, + STATE_VDECL, + STATE_STREAMSRC, + STATE_INDEXBUFFER, + STATE_VERTEXSHADERCONSTANT, + STATE_PIXELSHADERCONSTANT, + STATE_VSHADER, + STATE_PIXELSHADER, + STATE_VIEWPORT, + STATE_SCISSORRECT, + STATE_FRONTFACE, ++ STATE_POINTSPRITECOORDORIGIN, + }; + unsigned int i, current; + + for (i = STATE_RENDER(1), current = 0; i <= STATE_RENDER(WINEHIGHEST_RENDER_STATE); ++i) + { + if (!rs_holes[current].first || i < STATE_RENDER(rs_holes[current].first)) + { + if (!state_table[i].representative) + ERR("State %s (%#x) should have a representative.\n", debug_d3dstate(i), i); + } + else if (state_table[i].representative) + ERR("State %s (%#x) shouldn't have a representative.\n", debug_d3dstate(i), i); + + if (i == STATE_RENDER(rs_holes[current].last)) ++current; + } + + for (i = 0; i < sizeof(simple_states) / sizeof(*simple_states); ++i) + { + if (!state_table[simple_states[i]].representative) + ERR("State %s (%#x) should have a representative.\n", + debug_d3dstate(simple_states[i]), simple_states[i]); + } + + for (i = 0; i < STATE_HIGHEST + 1; ++i) + { + DWORD rep = state_table[i].representative; + if (rep) + { + if (state_table[rep].representative != rep) + { + ERR("State %s (%#x) has invalid representative %s (%#x).\n", + debug_d3dstate(i), i, debug_d3dstate(rep), rep); + state_table[i].representative = 0; + } + + if (rep != i) + { + if (state_table[i].apply) + ERR("State %s (%#x) has both a handler and representative.\n", debug_d3dstate(i), i); + } + else if (!state_table[i].apply) + { + ERR("Self representing state %s (%#x) has no handler.\n", debug_d3dstate(i), i); + } + } + } +} + +HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_multistate_funcs, + const struct wined3d_gl_info *gl_info, const struct StateEntryTemplate *vertex, + const struct fragment_pipeline *fragment, const struct StateEntryTemplate *misc) +{ + unsigned int i, type, handlers; + APPLYSTATEFUNC multistate_funcs[STATE_HIGHEST + 1][3]; + const struct StateEntryTemplate *cur; + BOOL set[STATE_HIGHEST + 1]; + + memset(multistate_funcs, 0, sizeof(multistate_funcs)); + + for(i = 0; i < STATE_HIGHEST + 1; i++) { + StateTable[i].representative = 0; + StateTable[i].apply = state_undefined; + } + + for(type = 0; type < 3; type++) { + /* This switch decides the order in which the states are applied */ + switch(type) { + case 0: cur = misc; break; + case 1: cur = fragment->states; break; + case 2: cur = vertex; break; + default: cur = NULL; /* Stupid compiler */ + } + if(!cur) continue; + + /* GL extension filtering should not prevent multiple handlers being applied from different + * pipeline parts + */ + memset(set, 0, sizeof(set)); + + for(i = 0; cur[i].state; i++) { + APPLYSTATEFUNC *funcs_array; + + /* Only use the first matching state with the available extension from one template. + * e.g. + * {D3DRS_FOOBAR, {D3DRS_FOOBAR, func1}, XYZ_FANCY}, + * {D3DRS_FOOBAR, {D3DRS_FOOBAR, func2}, 0 } + * + * if GL_XYZ_fancy is supported, ignore the 2nd line + */ + if(set[cur[i].state]) continue; + /* Skip state lines depending on unsupported extensions */ + if (!gl_info->supported[cur[i].extension]) continue; + set[cur[i].state] = TRUE; + /* In some cases having an extension means that nothing has to be + * done for a state, e.g. if GL_ARB_texture_non_power_of_two is + * supported, the texture coordinate fixup can be ignored. If the + * apply function is used, mark the state set(done above) to prevent + * applying later lines, but do not record anything in the state + * table + */ + if (!cur[i].content.representative) continue; + + handlers = num_handlers(multistate_funcs[cur[i].state]); + multistate_funcs[cur[i].state][handlers] = cur[i].content.apply; + switch(handlers) { + case 0: + StateTable[cur[i].state].apply = cur[i].content.apply; + break; + case 1: + StateTable[cur[i].state].apply = multistate_apply_2; + dev_multistate_funcs[cur[i].state] = HeapAlloc(GetProcessHeap(), + 0, + sizeof(**dev_multistate_funcs) * 2); + if (!dev_multistate_funcs[cur[i].state]) { + goto out_of_mem; + } + + dev_multistate_funcs[cur[i].state][0] = multistate_funcs[cur[i].state][0]; + dev_multistate_funcs[cur[i].state][1] = multistate_funcs[cur[i].state][1]; + break; + case 2: + StateTable[cur[i].state].apply = multistate_apply_3; + funcs_array = HeapReAlloc(GetProcessHeap(), + 0, + dev_multistate_funcs[cur[i].state], + sizeof(**dev_multistate_funcs) * 3); + if (!funcs_array) { + goto out_of_mem; + } + + dev_multistate_funcs[cur[i].state] = funcs_array; + dev_multistate_funcs[cur[i].state][2] = multistate_funcs[cur[i].state][2]; + break; + default: + ERR("Unexpected amount of state handlers for state %u: %u\n", + cur[i].state, handlers + 1); + } + + if(StateTable[cur[i].state].representative && + StateTable[cur[i].state].representative != cur[i].content.representative) { + FIXME("State %u has different representatives in different pipeline parts\n", + cur[i].state); + } + StateTable[cur[i].state].representative = cur[i].content.representative; + } + } + + prune_invalid_states(StateTable, gl_info); + validate_state_table(StateTable); + + return WINED3D_OK; + +out_of_mem: + for (i = 0; i <= STATE_HIGHEST; ++i) { + HeapFree(GetProcessHeap(), 0, dev_multistate_funcs[i]); + } + + memset(dev_multistate_funcs, 0, (STATE_HIGHEST + 1)*sizeof(*dev_multistate_funcs)); + + return E_OUTOFMEMORY; +} diff --cc dll/nls/normaliz/normaliz.spec index 00000000000,54e3206fa69..54e3206fa69 mode 000000,100644..100644 --- a/dll/nls/normaliz/normaliz.spec +++ b/dll/nls/normaliz/normaliz.spec diff --cc dll/ntdll/ldr/ldrapi.c index 00000000000,a2f11f8a701..a2f11f8a701 mode 000000,100644..100644 --- a/dll/ntdll/ldr/ldrapi.c +++ b/dll/ntdll/ldr/ldrapi.c diff --cc dll/ntdll/ldr/ldrinit.c index 00000000000,8bb2e40d219..8bb2e40d219 mode 000000,100644..100644 --- a/dll/ntdll/ldr/ldrinit.c +++ b/dll/ntdll/ldr/ldrinit.c diff --cc dll/ntdll/ldr/ldrpe.c index 00000000000,a223a163e36..a223a163e36 mode 000000,100644..100644 --- a/dll/ntdll/ldr/ldrpe.c +++ b/dll/ntdll/ldr/ldrpe.c diff --cc dll/ntdll/ldr/ldrutils.c index 00000000000,e3443125afa..e3443125afa mode 000000,100644..100644 --- a/dll/ntdll/ldr/ldrutils.c +++ b/dll/ntdll/ldr/ldrutils.c diff --cc dll/win32/aclui/aclui_Fr.rc index a4545151242,a4545151242..a4545151242 mode 100755,100644..100644 --- a/dll/win32/aclui/aclui_Fr.rc +++ b/dll/win32/aclui/aclui_Fr.rc diff --cc dll/win32/browseui/lang/pl-PL.rc index 00000000000,a732589e1a8..a732589e1a8 mode 000000,100644..100644 --- a/dll/win32/browseui/lang/pl-PL.rc +++ b/dll/win32/browseui/lang/pl-PL.rc diff --cc dll/win32/comctl32/comctl_Eo.rc index 00000000000,5d627aa2f3a..5d627aa2f3a mode 000000,100644..100644 --- a/dll/win32/comctl32/comctl_Eo.rc +++ b/dll/win32/comctl32/comctl_Eo.rc diff --cc dll/win32/comctl32/idb_hist_large.bmp index b7818fbafb2,c6aee0bb37a..c6aee0bb37a Binary files differ diff --cc dll/win32/comctl32/idb_hist_small.bmp index c735f54377f,2ae50010edb..2ae50010edb Binary files differ diff --cc dll/win32/comctl32/idb_std_large.bmp index 7e19185c929,c10dc72da1b..c10dc72da1b Binary files differ diff --cc dll/win32/comctl32/idb_std_small.bmp index 7db2f3ca805,aedd4a861cf..aedd4a861cf Binary files differ diff --cc dll/win32/comctl32/idb_view_large.bmp index 22e4d1d8b8b,ce4ea4f4c1b..ce4ea4f4c1b Binary files differ diff --cc dll/win32/comctl32/idb_view_small.bmp index 6ba3d831637,abee9b8063d..abee9b8063d Binary files differ diff --cc dll/win32/dhcpcsvc/dhcpcsvc.rc index dcff3bad44b,dcff3bad44b..dcff3bad44b mode 100755,100644..100644 --- a/dll/win32/dhcpcsvc/dhcpcsvc.rc +++ b/dll/win32/dhcpcsvc/dhcpcsvc.rc diff --cc dll/win32/iologmsg/iologmsg.rbuild index 00000000000,3ecd68dc2a3..3ecd68dc2a3 mode 000000,100644..100644 --- a/dll/win32/iologmsg/iologmsg.rbuild +++ b/dll/win32/iologmsg/iologmsg.rbuild diff --cc dll/win32/iologmsg/iologmsg.rc index 00000000000,f0084f0eabe..f0084f0eabe mode 000000,100644..100644 --- a/dll/win32/iologmsg/iologmsg.rc +++ b/dll/win32/iologmsg/iologmsg.rc diff --cc dll/win32/kernel32/include/kernel32.h index fae3e844009,b315c2ed69f..b315c2ed69f mode 100755,100644..100644 --- a/dll/win32/kernel32/include/kernel32.h +++ b/dll/win32/kernel32/include/kernel32.h diff --cc dll/win32/kernel32/k32.h index f59172c8566,f59172c8566..f59172c8566 mode 100755,100644..100644 --- a/dll/win32/kernel32/k32.h +++ b/dll/win32/kernel32/k32.h diff --cc dll/win32/msafd/msafd.h index d872c97b4d6,7f0d7b7b22b..7f0d7b7b22b mode 100755,100644..100644 --- a/dll/win32/msafd/msafd.h +++ b/dll/win32/msafd/msafd.h diff --cc dll/win32/msi/assembly.c index 00000000000,5199a31fc70..5199a31fc70 mode 000000,100644..100644 --- a/dll/win32/msi/assembly.c +++ b/dll/win32/msi/assembly.c diff --cc dll/win32/msi/msi_ros.diff index 00000000000,7198d57b507..7198d57b507 mode 000000,100644..100644 --- a/dll/win32/msi/msi_ros.diff +++ b/dll/win32/msi/msi_ros.diff diff --cc dll/win32/msports/CMakeLists.txt index 00000000000,e95a1eea379..e95a1eea379 mode 000000,100644..100644 --- a/dll/win32/msports/CMakeLists.txt +++ b/dll/win32/msports/CMakeLists.txt diff --cc dll/win32/msports/classinst.c index 00000000000,0b082b5cca3..0b082b5cca3 mode 000000,100644..100644 --- a/dll/win32/msports/classinst.c +++ b/dll/win32/msports/classinst.c diff --cc dll/win32/msports/comdb.c index 00000000000,30b851b5a39..30b851b5a39 mode 000000,100644..100644 --- a/dll/win32/msports/comdb.c +++ b/dll/win32/msports/comdb.c diff --cc dll/win32/msports/internal.h index 00000000000,8f67052f938..8f67052f938 mode 000000,100644..100644 --- a/dll/win32/msports/internal.h +++ b/dll/win32/msports/internal.h diff --cc dll/win32/msports/lang/de-DE.rc index 00000000000,6450c6b627b..6450c6b627b mode 000000,100644..100644 --- a/dll/win32/msports/lang/de-DE.rc +++ b/dll/win32/msports/lang/de-DE.rc diff --cc dll/win32/msports/lang/en-US.rc index 00000000000,5ea9aa24d5a..5ea9aa24d5a mode 000000,100644..100644 --- a/dll/win32/msports/lang/en-US.rc +++ b/dll/win32/msports/lang/en-US.rc diff --cc dll/win32/msports/lang/pl-PL.rc index 00000000000,ff9e22c25c4..ff9e22c25c4 mode 000000,100644..100644 --- a/dll/win32/msports/lang/pl-PL.rc +++ b/dll/win32/msports/lang/pl-PL.rc diff --cc dll/win32/msports/lang/uk-UA.rc index 00000000000,a5ac1f08739..a5ac1f08739 mode 000000,100644..100644 --- a/dll/win32/msports/lang/uk-UA.rc +++ b/dll/win32/msports/lang/uk-UA.rc diff --cc dll/win32/msports/msports.c index 00000000000,587c01ea372..587c01ea372 mode 000000,100644..100644 --- a/dll/win32/msports/msports.c +++ b/dll/win32/msports/msports.c diff --cc dll/win32/msports/msports.rbuild index 00000000000,cf67dfd6954..cf67dfd6954 mode 000000,100644..100644 --- a/dll/win32/msports/msports.rbuild +++ b/dll/win32/msports/msports.rbuild diff --cc dll/win32/msports/msports.rc index 00000000000,7b6ec241d2c..7b6ec241d2c mode 000000,100644..100644 --- a/dll/win32/msports/msports.rc +++ b/dll/win32/msports/msports.rc diff --cc dll/win32/msports/msports.spec index 00000000000,3be8a92914e..3be8a92914e mode 000000,100644..100644 --- a/dll/win32/msports/msports.spec +++ b/dll/win32/msports/msports.spec diff --cc dll/win32/msports/resource.h index 00000000000,de46f09ff7f..de46f09ff7f mode 000000,100644..100644 --- a/dll/win32/msports/resource.h +++ b/dll/win32/msports/resource.h diff --cc dll/win32/msports/serial.c index 00000000000,d172bee63ce..d172bee63ce mode 000000,100644..100644 --- a/dll/win32/msports/serial.c +++ b/dll/win32/msports/serial.c diff --cc dll/win32/msxml3/msvc.h index 00000000000,275df16088a..275df16088a mode 000000,100644..100644 --- a/dll/win32/msxml3/msvc.h +++ b/dll/win32/msxml3/msvc.h diff --cc dll/win32/msxml3/msvc_uuid.c index 00000000000,b2c502719b7..b2c502719b7 mode 000000,100644..100644 --- a/dll/win32/msxml3/msvc_uuid.c +++ b/dll/win32/msxml3/msvc_uuid.c diff --cc dll/win32/netid/rsrc.rc index 5bcd0e1c57b,00000000000..c1614b68f2f mode 100644,000000..100644 --- a/dll/win32/netid/rsrc.rc +++ b/dll/win32/netid/rsrc.rc @@@ -1,19 -1,0 +1,22 @@@ +#include +#include "resource.h" + +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/id-ID.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/it-IT.rc" +#include "lang/nl-NL.rc" +#include "lang/no-NO.rc" ++#include "lang/sk-SK.rc" ++ ++// UTF-8 ++#pragma code_page(65001) +#include "lang/pl-PL.rc" +#include "lang/ru-RU.rc" - #include "lang/sk-SK.rc" +#include "lang/uk-UA.rc" diff --cc dll/win32/netshell/netshell.rc index d0948666d2e,00000000000..ff2cafbd62b mode 100644,000000..100644 --- a/dll/win32/netshell/netshell.rc +++ b/dll/win32/netshell/netshell.rc @@@ -1,45 -1,0 +1,48 @@@ +#include +#include "shlobj.h" +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "Shell for Network Connections\0" +#define REACTOS_STR_INTERNAL_NAME "netshell.dll\0" +#define REACTOS_STR_ORIGINAL_FILENAME "netshell.dll\0" +#define REACTOS_STR_PRODUCT_VERSION "5.1.2600.3264\0" +#define REACTOS_STR_FILE_VERSION "5.1.2600.3264\0" + +#include + + +IDI_SHELL_NETWORK_FOLDER ICON "res/netshell.ico" +IDI_NET_ERROR ICON "res/neterror.ico" +IDI_NET_IDLE ICON "res/netidle.ico" +IDI_NET_OFF ICON "res/netoff.ico" +IDI_NET_REC ICON "res/netrec.ico" +IDI_NET_TRANS ICON "res/nettrans.ico" +IDI_NET_TRANSREC ICON "res/nettrrec.ico" + +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/da-DK.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/hu-HU.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/nl-NL.rc" +#include "lang/no-NO.rc" - #include "lang/pl-PL.rc" +#include "lang/ro-RO.rc" - #include "lang/ru-RU.rc" +#include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" - #include "lang/uk-UA.rc" +#include "lang/zh-CN.rc" ++ ++// UTF-8 ++#pragma code_page(65001) ++#include "lang/pl-PL.rc" ++#include "lang/ru-RU.rc" ++#include "lang/uk-UA.rc" diff --cc dll/win32/oleaut32/msvc.S index 00000000000,df7f68ea00c..df7f68ea00c mode 000000,100644..100644 --- a/dll/win32/oleaut32/msvc.S +++ b/dll/win32/oleaut32/msvc.S diff --cc dll/win32/rpcrt4/msvc.S index 00000000000,b3d655c3a92..b3d655c3a92 mode 000000,100644..100644 --- a/dll/win32/rpcrt4/msvc.S +++ b/dll/win32/rpcrt4/msvc.S diff --cc dll/win32/shell32/res/bitmaps/shell_about_logo_24bpp.bmp index 335383f3f1d,335383f3f1d..335383f3f1d mode 100755,100644..100644 Binary files differ diff --cc dll/win32/shell32/shell32.rc index 825f7e1ae0b,00000000000..8ca6b91d420 mode 100644,000000..100644 --- a/dll/win32/shell32/shell32.rc +++ b/dll/win32/shell32/shell32.rc @@@ -1,78 -1,0 +1,81 @@@ +/* + * Top level resource file for shell stuff + * + * Copyright 1998 Juergen Schmied + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include "shlobj.h" +#include "shresdef.h" + +#include "version.rc" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +shv_accel ACCELERATORS +BEGIN + VK_F5, FCIDM_SHVIEW_REFRESH, VIRTKEY +END + +/* + * This include a set of Shell32 icons, + * bitmaps and avi files. Licence's can be + * found in the corresponding directorys + */ +#include "icon_res.rc" +#include "bitmap_res.rc" +#include "avi_res.rc" + +/* + * Everything specific to any language goes + * in one of the specific files. + * Note that you can and may override resources + * which also have a neutral version. This is to + * get localized bitmaps for example. + */ +#include "lang/bg-BG.rc" +#include "lang/ca-ES.rc" +#include "lang/cs-CZ.rc" +#include "lang/da-DK.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-GB.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fi-FI.rc" +#include "lang/fr-FR.rc" +#include "lang/hu-HU.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/ko-KR.rc" +#include "lang/nl-NL.rc" +#include "lang/no-NO.rc" +#include "lang/pl-PL.rc" +#include "lang/pt-BR.rc" +#include "lang/pt-PT.rc" +#include "lang/ro-RO.rc" - #include "lang/ru-RU.rc" +#include "lang/sl-SI.rc" +#include "lang/sk-SK.rc" +#include "lang/sv-SE.rc" +#include "lang/tr-TR.rc" - #include "lang/uk-UA.rc" +#include "lang/zh-CN.rc" +#include "lang/zh-TW.rc" ++ ++// UTF-8 ++#pragma code_page(65001) ++#include "lang/ru-RU.rc" ++#include "lang/uk-UA.rc" diff --cc dll/win32/shell32_new/GlueCode.cpp index 00000000000,055ca4775af..055ca4775af mode 000000,100644..100644 --- a/dll/win32/shell32_new/GlueCode.cpp +++ b/dll/win32/shell32_new/GlueCode.cpp diff --cc dll/win32/shell32_new/GlueCode.h index 00000000000,4803de2cd08..4803de2cd08 mode 000000,100644..100644 --- a/dll/win32/shell32_new/GlueCode.h +++ b/dll/win32/shell32_new/GlueCode.h diff --cc dll/win32/shell32_new/authors.cpp index 00000000000,adf252d56c9..adf252d56c9 mode 000000,100644..100644 --- a/dll/win32/shell32_new/authors.cpp +++ b/dll/win32/shell32_new/authors.cpp diff --cc dll/win32/shell32_new/autocomplete.cpp index 00000000000,da141540441..da141540441 mode 000000,100644..100644 --- a/dll/win32/shell32_new/autocomplete.cpp +++ b/dll/win32/shell32_new/autocomplete.cpp diff --cc dll/win32/shell32_new/autocomplete.h index 00000000000,d50fe4c1e62..d50fe4c1e62 mode 000000,100644..100644 --- a/dll/win32/shell32_new/autocomplete.h +++ b/dll/win32/shell32_new/autocomplete.h diff --cc dll/win32/shell32_new/avi_res.rc index 00000000000,fec00e0c594..fec00e0c594 mode 000000,100644..100644 --- a/dll/win32/shell32_new/avi_res.rc +++ b/dll/win32/shell32_new/avi_res.rc diff --cc dll/win32/shell32_new/basebar.cpp index 00000000000,e69de29bb2d..e69de29bb2d mode 000000,100644..100644 --- a/dll/win32/shell32_new/basebar.cpp +++ b/dll/win32/shell32_new/basebar.cpp diff --cc dll/win32/shell32_new/basebar.h index 00000000000,e69de29bb2d..e69de29bb2d mode 000000,100644..100644 --- a/dll/win32/shell32_new/basebar.h +++ b/dll/win32/shell32_new/basebar.h diff --cc dll/win32/shell32_new/bitmap_res.rc index 00000000000,0a5787c1a52..0a5787c1a52 mode 000000,100644..100644 --- a/dll/win32/shell32_new/bitmap_res.rc +++ b/dll/win32/shell32_new/bitmap_res.rc diff --cc dll/win32/shell32_new/brsfolder.cpp index 00000000000,f4bf88c3f38..f4bf88c3f38 mode 000000,100644..100644 --- a/dll/win32/shell32_new/brsfolder.cpp +++ b/dll/win32/shell32_new/brsfolder.cpp diff --cc dll/win32/shell32_new/changenotify.cpp index 00000000000,5328daec2a5..5328daec2a5 mode 000000,100644..100644 --- a/dll/win32/shell32_new/changenotify.cpp +++ b/dll/win32/shell32_new/changenotify.cpp diff --cc dll/win32/shell32_new/classes.cpp index 00000000000,f07d9af5a99..f07d9af5a99 mode 000000,100644..100644 --- a/dll/win32/shell32_new/classes.cpp +++ b/dll/win32/shell32_new/classes.cpp diff --cc dll/win32/shell32_new/clipboard.cpp index 00000000000,b9b2846c29e..b9b2846c29e mode 000000,100644..100644 --- a/dll/win32/shell32_new/clipboard.cpp +++ b/dll/win32/shell32_new/clipboard.cpp diff --cc dll/win32/shell32_new/control.cpp index 00000000000,9b4b74a868b..9b4b74a868b mode 000000,100644..100644 --- a/dll/win32/shell32_new/control.cpp +++ b/dll/win32/shell32_new/control.cpp diff --cc dll/win32/shell32_new/cpanel.h index 00000000000,05923f1bdbe..05923f1bdbe mode 000000,100644..100644 --- a/dll/win32/shell32_new/cpanel.h +++ b/dll/win32/shell32_new/cpanel.h diff --cc dll/win32/shell32_new/dataobject.cpp index 00000000000,2cb86034ae5..2cb86034ae5 mode 000000,100644..100644 --- a/dll/win32/shell32_new/dataobject.cpp +++ b/dll/win32/shell32_new/dataobject.cpp diff --cc dll/win32/shell32_new/dde.cpp index 00000000000,96139bbdb7a..96139bbdb7a mode 000000,100644..100644 --- a/dll/win32/shell32_new/dde.cpp +++ b/dll/win32/shell32_new/dde.cpp diff --cc dll/win32/shell32_new/debughlp.cpp index 00000000000,fde3b30f892..fde3b30f892 mode 000000,100644..100644 --- a/dll/win32/shell32_new/debughlp.cpp +++ b/dll/win32/shell32_new/debughlp.cpp diff --cc dll/win32/shell32_new/debughlp.h index 00000000000,62fb5bf1a55..62fb5bf1a55 mode 000000,100644..100644 --- a/dll/win32/shell32_new/debughlp.h +++ b/dll/win32/shell32_new/debughlp.h diff --cc dll/win32/shell32_new/desktop.cpp index 00000000000,bd0e75ba591..bd0e75ba591 mode 000000,100644..100644 --- a/dll/win32/shell32_new/desktop.cpp +++ b/dll/win32/shell32_new/desktop.cpp diff --cc dll/win32/shell32_new/dialogs.cpp index 00000000000,b42d490288e..b42d490288e mode 000000,100644..100644 --- a/dll/win32/shell32_new/dialogs.cpp +++ b/dll/win32/shell32_new/dialogs.cpp diff --cc dll/win32/shell32_new/dragdrophelper.cpp index 00000000000,0b87d31819e..0b87d31819e mode 000000,100644..100644 --- a/dll/win32/shell32_new/dragdrophelper.cpp +++ b/dll/win32/shell32_new/dragdrophelper.cpp diff --cc dll/win32/shell32_new/dragdrophelper.h index 00000000000,c850bf69d14..c850bf69d14 mode 000000,100644..100644 --- a/dll/win32/shell32_new/dragdrophelper.h +++ b/dll/win32/shell32_new/dragdrophelper.h diff --cc dll/win32/shell32_new/drive.cpp index 00000000000,86039e05331..86039e05331 mode 000000,100644..100644 --- a/dll/win32/shell32_new/drive.cpp +++ b/dll/win32/shell32_new/drive.cpp diff --cc dll/win32/shell32_new/enumidlist.cpp index 00000000000,abe2e02a0d3..abe2e02a0d3 mode 000000,100644..100644 --- a/dll/win32/shell32_new/enumidlist.cpp +++ b/dll/win32/shell32_new/enumidlist.cpp diff --cc dll/win32/shell32_new/enumidlist.h index 00000000000,b68265acd29..b68265acd29 mode 000000,100644..100644 --- a/dll/win32/shell32_new/enumidlist.h +++ b/dll/win32/shell32_new/enumidlist.h diff --cc dll/win32/shell32_new/extracticon.cpp index 00000000000,7f2daa09686..7f2daa09686 mode 000000,100644..100644 --- a/dll/win32/shell32_new/extracticon.cpp +++ b/dll/win32/shell32_new/extracticon.cpp diff --cc dll/win32/shell32_new/folder_options.cpp index 00000000000,b5d2ad47aa0..b5d2ad47aa0 mode 000000,100644..100644 --- a/dll/win32/shell32_new/folder_options.cpp +++ b/dll/win32/shell32_new/folder_options.cpp diff --cc dll/win32/shell32_new/folders.cpp index 00000000000,3783fe7c505..3783fe7c505 mode 000000,100644..100644 --- a/dll/win32/shell32_new/folders.cpp +++ b/dll/win32/shell32_new/folders.cpp diff --cc dll/win32/shell32_new/fprop.cpp index 00000000000,15c2c6fbef6..15c2c6fbef6 mode 000000,100644..100644 --- a/dll/win32/shell32_new/fprop.cpp +++ b/dll/win32/shell32_new/fprop.cpp diff --cc dll/win32/shell32_new/icon_res.rc index 00000000000,1f644ae6cf8..1f644ae6cf8 mode 000000,100644..100644 --- a/dll/win32/shell32_new/icon_res.rc +++ b/dll/win32/shell32_new/icon_res.rc diff --cc dll/win32/shell32_new/iconcache.cpp index 00000000000,1d7de4f59ec..1d7de4f59ec mode 000000,100644..100644 --- a/dll/win32/shell32_new/iconcache.cpp +++ b/dll/win32/shell32_new/iconcache.cpp diff --cc dll/win32/shell32_new/lang/bg-BG.rc index 00000000000,13a9bdb9f44..13a9bdb9f44 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/bg-BG.rc +++ b/dll/win32/shell32_new/lang/bg-BG.rc diff --cc dll/win32/shell32_new/lang/ca-ES.rc index 00000000000,214028e7d8e..214028e7d8e mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/ca-ES.rc +++ b/dll/win32/shell32_new/lang/ca-ES.rc diff --cc dll/win32/shell32_new/lang/cs-CZ.rc index 00000000000,dff2e85bff0..dff2e85bff0 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/cs-CZ.rc +++ b/dll/win32/shell32_new/lang/cs-CZ.rc diff --cc dll/win32/shell32_new/lang/da-DK.rc index 00000000000,9ad423c95e4..9ad423c95e4 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/da-DK.rc +++ b/dll/win32/shell32_new/lang/da-DK.rc diff --cc dll/win32/shell32_new/lang/de-DE.rc index 00000000000,28d3c52f829..28d3c52f829 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/de-DE.rc +++ b/dll/win32/shell32_new/lang/de-DE.rc diff --cc dll/win32/shell32_new/lang/el-GR.rc index 00000000000,a269d68ed2f..a269d68ed2f mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/el-GR.rc +++ b/dll/win32/shell32_new/lang/el-GR.rc diff --cc dll/win32/shell32_new/lang/en-GB.rc index 00000000000,5d8f02c9a47..5d8f02c9a47 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/en-GB.rc +++ b/dll/win32/shell32_new/lang/en-GB.rc diff --cc dll/win32/shell32_new/lang/en-US.rc index 00000000000,04df98d1e60..04df98d1e60 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/en-US.rc +++ b/dll/win32/shell32_new/lang/en-US.rc diff --cc dll/win32/shell32_new/lang/es-ES.rc index 00000000000,c619493d3f2..c619493d3f2 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/es-ES.rc +++ b/dll/win32/shell32_new/lang/es-ES.rc diff --cc dll/win32/shell32_new/lang/fi-FI.rc index 00000000000,6469ce1b7b5..6469ce1b7b5 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/fi-FI.rc +++ b/dll/win32/shell32_new/lang/fi-FI.rc diff --cc dll/win32/shell32_new/lang/fr-FR.rc index 00000000000,0ba3b4473f2..0ba3b4473f2 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/fr-FR.rc +++ b/dll/win32/shell32_new/lang/fr-FR.rc diff --cc dll/win32/shell32_new/lang/hu-HU.rc index 00000000000,e45819a2d47..e45819a2d47 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/hu-HU.rc +++ b/dll/win32/shell32_new/lang/hu-HU.rc diff --cc dll/win32/shell32_new/lang/it-IT.rc index 00000000000,824eb22a88e..824eb22a88e mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/it-IT.rc +++ b/dll/win32/shell32_new/lang/it-IT.rc diff --cc dll/win32/shell32_new/lang/ja-JP.rc index 00000000000,c09ba106660..c09ba106660 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/ja-JP.rc +++ b/dll/win32/shell32_new/lang/ja-JP.rc diff --cc dll/win32/shell32_new/lang/ko-KR.rc index 00000000000,98981f74213..98981f74213 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/ko-KR.rc +++ b/dll/win32/shell32_new/lang/ko-KR.rc diff --cc dll/win32/shell32_new/lang/nl-NL.rc index 00000000000,1689e2a3bae..1689e2a3bae mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/nl-NL.rc +++ b/dll/win32/shell32_new/lang/nl-NL.rc diff --cc dll/win32/shell32_new/lang/no-NO.rc index 00000000000,f02aa64fecd..f02aa64fecd mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/no-NO.rc +++ b/dll/win32/shell32_new/lang/no-NO.rc diff --cc dll/win32/shell32_new/lang/pl-PL.rc index 00000000000,c9a4d40a48b..c9a4d40a48b mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/pl-PL.rc +++ b/dll/win32/shell32_new/lang/pl-PL.rc diff --cc dll/win32/shell32_new/lang/pt-BR.rc index 00000000000,7679014ff37..7679014ff37 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/pt-BR.rc +++ b/dll/win32/shell32_new/lang/pt-BR.rc diff --cc dll/win32/shell32_new/lang/pt-PT.rc index 00000000000,2d99ca47e97..2d99ca47e97 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/pt-PT.rc +++ b/dll/win32/shell32_new/lang/pt-PT.rc diff --cc dll/win32/shell32_new/lang/ro-RO.rc index 00000000000,fb24c2ba437..fb24c2ba437 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/ro-RO.rc +++ b/dll/win32/shell32_new/lang/ro-RO.rc diff --cc dll/win32/shell32_new/lang/ru-RU.rc index 00000000000,afc3b6fabc7..afc3b6fabc7 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/ru-RU.rc +++ b/dll/win32/shell32_new/lang/ru-RU.rc diff --cc dll/win32/shell32_new/lang/sk-SK.rc index 00000000000,848d343ecdd..848d343ecdd mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/sk-SK.rc +++ b/dll/win32/shell32_new/lang/sk-SK.rc diff --cc dll/win32/shell32_new/lang/sl-SI.rc index 00000000000,9789ec3841c..9789ec3841c mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/sl-SI.rc +++ b/dll/win32/shell32_new/lang/sl-SI.rc diff --cc dll/win32/shell32_new/lang/sv-SE.rc index 00000000000,4ddd5c36520..4ddd5c36520 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/sv-SE.rc +++ b/dll/win32/shell32_new/lang/sv-SE.rc diff --cc dll/win32/shell32_new/lang/tr-TR.rc index 00000000000,633936f625a..633936f625a mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/tr-TR.rc +++ b/dll/win32/shell32_new/lang/tr-TR.rc diff --cc dll/win32/shell32_new/lang/uk-UA.rc index 00000000000,8cac82f07f1..8cac82f07f1 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/uk-UA.rc +++ b/dll/win32/shell32_new/lang/uk-UA.rc diff --cc dll/win32/shell32_new/lang/zh-CN.rc index 00000000000,aa54e3eecb6..aa54e3eecb6 mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/zh-CN.rc +++ b/dll/win32/shell32_new/lang/zh-CN.rc diff --cc dll/win32/shell32_new/lang/zh-TW.rc index 00000000000,fcf7abf9f7b..fcf7abf9f7b mode 000000,100644..100644 --- a/dll/win32/shell32_new/lang/zh-TW.rc +++ b/dll/win32/shell32_new/lang/zh-TW.rc diff --cc dll/win32/shell32_new/menuband.cpp index 00000000000,e69de29bb2d..e69de29bb2d mode 000000,100644..100644 --- a/dll/win32/shell32_new/menuband.cpp +++ b/dll/win32/shell32_new/menuband.cpp diff --cc dll/win32/shell32_new/menuband.h index 00000000000,e69de29bb2d..e69de29bb2d mode 000000,100644..100644 --- a/dll/win32/shell32_new/menuband.h +++ b/dll/win32/shell32_new/menuband.h diff --cc dll/win32/shell32_new/menubandsite.cpp index 00000000000,e69de29bb2d..e69de29bb2d mode 000000,100644..100644 --- a/dll/win32/shell32_new/menubandsite.cpp +++ b/dll/win32/shell32_new/menubandsite.cpp diff --cc dll/win32/shell32_new/menubandsite.h index 00000000000,e69de29bb2d..e69de29bb2d mode 000000,100644..100644 --- a/dll/win32/shell32_new/menubandsite.h +++ b/dll/win32/shell32_new/menubandsite.h diff --cc dll/win32/shell32_new/menudeskbar.cpp index 00000000000,e69de29bb2d..e69de29bb2d mode 000000,100644..100644 --- a/dll/win32/shell32_new/menudeskbar.cpp +++ b/dll/win32/shell32_new/menudeskbar.cpp diff --cc dll/win32/shell32_new/menudeskbar.h index 00000000000,e69de29bb2d..e69de29bb2d mode 000000,100644..100644 --- a/dll/win32/shell32_new/menudeskbar.h +++ b/dll/win32/shell32_new/menudeskbar.h diff --cc dll/win32/shell32_new/pidl.cpp index 00000000000,c034f13ac3a..c034f13ac3a mode 000000,100644..100644 --- a/dll/win32/shell32_new/pidl.cpp +++ b/dll/win32/shell32_new/pidl.cpp diff --cc dll/win32/shell32_new/pidl.h index 00000000000,2ba343c5da6..2ba343c5da6 mode 000000,100644..100644 --- a/dll/win32/shell32_new/pidl.h +++ b/dll/win32/shell32_new/pidl.h diff --cc dll/win32/shell32_new/precomp.h index 00000000000,a9bc7a39af3..a9bc7a39af3 mode 000000,100644..100644 --- a/dll/win32/shell32_new/precomp.h +++ b/dll/win32/shell32_new/precomp.h diff --cc dll/win32/shell32_new/regsvr.cpp index 00000000000,4567aff5d2f..4567aff5d2f mode 000000,100644..100644 --- a/dll/win32/shell32_new/regsvr.cpp +++ b/dll/win32/shell32_new/regsvr.cpp diff --cc dll/win32/shell32_new/res/Copy of rgs/adminfoldershortcut.rgs index 00000000000,5b031a8692b..5b031a8692b mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/adminfoldershortcut.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/adminfoldershortcut.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/autocomplete.rgs index 00000000000,9afd9d5cb86..9afd9d5cb86 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/autocomplete.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/autocomplete.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/controlpanel.rgs index 00000000000,5164a1e3dea..5164a1e3dea mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/controlpanel.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/controlpanel.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/dragdrophelper.rgs index 00000000000,25d710d188c..25d710d188c mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/dragdrophelper.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/dragdrophelper.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/folderoptions.rgs index 00000000000,51010436450..51010436450 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/folderoptions.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/folderoptions.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/foldershortcut.rgs index 00000000000,9df72086aed..9df72086aed mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/foldershortcut.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/foldershortcut.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/fontsfoldershortcut.rgs index 00000000000,bc13f13c548..bc13f13c548 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/fontsfoldershortcut.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/fontsfoldershortcut.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/menubandsite.rgs index 00000000000,c597e873135..c597e873135 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/menubandsite.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/menubandsite.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/mycomputer.rgs index 00000000000,6b60091ef8f..6b60091ef8f mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/mycomputer.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/mycomputer.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/mydocuments.rgs index 00000000000,8b57afe0d85..8b57afe0d85 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/mydocuments.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/mydocuments.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/networkplaces.rgs index 00000000000,8ca1c84e583..8ca1c84e583 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/networkplaces.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/networkplaces.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/newmenu.rgs index 00000000000,b3a6cab8f49..b3a6cab8f49 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/newmenu.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/newmenu.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/printers.rgs index 00000000000,722170a8c71..722170a8c71 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/printers.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/printers.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/recyclebin.rgs index 00000000000,dff8257e045..dff8257e045 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/recyclebin.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/recyclebin.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/shelldesktop.rgs index 00000000000,f421c430cc2..f421c430cc2 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/shelldesktop.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/shelldesktop.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/shellfsfolder.rgs index 00000000000,00d9daee97b..00d9daee97b mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/shellfsfolder.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/shellfsfolder.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/shelllink.rgs index 00000000000,a5972a70f9f..a5972a70f9f mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/shelllink.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/shelllink.rgs diff --cc dll/win32/shell32_new/res/Copy of rgs/startmenu.rgs index 00000000000,a91a3464ec2..a91a3464ec2 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/Copy of rgs/startmenu.rgs +++ b/dll/win32/shell32_new/res/Copy of rgs/startmenu.rgs diff --cc dll/win32/shell32_new/res/avis/160+161+167+168.avi index 00000000000,a3c995a1397..a3c995a1397 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/avis/162.avi index 00000000000,847b9e6a5bc..847b9e6a5bc mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/avis/163.avi index 00000000000,feff442394f..feff442394f mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/avis/164+169.avi index 00000000000,f1f781bd85e..f1f781bd85e mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/avis/170.avi index 00000000000,3fd91c87b6a..3fd91c87b6a mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/avis/Licence/COPYING index 00000000000,e709d0c050b..e709d0c050b mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/avis/Licence/COPYING +++ b/dll/win32/shell32_new/res/avis/Licence/COPYING diff --cc dll/win32/shell32_new/res/avis/Licence/Tango.txt index 00000000000,642b2937a84..642b2937a84 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/avis/Licence/Tango.txt +++ b/dll/win32/shell32_new/res/avis/Licence/Tango.txt diff --cc dll/win32/shell32_new/res/bitmaps/204.bmp index 00000000000,f6647a5e4bd..f6647a5e4bd mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/bitmaps/205.bmp index 00000000000,445357ddf02..445357ddf02 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/bitmaps/206.bmp index 00000000000,32b385dcef4..32b385dcef4 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/bitmaps/207.bmp index 00000000000,b401b0c9340..b401b0c9340 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/bitmaps/225.bmp index 00000000000,17bb5271d71..17bb5271d71 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/bitmaps/226.bmp index 00000000000,d067e61e41b..d067e61e41b mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/bitmaps/227.bmp index 00000000000,031b38ed775..031b38ed775 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/bitmaps/228.bmp index 00000000000,5a10acb43e8..5a10acb43e8 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/bitmaps/shell_about_logo_24bpp.bmp index 00000000000,335383f3f1d..335383f3f1d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/1.ico index 00000000000,baae0b125b3..baae0b125b3 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/10.ico index 00000000000,3e74ff6db78..3e74ff6db78 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/1001.ico index 00000000000,e7b9f8c1f33..e7b9f8c1f33 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/1004.ico index 00000000000,6008790389d..6008790389d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/11.ico index 00000000000,34dfaadec3a..34dfaadec3a mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/12.ico index 00000000000,94a2e1e67b2..94a2e1e67b2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/13.ico index 00000000000,bcafb16a18c..bcafb16a18c mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/134.ico index 00000000000,a35009600a0..a35009600a0 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/135.ico index 00000000000,a35009600a0..a35009600a0 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/137.ico index 00000000000,634e6d877ba..634e6d877ba mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/138.ico index 00000000000,c4fbdb0502c..c4fbdb0502c mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/14.ico index 00000000000,558df85c00e..558df85c00e mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/15.ico index 00000000000,ebc40a9a86c..ebc40a9a86c mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/151.ico index 00000000000,5d68e40db91..5d68e40db91 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/152.ico index 00000000000,82ac3f48df4..82ac3f48df4 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/153.ico index 00000000000,93ebc0c6687..93ebc0c6687 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/154.ico index 00000000000,9ac408daeb2..9ac408daeb2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/155.ico index 00000000000,c0b4b751e82..c0b4b751e82 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/156.ico index 00000000000,c0b4b751e82..c0b4b751e82 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/157.ico index 00000000000,c0b4b751e82..c0b4b751e82 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/16.ico index 00000000000,56edfcbb2af..56edfcbb2af mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/160.ico index 00000000000,5120bcfe6ff..5120bcfe6ff mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/161.ico index 00000000000,706daeffdab..706daeffdab mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/16710.ico index 00000000000,706daeffdab..706daeffdab mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/16715.ico index 00000000000,706daeffdab..706daeffdab mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/16717.ico index 00000000000,706daeffdab..706daeffdab mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/16718.ico index 00000000000,706daeffdab..706daeffdab mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/16721.ico index 00000000000,706daeffdab..706daeffdab mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/17.ico index 00000000000,af2d0a6eecf..af2d0a6eecf mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/1700.ico index 00000000000,4f8775c069a..4f8775c069a mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/172.ico index 00000000000,cf3a1413d1d..cf3a1413d1d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/173.ico index 00000000000,b905ef563b6..b905ef563b6 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/18.ico index 00000000000,7b760add407..7b760add407 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/182.ico index 00000000000,56c8f24b994..56c8f24b994 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/183.ico index 00000000000,5f3251917ba..5f3251917ba mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/184.ico index 00000000000,5eee0af44ec..5eee0af44ec mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/185.ico index 00000000000,6b4dc9303e5..6b4dc9303e5 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/186.ico index 00000000000,d09411113a0..d09411113a0 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/187.ico index 00000000000,38b924da89a..38b924da89a mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/19.ico index 00000000000,7b760add407..7b760add407 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/191.ico index 00000000000,2a5bf8d0004..2a5bf8d0004 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/192.ico index 00000000000,5276b06bd97..5276b06bd97 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/2.ico index 00000000000,55a02a01558..55a02a01558 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/20.ico index 00000000000,4174b5fb88f..4174b5fb88f mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/21.ico index 00000000000,7b94e13a1ed..7b94e13a1ed mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/210.ico index 00000000000,76edaedc60a..76edaedc60a mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/22.ico index 00000000000,634e6d877ba..634e6d877ba mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/220.ico index 00000000000,7135f45b32f..7135f45b32f mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/221.ico index 00000000000,d67ed7a6909..d67ed7a6909 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/222.ico index 00000000000,06c5be54099..06c5be54099 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/224.ico index 00000000000,65f1ab9c47f..65f1ab9c47f mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/225.ico index 00000000000,cbf02e26652..cbf02e26652 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/226.ico index 00000000000,4045c348bc4..4045c348bc4 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/228.ico index 00000000000,879feb09624..879feb09624 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/23.ico index 00000000000,5048fa745de..5048fa745de mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/233.ico index 00000000000,25869af9b88..25869af9b88 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/235.ico index 00000000000,e2e6a9b6bcf..e2e6a9b6bcf mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/236.ico index 00000000000,59b8aef43ab..59b8aef43ab mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/237.ico index 00000000000,38f4843bc95..38f4843bc95 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/238.ico index 00000000000,6acb384ab57..6acb384ab57 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/24.ico index 00000000000,6008790389d..6008790389d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/240.ico index 00000000000,5276b06bd97..5276b06bd97 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/245.ico index 00000000000,af2d0a6eecf..af2d0a6eecf mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/246.ico index 00000000000,9293575f57b..9293575f57b mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/248.ico index 00000000000,edfdd35a26d..edfdd35a26d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/249.ico index 00000000000,9aecb582b81..9aecb582b81 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/25.ico index 00000000000,fe9d4a9e052..fe9d4a9e052 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/250.ico index 00000000000,82a414dba52..82a414dba52 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/252.ico index 00000000000,af2d0a6eecf..af2d0a6eecf mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/254.ico index 00000000000,92a024a5319..92a024a5319 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/255.ico index 00000000000,70cff6abd09..70cff6abd09 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/263.ico index 00000000000,6008790389d..6008790389d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/265.ico index 00000000000,f4eb7b9cad8..f4eb7b9cad8 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/268.ico index 00000000000,b0565ca436b..b0565ca436b mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/269.ico index 00000000000,7135f45b32f..7135f45b32f mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/270.ico index 00000000000,e62cf47237d..e62cf47237d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/271.ico index 00000000000,350486328aa..350486328aa mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/277.ico index 00000000000,5cda537e17a..5cda537e17a mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/279.ico index 00000000000,7135f45b32f..7135f45b32f mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/28.ico index 00000000000,d67ed7a6909..d67ed7a6909 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/289.ico index 00000000000,6008790389d..6008790389d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/29.ico index 00000000000,f33ac25e692..f33ac25e692 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/290.ico index 00000000000,5aa5db9b758..5aa5db9b758 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/291.ico index 00000000000,06c5be54099..06c5be54099 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/292.ico index 00000000000,879feb09624..879feb09624 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/293.ico index 00000000000,94a2e1e67b2..94a2e1e67b2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/294.ico index 00000000000,94a2e1e67b2..94a2e1e67b2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/295.ico index 00000000000,94a2e1e67b2..94a2e1e67b2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/296.ico index 00000000000,94a2e1e67b2..94a2e1e67b2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/297.ico index 00000000000,94a2e1e67b2..94a2e1e67b2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/298.ico index 00000000000,94a2e1e67b2..94a2e1e67b2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/299.ico index 00000000000,7d431941278..7d431941278 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/3.ico index 00000000000,5e86a5895dd..5e86a5895dd mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/30.ico index 00000000000,3a8081fdb37..3a8081fdb37 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/302.ico index 00000000000,94a2e1e67b2..94a2e1e67b2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/304.ico index 00000000000,94a2e1e67b2..94a2e1e67b2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/305.ico index 00000000000,25869af9b88..25869af9b88 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/309.ico index 00000000000,edfdd35a26d..edfdd35a26d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/315.ico index 00000000000,631a88c90cf..631a88c90cf mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/317.ico index 00000000000,6dbf966031f..6dbf966031f mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/318.ico index 00000000000,94a2e1e67b2..94a2e1e67b2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/319.ico index 00000000000,a3324fe62e1..a3324fe62e1 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/32.ico index 00000000000,578ab0123af..578ab0123af mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/322.ico index 00000000000,b905ef563b6..b905ef563b6 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/323.ico index 00000000000,5048fa745de..5048fa745de mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/324.ico index 00000000000,6008790389d..6008790389d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/325.ico index 00000000000,e9fb7ce061d..e9fb7ce061d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/326.ico index 00000000000,0d901c550d4..0d901c550d4 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/327.ico index 00000000000,4dbf5fbe83e..4dbf5fbe83e mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/328.ico index 00000000000,fe9d4a9e052..fe9d4a9e052 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/329.ico index 00000000000,d67ed7a6909..d67ed7a6909 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/33.ico index 00000000000,df31dc28d1b..df31dc28d1b mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/330.ico index 00000000000,634e6d877ba..634e6d877ba mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/35.ico index 00000000000,bea093df6f6..bea093df6f6 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/36.ico index 00000000000,634e6d877ba..634e6d877ba mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/37.ico index 00000000000,f5953fe9a32..f5953fe9a32 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/38.ico index 00000000000,c4fbdb0502c..c4fbdb0502c mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/39.ico index 00000000000,ca7cee5d158..ca7cee5d158 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/4.ico index 00000000000,429df441149..429df441149 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/40.ico index 00000000000,cee50eed7e8..cee50eed7e8 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/41.ico index 00000000000,879feb09624..879feb09624 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/44.ico index 00000000000,b905ef563b6..b905ef563b6 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/45.ico index 00000000000,e9fb7ce061d..e9fb7ce061d mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/46.ico index 00000000000,bc5711c71a0..bc5711c71a0 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/47.ico index 00000000000,10cea4e3f84..10cea4e3f84 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/48.ico index 00000000000,f1f858eb2c0..f1f858eb2c0 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/5.ico index 00000000000,7fd4302eb78..7fd4302eb78 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/54.ico index 00000000000,edc0315f3fd..edc0315f3fd mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/6.ico index 00000000000,25869af9b88..25869af9b88 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/7.ico index 00000000000,25869af9b88..25869af9b88 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/8.ico index 00000000000,25869af9b88..25869af9b88 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/8240.ico index 00000000000,d67ed7a6909..d67ed7a6909 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/9.ico index 00000000000,a7aa955e875..a7aa955e875 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/shell32_new/res/icons/Icon_Licence/COPYING index 00000000000,e709d0c050b..e709d0c050b mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/icons/Icon_Licence/COPYING +++ b/dll/win32/shell32_new/res/icons/Icon_Licence/COPYING diff --cc dll/win32/shell32_new/res/icons/Icon_Licence/Tango.txt index 00000000000,796417a0820..796417a0820 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/icons/Icon_Licence/Tango.txt +++ b/dll/win32/shell32_new/res/icons/Icon_Licence/Tango.txt diff --cc dll/win32/shell32_new/res/rgs/adminfoldershortcut.rgs index 00000000000,bc66450a2af..bc66450a2af mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/adminfoldershortcut.rgs +++ b/dll/win32/shell32_new/res/rgs/adminfoldershortcut.rgs diff --cc dll/win32/shell32_new/res/rgs/autocomplete.rgs index 00000000000,9afd9d5cb86..9afd9d5cb86 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/autocomplete.rgs +++ b/dll/win32/shell32_new/res/rgs/autocomplete.rgs diff --cc dll/win32/shell32_new/res/rgs/controlpanel.rgs index 00000000000,298ff87c917..298ff87c917 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/controlpanel.rgs +++ b/dll/win32/shell32_new/res/rgs/controlpanel.rgs diff --cc dll/win32/shell32_new/res/rgs/dragdrophelper.rgs index 00000000000,25d710d188c..25d710d188c mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/dragdrophelper.rgs +++ b/dll/win32/shell32_new/res/rgs/dragdrophelper.rgs diff --cc dll/win32/shell32_new/res/rgs/folderoptions.rgs index 00000000000,eead3b603a6..eead3b603a6 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/folderoptions.rgs +++ b/dll/win32/shell32_new/res/rgs/folderoptions.rgs diff --cc dll/win32/shell32_new/res/rgs/foldershortcut.rgs index 00000000000,9df72086aed..9df72086aed mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/foldershortcut.rgs +++ b/dll/win32/shell32_new/res/rgs/foldershortcut.rgs diff --cc dll/win32/shell32_new/res/rgs/fontsfoldershortcut.rgs index 00000000000,69591c6644f..69591c6644f mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/fontsfoldershortcut.rgs +++ b/dll/win32/shell32_new/res/rgs/fontsfoldershortcut.rgs diff --cc dll/win32/shell32_new/res/rgs/menubandsite.rgs index 00000000000,c597e873135..c597e873135 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/menubandsite.rgs +++ b/dll/win32/shell32_new/res/rgs/menubandsite.rgs diff --cc dll/win32/shell32_new/res/rgs/mycomputer.rgs index 00000000000,85aa1496c1f..85aa1496c1f mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/mycomputer.rgs +++ b/dll/win32/shell32_new/res/rgs/mycomputer.rgs diff --cc dll/win32/shell32_new/res/rgs/mydocuments.rgs index 00000000000,9b65a9ad09e..9b65a9ad09e mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/mydocuments.rgs +++ b/dll/win32/shell32_new/res/rgs/mydocuments.rgs diff --cc dll/win32/shell32_new/res/rgs/networkplaces.rgs index 00000000000,da25a52dc2b..da25a52dc2b mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/networkplaces.rgs +++ b/dll/win32/shell32_new/res/rgs/networkplaces.rgs diff --cc dll/win32/shell32_new/res/rgs/newmenu.rgs index 00000000000,b3a6cab8f49..b3a6cab8f49 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/newmenu.rgs +++ b/dll/win32/shell32_new/res/rgs/newmenu.rgs diff --cc dll/win32/shell32_new/res/rgs/printers.rgs index 00000000000,9277ae3b128..9277ae3b128 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/printers.rgs +++ b/dll/win32/shell32_new/res/rgs/printers.rgs diff --cc dll/win32/shell32_new/res/rgs/recyclebin.rgs index 00000000000,b84d0db826c..b84d0db826c mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/recyclebin.rgs +++ b/dll/win32/shell32_new/res/rgs/recyclebin.rgs diff --cc dll/win32/shell32_new/res/rgs/shelldesktop.rgs index 00000000000,476fecab80f..476fecab80f mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/shelldesktop.rgs +++ b/dll/win32/shell32_new/res/rgs/shelldesktop.rgs diff --cc dll/win32/shell32_new/res/rgs/shellfsfolder.rgs index 00000000000,00d9daee97b..00d9daee97b mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/shellfsfolder.rgs +++ b/dll/win32/shell32_new/res/rgs/shellfsfolder.rgs diff --cc dll/win32/shell32_new/res/rgs/shelllink.rgs index 00000000000,a5972a70f9f..a5972a70f9f mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/shelllink.rgs +++ b/dll/win32/shell32_new/res/rgs/shelllink.rgs diff --cc dll/win32/shell32_new/res/rgs/startmenu.rgs index 00000000000,a91a3464ec2..a91a3464ec2 mode 000000,100644..100644 --- a/dll/win32/shell32_new/res/rgs/startmenu.rgs +++ b/dll/win32/shell32_new/res/rgs/startmenu.rgs diff --cc dll/win32/shell32_new/rgs_res.rc index 00000000000,6a37542b463..6a37542b463 mode 000000,100644..100644 --- a/dll/win32/shell32_new/rgs_res.rc +++ b/dll/win32/shell32_new/rgs_res.rc diff --cc dll/win32/shell32_new/ros-systray.cpp index 00000000000,f560b498e03..f560b498e03 mode 000000,100644..100644 --- a/dll/win32/shell32_new/ros-systray.cpp +++ b/dll/win32/shell32_new/ros-systray.cpp diff --cc dll/win32/shell32_new/she_ocmenu.cpp index 00000000000,2cf5ec99def..2cf5ec99def mode 000000,100644..100644 --- a/dll/win32/shell32_new/she_ocmenu.cpp +++ b/dll/win32/shell32_new/she_ocmenu.cpp diff --cc dll/win32/shell32_new/she_ocmenu.h index 00000000000,f4cf23b3b7a..f4cf23b3b7a mode 000000,100644..100644 --- a/dll/win32/shell32_new/she_ocmenu.h +++ b/dll/win32/shell32_new/she_ocmenu.h diff --cc dll/win32/shell32_new/shell.cpp index 00000000000,71761fc49ad..71761fc49ad mode 000000,100644..100644 --- a/dll/win32/shell32_new/shell.cpp +++ b/dll/win32/shell32_new/shell.cpp diff --cc dll/win32/shell32_new/shell32.rbuild index 00000000000,45057fe08f7..45057fe08f7 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shell32.rbuild +++ b/dll/win32/shell32_new/shell32.rbuild diff --cc dll/win32/shell32_new/shell32.rbuild.bak index 00000000000,d871af6daab..d871af6daab mode 000000,100644..100644 --- a/dll/win32/shell32_new/shell32.rbuild.bak +++ b/dll/win32/shell32_new/shell32.rbuild.bak diff --cc dll/win32/shell32_new/shell32.rc index 00000000000,88169ea741b..88169ea741b mode 000000,100644..100644 --- a/dll/win32/shell32_new/shell32.rc +++ b/dll/win32/shell32_new/shell32.rc diff --cc dll/win32/shell32_new/shell32.spec index 00000000000,e8d0064e182..e8d0064e182 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shell32.spec +++ b/dll/win32/shell32_new/shell32.spec diff --cc dll/win32/shell32_new/shell32_main.cpp index 00000000000,631ef229a0c..631ef229a0c mode 000000,100644..100644 --- a/dll/win32/shell32_new/shell32_main.cpp +++ b/dll/win32/shell32_new/shell32_main.cpp diff --cc dll/win32/shell32_new/shell32_main.h index 00000000000,729e4423a8c..729e4423a8c mode 000000,100644..100644 --- a/dll/win32/shell32_new/shell32_main.h +++ b/dll/win32/shell32_new/shell32_main.h diff --cc dll/win32/shell32_new/shellfolder.h index 00000000000,7b8bd898271..7b8bd898271 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shellfolder.h +++ b/dll/win32/shell32_new/shellfolder.h diff --cc dll/win32/shell32_new/shellitem.cpp index 00000000000,4a7b52d3383..4a7b52d3383 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shellitem.cpp +++ b/dll/win32/shell32_new/shellitem.cpp diff --cc dll/win32/shell32_new/shellitem.h index 00000000000,546fb74c44e..546fb74c44e mode 000000,100644..100644 --- a/dll/win32/shell32_new/shellitem.h +++ b/dll/win32/shell32_new/shellitem.h diff --cc dll/win32/shell32_new/shelllink.cpp index 00000000000,348ebbf6d76..348ebbf6d76 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shelllink.cpp +++ b/dll/win32/shell32_new/shelllink.cpp diff --cc dll/win32/shell32_new/shelllink.h index 00000000000,a05dd23934f..a05dd23934f mode 000000,100644..100644 --- a/dll/win32/shell32_new/shelllink.h +++ b/dll/win32/shell32_new/shelllink.h diff --cc dll/win32/shell32_new/shellole.cpp index 00000000000,3c01c0a360d..3c01c0a360d mode 000000,100644..100644 --- a/dll/win32/shell32_new/shellole.cpp +++ b/dll/win32/shell32_new/shellole.cpp diff --cc dll/win32/shell32_new/shellord.cpp index 00000000000,ff499ea4132..ff499ea4132 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shellord.cpp +++ b/dll/win32/shell32_new/shellord.cpp diff --cc dll/win32/shell32_new/shellpath.cpp index 00000000000,f1418618ac8..f1418618ac8 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shellpath.cpp +++ b/dll/win32/shell32_new/shellpath.cpp diff --cc dll/win32/shell32_new/shellreg.cpp index 00000000000,5cd665f22c6..5cd665f22c6 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shellreg.cpp +++ b/dll/win32/shell32_new/shellreg.cpp diff --cc dll/win32/shell32_new/shellstring.cpp index 00000000000,073270ad149..073270ad149 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shellstring.cpp +++ b/dll/win32/shell32_new/shellstring.cpp diff --cc dll/win32/shell32_new/shfldr.h index 00000000000,886f36619b8..886f36619b8 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr.h +++ b/dll/win32/shell32_new/shfldr.h diff --cc dll/win32/shell32_new/shfldr_admintools.cpp index 00000000000,756228e31bf..756228e31bf mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_admintools.cpp +++ b/dll/win32/shell32_new/shfldr_admintools.cpp diff --cc dll/win32/shell32_new/shfldr_admintools.h index 00000000000,98f7df361e9..98f7df361e9 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_admintools.h +++ b/dll/win32/shell32_new/shfldr_admintools.h diff --cc dll/win32/shell32_new/shfldr_cpanel.cpp index 00000000000,5f72b859c12..5f72b859c12 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_cpanel.cpp +++ b/dll/win32/shell32_new/shfldr_cpanel.cpp diff --cc dll/win32/shell32_new/shfldr_cpanel.h index 00000000000,bcb1f07728f..bcb1f07728f mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_cpanel.h +++ b/dll/win32/shell32_new/shfldr_cpanel.h diff --cc dll/win32/shell32_new/shfldr_desktop.cpp index 00000000000,fe03e9ed913..fe03e9ed913 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_desktop.cpp +++ b/dll/win32/shell32_new/shfldr_desktop.cpp diff --cc dll/win32/shell32_new/shfldr_desktop.h index 00000000000,ab20136ffb7..ab20136ffb7 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_desktop.h +++ b/dll/win32/shell32_new/shfldr_desktop.h diff --cc dll/win32/shell32_new/shfldr_fonts.cpp index 00000000000,3d88bdad834..3d88bdad834 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_fonts.cpp +++ b/dll/win32/shell32_new/shfldr_fonts.cpp diff --cc dll/win32/shell32_new/shfldr_fonts.h index 00000000000,bce7bc3940a..bce7bc3940a mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_fonts.h +++ b/dll/win32/shell32_new/shfldr_fonts.h diff --cc dll/win32/shell32_new/shfldr_fs.cpp index 00000000000,df1d3cc48d9..df1d3cc48d9 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_fs.cpp +++ b/dll/win32/shell32_new/shfldr_fs.cpp diff --cc dll/win32/shell32_new/shfldr_fs.h index 00000000000,6523659b602..6523659b602 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_fs.h +++ b/dll/win32/shell32_new/shfldr_fs.h diff --cc dll/win32/shell32_new/shfldr_mycomp.cpp index 00000000000,d950fb6b22c..d950fb6b22c mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_mycomp.cpp +++ b/dll/win32/shell32_new/shfldr_mycomp.cpp diff --cc dll/win32/shell32_new/shfldr_mycomp.h index 00000000000,cdc892c83eb..cdc892c83eb mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_mycomp.h +++ b/dll/win32/shell32_new/shfldr_mycomp.h diff --cc dll/win32/shell32_new/shfldr_mydocuments.cpp index 00000000000,f72f32c88ce..f72f32c88ce mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_mydocuments.cpp +++ b/dll/win32/shell32_new/shfldr_mydocuments.cpp diff --cc dll/win32/shell32_new/shfldr_mydocuments.h index 00000000000,add9965f700..add9965f700 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_mydocuments.h +++ b/dll/win32/shell32_new/shfldr_mydocuments.h diff --cc dll/win32/shell32_new/shfldr_netplaces.cpp index 00000000000,c4facd2a829..c4facd2a829 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_netplaces.cpp +++ b/dll/win32/shell32_new/shfldr_netplaces.cpp diff --cc dll/win32/shell32_new/shfldr_netplaces.h index 00000000000,8f9cc477c7c..8f9cc477c7c mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_netplaces.h +++ b/dll/win32/shell32_new/shfldr_netplaces.h diff --cc dll/win32/shell32_new/shfldr_printers.cpp index 00000000000,b04601b8b54..b04601b8b54 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_printers.cpp +++ b/dll/win32/shell32_new/shfldr_printers.cpp diff --cc dll/win32/shell32_new/shfldr_printers.h index 00000000000,174b698d977..174b698d977 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_printers.h +++ b/dll/win32/shell32_new/shfldr_printers.h diff --cc dll/win32/shell32_new/shfldr_recyclebin.cpp index 00000000000,d0c39eb13a2..d0c39eb13a2 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_recyclebin.cpp +++ b/dll/win32/shell32_new/shfldr_recyclebin.cpp diff --cc dll/win32/shell32_new/shfldr_recyclebin.h index 00000000000,2a2e5988f1c..2a2e5988f1c mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_recyclebin.h +++ b/dll/win32/shell32_new/shfldr_recyclebin.h diff --cc dll/win32/shell32_new/shfldr_unixfs.cpp index 00000000000,95e4defc81e..95e4defc81e mode 000000,100644..100644 --- a/dll/win32/shell32_new/shfldr_unixfs.cpp +++ b/dll/win32/shell32_new/shfldr_unixfs.cpp diff --cc dll/win32/shell32_new/shlexec.cpp index 00000000000,f83c901671d..f83c901671d mode 000000,100644..100644 --- a/dll/win32/shell32_new/shlexec.cpp +++ b/dll/win32/shell32_new/shlexec.cpp diff --cc dll/win32/shell32_new/shlfileop.cpp index 00000000000,b0d97c64ad9..b0d97c64ad9 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shlfileop.cpp +++ b/dll/win32/shell32_new/shlfileop.cpp diff --cc dll/win32/shell32_new/shlfolder.cpp index 00000000000,cb6fce5c48d..cb6fce5c48d mode 000000,100644..100644 --- a/dll/win32/shell32_new/shlfolder.cpp +++ b/dll/win32/shell32_new/shlfolder.cpp diff --cc dll/win32/shell32_new/shlfsbind.cpp index 00000000000,6cd898531b8..6cd898531b8 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shlfsbind.cpp +++ b/dll/win32/shell32_new/shlfsbind.cpp diff --cc dll/win32/shell32_new/shlmenu.cpp index 00000000000,63abcb7b862..63abcb7b862 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shlmenu.cpp +++ b/dll/win32/shell32_new/shlmenu.cpp diff --cc dll/win32/shell32_new/shlview.cpp index 00000000000,d19f023788e..d19f023788e mode 000000,100644..100644 --- a/dll/win32/shell32_new/shlview.cpp +++ b/dll/win32/shell32_new/shlview.cpp diff --cc dll/win32/shell32_new/shobjidl_local.idl index 00000000000,1f90784d861..1f90784d861 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shobjidl_local.idl +++ b/dll/win32/shell32_new/shobjidl_local.idl diff --cc dll/win32/shell32_new/shpolicy.cpp index 00000000000,965118e0cf1..965118e0cf1 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shpolicy.cpp +++ b/dll/win32/shell32_new/shpolicy.cpp diff --cc dll/win32/shell32_new/shresdef.h index 00000000000,15c984812b2..15c984812b2 mode 000000,100644..100644 --- a/dll/win32/shell32_new/shresdef.h +++ b/dll/win32/shell32_new/shresdef.h diff --cc dll/win32/shell32_new/shv_def_cmenu.cpp index 00000000000,0914b3cc4ae..0914b3cc4ae mode 000000,100644..100644 --- a/dll/win32/shell32_new/shv_def_cmenu.cpp +++ b/dll/win32/shell32_new/shv_def_cmenu.cpp diff --cc dll/win32/shell32_new/shv_item_new.cpp index 00000000000,c04b3870f9b..c04b3870f9b mode 000000,100644..100644 --- a/dll/win32/shell32_new/shv_item_new.cpp +++ b/dll/win32/shell32_new/shv_item_new.cpp diff --cc dll/win32/shell32_new/shv_item_new.h index 00000000000,2bedc5bd60b..2bedc5bd60b mode 000000,100644..100644 --- a/dll/win32/shell32_new/shv_item_new.h +++ b/dll/win32/shell32_new/shv_item_new.h diff --cc dll/win32/shell32_new/startmenu.cpp index 00000000000,2b3f81101a0..2b3f81101a0 mode 000000,100644..100644 --- a/dll/win32/shell32_new/startmenu.cpp +++ b/dll/win32/shell32_new/startmenu.cpp diff --cc dll/win32/shell32_new/startmenu.h index 00000000000,d9773da4bbd..d9773da4bbd mode 000000,100644..100644 --- a/dll/win32/shell32_new/startmenu.h +++ b/dll/win32/shell32_new/startmenu.h diff --cc dll/win32/shell32_new/stubs.cpp index 00000000000,ab94da13761..ab94da13761 mode 000000,100644..100644 --- a/dll/win32/shell32_new/stubs.cpp +++ b/dll/win32/shell32_new/stubs.cpp diff --cc dll/win32/shell32_new/systray.cpp index 00000000000,81297a78907..81297a78907 mode 000000,100644..100644 --- a/dll/win32/shell32_new/systray.cpp +++ b/dll/win32/shell32_new/systray.cpp diff --cc dll/win32/shell32_new/toolband.cpp index 00000000000,e69de29bb2d..e69de29bb2d mode 000000,100644..100644 --- a/dll/win32/shell32_new/toolband.cpp +++ b/dll/win32/shell32_new/toolband.cpp diff --cc dll/win32/shell32_new/toolband.h index 00000000000,e69de29bb2d..e69de29bb2d mode 000000,100644..100644 --- a/dll/win32/shell32_new/toolband.h +++ b/dll/win32/shell32_new/toolband.h diff --cc dll/win32/shell32_new/undocshell.h index 00000000000,a51af2224fa..a51af2224fa mode 000000,100644..100644 --- a/dll/win32/shell32_new/undocshell.h +++ b/dll/win32/shell32_new/undocshell.h diff --cc dll/win32/shell32_new/version.h index 00000000000,cd0d8dbb9c7..cd0d8dbb9c7 mode 000000,100644..100644 --- a/dll/win32/shell32_new/version.h +++ b/dll/win32/shell32_new/version.h diff --cc dll/win32/shell32_new/xdg.h index 00000000000,6c083c66e32..6c083c66e32 mode 000000,100644..100644 --- a/dll/win32/shell32_new/xdg.h +++ b/dll/win32/shell32_new/xdg.h diff --cc dll/win32/shimgvw/lang/fr-FR.rc index 00000000000,6440bae798f..6440bae798f mode 000000,100644..100644 --- a/dll/win32/shimgvw/lang/fr-FR.rc +++ b/dll/win32/shimgvw/lang/fr-FR.rc diff --cc dll/win32/shimgvw/lang/it-IT.rc index 00000000000,e48d6e08b28..e48d6e08b28 mode 000000,100644..100644 --- a/dll/win32/shimgvw/lang/it-IT.rc +++ b/dll/win32/shimgvw/lang/it-IT.rc diff --cc dll/win32/shimgvw/lang/pl-PL.rc index 00000000000,dd90848c68b..dd90848c68b mode 000000,100644..100644 --- a/dll/win32/shimgvw/lang/pl-PL.rc +++ b/dll/win32/shimgvw/lang/pl-PL.rc diff --cc dll/win32/syssetup/syssetup.rc index bf10ebec37b,00000000000..e23f4914fc2 mode 100644,000000..100644 --- a/dll/win32/syssetup/syssetup.rc +++ b/dll/win32/syssetup/syssetup.rc @@@ -1,75 -1,0 +1,62 @@@ +/* $Id$ */ + +#include +#include "resource.h" + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "System Setup DLL\0" +#define REACTOS_STR_INTERNAL_NAME "syssetup\0" +#define REACTOS_STR_ORIGINAL_FILENAME "syssetup.dll\0" +#include + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +/* Bitmaps */ +IDB_WATERMARK BITMAP "resources/watermark.bmp" +IDB_HEADER BITMAP "resources/header.bmp" + +IDI_ICON1 ICON "resources/1.ico" +IDI_ICON2 ICON "resources/2.ico" +IDI_ICON3 ICON "resources/3.ico" +IDI_ICON4 ICON "resources/4.ico" +IDI_ICON5 ICON "resources/5.ico" + + +STRINGTABLE +BEGIN - IDS_ACKPROJECTS "Wine - http://www.winehq.org\n"\ - "FreeType - http://www.freetype.org\n"\ - "Expat - http://expat.sourceforge.net\n"\ - "DJGPP - http://www.delorie.com/djgpp\n"\ - "SYSLINUX - http://syslinux.zytor.com\n"\ - "Xbox Linux - http://www.xbox-linux.org\n"\ - "MinGW - http://www.mingw.org\n"\ - "Bochs - http://bochs.sourceforge.net\n"\ - "QEMU - http://fabrice.bellard.free.fr/qemu\n"\ - "Mesa3D - http://www.mesa3d.org\n"\ - "FreeBSD - http://www.freebsd.org\n"\ - "adns - http://adns.jgaa.com\n"\ - "ICU - http://www.icu-project.org/\n"\ - "GraphApp - http://enchantia.com/software/graphapp/\n"\ - "Ext2 - http://winext2fsd.sourceforge.net/\n"\ - "X - http://www.x.org/\n"\ - "" ++ IDS_ACKPROJECTS "Wine - http://www.winehq.org\nFreeType - http://www.freetype.org\nExpat - http://expat.sourceforge.net\nDJGPP - http://www.delorie.com/djgpp\nSYSLINUX - http://syslinux.zytor.com\nXbox Linux - http://www.xbox-linux.org\nMinGW - http://www.mingw.org\nBochs - http://bochs.sourceforge.net\nQEMU - http://fabrice.bellard.free.fr/qemu\nMesa3D - http://www.mesa3d.org\nFreeBSD - http://www.freebsd.org\nadns - http://adns.jgaa.com\nICU - http://www.icu-project.org/\nGraphApp - http://enchantia.com/software/graphapp/\nExt2 - http://winext2fsd.sourceforge.net/\nX - http://www.x.org/\n" +END + +IDR_GPL RT_TEXT "COPYING" + + +/* + * Everything specific to any language goes in one of the specific + * files. Note that you can and may override resources which also have + * a neutral version. This is to get localized bitmaps for example. + */ + +#include "lang/bg-BG.rc" +#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/et-EE.rc" +#include "lang/fr-FR.rc" +#include "lang/hu-HU.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/no-NO.rc" +#include "lang/nl-NL.rc" - #include "lang/pl-PL.rc" +#include "lang/pt-BR.rc" +#include "lang/sk-SK.rc" - #include "lang/uk-UA.rc" +#include "lang/zh-CN.rc" ++ ++// UTF-8 ++#pragma code_page(65001) ++#include "lang/pl-PL.rc" +#include "lang/ro-RO.rc" +#include "lang/ru-RU.rc" ++#include "lang/uk-UA.rc" diff --cc dll/win32/unicows/CMakeLists.txt index 00000000000,1abe3c6c9d6..1abe3c6c9d6 mode 000000,100644..100644 --- a/dll/win32/unicows/CMakeLists.txt +++ b/dll/win32/unicows/CMakeLists.txt diff --cc dll/win32/unicows/unicows.rbuild index 00000000000,8b1acd1d351..8b1acd1d351 mode 000000,100644..100644 --- a/dll/win32/unicows/unicows.rbuild +++ b/dll/win32/unicows/unicows.rbuild diff --cc dll/win32/unicows/unicows.spec index 00000000000,47ba26fdda0..47ba26fdda0 mode 000000,100644..100644 --- a/dll/win32/unicows/unicows.spec +++ b/dll/win32/unicows/unicows.spec diff --cc dll/win32/urlmon/urlmon.rgs index 00000000000,868baad2a58..868baad2a58 mode 000000,100644..100644 --- a/dll/win32/urlmon/urlmon.rgs +++ b/dll/win32/urlmon/urlmon.rgs diff --cc dll/win32/user32/controls/appswitch.c index 00000000000,063e5b2b5c5..063e5b2b5c5 mode 000000,100644..100644 --- a/dll/win32/user32/controls/appswitch.c +++ b/dll/win32/user32/controls/appswitch.c diff --cc dll/win32/user32/resources/obm_btncorners.bmp index 00000000000,e7838624b1a..e7838624b1a mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_btsize.bmp index 00000000000,076e4f870ee..076e4f870ee mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_check.bmp index 00000000000,e9e4fb5de77..e9e4fb5de77 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_dnarrow.bmp index 00000000000,0f3288f3245..0f3288f3245 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_dnarrowd.bmp index 00000000000,51b38e90f75..51b38e90f75 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_dnarrowi.bmp index 00000000000,3cbf4fbba4c..3cbf4fbba4c mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_lfarrow.bmp index 00000000000,6ceef252550..6ceef252550 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_lfarrowd.bmp index 00000000000,bb446c3e040..bb446c3e040 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_lfarrowi.bmp index 00000000000,c81363d484f..c81363d484f mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_old_close.bmp index 00000000000,905e927ec82..905e927ec82 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_old_dnarrow.bmp index 00000000000,bab716f95a6..bab716f95a6 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_old_lfarrow.bmp index 00000000000,4d4c4c62f99..4d4c4c62f99 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_old_reduce.bmp index 00000000000,cee2329995f..cee2329995f mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_old_restore.bmp index 00000000000,f6938f01325..f6938f01325 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_old_rgarrow.bmp index 00000000000,0c05d811730..0c05d811730 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_old_uparrow.bmp index 00000000000,299fadb47a0..299fadb47a0 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_old_zoom.bmp index 00000000000,c1b4eb68b88..c1b4eb68b88 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_reduce.bmp index 00000000000,d0dbf01a44a..d0dbf01a44a mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_reduced.bmp index 00000000000,c39f8e9505a..c39f8e9505a mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_restore.bmp index 00000000000,a22d3ddff44..a22d3ddff44 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_restored.bmp index 00000000000,6958dc2ca15..6958dc2ca15 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_rgarrow.bmp index 00000000000,75cc1ff5308..75cc1ff5308 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_rgarrowd.bmp index 00000000000,abf3f7c99f2..abf3f7c99f2 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_rgarrowi.bmp index 00000000000,a90b836a739..a90b836a739 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_size.bmp index 00000000000,d4eedf965f3..d4eedf965f3 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_trtype.bmp index 00000000000,da41d3233f1..da41d3233f1 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_uparrow.bmp index 00000000000,ce3aa0e29ae..ce3aa0e29ae mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_uparrowd.bmp index 00000000000,872dc323044..872dc323044 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_uparrowi.bmp index 00000000000,6abb8106366..6abb8106366 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_zoom.bmp index 00000000000,a3838ebaea1..a3838ebaea1 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/user32/resources/obm_zoomd.bmp index 00000000000,649958db0c3..649958db0c3 mode 000000,100644..100644 Binary files differ diff --cc dll/win32/uxtheme/CMakeLists.txt index dc34ff387e6,00000000000..5c9b5152abe mode 100644,000000..100644 --- a/dll/win32/uxtheme/CMakeLists.txt +++ b/dll/win32/uxtheme/CMakeLists.txt @@@ -1,33 -1,0 +1,33 @@@ + +include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +add_definitions(-D__WINESRC__) +set_rc_compiler() + +spec2def(uxtheme.dll uxtheme.spec) + +list(APPEND SOURCE + buffer.c + draw.c + main.c + metric.c + msstyles.c + nonclient.c + property.c + stylemap.c + system.c + themehooks.c + uxini.c + version.rc + ${CMAKE_CURRENT_BINARY_DIR}/uxtheme_stubs.c + ${CMAKE_CURRENT_BINARY_DIR}/uxtheme.def) + +add_library(uxtheme SHARED ${SOURCE}) + +set_module_type(uxtheme win32dll) + +target_link_libraries(uxtheme wine) + +add_importlibs(uxtheme user32 advapi32 gdi32 msimg32 msvcrt kernel32 ntdll) + - add_cab_target(uxtheme 1) ++add_cd_file(TARGET uxtheme DESTINATION reactos/system32 FOR all) +add_importlib_target(uxtheme.spec) diff --cc dll/win32/windowscodecs/typeof.h index 00000000000,006ae624b34..006ae624b34 mode 000000,100644..100644 --- a/dll/win32/windowscodecs/typeof.h +++ b/dll/win32/windowscodecs/typeof.h diff --cc dll/win32/wininet/wininet_Eo.rc index 00000000000,8929e7ec0f2..8929e7ec0f2 mode 000000,100644..100644 --- a/dll/win32/wininet/wininet_Eo.rc +++ b/dll/win32/wininet/wininet_Eo.rc diff --cc dll/win32/wininet/wininet_He.rc index 00000000000,4de3674097a..4de3674097a mode 000000,100644..100644 --- a/dll/win32/wininet/wininet_He.rc +++ b/dll/win32/wininet/wininet_He.rc diff --cc dll/win32/wininet/wininet_Sr.rc index 00000000000,37a57420514..37a57420514 mode 000000,100644..100644 --- a/dll/win32/wininet/wininet_Sr.rc +++ b/dll/win32/wininet/wininet_Sr.rc diff --cc drivers/bluetooth/fbtusb/fbtdev.c index 15f96e13e26,15f96e13e26..15f96e13e26 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/fbtdev.c +++ b/drivers/bluetooth/fbtusb/fbtdev.c diff --cc drivers/bluetooth/fbtusb/fbtpnp.c index 4589ebf3563,4589ebf3563..4589ebf3563 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/fbtpnp.c +++ b/drivers/bluetooth/fbtusb/fbtpnp.c diff --cc drivers/bluetooth/fbtusb/fbtpwr.c index 0bd6ceaa348,0bd6ceaa348..0bd6ceaa348 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/fbtpwr.c +++ b/drivers/bluetooth/fbtusb/fbtpwr.c diff --cc drivers/bluetooth/fbtusb/fbtrwr.c index f8272895592,f8272895592..f8272895592 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/fbtrwr.c +++ b/drivers/bluetooth/fbtusb/fbtrwr.c diff --cc drivers/bluetooth/fbtusb/fbtusb.c index 353eab457c4,353eab457c4..353eab457c4 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/fbtusb.c +++ b/drivers/bluetooth/fbtusb/fbtusb.c diff --cc drivers/bluetooth/fbtusb/fbtwmi.c index 66c8da6803c,66c8da6803c..66c8da6803c mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/fbtwmi.c +++ b/drivers/bluetooth/fbtusb/fbtwmi.c diff --cc drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h index 1e91486a2e1,1e91486a2e1..1e91486a2e1 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h +++ b/drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h diff --cc drivers/bluetooth/fbtusb/include/fbtHciCmds.h index 3a08205b182,3a08205b182..3a08205b182 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtHciCmds.h +++ b/drivers/bluetooth/fbtusb/include/fbtHciCmds.h diff --cc drivers/bluetooth/fbtusb/include/fbtHciDefs.h index f8894fe385c,f8894fe385c..f8894fe385c mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtHciDefs.h +++ b/drivers/bluetooth/fbtusb/include/fbtHciDefs.h diff --cc drivers/bluetooth/fbtusb/include/fbtHciErrors.h index 98851627a65,98851627a65..98851627a65 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtHciErrors.h +++ b/drivers/bluetooth/fbtusb/include/fbtHciErrors.h diff --cc drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h index 0610b751822,0610b751822..0610b751822 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h +++ b/drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h diff --cc drivers/bluetooth/fbtusb/include/fbtHciEvents.h index a65c9f21872,a65c9f21872..a65c9f21872 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtHciEvents.h +++ b/drivers/bluetooth/fbtusb/include/fbtHciEvents.h diff --cc drivers/bluetooth/fbtusb/include/fbtHciLocal.h index 1c3e631854a,1c3e631854a..1c3e631854a mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtHciLocal.h +++ b/drivers/bluetooth/fbtusb/include/fbtHciLocal.h diff --cc drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h index c891b442ddd,c891b442ddd..c891b442ddd mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h +++ b/drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h diff --cc drivers/bluetooth/fbtusb/include/fbtHciParms.h index 727fe511afd,727fe511afd..727fe511afd mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtHciParms.h +++ b/drivers/bluetooth/fbtusb/include/fbtHciParms.h diff --cc drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h index c945bc00701,c945bc00701..c945bc00701 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h +++ b/drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h diff --cc drivers/bluetooth/fbtusb/include/fbtHciSizes.h index d18ffc23999,d18ffc23999..d18ffc23999 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtHciSizes.h +++ b/drivers/bluetooth/fbtusb/include/fbtHciSizes.h diff --cc drivers/bluetooth/fbtusb/include/fbtSeXcpt.h index 0f211b45611,0f211b45611..0f211b45611 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtSeXcpt.h +++ b/drivers/bluetooth/fbtusb/include/fbtSeXcpt.h diff --cc drivers/bluetooth/fbtusb/include/fbtdev.h index dda681845b0,dda681845b0..dda681845b0 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtdev.h +++ b/drivers/bluetooth/fbtusb/include/fbtdev.h diff --cc drivers/bluetooth/fbtusb/include/fbthci.h index 09e64919f38,09e64919f38..09e64919f38 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbthci.h +++ b/drivers/bluetooth/fbtusb/include/fbthci.h diff --cc drivers/bluetooth/fbtusb/include/fbthw.h index 43b2a005654,43b2a005654..43b2a005654 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbthw.h +++ b/drivers/bluetooth/fbtusb/include/fbthw.h diff --cc drivers/bluetooth/fbtusb/include/fbtlog.h index 3b572e59c65,3b572e59c65..3b572e59c65 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtlog.h +++ b/drivers/bluetooth/fbtusb/include/fbtlog.h diff --cc drivers/bluetooth/fbtusb/include/fbtpnp.h index 3ceebb2a18f,3ceebb2a18f..3ceebb2a18f mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtpnp.h +++ b/drivers/bluetooth/fbtusb/include/fbtpnp.h diff --cc drivers/bluetooth/fbtusb/include/fbtpwr.h index 0c6f4bff160,0c6f4bff160..0c6f4bff160 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtpwr.h +++ b/drivers/bluetooth/fbtusb/include/fbtpwr.h diff --cc drivers/bluetooth/fbtusb/include/fbtreg.h index 38ac78b1177,38ac78b1177..38ac78b1177 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtreg.h +++ b/drivers/bluetooth/fbtusb/include/fbtreg.h diff --cc drivers/bluetooth/fbtusb/include/fbtrwr.h index bca99e7c4be,bca99e7c4be..bca99e7c4be mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtrwr.h +++ b/drivers/bluetooth/fbtusb/include/fbtrwr.h diff --cc drivers/bluetooth/fbtusb/include/fbtusb.h index 42aed7c68de,42aed7c68de..42aed7c68de mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtusb.h +++ b/drivers/bluetooth/fbtusb/include/fbtusb.h diff --cc drivers/bluetooth/fbtusb/include/fbtusr.h index ef458ecab1b,ef458ecab1b..ef458ecab1b mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtusr.h +++ b/drivers/bluetooth/fbtusb/include/fbtusr.h diff --cc drivers/bluetooth/fbtusb/include/fbtutil.h index 05e494bdc05,05e494bdc05..05e494bdc05 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtutil.h +++ b/drivers/bluetooth/fbtusb/include/fbtutil.h diff --cc drivers/bluetooth/fbtusb/include/fbtwmi.h index 2d4691c62c3,2d4691c62c3..2d4691c62c3 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtwmi.h +++ b/drivers/bluetooth/fbtusb/include/fbtwmi.h diff --cc drivers/bluetooth/fbtusb/include/fbtxcpt.h index 3d882b7caa3,3d882b7caa3..3d882b7caa3 mode 100755,100644..100644 --- a/drivers/bluetooth/fbtusb/include/fbtxcpt.h +++ b/drivers/bluetooth/fbtusb/include/fbtxcpt.h diff --cc drivers/filesystems/ntfs/close.c index dd27cc1ff02,dd27cc1ff02..dd27cc1ff02 mode 100755,100644..100644 --- a/drivers/filesystems/ntfs/close.c +++ b/drivers/filesystems/ntfs/close.c diff --cc drivers/filesystems/ntfs/notes.txt index 327892febb8,327892febb8..327892febb8 mode 100755,100644..100644 --- a/drivers/filesystems/ntfs/notes.txt +++ b/drivers/filesystems/ntfs/notes.txt diff --cc drivers/filesystems/ntfs/rw.c index 636ec6d224c,636ec6d224c..636ec6d224c mode 100755,100644..100644 --- a/drivers/filesystems/ntfs/rw.c +++ b/drivers/filesystems/ntfs/rw.c diff --cc drivers/multimedia/README index 4df801d5618,4df801d5618..4df801d5618 mode 100755,100644..100644 --- a/drivers/multimedia/README +++ b/drivers/multimedia/README diff --cc drivers/network/tcpip/include/linux.h index 9c4ad1c82ff,9c4ad1c82ff..9c4ad1c82ff mode 100755,100644..100644 --- a/drivers/network/tcpip/include/linux.h +++ b/drivers/network/tcpip/include/linux.h diff --cc drivers/network/tcpip/include/tcpcore.h index 5034e859fa0,5034e859fa0..5034e859fa0 mode 100755,100644..100644 --- a/drivers/network/tcpip/include/tcpcore.h +++ b/drivers/network/tcpip/include/tcpcore.h diff --cc drivers/network/tcpip/include/tcpdef.h index fa77e9f0413,fa77e9f0413..fa77e9f0413 mode 100755,100644..100644 --- a/drivers/network/tcpip/include/tcpdef.h +++ b/drivers/network/tcpip/include/tcpdef.h diff --cc drivers/sac/directory.rbuild index 00000000000,cbcdcfd9011..cbcdcfd9011 mode 000000,100644..100644 --- a/drivers/sac/directory.rbuild +++ b/drivers/sac/directory.rbuild diff --cc drivers/sac/driver/chanmgr.c index 00000000000,1a655d92c02..1a655d92c02 mode 000000,100644..100644 --- a/drivers/sac/driver/chanmgr.c +++ b/drivers/sac/driver/chanmgr.c diff --cc drivers/sac/driver/channel.c index 00000000000,154097ebec0..154097ebec0 mode 000000,100644..100644 --- a/drivers/sac/driver/channel.c +++ b/drivers/sac/driver/channel.c diff --cc drivers/sac/driver/cmdchan.c index 00000000000,de6e2953f2f..de6e2953f2f mode 000000,100644..100644 --- a/drivers/sac/driver/cmdchan.c +++ b/drivers/sac/driver/cmdchan.c diff --cc drivers/sac/driver/concmd.c index 00000000000,42b87ca2795..42b87ca2795 mode 000000,100644..100644 --- a/drivers/sac/driver/concmd.c +++ b/drivers/sac/driver/concmd.c diff --cc drivers/sac/driver/conmgr.c index 00000000000,a01819394af..a01819394af mode 000000,100644..100644 --- a/drivers/sac/driver/conmgr.c +++ b/drivers/sac/driver/conmgr.c diff --cc drivers/sac/driver/data.c index 00000000000,42ebd90662d..42ebd90662d mode 000000,100644..100644 --- a/drivers/sac/driver/data.c +++ b/drivers/sac/driver/data.c diff --cc drivers/sac/driver/dispatch.c index 00000000000,58ffaca4115..58ffaca4115 mode 000000,100644..100644 --- a/drivers/sac/driver/dispatch.c +++ b/drivers/sac/driver/dispatch.c diff --cc drivers/sac/driver/init.c index 00000000000,2be1425f38e..2be1425f38e mode 000000,100644..100644 --- a/drivers/sac/driver/init.c +++ b/drivers/sac/driver/init.c diff --cc drivers/sac/driver/memory.c index 00000000000,fb77febccf6..fb77febccf6 mode 000000,100644..100644 --- a/drivers/sac/driver/memory.c +++ b/drivers/sac/driver/memory.c diff --cc drivers/sac/driver/rawchan.c index 00000000000,6a38bd0a97c..6a38bd0a97c mode 000000,100644..100644 --- a/drivers/sac/driver/rawchan.c +++ b/drivers/sac/driver/rawchan.c diff --cc drivers/sac/driver/sacdrv.h index 00000000000,0936712eb61..0936712eb61 mode 000000,100644..100644 --- a/drivers/sac/driver/sacdrv.h +++ b/drivers/sac/driver/sacdrv.h diff --cc drivers/sac/driver/sacdrv.rbuild index 00000000000,8357c1d440c..8357c1d440c mode 000000,100644..100644 --- a/drivers/sac/driver/sacdrv.rbuild +++ b/drivers/sac/driver/sacdrv.rbuild diff --cc drivers/sac/driver/sacdrv.rc index 00000000000,ceb819a9005..ceb819a9005 mode 000000,100644..100644 --- a/drivers/sac/driver/sacdrv.rc +++ b/drivers/sac/driver/sacdrv.rc diff --cc drivers/sac/driver/util.c index 00000000000,b40f058c592..b40f058c592 mode 000000,100644..100644 --- a/drivers/sac/driver/util.c +++ b/drivers/sac/driver/util.c diff --cc drivers/sac/driver/vtutf8chan.c index 00000000000,26f80d8b448..26f80d8b448 mode 000000,100644..100644 --- a/drivers/sac/driver/vtutf8chan.c +++ b/drivers/sac/driver/vtutf8chan.c diff --cc drivers/storage/fdc/CMakeLists.txt index 00000000000,fc6b28e7a12..fc6b28e7a12 mode 000000,100644..100644 --- a/drivers/storage/fdc/CMakeLists.txt +++ b/drivers/storage/fdc/CMakeLists.txt diff --cc drivers/storage/fdc/directory.rbuild index 00000000000,f270c6bb0bb..f270c6bb0bb mode 000000,100644..100644 --- a/drivers/storage/fdc/directory.rbuild +++ b/drivers/storage/fdc/directory.rbuild diff --cc drivers/storage/fdc/fdc/CMakeLists.txt index 00000000000,51d6893438b..51d6893438b mode 000000,100644..100644 --- a/drivers/storage/fdc/fdc/CMakeLists.txt +++ b/drivers/storage/fdc/fdc/CMakeLists.txt diff --cc drivers/storage/fdc/fdc/SOURCES index 00000000000,7f4ef12c9a0..7f4ef12c9a0 mode 000000,100644..100644 --- a/drivers/storage/fdc/fdc/SOURCES +++ b/drivers/storage/fdc/fdc/SOURCES diff --cc drivers/storage/fdc/fdc/fdc.rbuild index 00000000000,5a63730dc45..5a63730dc45 mode 000000,100644..100644 --- a/drivers/storage/fdc/fdc/fdc.rbuild +++ b/drivers/storage/fdc/fdc/fdc.rbuild diff --cc drivers/storage/ide/uniata/id_sata.cpp index 96627dcb829,00000000000..0a658224870 mode 100644,000000..100644 --- a/drivers/storage/ide/uniata/id_sata.cpp +++ b/drivers/storage/ide/uniata/id_sata.cpp @@@ -1,622 -1,0 +1,1811 @@@ +/*++ + - Copyright (c) 2008-2010 Alexandr A. Telyatnikov (Alter) ++Copyright (c) 2008-2011 Alexandr A. Telyatnikov (Alter) + +Module Name: + id_probe.cpp + +Abstract: + This module handles SATA-related staff + +Author: + Alexander A. Telyatnikov (Alter) + +Environment: + kernel mode only + +Notes: + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Revision History: + +--*/ + +#include "stdafx.h" + +UCHAR +NTAPI +UniataSataConnect( + IN PVOID HwDeviceExtension, + IN ULONG lChannel, // logical channel + IN ULONG pm_port /* for port multipliers */ + ) +{ + PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; + //ULONG Channel = deviceExtension->Channel + lChannel; + PHW_CHANNEL chan = &deviceExtension->chan[lChannel]; + SATA_SSTATUS_REG SStatus; + ULONG i; +/* + UCHAR signatureLow, + signatureHigh; +*/ + UCHAR Status; + + KdPrint2((PRINT_PREFIX "UniataSataConnect:\n")); + + if(!UniataIsSATARangeAvailable(deviceExtension, lChannel)) { + KdPrint2((PRINT_PREFIX " no I/O range\n")); + return IDE_STATUS_IDLE; + } + + /* clear SATA error register, some controllers need this */ + UniataSataWritePort4(chan, IDX_SATA_SError, + UniataSataReadPort4(chan, IDX_SATA_SError, pm_port), pm_port); + /* wait up to 1 second for "connect well" */ + for(i=0; i<100; i++) { + SStatus.Reg = UniataSataReadPort4(chan, IDX_SATA_SStatus, pm_port); + if(SStatus.SPD == SStatus_SPD_Gen1 || - SStatus.SPD == SStatus_SPD_Gen2) { - deviceExtension->lun[lChannel*2].TransferMode = ATA_SA150 + (UCHAR)(SStatus.SPD - 1); ++ SStatus.SPD == SStatus_SPD_Gen2 || ++ SStatus.SPD == SStatus_SPD_Gen3) { ++ chan->lun[0]->TransferMode = ATA_SA150 + (UCHAR)(SStatus.SPD - 1); ++ KdPrint2((PRINT_PREFIX "SATA TransferMode %#x\n", chan->lun[0]->TransferMode)); + break; + } + AtapiStallExecution(10000); + } + if(i >= 100) { + KdPrint2((PRINT_PREFIX "UniataSataConnect: SStatus %8.8x\n", SStatus.Reg)); + return 0xff; + } + /* clear SATA error register */ + UniataSataWritePort4(chan, IDX_SATA_SError, + UniataSataReadPort4(chan, IDX_SATA_SError, pm_port), pm_port); + + Status = WaitOnBaseBusyLong(chan); + if(Status & IDE_STATUS_BUSY) { + return Status; + } +/* + signatureLow = AtapiReadPort1(chan, &deviceExtension->BaseIoAddress1[lChannel].i.CylinderLow); + signatureHigh = AtapiReadPort1(chan, &deviceExtension->baseIoAddress1[lChannel].i.CylinderHigh); + + if (signatureLow == ATAPI_MAGIC_LSB && signatureHigh == ATAPI_MAGIC_MSB) { + } +*/ - KdPrint2((PRINT_PREFIX "UniataSataConnect: OK, ATA status %x\n", Status)); ++ KdPrint2((PRINT_PREFIX "UniataSataConnect: OK, ATA status %#x\n", Status)); + return IDE_STATUS_IDLE; +} // end UniataSataConnect() + +UCHAR +NTAPI +UniataSataPhyEnable( + IN PVOID HwDeviceExtension, + IN ULONG lChannel, // logical channel - IN ULONG pm_port /* for port multipliers */ ++ IN ULONG pm_port, /* for port multipliers */ ++ IN BOOLEAN doReset + ) +{ + PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; + PHW_CHANNEL chan = &deviceExtension->chan[lChannel]; + SATA_SCONTROL_REG SControl; + int loop, retry; + + KdPrint2((PRINT_PREFIX "UniataSataPhyEnable:\n")); + + if(!UniataIsSATARangeAvailable(deviceExtension, lChannel)) { + KdPrint2((PRINT_PREFIX " no I/O range\n")); + return IDE_STATUS_IDLE; + } + + SControl.Reg = UniataSataReadPort4(chan, IDX_SATA_SControl, pm_port); - KdPrint2((PRINT_PREFIX "SControl %x\n", SControl.Reg)); ++ KdPrint2((PRINT_PREFIX "SControl %#x\n", SControl.Reg)); + if(SControl.DET == SControl_DET_Idle) { - return UniataSataConnect(HwDeviceExtension, lChannel, pm_port); ++ if(!doReset) { ++ return UniataSataConnect(HwDeviceExtension, lChannel, pm_port); ++ } + } + + for (retry = 0; retry < 10; retry++) { + KdPrint2((PRINT_PREFIX "UniataSataPhyEnable: retry init %d\n", retry)); + for (loop = 0; loop < 10; loop++) { + SControl.Reg = 0; + SControl.DET = SControl_DET_Init; + UniataSataWritePort4(chan, IDX_SATA_SControl, SControl.Reg, pm_port); + AtapiStallExecution(100); + SControl.Reg = UniataSataReadPort4(chan, IDX_SATA_SControl, pm_port); - KdPrint2((PRINT_PREFIX " SControl %8.8%x\n", SControl.Reg)); ++ KdPrint2((PRINT_PREFIX " SControl %8.8x\n", SControl.Reg)); + if(SControl.DET == SControl_DET_Init) { + break; + } + } + AtapiStallExecution(5000); + KdPrint2((PRINT_PREFIX "UniataSataPhyEnable: retry idle %d\n", retry)); + for (loop = 0; loop < 10; loop++) { + SControl.Reg = 0; + SControl.DET = SControl_DET_DoNothing; + SControl.IPM = SControl_IPM_NoPartialSlumber; + UniataSataWritePort4(chan, IDX_SATA_SControl, SControl.Reg, pm_port); + AtapiStallExecution(100); + SControl.Reg = UniataSataReadPort4(chan, IDX_SATA_SControl, pm_port); - KdPrint2((PRINT_PREFIX " SControl %8.8%x\n", SControl.Reg)); ++ KdPrint2((PRINT_PREFIX " SControl %8.8x\n", SControl.Reg)); + if(SControl.DET == SControl_DET_Idle) { + return UniataSataConnect(HwDeviceExtension, lChannel, pm_port); + } + } + } + + KdPrint2((PRINT_PREFIX "UniataSataPhyEnable: failed\n")); + return 0xff; +} // end UniataSataPhyEnable() + +BOOLEAN +NTAPI +UniataSataClearErr( + IN PVOID HwDeviceExtension, + IN ULONG lChannel, // logical channel + IN BOOLEAN do_connect, + IN ULONG pm_port /* for port multipliers */ + ) +{ + PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; + PHW_CHANNEL chan = &deviceExtension->chan[lChannel]; + //ULONG ChipFlags = deviceExtension->HwFlags & CHIPFLAG_MASK; + SATA_SSTATUS_REG SStatus; + SATA_SERROR_REG SError; + + if(UniataIsSATARangeAvailable(deviceExtension, lChannel)) { + //if(ChipFlags & UNIATA_SATA) { + + SStatus.Reg = UniataSataReadPort4(chan, IDX_SATA_SStatus, pm_port); + SError.Reg = UniataSataReadPort4(chan, IDX_SATA_SError, pm_port); + + if(SStatus.Reg) { - KdPrint2((PRINT_PREFIX " SStatus %x\n", SStatus.Reg)); ++ KdPrint2((PRINT_PREFIX " SStatus %#x\n", SStatus.Reg)); + } + if(SError.Reg) { - KdPrint2((PRINT_PREFIX " SError %x\n", SError.Reg)); ++ KdPrint2((PRINT_PREFIX " SError %#x\n", SError.Reg)); + /* clear error bits/interrupt */ + UniataSataWritePort4(chan, IDX_SATA_SError, SError.Reg, pm_port); + + if(do_connect) { + /* if we have a connection event deal with it */ + if(SError.DIAG.N) { + KdPrint2((PRINT_PREFIX " catch SATA connect/disconnect\n")); + if(SStatus.SPD >= SStatus_SPD_Gen1) { + UniataSataEvent(deviceExtension, lChannel, UNIATA_SATA_EVENT_ATTACH, pm_port); + } else { + UniataSataEvent(deviceExtension, lChannel, UNIATA_SATA_EVENT_DETACH, pm_port); + } + return TRUE; + } + } + } + } + return FALSE; +} // end UniataSataClearErr() + +BOOLEAN +NTAPI +UniataSataEvent( + IN PVOID HwDeviceExtension, + IN ULONG lChannel, // logical channel + IN ULONG Action, + IN ULONG pm_port /* for port multipliers */ + ) +{ + PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; + UCHAR Status; - ULONG ldev = lChannel*2 + (pm_port ? 1 : 0); ++ ULONG DeviceNumber = (pm_port ? 1 : 0); + + if(!UniataIsSATARangeAvailable(deviceExtension, lChannel)) { + return FALSE; + } + + switch(Action) { + case UNIATA_SATA_EVENT_ATTACH: + KdPrint2((PRINT_PREFIX " CONNECTED\n")); + Status = UniataSataConnect(HwDeviceExtension, lChannel, pm_port); - KdPrint2((PRINT_PREFIX " Status %x\n", Status)); ++ KdPrint2((PRINT_PREFIX " Status %#x\n", Status)); + if(Status != IDE_STATUS_IDLE) { + return FALSE; + } - CheckDevice(HwDeviceExtension, lChannel, pm_port ? 1 : 0 /*dev*/, FALSE); ++ CheckDevice(HwDeviceExtension, lChannel, DeviceNumber /*dev*/, FALSE); + return TRUE; + break; + case UNIATA_SATA_EVENT_DETACH: + KdPrint2((PRINT_PREFIX " DISCONNECTED\n")); - UniataForgetDevice(&(deviceExtension->lun[ldev])); ++ UniataForgetDevice(deviceExtension->chan[lChannel].lun[DeviceNumber]); + return TRUE; + break; + } + return FALSE; +} // end UniataSataEvent() + +ULONG +NTAPI ++NTAPI +UniataSataReadPort4( + IN PHW_CHANNEL chan, + IN ULONG io_port_ndx, + IN ULONG pm_port /* for port multipliers */ + ) +{ + if(chan && (io_port_ndx < IDX_MAX_REG) && + chan->RegTranslation[io_port_ndx].Proc) { + ++ KdPrint3((PRINT_PREFIX " UniataSataReadPort4 %#x[%d]\n", io_port_ndx, pm_port)); ++ + PHW_DEVICE_EXTENSION deviceExtension = chan->DeviceExtension; + PVOID HwDeviceExtension = (PVOID)deviceExtension; + ULONG slotNumber = deviceExtension->slotNumber; + ULONG SystemIoBusNumber = deviceExtension->SystemIoBusNumber; + ULONG VendorID = deviceExtension->DevID & 0xffff; + ULONG offs; + ULONG p; + + switch(VendorID) { + case ATA_INTEL_ID: { + p = pm_port ? 1 : 0; + if(deviceExtension->HwFlags & ICH5) { + offs = 0x50+chan->lun[p]->SATA_lun_map*0x10; ++ KdPrint3((PRINT_PREFIX " ICH5 way, offs %#x\n", offs)); + switch(io_port_ndx) { + case IDX_SATA_SStatus: + offs += 0; + break; + case IDX_SATA_SError: + offs += 1*4; + break; + case IDX_SATA_SControl: + offs += 2*4; + break; + default: + return -1; + } + SetPciConfig4(0xa0, offs); + GetPciConfig4(0xa4, offs); + return offs; + } else { + offs = ((deviceExtension->Channel+chan->lChannel)*2+p) * 0x100; ++ KdPrint3((PRINT_PREFIX " def way, offs %#x\n", offs)); + switch(io_port_ndx) { + case IDX_SATA_SStatus: + offs += 0; + break; + case IDX_SATA_SControl: + offs += 1; + break; + case IDX_SATA_SError: + offs += 2; + break; + default: + return -1; + } + AtapiWritePort4(chan, IDX_INDEXED_ADDR, offs); + return AtapiReadPort4(chan, IDX_INDEXED_DATA); + } + } // ATA_INTEL_ID + } // end switch(VendorID) + return -1; + } + return AtapiReadPort4(chan, io_port_ndx); +} // end UniataSataReadPort4() + +VOID +NTAPI +UniataSataWritePort4( + IN PHW_CHANNEL chan, + IN ULONG io_port_ndx, + IN ULONG data, + IN ULONG pm_port /* for port multipliers */ + ) +{ + if(chan && (io_port_ndx < IDX_MAX_REG) && + chan->RegTranslation[io_port_ndx].Proc) { + ++ KdPrint3((PRINT_PREFIX " UniataSataWritePort4 %#x[%d]\n", io_port_ndx, pm_port)); ++ + PHW_DEVICE_EXTENSION deviceExtension = chan->DeviceExtension; + PVOID HwDeviceExtension = (PVOID)deviceExtension; + ULONG slotNumber = deviceExtension->slotNumber; + ULONG SystemIoBusNumber = deviceExtension->SystemIoBusNumber; + ULONG VendorID = deviceExtension->DevID & 0xffff; + ULONG offs; + ULONG p; + + switch(VendorID) { + case ATA_INTEL_ID: { + p = pm_port ? 1 : 0; + if(deviceExtension->HwFlags & ICH5) { + offs = 0x50+chan->lun[p]->SATA_lun_map*0x10; ++ KdPrint3((PRINT_PREFIX " ICH5 way, offs %#x\n", offs)); + switch(io_port_ndx) { + case IDX_SATA_SStatus: + offs += 0; + break; + case IDX_SATA_SError: + offs += 1*4; + break; + case IDX_SATA_SControl: + offs += 2*4; + break; + default: + return; + } + SetPciConfig4(0xa0, offs); + SetPciConfig4(0xa4, data); + return; + } else { + offs = ((deviceExtension->Channel+chan->lChannel)*2+p) * 0x100; ++ KdPrint3((PRINT_PREFIX " def way, offs %#x\n", offs)); + switch(io_port_ndx) { + case IDX_SATA_SStatus: + offs += 0; + break; + case IDX_SATA_SControl: + offs += 1; + break; + case IDX_SATA_SError: + offs += 2; + break; + default: + return; + } + AtapiWritePort4(chan, IDX_INDEXED_ADDR, offs); + AtapiWritePort4(chan, IDX_INDEXED_DATA, data); + } + } // ATA_INTEL_ID + } // end switch(VendorID) + return; + } + AtapiWritePort4(chan, io_port_ndx, data); +} // end UniataSataWritePort4() + ++BOOLEAN ++NTAPI ++UniataSataReadPM( ++ IN PHW_CHANNEL chan, ++ IN ULONG DeviceNumber, ++ IN ULONG Reg, ++ OUT PULONG result ++ ) ++{ ++ if(chan->DeviceExtension->HwFlags & UNIATA_AHCI) { ++ return UniataAhciReadPM(chan, DeviceNumber, Reg, result); ++ } ++ return FALSE; ++} // end UniataSataReadPM() ++ ++UCHAR ++NTAPI ++UniataSataWritePM( ++ IN PHW_CHANNEL chan, ++ IN ULONG DeviceNumber, ++ IN ULONG Reg, ++ IN ULONG value ++ ) ++{ ++ if(chan->DeviceExtension->HwFlags & UNIATA_AHCI) { ++ return UniataAhciWritePM(chan, DeviceNumber, Reg, value); ++ } ++ return 0xff; ++} // end UniataSataWritePM() ++ ++ULONG ++NTAPI ++UniataSataSoftReset( ++ IN PVOID HwDeviceExtension, ++ IN ULONG lChannel, ++ IN ULONG DeviceNumber ++ ) ++{ ++ PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; ++ ++ if(deviceExtension->HwFlags & UNIATA_AHCI) { ++ return UniataAhciSoftReset(HwDeviceExtension, lChannel, DeviceNumber); ++ } ++ return 0xffffffff; ++} // end UniataSataSoftReset() ++ ++VOID ++UniataSataIdentifyPM( ++ IN PHW_CHANNEL chan ++ ) ++{ ++ ULONG PM_DeviceId; ++ ULONG PM_RevId; ++ ULONG PM_Ports; ++ UCHAR i; ++ ULONG signature; ++ PHW_LU_EXTENSION LunExt; ++ ++ KdPrint((PRINT_PREFIX "UniataSataIdentifyPM:\n")); ++ ++ chan->PmLunMap = 0; ++ ++ /* get PM vendor & product data */ ++ if(!UniataSataReadPM(chan, AHCI_DEV_SEL_PM, 0, &PM_DeviceId)) { ++ KdPrint2((PRINT_PREFIX " error getting PM vendor data\n")); ++ return; ++ } ++ /* get PM revision data */ ++ if(!UniataSataReadPM(chan, AHCI_DEV_SEL_PM, 1, &PM_RevId)) { ++ KdPrint2((PRINT_PREFIX " error getting PM revison data\n")); ++ return; ++ } ++ /* get number of HW ports on the PM */ ++ if(!UniataSataReadPM(chan, AHCI_DEV_SEL_PM, 2, &PM_Ports)) { ++ KdPrint2((PRINT_PREFIX " error getting PM port info\n")); ++ return; ++ } ++ ++ PM_Ports &= 0x0000000f; ++ ++ switch(PM_DeviceId) { ++ case 0x37261095: ++ /* This PM declares 6 ports, while only 5 of them are real. ++ * Port 5 is enclosure management bridge port, which has implementation ++ * problems, causing probe faults. Hide it for now. */ ++ KdPrint2((PRINT_PREFIX " SiI 3726 (rev=%#x) Port Multiplier with %d (5) ports\n", ++ PM_RevId, PM_Ports)); ++ PM_Ports = 5; ++ break; ++ case 0x47261095: ++ /* This PM declares 7 ports, while only 5 of them are real. ++ * Port 5 is some fake "Config Disk" with 640 sectors size, ++ * port 6 is enclosure management bridge port. ++ * Both fake ports has implementation problems, causing ++ * probe faults. Hide them for now. */ ++ KdPrint2((PRINT_PREFIX " SiI 4726 (rev=%#x) Port Multiplier with %d (5) ports\n", ++ PM_RevId, PM_Ports)); ++ PM_Ports = 5; ++ break; ++ default: ++ KdPrint2((PRINT_PREFIX " Port Multiplier (id=%08x rev=%#x) with %d ports\n", ++ PM_DeviceId, PM_RevId, PM_Ports)); ++ break; ++ } ++ ++ // reset ++ for(i=0; ilun[i]; ++ ++ KdPrint2((PRINT_PREFIX " Port %d\n", i)); ++ if(UniataSataPhyEnable(chan->DeviceExtension, chan->lChannel, i, UNIATA_SATA_RESET_ENABLE) != IDE_STATUS_IDLE) { ++ LunExt->DeviceFlags &= ~DFLAGS_DEVICE_PRESENT; ++ continue; ++ } ++ /* ++ * XXX: I have no idea how to properly wait for PMP port hardreset ++ * completion. Without this delay soft reset does not completes ++ * successfully. ++ */ ++ AtapiStallExecution(1000000); ++ ++ signature = UniataSataSoftReset(chan->DeviceExtension, chan->lChannel, i); ++ KdPrint2((PRINT_PREFIX " signature %#x\n", signature)); ++ ++ LunExt->DeviceFlags |= DFLAGS_DEVICE_PRESENT; ++ chan->PmLunMap |= (1 << i); ++ /* figure out whats there */ ++ switch (signature >> 16) { ++ case 0x0000: ++ LunExt->DeviceFlags &= ~DFLAGS_ATAPI_DEVICE; ++ continue; ++ case 0xeb14: ++ LunExt->DeviceFlags |= DFLAGS_ATAPI_DEVICE; ++ continue; ++ } ++ ++ } ++ ++} // end UniataSataIdentifyPM() ++ ++#ifdef DBG ++VOID ++NTAPI ++UniataDumpAhciRegs( ++ IN PHW_DEVICE_EXTENSION deviceExtension ++ ) ++{ ++ ULONG j; ++ ULONG xReg; ++ ++ KdPrint2((PRINT_PREFIX ++ " AHCI Base: %#x MemIo %d Proc %d\n", ++ deviceExtension->BaseIoAHCI_0.Addr, ++ deviceExtension->BaseIoAHCI_0.MemIo, ++ deviceExtension->BaseIoAHCI_0.Proc)); ++ ++ for(j=0; j<=IDX_AHCI_VS; j+=sizeof(ULONG)) { ++ xReg = AtapiReadPortEx4(NULL, (ULONGIO_PTR)&deviceExtension->BaseIoAHCI_0, j); ++ KdPrint2((PRINT_PREFIX ++ " AHCI_%#x (%#x) = %#x\n", ++ j, ++ (deviceExtension->BaseIoAHCI_0.Addr+j), ++ xReg)); ++ } ++ return; ++} // end UniataDumpAhciRegs() ++ ++ ++VOID ++NTAPI ++UniataDumpAhciPortRegs( ++ IN PHW_CHANNEL chan ++ ) ++{ ++ ULONG j; ++ ULONG xReg; ++ ++ KdPrint2((PRINT_PREFIX ++ " AHCI port %d Base: %#x MemIo %d Proc %d\n", ++ chan->lChannel, ++ chan->BaseIoAHCI_Port.Addr, ++ chan->BaseIoAHCI_Port.MemIo, ++ chan->BaseIoAHCI_Port.Proc)); ++ ++ for(j=0; j<=IDX_AHCI_P_SNTF; j+=sizeof(ULONG)) { ++ xReg = AtapiReadPortEx4(NULL, (ULONGIO_PTR)&chan->BaseIoAHCI_Port, j); ++ KdPrint2((PRINT_PREFIX ++ " AHCI%d_%#x (%#x) = %#x\n", ++ chan->lChannel, ++ j, ++ (chan->BaseIoAHCI_Port.Addr+j), ++ xReg)); ++ } ++ return; ++} // end UniataDumpAhciPortRegs() ++#endif //DBG ++ ++ +BOOLEAN +NTAPI +UniataAhciInit( + IN PVOID HwDeviceExtension + ) +{ + PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; - ULONG version; - ULONG c, i, n; ++ ULONG c, i; + PHW_CHANNEL chan; + ULONG offs; + ULONG BaseMemAddress; + ULONG PI; + ULONG CAP; - BOOLEAN MemIo; - ULONGLONG base; ++ ULONG GHC; ++ BOOLEAN MemIo = FALSE; ++ ++ KdPrint2((PRINT_PREFIX " UniataAhciInit:\n")); ++ ++#ifdef DBG ++ UniataDumpAhciRegs(deviceExtension); ++#endif //DBG + + /* reset AHCI controller */ - AtapiWritePortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_GHC, - AtapiReadPortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_GHC) | AHCI_GHC_HR); - AtapiStallExecution(1000000); - if(AtapiReadPortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_GHC) & AHCI_GHC_HR) { ++ GHC = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_GHC); ++ KdPrint2((PRINT_PREFIX " reset AHCI controller, GHC %#x\n", GHC)); ++ UniataAhciWriteHostPort4(deviceExtension, IDX_AHCI_GHC, ++ GHC | AHCI_GHC_HR); ++ ++ for(i=0; i<1000; i++) { ++ AtapiStallExecution(1000); ++ GHC = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_GHC); ++ KdPrint2((PRINT_PREFIX " AHCI GHC %#x\n", GHC)); ++ if(!(GHC & AHCI_GHC_HR)) { ++ break; ++ } ++ } ++ if(GHC & AHCI_GHC_HR) { + KdPrint2((PRINT_PREFIX " AHCI reset failed\n")); + return FALSE; + } + + /* enable AHCI mode */ - AtapiWritePortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_GHC, - AtapiReadPortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_GHC) | AHCI_GHC_AE); - - CAP = AtapiReadPortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_CAP); - PI = AtapiReadPortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_PI); - /* get the number of HW channels */ - for(i=PI, n=0; i; n++, i=i>>1); - deviceExtension->NumberChannels = - max((CAP & AHCI_CAP_NOP_MASK)+1, n); ++ GHC = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_GHC); ++ KdPrint2((PRINT_PREFIX " enable AHCI mode, GHC %#x\n", GHC)); ++ UniataAhciWriteHostPort4(deviceExtension, IDX_AHCI_GHC, ++ GHC | AHCI_GHC_AE); ++ GHC = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_GHC); ++ KdPrint2((PRINT_PREFIX " AHCI GHC %#x\n", GHC)); ++ ++ deviceExtension->AHCI_CAP = ++ CAP = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_CAP); ++ PI = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_PI); ++ KdPrint2((PRINT_PREFIX " AHCI CAP %#x\n", CAP)); + if(CAP & AHCI_CAP_S64A) { + KdPrint2((PRINT_PREFIX " AHCI 64bit\n")); + deviceExtension->Host64 = TRUE; + } ++ KdPrint2((PRINT_PREFIX " AHCI %d CMD slots\n", (CAP & AHCI_CAP_NCS_MASK) >> 8 )); ++ if(CAP & AHCI_CAP_PMD) { ++ KdPrint2((PRINT_PREFIX " AHCI multi-block PIO\n")); ++ } ++ if(CAP & AHCI_CAP_SAM) { ++ KdPrint2((PRINT_PREFIX " AHCI legasy SATA\n")); ++ } ++ /* get the number of HW channels */ ++ PI = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_PI); ++ KdPrint2((PRINT_PREFIX " AHCI PI %#x\n", PI)); + + /* clear interrupts */ - AtapiWritePortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_IS, - AtapiReadPortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_IS)); ++ UniataAhciWriteHostPort4(deviceExtension, IDX_AHCI_IS, ++ UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_IS)); + + /* enable AHCI interrupts */ - AtapiWritePortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_GHC, - AtapiReadPortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_GHC) | AHCI_GHC_IE); - - version = AtapiReadPortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_VS); - KdPrint2((PRINT_PREFIX " AHCI version %x%x.%x%x controller with %d ports (mask %x) detected\n", - (version >> 24) & 0xff, (version >> 16) & 0xff, - (version >> 8) & 0xff, version & 0xff, deviceExtension->NumberChannels, PI)); - - - deviceExtension->HwFlags |= UNIATA_SATA; - deviceExtension->HwFlags |= UNIATA_AHCI; ++ UniataAhciWriteHostPort4(deviceExtension, IDX_AHCI_GHC, ++ UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_GHC) | AHCI_GHC_IE); + + BaseMemAddress = deviceExtension->BaseIoAHCI_0.Addr; + MemIo = deviceExtension->BaseIoAHCI_0.MemIo; + + for(c=0; cNumberChannels; c++) { + chan = &deviceExtension->chan[c]; + offs = sizeof(IDE_AHCI_REGISTERS) + c*sizeof(IDE_AHCI_PORT_REGISTERS); + ++ KdPrint2((PRINT_PREFIX " chan %d, offs %#x\n", c, offs)); ++ ++ AtapiSetupLunPtrs(chan, deviceExtension, c); ++ ++ chan->BaseIoAHCI_Port = deviceExtension->BaseIoAHCI_0; ++ chan->BaseIoAHCI_Port.Addr = BaseMemAddress + offs; ++ + chan->RegTranslation[IDX_IO1_i_Status ].Addr = BaseMemAddress + offs + FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, TFD.STS); + chan->RegTranslation[IDX_IO1_i_Status ].MemIo = MemIo; + chan->RegTranslation[IDX_IO2_AltStatus] = chan->RegTranslation[IDX_IO1_i_Status]; + chan->RegTranslation[IDX_IO1_i_Error ].Addr = BaseMemAddress + offs + FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, TFD.ERR); + chan->RegTranslation[IDX_IO1_i_Error ].MemIo = MemIo; + chan->RegTranslation[IDX_IO1_i_CylinderLow ].Addr = BaseMemAddress + offs + FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SIG.LbaLow); + chan->RegTranslation[IDX_IO1_i_CylinderLow ].MemIo = MemIo; + chan->RegTranslation[IDX_IO1_i_CylinderHigh].Addr = BaseMemAddress + offs + FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SIG.LbaHigh); + chan->RegTranslation[IDX_IO1_i_CylinderHigh].MemIo = MemIo; + chan->RegTranslation[IDX_IO1_i_BlockCount ].Addr = BaseMemAddress + offs + FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SIG.SectorCount); + chan->RegTranslation[IDX_IO1_i_BlockCount ].MemIo = MemIo; + + UniataInitSyncBaseIO(chan); + + chan->RegTranslation[IDX_SATA_SStatus].Addr = BaseMemAddress + offs + FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SSTS); + chan->RegTranslation[IDX_SATA_SStatus].MemIo = MemIo; + chan->RegTranslation[IDX_SATA_SError].Addr = BaseMemAddress + offs + FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SERR); + chan->RegTranslation[IDX_SATA_SError].MemIo = MemIo; + chan->RegTranslation[IDX_SATA_SControl].Addr = BaseMemAddress + offs + FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SCTL); + chan->RegTranslation[IDX_SATA_SControl].MemIo = MemIo; + chan->RegTranslation[IDX_SATA_SActive].Addr = BaseMemAddress + offs + FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SACT); + chan->RegTranslation[IDX_SATA_SActive].MemIo = MemIo; + + AtapiDmaAlloc(HwDeviceExtension, NULL, c); + - base = chan->AHCI_CL_PhAddr; - if(!base) { - KdPrint2((PRINT_PREFIX " AHCI buffer allocation failed\n")); - return FALSE; - } - AtapiWritePortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), offs + IDX_AHCI_P_CLB, - (ULONG)(base & 0xffffffff)); - AtapiWritePortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), offs + IDX_AHCI_P_CLB + 4, - (ULONG)((base >> 32) & 0xffffffff)); - - base = chan->AHCI_CL_PhAddr + ATA_AHCI_MAX_TAGS; - AtapiWritePortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), offs + IDX_AHCI_P_FB, - (ULONG)(base & 0xffffffff)); - AtapiWritePortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), offs + IDX_AHCI_P_FB + 4, - (ULONG)((base >> 32) & 0xffffffff)); ++ UniataAhciResume(chan); + + chan->ChannelCtrlFlags |= CTRFLAGS_NO_SLAVE; + } + + return TRUE; +} // end UniataAhciInit() + ++BOOLEAN ++NTAPI ++UniataAhciDetect( ++ IN PVOID HwDeviceExtension, ++ IN PPCI_COMMON_CONFIG pciData, // optional ++ IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo ++ ) ++{ ++ PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; ++ //ULONG slotNumber = deviceExtension->slotNumber; ++ ULONG SystemIoBusNumber = deviceExtension->SystemIoBusNumber; ++ ULONG version; ++ ULONG i, n; ++ ULONG PI; ++ ULONG CAP; ++ ULONG GHC; ++ ULONG NumberChannels; ++ ULONG v_Mn, v_Mj; ++ ULONG BaseMemAddress; ++ BOOLEAN MemIo; ++ ++ KdPrint2((PRINT_PREFIX " UniataAhciDetect:\n")); ++ ++ if(AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"IgnoreAhci", 1 /* DEBUG */)) { ++ KdPrint((" AHCI excluded\n")); ++ return FALSE; ++ } ++ BaseMemAddress = AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber, ++ 5, 0, 0x10); ++ if(!BaseMemAddress) { ++ KdPrint2((PRINT_PREFIX " AHCI init failed - no IoRange\n")); ++ return FALSE; ++ } ++ if(BaseMemAddress && (*ConfigInfo->AccessRanges)[5].RangeInMemory) { ++ KdPrint2((PRINT_PREFIX "MemIo\n")); ++ MemIo = TRUE; ++ } ++ deviceExtension->BaseIoAHCI_0.Addr = BaseMemAddress; ++ deviceExtension->BaseIoAHCI_0.MemIo = MemIo; ++ ++#ifdef DBG ++ UniataDumpAhciRegs(deviceExtension); ++#endif //DBG ++ ++ GHC = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_GHC); ++ if(GHC & AHCI_GHC_HR) { ++ KdPrint2((PRINT_PREFIX " AHCI in reset state\n")); ++ return FALSE; ++ } ++ ++ /* enable AHCI mode */ ++ GHC = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_GHC); ++ KdPrint2((PRINT_PREFIX " check AHCI mode, GHC %#x\n", GHC)); ++ if(!(GHC & AHCI_GHC_AE)) { ++ KdPrint2((PRINT_PREFIX " Non-AHCI GHC (!AE)\n")); ++ return FALSE; ++ } ++ ++ CAP = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_CAP); ++ KdPrint2((PRINT_PREFIX " AHCI CAP %#x\n", CAP)); ++ if(CAP & AHCI_CAP_S64A) { ++ KdPrint2((PRINT_PREFIX " AHCI 64bit\n")); ++ //deviceExtension->Host64 = TRUE; ++ } ++ ++ /* get the number of HW channels */ ++ PI = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_PI); ++ KdPrint2((PRINT_PREFIX " AHCI PI %#x\n", PI)); ++ for(i=PI, n=0; i; n++, i=i>>1); ++ NumberChannels = ++ max((CAP & AHCI_CAP_NOP_MASK)+1, n); ++ ++ KdPrint2((PRINT_PREFIX " Channels %d\n", n)); ++ ++ switch(deviceExtension->DevID) { ++ case ATA_M88SX6111: ++ NumberChannels = 1; ++ break; ++ case ATA_M88SX6121: ++ NumberChannels = 2; ++ break; ++ case ATA_M88SX6141: ++ case ATA_M88SX6145: ++ NumberChannels = 4; ++ break; ++ } // switch() ++ ++ if(!NumberChannels) { ++ KdPrint2((PRINT_PREFIX " Non-AHCI - NumberChannels=0\n")); ++ return FALSE; ++ } ++ ++ version = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_VS); ++ v_Mj = ((version >> 20) & 0xf0) + ((version >> 16) & 0x0f); ++ v_Mn = ((version >> 4) & 0xf0) + (version & 0x0f); ++ ++ KdPrint2((PRINT_PREFIX " AHCI version %#x.%02x controller with %d ports (mask %#x) detected\n", ++ v_Mj, v_Mn, ++ NumberChannels, PI)); ++ ++ if(CAP & AHCI_CAP_SPM) { ++ KdPrint2((PRINT_PREFIX " PM supported\n")); ++ if(AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"IgnoreAhciPM", 1 /* DEBUG */)) { ++ KdPrint2((PRINT_PREFIX "SATA/AHCI w/o PM, max luns 1\n")); ++ deviceExtension->NumberLuns = 2; ++ //chan->ChannelCtrlFlags |= CTRFLAGS_NO_SLAVE; ++ } else { ++ KdPrint2((PRINT_PREFIX "SATA/AHCI -> possible PM, max luns %d\n", SATA_MAX_PM_UNITS)); ++ deviceExtension->NumberLuns = SATA_MAX_PM_UNITS; ++ //deviceExtension->NumberLuns = 1; ++ } ++ } else { ++ KdPrint2((PRINT_PREFIX " PM not supported -> 1 lun/chan\n")); ++ deviceExtension->NumberLuns = 1; ++ } ++ ++ if((v_Mj != 0x01) || (v_Mn > 0x20)) { ++ KdPrint2((PRINT_PREFIX " Unknown AHCI revision\n")); ++ if(AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"CheckAhciRevision", 1)) { ++ KdPrint((" AHCI revision excluded\n")); ++ return FALSE; ++ } ++ } ++ ++ deviceExtension->HwFlags |= UNIATA_SATA; ++ deviceExtension->HwFlags |= UNIATA_AHCI; ++ if(deviceExtension->NumberChannels < NumberChannels) { ++ deviceExtension->NumberChannels = NumberChannels; ++ } ++ ++ return TRUE; ++} // end UniataAhciDetect() ++ +UCHAR +NTAPI +UniataAhciStatus( + IN PVOID HwDeviceExtension, + IN ULONG lChannel, + IN ULONG DeviceNumber + ) +{ + PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; + PHW_CHANNEL chan = &deviceExtension->chan[lChannel]; + ULONG Channel = deviceExtension->Channel + lChannel; + ULONG hIS; + ULONG CI; + AHCI_IS_REG IS; + SATA_SSTATUS_REG SStatus; + SATA_SERROR_REG SError; - ULONG offs = sizeof(IDE_AHCI_REGISTERS) + Channel*sizeof(IDE_AHCI_PORT_REGISTERS); - ULONG_PTR base; ++ //ULONG offs = sizeof(IDE_AHCI_REGISTERS) + Channel*sizeof(IDE_AHCI_PORT_REGISTERS); + ULONG tag=0; + + KdPrint(("UniataAhciStatus:\n")); + - hIS = AtapiReadPortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_IS); - KdPrint((" hIS %x\n", hIS)); ++ hIS = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_IS); ++ KdPrint((" hIS %#x\n", hIS)); + hIS &= (1 << Channel); + if(!hIS) { - return 0; ++ return INTERRUPT_REASON_IGNORE; + } - base = (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0 + offs); - IS.Reg = AtapiReadPort4(chan, base + IDX_AHCI_P_IS); - CI = AtapiReadPort4(chan, base + IDX_AHCI_P_CI); ++ IS.Reg = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_IS); ++ CI = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CI); + SStatus.Reg = AtapiReadPort4(chan, IDX_SATA_SStatus); + SError.Reg = AtapiReadPort4(chan, IDX_SATA_SError); + + /* clear interrupt(s) */ - AtapiWritePortEx4(NULL, (ULONG_PTR)(&deviceExtension->BaseIoAHCI_0), IDX_AHCI_IS, hIS); - AtapiWritePort4(chan, base + IDX_AHCI_P_IS, IS.Reg); ++ UniataAhciWriteHostPort4(deviceExtension, IDX_AHCI_IS, hIS); ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_IS, IS.Reg); + AtapiWritePort4(chan, IDX_SATA_SError, SError.Reg); + + KdPrint((" AHCI: status=%08x sstatus=%08x error=%08x CI=%08x\n", + IS.Reg, SStatus.Reg, SError.Reg, CI)); + + /* do we have cold connect surprise */ + if(IS.CPDS) { + } + + /* check for and handle connect events */ + if(IS.PCS) { + UniataSataEvent(HwDeviceExtension, lChannel, UNIATA_SATA_EVENT_ATTACH); + } + if(IS.PRCS) { + UniataSataEvent(HwDeviceExtension, lChannel, UNIATA_SATA_EVENT_DETACH); + } + if(CI & (1 << tag)) { - return 1; ++ return INTERRUPT_REASON_OUR; + } + KdPrint((" AHCI: unexpected\n")); - return 2; ++ return INTERRUPT_REASON_UNEXPECTED; + +} // end UniataAhciStatus() + +ULONG +NTAPI - UniataAhciSetupFIS( ++UniataAhciSetupFIS_H2D( + IN PHW_DEVICE_EXTENSION deviceExtension, + IN ULONG DeviceNumber, + IN ULONG lChannel, + OUT PUCHAR fis, + IN UCHAR command, + IN ULONGLONG lba, + IN USHORT count, + IN USHORT feature, + IN ULONG flags + ) +{ - ULONG ldev = lChannel*2 + DeviceNumber; + ULONG i; + PUCHAR plba; ++ BOOLEAN need48; ++ PHW_CHANNEL chan = &deviceExtension->chan[lChannel]; + - KdPrint2((PRINT_PREFIX " AHCI setup FIS\n" )); ++ KdPrint2((PRINT_PREFIX " AHCI setup FIS ch %d, dev %d\n", lChannel, DeviceNumber)); + i = 0; + plba = (PUCHAR)&lba; + - if((AtaCommandFlags[command] & ATA_CMD_FLAG_LBAIOsupp) && - CheckIfBadBlock(&(deviceExtension->lun[ldev]), lba, count)) { - KdPrint3((PRINT_PREFIX ": artificial bad block, lba %#I64x count %#x\n", lba, count)); - return IDE_STATUS_ERROR; - //return SRB_STATUS_ERROR; - } ++ fis[0] = AHCI_FIS_TYPE_ATA_H2D; /* host to device */ ++ fis[1] = 0x80 | ((UCHAR)DeviceNumber & 0x0f); /* command FIS (note PM goes here) */ ++ fis[7] = IDE_USE_LBA; ++ fis[15] = IDE_DC_A_4BIT; + - /* translate command into 48bit version */ - if ((lba >= ATA_MAX_LBA28 || count > 256) && - deviceExtension->lun[ldev].IdentifyData.FeaturesSupport.Address48) { - if(AtaCommandFlags[command] & ATA_CMD_FLAG_48supp) { - command = AtaCommands48[command]; ++ if(chan->lun[DeviceNumber]->DeviceFlags & DFLAGS_ATAPI_DEVICE) { ++ fis[2] = IDE_COMMAND_ATAPI_PACKET; ++ if(feature & ATA_F_DMA) { ++ fis[3] = (UCHAR)(feature & 0xff); + } else { - KdPrint2((PRINT_PREFIX " unhandled LBA48 command\n")); ++ fis[5] = (UCHAR)(count & 0xff); ++ fis[6] = (UCHAR)(count>>8) & 0xff; ++ } ++ } else { ++ ++ if((AtaCommandFlags[command] & ATA_CMD_FLAG_LBAIOsupp) && ++ CheckIfBadBlock(chan->lun[DeviceNumber], lba, count)) { ++ KdPrint3((PRINT_PREFIX ": artificial bad block, lba %#I64x count %#x\n", lba, count)); ++ //return IDE_STATUS_ERROR; ++ //return SRB_STATUS_ERROR; + return 0; + } - } + - fis[0] = 0x27; /* host to device */ - fis[1] = 0x80; /* command FIS (note PM goes here) */ - fis[2] = command; - fis[3] = (UCHAR)feature; ++ need48 = UniAta_need_lba48(command, lba, count, ++ chan->lun[DeviceNumber]->IdentifyData.FeaturesSupport.Address48); + - fis[4] = plba[0]; - fis[5] = plba[1]; - fis[6] = plba[2]; - fis[7] = IDE_USE_LBA | (DeviceNumber ? IDE_DRIVE_2 : IDE_DRIVE_1); - if ((lba >= ATA_MAX_LBA28 || count > 256) && - deviceExtension->lun[ldev].IdentifyData.FeaturesSupport.Address48) { - i++; - } else { ++ /* translate command into 48bit version */ ++ if(need48) { ++ if(AtaCommandFlags[command] & ATA_CMD_FLAG_48supp) { ++ command = AtaCommands48[command]; ++ } else { ++ KdPrint2((PRINT_PREFIX " unhandled LBA48 command\n")); ++ return 0; ++ } ++ } ++ ++ fis[2] = command; ++ fis[3] = (UCHAR)feature; ++ ++ fis[4] = plba[0]; ++ fis[5] = plba[1]; ++ fis[6] = plba[2]; ++ if(need48) { ++ i++; ++ } else { +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4333) // right shift by too large amount, data loss +#endif - fis[7] |= (plba[3] >> 24) & 0x0f; ++ fis[7] |= IDE_DRIVE_1 | ((plba[3] >> 24) & 0x0f); +#ifdef _MSC_VER +#pragma warning(pop) +#endif - } ++ } + - fis[8] = plba[3]; - fis[9] = plba[4]; - fis[10] = plba[5]; - fis[11] = (UCHAR)(feature>>8) & 0xff; ++ fis[8] = plba[3]; ++ fis[9] = plba[4]; ++ fis[10] = plba[5]; ++ fis[11] = (UCHAR)(feature>>8) & 0xff; + - fis[12] = (UCHAR)count & 0xff; - fis[13] = (UCHAR)(count>>8) & 0xff; - fis[14] = 0x00; - fis[15] = IDE_DC_A_4BIT; ++ fis[12] = (UCHAR)count & 0xff; ++ fis[13] = (UCHAR)(count>>8) & 0xff; ++ //fis[14] = 0x00; ++ ++ } ++ ++ KdDump(fis, 20); + - fis[16] = 0x00; - fis[17] = 0x00; - fis[18] = 0x00; - fis[19] = 0x00; + return 20; - } // end UniataAhciSetupFIS() ++} // end UniataAhciSetupFIS_H2D() ++ ++UCHAR ++NTAPI ++UniataAhciSendCommand( ++ IN PVOID HwDeviceExtension, ++ IN ULONG lChannel, ++ IN ULONG DeviceNumber, ++ IN ULONG flags, ++ IN ULONG timeout ++ ) ++{ ++ PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; ++ PHW_CHANNEL chan = &deviceExtension->chan[lChannel]; ++ //ULONG Channel = deviceExtension->Channel + lChannel; ++ //ULONG hIS; ++ ULONG CI = 0; ++ AHCI_IS_REG IS; ++ ULONG SError; ++ //SATA_SSTATUS_REG SStatus; ++ //SATA_SERROR_REG SError; ++ //ULONG offs = sizeof(IDE_AHCI_REGISTERS) + Channel*sizeof(IDE_AHCI_PORT_REGISTERS); ++ //ULONGIO_PTR base; ++ ULONG tag=0; ++ ULONG i; ++ ++ PIDE_AHCI_CMD_LIST AHCI_CL = &(chan->AhciCtlBlock->cmd_list[tag]); ++ ++ KdPrint(("UniataAhciSendCommand: lChan %d\n", chan->lChannel)); ++ ++ AHCI_CL->prd_length = 0; ++ AHCI_CL->cmd_flags = (20 / sizeof(ULONG)) | flags | (DeviceNumber << 12); ++ AHCI_CL->bytecount = 0; ++ AHCI_CL->cmd_table_phys = chan->AHCI_CTL_PhAddr + FIELD_OFFSET(IDE_AHCI_CHANNEL_CTL_BLOCK, cmd); ++ if(AHCI_CL->cmd_table_phys & AHCI_CMD_ALIGNEMENT_MASK) { ++ KdPrint2((PRINT_PREFIX " AHCI CMD address is not aligned (mask %#x)\n", (ULONG)AHCI_CMD_ALIGNEMENT_MASK)); ++ } ++ ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CI, ATA_AHCI_P_CMD_ST); ++ ++ for (i=0; i= timeout)) { ++ SError = AtapiReadPort4(chan, IDX_SATA_SError); ++ KdPrint((" AHCI: timeout, SError %#x\n", SError)); ++ return 0xff; ++ } ++ ++ return IDE_STATUS_IDLE; ++ ++} // end UniataAhciSendCommand() ++ ++ULONG ++NTAPI ++UniataAhciSoftReset( ++ IN PVOID HwDeviceExtension, ++ IN ULONG lChannel, ++ IN ULONG DeviceNumber ++ ) ++{ ++ PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; ++ PHW_CHANNEL chan = &deviceExtension->chan[lChannel]; ++ //ULONG Channel = deviceExtension->Channel + lChannel; ++ //ULONG hIS; ++ //ULONG CI; ++ //AHCI_IS_REG IS; ++ //ULONG tag=0; ++ ++ KdPrint(("UniataAhciSoftReset: lChan %d\n", chan->lChannel)); ++ ++ PIDE_AHCI_CMD AHCI_CMD = &(chan->AhciCtlBlock->cmd); ++ PUCHAR RCV_FIS = &(chan->AhciCtlBlock->rcv_fis.rfis[0]); ++ ++#ifdef DBG ++ UniataDumpAhciPortRegs(chan); ++#endif // DBG ++ ++ /* kick controller into sane state */ ++ UniataAhciStop(chan); ++ UniataAhciCLO(chan); ++ UniataAhciStart(chan); ++ ++#ifdef DBG ++ UniataDumpAhciPortRegs(chan); ++#endif // DBG ++ ++ /* pull reset active */ ++ RtlZeroMemory(AHCI_CMD->cfis, sizeof(AHCI_CMD->cfis)); ++ AHCI_CMD->cfis[0] = AHCI_FIS_TYPE_ATA_H2D; ++ AHCI_CMD->cfis[1] = (UCHAR)DeviceNumber & 0x0f; ++ //AHCI_CMD->cfis[7] = IDE_USE_LBA | IDE_DRIVE_SELECT; ++ AHCI_CMD->cfis[15] = (IDE_DC_A_4BIT | IDE_DC_RESET_CONTROLLER); ++ ++ if(UniataAhciSendCommand(HwDeviceExtension, lChannel, DeviceNumber, ATA_AHCI_CMD_RESET | ATA_AHCI_CMD_CLR_BUSY, 100) == 0xff) { ++ KdPrint2((" timeout\n")); ++ return (ULONG)(-1); ++ } ++ AtapiStallExecution(50); ++ ++ /* pull reset inactive */ ++ RtlZeroMemory(AHCI_CMD->cfis, sizeof(AHCI_CMD->cfis)); ++ AHCI_CMD->cfis[0] = AHCI_FIS_TYPE_ATA_H2D; ++ AHCI_CMD->cfis[1] = (UCHAR)DeviceNumber & 0x0f; ++ //AHCI_CMD->cfis[7] = IDE_USE_LBA | IDE_DRIVE_SELECT; ++ AHCI_CMD->cfis[15] = (IDE_DC_A_4BIT); ++ if(UniataAhciSendCommand(HwDeviceExtension, lChannel, DeviceNumber, 0, 3000) == 0xff) { ++ KdPrint2((" timeout (2)\n")); ++ return (ULONG)(-1); ++ } ++ ++ UniataAhciWaitReady(chan, 1); ++ ++ KdDump(RCV_FIS, sizeof(chan->AhciCtlBlock->rcv_fis.rfis)); ++ ++ return UniataAhciUlongFromRFIS(RCV_FIS); ++ ++} // end UniataAhciSoftReset() ++ ++ULONG ++NTAPI ++UniataAhciWaitReady( ++ IN PHW_CHANNEL chan, ++ IN ULONG timeout ++ ) ++{ ++ ULONG TFD; ++ ULONG i; ++ ++ KdPrint2(("UniataAhciWaitReady: lChan %d\n", chan->lChannel)); ++ ++ //base = (ULONGIO_PTR)(&deviceExtension->BaseIoAHCI_0 + offs); ++ ++ TFD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_TFD); ++ for(i=0; ichan[lChannel]; ++ //ULONG Channel = deviceExtension->Channel + lChannel; ++ ULONG TFD; ++ ++ ++ KdPrint(("UniataAhciHardReset: lChan %d\n", chan->lChannel)); ++ ++ (*signature) = 0xffffffff; ++ ++ UniataAhciStop(chan); ++ if(UniataSataPhyEnable(HwDeviceExtension, lChannel, 0/* dev0*/, UNIATA_SATA_RESET_ENABLE) == 0xff) { ++ KdPrint((" no PHY\n")); ++ return 0xff; ++ } ++ ++ /* Wait for clearing busy status. */ ++ TFD = UniataAhciWaitReady(chan, 15000); ++ if(TFD & (IDE_STATUS_DRQ | IDE_STATUS_BUSY)) { ++ KdPrint((" busy: TFD %#x\n", TFD)); ++ return TFD; ++ } ++ KdPrint((" TFD %#x\n", TFD)); ++ ++#ifdef DBG ++ UniataDumpAhciPortRegs(chan); ++#endif // DBG ++ ++ (*signature) = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_SIG); ++ KdPrint((" sig: %#x\n", *signature)); ++ ++ UniataAhciStart(chan); ++ ++ return 0; ++ ++} // end UniataAhciHardReset() ++ ++VOID ++NTAPI ++UniataAhciReset( ++ IN PVOID HwDeviceExtension, ++ IN ULONG lChannel ++ ) ++{ ++ PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; ++ PHW_CHANNEL chan = &deviceExtension->chan[lChannel]; ++ //ULONG Channel = deviceExtension->Channel + lChannel; ++ //ULONG offs = sizeof(IDE_AHCI_REGISTERS) + Channel*sizeof(IDE_AHCI_PORT_REGISTERS); ++ ULONG CAP; ++ //ULONGIO_PTR base; ++ ULONG signature; ++ ULONG i; ++ ULONG VendorID = deviceExtension->DevID & 0xffff; ++ ++ KdPrint(("UniataAhciReset: lChan %d\n", chan->lChannel)); ++ ++ //base = (ULONGIO_PTR)(&deviceExtension->BaseIoAHCI_0 + offs); ++ ++ /* Disable port interrupts */ ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_IE, 0); ++ ++ if(UniataAhciHardReset(HwDeviceExtension, lChannel, &signature)) { ++ ++ KdPrint((" No devices in all LUNs\n")); ++ for (i=0; iNumberLuns; i++) { ++ // Zero device fields to ensure that if earlier devices were found, ++ // but not claimed, the fields are cleared. ++ UniataForgetDevice(chan->lun[i]); ++ } ++ ++ /* enable wanted port interrupts */ ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_IE, ++ ATA_AHCI_P_IX_CPD | ATA_AHCI_P_IX_PRC | ATA_AHCI_P_IX_PC); ++ return; ++ } ++ ++ /* enable wanted port interrupts */ ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_IE, ++ (ATA_AHCI_P_IX_CPD | ATA_AHCI_P_IX_TFE | ATA_AHCI_P_IX_HBF | ++ ATA_AHCI_P_IX_HBD | ATA_AHCI_P_IX_IF | ATA_AHCI_P_IX_OF | ++ ((/*ch->pm_level == */0) ? (ATA_AHCI_P_IX_PRC | ATA_AHCI_P_IX_PC) : 0) | ++ ATA_AHCI_P_IX_DP | ATA_AHCI_P_IX_UF | ATA_AHCI_P_IX_SDB | ++ ATA_AHCI_P_IX_DS | ATA_AHCI_P_IX_PS | ATA_AHCI_P_IX_DHR) ); ++ ++ /* ++ * Only probe for PortMultiplier if HW has support. ++ * Ignore Marvell, which is not working, ++ */ ++ CAP = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_CAP); ++ if ((CAP & AHCI_CAP_SPM) && ++ (VendorID != ATA_MARVELL_ID)) { ++ KdPrint((" check PM\n")); ++ signature = UniataAhciSoftReset(HwDeviceExtension, lChannel, AHCI_DEV_SEL_PM); ++ /* Workaround for some ATI chips, failing to soft-reset ++ * when port multiplicator supported, but absent. ++ * XXX: We can also check PxIS.IPMS==1 here to be sure. */ ++ if (signature == 0xffffffff) { ++ KdPrint((" re-check PM\n")); ++ signature = UniataAhciSoftReset(HwDeviceExtension, lChannel, 0); ++ } ++ } else { ++ signature = UniataAhciSoftReset(HwDeviceExtension, lChannel, 0); ++ } ++ ++ KdPrint((" signature %#x\n", signature)); ++ chan->lun[0]->DeviceFlags &= ~(DFLAGS_ATAPI_DEVICE | DFLAGS_DEVICE_PRESENT | CTRFLAGS_AHCI_PM); ++ switch (signature >> 16) { ++ case 0x0000: ++ KdPrint((" ATA dev\n")); ++ chan->lun[0]->DeviceFlags |= DFLAGS_DEVICE_PRESENT; ++ chan->PmLunMap = 0; ++ break; ++ case 0x9669: ++ KdPrint((" PM\n")); ++ if(deviceExtension->NumberLuns > 1) { ++ chan->ChannelCtrlFlags |= CTRFLAGS_AHCI_PM; ++ UniataSataIdentifyPM(chan); ++ } else { ++ KdPrint((" no PM supported (1 lun/chan)\n")); ++ } ++ break; ++ case 0xeb14: ++ KdPrint((" ATAPI dev\n")); ++ chan->lun[0]->DeviceFlags |= (DFLAGS_ATAPI_DEVICE | DFLAGS_DEVICE_PRESENT); ++ chan->PmLunMap = 0; ++ break; ++ default: /* SOS XXX */ ++ KdPrint((" default to ATA ???\n")); ++ chan->lun[0]->DeviceFlags |= DFLAGS_DEVICE_PRESENT; ++ chan->PmLunMap = 0; ++ } ++ ++ return; ++ ++} // end UniataAhciReset() ++ ++VOID ++NTAPI ++UniataAhciStartFR( ++ IN PHW_CHANNEL chan ++ ) ++{ ++ ULONG CMD; ++ ++ KdPrint2(("UniataAhciStartFR: lChan %d\n", chan->lChannel)); ++ ++ CMD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); ++ KdPrint2((" CMD %#x\n", CMD)); ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, CMD | ATA_AHCI_P_CMD_FRE); ++ ++ return; ++} // end UniataAhciStartFR() ++ ++VOID ++NTAPI ++UniataAhciStopFR( ++ IN PHW_CHANNEL chan ++ ) ++{ ++ ULONG CMD; ++ ULONG i; ++ ++ KdPrint2(("UniataAhciStopFR: lChan %d\n", chan->lChannel)); ++ ++ CMD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); ++ KdPrint2((" CMD %#x\n", CMD)); ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, CMD & ~ATA_AHCI_P_CMD_FRE); ++ ++ for(i=0; i<1000; i++) { ++ CMD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); ++ if(!(CMD & ATA_AHCI_P_CMD_FR)) { ++ KdPrint2((" final CMD %#x\n", CMD)); ++ return; ++ } ++ AtapiStallExecution(1000); ++ } ++ KdPrint2((" CMD %#x\n", CMD)); ++ KdPrint((" SError %#x\n", AtapiReadPort4(chan, IDX_SATA_SError))); ++ KdPrint2(("UniataAhciStopFR: timeout\n")); ++ return; ++} // end UniataAhciStopFR() ++ ++VOID ++NTAPI ++UniataAhciStart( ++ IN PHW_CHANNEL chan ++ ) ++{ ++ ULONG IS, CMD; ++ SATA_SERROR_REG SError; ++ ++ KdPrint2(("UniataAhciStart: lChan %d\n", chan->lChannel)); ++ ++ /* clear SATA error register */ ++ SError.Reg = AtapiReadPort4(chan, IDX_SATA_SError); ++ ++ /* clear any interrupts pending on this channel */ ++ IS = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_IS); ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_IS, IS); ++ ++ KdPrint2((" SError %#x, IS %#x\n", SError.Reg, IS)); ++ ++ CMD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); ++ KdPrint2((" CMD %#x\n", CMD)); ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, ++ CMD | ++ ATA_AHCI_P_CMD_ST | ++ ((chan->ChannelCtrlFlags & CTRFLAGS_AHCI_PM) ? ATA_AHCI_P_CMD_PMA : 0)); ++ ++ return; ++} // end UniataAhciStart() ++ ++VOID ++NTAPI ++UniataAhciCLO( ++ IN PHW_CHANNEL chan ++ ) ++{ ++ //PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; ++ //PHW_CHANNEL chan = &deviceExtension->chan[lChannel]; ++ ULONG CAP, CMD; ++ //SATA_SERROR_REG SError; ++ ULONG i; ++ ++ KdPrint2(("UniataAhciCLO: lChan %d\n", chan->lChannel)); ++ ++ /* issue Command List Override if supported */ ++ //CAP = UniataAhciReadHostPort4(deviceExtension, IDX_AHCI_CAP); ++ CAP = chan->DeviceExtension->AHCI_CAP; ++ if(!(CAP & AHCI_CAP_SCLO)) { ++ return; ++ } ++ KdPrint2((" send CLO\n")); ++ CMD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); ++ CMD |= ATA_AHCI_P_CMD_CLO; ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, CMD); ++ ++ for(i=0; i<1000; i++) { ++ CMD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); ++ if(!(CMD & ATA_AHCI_P_CMD_CLO)) { ++ KdPrint2((" final CMD %#x\n", CMD)); ++ return; ++ } ++ AtapiStallExecution(1000); ++ } ++ KdPrint2((" CMD %#x\n", CMD)); ++ KdPrint2(("UniataAhciCLO: timeout\n")); ++ return; ++} // end UniataAhciCLO() ++ ++VOID ++NTAPI ++UniataAhciStop( ++ IN PHW_CHANNEL chan ++ ) ++{ ++ ULONG CMD; ++ //SATA_SERROR_REG SError; ++ ULONG i; ++ ++ KdPrint2(("UniataAhciStop: lChan %d\n", chan->lChannel)); ++ ++ /* issue Command List Override if supported */ ++ CMD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); ++ CMD &= ~ATA_AHCI_P_CMD_ST; ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, CMD); ++ ++ for(i=0; i<1000; i++) { ++ CMD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); ++ if(!(CMD & ATA_AHCI_P_CMD_CR)) { ++ KdPrint2((" final CMD %#x\n", CMD)); ++ return; ++ } ++ AtapiStallExecution(1000); ++ } ++ KdPrint2((" CMD %#x\n", CMD)); ++ KdPrint((" SError %#x\n", AtapiReadPort4(chan, IDX_SATA_SError))); ++ KdPrint2(("UniataAhciStop: timeout\n")); ++ return; ++} // end UniataAhciStop() ++ ++UCHAR ++NTAPI ++UniataAhciBeginTransaction( ++ IN PVOID HwDeviceExtension, ++ IN ULONG lChannel, ++ IN ULONG DeviceNumber, ++ IN PSCSI_REQUEST_BLOCK Srb ++ ) ++{ ++ PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; ++ PHW_CHANNEL chan = &deviceExtension->chan[lChannel]; ++ //ULONG Channel = deviceExtension->Channel + lChannel; ++ //ULONG hIS; ++ ULONG CMD; ++ //AHCI_IS_REG IS; ++ PATA_REQ AtaReq = (PATA_REQ)(Srb->SrbExtension); ++ //SATA_SSTATUS_REG SStatus; ++ //SATA_SERROR_REG SError; ++ //ULONG offs = sizeof(IDE_AHCI_REGISTERS) + Channel*sizeof(IDE_AHCI_PORT_REGISTERS); ++ //ULONGIO_PTR base; ++ ULONG tag=0; ++ //ULONG i; ++ ++ PIDE_AHCI_CMD_LIST AHCI_CL = &(chan->AhciCtlBlock->cmd_list[tag]); ++ ++ KdPrint2(("UniataAhciBeginTransaction: lChan %d\n", chan->lChannel)); ++ ++ if(AtaReq->dma_entries > (USHORT)0xffff) { ++ KdPrint2(("UniataAhciBeginTransaction too long DMA tab\n")); ++ return 0; ++ } ++ ++ AHCI_CL->prd_length = (USHORT)AtaReq->dma_entries; ++ AHCI_CL->cmd_flags = AtaReq->ahci.io_cmd_flags; ++ AHCI_CL->bytecount = 0; ++ AHCI_CL->cmd_table_phys = AtaReq->ahci.ahci_base64; ++ if(AHCI_CL->cmd_table_phys & AHCI_CMD_ALIGNEMENT_MASK) { ++ KdPrint2((PRINT_PREFIX " AHCI CMD address is not aligned (mask %#x)\n", (ULONG)AHCI_CMD_ALIGNEMENT_MASK)); ++ } ++ ++ CMD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_CMD); ++ KdPrint2((" CMD %#x\n", CMD)); ++ CMD &= ~ATA_AHCI_P_CMD_ATAPI; ++ KdPrint2((" send CMD %#x\n", CMD)); ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, CMD); ++ ++ /* issue command to controller */ ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CI, ATA_AHCI_P_CMD_ST); ++ ++ if(!(chan->lun[DeviceNumber]->DeviceFlags & DFLAGS_ATAPI_DEVICE)) { ++ // TODO: check if we send ATA_RESET and wait for ready of so. ++ if(AtaReq->ahci.ahci_cmd_ptr->cfis[2] == IDE_COMMAND_ATAPI_RESET) { ++ ULONG TFD; ++ ULONG i; ++ ++ for(i=0; i<1000000; i++) { ++ TFD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_TFD); ++ if(!(TFD & IDE_STATUS_BUSY)) { ++ break; ++ } ++ } ++ if(TFD & IDE_STATUS_BUSY) { ++ KdPrint2((" timeout\n")); ++ } ++ if(TFD & IDE_STATUS_ERROR) { ++ KdPrint2((" ERROR %#x\n", (UCHAR)(TFD >> 8))); ++ } ++ AtaReq->ahci.in_status = TFD; ++ ++ return 0x00; ++ } ++ } ++ ++ return IDE_STATUS_IDLE; ++ ++} // end UniataAhciBeginTransaction() ++ ++UCHAR ++NTAPI ++UniataAhciEndTransaction( ++ IN PVOID HwDeviceExtension, ++ IN ULONG lChannel, ++ IN ULONG DeviceNumber, ++ IN PSCSI_REQUEST_BLOCK Srb ++ ) ++{ ++ PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; ++ PHW_CHANNEL chan = &deviceExtension->chan[lChannel]; ++ //ULONG Channel = deviceExtension->Channel + lChannel; ++ //ULONG hIS; ++ PATA_REQ AtaReq = (PATA_REQ)(Srb->SrbExtension); ++ ULONG TFD; ++ PUCHAR RCV_FIS = &(chan->AhciCtlBlock->rcv_fis.rfis[0]); ++ ++ KdPrint2(("UniataAhciEndTransaction: lChan %d\n", chan->lChannel)); ++ ++ TFD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_TFD); ++ KdPrint2((" TFD %#x\n", TFD)); ++ ++ if(TFD & IDE_STATUS_ERROR) { ++ KdPrint2((" ERROR %#x\n", (UCHAR)(TFD >> 8))); ++ } ++ AtaReq->ahci.in_status = TFD; ++ ++ //if (request->flags & ATA_R_CONTROL) { ++ ++ AtaReq->ahci.in_bcount = (ULONG)(RCV_FIS[12]) | ((ULONG)(RCV_FIS[13]) << 8); ++ AtaReq->ahci.in_lba = (ULONG)(RCV_FIS[4]) | ((ULONGLONG)(RCV_FIS[5]) << 8) | ++ ((ULONGLONG)(RCV_FIS[6]) << 16); ++ if(chan->ChannelCtrlFlags & CTRFLAGS_LBA48) { ++ AtaReq->ahci.in_lba |= ((ULONGLONG)(RCV_FIS[8]) << 24) | ++ ((ULONGLONG)(RCV_FIS[9]) << 32) | ++ ((ULONGLONG)(RCV_FIS[10]) << 40); ++ } else { ++ AtaReq->ahci.in_lba |= ((ULONGLONG)(RCV_FIS[8]) << 24) | ++ ((ULONGLONG)(RCV_FIS[9]) << 32) | ++ ((ULONGLONG)(RCV_FIS[7] & 0x0f) << 24); ++ } ++ ++ //} ++ ++ return 0; ++ ++} // end UniataAhciEndTransaction() ++ ++VOID ++NTAPI ++UniataAhciResume( ++ IN PHW_CHANNEL chan ++ ) ++{ ++ ULONGLONG base; ++ ++ KdPrint2(("UniataAhciResume: lChan %d\n", chan->lChannel)); ++ ++#ifdef DBG ++ UniataDumpAhciPortRegs(chan); ++#endif // DBG ++ ++ /* Disable port interrupts */ ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_IE, 0); ++ ++ /* setup work areas */ ++ base = chan->AHCI_CTL_PhAddr; ++ if(!base) { ++ KdPrint2((PRINT_PREFIX " AHCI buffer allocation failed\n")); ++ return; ++ } ++ KdPrint2((PRINT_PREFIX " AHCI CLB setup\n")); ++ if(base & AHCI_CLB_ALIGNEMENT_MASK) { ++ KdPrint2((PRINT_PREFIX " AHCI CLB address is not aligned (mask %#x)\n", (ULONG)AHCI_FIS_ALIGNEMENT_MASK)); ++ } ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CLB, ++ (ULONG)(base & 0xffffffff)); ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CLB + 4, ++ (ULONG)((base >> 32) & 0xffffffff)); ++ ++ KdPrint2((PRINT_PREFIX " AHCI RCV FIS setup\n")); ++ base = chan->AHCI_CTL_PhAddr + FIELD_OFFSET(IDE_AHCI_CHANNEL_CTL_BLOCK, rcv_fis); ++ if(base & AHCI_FIS_ALIGNEMENT_MASK) { ++ KdPrint2((PRINT_PREFIX " AHCI FIS address is not aligned (mask %#x)\n", (ULONG)AHCI_FIS_ALIGNEMENT_MASK)); ++ } ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_FB, ++ (ULONG)(base & 0xffffffff)); ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_FB + 4, ++ (ULONG)((base >> 32) & 0xffffffff)); ++ ++ /* activate the channel and power/spin up device */ ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, ++ (ATA_AHCI_P_CMD_ACTIVE | ATA_AHCI_P_CMD_POD | ATA_AHCI_P_CMD_SUD | ++ (((chan->ChannelCtrlFlags & CTRFLAGS_AHCI_PM)) ? ATA_AHCI_P_CMD_ALPE : 0) | ++ (((chan->ChannelCtrlFlags & CTRFLAGS_AHCI_PM2)) ? ATA_AHCI_P_CMD_ASP : 0 )) ++ ); ++ ++#ifdef DBG ++ UniataDumpAhciPortRegs(chan); ++#endif // DBG ++ ++ UniataAhciStartFR(chan); ++ UniataAhciStart(chan); ++ ++#ifdef DBG ++ UniataDumpAhciPortRegs(chan); ++#endif // DBG ++ ++ return; ++} // end UniataAhciResume() ++ ++#if 0 ++VOID ++NTAPI ++UniataAhciSuspend( ++ IN PHW_CHANNEL chan ++ ) ++{ ++ ULONGLONG base; ++ SATA_SCONTROL_REG SControl; ++ ++ KdPrint2(("UniataAhciSuspend:\n")); ++ ++ /* Disable port interrupts */ ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_IE, 0); ++ ++ /* Reset command register. */ ++ UniataAhciStop(chan); ++ UniataAhciStopFR(chan); ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, 0); ++ ++ /* Allow everything including partial and slumber modes. */ ++ UniataSataWritePort4(chan, IDX_SATA_SControl, 0, 0); ++ ++ /* Request slumber mode transition and give some time to get there. */ ++ UniataAhciWriteChannelPort4(chan, IDX_AHCI_P_CMD, ATA_AHCI_P_CMD_SLUMBER); ++ AtapiStallExecution(100); ++ ++ /* Disable PHY. */ ++ SControl.Reg = 0; ++ SControl.DET = SStatus_DET_Offline; ++ UniataSataWritePort4(chan, IDX_SATA_SControl, SControl.Reg, 0); ++ ++ return; ++} // end UniataAhciSuspend() ++#endif ++ ++BOOLEAN ++NTAPI ++UniataAhciReadPM( ++ IN PHW_CHANNEL chan, ++ IN ULONG DeviceNumber, ++ IN ULONG Reg, ++ OUT PULONG result ++ ) ++{ ++ //ULONG Channel = deviceExtension->Channel + lChannel; ++ //ULONG hIS; ++ //ULONG CI; ++ //AHCI_IS_REG IS; ++ //ULONG tag=0; ++ PIDE_AHCI_CMD AHCI_CMD = &(chan->AhciCtlBlock->cmd); ++ PUCHAR RCV_FIS = &(chan->AhciCtlBlock->rcv_fis.rfis[0]); ++ ++ KdPrint(("UniataAhciReadPM: lChan %d [%#x]\n", chan->lChannel, DeviceNumber)); ++ ++ if(DeviceNumber == DEVNUM_NOT_SPECIFIED) { ++ (*result) = UniataSataReadPort4(chan, Reg, 0); ++ return TRUE; ++ } ++ if(DeviceNumber < AHCI_DEV_SEL_PM) { ++ switch(Reg) { ++ case IDX_SATA_SStatus: ++ Reg = 0; break; ++ case IDX_SATA_SError: ++ Reg = 1; break; ++ case IDX_SATA_SControl: ++ Reg = 2; break; ++ default: ++ return FALSE; ++ } ++ } ++ ++ RtlZeroMemory(AHCI_CMD->cfis, sizeof(AHCI_CMD->cfis)); ++ AHCI_CMD->cfis[0] = AHCI_FIS_TYPE_ATA_H2D; ++ AHCI_CMD->cfis[1] = AHCI_FIS_COMM_PM; ++ AHCI_CMD->cfis[2] = IDE_COMMAND_READ_PM; ++ AHCI_CMD->cfis[3] = (UCHAR)Reg; ++ AHCI_CMD->cfis[7] = (UCHAR)(IDE_USE_LBA | DeviceNumber); ++ AHCI_CMD->cfis[15] = IDE_DC_A_4BIT; ++ ++ if(UniataAhciSendCommand(chan->DeviceExtension, chan->lChannel, DeviceNumber, 0, 10) == 0xff) { ++ KdPrint2((" PM read failed\n")); ++ return FALSE; ++ } ++ ++ KdDump(RCV_FIS, sizeof(chan->AhciCtlBlock->rcv_fis.rfis)); ++ ++ (*result) = UniataAhciUlongFromRFIS(RCV_FIS); ++ return TRUE; ++ ++} // end UniataAhciReadPM() ++ ++UCHAR ++NTAPI ++UniataAhciWritePM( ++ IN PHW_CHANNEL chan, ++ IN ULONG DeviceNumber, ++ IN ULONG Reg, ++ IN ULONG value ++ ) ++{ ++ //ULONG Channel = deviceExtension->Channel + lChannel; ++ //ULONG hIS; ++ //ULONG CI; ++ //AHCI_IS_REG IS; ++ //ULONG tag=0; ++ ULONG TFD; ++ PIDE_AHCI_CMD AHCI_CMD = &(chan->AhciCtlBlock->cmd); ++ //PUCHAR RCV_FIS = &(chan->AhciCtlBlock->rcv_fis.rfis[0]); ++ ++ KdPrint(("UniataAhciWritePM: lChan %d [%#x] %#x\n", chan->lChannel, DeviceNumber, value)); ++ ++ if(DeviceNumber == DEVNUM_NOT_SPECIFIED) { ++ UniataSataWritePort4(chan, Reg, value, 0); ++ return 0; ++ } ++ if(DeviceNumber < AHCI_DEV_SEL_PM) { ++ switch(Reg) { ++ case IDX_SATA_SStatus: ++ Reg = 0; break; ++ case IDX_SATA_SError: ++ Reg = 1; break; ++ case IDX_SATA_SControl: ++ Reg = 2; break; ++ default: ++ return 0xff; ++ } ++ } ++ ++ RtlZeroMemory(AHCI_CMD->cfis, sizeof(AHCI_CMD->cfis)); ++ AHCI_CMD->cfis[0] = AHCI_FIS_TYPE_ATA_H2D; ++ AHCI_CMD->cfis[1] = AHCI_FIS_COMM_PM; ++ AHCI_CMD->cfis[2] = IDE_COMMAND_WRITE_PM; ++ AHCI_CMD->cfis[3] = (UCHAR)Reg; ++ AHCI_CMD->cfis[7] = (UCHAR)(IDE_USE_LBA | DeviceNumber); ++ ++ AHCI_CMD->cfis[12] = (UCHAR)(value & 0xff); ++ AHCI_CMD->cfis[4] = (UCHAR)((value >> 8) & 0xff); ++ AHCI_CMD->cfis[5] = (UCHAR)((value >> 16) & 0xff); ++ AHCI_CMD->cfis[6] = (UCHAR)((value >> 24) & 0xff); ++ ++ AHCI_CMD->cfis[15] = IDE_DC_A_4BIT; ++ ++ if(UniataAhciSendCommand(chan->DeviceExtension, chan->lChannel, DeviceNumber, 0, 100) == 0xff) { ++ KdPrint2((" PM write failed\n")); ++ return 0xff; ++ } ++ ++ TFD = UniataAhciReadChannelPort4(chan, IDX_AHCI_P_TFD); ++ ++ if(TFD & IDE_STATUS_ERROR) { ++ KdPrint2((" ERROR %#x\n", (UCHAR)(TFD >> 8))); ++ } ++ return (UCHAR)(TFD >> 8); ++ ++} // end UniataAhciWritePM() ++ ++VOID ++UniataAhciSetupCmdPtr( ++IN OUT PATA_REQ AtaReq ++ ) ++{ ++ union { ++ PUCHAR prd_base; ++ ULONGLONG prd_base64; ++ }; ++ union { ++ PUCHAR prd_base0; ++ ULONGLONG prd_base64_0; ++ }; ++ ULONG d; ++ ++ prd_base64_0 = prd_base64 = 0; ++ prd_base = (PUCHAR)(&AtaReq->ahci_cmd0); ++ prd_base0 = prd_base; ++ ++ prd_base64 = (prd_base64 + max(FIELD_OFFSET(ATA_REQ, ahci_cmd0), AHCI_CMD_ALIGNEMENT_MASK)) & ~AHCI_CMD_ALIGNEMENT_MASK; ++ ++ d = (ULONG)(prd_base64 - prd_base64_0); ++ KdPrint2((PRINT_PREFIX " aligned %I64x, d=%x\n", prd_base64, d)); ++ ++ AtaReq->ahci.ahci_cmd_ptr = (PIDE_AHCI_CMD)prd_base64; ++ KdPrint2((PRINT_PREFIX " ahci_cmd_ptr %#x\n", AtaReq->ahci.ahci_cmd_ptr)); ++} // end UniataAhciSetupCmdPtr() diff --cc drivers/usb/usbehci/CMakeLists.txt index 00000000000,0d8a7ba0cf5..0d8a7ba0cf5 mode 000000,100644..100644 --- a/drivers/usb/usbehci/CMakeLists.txt +++ b/drivers/usb/usbehci/CMakeLists.txt diff --cc drivers/usb/usbehci/irp.c index fa77f1cdd48,00000000000..861bcdcc21d mode 100644,000000..100644 --- a/drivers/usb/usbehci/irp.c +++ b/drivers/usb/usbehci/irp.c @@@ -1,654 -1,0 +1,768 @@@ +/* + * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface + * LICENSE: GPL - See COPYING in the top level directory + * FILE: drivers/usb/usbehci/irp.c + * PURPOSE: IRP Handling. + * PROGRAMMERS: + * Michael Martin (michael.martin@reactos.org) + */ + +#include "usbehci.h" +#include "hwiface.h" +#include "physmem.h" +#include "transfer.h" + +VOID NTAPI +WorkerThread(IN PVOID Context) +{ + PWORKITEMDATA WorkItemData = (PWORKITEMDATA)Context; + + CompletePendingURBRequest((PPDO_DEVICE_EXTENSION)WorkItemData->Context); + + ExFreePool(WorkItemData); +} + +VOID +RemoveUrbRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp) +{ + KIRQL OldIrql; + KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &OldIrql); + RemoveEntryList(&Irp->Tail.Overlay.ListEntry); + KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, OldIrql); +} + +VOID +RequestURBCancel (PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) +{ + KIRQL OldIrql = Irp->CancelIrql; + IoReleaseCancelSpinLock(DISPATCH_LEVEL); + DPRINT1("IRP CANCELLED\n"); + ASSERT(FALSE); + KeAcquireSpinLockAtDpcLevel(&PdoDeviceExtension->IrpQueueLock); + RemoveEntryList(&Irp->Tail.Overlay.ListEntry); + + KeReleaseSpinLock(&PdoDeviceExtension->IrpQueueLock, OldIrql); + + Irp->IoStatus.Status = STATUS_CANCELLED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); +} + +VOID +QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp) +{ + KIRQL OldIrql; + + KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &OldIrql); + + if ((Irp->Cancel) && (IoSetCancelRoutine(Irp, RequestURBCancel))) + { + KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, OldIrql); + Irp->IoStatus.Status = STATUS_CANCELLED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + else + { + InsertTailList(&DeviceExtension->IrpQueue, &Irp->Tail.Overlay.ListEntry); + KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, OldIrql); + } +} + +NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) +{ + NTSTATUS Status = STATUS_UNSUCCESSFUL; ++ USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; + ULONG_PTR Information = 0; + PIO_STACK_LOCATION Stack; + PUSB_DEVICE UsbDevice = NULL; ++ PEHCI_HOST_CONTROLLER hcd; + URB *Urb; + PFDO_DEVICE_EXTENSION FdoDeviceExtension; + FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension; + ++ hcd = &FdoDeviceExtension->hcd; ++ + Stack = IoGetCurrentIrpStackLocation(Irp); + ASSERT(Stack); + + Urb = (PURB) Stack->Parameters.Others.Argument1; + ASSERT(Urb); + + Information = 0; + Status = STATUS_SUCCESS; + + DPRINT("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer); + DPRINT("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); + DPRINT("UsbdDeviceHandle = %x\n", Urb->UrbHeader.UsbdDeviceHandle); + + UsbDevice = Urb->UrbHeader.UsbdDeviceHandle; + + /* UsbdDeviceHandle of 0 is root hub */ + if (UsbDevice == NULL) + UsbDevice = PdoDeviceExtension->UsbDevices[0]; + + /* Assume URB success */ + Urb->UrbHeader.Status = USBD_STATUS_SUCCESS; + /* Set the DeviceHandle to the Internal Device */ + Urb->UrbHeader.UsbdDeviceHandle = UsbDevice; + + switch (Urb->UrbHeader.Function) + { + case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: + { - DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER UsbDevice %x\n", UsbDevice); ++ PUSB_ENDPOINT_DESCRIPTOR EndPointDesc; ++ int i; ++ ++ for (i = 0; i < UsbDevice->ActiveInterface->InterfaceDescriptor.bNumEndpoints; i++) ++ { ++ EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)&UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor; ++ DPRINT("EndPoint %d Handle %x\n", i, &UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor); ++ DPRINT("bmAttributes %x\n", EndPointDesc->bmAttributes); ++ DPRINT("EndPoint is transfer type %x\n", EndPointDesc->bmAttributes & 0x0F); ++ } ++ DPRINT("UsbDevice %x, Handle %x\n", UsbDevice, Urb->UrbBulkOrInterruptTransfer.PipeHandle); + if (&UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor != Urb->UrbBulkOrInterruptTransfer.PipeHandle) + { - DPRINT1("Invalid Parameter, Expected EndPointDescriptor of %x, but got %x\n", &UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor, Urb->UrbBulkOrInterruptTransfer.PipeHandle); - Status = STATUS_INVALID_PARAMETER; ++ DPRINT("HubDevice %x, UsbDevice %x\n", PdoDeviceExtension->UsbDevices[0], UsbDevice); ++ if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_IN) ++ DPRINT1("USBD_TRANSFER_DIRECTION_IN\n"); ++ if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_OUT) ++ DPRINT1("USBD_TRANSFER_DIRECTION_OUT\n"); ++ if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_SHORT_TRANSFER_OK) ++ DPRINT1("USBD_SHORT_TRANSFER_OK\n"); ++ EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)Urb->UrbBulkOrInterruptTransfer.PipeHandle; ++ DPRINT("EndPoint is transfer type %x\n", EndPointDesc->bmAttributes & 0x0F); ++ DPRINT("Endpoint Address %x\n", EndPointDesc->bEndpointAddress & 0x0F); ++ if ((EndPointDesc->bmAttributes & 0x0F) == USB_ENDPOINT_TYPE_BULK) ++ { ++ IoMarkIrpPending(Irp); ++ Status = STATUS_PENDING; ++ ++ ExecuteTransfer(FdoDeviceExtension->DeviceObject, ++ UsbDevice, ++ Urb->UrbBulkOrInterruptTransfer.PipeHandle, ++ NULL, ++ Urb->UrbBulkOrInterruptTransfer.TransferFlags, ++ Urb->UrbBulkOrInterruptTransfer.TransferBuffer ? ++ Urb->UrbBulkOrInterruptTransfer.TransferBuffer : ++ (PVOID)Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL, ++ Urb->UrbBulkOrInterruptTransfer.TransferBuffer ? ++ Urb->UrbBulkOrInterruptTransfer.TransferBufferLength : 0, ++ Irp); ++ } ++ else ++ { ++ DPRINT1("Transfer Type not implemented yet!\n"); ++ /* FAKE IT */ ++ Status = STATUS_SUCCESS; ++ } ++ ++ break; ++ } ++ if (!Urb->UrbBulkOrInterruptTransfer.TransferBuffer) ++ { ++ DPRINT1("TransferBuffer is NULL!\n"); + ASSERT(FALSE); + break; + } + - ASSERT(Urb->UrbBulkOrInterruptTransfer.TransferBuffer != NULL); + RtlZeroMemory(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); + + if (UsbDevice == PdoDeviceExtension->UsbDevices[0]) + { + if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK)) + { + LONG i; - for (i = 0; i < PdoDeviceExtension->NumberOfPorts; i++) ++ for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++) + { - if (PdoDeviceExtension->Ports[i].PortChange) ++ if (hcd->Ports[i].PortChange) + { + DPRINT1("Inform hub driver that port %d has changed\n", i+1); + ((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1 << ((i + 1) & 7); + } + } + } + else + { + Urb->UrbHeader.Status = USBD_STATUS_INVALID_PARAMETER; + Status = STATUS_UNSUCCESSFUL; + DPRINT1("Invalid transfer flags for SCE\n"); + } + } + else + DPRINT1("Interrupt Transfer not for hub\n"); + break; + } + case URB_FUNCTION_GET_STATUS_FROM_DEVICE: + { + DPRINT1("URB_FUNCTION_GET_STATUS_FROM_DEVICE\n"); + /* If for the hub device */ + if ((Urb->UrbControlGetStatusRequest.Index == 0) && (UsbDevice == PdoDeviceExtension->UsbDevices[0])) + { + ASSERT(Urb->UrbBulkOrInterruptTransfer.TransferBuffer != NULL); + *(PUSHORT)Urb->UrbControlGetStatusRequest.TransferBuffer = USB_PORT_STATUS_CONNECT /*| USB_PORT_STATUS_ENABLE*/; + } + else + { + DPRINT1("UsbDeviceHandle %x, Index %x not implemented yet\n", UsbDevice, Urb->UrbControlGetStatusRequest.Index); + Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; + Status = STATUS_UNSUCCESSFUL; + } + break; + } + case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: + { + USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; + + DPRINT1("URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n"); + switch(Urb->UrbControlDescriptorRequest.DescriptorType) + { + case USB_DEVICE_DESCRIPTOR_TYPE: + { + PUCHAR BufPtr; + DPRINT1("Device Descr Type\n"); + + if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= sizeof(USB_DEVICE_DESCRIPTOR)) + { + Urb->UrbControlDescriptorRequest.TransferBufferLength = sizeof(USB_DEVICE_DESCRIPTOR); + } + if (UsbDevice == PdoDeviceExtension->UsbDevices[0]) + { - DPRINT1("ROOTHUB!\n"); + BufPtr = (PUCHAR)Urb->UrbControlDescriptorRequest.TransferBuffer; + - DPRINT1("Length %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); - + /* Copy the Device Descriptor */ + RtlCopyMemory(BufPtr, &UsbDevice->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR)); + DumpDeviceDescriptor((PUSB_DEVICE_DESCRIPTOR)Urb->UrbControlDescriptorRequest.TransferBuffer); + break; + } + + ASSERT(Urb->UrbControlDescriptorRequest.TransferBuffer != NULL); + + BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - Urb->UrbControlDescriptorRequest.TransferBuffer, - Urb->UrbControlDescriptorRequest.TransferBufferLength, - Irp); ++ ExecuteTransfer(FdoDeviceExtension->DeviceObject, ++ UsbDevice, ++ 0, ++ &CtrlSetup, ++ 0, ++ Urb->UrbControlDescriptorRequest.TransferBuffer ? ++ Urb->UrbControlDescriptorRequest.TransferBuffer : ++ (PVOID)Urb->UrbControlDescriptorRequest.TransferBufferMDL, ++ Urb->UrbControlDescriptorRequest.TransferBuffer ? ++ Urb->UrbControlDescriptorRequest.TransferBufferLength : 0, ++ Irp); + break; + } + case USB_CONFIGURATION_DESCRIPTOR_TYPE: + { + PUCHAR BufPtr; + LONG i, j; + DPRINT1("Config Descr Type\n"); + if (UsbDevice == PdoDeviceExtension->UsbDevices[0]) + { + DPRINT1("ROOTHUB!\n"); + } + if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= UsbDevice->ActiveConfig->ConfigurationDescriptor.wTotalLength) + { + Urb->UrbControlDescriptorRequest.TransferBufferLength = UsbDevice->ActiveConfig->ConfigurationDescriptor.wTotalLength; + } + else + { + DPRINT1("TransferBufferLenth %x is too small!!!\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); + if (Urb->UrbControlDescriptorRequest.TransferBufferLength < sizeof(USB_CONFIGURATION_DESCRIPTOR)) + { + DPRINT1("Configuration Descriptor cannot fit into given buffer!\n"); + break; + } + } + + ASSERT(Urb->UrbControlDescriptorRequest.TransferBuffer); + BufPtr = (PUCHAR)Urb->UrbControlDescriptorRequest.TransferBuffer; + + DPRINT1("Length %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); + + /* Copy the Configuration Descriptor */ + RtlCopyMemory(BufPtr, &UsbDevice->ActiveConfig->ConfigurationDescriptor, sizeof(USB_CONFIGURATION_DESCRIPTOR)); + + /* If there is no room for all the configs then bail */ + if (!(Urb->UrbControlDescriptorRequest.TransferBufferLength > sizeof(USB_CONFIGURATION_DESCRIPTOR))) + { + DPRINT("All Descriptors cannot fit into given buffer! Only USB_CONFIGURATION_DESCRIPTOR given\n"); + break; + } + + BufPtr += sizeof(USB_CONFIGURATION_DESCRIPTOR); + for (i = 0; i < UsbDevice->ActiveConfig->ConfigurationDescriptor.bNumInterfaces; i++) + { + /* Copy the Interface Descriptor */ + RtlCopyMemory(BufPtr, + &UsbDevice->ActiveConfig->Interfaces[i]->InterfaceDescriptor, + sizeof(USB_INTERFACE_DESCRIPTOR)); + BufPtr += sizeof(USB_INTERFACE_DESCRIPTOR); + for (j = 0; j < UsbDevice->ActiveConfig->Interfaces[i]->InterfaceDescriptor.bNumEndpoints; j++) + { + /* Copy the EndPoint Descriptor */ + RtlCopyMemory(BufPtr, + &UsbDevice->ActiveConfig->Interfaces[i]->EndPoints[j]->EndPointDescriptor, + sizeof(USB_ENDPOINT_DESCRIPTOR)); + BufPtr += sizeof(USB_ENDPOINT_DESCRIPTOR); + } + } + DumpFullConfigurationDescriptor((PUSB_CONFIGURATION_DESCRIPTOR)Urb->UrbControlDescriptorRequest.TransferBuffer); + break; + } + case USB_STRING_DESCRIPTOR_TYPE: + { + DPRINT1("StringDescriptorType\n"); + DPRINT1("Urb->UrbControlDescriptorRequest.Index %x\n", Urb->UrbControlDescriptorRequest.Index); + DPRINT1("Urb->UrbControlDescriptorRequest.LanguageId %x\n", Urb->UrbControlDescriptorRequest.LanguageId); + + if (Urb->UrbControlDescriptorRequest.Index == 0) + DPRINT1("Requesting LANGID's\n"); + + BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - Urb->UrbControlDescriptorRequest.TransferBuffer, - Urb->UrbControlDescriptorRequest.TransferBufferLength, - Irp); ++ ExecuteTransfer(FdoDeviceExtension->DeviceObject, ++ UsbDevice, ++ 0, ++ &CtrlSetup, ++ 0, ++ Urb->UrbControlDescriptorRequest.TransferBuffer ? ++ Urb->UrbControlDescriptorRequest.TransferBuffer : ++ (PVOID)Urb->UrbControlDescriptorRequest.TransferBufferMDL, ++ Urb->UrbControlDescriptorRequest.TransferBuffer ? ++ Urb->UrbControlDescriptorRequest.TransferBufferLength : 0, ++ Irp); + break; + } + default: + { + DPRINT1("Descriptor Type %x not supported!\n", Urb->UrbControlDescriptorRequest.DescriptorType); + } + } + break; + } + case URB_FUNCTION_SELECT_CONFIGURATION: + { + PUSBD_INTERFACE_INFORMATION InterfaceInfo; + LONG iCount, pCount; + - DPRINT1("Selecting Configuration\n"); - DPRINT1("ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle); ++ DPRINT("Selecting Configuration\n"); ++ DPRINT("ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle); ++ + if (Urb->UrbSelectConfiguration.ConfigurationDescriptor) + { + Urb->UrbSelectConfiguration.ConfigurationHandle = &UsbDevice->ActiveConfig->ConfigurationDescriptor; - DPRINT1("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle); - ASSERT(FALSE); ++ DPRINT("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle); + InterfaceInfo = &Urb->UrbSelectConfiguration.Interface; + - DPRINT1("Length %x\n", InterfaceInfo->Length); - DPRINT1("NumberOfPipes %x\n", InterfaceInfo->NumberOfPipes); ++ DPRINT("Length %x\n", InterfaceInfo->Length); ++ DPRINT("NumberOfPipes %x\n", InterfaceInfo->NumberOfPipes); + + for (iCount = 0; iCount < Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces; iCount++) + { + InterfaceInfo->InterfaceHandle = (PVOID)&UsbDevice->ActiveInterface->InterfaceDescriptor; + InterfaceInfo->Class = UsbDevice->ActiveInterface->InterfaceDescriptor.bInterfaceClass; + InterfaceInfo->SubClass = UsbDevice->ActiveInterface->InterfaceDescriptor.bInterfaceSubClass; + InterfaceInfo->Protocol = UsbDevice->ActiveInterface->InterfaceDescriptor.bInterfaceProtocol; + InterfaceInfo->Reserved = 0; + + for (pCount = 0; pCount < InterfaceInfo->NumberOfPipes; pCount++) + { + InterfaceInfo->Pipes[pCount].MaximumPacketSize = UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor.wMaxPacketSize; + InterfaceInfo->Pipes[pCount].EndpointAddress = UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor.bEndpointAddress; + InterfaceInfo->Pipes[pCount].Interval = UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor.bInterval; + InterfaceInfo->Pipes[pCount].PipeType = UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor.bmAttributes; + InterfaceInfo->Pipes[pCount].PipeHandle = (PVOID)&UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor; + if (InterfaceInfo->Pipes[pCount].MaximumTransferSize == 0) + InterfaceInfo->Pipes[pCount].MaximumTransferSize = 4096; + /* InterfaceInfo->Pipes[j].PipeFlags = 0; */ + } + InterfaceInfo = (PUSBD_INTERFACE_INFORMATION)((PUCHAR)InterfaceInfo + InterfaceInfo->Length); + if (InterfaceInfo->Length == 0) break; + } ++ ++ if (UsbDevice != PdoDeviceExtension->UsbDevices[0]) ++ { ++ DPRINT("Setting Configuration!\n"); ++ BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); ++ IoMarkIrpPending(Irp); ++ Status = STATUS_PENDING; ++ DPRINT1("Input Buffer %x, MDL %x\n", Urb->UrbBulkOrInterruptTransfer.TransferBuffer, (PVOID)Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL); ++ ++ ExecuteTransfer(FdoDeviceExtension->DeviceObject, ++ UsbDevice, ++ 0, ++ &CtrlSetup, ++ 0, ++ NULL, ++ 0, ++ Irp); ++ break; ++ } ++ else ++ { ++ DPRINT1("Hub only has one configuration.\n"); ++ } + } + else + { + /* FIXME: Set device to unconfigured state */ + DPRINT1("Setting device to unconfigured state not implemented!\n"); + } + break; + } + case URB_FUNCTION_SELECT_INTERFACE: + { - USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; + PUSBD_INTERFACE_INFORMATION InterfaceInfo; + int i; + + DPRINT1("Select Interface!\n"); + DPRINT1("Config Handle %x\n", Urb->UrbSelectInterface.ConfigurationHandle); + + InterfaceInfo = &Urb->UrbSelectInterface.Interface; + DPRINT1("InterfaceNumber %x\n", InterfaceInfo->InterfaceNumber); + DPRINT1("AlternateSetting %x\n", InterfaceInfo->AlternateSetting); + DPRINT1("NumPipes %x\n", InterfaceInfo->NumberOfPipes); + for (i=0;iNumberOfPipes;i++) + { + InterfaceInfo->Pipes[i].PipeHandle = (PVOID)&UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor; + } + + BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - NULL, - 0, - Irp); ++ ExecuteTransfer(FdoDeviceExtension->DeviceObject, ++ UsbDevice, ++ 0, ++ &CtrlSetup, ++ 0, ++ NULL, ++ 0, ++ Irp); + break; + } + case URB_FUNCTION_CLASS_DEVICE: + { + DPRINT1("URB_FUNCTION_CLASS_DEVICE\n"); + switch (Urb->UrbControlVendorClassRequest.Request) + { + case USB_REQUEST_GET_DESCRIPTOR: + { + switch (Urb->UrbControlVendorClassRequest.Value >> 8) + { + case USB_DEVICE_CLASS_AUDIO: + { + DPRINT1("USB_DEVICE_CLASS_AUDIO not implemented\n"); + break; + } + case USB_DEVICE_CLASS_COMMUNICATIONS: + { + DPRINT1("USB_DEVICE_CLASS_COMMUNICATIONS not implemented\n"); + break; + } + case USB_DEVICE_CLASS_HUMAN_INTERFACE: + { + DPRINT1("USB_DEVICE_CLASS_HUMAN_INTERFACE not implemented\n"); + break; + } + case USB_DEVICE_CLASS_MONITOR: + { + DPRINT1("USB_DEVICE_CLASS_MONITOR not implemented\n"); + break; + } + case USB_DEVICE_CLASS_PHYSICAL_INTERFACE: + { + DPRINT1("USB_DEVICE_CLASS_PHYSICAL_INTERFACE not implemented\n"); + break; + } + case USB_DEVICE_CLASS_POWER: + { + DPRINT1("USB_DEVICE_CLASS_POWER not implemented\n"); + break; + } + case USB_DEVICE_CLASS_PRINTER: + { + DPRINT1("USB_DEVICE_CLASS_PRINTER not implemented\n"); + break; + } + case USB_DEVICE_CLASS_STORAGE: + { + DPRINT1("USB_DEVICE_CLASS_STORAGE not implemented\n"); + break; + } + case USB_DEVICE_CLASS_RESERVED: + DPRINT1("Reserved!!!\n"); + case USB_DEVICE_CLASS_HUB: + { + PUSB_HUB_DESCRIPTOR UsbHubDescr = Urb->UrbControlVendorClassRequest.TransferBuffer; + + DPRINT1("Length %x\n", Urb->UrbControlVendorClassRequest.TransferBufferLength); + ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); + /* FIXME: Handle more than root hub? */ + if(Urb->UrbControlVendorClassRequest.TransferBufferLength >= sizeof(USB_HUB_DESCRIPTOR)) + { + Urb->UrbControlVendorClassRequest.TransferBufferLength = sizeof(USB_HUB_DESCRIPTOR); + } + else + { - /* FIXME: Handle this correctly */ + UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); + UsbHubDescr->bDescriptorType = 0x29; + break; + } + DPRINT1("USB_DEVICE_CLASS_HUB request\n"); + UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); + UsbHubDescr->bDescriptorType = 0x29; - UsbHubDescr->bNumberOfPorts = PdoDeviceExtension->NumberOfPorts; ++ UsbHubDescr->bNumberOfPorts = hcd->ECHICaps.HCSParams.PortCount; + UsbHubDescr->wHubCharacteristics = 0x0012; + UsbHubDescr->bPowerOnToPowerGood = 0x01; + UsbHubDescr->bHubControlCurrent = 0x00; + UsbHubDescr->bRemoveAndPowerMask[0] = 0x00; + UsbHubDescr->bRemoveAndPowerMask[1] = 0x00; + UsbHubDescr->bRemoveAndPowerMask[2] = 0xff; + break; + } + default: + { + DPRINT1("Unknown UrbControlVendorClassRequest Value\n"); + } + } + break; + } + case USB_REQUEST_GET_STATUS: + { + DPRINT1("DEVICE: USB_REQUEST_GET_STATUS for port %d\n", Urb->UrbControlVendorClassRequest.Index); + if (Urb->UrbControlVendorClassRequest.Index == 1) + { + ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); + ((PULONG)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = 0; + } + break; + } + default: + { + DPRINT1("Unhandled URB request for class device\n"); + Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; + ASSERT(FALSE); + } + } + break; + } + case URB_FUNCTION_CLASS_OTHER: + { + DPRINT("URB_FUNCTION_CLASS_OTHER\n"); + /* FIXME: Each one of these needs to make sure that the index value is a valid for the number of ports and return STATUS_UNSUCCESSFUL if not */ + + switch (Urb->UrbControlVendorClassRequest.Request) + { + case USB_REQUEST_GET_STATUS: + { + DPRINT("USB_REQUEST_GET_STATUS Port %d\n", Urb->UrbControlVendorClassRequest.Index); + + ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); - DPRINT("PortStatus %x\n", PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus); - DPRINT("PortChange %x\n", PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange); - ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus; - ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[1] = PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange; ++ DPRINT("PortStatus %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus); ++ DPRINT("PortChange %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange); ++ ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus; ++ ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[1] = hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange; + break; + } + case USB_REQUEST_CLEAR_FEATURE: + { + switch (Urb->UrbControlVendorClassRequest.Value) + { + case C_PORT_CONNECTION: + DPRINT("C_PORT_CONNECTION\n"); - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_CONNECT; ++ hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_CONNECT; + break; + case C_PORT_RESET: + DPRINT("C_PORT_RESET\n"); - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_RESET; - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus |= USB_PORT_STATUS_ENABLE; ++ hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_RESET; ++ hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus |= USB_PORT_STATUS_ENABLE; + break; + default: + DPRINT("Unknown Value for Clear Feature %x \n", Urb->UrbControlVendorClassRequest.Value); + break; + } + break; + } + case USB_REQUEST_SET_FEATURE: + { - DPRINT("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index, ++ DPRINT1("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index, + Urb->UrbControlVendorClassRequest.Value); + + switch(Urb->UrbControlVendorClassRequest.Value) + { + case PORT_RESET: + { - DPRINT("Port Reset %d\n", Urb->UrbControlVendorClassRequest.Index-1); - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange |= USB_PORT_STATUS_RESET; - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus &= ~USB_PORT_STATUS_ENABLE; - ResetPort(&FdoDeviceExtension->hcd, Urb->UrbControlVendorClassRequest.Index-1); ++ DPRINT1("Port Reset %d\n", Urb->UrbControlVendorClassRequest.Index-1); ++ hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange |= USB_PORT_STATUS_RESET; ++ hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus &= ~USB_PORT_STATUS_ENABLE; ++ ResetPort(hcd, Urb->UrbControlVendorClassRequest.Index-1); + break; + } + case PORT_ENABLE: + { - DPRINT("PORT_ENABLE not implemented\n"); ++ DPRINT1("PORT_ENABLE not implemented\n"); + break; + } + case PORT_POWER: + { - DPRINT("PORT_POWER not implemented\n"); ++ DPRINT1("PORT_POWER not implemented\n"); + break; + } + default: + { - DPRINT("Unknown Set Feature!\n"); ++ DPRINT1("Unknown Set Feature!\n"); + break; + } + } + - if (!(PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus & 0x8000)) ++ if (!(hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus & 0x8000)) ++ { ++ DPRINT1("------ PortStatus %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus); ++ DPRINT1("Calling CompletePendingURBRequest\n"); ++ + CompletePendingURBRequest(PdoDeviceExtension); ++ } + + + break; + } + case USB_REQUEST_SET_ADDRESS: + { + DPRINT1("USB_REQUEST_SET_ADDRESS\n"); - ASSERT(FALSE); + break; + } + case USB_REQUEST_GET_DESCRIPTOR: + { + DPRINT1("USB_REQUEST_GET_DESCRIPTOR\n"); + break; + } + case USB_REQUEST_SET_DESCRIPTOR: + { + DPRINT1("USB_REQUEST_SET_DESCRIPTOR\n"); + break; + } + case USB_REQUEST_GET_CONFIGURATION: + { + DPRINT1("USB_REQUEST_GET_CONFIGURATION\n"); + break; + } + case USB_REQUEST_SET_CONFIGURATION: + { + DPRINT1("USB_REQUEST_SET_CONFIGURATION\n"); + break; + } + case USB_REQUEST_GET_INTERFACE: + { + DPRINT1("USB_REQUEST_GET_INTERFACE\n"); + break; + } + case USB_REQUEST_SET_INTERFACE: + { + DPRINT1("USB_REQUEST_SET_INTERFACE\n"); + break; + } + case USB_REQUEST_SYNC_FRAME: + { + DPRINT1("USB_REQUEST_SYNC_FRAME\n"); + break; + } + default: + { + DPRINT1("Unknown Function Class Unknown request\n"); + break; + } + } + break; + } + case URB_FUNCTION_CONTROL_TRANSFER: + { + DPRINT1("URB_FUNCTION_CONTROL_TRANSFER\n"); + DPRINT1("PipeHandle %x\n", Urb->UrbControlTransfer.PipeHandle); + DPRINT1("TransferFlags %x\n", Urb->UrbControlTransfer.TransferFlags); + DPRINT1("TransferLength %x\n", Urb->UrbControlTransfer.TransferBufferLength); + DPRINT1("TransferBuffer %x\n", Urb->UrbControlTransfer.TransferBuffer); + DPRINT1("TransferMDL %x\n", Urb->UrbControlTransfer.TransferBufferMDL); + DPRINT1("SetupPacket %x\n", Urb->UrbControlTransfer.SetupPacket); + ASSERT(FALSE); + break; + } + case URB_FUNCTION_CLASS_INTERFACE: + { ++ USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; + DPRINT1("URB_FUNCTION_CLASS_INTERFACE\n"); ++ DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags); ++ DPRINT1("TransferBufferLength %x\n", Urb->UrbControlVendorClassRequest.TransferBufferLength); ++ DPRINT1("TransferBuffer %x\n", Urb->UrbControlVendorClassRequest.TransferBuffer); ++ DPRINT1("TransferBufferMDL %x\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL); ++ DPRINT1("RequestTypeReservedBits %x\n", Urb->UrbControlVendorClassRequest.RequestTypeReservedBits); ++ DPRINT1("Request %x\n", Urb->UrbControlVendorClassRequest.Request); ++ DPRINT1("Value %x\n", Urb->UrbControlVendorClassRequest.Value); ++ DPRINT1("Index %x\n", Urb->UrbControlVendorClassRequest.Index); ++ CtrlSetup.bmRequestType.B = 0xa1; //FIXME: Const. ++ CtrlSetup.bRequest = Urb->UrbControlVendorClassRequest.Request; ++ CtrlSetup.wValue.W = Urb->UrbControlVendorClassRequest.Value; ++ CtrlSetup.wIndex.W = Urb->UrbControlVendorClassRequest.Index; ++ CtrlSetup.wLength = Urb->UrbControlVendorClassRequest.TransferBufferLength; ++ ++ IoMarkIrpPending(Irp); ++ Status = STATUS_PENDING; ++ ExecuteTransfer(FdoDeviceExtension->DeviceObject, ++ UsbDevice, ++ 0, ++ &CtrlSetup, ++ 0, ++ Urb->UrbControlVendorClassRequest.TransferBuffer ? ++ Urb->UrbControlVendorClassRequest.TransferBuffer : ++ (PVOID)Urb->UrbControlVendorClassRequest.TransferBufferMDL, ++ Urb->UrbControlVendorClassRequest.TransferBuffer ? ++ Urb->UrbControlVendorClassRequest.TransferBufferLength : 0, ++ Irp); + break; + } + default: + { + DPRINT1("Unhandled URB %x\n", Urb->UrbHeader.Function); + Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; + } + } + + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = Information; + return Status; +} + +VOID +CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) +{ + PLIST_ENTRY NextIrp = NULL; + KIRQL oldIrql; + PIRP Irp = NULL; + + KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql); + + if (IsListEmpty(&DeviceExtension->IrpQueue)) + { - DPRINT1("There should have been one SCE request pending\n"); ++ DPRINT1("There should have been one SCE request pending. Did the usbhub driver load?\n"); + KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); ++ ASSERT(FALSE); + return; + } + NextIrp = RemoveHeadList(&DeviceExtension->IrpQueue); + Irp = CONTAINING_RECORD(NextIrp, IRP, Tail.Overlay.ListEntry); + + if (!Irp) + { + DPRINT1("No Irp\n"); + return; + } + + IoSetCancelRoutine(Irp, NULL); + KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); + + HandleUrbRequest(DeviceExtension, Irp); + IoCompleteRequest(Irp, IO_NO_INCREMENT); +} + diff --cc drivers/usb/usbhub/CMakeLists.txt index 00000000000,60c165f4e35..60c165f4e35 mode 000000,100644..100644 --- a/drivers/usb/usbhub/CMakeLists.txt +++ b/drivers/usb/usbhub/CMakeLists.txt diff --cc drivers/usb/usbstor/CMakeLists.txt index 00000000000,041ce3947b1..041ce3947b1 mode 000000,100644..100644 --- a/drivers/usb/usbstor/CMakeLists.txt +++ b/drivers/usb/usbstor/CMakeLists.txt diff --cc drivers/video/displays/framebuf_new/debug.c index ada125df7ec,ada125df7ec..ada125df7ec mode 100755,100644..100644 --- a/drivers/video/displays/framebuf_new/debug.c +++ b/drivers/video/displays/framebuf_new/debug.c diff --cc drivers/video/displays/framebuf_new/debug.h index d73a223baaf,d73a223baaf..d73a223baaf mode 100755,100644..100644 --- a/drivers/video/displays/framebuf_new/debug.h +++ b/drivers/video/displays/framebuf_new/debug.h diff --cc drivers/video/displays/framebuf_new/driver.h index e9e617190c0,64ebbbc51a4..64ebbbc51a4 mode 100755,100644..100644 --- a/drivers/video/displays/framebuf_new/driver.h +++ b/drivers/video/displays/framebuf_new/driver.h diff --cc drivers/video/displays/framebuf_new/palette.c index c8cff990e2b,c8cff990e2b..c8cff990e2b mode 100755,100644..100644 --- a/drivers/video/displays/framebuf_new/palette.c +++ b/drivers/video/displays/framebuf_new/palette.c diff --cc drivers/video/displays/framebuf_new/pointer.c index d3752a2763c,d3752a2763c..d3752a2763c mode 100755,100644..100644 --- a/drivers/video/displays/framebuf_new/pointer.c +++ b/drivers/video/displays/framebuf_new/pointer.c diff --cc drivers/video/displays/framebuf_new/screen.c index 7ea4443c323,7ea4443c323..7ea4443c323 mode 100755,100644..100644 --- a/drivers/video/displays/framebuf_new/screen.c +++ b/drivers/video/displays/framebuf_new/screen.c diff --cc drivers/video/displays/vga_new/debug.c index f41697bd5e4,f41697bd5e4..f41697bd5e4 mode 100755,100644..100644 --- a/drivers/video/displays/vga_new/debug.c +++ b/drivers/video/displays/vga_new/debug.c diff --cc drivers/video/displays/vga_new/debug.h index 4a5764d4953,4a5764d4953..4a5764d4953 mode 100755,100644..100644 --- a/drivers/video/displays/vga_new/debug.h +++ b/drivers/video/displays/vga_new/debug.h diff --cc drivers/video/displays/vga_new/driver.h index f060f17bed6,f060f17bed6..f060f17bed6 mode 100755,100644..100644 --- a/drivers/video/displays/vga_new/driver.h +++ b/drivers/video/displays/vga_new/driver.h diff --cc drivers/video/displays/vga_new/palette.c index 95aa06d875c,95aa06d875c..95aa06d875c mode 100755,100644..100644 --- a/drivers/video/displays/vga_new/palette.c +++ b/drivers/video/displays/vga_new/palette.c diff --cc drivers/video/displays/vga_new/screen.c index faf6aaa2313,faf6aaa2313..faf6aaa2313 mode 100755,100644..100644 --- a/drivers/video/displays/vga_new/screen.c +++ b/drivers/video/displays/vga_new/screen.c diff --cc include/asm/syscalls.inc index 19b21423fe3,00000000000..96784e5a2e4 mode 100644,000000..100644 --- a/include/asm/syscalls.inc +++ b/include/asm/syscalls.inc @@@ -1,96 -1,0 +1,94 @@@ + +#ifdef _M_IX86 - EXTERN _KiSystemService:PROC +#define KUSER_SHARED_SYSCALL HEX(7ffe0300) +#define KGDT_R0_CODE 8 +MACRO(STUBCODE_U, SyscallId, StackBytes) + mov eax, SyscallId + mov ecx, KUSER_SHARED_SYSCALL + call dword ptr [ecx] + ret StackBytes +ENDM +MACRO(STUBCODE_K, SyscallId, StackBytes) + mov eax, SyscallId + lea edx, [esp + 4] - pushf ++ pushfd + push KGDT_R0_CODE + call _KiSystemService + ret StackBytes +ENDM +#elif defined(_M_AMD64) - EXTERN KiSystemService:PROC +MACRO(STUBCODE_U, SyscallId, StackBytes) + mov eax, SyscallId + mov r10, rcx + syscall + ret StackBytes +ENDM +MACRO(STUBCODE_K, SyscallId, StackBytes) + mov eax, SyscallId + call KiSystemService + ret StackBytes +ENDM +#elif defined(_M_ARM) +MACRO(STUBCODE_U, SyscallId, StackBytes) + swi #SyscallId + bx lr +ENDM +MACRO(STUBCODE_K, SyscallId, StackBytes) + mov ip, lr + swi #SyscallId + bx ip +ENDM +#elif defined(_M_PPC) +MACRO(STUBCODE_U, SyscallId, StackBytes) + stwu 1,-16(1) + mflr 0 + stw 0,0(1) + li 0, SyscallId + sc + lwz 0,0(1) + mtlr 0 + addi 1,1,16 + blr +ENDM +#define STUBCODE_K STUBCODE_U +#elif defined(_M_MIPS) +MACRO(STUBCODE_U, SyscallId, StackBytes) + li $8, KUSER_SHARED_SYSCALL + lw $8,0($8) + j $8 + nop +ENDM +MACRO(STUBCODE_K, SyscallId, StackBytes) + j KiSystemService + nop +ENDM +#else +#error unsupported architecture +#endif + +#ifdef _M_IX86 +MACRO(MAKE_LABEL, Name, Stackbytes) + PUBLIC _&Name&@&Stackbytes + _&Name&@&Stackbytes: +ENDM +#else +MACRO(MAKE_LABEL, Name, Stackbytes) + PUBLIC &Name + &Name: +ENDM +#endif + +MACRO(STUB_U, Name, ArgCount) + Stackbytes = 4 * &ArgCount + MAKE_LABEL Zw&Name, %Stackbytes + MAKE_LABEL Nt&Name, %Stackbytes + STUBCODE_U SyscallId, %Stackbytes + SyscallId = SyscallId + 1 +ENDM + +MACRO(STUB_K, Name, ArgCount) + Stackbytes = 4 * &ArgCount + MAKE_LABEL Zw&Name, %Stackbytes + STUBCODE_K SyscallId, %Stackbytes + SyscallId = SyscallId + 1 +ENDM diff --cc include/crt/_mingw_unicode.h index 00000000000,38334bc71e4..38334bc71e4 mode 000000,100644..100644 --- a/include/crt/_mingw_unicode.h +++ b/include/crt/_mingw_unicode.h diff --cc include/ddk/ioaccess.h index d1247302c0a,d1247302c0a..d1247302c0a mode 100755,100644..100644 --- a/include/ddk/ioaccess.h +++ b/include/ddk/ioaccess.h diff --cc include/ddk/msports.h index 00000000000,02b812e0e64..02b812e0e64 mode 000000,100644..100644 --- a/include/ddk/msports.h +++ b/include/ddk/msports.h diff --cc include/host/wine/unicode.h index 00000000000,f553f64a444..f553f64a444 mode 000000,100644..100644 --- a/include/host/wine/unicode.h +++ b/include/host/wine/unicode.h diff --cc include/reactos/libs/fslib/vfatlib.h index fcebc431938,fcebc431938..fcebc431938 mode 100755,100644..100644 --- a/include/reactos/libs/fslib/vfatlib.h +++ b/include/reactos/libs/fslib/vfatlib.h diff --cc include/reactos/libs/fullfat/ff_fatdef.h index 00000000000,8e86d138a6d..8e86d138a6d mode 000000,100644..100644 --- a/include/reactos/libs/fullfat/ff_fatdef.h +++ b/include/reactos/libs/fullfat/ff_fatdef.h diff --cc include/reactos/libs/fullfat/ff_format.h index 00000000000,d7c53e58a9f..d7c53e58a9f mode 000000,100644..100644 --- a/include/reactos/libs/fullfat/ff_format.h +++ b/include/reactos/libs/fullfat/ff_format.h diff --cc include/reactos/libs/fullfat/ff_unicode.h index 00000000000,9f0cbecb4cd..9f0cbecb4cd mode 000000,100644..100644 --- a/include/reactos/libs/fullfat/ff_unicode.h +++ b/include/reactos/libs/fullfat/ff_unicode.h diff --cc include/reactos/libs/libpng/pngdebug.h index 00000000000,984bc28f47b..984bc28f47b mode 000000,100644..100644 --- a/include/reactos/libs/libpng/pngdebug.h +++ b/include/reactos/libs/libpng/pngdebug.h diff --cc include/reactos/libs/libpng/pnginfo.h index 00000000000,1b82efb8c9b..1b82efb8c9b mode 000000,100644..100644 --- a/include/reactos/libs/libpng/pnginfo.h +++ b/include/reactos/libs/libpng/pnginfo.h diff --cc include/reactos/libs/libpng/pnglibconf.h index 00000000000,77bb98e8d73..77bb98e8d73 mode 000000,100644..100644 --- a/include/reactos/libs/libpng/pnglibconf.h +++ b/include/reactos/libs/libpng/pnglibconf.h diff --cc include/reactos/libs/libpng/pngstruct.h index 00000000000,ed6723dee77..ed6723dee77 mode 000000,100644..100644 --- a/include/reactos/libs/libpng/pngstruct.h +++ b/include/reactos/libs/libpng/pngstruct.h diff --cc include/reactos/mc/ntiologc.mc index 00000000000,675f6cacbb1..675f6cacbb1 mode 000000,100644..100644 --- a/include/reactos/mc/ntiologc.mc +++ b/include/reactos/mc/ntiologc.mc diff --cc include/reactos/mc/sacmsg.mc index 00000000000,dce4a07f41f..dce4a07f41f mode 000000,100644..100644 --- a/include/reactos/mc/sacmsg.mc +++ b/include/reactos/mc/sacmsg.mc diff --cc include/reactos/undocuser.h index ee5cf173025,00000000000..02e2e6c773c mode 100644,000000..100644 --- a/include/reactos/undocuser.h +++ b/include/reactos/undocuser.h @@@ -1,186 -1,0 +1,189 @@@ +#ifndef _UNDOCUSER_H +#define _UNDOCUSER_H + +/* Built in class atoms */ +#define WC_MENU (MAKEINTATOM(0x8000)) +#define WC_DESKTOP (MAKEINTATOM(0x8001)) +#define WC_DIALOG (MAKEINTATOM(0x8002)) +#define WC_SWITCH (MAKEINTATOM(0x8003)) +#define WC_ICONTITLE (MAKEINTATOM(0x8004)) + +/* Non SDK Styles */ +#define ES_COMBO 0x200 /* Parent is a combobox */ +#define WS_MAXIMIZED WS_MAXIMIZE +#define WS_MINIMIZED WS_MINIMIZE + +/* Non SDK ExStyles */ +#define WS_EX_DRAGDETECT 0x00000002 +#define WS_EX_MAKEVISIBLEWHENUNGHOSTED 0x00000800 +#define WS_EX_FORCELEGACYRESIZENCMETR 0x00800000 +#define WS_EX_UISTATEACTIVE 0x04000000 +#define WS_EX_REDIRECTED 0x20000000 +#define WS_EX_UISTATEKBACCELHIDDEN 0x40000000 +#define WS_EX_UISTATEFOCUSRECTHIDDEN 0x80000000 +#define WS_EX_SETANSICREATOR 0x80000000 // For WNDS_ANSICREATOR + +/* Non SDK Window Message types. */ +#define WM_SETVISIBLE 0x00000009 +#define WM_ALTTABACTIVE 0x00000029 +#define WM_ISACTIVEICON 0x00000035 +#define WM_QUERYPARKICON 0x00000036 +#define WM_CLIENTSHUTDOWN 0x0000003B +#define WM_COPYGLOBALDATA 0x00000049 +#define WM_LOGONNOTIFY 0x0000004C +#define WM_KEYF1 0x0000004D +#define WM_NCUAHDRAWCAPTION 0x000000AE +#define WM_NCUAHDRAWFRAME 0x000000AF +#define WM_SYSTIMER 0x00000118 +#define WM_LBTRACKPOINT 0x00000131 +#define LB_CARETON 0x000001a3 +#define LB_CARETOFF 0x000001a4 - #define WM_DROPOBJEC 0x0000022A ++#define WM_DROPOBJECT 0x0000022A +#define WM_QUERYDROPOBJECT 0x0000022B +#define WM_BEGINDRAG 0x0000022C +#define WM_DRAGLOOP 0x0000022D +#define WM_DRAGSELECT 0x0000022E +#define WM_DRAGMOVE 0x0000022F +#define WM_POPUPSYSTEMMENU 0x00000313 +#define WM_UAHINIT 0x0000031b +#define WM_CBT 0x000003FF // ReactOS only. +#define WM_MAXIMUM 0x0001FFFF + +/* Non SDK DCE types.*/ +#define DCX_USESTYLE 0x00010000 +#define DCX_KEEPCLIPRGN 0x00040000 +#define DCX_KEEPLAYOUT 0x40000000 +#define DCX_PROCESSOWNED 0x80000000 + +/* Caret timer ID */ +#define IDCARETTIMER (0xffff) + +/* SetWindowPos undocumented flags */ +#define SWP_NOCLIENTSIZE 0x0800 +#define SWP_NOCLIENTMOVE 0x1000 +#define SWP_STATECHANGED 0x8000 + +/* Non SDK Queue state flags. */ +#define QS_SMRESULT 0x8000 /* see "Undoc. Windows" */ + +// +// Definitions used by WM_CLIENTSHUTDOWN +// +// Client Shutdown messages +#define MCS_SHUTDOWNTIMERS 1 +#define MCS_QUERYENDSESSION 2 +// Client Shutdown returns +#define MCSR_GOODFORSHUTDOWN 1 +#define MCSR_SHUTDOWNFINISHED 2 +#define MCSR_DONOTSHUTDOWN 3 + +// +// Definitions used by WM_LOGONNOTIFY +// ++#define LN_SHELL_EXITED 0x2 +#define LN_START_TASK_MANAGER 0x4 +#define LN_LOCK_WORKSTATION 0x5 +#define LN_UNLOCK_WORKSTATION 0x6 +#define LN_MESSAGE_BEEP 0x9 ++#define LN_START_SCREENSAVE 0xA + ++#define STARTF_SCRNSAVER 0x80000000 +#define CW_USEDEFAULT16 ((short)0x8000) + +#define SBRG_SCROLLBAR 0 /* the scrollbar itself */ +#define SBRG_TOPRIGHTBTN 1 /* the top or right button */ +#define SBRG_PAGEUPRIGHT 2 /* the page up or page right region */ +#define SBRG_SCROLLBOX 3 /* the scroll box */ +#define SBRG_PAGEDOWNLEFT 4 /* the page down or page left region */ +#define SBRG_BOTTOMLEFTBTN 5 /* the bottom or left button */ + - ++BOOL WINAPI SetLogonNotifyWindow(HWND Wnd, HWINSTA WinSta); +BOOL WINAPI KillSystemTimer(HWND,UINT_PTR); +UINT_PTR WINAPI SetSystemTimer(HWND,UINT_PTR,UINT,TIMERPROC); +DWORD_PTR WINAPI SetSysColorsTemp(const COLORREF *, const HBRUSH *, DWORD_PTR); +BOOL WINAPI SetDeskWallPaper(LPCSTR); +VOID WINAPI ScrollChildren(HWND,UINT,WPARAM,LPARAM); +void WINAPI CalcChildScroll(HWND, INT); +BOOL WINAPI RegisterLogonProcess(DWORD,BOOL); +DWORD WINAPI GetAppCompatFlags(HTASK hTask); +DWORD WINAPI GetAppCompatFlags2(HTASK hTask); +LONG WINAPI CsrBroadcastSystemMessageExW(DWORD dwflags, + LPDWORD lpdwRecipients, + UINT uiMessage, + WPARAM wParam, + LPARAM lParam, + PBSMINFO pBSMInfo); +BOOL WINAPI CliImmSetHotKey(DWORD dwID, UINT uModifiers, UINT uVirtualKey, HKL hKl); +HWND WINAPI GetTaskmanWindow(VOID); +HWND WINAPI GetProgmanWindow(VOID); + +// +// User api hook +// + +typedef LRESULT(CALLBACK *WNDPROC_OWP)(HWND,UINT,WPARAM,LPARAM,ULONG_PTR,PDWORD); + +typedef struct _UAHOWP +{ + BYTE* MsgBitArray; + DWORD Size; +} UAHOWP, *PUAHOWP; + +#define UAH_HOOK_MESSAGE(uahowp, msg) uahowp.MsgBitArray[msg/8] |= (1 << (msg % 8)); +#define UAH_IS_MESSAGE_HOOKED(uahowp, msg) (uahowp.MsgBitArray[msg/8] & (1 << (msg % 8))) +#define UAHOWP_MAX_SIZE WM_USER/8 + +typedef struct tagUSERAPIHOOK +{ + DWORD size; + WNDPROC DefWindowProcA; + WNDPROC DefWindowProcW; + UAHOWP DefWndProcArray; + FARPROC GetScrollInfo; + FARPROC SetScrollInfo; + FARPROC EnableScrollBar; + FARPROC AdjustWindowRectEx; + FARPROC SetWindowRgn; + WNDPROC_OWP PreWndProc; + WNDPROC_OWP PostWndProc; + UAHOWP WndProcArray; + WNDPROC_OWP PreDefDlgProc; + WNDPROC_OWP PostDefDlgProc; + UAHOWP DlgProcArray; + FARPROC GetSystemMetrics; + FARPROC SystemParametersInfoA; + FARPROC SystemParametersInfoW; + FARPROC ForceResetUserApiHook; + FARPROC DrawFrameControl; + FARPROC DrawCaption; + FARPROC MDIRedrawFrame; + FARPROC GetRealWindowOwner; +} USERAPIHOOK, *PUSERAPIHOOK; + +typedef enum _UAPIHK +{ + uahLoadInit, + uahStop, + uahShutdown +} UAPIHK, *PUAPIHK; + +typedef BOOL(CALLBACK *USERAPIHOOKPROC)(UAPIHK State, PUSERAPIHOOK puah); + +typedef struct _USERAPIHOOKINFO +{ + DWORD m_size; + LPCWSTR m_dllname1; + LPCWSTR m_funname1; + LPCWSTR m_dllname2; + LPCWSTR m_funname2; +} USERAPIHOOKINFO,*PUSERAPIHOOKINFO; + +#if (WINVER == _WIN32_WINNT_WINXP) +BOOL WINAPI RegisterUserApiHook(HINSTANCE hInstance, USERAPIHOOKPROC CallbackFunc); +#elif (WINVER == _WIN32_WINNT_WS03) +BOOL WINAPI RegisterUserApiHook(PUSERAPIHOOKINFO puah); +#endif + +BOOL WINAPI UnregisterUserApiHook(VOID); + +#endif diff --cc include/reactos/wine/port.h index a1050121ab2,00000000000..2853a42bb41 mode 100644,000000..100644 --- a/include/reactos/wine/port.h +++ b/include/reactos/wine/port.h @@@ -1,343 -1,0 +1,356 @@@ +/* + * Wine porting definitions + * + * Copyright 1996 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __WINE_WINE_PORT_H +#define __WINE_WINE_PORT_H + +#ifndef __WINE_CONFIG_H +# error You must include config.h to use this header +#endif + +#define _GNU_SOURCE /* for pread/pwrite */ +#include +#include +#include +#include +#ifdef HAVE_DIRECT_H +# include +#endif +#ifdef HAVE_IO_H +# include +#endif +#ifdef HAVE_PROCESS_H +# include +#endif +#include +#ifdef HAVE_UNISTD_H +# include +#endif + + +/**************************************************************** + * Type definitions + */ + +#if !defined(_MSC_VER) && !defined(__int64) +# if defined(__x86_64__) || defined(_WIN64) +# define __int64 long +# else +# define __int64 long long +# endif +#endif + - #ifndef HAVE_MODE_T ++#if !defined(HAVE_MODE_T) && !defined(_MODE_T) +typedef int mode_t; +#endif - #ifndef HAVE_OFF_T ++#if !defined(HAVE_OFF_T) && !defined(_OFF_T) +typedef long off_t; +#endif - #ifndef HAVE_PID_T ++#if !defined(HAVE_PID_T) && !defined(_PID_T) +typedef int pid_t; +#endif - #ifndef HAVE_SIZE_T ++#if !defined(HAVE_SIZE_T) && !defined(_SIZE_T) +typedef unsigned int size_t; +#endif - #ifndef HAVE_SSIZE_T ++#if !defined(HAVE_SSIZE_T) && !defined(_SSIZE_T) +typedef int ssize_t; +#endif +//#ifndef HAVE_SOCKLEN_T +//typedef unsigned int socklen_t; +//#endif + +#ifndef HAVE_STATFS +# ifdef __BEOS__ +# define HAVE_STRUCT_STATFS_F_BFREE +struct statfs { + long f_bsize; /* block_size */ + long f_blocks; /* total_blocks */ + long f_bfree; /* free_blocks */ +}; +# else /* defined(__BEOS__) */ +struct statfs; +# endif /* defined(__BEOS__) */ +#endif /* !defined(HAVE_STATFS) */ + + +/**************************************************************** + * Macro definitions + */ + +#ifdef HAVE_DLFCN_H +#include +#else +#define RTLD_LAZY 0x001 +#define RTLD_NOW 0x002 +#define RTLD_GLOBAL 0x100 +#endif + +#if !defined(HAVE_FTRUNCATE) && defined(HAVE_CHSIZE) +#define ftruncate chsize +#endif + +#if !defined(HAVE_POPEN) && defined(HAVE__POPEN) +#define popen _popen +#endif + +#if !defined(HAVE_PCLOSE) && defined(HAVE__PCLOSE) +#define pclose _pclose +#endif + +#if !defined(HAVE_SNPRINTF) && defined(HAVE__SNPRINTF) +#define snprintf _snprintf +#endif + +#if !defined(HAVE_VSNPRINTF) && defined(HAVE__VSNPRINTF) +#define vsnprintf _vsnprintf +#endif + +#ifndef S_ISLNK +# define S_ISLNK(mod) (0) +#endif /* S_ISLNK */ + +/* So we open files in 64 bit access mode on Linux */ +#ifndef O_LARGEFILE +# define O_LARGEFILE 0 +#endif + +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +/**************************************************************** + * Constants + */ + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#ifndef M_PI_2 +#define M_PI_2 1.570796326794896619 +#endif + +#ifndef M_PI_4 +#define M_PI_4 0.785398163397448309616 +#endif + +/* Constructor functions */ + +#ifdef _MSC_VER // ReactOS +#pragma message("DECL_GLOBAL_CONSTRUCTOR is not properly defined") +# define DECL_GLOBAL_CONSTRUCTOR(func) \ + static void func(void) +#elif defined(__GNUC__) +# define DECL_GLOBAL_CONSTRUCTOR(func) \ + static void func(void) __attribute__((constructor)); \ + static void func(void) +#elif defined(__i386__) +# define DECL_GLOBAL_CONSTRUCTOR(func) \ + static void __dummy_init_##func(void) { \ + asm(".section .init,\"ax\"\n\t" \ + "call " #func "\n\t" \ + ".previous"); } \ + static void func(void) +#elif defined(__sparc__) +# define DECL_GLOBAL_CONSTRUCTOR(func) \ + static void __dummy_init_##func(void) { \ + asm("\t.section \".init\",#alloc,#execinstr\n" \ + "\tcall " #func "\n" \ + "\tnop\n" \ + "\t.section \".text\",#alloc,#execinstr\n" ); } \ + static void func(void) ++#elif defined(_M_AMD64) ++#pragma message("You must define the DECL_GLOBAL_CONSTRUCTOR macro for amd64") +#else +# error You must define the DECL_GLOBAL_CONSTRUCTOR macro for your platform +#endif + + +/* Register functions */ + +#ifdef __i386__ +#define DEFINE_REGS_ENTRYPOINT( name, fn, args, pop_args ) \ + __ASM_GLOBAL_FUNC( name, \ + "call " __ASM_NAME("__wine_call_from_32_regs") "\n\t" \ + ".long " __ASM_NAME(#fn) "\n\t" \ + ".byte " #args "," #pop_args ) +/* FIXME: add support for other CPUs */ +#endif /* __i386__ */ + + +/**************************************************************** + * Function definitions (only when using libwine_port) + */ + +#ifndef NO_LIBWINE_PORT + +#ifndef HAVE_GETOPT_LONG +extern char *optarg; +extern int optind; +extern int opterr; +extern int optopt; +struct option; + +#ifndef HAVE_STRUCT_OPTION_NAME +struct option +{ + const char *name; + int has_arg; + int *flag; + int val; +}; +#endif + +extern int getopt_long (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); +extern int getopt_long_only (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); +#endif /* HAVE_GETOPT_LONG */ + +#ifndef HAVE_GETPAGESIZE +size_t getpagesize(void); +#endif /* HAVE_GETPAGESIZE */ + +#ifndef HAVE_LSTAT +int lstat(const char *file_name, struct stat *buf); +#endif /* HAVE_LSTAT */ + +#ifndef HAVE_MEMMOVE +void *memmove(void *dest, const void *src, size_t len); +#endif /* !defined(HAVE_MEMMOVE) */ + +#ifndef __REACTOS__ +#ifndef HAVE_PREAD +ssize_t pread( int fd, void *buf, size_t count, off_t offset ); +#endif /* HAVE_PREAD */ + +#ifndef HAVE_PWRITE +ssize_t pwrite( int fd, const void *buf, size_t count, off_t offset ); +#endif /* HAVE_PWRITE */ +#endif /* __REACTOS__ */ + +#ifdef WIN32 +#ifndef HAVE_SIGSETJMP +# include +typedef jmp_buf sigjmp_buf; +int sigsetjmp( sigjmp_buf buf, int savesigs ); +void siglongjmp( sigjmp_buf buf, int val ); +#endif /* HAVE_SIGSETJMP */ +#endif + +#ifndef HAVE_STATFS +int statfs(const char *name, struct statfs *info); +#endif /* !defined(HAVE_STATFS) */ + +#ifndef HAVE_STRNCASECMP +# ifndef HAVE__STRNICMP +int strncasecmp(const char *str1, const char *str2, size_t n); +# else +# define strncasecmp _strnicmp +# endif +#endif /* !defined(HAVE_STRNCASECMP) */ + +#ifndef HAVE_STRERROR +const char *strerror(int err); +#endif /* !defined(HAVE_STRERROR) */ + +#ifndef HAVE_STRCASECMP +# ifndef HAVE__STRICMP +int strcasecmp(const char *str1, const char *str2); +# else +# define strcasecmp _stricmp +# endif +#endif /* !defined(HAVE_STRCASECMP) */ + +#if !defined(HAVE_USLEEP) && !defined(__CYGWIN__) +int usleep (unsigned int useconds); +#endif /* !defined(HAVE_USLEEP) */ + +#ifdef __i386__ +static inline void *memcpy_unaligned( void *dst, const void *src, size_t size ) +{ + return memcpy( dst, src, size ); +} +#else +extern void *memcpy_unaligned( void *dst, const void *src, size_t size ); +#endif /* __i386__ */ + +extern int mkstemps(char *template, int suffix_len); + +/* Process creation flags */ +#ifndef _P_WAIT +# define _P_WAIT 0 +# define _P_NOWAIT 1 +# define _P_OVERLAY 2 +# define _P_NOWAITO 3 +# define _P_DETACH 4 +#endif +#ifndef HAVE_SPAWNVP +extern int spawnvp(int mode, const char *cmdname, const char * const argv[]); +#endif + +/* Interlocked functions */ + +#if defined(_MSC_VER) || (defined(__i386__) && defined(__GNUC__) && !defined(WINE_PORT_NO_INTERLOCKED)) + +#define interlocked_cmpxchg InterlockedCompareExchange +#define interlocked_cmpxchg_ptr InterlockedCompareExchangePtr +#define interlocked_xchg InterlockedExchange +#define interlocked_xchg_ptr InterlockedExchangePtr +#define interlocked_xchg_add InterlockedExchangeAdd + + +#endif /* __i386___ && __GNUC__ */ + ++#if defined(_MSC_VER) ++__forceinline ++int ++ffs(int mask) ++{ ++ long index; ++ if (_BitScanForward(&index, mask) == 0) return 0; ++ return index; ++} ++#endif ++ +#else /* NO_LIBWINE_PORT */ + +#define __WINE_NOT_PORTABLE(func) func##_is_not_portable func##_is_not_portable + +#define getopt_long __WINE_NOT_PORTABLE(getopt_long) +#define getopt_long_only __WINE_NOT_PORTABLE(getopt_long_only) +#define getpagesize __WINE_NOT_PORTABLE(getpagesize) +#define lstat __WINE_NOT_PORTABLE(lstat) +#define memcpy_unaligned __WINE_NOT_PORTABLE(memcpy_unaligned) +#define memmove __WINE_NOT_PORTABLE(memmove) +#define pread __WINE_NOT_PORTABLE(pread) +#define pwrite __WINE_NOT_PORTABLE(pwrite) +#define spawnvp __WINE_NOT_PORTABLE(spawnvp) +#define statfs __WINE_NOT_PORTABLE(statfs) +#define strcasecmp __WINE_NOT_PORTABLE(strcasecmp) +#define strerror __WINE_NOT_PORTABLE(strerror) +#define strncasecmp __WINE_NOT_PORTABLE(strncasecmp) +#define usleep __WINE_NOT_PORTABLE(usleep) + +#endif /* NO_LIBWINE_PORT */ + +#endif /* !defined(__WINE_WINE_PORT_H) */ diff --cc include/reactos/wine/test.h index 035b0375942,00000000000..22d64ce7570 mode 100644,000000..100644 --- a/include/reactos/wine/test.h +++ b/include/reactos/wine/test.h @@@ -1,613 -1,0 +1,616 @@@ +/* + * Definitions for Wine C unit tests. + * + * Copyright (C) 2002 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_WINE_TEST_H +#define __WINE_WINE_TEST_H + +#include +#include +#include +#include + +#ifdef __WINE_CONFIG_H +#error config.h should not be used in Wine tests +#endif +#ifdef __WINE_WINE_LIBRARY_H +#error wine/library.h should not be used in Wine tests +#endif +#ifdef __WINE_WINE_UNICODE_H +#error wine/unicode.h should not be used in Wine tests +#endif +#ifdef __WINE_WINE_DEBUG_H +#error wine/debug.h should not be used in Wine tests +#endif + +#ifndef INVALID_FILE_ATTRIBUTES +#define INVALID_FILE_ATTRIBUTES (~0u) +#endif +#ifndef INVALID_SET_FILE_POINTER +#define INVALID_SET_FILE_POINTER (~0u) +#endif + +/* debug level */ +extern int winetest_debug; + +/* running in interactive mode? */ +extern int winetest_interactive; + +/* current platform */ +extern const char *winetest_platform; + +extern void winetest_set_location( const char* file, int line ); +extern void winetest_start_todo( const char* platform ); +extern int winetest_loop_todo(void); +extern void winetest_end_todo( const char* platform ); +extern int winetest_get_mainargs( char*** pargv ); +extern void winetest_wait_child_process( HANDLE process ); + +extern const char *wine_dbgstr_wn( const WCHAR *str, int n ); +static inline const char *wine_dbgstr_w( const WCHAR *s ) { return wine_dbgstr_wn( s, -1 ); } + +/* strcmpW is avaiable for tests compiled under Wine, but not in standalone + * builds under Windows, so we reimplement it under a different name. */ +static inline int winetest_strcmpW( const WCHAR *str1, const WCHAR *str2 ) +{ + while (*str1 && (*str1 == *str2)) { str1++; str2++; } + return *str1 - *str2; +} + +#ifdef STANDALONE +#define START_TEST(name) \ + static void func_##name(void); \ + const struct test winetest_testlist[] = { { #name, func_##name }, { 0, 0 } }; \ + static void func_##name(void) +#else +#define START_TEST(name) void func_##name(void) +#endif + +#if defined(__x86_64__) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT) +#define __winetest_cdecl __cdecl +#define __winetest_va_list __builtin_ms_va_list +#else +#define __winetest_cdecl +#define __winetest_va_list va_list +#endif + +extern int broken( int condition ); +extern int winetest_vok( int condition, const char *msg, __winetest_va_list ap ); +extern void winetest_vskip( const char *msg, __winetest_va_list ap ); + +#ifdef __GNUC__ + +extern void __winetest_cdecl winetest_ok( int condition, const char *msg, ... ); +extern void __winetest_cdecl winetest_skip( const char *msg, ... ) __attribute__((format (printf,1,2))); +extern void __winetest_cdecl winetest_win_skip( const char *msg, ... ) __attribute__((format (printf,1,2))); +extern void __winetest_cdecl winetest_trace( const char *msg, ... ) __attribute__((format (printf,1,2))); + +#else /* __GNUC__ */ + +extern void __winetest_cdecl winetest_ok( int condition, const char *msg, ... ); +extern void __winetest_cdecl winetest_skip( const char *msg, ... ); +extern void __winetest_cdecl winetest_win_skip( const char *msg, ... ); +extern void __winetest_cdecl winetest_trace( const char *msg, ... ); + +#endif /* __GNUC__ */ + +#define ok_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_ok +#define skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_skip +#define win_skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_win_skip +#define trace_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_trace + +#define ok ok_(__FILE__, __LINE__) +#define skip skip_(__FILE__, __LINE__) +#define win_skip win_skip_(__FILE__, __LINE__) +#define trace trace_(__FILE__, __LINE__) + +#define todo(platform) for (winetest_start_todo(platform); \ + winetest_loop_todo(); \ + winetest_end_todo(platform)) +#define todo_wine todo("wine") + + +#ifdef NONAMELESSUNION +# define U(x) (x).u +# define U1(x) (x).u1 +# define U2(x) (x).u2 +# define U3(x) (x).u3 +# define U4(x) (x).u4 +# define U5(x) (x).u5 +# define U6(x) (x).u6 +# define U7(x) (x).u7 +# define U8(x) (x).u8 +#else +# define U(x) (x) +# define U1(x) (x) +# define U2(x) (x) +# define U3(x) (x) +# define U4(x) (x) +# define U5(x) (x) +# define U6(x) (x) +# define U7(x) (x) +# define U8(x) (x) +#endif + +#ifdef NONAMELESSSTRUCT +# define S(x) (x).s +# define S1(x) (x).s1 +# define S2(x) (x).s2 +# define S3(x) (x).s3 +# define S4(x) (x).s4 +# define S5(x) (x).s5 +#else +# define S(x) (x) +# define S1(x) (x) +# define S2(x) (x) +# define S3(x) (x) +# define S4(x) (x) +# define S5(x) (x) +#endif + + +/************************************************************************/ +/* Below is the implementation of the various functions, to be included + * directly into the generated testlist.c file. + * It is done that way so that the dlls can build the test routines with + * different includes or flags if needed. + */ + +#ifdef STANDALONE + +#include + +#if defined(__x86_64__) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT) +# define __winetest_va_start(list,arg) __builtin_ms_va_start(list,arg) +# define __winetest_va_end(list) __builtin_ms_va_end(list) +#else +# define __winetest_va_start(list,arg) va_start(list,arg) +# define __winetest_va_end(list) va_end(list) +#endif + +struct test +{ + const char *name; + void (*func)(void); +}; + +extern const struct test winetest_testlist[]; + +/* debug level */ +int winetest_debug = 1; + +/* interactive mode? */ +int winetest_interactive = 0; + +/* current platform */ +const char *winetest_platform = "windows"; + +/* report successful tests (BOOL) */ +static int report_success = 0; + +/* passing arguments around */ +static int winetest_argc; +static char** winetest_argv; + +static const struct test *current_test; /* test currently being run */ + +static LONG successes; /* number of successful tests */ +static LONG failures; /* number of failures */ +static LONG skipped; /* number of skipped test chunks */ +static LONG todo_successes; /* number of successful tests inside todo block */ +static LONG todo_failures; /* number of failures inside todo block */ + +/* The following data must be kept track of on a per-thread basis */ +typedef struct +{ + const char* current_file; /* file of current check */ + int current_line; /* line of current check */ + int todo_level; /* current todo nesting level */ + int todo_do_loop; + char *str_pos; /* position in debug buffer */ + char strings[2000]; /* buffer for debug strings */ +} tls_data; +static DWORD tls_index; + +static tls_data* get_tls_data(void) +{ + tls_data* data; + DWORD last_error; + + last_error=GetLastError(); + data=TlsGetValue(tls_index); + if (!data) + { + data=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(tls_data)); + data->str_pos = data->strings; + TlsSetValue(tls_index,data); + } + SetLastError(last_error); + return data; +} + +/* allocate some tmp space for a string */ +static char *get_temp_buffer( size_t n ) +{ + tls_data *data = get_tls_data(); + char *res = data->str_pos; + + if (res + n >= &data->strings[sizeof(data->strings)]) res = data->strings; + data->str_pos = res + n; + return res; +} + +/* release extra space that we requested in gimme1() */ +static void release_temp_buffer( char *ptr, size_t size ) +{ + tls_data *data = get_tls_data(); + data->str_pos = ptr + size; +} + +static void exit_process( int code ) +{ + fflush( stdout ); + ExitProcess( code ); +} + + +void winetest_set_location( const char* file, int line ) +{ + tls_data* data=get_tls_data(); + data->current_file=strrchr(file,'/'); + if (data->current_file==NULL) + data->current_file=strrchr(file,'\\'); + if (data->current_file==NULL) + data->current_file=file; + else + data->current_file++; + data->current_line=line; +} + +int broken( int condition ) +{ + return (strcmp(winetest_platform, "windows") == 0) && condition; +} + +/* + * Checks condition. + * Parameters: + * - condition - condition to check; + * - msg test description; + * - file - test application source code file name of the check + * - line - test application source code file line number of the check + * Return: + * 0 if condition does not have the expected value, 1 otherwise + */ +int winetest_vok( int condition, const char *msg, __winetest_va_list args ) +{ + tls_data* data=get_tls_data(); + + if (data->todo_level) + { + if (condition) + { + fprintf( stdout, "%s:%d: Test succeeded inside todo block: ", + data->current_file, data->current_line ); + vfprintf(stdout, msg, args); + InterlockedIncrement(&todo_failures); + return 0; + } + else + { + if (winetest_debug > 0) + { + fprintf( stdout, "%s:%d: Test marked todo: ", + data->current_file, data->current_line ); + vfprintf(stdout, msg, args); + } + InterlockedIncrement(&todo_successes); + return 1; + } + } + else + { + if (!condition) + { + fprintf( stdout, "%s:%d: Test failed: ", + data->current_file, data->current_line ); + vfprintf(stdout, msg, args); + InterlockedIncrement(&failures); + return 0; + } + else + { + if (report_success) + fprintf( stdout, "%s:%d: Test succeeded\n", + data->current_file, data->current_line); + InterlockedIncrement(&successes); + return 1; + } + } +} + +void __winetest_cdecl winetest_ok( int condition, const char *msg, ... ) +{ + __winetest_va_list valist; + + __winetest_va_start(valist, msg); + winetest_vok(condition, msg, valist); + __winetest_va_end(valist); +} + +void __winetest_cdecl winetest_trace( const char *msg, ... ) +{ + __winetest_va_list valist; + tls_data* data=get_tls_data(); + + if (winetest_debug > 0) + { + fprintf( stdout, "%s:%d: ", data->current_file, data->current_line ); + __winetest_va_start(valist, msg); + vfprintf(stdout, msg, valist); + __winetest_va_end(valist); + } +} + +void winetest_vskip( const char *msg, __winetest_va_list args ) +{ + tls_data* data=get_tls_data(); + + fprintf( stdout, "%s:%d: Tests skipped: ", data->current_file, data->current_line ); + vfprintf(stdout, msg, args); + skipped++; +} + +void __winetest_cdecl winetest_skip( const char *msg, ... ) +{ + __winetest_va_list valist; + __winetest_va_start(valist, msg); + winetest_vskip(msg, valist); + __winetest_va_end(valist); +} + +void __winetest_cdecl winetest_win_skip( const char *msg, ... ) +{ + __winetest_va_list valist; + __winetest_va_start(valist, msg); + if (strcmp(winetest_platform, "windows") == 0) + winetest_vskip(msg, valist); + else + winetest_vok(0, msg, valist); + __winetest_va_end(valist); +} + +void winetest_start_todo( const char* platform ) +{ + tls_data* data=get_tls_data(); + if (strcmp(winetest_platform,platform)==0) + data->todo_level++; + data->todo_do_loop=1; +} + +int winetest_loop_todo(void) +{ + tls_data* data=get_tls_data(); + int do_loop=data->todo_do_loop; + data->todo_do_loop=0; + return do_loop; +} + +void winetest_end_todo( const char* platform ) +{ + if (strcmp(winetest_platform,platform)==0) + { + tls_data* data=get_tls_data(); + data->todo_level--; + } +} + +int winetest_get_mainargs( char*** pargv ) +{ + *pargv = winetest_argv; + return winetest_argc; +} + +void winetest_wait_child_process( HANDLE process ) +{ + DWORD exit_code = 1; + + if (WaitForSingleObject( process, 30000 )) + fprintf( stdout, "%s: child process wait failed\n", current_test->name ); + else + GetExitCodeProcess( process, &exit_code ); + + if (exit_code) + { + if (exit_code > 255) + { + fprintf( stdout, "%s: exception 0x%08x in child process\n", current_test->name, (unsigned int)exit_code ); + InterlockedIncrement( &failures ); + } + else + { + fprintf( stdout, "%s: %u failures in child process\n", + current_test->name, (unsigned int)exit_code ); + while (exit_code-- > 0) + InterlockedIncrement(&failures); + } + } +} + +const char *wine_dbgstr_wn( const WCHAR *str, int n ) +{ + char *dst, *res; + size_t size; + + if (!((ULONG_PTR)str >> 16)) + { + if (!str) return "(null)"; + res = get_temp_buffer( 6 ); + sprintf( res, "#%04x", LOWORD(str) ); + return res; + } + if (n == -1) + { + const WCHAR *end = str; + while (*end) end++; + n = end - str; + } + if (n < 0) n = 0; + size = 12 + min( 300, n * 5 ); + dst = res = get_temp_buffer( size ); + *dst++ = 'L'; + *dst++ = '"'; + while (n-- > 0 && dst <= res + size - 10) + { + WCHAR c = *str++; + switch (c) + { + case '\n': *dst++ = '\\'; *dst++ = 'n'; break; + case '\r': *dst++ = '\\'; *dst++ = 'r'; break; + case '\t': *dst++ = '\\'; *dst++ = 't'; break; + case '"': *dst++ = '\\'; *dst++ = '"'; break; + case '\\': *dst++ = '\\'; *dst++ = '\\'; break; + default: + if (c >= ' ' && c <= 126) - *dst++ = c; ++ *dst++ = (char)c; + else + { + *dst++ = '\\'; + sprintf(dst,"%04x",c); + dst+=4; + } + } + } + *dst++ = '"'; + if (n > 0) + { + *dst++ = '.'; + *dst++ = '.'; + *dst++ = '.'; + } + *dst++ = 0; + release_temp_buffer( res, dst - res ); + return res; +} + +/* Find a test by name */ +static const struct test *find_test( const char *name ) +{ + const struct test *test; + const char *p; + size_t len; + + if ((p = strrchr( name, '/' ))) name = p + 1; + if ((p = strrchr( name, '\\' ))) name = p + 1; + len = strlen(name); + if (len > 2 && !strcmp( name + len - 2, ".c" )) len -= 2; + + for (test = winetest_testlist; test->name; test++) + { + if (!strncmp( test->name, name, len ) && !test->name[len]) break; + } + return test->name ? test : NULL; +} + + +/* Display list of valid tests */ +static void list_tests(void) +{ + const struct test *test; + + fprintf( stdout, "Valid test names:\n" ); + for (test = winetest_testlist; test->name; test++) fprintf( stdout, " %s\n", test->name ); +} + + +/* Run a named test, and return exit status */ +static int run_test( const char *name ) +{ + const struct test *test; + int status; + + if (!(test = find_test( name ))) + { + fprintf( stdout, "Fatal: test '%s' does not exist.\n", name ); + exit_process(1); + } + successes = failures = todo_successes = todo_failures = 0; + tls_index=TlsAlloc(); + current_test = test; + test->func(); + + if (winetest_debug) + { + fprintf( stdout, "%s: %d tests executed (%d marked as todo, %d %s), %d skipped.\n", + test->name, (int)(successes + failures + todo_successes + todo_failures), + (int)todo_successes, (int)(failures + todo_failures), + (failures + todo_failures != 1) ? "failures" : "failure", + (int)skipped ); + } + status = (failures + todo_failures < 255) ? failures + todo_failures : 255; + return status; +} + + +/* Display usage and exit */ +static void usage( const char *argv0 ) +{ + fprintf( stdout, "Usage: %s test_name\n\n", argv0 ); + list_tests(); + exit_process(1); +} + + +/* main function */ +int main( int argc, char **argv ) +{ + char p[128]; + + setvbuf (stdout, NULL, _IONBF, 0); + + winetest_argc = argc; + winetest_argv = argv; + + if (GetEnvironmentVariableA( "WINETEST_PLATFORM", p, sizeof(p) )) winetest_platform = _strdup(p); + if (GetEnvironmentVariableA( "WINETEST_DEBUG", p, sizeof(p) )) winetest_debug = atoi(p); + if (GetEnvironmentVariableA( "WINETEST_INTERACTIVE", p, sizeof(p) )) winetest_interactive = atoi(p); + if (GetEnvironmentVariableA( "WINETEST_REPORT_SUCCESS", p, sizeof(p) )) report_success = atoi(p); + + if (!winetest_interactive) SetErrorMode( SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX ); + + if (!argv[1]) + { + if (winetest_testlist[0].name && !winetest_testlist[1].name) /* only one test */ + return run_test( winetest_testlist[0].name ); + usage( argv[0] ); + } + if (!strcmp( argv[1], "--list" )) + { + list_tests(); + return 0; + } + return run_test(argv[1]); +} + +#endif /* STANDALONE */ + ++// hack for ntdll winetest (this is defined in excpt.h) ++#undef exception_info ++ +#endif /* __WINE_WINE_TEST_H */ diff --cc include/reactos/wine/wined3d.h index 00000000000,ed269f006e9..ed269f006e9 mode 000000,100644..100644 --- a/include/reactos/wine/wined3d.h +++ b/include/reactos/wine/wined3d.h diff --cc lib/3rdparty/adns/install-sh index ebc66913e94,ebc66913e94..ebc66913e94 mode 100755,100644..100644 --- a/lib/3rdparty/adns/install-sh +++ b/lib/3rdparty/adns/install-sh diff --cc lib/3rdparty/freetype/ChangeLog.23 index 00000000000,ecbf69af105..ecbf69af105 mode 000000,100644..100644 --- a/lib/3rdparty/freetype/ChangeLog.23 +++ b/lib/3rdparty/freetype/ChangeLog.23 diff --cc lib/3rdparty/freetype/freetype_ros.diff index 00000000000,6505a6cb06d..6505a6cb06d mode 000000,100644..100644 --- a/lib/3rdparty/freetype/freetype_ros.diff +++ b/lib/3rdparty/freetype/freetype_ros.diff diff --cc lib/3rdparty/fullfat/ff_format.c index 00000000000,8799f9a204e..8799f9a204e mode 000000,100644..100644 --- a/lib/3rdparty/fullfat/ff_format.c +++ b/lib/3rdparty/fullfat/ff_format.c diff --cc lib/3rdparty/fullfat/ff_unicode.c index 00000000000,24fffd420d4..24fffd420d4 mode 000000,100644..100644 --- a/lib/3rdparty/fullfat/ff_unicode.c +++ b/lib/3rdparty/fullfat/ff_unicode.c diff --cc lib/fslib/vfatlib/check/vfat.h index 1aecfba279a,1aecfba279a..1aecfba279a mode 100755,100644..100644 --- a/lib/fslib/vfatlib/check/vfat.h +++ b/lib/fslib/vfatlib/check/vfat.h diff --cc lib/fslib/vfatlib/vfatlib.c index 58738e68f54,e46501c0fba..e46501c0fba mode 100755,100644..100644 --- a/lib/fslib/vfatlib/vfatlib.c +++ b/lib/fslib/vfatlib/vfatlib.c diff --cc lib/fslib/vfatlib/vfatlib.h index 8e96ca574ec,8e96ca574ec..8e96ca574ec mode 100755,100644..100644 --- a/lib/fslib/vfatlib/vfatlib.h +++ b/lib/fslib/vfatlib/vfatlib.h diff --cc lib/inflib/inflib.mak index fa23df27d8f,8a4bf38d274..8a4bf38d274 mode 100755,100644..100644 --- a/lib/inflib/inflib.mak +++ b/lib/inflib/inflib.mak diff --cc lib/pseh/amd64/seh.s index 00000000000,14df30687df..14df30687df mode 000000,100644..100644 --- a/lib/pseh/amd64/seh.s +++ b/lib/pseh/amd64/seh.s diff --cc lib/pseh/amd64/seh_prolog.s index 00000000000,d03063534d7..d03063534d7 mode 000000,100644..100644 --- a/lib/pseh/amd64/seh_prolog.s +++ b/lib/pseh/amd64/seh_prolog.s diff --cc lib/rossym/iofile.c index 00000000000,97069c50076..97069c50076 mode 000000,100644..100644 --- a/lib/rossym/iofile.c +++ b/lib/rossym/iofile.c diff --cc lib/rossym_new/CMakeLists.txt index 00000000000,73387942ae8..73387942ae8 mode 000000,100644..100644 --- a/lib/rossym_new/CMakeLists.txt +++ b/lib/rossym_new/CMakeLists.txt diff --cc lib/rossym_new/compat.h index 00000000000,80f0e94d0e4..80f0e94d0e4 mode 000000,100644..100644 --- a/lib/rossym_new/compat.h +++ b/lib/rossym_new/compat.h diff --cc lib/rossym_new/delete.c index 00000000000,00000000000..1e6fe8393e2 new file mode 100644 --- /dev/null +++ b/lib/rossym_new/delete.c @@@ -1,0 -1,0 +1,28 @@@ ++/* ++ * COPYRIGHT: See COPYING in the top level directory ++ * PROJECT: ReactOS kernel ++ * FILE: lib/rossym/delete.c ++ * PURPOSE: Free rossym info ++ * ++ * PROGRAMMERS: Ge van Geldorp (gvg@reactos.com) ++ */ ++ ++#define NTOSAPI ++#include ++#include ++#include ++ ++#define NDEBUG ++#include ++ ++#include "rossympriv.h" ++#include "pe.h" ++#include "dwarf.h" ++ ++VOID ++RosSymDelete(PROSSYM_INFO RosSymInfo) ++{ ++ dwarfclose(RosSymInfo); ++} ++ ++/* EOF */ diff --cc lib/rossym_new/dummy.c index 00000000000,99611230dfd..99611230dfd mode 000000,100644..100644 --- a/lib/rossym_new/dummy.c +++ b/lib/rossym_new/dummy.c diff --cc lib/rossym_new/dwarf.h index 00000000000,3d1101e2e99..3d1101e2e99 mode 000000,100644..100644 --- a/lib/rossym_new/dwarf.h +++ b/lib/rossym_new/dwarf.h diff --cc lib/rossym_new/dwarf386.c index 00000000000,80a594b01a7..80a594b01a7 mode 000000,100644..100644 --- a/lib/rossym_new/dwarf386.c +++ b/lib/rossym_new/dwarf386.c diff --cc lib/rossym_new/dwarfabbrev.c index 00000000000,a9d3c49b027..a9d3c49b027 mode 000000,100644..100644 --- a/lib/rossym_new/dwarfabbrev.c +++ b/lib/rossym_new/dwarfabbrev.c diff --cc lib/rossym_new/dwarfaranges.c index 00000000000,cda4cd6453f..cda4cd6453f mode 000000,100644..100644 --- a/lib/rossym_new/dwarfaranges.c +++ b/lib/rossym_new/dwarfaranges.c diff --cc lib/rossym_new/dwarfcfa.c index 00000000000,3c0c349ef44..3c0c349ef44 mode 000000,100644..100644 --- a/lib/rossym_new/dwarfcfa.c +++ b/lib/rossym_new/dwarfcfa.c diff --cc lib/rossym_new/dwarfdump.c index 00000000000,94f0cd3575b..94f0cd3575b mode 000000,100644..100644 --- a/lib/rossym_new/dwarfdump.c +++ b/lib/rossym_new/dwarfdump.c diff --cc lib/rossym_new/dwarfeval.c index 00000000000,6d0233fed6c..6d0233fed6c mode 000000,100644..100644 --- a/lib/rossym_new/dwarfeval.c +++ b/lib/rossym_new/dwarfeval.c diff --cc lib/rossym_new/dwarfget.c index 00000000000,7787163a21b..7787163a21b mode 000000,100644..100644 --- a/lib/rossym_new/dwarfget.c +++ b/lib/rossym_new/dwarfget.c diff --cc lib/rossym_new/dwarfinfo.c index 00000000000,162282a7641..162282a7641 mode 000000,100644..100644 --- a/lib/rossym_new/dwarfinfo.c +++ b/lib/rossym_new/dwarfinfo.c diff --cc lib/rossym_new/dwarfopen.c index 00000000000,bcb0429ab40..bcb0429ab40 mode 000000,100644..100644 --- a/lib/rossym_new/dwarfopen.c +++ b/lib/rossym_new/dwarfopen.c diff --cc lib/rossym_new/dwarfpc.c index 00000000000,ec41e10d16c..ec41e10d16c mode 000000,100644..100644 --- a/lib/rossym_new/dwarfpc.c +++ b/lib/rossym_new/dwarfpc.c diff --cc lib/rossym_new/dwarfpubnames.c index 00000000000,8a8d802b797..8a8d802b797 mode 000000,100644..100644 --- a/lib/rossym_new/dwarfpubnames.c +++ b/lib/rossym_new/dwarfpubnames.c diff --cc lib/rossym_new/find.c index 00000000000,beb6f170eea..beb6f170eea mode 000000,100644..100644 --- a/lib/rossym_new/find.c +++ b/lib/rossym_new/find.c diff --cc lib/rossym_new/fromfile.c index 00000000000,a3ed16fd946..a3ed16fd946 mode 000000,100644..100644 --- a/lib/rossym_new/fromfile.c +++ b/lib/rossym_new/fromfile.c diff --cc lib/rossym_new/frommem.c index 00000000000,00000000000..2e201d27a48 new file mode 100644 --- /dev/null +++ b/lib/rossym_new/frommem.c @@@ -1,0 -1,0 +1,160 @@@ ++/* ++ * COPYRIGHT: See COPYING in the top level directory ++ * PROJECT: ReactOS kernel ++ * FILE: lib/rossym/frommem.c ++ * PURPOSE: Creating rossym info from an in-memory image ++ * ++ * PROGRAMMERS: Ge van Geldorp (gvg@reactos.com) ++ */ ++ ++#define NTOSAPI ++#include ++#include ++#include ++#include "rossympriv.h" ++#include ++ ++#define NDEBUG ++#include ++ ++#include "dwarf.h" ++#include "pe.h" ++ ++BOOLEAN ++RosSymCreateFromMem(PVOID ImageStart, ULONG_PTR ImageSize, PROSSYM_INFO *RosSymInfo) ++{ ++ ANSI_STRING AnsiNameString = { }; ++ PIMAGE_DOS_HEADER DosHeader; ++ PIMAGE_NT_HEADERS NtHeaders; ++ PIMAGE_SECTION_HEADER SectionHeaders; ++ ULONG SectionIndex; ++ unsigned SymbolTable, NumSymbols; ++ ++ /* Check if MZ header is valid */ ++ DosHeader = (PIMAGE_DOS_HEADER) ImageStart; ++ if (ImageSize < sizeof(IMAGE_DOS_HEADER) ++ || ! ROSSYM_IS_VALID_DOS_HEADER(DosHeader)) ++ { ++ DPRINT1("Image doesn't have a valid DOS header\n"); ++ return FALSE; ++ } ++ ++ /* Locate NT header */ ++ NtHeaders = (PIMAGE_NT_HEADERS)((char *) ImageStart + DosHeader->e_lfanew); ++ if (ImageSize < DosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS) ++ || ! ROSSYM_IS_VALID_NT_HEADERS(NtHeaders)) ++ { ++ DPRINT1("Image doesn't have a valid PE header\n"); ++ return FALSE; ++ } ++ ++ SymbolTable = NtHeaders->FileHeader.PointerToSymbolTable; ++ NumSymbols = NtHeaders->FileHeader.NumberOfSymbols; ++ ++ /* Search for the section header */ ++ ULONG SectionHeaderSize = NtHeaders->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER); ++ SectionHeaders = RosSymAllocMem(SectionHeaderSize); ++ RtlCopyMemory(SectionHeaders, IMAGE_FIRST_SECTION(NtHeaders), SectionHeaderSize); ++ ++ // Convert names to ANSI_STRINGs ++ for (SectionIndex = 0; SectionIndex < NtHeaders->FileHeader.NumberOfSections; ++ SectionIndex++) ++ { ++ if (SectionHeaders[SectionIndex].Name[0] != '/') { ++ AnsiNameString.Buffer = RosSymAllocMem(IMAGE_SIZEOF_SHORT_NAME); ++ RtlCopyMemory(AnsiNameString.Buffer, SectionHeaders[SectionIndex].Name, IMAGE_SIZEOF_SHORT_NAME); ++ AnsiNameString.MaximumLength = IMAGE_SIZEOF_SHORT_NAME; ++ AnsiNameString.Length = GetStrnlen(AnsiNameString.Buffer, IMAGE_SIZEOF_SHORT_NAME); ++ } else { ++ UNICODE_STRING intConv; ++ NTSTATUS Status; ++ ULONG StringOffset; ++ ++ Status = RtlCreateUnicodeStringFromAsciiz(&intConv, (PCSZ)SectionHeaders[SectionIndex].Name + 1); ++ if (!NT_SUCCESS(Status)) goto freeall; ++ Status = RtlUnicodeStringToInteger(&intConv, 10, &StringOffset); ++ RtlFreeUnicodeString(&intConv); ++ if (!NT_SUCCESS(Status)) goto freeall; ++ ULONG VirtualOffset = pefindrva(SectionHeaders, NtHeaders->FileHeader.NumberOfSections, SymbolTable+(NumSymbols*SYMBOL_SIZE)+StringOffset); ++ if (!VirtualOffset) goto freeall; ++ AnsiNameString.Buffer = RosSymAllocMem(MAXIMUM_DWARF_NAME_SIZE); ++ if (!AnsiNameString.Buffer) goto freeall; ++ PCHAR StringTarget = ((PCHAR)ImageStart)+VirtualOffset; ++ PCHAR EndOfImage = ((PCHAR)ImageStart) + NtHeaders->OptionalHeader.SizeOfImage; ++ if (StringTarget >= EndOfImage) goto freeall; ++ ULONG PossibleStringLength = EndOfImage - StringTarget; ++ if (PossibleStringLength > MAXIMUM_DWARF_NAME_SIZE) ++ PossibleStringLength = MAXIMUM_DWARF_NAME_SIZE; ++ RtlCopyMemory(AnsiNameString.Buffer, StringTarget, PossibleStringLength); ++ AnsiNameString.Length = strlen(AnsiNameString.Buffer); ++ AnsiNameString.MaximumLength = MAXIMUM_DWARF_NAME_SIZE; ++ } ++ memcpy ++ (&SectionHeaders[SectionIndex], ++ &AnsiNameString, ++ sizeof(AnsiNameString)); ++ } ++ ++ Pe *pe = RosSymAllocMem(sizeof(*pe)); ++ pe->fd = ImageStart; ++ pe->e2 = peget2; ++ pe->e4 = peget4; ++ pe->e8 = peget8; ++ pe->loadbase = (ULONG)ImageStart; ++ pe->imagebase = NtHeaders->OptionalHeader.ImageBase; ++ pe->imagesize = NtHeaders->OptionalHeader.SizeOfImage; ++ pe->nsections = NtHeaders->FileHeader.NumberOfSections; ++ pe->sect = SectionHeaders; ++ pe->nsymbols = NtHeaders->FileHeader.NumberOfSymbols; ++ pe->symtab = malloc(pe->nsymbols * sizeof(CoffSymbol)); ++ PSYMENT SymbolData = (PSYMENT) ++ (((PCHAR)ImageStart) + ++ pefindrva ++ (pe->sect, ++ pe->nsections, ++ NtHeaders->FileHeader.PointerToSymbolTable)); ++ int i, j; ++ for (i = 0, j = 0; i < pe->nsymbols; i++) { ++ if ((SymbolData[i].e_scnum < 1) || ++ (SymbolData[i].e_sclass != C_EXT && ++ SymbolData[i].e_sclass != C_STAT)) ++ continue; ++ int section = SymbolData[i].e_scnum - 1; ++ if (SymbolData[i].e.e.e_zeroes) { ++ pe->symtab[j].name = malloc(sizeof(SymbolData[i].e.e_name)+1); ++ strcpy(pe->symtab[j].name, SymbolData[i].e.e_name); ++ } else { ++ PCHAR SymbolName = ((PCHAR)ImageStart) + ++ pefindrva ++ (pe->sect, ++ pe->nsections, ++ NtHeaders->FileHeader.PointerToSymbolTable + ++ (NtHeaders->FileHeader.NumberOfSymbols * 18) + ++ SymbolData[i].e.e.e_offset); ++ pe->symtab[j].name = malloc(strlen(SymbolName)+1); ++ strcpy(pe->symtab[j].name, SymbolName); ++ } ++ if (pe->symtab[j].name[0] == '.') { ++ free(pe->symtab[j].name); ++ continue; ++ } ++ pe->symtab[j].address = pe->sect[section].VirtualAddress + SymbolData[i].e_value; ++ j++; ++ } ++ pe->nsymbols = j; ++ pe->loadsection = loadmemsection; ++ *RosSymInfo = dwarfopen(pe); ++ ++ return !!*RosSymInfo; ++ ++freeall: ++ if (AnsiNameString.Buffer) RosSymFreeMem(AnsiNameString.Buffer); ++ for (SectionIndex = 0; SectionIndex < NtHeaders->FileHeader.NumberOfSections; ++ SectionIndex++) ++ RtlFreeAnsiString(ANSI_NAME_STRING(&SectionHeaders[SectionIndex])); ++ RosSymFreeMem(SectionHeaders); ++ ++ return FALSE; ++} ++ ++/* EOF */ diff --cc lib/rossym_new/fromraw.c index 00000000000,ae484252424..ae484252424 mode 000000,100644..100644 --- a/lib/rossym_new/fromraw.c +++ b/lib/rossym_new/fromraw.c diff --cc lib/rossym_new/getraw.c index 00000000000,1f11057a38e..1f11057a38e mode 000000,100644..100644 --- a/lib/rossym_new/getraw.c +++ b/lib/rossym_new/getraw.c diff --cc lib/rossym_new/init.c index 00000000000,80be79a1ee0..80be79a1ee0 mode 000000,100644..100644 --- a/lib/rossym_new/init.c +++ b/lib/rossym_new/init.c diff --cc lib/rossym_new/initkm.c index 00000000000,4f1c07111a3..4f1c07111a3 mode 000000,100644..100644 --- a/lib/rossym_new/initkm.c +++ b/lib/rossym_new/initkm.c diff --cc lib/rossym_new/initum.c index 00000000000,eb59c0f185e..eb59c0f185e mode 000000,100644..100644 --- a/lib/rossym_new/initum.c +++ b/lib/rossym_new/initum.c diff --cc lib/rossym_new/iofile.c index 00000000000,97069c50076..97069c50076 mode 000000,100644..100644 --- a/lib/rossym_new/iofile.c +++ b/lib/rossym_new/iofile.c diff --cc lib/rossym_new/pe.c index 00000000000,63fd9df6906..63fd9df6906 mode 000000,100644..100644 --- a/lib/rossym_new/pe.c +++ b/lib/rossym_new/pe.c diff --cc lib/rossym_new/pe.h index 00000000000,066d79b2ac6..066d79b2ac6 mode 000000,100644..100644 --- a/lib/rossym_new/pe.h +++ b/lib/rossym_new/pe.h diff --cc lib/rossym_new/rossympriv.h index 00000000000,1a604ef3f47..1a604ef3f47 mode 000000,100644..100644 --- a/lib/rossym_new/rossympriv.h +++ b/lib/rossym_new/rossympriv.h diff --cc lib/rossym_new/zwfile.c index 00000000000,00000000000..a6ce196c632 new file mode 100644 --- /dev/null +++ b/lib/rossym_new/zwfile.c @@@ -1,0 -1,0 +1,54 @@@ ++/* ++ * COPYRIGHT: See COPYING in the top level directory ++ * PROJECT: ReactOS kernel ++ * FILE: lib/rossym/zwfile.c ++ * PURPOSE: File I/O using native functions ++ * ++ * PROGRAMMERS: Ge van Geldorp (gvg@reactos.com) ++ */ ++ ++#define NTOSAPI ++#include ++#include ++#include "rossympriv.h" ++ ++#define NDEBUG ++#include ++ ++NTSTATUS RosSymStatus; ++ ++BOOLEAN ++RosSymZwReadFile(PVOID FileContext, PVOID Buffer, ULONG Size) ++{ ++ //NTSTATUS Status; ++ IO_STATUS_BLOCK IoStatusBlock; ++ ++ RosSymStatus = ZwReadFile(*((HANDLE *) FileContext), ++ 0, 0, 0, ++ &IoStatusBlock, ++ Buffer, ++ Size, ++ 0, 0); ++ ++ return NT_SUCCESS(RosSymStatus) && IoStatusBlock.Information == Size; ++} ++ ++BOOLEAN ++RosSymZwSeekFile(PVOID FileContext, ULONG_PTR Position) ++{ ++ //NTSTATUS Status; ++ IO_STATUS_BLOCK IoStatusBlock; ++ FILE_POSITION_INFORMATION NewPosition; ++ ++ NewPosition.CurrentByteOffset.u.HighPart = 0; ++ NewPosition.CurrentByteOffset.u.LowPart = Position; ++ RosSymStatus = ZwSetInformationFile(*((HANDLE *) FileContext), ++ &IoStatusBlock, ++ (PVOID) &NewPosition, ++ sizeof(FILE_POSITION_INFORMATION), ++ FilePositionInformation); ++ ++ return NT_SUCCESS(RosSymStatus); ++} ++ ++/* EOF */ diff --cc lib/rtl/heappage.c index 00000000000,a4a6307dd70..a4a6307dd70 mode 000000,100644..100644 --- a/lib/rtl/heappage.c +++ b/lib/rtl/heappage.c diff --cc lib/sdk/crt/crt.cmake index 00000000000,5f9c01caa39..5f9c01caa39 mode 000000,100644..100644 --- a/lib/sdk/crt/crt.cmake +++ b/lib/sdk/crt/crt.cmake diff --cc lib/sdk/crt/except/amd64/chkstk_ms.s index 00000000000,dbf9eb2e691..dbf9eb2e691 mode 000000,100644..100644 --- a/lib/sdk/crt/except/amd64/chkstk_ms.s +++ b/lib/sdk/crt/except/amd64/chkstk_ms.s diff --cc lib/sdk/crt/except/i386/chkstk_ms.s index 00000000000,dac2ae799d9..dac2ae799d9 mode 000000,100644..100644 --- a/lib/sdk/crt/except/i386/chkstk_ms.s +++ b/lib/sdk/crt/except/i386/chkstk_ms.s diff --cc lib/sdk/crt/include/internal/mingw-w64/internal.h index 00000000000,7f58a3d540d..7f58a3d540d mode 000000,100644..100644 --- a/lib/sdk/crt/include/internal/mingw-w64/internal.h +++ b/lib/sdk/crt/include/internal/mingw-w64/internal.h diff --cc lib/sdk/crt/include/internal/mingw-w64/oscalls.h index 00000000000,81356767001..81356767001 mode 000000,100644..100644 --- a/lib/sdk/crt/include/internal/mingw-w64/oscalls.h +++ b/lib/sdk/crt/include/internal/mingw-w64/oscalls.h diff --cc lib/sdk/crt/include/internal/mingw-w64/sect_attribs.h index 00000000000,4d1a24f2173..4d1a24f2173 mode 000000,100644..100644 --- a/lib/sdk/crt/include/internal/mingw-w64/sect_attribs.h +++ b/lib/sdk/crt/include/internal/mingw-w64/sect_attribs.h diff --cc lib/sdk/crt/libcntpr.cmake index 00000000000,011b9c3e3d5..011b9c3e3d5 mode 000000,100644..100644 --- a/lib/sdk/crt/libcntpr.cmake +++ b/lib/sdk/crt/libcntpr.cmake diff --cc lib/sdk/crt/misc/getopt.c index 00000000000,cd759b2ff6a..cd759b2ff6a mode 000000,100644..100644 --- a/lib/sdk/crt/misc/getopt.c +++ b/lib/sdk/crt/misc/getopt.c diff --cc lib/sdk/crt/misc/ofmt_stub.c index 00000000000,73e206dcf2b..73e206dcf2b mode 000000,100644..100644 --- a/lib/sdk/crt/misc/ofmt_stub.c +++ b/lib/sdk/crt/misc/ofmt_stub.c diff --cc lib/sdk/crt/moldname-msvcrt.def index 00000000000,af6661fada4..af6661fada4 mode 000000,100644..100644 --- a/lib/sdk/crt/moldname-msvcrt.def +++ b/lib/sdk/crt/moldname-msvcrt.def diff --cc lib/sdk/crt/msvcrtex.cmake index 00000000000,9099448f55e..9099448f55e mode 000000,100644..100644 --- a/lib/sdk/crt/msvcrtex.cmake +++ b/lib/sdk/crt/msvcrtex.cmake diff --cc lib/sdk/crt/oldnames.cmake index 00000000000,4a57ae79c2a..4a57ae79c2a mode 000000,100644..100644 --- a/lib/sdk/crt/oldnames.cmake +++ b/lib/sdk/crt/oldnames.cmake diff --cc lib/sdk/crt/startup/_newmode.c index 00000000000,f2fa3966f70..f2fa3966f70 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/_newmode.c +++ b/lib/sdk/crt/startup/_newmode.c diff --cc lib/sdk/crt/startup/atonexit.c index 00000000000,442be353d88..442be353d88 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/atonexit.c +++ b/lib/sdk/crt/startup/atonexit.c diff --cc lib/sdk/crt/startup/charmax.c index 00000000000,fbd10c4b923..fbd10c4b923 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/charmax.c +++ b/lib/sdk/crt/startup/charmax.c diff --cc lib/sdk/crt/startup/cinitexe.c index 00000000000,ee441ed77f9..ee441ed77f9 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/cinitexe.c +++ b/lib/sdk/crt/startup/cinitexe.c diff --cc lib/sdk/crt/startup/crt0_c.c index 00000000000,165eee10825..165eee10825 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/crt0_c.c +++ b/lib/sdk/crt/startup/crt0_c.c diff --cc lib/sdk/crt/startup/crt0_w.c index 00000000000,9f46e38a9cb..9f46e38a9cb mode 000000,100644..100644 --- a/lib/sdk/crt/startup/crt0_w.c +++ b/lib/sdk/crt/startup/crt0_w.c diff --cc lib/sdk/crt/startup/crt_handler.c index 00000000000,5d7dc22bebd..5d7dc22bebd mode 000000,100644..100644 --- a/lib/sdk/crt/startup/crt_handler.c +++ b/lib/sdk/crt/startup/crt_handler.c diff --cc lib/sdk/crt/startup/crtdll.c index 00000000000,6fa17a821f8..6fa17a821f8 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/crtdll.c +++ b/lib/sdk/crt/startup/crtdll.c diff --cc lib/sdk/crt/startup/crtexe.c index 00000000000,8d15e29ebc3..8d15e29ebc3 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/crtexe.c +++ b/lib/sdk/crt/startup/crtexe.c diff --cc lib/sdk/crt/startup/dll_argv.c index 00000000000,06abb8dfddf..06abb8dfddf mode 000000,100644..100644 --- a/lib/sdk/crt/startup/dll_argv.c +++ b/lib/sdk/crt/startup/dll_argv.c diff --cc lib/sdk/crt/startup/dllargv.c index 00000000000,769b8353685..769b8353685 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/dllargv.c +++ b/lib/sdk/crt/startup/dllargv.c diff --cc lib/sdk/crt/startup/dllentry.c index 00000000000,d2ed1b57315..d2ed1b57315 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/dllentry.c +++ b/lib/sdk/crt/startup/dllentry.c diff --cc lib/sdk/crt/startup/gccmain.c index 00000000000,a0e0483ff72..a0e0483ff72 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/gccmain.c +++ b/lib/sdk/crt/startup/gccmain.c diff --cc lib/sdk/crt/startup/gs_support.c index 00000000000,8151fc3b542..8151fc3b542 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/gs_support.c +++ b/lib/sdk/crt/startup/gs_support.c diff --cc lib/sdk/crt/startup/merr.c index 00000000000,2728cdbcf6d..2728cdbcf6d mode 000000,100644..100644 --- a/lib/sdk/crt/startup/merr.c +++ b/lib/sdk/crt/startup/merr.c diff --cc lib/sdk/crt/startup/mingw_helpers.c index 00000000000,b1bafd35653..b1bafd35653 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/mingw_helpers.c +++ b/lib/sdk/crt/startup/mingw_helpers.c diff --cc lib/sdk/crt/startup/mscmain.c index 00000000000,361d04a7691..361d04a7691 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/mscmain.c +++ b/lib/sdk/crt/startup/mscmain.c diff --cc lib/sdk/crt/startup/natstart.c index 00000000000,1122d19f3de..1122d19f3de mode 000000,100644..100644 --- a/lib/sdk/crt/startup/natstart.c +++ b/lib/sdk/crt/startup/natstart.c diff --cc lib/sdk/crt/startup/pesect.c index 00000000000,c24061fbe61..c24061fbe61 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/pesect.c +++ b/lib/sdk/crt/startup/pesect.c diff --cc lib/sdk/crt/startup/pseudo-reloc-list.c index 00000000000,4ce46bbb29b..4ce46bbb29b mode 000000,100644..100644 --- a/lib/sdk/crt/startup/pseudo-reloc-list.c +++ b/lib/sdk/crt/startup/pseudo-reloc-list.c diff --cc lib/sdk/crt/startup/pseudo-reloc.c index 00000000000,61cc7123176..61cc7123176 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/pseudo-reloc.c +++ b/lib/sdk/crt/startup/pseudo-reloc.c diff --cc lib/sdk/crt/startup/tlsmcrt.c index 00000000000,c5c01d9b8a6..c5c01d9b8a6 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/tlsmcrt.c +++ b/lib/sdk/crt/startup/tlsmcrt.c diff --cc lib/sdk/crt/startup/tlsmthread.c index 00000000000,c018abfd21e..c018abfd21e mode 000000,100644..100644 --- a/lib/sdk/crt/startup/tlsmthread.c +++ b/lib/sdk/crt/startup/tlsmthread.c diff --cc lib/sdk/crt/startup/tlssup.c index 00000000000,3a0e63518d0..3a0e63518d0 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/tlssup.c +++ b/lib/sdk/crt/startup/tlssup.c diff --cc lib/sdk/crt/startup/tlsthrd.c index 00000000000,6fbd47a5dd3..6fbd47a5dd3 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/tlsthrd.c +++ b/lib/sdk/crt/startup/tlsthrd.c diff --cc lib/sdk/crt/startup/txtmode.c index 00000000000,0c700ee1a19..0c700ee1a19 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/txtmode.c +++ b/lib/sdk/crt/startup/txtmode.c diff --cc lib/sdk/crt/startup/wcrtexe.c index 00000000000,d7556a61462..d7556a61462 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/wcrtexe.c +++ b/lib/sdk/crt/startup/wcrtexe.c diff --cc lib/sdk/crt/startup/wdllargv.c index 00000000000,ad561e73692..ad561e73692 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/wdllargv.c +++ b/lib/sdk/crt/startup/wdllargv.c diff --cc lib/sdk/crt/startup/wildcard.c index 00000000000,f996577bf27..f996577bf27 mode 000000,100644..100644 --- a/lib/sdk/crt/startup/wildcard.c +++ b/lib/sdk/crt/startup/wildcard.c diff --cc lib/sdk/crt/wine/undname.c index 51545c4020a,51545c4020a..51545c4020a mode 100755,100644..100644 --- a/lib/sdk/crt/wine/undname.c +++ b/lib/sdk/crt/wine/undname.c diff --cc media/fonts/DejaVuSans-Bold.ttf index 7b29accc131,0f4d5e9d484..0f4d5e9d484 Binary files differ diff --cc media/fonts/DejaVuSans-BoldOblique.ttf index b5440d95e79,48f06a863ad..48f06a863ad Binary files differ diff --cc media/fonts/DejaVuSans-Oblique.ttf index e233295c464,44856388dae..44856388dae Binary files differ diff --cc media/fonts/DejaVuSans.ttf index a36615b2081,27cff476ef3..27cff476ef3 Binary files differ diff --cc media/fonts/DejaVuSansMono-Bold.ttf index 98bb6f62e21,09d42796a1e..09d42796a1e Binary files differ diff --cc media/fonts/DejaVuSansMono-BoldOblique.ttf index 42bbcdee974,0344c22709d..0344c22709d Binary files differ diff --cc media/fonts/DejaVuSansMono-Oblique.ttf index d6ab52298c1,bc16d51bd50..bc16d51bd50 Binary files differ diff --cc media/fonts/DejaVuSansMono.ttf index b464c52ade0,7260bd65e0d..7260bd65e0d Binary files differ diff --cc media/fonts/DejaVuSerif-Bold.ttf index 8c53b1a1124,afa2d5ec3d0..afa2d5ec3d0 Binary files differ diff --cc media/fonts/DejaVuSerif-BoldItalic.ttf index 688c2b70f71,ce9443eaead..ce9443eaead Binary files differ diff --cc media/fonts/DejaVuSerif-Italic.ttf index b2ed04a1230,c1864a3071c..c1864a3071c Binary files differ diff --cc media/fonts/DejaVuSerif.ttf index 19eba334572,ed53a2967c9..ed53a2967c9 Binary files differ diff --cc media/fonts/FreeMono.ttf index 3c83d04087f,7485f9e4c84..7485f9e4c84 Binary files differ diff --cc media/fonts/FreeMonoBold.ttf index 3dbb7a9ac76,3bce6129aea..3bce6129aea Binary files differ diff --cc media/fonts/FreeMonoBoldOblique.ttf index 1776b2cca94,ffcf71a640f..ffcf71a640f Binary files differ diff --cc media/fonts/FreeMonoOblique.ttf index 8aed4a5ffbb,8992c2cf947..8992c2cf947 Binary files differ diff --cc media/fonts/doc/FreeFont_AUTHORS.txt index 00000000000,b4819582821..b4819582821 mode 000000,100644..100644 --- a/media/fonts/doc/FreeFont_AUTHORS.txt +++ b/media/fonts/doc/FreeFont_AUTHORS.txt diff --cc media/fonts/doc/FreeFont_COPYING.txt index 00000000000,94a9ed024d3..94a9ed024d3 mode 000000,100644..100644 --- a/media/fonts/doc/FreeFont_COPYING.txt +++ b/media/fonts/doc/FreeFont_COPYING.txt diff --cc media/fonts/doc/FreeFont_CREDITS.txt index 00000000000,edc0b31f30f..edc0b31f30f mode 000000,100644..100644 --- a/media/fonts/doc/FreeFont_CREDITS.txt +++ b/media/fonts/doc/FreeFont_CREDITS.txt diff --cc media/fonts/doc/FreeFont_ChangeLog.txt index 00000000000,6de5342798e..6de5342798e mode 000000,100644..100644 --- a/media/fonts/doc/FreeFont_ChangeLog.txt +++ b/media/fonts/doc/FreeFont_ChangeLog.txt diff --cc media/inf/disk.inf index 00000000000,64ef86f0679..64ef86f0679 mode 000000,100644..100644 Binary files differ diff --cc media/inf/hdc.inf index a9bd9f54fd3,88efbc0e5ff..88efbc0e5ff Binary files differ diff --cc media/inf/ports.inf index 198bf980a56,4589d3b1113..4589d3b1113 Binary files differ diff --cc media/inf/unknown.inf index 00000000000,65494da18d9..65494da18d9 mode 000000,100644..100644 Binary files differ diff --cc ntoskrnl/fstub/translate.c index 00000000000,3fa15e0c091..3fa15e0c091 mode 000000,100644..100644 --- a/ntoskrnl/fstub/translate.c +++ b/ntoskrnl/fstub/translate.c diff --cc ntoskrnl/inbv/logo/1.bmp index d13c48d16c0,05b139a2fe6..05b139a2fe6 Binary files differ diff --cc ntoskrnl/io/iomgr/rawfs.c index 143f486977c,143f486977c..143f486977c mode 100755,100644..100644 --- a/ntoskrnl/io/iomgr/rawfs.c +++ b/ntoskrnl/io/iomgr/rawfs.c diff --cc ntoskrnl/kdbg/kdb_symbols.c index f021649f12f,00000000000..4fac74c9d2a mode 100644,000000..100644 --- a/ntoskrnl/kdbg/kdb_symbols.c +++ b/ntoskrnl/kdbg/kdb_symbols.c @@@ -1,599 -1,0 +1,603 @@@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/dbg/kdb_symbols.c + * PURPOSE: Getting symbol information... + * + * PROGRAMMERS: David Welch (welch@cwcom.net) + * Colin Finck (colin@reactos.org) + */ + +/* INCLUDES *****************************************************************/ + +#include + +#define NDEBUG +#include + +/* GLOBALS ******************************************************************/ + +typedef struct _IMAGE_SYMBOL_INFO_CACHE +{ + LIST_ENTRY ListEntry; + ULONG RefCount; + UNICODE_STRING FileName; + PROSSYM_INFO RosSymInfo; +} +IMAGE_SYMBOL_INFO_CACHE, *PIMAGE_SYMBOL_INFO_CACHE; + +static BOOLEAN LoadSymbols; +static LIST_ENTRY SymbolFileListHead; +static KSPIN_LOCK SymbolFileListLock; +static PROSSYM_INFO KdbpRosSymInfo; +static ULONG_PTR KdbpImageBase; +BOOLEAN KdbpSymbolsInitialized = FALSE; + +/* FUNCTIONS ****************************************************************/ + +static BOOLEAN +KdbpSymSearchModuleList( + IN PLIST_ENTRY current_entry, + IN PLIST_ENTRY end_entry, + IN PLONG Count, + IN PVOID Address, + IN LPCWSTR Name, + IN INT Index, + OUT PLDR_DATA_TABLE_ENTRY* pLdrEntry) +{ + while (current_entry && current_entry != end_entry) + { + *pLdrEntry = CONTAINING_RECORD(current_entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); + + if ((Address && Address >= (PVOID)(*pLdrEntry)->DllBase && Address < (PVOID)((ULONG_PTR)(*pLdrEntry)->DllBase + (*pLdrEntry)->SizeOfImage)) || + (Name && !_wcsnicmp((*pLdrEntry)->BaseDllName.Buffer, Name, (*pLdrEntry)->BaseDllName.Length / sizeof(WCHAR))) || + (Index >= 0 && (*Count)++ == Index)) + { + return TRUE; + } + + current_entry = current_entry->Flink; + } + + return FALSE; +} + +/*! \brief Find a module... + * + * \param Address If \a Address is not NULL the module containing \a Address + * is searched. + * \param Name If \a Name is not NULL the module named \a Name will be + * searched. + * \param Index If \a Index is >= 0 the Index'th module will be returned. + * \param pLdrEntry Pointer to a PLDR_DATA_TABLE_ENTRY which is filled. + * + * \retval TRUE Module was found, \a pLdrEntry was filled. + * \retval FALSE No module was found. + */ +BOOLEAN +KdbpSymFindModule( + IN PVOID Address OPTIONAL, + IN LPCWSTR Name OPTIONAL, + IN INT Index OPTIONAL, + OUT PLDR_DATA_TABLE_ENTRY* pLdrEntry) +{ + LONG Count = 0; + PEPROCESS CurrentProcess; + + /* First try to look up the module in the kernel module list. */ + if(KdbpSymSearchModuleList(PsLoadedModuleList.Flink, + &PsLoadedModuleList, + &Count, + Address, + Name, + Index, + pLdrEntry)) + { + return TRUE; + } + + /* That didn't succeed. Try the module list of the current process now. */ + CurrentProcess = PsGetCurrentProcess(); + + if(!CurrentProcess || !CurrentProcess->Peb || !CurrentProcess->Peb->Ldr) + return FALSE; + + return KdbpSymSearchModuleList(CurrentProcess->Peb->Ldr->InLoadOrderModuleList.Flink, + &CurrentProcess->Peb->Ldr->InLoadOrderModuleList, + &Count, + Address, + Name, + Index, + pLdrEntry); +} + +/*! \brief Print address... + * + * Tries to lookup line number, file name and function name for the given + * address and prints it. + * If no such information is found the address is printed in the format + * , otherwise the format will be + * + * + * \retval TRUE Module containing \a Address was found, \a Address was printed. + * \retval FALSE No module containing \a Address was found, nothing was printed. + */ +BOOLEAN +KdbSymPrintAddress( - IN PVOID Address) ++ IN PVOID Address, ++ IN PKTRAP_FRAME Context) +{ + PMEMORY_AREA MemoryArea = NULL; + HANDLE FileHandle = NULL; + PROS_SECTION_OBJECT SectionObject; + PLDR_DATA_TABLE_ENTRY LdrEntry; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + UNICODE_STRING ModuleFileName; + ULONG_PTR RelativeAddress; + NTSTATUS Status; + ULONG LineNumber; + CHAR FileName[256]; + CHAR FunctionName[256]; + + if (!KdbpSymbolsInitialized || !KdbpSymFindModule(Address, NULL, -1, &LdrEntry)) + return FALSE; + + RelativeAddress = (ULONG_PTR)Address - (ULONG_PTR)LdrEntry->DllBase; + Status = KdbSymGetAddressInformation(LdrEntry->PatchInformation, + RelativeAddress, + &LineNumber, + FileName, + FunctionName); + if (NT_SUCCESS(Status)) + { + DbgPrint("<%wZ:%x (%s:%d (%s))>", + &LdrEntry->BaseDllName, RelativeAddress, FileName, LineNumber, FunctionName); + return TRUE; + } + else if (Address < MmSystemRangeStart) + { + MemoryArea = MmLocateMemoryAreaByAddress(&PsGetCurrentProcess()->Vm, Address); + if (!MemoryArea || MemoryArea->Type != MEMORY_AREA_SECTION_VIEW) + { + goto end; + } + SectionObject = MemoryArea->Data.SectionData.Section; + if (!(SectionObject->AllocationAttributes & SEC_IMAGE)) goto end; + if (SectionObject->ImageSection->ImageBase != KdbpImageBase) + { + if (KdbpRosSymInfo) + { + RosSymDelete(KdbpRosSymInfo); + KdbpRosSymInfo = NULL; + } + + Status = MmGetFileNameForAddress(Address, &ModuleFileName); + if (!NT_SUCCESS(Status)) + goto end; + + InitializeObjectAttributes + (&ObjectAttributes, + &ModuleFileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + if (!NT_SUCCESS + (ZwOpenFile + (&FileHandle, + FILE_READ_ACCESS, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT))) + { + goto end; + } + + if (!RosSymCreateFromFile(&FileHandle, &KdbpRosSymInfo)) + { + KdbpRosSymInfo = NULL; + } + + ZwClose(FileHandle); + KdbpImageBase = SectionObject->ImageSection->ImageBase; + } + + if (KdbpRosSymInfo) + { + RelativeAddress = (ULONG_PTR)Address - KdbpImageBase; + Status = KdbSymGetAddressInformation + (KdbpRosSymInfo, + RelativeAddress, + &LineNumber, + FileName, + FunctionName); + if (NT_SUCCESS(Status)) + { + DbgPrint + ("<%wZ:%x (%s:%d (%s))>", + &SectionObject->FileObject->FileName, + RelativeAddress, FileName, LineNumber, FunctionName); + return TRUE; + } + } + } + +end: + DbgPrint("<%wZ:%x>", &LdrEntry->BaseDllName, RelativeAddress); + + return TRUE; +} + + +/*! \brief Get information for an address (source file, line number, + * function name) + * + * \param SymbolInfo Pointer to ROSSYM_INFO. + * \param RelativeAddress Relative address to look up. + * \param LineNumber Pointer to an ULONG which is filled with the line + * number (can be NULL) + * \param FileName Pointer to an array of CHARs which gets filled with + * the filename (can be NULL) + * \param FunctionName Pointer to an array of CHARs which gets filled with + * the function name (can be NULL) + * + * \returns NTSTATUS error code. + * \retval STATUS_SUCCESS At least one of the requested informations was found. + * \retval STATUS_UNSUCCESSFUL None of the requested information was found. + */ +NTSTATUS +KdbSymGetAddressInformation( + IN PROSSYM_INFO RosSymInfo, + IN ULONG_PTR RelativeAddress, + OUT PULONG LineNumber OPTIONAL, + OUT PCH FileName OPTIONAL, + OUT PCH FunctionName OPTIONAL) +{ + if (!KdbpSymbolsInitialized || + !RosSymInfo || + !RosSymGetAddressInformation(RosSymInfo, RelativeAddress, LineNumber, FileName, FunctionName)) + { + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; +} + +/*! \brief Find cached symbol file. + * + * Looks through the list of cached symbol files and tries to find an already + * loaded one. + * + * \param FileName FileName of the symbol file to look for. + * + * \returns A pointer to the cached symbol info. + * \retval NULL No cached info found. + * + * \sa KdbpSymAddCachedFile + */ +static PROSSYM_INFO +KdbpSymFindCachedFile( + IN PUNICODE_STRING FileName) +{ + PIMAGE_SYMBOL_INFO_CACHE Current; + PLIST_ENTRY CurrentEntry; + KIRQL Irql; + + KeAcquireSpinLock(&SymbolFileListLock, &Irql); + + CurrentEntry = SymbolFileListHead.Flink; + while (CurrentEntry != (&SymbolFileListHead)) + { + Current = CONTAINING_RECORD(CurrentEntry, IMAGE_SYMBOL_INFO_CACHE, ListEntry); + + if (RtlEqualUnicodeString(&Current->FileName, FileName, TRUE)) + { + Current->RefCount++; + KeReleaseSpinLock(&SymbolFileListLock, Irql); + DPRINT("Found cached file!\n"); + return Current->RosSymInfo; + } + + CurrentEntry = CurrentEntry->Flink; + } + + KeReleaseSpinLock(&SymbolFileListLock, Irql); + + DPRINT("Cached file not found!\n"); + return NULL; +} + +/*! \brief Add a symbol file to the cache. + * + * \param FileName Filename of the symbol file. + * \param RosSymInfo Pointer to the symbol info. + * + * \sa KdbpSymRemoveCachedFile + */ +static VOID +KdbpSymAddCachedFile( + IN PUNICODE_STRING FileName, + IN PROSSYM_INFO RosSymInfo) +{ + PIMAGE_SYMBOL_INFO_CACHE CacheEntry; ++ KIRQL Irql; + + DPRINT("Adding symbol file: RosSymInfo = %p\n", RosSymInfo); + + /* allocate entry */ + CacheEntry = ExAllocatePoolWithTag(NonPagedPool, sizeof (IMAGE_SYMBOL_INFO_CACHE), TAG_KDBS); + ASSERT(CacheEntry); + RtlZeroMemory(CacheEntry, sizeof (IMAGE_SYMBOL_INFO_CACHE)); + + /* fill entry */ + CacheEntry->FileName.Buffer = ExAllocatePoolWithTag(NonPagedPool, + FileName->Length, + TAG_KDBS); + RtlCopyUnicodeString(&CacheEntry->FileName, FileName); + ASSERT(CacheEntry->FileName.Buffer); + CacheEntry->RefCount = 1; + CacheEntry->RosSymInfo = RosSymInfo; - InsertTailList(&SymbolFileListHead, &CacheEntry->ListEntry); /* FIXME: Lock list? */ ++ KeAcquireSpinLock(&SymbolFileListLock, &Irql); ++ InsertTailList(&SymbolFileListHead, &CacheEntry->ListEntry); ++ KeReleaseSpinLock(&SymbolFileListLock, Irql); +} + +/*! \brief Remove a symbol file (reference) from the cache. + * + * Tries to find a cache entry matching the given symbol info and decreases + * it's reference count. If the refcount is 0 after decreasing it the cache + * entry will be removed from the list and freed. + * + * \param RosSymInfo Pointer to the symbol info. + * + * \sa KdbpSymAddCachedFile + */ +static VOID +KdbpSymRemoveCachedFile( + IN PROSSYM_INFO RosSymInfo) +{ + PIMAGE_SYMBOL_INFO_CACHE Current; + PLIST_ENTRY CurrentEntry; + KIRQL Irql; + + KeAcquireSpinLock(&SymbolFileListLock, &Irql); + + CurrentEntry = SymbolFileListHead.Flink; + while (CurrentEntry != (&SymbolFileListHead)) + { + Current = CONTAINING_RECORD(CurrentEntry, IMAGE_SYMBOL_INFO_CACHE, ListEntry); + + if (Current->RosSymInfo == RosSymInfo) /* found */ + { + ASSERT(Current->RefCount > 0); + Current->RefCount--; + if (Current->RefCount < 1) + { + RemoveEntryList(&Current->ListEntry); + RosSymDelete(Current->RosSymInfo); + ExFreePool(Current); + } + + KeReleaseSpinLock(&SymbolFileListLock, Irql); + return; + } + + CurrentEntry = CurrentEntry->Flink; + } + + KeReleaseSpinLock(&SymbolFileListLock, Irql); +} + +/*! \brief Loads a symbol file. + * + * \param FileName Filename of the symbol file to load. + * \param RosSymInfo Pointer to a ROSSYM_INFO which gets filled. + * + * \sa KdbpSymUnloadModuleSymbols + */ +static VOID +KdbpSymLoadModuleSymbols( + IN PUNICODE_STRING FileName, + OUT PROSSYM_INFO *RosSymInfo) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE FileHandle; + NTSTATUS Status; + IO_STATUS_BLOCK IoStatusBlock; + + /* Allow KDB to break on module load */ + KdbModuleLoaded(FileName); + + if (!LoadSymbols) + { + *RosSymInfo = NULL; + return; + } + + /* Try to find cached (already loaded) symbol file */ + *RosSymInfo = KdbpSymFindCachedFile(FileName); + if (*RosSymInfo) + { + DPRINT("Found cached symbol file %wZ\n", FileName); + return; + } + + /* Open the file */ + InitializeObjectAttributes(&ObjectAttributes, + FileName, + 0, + NULL, + NULL); + + DPRINT("Attempting to open image: %wZ\n", FileName); + + Status = ZwOpenFile(&FileHandle, + FILE_READ_ACCESS, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(Status)) + { + DPRINT("Could not open image file: %wZ\n", FileName); + return; + } + + DPRINT("Loading symbols from %wZ...\n", FileName); + + if (!RosSymCreateFromFile(&FileHandle, RosSymInfo)) + { + DPRINT("Failed to load symbols from %wZ\n", FileName); + return; + } + + ZwClose(FileHandle); + + DPRINT("Symbols loaded.\n"); + + /* add file to cache */ + KdbpSymAddCachedFile(FileName, *RosSymInfo); + + DPRINT("Installed symbols: %wZ %p\n", FileName, *RosSymInfo); +} + +VOID +KdbSymProcessSymbols( + IN PLDR_DATA_TABLE_ENTRY LdrEntry) +{ + if (!LoadSymbols) + { + LdrEntry->PatchInformation = NULL; + return; + } + + /* Remove symbol info if it already exists */ + if (LdrEntry->PatchInformation) + KdbpSymRemoveCachedFile(LdrEntry->PatchInformation); + + /* Error loading symbol info, try to load it from file */ + KdbpSymLoadModuleSymbols(&LdrEntry->FullDllName, + (PROSSYM_INFO*)&LdrEntry->PatchInformation); + + /* It already added symbols to cache */ + DPRINT("Installed symbols: %wZ@%p-%p %p\n", + &LdrEntry->BaseDllName, + LdrEntry->DllBase, + (PVOID)(LdrEntry->SizeOfImage + (ULONG_PTR)LdrEntry->DllBase), + LdrEntry->PatchInformation); +} + +VOID +NTAPI +KdbDebugPrint( + PCH Message, + ULONG Length) +{ + /* Nothing here */ +} + + +/*! \brief Initializes the KDB symbols implementation. + * + * \param DispatchTable Pointer to the KD dispatch table + * \param BootPhase Phase of initialization + */ +VOID +NTAPI +KdbInitialize( + PKD_DISPATCH_TABLE DispatchTable, + ULONG BootPhase) +{ + PCHAR p1, p2; + SHORT Found = FALSE; + CHAR YesNo; + PLDR_DATA_TABLE_ENTRY LdrEntry; + + DPRINT("KdbSymInit() BootPhase=%d\n", BootPhase); + + LoadSymbols = FALSE; + +#if DBG + /* Load symbols only if we have 96Mb of RAM or more */ + if (MmNumberOfPhysicalPages >= 0x6000) + LoadSymbols = TRUE; +#endif + + if (BootPhase == 0) + { + /* Write out the functions that we support for now */ + DispatchTable->KdpInitRoutine = KdpKdbgInit; + DispatchTable->KdpPrintRoutine = KdbDebugPrint; + + /* Register as a Provider */ + InsertTailList(&KdProviders, &DispatchTable->KdProvidersList); + + /* Perform actual initialization of symbol module */ + //NtoskrnlModuleObject->PatchInformation = NULL; + //LdrHalModuleObject->PatchInformation = NULL; + + InitializeListHead(&SymbolFileListHead); + KeInitializeSpinLock(&SymbolFileListLock); + + /* Check the command line for /LOADSYMBOLS, /NOLOADSYMBOLS, + * /LOADSYMBOLS={YES|NO}, /NOLOADSYMBOLS={YES|NO} */ + ASSERT(KeLoaderBlock); + p1 = KeLoaderBlock->LoadOptions; + while('\0' != *p1 && NULL != (p2 = strchr(p1, '/'))) + { + p2++; + Found = 0; + if (0 == _strnicmp(p2, "LOADSYMBOLS", 11)) + { + Found = +1; + p2 += 11; + } + else if (0 == _strnicmp(p2, "NOLOADSYMBOLS", 13)) + { + Found = -1; + p2 += 13; + } + if (0 != Found) + { + while (isspace(*p2)) + { + p2++; + } + if ('=' == *p2) + { + p2++; + while (isspace(*p2)) + { + p2++; + } + YesNo = toupper(*p2); + if ('N' == YesNo || 'F' == YesNo || '0' == YesNo) + { + Found = -1 * Found; + } + } + LoadSymbols = (0 < Found); + } + p1 = p2; + } + + RosSymInitKernelMode(); + } + else if (BootPhase == 3) + { + /* Load symbols for NTOSKRNL.EXE. + It is always the first module in PsLoadedModuleList. KeLoaderBlock can't be used here as its content is just temporary. */ + LdrEntry = CONTAINING_RECORD(PsLoadedModuleList.Flink, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); + KdbSymProcessSymbols(LdrEntry); + + /* Also load them for HAL.DLL. */ + LdrEntry = CONTAINING_RECORD(PsLoadedModuleList.Flink->Flink, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); + KdbSymProcessSymbols(LdrEntry); + + KdbpSymbolsInitialized = TRUE; + } +} + +/* EOF */ diff --cc ntoskrnl/kdbg/kdb_symbols.cmake.c index 00000000000,3d4778bc63a..3d4778bc63a mode 000000,100644..100644 --- a/ntoskrnl/kdbg/kdb_symbols.cmake.c +++ b/ntoskrnl/kdbg/kdb_symbols.cmake.c diff --cc subsystems/win32/csrss/win32csr/file.c index 00000000000,6bbf7fb0398..6bbf7fb0398 mode 000000,100644..100644 --- a/subsystems/win32/csrss/win32csr/file.c +++ b/subsystems/win32/csrss/win32csr/file.c diff --cc subsystems/win32/csrss/win32csr/file.h index 00000000000,fa33b62efd2..fa33b62efd2 mode 000000,100644..100644 --- a/subsystems/win32/csrss/win32csr/file.h +++ b/subsystems/win32/csrss/win32csr/file.h diff --cc subsystems/win32/csrss/win32csr/lang/cs-CZ.rc index 00000000000,283cdfe48c3..283cdfe48c3 mode 000000,100644..100644 --- a/subsystems/win32/csrss/win32csr/lang/cs-CZ.rc +++ b/subsystems/win32/csrss/win32csr/lang/cs-CZ.rc diff --cc subsystems/win32/csrss/win32csr/lang/sv-SE.rc index 00000000000,0c1379b9be2..0c1379b9be2 mode 000000,100644..100644 --- a/subsystems/win32/csrss/win32csr/lang/sv-SE.rc +++ b/subsystems/win32/csrss/win32csr/lang/sv-SE.rc diff --cc subsystems/win32/csrss/win32csr/rsrc.rc index e94c3ec0065,00000000000..c894df0257b mode 100644,000000..100644 --- a/subsystems/win32/csrss/win32csr/rsrc.rc +++ b/subsystems/win32/csrss/win32csr/rsrc.rc @@@ -1,24 -1,0 +1,28 @@@ +#include +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +1 ICON DISCARDABLE res/terminal.ico + +#include "lang/bg-BG.rc" ++#include "lang/cs-CZ.rc" +#include "lang/de-DE.rc" +#include "lang/el-GR.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fr-FR.rc" +#include "lang/id-ID.rc" +#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" FIXME: iconv issue +#include "lang/no-NO.rc" - #include "lang/pl-PL.rc" - #include "lang/ru-RU.rc" +#include "lang/sk-SK.rc" - #include "lang/uk-UA.rc" ++#include "lang/sv-SE.rc" +#include "lang/zh-CN.rc" +#include "lang/zh-TW.rc" + ++// UTF-8 ++#pragma code_page(65001) ++#include "lang/pl-PL.rc" ++#include "lang/ru-RU.rc" ++#include "lang/uk-UA.rc" diff --cc subsystems/win32/win32k/include/gdidebug.h index 00000000000,0f5221cc89f..0f5221cc89f mode 000000,100644..100644 --- a/subsystems/win32/win32k/include/gdidebug.h +++ b/subsystems/win32/win32k/include/gdidebug.h diff --cc subsystems/win32/win32k/objects/bitblt.c index a839e83d057,00000000000..fbb958b3ef1 mode 100644,000000..100644 --- a/subsystems/win32/win32k/objects/bitblt.c +++ b/subsystems/win32/win32k/objects/bitblt.c @@@ -1,1100 -1,0 +1,980 @@@ +/* +* ReactOS W32 Subsystem +* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along +* with this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ +/* $Id: bitmaps.c 28300 2007-08-12 15:20:09Z tkreuzer $ */ + +#include + +#define NDEBUG +#include + ++#define ROP_USES_SOURCE(Rop) (((((Rop) & 0xCC0000) >> 2) != ((Rop) & 0x330000)) || ((((Rop) & 0xCC000000) >> 2) != ((Rop) & 0x33000000))) ++#define ROP_USES_MASK(Rop) (((Rop) & 0xFF000000) != (((Rop) & 0xff0000) << 8)) + ++#define FIXUP_ROP(Rop) if(((Rop) & 0xFF000000) == 0) Rop = MAKEROP4((Rop), (Rop)) ++#define ROP_TO_ROP4(Rop) ((Rop) >> 16) + +BOOL APIENTRY +NtGdiAlphaBlend( + HDC hDCDest, + LONG XOriginDest, + LONG YOriginDest, + LONG WidthDest, + LONG HeightDest, + HDC hDCSrc, + LONG XOriginSrc, + LONG YOriginSrc, + LONG WidthSrc, + LONG HeightSrc, + BLENDFUNCTION BlendFunc, + HANDLE hcmXform) +{ + PDC DCDest; + PDC DCSrc; + HDC ahDC[2]; + PGDIOBJ apObj[2]; + SURFACE *BitmapDest, *BitmapSrc; + RECTL DestRect, SourceRect; + BOOL bResult; + EXLATEOBJ exlo; + BLENDOBJ BlendObj; + BlendObj.BlendFunction = BlendFunc; + + if (WidthDest < 0 || HeightDest < 0 || WidthSrc < 0 || HeightSrc < 0) + { + EngSetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + DPRINT("Locking DCs\n"); + ahDC[0] = hDCDest; + ahDC[1] = hDCSrc ; - GDIOBJ_LockMultipleObjs(2, ahDC, apObj); - DCDest = apObj[0]; - DCSrc = apObj[1]; - - if ((NULL == DCDest) || (NULL == DCSrc)) ++ if (!GDIOBJ_bLockMultipleObjects(2, ahDC, apObj, GDIObjType_DC_TYPE)) + { + DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hDCDest, hDCSrc); + EngSetLastError(ERROR_INVALID_HANDLE); - if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - if(DCDest) GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); + return FALSE; + } ++ DCDest = apObj[0]; ++ DCSrc = apObj[1]; + + if (DCDest->dctype == DC_TYPE_INFO || DCDest->dctype == DCTYPE_INFO) + { - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); ++ GDIOBJ_vUnlockObject(&DCSrc->BaseObject); ++ GDIOBJ_vUnlockObject(&DCDest->BaseObject); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } + + DestRect.left = XOriginDest; + DestRect.top = YOriginDest; + DestRect.right = XOriginDest + WidthDest; + DestRect.bottom = YOriginDest + HeightDest; + IntLPtoDP(DCDest, (LPPOINT)&DestRect, 2); + + DestRect.left += DCDest->ptlDCOrig.x; + DestRect.top += DCDest->ptlDCOrig.y; + DestRect.right += DCDest->ptlDCOrig.x; + DestRect.bottom += DCDest->ptlDCOrig.y; + + SourceRect.left = XOriginSrc; + SourceRect.top = YOriginSrc; + SourceRect.right = XOriginSrc + WidthSrc; + SourceRect.bottom = YOriginSrc + HeightSrc; + IntLPtoDP(DCSrc, (LPPOINT)&SourceRect, 2); + + SourceRect.left += DCSrc->ptlDCOrig.x; + SourceRect.top += DCSrc->ptlDCOrig.y; + SourceRect.right += DCSrc->ptlDCOrig.x; + SourceRect.bottom += DCSrc->ptlDCOrig.y; + + if (!DestRect.right || + !DestRect.bottom || + !SourceRect.right || + !SourceRect.bottom) + { - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); ++ GDIOBJ_vUnlockObject(&DCSrc->BaseObject); ++ GDIOBJ_vUnlockObject(&DCDest->BaseObject); + return TRUE; + } + + /* Prepare DCs for blit */ + DPRINT("Preparing DCs for blit\n"); + DC_vPrepareDCsForBlit(DCDest, DestRect, DCSrc, SourceRect); + + /* Determine surfaces to be used in the bitblt */ + BitmapDest = DCDest->dclevel.pSurface; + if (!BitmapDest) + { + bResult = FALSE ; + goto leave ; + } + + BitmapSrc = DCSrc->dclevel.pSurface; + if (!BitmapSrc) + { + bResult = FALSE; + goto leave; + } + + /* Create the XLATEOBJ. */ + EXLATEOBJ_vInitXlateFromDCs(&exlo, DCSrc, DCDest); + + /* Perform the alpha blend operation */ + DPRINT("Performing the alpha Blend\n"); + bResult = IntEngAlphaBlend(&BitmapDest->SurfObj, + &BitmapSrc->SurfObj, + DCDest->rosdc.CombinedClip, + &exlo.xlo, + &DestRect, + &SourceRect, + &BlendObj); + + EXLATEOBJ_vCleanup(&exlo); +leave : + DPRINT("Finishing blit\n"); + DC_vFinishBlit(DCDest, DCSrc); - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); ++ GDIOBJ_vUnlockObject(&DCSrc->BaseObject); ++ GDIOBJ_vUnlockObject(&DCDest->BaseObject); + + return bResult; +} + +BOOL APIENTRY +NtGdiBitBlt( + HDC hDCDest, + INT XDest, + INT YDest, + INT Width, + INT Height, + HDC hDCSrc, + INT XSrc, + INT YSrc, + DWORD ROP, + IN DWORD crBackColor, + IN FLONG fl) +{ - PDC DCDest; - PDC DCSrc = NULL; - HDC ahDC[2]; - PGDIOBJ apObj[2]; - PDC_ATTR pdcattr = NULL; - SURFACE *BitmapDest, *BitmapSrc = NULL; - RECTL DestRect, SourceRect; - POINTL SourcePoint; - BOOL Status = FALSE; - EXLATEOBJ exlo; - XLATEOBJ *XlateObj = NULL; - BOOL UsesSource = ROP3_USES_SOURCE(ROP); - - DPRINT("Locking DCs\n"); - ahDC[0] = hDCDest; - ahDC[1] = hDCSrc ; - GDIOBJ_LockMultipleObjs(2, ahDC, apObj); - DCDest = apObj[0]; - DCSrc = apObj[1]; - - if (NULL == DCDest) - { - if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - DPRINT("Invalid destination dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCDest); - return FALSE; - } - - if (DCDest->dctype == DC_TYPE_INFO) - { - if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); - /* Yes, Windows really returns TRUE in this case */ - return TRUE; - } - - if (UsesSource) - { - if (NULL == DCSrc) - { - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); - DPRINT("Invalid source dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCSrc); - return FALSE; - } - if (DCSrc->dctype == DC_TYPE_INFO) - { - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - /* Yes, Windows really returns TRUE in this case */ - return TRUE; - } - } - else if(DCSrc) - { - DPRINT1("Getting a valid Source handle without using source!!!\n"); - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - DCSrc = NULL ; - } - - pdcattr = DCDest->pdcattr; - - DestRect.left = XDest; - DestRect.top = YDest; - DestRect.right = XDest+Width; - DestRect.bottom = YDest+Height; - IntLPtoDP(DCDest, (LPPOINT)&DestRect, 2); - - DestRect.left += DCDest->ptlDCOrig.x; - DestRect.top += DCDest->ptlDCOrig.y; - DestRect.right += DCDest->ptlDCOrig.x; - DestRect.bottom += DCDest->ptlDCOrig.y; - - SourcePoint.x = XSrc; - SourcePoint.y = YSrc; - - if (UsesSource) - { - IntLPtoDP(DCSrc, (LPPOINT)&SourcePoint, 1); - - SourcePoint.x += DCSrc->ptlDCOrig.x; - SourcePoint.y += DCSrc->ptlDCOrig.y; - /* Calculate Source Rect */ - SourceRect.left = SourcePoint.x; - SourceRect.top = SourcePoint.y; - SourceRect.right = SourcePoint.x + DestRect.right - DestRect.left; - SourceRect.bottom = SourcePoint.y + DestRect.bottom - DestRect.top ; - } - - /* Prepare blit */ - DC_vPrepareDCsForBlit(DCDest, DestRect, DCSrc, SourceRect); - - if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) - DC_vUpdateFillBrush(DCDest); - - /* Determine surfaces to be used in the bitblt */ - BitmapDest = DCDest->dclevel.pSurface; - if (!BitmapDest) - goto cleanup; - - if (UsesSource) - { - { - BitmapSrc = DCSrc->dclevel.pSurface; - if (!BitmapSrc) - goto cleanup; - } - } - - /* Create the XLATEOBJ. */ - if (UsesSource) - { - EXLATEOBJ_vInitXlateFromDCs(&exlo, DCSrc, DCDest); - XlateObj = &exlo.xlo; - } - - /* Perform the bitblt operation */ - Status = IntEngBitBlt(&BitmapDest->SurfObj, - BitmapSrc ? &BitmapSrc->SurfObj : NULL, - NULL, - DCDest->rosdc.CombinedClip, - XlateObj, - &DestRect, - &SourcePoint, - NULL, - &DCDest->eboFill.BrushObject, - &DCDest->dclevel.pbrFill->ptOrigin, - ROP3_TO_ROP4(ROP)); - - if (UsesSource) - EXLATEOBJ_vCleanup(&exlo); - cleanup: - DC_vFinishBlit(DCDest, DCSrc); - if (UsesSource) - { - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - } - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); - - return Status; ++ /* Forward to NtGdiMaskBlt */ ++ // TODO : what's fl for? ++ return NtGdiMaskBlt(hDCDest, ++ XDest, ++ YDest, ++ Width, ++ Height, ++ hDCSrc, ++ XSrc, ++ YSrc, ++ NULL, ++ 0, ++ 0, ++ ROP, ++ crBackColor); +} + +BOOL APIENTRY +NtGdiTransparentBlt( + HDC hdcDst, + INT xDst, + INT yDst, + INT cxDst, + INT cyDst, + HDC hdcSrc, + INT xSrc, + INT ySrc, + INT cxSrc, + INT cySrc, + COLORREF TransColor) +{ + PDC DCDest, DCSrc; + HDC ahDC[2]; + PGDIOBJ apObj[2]; + RECTL rcDest, rcSrc; + SURFACE *BitmapDest, *BitmapSrc = NULL; + ULONG TransparentColor = 0; + BOOL Ret = FALSE; + EXLATEOBJ exlo; + + DPRINT("Locking DCs\n"); + ahDC[0] = hdcDst; + ahDC[1] = hdcSrc ; - GDIOBJ_LockMultipleObjs(2, ahDC, apObj); - DCDest = apObj[0]; - DCSrc = apObj[1]; - - if ((NULL == DCDest) || (NULL == DCSrc)) ++ if (!GDIOBJ_bLockMultipleObjects(2, ahDC, apObj, GDIObjType_DC_TYPE)) + { + DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hdcDst, hdcSrc); + EngSetLastError(ERROR_INVALID_HANDLE); - if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - if(DCDest) GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); + return FALSE; + } ++ DCDest = apObj[0]; ++ DCSrc = apObj[1]; + + if (DCDest->dctype == DC_TYPE_INFO || DCDest->dctype == DCTYPE_INFO) + { - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); ++ GDIOBJ_vUnlockObject(&DCSrc->BaseObject); ++ GDIOBJ_vUnlockObject(&DCDest->BaseObject); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } + + rcDest.left = xDst; + rcDest.top = yDst; + rcDest.right = rcDest.left + cxDst; + rcDest.bottom = rcDest.top + cyDst; + IntLPtoDP(DCDest, (LPPOINT)&rcDest, 2); + + rcDest.left += DCDest->ptlDCOrig.x; + rcDest.top += DCDest->ptlDCOrig.y; + rcDest.right += DCDest->ptlDCOrig.x; + rcDest.bottom += DCDest->ptlDCOrig.y; + + rcSrc.left = xSrc; + rcSrc.top = ySrc; + rcSrc.right = rcSrc.left + cxSrc; + rcSrc.bottom = rcSrc.top + cySrc; + IntLPtoDP(DCSrc, (LPPOINT)&rcSrc, 2); + + rcSrc.left += DCSrc->ptlDCOrig.x; + rcSrc.top += DCSrc->ptlDCOrig.y; + rcSrc.right += DCSrc->ptlDCOrig.x; + rcSrc.bottom += DCSrc->ptlDCOrig.y; + + /* Prepare for blit */ + DC_vPrepareDCsForBlit(DCDest, rcDest, DCSrc, rcSrc); + + BitmapDest = DCDest->dclevel.pSurface; + if (!BitmapDest) + { + goto done; + } + + BitmapSrc = DCSrc->dclevel.pSurface; + if (!BitmapSrc) + { + goto done; + } + + /* Translate Transparent (RGB) Color to the source palette */ + EXLATEOBJ_vInitialize(&exlo, &gpalRGB, BitmapSrc->ppal, 0, 0, 0); + TransparentColor = XLATEOBJ_iXlate(&exlo.xlo, (ULONG)TransColor); + EXLATEOBJ_vCleanup(&exlo); + + EXLATEOBJ_vInitXlateFromDCs(&exlo, DCSrc, DCDest); + + Ret = IntEngTransparentBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj, + DCDest->rosdc.CombinedClip, &exlo.xlo, &rcDest, &rcSrc, + TransparentColor, 0); + + EXLATEOBJ_vCleanup(&exlo); + +done: + DC_vFinishBlit(DCDest, DCSrc); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); ++ GDIOBJ_vUnlockObject(&DCDest->BaseObject); ++ GDIOBJ_vUnlockObject(&DCSrc->BaseObject); + + return Ret; +} + - /*********************************************************************** - * MaskBlt - * Ported from WINE by sedwards 11-4-03 - * - * Someone thought it would be faster to do it here and then switch back - * to GDI32. I dunno. Write a test and let me know. - * A. It should be in here! - */ - - static const DWORD ROP3Table[256] = - { - 0x000042, 0x010289, 0x020C89, 0x0300AA, 0x040C88, 0x0500A9, 0x060865, 0x0702C5, - 0x080F08, 0x090245, 0x0A0329, 0x0B0B2A, 0x0C0324, 0x0D0B25, 0x0E08A5, 0x0F0001, - 0x100C85, 0x1100A6, 0x120868, 0x1302C8, 0x140869, 0x1502C9, 0x165CCA, 0x171D54, - 0x180D59, 0x191CC8, 0x1A06C5, 0x1B0768, 0x1C06CA, 0x1D0766, 0x1E01A5, 0x1F0385, - 0x200F09, 0x210248, 0x220326, 0x230B24, 0x240D55, 0x251CC5, 0x2606C8, 0x271868, - 0x280369, 0x2916CA, 0x2A0CC9, 0x2B1D58, 0x2C0784, 0x2D060A, 0x2E064A, 0x2F0E2A, - 0x30032A, 0x310B28, 0x320688, 0x330008, 0x3406C4, 0x351864, 0x3601A8, 0x370388, - 0x38078A, 0x390604, 0x3A0644, 0x3B0E24, 0x3C004A, 0x3D18A4, 0x3E1B24, 0x3F00EA, - 0x400F0A, 0x410249, 0x420D5D, 0x431CC4, 0x440328, 0x450B29, 0x4606C6, 0x47076A, - 0x480368, 0x4916C5, 0x4A0789, 0x4B0605, 0x4C0CC8, 0x4D1954, 0x4E0645, 0x4F0E25, - 0x500325, 0x510B26, 0x5206C9, 0x530764, 0x5408A9, 0x550009, 0x5601A9, 0x570389, - 0x580785, 0x590609, 0x5A0049, 0x5B18A9, 0x5C0649, 0x5D0E29, 0x5E1B29, 0x5F00E9, - 0x600365, 0x6116C6, 0x620786, 0x630608, 0x640788, 0x650606, 0x660046, 0x6718A8, - 0x6858A6, 0x690145, 0x6A01E9, 0x6B178A, 0x6C01E8, 0x6D1785, 0x6E1E28, 0x6F0C65, - 0x700CC5, 0x711D5C, 0x720648, 0x730E28, 0x740646, 0x750E26, 0x761B28, 0x7700E6, - 0x7801E5, 0x791786, 0x7A1E29, 0x7B0C68, 0x7C1E24, 0x7D0C69, 0x7E0955, 0x7F03C9, - 0x8003E9, 0x810975, 0x820C49, 0x831E04, 0x840C48, 0x851E05, 0x8617A6, 0x8701C5, - 0x8800C6, 0x891B08, 0x8A0E06, 0x8B0666, 0x8C0E08, 0x8D0668, 0x8E1D7C, 0x8F0CE5, - 0x900C45, 0x911E08, 0x9217A9, 0x9301C4, 0x9417AA, 0x9501C9, 0x960169, 0x97588A, - 0x981888, 0x990066, 0x9A0709, 0x9B07A8, 0x9C0704, 0x9D07A6, 0x9E16E6, 0x9F0345, - 0xA000C9, 0xA11B05, 0xA20E09, 0xA30669, 0xA41885, 0xA50065, 0xA60706, 0xA707A5, - 0xA803A9, 0xA90189, 0xAA0029, 0xAB0889, 0xAC0744, 0xAD06E9, 0xAE0B06, 0xAF0229, - 0xB00E05, 0xB10665, 0xB21974, 0xB30CE8, 0xB4070A, 0xB507A9, 0xB616E9, 0xB70348, - 0xB8074A, 0xB906E6, 0xBA0B09, 0xBB0226, 0xBC1CE4, 0xBD0D7D, 0xBE0269, 0xBF08C9, - 0xC000CA, 0xC11B04, 0xC21884, 0xC3006A, 0xC40E04, 0xC50664, 0xC60708, 0xC707AA, - 0xC803A8, 0xC90184, 0xCA0749, 0xCB06E4, 0xCC0020, 0xCD0888, 0xCE0B08, 0xCF0224, - 0xD00E0A, 0xD1066A, 0xD20705, 0xD307A4, 0xD41D78, 0xD50CE9, 0xD616EA, 0xD70349, - 0xD80745, 0xD906E8, 0xDA1CE9, 0xDB0D75, 0xDC0B04, 0xDD0228, 0xDE0268, 0xDF08C8, - 0xE003A5, 0xE10185, 0xE20746, 0xE306EA, 0xE40748, 0xE506E5, 0xE61CE8, 0xE70D79, - 0xE81D74, 0xE95CE6, 0xEA02E9, 0xEB0849, 0xEC02E8, 0xED0848, 0xEE0086, 0xEF0A08, - 0xF00021, 0xF10885, 0xF20B05, 0xF3022A, 0xF40B0A, 0xF50225, 0xF60265, 0xF708C5, - 0xF802E5, 0xF90845, 0xFA0089, 0xFB0A09, 0xFC008A, 0xFD0A0A, 0xFE02A9, 0xFF0062, - }; - - static __inline BYTE - SwapROP3_SrcDst(BYTE bRop3) - { - return (bRop3 & 0x99) | ((bRop3 & 0x22) << 1) | ((bRop3 & 0x44) >> 1); - } - - #define FRGND_ROP3(ROP4) ((ROP4) & 0x00FFFFFF) - #define BKGND_ROP3(ROP4) (ROP3Table[(SwapROP3_SrcDst((ROP4)>>24)) & 0xFF]) - #define DSTCOPY 0x00AA0029 - #define DSTERASE 0x00220326 /* dest = dest & (~src) : DSna */ - - /* NOTE: An alternative algorithm could use a pattern brush, created from - * the mask bitmap and then use raster operation 0xCA to combine the fore - * and background bitmaps. In this case erasing the bits beforehand would be - * unneccessary. On the other hand the Operation does not provide an optimized - * version in the DIB code, while SRCAND and SRCPAINT do. - * A fully correct implementation would call Eng/DrvBitBlt, but our - * EngBitBlt completely ignores the mask surface. - * - * Msk Fg Bk => x - * P S D DPSDxax - * ------------------------------------------ - * 0 0 0 0 0000xax = 000ax = 00x = 0 - * 0 0 1 1 1001xax = 101ax = 10x = 1 - * 0 1 0 0 0010xax = 001ax = 00x = 0 - * 0 1 1 1 1011xax = 100ax = 10x = 1 - * 1 0 0 0 0100xax = 010ax = 00x = 0 - * 1 0 1 0 1101xax = 111ax = 11x = 0 - * 1 1 0 1 0110xax = 011ax = 01x = 1 - * 1 1 1 1 1111xax = 110ax = 10x = 1 - * - * Operation index = 11001010 = 0xCA = PSaDPnao = DPSDxax - * ^ no, this is not random letters, its reverse Polish notation - */ - +BOOL APIENTRY +NtGdiMaskBlt( + HDC hdcDest, + INT nXDest, + INT nYDest, + INT nWidth, + INT nHeight, + HDC hdcSrc, + INT nXSrc, + INT nYSrc, + HBITMAP hbmMask, + INT xMask, + INT yMask, + DWORD dwRop, + IN DWORD crBackColor) +{ - HBITMAP hbmFore, hbmBack; - HDC hdcMask, hdcFore, hdcBack; - PDC pdc; - HBRUSH hbr; - COLORREF crFore, crBack; - - if (!hbmMask) - return NtGdiBitBlt(hdcDest, - nXDest, - nYDest, - nWidth, - nHeight, - hdcSrc, - nXSrc, - nYSrc, - FRGND_ROP3(dwRop), - crBackColor, - 0); - - /* Lock the dest DC */ - pdc = DC_LockDc(hdcDest); - if (!pdc) return FALSE; - - /* Get brush and colors from dest dc */ - hbr = pdc->pdcattr->hbrush; - crFore = pdc->pdcattr->crForegroundClr; - crBack = pdc->pdcattr->crBackgroundClr; - - /* Unlock the DC */ - DC_UnlockDc(pdc); ++ PDC DCDest; ++ PDC DCSrc = NULL; ++ HDC ahDC[2]; ++ PGDIOBJ apObj[2]; ++ PDC_ATTR pdcattr = NULL; ++ SURFACE *BitmapDest, *BitmapSrc = NULL, *psurfMask = NULL; ++ RECTL DestRect, SourceRect; ++ POINTL SourcePoint, MaskPoint; ++ BOOL Status = FALSE; ++ EXLATEOBJ exlo; ++ XLATEOBJ *XlateObj = NULL; ++ BOOL UsesSource = ROP_USES_SOURCE(dwRop); ++ BOOL UsesMask; + - /* 1. Create mask bitmap's dc */ - hdcMask = NtGdiCreateCompatibleDC(hdcDest); - NtGdiSelectBitmap(hdcMask, hbmMask); ++ FIXUP_ROP(dwRop); + - /* 2. Create masked Background bitmap */ ++ UsesMask = ROP_USES_MASK(dwRop); + - /* 2.1 Create bitmap */ - hdcBack = NtGdiCreateCompatibleDC(hdcDest); - hbmBack = NtGdiCreateCompatibleBitmap(hdcDest, nWidth, nHeight); - NtGdiSelectBitmap(hdcBack, hbmBack); ++ //DPRINT1("dwRop : 0x%08x\n", dwRop); ++ if (!hdcDest || (UsesSource && !hdcSrc)) ++ { ++ EngSetLastError(ERROR_INVALID_PARAMETER); ++ return FALSE; ++ } + - /* 2.2 Copy source bitmap */ - NtGdiSelectBrush(hdcBack, hbr); - IntGdiSetBkColor(hdcBack, crBack); - IntGdiSetTextColor(hdcBack, crFore); - NtGdiBitBlt(hdcBack, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, SRCCOPY, 0, 0); ++ /* Take care of mask bitmap */ ++ if(hbmMask) ++ { ++ psurfMask = SURFACE_ShareLockSurface(hbmMask); ++ if(!psurfMask) ++ { ++ EngSetLastError(ERROR_INVALID_HANDLE); ++ return FALSE; ++ } ++ } + - /* 2.3 Do the background rop */ - NtGdiBitBlt(hdcBack, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, BKGND_ROP3(dwRop), 0, 0); ++ if(UsesMask) ++ { ++ if(!psurfMask) ++ { ++ EngSetLastError(ERROR_INVALID_PARAMETER); ++ return FALSE; ++ } ++ if(gajBitsPerFormat[psurfMask->SurfObj.iBitmapFormat] != 1) ++ { ++ EngSetLastError(ERROR_INVALID_PARAMETER); ++ SURFACE_ShareUnlockSurface(psurfMask); ++ return FALSE; ++ } ++ } ++ else if(psurfMask) ++ { ++ DPRINT1("Getting Mask bitmap without needing it?\n"); ++ SURFACE_ShareUnlockSurface(psurfMask); ++ psurfMask = NULL; ++ } ++ MaskPoint.x = xMask; ++ MaskPoint.y = yMask; + - /* 2.4 Erase the foreground pixels */ - IntGdiSetBkColor(hdcBack, 0xffffffff); - IntGdiSetTextColor(hdcBack, 0); - NtGdiBitBlt(hdcBack, 0, 0, nWidth, nHeight, hdcMask, xMask, yMask, SRCAND, 0, 0); ++ /* Take care of source and destination bitmap */ ++ DPRINT("Locking DCs\n"); ++ ahDC[0] = hdcDest; ++ ahDC[1] = UsesSource ? hdcSrc : NULL; ++ if (!GDIOBJ_bLockMultipleObjects(2, ahDC, apObj, GDIObjType_DC_TYPE)) ++ { ++ DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hdcDest, hdcSrc); ++ EngSetLastError(ERROR_INVALID_HANDLE); ++ return FALSE; ++ } ++ DCDest = apObj[0]; ++ DCSrc = apObj[1]; + - /* 3. Create masked Foreground bitmap */ ++ ASSERT(DCDest); ++ if (NULL == DCDest) ++ { ++ if(DCSrc) DC_UnlockDc(DCSrc); ++ DPRINT("Invalid destination dc handle (0x%08x) passed to NtGdiBitBlt\n", hdcDest); ++ return FALSE; ++ } + - /* 3.1 Create bitmap */ - hdcFore = NtGdiCreateCompatibleDC(hdcDest); - hbmFore = NtGdiCreateCompatibleBitmap(hdcDest, nWidth, nHeight); - NtGdiSelectBitmap(hdcFore, hbmFore); ++ if (DCDest->dctype == DC_TYPE_INFO) ++ { ++ if(DCSrc) DC_UnlockDc(DCSrc); ++ DC_UnlockDc(DCDest); ++ /* Yes, Windows really returns TRUE in this case */ ++ return TRUE; ++ } + - /* 3.2 Copy the dest bitmap */ - NtGdiSelectBrush(hdcFore, hbr); - IntGdiSetBkColor(hdcFore, crBack); - IntGdiSetTextColor(hdcFore, crFore); - NtGdiBitBlt(hdcFore, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, SRCCOPY, 0, 0); ++ if (UsesSource) ++ { ++ ASSERT(DCSrc); ++ if (DCSrc->dctype == DC_TYPE_INFO) ++ { ++ DC_UnlockDc(DCDest); ++ DC_UnlockDc(DCSrc); ++ /* Yes, Windows really returns TRUE in this case */ ++ return TRUE; ++ } ++ } ++ ++ pdcattr = DCDest->pdcattr; ++ ++ DestRect.left = nXDest; ++ DestRect.top = nYDest; ++ DestRect.right = nXDest + nWidth; ++ DestRect.bottom = nYDest + nHeight; ++ IntLPtoDP(DCDest, (LPPOINT)&DestRect, 2); + - /* 2.3 Do the foreground rop */ - NtGdiBitBlt(hdcFore, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, FRGND_ROP3(dwRop), 0,0); ++ DestRect.left += DCDest->ptlDCOrig.x; ++ DestRect.top += DCDest->ptlDCOrig.y; ++ DestRect.right += DCDest->ptlDCOrig.x; ++ DestRect.bottom += DCDest->ptlDCOrig.y; + - /* 2.4 Erase the background pixels */ - IntGdiSetBkColor(hdcFore, 0); - IntGdiSetTextColor(hdcFore, 0xffffffff); - NtGdiBitBlt(hdcFore, 0, 0, nWidth, nHeight, hdcMask, xMask, yMask, SRCAND, 0, 0); ++ SourcePoint.x = nXSrc; ++ SourcePoint.y = nYSrc; + - /* 3. Combine the fore and background into the background bitmap */ - NtGdiBitBlt(hdcBack, 0, 0, nWidth, nHeight, hdcFore, 0, 0, SRCPAINT, 0, 0); ++ if (UsesSource) ++ { ++ IntLPtoDP(DCSrc, (LPPOINT)&SourcePoint, 1); + - /* 4. Copy the result to hdcDest */ - NtGdiBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcBack, 0, 0, SRCCOPY, 0, 0); ++ SourcePoint.x += DCSrc->ptlDCOrig.x; ++ SourcePoint.y += DCSrc->ptlDCOrig.y; ++ /* Calculate Source Rect */ ++ SourceRect.left = SourcePoint.x; ++ SourceRect.top = SourcePoint.y; ++ SourceRect.right = SourcePoint.x + DestRect.right - DestRect.left; ++ SourceRect.bottom = SourcePoint.y + DestRect.bottom - DestRect.top ; ++ } + - /* 5. delete all temp objects */ - NtGdiDeleteObjectApp(hdcBack); - NtGdiDeleteObjectApp(hdcFore); - NtGdiDeleteObjectApp(hdcMask); - GreDeleteObject(hbmFore); - GreDeleteObject(hbmBack); ++ /* Prepare blit */ ++ DC_vPrepareDCsForBlit(DCDest, DestRect, DCSrc, SourceRect); + - return TRUE; ++ if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) ++ DC_vUpdateFillBrush(DCDest); ++ ++ /* Determine surfaces to be used in the bitblt */ ++ BitmapDest = DCDest->dclevel.pSurface; ++ if (!BitmapDest) ++ goto cleanup; ++ ++ if (UsesSource) ++ { ++ { ++ BitmapSrc = DCSrc->dclevel.pSurface; ++ if (!BitmapSrc) ++ goto cleanup; ++ } ++ } ++ ++ /* Create the XLATEOBJ. */ ++ if (UsesSource) ++ { ++ EXLATEOBJ_vInitXlateFromDCs(&exlo, DCSrc, DCDest); ++ XlateObj = &exlo.xlo; ++ } ++ ++ ++ /* Perform the bitblt operation */ ++ Status = IntEngBitBlt(&BitmapDest->SurfObj, ++ BitmapSrc ? &BitmapSrc->SurfObj : NULL, ++ psurfMask ? &psurfMask->SurfObj : NULL, ++ DCDest->rosdc.CombinedClip, ++ XlateObj, ++ &DestRect, ++ &SourcePoint, ++ &MaskPoint, ++ &DCDest->eboFill.BrushObject, ++ &DCDest->dclevel.pbrFill->ptOrigin, ++ ROP_TO_ROP4(dwRop)); ++ ++ if (UsesSource) ++ EXLATEOBJ_vCleanup(&exlo); ++cleanup: ++ DC_vFinishBlit(DCDest, DCSrc); ++ if (UsesSource) ++ { ++ DC_UnlockDc(DCSrc); ++ } ++ DC_UnlockDc(DCDest); ++ if(psurfMask) SURFACE_ShareUnlockSurface(psurfMask); ++ ++ return Status; +} + +BOOL +APIENTRY +NtGdiPlgBlt( + IN HDC hdcTrg, + IN LPPOINT pptlTrg, + IN HDC hdcSrc, + IN INT xSrc, + IN INT ySrc, + IN INT cxSrc, + IN INT cySrc, + IN HBITMAP hbmMask, + IN INT xMask, + IN INT yMask, + IN DWORD crBackColor) +{ + UNIMPLEMENTED; + return FALSE; +} + +BOOL APIENTRY +GreStretchBltMask( + HDC hDCDest, + INT XOriginDest, + INT YOriginDest, + INT WidthDest, + INT HeightDest, + HDC hDCSrc, + INT XOriginSrc, + INT YOriginSrc, + INT WidthSrc, + INT HeightSrc, + DWORD ROP, + IN DWORD dwBackColor, + HDC hDCMask, + INT XOriginMask, + INT YOriginMask) +{ + PDC DCDest; + PDC DCSrc = NULL; + PDC DCMask = NULL; + HDC ahDC[3]; + PGDIOBJ apObj[3]; + PDC_ATTR pdcattr; + SURFACE *BitmapDest, *BitmapSrc = NULL; + SURFACE *BitmapMask = NULL; + RECTL DestRect; + RECTL SourceRect; + POINTL MaskPoint; + BOOL Status = FALSE; + EXLATEOBJ exlo; + XLATEOBJ *XlateObj = NULL; + POINTL BrushOrigin; - BOOL UsesSource = ROP3_USES_SOURCE(ROP); ++ BOOL UsesSource; ++ BOOL UsesMask; ++ ++ FIXUP_ROP(ROP); ++ UsesSource = ROP_USES_SOURCE(ROP); ++ UsesMask = ROP_USES_MASK(ROP); + + if (0 == WidthDest || 0 == HeightDest || 0 == WidthSrc || 0 == HeightSrc) + { + EngSetLastError(ERROR_INVALID_PARAMETER); + return TRUE; + } + - DPRINT("Locking DCs\n"); - ahDC[0] = hDCDest; - ahDC[1] = hDCSrc ; - ahDC[2] = hDCMask ; - GDIOBJ_LockMultipleObjs(3, ahDC, apObj); - DCDest = apObj[0]; - DCSrc = apObj[1]; - DCMask = apObj[2]; ++ if (!hDCDest || (UsesSource && !hDCSrc) || (UsesMask && !hDCMask)) ++ { ++ EngSetLastError(ERROR_INVALID_PARAMETER); ++ return FALSE; ++ } + - if (NULL == DCDest) ++ ahDC[0] = hDCDest; ++ ahDC[1] = UsesSource ? hDCSrc : NULL; ++ ahDC[2] = UsesMask ? hDCMask : NULL; ++ if (!GDIOBJ_bLockMultipleObjects(3, ahDC, apObj, GDIObjType_DC_TYPE)) + { - if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject); - DPRINT("Invalid destination dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCDest); ++ DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hDCDest, hDCSrc); ++ EngSetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } ++ DCDest = apObj[0]; ++ DCSrc = apObj[1]; ++ DCMask = apObj[2]; + + if (DCDest->dctype == DC_TYPE_INFO) + { - if(DCSrc) GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); ++ if(DCSrc) GDIOBJ_vUnlockObject(&DCSrc->BaseObject); ++ if(DCMask) GDIOBJ_vUnlockObject(&DCMask->BaseObject); ++ GDIOBJ_vUnlockObject(&DCDest->BaseObject); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } + + if (UsesSource) + { - if (NULL == DCSrc) - { - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); - if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject); - DPRINT("Invalid source dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCSrc); - return FALSE; - } + if (DCSrc->dctype == DC_TYPE_INFO) + { - GDIOBJ_UnlockObjByPtr(&DCDest->BaseObject); - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - if(DCMask) GDIOBJ_UnlockObjByPtr(&DCMask->BaseObject); ++ GDIOBJ_vUnlockObject(&DCDest->BaseObject); ++ GDIOBJ_vUnlockObject(&DCSrc->BaseObject); ++ if(DCMask) GDIOBJ_vUnlockObject(&DCMask->BaseObject); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } + } - else if(DCSrc) - { - DPRINT1("Getting a valid Source handle without using source!!!\n"); - GDIOBJ_UnlockObjByPtr(&DCSrc->BaseObject); - DCSrc = NULL ; - } + + pdcattr = DCDest->pdcattr; + + DestRect.left = XOriginDest; + DestRect.top = YOriginDest; + DestRect.right = XOriginDest+WidthDest; + DestRect.bottom = YOriginDest+HeightDest; + IntLPtoDP(DCDest, (LPPOINT)&DestRect, 2); + + DestRect.left += DCDest->ptlDCOrig.x; + DestRect.top += DCDest->ptlDCOrig.y; + DestRect.right += DCDest->ptlDCOrig.x; + DestRect.bottom += DCDest->ptlDCOrig.y; + + SourceRect.left = XOriginSrc; + SourceRect.top = YOriginSrc; + SourceRect.right = XOriginSrc+WidthSrc; + SourceRect.bottom = YOriginSrc+HeightSrc; + + if (UsesSource) + { + IntLPtoDP(DCSrc, (LPPOINT)&SourceRect, 2); + + SourceRect.left += DCSrc->ptlDCOrig.x; + SourceRect.top += DCSrc->ptlDCOrig.y; + SourceRect.right += DCSrc->ptlDCOrig.x; + SourceRect.bottom += DCSrc->ptlDCOrig.y; + } + + BrushOrigin.x = 0; + BrushOrigin.y = 0; + + /* Only prepare Source and Dest, hdcMask represents a DIB */ + DC_vPrepareDCsForBlit(DCDest, DestRect, DCSrc, SourceRect); + + if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) + DC_vUpdateFillBrush(DCDest); + + /* Determine surfaces to be used in the bitblt */ + BitmapDest = DCDest->dclevel.pSurface; + if (BitmapDest == NULL) + goto failed; + if (UsesSource) + { + BitmapSrc = DCSrc->dclevel.pSurface; + if (BitmapSrc == NULL) + goto failed; + + /* Create the XLATEOBJ. */ + EXLATEOBJ_vInitXlateFromDCs(&exlo, DCSrc, DCDest); + XlateObj = &exlo.xlo; + } + + /* Offset the brush */ + BrushOrigin.x += DCDest->ptlDCOrig.x; + BrushOrigin.y += DCDest->ptlDCOrig.y; + + /* Make mask surface for source surface */ + if (BitmapSrc && DCMask) + { + BitmapMask = DCMask->dclevel.pSurface; + if (BitmapMask && + (BitmapMask->SurfObj.sizlBitmap.cx < WidthSrc || + BitmapMask->SurfObj.sizlBitmap.cy < HeightSrc)) + { + DPRINT1("%dx%d mask is smaller than %dx%d bitmap\n", + BitmapMask->SurfObj.sizlBitmap.cx, BitmapMask->SurfObj.sizlBitmap.cy, + WidthSrc, HeightSrc); + EXLATEOBJ_vCleanup(&exlo); + goto failed; + } + /* Create mask offset point */ + MaskPoint.x = XOriginMask; + MaskPoint.y = YOriginMask; + IntLPtoDP(DCMask, &MaskPoint, 1); + MaskPoint.x += DCMask->ptlDCOrig.x; + MaskPoint.y += DCMask->ptlDCOrig.x; + } + + /* Perform the bitblt operation */ + Status = IntEngStretchBlt(&BitmapDest->SurfObj, + &BitmapSrc->SurfObj, + BitmapMask ? &BitmapMask->SurfObj : NULL, + DCDest->rosdc.CombinedClip, + XlateObj, + &DestRect, + &SourceRect, + BitmapMask ? &MaskPoint : NULL, + &DCDest->eboFill.BrushObject, + &BrushOrigin, - ROP3_TO_ROP4(ROP)); ++ ROP_TO_ROP4(ROP)); + if (UsesSource) + { + EXLATEOBJ_vCleanup(&exlo); + } + +failed: + DC_vFinishBlit(DCDest, DCSrc); + if (UsesSource) + { + DC_UnlockDc(DCSrc); + } + if (DCMask) + { + DC_UnlockDc(DCMask); + } + DC_UnlockDc(DCDest); + + return Status; +} + + +BOOL APIENTRY +NtGdiStretchBlt( + HDC hDCDest, + INT XOriginDest, + INT YOriginDest, + INT WidthDest, + INT HeightDest, + HDC hDCSrc, + INT XOriginSrc, + INT YOriginSrc, + INT WidthSrc, + INT HeightSrc, + DWORD ROP, + IN DWORD dwBackColor) +{ + return GreStretchBltMask( + hDCDest, + XOriginDest, + YOriginDest, + WidthDest, + HeightDest, + hDCSrc, + XOriginSrc, + YOriginSrc, + WidthSrc, + HeightSrc, + ROP, + dwBackColor, + NULL, + 0, + 0); +} + + +BOOL FASTCALL +IntPatBlt( + PDC pdc, + INT XLeft, + INT YLeft, + INT Width, + INT Height, + DWORD dwRop, + PBRUSH pbrush) +{ + RECTL DestRect; + SURFACE *psurf; + EBRUSHOBJ eboFill ; + POINTL BrushOrigin; + BOOL ret; + + ASSERT(pbrush); + ++ FIXUP_ROP(dwRop); ++ + if (pbrush->flAttrs & GDIBRUSH_IS_NULL) + { + return TRUE; + } + + if (Width > 0) + { + DestRect.left = XLeft; + DestRect.right = XLeft + Width; + } + else + { + DestRect.left = XLeft + Width + 1; + DestRect.right = XLeft + 1; + } + + if (Height > 0) + { + DestRect.top = YLeft; + DestRect.bottom = YLeft + Height; + } + else + { + DestRect.top = YLeft + Height + 1; + DestRect.bottom = YLeft + 1; + } + + IntLPtoDP(pdc, (LPPOINT)&DestRect, 2); + + DestRect.left += pdc->ptlDCOrig.x; + DestRect.top += pdc->ptlDCOrig.y; + DestRect.right += pdc->ptlDCOrig.x; + DestRect.bottom += pdc->ptlDCOrig.y; + + BrushOrigin.x = pbrush->ptOrigin.x + pdc->ptlDCOrig.x; + BrushOrigin.y = pbrush->ptOrigin.y + pdc->ptlDCOrig.y; + + DC_vPrepareDCsForBlit(pdc, DestRect, NULL, DestRect); + + psurf = pdc->dclevel.pSurface; + + if (pdc->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) + DC_vUpdateFillBrush(pdc); + + EBRUSHOBJ_vInit(&eboFill, pbrush, pdc); + + ret = IntEngBitBlt( + &psurf->SurfObj, + NULL, + NULL, + pdc->rosdc.CombinedClip, + NULL, + &DestRect, + NULL, + NULL, + &eboFill.BrushObject, + &BrushOrigin, - ROP3_TO_ROP4(dwRop)); ++ ROP_TO_ROP4(dwRop)); + + DC_vFinishBlit(pdc, NULL); + + EBRUSHOBJ_vCleanup(&eboFill); + + return ret; +} + +BOOL FASTCALL +IntGdiPolyPatBlt( + HDC hDC, + DWORD dwRop, + PPATRECT pRects, + INT cRects, + ULONG Reserved) +{ + INT i; + PBRUSH pbrush; + PDC pdc; + + pdc = DC_LockDc(hDC); + if (!pdc) + { + EngSetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + if (pdc->dctype == DC_TYPE_INFO) + { + DC_UnlockDc(pdc); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } + + for (i = 0; i < cRects; i++) + { - pbrush = BRUSH_LockBrush(pRects->hBrush); ++ pbrush = BRUSH_ShareLockBrush(pRects->hBrush); + if(pbrush != NULL) + { + IntPatBlt( + pdc, + pRects->r.left, + pRects->r.top, + pRects->r.right, + pRects->r.bottom, + dwRop, + pbrush); - BRUSH_UnlockBrush(pbrush); ++ BRUSH_ShareUnlockBrush(pbrush); + } + pRects++; + } + + DC_UnlockDc(pdc); + + return TRUE; +} + + +BOOL APIENTRY +NtGdiPatBlt( + HDC hDC, + INT XLeft, + INT YLeft, + INT Width, + INT Height, + DWORD ROP) +{ + PBRUSH pbrush; + DC *dc; + PDC_ATTR pdcattr; + BOOL ret; + - BOOL UsesSource = ROP3_USES_SOURCE(ROP); ++ BOOL UsesSource = ROP_USES_SOURCE(ROP); + if (UsesSource) + { + /* in this case we call on GdiMaskBlt */ + return NtGdiMaskBlt(hDC, XLeft, YLeft, Width, Height, 0,0,0,0,0,0,ROP,0); + } + + dc = DC_LockDc(hDC); + if (dc == NULL) + { + EngSetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + if (dc->dctype == DC_TYPE_INFO) + { + DC_UnlockDc(dc); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } + + pdcattr = dc->pdcattr; + + if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) + DC_vUpdateFillBrush(dc); + - pbrush = BRUSH_LockBrush(pdcattr->hbrush); ++ pbrush = BRUSH_ShareLockBrush(pdcattr->hbrush); + if (pbrush == NULL) + { + EngSetLastError(ERROR_INVALID_HANDLE); + DC_UnlockDc(dc); + return FALSE; + } + + ret = IntPatBlt(dc, XLeft, YLeft, Width, Height, ROP, pbrush); + - BRUSH_UnlockBrush(pbrush); ++ BRUSH_ShareUnlockBrush(pbrush); + DC_UnlockDc(dc); + + return ret; +} + +BOOL APIENTRY +NtGdiPolyPatBlt( + HDC hDC, + DWORD dwRop, + IN PPOLYPATBLT pRects, + IN DWORD cRects, + IN DWORD Mode) +{ + PPATRECT rb = NULL; + NTSTATUS Status = STATUS_SUCCESS; + BOOL Ret; + + if (cRects > 0) + { + rb = ExAllocatePoolWithTag(PagedPool, sizeof(PATRECT) * cRects, GDITAG_PLGBLT_DATA); + if (!rb) + { + EngSetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + _SEH2_TRY + { + ProbeForRead(pRects, + cRects * sizeof(PATRECT), + 1); + RtlCopyMemory(rb, + pRects, + cRects * sizeof(PATRECT)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + + if (!NT_SUCCESS(Status)) + { + ExFreePoolWithTag(rb, GDITAG_PLGBLT_DATA); + SetLastNtError(Status); + return FALSE; + } + } + + Ret = IntGdiPolyPatBlt(hDC, dwRop, rb, cRects, Mode); + + if (cRects > 0) + ExFreePoolWithTag(rb, GDITAG_PLGBLT_DATA); + + return Ret; +} diff --cc subsystems/win32/win32k/objects/drawing.c index 351c081731a,794a6d0c0b5..794a6d0c0b5 mode 100755,100644..100644 --- a/subsystems/win32/win32k/objects/drawing.c +++ b/subsystems/win32/win32k/objects/drawing.c diff --cc subsystems/win32/win32k/objects/gdipool.c index 00000000000,2c9862b365d..2c9862b365d mode 000000,100644..100644 --- a/subsystems/win32/win32k/objects/gdipool.c +++ b/subsystems/win32/win32k/objects/gdipool.c diff --cc toolchain-msvc.cmake index 506fda90155,00000000000..5fd24fe2a4e mode 100644,000000..100644 --- a/toolchain-msvc.cmake +++ b/toolchain-msvc.cmake @@@ -1,26 -1,0 +1,20 @@@ + +# the name of the target operating system +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR i686) + +# which compilers to use for C and C++ +set(CMAKE_C_COMPILER cl) +set(CMAKE_CXX_COMPILER cl) +set(CMAKE_RC_COMPILER rc) +if(${ARCH} MATCHES amd64) + set(CMAKE_ASM_COMPILER ml64) +else() + set(CMAKE_ASM_COMPILER ml) +endif() + - set(CMAKE_RC_COMPILE_OBJECT " /I${REACTOS_SOURCE_DIR}/include/psdk /I${REACTOS_BINARY_DIR}/include/psdk /I${REACTOS_SOURCE_DIR}/include /I${REACTOS_SOURCE_DIR}/include/reactos /I${REACTOS_BINARY_DIR}/include/reactos /I${REACTOS_SOURCE_DIR}/include/reactos/wine /I${REACTOS_SOURCE_DIR}/include/crt /I${REACTOS_SOURCE_DIR}/include/crt/mingw32 /fo ") - - set(CMAKE_ASM_COMPILE_OBJECT - " /nologo /X /I${REACTOS_SOURCE_DIR}/include/asm /I${REACTOS_BINARY_DIR}/include/asm /D__ASM__ /D_USE_ML /EP /c > .tmp" - " /nologo /Cp /Fo /c /Ta .tmp") - +set(CMAKE_C_STANDARD_LIBRARIES "" CACHE INTERNAL "") + +if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86") + add_definitions(-D__i386__) +endif() diff --cc tools/CMakeLists.txt index 00000000000,7110733642e..7110733642e mode 000000,100644..100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt diff --cc tools/cabman/cabinet.cxx index 00000000000,7cc8bd5dd5b..7cc8bd5dd5b mode 000000,100644..100644 --- a/tools/cabman/cabinet.cxx +++ b/tools/cabman/cabinet.cxx diff --cc tools/cabman/cabinet.h index 00000000000,cf62ae91157..cf62ae91157 mode 000000,100644..100644 --- a/tools/cabman/cabinet.h +++ b/tools/cabman/cabinet.h diff --cc tools/cabman/cabman.h index 00000000000,0c887cb0daf..0c887cb0daf mode 000000,100644..100644 --- a/tools/cabman/cabman.h +++ b/tools/cabman/cabman.h diff --cc tools/cabman/dff.txt index 00000000000,a400e0a652e..a400e0a652e mode 000000,100644..100644 --- a/tools/cabman/dff.txt +++ b/tools/cabman/dff.txt diff --cc tools/cabman/dfp.cxx index 00000000000,72e14fdcd85..72e14fdcd85 mode 000000,100644..100644 --- a/tools/cabman/dfp.cxx +++ b/tools/cabman/dfp.cxx diff --cc tools/cabman/dfp.h index 00000000000,bf50caac230..bf50caac230 mode 000000,100644..100644 --- a/tools/cabman/dfp.h +++ b/tools/cabman/dfp.h diff --cc tools/cabman/main.cxx index 00000000000,88f0f151ad2..88f0f151ad2 mode 000000,100644..100644 --- a/tools/cabman/main.cxx +++ b/tools/cabman/main.cxx diff --cc tools/cabman/makefile.win32 index 00000000000,fca4c8e2645..fca4c8e2645 mode 000000,100644..100644 --- a/tools/cabman/makefile.win32 +++ b/tools/cabman/makefile.win32 diff --cc tools/cabman/mszip.cxx index 00000000000,45e87f1c06a..45e87f1c06a mode 000000,100644..100644 --- a/tools/cabman/mszip.cxx +++ b/tools/cabman/mszip.cxx diff --cc tools/cabman/mszip.h index 00000000000,da5c59f0a8e..da5c59f0a8e mode 000000,100644..100644 --- a/tools/cabman/mszip.h +++ b/tools/cabman/mszip.h diff --cc tools/cabman/raw.cxx index 00000000000,bf4b0fe9871..bf4b0fe9871 mode 000000,100644..100644 --- a/tools/cabman/raw.cxx +++ b/tools/cabman/raw.cxx diff --cc tools/cabman/raw.h index 00000000000,0b79efb7cd9..0b79efb7cd9 mode 000000,100644..100644 --- a/tools/cabman/raw.h +++ b/tools/cabman/raw.h diff --cc tools/cdmake/cdmake.c index 00000000000,4f6ff6488b0..4f6ff6488b0 mode 000000,100644..100644 --- a/tools/cdmake/cdmake.c +++ b/tools/cdmake/cdmake.c diff --cc tools/kbdtool/kbdtool.h index 00000000000,7ccac685927..7ccac685927 mode 000000,100644..100644 --- a/tools/kbdtool/kbdtool.h +++ b/tools/kbdtool/kbdtool.h diff --cc tools/mkhive/CMakeLists.txt index 00000000000,13e04297c1d..13e04297c1d mode 000000,100644..100644 --- a/tools/mkhive/CMakeLists.txt +++ b/tools/mkhive/CMakeLists.txt diff --cc tools/mkhive/mkhive.h index 00000000000,eb45beee6c4..eb45beee6c4 mode 000000,100644..100644 --- a/tools/mkhive/mkhive.h +++ b/tools/mkhive/mkhive.h diff --cc tools/nandflash/nandflash.h index 00000000000,59f68448a75..59f68448a75 mode 000000,100644..100644 --- a/tools/nandflash/nandflash.h +++ b/tools/nandflash/nandflash.h diff --cc tools/obj2bin/CMakeLists.txt index 00000000000,83edc3254d7..83edc3254d7 mode 000000,100644..100644 --- a/tools/obj2bin/CMakeLists.txt +++ b/tools/obj2bin/CMakeLists.txt diff --cc tools/obj2bin/obj2bin.c index 00000000000,344a44ec519..344a44ec519 mode 000000,100644..100644 --- a/tools/obj2bin/obj2bin.c +++ b/tools/obj2bin/obj2bin.c diff --cc tools/pecoff.h index 00000000000,ff0bfdf3e36..ff0bfdf3e36 mode 000000,100644..100644 --- a/tools/pecoff.h +++ b/tools/pecoff.h diff --cc tools/pefixup.c index 00000000000,d6ec1f47700..d6ec1f47700 mode 000000,100644..100644 --- a/tools/pefixup.c +++ b/tools/pefixup.c diff --cc tools/rbuild_helper/argv_parser.h index 00000000000,97c506d12a9..97c506d12a9 mode 000000,100644..100644 --- a/tools/rbuild_helper/argv_parser.h +++ b/tools/rbuild_helper/argv_parser.h diff --cc tools/rbuild_helper/null_output_iterator.h index 00000000000,43b960f6ed5..43b960f6ed5 mode 000000,100644..100644 --- a/tools/rbuild_helper/null_output_iterator.h +++ b/tools/rbuild_helper/null_output_iterator.h diff --cc tools/rbuild_helper/rbuild_helper.cpp index 00000000000,2d374b6dfac..2d374b6dfac mode 000000,100644..100644 --- a/tools/rbuild_helper/rbuild_helper.cpp +++ b/tools/rbuild_helper/rbuild_helper.cpp diff --cc tools/rbuild_helper/stringz_iterator.h index 00000000000,d84fae12087..d84fae12087 mode 000000,100644..100644 --- a/tools/rbuild_helper/stringz_iterator.h +++ b/tools/rbuild_helper/stringz_iterator.h diff --cc tools/rgenstat/llmosrt.c index 00000000000,ef2e1794b79..ef2e1794b79 mode 000000,100644..100644 --- a/tools/rgenstat/llmosrt.c +++ b/tools/rgenstat/llmosrt.c diff --cc tools/rgenstat/rgenstat.c index 00000000000,a62116238a8..a62116238a8 mode 000000,100644..100644 --- a/tools/rgenstat/rgenstat.c +++ b/tools/rgenstat/rgenstat.c diff --cc tools/rgenstat/web/c.gif index 00000000000,08f00d4ea11..08f00d4ea11 mode 000000,100644..100644 Binary files differ diff --cc tools/rgenstat/web/f.gif index 00000000000,75fe3586d48..75fe3586d48 mode 000000,100644..100644 Binary files differ diff --cc tools/rgenstat/web/i.gif index 00000000000,2c8ca547929..2c8ca547929 mode 000000,100644..100644 Binary files differ diff --cc tools/rgenstat/web/rapistatus.css index 00000000000,a429226f4bb..a429226f4bb mode 000000,100644..100644 --- a/tools/rgenstat/web/rapistatus.css +++ b/tools/rgenstat/web/rapistatus.css diff --cc tools/rgenstat/web/rapistatus.js index 00000000000,0657dbd4604..0657dbd4604 mode 000000,100644..100644 --- a/tools/rgenstat/web/rapistatus.js +++ b/tools/rgenstat/web/rapistatus.js diff --cc tools/rgenstat/web/rapistatus.xsl index 00000000000,4eb01432956..4eb01432956 mode 000000,100644..100644 --- a/tools/rgenstat/web/rapistatus.xsl +++ b/tools/rgenstat/web/rapistatus.xsl diff --cc tools/rgenstat/web/sc.gif index 00000000000,b02afd9b2e0..b02afd9b2e0 mode 000000,100644..100644 Binary files differ diff --cc tools/rgenstat/web/tb.gif index 00000000000,ee68c5a356b..ee68c5a356b mode 000000,100644..100644 Binary files differ diff --cc tools/rgenstat/web/tm.gif index 00000000000,3c8f18aecea..3c8f18aecea mode 000000,100644..100644 Binary files differ diff --cc tools/rgenstat/web/tp.gif index 00000000000,8b7435361b7..8b7435361b7 mode 000000,100644..100644 Binary files differ diff --cc tools/rgenstat/web/u.gif index 00000000000,0c7194786d5..0c7194786d5 mode 000000,100644..100644 Binary files differ diff --cc tools/rsym/CMakeLists.txt index 00000000000,d2fce2ab32a..d2fce2ab32a mode 000000,100644..100644 --- a/tools/rsym/CMakeLists.txt +++ b/tools/rsym/CMakeLists.txt diff --cc tools/rsym/rsym.cmake.c index 00000000000,a5160fac42e..a5160fac42e mode 000000,100644..100644 --- a/tools/rsym/rsym.cmake.c +++ b/tools/rsym/rsym.cmake.c diff --cc tools/rsym/rsym.h index 00000000000,6b91d6e6fed..6b91d6e6fed mode 000000,100644..100644 --- a/tools/rsym/rsym.h +++ b/tools/rsym/rsym.h diff --cc tools/unicode/CMakeLists.txt index 00000000000,39868c1e786..39868c1e786 mode 000000,100644..100644 --- a/tools/unicode/CMakeLists.txt +++ b/tools/unicode/CMakeLists.txt diff --cc tools/widl/hash.c index 00000000000,508d17131e2..508d17131e2 mode 000000,100644..100644 --- a/tools/widl/hash.c +++ b/tools/widl/hash.c diff --cc tools/widl/parser.tab.c index 00000000000,0166dbd56c8..0166dbd56c8 mode 000000,100644..100644 --- a/tools/widl/parser.tab.c +++ b/tools/widl/parser.tab.c diff --cc tools/widl/parser.y index 00000000000,d5f87f98291..d5f87f98291 mode 000000,100644..100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y diff --cc tools/widl/typelib.c index 00000000000,c9f9355ecb0..c9f9355ecb0 mode 000000,100644..100644 --- a/tools/widl/typelib.c +++ b/tools/widl/typelib.c diff --cc tools/widl/typelib_struct.h index 00000000000,95d174e6e1f..95d174e6e1f mode 000000,100644..100644 --- a/tools/widl/typelib_struct.h +++ b/tools/widl/typelib_struct.h diff --cc tools/widl/write_msft.c index 00000000000,6e7098a0415..6e7098a0415 mode 000000,100644..100644 --- a/tools/widl/write_msft.c +++ b/tools/widl/write_msft.c diff --cc tools/wmc/CMakeLists.txt index 00000000000,565a275b71e..565a275b71e mode 000000,100644..100644 --- a/tools/wmc/CMakeLists.txt +++ b/tools/wmc/CMakeLists.txt diff --cc tools/wmc/wmctypes.h index 00000000000,097a15ca4aa..097a15ca4aa mode 000000,100644..100644 --- a/tools/wmc/wmctypes.h +++ b/tools/wmc/wmctypes.h diff --cc tools/wpp/CMakeLists.txt index 00000000000,b8da62d8c35..b8da62d8c35 mode 000000,100644..100644 --- a/tools/wpp/CMakeLists.txt +++ b/tools/wpp/CMakeLists.txt diff --cc tools/wrc/CMakeLists.txt index 00000000000,c94abad88e4..c94abad88e4 mode 000000,100644..100644 --- a/tools/wrc/CMakeLists.txt +++ b/tools/wrc/CMakeLists.txt diff --cc tools/wrc/newstruc.c index 00000000000,da8fead55a1..da8fead55a1 mode 000000,100644..100644 --- a/tools/wrc/newstruc.c +++ b/tools/wrc/newstruc.c diff --cc tools/wrc/wrcrostypes.h index 00000000000,87802ff18af..87802ff18af mode 000000,100644..100644 --- a/tools/wrc/wrcrostypes.h +++ b/tools/wrc/wrcrostypes.h