diff --git a/reactos/ReactOS-generic.rbuild b/reactos/ReactOS-generic.rbuild
index fd5357025ec..7b1388b3099 100644
--- a/reactos/ReactOS-generic.rbuild
+++ b/reactos/ReactOS-generic.rbuild
@@ -91,10 +91,12 @@
-Wno-non-virtual-dtor
-gstabs+
-gstabs+
+ -m32 --win32
__inline
+ 1
/Zl
/Zi
/W1
diff --git a/reactos/ReactOS-i386.rbuild b/reactos/ReactOS-i386.rbuild
index 942d50685ba..5567697b398 100644
--- a/reactos/ReactOS-i386.rbuild
+++ b/reactos/ReactOS-i386.rbuild
@@ -24,13 +24,13 @@
-ftracer
-momit-leaf-frame-pointer
- -mpreferred-stack-boundary=2
-
+ -mpreferred-stack-boundary=2
+
-disable-stdcall-fixup
-
+
diff --git a/reactos/base/applications/applications.rbuild b/reactos/base/applications/applications.rbuild
index a323810cd81..c1b454a1bb9 100644
--- a/reactos/base/applications/applications.rbuild
+++ b/reactos/base/applications/applications.rbuild
@@ -97,4 +97,7 @@
+
+
+
diff --git a/reactos/base/applications/calc/lang/sk-SK.rc b/reactos/base/applications/calc/lang/sk-SK.rc
index 8deaddf2c15..78da4f1f319 100644
--- a/reactos/base/applications/calc/lang/sk-SK.rc
+++ b/reactos/base/applications/calc/lang/sk-SK.rc
@@ -1,6 +1,6 @@
/* TRANSLATOR : Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
* DATE OF TR.: 30-01-2008
- * LAST CHANGE: 27-01-2009
+ * LAST CHANGE: 29-08-2009
* ---------------------------------------
* TODO:
* 1. treba usporiada jednotky poda abecedy
@@ -522,24 +522,24 @@ END
// TYPES OF CURRENCIES
STRINGTABLE DISCARDABLE
BEGIN
+ IDS_CURRENCY_AUSTRIAN_SCHILLING "Rakzsky iling"
IDS_CURRENCY_BELGIAN_FRANC "Belgick frank"
IDS_CURRENCY_CYPRIOT_POUND "Cypersk libra"
IDS_CURRENCY_CZECH_KORUNA "esk koruna"
+ IDS_CURRENCY_DEUTSCHE_MARK "Nemeck marka"
+ IDS_CURRENCY_DUTCH_GUILDER "Holandsk gulden"
IDS_CURRENCY_EURO "Euro"
IDS_CURRENCY_FINNISH_MARKKA "Finsk marka"
IDS_CURRENCY_FRENCH_FRANC "Franczsky frank"
IDS_CURRENCY_GREEK_DRACHMA "Grcka drachma"
- IDS_CURRENCY_DUTCH_GUILDER "Holandsk gulden"
IDS_CURRENCY_IRISH_POUND "Irish pound"
+ IDS_CURRENCY_ITALIAN_LIRA "Italian lira"
IDS_CURRENCY_LUXEMBOURG_FRANC "Luxembourg franc"
IDS_CURRENCY_MALTESE_LIRA "Maltese lira"
- IDS_CURRENCY_DEUTSCHE_MARK "Nemeck marka"
IDS_CURRENCY_PORTOGUESE_ESCUDO "Portoguese escudo"
- IDS_CURRENCY_AUSTRIAN_SCHILLING "Rakzsky iling"
IDS_CURRENCY_SLOVAK_KORUNA "Slovensk koruna"
IDS_CURRENCY_SLOVENIAN_TOLAR "Slovinsk toliar"
IDS_CURRENCY_SPANISH_PESETA "panielska peseta"
- IDS_CURRENCY_ITALIAN_LIRA "Talianska lra"
END
// TYPES OF ENERGIES
@@ -571,10 +571,14 @@ BEGIN
IDS_LENGTH_CHOU "Chou"
IDS_LENGTH_CHR "Chr"
IDS_LENGTH_CUN "Cun"
+ IDS_LENGTH_FATHOMS "Siahy"
+ IDS_LENGTH_FATHOMS_HUNGARY "Siahy (Maarsko)"
+ IDS_LENGTH_FEET "Stopy"
IDS_LENGTH_FURLONGS "Furlongs"
IDS_LENGTH_GAN "Gan"
IDS_LENGTH_HANDS "Hands"
IDS_LENGTH_HUNH "Hunh"
+ IDS_LENGTH_INCHES "Palce"
IDS_LENGTH_JA "Ja"
IDS_LENGTH_JEONG "Jeong"
IDS_LENGTH_KABIET "Kabiet"
@@ -582,6 +586,7 @@ BEGIN
IDS_LENGTH_KEUB "Keub"
IDS_LENGTH_KILOMETERS "Kilometre"
IDS_LENGTH_LAR "Lar"
+ IDS_LENGTH_LIGHT_YEARS "Sveteln roky"
IDS_LENGTH_LINKS_UK "Links (UK)"
IDS_LENGTH_METERS "Metre"
IDS_LENGTH_MICRONS "Mikrny"
@@ -589,7 +594,6 @@ BEGIN
IDS_LENGTH_MILLIMETERS "Milimetre"
IDS_LENGTH_NAUTICAL_MILES "Nmorn mle"
IDS_LENGTH_NIEU "Nieu"
- IDS_LENGTH_INCHES "Palce"
IDS_LENGTH_PARSECS "Parsecy"
IDS_LENGTH_PICAS "Picas"
IDS_LENGTH_RI_JAPAN "Ri (Japonsko)"
@@ -598,12 +602,8 @@ BEGIN
IDS_LENGTH_SAWK "Sawk"
IDS_LENGTH_SEN "Sen"
IDS_LENGTH_SHAKU "Shaku"
- IDS_LENGTH_FATHOMS "Siahy"
- IDS_LENGTH_FATHOMS_HUNGARY "Siahy (Maarsko)"
IDS_LENGTH_SPAN "Span"
- IDS_LENGTH_FEET "Stopy"
IDS_LENGTH_SUN "Sun"
- IDS_LENGTH_LIGHT_YEARS "Sveteln roky"
IDS_LENGTH_TSUEN "Tsuen"
IDS_LENGTH_VA "Va"
IDS_LENGTH_YARDS "Yardy"
@@ -616,8 +616,8 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_POWER_BTUS_PER_MINUTE "Britsk termlne jednotky za mintu"
IDS_POWER_FPS_PER_MINUTE "Foot-Pounds za mintu"
- IDS_POWER_KILOWATTS "Kilowatty"
IDS_POWER_HORSEPOWER "Kosk sily"
+ IDS_POWER_KILOWATTS "Kilowatty"
IDS_POWER_MEGAWATTS "Megawatty"
IDS_POWER_WATTS "Watty"
END
@@ -629,9 +629,9 @@ BEGIN
IDS_PRESSURE_BARS "Bary"
IDS_PRESSURE_HECTOPASCALS "Hektopascals"
IDS_PRESSURE_KILOPASCALS "Kilopascals"
- IDS_PRESSURE_PSI "Libry na tvorcov palec"
IDS_PRESSURE_MM_OF_MERCURY "Millimeters of mercury"
IDS_PRESSURE_PASCALS "Pascals"
+ IDS_PRESSURE_PSI "Libry na tvorcov palec"
END
// TYPES OF TEMPERATURES
@@ -651,8 +651,8 @@ BEGIN
IDS_TIME_MICROSECONDS "Mikrosekundy"
IDS_TIME_MILLISECONDS "Milisekundy"
IDS_TIME_MINUTES "Minty"
- IDS_TIME_YEARS "Roky"
IDS_TIME_SECONDS "Sekundy"
+ IDS_TIME_YEARS "Roky"
IDS_TIME_WEEKS "Tdne"
END
@@ -660,13 +660,13 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_VELOCITY_CMS_SECOND "Centimetre/hodinu"
+ IDS_VELOCITY_FEET_HOUR "Stopy/hodinu"
+ IDS_VELOCITY_FEET_SECOND "Stopy/sekundu"
IDS_VELOCITY_KILOMETERS_HOUR "Kilometre/hodinu"
IDS_VELOCITY_KNOTS "Knots"
IDS_VELOCITY_MACH "Mach"
IDS_VELOCITY_METERS_SECOND "Metre/sekundu"
IDS_VELOCITY_MILES_HOUR "Mle/hodinu"
- IDS_VELOCITY_FEET_HOUR "Stopy/hodinu"
- IDS_VELOCITY_FEET_SECOND "Stopy/sekundu"
END
// TYPES OF VOLUMES
@@ -677,6 +677,11 @@ BEGIN
IDS_VOLUME_BUN "Bun"
IDS_VOLUME_BUSHELS_UK "Buely (UK)" //Buel, Bule? Buly?
IDS_VOLUME_BUSHELS_US "Buely (USA)"
+ IDS_VOLUME_CUBIC_CENTIMETERS "Kubick centimetre"
+ IDS_VOLUME_CUBIC_FEET "Kubick stopy"
+ IDS_VOLUME_CUBIC_INCHES "Kubick palce"
+ IDS_VOLUME_CUBIC_METERS "Kubick metre"
+ IDS_VOLUME_CUBIC_YARDS "Kubick yardy"
IDS_VOLUME_DOE "Doe"
IDS_VOLUME_FLUID_OUNCES_UK "Fluid ounces (UK)"
IDS_VOLUME_FLUID_OUNCES_US "Fluid ounces (USA)"
@@ -686,11 +691,6 @@ BEGIN
IDS_VOLUME_GOU "Gou"
IDS_VOLUME_HOP "Hop"
IDS_VOLUME_ICCE "Icce"
- IDS_VOLUME_CUBIC_CENTIMETERS "Kubick centimetre"
- IDS_VOLUME_CUBIC_FEET "Kubick stopy"
- IDS_VOLUME_CUBIC_INCHES "Kubick palce"
- IDS_VOLUME_CUBIC_METERS "Kubick metre"
- IDS_VOLUME_CUBIC_YARDS "Kubick yardy"
IDS_VOLUME_KWIAN "Kwian"
IDS_VOLUME_LITERS "Litre"
IDS_VOLUME_MAL "Mal"
@@ -712,7 +712,7 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_WEIGHT_BAHT "Baht"
- IDS_WEIGHT_QUINTAL_METRIC "Cent (metrick)"
+ IDS_WEIGHT_CARATS "Karty"
IDS_WEIGHT_CHUNG "Chung"
IDS_WEIGHT_DON "Don"
IDS_WEIGHT_GEUN "Geun"
@@ -722,19 +722,19 @@ BEGIN
IDS_WEIGHT_JIN_CHINA "Jin (na)"
IDS_WEIGHT_JIN_TAIWAN "Jin (Tchajvan)"
IDS_WEIGHT_KAN "Kan"
- IDS_WEIGHT_CARATS "Karty"
IDS_WEIGHT_KILOGRAMS "Kilogramy"
IDS_WEIGHT_KIN "Kin"
IDS_WEIGHT_LIANG_CHINA "Liang (na)"
IDS_WEIGHT_LIANG_TAIWAN "Liang (Tchajvan)"
- IDS_WEIGHT_POUNDS "Libry"
IDS_WEIGHT_MONME "Monme"
+ IDS_WEIGHT_OUNCES_AVOIRDUPOIS "Unce, anglosask"
+ IDS_WEIGHT_OUNCES_TROY "Unce, trjska"
+ IDS_WEIGHT_POUNDS "Libry"
+ IDS_WEIGHT_QUINTAL_METRIC "Cent (metrick)"
IDS_WEIGHT_SALOUNG "Saloung"
IDS_WEIGHT_STONES "Stones"
IDS_WEIGHT_TAMLUNG "Tamlung"
IDS_WEIGHT_TONNES "Tony"
IDS_WEIGHT_TONS_UK "Tony (UK)"
IDS_WEIGHT_TONS_US "Tony (USA)"
- IDS_WEIGHT_OUNCES_AVOIRDUPOIS "Unce, anglosask"
- IDS_WEIGHT_OUNCES_TROY "Unce, trjska"
END
diff --git a/reactos/base/applications/cmdutils/doskey/doskey.c b/reactos/base/applications/cmdutils/doskey/doskey.c
index e87662235c9..0e597a44268 100644
--- a/reactos/base/applications/cmdutils/doskey/doskey.c
+++ b/reactos/base/applications/cmdutils/doskey/doskey.c
@@ -19,15 +19,27 @@ static VOID SetInsert(DWORD dwFlag)
static VOID PrintHistory(VOID)
{
DWORD Length = GetConsoleCommandHistoryLength(pszExeName);
+ DWORD BufferLength;
+ PBYTE HistBuf;
+ TCHAR *Hist;
+ TCHAR *HistEnd;
+
/* On Windows, the ANSI version of GetConsoleCommandHistory requires
* a buffer twice as large as the actual history length. */
- BYTE HistBuf[Length * (sizeof(WCHAR) / sizeof(TCHAR))];
- TCHAR *Hist = (TCHAR *)HistBuf;
- TCHAR *HistEnd = (TCHAR *)&HistBuf[Length];
+ BufferLength = Length * (sizeof(WCHAR) / sizeof(TCHAR)) * sizeof(BYTE);
- if (GetConsoleCommandHistory(Hist, sizeof HistBuf, pszExeName))
+ HistBuf = HeapAlloc(GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ BufferLength);
+ if (!HistBuf) return;
+ Hist = (TCHAR *)HistBuf;
+ HistEnd = (TCHAR *)&HistBuf[Length];
+
+ if (GetConsoleCommandHistory(Hist, BufferLength, pszExeName))
for (; Hist < HistEnd; Hist += _tcslen(Hist) + 1)
_tprintf(_T("%s\n"), Hist);
+
+ HeapFree(GetProcessHeap(), 0, HistBuf);
}
static INT SetMacro(LPTSTR definition)
@@ -65,23 +77,39 @@ static INT SetMacro(LPTSTR definition)
static VOID PrintMacros(LPTSTR pszExeName, LPTSTR Indent)
{
DWORD Length = GetConsoleAliasesLength(pszExeName);
- BYTE AliasBuf[Length];
- TCHAR *Alias = (TCHAR *)AliasBuf;
- TCHAR *AliasEnd = (TCHAR *)&AliasBuf[Length];
+ PBYTE AliasBuf;
+ TCHAR *Alias;
+ TCHAR *AliasEnd;
- if (GetConsoleAliases(Alias, sizeof AliasBuf, pszExeName))
+ AliasBuf = HeapAlloc(GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ Length * sizeof(BYTE));
+ if (!AliasBuf) return;
+ Alias = (TCHAR *)AliasBuf;
+ AliasEnd = (TCHAR *)&AliasBuf[Length];
+
+ if (GetConsoleAliases(Alias, Length * sizeof(BYTE), pszExeName))
for (; Alias < AliasEnd; Alias += _tcslen(Alias) + 1)
_tprintf(_T("%s%s\n"), Indent, Alias);
+
+ HeapFree(GetProcessHeap(), 0, AliasBuf);
}
static VOID PrintAllMacros(VOID)
{
DWORD Length = GetConsoleAliasExesLength();
- BYTE ExeNameBuf[Length];
- TCHAR *ExeName = (TCHAR *)ExeNameBuf;
- TCHAR *ExeNameEnd = (TCHAR *)&ExeNameBuf[Length];
+ PBYTE ExeNameBuf;
+ TCHAR *ExeName;
+ TCHAR *ExeNameEnd;
- if (GetConsoleAliasExes(ExeName, sizeof ExeNameBuf))
+ ExeNameBuf = HeapAlloc(GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ Length * sizeof(BYTE));
+ if (!ExeNameBuf) return;
+ ExeName = (TCHAR *)ExeNameBuf;
+ ExeNameEnd = (TCHAR *)&ExeNameBuf[Length];
+
+ if (GetConsoleAliasExes(ExeName, Length * sizeof(BYTE)))
{
for (; ExeName < ExeNameEnd; ExeName += _tcslen(ExeName) + 1)
{
@@ -90,6 +118,8 @@ static VOID PrintAllMacros(VOID)
_tprintf(_T("\n"));
}
}
+
+ HeapFree(GetProcessHeap(), 0, ExeNameBuf);
}
static VOID ReadFromFile(LPTSTR param)
diff --git a/reactos/base/applications/cmdutils/doskey/doskey.rc b/reactos/base/applications/cmdutils/doskey/doskey.rc
index c4f50320f13..2d2c30bfbaf 100644
--- a/reactos/base/applications/cmdutils/doskey/doskey.rc
+++ b/reactos/base/applications/cmdutils/doskey/doskey.rc
@@ -6,3 +6,4 @@
#include
#include "doskey.h"
#include "lang/en-US.rc"
+#include "lang/uk-UA.rc"
diff --git a/reactos/base/applications/cmdutils/doskey/lang/uk-UA.rc b/reactos/base/applications/cmdutils/doskey/lang/uk-UA.rc
new file mode 100644
index 00000000000..259f63b7db5
--- /dev/null
+++ b/reactos/base/applications/cmdutils/doskey/lang/uk-UA.rc
@@ -0,0 +1,35 @@
+/*
+ * PROJECT: ReactOS DOSKey
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/cmdutils/doskey/lang/uk-UA.rc
+ * PURPOSE: Ukraianian Language File for ReactOS DOSKey
+ * TRANSLATOR: Sakara Yevhen
+ */
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+
+STRINGTABLE DISCARDABLE
+BEGIN
+
+IDS_HELP, " , .\n\
+\n\
+DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\
+ [/REINSTALL] [/MACROS[:exe | :ALL]] [/MACROFILE=file] [macroname=[text]]\n\
+\n\
+ /INSERT .\n\
+ /OVERSTRIKE .\n\
+ /EXENAME=exename ' / \n\
+ . cmd.exe.\n\
+ /HISTORY ³ .\n\
+ /LISTSIZE=size .\n\
+ /REINSTALL .\n\
+ /MACROS ³ .\n\
+ /MACROS:exename ³ .\n\
+ /MACROS:ALL ³ .\n\
+ /MACROFILE=filename .\n\
+ macroname ' .\n\
+ text .\n"
+
+IDS_INVALID_MACRO_DEF, " : %s\n"
+
+END
diff --git a/reactos/base/applications/cmdutils/xcopy/De.rc b/reactos/base/applications/cmdutils/xcopy/De.rc
index c13addfdaaa..fed120e4536 100644
--- a/reactos/base/applications/cmdutils/xcopy/De.rc
+++ b/reactos/base/applications/cmdutils/xcopy/De.rc
@@ -80,3 +80,4 @@ Mit:\n\
\t\tQuelldateien kopiert, die neuer sind als die Zieldatei\n\n"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/cmdutils/xcopy/Fr.rc b/reactos/base/applications/cmdutils/xcopy/Fr.rc
index 047b4b3f739..b4e387eb17c 100644
--- a/reactos/base/applications/cmdutils/xcopy/Fr.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Fr.rc
@@ -81,3 +81,4 @@ où :\n\
\t\tque le fichier source\n\n"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/cmdutils/xcopy/Lt.rc b/reactos/base/applications/cmdutils/xcopy/Lt.rc
index 182a39ab246..f1254b61921 100644
--- a/reactos/base/applications/cmdutils/xcopy/Lt.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Lt.rc
@@ -29,18 +29,18 @@ LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
STRINGTABLE
{
STRING_INVPARMS, "Neteisingas parametrų skaičius - pagalba: xcopy /?\n"
- STRING_INVPARM, "Neteisingas parametras '%s' - pagalba: xcopy /?\n"
+ STRING_INVPARM, "Neteisingas parametras „%s“ - pagalba: xcopy /?\n"
STRING_PAUSE, "Spauskite kopijavimui pradėti\n"
STRING_SIMCOPY, "bus nukopijuota failų: %d\n"
STRING_COPY, "nukopijuota failų: %d\n"
- STRING_QISDIR, "Ar '%s' yra failas, ar katalogas,\n" \
+ STRING_QISDIR, "Ar „%s“ yra failas, ar katalogas,\n" \
"ar paskirtis?\n" \
"(F - failas, K - katalogas)\n"
STRING_SRCPROMPT,"%s? (Taip|Ne)\n"
STRING_OVERWRITE,"Perrašyti %s? (Taip|Ne|Visus)\n"
- STRING_COPYFAIL, "'%s' kopijavimas į '%s' nepavyko su r/c %d\n"
- STRING_OPENFAIL, "Nepavyko atverti '%s'\n"
- STRING_READFAIL, "Klaida skaitant '%s'\n"
+ STRING_COPYFAIL, "„%s“ kopijavimas į „%s“ nepavyko su r/c %d\n"
+ STRING_OPENFAIL, "Nepavyko atverti „%s“\n"
+ STRING_READFAIL, "Klaida skaitant „%s“\n"
STRING_YES_CHAR, "T"
STRING_NO_CHAR, "N"
STRING_ALL_CHAR, "V"
@@ -81,3 +81,4 @@ Kur:\n\
\t\tsenesnis už šaltinio failą\n\n"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/cmdutils/xcopy/Nl.rc b/reactos/base/applications/cmdutils/xcopy/Nl.rc
index b9db305843f..868475e958b 100644
--- a/reactos/base/applications/cmdutils/xcopy/Nl.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Nl.rc
@@ -21,6 +21,8 @@
#include "xcopy.h"
+#pragma code_page(65001)
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE
@@ -77,3 +79,4 @@ Parameters:\n\
\t\tdatum. Als geen detum wordt gegeven, copiëer alleen als bron nieuwer is.\n\n"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/cmdutils/xcopy/Ru.rc b/reactos/base/applications/cmdutils/xcopy/Ru.rc
index 398345713f7..4339e80dc72 100644
--- a/reactos/base/applications/cmdutils/xcopy/Ru.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Ru.rc
@@ -22,26 +22,29 @@
#include "xcopy.h"
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
STRINGTABLE
{
STRING_INVPARMS,
-" - 'xcopy /?' \n\
- .\n"
+"Недопустимое число параметров - попробуйте 'xcopy /?' для получения\n\
+подробного описания.\n"
STRING_INVPARM,
-" '%s' - 'xcopy /?' \n\
-.\n"
- STRING_PAUSE, " , .\n"
- STRING_SIMCOPY, "%d () .\n"
- STRING_COPY, "%d () .\n"
- STRING_QISDIR, "'%s' ?\n" \
- "(F - , D - )\n"
+"Недопустимый параметр '%s' - попробуйте 'xcopy /?' для получения подробного\n\
+описания.\n"
+ STRING_PAUSE, "Нажмите клавишу , чтобы начать копирование.\n"
+ STRING_SIMCOPY, "%d файл(ов) было бы скопировано.\n"
+ STRING_COPY, "%d файл(ов) скопировано.\n"
+ STRING_QISDIR, "'%s' является файлом или папкой?\n" \
+ "(F - Файл, D - Папка)\n"
STRING_SRCPROMPT,"%s? (Yes|No)\n"
- STRING_OVERWRITE," %s? (Yes|No|All)\n"
- STRING_COPYFAIL, " '%s' '%s' : %d\n"
- STRING_OPENFAIL, " '%s'\n"
- STRING_READFAIL, " '%s' \n"
+ STRING_OVERWRITE,"Переписать %s? (Yes|No|All)\n"
+ STRING_COPYFAIL, "При копировании '%s' в '%s' произошла ошибка: %d\n"
+ STRING_OPENFAIL, "Невозможно открыть '%s'\n"
+ STRING_READFAIL, "При чтении '%s' произошла ошибка\n"
STRING_YES_CHAR, "Y"
STRING_NO_CHAR, "N"
STRING_ALL_CHAR, "A"
@@ -49,35 +52,36 @@ STRINGTABLE
STRING_DIR_CHAR, "D"
STRING_HELP,
-"XCOPY - \n\
+"XCOPY - Копирует файлы и деревья папок\n\
\n\
-:\n\
+Синтаксис:\n\
XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\
\n\
-:\n\
+Где:\n\
\n\
-[/I] ,\n\
- .\n\
-[/S] .\n\
-[/E] , .\n\
-[/Q] .\n\
-[/F] .\n\
-[/L] , .\n\
-[/W] .\n\
-[/T] , .\n\
-[/Y] .\n\
-[/-Y] .\n\
-[/P] .\n\
-[/N] .\n\
-[/U] , .\n\
-[/R] , .\n\
-[/H] .\n\
-[/C] , .\n\
-[/A] , \"\".\n\
-[/M] , \"\",\n\
- .\n\
-[/D | /D:m-d-y] , \n\
- . , \n\
- , .\n"
+[/I] Если конечная папка отсутствует и копируется более одного файла,\n\
+ то предполагается папка в качестве места назначения.\n\
+[/S] Копирует папки и подпапки.\n\
+[/E] Копирует папки и подпапки, включая пустые.\n\
+[/Q] Не отображает имена копируемых файлов.\n\
+[/F] Отображает полные имена исходных и конечных файлов.\n\
+[/L] Выводит список файлов, которые будут скопированы.\n\
+[/W] Запрашивает подтверждение перед началом копирования.\n\
+[/T] Создает структуру папок, но не копирует файлы.\n\
+[/Y] Подавляет запрос на подтверждение перезаписи файлов.\n\
+[/-Y] Запрашивает подтверждение на перезапись файлов.\n\
+[/P] Запрашивает подтверждение для каждого копируемого файла.\n\
+[/N] Использует короткие имена файлов при копировании.\n\
+[/U] Копирует только те файлы, которые уже существуют в конечной папке.\n\
+[/R] Перезаписывает файлы, доступные только для чтения.\n\
+[/H] Копирует скрытые и системные файлы.\n\
+[/C] Продолжает работу, даже если произошла ошибка.\n\
+[/A] Копирует только те файлы, для которых установлен атрибут \"архивный\".\n\
+[/M] Копирует только те файлы, для которых установлен атрибут \"архивный\",\n\
+ при этом атрибут удаляется.\n\
+[/D | /D:m-d-y] Копирует только новые файлы или те, которые были изменены\n\
+ после указанной даты. Если дата не указана, копирует только\n\
+ те файлы, которые новее в исходной папке.\n"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/cmdutils/xcopy/Si.rc b/reactos/base/applications/cmdutils/xcopy/Si.rc
index 1013837f402..8e45d498b99 100644
--- a/reactos/base/applications/cmdutils/xcopy/Si.rc
+++ b/reactos/base/applications/cmdutils/xcopy/Si.rc
@@ -80,3 +80,4 @@ Where:\n\
\t\tod izvora\n\n"
}
+#pragma code_page(default)
diff --git a/reactos/include/reactos/wine/winnls.h b/reactos/base/applications/cmdutils/xcopy/rsrc.rc
similarity index 68%
rename from reactos/include/reactos/wine/winnls.h
rename to reactos/base/applications/cmdutils/xcopy/rsrc.rc
index dfc028ea47b..a62f34cf19a 100644
--- a/reactos/include/reactos/wine/winnls.h
+++ b/reactos/base/applications/cmdutils/xcopy/rsrc.rc
@@ -1,5 +1,5 @@
/*
- * Copyright (C) the Wine project
+ * Copyright 2007 Jason Edmeades
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -16,12 +16,23 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#ifndef __WINE_WINNLS_H
-#define __WINE_WINNLS_H
+#include
-#include_next
+#include "xcopy.h"
-#define CP_UNIXCP CP_ACP
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
-
-#endif /* __WINE_WINNLS_H */
+#include "Bg.rc"
+#include "Da.rc"
+#include "De.rc"
+#include "El.rc"
+#include "En.rc"
+#include "Fr.rc"
+#include "It.rc"
+#include "Ko.rc"
+#include "Nl.rc"
+#include "No.rc"
+#include "Pl.rc"
+#include "Pt.rc"
+#include "Ru.rc"
+#include "Si.rc"
diff --git a/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild b/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild
index 43921283ad3..9841a3a2a0f 100644
--- a/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild
+++ b/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild
@@ -7,17 +7,6 @@
user32
kernel32
xcopy.c
- Da.rc
- De.rc
- En.rc
- Fr.rc
- Ko.rc
- Lt.rc
- Nl.rc
- No.rc
- Pl.rc
- Pt.rc
- Ru.rc
- Si.rc
+ rsrc.rc
diff --git a/reactos/base/applications/games/winemine/lang/ja-JP.rc b/reactos/base/applications/games/winemine/lang/ja-JP.rc
new file mode 100644
index 00000000000..6f6e3699f25
--- /dev/null
+++ b/reactos/base/applications/games/winemine/lang/ja-JP.rc
@@ -0,0 +1,77 @@
+#include "resource.h"
+
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+
+STRINGTABLE
+BEGIN
+ IDS_SECONDS, "b"
+ IDS_NOBODY, "OȂ"
+ IDS_ABOUT, "Joshua ThielenReactOS developers"
+END
+
+IDM_WINEMINE MENU DISCARDABLE
+BEGIN
+ POPUP "Q[(&G)"
+ BEGIN
+ MENUITEM "VKQ[(&N)\tF2", IDM_NEW
+ MENUITEM SEPARATOR
+ MENUITEM "?}[N(&M)", IDM_MARKQ
+ MENUITEM SEPARATOR
+ MENUITEM "S(&B)", IDM_BEGINNER
+ MENUITEM "(&I)", IDM_ADVANCED
+ MENUITEM "l(&E)", IDM_EXPERT
+ MENUITEM "JX^(&C)...", IDM_CUSTOM
+ MENUITEM SEPARATOR
+ MENUITEM "xXg^C(&B)...", IDM_TIMES
+ MENUITEM SEPARATOR
+ MENUITEM "I(&X)", IDM_EXIT
+ END
+ POPUP "wv(&H)"
+ BEGIN
+ MENUITEM "WineMineɂ(&A)", IDM_ABOUT
+ END
+END
+
+IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75
+STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT
+CAPTION "ő^C"
+FONT 9, "MS UI Gothic"
+BEGIN
+ GROUPBOX "ő^C", IDNONE, 10, 10, 182, 45
+ LTEXT "S:", IDNONE, 20, 20, 58, 8
+ LTEXT ":", IDNONE, 20, 30, 58, 8
+ LTEXT "l:", IDNONE, 20, 40, 58, 8
+ LTEXT "", IDC_TIME1, 80, 20, 50, 8
+ LTEXT "", IDC_TIME2, 80, 30, 50, 8
+ LTEXT "", IDC_TIME3, 80, 40, 50, 8
+ LTEXT "", IDC_NAME1, 132, 20, 55, 8
+ LTEXT "", IDC_NAME2, 132, 30, 55, 8
+ LTEXT "", IDC_NAME3, 132, 40, 55, 8
+ DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15
+ PUSHBUTTON "XRÃZbg(&R)", IDRESET, 18, 57, 67, 15
+END
+
+IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60
+STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT
+CAPTION "߂łƂ!"
+FONT 9, "MS UI Gothic"
+BEGIN
+ LTEXT "O͂Ă", IDIGNORE, 25, 10, 150, 10
+ EDITTEXT IDC_EDITNAME, 25, 20, 110, 12
+ DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15
+END
+
+IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80
+STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT
+CAPTION "JX^Q["
+FONT 9, "MS UI Gothic"
+BEGIN
+ LTEXT ":", IDNONE, 5, 15, 43, 10
+ LTEXT ":", IDNONE, 5, 35, 43, 10
+ LTEXT "n̐:", IDNONE, 5, 55, 43, 10
+ EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER
+ EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER
+ EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER
+ DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15
+ PUSHBUTTON "LZ", IDCANCEL, 86, 52, 45, 15
+END
diff --git a/reactos/base/applications/games/winemine/rsrc.rc b/reactos/base/applications/games/winemine/rsrc.rc
index bc9d766cfed..97e20879a2f 100644
--- a/reactos/base/applications/games/winemine/rsrc.rc
+++ b/reactos/base/applications/games/winemine/rsrc.rc
@@ -27,6 +27,7 @@ IDB_MINES BITMAP MOVEABLE "rc/mines.bmp"
#include "lang/fr-FR.rc"
#include "lang/id-ID.rc"
#include "lang/it-IT.rc"
+#include "lang/ja-JP.rc"
#include "lang/ko-KR.rc"
#include "lang/lt-LT.rc"
#include "lang/no-NO.rc"
diff --git a/reactos/base/applications/mplay32/lang/cs-CZ.rc b/reactos/base/applications/mplay32/lang/cs-CZ.rc
new file mode 100644
index 00000000000..15763cc81d7
--- /dev/null
+++ b/reactos/base/applications/mplay32/lang/cs-CZ.rc
@@ -0,0 +1,34 @@
+/* FILE: base/applications/mplay32/lang/cs-CZ.rc
+ * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com)
+ * UPDATED: 2009-08-03
+ */
+
+LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
+
+IDR_MAINMENU MENU
+BEGIN
+ POPUP "&Soubor"
+ BEGIN
+ MENUITEM "&Otevt...", IDM_OPEN_FILE
+ MENUITEM "&Zavt", IDM_CLOSE_FILE
+ MENUITEM SEPARATOR
+ MENUITEM "&Ukonit", IDM_EXIT
+ END
+ POPUP "&Npovda"
+ BEGIN
+ MENUITEM "&O programu...", IDM_ABOUT
+ END
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_ALL_TYPES_FILTER "Vechny podporovan (*.wav, *.cda, *.midi, *.mid, *.avi)\0*.wav;*.cda;*.midi;*.mid;*.avi\0"
+ IDS_TOOLTIP_PLAY "Pehrt"
+ IDS_TOOLTIP_STOP "Zastavit"
+ IDS_TOOLTIP_EJECT "Vysunout"
+ IDS_TOOLTIP_BACKWARD "Peskoit zpt"
+ IDS_TOOLTIP_SEEKBACK "Posunout zpt"
+ IDS_TOOLTIP_SEEKFORW "Posunout vped"
+ IDS_TOOLTIP_FORWARD "Peskoit vped"
+ IDS_APPTITLE "ReactOS Pehrva multimdi"
+END
diff --git a/reactos/base/applications/mplay32/lang/uk-UA.rc b/reactos/base/applications/mplay32/lang/uk-UA.rc
index e1af2a03965..3dc0d0800c9 100644
--- a/reactos/base/applications/mplay32/lang/uk-UA.rc
+++ b/reactos/base/applications/mplay32/lang/uk-UA.rc
@@ -1,3 +1,11 @@
+/*
+ * PROJECT: ReactOS MPlay32
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/mplay32/lang/uk-UA.rc
+ * PURPOSE: Ukraianian Language File for ReactOS MPlay32
+ * TRANSLATOR: Sakara Yevhen
+ */
+
LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
IDR_MAINMENU MENU
diff --git a/reactos/base/applications/mplay32/rsrc.rc b/reactos/base/applications/mplay32/rsrc.rc
index 05b16651d01..db2966df975 100644
--- a/reactos/base/applications/mplay32/rsrc.rc
+++ b/reactos/base/applications/mplay32/rsrc.rc
@@ -2,6 +2,7 @@
#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"
diff --git a/reactos/base/applications/msconfig/lang/cs-CZ.rc b/reactos/base/applications/msconfig/lang/cs-CZ.rc
index 870e900ef34..d4b77ca2aa0 100644
--- a/reactos/base/applications/msconfig/lang/cs-CZ.rc
+++ b/reactos/base/applications/msconfig/lang/cs-CZ.rc
@@ -1,3 +1,9 @@
+/* FILE: base/applications/msconfig/lang/cs-CZ.rc
+ * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com)
+ * UPDATED: 2009-08-03
+ * THANKS TO: Kamil Hornicek, who translated major part of this file
+ */
+
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
IDD_MSCONFIG_DIALOG DIALOGEX DISCARDABLE 0, 0, 378, 220
@@ -28,18 +34,18 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "", 237, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS | TVS_SHOWSELALWAYS | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 2, 1, 280, 148
- PUSHBUTTON "Move &Up", IDC_BTN_SYSTEM_UP, 290, 5, 66, 14
- PUSHBUTTON "Move &Down", IDC_BTN_SYSTEM_DOWN, 290, 25, 66, 14
+ PUSHBUTTON "Na&horu", IDC_BTN_SYSTEM_UP, 290, 5, 66, 14
+ PUSHBUTTON "&Dol", IDC_BTN_SYSTEM_DOWN, 290, 25, 66, 14
- PUSHBUTTON "&Enable", IDC_BTN_SYSTEM_ENABLE, 290, 50, 66, 14
- PUSHBUTTON "D&isable", IDC_BTN_SYSTEM_DISABLE, 290, 70, 66, 14
+ PUSHBUTTON "Povoli&t", IDC_BTN_SYSTEM_ENABLE, 290, 50, 66, 14
+ PUSHBUTTON "&Zakzat", IDC_BTN_SYSTEM_DISABLE, 290, 70, 66, 14
- PUSHBUTTON "&Find", IDC_BTN_SYSTEM_FIND, 290, 95, 66, 14
- PUSHBUTTON "&New", IDC_BTN_SYSTEM_NEW, 290, 115, 66, 14
- PUSHBUTTON "Edi&t", IDC_BTN_SYSTEM_EDIT, 290, 135, 66, 14
+ PUSHBUTTON "&Najt", IDC_BTN_SYSTEM_FIND, 290, 95, 66, 14
+ PUSHBUTTON "No&v", IDC_BTN_SYSTEM_NEW, 290, 115, 66, 14
+ PUSHBUTTON "&Upravit", IDC_BTN_SYSTEM_EDIT, 290, 135, 66, 14
- PUSHBUTTON "Ena&ble All", IDC_BTN_SYSTEM_ACTIVATE, 123, 155, 66, 14
- PUSHBUTTON "Disable A&ll",IDC_BTN_SYSTEM_DEACTIVATE, 195, 155, 66, 14
+ PUSHBUTTON "&Povolit ve", IDC_BTN_SYSTEM_ACTIVATE, 123, 155, 66, 14
+ PUSHBUTTON "Z&akzat ve",IDC_BTN_SYSTEM_DEACTIVATE, 195, 155, 66, 14
END
IDD_TOOLS_PAGE DIALOGEX DISCARDABLE 0, 0, 362, 175
diff --git a/reactos/base/applications/mscutils/servman/propsheet_depends.c b/reactos/base/applications/mscutils/servman/propsheet_depends.c
index 9d86390a974..e18f10b112b 100644
--- a/reactos/base/applications/mscutils/servman/propsheet_depends.c
+++ b/reactos/base/applications/mscutils/servman/propsheet_depends.c
@@ -50,7 +50,7 @@ AddItemToTreeView(HWND hTreeView,
return TreeView_InsertItem(hTreeView, &tvins);
}
-#if 0 // FIXME: What is this good for?
+#if 0
static VOID
AddServiceDependency(PSERVICEPROPSHEET dlgInfo,
HWND hTreeView,
diff --git a/reactos/base/applications/network/netstat/netstat.c b/reactos/base/applications/network/netstat/netstat.c
index eb55c43c395..45ff2fd7fa4 100644
--- a/reactos/base/applications/network/netstat/netstat.c
+++ b/reactos/base/applications/network/netstat/netstat.c
@@ -17,6 +17,7 @@
#include
#include
#include
+#include
#include
#include "netstat.h"
diff --git a/reactos/base/applications/network/ping/ping.c b/reactos/base/applications/network/ping/ping.c
index e8135086daa..3901d26243c 100644
--- a/reactos/base/applications/network/ping/ping.c
+++ b/reactos/base/applications/network/ping/ping.c
@@ -437,6 +437,14 @@ static BOOL DecodeResponse(PCHAR buffer, UINT size, PSOCKADDR_IN from)
return FALSE;
}
+ if (from->sin_addr.s_addr != Target.sin_addr.s_addr)
+ {
+#ifndef NDEBUG
+ printf("Bad source address (%s should be %s)\n", inet_ntoa(from->sin_addr), inet_ntoa(Target.sin_addr));
+#endif /* !NDEBUG */
+ return FALSE;
+ }
+
QueryTime(&LargeTime);
RelativeTime.QuadPart = (LargeTime.QuadPart - Icmp->Timestamp.QuadPart);
@@ -543,44 +551,40 @@ static BOOL Ping(VOID)
Timeval.tv_sec = Timeout / 1000;
Timeval.tv_usec = Timeout % 1000;
- Status = select(0, &Fds, NULL, NULL, &Timeval);
- if ((Status != SOCKET_ERROR) && (Status != 0))
- {
- Length = sizeof(From);
- Status = recvfrom(IcmpSock, Buffer, Size, 0, &From, &Length);
+ do {
+ Status = select(0, &Fds, NULL, NULL, &Timeval);
+ if ((Status != SOCKET_ERROR) && (Status != 0))
+ {
+ Length = sizeof(From);
+ Status = recvfrom(IcmpSock, Buffer, Size, 0, &From, &Length);
#ifndef NDEBUG
- printf("Received packet\n");
- DisplayBuffer(Buffer, Status);
- printf("\n");
+ printf("Received packet\n");
+ DisplayBuffer(Buffer, Status);
+ printf("\n");
#endif /* !NDEBUG */
- }
- else
- LostCount++;
- if (Status == SOCKET_ERROR)
- {
- if (WSAGetLastError() != WSAETIMEDOUT)
- {
- printf("Could not receive data (%d).\n", WSAGetLastError());
- GlobalFree(Buffer);
- return FALSE;
}
- Status = 0;
- }
+ else
+ LostCount++;
+ if (Status == SOCKET_ERROR)
+ {
+ if (WSAGetLastError() != WSAETIMEDOUT)
+ {
+ printf("Could not receive data (%d).\n", WSAGetLastError());
+ GlobalFree(Buffer);
+ return FALSE;
+ }
+ Status = 0;
+ }
- if (Status == 0)
- {
- printf("Request timed out.\n");
- GlobalFree(Buffer);
- return TRUE;
- }
+ if (Status == 0)
+ {
+ printf("Request timed out.\n");
+ GlobalFree(Buffer);
+ return TRUE;
+ }
- if (!DecodeResponse(Buffer, Status, (PSOCKADDR_IN)&From))
- {
- /* FIXME: Wait again as it could be another ICMP message type */
- printf("Request timed out (incomplete datagram received).\n");
- LostCount++;
- }
+ } while (!DecodeResponse(Buffer, Status, (PSOCKADDR_IN)&From));
GlobalFree(Buffer);
return TRUE;
diff --git a/reactos/base/applications/notepad/lang/cs-CZ.rc b/reactos/base/applications/notepad/lang/cs-CZ.rc
index 4a46efa404e..593e3f432cd 100644
--- a/reactos/base/applications/notepad/lang/cs-CZ.rc
+++ b/reactos/base/applications/notepad/lang/cs-CZ.rc
@@ -74,7 +74,7 @@ BEGIN
MENUITEM "Vybrat v&e\tCtrl+A", CMD_SELECT_ALL
MENUITEM "&as/Datum\tF5", CMD_TIME_DATE
END
- POPUP "F&ormat"
+ POPUP "F&ormt"
BEGIN
MENUITEM "Zalo&mit dlouh dky", CMD_WRAP
MENUITEM "&Psmo...", CMD_FONT
@@ -155,7 +155,7 @@ BEGIN
-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,46,7,232,39
CONTROL " ",
-1,"Static",0x50000000,8,48,272,11
- DEFPUSHBUTTON "Close",IDOK,114,149,44,15,WS_GROUP
+ DEFPUSHBUTTON "Zavt",IDOK,114,149,44,15,WS_GROUP
ICON IDI_NPICON,-1,12,9,20,30
EDITTEXT IDC_LICENSE,8,64,272,81,ES_MULTILINE |
ES_READONLY | WS_VSCROLL
@@ -205,5 +205,5 @@ STRING_UTF8, "UTF-8"
STRING_CRLF, "Windows"
STRING_LF, "Unix"
STRING_CR, "Mac"
-STRING_LINE_COLUMN, "Line %d, column %d"
+STRING_LINE_COLUMN, "dek %d, sloupec %d"
END
diff --git a/reactos/base/applications/paint/drawing.c b/reactos/base/applications/paint/drawing.c
index 2bae28bce53..bb8d24a40a5 100644
--- a/reactos/base/applications/paint/drawing.c
+++ b/reactos/base/applications/paint/drawing.c
@@ -81,12 +81,13 @@ void Poly(HDC hdc, POINT *lpPoints, int nCount, int fg, int bg, int thickness, i
void Bezier(HDC hdc, POINT p1, POINT p2, POINT p3, POINT p4, int color, int thickness)
{
+ HPEN oldPen;
POINT fourPoints[4];
fourPoints[0] = p1;
fourPoints[1] = p2;
fourPoints[2] = p3;
fourPoints[3] = p4;
- HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, color));
+ oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, color));
PolyBezier(hdc, fourPoints, 4);
DeleteObject(SelectObject(hdc, oldPen));
}
diff --git a/reactos/base/applications/paint/lang/bg-BG.rc b/reactos/base/applications/paint/lang/bg-BG.rc
new file mode 100644
index 00000000000..f946c6df9df
--- /dev/null
+++ b/reactos/base/applications/paint/lang/bg-BG.rc
@@ -0,0 +1,201 @@
+/*
+ * US-English Language resource file
+ * Translated by: first times touched from en-GB.rc file by Mario Kacmar
+ */
+
+LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
+
+ID_MENU MENU
+BEGIN
+ POPUP "&"
+ BEGIN
+ MENUITEM "&\tCtrl+N", IDM_FILENEW
+ MENUITEM "&...\tAlt+tCtrl+O", IDM_FILEOPEN
+ MENUITEM "&\tCtrl+S", IDM_FILESAVE
+ MENUITEM " &...", IDM_FILESAVEAS
+ MENUITEM SEPARATOR
+ MENUITEM " ()", IDM_FILEASWALLPAPERPLANE
+ MENUITEM " ( )", IDM_FILEASWALLPAPERCENTERED
+ MENUITEM " ()", IDM_FILEASWALLPAPERSTRETCHED
+ MENUITEM SEPARATOR
+ MENUITEM "\tAlt+F4", IDM_FILEEXIT
+ END
+
+ POPUP "&"
+ BEGIN
+ MENUITEM "\tCtrl+Z", IDM_EDITUNDO
+ MENUITEM "\tCtrl+Y", IDM_EDITREDO
+ MENUITEM SEPARATOR
+ MENUITEM "\tCtrl+X", IDM_EDITCUT
+ MENUITEM "\tCtrl+C", IDM_EDITCOPY
+ MENUITEM "\tCtrl+V", IDM_EDITPASTE
+ MENUITEM " \tDel", IDM_EDITDELETESELECTION
+ MENUITEM " ", IDM_EDITINVERTSELECTION
+ MENUITEM " \tCtrl+A", IDM_EDITSELECTALL
+ MENUITEM SEPARATOR
+ MENUITEM " ...", IDM_EDITCOPYTO
+ MENUITEM " ...", IDM_EDITPASTEFROM
+ END
+
+ POPUP "&"
+ BEGIN
+ MENUITEM " \tCtrl+T", IDM_VIEWTOOLBOX, CHECKED
+ MENUITEM "\tCtrl+L", IDM_VIEWCOLORPALETTE, CHECKED
+ MENUITEM " ", IDM_VIEWSTATUSBAR, CHECKED
+ MENUITEM " ", IDM_FORMATICONBAR, CHECKED, GRAYED
+ MENUITEM SEPARATOR
+ POPUP ""
+ BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "12,5%", IDM_VIEWZOOM125
+ MENUITEM "25%", IDM_VIEWZOOM25
+ MENUITEM "50%", IDM_VIEWZOOM50
+ MENUITEM "100%", IDM_VIEWZOOM100
+ MENUITEM "200%", IDM_VIEWZOOM200
+ MENUITEM "400%", IDM_VIEWZOOM400
+ MENUITEM "800%", IDM_VIEWZOOM800
+ END
+ MENUITEM SEPARATOR
+ MENUITEM "\tCtrl+G", IDM_VIEWSHOWGRID
+ MENUITEM "", IDM_VIEWSHOWMINIATURE
+ END
+ MENUITEM " ", IDM_VIEWFULLSCREEN
+ END
+
+ POPUP "&"
+ BEGIN
+ MENUITEM "/\tCtrl+R", IDM_IMAGEROTATEMIRROR
+ MENUITEM "\tCtrl+W", IDM_IMAGECHANGESIZE
+ MENUITEM "", IDM_IMAGECROP
+ MENUITEM " \tCtrl+I", IDM_IMAGEINVERTCOLORS
+ MENUITEM "\tCtrl+E", IDM_IMAGEATTRIBUTES
+ MENUITEM " \tCtrl+Shft+N", IDM_IMAGEDELETEIMAGE
+ MENUITEM " ", IDM_IMAGEDRAWOPAQUE
+ END
+
+ POPUP "&"
+ BEGIN
+ MENUITEM " ...", IDM_COLORSEDITPALETTE
+ END
+
+ POPUP "&?"
+ BEGIN
+ MENUITEM "", IDM_HELPHELPTOPICS
+ MENUITEM SEPARATOR
+ MENUITEM "", IDM_HELPINFO
+ END
+END
+
+ID_ACCELERATORS ACCELERATORS
+BEGIN
+ "^N", IDM_FILENEW
+ "^O", IDM_FILEOPEN
+ "^S", IDM_FILESAVE
+ "^Z", IDM_EDITUNDO
+ "^Y", IDM_EDITREDO
+ "^X", IDM_EDITCUT
+ "^C", IDM_EDITCOPY
+ "^V", IDM_EDITPASTE
+ VK_DELETE, IDM_EDITDELETESELECTION, VIRTKEY
+ "^A", IDM_EDITSELECTALL
+ "^T", IDM_VIEWTOOLBOX
+ "^L", IDM_VIEWCOLORPALETTE
+ "^G", IDM_VIEWSHOWGRID
+ "^F", IDM_VIEWFULLSCREEN
+ "^R", IDM_IMAGEROTATEMIRROR
+ "^W", IDM_IMAGECHANGESIZE
+ "^I", IDM_IMAGEINVERTCOLORS
+ "^E", IDM_IMAGEATTRIBUTES
+ "N", IDM_IMAGEDELETEIMAGE, CONTROL, SHIFT, VIRTKEY
+END
+
+IDD_MIRRORROTATE DIALOGEX 100, 100, 180, 100
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION " "
+BEGIN
+ GROUPBOX " ", IDD_MIRRORROTATEGROUP, 6, 6, 112, 86
+ AUTORADIOBUTTON " ", IDD_MIRRORROTATERB1, 12, 18, 100, 10, WS_GROUP
+ AUTORADIOBUTTON " ", IDD_MIRRORROTATERB2, 12, 30, 100, 10
+ AUTORADIOBUTTON " ", IDD_MIRRORROTATERB3, 12, 42, 100, 10
+ AUTORADIOBUTTON "90", IDD_MIRRORROTATERB4, 42, 54, 50, 10, WS_GROUP | WS_DISABLED
+ AUTORADIOBUTTON "180", IDD_MIRRORROTATERB5, 42, 66, 50, 10, WS_DISABLED
+ AUTORADIOBUTTON "270", IDD_MIRRORROTATERB6, 42, 78, 50, 10, WS_DISABLED
+ DEFPUSHBUTTON "", IDOK, 125, 8, 48, 14
+ PUSHBUTTON "", IDCANCEL, 125, 24, 48, 14
+END
+
+IDD_ATTRIBUTES DIALOGEX 100, 100, 220, 120
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION ""
+BEGIN
+ EDITTEXT IDD_ATTRIBUTESEDIT1, 40, 40, 35, 12
+ EDITTEXT IDD_ATTRIBUTESEDIT2, 116, 40, 35, 12
+ LTEXT ":", IDD_ATTRIBUTESTEXT1, 10, 40, 30, 10
+ LTEXT ":", IDD_ATTRIBUTESTEXT2, 80, 40, 36, 10
+ LTEXT " :", IDD_ATTRIBUTESTEXT3, 10, 5, 60, 10
+ LTEXT " :", IDD_ATTRIBUTESTEXT4, 10, 15, 60, 10
+ LTEXT ":", IDD_ATTRIBUTESTEXT5, 10, 25, 60, 10
+ LTEXT "", IDD_ATTRIBUTESTEXT6, 70, 5, 60, 10
+ LTEXT "", IDD_ATTRIBUTESTEXT7, 70, 15, 60, 10
+ LTEXT "", IDD_ATTRIBUTESTEXT8, 70, 25, 60, 10
+ GROUPBOX "", IDD_ATTRIBUTESGROUP1, 6, 57, 139, 27
+ AUTORADIOBUTTON "", IDD_ATTRIBUTESRB1, 12, 69, 40, 10, WS_GROUP
+ AUTORADIOBUTTON "", IDD_ATTRIBUTESRB2, 52, 69, 35, 10
+ AUTORADIOBUTTON "", IDD_ATTRIBUTESRB3, 92, 69, 35, 10
+ GROUPBOX "", IDD_ATTRIBUTESGROUP2, 6, 88, 139, 27
+ AUTORADIOBUTTON "- ", IDD_ATTRIBUTESRB4, 12, 100, 70, 10, WS_GROUP
+ AUTORADIOBUTTON "", IDD_ATTRIBUTESRB5, 92, 100, 50, 10
+ DEFPUSHBUTTON "", IDOK, 155, 8, 55, 14
+ PUSHBUTTON "", IDCANCEL, 155, 24, 55, 14
+ PUSHBUTTON "", IDD_ATTRIBUTESSTANDARD, 155, 40, 55, 14
+END
+
+IDD_CHANGESIZE DIALOGEX 100, 100, 210, 80
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION " "
+BEGIN
+ GROUPBOX " ", IDD_CHANGESIZEGROUP, 6, 6, 142, 66
+ ICON IDI_HORZSTRETCH, IDD_CHANGESIZEICON1, 12, 18, 32, 32
+ LTEXT ":", IDD_CHANGESIZETEXT1, 45, 24, 40, 10
+ EDITTEXT IDD_CHANGESIZEEDIT1, 90, 23, 32, 12
+ LTEXT "%", IDD_CHANGESIZETEXT2, 125, 24, 15, 10
+ ICON IDI_VERTSTRETCH, IDD_CHANGESIZEICON2, 12, 43, 32, 32
+ LTEXT ":", IDD_CHANGESIZETEXT3, 45, 49, 40, 10
+ EDITTEXT IDD_CHANGESIZEEDIT2, 90, 48, 32, 12
+ LTEXT "%", IDD_CHANGESIZETEXT4, 125, 49, 15, 10
+ DEFPUSHBUTTON "", IDOK, 155, 8, 48, 14
+ PUSHBUTTON "", IDCANCEL, 155, 24, 48, 14
+END
+
+STRINGTABLE
+BEGIN
+ IDS_PROGRAMNAME, ""
+ IDS_WINDOWTITLE, "%s - "
+ IDS_INFOTITLE, " (Paint) "
+ IDS_INFOTEXT, " (Paint) GNU Lesser General Public License (LGPL) 3 (see www.gnu.org)"
+ IDS_SAVEPROMPTTEXT, " %s?"
+ IDS_DEFAULTFILENAME, " .bmp"
+ IDS_MINIATURETITLE, ""
+ IDS_TOOLTIP1, " "
+ IDS_TOOLTIP2, ""
+ IDS_TOOLTIP3, ""
+ IDS_TOOLTIP4, " "
+ IDS_TOOLTIP5, " "
+ IDS_TOOLTIP6, ""
+ IDS_TOOLTIP7, ""
+ IDS_TOOLTIP8, ""
+ IDS_TOOLTIP9, ""
+ IDS_TOOLTIP10, ""
+ IDS_TOOLTIP11, ""
+ IDS_TOOLTIP12, " "
+ IDS_TOOLTIP13, ""
+ IDS_TOOLTIP14, ""
+ IDS_TOOLTIP15, ""
+ IDS_TOOLTIP16, " "
+ IDS_OPENFILTER, " bitmap (*.bmp;*.dib)\1*.bmp;*.dib\1 (*.*)\1*.*\1"
+ IDS_SAVEFILTER, "24 bitmap (*.bmp;*.dib)\1*.bmp;*.dib\1"
+END
diff --git a/reactos/base/applications/paint/lang/ja-JP.rc b/reactos/base/applications/paint/lang/ja-JP.rc
new file mode 100644
index 00000000000..12ec7e1734d
--- /dev/null
+++ b/reactos/base/applications/paint/lang/ja-JP.rc
@@ -0,0 +1,201 @@
+/*
+ * Japanese Language resource file
+ * Translated by: pcds90net, Tomoya Kitagawa
+ */
+
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+
+ID_MENU MENU
+BEGIN
+ POPUP "t@C(&F)"
+ BEGIN
+ MENUITEM "VK(&N)\tCtrl+N", IDM_FILENEW
+ MENUITEM "J(&O)\tCtrl+O", IDM_FILEOPEN
+ MENUITEM "㏑ۑ(&S)\tCtrl+S", IDM_FILESAVE
+ MENUITEM "Otĕۑ(&A)...", IDM_FILESAVEAS
+ MENUITEM SEPARATOR
+ MENUITEM "wiɐݒ (ׂĕ\\)", IDM_FILEASWALLPAPERPLANE
+ MENUITEM "wiɐݒ (ɕ\\)", IDM_FILEASWALLPAPERCENTERED
+ MENUITEM "wiɐݒ (g)", IDM_FILEASWALLPAPERSTRETCHED
+ MENUITEM SEPARATOR
+ MENUITEM "yCg̏I(&Q)\tAlt+F4", IDM_FILEEXIT
+ END
+
+ POPUP "ҏW(&E)"
+ BEGIN
+ MENUITEM "ɖ߂\tCtrl+Z", IDM_EDITUNDO
+ MENUITEM "蒼\tCtrl+Y", IDM_EDITREDO
+ MENUITEM SEPARATOR
+ MENUITEM "\tCtrl+X", IDM_EDITCUT
+ MENUITEM "Rs[\tCtrl+C", IDM_EDITCOPY
+ MENUITEM "\\t\tCtrl+V", IDM_EDITPASTE
+ MENUITEM "I͈͂̍폜\tDel", IDM_EDITDELETESELECTION
+ MENUITEM "I͈͂̑}", IDM_EDITINVERTSELECTION
+ MENUITEM "ׂđI\tCtrl+A", IDM_EDITSELECTALL
+ MENUITEM SEPARATOR
+ MENUITEM "t@CփRs[", IDM_EDITCOPYTO
+ MENUITEM "t@C\\t", IDM_EDITPASTEFROM
+ END
+
+ POPUP "\\(&V)"
+ BEGIN
+ MENUITEM "c[ {bNX\tCtrl+T", IDM_VIEWTOOLBOX, CHECKED
+ MENUITEM "J[ pbg\tCtrl+L", IDM_VIEWCOLORPALETTE, CHECKED
+ MENUITEM "Xe[^X o[", IDM_VIEWSTATUSBAR, CHECKED
+ MENUITEM "eLXg c[ o[", IDM_FORMATICONBAR, CHECKED, GRAYED
+ MENUITEM SEPARATOR
+ POPUP "g"
+ BEGIN
+ POPUP "[U[`"
+ BEGIN
+ MENUITEM "12,5%", IDM_VIEWZOOM125
+ MENUITEM "25%", IDM_VIEWZOOM25
+ MENUITEM "50%", IDM_VIEWZOOM50
+ MENUITEM "100%", IDM_VIEWZOOM100
+ MENUITEM "200%", IDM_VIEWZOOM200
+ MENUITEM "400%", IDM_VIEWZOOM400
+ MENUITEM "800%", IDM_VIEWZOOM800
+ END
+ MENUITEM SEPARATOR
+ MENUITEM "Obh\\\tCtrl+G", IDM_VIEWSHOWGRID
+ MENUITEM "\\", IDM_VIEWSHOWMINIATURE
+ END
+ MENUITEM "Sʕ\\\tCtrl+F", IDM_VIEWFULLSCREEN
+ END
+
+ POPUP "摜(&I)"
+ BEGIN
+ MENUITEM "]Ɣ]\tCtrl+R", IDM_IMAGEROTATEMIRROR
+ MENUITEM "TCY̕ύX\tCtrl+W", IDM_IMAGECHANGESIZE
+ MENUITEM "", IDM_IMAGECROP
+ MENUITEM "F̔]\tCtrl+I", IDM_IMAGEINVERTCOLORS
+ MENUITEM "摜̑\tCtrl+E", IDM_IMAGEATTRIBUTES
+ MENUITEM "摜̍폜\tCtrl+Shft+N", IDM_IMAGEDELETEIMAGE
+ MENUITEM "sF`悷", IDM_IMAGEDRAWOPAQUE
+ END
+
+ POPUP "F(&C)"
+ BEGIN
+ MENUITEM "pbg̕ҏW", IDM_COLORSEDITPALETTE
+ END
+
+ POPUP "&?"
+ BEGIN
+ MENUITEM "wv gsbN", IDM_HELPHELPTOPICS
+ MENUITEM SEPARATOR
+ MENUITEM "", IDM_HELPINFO
+ END
+END
+
+ID_ACCELERATORS ACCELERATORS
+BEGIN
+ "^N", IDM_FILENEW
+ "^O", IDM_FILEOPEN
+ "^S", IDM_FILESAVE
+ "^Z", IDM_EDITUNDO
+ "^Y", IDM_EDITREDO
+ "^X", IDM_EDITCUT
+ "^C", IDM_EDITCOPY
+ "^V", IDM_EDITPASTE
+ VK_DELETE, IDM_EDITDELETESELECTION, VIRTKEY
+ "^A", IDM_EDITSELECTALL
+ "^T", IDM_VIEWTOOLBOX
+ "^L", IDM_VIEWCOLORPALETTE
+ "^G", IDM_VIEWSHOWGRID
+ "^F", IDM_VIEWFULLSCREEN
+ "^R", IDM_IMAGEROTATEMIRROR
+ "^W", IDM_IMAGECHANGESIZE
+ "^I", IDM_IMAGEINVERTCOLORS
+ "^E", IDM_IMAGEATTRIBUTES
+ "N", IDM_IMAGEDELETEIMAGE, CONTROL, SHIFT, VIRTKEY
+END
+
+IDD_MIRRORROTATE DIALOGEX 100, 100, 180, 100
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+FONT 9, "MS UI Gothic"
+CAPTION "]Ɣ]"
+BEGIN
+ GROUPBOX "]Ɣ]", IDD_MIRRORROTATEGROUP, 6, 6, 112, 86
+ AUTORADIOBUTTON "ɔ]", IDD_MIRRORROTATERB1, 12, 18, 100, 10, WS_GROUP
+ AUTORADIOBUTTON "ɔ]", IDD_MIRRORROTATERB2, 12, 30, 100, 10
+ AUTORADIOBUTTON "pxw", IDD_MIRRORROTATERB3, 12, 42, 100, 10
+ AUTORADIOBUTTON "90", IDD_MIRRORROTATERB4, 42, 54, 50, 10, WS_GROUP | WS_DISABLED
+ AUTORADIOBUTTON "180", IDD_MIRRORROTATERB5, 42, 66, 50, 10, WS_DISABLED
+ AUTORADIOBUTTON "270", IDD_MIRRORROTATERB6, 42, 78, 50, 10, WS_DISABLED
+ DEFPUSHBUTTON "OK", IDOK, 125, 8, 48, 14
+ PUSHBUTTON "LZ", IDCANCEL, 125, 24, 48, 14
+END
+
+IDD_ATTRIBUTES DIALOGEX 100, 100, 210, 120
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+FONT 9, "MS UI Gothic"
+CAPTION "摜̑"
+BEGIN
+ EDITTEXT IDD_ATTRIBUTESEDIT1, 40, 40, 35, 12
+ EDITTEXT IDD_ATTRIBUTESEDIT2, 110, 40, 35, 12
+ LTEXT ":", IDD_ATTRIBUTESTEXT1, 10, 40, 30, 10
+ LTEXT ":", IDD_ATTRIBUTESTEXT2, 80, 40, 30, 10
+ LTEXT "t@C̓t:", IDD_ATTRIBUTESTEXT3, 10, 5, 60, 10
+ LTEXT "t@C̃TCY:", IDD_ATTRIBUTESTEXT4, 10, 15, 60, 10
+ LTEXT "𑜓x:", IDD_ATTRIBUTESTEXT5, 10, 25, 60, 10
+ LTEXT "ps\\", IDD_ATTRIBUTESTEXT6, 70, 5, 60, 10
+ LTEXT "ps\\", IDD_ATTRIBUTESTEXT7, 70, 15, 60, 10
+ LTEXT "ps\\", IDD_ATTRIBUTESTEXT8, 70, 25, 60, 10
+ GROUPBOX "P", IDD_ATTRIBUTESGROUP1, 6, 57, 139, 27
+ AUTORADIOBUTTON "C`", IDD_ATTRIBUTESRB1, 12, 69, 35, 10, WS_GROUP
+ AUTORADIOBUTTON "cm", IDD_ATTRIBUTESRB2, 52, 69, 35, 10
+ AUTORADIOBUTTON "sNZ", IDD_ATTRIBUTESRB3, 92, 69, 35, 10
+ GROUPBOX "F", IDD_ATTRIBUTESGROUP2, 6, 88, 139, 27
+ AUTORADIOBUTTON "", IDD_ATTRIBUTESRB4, 12, 100, 70, 10, WS_GROUP
+ AUTORADIOBUTTON "J[", IDD_ATTRIBUTESRB5, 92, 100, 35, 10
+ DEFPUSHBUTTON "OK", IDOK, 155, 8, 48, 14
+ PUSHBUTTON "LZ", IDCANCEL, 155, 24, 48, 14
+ PUSHBUTTON "ftHg", IDD_ATTRIBUTESSTANDARD, 155, 40, 48, 14
+END
+
+IDD_CHANGESIZE DIALOGEX 100, 100, 210, 80
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+FONT 9, "MS UI Gothic"
+CAPTION "TCY̕ύX"
+BEGIN
+ GROUPBOX "TCY̕ύX", IDD_CHANGESIZEGROUP, 6, 6, 142, 66
+ ICON IDI_HORZSTRETCH, IDD_CHANGESIZEICON1, 12, 18, 32, 32
+ LTEXT ":", IDD_CHANGESIZETEXT1, 45, 24, 40, 10
+ EDITTEXT IDD_CHANGESIZEEDIT1, 90, 23, 32, 12
+ LTEXT "%", IDD_CHANGESIZETEXT2, 125, 24, 15, 10
+ ICON IDI_VERTSTRETCH, IDD_CHANGESIZEICON2, 12, 43, 32, 32
+ LTEXT ":", IDD_CHANGESIZETEXT3, 45, 49, 40, 10
+ EDITTEXT IDD_CHANGESIZEEDIT2, 90, 48, 32, 12
+ LTEXT "%", IDD_CHANGESIZETEXT4, 125, 49, 15, 10
+ DEFPUSHBUTTON "OK", IDOK, 155, 8, 48, 14
+ PUSHBUTTON "LZ", IDCANCEL, 155, 24, 48, 14
+END
+
+STRINGTABLE
+BEGIN
+ IDS_PROGRAMNAME, "yCg"
+ IDS_WINDOWTITLE, "%s - yCg"
+ IDS_INFOTITLE, "ReactOS yCg"
+ IDS_INFOTEXT, "ReactOS yCg GNU Lesser General Public License (LGPL) version 3 (ڍׂ www.gnu.org)̉ŗp\\łB"
+ IDS_SAVEPROMPTTEXT, "%s ̕ύXeۑ܂?"
+ IDS_DEFAULTFILENAME, ".bmp"
+ IDS_MINIATURETITLE, "k}"
+ IDS_TOOLTIP1, "RI"
+ IDS_TOOLTIP2, "I"
+ IDS_TOOLTIP3, "S"
+ IDS_TOOLTIP4, "hԂ"
+ IDS_TOOLTIP5, "F̑I"
+ IDS_TOOLTIP6, "gƏk"
+ IDS_TOOLTIP7, "M"
+ IDS_TOOLTIP8, "uV"
+ IDS_TOOLTIP9, "GAuV"
+ IDS_TOOLTIP10, "eLXg"
+ IDS_TOOLTIP11, ""
+ IDS_TOOLTIP12, "Ȑ"
+ IDS_TOOLTIP13, "lp`"
+ IDS_TOOLTIP14, "p`"
+ IDS_TOOLTIP15, "ȉ~"
+ IDS_TOOLTIP16, "pێlp`"
+ IDS_OPENFILTER, "rbg}bv t@C (*.bmp;*.dib)\1*.bmp;*.dib\1ׂẴt@C (*.*)\1*.*\1"
+ IDS_SAVEFILTER, "24 rbg rbg}bv (*.bmp;*.dib)\1*.bmp;*.dib\1"
+END
diff --git a/reactos/base/applications/paint/lang/pl-PL.rc b/reactos/base/applications/paint/lang/pl-PL.rc
index 01e7dd093c3..0a5390fa557 100644
--- a/reactos/base/applications/paint/lang/pl-PL.rc
+++ b/reactos/base/applications/paint/lang/pl-PL.rc
@@ -1,5 +1,8 @@
/*
* translated by Caemyr - Olaf Siejka (May,2009)
+ * Use ReactOS forum PM or IRC to contact me
+ * http://www.reactos.org
+ * IRC: irc.freenode.net #reactos-pl;
*/
diff --git a/reactos/base/applications/paint/lang/uk-UA.rc b/reactos/base/applications/paint/lang/uk-UA.rc
index 959c87cf72e..a57fd3cc533 100644
--- a/reactos/base/applications/paint/lang/uk-UA.rc
+++ b/reactos/base/applications/paint/lang/uk-UA.rc
@@ -1,7 +1,9 @@
/*
- * Ukrainian Language resource file
- * Translated by: Artem Reznikov
- * Last changed: 29-04-2009
+ * PROJECT: Paint for ReactOS
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/devmgmt/lang/uk-UA.rc
+ * PURPOSE: Ukraianian Language File for Paint
+ * TRANSLATOR: Artem Reznikov, Sakara Yevhen
*/
LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
@@ -47,7 +49,7 @@ BEGIN
MENUITEM SEPARATOR
POPUP ""
BEGIN
- POPUP "User defined"
+ POPUP ""
BEGIN
MENUITEM "12,5%", IDM_VIEWZOOM125
MENUITEM "25%", IDM_VIEWZOOM25
@@ -58,8 +60,8 @@ BEGIN
MENUITEM "800%", IDM_VIEWZOOM800
END
MENUITEM SEPARATOR
- MENUITEM "Show grid", IDM_VIEWSHOWGRID
- MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
+ MENUITEM " ", IDM_VIEWSHOWGRID
+ MENUITEM " ", IDM_VIEWSHOWMINIATURE
END
MENUITEM " \tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -176,10 +178,10 @@ BEGIN
IDS_PROGRAMNAME, "Paint"
IDS_WINDOWTITLE, "%s - Paint"
IDS_INFOTITLE, "Paint ReactOS"
- IDS_INFOTEXT, "Paint for ReactOS is available under the GNU Lesser General Public License (LGPL) version 3 (see www.gnu.org)"
+ IDS_INFOTEXT, "Paint ReactOS GNU Lesser General Public License (LGPL) 3 ( www.gnu.org)"
IDS_SAVEPROMPTTEXT, " %s?"
IDS_DEFAULTFILENAME, "_.bmp"
- IDS_MINIATURETITLE, "Miniature"
+ IDS_MINIATURETITLE, "̳"
IDS_TOOLTIP1, " "
IDS_TOOLTIP2, ""
IDS_TOOLTIP3, ""
diff --git a/reactos/base/applications/paint/rsrc.rc b/reactos/base/applications/paint/rsrc.rc
index 7b2e17170ef..da528b3d21c 100644
--- a/reactos/base/applications/paint/rsrc.rc
+++ b/reactos/base/applications/paint/rsrc.rc
@@ -20,6 +20,7 @@
#include "lang/es-ES.rc"
#include "lang/fr-FR.rc"
#include "lang/it-IT.rc"
+#include "lang/ja-JP.rc"
#include "lang/nl-NL.rc"
#include "lang/no-NO.rc"
#include "lang/pl-PL.rc"
@@ -30,6 +31,7 @@
#include "lang/ro-RO.rc"
#include "lang/sk-SK.rc"
// cp 1251 languages
+#include "lang/bg-BG.rc"
#include "lang/ru-RU.rc"
#include "lang/uk-UA.rc"
diff --git a/reactos/base/applications/paint/winproc.c b/reactos/base/applications/paint/winproc.c
index 4e72294a99b..9500bdb1aa6 100644
--- a/reactos/base/applications/paint/winproc.c
+++ b/reactos/base/applications/paint/winproc.c
@@ -313,8 +313,9 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
if (hwnd==hwndMiniature)
{
long mclient[4];
+ HDC hdc;
GetClientRect(hwndMiniature, (LPRECT)&mclient);
- HDC hdc = GetDC(hwndMiniature);
+ hdc = GetDC(hwndMiniature);
BitBlt(hdc, -min(imgXRes*GetScrollPos(hScrollbox, SB_HORZ)/10000, imgXRes-mclient[2]),
-min(imgYRes*GetScrollPos(hScrollbox, SB_VERT)/10000, imgYRes-mclient[3]), imgXRes, imgYRes, hDrawingDC, 0, 0, SRCCOPY);
ReleaseDC(hwndMiniature, hdc);
diff --git a/reactos/base/applications/rapps/CreateCabFile.bat b/reactos/base/applications/rapps/CreateCabFile.bat
new file mode 100644
index 00000000000..b53f1c09593
--- /dev/null
+++ b/reactos/base/applications/rapps/CreateCabFile.bat
@@ -0,0 +1 @@
+c:\cabman.exe -M raw -S rappmgr.cab \rapps\*.txt
diff --git a/reactos/base/applications/rapps/README.ENG b/reactos/base/applications/rapps/README.ENG
new file mode 100644
index 00000000000..8f8149e4867
--- /dev/null
+++ b/reactos/base/applications/rapps/README.ENG
@@ -0,0 +1,54 @@
+ADDING DOWNLOADABLE PROGRAMMS
+
+For an each programm would be creacted an INI alike syntax.
+Also an each field is language inhdepended and individual, an URL's to a source programm is
+also maybe different or even nonexisting for anothers languages.
+For instance a programm 1C which is mostly interested only for russian users and have no
+reason for peoples living in another countries.
+
+The File Overview:
+
+[Section]
+Name = program name
+RegName = Name in registry
+Version = 1.1.1
+Licence = GPL
+Description = Description
+Size = 10 mb
+Category = 5
+URLSite = http://www.site.com/
+URLDownload = http://ftp.site.com/pub/installer.exe
+CDPath = ;
+
+[Section.0419] ; 0419 - for Russian language
+Description = Description in Russian language
+
+
+Obligatory fields are: Name, Category, URLDownload
+Other fields to fill not necessarily.
+
+Categories list:
+1 - Audio
+2 - Video
+3 - Graphics
+4 - Games
+5 - Internet
+6 - Office
+7 - Development
+8 - Edutainment
+9 - Engineering
+10 - Finance
+11 - Science
+12 - Tools
+13 - Drivers
+14 - Libraries
+15 - Other
+
+The list downloadable programms is keeping on a server and updating from a server
+automatically at first time thes programm is running!
+For generating a list of a programm (usually a CAB archive), could be used a batch file CreateCabFile.bat
+After downloading (at first time the programm runs around), this file is placing
+in the same folder where downloaded programm located to future usage them.
+If in some cases an unpacked file is moved, deleted or not exist, then the procedure
+to create a new one would be repeated.
+If the CAB file is moved, deleted or not exist, then it would be downloaded again.
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/README.RUS b/reactos/base/applications/rapps/README.RUS
new file mode 100644
index 00000000000..98492b37fdb
--- /dev/null
+++ b/reactos/base/applications/rapps/README.RUS
@@ -0,0 +1,54 @@
+
+
+ ini- .
+ . ,
+ , - ,
+ - . - .
+, 1C ,
+ .
+
+ :
+
+[Section] ;
+Name = ;
+RegName = ; ,
+Version = 1.1.1 ;
+Licence = ;
+Description = ;
+Size = ;
+Category = 5 ;
+URLSite = http://www.site.com/ ; .
+URLDownload = http://ftp.site.com/pub/installer.exe ; .
+CDPath = ;
+
+[Section.0419] ;
+Description =
+
+
+ : Name, Category, URLDownload
+ .
+
+ :
+1 - Audio
+2 - Video
+3 - Graphics
+4 - Games
+5 - Internet
+6 - Office
+7 - Development
+8 - Edutainment
+9 - Engineering
+10 - Finance
+11 - Science
+12 - Tools
+13 - Drivers
+14 - Libraries
+15 - Other
+
+ !
+ ( CAB-),
+ CreateCabFile.bat. ( )
+ ,
+ . -
+ - . CAB-,
+.
diff --git a/reactos/base/applications/rapps/aboutdlg.c b/reactos/base/applications/rapps/aboutdlg.c
new file mode 100644
index 00000000000..b0da5d69956
--- /dev/null
+++ b/reactos/base/applications/rapps/aboutdlg.c
@@ -0,0 +1,40 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/aboutdlg.c
+ * PURPOSE: About Dialog
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+
+static
+INT_PTR CALLBACK
+AboutDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (Msg)
+ {
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ EndDialog(hDlg, LOWORD(wParam));
+ break;
+ }
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+VOID
+ShowAboutDialog(VOID)
+{
+ DialogBox(hInst,
+ MAKEINTRESOURCE(IDD_ABOUT_DIALOG),
+ hMainWnd,
+ AboutDlgProc);
+}
diff --git a/reactos/base/applications/rapps/available.c b/reactos/base/applications/rapps/available.c
new file mode 100644
index 00000000000..b48e58d291e
--- /dev/null
+++ b/reactos/base/applications/rapps/available.c
@@ -0,0 +1,127 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/available.c
+ * PURPOSE: Functions for working with availabled applications
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+
+BOOL
+ShowAvailableAppInfo(INT Index)
+{
+ PAPPLICATION_INFO Info = (PAPPLICATION_INFO) ListViewGetlParam(Index);
+ WCHAR szText[MAX_STR_LEN];
+
+ if (!Info) return FALSE;
+
+ NewRichEditText(Info->szName, CFE_BOLD);
+
+ InsertRichEditText(L"\n", 0);
+
+#define ADD_TEXT(a, b, c, d) \
+ if (b[0] != '\0') \
+ { \
+ LoadStringW(hInst, a, szText, sizeof(szText) / sizeof(WCHAR)); \
+ InsertRichEditText(szText, c); \
+ InsertRichEditText(b, d); \
+ } \
+
+ ADD_TEXT(IDS_AINFO_VERSION, Info->szVersion, CFE_BOLD, 0);
+ ADD_TEXT(IDS_AINFO_LICENCE, Info->szLicence, CFE_BOLD, 0);
+ ADD_TEXT(IDS_AINFO_SIZE, Info->szSize, CFE_BOLD, 0);
+ ADD_TEXT(IDS_AINFO_URLSITE, Info->szUrlSite, CFE_BOLD, CFE_LINK);
+ ADD_TEXT(IDS_AINFO_DESCRIPTION, Info->szDesc, CFE_BOLD, 0);
+
+ return TRUE;
+}
+
+
+BOOL
+EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
+{
+ HANDLE hFind = INVALID_HANDLE_VALUE;
+ WIN32_FIND_DATAW FindFileData;
+ WCHAR szPath[MAX_PATH];
+ WCHAR szAppsPath[MAX_PATH];
+ WCHAR szSectionLocale[MAX_PATH] = L"Section.";
+ WCHAR szCabPath[MAX_PATH];
+ WCHAR szLocale[4 + 1];
+ APPLICATION_INFO Info;
+
+ if (!GetCurrentDirectoryW(MAX_PATH, szPath))
+ {
+ return FALSE;
+ }
+
+ swprintf(szCabPath, L"%s\\rappmgr.cab", szPath);
+
+ wcscat(szPath, L"\\rapps\\");
+ wcscpy(szAppsPath, szPath);
+
+ if (!CreateDirectory(szPath, NULL) &&
+ GetLastError() != ERROR_ALREADY_EXISTS)
+ {
+ return FALSE;
+ }
+
+ GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_ILANGUAGE, szLocale, sizeof(szLocale) / sizeof(WCHAR));
+ wcscat(szSectionLocale, szLocale);
+
+ wcscat(szPath, L"*.txt");
+
+ hFind = FindFirstFileW(szPath, &FindFileData);
+ if (hFind == INVALID_HANDLE_VALUE)
+ {
+ if (GetFileAttributesW(szCabPath) == 0xFFFFFFFF)
+ DownloadApplicationsDB(APPLICATION_DATEBASE_URL);
+
+ ExtractFilesFromCab(szCabPath, szAppsPath);
+ hFind = FindFirstFileW(szPath, &FindFileData);
+ if (hFind == INVALID_HANDLE_VALUE)
+ return FALSE;
+ }
+
+#define GET_STRING1(a, b) \
+ if (!ParserGetString(szSectionLocale, a, b, MAX_PATH, FindFileData.cFileName)) \
+ if (!ParserGetString(L"Section", a, b, MAX_PATH, FindFileData.cFileName)) \
+ continue;
+
+#define GET_STRING2(a, b) \
+ if (!ParserGetString(szSectionLocale, a, b, MAX_PATH, FindFileData.cFileName)) \
+ if (!ParserGetString(L"Section", a, b, MAX_PATH, FindFileData.cFileName)) \
+ b[0] = '\0';
+
+ do
+ {
+ Info.Category = ParserGetInt(szSectionLocale, L"Category", FindFileData.cFileName);
+ if (Info.Category == -1)
+ {
+ Info.Category = ParserGetInt(L"Section", L"Category", FindFileData.cFileName);
+ if (Info.Category == -1)
+ continue;
+ }
+
+ if (EnumType != Info.Category && EnumType != ENUM_ALL_AVAILABLE) continue;
+
+ GET_STRING1(L"Name", Info.szName);
+ GET_STRING1(L"URLDownload", Info.szUrlDownload);
+
+ GET_STRING2(L"RegName", Info.szRegName);
+ GET_STRING2(L"Version", Info.szVersion);
+ GET_STRING2(L"Licence", Info.szLicence);
+ GET_STRING2(L"Description", Info.szDesc);
+ GET_STRING2(L"Size", Info.szSize);
+ GET_STRING2(L"URLSite", Info.szUrlSite);
+ GET_STRING2(L"CDPath", Info.szCDPath);
+
+ if (!lpEnumProc(Info)) break;
+ }
+ while (FindNextFileW(hFind, &FindFileData) != 0);
+
+ FindClose(hFind);
+
+ return TRUE;
+}
diff --git a/reactos/base/applications/rapps/installdlg.c b/reactos/base/applications/rapps/installdlg.c
new file mode 100644
index 00000000000..392bf3d52ce
--- /dev/null
+++ b/reactos/base/applications/rapps/installdlg.c
@@ -0,0 +1,57 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/installdlg.c
+ * PURPOSE: "Download and Install" Dialog
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+static PAPPLICATION_INFO AppInfo;
+
+
+static
+INT_PTR CALLBACK
+InstallDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (Msg)
+ {
+ case WM_INITDIALOG:
+ {
+
+ }
+ break;
+
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ case IDCANCEL:
+ EndDialog(hDlg, LOWORD(wParam));
+ break;
+ }
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+BOOL
+InstallApplication(INT Index)
+{
+ if (!IS_AVAILABLE_ENUM(SelectedEnumType))
+ return FALSE;
+
+ AppInfo = (PAPPLICATION_INFO) ListViewGetlParam(Index);
+ if (!AppInfo) return FALSE;
+
+ DialogBox(hInst,
+ MAKEINTRESOURCE(IDD_INSTALL_DIALOG),
+ hMainWnd,
+ InstallDlgProc);
+
+ return TRUE;
+}
diff --git a/reactos/base/applications/rapps/installed.c b/reactos/base/applications/rapps/installed.c
new file mode 100644
index 00000000000..5659e2db908
--- /dev/null
+++ b/reactos/base/applications/rapps/installed.c
@@ -0,0 +1,253 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/installed.c
+ * PURPOSE: Functions for working with installed applications
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+
+BOOL
+GetApplicationString(HKEY hKey, LPWSTR lpKeyName, LPWSTR lpString)
+{
+ DWORD dwSize = MAX_PATH;
+
+ if (RegQueryValueExW(hKey,
+ lpKeyName,
+ NULL,
+ NULL,
+ (LPBYTE)lpString,
+ &dwSize) == ERROR_SUCCESS)
+ {
+ return TRUE;
+ }
+
+ wcscpy(lpString, L"---");
+
+ return FALSE;
+}
+
+
+BOOL
+IsInstalledApplication(LPWSTR lpRegName, BOOL IsUserKey)
+{
+ DWORD dwSize = MAX_PATH, dwType;
+ WCHAR szName[MAX_PATH];
+ WCHAR szDisplayName[MAX_PATH];
+ HKEY hKey, hSubKey;
+ INT ItemIndex = 0;
+
+ if (RegOpenKeyW(IsUserKey ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
+ L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
+ &hKey) != ERROR_SUCCESS)
+ {
+ return FALSE;
+ }
+
+ while (RegEnumKeyExW(hKey, ItemIndex, szName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
+ {
+ if (RegOpenKeyW(hKey, szName, &hSubKey) == ERROR_SUCCESS)
+ {
+ dwType = REG_SZ;
+ dwSize = MAX_PATH;
+ if (RegQueryValueExW(hSubKey,
+ L"DisplayName",
+ NULL,
+ &dwType,
+ (LPBYTE)szDisplayName,
+ &dwSize) == ERROR_SUCCESS)
+ {
+ if (wcscmp(szDisplayName, lpRegName) == 0)
+ {
+ RegCloseKey(hSubKey);
+ RegCloseKey(hKey);
+ return TRUE;
+ }
+ }
+ }
+
+ RegCloseKey(hSubKey);
+ dwSize = MAX_PATH;
+ ItemIndex++;
+ }
+
+ RegCloseKey(hKey);
+ return FALSE;
+}
+
+
+BOOL
+UninstallApplication(INT Index, BOOL bModify)
+{
+ WCHAR szModify[] = L"ModifyPath";
+ WCHAR szUninstall[] = L"UninstallString";
+ WCHAR szPath[MAX_PATH];
+ DWORD dwType, dwSize;
+ INT ItemIndex;
+ LVITEM Item;
+ HKEY hKey;
+
+ if (!IS_INSTALLED_ENUM(SelectedEnumType))
+ return FALSE;
+
+ if (Index == -1)
+ {
+ ItemIndex = (INT) SendMessageW(hListView, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+ if (ItemIndex == -1)
+ return FALSE;
+ }
+ else
+ {
+ ItemIndex = Index;
+ }
+
+ ZeroMemory(&Item, sizeof(LVITEM));
+
+ Item.mask = LVIF_PARAM;
+ Item.iItem = ItemIndex;
+ if (!ListView_GetItem(hListView, &Item))
+ return FALSE;
+
+ hKey = (HKEY)Item.lParam;
+
+ dwType = REG_SZ;
+ dwSize = MAX_PATH;
+ if (RegQueryValueExW(hKey,
+ bModify ? szModify : szUninstall,
+ NULL,
+ &dwType,
+ (LPBYTE)szPath,
+ &dwSize) != ERROR_SUCCESS)
+ {
+ return FALSE;
+ }
+
+ return StartProcess(szPath, TRUE);
+}
+
+
+BOOL
+ShowInstalledAppInfo(INT Index)
+{
+ WCHAR szText[MAX_PATH], szInfo[MAX_PATH];
+ HKEY hKey = (HKEY) ListViewGetlParam(Index);
+
+ if (!hKey) return FALSE;
+
+ GetApplicationString(hKey, L"DisplayName", szText);
+ NewRichEditText(szText, CFE_BOLD);
+
+ InsertRichEditText(L"\n", 0);
+
+#define GET_INFO(a, b, c, d) \
+ if (GetApplicationString(hKey, a, szInfo)) \
+ { \
+ LoadStringW(hInst, b, szText, sizeof(szText) / sizeof(WCHAR)); \
+ InsertRichEditText(szText, c); \
+ InsertRichEditText(szInfo, d); \
+ } \
+
+ GET_INFO(L"DisplayVersion", IDS_INFO_VERSION, CFE_BOLD, 0);
+ GET_INFO(L"Publisher", IDS_INFO_PUBLISHER, CFE_BOLD, 0);
+ GET_INFO(L"RegOwner", IDS_INFO_REGOWNER, CFE_BOLD, 0);
+ GET_INFO(L"ProductID", IDS_INFO_PRODUCTID, CFE_BOLD, 0);
+ GET_INFO(L"HelpLink", IDS_INFO_HELPLINK, CFE_BOLD, CFM_LINK);
+ GET_INFO(L"HelpTelephone", IDS_INFO_HELPPHONE, CFE_BOLD, 0);
+ GET_INFO(L"Readme", IDS_INFO_README, CFE_BOLD, 0);
+ GET_INFO(L"Contact", IDS_INFO_CONTACT, CFE_BOLD, 0);
+ GET_INFO(L"URLUpdateInfo", IDS_INFO_UPDATEINFO, CFE_BOLD, CFM_LINK);
+ GET_INFO(L"URLInfoAbout", IDS_INFO_INFOABOUT, CFE_BOLD, CFM_LINK);
+ GET_INFO(L"Comments", IDS_INFO_COMMENTS, CFE_BOLD, 0);
+ GET_INFO(L"InstallDate", IDS_INFO_INSTALLDATE, CFE_BOLD, 0);
+ GET_INFO(L"InstallLocation", IDS_INFO_INSTLOCATION, CFE_BOLD, 0);
+ GET_INFO(L"InstallSource", IDS_INFO_INSTALLSRC, CFE_BOLD, 0);
+ GET_INFO(L"UninstallString", IDS_INFO_UNINSTALLSTR, CFE_BOLD, 0);
+ GET_INFO(L"InstallSource", IDS_INFO_INSTALLSRC, CFE_BOLD, 0);
+ GET_INFO(L"ModifyPath", IDS_INFO_MODIFYPATH, CFE_BOLD, 0);
+
+ return TRUE;
+}
+
+
+BOOL
+EnumInstalledApplications(INT EnumType, BOOL IsUserKey, APPENUMPROC lpEnumProc)
+{
+ DWORD dwSize = MAX_PATH, dwType, dwValue;
+ BOOL bIsSystemComponent, bIsUpdate;
+ WCHAR pszName[MAX_PATH];
+ WCHAR pszParentKeyName[MAX_PATH];
+ WCHAR pszDisplayName[MAX_PATH];
+ HKEY hKey, hSubKey;
+ LONG ItemIndex = 0;
+
+ if (RegOpenKeyW(IsUserKey ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
+ L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
+ &hKey) != ERROR_SUCCESS)
+ {
+ return FALSE;
+ }
+
+ while (RegEnumKeyExW(hKey, ItemIndex, pszName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
+ {
+ if (RegOpenKeyW(hKey, pszName, &hSubKey) == ERROR_SUCCESS)
+ {
+ dwType = REG_DWORD;
+ dwSize = sizeof(DWORD);
+
+ if (RegQueryValueExW(hSubKey,
+ L"SystemComponent",
+ NULL,
+ &dwType,
+ (LPBYTE)&dwValue,
+ &dwSize) == ERROR_SUCCESS)
+ {
+ bIsSystemComponent = (dwValue == 0x1);
+ }
+ else
+ {
+ bIsSystemComponent = FALSE;
+ }
+
+ dwType = REG_SZ;
+ dwSize = MAX_PATH;
+ bIsUpdate = (RegQueryValueExW(hSubKey,
+ L"ParentKeyName",
+ NULL,
+ &dwType,
+ (LPBYTE)pszParentKeyName,
+ &dwSize) == ERROR_SUCCESS);
+
+ dwSize = MAX_PATH;
+ if (RegQueryValueExW(hSubKey,
+ L"DisplayName",
+ NULL,
+ &dwType,
+ (LPBYTE)pszDisplayName,
+ &dwSize) == ERROR_SUCCESS)
+ {
+ if (EnumType < ENUM_ALL_COMPONENTS || EnumType > ENUM_UPDATES)
+ EnumType = ENUM_ALL_COMPONENTS;
+
+ if (!bIsSystemComponent)
+ {
+ if ((EnumType == ENUM_ALL_COMPONENTS) || /* All components */
+ ((EnumType == ENUM_APPLICATIONS) && (!bIsUpdate)) || /* Applications only */
+ ((EnumType == ENUM_UPDATES) && (bIsUpdate))) /* Updates only */
+ {
+ if (!lpEnumProc(ItemIndex, pszDisplayName, pszName, (LPARAM)hSubKey))
+ break;
+ }
+ }
+ }
+ }
+
+ dwSize = MAX_PATH;
+ ItemIndex++;
+ }
+
+ RegCloseKey(hKey);
+
+ return TRUE;
+}
diff --git a/reactos/base/applications/rapps/lang/bg-BG.rc b/reactos/base/applications/rapps/lang/bg-BG.rc
new file mode 100644
index 00000000000..57525eb1829
--- /dev/null
+++ b/reactos/base/applications/rapps/lang/bg-BG.rc
@@ -0,0 +1,167 @@
+LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
+
+IDR_MAINMENU MENU
+BEGIN
+ POPUP "&"
+ BEGIN
+ MENUITEM "&", ID_SETTINGS, GRAYED
+ MENUITEM SEPARATOR
+ MENUITEM "&", ID_EXIT
+ END
+ POPUP "&"
+ BEGIN
+ MENUITEM "&", ID_INSTALL
+ MENUITEM "&",ID_UNINSTALL
+ MENUITEM "&", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&", ID_REFRESH
+ END
+ POPUP ""
+ BEGIN
+ MENUITEM "", ID_HELP, GRAYED
+ MENUITEM "", ID_ABOUT
+ END
+END
+
+IDR_LINKMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "& ", ID_OPEN_LINK
+ MENUITEM "& ", ID_COPY_LINK
+ END
+END
+
+IDR_APPLICATIONMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&", ID_INSTALL
+ MENUITEM "&", ID_UNINSTALL
+ MENUITEM "&", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&", ID_REFRESH
+ END
+END
+
+IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION ""
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION " "
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
+STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE
+CAPTION ""
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "Progress1", IDC_DOWNLOAD_PROGRESS, "msctls_progress32", WS_BORDER | PBS_SMOOTH, 10, 10, 200, 12
+ LTEXT "", IDC_DOWNLOAD_STATUS, 10, 30, 200, 10, SS_CENTER
+ PUSHBUTTON "", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
+END
+
+IDD_ABOUT_DIALOG DIALOGEX 22, 16, 210, 66
+STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
+CAPTION ""
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT " \n (C) 2009\n (dmitry@reactos.org)", IDC_STATIC, 48, 7, 150, 39
+ PUSHBUTTON "", IDOK, 133, 46, 50, 14
+ ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TOOLTIP_INSTALL ""
+ IDS_TOOLTIP_UNINSTALL ""
+ IDS_TOOLTIP_MODIFY ""
+ IDS_TOOLTIP_SETTINGS ""
+ IDS_TOOLTIP_REFRESH ""
+ IDS_TOOLTIP_EXIT ""
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_NAME ""
+ IDS_APP_INST_VERSION ""
+ IDS_APP_DESCRIPTION ""
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_INFO_VERSION "\n: "
+ IDS_INFO_DESCRIPTION "\n: "
+ IDS_INFO_PUBLISHER "\n: "
+ IDS_INFO_HELPLINK "\n : "
+ IDS_INFO_HELPPHONE "\n : "
+ IDS_INFO_README "\n : "
+ IDS_INFO_REGOWNER "\n : "
+ IDS_INFO_PRODUCTID "\n : "
+ IDS_INFO_CONTACT "\n: "
+ IDS_INFO_UPDATEINFO "\n : "
+ IDS_INFO_INFOABOUT "\n : "
+ IDS_INFO_COMMENTS "\n: "
+ IDS_INFO_INSTLOCATION "\n : "
+ IDS_INFO_INSTALLSRC "\n : "
+ IDS_INFO_UNINSTALLSTR "\n : "
+ IDS_INFO_MODIFYPATH "\n : "
+ IDS_INFO_INSTALLDATE "\n : "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_AINFO_VERSION "\n: "
+ IDS_AINFO_DESCRIPTION "\n: "
+ IDS_AINFO_SIZE "\n: "
+ IDS_AINFO_URLSITE "\n : "
+ IDS_AINFO_LICENCE "\n: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_CAT_AUDIO ""
+ IDS_CAT_DEVEL ""
+ IDS_CAT_DRIVERS " ()"
+ IDS_CAT_EDU ""
+ IDS_CAT_ENGINEER ""
+ IDS_CAT_FINANCE ""
+ IDS_CAT_GAMES " "
+ IDS_CAT_GRAPHICS ""
+ IDS_CAT_INTERNET " "
+ IDS_CAT_LIBS ""
+ IDS_CAT_OFFICE ""
+ IDS_CAT_OTHER ""
+ IDS_CAT_SCIENCE ""
+ IDS_CAT_TOOLS ""
+ IDS_CAT_VIDEO ""
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APPTITLE " "
+ IDS_SEARCH_TEXT ""
+ IDS_INSTALL ""
+ IDS_UNINSTALL ""
+ IDS_MODIFY ""
+ IDS_APPS_COUNT " : %d"
+ IDS_WELCOME_TITLE " !\n\n"
+ IDS_WELCOME_TEXT " , .\n : "
+ IDS_WELCOME_URL "http://www.reactos.org"
+ IDS_INSTALLED ""
+ IDS_AVAILABLEFORINST " "
+ IDS_UPDATES ""
+ IDS_APPLICATIONS ""
+ IDS_DOWNLOAD_FOLDER ""
+END
diff --git a/reactos/base/applications/rapps/lang/de-DE.rc b/reactos/base/applications/rapps/lang/de-DE.rc
new file mode 100644
index 00000000000..a962ae36adb
--- /dev/null
+++ b/reactos/base/applications/rapps/lang/de-DE.rc
@@ -0,0 +1,167 @@
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+
+IDR_MAINMENU MENU
+BEGIN
+ POPUP "&Datei"
+ BEGIN
+ MENUITEM "&Einstellungen", ID_SETTINGS, GRAYED
+ MENUITEM SEPARATOR
+ MENUITEM "&Beenden", ID_EXIT
+ END
+ POPUP "&Programme"
+ BEGIN
+ MENUITEM "&Installieren", ID_INSTALL
+ MENUITEM "&Deinstallieren",ID_UNINSTALL
+ MENUITEM "&ndern", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&Aktualisieren", ID_REFRESH
+ END
+ POPUP "Hilfe"
+ BEGIN
+ MENUITEM "Hilfe", ID_HELP, GRAYED
+ MENUITEM "ber", ID_ABOUT
+ END
+END
+
+IDR_LINKMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&ffne den Link in einem Browser", ID_OPEN_LINK
+ MENUITEM "&Kopiere den Link in die Zwischenablage", ID_COPY_LINK
+ END
+END
+
+IDR_APPLICATIONMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&Installieren", ID_INSTALL
+ MENUITEM "&Deinstallieren", ID_UNINSTALL
+ MENUITEM "&ndern", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&Aktualisieren", ID_REFRESH
+ END
+END
+
+IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Einstellungen"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "Abbrechen", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Herunterladen und installieren"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "Abbrechen", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
+STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE
+CAPTION "Herunterladen..."
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "Progress1", IDC_DOWNLOAD_PROGRESS, "msctls_progress32", WS_BORDER | PBS_SMOOTH, 10, 10, 200, 12
+ LTEXT "", IDC_DOWNLOAD_STATUS, 10, 30, 200, 10, SS_CENTER
+ PUSHBUTTON "Abbrechen", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
+END
+
+IDD_ABOUT_DIALOG DIALOGEX 22, 16, 190, 66
+STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
+CAPTION "ber"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "ReactOS Anwendungsmanager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
+ PUSHBUTTON "Schlieen", IDOK, 133, 46, 50, 14
+ ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TOOLTIP_INSTALL "Installieren"
+ IDS_TOOLTIP_UNINSTALL "Deinstallieren"
+ IDS_TOOLTIP_MODIFY "ndern"
+ IDS_TOOLTIP_SETTINGS "Einstellungen"
+ IDS_TOOLTIP_REFRESH "Aktualisieren"
+ IDS_TOOLTIP_EXIT "Beenden"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_NAME "Name"
+ IDS_APP_INST_VERSION "Version"
+ IDS_APP_DESCRIPTION "Beschreibung"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_INFO_VERSION "\nVersion: "
+ IDS_INFO_DESCRIPTION "\nBeschreibung: "
+ IDS_INFO_PUBLISHER "\nPublisher: "
+ IDS_INFO_HELPLINK "\nHilfe-Link: "
+ IDS_INFO_HELPPHONE "\nHilfe-Telefonnr.: "
+ IDS_INFO_README "\nReadme: "
+ IDS_INFO_REGOWNER "\nregistrierter Eigentmer: "
+ IDS_INFO_PRODUCTID "\nProdukt-ID: "
+ IDS_INFO_CONTACT "\nKontaktt: "
+ IDS_INFO_UPDATEINFO "\nUpdate Information: "
+ IDS_INFO_INFOABOUT "\nInformation ber: "
+ IDS_INFO_COMMENTS "\nKommentare: "
+ IDS_INFO_INSTLOCATION "\nInstallationsort: "
+ IDS_INFO_INSTALLSRC "\nInstallationsquelle: "
+ IDS_INFO_UNINSTALLSTR "\nDeinstallationsstring: "
+ IDS_INFO_MODIFYPATH "\nnderungspfad: "
+ IDS_INFO_INSTALLDATE "\nInstallationsdatum: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_AINFO_VERSION "\nVersion: "
+ IDS_AINFO_DESCRIPTION "\nBeschreibung: "
+ IDS_AINFO_SIZE "\nGre: "
+ IDS_AINFO_URLSITE "\nHomepage: "
+ IDS_AINFO_LICENCE "\nLizenz: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_CAT_AUDIO "Audio"
+ IDS_CAT_DEVEL "Entwicklung"
+ IDS_CAT_DRIVERS "Treiber"
+ IDS_CAT_EDU "Edutainment"
+ IDS_CAT_ENGINEER "Technische Anwendungen"
+ IDS_CAT_FINANCE "Finanzen"
+ IDS_CAT_GAMES "Spiele & Spa"
+ IDS_CAT_GRAPHICS "Grafik"
+ IDS_CAT_INTERNET "Internet & Netzwerk"
+ IDS_CAT_LIBS "Bibliotheken"
+ IDS_CAT_OFFICE "Bro"
+ IDS_CAT_OTHER "Sonstiges"
+ IDS_CAT_SCIENCE "Wissenschaft"
+ IDS_CAT_TOOLS "Werkzeuge"
+ IDS_CAT_VIDEO "Video"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APPTITLE "ReactOS Anwendungsmanager"
+ IDS_SEARCH_TEXT "Suche..."
+ IDS_INSTALL "Installieren"
+ IDS_UNINSTALL "Deinstallieren"
+ IDS_MODIFY "ndern"
+ IDS_APPS_COUNT "Anzahl der Anwendungen: %d"
+ IDS_WELCOME_TITLE "Willkommen im ReactOS Anwendungsmanager!\n\n"
+ IDS_WELCOME_TEXT "Whlen Sie links eine Kategorie und dann eine Anwendung um sie zu installieren oder zu deinstallieren.\nReactOS Webseite: "
+ IDS_WELCOME_URL "http://www.reactos.org"
+ IDS_INSTALLED "Installiert"
+ IDS_AVAILABLEFORINST "Zur Installation verfgbar"
+ IDS_UPDATES "Updates"
+ IDS_APPLICATIONS "Anwendungen"
+ IDS_DOWNLOAD_FOLDER "Downloads"
+END
diff --git a/reactos/base/applications/rapps/lang/en-US.rc b/reactos/base/applications/rapps/lang/en-US.rc
new file mode 100644
index 00000000000..6a51e1992de
--- /dev/null
+++ b/reactos/base/applications/rapps/lang/en-US.rc
@@ -0,0 +1,167 @@
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+IDR_MAINMENU MENU
+BEGIN
+ POPUP "&File"
+ BEGIN
+ MENUITEM "&Settings", ID_SETTINGS, GRAYED
+ MENUITEM SEPARATOR
+ MENUITEM "E&xit", ID_EXIT
+ END
+ POPUP "&Programs"
+ BEGIN
+ MENUITEM "&Install", ID_INSTALL
+ MENUITEM "&Uninstall",ID_UNINSTALL
+ MENUITEM "&Modify", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&Refresh", ID_REFRESH
+ END
+ POPUP "Help"
+ BEGIN
+ MENUITEM "Help", ID_HELP, GRAYED
+ MENUITEM "About", ID_ABOUT
+ END
+END
+
+IDR_LINKMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&Open link in a browser", ID_OPEN_LINK
+ MENUITEM "&Copy link to clipboard", ID_COPY_LINK
+ END
+END
+
+IDR_APPLICATIONMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&Install", ID_INSTALL
+ MENUITEM "&Uninstall", ID_UNINSTALL
+ MENUITEM "&Modify", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&Refresh", ID_REFRESH
+ END
+END
+
+IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Settings"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "Cancel", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Download and Install"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "Cancel", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
+STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE
+CAPTION "Download..."
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "Progress1", IDC_DOWNLOAD_PROGRESS, "msctls_progress32", WS_BORDER | PBS_SMOOTH, 10, 10, 200, 12
+ LTEXT "", IDC_DOWNLOAD_STATUS, 10, 30, 200, 10, SS_CENTER
+ PUSHBUTTON "Cancel", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
+END
+
+IDD_ABOUT_DIALOG DIALOGEX 22, 16, 190, 66
+STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
+CAPTION "About"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "ReactOS Applications Manager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
+ PUSHBUTTON "Close", IDOK, 133, 46, 50, 14
+ ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TOOLTIP_INSTALL "Install"
+ IDS_TOOLTIP_UNINSTALL "Uninstall"
+ IDS_TOOLTIP_MODIFY "Modify"
+ IDS_TOOLTIP_SETTINGS "Settings"
+ IDS_TOOLTIP_REFRESH "Refresh"
+ IDS_TOOLTIP_EXIT "Exit"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_NAME "Name"
+ IDS_APP_INST_VERSION "Version"
+ IDS_APP_DESCRIPTION "Description"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_INFO_VERSION "\nVersion: "
+ IDS_INFO_DESCRIPTION "\nDescription: "
+ IDS_INFO_PUBLISHER "\nPublisher: "
+ IDS_INFO_HELPLINK "\nHelp Link: "
+ IDS_INFO_HELPPHONE "\nHelp Telephone: "
+ IDS_INFO_README "\nReadme: "
+ IDS_INFO_REGOWNER "\nRegistered Owner: "
+ IDS_INFO_PRODUCTID "\nProductID: "
+ IDS_INFO_CONTACT "\nContact: "
+ IDS_INFO_UPDATEINFO "\nUpdate Information: "
+ IDS_INFO_INFOABOUT "\nInformation About: "
+ IDS_INFO_COMMENTS "\nComments: "
+ IDS_INFO_INSTLOCATION "\nInstall Location: "
+ IDS_INFO_INSTALLSRC "\nInstall Source: "
+ IDS_INFO_UNINSTALLSTR "\nUninstall String: "
+ IDS_INFO_MODIFYPATH "\nModify Path: "
+ IDS_INFO_INSTALLDATE "\nInstall Date: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_AINFO_VERSION "\nVersion: "
+ IDS_AINFO_DESCRIPTION "\nDescription: "
+ IDS_AINFO_SIZE "\nSize: "
+ IDS_AINFO_URLSITE "\nHome Page: "
+ IDS_AINFO_LICENCE "\nLicence: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_CAT_AUDIO "Audio"
+ IDS_CAT_DEVEL "Development"
+ IDS_CAT_DRIVERS "Drivers"
+ IDS_CAT_EDU "Edutainment"
+ IDS_CAT_ENGINEER "Engineering"
+ IDS_CAT_FINANCE "Finance"
+ IDS_CAT_GAMES "Games & Fun"
+ IDS_CAT_GRAPHICS "Graphics"
+ IDS_CAT_INTERNET "Internet & Network"
+ IDS_CAT_LIBS "Libraries"
+ IDS_CAT_OFFICE "Office"
+ IDS_CAT_OTHER "Other"
+ IDS_CAT_SCIENCE "Science"
+ IDS_CAT_TOOLS "Tools"
+ IDS_CAT_VIDEO "Video"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APPTITLE "ReactOS Applications Manager"
+ IDS_SEARCH_TEXT "Search..."
+ IDS_INSTALL "Install"
+ IDS_UNINSTALL "Uninstall"
+ IDS_MODIFY "Modify"
+ IDS_APPS_COUNT "Applications count: %d"
+ IDS_WELCOME_TITLE "Welcome to ReactOS Application Manager!\n\n"
+ IDS_WELCOME_TEXT "Choose a category on the left, then choose a application for install or uninstall.\nReactOS Web Site: "
+ IDS_WELCOME_URL "http://www.reactos.org"
+ IDS_INSTALLED "Installed"
+ IDS_AVAILABLEFORINST "Available for installation"
+ IDS_UPDATES "Updates"
+ IDS_APPLICATIONS "Applications"
+ IDS_DOWNLOAD_FOLDER "Downloads"
+END
diff --git a/reactos/base/applications/rapps/lang/ja-JP.rc b/reactos/base/applications/rapps/lang/ja-JP.rc
new file mode 100644
index 00000000000..e80c1e5b94f
--- /dev/null
+++ b/reactos/base/applications/rapps/lang/ja-JP.rc
@@ -0,0 +1,167 @@
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+
+IDR_MAINMENU MENU
+BEGIN
+ POPUP "t@C(&F)"
+ BEGIN
+ MENUITEM "ݒ(&S)", ID_SETTINGS, GRAYED
+ MENUITEM SEPARATOR
+ MENUITEM "I(&X)", ID_EXIT
+ END
+ POPUP "vO(&P)"
+ BEGIN
+ MENUITEM "CXg[(&I)", ID_INSTALL
+ MENUITEM "ACXg[(&U)",ID_UNINSTALL
+ MENUITEM "ύX(&M)", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "XV(&R)", ID_REFRESH
+ END
+ POPUP "wv"
+ BEGIN
+ MENUITEM "wv", ID_HELP, GRAYED
+ MENUITEM "o[W", ID_ABOUT
+ END
+END
+
+IDR_LINKMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "uEUŃNJ(&O)", ID_OPEN_LINK
+ MENUITEM "Nbv{[hɃRs[(&C)", ID_COPY_LINK
+ END
+END
+
+IDR_APPLICATIONMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "CXg[(&I)", ID_INSTALL
+ MENUITEM "ACXg[(&U)", ID_UNINSTALL
+ MENUITEM "ύX(&M)", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "XV(&R)", ID_REFRESH
+ END
+END
+
+IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "ݒ"
+FONT 9, "MS UI Gothic"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "LZ", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "_E[hƃCXg["
+FONT 9, "MS UI Gothic"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "LZ", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
+STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE
+CAPTION "_E[h..."
+FONT 9, "MS UI Gothic"
+BEGIN
+ CONTROL "Progress1", IDC_DOWNLOAD_PROGRESS, "msctls_progress32", WS_BORDER | PBS_SMOOTH, 10, 10, 200, 12
+ LTEXT "", IDC_DOWNLOAD_STATUS, 10, 30, 200, 10, SS_CENTER
+ PUSHBUTTON "LZ", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
+END
+
+IDD_ABOUT_DIALOG DIALOGEX 22, 16, 190, 66
+STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
+CAPTION "o[W"
+FONT 9, "MS UI Gothic"
+BEGIN
+ LTEXT "ReactOS AvP[V }l[W[\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
+ PUSHBUTTON "", IDOK, 133, 46, 50, 14
+ ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TOOLTIP_INSTALL "CXg["
+ IDS_TOOLTIP_UNINSTALL "ACXg["
+ IDS_TOOLTIP_MODIFY "ύX"
+ IDS_TOOLTIP_SETTINGS "ݒ"
+ IDS_TOOLTIP_REFRESH "XV"
+ IDS_TOOLTIP_EXIT "I"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_NAME "O"
+ IDS_APP_INST_VERSION "o[W"
+ IDS_APP_DESCRIPTION "Tv"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_INFO_VERSION "\no[W: "
+ IDS_INFO_DESCRIPTION "\nTv: "
+ IDS_INFO_PUBLISHER "\ns: "
+ IDS_INFO_HELPLINK "\nwvւ̃N: "
+ IDS_INFO_HELPPHONE "\nwv̓dbԍ: "
+ IDS_INFO_README "\nReadmëʒu: "
+ IDS_INFO_REGOWNER "\no^ꂽL: "
+ IDS_INFO_PRODUCTID "\nv_NgID: "
+ IDS_INFO_CONTACT "\nA: "
+ IDS_INFO_UPDATEINFO "\nAbvf[g: "
+ IDS_INFO_INFOABOUT "\nɊւ: "
+ IDS_INFO_COMMENTS "\nRg: "
+ IDS_INFO_INSTLOCATION "\nCXg[ꏊ: "
+ IDS_INFO_INSTALLSRC "\nCXg[: "
+ IDS_INFO_UNINSTALLSTR "\nACXg[Ɏgp镶: "
+ IDS_INFO_MODIFYPATH "\nύXɎgppX: "
+ IDS_INFO_INSTALLDATE "\nCXg[t: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_AINFO_VERSION "\no[W: "
+ IDS_AINFO_DESCRIPTION "\nTv: "
+ IDS_AINFO_SIZE "\nTCY: "
+ IDS_AINFO_URLSITE "\nz[y[W: "
+ IDS_AINFO_LICENCE "\nCZX: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_CAT_AUDIO "I[fBI"
+ IDS_CAT_DEVEL "J"
+ IDS_CAT_DRIVERS "hCo"
+ IDS_CAT_EDU ""
+ IDS_CAT_ENGINEER "Hw"
+ IDS_CAT_FINANCE "oc"
+ IDS_CAT_GAMES "Q[Ƃy"
+ IDS_CAT_GRAPHICS "OtBbNX"
+ IDS_CAT_INTERNET "C^[lbgƃlbg[N"
+ IDS_CAT_LIBS "Cu"
+ IDS_CAT_OFFICE "ItBX"
+ IDS_CAT_OTHER "̑"
+ IDS_CAT_SCIENCE "Ȋw"
+ IDS_CAT_TOOLS "c["
+ IDS_CAT_VIDEO "rfI"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APPTITLE "ReactOS AvP[V }l[W["
+ IDS_SEARCH_TEXT "..."
+ IDS_INSTALL "CXg["
+ IDS_UNINSTALL "ACXg["
+ IDS_MODIFY "ύX"
+ IDS_APPS_COUNT "AvP[V: %d"
+ IDS_WELCOME_TITLE "ReactOS AvP[V }l[W[ւ悤!\n\n"
+ IDS_WELCOME_TEXT "JeSIACXg[̓ACXg[AvP[VIłB\nReactOS EFu TCg: "
+ IDS_WELCOME_URL "http://www.reactos.org"
+ IDS_INSTALLED "CXg[ς"
+ IDS_AVAILABLEFORINST "CXg[\\"
+ IDS_UPDATES "Abvf[g"
+ IDS_APPLICATIONS "AvP[V"
+ IDS_DOWNLOAD_FOLDER "_E[h"
+END
diff --git a/reactos/base/applications/rapps/lang/no-NO.rc b/reactos/base/applications/rapps/lang/no-NO.rc
new file mode 100644
index 00000000000..8b15e14a6b7
--- /dev/null
+++ b/reactos/base/applications/rapps/lang/no-NO.rc
@@ -0,0 +1,167 @@
+LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL
+
+IDR_MAINMENU MENU
+BEGIN
+ POPUP "&Fil"
+ BEGIN
+ MENUITEM "&Innstillinger", ID_SETTINGS, GRAYED
+ MENUITEM SEPARATOR
+ MENUITEM "A&vslutt", ID_EXIT
+ END
+ POPUP "&Programmer"
+ BEGIN
+ MENUITEM "&Installere", ID_INSTALL
+ MENUITEM "&Avinstallere",ID_UNINSTALL
+ MENUITEM "&Endre", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&Oppdatere", ID_REFRESH
+ END
+ POPUP "Hjelp"
+ BEGIN
+ MENUITEM "Hjelp", ID_HELP, GRAYED
+ MENUITEM "Om", ID_ABOUT
+ END
+END
+
+IDR_LINKMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&pne lenke i en nettleser", ID_OPEN_LINK
+ MENUITEM "&Kopier lenke til utklipptavlen", ID_COPY_LINK
+ END
+END
+
+IDR_APPLICATIONMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&Installere", ID_INSTALL
+ MENUITEM "&Avinstallere", ID_UNINSTALL
+ MENUITEM "&Endre", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&Oppdater", ID_REFRESH
+ END
+END
+
+IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Innstillinger"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "Avbryt", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Last ned og installere"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "Avbryt", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
+STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE
+CAPTION "Lastet ned..."
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "Progress1", IDC_DOWNLOAD_PROGRESS, "msctls_progress32", WS_BORDER | PBS_SMOOTH, 10, 10, 200, 12
+ LTEXT "", IDC_DOWNLOAD_STATUS, 10, 30, 200, 10, SS_CENTER
+ PUSHBUTTON "Avbryt", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
+END
+
+IDD_ABOUT_DIALOG DIALOGEX 22, 16, 190, 66
+STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
+CAPTION "Om"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "ReactOS Programbehandler\nEnerett (C) 2009\nav Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
+ PUSHBUTTON "Lukk", IDOK, 133, 46, 50, 14
+ ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TOOLTIP_INSTALL "Installere"
+ IDS_TOOLTIP_UNINSTALL "Avinstallere"
+ IDS_TOOLTIP_MODIFY "Rediger"
+ IDS_TOOLTIP_SETTINGS "Innstillinger"
+ IDS_TOOLTIP_REFRESH "Oppdatere"
+ IDS_TOOLTIP_EXIT "Avslutt"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_NAME "Navn"
+ IDS_APP_INST_VERSION "Versjon"
+ IDS_APP_DESCRIPTION "Beskrivelse"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_INFO_VERSION "\nVersjon: "
+ IDS_INFO_DESCRIPTION "\nBeskrivelse: "
+ IDS_INFO_PUBLISHER "\nUtgiver: "
+ IDS_INFO_HELPLINK "\nHjelpelenke: "
+ IDS_INFO_HELPPHONE "\nHjelptelefon: "
+ IDS_INFO_README "\nLes meg: "
+ IDS_INFO_REGOWNER "\nRegistert eier: "
+ IDS_INFO_PRODUCTID "\nProdukt ID: "
+ IDS_INFO_CONTACT "\nKontakt: "
+ IDS_INFO_UPDATEINFO "\nOppdatert informasjon: "
+ IDS_INFO_INFOABOUT "\nInformasjon om: "
+ IDS_INFO_COMMENTS "\nKomentarer: "
+ IDS_INFO_INSTLOCATION "\nInstallering plassering: "
+ IDS_INFO_INSTALLSRC "\nInstallering kilde: "
+ IDS_INFO_UNINSTALLSTR "\nAvinstallering plassering: "
+ IDS_INFO_MODIFYPATH "\nEndret mappe: "
+ IDS_INFO_INSTALLDATE "\nInstallert dato: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_AINFO_VERSION "\nVersjon: "
+ IDS_AINFO_DESCRIPTION "\nBeskrivelse: "
+ IDS_AINFO_SIZE "\nStrrelse: "
+ IDS_AINFO_URLSITE "\nHjemmeside: "
+ IDS_AINFO_LICENCE "\nLisens: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_CAT_AUDIO "Lyd"
+ IDS_CAT_DEVEL "Utvikling"
+ IDS_CAT_DRIVERS "Drivere"
+ IDS_CAT_EDU "Edutainment"
+ IDS_CAT_ENGINEER "Engineering"
+ IDS_CAT_FINANCE "Finans"
+ IDS_CAT_GAMES "Spill & morro"
+ IDS_CAT_GRAPHICS "Grafikk"
+ IDS_CAT_INTERNET "Internett & Nettverk"
+ IDS_CAT_LIBS "Biblioteker"
+ IDS_CAT_OFFICE "Kontor"
+ IDS_CAT_OTHER "Andre"
+ IDS_CAT_SCIENCE "Vitenskap"
+ IDS_CAT_TOOLS "Verkty"
+ IDS_CAT_VIDEO "Filmer"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APPTITLE "ReactOS programbehandler"
+ IDS_SEARCH_TEXT "Sk..."
+ IDS_INSTALL "Installere"
+ IDS_UNINSTALL "Avinstallere"
+ IDS_MODIFY "Endre"
+ IDS_APPS_COUNT "Program oppsummering: %d"
+ IDS_WELCOME_TITLE "Velkommen til ReactOS programbehandler!\n\n"
+ IDS_WELCOME_TEXT "Velg en kategori til venstre, og velg et program for installere eller avinstallere programvaren.\nReactOS internettside: "
+ IDS_WELCOME_URL "http://www.reactos.org"
+ IDS_INSTALLED "Installert"
+ IDS_AVAILABLEFORINST "Tilgjengelig for installasjon"
+ IDS_UPDATES "Oppdateringer"
+ IDS_APPLICATIONS "Programmer"
+ IDS_DOWNLOAD_FOLDER "Nedlastinger"
+END
diff --git a/reactos/base/applications/rapps/lang/pl-PL.rc b/reactos/base/applications/rapps/lang/pl-PL.rc
new file mode 100644
index 00000000000..686ba41086d
--- /dev/null
+++ b/reactos/base/applications/rapps/lang/pl-PL.rc
@@ -0,0 +1,169 @@
+// * translated by Caemyr - Olaf Siejka (Aug, 2009)
+
+LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
+
+IDR_MAINMENU MENU
+BEGIN
+ POPUP "&Plik"
+ BEGIN
+ MENUITEM "&Ustawienia", ID_SETTINGS, GRAYED
+ MENUITEM SEPARATOR
+ MENUITEM "&Wyjcie", ID_EXIT
+ END
+ POPUP "&Programy"
+ BEGIN
+ MENUITEM "&Instaluj", ID_INSTALL
+ MENUITEM "&Odinstaluj",ID_UNINSTALL
+ MENUITEM "&Modyfikuj", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "O&dwie", ID_REFRESH
+ END
+ POPUP "Pomoc"
+ BEGIN
+ MENUITEM "Pomoc", ID_HELP, GRAYED
+ MENUITEM "O programie", ID_ABOUT
+ END
+END
+
+IDR_LINKMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&Otwrz link w przegldarce", ID_OPEN_LINK
+ MENUITEM "&Skopiuj link do przegldarki", ID_COPY_LINK
+ END
+END
+
+IDR_APPLICATIONMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&Instaluj", ID_INSTALL
+ MENUITEM "&odinstaluj", ID_UNINSTALL
+ MENUITEM "&Modyfikuj", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&Odwie", ID_REFRESH
+ END
+END
+
+IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Ustawienia"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "Anuluj", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "cignij i zainstaluj"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "Anuluj", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
+STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE
+CAPTION "cignij..."
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "Progress1", IDC_DOWNLOAD_PROGRESS, "msctls_progress32", WS_BORDER | PBS_SMOOTH, 10, 10, 200, 12
+ LTEXT "", IDC_DOWNLOAD_STATUS, 10, 30, 200, 10, SS_CENTER
+ PUSHBUTTON "Anuluj", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
+END
+
+IDD_ABOUT_DIALOG DIALOGEX 22, 16, 190, 66
+STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
+CAPTION "O programie"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "ReactOS Applications Manager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
+ PUSHBUTTON "Close", IDOK, 133, 46, 50, 14
+ ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TOOLTIP_INSTALL "Instaluj"
+ IDS_TOOLTIP_UNINSTALL "Odinstaluj"
+ IDS_TOOLTIP_MODIFY "Modyfikuj"
+ IDS_TOOLTIP_SETTINGS "Ustawienia"
+ IDS_TOOLTIP_REFRESH "Odwie"
+ IDS_TOOLTIP_EXIT "Wyjcie"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_NAME "Nazwa"
+ IDS_APP_INST_VERSION "Wersja"
+ IDS_APP_DESCRIPTION "Opis"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_INFO_VERSION "\nWersja: "
+ IDS_INFO_DESCRIPTION "\nOpis: "
+ IDS_INFO_PUBLISHER "\nAutor: "
+ IDS_INFO_HELPLINK "\nLink do pomocy: "
+ IDS_INFO_HELPPHONE "\nInfolinia: "
+ IDS_INFO_README "\nPrzeczytaj.to: "
+ IDS_INFO_REGOWNER "\nWaciciel: "
+ IDS_INFO_PRODUCTID "\nProductID: "
+ IDS_INFO_CONTACT "\nKontakt: "
+ IDS_INFO_UPDATEINFO "\nAktualizacje: "
+ IDS_INFO_INFOABOUT "\nInformacje: "
+ IDS_INFO_COMMENTS "\nKomentarze: "
+ IDS_INFO_INSTLOCATION "\nScieka instalacji: "
+ IDS_INFO_INSTALLSRC "\nrdo instalacji: "
+ IDS_INFO_UNINSTALLSTR "\nKomenda deinstalacji: "
+ IDS_INFO_MODIFYPATH "\nModify Path: "
+ IDS_INFO_INSTALLDATE "\nData instalacji: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_AINFO_VERSION "\nWersja: "
+ IDS_AINFO_DESCRIPTION "\nOpis: "
+ IDS_AINFO_SIZE "\nRozmiar: "
+ IDS_AINFO_URLSITE "\nStrona: "
+ IDS_AINFO_LICENCE "\nLicencja: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_CAT_AUDIO "Dwik"
+ IDS_CAT_DEVEL "Programowanie"
+ IDS_CAT_DRIVERS "Sterowniki"
+ IDS_CAT_EDU "Edukacja"
+ IDS_CAT_ENGINEER "Inynieria"
+ IDS_CAT_FINANCE "Finanse"
+ IDS_CAT_GAMES "Gry i rozrywka"
+ IDS_CAT_GRAPHICS "Grafika"
+ IDS_CAT_INTERNET "Internet i Sieci"
+ IDS_CAT_LIBS "Biblioteki"
+ IDS_CAT_OFFICE "Biurowe"
+ IDS_CAT_OTHER "Inne"
+ IDS_CAT_SCIENCE "Nauka"
+ IDS_CAT_TOOLS "Narzdzia"
+ IDS_CAT_VIDEO "Wideo"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APPTITLE "Meneder aplikacji ReactOS"
+ IDS_SEARCH_TEXT "Szukaj..."
+ IDS_INSTALL "Instaluj"
+ IDS_UNINSTALL "Odinstaluj"
+ IDS_MODIFY "Modyfikuj"
+ IDS_APPS_COUNT "Licznik aplikacji: %d"
+ IDS_WELCOME_TITLE "Witamy w Menederze aplikacji ReactOS!\n\n"
+ IDS_WELCOME_TEXT "Z listy po lewej wybierz kategori, a nastpnie aplikacj by j zainstalowa lub odinstalowa.\nStrona projektu ReactOS: "
+ IDS_WELCOME_URL "http://www.reactos.org"
+ IDS_INSTALLED "Zainstalowane"
+ IDS_AVAILABLEFORINST "Dostpne"
+ IDS_UPDATES "Uaktualnienia"
+ IDS_APPLICATIONS "Aplikacje"
+ IDS_DOWNLOAD_FOLDER "cignite"
+END
diff --git a/reactos/base/applications/rapps/lang/ru-RU.rc b/reactos/base/applications/rapps/lang/ru-RU.rc
new file mode 100644
index 00000000000..0ae8c936fa8
--- /dev/null
+++ b/reactos/base/applications/rapps/lang/ru-RU.rc
@@ -0,0 +1,167 @@
+LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+
+IDR_MAINMENU MENU
+BEGIN
+ POPUP "&"
+ BEGIN
+ MENUITEM "&", ID_SETTINGS, GRAYED
+ MENUITEM SEPARATOR
+ MENUITEM "&", ID_EXIT
+ END
+ POPUP "&"
+ BEGIN
+ MENUITEM "&", ID_INSTALL
+ MENUITEM "&", ID_UNINSTALL
+ MENUITEM "&", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&", ID_REFRESH
+ END
+ POPUP ""
+ BEGIN
+ MENUITEM "", ID_HELP, GRAYED
+ MENUITEM " ", ID_ABOUT
+ END
+END
+
+IDR_LINKMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "& ", ID_OPEN_LINK
+ MENUITEM "& ", ID_COPY_LINK
+ END
+END
+
+IDR_APPLICATIONMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&", ID_INSTALL
+ MENUITEM "&", ID_UNINSTALL
+ MENUITEM "&", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&", ID_REFRESH
+ END
+END
+
+IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION ""
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION " "
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
+STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE
+CAPTION "..."
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "Progress1", IDC_DOWNLOAD_PROGRESS, "msctls_progress32", WS_BORDER | PBS_SMOOTH, 10, 10, 200, 12
+ LTEXT "", IDC_DOWNLOAD_STATUS, 10, 30, 200, 10, SS_CENTER
+ PUSHBUTTON "", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
+END
+
+IDD_ABOUT_DIALOG DIALOGEX 22, 16, 190, 66
+STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
+CAPTION " "
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT " ReactOS\n (C) 2009\n (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
+ PUSHBUTTON "", IDOK, 133, 46, 50, 14
+ ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TOOLTIP_INSTALL ""
+ IDS_TOOLTIP_UNINSTALL ""
+ IDS_TOOLTIP_MODIFY ""
+ IDS_TOOLTIP_SETTINGS ""
+ IDS_TOOLTIP_REFRESH ""
+ IDS_TOOLTIP_EXIT ""
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_NAME ""
+ IDS_APP_INST_VERSION ""
+ IDS_APP_DESCRIPTION ""
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_INFO_VERSION "\n: "
+ IDS_INFO_DESCRIPTION "\n: "
+ IDS_INFO_PUBLISHER "\n: "
+ IDS_INFO_HELPLINK "\n : "
+ IDS_INFO_HELPPHONE "\n : "
+ IDS_INFO_README "\n ""Readme"": "
+ IDS_INFO_REGOWNER "\n : "
+ IDS_INFO_PRODUCTID "\n : "
+ IDS_INFO_CONTACT "\n: "
+ IDS_INFO_UPDATEINFO "\n : "
+ IDS_INFO_INFOABOUT "\n : "
+ IDS_INFO_COMMENTS "\n: "
+ IDS_INFO_INSTLOCATION "\n : "
+ IDS_INFO_INSTALLSRC "\n : "
+ IDS_INFO_UNINSTALLSTR "\n : "
+ IDS_INFO_MODIFYPATH "\n : "
+ IDS_INFO_INSTALLDATE "\n : "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_AINFO_VERSION "\n: "
+ IDS_AINFO_DESCRIPTION "\n: "
+ IDS_AINFO_SIZE "\n: "
+ IDS_AINFO_URLSITE "\n : "
+ IDS_AINFO_LICENCE "\n: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_CAT_AUDIO ""
+ IDS_CAT_DEVEL ""
+ IDS_CAT_DRIVERS ""
+ IDS_CAT_EDU ""
+ IDS_CAT_ENGINEER ""
+ IDS_CAT_FINANCE ""
+ IDS_CAT_GAMES " "
+ IDS_CAT_GRAPHICS ""
+ IDS_CAT_INTERNET " "
+ IDS_CAT_LIBS ""
+ IDS_CAT_OFFICE ""
+ IDS_CAT_OTHER ""
+ IDS_CAT_SCIENCE ""
+ IDS_CAT_TOOLS ""
+ IDS_CAT_VIDEO ""
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APPTITLE " ReactOS"
+ IDS_SEARCH_TEXT "..."
+ IDS_INSTALL ""
+ IDS_UNINSTALL ""
+ IDS_MODIFY ""
+ IDS_APPS_COUNT ": %d"
+ IDS_WELCOME_TITLE " "" ReactOS""!\n\n"
+ IDS_WELCOME_TEXT " .\n ReactOS: "
+ IDS_WELCOME_URL "http://www.reactos.org"
+ IDS_INSTALLED ""
+ IDS_AVAILABLEFORINST " "
+ IDS_UPDATES ""
+ IDS_APPLICATIONS ""
+ IDS_DOWNLOAD_FOLDER "Downloads"
+END
diff --git a/reactos/base/applications/rapps/lang/sk-SK.rc b/reactos/base/applications/rapps/lang/sk-SK.rc
new file mode 100644
index 00000000000..57633af2d52
--- /dev/null
+++ b/reactos/base/applications/rapps/lang/sk-SK.rc
@@ -0,0 +1,172 @@
+/* TRANSLATOR : Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
+ * DATE OF TR.: 29-08-2009
+ * LAST CHANGE: 29-08-2009
+ */
+
+LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
+
+IDR_MAINMENU MENU
+BEGIN
+ POPUP "&Sbor"
+ BEGIN
+ MENUITEM "&Nastavenia", ID_SETTINGS, GRAYED
+ MENUITEM SEPARATOR
+ MENUITEM "S&koni", ID_EXIT
+ END
+ POPUP "&Programy"
+ BEGIN
+ MENUITEM "&Intalova", ID_INSTALL
+ MENUITEM "O&dintalova", ID_UNINSTALL
+ MENUITEM "&Zmeni", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&Obnovi", ID_REFRESH
+ END
+ POPUP "Pomocnk"
+ BEGIN
+ MENUITEM "Pomocnk", ID_HELP, GRAYED
+ MENUITEM "o je ...", ID_ABOUT
+ END
+END
+
+IDR_LINKMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&Otvori linku v prehliadai", ID_OPEN_LINK
+ MENUITEM "&Koprova linku do schrnky", ID_COPY_LINK
+ END
+END
+
+IDR_APPLICATIONMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&Intalova", ID_INSTALL
+ MENUITEM "O&dintalova", ID_UNINSTALL
+ MENUITEM "&Zmeni", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&Obnovi", ID_REFRESH
+ END
+END
+
+IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Nastavenia"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "Zrui", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Stiahnu a naintalova"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "OK", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "Zrui", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
+STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE
+CAPTION "Sahujem ..." // Stiahnu ???
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "Progress1", IDC_DOWNLOAD_PROGRESS, "msctls_progress32", WS_BORDER | PBS_SMOOTH, 10, 10, 200, 12
+ LTEXT "", IDC_DOWNLOAD_STATUS, 10, 30, 200, 10, SS_CENTER
+ PUSHBUTTON "Zrui", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
+END
+
+IDD_ABOUT_DIALOG DIALOGEX 22, 16, 190, 66
+STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
+CAPTION "o je Manar aplikci systmu ReactOS"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Manar aplikci systmu ReactOS\nAutorsk prva (C) 2009\nod Dmitry Chapyshev (dmitry@reactos.org)\nPreklad: Mrio Kamr (kario@szm.sk)", IDC_STATIC, 48, 7, 130, 39
+ PUSHBUTTON "Zavrie", IDOK, 133, 46, 50, 14
+ ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TOOLTIP_INSTALL "Intalova"
+ IDS_TOOLTIP_UNINSTALL "Odintalova"
+ IDS_TOOLTIP_MODIFY "Zmeni"
+ IDS_TOOLTIP_SETTINGS "Nastavenia"
+ IDS_TOOLTIP_REFRESH "Obnovi"
+ IDS_TOOLTIP_EXIT "Skoni"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_NAME "Nzov"
+ IDS_APP_INST_VERSION "Verzia"
+ IDS_APP_DESCRIPTION "Popis"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_INFO_VERSION "\nVerzia: "
+ IDS_INFO_DESCRIPTION "\nPopis: "
+ IDS_INFO_PUBLISHER "\nPublisher: "
+ IDS_INFO_HELPLINK "\nHelp Link: "
+ IDS_INFO_HELPPHONE "\nHelp Telephone: "
+ IDS_INFO_README "\nReadme: "
+ IDS_INFO_REGOWNER "\nRegistered Owner: "
+ IDS_INFO_PRODUCTID "\nProductID: "
+ IDS_INFO_CONTACT "\nKontakt: "
+ IDS_INFO_UPDATEINFO "\nUpdate Information: "
+ IDS_INFO_INFOABOUT "\nInformation About: "
+ IDS_INFO_COMMENTS "\nComments: "
+ IDS_INFO_INSTLOCATION "\nInstall Location: "
+ IDS_INFO_INSTALLSRC "\nInstall Source: "
+ IDS_INFO_UNINSTALLSTR "\nUninstall String: "
+ IDS_INFO_MODIFYPATH "\nModify Path: "
+ IDS_INFO_INSTALLDATE "\nInstall Date: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_AINFO_VERSION "\nVerzia: "
+ IDS_AINFO_DESCRIPTION "\nPopis: "
+ IDS_AINFO_SIZE "\nVekos: "
+ IDS_AINFO_URLSITE "\nDomovsk strnka: "
+ IDS_AINFO_LICENCE "\nLicencia: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_CAT_AUDIO "Audio"
+ IDS_CAT_DEVEL "Vvojrske" // Development, vvoj??
+ IDS_CAT_DRIVERS "Ovldae" // Drivers
+ IDS_CAT_EDU "Vzdelvacie" // Edutainment
+ IDS_CAT_ENGINEER "Ininierske" // Engineering, kontrukn??
+ IDS_CAT_FINANCE "Finann" // Finance, peanctvo??
+ IDS_CAT_GAMES "Hry & zbava" // Games & Fun, zbavn??
+ IDS_CAT_GRAPHICS "Grafick" // Graphics
+ IDS_CAT_INTERNET "Internet & sie"
+ IDS_CAT_LIBS "Kninice"
+ IDS_CAT_OFFICE "Kancelrske" // Office
+ IDS_CAT_OTHER "In"
+ IDS_CAT_SCIENCE "Vedeck" // Science
+ IDS_CAT_TOOLS "Nstroje" // Tools
+ IDS_CAT_VIDEO "Video"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APPTITLE "Manar aplikci systmu ReactOS"
+ IDS_SEARCH_TEXT "Hada..."
+ IDS_INSTALL "Intalova"
+ IDS_UNINSTALL "Odintalova"
+ IDS_MODIFY "Zmeni"
+ IDS_APPS_COUNT "Poet programov: %d"
+ IDS_WELCOME_TITLE "Vta Vs Manar aplikci systmu ReactOS!\n\n" // ReactOS Application Manager
+ IDS_WELCOME_TEXT "Vyberte si kategriu na avej strane, potom vyberte aplikciu, ktor chcete naintalova alebo odintalova.\nWebstrnka projektu ReactOS: "
+ IDS_WELCOME_URL "http://www.reactos.org"
+ IDS_INSTALLED "Naintalovan"
+ IDS_AVAILABLEFORINST "Dostupn pre naintalovanie"
+ IDS_UPDATES "Aktualizcie"
+ IDS_APPLICATIONS "Aplikcie"
+ IDS_DOWNLOAD_FOLDER "Sahovania" // Downloads
+END
diff --git a/reactos/base/applications/rapps/lang/uk-UA.rc b/reactos/base/applications/rapps/lang/uk-UA.rc
new file mode 100644
index 00000000000..3dfee07702f
--- /dev/null
+++ b/reactos/base/applications/rapps/lang/uk-UA.rc
@@ -0,0 +1,175 @@
+/*
+ * PROJECT: ReactOS ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/lang/uk-UA.rc
+ * PURPOSE: Ukraianian Language File for ReactOS ReactOS Applications Manager
+ * TRANSLATOR: Sakara Yevhen
+ */
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+
+IDR_MAINMENU MENU
+BEGIN
+ POPUP "&"
+ BEGIN
+ MENUITEM "&", ID_SETTINGS, GRAYED
+ MENUITEM SEPARATOR
+ MENUITEM "&", ID_EXIT
+ END
+ POPUP "&"
+ BEGIN
+ MENUITEM "&", ID_INSTALL
+ MENUITEM "&",ID_UNINSTALL
+ MENUITEM "&", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&", ID_REFRESH
+ END
+ POPUP ""
+ BEGIN
+ MENUITEM "", ID_HELP, GRAYED
+ MENUITEM " ...", ID_ABOUT
+ END
+END
+
+IDR_LINKMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&³ ", ID_OPEN_LINK
+ MENUITEM "& ", ID_COPY_LINK
+ END
+END
+
+IDR_APPLICATIONMENU MENU
+BEGIN
+ POPUP "popup"
+ BEGIN
+ MENUITEM "&", ID_INSTALL
+ MENUITEM "&", ID_UNINSTALL
+ MENUITEM "&", ID_MODIFY
+ MENUITEM SEPARATOR
+ MENUITEM "&", ID_REFRESH
+ END
+END
+
+IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION ""
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "ͳ", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 386, 231
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION " "
+FONT 8, "MS Shell Dlg"
+BEGIN
+ PUSHBUTTON "", IDOK, 255, 212, 60, 14
+ PUSHBUTTON "ͳ", IDCANCEL, 320, 212, 60, 14
+END
+
+IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76
+STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE
+CAPTION "..."
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "Progress1", IDC_DOWNLOAD_PROGRESS, "msctls_progress32", WS_BORDER | PBS_SMOOTH, 10, 10, 200, 12
+ LTEXT "", IDC_DOWNLOAD_STATUS, 10, 30, 200, 10, SS_CENTER
+ PUSHBUTTON "³", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP
+END
+
+IDD_ABOUT_DIALOG DIALOGEX 22, 16, 190, 66
+STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
+CAPTION " ..."
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT " ReactOS\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
+ PUSHBUTTON "", IDOK, 133, 46, 50, 14
+ ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TOOLTIP_INSTALL ""
+ IDS_TOOLTIP_UNINSTALL ""
+ IDS_TOOLTIP_MODIFY ""
+ IDS_TOOLTIP_SETTINGS ""
+ IDS_TOOLTIP_REFRESH ""
+ IDS_TOOLTIP_EXIT ""
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_NAME ""
+ IDS_APP_INST_VERSION ""
+ IDS_APP_DESCRIPTION ""
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_INFO_VERSION "\n: "
+ IDS_INFO_DESCRIPTION "\n: "
+ IDS_INFO_PUBLISHER "\n: "
+ IDS_INFO_HELPLINK "\n : "
+ IDS_INFO_HELPPHONE "\n : "
+ IDS_INFO_README "\n: "
+ IDS_INFO_REGOWNER "\n : "
+ IDS_INFO_PRODUCTID "\nID : "
+ IDS_INFO_CONTACT "\n : "
+ IDS_INFO_UPDATEINFO "\n : "
+ IDS_INFO_INFOABOUT "\n : "
+ IDS_INFO_COMMENTS "\n: "
+ IDS_INFO_INSTLOCATION "\n : "
+ IDS_INFO_INSTALLSRC "\n : "
+ IDS_INFO_UNINSTALLSTR "\n : "
+ IDS_INFO_MODIFYPATH "\n : "
+ IDS_INFO_INSTALLDATE "\n : "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_AINFO_VERSION "\n: "
+ IDS_AINFO_DESCRIPTION "\n: "
+ IDS_AINFO_SIZE "\n: "
+ IDS_AINFO_URLSITE "\n : "
+ IDS_AINFO_LICENCE "\n˳: "
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_CAT_AUDIO ""
+ IDS_CAT_DEVEL ""
+ IDS_CAT_DRIVERS ""
+ IDS_CAT_EDU ""
+ IDS_CAT_ENGINEER ""
+ IDS_CAT_FINANCE "Գ "
+ IDS_CAT_GAMES " "
+ IDS_CAT_GRAPHICS ""
+ IDS_CAT_INTERNET " "
+ IDS_CAT_LIBS ""
+ IDS_CAT_OFFICE ""
+ IDS_CAT_OTHER ""
+ IDS_CAT_SCIENCE ""
+ IDS_CAT_TOOLS ""
+ IDS_CAT_VIDEO "³"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APPTITLE " ReactOS"
+ IDS_SEARCH_TEXT "..."
+ IDS_INSTALL ""
+ IDS_UNINSTALL ""
+ IDS_MODIFY ""
+ IDS_APPS_COUNT "ʳ : %d"
+ IDS_WELCOME_TITLE " ReactOS!\n\n"
+ IDS_WELCOME_TEXT " , .\n ReactOS: "
+ IDS_WELCOME_URL "http://www.reactos.org"
+ IDS_INSTALLED ""
+ IDS_AVAILABLEFORINST " "
+ IDS_UPDATES ""
+ IDS_APPLICATIONS ""
+ IDS_DOWNLOAD_FOLDER ""
+END
diff --git a/reactos/base/applications/rapps/listview.c b/reactos/base/applications/rapps/listview.c
new file mode 100644
index 00000000000..b543f00ac45
--- /dev/null
+++ b/reactos/base/applications/rapps/listview.c
@@ -0,0 +1,122 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/listview.c
+ * PURPOSE: ListView functions
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+HWND hListView;
+BOOL bAscending = TRUE;
+
+
+PVOID
+ListViewGetlParam(INT Index)
+{
+ INT ItemIndex;
+ LVITEM Item;
+
+ if (Index == -1)
+ {
+ ItemIndex = (INT) SendMessage(hListView, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+ if (ItemIndex == -1)
+ return NULL;
+ }
+ else
+ {
+ ItemIndex = Index;
+ }
+
+ ZeroMemory(&Item, sizeof(LVITEM));
+
+ Item.mask = LVIF_PARAM;
+ Item.iItem = ItemIndex;
+ if (!ListView_GetItem(hListView, &Item))
+ return NULL;
+
+ return (PVOID)Item.lParam;
+}
+
+BOOL
+ListViewAddColumn(INT Index, LPWSTR lpText, INT Width, INT Format)
+{
+ LV_COLUMN Column;
+
+ ZeroMemory(&Column, sizeof(LV_COLUMN));
+
+ Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
+ Column.iSubItem = Index;
+ Column.pszText = (LPTSTR)lpText;
+ Column.cx = Width;
+ Column.fmt = Format;
+
+ return (ListView_InsertColumn(hListView, Index, &Column) == -1) ? FALSE : TRUE;
+}
+
+INT
+ListViewAddItem(INT ItemIndex, INT IconIndex, LPWSTR lpText, LPARAM lParam)
+{
+ LV_ITEMW Item;
+
+ ZeroMemory(&Item, sizeof(LV_ITEM));
+
+ Item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
+ Item.pszText = lpText;
+ Item.lParam = lParam;
+ Item.iItem = ItemIndex;
+ Item.iImage = IconIndex;
+
+ return ListView_InsertItem(hListView, &Item);
+}
+
+INT
+CALLBACK
+ListViewCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
+{
+ WCHAR Item1[MAX_STR_LEN], Item2[MAX_STR_LEN];
+ LVFINDINFO IndexInfo;
+ INT Index;
+
+ IndexInfo.flags = LVFI_PARAM;
+
+ IndexInfo.lParam = lParam1;
+ Index = ListView_FindItem(hListView, -1, &IndexInfo);
+ ListView_GetItemText(hListView, Index, (INT)lParamSort, Item1, sizeof(Item1) / sizeof(WCHAR));
+
+ IndexInfo.lParam = lParam2;
+ Index = ListView_FindItem(hListView, -1, &IndexInfo);
+ ListView_GetItemText(hListView, Index, (INT)lParamSort, Item2, sizeof(Item2) / sizeof(WCHAR));
+
+ if (bAscending)
+ return wcscmp(Item2, Item1);
+ else
+ return wcscmp(Item1, Item2);
+
+ return 0;
+}
+
+BOOL
+CreateListView(HWND hwnd)
+{
+ hListView = CreateWindowExW(WS_EX_CLIENTEDGE,
+ WC_LISTVIEWW,
+ L"",
+ WS_CHILD | WS_VISIBLE | LVS_SORTASCENDING | LVS_REPORT | LVS_SINGLESEL,
+ 205, 28, 465, 250,
+ hwnd,
+ NULL,
+ hInst,
+ NULL);
+
+ if (!hListView)
+ {
+ /* TODO: Show error message */
+ return FALSE;
+ }
+
+ (VOID) ListView_SetExtendedListViewStyle(hListView, LVS_EX_FULLROWSELECT);
+
+ return TRUE;
+}
diff --git a/reactos/base/applications/rapps/loaddlg.c b/reactos/base/applications/rapps/loaddlg.c
new file mode 100644
index 00000000000..e4170ac43c0
--- /dev/null
+++ b/reactos/base/applications/rapps/loaddlg.c
@@ -0,0 +1,402 @@
+/* PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/download.c
+ * PURPOSE: Displaying a download dialog
+ * COPYRIGHT: Copyright 2001 John R. Sheets (for CodeWeavers)
+ * Copyright 2004 Mike McCormack (for CodeWeavers)
+ * Copyright 2005 Ge van Geldorp (gvg@reactos.org)
+ * Copyright 2009 Dmitry Chapyshev (dmitry@reactos.org)
+ */
+/*
+ * Based on Wine dlls/shdocvw/shdocvw_main.c
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#define COBJMACROS
+#define WIN32_NO_STATUS
+
+#include "rapps.h"
+#include "resource.h"
+
+#include
+#include
+#include
+#include
+
+static PAPPLICATION_INFO AppInfo;
+
+typedef struct _IBindStatusCallbackImpl
+{
+ const IBindStatusCallbackVtbl *vtbl;
+ LONG ref;
+ HWND hDialog;
+ BOOL *pbCancelled;
+} IBindStatusCallbackImpl;
+
+static
+HRESULT WINAPI
+dlQueryInterface(IBindStatusCallback* This, REFIID riid, void** ppvObject)
+{
+ if (!ppvObject) return E_POINTER;
+
+ if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IBindStatusCallback))
+ {
+ IBindStatusCallback_AddRef(This);
+ *ppvObject = This;
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+static
+ULONG WINAPI
+dlAddRef(IBindStatusCallback* iface)
+{
+ IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl*) iface;
+ return InterlockedIncrement(&This->ref);
+}
+
+static
+ULONG WINAPI
+dlRelease(IBindStatusCallback* iface)
+{
+ IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl*) iface;
+ DWORD ref = InterlockedDecrement(&This->ref);
+
+ if (!ref)
+ {
+ DestroyWindow(This->hDialog);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static
+HRESULT WINAPI
+dlOnStartBinding(IBindStatusCallback* iface, DWORD dwReserved, IBinding* pib)
+{
+ return S_OK;
+}
+
+static
+HRESULT WINAPI
+dlGetPriority(IBindStatusCallback* iface, LONG* pnPriority)
+{
+ return S_OK;
+}
+
+static
+HRESULT WINAPI
+dlOnLowResource( IBindStatusCallback* iface, DWORD reserved)
+{
+ return S_OK;
+}
+
+static
+HRESULT WINAPI
+dlOnProgress(IBindStatusCallback* iface,
+ ULONG ulProgress,
+ ULONG ulProgressMax,
+ ULONG ulStatusCode,
+ LPCWSTR szStatusText)
+{
+ IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl *) iface;
+ HWND Item;
+ LONG r;
+ WCHAR OldText[100];
+
+ Item = GetDlgItem(This->hDialog, IDC_DOWNLOAD_PROGRESS);
+ if (Item && ulProgressMax)
+ {
+ SendMessageW(Item, PBM_SETPOS, ((ULONGLONG)ulProgress * 100) / ulProgressMax, 0);
+ }
+
+ Item = GetDlgItem(This->hDialog, IDC_DOWNLOAD_STATUS);
+ if (Item && szStatusText)
+ {
+ SendMessageW(Item, WM_GETTEXT, sizeof(OldText) / sizeof(OldText[0]), (LPARAM) OldText);
+ if (sizeof(OldText) / sizeof(OldText[0]) - 1 <= wcslen(OldText) || 0 != wcscmp(OldText, szStatusText))
+ {
+ SendMessageW(Item, WM_SETTEXT, 0, (LPARAM) szStatusText);
+ }
+ }
+
+ SetLastError(0);
+ r = GetWindowLongPtrW(This->hDialog, GWLP_USERDATA);
+ if (0 != r || 0 != GetLastError())
+ {
+ *This->pbCancelled = TRUE;
+ return E_ABORT;
+ }
+
+ return S_OK;
+}
+
+static
+HRESULT WINAPI
+dlOnStopBinding(IBindStatusCallback* iface, HRESULT hresult, LPCWSTR szError)
+{
+ return S_OK;
+}
+
+static
+HRESULT WINAPI
+dlGetBindInfo(IBindStatusCallback* iface, DWORD* grfBINDF, BINDINFO* pbindinfo)
+{
+ return S_OK;
+}
+
+static
+HRESULT WINAPI
+dlOnDataAvailable(IBindStatusCallback* iface, DWORD grfBSCF,
+ DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed)
+{
+ return S_OK;
+}
+
+static
+HRESULT WINAPI
+dlOnObjectAvailable(IBindStatusCallback* iface, REFIID riid, IUnknown* punk)
+{
+ return S_OK;
+}
+
+static const IBindStatusCallbackVtbl dlVtbl =
+{
+ dlQueryInterface,
+ dlAddRef,
+ dlRelease,
+ dlOnStartBinding,
+ dlGetPriority,
+ dlOnLowResource,
+ dlOnProgress,
+ dlOnStopBinding,
+ dlGetBindInfo,
+ dlOnDataAvailable,
+ dlOnObjectAvailable
+};
+
+static IBindStatusCallback*
+CreateDl(HWND Dlg, BOOL *pbCancelled)
+{
+ IBindStatusCallbackImpl *This;
+
+ This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IBindStatusCallbackImpl));
+ if (!This) return NULL;
+
+ This->vtbl = &dlVtbl;
+ This->ref = 1;
+ This->hDialog = Dlg;
+ This->pbCancelled = pbCancelled;
+
+ return (IBindStatusCallback*) This;
+}
+
+static
+DWORD WINAPI
+ThreadFunc(LPVOID Context)
+{
+ IBindStatusCallback *dl;
+ WCHAR path[MAX_PATH];
+ LPWSTR p;
+ STARTUPINFOW si;
+ PROCESS_INFORMATION pi;
+ HWND Dlg = (HWND) Context;
+ DWORD r;
+ BOOL bCancelled = FALSE;
+ BOOL bTempfile = FALSE;
+ HKEY hKey = NULL;
+ DWORD dwSize = MAX_PATH;
+
+ /* built the path for the download */
+ p = wcsrchr(AppInfo->szUrlDownload, L'/');
+ if (!p) goto end;
+
+ /* Create default download path */
+ if (GetWindowsDirectoryW(path, sizeof(path) / sizeof(WCHAR)))
+ {
+ WCHAR DPath[MAX_PATH];
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ if (i == 3)
+ {
+ DPath[i] = '\0';
+ break;
+ }
+ DPath[i] = path[i];
+ }
+ LoadStringW(hInst, IDS_DOWNLOAD_FOLDER, path, sizeof(path) / sizeof(WCHAR));
+ wcscat(DPath, path);
+ wcscpy(path, DPath);
+ }
+
+ if (wcslen(AppInfo->szUrlDownload) > 4)
+ {
+ if (AppInfo->szUrlDownload[wcslen(AppInfo->szUrlDownload) - 4] == '.' &&
+ AppInfo->szUrlDownload[wcslen(AppInfo->szUrlDownload) - 3] == 'c' &&
+ AppInfo->szUrlDownload[wcslen(AppInfo->szUrlDownload) - 2] == 'a' &&
+ AppInfo->szUrlDownload[wcslen(AppInfo->szUrlDownload) - 1] == 'b')
+ {
+ if (!GetCurrentDirectoryW(MAX_PATH, path))
+ goto end;
+ }
+ else
+ {
+ if (RegOpenKeyW(HKEY_LOCAL_MACHINE,
+ L"Software\\ReactOS\\rappmgr",
+ &hKey) == ERROR_SUCCESS)
+ {
+ if ((RegQueryValueExW(hKey,
+ L"DownloadFolder",
+ NULL,
+ NULL,
+ (LPBYTE)&path,
+ &dwSize) != ERROR_SUCCESS) && (path[0] == 0))
+ {
+ RegCloseKey(hKey);
+ goto end;
+ }
+ RegCloseKey(hKey);
+ }
+ }
+ }
+ else goto end;
+
+ if (GetFileAttributesW(path) == 0xFFFFFFFF)
+ {
+ if (!CreateDirectoryW(path, NULL))
+ goto end;
+ }
+
+ wcscat(path, L"\\");
+ wcscat(path, p + 1);
+
+ /* download it */
+ bTempfile = TRUE;
+ dl = CreateDl(Context, &bCancelled);
+ r = URLDownloadToFileW(NULL, AppInfo->szUrlDownload, path, 0, dl);
+ if (dl) IBindStatusCallback_Release(dl);
+ if (S_OK != r)
+ {
+ MessageBoxW(0, L"Download error!", NULL, 0);
+ goto end;
+ }
+ else if (bCancelled)
+ {
+ goto end;
+ }
+ ShowWindow(Dlg, SW_HIDE);
+
+ /* run it */
+ memset(&si, 0, sizeof(si));
+ si.cb = sizeof(si);
+ r = CreateProcessW(path, NULL, NULL, NULL, 0, 0, NULL, NULL, &si, &pi);
+ if (0 == r)
+ {
+ goto end;
+ }
+ CloseHandle(pi.hThread);
+ WaitForSingleObject(pi.hProcess, INFINITE);
+ CloseHandle(pi.hProcess);
+
+ end:
+ if (bTempfile)
+ {
+ if (bCancelled)
+ DeleteFileW(path);
+ }
+ EndDialog(Dlg, 0);
+ return 0;
+}
+
+static
+INT_PTR CALLBACK
+DownloadDlgProc(HWND Dlg, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+ HANDLE Thread;
+ DWORD ThreadId;
+ HWND Item;
+
+ switch (Msg)
+ {
+ case WM_INITDIALOG:
+
+ SetWindowLongPtrW(Dlg, GWLP_USERDATA, 0);
+ Item = GetDlgItem(Dlg, IDC_DOWNLOAD_PROGRESS);
+ if (Item)
+ {
+ SendMessageW(Item, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
+ SendMessageW(Item, PBM_SETPOS, 0, 0);
+ }
+
+ Thread = CreateThread(NULL, 0, ThreadFunc, Dlg, 0, &ThreadId);
+ if (!Thread) return FALSE;
+ CloseHandle(Thread);
+ return TRUE;
+
+ case WM_COMMAND:
+ if (wParam == IDCANCEL)
+ {
+ SetWindowLongPtrW(Dlg, GWLP_USERDATA, 1);
+ PostMessageW(Dlg, WM_CLOSE, 0, 0);
+ }
+ return FALSE;
+
+ case WM_CLOSE:
+ EndDialog(Dlg, 0);
+ return TRUE;
+
+ default:
+ return FALSE;
+ }
+}
+
+BOOL
+DownloadApplication(INT Index)
+{
+ if (!IS_AVAILABLE_ENUM(SelectedEnumType))
+ return FALSE;
+
+ AppInfo = (PAPPLICATION_INFO) ListViewGetlParam(Index);
+ if (!AppInfo) return FALSE;
+
+ DialogBoxW(hInst,
+ MAKEINTRESOURCEW(IDD_DOWNLOAD_DIALOG),
+ hMainWnd,
+ DownloadDlgProc);
+
+ return TRUE;
+}
+
+VOID
+DownloadApplicationsDB(LPWSTR lpUrl)
+{
+ APPLICATION_INFO IntInfo;
+
+ ZeroMemory(&IntInfo, sizeof(APPLICATION_INFO));
+ wcscpy(IntInfo.szUrlDownload, lpUrl);
+
+ AppInfo = &IntInfo;
+
+ DialogBoxW(hInst,
+ MAKEINTRESOURCEW(IDD_DOWNLOAD_DIALOG),
+ hMainWnd,
+ DownloadDlgProc);
+}
+
diff --git a/reactos/base/applications/rapps/manifest.xml b/reactos/base/applications/rapps/manifest.xml
new file mode 100644
index 00000000000..fe2a235116f
--- /dev/null
+++ b/reactos/base/applications/rapps/manifest.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/reactos/base/applications/rapps/misc.c b/reactos/base/applications/rapps/misc.c
new file mode 100644
index 00000000000..342c4adf7e5
--- /dev/null
+++ b/reactos/base/applications/rapps/misc.c
@@ -0,0 +1,246 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/misc.c
+ * PURPOSE: Misc functions
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+
+/* SESSION Operation */
+#define EXTRACT_FILLFILELIST 0x00000001
+#define EXTRACT_EXTRACTFILES 0x00000002
+
+typedef struct
+{
+ int erfOper;
+ int erfType;
+ BOOL fError;
+} ERF, *PERF;
+
+struct FILELIST
+{
+ LPSTR FileName;
+ struct FILELIST *next;
+ BOOL DoExtract;
+};
+
+typedef struct
+{
+ INT FileSize;
+ ERF Error;
+ struct FILELIST *FileList;
+ INT FileCount;
+ INT Operation;
+ CHAR Destination[MAX_PATH];
+ CHAR CurrentFile[MAX_PATH];
+ CHAR Reserved[MAX_PATH];
+ struct FILELIST *FilterList;
+} SESSION;
+
+HRESULT (WINAPI *pfnExtract)(SESSION *dest, LPCSTR szCabName);
+
+
+INT
+GetSystemColorDepth(VOID)
+{
+ DEVMODE pDevMode;
+ INT ColorDepth;
+
+ pDevMode.dmSize = sizeof(DEVMODE);
+ pDevMode.dmDriverExtra = 0;
+
+ if (!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &pDevMode))
+ {
+ /* TODO: Error message */
+ return ILC_COLOR;
+ }
+
+ switch (pDevMode.dmBitsPerPel)
+ {
+ case 32: ColorDepth = ILC_COLOR32; break;
+ case 24: ColorDepth = ILC_COLOR24; break;
+ case 16: ColorDepth = ILC_COLOR16; break;
+ case 8: ColorDepth = ILC_COLOR8; break;
+ case 4: ColorDepth = ILC_COLOR4; break;
+ default: ColorDepth = ILC_COLOR; break;
+ }
+
+ return ColorDepth;
+}
+
+int
+GetWindowWidth(HWND hwnd)
+{
+ RECT Rect;
+
+ GetWindowRect(hwnd, &Rect);
+ return (Rect.right - Rect.left);
+}
+
+int
+GetWindowHeight(HWND hwnd)
+{
+ RECT Rect;
+
+ GetWindowRect(hwnd, &Rect);
+ return (Rect.bottom - Rect.top);
+}
+
+int
+GetClientWindowWidth(HWND hwnd)
+{
+ RECT Rect;
+
+ GetClientRect(hwnd, &Rect);
+ return (Rect.right - Rect.left);
+}
+
+int
+GetClientWindowHeight(HWND hwnd)
+{
+ RECT Rect;
+
+ GetClientRect(hwnd, &Rect);
+ return (Rect.bottom - Rect.top);
+}
+
+VOID
+CopyTextToClipboard(LPCWSTR lpszText)
+{
+ if(OpenClipboard(NULL))
+ {
+ HGLOBAL ClipBuffer;
+ WCHAR *Buffer;
+
+ EmptyClipboard();
+ ClipBuffer = GlobalAlloc(GMEM_DDESHARE, (wcslen(lpszText) + 1) * sizeof(TCHAR));
+ Buffer = (WCHAR*)GlobalLock(ClipBuffer);
+ wcscpy(Buffer, lpszText);
+ GlobalUnlock(ClipBuffer);
+
+ SetClipboardData(CF_UNICODETEXT, ClipBuffer);
+
+ CloseClipboard();
+ }
+}
+
+VOID
+SetWelcomeText(VOID)
+{
+ WCHAR szText[MAX_STR_LEN*3];
+
+ LoadStringW(hInst, IDS_WELCOME_TITLE, szText, sizeof(szText) / sizeof(WCHAR));
+ NewRichEditText(szText, CFE_BOLD);
+
+ LoadStringW(hInst, IDS_WELCOME_TEXT, szText, sizeof(szText) / sizeof(WCHAR));
+ InsertRichEditText(szText, 0);
+
+ LoadStringW(hInst, IDS_WELCOME_URL, szText, sizeof(szText) / sizeof(WCHAR));
+ InsertRichEditText(szText, CFM_LINK);
+}
+
+VOID
+ShowPopupMenu(HWND hwnd, UINT MenuID)
+{
+ HMENU hPopupMenu = GetSubMenu(LoadMenuW(hInst, MAKEINTRESOURCEW(MenuID)), 0);
+ POINT pt;
+
+ GetCursorPos(&pt);
+
+ SetForegroundWindow(hwnd);
+ TrackPopupMenu(hPopupMenu, 0, pt.x, pt.y, 0, hMainWnd, NULL);
+
+ DestroyMenu(hPopupMenu);
+}
+
+BOOL
+StartProcess(LPWSTR lpPath, BOOL Wait)
+{
+ PROCESS_INFORMATION pi;
+ STARTUPINFOW si;
+ DWORD dwRet;
+ MSG msg;
+
+ ZeroMemory(&si, sizeof(si));
+ si.cb = sizeof(si);
+ si.wShowWindow = SW_SHOW;
+
+ if (!CreateProcessW(NULL, lpPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
+ {
+ return FALSE;
+ }
+
+ CloseHandle(pi.hThread);
+ if (Wait) EnableWindow(hMainWnd, FALSE);
+
+ while (Wait)
+ {
+ dwRet = MsgWaitForMultipleObjects(1, &pi.hProcess, FALSE, INFINITE, QS_ALLEVENTS);
+ if (dwRet == WAIT_OBJECT_0 + 1)
+ {
+ while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ }
+ else
+ {
+ if (dwRet == WAIT_OBJECT_0 || dwRet == WAIT_FAILED)
+ break;
+ }
+ }
+
+ CloseHandle(pi.hProcess);
+
+ if (Wait)
+ {
+ EnableWindow(hMainWnd, TRUE);
+ SetForegroundWindow(hMainWnd);
+ SetFocus(hMainWnd);
+ }
+
+ return TRUE;
+}
+
+
+BOOL
+ExtractFilesFromCab(LPWSTR lpCabName, LPWSTR lpOutputPath)
+{
+ HINSTANCE hCabinetDll;
+ CHAR szCabName[MAX_PATH];
+ SESSION Dest;
+ HRESULT Result;
+
+ hCabinetDll = LoadLibraryW(L"cabinet.dll");
+ if (hCabinetDll)
+ {
+ pfnExtract = (void *) GetProcAddress(hCabinetDll, "Extract");
+ if (pfnExtract)
+ {
+ ZeroMemory(&Dest, sizeof(SESSION));
+
+ WideCharToMultiByte(CP_ACP, 0, lpOutputPath, -1, Dest.Destination, MAX_PATH, NULL, NULL);
+ WideCharToMultiByte(CP_ACP, 0, lpCabName, -1, szCabName, MAX_PATH, NULL, NULL);
+ Dest.Operation = EXTRACT_FILLFILELIST;
+
+ Result = pfnExtract(&Dest, szCabName);
+ if (Result == S_OK)
+ {
+ Dest.Operation = EXTRACT_EXTRACTFILES;
+ Result = pfnExtract(&Dest, szCabName);
+ if (Result == S_OK)
+ {
+ FreeLibrary(hCabinetDll);
+ return TRUE;
+ }
+ }
+ }
+ FreeLibrary(hCabinetDll);
+ }
+
+ return FALSE;
+}
diff --git a/reactos/base/applications/rapps/parser.c b/reactos/base/applications/rapps/parser.c
new file mode 100644
index 00000000000..807ffcae67a
--- /dev/null
+++ b/reactos/base/applications/rapps/parser.c
@@ -0,0 +1,737 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/parser.c
+ * PURPOSE: Parser functions
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+typedef LONG NTSTATUS;
+
+typedef struct _UNICODE_STRING {
+ USHORT Length;
+ USHORT MaximumLength;
+ PWSTR Buffer;
+} UNICODE_STRING, *PUNICODE_STRING;
+
+void WINAPI RtlInitUnicodeString(PUNICODE_STRING,PCWSTR);
+NTSTATUS WINAPI RtlUnicodeStringToInteger(const UNICODE_STRING*,ULONG,ULONG*);
+BOOLEAN WINAPI RtlIsTextUnicode(LPCVOID,INT,INT*);
+
+static const char bom_utf8[] = {0xEF,0xBB,0xBF};
+
+typedef enum
+{
+ ENCODING_UTF8 = 1,
+ ENCODING_UTF16LE,
+ ENCODING_UTF16BE
+} ENCODING;
+
+typedef struct tagSECTIONKEY
+{
+ WCHAR *value;
+ struct tagSECTIONKEY *next;
+ WCHAR name[1];
+} SECTIONKEY;
+
+typedef struct tagSECTION
+{
+ struct tagSECTIONKEY *key;
+ struct tagSECTION *next;
+ WCHAR name[1];
+} SECTION;
+
+typedef struct
+{
+ BOOL changed;
+ SECTION *section;
+ WCHAR *filename;
+ ENCODING encoding;
+} ITEMS;
+
+
+#define N_CACHED_ITEMS 10
+static ITEMS *ItemsArray[N_CACHED_ITEMS] = {NULL};
+#define CurProfile (ItemsArray[0])
+#define IS_ENTRY_COMMENT(str) ((str)[0] == ';')
+#define ParserIsSpace(c) (iswspace(c) || c == 0x1a)
+
+
+static
+WCHAR*
+memchrW(const WCHAR *ptr, WCHAR ch, size_t n)
+{
+ const WCHAR *end;
+ for (end = ptr + n; ptr < end; ptr++)
+ if (*ptr == ch)
+ return (WCHAR *)(ULONG_PTR)ptr;
+ return NULL;
+}
+
+static
+WCHAR
+*memrchrW(const WCHAR *ptr, WCHAR ch, size_t n)
+{
+ const WCHAR *end;
+ WCHAR *ret = NULL;
+ for (end = ptr + n; ptr < end; ptr++)
+ if (*ptr == ch)
+ ret = (WCHAR *)(ULONG_PTR)ptr;
+ return ret;
+}
+
+static
+void
+ParserCopyEntry(LPWSTR buffer, LPCWSTR value, int len, BOOL strip_quote)
+{
+ WCHAR quote = '\0';
+
+ if (!buffer) return;
+
+ if (strip_quote && ((*value == '\'') || (*value == '\"')))
+ {
+ if (value[1] && (value[wcslen(value)-1] == *value))
+ quote = *value++;
+ }
+
+ lstrcpynW(buffer, value, len);
+ if (quote && (len >= (int)wcslen(value))) buffer[wcslen(buffer)-1] = '\0';
+}
+
+static
+void
+ParserByteSwapShortBuffer(WCHAR * buffer, int len)
+{
+ int i;
+ USHORT * shortbuffer = buffer;
+ for (i = 0; i < len; i++)
+ shortbuffer[i] = (shortbuffer[i] >> 8) | (shortbuffer[i] << 8);
+}
+
+static
+void
+ParserWriteMarker(HANDLE hFile, ENCODING encoding)
+{
+ DWORD dwBytesWritten;
+ WCHAR bom;
+
+ switch (encoding)
+ {
+ case ENCODING_UTF8:
+ WriteFile(hFile, bom_utf8, sizeof(bom_utf8), &dwBytesWritten, NULL);
+ break;
+
+ case ENCODING_UTF16LE:
+ bom = 0xFEFF;
+ WriteFile(hFile, &bom, sizeof(bom), &dwBytesWritten, NULL);
+ break;
+
+ case ENCODING_UTF16BE:
+ bom = 0xFFFE;
+ WriteFile(hFile, &bom, sizeof(bom), &dwBytesWritten, NULL);
+ break;
+ }
+}
+
+static
+void
+ParserWriteLine(HANDLE hFile, WCHAR * szLine, int len, ENCODING encoding)
+{
+ char * write_buffer;
+ int write_buffer_len;
+ DWORD dwBytesWritten;
+
+ switch (encoding)
+ {
+ case ENCODING_UTF8:
+ write_buffer_len = WideCharToMultiByte(CP_UTF8, 0, szLine, len, NULL, 0, NULL, NULL);
+ write_buffer = HeapAlloc(GetProcessHeap(), 0, write_buffer_len);
+ if (!write_buffer) return;
+ len = WideCharToMultiByte(CP_UTF8, 0, szLine, len, write_buffer, write_buffer_len, NULL, NULL);
+ WriteFile(hFile, write_buffer, len, &dwBytesWritten, NULL);
+ HeapFree(GetProcessHeap(), 0, write_buffer);
+ break;
+
+ case ENCODING_UTF16LE:
+ WriteFile(hFile, szLine, len * sizeof(WCHAR), &dwBytesWritten, NULL);
+ break;
+
+ case ENCODING_UTF16BE:
+ ParserByteSwapShortBuffer(szLine, len);
+ WriteFile(hFile, szLine, len * sizeof(WCHAR), &dwBytesWritten, NULL);
+ break;
+ }
+}
+
+static
+void
+ParserSave(HANDLE hFile, const SECTION *section, ENCODING encoding)
+{
+ SECTIONKEY *key;
+ WCHAR *buffer, *p;
+
+ ParserWriteMarker(hFile, encoding);
+
+ for ( ; section; section = section->next)
+ {
+ int len = 0;
+
+ if (section->name[0]) len += wcslen(section->name) + 4;
+
+ for (key = section->key; key; key = key->next)
+ {
+ len += wcslen(key->name) + 2;
+ if (key->value) len += wcslen(key->value) + 1;
+ }
+
+ buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (!buffer) return;
+
+ p = buffer;
+ if (section->name[0])
+ {
+ *p++ = '[';
+ wcscpy(p, section->name);
+ p += wcslen(p);
+ *p++ = ']';
+ *p++ = '\r';
+ *p++ = '\n';
+ }
+
+ for (key = section->key; key; key = key->next)
+ {
+ wcscpy(p, key->name);
+ p += wcslen(p);
+ if (key->value)
+ {
+ *p++ = '=';
+ wcscpy(p, key->value);
+ p += wcslen(p);
+ }
+ *p++ = '\r';
+ *p++ = '\n';
+ }
+ ParserWriteLine(hFile, buffer, len, encoding);
+ HeapFree(GetProcessHeap(), 0, buffer);
+ }
+}
+
+static
+void
+ParserFree(SECTION *section)
+{
+ SECTION *next_section;
+ SECTIONKEY *key, *next_key;
+
+ for ( ; section; section = next_section)
+ {
+ for (key = section->key; key; key = next_key)
+ {
+ next_key = key->next;
+ HeapFree(GetProcessHeap(), 0, key->value);
+ HeapFree(GetProcessHeap(), 0, key);
+ }
+ next_section = section->next;
+ HeapFree(GetProcessHeap(), 0, section);
+ }
+}
+
+static
+ENCODING
+ParserDetectTextEncoding(const void * buffer, int * len)
+{
+ INT flags = IS_TEXT_UNICODE_SIGNATURE |
+ IS_TEXT_UNICODE_REVERSE_SIGNATURE |
+ IS_TEXT_UNICODE_ODD_LENGTH;
+
+ if (*len >= sizeof(bom_utf8) && !memcmp(buffer, bom_utf8, sizeof(bom_utf8)))
+ {
+ *len = sizeof(bom_utf8);
+ return ENCODING_UTF8;
+ }
+
+ RtlIsTextUnicode((void *)buffer, *len, &flags);
+
+ if (flags & IS_TEXT_UNICODE_SIGNATURE)
+ {
+ *len = sizeof(WCHAR);
+ return ENCODING_UTF16LE;
+ }
+
+ if (flags & IS_TEXT_UNICODE_REVERSE_SIGNATURE)
+ {
+ *len = sizeof(WCHAR);
+ return ENCODING_UTF16BE;
+ }
+
+ *len = 0;
+
+ return ENCODING_UTF8;
+}
+
+static
+SECTION
+*ParserLoad(HANDLE hFile, ENCODING * pEncoding)
+{
+ void *buffer_base, *pBuffer;
+ WCHAR * szFile;
+ const WCHAR *szLineStart, *szLineEnd;
+ const WCHAR *szValueStart, *szEnd, *next_line;
+ int line = 0, len;
+ SECTION *section, *first_section;
+ SECTION **next_section;
+ SECTIONKEY *key, *prev_key, **next_key;
+ DWORD dwFileSize;
+
+ dwFileSize = GetFileSize(hFile, NULL);
+ if (dwFileSize == INVALID_FILE_SIZE || dwFileSize == 0)
+ return NULL;
+
+ buffer_base = HeapAlloc(GetProcessHeap(), 0 , dwFileSize);
+ if (!buffer_base)
+ return NULL;
+
+ if (!ReadFile(hFile, buffer_base, dwFileSize, &dwFileSize, NULL))
+ {
+ HeapFree(GetProcessHeap(), 0, buffer_base);
+ return NULL;
+ }
+
+ len = dwFileSize;
+ *pEncoding = ParserDetectTextEncoding(buffer_base, &len);
+
+ pBuffer = (char *)buffer_base + len;
+ dwFileSize -= len;
+
+ switch (*pEncoding)
+ {
+ case ENCODING_UTF8:
+ len = MultiByteToWideChar(CP_UTF8, 0, pBuffer, dwFileSize, NULL, 0);
+ szFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (!szFile)
+ {
+ HeapFree(GetProcessHeap(), 0, buffer_base);
+ return NULL;
+ }
+ MultiByteToWideChar(CP_UTF8, 0, pBuffer, dwFileSize, szFile, len);
+ szEnd = szFile + len;
+ break;
+
+ case ENCODING_UTF16LE:
+ szFile = pBuffer;
+ szEnd = (WCHAR *)((char *)pBuffer + dwFileSize);
+ break;
+
+ case ENCODING_UTF16BE:
+ szFile = pBuffer;
+ szEnd = (WCHAR *)((char *)pBuffer + dwFileSize);
+ ParserByteSwapShortBuffer(szFile, dwFileSize / sizeof(WCHAR));
+ break;
+
+ default:
+ HeapFree(GetProcessHeap(), 0, buffer_base);
+ return NULL;
+ }
+
+ first_section = HeapAlloc(GetProcessHeap(), 0, sizeof(*section));
+ if (first_section == NULL)
+ {
+ if (szFile != pBuffer)
+ HeapFree(GetProcessHeap(), 0, szFile);
+ HeapFree(GetProcessHeap(), 0, buffer_base);
+ return NULL;
+ }
+
+ first_section->name[0] = 0;
+ first_section->key = NULL;
+ first_section->next = NULL;
+ next_section = &first_section->next;
+ next_key = &first_section->key;
+ prev_key = NULL;
+ next_line = szFile;
+
+ while (next_line < szEnd)
+ {
+ szLineStart = next_line;
+ next_line = memchrW(szLineStart, '\n', szEnd - szLineStart);
+ if (!next_line) next_line = memchrW(szLineStart, '\r', szEnd - szLineStart);
+ if (!next_line) next_line = szEnd;
+ else next_line++;
+ szLineEnd = next_line;
+
+ line++;
+
+ while (szLineStart < szLineEnd && ParserIsSpace(*szLineStart)) szLineStart++;
+ while ((szLineEnd > szLineStart) && ParserIsSpace(szLineEnd[-1])) szLineEnd--;
+
+ if (szLineStart >= szLineEnd)
+ continue;
+
+ if (*szLineStart == '[')
+ {
+ const WCHAR * szSectionEnd;
+ if ((szSectionEnd = memrchrW(szLineStart, ']', szLineEnd - szLineStart)))
+ {
+ szLineStart++;
+ len = (int)(szSectionEnd - szLineStart);
+ if (!(section = HeapAlloc(GetProcessHeap(), 0, sizeof(*section) + len * sizeof(WCHAR))))
+ break;
+ memcpy(section->name, szLineStart, len * sizeof(WCHAR));
+ section->name[len] = '\0';
+ section->key = NULL;
+ section->next = NULL;
+ *next_section = section;
+ next_section = §ion->next;
+ next_key = §ion->key;
+ prev_key = NULL;
+
+ continue;
+ }
+ }
+
+ len = szLineEnd - szLineStart;
+ if ((szValueStart = memchrW(szLineStart, '=', szLineEnd - szLineStart)) != NULL)
+ {
+ const WCHAR *szNameEnd = szValueStart;
+ while ((szNameEnd > szLineStart) && ParserIsSpace(szNameEnd[-1])) szNameEnd--;
+ len = szNameEnd - szLineStart;
+ szValueStart++;
+ while (szValueStart < szLineEnd && ParserIsSpace(*szValueStart)) szValueStart++;
+ }
+
+ if (len || !prev_key || *prev_key->name)
+ {
+ if (!(key = HeapAlloc(GetProcessHeap(), 0, sizeof(*key) + len * sizeof(WCHAR)))) break;
+ memcpy(key->name, szLineStart, len * sizeof(WCHAR));
+ key->name[len] = '\0';
+ if (szValueStart)
+ {
+ len = (int)(szLineEnd - szValueStart);
+ key->value = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
+ memcpy(key->value, szValueStart, len * sizeof(WCHAR));
+ key->value[len] = '\0';
+ }
+ else key->value = NULL;
+
+ key->next = NULL;
+ *next_key = key;
+ next_key = &key->next;
+ prev_key = key;
+ }
+ }
+
+ if (szFile != pBuffer)
+ HeapFree(GetProcessHeap(), 0, szFile);
+ HeapFree(GetProcessHeap(), 0, buffer_base);
+
+ return first_section;
+}
+
+static
+SECTIONKEY
+*ParserFind(SECTION **section, LPCWSTR section_name, LPCWSTR key_name, BOOL create, BOOL create_always)
+{
+ LPCWSTR p;
+ int seclen, keylen;
+
+ while (ParserIsSpace(*section_name)) section_name++;
+ if (*section_name)
+ p = section_name + wcslen(section_name) - 1;
+ else
+ p = section_name;
+
+ while ((p > section_name) && ParserIsSpace(*p)) p--;
+ seclen = p - section_name + 1;
+
+ while (ParserIsSpace(*key_name)) key_name++;
+ if (*key_name)
+ p = key_name + wcslen(key_name) - 1;
+ else
+ p = key_name;
+
+ while ((p > key_name) && ParserIsSpace(*p)) p--;
+ keylen = p - key_name + 1;
+
+ while (*section)
+ {
+ if (((*section)->name[0])
+ && (!(_wcsnicmp((*section)->name, section_name, seclen)))
+ && (((*section)->name)[seclen] == '\0'))
+ {
+ SECTIONKEY **key = &(*section)->key;
+
+ while (*key)
+ {
+ if(!create_always)
+ {
+ if ((!(_wcsnicmp((*key)->name, key_name, keylen)))
+ && (((*key)->name)[keylen] == '\0'))
+ return *key;
+ }
+ key = &(*key)->next;
+ }
+ if (!create)
+ return NULL;
+ if (!(*key = HeapAlloc(GetProcessHeap(), 0, sizeof(SECTIONKEY) + wcslen(key_name) * sizeof(WCHAR))))
+ return NULL;
+ wcscpy((*key)->name, key_name);
+ (*key)->value = NULL;
+ (*key)->next = NULL;
+ return *key;
+ }
+ section = &(*section)->next;
+ }
+ if (!create) return NULL;
+ *section = HeapAlloc(GetProcessHeap(), 0, sizeof(SECTION) + wcslen(section_name) * sizeof(WCHAR));
+ if(*section == NULL) return NULL;
+ wcscpy((*section)->name, section_name);
+ (*section)->next = NULL;
+ if (!((*section)->key = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(SECTIONKEY) + wcslen(key_name) * sizeof(WCHAR))))
+ {
+ HeapFree(GetProcessHeap(), 0, *section);
+ return NULL;
+ }
+ wcscpy((*section)->key->name, key_name);
+ (*section)->key->value = NULL;
+ (*section)->key->next = NULL;
+ return (*section)->key;
+}
+
+static
+BOOL
+ParserFlushFile(void)
+{
+ HANDLE hFile = NULL;
+
+ if (!CurProfile) return FALSE;
+
+ if (!CurProfile->changed) return TRUE;
+
+ hFile = CreateFileW(CurProfile->filename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+
+ if (hFile == INVALID_HANDLE_VALUE) return FALSE;
+
+ ParserSave(hFile, CurProfile->section, CurProfile->encoding);
+
+ CloseHandle(hFile);
+ CurProfile->changed = FALSE;
+ return TRUE;
+}
+
+static
+void
+ParserReleaseFile(void)
+{
+ ParserFlushFile();
+ ParserFree(CurProfile->section);
+ HeapFree(GetProcessHeap(), 0, CurProfile->filename);
+ CurProfile->changed = FALSE;
+ CurProfile->section = NULL;
+ CurProfile->filename = NULL;
+ CurProfile->encoding = ENCODING_UTF8;
+}
+
+static
+BOOL
+ParserOpen(LPCWSTR filename, BOOL write_access)
+{
+ WCHAR szDir[MAX_PATH];
+ WCHAR buffer[MAX_PATH];
+ HANDLE hFile = INVALID_HANDLE_VALUE;
+ int i, j;
+ ITEMS *tempProfile;
+ static const WCHAR wszSeparator[] = L"\\rapps\\";
+
+ if (!CurProfile)
+ for (i = 0; i < N_CACHED_ITEMS; i++)
+ {
+ ItemsArray[i] = HeapAlloc(GetProcessHeap(), 0, sizeof(ITEMS));
+ if (ItemsArray[i] == NULL) break;
+ ItemsArray[i]->changed = FALSE;
+ ItemsArray[i]->section = NULL;
+ ItemsArray[i]->filename = NULL;
+ ItemsArray[i]->encoding = ENCODING_UTF8;
+ }
+
+ GetCurrentDirectoryW(MAX_PATH, szDir);
+
+ wcscpy(buffer, szDir);
+ wcscat(buffer, wszSeparator);
+ wcscat(buffer, filename);
+
+ hFile = CreateFileW(buffer, GENERIC_READ | (write_access ? GENERIC_WRITE : 0),
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+
+ if ((hFile == INVALID_HANDLE_VALUE) && (GetLastError() != ERROR_FILE_NOT_FOUND))
+ {
+ return FALSE;
+ }
+
+ for (i = 0; i < N_CACHED_ITEMS; i++)
+ {
+ if ((ItemsArray[i]->filename && !wcscmp(buffer, ItemsArray[i]->filename)))
+ {
+ if (i)
+ {
+ ParserFlushFile();
+ tempProfile = ItemsArray[i];
+ for (j = i; j > 0; j--)
+ ItemsArray[j] = ItemsArray[j - 1];
+ CurProfile = tempProfile;
+ }
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(hFile);
+ }
+
+ return TRUE;
+ }
+ }
+
+ ParserFlushFile();
+
+ if (i == N_CACHED_ITEMS)
+ {
+ tempProfile = ItemsArray[N_CACHED_ITEMS - 1];
+ for (i = N_CACHED_ITEMS - 1; i > 0; i--)
+ ItemsArray[i] = ItemsArray[i - 1];
+ CurProfile = tempProfile;
+ }
+
+ if (CurProfile->filename) ParserReleaseFile();
+
+ CurProfile->filename = HeapAlloc(GetProcessHeap(), 0, (wcslen(buffer) + 1) * sizeof(WCHAR));
+ if (CurProfile->filename == NULL)
+ return FALSE;
+
+ wcscpy(CurProfile->filename, buffer);
+
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ CurProfile->section = ParserLoad(hFile, &CurProfile->encoding);
+ CloseHandle(hFile);
+ }
+ return TRUE;
+}
+
+static
+INT
+ParserGetSection(SECTION *section, LPCWSTR section_name, LPWSTR buffer, UINT len, BOOL return_values)
+{
+ SECTIONKEY *key;
+
+ if (!buffer)
+ return 0;
+
+ while (section)
+ {
+ if (section->name[0] && !_wcsicmp(section->name, section_name))
+ {
+ UINT oldlen = len;
+ for (key = section->key; key; key = key->next)
+ {
+ if (len <= 2) break;
+ if (!*key->name) continue; /* Skip empty lines */
+ if (IS_ENTRY_COMMENT(key->name)) continue; /* Skip comments */
+ if (!return_values && !key->value) continue; /* Skip lines w.o. '=' */
+
+ ParserCopyEntry(buffer, key->name, len - 1, 0);
+ len -= wcslen(buffer) + 1;
+ buffer += wcslen(buffer) + 1;
+
+ if (len < 2) break;
+ if (return_values && key->value)
+ {
+ buffer[-1] = '=';
+ ParserCopyEntry(buffer, key->value, len - 1, 0);
+ len -= wcslen(buffer) + 1;
+ buffer += wcslen(buffer) + 1;
+ }
+ }
+ *buffer = '\0';
+ if (len <= 1)
+ {
+ buffer[-1] = '\0';
+ return oldlen - 2;
+ }
+ return oldlen - len;
+ }
+ section = section->next;
+ }
+ buffer[0] = buffer[1] = '\0';
+ return 0;
+}
+
+static
+INT
+ParserInternalGetString(LPCWSTR section, LPCWSTR key_name, LPWSTR buffer, UINT len)
+{
+ SECTIONKEY *key = NULL;
+ static const WCHAR empty_strW[] = { 0 };
+
+ if (!buffer || !len) return 0;
+
+ if (key_name)
+ {
+ if (!key_name[0])
+ {
+ ParserCopyEntry(buffer, empty_strW, len, TRUE);
+ return wcslen(buffer);
+ }
+ key = ParserFind(&CurProfile->section, section, key_name, FALSE, FALSE);
+ ParserCopyEntry(buffer, (key && key->value) ? key->value : empty_strW,
+ len, TRUE);
+ return wcslen(buffer);
+ }
+
+ if (section && section[0])
+ {
+ INT ret = ParserGetSection(CurProfile->section, section, buffer, len, FALSE);
+ if (!buffer[0])
+ {
+ ParserCopyEntry(buffer, empty_strW, len, TRUE);
+ ret = wcslen(buffer);
+ }
+ return ret;
+ }
+
+ buffer[0] = '\0';
+ return 0;
+}
+
+INT
+ParserGetString(LPCWSTR Section, LPCWSTR ValueName, LPWSTR Buffer, UINT Len, LPCWSTR FileName)
+{
+ if (Section == NULL) return 0;
+
+ if (ParserOpen(FileName, FALSE))
+ return ParserInternalGetString(Section, ValueName, Buffer, Len);
+
+ return 0;
+}
+
+UINT
+ParserGetInt(LPCWSTR Section, LPCWSTR ValueName, LPCWSTR FileName)
+{
+ WCHAR Buffer[30];
+ UNICODE_STRING BufferW;
+ ULONG Result;
+
+ if (!ParserGetString(Section,
+ ValueName,
+ Buffer,
+ sizeof(Buffer) / sizeof(WCHAR),
+ FileName))
+ return -1;
+
+ if (!Buffer[0]) return -1;
+
+ RtlInitUnicodeString(&BufferW, Buffer);
+ RtlUnicodeStringToInteger(&BufferW, 0, &Result);
+ return Result;
+}
diff --git a/reactos/base/applications/rapps/rapps.h b/reactos/base/applications/rapps/rapps.h
new file mode 100644
index 00000000000..bd98229aaeb
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps.h
@@ -0,0 +1,154 @@
+#ifndef _RAPPS_H__
+#define _RAPPS_H__
+
+#include
+#include
+#include
+#include
+#include
+
+#include "resource.h"
+
+#define APPLICATION_DATEBASE_URL L"http://opendn.org/rappmgr.cab"
+
+#define SPLIT_WIDTH 4
+#define MAX_STR_LEN 256
+
+#define LISTVIEW_ICON_SIZE 24
+#define TREEVIEW_ICON_SIZE 24
+
+/* EnumType flags for EnumInstalledApplications */
+#define ENUM_ALL_COMPONENTS 30
+#define ENUM_APPLICATIONS 31
+#define ENUM_UPDATES 32
+/* EnumType flags for EnumAvailableApplications */
+#define ENUM_ALL_AVAILABLE 0
+#define ENUM_CAT_AUDIO 1
+#define ENUM_CAT_VIDEO 2
+#define ENUM_CAT_GRAPHICS 3
+#define ENUM_CAT_GAMES 4
+#define ENUM_CAT_INTERNET 5
+#define ENUM_CAT_OFFICE 6
+#define ENUM_CAT_DEVEL 7
+#define ENUM_CAT_EDU 8
+#define ENUM_CAT_ENGINEER 9
+#define ENUM_CAT_FINANCE 10
+#define ENUM_CAT_SCIENCE 11
+#define ENUM_CAT_TOOLS 12
+#define ENUM_CAT_DRIVERS 13
+#define ENUM_CAT_LIBS 14
+#define ENUM_CAT_OTHER 15
+
+#define ENUM_INSTALLED_MIN ENUM_ALL_COMPONENTS
+#define ENUM_INSTALLED_MAX ENUM_UPDATES
+#define ENUM_AVAILABLE_MIN ENUM_ALL_AVAILABLE
+#define ENUM_AVAILABLE_MAX ENUM_CAT_OTHER
+
+#define IS_INSTALLED_ENUM(a) (a >= ENUM_INSTALLED_MIN && a <= ENUM_INSTALLED_MAX)
+#define IS_AVAILABLE_ENUM(a) (a >= ENUM_AVAILABLE_MIN && a <= ENUM_AVAILABLE_MAX)
+
+/* aboutdlg.c */
+VOID ShowAboutDialog(VOID);
+
+/* available.c */
+typedef struct
+{
+ INT Category;
+ WCHAR szName[MAX_PATH];
+ WCHAR szRegName[MAX_PATH];
+ WCHAR szVersion[MAX_PATH];
+ WCHAR szLicence[MAX_PATH];
+ WCHAR szDesc[MAX_PATH];
+ WCHAR szSize[MAX_PATH];
+ WCHAR szUrlSite[MAX_PATH];
+ WCHAR szUrlDownload[MAX_PATH];
+ WCHAR szCDPath[MAX_PATH];
+
+} APPLICATION_INFO, *PAPPLICATION_INFO;
+
+/* available.c */
+typedef BOOL (CALLBACK *AVAILENUMPROC)(APPLICATION_INFO Info);
+BOOL EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc);
+BOOL ShowAvailableAppInfo(INT Index);
+
+/* installdlg.c */
+BOOL InstallApplication(INT Index);
+
+/* installed.c */
+typedef BOOL (CALLBACK *APPENUMPROC)(INT ItemIndex, LPWSTR lpName, LPWSTR lpKeyName, LPARAM lParam);
+BOOL EnumInstalledApplications(INT EnumType, BOOL IsUserKey, APPENUMPROC lpEnumProc);
+BOOL GetApplicationString(HKEY hKey, LPWSTR lpKeyName, LPWSTR lpString);
+BOOL ShowInstalledAppInfo(INT Index);
+BOOL UninstallApplication(INT Index, BOOL bModify);
+BOOL IsInstalledApplication(LPWSTR lpRegName, BOOL IsUserKey);
+
+/* winmain.c */
+extern HWND hMainWnd;
+extern HINSTANCE hInst;
+extern INT SelectedEnumType;
+
+/* listview.c */
+extern HWND hListView;
+extern BOOL bAscending;
+BOOL CreateListView(HWND hwnd);
+BOOL ListViewAddColumn(INT Index, LPWSTR lpText, INT Width, INT Format);
+INT ListViewAddItem(INT ItemIndex, INT IconIndex, LPWSTR lpText, LPARAM lParam);
+INT CALLBACK ListViewCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
+PVOID ListViewGetlParam(INT Index);
+
+/* loaddlg.c */
+BOOL DownloadApplication(INT Index);
+VOID DownloadApplicationsDB(LPWSTR lpUrl);
+
+/* misc.c */
+INT GetSystemColorDepth(VOID);
+int GetWindowWidth(HWND hwnd);
+int GetWindowHeight(HWND hwnd);
+int GetClientWindowWidth(HWND hwnd);
+int GetClientWindowHeight(HWND hwnd);
+VOID CopyTextToClipboard(LPCWSTR lpszText);
+VOID SetWelcomeText(VOID);
+VOID ShowPopupMenu(HWND hwnd, UINT MenuID);
+BOOL StartProcess(LPWSTR lpPath, BOOL Wait);
+BOOL ExtractFilesFromCab(LPWSTR lpCabName, LPWSTR lpOutputPath);
+
+/* parser.c */
+INT ParserGetString(LPCWSTR section, LPCWSTR entry, LPWSTR buffer, UINT len, LPCWSTR filename);
+UINT ParserGetInt(LPCWSTR section, LPCWSTR entry, LPCWSTR filename);
+
+/* richedit.c */
+extern HWND hRichEdit;
+extern PWSTR pLink;
+BOOL CreateRichEdit(HWND hwnd);
+VOID RichEditOnLink(HWND hwnd, ENLINK *Link);
+VOID InsertRichEditText(LPCWSTR lpszText, DWORD dwEffects);
+VOID NewRichEditText(LPCWSTR lpszText, DWORD dwEffects);
+
+/* settingsdlg.c */
+VOID CreateSettingsDlg(HWND hwnd);
+
+/* splitter.c */
+extern HWND hVSplitter;
+extern HWND hHSplitter;
+BOOL CreateVSplitBar(HWND hwnd);
+BOOL CreateHSplitBar(HWND hwnd);
+int GetHSplitterPos(VOID);
+VOID SetHSplitterPos(int Pos);
+
+/* statusbar.c */
+extern HWND hStatusBar;
+BOOL CreateStatusBar(HWND hwnd);
+VOID SetStatusBarText(LPCWSTR lpszText);
+
+/* toolbar.c */
+extern HWND hToolBar;
+extern HWND hSearchBar;
+BOOL CreateToolBar(HWND hwnd);
+VOID ToolBarOnGetDispInfo(LPTOOLTIPTEXT lpttt);
+
+/* treeview.c */
+extern HWND hTreeView;
+BOOL CreateTreeView(HWND hwnd);
+HTREEITEM TreeViewAddItem(HTREEITEM hParent, LPWSTR lpText, INT Image, INT SelectedImage, LPARAM lParam);
+
+#endif /* _RAPPS_H__ */
diff --git a/reactos/base/applications/rapps/rapps.rbuild b/reactos/base/applications/rapps/rapps.rbuild
new file mode 100644
index 00000000000..57dcb2df8c2
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps.rbuild
@@ -0,0 +1,31 @@
+
+ .
+
+ advapi32
+ comctl32
+ kernel32
+ gdi32
+ urlmon
+ user32
+ uuid
+ shell32
+ shlwapi
+ ntdll
+
+ aboutdlg.c
+ available.c
+ installdlg.c
+ installed.c
+ listview.c
+ loaddlg.c
+ misc.c
+ parser.c
+ richedit.c
+ settingsdlg.c
+ splitter.c
+ statusbar.c
+ toolbar.c
+ treeview.c
+ winmain.c
+ rapps.rc
+
diff --git a/reactos/base/applications/rapps/rapps.rc b/reactos/base/applications/rapps/rapps.rc
new file mode 100644
index 00000000000..e4fc8cd792c
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps.rc
@@ -0,0 +1,40 @@
+#include "rapps.h"
+
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Applications Manager\0"
+#define REACTOS_STR_INTERNAL_NAME "rapps\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "rapps.exe\0"
+#include
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+IDI_MAIN ICON DISCARDABLE "res/main.ico"
+IDI_EXIT ICON DISCARDABLE "res/exit.ico"
+IDI_INSTALL ICON DISCARDABLE "res/install.ico"
+IDI_UNINSTALL ICON DISCARDABLE "res/uninstall.ico"
+IDI_SETTINGS ICON DISCARDABLE "res/settings.ico"
+IDI_MODIFY ICON DISCARDABLE "res/modify.ico"
+IDI_REFRESH ICON DISCARDABLE "res/refresh.ico"
+IDI_APPS ICON DISCARDABLE "res/apps.ico"
+IDI_APPUPD ICON DISCARDABLE "res/appupd.ico"
+IDI_CATEGORY ICON DISCARDABLE "res/cat.ico"
+
+/* Categories */
+IDI_CAT_AUDIO ICON DISCARDABLE "res/cats/audio.ico"
+IDI_CAT_DEVEL ICON DISCARDABLE "res/cats/devel.ico"
+IDI_CAT_DRIVERS ICON DISCARDABLE "res/cats/drivers.ico"
+IDI_CAT_EDU ICON DISCARDABLE "res/cats/edu.ico"
+IDI_CAT_ENGINEER ICON DISCARDABLE "res/cats/engineer.ico"
+IDI_CAT_FINANCE ICON DISCARDABLE "res/cats/finance.ico"
+IDI_CAT_GAMES ICON DISCARDABLE "res/cats/games.ico"
+IDI_CAT_GRAPHICS ICON DISCARDABLE "res/cats/graphics.ico"
+IDI_CAT_INTERNET ICON DISCARDABLE "res/cats/internet.ico"
+IDI_CAT_LIBS ICON DISCARDABLE "res/cats/libs.ico"
+IDI_CAT_OFFICE ICON DISCARDABLE "res/cats/office.ico"
+IDI_CAT_OTHER ICON DISCARDABLE "res/cats/other.ico"
+IDI_CAT_SCIENCE ICON DISCARDABLE "res/cats/science.ico"
+IDI_CAT_TOOLS ICON DISCARDABLE "res/cats/tools.ico"
+IDI_CAT_VIDEO ICON DISCARDABLE "res/cats/video.ico"
+
+1 24 DISCARDABLE "manifest.xml"
+
+#include "rsrc.rc"
diff --git a/reactos/base/applications/rapps/rapps/abiword.txt b/reactos/base/applications/rapps/rapps/abiword.txt
new file mode 100644
index 00000000000..1bf41a2e09d
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/abiword.txt
@@ -0,0 +1,18 @@
+; UTF-8
+
+[Section]
+Name = AbiWord
+Version = 2.6.4
+Licence = GPL
+Description = Word processor.
+Size = 5.9MB
+Category = 6
+URLSite = http://www.abiword.org
+URLDownload = http://www.abiword.org/downloads/abiword/2.6.4/Windows/abiword-setup-2.6.4.exe
+CDPath = none
+
+[Section.0407]
+Description = Textverarbeitung
+
+[Section.0415]
+Description = Edytor tekstu
diff --git a/reactos/base/applications/rapps/rapps/ac97forvirtualbox.txt b/reactos/base/applications/rapps/rapps/ac97forvirtualbox.txt
new file mode 100644
index 00000000000..ab01b2d0ee8
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/ac97forvirtualbox.txt
@@ -0,0 +1,25 @@
+; UTF-8
+
+[Section]
+Name = AC97 Driver for VirtualBox
+Version = 5.10.00.3610
+Licence = Unknown
+Description = Unzip in the "ReactOS" folder then restart ReactOS twice.
+Size = 186kB
+Category = 13
+URLSite = Unknown
+URLDownload = http://svn.reactos.org/packages/ac97_vbox.exe
+CDPath = none
+
+
+[Section.0407]
+Name = AC97 Treiber für VirtualBox
+Licence = Unbekannt
+Description = Entpacken in das "ReactOS"-Verzeichnis und ReactOS zweimal neustarten.
+URLSite = Unbekannt
+
+[Section.0415]
+Name = Sterownik AC97 dla VirtualBox
+Licence = Nieznana
+Description = Rozpakuj zawartość w folderze "ReactOS" i dwukrotnie zrestartuj system.
+URLSite = Nieznana
diff --git a/reactos/base/applications/rapps/rapps/audiograbber.txt b/reactos/base/applications/rapps/rapps/audiograbber.txt
new file mode 100644
index 00000000000..69713ee3997
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/audiograbber.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = Audio Grabber
+Version = 1.83 SE
+Licence = Freeware
+Description = A very good CD Ripper/Audio File Converter.
+Size = 1.6MB
+Category = 1
+URLSite = http://www.audiograbber.com-us.net/
+URLDownload = http://www.audiograbber.de/files/4898276276/agsetup183se.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Ein sehr guter CD-Ripper/Audio-Datei-Konverter.
+
+[Section.0415]
+Description = Bardzo dobry CD Ripper/konwerter plikw audio.
diff --git a/reactos/base/applications/rapps/rapps/diablo2.txt b/reactos/base/applications/rapps/rapps/diablo2.txt
new file mode 100644
index 00000000000..89e3e2d8e0d
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/diablo2.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = Diablo II
+Version = 1.4
+Licence = Shareware
+Description = Diablo 2 Shareware. zeckensack's glide wrapper is req. to run it.
+Size = 132MB
+Category = 4
+URLSite = http://www.blizzard.com/diablo2
+URLDownload = http://ftp.freenet.de./pub/filepilot/windows/spiele/diabloiidemo.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Diablo 2 Shareware. zeckensacks glide wrapper wird zum Ausführen benötigt.
+
+[Section.0415]
+Description = Diablo 2 Shareware. Do poprawnego działania wymagany jest zainstalowany zeckensacks glide wrapper.
diff --git a/reactos/base/applications/rapps/rapps/dosbox.txt b/reactos/base/applications/rapps/rapps/dosbox.txt
new file mode 100644
index 00000000000..504989e93e7
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/dosbox.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = DOSBox
+Version = 0.73
+Licence = GPL
+Description = DOSBox is a DOS emulator.
+Size = 1.4MB
+Category = 15
+URLSite = http://www.dosbox.com
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/dosbox/DOSBox0.73-win32-installer.exe
+CDPath = none
+
+
+[Section.0407]
+Description = DOSBox ist ein DOS Emulator.
+
+[Section.0415]
+Description = DOSBox - emulator DOSa.
diff --git a/reactos/base/applications/rapps/rapps/firefox2.txt b/reactos/base/applications/rapps/rapps/firefox2.txt
new file mode 100644
index 00000000000..08ecb5136c6
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/firefox2.txt
@@ -0,0 +1,37 @@
+; UTF-8
+
+[Section]
+Name = Mozilla Firefox 2.0
+Version = 2.0.0.20
+Licence = MPL/GPL/LGPL
+Description = The most popular and one of the best free Web Browsers out there.
+Size = 5.8M
+Category = 5
+URLSite = http://www.mozilla.com/en-US/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.20/win32/en-US/Firefox%20Setup%202.0.0.20.exe
+CDPath = none
+
+[Section.0419]
+Description = Один из самых популярных и лучших бесплатных браузеров.
+Size = 6.4M
+URLSite = http://www.mozilla-europe.org/ru/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.20/win32/ru/Firefox%20Setup%202.0.0.20.exe
+
+
+[Section.0407]
+Description = Der populärste und einer der besten freien Webbrowser.
+Size = 5.5M
+URLSite = http://www.mozilla-europe.org/de/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.20/win32/de/Firefox%20Setup%202.0.0.20.exe
+
+[Section.0405]
+Description = Mest populære og best også gratis nettleserene der ute.
+Size = 5.6M
+URLSite = http://www.mozilla-europe.org/no/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.20/win32/nb-NO/Firefox%20Setup%202.0.0.20.exe
+
+[Section.0415]
+Description = Najpopularniejsza i jedna z najlepszych darmowych przeglądarek internetowych.
+Size = 6.3M
+URLSite = http://www.mozilla-europe.org/pl/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.20/win32/pl/Firefox%20Setup%202.0.0.20.exe
diff --git a/reactos/base/applications/rapps/rapps/firefox3.txt b/reactos/base/applications/rapps/rapps/firefox3.txt
new file mode 100644
index 00000000000..089e996ea60
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/firefox3.txt
@@ -0,0 +1,37 @@
+; UTF-8
+
+[Section]
+Name = Mozilla Firefox 3.0
+Version = 3.0.13
+Licence = MPL/GPL/LGPL
+Description = The most popular and one of the best free Web Browsers out there.
+Size = 7.1M
+Category = 5
+URLSite = http://www.mozilla.com/en-US/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.13/win32/en-US/Firefox%20Setup%203.0.13.exe
+CDPath = none
+
+[Section.0419]
+Description = Один из самых популярных и лучших бесплатных браузеров.
+Size = 7.4M
+URLSite = http://www.mozilla-europe.org/ru/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.13/win32/ru/Firefox%20Setup%203.0.13.exe
+
+
+[Section.0407]
+Description = Der populärste und einer der besten freien Webbrowser.
+Size = 6.9M
+URLSite = http://www.mozilla-europe.org/de/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.13/win32/de/Firefox%20Setup%203.0.13.exe
+
+[Section.0405]
+Description = Mest populære og best også gratis nettleserene der ute.
+Size = 6.9M
+URLSite = http://www.mozilla-europe.org/no/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.13/win32/nb-NO/Firefox%20Setup%203.0.13.exe
+
+[Section.0415]
+Description = Najpopularniejsza i jedna z najlepszych darmowych przeglądarek internetowych.
+Size = 7.8M
+URLSite = http://www.mozilla-europe.org/pl/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.13/win32/pl/Firefox%20Setup%203.0.13.exe
diff --git a/reactos/base/applications/rapps/rapps/freebasic.txt b/reactos/base/applications/rapps/rapps/freebasic.txt
new file mode 100644
index 00000000000..11c12b41550
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/freebasic.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = FreeBASIC
+Version = 0.20.0b
+Licence = GPL/LGPL
+Description = Open Source BASIC Compiler. The BASIC syntax is compatible to QBASIC.
+Size = 5.5MB
+Category = 7
+URLSite = http://www.freebasic.net/
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/fbc/FreeBASIC-v0.20.0b-win32.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Open Source BASIC Compiler. Die BASIC Syntax ist kompatibel zu QBASIC.
+
+[Section.0415]
+Description = Otwarty kompilator BASIC, ze składnią kompatybilną z QBASIC.
diff --git a/reactos/base/applications/rapps/rapps/glidewrapzbag.txt b/reactos/base/applications/rapps/rapps/glidewrapzbag.txt
new file mode 100644
index 00000000000..80dc8790b2a
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/glidewrapzbag.txt
@@ -0,0 +1,18 @@
+; UTF-8
+
+[Section]
+Name = GlidewrapZbag
+Version = 0.84c
+Licence = Freeware
+Description = glidewrapper needed to run Diablo 2 on ReactOS.
+Size = 249kB
+Category = 3
+URLSite = http://www.zeckensack.de/glide/index.html
+URLDownload = http://www.zeckensack.de/glide/archive/GlideWrapper084c.exe
+CDPath = none
+
+[Section.0407]
+Description = glidewrapper ist erforderlich um Diablo2 in ReactOS auszuführen.
+
+[Section.0415]
+Description = glidewrapper jest potrzebny do uruchomienia Diablo2 w ReactOS-ie.
diff --git a/reactos/base/applications/rapps/rapps/irfanview.txt b/reactos/base/applications/rapps/rapps/irfanview.txt
new file mode 100644
index 00000000000..9a819aec2e2
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/irfanview.txt
@@ -0,0 +1,22 @@
+; UTF-8
+
+[Section]
+Name = IrfanView
+Version = 4.23
+Licence = Freeware (for personal use)
+Description = Viewer for all kinds of graphics/audio files/video files.
+Size = 1.3MB
+Category = 3
+URLSite = http://www.irfanview.com
+URLDownload = http://irfanview.tuwien.ac.at/iview425_setup.exe
+CDPath = none
+
+
+[Section.0407]
+Licence = Freeware für nichtkommerzielle Nutzung
+Description = Anzeigeprogramm für alle Arten von Grafik-/Audio- oder Video-Dateien.
+
+[Section.0415]
+Licence = Freeware (dla użytku domowego)
+Description = Przeglądarka dla bardzo wielu typów obrazów, plików audio oraz wideo.
+
diff --git a/reactos/base/applications/rapps/rapps/irfanviewplugins.txt b/reactos/base/applications/rapps/rapps/irfanviewplugins.txt
new file mode 100644
index 00000000000..8a7c7e99bc1
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/irfanviewplugins.txt
@@ -0,0 +1,21 @@
+; UTF-8
+
+[Section]
+Name = IrfanView Plugins
+Version = 4.25
+Licence = Freeware (for personal use)
+Description = Additional Plugins for supporting more file types.
+Size = 7.7MB
+Category = 3
+URLSite = http://www.irfanview.com
+URLDownload = http://irfanview.tuwien.ac.at/plugins/irfanview_plugins_425_setup.exe
+CDPath = none
+
+
+[Section.0407]
+Licence = Freeware für nichtkommerzielle Nutzung
+Description = Zusätzlich Plugins zur Unterstützung von weiteren Dateitypen.
+
+[Section.0407]
+Licence = Freeware (dla użytku domowego)
+Description = Wtyczki otwierające dodatkowe typy plików w Irfanview.
diff --git a/reactos/base/applications/rapps/rapps/lbreakout2.txt b/reactos/base/applications/rapps/rapps/lbreakout2.txt
new file mode 100644
index 00000000000..fe755f385e8
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/lbreakout2.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = LBreakout2
+Version = 2.4.1
+Licence = GPL
+Description = Breakout Clone using SDL libs.
+Size = 3.1MB
+Category = 4
+URLSite = http://lgames.sourceforge.net/index.php?project=LBreakout2
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/lgames/lbreakout2-2.4.1-win32.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Breakout-Klon verwendet SDL Bibliothek.
+
+[Section.0415]
+Description = Klon Breakouta/Arkanoida napisany przy uyciu biblioteki SDL.
diff --git a/reactos/base/applications/rapps/rapps/lgeneral.txt b/reactos/base/applications/rapps/rapps/lgeneral.txt
new file mode 100644
index 00000000000..d5d09977397
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/lgeneral.txt
@@ -0,0 +1,18 @@
+; UTF-8
+
+[Section]
+Name = LGeneral
+Version = 1.1
+Licence = GPL
+Description = Panzer General Clone using SDL libs.
+Size = 2.0MB
+Category = 4
+URLSite = http://lgames.sourceforge.net/index.php?project=LGeneral
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/lgames/lgeneral-1.1-win32.exe
+CDPath = none
+
+[Section.0407]
+Description = Panzer-General-Klon verwendet SDL Bibliotheken.
+
+[Section.0415]
+Description = Klon gry Panzer General napisany przy uyciu biblioteki SDL.
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/lmarbles.txt b/reactos/base/applications/rapps/rapps/lmarbles.txt
new file mode 100644
index 00000000000..583c24fe354
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/lmarbles.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = LMarbles
+Version = 1.0.6
+Licence = GPL
+Description = Atomix Clone using SDL libs.
+Size = 1.4MB
+Category = 4
+URLSite = http://lgames.sourceforge.net/index.php?project=LMarbles
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/lgames/lmarbles-1.0.6-win32.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Atomix-Klon verwendet SDL Bibliotheken.
+
+[Section.0415]
+Description = Klon gry Atomix, uywajcy biblioteki SDL.
diff --git a/reactos/base/applications/rapps/rapps/mfc40.txt b/reactos/base/applications/rapps/rapps/mfc40.txt
new file mode 100644
index 00000000000..ac094f3f216
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/mfc40.txt
@@ -0,0 +1,23 @@
+; UTF-8
+
+[Section]
+Name = OLE Viewer and Microsoft Foundation Classes version 4
+Version = 4.0
+Licence = Unknown
+Description = MFC 4 is needed by some applications.
+Size = 865kB
+Category = 14
+URLSite = http://support.microsoft.com/kb/122244
+URLDownload = http://download.microsoft.com/download/ole/ole2v/3.5/w351/en-us/ole2v.exe
+CDPath = none
+
+
+[Section.0407]
+Name = OLE Anzeige und Microsoft Foundation Classes Version 4
+Licence = Unbekannt
+Description = MFC 4 wird von einigen Anwendungen benötigt.
+
+[Section.0415]
+Name = Przeglądarka OLE oraz MFC (Microsoft Foundation Classes) wersja 4
+Licence = Nieznana
+Description = Biblioteka MFC 4 jest używana przez część aplikacji.
diff --git a/reactos/base/applications/rapps/rapps/mingw.txt b/reactos/base/applications/rapps/rapps/mingw.txt
new file mode 100644
index 00000000000..2e2fabe312f
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/mingw.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = MinGW
+Version = 5.1.4
+Licence = Public domain/GPL
+Description = A Port of the GNU toolchain with GCC, GDB, GNU make, etc.
+Size = 136kb
+Category = 7
+URLSite = http://mingw.org/
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/mingw/MinGW-5.1.4.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Eine Portierung der GNU Werkzeugkette mit GCC, GDB, GNU make usw.
+
+[Section.0415]
+Description = Kompilator GCC dla platformy Windows wraz z dodatkowymi narzdziami (GDB, make, itd.).
diff --git a/reactos/base/applications/rapps/rapps/mirandaim.txt b/reactos/base/applications/rapps/rapps/mirandaim.txt
new file mode 100644
index 00000000000..b5a1a351a11
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/mirandaim.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = Miranda IM
+Version = 0.8.5
+Licence = GPL
+Description = Open source multiprotocol instant messaging application - May not work completely.
+Size = 1.6MB
+Category = 5
+URLSite = http://www.miranda-im.org/
+URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.5-unicode.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Open source Multiprotocol Instant Messaging Anwendung - funktioniert möglicherweise nicht vollständig.
+
+[Section.0415]
+Description = Otwarty komunikator internetowy, obsługujący wiele różnych protokołów (m.in. GG, Tlen, Jabber, ICQ, IRC) - może nie działać prawidłowo.
diff --git a/reactos/base/applications/rapps/rapps/mirc.txt b/reactos/base/applications/rapps/rapps/mirc.txt
new file mode 100644
index 00000000000..1d6f6ce4745
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/mirc.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = mIRC
+Version = 6.35
+Licence = Shareware
+Description = The most popular client for the Internet Relay Chat (IRC).
+Size = 1.66M
+Category = 5
+URLSite = http://www.mirc.com
+URLDownload = http://mirc.bigchief.dk/mirc635.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Der populärste Client für Internet Relay Chat (IRC).
+
+[Section.0415]
+Description = Najpopularniejszy klient IRC (Internet Relay Chat).
diff --git a/reactos/base/applications/rapps/rapps/msxml3.txt b/reactos/base/applications/rapps/rapps/msxml3.txt
new file mode 100644
index 00000000000..ff7dd8a1e10
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/msxml3.txt
@@ -0,0 +1,21 @@
+; UTF-8
+
+[Section]
+Name = Microsoft XML 3
+Version = 3.0
+Licence = Unknown
+Description = MSXML3 is needed for some MSI Installers.
+Size = 1.0MB
+Category = 14
+URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyID=28494391-052B-42FF-9674-F752BDCA9582&displaylang=en
+URLDownload = http://download.microsoft.com/download/8/8/8/888f34b7-4f54-4f06-8dac-fa29b19f33dd/msxml3.msi
+CDPath = none
+
+
+[Section.0407]
+Licence = Unbekannt
+Description = MSXML3 wird von einige MSI Installern benötigt.
+
+[Section.0415]
+Licence = Nieznana
+Description = Niektóre spośród plików instalacyjnych MSI potrzebują parsera MSXML3.
diff --git a/reactos/base/applications/rapps/rapps/offbyone.txt b/reactos/base/applications/rapps/rapps/offbyone.txt
new file mode 100644
index 00000000000..7ced41d965d
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/offbyone.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = Off By One Browser
+Version = 3.5d
+Licence = Freeware
+Description = The Off By One Browser is a very small and fast web browser with full HTML 3.2 support.
+Size = 0.98M
+Category = 5
+URLSite = http://offbyone.com
+URLDownload = http://offbyone.com/offbyone/images/OffByOneSetup.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Der Off-By-One-Browser ist ein sehr kleiner und schneller Webbrowser mit voller HTML 3.2 Unterstützung.
+
+[Section.0415]
+Description = Bardzo mała i szybka przeglądarka internetowa z pełną obsługą HTML 3.2.
diff --git a/reactos/base/applications/rapps/rapps/openoffice2.4.txt b/reactos/base/applications/rapps/rapps/openoffice2.4.txt
new file mode 100644
index 00000000000..99a4e96abdb
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/openoffice2.4.txt
@@ -0,0 +1,25 @@
+; UTF-8
+
+[Section]
+Name = OpenOffice 2.4
+Version = 2.4.2
+Licence = LGPL
+Description = THE Open Source Office Suite.
+Size = 127MB
+Category = 6
+URLSite = http://www.openoffice.org
+URLDownload = http://ftp.plusline.de/OpenOffice/stable/2.4.2/OOo_2.4.2_Win32Intel_install_wJRE_en-US.exe
+CDPath = none
+
+
+[Section.0407]
+Description = DIE Open Source Office Suite
+URLSite = http://de.openoffice.org
+Size = 114.2MB
+URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/de/2.4.2/OOo_2.4.2_Win32Intel_install_de.exe
+
+[Section.0415]
+URLSite = http://pl.openoffice.org/
+Description = Otwarty pakiet biurowy
+URLDownload = http://www.mirrorservice.org/sites/download.openoffice.org/localized/pl/2.4.2/OOo_2.4.2_Win32Intel_install_wJRE_pl.exe
+Size = 128.0M
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/openoffice3.0.txt b/reactos/base/applications/rapps/rapps/openoffice3.0.txt
new file mode 100644
index 00000000000..1aef513e3cb
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/openoffice3.0.txt
@@ -0,0 +1,26 @@
+; UTF-8
+
+[Section]
+Name = OpenOffice 3.0
+Version = 3.1.0
+Licence = LGPL
+Description = THE Open Source Office Suite.
+Size = 134.3MB
+Category = 6
+URLSite = http://www.openoffice.org
+URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/stable/3.1.0/OOo_3.1.0_Win32Intel_install_en-US.exe
+CDPath = none
+
+
+[Section.0407]
+Description = DIE Open Source Office Suite
+URLSite = http://de.openoffice.org
+Size = 156.8MB
+Version = 3.1.1
+URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/de/3.1.1/OOo_3.1.1_Win32Intel_install_wJRE_de.exe
+
+[Section.0415]
+Description = Otwarty pakiet biurowy
+URLSite = http://pl.openoffice.org
+Size = 147.1MB
+URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/pl/3.1.0/OOo_3.1.0_Win32Intel_install_wJRE_pl.exe
diff --git a/reactos/base/applications/rapps/rapps/openttd.txt b/reactos/base/applications/rapps/rapps/openttd.txt
new file mode 100644
index 00000000000..a8f72a6e502
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/openttd.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = OpenTTD
+Version = 0.7.2
+Licence = GPL v2
+Description = Open Source clone of the "Transport Tycoon Deluxe" game engine. You need a copy of Transport Tycoon.
+Size = 2.9MB
+Category = 4
+URLSite = http://www.openttd.org
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/openttd/openttd-0.7.2-win32.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Open Source Klon der "Transport Tycoon Deluxe" Spiel-Engine. Sie benötigen eine Kopie von Transport Tycoon.
+
+[Section.0415]
+Description = Otwarty klon silnika gry "Transport Tycoon Deluxe". Do poprawnego działania potrzebna jest kopia gry Transport Tycoon.
diff --git a/reactos/base/applications/rapps/rapps/opera.txt b/reactos/base/applications/rapps/rapps/opera.txt
new file mode 100644
index 00000000000..a1d9b51acf4
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/opera.txt
@@ -0,0 +1,21 @@
+; UTF-8
+
+[Section]
+Name = Opera
+Version = 9.64
+Licence = Freeware
+Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client.
+Size = 7.1M
+Category = 5
+URLSite = http://www.opera.com/
+URLDownload = http://ftp.opera.com/pub/opera/win/964/int/Opera_964_int_Setup.exe
+CDPath = none
+
+[Section.0419]
+Description = Популярный браузер со многими дополнительными возможностями, включающий почтовый и BitTorrent клиент.
+
+[Section.0407]
+Description = Der populäre Opera Browser mit vielen fortschrittlichen Eigenschaften, enthält einen Mail und BitTorrent Client.
+
+[Section.0415]
+Description = Popularna przeglądarka internetowa z wieloma zaawansowanymi funkcjami, zawierająca klientów: poczty oraz BitTorrent.
diff --git a/reactos/base/applications/rapps/rapps/putty.txt b/reactos/base/applications/rapps/rapps/putty.txt
new file mode 100644
index 00000000000..c250ef60727
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/putty.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = PuTTY
+Version = 0.60
+Licence = MIT
+Description = A free SSH, Telnet, rlogin, and raw TCP client.
+Size = 1.7MB
+Category = 5
+URLSite = http://www.chiark.greenend.org.uk/~sgtatham/putty/
+URLDownload = http://the.earth.li/~sgtatham/putty/latest/x86/putty-0.60-installer.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Ein freier SSH-, Telnet-, rlogin- und TCP-Client
+
+[Section.0415]
+Description = Darmowy klient obsugujcy protokoy SSH, Telnet, rlogin oraz bezporednie TCP.
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/rosbe.txt b/reactos/base/applications/rapps/rapps/rosbe.txt
new file mode 100644
index 00000000000..671354a2ad4
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/rosbe.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = ReactOS Build Environment
+Version = 1.4.4
+Licence = GPL
+Description = Allows you to build the ReactOS Source. For more instructions see ReactOS wiki.
+Size = 14.9MB
+Category = 7
+URLSite = http://reactos.org/wiki/Build_Environment
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.4.4.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Erlaubt es Ihnen ReactOS aus den Quellen zu bauen. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen.
+
+[Section.0415]
+Description = Pozwala zbudować obraz płyty ReactOS ze źródeł. Więcej informacji na Wiki ReactOS.
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/sambatng.txt b/reactos/base/applications/rapps/rapps/sambatng.txt
new file mode 100644
index 00000000000..af61bcae3c5
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/sambatng.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = Samba TNG
+Version = 0.4.99cvs
+Licence = GPL
+Description = This tool allows you to access your Windows shared folders/printers with ReactOS.
+Size = 1MB
+Category = 5
+URLSite = http://samba-tng.org
+URLDownload = http://svn.reactos.org/packages/samba-tng.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Dieses Werkzeug erlaubt den Zugriff auf Windows' gemeinsame Verzeichnisse und Drucker aus ReactOS heraus.
+
+[Section.0415]
+Description = Narzdzie pozwalajce na dostp z poziomu ReactOSa do wspdzielonych folderw/drukarek Windows.
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/scummvm.txt b/reactos/base/applications/rapps/rapps/scummvm.txt
new file mode 100644
index 00000000000..91114aace1e
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/scummvm.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = ScummVM
+Version = 0.13.1
+Licence = GPL
+Description = Sam and Max, Day of the Tentacle, etc on ReactOS.
+Size = 2.9MB
+Category = 4
+URLSite = http://scummvm.org/
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scummvm/scummvm-0.13.1-win32.exe
+CDPath = none
+
+
+[Section.0407]
+Description = Sam and Max, Day of the Tentacle usw in ReactOS
+
+[Section.0415]
+Description = Program pozwalajcy uruchomi stare gry przygodowe (Sam and Max, Day of the Tentacle, Monkey Island) w ReactOS
diff --git a/reactos/base/applications/rapps/rapps/sdl_mixer.txt b/reactos/base/applications/rapps/rapps/sdl_mixer.txt
new file mode 100644
index 00000000000..1db5bf39299
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/sdl_mixer.txt
@@ -0,0 +1,19 @@
+; UTF-8
+
+[Section]
+Name = Simple Direct Media Layer (SDL) Mixer
+Version = 1.2.8
+Licence = LGPL
+Description = Needed for some Open Source Games to run. You need 7-Zip or a similar Utility to extract it.
+Size = 307kB
+Category = 14
+URLSite = http://www.libsdl.org/projects/SDL_mixer/
+URLDownload = http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-1.2.8-win32.zip
+CDPath = none
+
+
+[Section.0407]
+Description = Erforderlich um einige Open Source Spiele auszuführen. Sie brauchen 7-Zip oder einen ähnlichen Entpacker um es zu entpacken.
+
+[Section.0415]
+Description = Biblioteka wymagana przez niektóre gry (zwłaszcza te o otwartym źródle). Do jej rozpakowania potrzebny jest 7-Zip lub podobny program.
diff --git a/reactos/base/applications/rapps/rapps/sdl_runtime.txt b/reactos/base/applications/rapps/rapps/sdl_runtime.txt
new file mode 100644
index 00000000000..99450825859
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/sdl_runtime.txt
@@ -0,0 +1,20 @@
+; UTF-8
+
+[Section]
+Name = Simple Direct Media Layer (SDL) Runtime
+Version = 1.2.13
+Licence = LGPL
+Description = Needed for many Open Source Games to run. You need 7-Zip or a similar Utility to extract it.
+Size = 145kB
+Category = 14
+URLSite = http://www.libsdl.org/
+URLDownload = http://www.libsdl.org/release/SDL-1.2.13-win32.zip
+CDPath = none
+
+[Section.0407]
+Name = Simple Direct Media Layer (SDL) Laufzeitsystem
+Description = Erforderlich um einige Open Source Spiele auszuführen. Sie brauchen 7-Zip oder einen ähnlichen Entpacker um es zu entpacken.
+
+[Section.0415]
+Name = Biblioteka uruchomieniowa Simple Direct Media Layer (SDL)
+Description = Wymagana przez wiele gier (głównie o otwartym źródle). Do jej rozpakowania potrzebny jest program 7-Zip lub podobny.
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/seamonkey.txt b/reactos/base/applications/rapps/rapps/seamonkey.txt
new file mode 100644
index 00000000000..8535dc528ab
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/seamonkey.txt
@@ -0,0 +1,27 @@
+; UTF-8
+
+[Section]
+Name = Mozilla SeaMonkey
+Version = 1.1.17
+Licence = MPL/GPL/LGPL
+Description = Mozilla Suite is alive. This is the one and only Browser, Mail, Chat, and Composer bundle you will ever need.
+Size = 12.4MB
+Category = 5
+URLSite = http://www.seamonkey-project.org/
+URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/1.1.17/seamonkey-1.1.17.en-US.win32.installer.exe
+CDPath = none
+
+[Section.0419]
+Description = Продолжение Mozilla Suite. Включает браузер, почтовый клиент, IRC-клиент и HTML-редактор.
+Size = 9.0MB
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/1.1.17/contrib-localized/seamonkey-1.1.17.ru-RU.win32.installer.exe
+
+[Section.0407]
+Description = Mozilla Suite ist lebendig. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benötigen.
+Size = 9.0MB
+URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/1.1.17/contrib-localized/seamonkey-1.1.17.de-AT.win32.installer.exe
+
+[Section.0415]
+Description = Pakiet Mozilla żyje. W zestawie: przeglądarka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz.
+Size = 12.4MB
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/1.1.17/contrib-localized/seamonkey-1.1.17.pl-PL.win32.installer.exe
diff --git a/reactos/base/applications/rapps/rapps/smplayer.txt b/reactos/base/applications/rapps/rapps/smplayer.txt
new file mode 100644
index 00000000000..c66e09296fa
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/smplayer.txt
@@ -0,0 +1,20 @@
+; UTF-8
+
+[Section]
+Name = SMPlayer
+Version = 0.6.8
+Licence = GPL
+Description = SMPlayer.
+Size = 13.38MB
+Category = 1
+URLSite = http://smplayer.sourceforge.net/
+URLDownload = http://dfn.dl.sourceforge.net/sourceforge/smplayer/smplayer_0.6.8_setup.exe
+CDPath = none
+
+
+[Section.0407]
+URLSite = http://smplayer.sourceforge.net/index.php?tr_lang=de
+
+[Section.0415]
+URLSite = http://smplayer.sourceforge.net/index.php?tr_lang=pl
+Description = Graficzna nakadka na MPlayer, otwarty odtwarzacz filmw.
diff --git a/reactos/base/applications/rapps/rapps/thunderbird.txt b/reactos/base/applications/rapps/rapps/thunderbird.txt
new file mode 100644
index 00000000000..4f4be60d120
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/thunderbird.txt
@@ -0,0 +1,30 @@
+; UTF-8
+
+[Section]
+Name = Mozilla Thunderbird 2.0
+Version = 2.0.0.23
+Licence = MPL/GPL/LGPL
+Description = The most popular and one of the best free Mail Clients out there.
+Size = 6.2M
+Category = 5
+URLSite = http://www.mozilla-europe.org/en/products/thunderbird/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/2.0.0.23/win32/en-US/Thunderbird%20Setup%202.0.0.23.exe
+CDPath = none
+
+[Section.0419]
+Description = Один из самых популярных и лучших бесплатных почтовых клиентов.
+Size = 7.1M
+URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/2.0.0.23/win32/ru/Thunderbird%20Setup%202.0.0.23.exe
+
+[Section.0407]
+Description = Der populärste und einer der besten freien Mail-Clients.
+Size = 6.4M
+URLSite = http://www.mozilla-europe.org/de/products/thunderbird/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/2.0.0.23/win32/de/Thunderbird%20Setup%202.0.0.23.exe
+
+[Section.0415]
+Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty.
+Size = 7.2M
+URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/2.0.0.23/win32/pl/Thunderbird%20Setup%202.0.0.23.exe
diff --git a/reactos/base/applications/rapps/rapps/tileworld.txt b/reactos/base/applications/rapps/rapps/tileworld.txt
new file mode 100644
index 00000000000..f398c971757
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/tileworld.txt
@@ -0,0 +1,18 @@
+; UTF-8
+
+[Section]
+Name = Tile World
+Version = 1.3.0
+Licence = GPL
+Description = Nice Clone of Chip's Challenge originally made for the Atari Lynx. Includes free CCLP2 Graphics Pack, so you dont need the copyrighted Original.
+Size = 1.2MB
+Category = 4
+URLSite = http://www.muppetlabs.com/~breadbox/software/tworld/
+URLDownload = http://www.muppetlabs.com/~breadbox/pub/software/tworld/tworld-1.3.0-win32-CCLP2.exe
+CDPath = none
+
+[Section.0407]
+Description = Schöner Klon von Chip's Challenge ursprünglich etnwickelt für Atari Lynx. Enthält CCLP2 Graphics Pack, deshalb wird das urheberrechtlich geschützte Original nicht benötigt.
+
+[Section.0415]
+Description = Udany klon gry Chip's Challenge z Atari Lynx. Zawiera darmowy zestaw grafik CCLP2.
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/tuxpaint.txt b/reactos/base/applications/rapps/rapps/tuxpaint.txt
new file mode 100644
index 00000000000..46212059707
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/tuxpaint.txt
@@ -0,0 +1,18 @@
+; UTF-8
+
+[Section]
+Name = TuxPaint
+Version = 0.9.21
+Licence = GPL
+Description = An Open Source bitmap graphics editor geared towards young children.
+Size = 10MB
+Category = 3
+URLSite = http://tuxpaint.org
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/tuxpaint/tuxpaint-0.9.21-win32-installer.exe
+CDPath = none
+
+[Section.0407]
+Description = Ein Open Source Bitmap Zeichenprogramm für kleine Kinder.
+
+[Section.0415]
+Description = Otwarty program graficzny przeznaczony głównie dla dzieci.
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/utorrent.txt b/reactos/base/applications/rapps/rapps/utorrent.txt
new file mode 100644
index 00000000000..409ee45ad51
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/utorrent.txt
@@ -0,0 +1,24 @@
+; UTF-8
+
+[Section]
+Name = µTorrent
+Version = 1.8.4
+Licence = Freeware for non-commercial uses
+Description = Small and fast BitTorrent Client.
+Size = 282K
+Category = 5
+URLSite = http://www.utorrent.com/
+URLDownload = http://download.utorrent.com/1.8.3/utorrent.exe
+CDPath = none
+
+[Section.0419]
+Licence = Бесплатная для не комерческого использования
+Description = Маленький и быстрый BitTorrent клиент.
+
+[Section.0407]
+Licence = Freeware für nichtkommerzielle Nutzung
+Description = Kleiner und schneller BitTorrent Client.
+
+[Section.0415]
+Licence = Freeware (do użytku domowego)
+Description = Mały i szybki klient BitTorrent.
diff --git a/reactos/base/applications/rapps/rapps/vb5run.txt b/reactos/base/applications/rapps/rapps/vb5run.txt
new file mode 100644
index 00000000000..243670788a5
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/vb5run.txt
@@ -0,0 +1,20 @@
+; UTF-8
+
+[Section]
+Name = Visual Basic 5 Runtime
+Version = 5.0
+Licence = Unknown
+Description = Visual Basic 5 Runtime.
+Size = 970kB
+Category = 14
+URLSite = http://support.microsoft.com/kb/180071
+URLDownload = http://download.microsoft.com/download/vb50pro/utility/1/win98/en-us/msvbvm50.exe
+CDPath = none
+
+[Section.0407]
+Licence = Unbekannt
+Description = Visual Basic 5 Laufzeitsystem
+
+[Section.0415]
+Licence = Nieznana
+Description = Biblioteki uruchomieniowe Visual Basic 5
diff --git a/reactos/base/applications/rapps/rapps/vb6run.txt b/reactos/base/applications/rapps/rapps/vb6run.txt
new file mode 100644
index 00000000000..a6f6a84b995
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/vb6run.txt
@@ -0,0 +1,20 @@
+; UTF-8
+
+[Section]
+Name = Visual Basic 6 Runtime
+Version = 6.0
+Licence = Unknown
+Description = Visual Basic 6 Runtime.
+Size = 1.0MB
+Category = 14
+URLSite = http://support.microsoft.com/kb/192461
+URLDownload = http://download.microsoft.com/download/vb60pro/install/6/win98me/en-us/vbrun60.exe
+CDPath = none
+
+[Section.0407]
+Licence = Unbekannt
+Description = Visual Basic 6 Laufzeitsystem
+
+[Section.0415]
+Licence = Nieznana
+Description = Biblioteki uruchomieniowe Visual Basic 6
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/vc2005run.txt b/reactos/base/applications/rapps/rapps/vc2005run.txt
new file mode 100644
index 00000000000..f13d84b9f43
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/vc2005run.txt
@@ -0,0 +1,20 @@
+; UTF-8
+
+[Section]
+Name = Visual Studio 2005 Runtime
+Version = 7.0
+Licence = Unknown
+Description = Visual Studio 2005 Runtime.
+Size = 2.6MB
+Category = 14
+URLSite = http://www.microsoft.com/Downloads/details.aspx?displaylang=en&FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee
+URLDownload = http://download.microsoft.com/download/d/3/4/d342efa6-3266-4157-a2ec-5174867be706/vcredist_x86.exe
+CDPath = none
+
+[Section.0407]
+Licence = Unbekannt
+Description = Visual Studio 2005 Laufzeitsystem
+
+[Section.0415]
+Licence = Nieznana
+Description = Biblioteki uruchomieniowe Visual Studio 2005
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/vc2005sp1run.txt b/reactos/base/applications/rapps/rapps/vc2005sp1run.txt
new file mode 100644
index 00000000000..78cf07dfea1
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/vc2005sp1run.txt
@@ -0,0 +1,20 @@
+; UTF-8
+
+[Section]
+Name = Visual Studio 2005 Runtime SP1
+Version = 7.1
+Licence = Unknown
+Description = Visual Studio 2005 Runtime SP1.
+Size = 2.6MB
+Category = 14
+URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&displaylang=en
+URLDownload = http://download.microsoft.com/download/e/1/c/e1c773de-73ba-494a-a5ba-f24906ecf088/vcredist_x86.exe
+CDPath = none
+
+[Section.0407]
+Licence = Unbekannt
+Description = Visual Studio 2005 Laufzeitsystem SP1
+
+[Section.0415]
+Licence = Nieznana
+Description = Biblioteki uruchomieniowe Visual Studio 2005 SP1
diff --git a/reactos/base/applications/rapps/rapps/vc2008run.txt b/reactos/base/applications/rapps/rapps/vc2008run.txt
new file mode 100644
index 00000000000..83173830510
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/vc2008run.txt
@@ -0,0 +1,20 @@
+; UTF-8
+
+[Section]
+Name = Visual Studio 2008 Runtime
+Version = 8.0
+Licence = Unknown
+Description = Visual Studio 2008 Runtime.
+Size = 1.7MB
+Category = 14
+URLSite = http://www.microsoft.com/DOWNLOADS/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en
+URLDownload = http://download.microsoft.com/download/1/1/1/1116b75a-9ec3-481a-a3c8-1777b5381140/vcredist_x86.exe
+CDPath = none
+
+[Section.0407]
+Licence = Unbekannt
+Description = Visual Studio 2008 Laufzeitsystem
+
+[Section.0415]
+Licence = Nieznana
+Description = Biblioteki uruchomieniowe Visual Studio 2008
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/vc6run.txt b/reactos/base/applications/rapps/rapps/vc6run.txt
new file mode 100644
index 00000000000..78efbe578f1
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/vc6run.txt
@@ -0,0 +1,20 @@
+; UTF-8
+
+[Section]
+Name = Visual Studio 6 Runtime
+Version = 6.0
+Licence = Unknown
+Description = Visual Studio 6 Runtime.
+Size = 1.7MB
+Category = 14
+URLSite = http://support.microsoft.com/kb/259403
+URLDownload = http://download.microsoft.com/download/vc60pro/update/1/w9xnt4/en-us/vc6redistsetup_enu.exe
+CDPath = none
+
+[Section.0407]
+Licence = Unbekannt
+Description = Visual Studio 6 Laufzeitsystem
+
+[Section.0415]
+Licence = Nieznana
+Description = Biblioteki uruchomieniowe Visual Studio 6
\ No newline at end of file
diff --git a/reactos/base/applications/rapps/rapps/winboard.txt b/reactos/base/applications/rapps/rapps/winboard.txt
new file mode 100644
index 00000000000..496b778bbc5
--- /dev/null
+++ b/reactos/base/applications/rapps/rapps/winboard.txt
@@ -0,0 +1,18 @@
+; UTF-8
+
+[Section]
+Name = WinBoard
+Version = 4.2.7b
+Licence = GPL 3
+Description = WinBoard is a graphical chessboard for the Windows/ReactOS that can serve as a user interface for GNU Chess, Crafty, and other chess engines, for the Internet Chess Servers, and for electronic mail correspondence chess.
+Size = 5.9MB
+Category = 4
+URLSite = http://www.gnu.org/software/xboard/
+URLDownload = http://ftp.gnu.org/gnu/winboard/winboard-4_2_7b.exe
+CDPath = none
+
+[Section.0407]
+Description = WinBoard ist ein grafisches Schachbrett für Windows/ReactOS welches als Nutzerinterface für GNU Chess, Crafty oder andere Schachprogramme, für Internet Schachserver und für Briefschach dient.
+
+[Section.0415]
+Description = Graficzna szachownica dla systemu Windows/ReactOS, która może służyć jako graficzna nakładka dla GNU Chess, Crafty, lub innych programów szachowych(w tym internetowych serwerów szachowych) lub szachów korespondencyjnych.
diff --git a/reactos/base/applications/rapps/res/apps.ico b/reactos/base/applications/rapps/res/apps.ico
new file mode 100644
index 00000000000..3985b5ac191
Binary files /dev/null and b/reactos/base/applications/rapps/res/apps.ico differ
diff --git a/reactos/base/applications/rapps/res/appupd.ico b/reactos/base/applications/rapps/res/appupd.ico
new file mode 100644
index 00000000000..72e94d466fc
Binary files /dev/null and b/reactos/base/applications/rapps/res/appupd.ico differ
diff --git a/reactos/base/applications/rapps/res/cat.ico b/reactos/base/applications/rapps/res/cat.ico
new file mode 100644
index 00000000000..7bd3566c490
Binary files /dev/null and b/reactos/base/applications/rapps/res/cat.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/audio.ico b/reactos/base/applications/rapps/res/cats/audio.ico
new file mode 100644
index 00000000000..611fc2cb8bc
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/audio.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/devel.ico b/reactos/base/applications/rapps/res/cats/devel.ico
new file mode 100644
index 00000000000..5a3295b9220
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/devel.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/drivers.ico b/reactos/base/applications/rapps/res/cats/drivers.ico
new file mode 100644
index 00000000000..73e233ea996
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/drivers.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/edu.ico b/reactos/base/applications/rapps/res/cats/edu.ico
new file mode 100644
index 00000000000..c735da2ddda
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/edu.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/engineer.ico b/reactos/base/applications/rapps/res/cats/engineer.ico
new file mode 100644
index 00000000000..e559234ae1e
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/engineer.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/finance.ico b/reactos/base/applications/rapps/res/cats/finance.ico
new file mode 100644
index 00000000000..914990d0c3b
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/finance.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/games.ico b/reactos/base/applications/rapps/res/cats/games.ico
new file mode 100644
index 00000000000..2c283aae769
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/games.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/graphics.ico b/reactos/base/applications/rapps/res/cats/graphics.ico
new file mode 100644
index 00000000000..1423926103f
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/graphics.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/internet.ico b/reactos/base/applications/rapps/res/cats/internet.ico
new file mode 100644
index 00000000000..e0c0afdfa56
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/internet.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/libs.ico b/reactos/base/applications/rapps/res/cats/libs.ico
new file mode 100644
index 00000000000..27e21bc9359
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/libs.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/office.ico b/reactos/base/applications/rapps/res/cats/office.ico
new file mode 100644
index 00000000000..a589a4020ee
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/office.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/other.ico b/reactos/base/applications/rapps/res/cats/other.ico
new file mode 100644
index 00000000000..0da9d2bae1d
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/other.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/science.ico b/reactos/base/applications/rapps/res/cats/science.ico
new file mode 100644
index 00000000000..74aad35c8d5
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/science.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/tools.ico b/reactos/base/applications/rapps/res/cats/tools.ico
new file mode 100644
index 00000000000..f8803038534
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/tools.ico differ
diff --git a/reactos/base/applications/rapps/res/cats/video.ico b/reactos/base/applications/rapps/res/cats/video.ico
new file mode 100644
index 00000000000..23c866c1d51
Binary files /dev/null and b/reactos/base/applications/rapps/res/cats/video.ico differ
diff --git a/reactos/base/applications/rapps/res/exit.ico b/reactos/base/applications/rapps/res/exit.ico
new file mode 100644
index 00000000000..8b4c48ec0ae
Binary files /dev/null and b/reactos/base/applications/rapps/res/exit.ico differ
diff --git a/reactos/base/applications/rapps/res/install.ico b/reactos/base/applications/rapps/res/install.ico
new file mode 100644
index 00000000000..04b0c216512
Binary files /dev/null and b/reactos/base/applications/rapps/res/install.ico differ
diff --git a/reactos/base/applications/rapps/res/main.ico b/reactos/base/applications/rapps/res/main.ico
new file mode 100644
index 00000000000..8c22db18dba
Binary files /dev/null and b/reactos/base/applications/rapps/res/main.ico differ
diff --git a/reactos/base/applications/rapps/res/modify.ico b/reactos/base/applications/rapps/res/modify.ico
new file mode 100644
index 00000000000..157f2998a58
Binary files /dev/null and b/reactos/base/applications/rapps/res/modify.ico differ
diff --git a/reactos/base/applications/rapps/res/refresh.ico b/reactos/base/applications/rapps/res/refresh.ico
new file mode 100644
index 00000000000..ea6c8d38005
Binary files /dev/null and b/reactos/base/applications/rapps/res/refresh.ico differ
diff --git a/reactos/base/applications/rapps/res/settings.ico b/reactos/base/applications/rapps/res/settings.ico
new file mode 100644
index 00000000000..efbe3306de6
Binary files /dev/null and b/reactos/base/applications/rapps/res/settings.ico differ
diff --git a/reactos/base/applications/rapps/res/uninstall.ico b/reactos/base/applications/rapps/res/uninstall.ico
new file mode 100644
index 00000000000..c788be0b8dd
Binary files /dev/null and b/reactos/base/applications/rapps/res/uninstall.ico differ
diff --git a/reactos/base/applications/rapps/resource.h b/reactos/base/applications/rapps/resource.h
new file mode 100644
index 00000000000..d5329904dbd
--- /dev/null
+++ b/reactos/base/applications/rapps/resource.h
@@ -0,0 +1,140 @@
+#ifndef _RESOURCE_H__
+#define _RESOURCE_H__
+
+/* Icons */
+#define IDI_MAIN 10
+#define IDI_EXIT 11
+#define IDI_INSTALL 12
+#define IDI_UNINSTALL 13
+#define IDI_SETTINGS 14
+#define IDI_MODIFY 15
+#define IDI_REFRESH 16
+#define IDI_APPS 17
+#define IDI_APPUPD 18
+#define IDI_CATEGORY 19
+
+/* Icons for categories */
+#define IDI_CAT_AUDIO 50
+#define IDI_CAT_DEVEL 51
+#define IDI_CAT_DRIVERS 52
+#define IDI_CAT_EDU 53
+#define IDI_CAT_ENGINEER 54
+#define IDI_CAT_FINANCE 55
+#define IDI_CAT_GAMES 56
+#define IDI_CAT_GRAPHICS 57
+#define IDI_CAT_INTERNET 58
+#define IDI_CAT_LIBS 59
+#define IDI_CAT_OFFICE 60
+#define IDI_CAT_OTHER 61
+#define IDI_CAT_SCIENCE 62
+#define IDI_CAT_TOOLS 63
+#define IDI_CAT_VIDEO 64
+
+/* Bitmaps */
+
+/* Controls */
+#define IDC_STATUSBAR 1000
+#define IDC_DOWNLOAD_PROGRESS 1001
+#define IDC_DOWNLOAD_STATUS 1002
+
+/* Dialogs */
+#define IDD_SETTINGS_DIALOG 300
+#define IDD_INSTALL_DIALOG 301
+#define IDD_DOWNLOAD_DIALOG 302
+#define IDD_ABOUT_DIALOG 303
+
+/* Menus */
+#define IDR_MAINMENU 500
+#define IDR_LINKMENU 501
+#define IDR_APPLICATIONMENU 502
+
+/* Menu items */
+#define ID_EXIT 550
+#define ID_INSTALL 551
+#define ID_UNINSTALL 552
+#define ID_HELP 553
+#define ID_ABOUT 554
+#define ID_MODIFY 555
+#define ID_OPEN_LINK 556
+#define ID_COPY_LINK 557
+#define ID_SETTINGS 558
+#define ID_REFRESH 559
+
+/* Strings */
+#define IDS_APPTITLE 100
+#define IDS_SEARCH_TEXT 101
+#define IDS_INSTALL 102
+#define IDS_UNINSTALL 103
+#define IDS_MODIFY 104
+#define IDS_APPS_COUNT 105
+#define IDS_WELCOME_TITLE 106
+#define IDS_WELCOME_TEXT 107
+#define IDS_WELCOME_URL 108
+#define IDS_INSTALLED 109
+#define IDS_AVAILABLEFORINST 110
+#define IDS_UPDATES 111
+#define IDS_APPLICATIONS 112
+#define IDS_DOWNLOAD_FOLDER 113
+
+/* Tooltips */
+#define IDS_TOOLTIP_INSTALL 200
+#define IDS_TOOLTIP_UNINSTALL 201
+#define IDS_TOOLTIP_MODIFY 202
+#define IDS_TOOLTIP_SETTINGS 203
+#define IDS_TOOLTIP_REFRESH 204
+#define IDS_TOOLTIP_EXIT 205
+
+/* Columns info */
+#define IDS_APP_NAME 250
+#define IDS_APP_INST_VERSION 251
+#define IDS_APP_DESCRIPTION 252
+
+/* Apps info */
+#define IDS_INFO_VERSION 280
+#define IDS_INFO_DESCRIPTION 281
+#define IDS_INFO_PUBLISHER 282
+#define IDS_INFO_HELPLINK 283
+#define IDS_INFO_HELPPHONE 284
+#define IDS_INFO_README 285
+#define IDS_INFO_REGOWNER 286
+#define IDS_INFO_PRODUCTID 287
+#define IDS_INFO_CONTACT 288
+#define IDS_INFO_UPDATEINFO 289
+#define IDS_INFO_INFOABOUT 290
+#define IDS_INFO_COMMENTS 291
+#define IDS_INFO_INSTLOCATION 292
+#define IDS_INFO_INSTALLSRC 293
+#define IDS_INFO_UNINSTALLSTR 294
+#define IDS_INFO_MODIFYPATH 295
+#define IDS_INFO_INSTALLDATE 296
+
+/* Info for availabled apps */
+#define IDS_AINFO_VERSION 350
+#define IDS_AINFO_DESCRIPTION 351
+#define IDS_AINFO_SIZE 352
+#define IDS_AINFO_URLSITE 353
+#define IDS_AINFO_LICENCE 354
+
+/* Names of categories */
+#define IDS_CAT_AUDIO 700
+#define IDS_CAT_DEVEL 701
+#define IDS_CAT_DRIVERS 702
+#define IDS_CAT_EDU 703
+#define IDS_CAT_ENGINEER 704
+#define IDS_CAT_FINANCE 705
+#define IDS_CAT_GAMES 706
+#define IDS_CAT_GRAPHICS 707
+#define IDS_CAT_INTERNET 708
+#define IDS_CAT_LIBS 709
+#define IDS_CAT_OFFICE 710
+#define IDS_CAT_OTHER 711
+#define IDS_CAT_SCIENCE 712
+#define IDS_CAT_TOOLS 713
+#define IDS_CAT_VIDEO 714
+
+/* Other */
+#ifndef IDC_STATIC
+#define IDC_STATIC -1
+#endif
+
+#endif /* _RESOURCE_H__ */
diff --git a/reactos/base/applications/rapps/richedit.c b/reactos/base/applications/rapps/richedit.c
new file mode 100644
index 00000000000..79a64d60752
--- /dev/null
+++ b/reactos/base/applications/rapps/richedit.c
@@ -0,0 +1,135 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/richedit.c
+ * PURPOSE: RichEdit functions
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+HWND hRichEdit;
+PWSTR pLink = NULL;
+
+
+VOID
+RichEditOnLink(HWND hwnd, ENLINK *Link)
+{
+ switch (Link->msg)
+ {
+ case WM_LBUTTONUP:
+ case WM_RBUTTONUP:
+ {
+ if (pLink) HeapFree(GetProcessHeap(), 0, pLink);
+
+ pLink = (PWSTR) HeapAlloc(GetProcessHeap(),
+ 0,
+ (max(Link->chrg.cpMin, Link->chrg.cpMax) -
+ min(Link->chrg.cpMin, Link->chrg.cpMax))*sizeof(WCHAR));
+ if (!pLink)
+ {
+ /* TODO: Error message */
+ return;
+ }
+
+ SendMessageW(hRichEdit, EM_SETSEL, Link->chrg.cpMin, Link->chrg.cpMax);
+ SendMessageW(hRichEdit, EM_GETSELTEXT, 0, (LPARAM)pLink);
+
+ ShowPopupMenu(hwnd, IDR_LINKMENU);
+ }
+ break;
+ }
+}
+
+static VOID
+SetRangeFormatting(LONG Start, LONG End, DWORD dwEffects)
+{
+ CHARFORMAT2 CharFormat;
+
+ SendMessageW(hRichEdit, EM_SETSEL, Start, End);
+
+ ZeroMemory(&CharFormat, sizeof(CHARFORMAT2));
+
+ CharFormat.cbSize = sizeof(CHARFORMAT2);
+ CharFormat.dwMask = dwEffects;
+ CharFormat.dwEffects = dwEffects;
+
+ SendMessageW(hRichEdit, EM_SETCHARFORMAT, SCF_WORD | SCF_SELECTION, (LPARAM)&CharFormat);
+
+ SendMessageW(hRichEdit, EM_SETSEL, End, End + 1);
+}
+
+static LONG
+GetRichEditTextLen(VOID)
+{
+ GETTEXTLENGTHEX TxtLenStruct;
+
+ TxtLenStruct.flags = GTL_NUMCHARS;
+ TxtLenStruct.codepage = 1200;
+
+ return (LONG) SendMessageW(hRichEdit, EM_GETTEXTLENGTHEX, (WPARAM)&TxtLenStruct, 0);
+}
+
+/*
+ * Insert text (without cleaning old text)
+ * Supported effects:
+ * - CFM_BOLD
+ * - CFM_ITALIC
+ * - CFM_UNDERLINE
+ * - CFM_LINK
+ */
+VOID
+InsertRichEditText(LPCWSTR lpszText, DWORD dwEffects)
+{
+ SETTEXTEX SetText;
+ LONG Len = GetRichEditTextLen();
+
+ /* Insert new text */
+ SetText.flags = ST_SELECTION;
+ SetText.codepage = 1200;
+
+ SendMessageW(hRichEdit, EM_SETTEXTEX, (WPARAM)&SetText, (LPARAM)lpszText);
+
+ SetRangeFormatting(Len, Len + wcslen(lpszText),
+ (dwEffects == CFM_LINK) ? (PathIsURLW(lpszText) ? dwEffects : 0) : dwEffects);
+}
+
+/*
+ * Clear old text and add new
+ */
+VOID
+NewRichEditText(LPCWSTR lpszText, DWORD dwEffects)
+{
+ SetWindowTextW(hRichEdit, L"");
+ InsertRichEditText(lpszText, dwEffects);
+}
+
+BOOL
+CreateRichEdit(HWND hwnd)
+{
+ LoadLibraryW(L"riched20.dll");
+
+ hRichEdit = CreateWindowExW(0,
+ L"RichEdit20W",
+ NULL,
+ WS_CHILD | WS_VISIBLE | ES_MULTILINE |
+ ES_LEFT | ES_READONLY,
+ 205, 28, 465, 100,
+ hwnd,
+ NULL,
+ hInst,
+ NULL);
+
+ if (!hRichEdit)
+ {
+ /* TODO: Show error message */
+ return FALSE;
+ }
+
+ SendMessageW(hRichEdit, EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_BTNFACE));
+ SendMessageW(hRichEdit, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
+ SendMessageW(hRichEdit, EM_SETEVENTMASK, 0, ENM_LINK | ENM_MOUSEEVENTS);
+ SendMessageW(hRichEdit, EM_SHOWSCROLLBAR, SB_VERT, TRUE);
+
+ return TRUE;
+}
diff --git a/reactos/dll/cpl/appwiz-new/rsrc.rc b/reactos/base/applications/rapps/rsrc.rc
similarity index 50%
rename from reactos/dll/cpl/appwiz-new/rsrc.rc
rename to reactos/base/applications/rapps/rsrc.rc
index 97c0701fb99..b15e51cb8fd 100644
--- a/reactos/dll/cpl/appwiz-new/rsrc.rc
+++ b/reactos/base/applications/rapps/rsrc.rc
@@ -1,15 +1,9 @@
-#include "resource.h"
-#include
-
#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/de-DE.rc"
+#include "lang/ja-JP.rc"
#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/zh-CN.rc"
diff --git a/reactos/base/applications/rapps/settingsdlg.c b/reactos/base/applications/rapps/settingsdlg.c
new file mode 100644
index 00000000000..8c7908f6ab8
--- /dev/null
+++ b/reactos/base/applications/rapps/settingsdlg.c
@@ -0,0 +1,47 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/settingsdlg.c
+ * PURPOSE: Settings Dialog
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+
+static
+INT_PTR CALLBACK
+SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (Msg)
+ {
+ case WM_INITDIALOG:
+ {
+
+ }
+ break;
+
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ case IDCANCEL:
+ EndDialog(hDlg, LOWORD(wParam));
+ break;
+ }
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+VOID
+CreateSettingsDlg(HWND hwnd)
+{
+ DialogBoxW(hInst,
+ MAKEINTRESOURCEW(IDD_SETTINGS_DIALOG),
+ hwnd,
+ SettingsDlgProc);
+}
diff --git a/reactos/base/applications/rapps/splitter.c b/reactos/base/applications/rapps/splitter.c
new file mode 100644
index 00000000000..b0126b3055c
--- /dev/null
+++ b/reactos/base/applications/rapps/splitter.c
@@ -0,0 +1,292 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/splitter.c
+ * PURPOSE: SplitterBar functions
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+HWND hVSplitter = NULL;
+HWND hHSplitter = NULL;
+
+static int HSplitterPos = 0;
+
+int
+GetHSplitterPos(VOID)
+{
+ return HSplitterPos;
+}
+
+VOID
+SetHSplitterPos(int Pos)
+{
+ HSplitterPos = Pos;
+}
+
+/* Callback for horizontal splitter bar */
+LRESULT CALLBACK
+HSplitterWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (Msg)
+ {
+ case WM_CREATE:
+ {
+ SetHSplitterPos(GetWindowHeight(hListView));
+ }
+ break;
+
+ case WM_LBUTTONDOWN:
+ {
+ SetCapture(hwnd);
+ }
+ break;
+
+ case WM_LBUTTONUP:
+ case WM_RBUTTONDOWN:
+ if (GetCapture() == hwnd)
+ {
+ ReleaseCapture();
+ }
+ break;
+
+ case WM_MOUSEMOVE:
+ if (GetCapture() == hwnd)
+ {
+ int Width = GetClientWindowWidth(hMainWnd) - GetWindowWidth(hTreeView) - SPLIT_WIDTH;
+ int NewPos;
+ HDWP hdwp;
+ POINT Point;
+
+ GetCursorPos(&Point);
+ ScreenToClient(hMainWnd, &Point);
+
+ NewPos = Point.y;
+
+ if ((GetClientWindowHeight(hMainWnd) - GetWindowHeight(hStatusBar) - SPLIT_WIDTH) < NewPos)
+ break;
+
+ if ((GetWindowHeight(hToolBar) + SPLIT_WIDTH) > NewPos)
+ break;
+
+ SetHSplitterPos(NewPos);
+
+ hdwp = BeginDeferWindowPos(3);
+
+ /* Size HSplitBar */
+ DeferWindowPos(hdwp,
+ hHSplitter,
+ 0,
+ GetWindowWidth(hTreeView) + SPLIT_WIDTH,
+ Point.y,
+ Width,
+ SPLIT_WIDTH,
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ /* Size ListView */
+ DeferWindowPos(hdwp,
+ hListView,
+ 0,
+ GetWindowWidth(hTreeView) + SPLIT_WIDTH,
+ GetWindowHeight(hToolBar),
+ Width,
+ Point.y - GetWindowHeight(hToolBar),
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ /* Size RichEdit */
+ DeferWindowPos(hdwp,
+ hRichEdit,
+ 0,
+ GetWindowWidth(hTreeView) + SPLIT_WIDTH,
+ Point.y + SPLIT_WIDTH,
+ Width,
+ GetClientWindowHeight(hMainWnd) - (Point.y + SPLIT_WIDTH + GetWindowHeight(hStatusBar)),
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ EndDeferWindowPos(hdwp);
+ }
+ break;
+ }
+
+ return DefWindowProc(hwnd, Msg, wParam, lParam);
+}
+
+/* Create horizontal splitter bar */
+BOOL
+CreateHSplitBar(HWND hwnd)
+{
+ WCHAR szWindowClass[] = L"HSplitterWindowClass";
+ WNDCLASSEXW WndClass = {0};
+
+ WndClass.cbSize = sizeof(WNDCLASSEXW);
+ WndClass.lpszClassName = szWindowClass;
+ WndClass.lpfnWndProc = HSplitterWindowProc;
+ WndClass.hInstance = hInst;
+ WndClass.style = CS_HREDRAW | CS_VREDRAW;
+ WndClass.hCursor = LoadCursor(0, IDC_SIZENS);
+ WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
+
+ if (RegisterClassExW(&WndClass) == (ATOM) 0)
+ {
+ /* TODO: Show error message */
+ return FALSE;
+ }
+
+ hHSplitter = CreateWindowExW(WS_EX_TRANSPARENT,
+ szWindowClass,
+ NULL,
+ WS_CHILD | WS_VISIBLE,
+ 205, 180, 465, SPLIT_WIDTH,
+ hwnd,
+ NULL,
+ hInst,
+ NULL);
+
+
+ if (hHSplitter == NULL)
+ {
+ /* TODO: Show error message */
+ return FALSE;
+ }
+
+ ShowWindow(hHSplitter, SW_SHOW);
+ UpdateWindow(hHSplitter);
+
+ return TRUE;
+}
+
+/* Callback for vertical splitter bar */
+LRESULT CALLBACK
+VSplitterWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (Msg)
+ {
+ case WM_LBUTTONDOWN:
+ SetCapture(hwnd);
+ break;
+
+ case WM_LBUTTONUP:
+ case WM_RBUTTONDOWN:
+ if (GetCapture() == hwnd)
+ {
+ ReleaseCapture();
+ }
+ break;
+
+ case WM_MOUSEMOVE:
+ if (GetCapture() == hwnd)
+ {
+ HDWP hdwp;
+ POINT Point;
+
+ GetCursorPos(&Point);
+ ScreenToClient(hMainWnd, &Point);
+
+ if ((GetClientWindowWidth(hMainWnd) - SPLIT_WIDTH) < Point.x)
+ break;
+
+ if (SPLIT_WIDTH > Point.x)
+ break;
+
+ hdwp = BeginDeferWindowPos(5);
+
+ /* Size VSplitBar */
+ DeferWindowPos(hdwp,
+ hwnd,
+ 0,
+ Point.x,
+ GetWindowHeight(hToolBar),
+ SPLIT_WIDTH,
+ GetClientWindowHeight(hMainWnd) - GetWindowHeight(hToolBar) - GetWindowHeight(hStatusBar),
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ /* Size TreeView */
+ DeferWindowPos(hdwp,
+ hTreeView,
+ 0,
+ 0,
+ GetWindowHeight(hToolBar),
+ Point.x,
+ GetClientWindowHeight(hMainWnd) - GetWindowHeight(hToolBar) - GetWindowHeight(hStatusBar),
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ /* Size ListView */
+ DeferWindowPos(hdwp,
+ hListView,
+ 0,
+ Point.x + SPLIT_WIDTH,
+ GetWindowHeight(hToolBar),
+ GetClientWindowWidth(hMainWnd) - (Point.x + SPLIT_WIDTH),
+ GetHSplitterPos() - GetWindowHeight(hToolBar),
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ DeferWindowPos(hdwp,
+ hRichEdit,
+ 0,
+ Point.x + SPLIT_WIDTH,
+ GetHSplitterPos() + SPLIT_WIDTH,
+ GetClientWindowWidth(hMainWnd) - (Point.x + SPLIT_WIDTH),
+ GetClientWindowHeight(hMainWnd) - (GetHSplitterPos() + SPLIT_WIDTH + GetWindowHeight(hStatusBar)),
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ DeferWindowPos(hdwp,
+ hHSplitter,
+ 0,
+ Point.x + SPLIT_WIDTH,
+ GetHSplitterPos(),
+ GetClientWindowWidth(hMainWnd) - (Point.x + SPLIT_WIDTH),
+ SPLIT_WIDTH,
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ EndDeferWindowPos(hdwp);
+ }
+ break;
+ }
+
+ return DefWindowProc(hwnd, Msg, wParam, lParam);
+}
+
+/* Create vertical splitter bar */
+BOOL
+CreateVSplitBar(HWND hwnd)
+{
+ WCHAR szWindowClass[] = L"VSplitterWindowClass";
+ WNDCLASSEXW WndClass = {0};
+
+ WndClass.cbSize = sizeof(WNDCLASSEXW);
+ WndClass.lpszClassName = szWindowClass;
+ WndClass.lpfnWndProc = VSplitterWindowProc;
+ WndClass.hInstance = hInst;
+ WndClass.style = CS_HREDRAW | CS_VREDRAW;
+ WndClass.hCursor = LoadCursor(0, IDC_SIZEWE);
+ WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
+
+ if (RegisterClassExW(&WndClass) == (ATOM) 0)
+ {
+ /* TODO: Show error message */
+ return FALSE;
+ }
+
+ hVSplitter = CreateWindowExW(WS_EX_TRANSPARENT,
+ szWindowClass,
+ NULL,
+ WS_CHILD | WS_VISIBLE,
+ 201, 28, SPLIT_WIDTH, 350,
+ hwnd,
+ NULL,
+ hInst,
+ NULL);
+
+
+ if (!hVSplitter)
+ {
+ /* TODO: Show error message */
+ return FALSE;
+ }
+
+ ShowWindow(hVSplitter, SW_SHOW);
+ UpdateWindow(hVSplitter);
+
+ return TRUE;
+}
diff --git a/reactos/base/applications/rapps/statusbar.c b/reactos/base/applications/rapps/statusbar.c
new file mode 100644
index 00000000000..238cd546378
--- /dev/null
+++ b/reactos/base/applications/rapps/statusbar.c
@@ -0,0 +1,42 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/statusbar.c
+ * PURPOSE: StatusBar functions
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+HWND hStatusBar;
+
+BOOL
+CreateStatusBar(HWND hwnd)
+{
+ hStatusBar = CreateWindowExW(0,
+ STATUSCLASSNAMEW,
+ NULL,
+ WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP,
+ 0, 0, 0, 0,
+ hwnd,
+ (HMENU)IDC_STATUSBAR,
+ hInst,
+ NULL);
+
+ if (!hStatusBar)
+ {
+ /* TODO: Show error message */
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+VOID
+SetStatusBarText(LPCWSTR lpszText)
+{
+ if (hStatusBar)
+ {
+ SendMessageW(hStatusBar, SB_SETTEXT, SBT_NOBORDERS, (LPARAM)lpszText);
+ }
+}
diff --git a/reactos/base/applications/rapps/toolbar.c b/reactos/base/applications/rapps/toolbar.c
new file mode 100644
index 00000000000..c6776c1fcc3
--- /dev/null
+++ b/reactos/base/applications/rapps/toolbar.c
@@ -0,0 +1,189 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/toolbar.c
+ * PURPOSE: ToolBar functions
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+#define TOOLBAR_HEIGHT 24
+
+HWND hToolBar;
+HWND hSearchBar;
+
+static WCHAR szInstallBtn[MAX_STR_LEN];
+static WCHAR szUninstallBtn[MAX_STR_LEN];
+static WCHAR szModifyBtn[MAX_STR_LEN];
+
+/* Toolbar buttons */
+static const TBBUTTON Buttons[] =
+{ /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */
+ { 0, ID_INSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, (int) szInstallBtn},
+ { 1, ID_UNINSTALL, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, (int) szUninstallBtn},
+ { 2, ID_MODIFY, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, (int) szModifyBtn},
+ { 5, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},
+ { 3, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, 0},
+ { 5, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},
+ { 4, ID_SETTINGS, TBSTATE_INDETERMINATE, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, 0},
+ { 5, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_AUTOSIZE, {0}, 0, 0}
+};
+
+
+VOID
+ToolBarOnGetDispInfo(LPTOOLTIPTEXT lpttt)
+{
+ UINT idButton = (UINT)lpttt->hdr.idFrom;
+
+ switch (idButton)
+ {
+ case ID_EXIT:
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_EXIT);
+ break;
+
+ case ID_INSTALL:
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_INSTALL);
+ break;
+
+ case ID_UNINSTALL:
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_UNINSTALL);
+ break;
+
+ case ID_MODIFY:
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_MODIFY);
+ break;
+
+ case ID_SETTINGS:
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_SETTINGS);
+ break;
+
+ case ID_REFRESH:
+ lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_REFRESH);
+ break;
+ }
+}
+
+VOID
+AddImageToImageList(HIMAGELIST hImageList, UINT ImageIndex)
+{
+ HANDLE hImage;
+
+ if (!(hImage = LoadImage(hInst,
+ MAKEINTRESOURCE(ImageIndex),
+ IMAGE_ICON,
+ TOOLBAR_HEIGHT,
+ TOOLBAR_HEIGHT,
+ 0)))
+ {
+ /* TODO: Error message */
+ }
+
+ ImageList_AddIcon(hImageList, hImage);
+ DeleteObject(hImage);
+}
+
+HIMAGELIST
+InitImageList(VOID)
+{
+ HIMAGELIST hImageList;
+
+ /* Create the toolbar icon image list */
+ hImageList = ImageList_Create(TOOLBAR_HEIGHT,//GetSystemMetrics(SM_CXSMICON),
+ TOOLBAR_HEIGHT,//GetSystemMetrics(SM_CYSMICON),
+ ILC_MASK | GetSystemColorDepth(),
+ 1,
+ 1);
+ if (!hImageList)
+ {
+ /* TODO: Error message */
+ return NULL;
+ }
+
+ AddImageToImageList(hImageList, IDI_INSTALL);
+ AddImageToImageList(hImageList, IDI_UNINSTALL);
+ AddImageToImageList(hImageList, IDI_MODIFY);
+ AddImageToImageList(hImageList, IDI_REFRESH);
+ AddImageToImageList(hImageList, IDI_SETTINGS);
+ AddImageToImageList(hImageList, IDI_EXIT);
+
+ return hImageList;
+}
+
+static
+BOOL
+CreateSearchBar(VOID)
+{
+ WCHAR szBuf[MAX_STR_LEN];
+
+ hSearchBar = CreateWindowExW(WS_EX_CLIENTEDGE,
+ L"Edit",
+ NULL,
+ WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOVSCROLL,
+ 0,
+ 5,
+ 200,
+ 22,
+ hToolBar,
+ (HMENU)0,
+ hInst,
+ 0);
+
+ SendMessageW(hSearchBar, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
+
+ LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR));
+ SetWindowTextW(hSearchBar, szBuf);
+
+ SetParent(hSearchBar, hToolBar);
+
+ return TRUE;
+}
+
+BOOL
+CreateToolBar(HWND hwnd)
+{
+ INT NumButtons = sizeof(Buttons) / sizeof(Buttons[0]);
+ HIMAGELIST hImageList;
+
+ LoadStringW(hInst, IDS_INSTALL, szInstallBtn, sizeof(szInstallBtn) / sizeof(WCHAR));
+ LoadStringW(hInst, IDS_UNINSTALL, szUninstallBtn, sizeof(szUninstallBtn) / sizeof(WCHAR));
+ LoadStringW(hInst, IDS_MODIFY, szModifyBtn, sizeof(szModifyBtn) / sizeof(WCHAR));
+
+ hToolBar = CreateWindowExW(0,
+ TOOLBARCLASSNAMEW,
+ NULL,
+ WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | TBSTYLE_LIST,
+ 0, 0, 0, 0,
+ hwnd,
+ 0,
+ hInst,
+ NULL);
+
+ if (!hToolBar)
+ {
+ /* TODO: Show error message */
+ return FALSE;
+ }
+
+ SendMessageW(hToolBar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS);
+ SendMessageW(hToolBar, TB_BUTTONSTRUCTSIZE, sizeof(Buttons[0]), 0);
+
+ hImageList = InitImageList();
+
+ if (!hImageList)
+ {
+ /* TODO: Show error message */
+ return FALSE;
+ }
+
+ ImageList_Destroy((HIMAGELIST)SendMessageW(hToolBar,
+ TB_SETIMAGELIST,
+ 0,
+ (LPARAM)hImageList));
+
+ SendMessageW(hToolBar, TB_ADDBUTTONS, NumButtons, (LPARAM)Buttons);
+
+ CreateSearchBar();
+
+ return TRUE;
+}
diff --git a/reactos/base/applications/rapps/treeview.c b/reactos/base/applications/rapps/treeview.c
new file mode 100644
index 00000000000..c8c4a104bf3
--- /dev/null
+++ b/reactos/base/applications/rapps/treeview.c
@@ -0,0 +1,54 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/treeview.c
+ * PURPOSE: TreeView functions
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+HWND hTreeView;
+
+
+HTREEITEM
+TreeViewAddItem(HTREEITEM hParent, LPWSTR lpText, INT Image, INT SelectedImage, LPARAM lParam)
+{
+ TV_INSERTSTRUCTW Insert;
+
+ ZeroMemory(&Insert, sizeof(TV_INSERTSTRUCT));
+
+ Insert.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
+ Insert.hInsertAfter = TVI_LAST;
+ Insert.hParent = hParent;
+ Insert.item.iSelectedImage = SelectedImage;
+ Insert.item.iImage = Image;
+ Insert.item.lParam = lParam;
+ Insert.item.pszText = lpText;
+
+ return TreeView_InsertItem(hTreeView, &Insert);
+}
+
+BOOL
+CreateTreeView(HWND hwnd)
+{
+ hTreeView = CreateWindowExW(WS_EX_CLIENTEDGE,
+ WC_TREEVIEWW,
+ L"",
+ WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_SHOWSELALWAYS,
+ 0, 28, 200, 350,
+ hwnd,
+ NULL,
+ hInst,
+ NULL);
+
+ if (!hListView)
+ {
+ /* TODO: Show error message */
+ return FALSE;
+ }
+
+ SetFocus(hTreeView);
+
+ return TRUE;
+}
diff --git a/reactos/base/applications/rapps/winmain.c b/reactos/base/applications/rapps/winmain.c
new file mode 100644
index 00000000000..f90411b81ed
--- /dev/null
+++ b/reactos/base/applications/rapps/winmain.c
@@ -0,0 +1,712 @@
+/*
+ * PROJECT: ReactOS Applications Manager
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/rapps/winmain.c
+ * PURPOSE: Main program
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ */
+
+#include "rapps.h"
+
+HWND hMainWnd;
+HINSTANCE hInst;
+HIMAGELIST hImageListView = NULL;
+HIMAGELIST hImageTreeView = NULL;
+INT SelectedEnumType = ENUM_ALL_COMPONENTS;
+
+
+VOID
+FreeInstalledAppList(VOID)
+{
+ INT Count = ListView_GetItemCount(hListView) - 1;
+ HKEY hKey;
+
+ while (Count >= 0)
+ {
+ hKey = ListViewGetlParam(Count);
+ if (hKey)
+ RegCloseKey(hKey);
+ Count--;
+ }
+}
+
+BOOL
+CALLBACK
+EnumInstalledAppProc(INT ItemIndex, LPWSTR lpName, LPWSTR lpKeyName, LPARAM lParam)
+{
+ WCHAR szText[MAX_PATH];
+ INT Index;
+
+ Index = ListViewAddItem(ItemIndex, 0, lpName, lParam);
+
+ /* Get version info */
+ GetApplicationString((HKEY)lParam, L"DisplayVersion", szText);
+ ListView_SetItemText(hListView, Index, 1, szText);
+ /* Get comments */
+ GetApplicationString((HKEY)lParam, L"Comments", szText);
+ ListView_SetItemText(hListView, Index, 2, szText);
+
+ return TRUE;
+}
+
+VOID
+FreeAvailableAppList(VOID)
+{
+ INT Count = ListView_GetItemCount(hListView) - 1;
+ PVOID Info;
+
+ while (Count >= 0)
+ {
+ Info = ListViewGetlParam(Count);
+ if (Info)
+ HeapFree(GetProcessHeap(), 0, Info);
+ Count--;
+ }
+}
+
+BOOL
+CALLBACK
+EnumAvailableAppProc(APPLICATION_INFO Info)
+{
+ PAPPLICATION_INFO ItemInfo;
+ INT Index;
+
+ if (!IsInstalledApplication(Info.szRegName, FALSE) &&
+ !IsInstalledApplication(Info.szRegName, TRUE))
+ {
+ ItemInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_INFO));
+ if (!ItemInfo) return FALSE;
+
+ *ItemInfo = Info;
+
+ Index = ListViewAddItem(Info.Category, 0, Info.szName, (LPARAM)ItemInfo);
+ ListView_SetItemText(hListView, Index, 1, Info.szVersion);
+ ListView_SetItemText(hListView, Index, 2, Info.szDesc);
+ }
+
+ return TRUE;
+}
+
+VOID
+UpdateApplicationsList(INT EnumType)
+{
+ WCHAR szBuffer1[MAX_STR_LEN], szBuffer2[MAX_STR_LEN];
+ HICON hIcon;
+
+ if (hImageListView) ImageList_Destroy(hImageListView);
+ (VOID) ListView_DeleteAllItems(hListView);
+
+ /* Create image list */
+ hImageListView = ImageList_Create(LISTVIEW_ICON_SIZE,
+ LISTVIEW_ICON_SIZE,
+ GetSystemColorDepth() | ILC_MASK,
+ 0, 1);
+
+ hIcon = LoadImage(hInst,
+ MAKEINTRESOURCE(IDI_MAIN),
+ IMAGE_ICON,
+ LISTVIEW_ICON_SIZE,
+ LISTVIEW_ICON_SIZE,
+ LR_CREATEDIBSECTION);
+
+ ImageList_AddIcon(hImageListView, hIcon);
+ DestroyIcon(hIcon);
+
+ if (EnumType == -1) EnumType = SelectedEnumType;
+
+ if (IS_INSTALLED_ENUM(SelectedEnumType))
+ FreeInstalledAppList();
+ else if (IS_AVAILABLE_ENUM(SelectedEnumType))
+ FreeAvailableAppList();
+
+ if (IS_INSTALLED_ENUM(EnumType))
+ {
+ /* Enum installed applications and updates */
+ EnumInstalledApplications(EnumType, TRUE, EnumInstalledAppProc);
+ EnumInstalledApplications(EnumType, FALSE, EnumInstalledAppProc);
+ }
+ else if (IS_AVAILABLE_ENUM(EnumType))
+ {
+ /* Enum availabled applications */
+ EnumAvailableApplications(EnumType, EnumAvailableAppProc);
+ }
+
+ /* Set image list for ListView */
+ (VOID) ListView_SetImageList(hListView, hImageListView, LVSIL_SMALL);
+
+ SelectedEnumType = EnumType;
+
+ LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, sizeof(szBuffer2) / sizeof(WCHAR));
+ swprintf(szBuffer1, szBuffer2, ListView_GetItemCount(hListView));
+ SetStatusBarText(szBuffer1);
+
+ SetWelcomeText();
+}
+
+VOID
+InitApplicationsList(VOID)
+{
+ WCHAR szText[MAX_STR_LEN];
+
+ /* Add columns to ListView */
+ LoadStringW(hInst, IDS_APP_NAME, szText, sizeof(szText) / sizeof(WCHAR));
+ ListViewAddColumn(0, szText, 200, LVCFMT_LEFT);
+
+ LoadStringW(hInst, IDS_APP_INST_VERSION, szText, sizeof(szText) / sizeof(WCHAR));
+ ListViewAddColumn(1, szText, 90, LVCFMT_RIGHT);
+
+ LoadStringW(hInst, IDS_APP_DESCRIPTION, szText, sizeof(szText) / sizeof(WCHAR));
+ ListViewAddColumn(3, szText, 250, LVCFMT_LEFT);
+
+ UpdateApplicationsList(ENUM_ALL_COMPONENTS);
+}
+
+HTREEITEM
+AddCategory(HTREEITEM hRootItem, UINT TextIndex, UINT IconIndex)
+{
+ WCHAR szText[MAX_STR_LEN];
+ INT Index;
+ HICON hIcon;
+
+ hIcon = LoadImage(hInst,
+ MAKEINTRESOURCE(IconIndex),
+ IMAGE_ICON,
+ TREEVIEW_ICON_SIZE,
+ TREEVIEW_ICON_SIZE,
+ LR_CREATEDIBSECTION);
+
+ Index = ImageList_AddIcon(hImageTreeView, hIcon);
+ DestroyIcon(hIcon);
+
+ LoadStringW(hInst, TextIndex, szText, sizeof(szText) / sizeof(TCHAR));
+
+ return TreeViewAddItem(hRootItem, szText, Index, Index, TextIndex);
+}
+
+VOID
+InitCategoriesList(VOID)
+{
+ HTREEITEM hRootItem1, hRootItem2;
+
+ /* Create image list */
+ hImageTreeView = ImageList_Create(TREEVIEW_ICON_SIZE,
+ TREEVIEW_ICON_SIZE,
+ GetSystemColorDepth() | ILC_MASK,
+ 0, 1);
+
+ hRootItem1 = AddCategory(TVI_ROOT, IDS_INSTALLED, IDI_CATEGORY);
+ AddCategory(hRootItem1, IDS_APPLICATIONS, IDI_APPS);
+ AddCategory(hRootItem1, IDS_UPDATES, IDI_APPUPD);
+
+ hRootItem2 = AddCategory(TVI_ROOT, IDS_AVAILABLEFORINST, IDI_CATEGORY);
+ AddCategory(hRootItem2, IDS_CAT_AUDIO, IDI_CAT_AUDIO);
+ AddCategory(hRootItem2, IDS_CAT_VIDEO, IDI_CAT_VIDEO);
+ AddCategory(hRootItem2, IDS_CAT_GRAPHICS, IDI_CAT_GRAPHICS);
+ AddCategory(hRootItem2, IDS_CAT_GAMES, IDI_CAT_GAMES);
+ AddCategory(hRootItem2, IDS_CAT_INTERNET, IDI_CAT_INTERNET);
+ AddCategory(hRootItem2, IDS_CAT_OFFICE, IDI_CAT_OFFICE);
+ AddCategory(hRootItem2, IDS_CAT_DEVEL, IDI_CAT_DEVEL);
+ AddCategory(hRootItem2, IDS_CAT_EDU, IDI_CAT_EDU);
+ AddCategory(hRootItem2, IDS_CAT_ENGINEER, IDI_CAT_ENGINEER);
+ AddCategory(hRootItem2, IDS_CAT_FINANCE, IDI_CAT_FINANCE);
+ AddCategory(hRootItem2, IDS_CAT_SCIENCE, IDI_CAT_SCIENCE);
+ AddCategory(hRootItem2, IDS_CAT_TOOLS, IDI_CAT_TOOLS);
+ AddCategory(hRootItem2, IDS_CAT_DRIVERS, IDI_CAT_DRIVERS);
+ AddCategory(hRootItem2, IDS_CAT_LIBS, IDI_CAT_LIBS);
+ AddCategory(hRootItem2, IDS_CAT_OTHER, IDI_CAT_OTHER);
+
+ (VOID) TreeView_SetImageList(hTreeView, hImageTreeView, TVSIL_NORMAL);
+
+ (VOID) TreeView_Expand(hTreeView, hRootItem2, TVE_EXPAND);
+ (VOID) TreeView_Expand(hTreeView, hRootItem1, TVE_EXPAND);
+
+ (VOID) TreeView_SelectItem(hTreeView, hRootItem1);
+}
+
+BOOL
+InitControls(HWND hwnd)
+{
+ if (CreateStatusBar(hwnd) &&
+ CreateToolBar(hwnd) &&
+ CreateListView(hwnd) &&
+ CreateTreeView(hwnd) &&
+ CreateRichEdit(hwnd) &&
+ CreateVSplitBar(hwnd) &&
+ CreateHSplitBar(hwnd))
+ {
+ WCHAR szBuffer1[MAX_STR_LEN], szBuffer2[MAX_STR_LEN];
+
+ InitApplicationsList();
+
+ InitCategoriesList();
+
+ LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, sizeof(szBuffer2) / sizeof(WCHAR));
+ swprintf(szBuffer1, szBuffer2, ListView_GetItemCount(hListView));
+ SetStatusBarText(szBuffer1);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+VOID
+MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
+{
+ WORD wCommand = LOWORD(wParam);
+
+ if (lParam == (LPARAM)hSearchBar)
+ {
+ WCHAR szBuf[MAX_STR_LEN];
+
+ switch (HIWORD(wParam))
+ {
+ case EN_SETFOCUS:
+ {
+ WCHAR szWndText[MAX_STR_LEN];
+
+ LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR));
+ GetWindowTextW(hSearchBar, szWndText, MAX_STR_LEN);
+ if (wcscmp(szBuf, szWndText) == 0) SetWindowTextW(hSearchBar, L"");
+ }
+ break;
+
+ case EN_KILLFOCUS:
+ {
+ GetWindowTextW(hSearchBar, szBuf, MAX_STR_LEN);
+ if (wcslen(szBuf) < 1)
+ {
+ LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR));
+ SetWindowTextW(hSearchBar, szBuf);
+ }
+ }
+ break;
+
+ case EN_CHANGE:
+ /* TODO: Implement search */
+ break;
+ }
+
+ return;
+ }
+
+ switch (wCommand)
+ {
+ case ID_OPEN_LINK:
+ ShellExecuteW(hwnd, L"open", pLink, NULL, NULL, SW_SHOWNOACTIVATE);
+ HeapFree(GetProcessHeap(), 0, pLink);
+ break;
+
+ case ID_COPY_LINK:
+ CopyTextToClipboard(pLink);
+ HeapFree(GetProcessHeap(), 0, pLink);
+ break;
+
+ case ID_SETTINGS:
+ CreateSettingsDlg(hwnd);
+ break;
+
+ case ID_EXIT:
+ PostMessageW(hwnd, WM_CLOSE, 0, 0);
+ break;
+
+ case ID_INSTALL:
+ if (DownloadApplication(-1))
+ /* TODO: Implement install dialog
+ * if (InstallApplication(-1))
+ */
+ UpdateApplicationsList(-1);
+ break;
+
+ case ID_UNINSTALL:
+ if (UninstallApplication(-1, FALSE))
+ UpdateApplicationsList(-1);
+ break;
+
+ case ID_MODIFY:
+ if (UninstallApplication(-1, TRUE))
+ UpdateApplicationsList(-1);
+ break;
+
+ case ID_REFRESH:
+ UpdateApplicationsList(-1);
+ break;
+
+ case ID_HELP:
+ MessageBoxW(hwnd, L"Help not implemented yet", NULL, MB_OK);
+ break;
+
+ case ID_ABOUT:
+ ShowAboutDialog();
+ break;
+ }
+}
+
+VOID
+MainWndOnSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
+{
+ HDWP hdwp = BeginDeferWindowPos(5);
+ INT SearchBarWidth = GetWindowWidth(hSearchBar);
+ INT RichPos = GetWindowHeight(hRichEdit);
+ INT NewPos = GetClientWindowHeight(hMainWnd) - (RichPos + SPLIT_WIDTH + GetWindowHeight(hStatusBar));
+ INT VSplitterPos;
+
+ /* Size status bar */
+ SendMessage(hStatusBar, WM_SIZE, 0, 0);
+
+ /* Size tool bar */
+ SendMessage(hToolBar, TB_AUTOSIZE, 0, 0);
+
+ /* Size SearchBar */
+ MoveWindow(hSearchBar, LOWORD(lParam) - SearchBarWidth - 4, 5, SearchBarWidth, 22, TRUE);
+
+ /*
+ * HIWORD(lParam) - Height of main window
+ * LOWORD(lParam) - Width of main window
+ */
+
+ /* Size vertical splitter bar */
+ DeferWindowPos(hdwp,
+ hVSplitter,
+ 0,
+ (VSplitterPos = GetWindowWidth(hTreeView)),
+ GetWindowHeight(hToolBar),
+ SPLIT_WIDTH,
+ HIWORD(lParam) - GetWindowHeight(hToolBar) - GetWindowHeight(hStatusBar),
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ /* Size TreeView */
+ DeferWindowPos(hdwp,
+ hTreeView,
+ 0,
+ 0,
+ GetWindowHeight(hToolBar),
+ VSplitterPos,
+ HIWORD(lParam) - GetWindowHeight(hToolBar) - GetWindowHeight(hStatusBar),
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ while (NewPos < SPLIT_WIDTH + GetWindowHeight(hToolBar))
+ {
+ RichPos--;
+ NewPos = GetClientWindowHeight(hMainWnd) - (RichPos +
+ SPLIT_WIDTH + GetWindowHeight(hStatusBar));
+ }
+ SetHSplitterPos(NewPos);
+
+ /* Size ListView */
+ DeferWindowPos(hdwp,
+ hListView,
+ 0,
+ VSplitterPos + SPLIT_WIDTH,
+ GetWindowHeight(hToolBar),
+ LOWORD(lParam) - (VSplitterPos + SPLIT_WIDTH),
+ GetHSplitterPos() - GetWindowHeight(hToolBar),
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ /* Size RichEdit */
+ DeferWindowPos(hdwp,
+ hRichEdit,
+ 0,
+ VSplitterPos + SPLIT_WIDTH,
+ GetHSplitterPos() + SPLIT_WIDTH,
+ GetClientWindowWidth(hMainWnd) - (VSplitterPos + SPLIT_WIDTH),
+ RichPos,
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ /* Size horizontal splitter bar */
+ DeferWindowPos(hdwp,
+ hHSplitter,
+ 0,
+ VSplitterPos + SPLIT_WIDTH,
+ GetHSplitterPos(),
+ GetClientWindowWidth(hMainWnd) - (VSplitterPos + SPLIT_WIDTH),
+ SPLIT_WIDTH,
+ SWP_NOZORDER|SWP_NOACTIVATE);
+
+ EndDeferWindowPos(hdwp);
+}
+
+LRESULT CALLBACK
+MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (Msg)
+ {
+ case WM_CREATE:
+ if (!InitControls(hwnd))
+ PostMessage(hwnd, WM_CLOSE, 0, 0);
+ break;
+
+ case WM_COMMAND:
+ MainWndOnCommand(hwnd, wParam, lParam);
+ break;
+
+ case WM_NOTIFY:
+ {
+ LPNMHDR data = (LPNMHDR)lParam;
+
+ switch (data->code)
+ {
+ case TVN_SELCHANGED:
+ {
+ if (data->hwndFrom == hTreeView)
+ {
+ switch (((LPNMTREEVIEW)lParam)->itemNew.lParam)
+ {
+ case IDS_INSTALLED:
+ UpdateApplicationsList(ENUM_ALL_COMPONENTS);
+ break;
+
+ case IDS_APPLICATIONS:
+ UpdateApplicationsList(ENUM_APPLICATIONS);
+ break;
+
+ case IDS_UPDATES:
+ UpdateApplicationsList(ENUM_UPDATES);
+ break;
+
+ case IDS_AVAILABLEFORINST:
+ UpdateApplicationsList(ENUM_ALL_AVAILABLE);
+ break;
+
+ case IDS_CAT_AUDIO:
+ UpdateApplicationsList(ENUM_CAT_AUDIO);
+ break;
+
+ case IDS_CAT_DEVEL:
+ UpdateApplicationsList(ENUM_CAT_DEVEL);
+ break;
+
+ case IDS_CAT_DRIVERS:
+ UpdateApplicationsList(ENUM_CAT_DRIVERS);
+ break;
+
+ case IDS_CAT_EDU:
+ UpdateApplicationsList(ENUM_CAT_EDU);
+ break;
+
+ case IDS_CAT_ENGINEER:
+ UpdateApplicationsList(ENUM_CAT_ENGINEER);
+ break;
+
+ case IDS_CAT_FINANCE:
+ UpdateApplicationsList(ENUM_CAT_FINANCE);
+ break;
+
+ case IDS_CAT_GAMES:
+ UpdateApplicationsList(ENUM_CAT_GAMES);
+ break;
+
+ case IDS_CAT_GRAPHICS:
+ UpdateApplicationsList(ENUM_CAT_GRAPHICS);
+ break;
+
+ case IDS_CAT_INTERNET:
+ UpdateApplicationsList(ENUM_CAT_INTERNET);
+ break;
+
+ case IDS_CAT_LIBS:
+ UpdateApplicationsList(ENUM_CAT_LIBS);
+ break;
+
+ case IDS_CAT_OFFICE:
+ UpdateApplicationsList(ENUM_CAT_OFFICE);
+ break;
+
+ case IDS_CAT_OTHER:
+ UpdateApplicationsList(ENUM_CAT_OTHER);
+ break;
+
+ case IDS_CAT_SCIENCE:
+ UpdateApplicationsList(ENUM_CAT_SCIENCE);
+ break;
+
+ case IDS_CAT_TOOLS:
+ UpdateApplicationsList(ENUM_CAT_TOOLS);
+ break;
+
+ case IDS_CAT_VIDEO:
+ UpdateApplicationsList(ENUM_CAT_VIDEO);
+ break;
+ }
+ }
+ }
+ break;
+
+ case LVN_KEYDOWN:
+ {
+ LPNMLVKEYDOWN pnkd = (LPNMLVKEYDOWN) lParam;
+
+ if (pnkd->hdr.hwndFrom == hListView)
+ {
+ INT ItemIndex = (INT) SendMessage(hListView, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+
+ if (pnkd->wVKey == VK_UP) ItemIndex -= 1;
+ if (pnkd->wVKey == VK_DOWN) ItemIndex += 1;
+
+ if (IS_INSTALLED_ENUM(SelectedEnumType))
+ ShowInstalledAppInfo(ItemIndex);
+ if (IS_AVAILABLE_ENUM(SelectedEnumType))
+ ShowAvailableAppInfo(ItemIndex);
+ }
+ }
+ break;
+
+ case LVN_COLUMNCLICK:
+ {
+ LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
+
+ (VOID) ListView_SortItems(hListView, ListViewCompareFunc, pnmv->iSubItem);
+ bAscending = !bAscending;
+ }
+ break;
+
+ case NM_CLICK:
+ if (data->hwndFrom == hListView)
+ {
+ if (IS_INSTALLED_ENUM(SelectedEnumType))
+ ShowInstalledAppInfo(-1);
+ if (IS_AVAILABLE_ENUM(SelectedEnumType))
+ ShowAvailableAppInfo(-1);
+ }
+ break;
+
+ case NM_RCLICK:
+ if (data->hwndFrom == hListView)
+ ShowPopupMenu(hListView, IDR_APPLICATIONMENU);
+ break;
+
+ case EN_LINK:
+ RichEditOnLink(hwnd, (ENLINK*)lParam);
+ break;
+
+ case TTN_GETDISPINFO:
+ ToolBarOnGetDispInfo((LPTOOLTIPTEXT)lParam);
+ break;
+ }
+ }
+ break;
+
+ case WM_PAINT:
+ break;
+
+ case WM_SIZE:
+ {
+ if ((GetClientWindowHeight(hMainWnd) - GetWindowHeight(hStatusBar) - SPLIT_WIDTH) < GetHSplitterPos())
+ {
+ INT NewSplitPos = GetClientWindowHeight(hwnd) - 100 - GetWindowHeight(hStatusBar) - SPLIT_WIDTH;
+ if (NewSplitPos > GetWindowHeight(hToolBar) + SPLIT_WIDTH)
+ SetHSplitterPos(NewSplitPos);
+ }
+
+ MainWndOnSize(hwnd, wParam, lParam);
+ }
+ break;
+
+ case WM_SIZING:
+ {
+ int RichEditHeight = GetWindowHeight(hRichEdit);
+ LPRECT pRect = (LPRECT)lParam;
+
+ while (RichEditHeight <= 100)
+ {
+ if (GetHSplitterPos() - 1 < GetWindowHeight(hToolBar) + GetWindowHeight(hListView) + SPLIT_WIDTH)
+ break;
+ SetHSplitterPos(GetHSplitterPos() - 1);
+ RichEditHeight++;
+ }
+
+ if (pRect->right-pRect->left < 565)
+ pRect->right = pRect->left + 565;
+
+ if (pRect->bottom-pRect->top < 300)
+ pRect->bottom = pRect->top + 300;
+ return TRUE;
+ }
+
+ case WM_DESTROY:
+ {
+ if (IS_AVAILABLE_ENUM(SelectedEnumType))
+ FreeAvailableAppList();
+ if (IS_INSTALLED_ENUM(SelectedEnumType))
+ FreeInstalledAppList();
+ if (hImageListView) ImageList_Destroy(hImageListView);
+ if (hImageTreeView) ImageList_Destroy(hImageTreeView);
+ PostQuitMessage(0);
+ return 0;
+ }
+ break;
+ }
+
+ return DefWindowProc(hwnd, Msg, wParam, lParam);
+}
+
+int WINAPI
+wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
+{
+ WNDCLASSEXW WndClass = {0};
+ WCHAR szWindowClass[] = L"ROSAPPMGR";
+ WCHAR szWindowName[MAX_STR_LEN];
+ HANDLE hMutex = NULL;
+ MSG Msg;
+
+ hMutex = CreateMutexW(NULL, FALSE, szWindowClass);
+ if ((!hMutex) || (GetLastError() == ERROR_ALREADY_EXISTS))
+ {
+ /* If already started, it is found its window */
+ HWND hWindow = FindWindowW(szWindowClass, NULL);
+
+ /* Activate window */
+ ShowWindow(hWindow, SW_SHOWNORMAL);
+ SetForegroundWindow(hWindow);
+ return 1;
+ }
+
+ hInst = hInstance;
+
+ InitCommonControls();
+
+ /* Create the window */
+ WndClass.cbSize = sizeof(WNDCLASSEXW);
+ WndClass.lpszClassName = szWindowClass;
+ WndClass.lpfnWndProc = MainWindowProc;
+ WndClass.hInstance = hInstance;
+ WndClass.style = CS_HREDRAW | CS_VREDRAW;
+ WndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
+ WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
+ WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
+ WndClass.lpszMenuName = MAKEINTRESOURCEW(IDR_MAINMENU);
+
+ if (RegisterClassExW(&WndClass) == (ATOM)0) goto Exit;
+
+ LoadStringW(hInst, IDS_APPTITLE, szWindowName, sizeof(szWindowName) / sizeof(WCHAR));
+
+ hMainWnd = CreateWindowExW(WS_EX_WINDOWEDGE,
+ szWindowClass,
+ szWindowName,
+ WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ 680,
+ 450,
+ NULL,
+ NULL,
+ hInstance,
+ NULL);
+
+ if (!hMainWnd) goto Exit;
+
+ /* Show it */
+ ShowWindow(hMainWnd, SW_SHOW);
+ UpdateWindow(hMainWnd);
+
+ /* Message Loop */
+ while (GetMessage(&Msg, NULL, 0, 0))
+ {
+ TranslateMessage(&Msg);
+ DispatchMessage(&Msg);
+ }
+
+Exit:
+ if (hMutex) CloseHandle(hMutex);
+
+ return 0;
+}
diff --git a/reactos/base/applications/regedit/security.c b/reactos/base/applications/regedit/security.c
index f39a74159e4..ce666c89801 100644
--- a/reactos/base/applications/regedit/security.c
+++ b/reactos/base/applications/regedit/security.c
@@ -30,7 +30,11 @@ DEFINE_GUID(IID_IRegKeySecurity2, 0xc3ccfdb4, 0x6f88, 0x11d2, 0x00a3, 0xce,0x00,
#endif
/* FIXME: already defined in aclui.h - causing problems when compiling with MSVC/PSDK*/
-#ifndef _MSC_VER
+#ifdef _MSC_VER
+#pragma message ("INVESTIGATE ME")
+#endif
+
+#if 1 //#ifndef _MSC_VER
DEFINE_GUID(IID_IEffectivePermission, 0x3853dc76, 0x9f35, 0x407c, 0x0088, 0xa1,0xd1,0x93,0x44,0x36,0x5f,0xbc);
DEFINE_GUID(IID_ISecurityObjectTypeInfo, 0xfc3066eb, 0x79ef, 0x444b, 0x0091, 0x11,0xd1,0x8a,0x75,0xeb,0xf2,0xfa);
#endif
diff --git a/reactos/base/applications/taskmgr/lang/bg-BG.rc b/reactos/base/applications/taskmgr/lang/bg-BG.rc
index 0b2dc424d83..f6ade0bb5bf 100644
--- a/reactos/base/applications/taskmgr/lang/bg-BG.rc
+++ b/reactos/base/applications/taskmgr/lang/bg-BG.rc
@@ -110,7 +110,7 @@ BEGIN
MENUITEM "&", ID_WINDOWS_CASCADE
MENUITEM SEPARATOR
MENUITEM "& ", ID_APPLICATION_PAGE_ENDTASK
- MENUITEM "& ", ID_APPLICATION_PAGE_GOTOPROCESS
+ MENUITEM "& ", ID_APPLICATION_PAGE_GOTOPROCESS
END
END
@@ -200,7 +200,7 @@ 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 " ",IDC_CPU_USAGE_FRAME,5,5,60,54,0,WS_EX_TRANSPARENT
+ GROUPBOX " ",IDC_CPU_USAGE_FRAME,5,5,60,54,0,WS_EX_TRANSPARENT
GROUPBOX " ",IDC_MEM_USAGE_FRAME,5,63,60,54,BS_LEFTTEXT, WS_EX_TRANSPARENT
GROUPBOX "",IDC_TOTALS_FRAME,5,122,111,39,0,WS_EX_TRANSPARENT
GROUPBOX " (K)",IDC_COMMIT_CHARGE_FRAME,5,166,111,39,0,WS_EX_TRANSPARENT
@@ -225,8 +225,8 @@ BEGIN
EDITTEXT IDC_COMMIT_CHARGE_PEAK,65,193,45,8,ES_RIGHT |
ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
LTEXT "",IDS_PHYSICAL_MEMORY_TOTAL,137,131,27,8
- LTEXT "",IDS_PHYSICAL_MEMORY_AVAILABLE,137,140,30,8
- LTEXT " ",IDS_PHYSICAL_MEMORY_SYSTEM_CACHE,137,149,55,8
+ LTEXT "",IDS_PHYSICAL_MEMORY_AVAILABLE,137,140,60,8
+ LTEXT " ",IDS_PHYSICAL_MEMORY_SYSTEM_CACHE,137,149,60,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 |
@@ -267,12 +267,12 @@ END
IDD_AFFINITY_DIALOG DIALOGEX DISCARDABLE 0, 0, 231, 154
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION " "
+CAPTION " "
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "",IDOK,120,133,50,14
PUSHBUTTON "",IDCANCEL,174,133,50,14
- LTEXT "The Processor Affinity setting controls which CPUs the process will be allowed to execute on.",
+ LTEXT " .",
IDC_STATIC,5,5,220,16
CONTROL " 0",IDC_CPU0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
11,28,37,10
@@ -363,7 +363,7 @@ BEGIN
BS_AUTOCHECKBOX | WS_TABSTOP,7,83,115,10
CONTROL " ",IDC_PEAKMEMORYUSAGE,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,7,94,115,10
- CONTROL "Page &Faults",IDC_PAGEFAULTS,"Button",BS_AUTOCHECKBOX |
+ CONTROL " &",IDC_PAGEFAULTS,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,105,115,10
CONTROL "&USER Objects",IDC_USEROBJECTS,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,116,115,10
@@ -375,7 +375,7 @@ BEGIN
WS_TABSTOP,7,149,115,10
CONTROL " &",IDC_USERNAME,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,160,115,10
- CONTROL "Page F&aults Delta",IDC_PAGEFAULTSDELTA,"Button",
+ CONTROL " &- ",IDC_PAGEFAULTSDELTA,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,125,28,115,10
CONTROL "& ",IDC_VIRTUALMEMORYSIZE,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,125,39,115,10
@@ -387,7 +387,7 @@ BEGIN
BS_AUTOCHECKBOX | WS_TABSTOP,125,72,115,10
CONTROL "& ",IDC_HANDLECOUNT,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,125,83,115,10
- CONTROL "&Thread Count",IDC_THREADCOUNT,"Button",BS_AUTOCHECKBOX |
+ CONTROL " &",IDC_THREADCOUNT,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,125,94,115,10
CONTROL "GDI Objects",IDC_GDIOBJECTS,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,125,105,115,10
@@ -557,12 +557,12 @@ BEGIN
ID_HELP_ABOUT " , ."
ID_FILE_EXIT " "
ID_OPTIONS_SHOW16BITTASKS
- "Shows 16-bit tasks under the associated ntvdm.exe"
+ " 16- ntvdm.exe"
ID_VIEW_SELECTCOLUMNS " "
ID_VIEW_SHOWKERNELTIMES " "
ID_VIEW_CPUHISTORY_ONEGRAPHALL
- "A single history graph shows total CPU usage"
- ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "Each CPU has its own history graph"
+ " "
+ ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU " "
ID_APPLICATION_PAGE_SWITCHTO
" "
END
@@ -575,11 +575,11 @@ BEGIN
ID_PROCESS_PAGE_ENDPROCESS " "
ID_PROCESS_PAGE_ENDPROCESSTREE
" "
- ID_PROCESS_PAGE_DEBUG " "
+ ID_PROCESS_PAGE_DEBUG " "
ID_PROCESS_PAGE_SETAFFINITY
- "Controls which processors the process will be allowed to run on"
+ " "
ID_PROCESS_PAGE_SETPRIORITY_REALTIME
- " "
+ " "
ID_PROCESS_PAGE_SETPRIORITY_HIGH " "
ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL
" "
@@ -604,19 +604,19 @@ BEGIN
IDS_TAB_SESSIONID "Session ID"
IDS_TAB_CPU ""
IDS_TAB_CPUTIME " "
- IDS_TAB_MEMUSAGE " "
+ IDS_TAB_MEMUSAGE " "
IDS_TAB_PEAKMEMUSAGE " "
- IDS_TAB_MEMDELTA "Mem Delta"
- IDS_TAB_PAGEFAULT "Page Faults"
- IDS_TAB_PFDELTA "PF Delta"
- IDS_TAB_VMSIZE "VM Size"
+ IDS_TAB_MEMDELTA " "
+ IDS_TAB_PAGEFAULT " "
+ IDS_TAB_PFDELTA " PF"
+ IDS_TAB_VMSIZE " "
IDS_TAB_PAGEDPOOL "Paged Pool"
IDS_TAB_NPPOOL "NP Pool"
IDS_TAB_BASEPRI "Base Pri"
IDS_TAB_HANDLES ""
IDS_TAB_THREADS ""
- IDS_TAB_USERPBJECTS "USER Objects"
- IDS_TAB_GDIOBJECTS "GDI Objects"
+ IDS_TAB_USERPBJECTS " "
+ IDS_TAB_GDIOBJECTS " GDI"
IDS_TAB_IOREADS "/ "
IDS_TAB_IOWRITES "/ "
IDS_TAB_IOOTHER "/ "
@@ -635,11 +635,11 @@ BEGIN
IDS_MENU_SHOWKERNELTIMES "& "
IDS_CREATENEWTASK " "
IDS_CREATENEWTASK_DESC "Type the name of a program, folder, document, or Internet resource, and Task Manager will open it for you."
- IDS_MSG_ACCESSPROCESSAFF "Unable to Access or Set Process Affinity"
- IDS_MSG_PROCESSONEPRO "The process must have affinity with at least one processor."
+ IDS_MSG_ACCESSPROCESSAFF " ."
+ IDS_MSG_PROCESSONEPRO " ."
IDS_MSG_INVALIDOPTION " "
IDS_MSG_UNABLEDEBUGPROCESS " "
- IDS_MSG_WARNINGDEBUG "WARNING: Debugging this process may result in loss of data.\nAre you sure you wish to attach the debugger?"
+ IDS_MSG_WARNINGDEBUG ": .\n , ?"
IDS_MSG_TASKMGRWARNING " "
IDS_MSG_WARNINGTERMINATING ": \n, .\n \n , . , \n ?"
IDS_MSG_UNABLETERMINATEPRO " "
diff --git a/reactos/base/applications/winhlp32/De.rc b/reactos/base/applications/winhlp32/De.rc
index fa59b42ce96..0ec40add40f 100644
--- a/reactos/base/applications/winhlp32/De.rc
+++ b/reactos/base/applications/winhlp32/De.rc
@@ -97,13 +97,13 @@ STID_INFO, "Information"
STID_NOT_IMPLEMENTED, "Nicht implementiert"
STID_HLPFILE_ERROR_s, "Fehler beim Lesen der Hilfe-Datei `%s'"
STID_INDEX, "&Inhalt"
-STID_CONTENTS, "Summary"
+STID_CONTENTS, "Zusammenfassung"
STID_BACK, "&Zurück"
STID_ALL_FILES, "Alle Dateien (*.*)"
STID_HELP_FILES_HLP, "Hilfe-Dateien (*.hlp)"
STID_FILE_NOT_FOUND_s "'%s' konnte nicht gefunden werden. Wollen Sie selber nach dieser Datei suchen?"
STID_NO_RICHEDIT "Die Richedit Implementation konnte nicht gefunden werden... Breche ab."
-STID_PSH_INDEX, "Help topics: "
+STID_PSH_INDEX, "Hilfethemen: "
}
CONTEXT_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
@@ -128,3 +128,4 @@ END
MENUITEM "Systemfarben verwenden", MNID_CTXT_SYSTEM_COLORS
END
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/Fr.rc b/reactos/base/applications/winhlp32/Fr.rc
index cedb0f694b7..2199e37ab9e 100644
--- a/reactos/base/applications/winhlp32/Fr.rc
+++ b/reactos/base/applications/winhlp32/Fr.rc
@@ -131,3 +131,4 @@ BEGIN
MENUITEM "Utiliser les couleurs système", MNID_CTXT_SYSTEM_COLORS
END
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/It.rc b/reactos/base/applications/winhlp32/It.rc
index 5d1abb8c92c..d7618d11916 100644
--- a/reactos/base/applications/winhlp32/It.rc
+++ b/reactos/base/applications/winhlp32/It.rc
@@ -21,6 +21,8 @@
#include "winhelp_res.h"
+#pragma code_page(65001)
+
/* Menu */
MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
@@ -87,3 +89,4 @@ STID_FILE_NOT_FOUND_s "Non è stato possibile trovare '%s'. Vuoi cercare questo
STID_NO_RICHEDIT "Non è stato possibile trovare un'implementazione richedit... Annullando"
STID_PSH_INDEX, "Argomenti di aiuto: "
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/Ja.rc b/reactos/base/applications/winhlp32/Ja.rc
index b73d18dd192..a06b5f1df65 100644
--- a/reactos/base/applications/winhlp32/Ja.rc
+++ b/reactos/base/applications/winhlp32/Ja.rc
@@ -128,3 +128,4 @@ BEGIN
MENUITEM "システム カラーを使う", MNID_CTXT_SYSTEM_COLORS
END
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/Lt.rc b/reactos/base/applications/winhlp32/Lt.rc
index f8e78681aae..5ee53f8aa16 100644
--- a/reactos/base/applications/winhlp32/Lt.rc
+++ b/reactos/base/applications/winhlp32/Lt.rc
@@ -129,3 +129,4 @@ BEGIN
MENUITEM "Naudoti sistemos spalvas", MNID_CTXT_SYSTEM_COLORS
END
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/Nl.rc b/reactos/base/applications/winhlp32/Nl.rc
index 029d58265b9..a7938406b65 100644
--- a/reactos/base/applications/winhlp32/Nl.rc
+++ b/reactos/base/applications/winhlp32/Nl.rc
@@ -127,3 +127,4 @@ BEGIN
MENUITEM "Gebruik systeem kleuren", MNID_CTXT_SYSTEM_COLORS
END
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/Pt.rc b/reactos/base/applications/winhlp32/Pt.rc
index 9a12e58f096..5598bd77cd6 100644
--- a/reactos/base/applications/winhlp32/Pt.rc
+++ b/reactos/base/applications/winhlp32/Pt.rc
@@ -6,7 +6,8 @@
* Portuguese translation by Gustavo Junior Alves
* Copyright 2002 Sylvain Petreolle
* Copyright 2003 Marcelo Duarte
- * Copyright 2004,2007 Amrico Jos Melo
+ * Copyright 2004,2007 Américo José Melo
+ * Copyright 2009 Ricardo Filipe
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,6 +26,8 @@
#include "winhelp_res.h"
+#pragma code_page(65001)
+
/* Menu */
LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
@@ -65,9 +68,9 @@ MAIN_MENU MENU
}
POPUP "Aj&uda" {
MENUITEM "Ajuda &na ajuda", MNID_HELP_HELPON
- MENUITEM "Sempre &visvel", MNID_HELP_HELPTOP
+ MENUITEM "Sempre &visível", MNID_HELP_HELPTOP
MENUITEM SEPARATOR
- MENUITEM "&Informaes...", MNID_HELP_ABOUT
+ MENUITEM "&Informações...", MNID_HELP_ABOUT
#ifdef WINELIB
MENUITEM "&Sobre WINE", MNID_HELP_WINE
#endif
@@ -94,33 +97,49 @@ MAIN_MENU MENU
POPUP "In&dicador" {
MENUITEM "&Definir...", MNID_BKMK_DEFINE
}
- POPUP "&Options" {
- POPUP "Help always visible"
+ POPUP "&Opções" {
+ POPUP "Ajuda sempre visível"
BEGIN
- MENUITEM "Default", MNID_OPTS_HELP_DEFAULT
- MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE
- MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE
+ MENUITEM "Omissão", MNID_OPTS_HELP_DEFAULT
+ MENUITEM "Visível", MNID_OPTS_HELP_VISIBLE
+ MENUITEM "Invisível", MNID_OPTS_HELP_NONVISIBLE
END
- MENUITEM "History", MNID_OPTS_HISTORY
- POPUP "Fonts"
+ MENUITEM "Histórico", MNID_OPTS_HISTORY
+ POPUP "Tipos de Letra"
BEGIN
- MENUITEM "Small", MNID_OPTS_FONTS_SMALL
+ MENUITEM "Pequeno", MNID_OPTS_FONTS_SMALL
MENUITEM "Normal", MNID_OPTS_FONTS_NORMAL
- MENUITEM "Large", MNID_OPTS_FONTS_LARGE
+ MENUITEM "Grande", MNID_OPTS_FONTS_LARGE
END
- MENUITEM "Use system colors", MNID_OPTS_SYSTEM_COLORS
+ MENUITEM "Usar cores do sistema", MNID_OPTS_SYSTEM_COLORS
}
POPUP "Aj&uda" {
MENUITEM "Ajuda &na ajuda", MNID_HELP_HELPON
- MENUITEM "Sempre &visvel", MNID_HELP_HELPTOP
+ MENUITEM "Sempre &visível", MNID_HELP_HELPTOP
MENUITEM SEPARATOR
- MENUITEM "&Informaes...", MNID_HELP_ABOUT
+ MENUITEM "&Informações...", MNID_HELP_ABOUT
#ifdef WINELIB
MENUITEM "&Acerca do WINE", MNID_HELP_WINE
#endif
}
}
+IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION "Índice"
+{
+ LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
+}
+
+IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION "Procura"
+{
+ LTEXT "Ainda não implementado", -1, 10, 10, 180, 150
+}
+
/* Strings */
LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
@@ -130,10 +149,10 @@ STRINGTABLE DISCARDABLE
STID_WINE_HELP, "Ajuda WINE"
STID_WHERROR, "ERRO"
STID_WARNING, "AVISO"
-STID_INFO, "Informao"
-STID_NOT_IMPLEMENTED, "No implementado"
+STID_INFO, "Informação"
+STID_NOT_IMPLEMENTED, "Não implementado"
STID_HLPFILE_ERROR_s, "Erro encontrado na leitura do arquivo de ajuda '%s'"
-STID_INDEX, "&Contedo"
+STID_INDEX, "&Conteúdo"
STID_CONTENTS, "Summary"
STID_BACK, "&Voltar"
STID_ALL_FILES, "Todos os arquivos (*.*)"
@@ -150,15 +169,39 @@ STRINGTABLE DISCARDABLE
STID_WINE_HELP, "Ajuda WINE"
STID_WHERROR, "ERRO"
STID_WARNING, "AVISO"
-STID_INFO, "Informao"
-STID_NOT_IMPLEMENTED, "No implementado"
+STID_INFO, "Informação"
+STID_NOT_IMPLEMENTED, "Não implementado"
STID_HLPFILE_ERROR_s, "Erro encontrado na leitura do ficheiro de ajuda '%s'"
-STID_INDEX, "&Contedo"
-STID_CONTENTS, "Summary"
+STID_INDEX, "&Conteúdo"
+STID_CONTENTS, "Sumário"
STID_BACK, "&Voltar"
STID_ALL_FILES, "Todos os ficheiros (*.*)"
STID_HELP_FILES_HLP, "Ficheiros de ajuda (*.hlp)"
-STID_FILE_NOT_FOUND_s "No possvel encontrar '%s'. Deseja procurar este ficheiro voc mesmo?"
-STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting"
-STID_PSH_INDEX, "Help topics: "
+STID_FILE_NOT_FOUND_s "Não é possível encontrar '%s'. Deseja procurar este ficheiro você mesmo?"
+STID_NO_RICHEDIT "Não foi possível encontrar uma implementação do richedit... A abortar"
+STID_PSH_INDEX, "Tópicos de ajuda: "
}
+
+CONTEXT_MENU MENU LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Anotação...", MNID_CTXT_ANNOTATE
+ MENUITEM "Copiar", MNID_CTXT_COPY
+ MENUITEM "Imprimir...", MNID_CTXT_PRINT
+ POPUP "Tipos de letra"
+ BEGIN
+ MENUITEM "Pequeno", MNID_CTXT_FONTS_SMALL
+ MENUITEM "Normal", MNID_CTXT_FONTS_NORMAL
+ MENUITEM "Grande", MNID_CTXT_FONTS_LARGE
+ END
+ POPUP "Ajuda sempre visível"
+ BEGIN
+ MENUITEM "Omissão", MNID_CTXT_HELP_DEFAULT
+ MENUITEM "Visível", MNID_CTXT_HELP_VISIBLE
+ MENUITEM "Invisível", MNID_CTXT_HELP_NONVISIBLE
+ END
+ MENUITEM "Usar cores do sistema", MNID_CTXT_SYSTEM_COLORS
+ END
+END
+#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/Rm.rc b/reactos/base/applications/winhlp32/Rm.rc
index ece7bb17c4d..17293875f99 100644
--- a/reactos/base/applications/winhlp32/Rm.rc
+++ b/reactos/base/applications/winhlp32/Rm.rc
@@ -22,6 +22,8 @@
#include "winhelp_res.h"
+#pragma code_page(65001)
+
/* FIXME: This file is in the Vallader Romansh dialect and not in the
official Rumantsch Grischun. */
@@ -90,3 +92,4 @@ STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yoursel
STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting"
STID_PSH_INDEX, "Help topics: "
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/Ru.rc b/reactos/base/applications/winhlp32/Ru.rc
index e2e6ef2f5c5..a476b344c6c 100644
--- a/reactos/base/applications/winhlp32/Ru.rc
+++ b/reactos/base/applications/winhlp32/Ru.rc
@@ -20,99 +20,105 @@
#include "winhelp_res.h"
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+
/* Menu */
-MAIN_MENU MENU LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+MAIN_MENU MENU
{
- POPUP "&" {
- MENUITEM "&", MNID_FILE_OPEN
+ POPUP "&Файл" {
+ MENUITEM "&Открыть", MNID_FILE_OPEN
MENUITEM SEPARATOR
- MENUITEM "&", MNID_FILE_PRINT
- MENUITEM " &...", MNID_FILE_SETUP
+ MENUITEM "&Печатать", MNID_FILE_PRINT
+ MENUITEM "Настройка &принтера...", MNID_FILE_SETUP
MENUITEM SEPARATOR
- MENUITEM "&", MNID_FILE_EXIT
+ MENUITEM "&Выход", MNID_FILE_EXIT
}
- POPUP "&" {
- MENUITEM "&...", MNID_EDIT_COPYDLG
+ POPUP "&Правка" {
+ MENUITEM "&Копировать...", MNID_EDIT_COPYDLG
MENUITEM SEPARATOR
- MENUITEM "&...", MNID_EDIT_ANNOTATE
+ MENUITEM "&Заметки...", MNID_EDIT_ANNOTATE
}
- POPUP "&" {
- MENUITEM "&...", MNID_BKMK_DEFINE
+ POPUP "&Закладка" {
+ MENUITEM "&Определить...", MNID_BKMK_DEFINE
}
- POPUP "&" {
- POPUP " "
+ POPUP "&Настройки" {
+ POPUP "Видимость окна справки"
BEGIN
- MENUITEM " ", MNID_OPTS_HELP_DEFAULT
- MENUITEM "", MNID_OPTS_HELP_VISIBLE
- MENUITEM " ", MNID_OPTS_HELP_NONVISIBLE
+ MENUITEM "По умолчанию", MNID_OPTS_HELP_DEFAULT
+ MENUITEM "Наверху", MNID_OPTS_HELP_VISIBLE
+ MENUITEM "Не наверху", MNID_OPTS_HELP_NONVISIBLE
END
- MENUITEM "", MNID_OPTS_HISTORY
- POPUP ""
+ MENUITEM "История", MNID_OPTS_HISTORY
+ POPUP "Шрифт"
BEGIN
- MENUITEM "", MNID_OPTS_FONTS_SMALL
- MENUITEM "", MNID_OPTS_FONTS_NORMAL
- MENUITEM "", MNID_OPTS_FONTS_LARGE
+ MENUITEM "Мелкий", MNID_OPTS_FONTS_SMALL
+ MENUITEM "Обычный", MNID_OPTS_FONTS_NORMAL
+ MENUITEM "Крупный", MNID_OPTS_FONTS_LARGE
END
- MENUITEM " ", MNID_OPTS_SYSTEM_COLORS
+ MENUITEM "Использовать системные цвета", MNID_OPTS_SYSTEM_COLORS
}
- POPUP "&" {
- MENUITEM " & ", MNID_HELP_HELPON
- MENUITEM " &", MNID_HELP_HELPTOP
+ POPUP "&Справка" {
+ MENUITEM "Помощь &по помощи", MNID_HELP_HELPON
+ MENUITEM "Всегда &сверху", MNID_HELP_HELPTOP
MENUITEM SEPARATOR
- MENUITEM "&...", MNID_HELP_ABOUT
+ MENUITEM "&Информация...", MNID_HELP_ABOUT
#ifdef WINELIB
- MENUITEM "& Wine", MNID_HELP_WINE
+ MENUITEM "&О Wine", MNID_HELP_WINE
#endif
}
}
-IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
-CAPTION ""
+CAPTION "Указатель"
{
LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
}
/* Strings */
-STRINGTABLE DISCARDABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+STRINGTABLE DISCARDABLE
{
-STID_WINE_HELP, " WINE"
-STID_WHERROR, ""
-STID_WARNING, ""
-STID_INFO, ""
-STID_NOT_IMPLEMENTED, " "
-STID_HLPFILE_ERROR_s, " `%s'"
-STID_INDEX, "&"
-STID_CONTENTS, ""
-STID_BACK, "&"
-STID_ALL_FILES, " (*.*)"
-STID_HELP_FILES_HLP, " (*.hlp)"
-STID_FILE_NOT_FOUND_s " '%s'. ?"
-STID_NO_RICHEDIT " richedit"
-STID_PSH_INDEX, ": "
+STID_WINE_HELP, "Справка WINE"
+STID_WHERROR, "ОШИБКА"
+STID_WARNING, "ВНИМАНИЕ"
+STID_INFO, "Информация"
+STID_NOT_IMPLEMENTED, "Не реализованно"
+STID_HLPFILE_ERROR_s, "Ошибка при чтении файла помощи `%s'"
+STID_INDEX, "&Содержание"
+STID_CONTENTS, "Начало"
+STID_BACK, "&Назад"
+STID_ALL_FILES, "Все файлы (*.*)"
+STID_HELP_FILES_HLP, "Файлы справки (*.hlp)"
+STID_FILE_NOT_FOUND_s "Не могу найти '%s'. Вы хотите найти этот файл самостоятельно?"
+STID_NO_RICHEDIT "Не могу найти richedit"
+STID_PSH_INDEX, "Содержание: "
}
-CONTEXT_MENU MENU LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
+CONTEXT_MENU MENU
BEGIN
POPUP ""
BEGIN
- MENUITEM "...", MNID_CTXT_ANNOTATE
- MENUITEM "", MNID_CTXT_COPY
- MENUITEM "...", MNID_CTXT_PRINT
- POPUP ""
+ MENUITEM "Заметки...", MNID_CTXT_ANNOTATE
+ MENUITEM "Копировать", MNID_CTXT_COPY
+ MENUITEM "Печать...", MNID_CTXT_PRINT
+ POPUP "Шрифт"
BEGIN
- MENUITEM "", MNID_CTXT_FONTS_SMALL
- MENUITEM "", MNID_CTXT_FONTS_NORMAL
- MENUITEM "", MNID_CTXT_FONTS_LARGE
+ MENUITEM "Мелкий", MNID_CTXT_FONTS_SMALL
+ MENUITEM "Обычный", MNID_CTXT_FONTS_NORMAL
+ MENUITEM "Крупный", MNID_CTXT_FONTS_LARGE
END
- POPUP " "
+ POPUP "Видимость окна справки"
BEGIN
- MENUITEM " ", MNID_CTXT_HELP_DEFAULT
- MENUITEM "", MNID_CTXT_HELP_VISIBLE
- MENUITEM " ", MNID_CTXT_HELP_NONVISIBLE
+ MENUITEM "По умолчанию", MNID_CTXT_HELP_DEFAULT
+ MENUITEM "Наверху", MNID_CTXT_HELP_VISIBLE
+ MENUITEM "Не наверху", MNID_CTXT_HELP_NONVISIBLE
END
- MENUITEM " ", MNID_CTXT_SYSTEM_COLORS
+ MENUITEM "Использовать системные цвета", MNID_CTXT_SYSTEM_COLORS
END
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/Si.rc b/reactos/base/applications/winhlp32/Si.rc
index 527b45431ee..310ef45a8f7 100644
--- a/reactos/base/applications/winhlp32/Si.rc
+++ b/reactos/base/applications/winhlp32/Si.rc
@@ -126,3 +126,4 @@ BEGIN
MENUITEM "Uporabi sistemske barve", MNID_CTXT_SYSTEM_COLORS
END
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/Zh.rc b/reactos/base/applications/winhlp32/Zh.rc
index ed20356cf47..a68b699c44f 100644
--- a/reactos/base/applications/winhlp32/Zh.rc
+++ b/reactos/base/applications/winhlp32/Zh.rc
@@ -160,3 +160,4 @@ STID_FILE_NOT_FOUND_s "不能開啟檔案 '%s'. 你想要自己找這個檔案
STID_NO_RICHEDIT "找不到 richedit... 終止"
STID_PSH_INDEX, "幫助內容: "
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/winhlp32/macro.c b/reactos/base/applications/winhlp32/macro.c
index c2fc3ccc710..fdec6b3dfa5 100644
--- a/reactos/base/applications/winhlp32/macro.c
+++ b/reactos/base/applications/winhlp32/macro.c
@@ -446,10 +446,13 @@ static void CALLBACK MACRO_GotoMark(LPCSTR str)
void CALLBACK MACRO_HelpOn(void)
{
- LPCSTR file;
+ WINHELP_WINDOW *win = MACRO_CurrentWindow();
+ LPCSTR file = NULL;
WINE_TRACE("()\n");
- file = MACRO_CurrentWindow()->page->file->help_on_file;
+ if (win && win->page && win->page->file)
+ file = win->page->file->help_on_file;
+
if (!file)
file = (Globals.wVersion > 4) ? "winhlp32.hlp" : "winhelp.hlp";
diff --git a/reactos/base/applications/winhlp32/rsrc.rc b/reactos/base/applications/winhlp32/rsrc.rc
index 39652f4d2cb..8a25238840d 100644
--- a/reactos/base/applications/winhlp32/rsrc.rc
+++ b/reactos/base/applications/winhlp32/rsrc.rc
@@ -23,3 +23,28 @@
/* @makedep: winhelp.ico */
IDI_WINHELP ICON DISCARDABLE winhelp.ico
+
+#include "Bg.rc"
+#include "Cs.rc"
+#include "Da.rc"
+#include "De.rc"
+#include "En.rc"
+#include "Es.rc"
+#include "Fi.rc"
+#include "Fr.rc"
+#include "Hu.rc"
+#include "It.rc"
+#include "Ja.rc"
+#include "Ko.rc"
+#include "Lt.rc"
+#include "Nl.rc"
+#include "No.rc"
+#include "Pl.rc"
+#include "Pt.rc"
+#include "Rm.rc"
+#include "Ru.rc"
+#include "Si.rc"
+#include "Sk.rc"
+#include "Sv.rc"
+#include "Tr.rc"
+#include "Zh.rc"
diff --git a/reactos/base/applications/winhlp32/winhelp.c b/reactos/base/applications/winhlp32/winhelp.c
index 56244d35aec..4c2d1ff6f94 100644
--- a/reactos/base/applications/winhlp32/winhelp.c
+++ b/reactos/base/applications/winhlp32/winhelp.c
@@ -167,7 +167,7 @@ BOOL WINHELP_GetOpenFileName(LPSTR lpszFile, int len)
lpszFile[0]='\0';
openfilename.lStructSize = sizeof(OPENFILENAME);
- openfilename.hwndOwner = NULL;
+ openfilename.hwndOwner = (Globals.active_win ? Globals.active_win->hMainWnd : 0);
openfilename.hInstance = Globals.hInstance;
openfilename.lpstrFilter = szzFilter;
openfilename.lpstrCustomFilter = 0;
diff --git a/reactos/base/applications/winhlp32/winhlp32.rbuild b/reactos/base/applications/winhlp32/winhlp32.rbuild
index 77d8c69a914..f58dcdb7c3a 100644
--- a/reactos/base/applications/winhlp32/winhlp32.rbuild
+++ b/reactos/base/applications/winhlp32/winhlp32.rbuild
@@ -18,28 +18,5 @@
string.c
winhelp.c
lex.yy.c
- Bg.rc
- Cs.rc
- Da.rc
- De.rc
- En.rc
- Es.rc
- Fi.rc
- Fr.rc
- Hu.rc
- It.rc
- Ja.rc
- Ko.rc
- Lt.rc
- Nl.rc
- No.rc
- Pl.rc
- Pt.rc
- Rm.rc
- Ru.rc
- Si.rc
- Sk.rc
- Sv.rc
- Tr.rc
rsrc.rc
diff --git a/reactos/base/applications/wordpad/De.rc b/reactos/base/applications/wordpad/De.rc
index 18181b2efba..d552d9c21a5 100644
--- a/reactos/base/applications/wordpad/De.rc
+++ b/reactos/base/applications/wordpad/De.rc
@@ -246,3 +246,4 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "Drucken ist nicht implementiert"
STRING_MAX_TAB_STOPS, "Es können nur maximal 32 Tabstopps definiert werden."
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Fr.rc b/reactos/base/applications/wordpad/Fr.rc
index 9691c0b0cc3..3b518288639 100644
--- a/reactos/base/applications/wordpad/Fr.rc
+++ b/reactos/base/applications/wordpad/Fr.rc
@@ -247,3 +247,4 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "L'impression n'est pas implémentée"
STRING_MAX_TAB_STOPS, "Impossible d'ajouter plus de 32 taquets de tabulation."
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Ja.rc b/reactos/base/applications/wordpad/Ja.rc
index fc21c5a4e74..6e08b569c60 100644
--- a/reactos/base/applications/wordpad/Ja.rc
+++ b/reactos/base/applications/wordpad/Ja.rc
@@ -247,3 +247,4 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "プリントが実装されていません。"
STRING_MAX_TAB_STOPS, "32以上なタブを追加できません。"
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Ko.rc b/reactos/base/applications/wordpad/Ko.rc
index 58235857018..2e460afdae9 100644
--- a/reactos/base/applications/wordpad/Ko.rc
+++ b/reactos/base/applications/wordpad/Ko.rc
@@ -180,12 +180,17 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_RICHTEXT_FILES_RTF, "ġ ؽƮ (*.rtf)"
- STRING_TEXT_FILES_TXT, "ؽƮ (*.txt)"
- STRING_TEXT_FILES_UNICODE_TXT, "ڵ ؽƮ (*.txt)"
- STRING_ALL_FILES, " (*.*)"
+ STRING_ALL_FILES, " (*.*)"
+ STRING_TEXT_FILES_TXT, "ؽƮ (*.txt)"
+ STRING_TEXT_FILES_UNICODE_TXT, "ڵ ؽƮ (*.txt)"
+ STRING_RICHTEXT_FILES_RTF, "ġ ؽƮ (*.rtf)"
+ STRING_NEWFILE_RICHTEXT, "ġ ؽƮ "
+ STRING_NEWFILE_TXT, "ؽƮ "
+ STRING_NEWFILE_TXT_UNICODE, "ڵ ؽƮ "
+ STRING_PRINTER_FILES_PRN, " (*.PRN)"
END
+
STRINGTABLE DISCARDABLE
BEGIN
STRING_ALIGN_LEFT, ""
@@ -193,18 +198,6 @@ BEGIN
STRING_ALIGN_CENTER, ""
END
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_NEWFILE_RICHTEXT, "ġ ؽƮ "
- STRING_NEWFILE_TXT, "ؽƮ "
- STRING_NEWFILE_TXT_UNICODE, "ڵ ؽƮ "
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_PRINTER_FILES_PRN, " (*.PRN)"
-END
-
STRINGTABLE DISCARDABLE
BEGIN
STRING_VIEWPROPS_TITLE, "ɼ"
@@ -220,10 +213,6 @@ BEGIN
STRING_PREVIEW_TWOPAGES, " "
STRING_PREVIEW_ONEPAGE, " "
STRING_PREVIEW_CLOSE, "ݱ"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
STRING_UNITS_CM, "cm"
END
diff --git a/reactos/base/applications/wordpad/Lt.rc b/reactos/base/applications/wordpad/Lt.rc
index 91fbfcaba91..e1781ebf90d 100644
--- a/reactos/base/applications/wordpad/Lt.rc
+++ b/reactos/base/applications/wordpad/Lt.rc
@@ -247,3 +247,4 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "Spausdinimas nerealizuotas"
STRING_MAX_TAB_STOPS, "Negalima pridėti daugiau negu 32-jų tabuliavimo pozicijų."
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Nl.rc b/reactos/base/applications/wordpad/Nl.rc
index c9ce64a4b29..10729e41df5 100644
--- a/reactos/base/applications/wordpad/Nl.rc
+++ b/reactos/base/applications/wordpad/Nl.rc
@@ -180,10 +180,14 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_RICHTEXT_FILES_RTF, "Rich text formaat (*.rtf)"
+ STRING_ALL_FILES, "Alle documenten (*.*)"
STRING_TEXT_FILES_TXT, "Tekst documenten (*.txt)"
STRING_TEXT_FILES_UNICODE_TXT, "Unicode tekst document (*.txt)"
- STRING_ALL_FILES, "Alle documenten (*.*)"
+ STRING_RICHTEXT_FILES_RTF, "Rich text formaat (*.rtf)"
+ STRING_NEWFILE_RICHTEXT, "Rich tekst document"
+ STRING_NEWFILE_TXT, "Tekst document"
+ STRING_NEWFILE_TXT_UNICODE, "Unicode tekst document"
+ STRING_PRINTER_FILES_PRN, "Printer bestanden (*.PRN)"
END
STRINGTABLE DISCARDABLE
@@ -193,18 +197,6 @@ BEGIN
STRING_ALIGN_CENTER, "Gecentreerd"
END
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_NEWFILE_RICHTEXT, "Rich tekst document"
- STRING_NEWFILE_TXT, "Tekst document"
- STRING_NEWFILE_TXT_UNICODE, "Unicode tekst document"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_PRINTER_FILES_PRN, "Printer bestanden (*.PRN)"
-END
-
STRINGTABLE DISCARDABLE
BEGIN
STRING_VIEWPROPS_TITLE, "Opties"
diff --git a/reactos/base/applications/wordpad/No.rc b/reactos/base/applications/wordpad/No.rc
index 5a4fdbf8c30..4409c30e9c6 100644
--- a/reactos/base/applications/wordpad/No.rc
+++ b/reactos/base/applications/wordpad/No.rc
@@ -246,3 +246,4 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "Utskriftfunksjonen er ikke laget ennå."
STRING_MAX_TAB_STOPS, "Kan ikke legge til mer enn 32 tabulatorstopp."
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Pt.rc b/reactos/base/applications/wordpad/Pt.rc
index fd512c9f1aa..b93237202e8 100644
--- a/reactos/base/applications/wordpad/Pt.rc
+++ b/reactos/base/applications/wordpad/Pt.rc
@@ -248,3 +248,4 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "Impressão não implementada"
STRING_MAX_TAB_STOPS, "Não pode adicionar mais de 32 tabs."
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Ru.rc b/reactos/base/applications/wordpad/Ru.rc
index 6428f7b1a0d..992646f6706 100644
--- a/reactos/base/applications/wordpad/Ru.rc
+++ b/reactos/base/applications/wordpad/Ru.rc
@@ -18,78 +18,81 @@
#include "wordpad.h"
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
IDM_MAINMENU MENU DISCARDABLE
BEGIN
- POPUP "&"
+ POPUP "&Файл"
BEGIN
- MENUITEM "&...\tCtrl+N",ID_FILE_NEW
- MENUITEM "&...\tCtrl+O",ID_FILE_OPEN
- MENUITEM "&\tCtrl+S", ID_FILE_SAVE
- MENUITEM " &...", ID_FILE_SAVEAS
+ MENUITEM "Созд&ать...\tCtrl+N",ID_FILE_NEW
+ MENUITEM "&Открыть...\tCtrl+O",ID_FILE_OPEN
+ MENUITEM "&Сохранить\tCtrl+S", ID_FILE_SAVE
+ MENUITEM "Сохранить &как...", ID_FILE_SAVEAS
MENUITEM SEPARATOR
- MENUITEM "&...\tCtrl+P", ID_PRINT
- MENUITEM "& ...", ID_PREVIEW
- MENUITEM "& ...", ID_PRINTSETUP
+ MENUITEM "&Печать...\tCtrl+P", ID_PRINT
+ MENUITEM "Пред&варительный просмотр...", ID_PREVIEW
+ MENUITEM "&Макет страницы...", ID_PRINTSETUP
MENUITEM SEPARATOR
- MENUITEM "&", ID_FILE_EXIT
+ MENUITEM "В&ыход", ID_FILE_EXIT
END
- POPUP "&"
+ POPUP "&Правка"
BEGIN
- MENUITEM "&\tCtrl+Z", ID_EDIT_UNDO
- MENUITEM "&\tCtrl+Y", ID_EDIT_REDO
+ MENUITEM "&Отменить\tCtrl+Z", ID_EDIT_UNDO
+ MENUITEM "&Повторить\tCtrl+Y", ID_EDIT_REDO
MENUITEM SEPARATOR
- MENUITEM "&\tCtrl+X", ID_EDIT_CUT
- MENUITEM "&\tCtrl+C", ID_EDIT_COPY
- MENUITEM "&\tCtrl+V", ID_EDIT_PASTE
- MENUITEM "&\tDEL", ID_EDIT_CLEAR
- MENUITEM " &\tCtrl+A", ID_EDIT_SELECTALL
+ MENUITEM "&Вырезать\tCtrl+X", ID_EDIT_CUT
+ MENUITEM "&Копировать\tCtrl+C", ID_EDIT_COPY
+ MENUITEM "&Вставить\tCtrl+V", ID_EDIT_PASTE
+ MENUITEM "&Удалить\tDEL", ID_EDIT_CLEAR
+ MENUITEM "Выделить в&се\tCtrl+A", ID_EDIT_SELECTALL
MENUITEM SEPARATOR
- MENUITEM "&...\tCrtl+F", ID_FIND
- MENUITEM "& \tF3", ID_FIND_NEXT
- MENUITEM "&...\tCtrl+H", ID_REPLACE
+ MENUITEM "&Найти...\tCrtl+F", ID_FIND
+ MENUITEM "На&йти далее\tF3", ID_FIND_NEXT
+ MENUITEM "&Заменить...\tCtrl+H", ID_REPLACE
MENUITEM SEPARATOR
- MENUITEM "& ", ID_EDIT_READONLY
- MENUITEM "&", ID_EDIT_MODIFIED
+ MENUITEM "&Только для чтения", ID_EDIT_READONLY
+ MENUITEM "&Изменен", ID_EDIT_MODIFIED
MENUITEM SEPARATOR
- POPUP "&"
+ POPUP "&Дополнительно"
BEGIN
- MENUITEM "& ", ID_EDIT_SELECTIONINFO
- MENUITEM "& ", ID_EDIT_CHARFORMAT
- MENUITEM " & ", ID_EDIT_DEFCHARFORMAT
- MENUITEM " &", ID_EDIT_PARAFORMAT
- MENUITEM "& ", ID_EDIT_GETTEXT
+ MENUITEM "&Информация о выделении", ID_EDIT_SELECTIONINFO
+ MENUITEM "&Формат символов", ID_EDIT_CHARFORMAT
+ MENUITEM "Формат символов &по умолчанию", ID_EDIT_DEFCHARFORMAT
+ MENUITEM "Формат &абзаца", ID_EDIT_PARAFORMAT
+ MENUITEM "П&олучить текст", ID_EDIT_GETTEXT
END
END
- POPUP "&"
+ POPUP "&Вид"
BEGIN
- MENUITEM " &", ID_TOGGLE_TOOLBAR
- MENUITEM "& ", ID_TOGGLE_FORMATBAR
- MENUITEM "&", ID_TOGGLE_RULER
- MENUITEM "& ", ID_TOGGLE_STATUSBAR
+ MENUITEM "Панель &инструментов", ID_TOGGLE_TOOLBAR
+ MENUITEM "П&анель форматирования", ID_TOGGLE_FORMATBAR
+ MENUITEM "&Линейка", ID_TOGGLE_RULER
+ MENUITEM "&Строка состояния", ID_TOGGLE_STATUSBAR
MENUITEM SEPARATOR
- MENUITEM "&...", ID_VIEWPROPERTIES
+ MENUITEM "&Параметры...", ID_VIEWPROPERTIES
END
- POPUP "&"
+ POPUP "Вст&авка"
BEGIN
- MENUITEM "& ...", ID_DATETIME
+ MENUITEM "&Дата и время...", ID_DATETIME
END
- POPUP "&"
+ POPUP "Фор&мат"
BEGIN
- MENUITEM "&...", ID_FONTSETTINGS
- MENUITEM "&" ID_BULLET
- MENUITEM "&..." ID_PARAFORMAT
- MENUITEM "&..." ID_TABSTOPS
- POPUP "&"
+ MENUITEM "&Шрифт...", ID_FONTSETTINGS
+ MENUITEM "&Маркер" ID_BULLET
+ MENUITEM "&Абзац..." ID_PARAFORMAT
+ MENUITEM "&Табуляция..." ID_TABSTOPS
+ POPUP "&Фон"
BEGIN
- MENUITEM "&\tCtrl+1", ID_BACK_1
- MENUITEM "& PostThat\tCtrl+2", ID_BACK_2
+ MENUITEM "&Системный\tCtrl+1", ID_BACK_1
+ MENUITEM "&Желтоватый PostThat\tCtrl+2", ID_BACK_2
END
END
- POPUP "&"
+ POPUP "&Справка"
BEGIN
- MENUITEM "& Wine Wordpad" ID_ABOUT
+ MENUITEM "&О Wine Wordpad" ID_ABOUT
END
END
@@ -97,67 +100,67 @@ IDM_POPUP MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
- MENUITEM "&\tCtrl+X", ID_EDIT_CUT
- MENUITEM "&\tCtrl+C", ID_EDIT_COPY
- MENUITEM "&", ID_EDIT_PASTE
+ MENUITEM "&Вырезать\tCtrl+X", ID_EDIT_CUT
+ MENUITEM "&Копировать\tCtrl+C", ID_EDIT_COPY
+ MENUITEM "Вст&авить", ID_EDIT_PASTE
MENUITEM SEPARATOR
- MENUITEM "&" ID_BULLET
- MENUITEM "&..." ID_PARAFORMAT
+ MENUITEM "&Маркер" ID_BULLET
+ MENUITEM "&Абзац..." ID_PARAFORMAT
END
END
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-CAPTION " "
+CAPTION "Дата и время"
FONT 10, "MS Sans Serif"
BEGIN
- LTEXT " ",-1,3,2,100,15
+ LTEXT "Доступные форматы",-1,3,2,100,15
LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY
- PUSHBUTTON "&",IDOK,87,12,40,12
- PUSHBUTTON "&",IDCANCEL,87,26,40,12
+ PUSHBUTTON "&ОК",IDOK,87,12,40,12
+ PUSHBUTTON "О&тмена",IDCANCEL,87,26,40,12
END
IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-CAPTION " "
+CAPTION "Новый документ"
FONT 10, "MS Sans Serif"
BEGIN
- LTEXT " ",-1,3,2,100,15
+ LTEXT "Тип создаваемого документа",-1,3,2,100,15
LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT
- PUSHBUTTON "&",IDOK,97,12,40,12
- PUSHBUTTON "&",IDCANCEL,97,26,40,12
+ PUSHBUTTON "&ОК",IDOK,97,12,40,12
+ PUSHBUTTON "О&тмена",IDCANCEL,97,26,40,12
END
IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-Caption ""
+Caption "Абзац"
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "", -1, 10, 10, 120, 68
- LTEXT "", -1, 15, 22, 40, 13
+ GROUPBOX "Отступ", -1, 10, 10, 120, 68
+ LTEXT "Слева", -1, 15, 22, 40, 13
EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13
- LTEXT "", -1, 15, 40, 40, 13
+ LTEXT "Справа", -1, 15, 40, 40, 13
EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13
- LTEXT " ", -1, 15, 58, 40, 13
+ LTEXT "Первая строка", -1, 15, 58, 40, 13
EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13
- LTEXT "", -1, 15, 87, 40, 13
+ LTEXT "Выравнивание", -1, 15, 87, 40, 13
COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST
- PUSHBUTTON "&", IDOK, 137, 15, 50, 15
- PUSHBUTTON "&", IDCANCEL, 137, 33, 50, 15
+ PUSHBUTTON "&ОК", IDOK, 137, 15, 50, 15
+ PUSHBUTTON "О&тмена", IDCANCEL, 137, 33, 50, 15
END
IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
-Caption ""
+Caption "Табуляция"
FONT 8, "MS SHell DLg"
BEGIN
- GROUPBOX " ", -1, 10, 10, 120, 90
+ GROUPBOX "Позиции табуляции", -1, 10, 10, 120, 90
COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE
- DEFPUSHBUTTON "&", ID_TAB_ADD, 20, 80, 45, 15
- PUSHBUTTON "&", ID_TAB_DEL, 72, 80, 45, 15
- PUSHBUTTON "&", IDOK, 137, 15, 50, 15
- PUSHBUTTON "&", IDCANCEL, 137, 33, 50, 15
- PUSHBUTTON " &", ID_TAB_EMPTY, 137, 51, 50, 15
+ DEFPUSHBUTTON "&Установить", ID_TAB_ADD, 20, 80, 45, 15
+ PUSHBUTTON "О&чистить", ID_TAB_DEL, 72, 80, 45, 15
+ PUSHBUTTON "&ОК", IDOK, 137, 15, 50, 15
+ PUSHBUTTON "О&тмена", IDCANCEL, 137, 33, 50, 15
+ PUSHBUTTON "Очистить &все", ID_TAB_EMPTY, 137, 51, 50, 15
END
IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110
@@ -165,77 +168,78 @@ STYLE DS_SYSMODAL
Caption ""
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX " ", -1, 10, 10, 130, 85
+ GROUPBOX "Перенос по словам", -1, 10, 10, 130, 85
RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15
- RADIOBUTTON " &", IDC_PAGEFMT_WW, 18, 45, 117, 15
- RADIOBUTTON " &", IDC_PAGEFMT_WM, 18, 65, 117, 15
- GROUPBOX "", -1, 150, 10, 120, 85
- CHECKBOX "&", IDC_PAGEFMT_TB, 160, 20, 80, 15
- CHECKBOX "&", IDC_PAGEFMT_FB, 160, 38, 80, 15
- CHECKBOX "&", IDC_PAGEFMT_RU, 160, 56, 80, 15
- CHECKBOX "& ", IDC_PAGEFMT_SB, 160, 74, 80, 15
+ RADIOBUTTON "В границах &окна", IDC_PAGEFMT_WW, 18, 45, 117, 15
+ RADIOBUTTON "В границах &полей", IDC_PAGEFMT_WM, 18, 65, 117, 15
+ GROUPBOX "Панели", -1, 150, 10, 120, 85
+ CHECKBOX "&Инструментов", IDC_PAGEFMT_TB, 160, 20, 80, 15
+ CHECKBOX "&Форматирования", IDC_PAGEFMT_FB, 160, 38, 80, 15
+ CHECKBOX "&Линейка", IDC_PAGEFMT_RU, 160, 56, 80, 15
+ CHECKBOX "&Строка состояния", IDC_PAGEFMT_SB, 160, 74, 80, 15
LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0
END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_RICHTEXT_FILES_RTF, " RTF (*.rtf)"
- STRING_TEXT_FILES_TXT, " (*.txt)"
- STRING_TEXT_FILES_UNICODE_TXT, " Unicode (*.txt)"
- STRING_ALL_FILES, " (*.*)"
+ STRING_RICHTEXT_FILES_RTF, "Файлы RTF (*.rtf)"
+ STRING_TEXT_FILES_TXT, "Текстовые документы (*.txt)"
+ STRING_TEXT_FILES_UNICODE_TXT, "Документы Unicode (*.txt)"
+ STRING_ALL_FILES, "Все документы (*.*)"
END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_ALIGN_LEFT, " "
- STRING_ALIGN_RIGHT, " "
- STRING_ALIGN_CENTER, " "
+ STRING_ALIGN_LEFT, "По левому краю"
+ STRING_ALIGN_RIGHT, "По правому краю"
+ STRING_ALIGN_CENTER, "По центру"
END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_NEWFILE_RICHTEXT, " RTF"
- STRING_NEWFILE_TXT, " "
- STRING_NEWFILE_TXT_UNICODE, " Unicode"
+ STRING_NEWFILE_RICHTEXT, "Файл RTF"
+ STRING_NEWFILE_TXT, "Текстовый документ"
+ STRING_NEWFILE_TXT_UNICODE, "Документ в формате Unicode"
END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_PRINTER_FILES_PRN, " (*.PRN)"
+ STRING_PRINTER_FILES_PRN, "Файлы принтера (*.PRN)"
END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_VIEWPROPS_TITLE, ""
- STRING_VIEWPROPS_TEXT, ""
- STRING_VIEWPROPS_RICHTEXT, " RTF"
+ STRING_VIEWPROPS_TITLE, "Настройки"
+ STRING_VIEWPROPS_TEXT, "Текст"
+ STRING_VIEWPROPS_RICHTEXT, "Файл RTF"
END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_PREVIEW_PRINT, ""
- STRING_PREVIEW_NEXTPAGE, " "
- STRING_PREVIEW_PREVPAGE, " "
+ STRING_PREVIEW_PRINT, "Печать"
+ STRING_PREVIEW_NEXTPAGE, "Следующая страница"
+ STRING_PREVIEW_PREVPAGE, "Предыдущая страница"
STRING_PREVIEW_TWOPAGES, "Two pages"
STRING_PREVIEW_ONEPAGE, "One page"
- STRING_PREVIEW_CLOSE, ""
+ STRING_PREVIEW_CLOSE, "Закрыть"
END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_UNITS_CM, ""
+ STRING_UNITS_CM, "см"
END
STRINGTABLE DISCARDABLE
BEGIN
STRING_DEFAULT_FILENAME, "Document"
- STRING_PROMPT_SAVE_CHANGES, " '%s'?"
- STRING_SEARCH_FINISHED, " ."
- STRING_LOAD_RICHED_FAILED, " RichEdit."
- STRING_SAVE_LOSEFORMATTING, " , " \
- " . " \
- " ?"
- STRING_INVALID_NUMBER, " "
- STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage "
- STRING_PRINTING_NOT_IMPLEMENTED, " "
+ STRING_PROMPT_SAVE_CHANGES, "Сохранить изменения в '%s'?"
+ STRING_SEARCH_FINISHED, "Поиск в документе завершен."
+ STRING_LOAD_RICHED_FAILED, "Ошибка загрузки библиотеки RichEdit."
+ STRING_SAVE_LOSEFORMATTING, "Сохранение документа в виде неформатированного текста, " \
+ "приведет к потере форматирования. Подтверждаете выполнение" \
+ "этой операции?"
+ STRING_INVALID_NUMBER, "Неправильный числовой формат"
+ STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage документы не поддерживаются"
+ STRING_PRINTING_NOT_IMPLEMENTED, "Печать не поддерживается"
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Si.rc b/reactos/base/applications/wordpad/Si.rc
index 1b6d37fd41c..4fa9cfe08c2 100644
--- a/reactos/base/applications/wordpad/Si.rc
+++ b/reactos/base/applications/wordpad/Si.rc
@@ -247,3 +247,4 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "Tiskanje (še) ni na voljo"
STRING_MAX_TAB_STOPS, "Ne morem vstaviti več kot 32 položajev tabulatorja."
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Sv.rc b/reactos/base/applications/wordpad/Sv.rc
index d94e6e3d190..f8ac17f77c6 100644
--- a/reactos/base/applications/wordpad/Sv.rc
+++ b/reactos/base/applications/wordpad/Sv.rc
@@ -246,3 +246,4 @@ BEGIN
STRING_PRINTING_NOT_IMPLEMENTED, "Utskrift ej implementerat."
STRING_MAX_TAB_STOPS, "Kan ej lägga till mer än 32 tabbstopp."
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/Zh.rc b/reactos/base/applications/wordpad/Zh.rc
index d8ceec43a1a..69531055234 100644
--- a/reactos/base/applications/wordpad/Zh.rc
+++ b/reactos/base/applications/wordpad/Zh.rc
@@ -471,3 +471,4 @@ BEGIN
STRING_OPEN_FAILED, "不能開啟檔案."
STRING_OPEN_ACCESS_DENIED, "你沒有開啟檔案的權力."
END
+#pragma code_page(default)
diff --git a/reactos/base/applications/wordpad/rsrc.rc b/reactos/base/applications/wordpad/rsrc.rc
index ac159da8916..4786e66ddcc 100644
--- a/reactos/base/applications/wordpad/rsrc.rc
+++ b/reactos/base/applications/wordpad/rsrc.rc
@@ -60,3 +60,21 @@ IDI_WRI ICON "wri.ico"
/* @makedep: txt.ico */
IDI_TXT ICON "txt.ico"
+
+#include "Da.rc"
+#include "De.rc"
+#include "En.rc"
+#include "Fr.rc"
+#include "Hu.rc"
+#include "Ja.rc"
+#include "Ko.rc"
+#include "Lt.rc"
+#include "Nl.rc"
+#include "No.rc"
+#include "Pl.rc"
+#include "Pt.rc"
+#include "Ru.rc"
+#include "Si.rc"
+#include "Sv.rc"
+#include "Tr.rc"
+#include "Zh.rc"
diff --git a/reactos/base/applications/wordpad/wordpad.c b/reactos/base/applications/wordpad/wordpad.c
index 022b9b1ec4d..80a6a070d3e 100644
--- a/reactos/base/applications/wordpad/wordpad.c
+++ b/reactos/base/applications/wordpad/wordpad.c
@@ -52,7 +52,6 @@
/* use LoadString */
static const WCHAR wszAppTitle[] = {'W','i','n','e',' ','W','o','r','d','p','a','d',0};
-static const WCHAR wszRichEditClass[] = {'R','I','C','H','E','D','I','T','2','0','W',0};
static const WCHAR wszMainWndClass[] = {'W','O','R','D','P','A','D','T','O','P',0};
static const WCHAR stringFormat[] = {'%','2','d','\0'};
@@ -1867,7 +1866,7 @@ static LRESULT OnCreate( HWND hWnd )
PostQuitMessage(1);
}
- hEditorWnd = CreateWindowExW(WS_EX_CLIENTEDGE, wszRichEditClass, NULL,
+ hEditorWnd = CreateWindowExW(WS_EX_CLIENTEDGE, RICHEDIT_CLASS20W, NULL,
WS_CHILD|WS_VISIBLE|ES_SELECTIONBAR|ES_MULTILINE|ES_AUTOVSCROLL
|ES_WANTRETURN|WS_VSCROLL|ES_NOHIDESEL|WS_HSCROLL,
0, 0, 1000, 100, hWnd, (HMENU)IDC_EDITOR, hInstance, NULL);
diff --git a/reactos/base/applications/wordpad/wordpad.rbuild b/reactos/base/applications/wordpad/wordpad.rbuild
index 454d01bd42c..3229752432c 100644
--- a/reactos/base/applications/wordpad/wordpad.rbuild
+++ b/reactos/base/applications/wordpad/wordpad.rbuild
@@ -13,22 +13,5 @@
print.c
registry.c
wordpad.c
- Da.rc
- De.rc
- En.rc
- Fr.rc
- Hu.rc
- Ja.rc
- Ko.rc
- Lt.rc
- Nl.rc
- No.rc
- Pl.rc
- Pt.rc
- Ru.rc
- Si.rc
- Sv.rc
- Tr.rc
- Zh.rc
rsrc.rc
diff --git a/reactos/base/applications/write/De.rc b/reactos/base/applications/write/De.rc
index db175a02d56..83cb909c318 100644
--- a/reactos/base/applications/write/De.rc
+++ b/reactos/base/applications/write/De.rc
@@ -27,3 +27,4 @@ STRINGTABLE
{
IDS_FAILED, "Der Start von Wordpad ist fehlgeschlagen"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/write/Fr.rc b/reactos/base/applications/write/Fr.rc
index a81dffda827..69105d9a788 100644
--- a/reactos/base/applications/write/Fr.rc
+++ b/reactos/base/applications/write/Fr.rc
@@ -28,3 +28,4 @@ STRINGTABLE
{
IDS_FAILED, "Wordpad n'a pas pu être démarré"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/write/Ja.rc b/reactos/base/applications/write/Ja.rc
index 5c9a8259a97..6b942ce02e0 100644
--- a/reactos/base/applications/write/Ja.rc
+++ b/reactos/base/applications/write/Ja.rc
@@ -29,3 +29,4 @@ STRINGTABLE
{
IDS_FAILED, "Wordpad の起動に失敗しました"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/write/Lt.rc b/reactos/base/applications/write/Lt.rc
index 5cef934fbc7..8e3eae38569 100644
--- a/reactos/base/applications/write/Lt.rc
+++ b/reactos/base/applications/write/Lt.rc
@@ -29,3 +29,4 @@ STRINGTABLE
{
IDS_FAILED, "Nepavyko paleisti Wordpad"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/write/Ro.rc b/reactos/base/applications/write/Ro.rc
index f6a7b65665f..a871350bfda 100644
--- a/reactos/base/applications/write/Ro.rc
+++ b/reactos/base/applications/write/Ro.rc
@@ -27,3 +27,4 @@ STRINGTABLE
{
IDS_FAILED, "Execuția Wordpad a eșuat"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/write/Ru.rc b/reactos/base/applications/write/Ru.rc
index 5824ad13f00..e64003fe566 100644
--- a/reactos/base/applications/write/Ru.rc
+++ b/reactos/base/applications/write/Ru.rc
@@ -20,9 +20,13 @@
#include "resources.h"
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
STRINGTABLE
{
- IDS_FAILED, " Wordpad"
+ IDS_FAILED, "Не удалось запустить Wordpad"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/write/Si.rc b/reactos/base/applications/write/Si.rc
index 9d3e5fe1520..3eaae9ed5ee 100644
--- a/reactos/base/applications/write/Si.rc
+++ b/reactos/base/applications/write/Si.rc
@@ -28,3 +28,4 @@ STRINGTABLE
{
IDS_FAILED, "Zagon programa Wordpad ni uspel"
}
+#pragma code_page(default)
diff --git a/reactos/base/applications/write/lang/nl-NL.rc b/reactos/base/applications/write/lang/nl-NL.rc
deleted file mode 100644
index 5f1611ed851..00000000000
--- a/reactos/base/applications/write/lang/nl-NL.rc
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Dutch language support
- *
- * Copyright (C) 2008 Frans Kool
- *
- * 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
- */
-
-LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
-
-STRINGTABLE
-{
- IDS_FAILED, "Starten van Wordpad mislukt"
-}
diff --git a/reactos/base/applications/write/lang/no-NO.rc b/reactos/base/applications/write/lang/no-NO.rc
deleted file mode 100644
index 9b5a4bd8fc7..00000000000
--- a/reactos/base/applications/write/lang/no-NO.rc
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Norwegian Bokml language support
- *
- * Copyright (C) 2007 Alexander N. Srnes
- *
- * 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
- */
-
-LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
-
-STRINGTABLE
-{
- IDS_FAILED, "Klarte ikke starte Wordpad"
-}
diff --git a/reactos/base/applications/write/lang/pl-PL.rc b/reactos/base/applications/write/lang/pl-PL.rc
deleted file mode 100644
index fc06b897f40..00000000000
--- a/reactos/base/applications/write/lang/pl-PL.rc
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Polish language support
- *
- * Copyright (C) 2007 Mikolaj Zalewski
- *
- * 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
- */
-
-LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
-
-STRINGTABLE
-{
- IDS_FAILED, "Nie udao si uruchomi programu Wordpad"
-}
diff --git a/reactos/base/applications/write/lang/pt-BR.rc b/reactos/base/applications/write/lang/pt-BR.rc
deleted file mode 100644
index e2ba2eb978d..00000000000
--- a/reactos/base/applications/write/lang/pt-BR.rc
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Portuguese language support
- *
- * Copyright (C) 2008 Ricardo Filipe
- *
- * 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
- */
-
-LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
-
-STRINGTABLE
-{
- IDS_FAILED, "Falhou ao iniciar o Wordpad"
-}
diff --git a/reactos/base/applications/write/lang/ro-RO.rc b/reactos/base/applications/write/lang/ro-RO.rc
deleted file mode 100644
index 28931038ad2..00000000000
--- a/reactos/base/applications/write/lang/ro-RO.rc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2007 Mikolaj Zalewski
- * Copyright (C) 2008 Michael Stefaniuc
- *
- * 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
- */
-
-LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
-
-STRINGTABLE
-{
- IDS_FAILED, "Execuia Wordpad a euat"
-}
diff --git a/reactos/base/applications/write/lang/ru-RU.rc b/reactos/base/applications/write/lang/ru-RU.rc
deleted file mode 100644
index 653d426b2cc..00000000000
--- a/reactos/base/applications/write/lang/ru-RU.rc
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Russian language support
- *
- * Copyright 2008 Andrey Esin
- *
- * 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
- */
-
-LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
-
-STRINGTABLE
-{
- IDS_FAILED, " Wordpad"
-}
diff --git a/reactos/base/applications/write/lang/sk-SK.rc b/reactos/base/applications/write/lang/sk-SK.rc
deleted file mode 100644
index 37b3ad1e2ee..00000000000
--- a/reactos/base/applications/write/lang/sk-SK.rc
+++ /dev/null
@@ -1,10 +0,0 @@
-/* TRANSLATOR: Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
- * DATE OF TR: 30-01-2008
- */
-
-LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
-
-STRINGTABLE
-BEGIN
- IDS_FAILED, "Nepodarilo sa spusti Wordpad"
-END
diff --git a/reactos/base/applications/write/lang/sv-SE.rc b/reactos/base/applications/write/lang/sv-SE.rc
deleted file mode 100644
index dea65213e0f..00000000000
--- a/reactos/base/applications/write/lang/sv-SE.rc
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Swedish language support
- *
- * Copyright (C) 2009 Anders Jonsson
- *
- * 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
- */
-
-LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
-
-STRINGTABLE
-{
- IDS_FAILED, "Kunde inte starta Wordpad"
-}
diff --git a/reactos/base/applications/write/lang/uk-UA.rc b/reactos/base/applications/write/lang/uk-UA.rc
deleted file mode 100644
index a5b5cbaa4bb..00000000000
--- a/reactos/base/applications/write/lang/uk-UA.rc
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Ukrainian language support
- *
- * Copyright (C) 2007 Artem Reznikov
- *
- * 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
- */
-
-LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
-
-STRINGTABLE
-BEGIN
- IDS_FAILED, " Wordpad"
-END
diff --git a/reactos/base/applications/write/lang/fr-FR.rc b/reactos/base/applications/write/rsrc.rc
similarity index 71%
rename from reactos/base/applications/write/lang/fr-FR.rc
rename to reactos/base/applications/write/rsrc.rc
index 0258efc8142..7c55c3001b4 100644
--- a/reactos/base/applications/write/lang/fr-FR.rc
+++ b/reactos/base/applications/write/rsrc.rc
@@ -1,7 +1,5 @@
/*
- * French language support
- *
- * Copyright (C) 2007 Jonathan Ernst
+ * Copyright 2007 Mikolaj Zalewski
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,13 +15,20 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#pragma code_page(65001)
-LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
+#include "resources.h"
-STRINGTABLE
-{
- IDS_FAILED, "Wordpad n'a pas pu être démarré"
-}
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
-#pragma code_page(default)
+#include "De.rc"
+#include "En.rc"
+#include "Fr.rc"
+#include "Ja.rc"
+#include "Ko.rc"
+#include "Lt.rc"
+#include "Nl.rc"
+#include "Pt.rc"
+#include "Ro.rc"
+#include "Ru.rc"
+#include "Si.rc"
+#include "Sv.rc"
diff --git a/reactos/base/applications/write/write.rbuild b/reactos/base/applications/write/write.rbuild
index 7a215abb19c..6ac77520f72 100644
--- a/reactos/base/applications/write/write.rbuild
+++ b/reactos/base/applications/write/write.rbuild
@@ -6,18 +6,5 @@
gdi32
kernel32
write.c
- De.rc
- En.rc
- Fr.rc
- Ja.rc
- Ko.rc
- Lt.rc
- Nl.rc
- No.rc
- Pl.rc
- Pt.rc
- Ro.rc
- Ru.rc
- Si.rc
- Sv.rc
+ rsrc.rc
diff --git a/reactos/base/services/audiosrv/pnp.c b/reactos/base/services/audiosrv/pnp.c
index f087058d7d0..af1c4fce219 100644
--- a/reactos/base/services/audiosrv/pnp.c
+++ b/reactos/base/services/audiosrv/pnp.c
@@ -61,6 +61,12 @@ ProcessExistingDevices()
0,
length);
+ if ( ! detail_data )
+ {
+ logmsg("ProcessExistingDevices() failed to allocate detail_data\n");
+ return TRUE;
+ }
+
while (
SetupDiEnumDeviceInterfaces(dev_info,
NULL,
diff --git a/reactos/base/services/audiosrv/pnp_list_manager.c b/reactos/base/services/audiosrv/pnp_list_manager.c
index 398eecfa1f3..c09a06c0c20 100644
--- a/reactos/base/services/audiosrv/pnp_list_manager.c
+++ b/reactos/base/services/audiosrv/pnp_list_manager.c
@@ -7,6 +7,7 @@
*/
#include
+#include
#include
#include "audiosrv.h"
diff --git a/reactos/base/services/audiosrv/services.c b/reactos/base/services/audiosrv/services.c
index 233828a16b9..34dd2e285b9 100644
--- a/reactos/base/services/audiosrv/services.c
+++ b/reactos/base/services/audiosrv/services.c
@@ -17,51 +17,86 @@
#include
#include "audiosrv.h"
+BOOL
+WaitForService(
+ SC_HANDLE hService,
+ ULONG RetryCount)
+{
+ ULONG Index = 0;
+ DWORD dwSize;
+ SERVICE_STATUS_PROCESS Info;
+
+ do
+ {
+ if (!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&Info, sizeof(SERVICE_STATUS_PROCESS), &dwSize))
+ {
+ logmsg("QueryServiceStatusEx failed %x\n", GetLastError());
+ break;
+ }
+
+ if (Info.dwCurrentState == SERVICE_RUNNING)
+ return TRUE;
+
+ Sleep(1000);
+
+ }while(Index++ < RetryCount);
+
+ logmsg("Timeout while waiting for service to become ready %p\n", hService);
+
+ return FALSE;
+}
+
+BOOL
+StartAudioService(
+ SC_HANDLE hSCManager,
+ LPWSTR ServiceName,
+ ULONG RetryCount)
+{
+ SC_HANDLE hService;
+ BOOL ret;
+
+ hService = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);
+
+ if (!hService)
+ {
+ logmsg("Failed to open service %S %x\n", ServiceName, GetLastError());
+ return FALSE;
+ }
+
+ if (!StartService(hService, 0, NULL))
+ {
+ logmsg("Failed to start service %S %x\n", ServiceName, GetLastError());
+ CloseServiceHandle(hService);
+ return FALSE;
+ }
+
+ ret = WaitForService(hService, RetryCount);
+
+ CloseServiceHandle(hService);
+ return ret;
+}
+
+
+
BOOL
StartSystemAudioServices()
{
- SC_HANDLE hSCManager, hService;
+ SC_HANDLE hSCManager;
logmsg("Starting system audio services\n");
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
if (!hSCManager)
{
- logmsg("Failed to open service manager\n");
+ logmsg("Failed to open service manager %x\n", GetLastError());
return FALSE;
}
- hService = OpenService(hSCManager, L"sysaudio", SERVICE_ALL_ACCESS);
- if (hService)
- {
- if (!StartService(hService, 0, NULL))
- {
- logmsg("Failed to start sysaudio service\n");
- CloseServiceHandle(hService);
- CloseServiceHandle(hSCManager);
- return FALSE;
- }
- CloseServiceHandle(hService);
- logmsg("Sysaudio service started\n");
- // FIXME
- // wait untill service is started
- }
-
- hService = OpenService(hSCManager, L"wdmaud", SERVICE_ALL_ACCESS);
- if (hService)
- {
- if (!StartService(hService, 0, NULL))
- {
- logmsg("Failed to start sysaudio service\n");
- CloseServiceHandle(hService);
- CloseServiceHandle(hSCManager);
- return FALSE;
- }
- CloseServiceHandle(hService);
- logmsg("Wdmaud service started\n");
- }
-
+ logmsg("Starting sysaudio service\n");
+ StartAudioService(hSCManager, L"sysaudio", 20);
+ logmsg("Starting wdmaud service\n");
+ StartAudioService(hSCManager, L"wdmaud", 20);
CloseServiceHandle(hSCManager);
return TRUE;
diff --git a/reactos/base/services/dhcp/adapter.c b/reactos/base/services/dhcp/adapter.c
index 01225213d5e..cca45f4676b 100644
--- a/reactos/base/services/dhcp/adapter.c
+++ b/reactos/base/services/dhcp/adapter.c
@@ -222,18 +222,20 @@ InterfaceConnected(MIB_IFROW IfEntry)
IfEntry.dwOperStatus == IF_OPER_STATUS_OPERATIONAL)
return 1;
+ DH_DbgPrint(MID_TRACE,("Interface %d is down\n", IfEntry.dwIndex));
return 0;
}
/*
* XXX Figure out the way to bind a specific adapter to a socket.
*/
-void AdapterDiscover() {
+BOOLEAN AdapterDiscover() {
PMIB_IFTABLE Table = (PMIB_IFTABLE) malloc(sizeof(MIB_IFTABLE));
DWORD Error, Size = sizeof(MIB_IFTABLE);
PDHCP_ADAPTER Adapter = NULL;
struct interface_info *ifi = NULL;
int i;
+ BOOLEAN ret = TRUE;
DH_DbgPrint(MID_TRACE,("Getting Adapter List...\n"));
@@ -244,7 +246,10 @@ void AdapterDiscover() {
Table = (PMIB_IFTABLE) malloc( Size );
}
- if( Error != NO_ERROR ) goto term;
+ if( Error != NO_ERROR ) {
+ ret = FALSE;
+ goto term;
+ }
DH_DbgPrint(MID_TRACE,("Got Adapter List (%d entries)\n", Table->dwNumEntries));
@@ -294,13 +299,18 @@ void AdapterDiscover() {
Adapter->DhclientInfo.rfdesc =
Adapter->DhclientInfo.wfdesc =
socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
- Adapter->ListenAddr.sin_family = AF_INET;
- Adapter->ListenAddr.sin_port = htons(LOCAL_PORT);
- Adapter->BindStatus =
- (bind( Adapter->DhclientInfo.rfdesc,
- (struct sockaddr *)&Adapter->ListenAddr,
- sizeof(Adapter->ListenAddr) ) == 0) ?
- 0 : WSAGetLastError();
+
+ if (DhcpSocket != INVALID_SOCKET) {
+ Adapter->ListenAddr.sin_family = AF_INET;
+ Adapter->ListenAddr.sin_port = htons(LOCAL_PORT);
+ Adapter->BindStatus =
+ (bind( Adapter->DhclientInfo.rfdesc,
+ (struct sockaddr *)&Adapter->ListenAddr,
+ sizeof(Adapter->ListenAddr) ) == 0) ?
+ 0 : WSAGetLastError();
+ } else {
+ error("socket() failed: %d\n", WSAGetLastError());
+ }
} else {
Adapter->DhclientInfo.rfdesc =
Adapter->DhclientInfo.wfdesc = DhcpSocket;
@@ -334,6 +344,7 @@ void AdapterDiscover() {
term:
if( Table ) free( Table );
+ return ret;
}
void AdapterStop() {
diff --git a/reactos/base/services/dhcp/dispatch.c b/reactos/base/services/dhcp/dispatch.c
index 3839c20bdfb..76ac90e9ca0 100644
--- a/reactos/base/services/dhcp/dispatch.c
+++ b/reactos/base/services/dhcp/dispatch.c
@@ -77,7 +77,10 @@ dispatch(void)
* a timeout registered, time out the select call then.
*/
another:
- AdapterDiscover();
+ if (!AdapterDiscover()) {
+ AdapterStop();
+ break;
+ }
for (l = protocols, nfds = 0; l; l = l->next)
nfds++;
diff --git a/reactos/base/services/dhcp/include/dhcpd.h b/reactos/base/services/dhcp/include/dhcpd.h
index e94566dea3b..7236632f1db 100644
--- a/reactos/base/services/dhcp/include/dhcpd.h
+++ b/reactos/base/services/dhcp/include/dhcpd.h
@@ -279,9 +279,6 @@ struct hash_table {
#define MAX_TIME 0x7fffffff
#define MIN_TIME 0
-#ifdef _MSC_VER
-typedef SIZE_T ssize_t;
-#endif
/* External definitions... */
diff --git a/reactos/base/services/dhcp/include/rosdhcp.h b/reactos/base/services/dhcp/include/rosdhcp.h
index ce24ae8edb4..159a5adfa82 100644
--- a/reactos/base/services/dhcp/include/rosdhcp.h
+++ b/reactos/base/services/dhcp/include/rosdhcp.h
@@ -73,7 +73,8 @@ typedef DWORD (*PipeSendFunc)( COMM_DHCP_REPLY *Reply );
#define srandom srand
void AdapterInit(VOID);
-void AdapterDiscover(VOID);
+BOOLEAN AdapterDiscover(VOID);
+void AdapterStop(VOID);
HANDLE PipeInit(VOID);
extern PDHCP_ADAPTER AdapterGetFirst();
extern PDHCP_ADAPTER AdapterGetNext(PDHCP_ADAPTER);
diff --git a/reactos/base/services/eventlog/rpc.c b/reactos/base/services/eventlog/rpc.c
index 9eed37b2119..e5e4e4da66f 100644
--- a/reactos/base/services/eventlog/rpc.c
+++ b/reactos/base/services/eventlog/rpc.c
@@ -369,6 +369,7 @@ NTSTATUS ElfrReportEventW(
DWORD dwStringsSize = 0;
DWORD dwError = ERROR_SUCCESS;
WCHAR *lpStrings;
+ int pos = 0;
lpEventSource = ElfGetEventLogSourceEntryByHandle(LogHandle);
if (!lpEventSource)
@@ -418,7 +419,6 @@ NTSTATUS ElfrReportEventW(
return STATUS_NO_MEMORY;
}
- int pos = 0;
for (i = 0; i < NumStrings; i++)
{
wcscpy((WCHAR*)(lpStrings + pos), Strings[i]->Buffer);
@@ -660,7 +660,7 @@ NTSTATUS ElfrReportEventAndSourceW(
}
-void __RPC_FAR *__RPC_USER midl_user_allocate(size_t len)
+void __RPC_FAR *__RPC_USER midl_user_allocate(SIZE_T len)
{
return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
}
diff --git a/reactos/base/services/rpcss/irotp.c b/reactos/base/services/rpcss/irotp.c
index 00b282e8465..f766beb5766 100644
--- a/reactos/base/services/rpcss/irotp.c
+++ b/reactos/base/services/rpcss/irotp.c
@@ -368,7 +368,7 @@ void __RPC_USER IrotContextHandle_rundown(IrotContextHandle ctxt_handle)
rot_entry_release(rot_entry);
}
-void * __RPC_USER MIDL_user_allocate(size_t size)
+void * __RPC_USER MIDL_user_allocate(SIZE_T size)
{
return HeapAlloc(GetProcessHeap(), 0, size);
}
diff --git a/reactos/base/services/svchost/svchost.h b/reactos/base/services/svchost/svchost.h
index d5e42874f87..390b4d02b0b 100644
--- a/reactos/base/services/svchost/svchost.h
+++ b/reactos/base/services/svchost/svchost.h
@@ -10,7 +10,7 @@
/* INCLUDES ******************************************************************/
-#ifdef _MSC_VER
+#if 0
#define _CRT_SECURE_NO_DEPRECATE 1
#endif
diff --git a/reactos/base/services/tcpsvcs/qotd.c b/reactos/base/services/tcpsvcs/qotd.c
index b082ff460e0..0c1d3683d77 100644
--- a/reactos/base/services/tcpsvcs/qotd.c
+++ b/reactos/base/services/tcpsvcs/qotd.c
@@ -114,7 +114,7 @@ RetrieveQuote(SOCKET sock)
lpStr++;
/* move past % and RN */
- lpStr += 3;
+ lpStr += 2;
}
}
diff --git a/reactos/base/services/tcpsvcs/quotes b/reactos/base/services/tcpsvcs/quotes
index b00a98b8458..4660536b037 100644
--- a/reactos/base/services/tcpsvcs/quotes
+++ b/reactos/base/services/tcpsvcs/quotes
@@ -1,6 +1,6 @@
"Et tu... Brute? What are you doing, Dave...?
%
-"So long, and thanks for all the fish"
+"So long, and thanks for all the fish
%
"I think you ought to know I'm feeling very depressed
%
@@ -34,7 +34,7 @@
%
"Oh i'm boring eh?
%
-"Its been great, maybe we can do this again sometime.
+"It's been great, maybe we can do this again sometime.
%
""Come blade, my breast imbrue." - William Shakespeare
%
@@ -56,7 +56,7 @@
%
"That's the way the cookie crumbles
%
-""NOO!! DONT HIT THE BUTTON! I wouldnt do it to you.
+"NOO!! DONT HIT THE BUTTON! I wouldnt do it to you.
%
"Don't abandon your computer, he wouldnt to it to you.
%
@@ -101,4 +101,4 @@
"All your base are belong to us.
%
""An odd game, the only way to win is not to play."
-%
\ No newline at end of file
+%
diff --git a/reactos/base/services/telnetd/serviceentry.c b/reactos/base/services/telnetd/serviceentry.c
index ee17e2a6f75..16e36ab52a4 100644
--- a/reactos/base/services/telnetd/serviceentry.c
+++ b/reactos/base/services/telnetd/serviceentry.c
@@ -21,6 +21,8 @@
#include
#include "wine/debug.h"
+int kickoff_telnetd(void);
+
WINE_DEFAULT_DEBUG_CHANNEL(telnetd);
static WCHAR telnetdW[] = {'t','e','l','n','e','t','d',0};
diff --git a/reactos/base/services/telnetd/telnetd.rbuild b/reactos/base/services/telnetd/telnetd.rbuild
index 3f6220463ce..d2824580b70 100644
--- a/reactos/base/services/telnetd/telnetd.rbuild
+++ b/reactos/base/services/telnetd/telnetd.rbuild
@@ -1,4 +1,4 @@
-
+
..
diff --git a/reactos/base/services/tftpd/tftpd.cpp b/reactos/base/services/tftpd/tftpd.cpp
index 157e1be06be..3a09f374f1f 100644
--- a/reactos/base/services/tftpd/tftpd.cpp
+++ b/reactos/base/services/tftpd/tftpd.cpp
@@ -1568,7 +1568,7 @@ void mySplit(char *name, char *value, char *source, char splitChar)
//printf("%s %s\n", name, value);
}
-bool getSection(char *sectionName, char *buffer, BYTE serial, char *fileName)
+bool getSection(const char *sectionName, char *buffer, BYTE serial, char *fileName)
{
//printf("%s=%s\n",fileName,sectionName);
char section[128];
@@ -1598,7 +1598,7 @@ bool getSection(char *sectionName, char *buffer, BYTE serial, char *fileName)
if (strstr(buff, "[") == buff)
break;
- if ((*buff) >= '0' && (*buff) <= '9' || (*buff) >= 'A' && (*buff) <= 'Z' || (*buff) >= 'a' && (*buff) <= 'z' || ((*buff) && strchr("/\\?*", (*buff))))
+ if (((*buff) >= '0' && (*buff) <= '9') || ((*buff) >= 'A' && (*buff) <= 'Z') || ((*buff) >= 'a' && (*buff) <= 'z') || (((*buff) && strchr("/\\?*", (*buff)))))
{
buffer += sprintf(buffer, "%s", buff);
buffer++;
diff --git a/reactos/base/services/tftpd/tftpd.h b/reactos/base/services/tftpd/tftpd.h
index b75f62a685b..bdbcf942d15 100644
--- a/reactos/base/services/tftpd/tftpd.h
+++ b/reactos/base/services/tftpd/tftpd.h
@@ -151,7 +151,7 @@ void processRequest(LPVOID lpParam);
char* myGetToken(char*, BYTE);
void init();
bool cleanReq(request*);
-bool getSection(char*, char*, BYTE, char*);
+bool getSection(const char*, char*, BYTE, char*);
bool isIP(char*s);
char* myLower(char*);
char* myUpper(char*);
diff --git a/reactos/base/services/umpnpmgr/umpnpmgr.c b/reactos/base/services/umpnpmgr/umpnpmgr.c
index 2d4603cba6c..55e9a0a74e6 100644
--- a/reactos/base/services/umpnpmgr/umpnpmgr.c
+++ b/reactos/base/services/umpnpmgr/umpnpmgr.c
@@ -135,7 +135,7 @@ RpcServerThread(LPVOID lpParameter)
}
-void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
+void __RPC_FAR * __RPC_USER midl_user_allocate(SIZE_T len)
{
return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
}
diff --git a/reactos/base/services/wlansvc/rpcserver.c b/reactos/base/services/wlansvc/rpcserver.c
index 012dfaeee11..b6475257b5e 100644
--- a/reactos/base/services/wlansvc/rpcserver.c
+++ b/reactos/base/services/wlansvc/rpcserver.c
@@ -525,7 +525,7 @@ DWORD _RpcGetSecuritySettings(
return ERROR_CALL_NOT_IMPLEMENTED;
}
-void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
+void __RPC_FAR * __RPC_USER midl_user_allocate(SIZE_T len)
{
return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
}
diff --git a/reactos/base/setup/reactos/reactos.c b/reactos/base/setup/reactos/reactos.c
index dde9dc52bc1..a2a7cf41cf3 100644
--- a/reactos/base/setup/reactos/reactos.c
+++ b/reactos/base/setup/reactos/reactos.c
@@ -364,8 +364,9 @@ LangSelDlgProc(HWND hwndDlg,
if (tindex != CB_ERR)
{
+ WORD LangID;
SetupData.SelectedLangId = SendMessage(hList, CB_GETITEMDATA, (WPARAM) tindex, (LPARAM) 0);
- WORD LangID = _tcstol(SetupData.pLanguages[SetupData.SelectedLangId].LangId, NULL, 16);
+ LangID = _tcstol(SetupData.pLanguages[SetupData.SelectedLangId].LangId, NULL, 16);
SetThreadLocale(MAKELCID(LangID, SORT_DEFAULT));
// FIXME: need to reload all resource to force
// the new language setting
diff --git a/reactos/base/setup/usetup/interface/devinst.c b/reactos/base/setup/usetup/interface/devinst.c
index e6014afe329..054cb9a94d9 100644
--- a/reactos/base/setup/usetup/interface/devinst.c
+++ b/reactos/base/setup/usetup/interface/devinst.c
@@ -311,7 +311,7 @@ EventThread(IN LPVOID lpParameter)
hInf = *(HINF *)lpParameter;
InitializeObjectAttributes(&ObjectAttributes, &EnumU, OBJ_CASE_INSENSITIVE, NULL, NULL);
- Status = NtOpenKey(&hEnum, 0, &ObjectAttributes);
+ Status = NtOpenKey(&hEnum, KEY_QUERY_VALUE, &ObjectAttributes);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtOpenKey('%wZ') failed with status 0x%08lx\n", &EnumU, Status);
diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c
index c483812a3e5..787ec0c2fac 100644
--- a/reactos/base/setup/usetup/interface/usetup.c
+++ b/reactos/base/setup/usetup/interface/usetup.c
@@ -3133,6 +3133,7 @@ PAGE_NUMBER
FileCopyPage(PINPUT_RECORD Ir)
{
COPYCONTEXT CopyContext;
+ unsigned int mem_bar_width;
MUIDisplayPage(FILE_COPY_PAGE);
@@ -3153,7 +3154,7 @@ FileCopyPage(PINPUT_RECORD Ir)
MUIGetString(STRING_SETUPCOPYINGFILES));
// fit memory bars to screen width, distribute them uniform
- unsigned int mem_bar_width = (xScreen - 26) / 5;
+ mem_bar_width = (xScreen - 26) / 5;
mem_bar_width -= mem_bar_width % 2; // make even
/* ATTENTION: The following progress bars are debug stuff, which should not be translated!! */
/* Create the paged pool progress bar */
diff --git a/reactos/base/setup/usetup/lang/nl-NL.h b/reactos/base/setup/usetup/lang/nl-NL.h
index 870e27da034..56a1e077638 100644
--- a/reactos/base/setup/usetup/lang/nl-NL.h
+++ b/reactos/base/setup/usetup/lang/nl-NL.h
@@ -9,4 +9,1719 @@ MUI_LAYOUTS nlNLLayouts[] =
{ NULL, NULL }
};
+static MUI_ENTRY nlNLLanguagePageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "Taalkeuze",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 10,
+ "\x07 Kies de taal die U voor de installatie wilt gebruiken.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 11,
+ " Druk daarna op ENTER.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 13,
+ "\x07 Deze taal wordt later als standaard taal door het systeem gebruikt.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER=Doorgaan F3=Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLWelcomePageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "Welkom bij ReactOS Setup",
+ TEXT_STYLE_HIGHLIGHT
+ },
+ {
+ 6,
+ 11,
+ "Dit gedeelte van Setup kopieeert het ReactOS besturingssysteem naar",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 12,
+ "uw computer en bereidt het tweede deel van setup voor.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 15,
+ "\x07 Druk op ENTER om ReactOS te installeren.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 17,
+ "\x07 Druk op R om ReactOS te repareren of bij te werken.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 19,
+ "\x07 Druk op L om de ReactOS Licensieovereenkomst te bekijken.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 21,
+ "\x07 Druk op F3 als u Setup wilt afsluiten zonder Reactos te",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 22,
+ " installeren.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 24,
+ "Voor meer informatie over ReactOS bezoekt u:",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 25,
+ "http://www.reactos.org",
+ TEXT_STYLE_HIGHLIGHT
+ },
+ {
+ 0,
+ 0,
+ "ENTER=Doorgaan R=Herstellen L = Licensie F3=Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLIntroPageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "ReactOS Setup is nog in een vroege ontwikkelingsfase.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 9,
+ "Het ondersteunt nog niet alle functies van een volledig",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 10,
+ "setup programma.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 12,
+ "De volgende beperkingen zijn van toepassing:",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 13,
+ "- Setup kan niet meer dan 1 primaire partitie per harde schijf aan.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 14,
+ "- Setup kan geen primaire partitie van een schijf verwijderen",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 15,
+ " zo lang er nog uitgebreide partities bestaan op deze schijf.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 16,
+ "- Setup kan de eerste uitgebreide partitie van een schijf niet",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 17,
+ " verwijderen zolang er nog andere uitgebreide partities",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 18,
+ " op deze schijf bestaan.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 19,
+ "- Setup ondersteunt alleen FAT bestandssystemen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 20,
+ "- Bestandssysteemcontrole is nog niet geimplementeerd.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 23,
+ "\x07 Druk op ENTER om ReactOS te installeren.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 25,
+ "\x07 Druk op F3 als u Setup wilt afsluiten zonder Reactos te",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 26,
+ " installeren.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Doorgaan F3 = Afsluiten",
+ TEXT_TYPE_STATUS| TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLLicensePageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 6,
+ "Licensie:",
+ TEXT_STYLE_HIGHLIGHT
+ },
+ {
+ 8,
+ 8,
+ "The ReactOS System is licensed under the terms of the",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 9,
+ "GNU GPL with parts containing code from other compatible",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 10,
+ "licenses such as the X11 or BSD and GNU LGPL licenses.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 11,
+ "All software that is part of the ReactOS system is",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 12,
+ "therefore released under the GNU GPL as well as maintaining",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 13,
+ "the original license.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 15,
+ "This software comes with NO WARRANTY or restrictions on usage",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 16,
+ "save applicable local and international law. The licensing of",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 17,
+ "ReactOS only covers distribution to third parties.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 18,
+ "If for some reason you did not receive a copy of the",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 19,
+ "GNU General Public License with ReactOS please visit",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 20,
+ "http://www.gnu.org/licenses/licenses.html",
+ TEXT_STYLE_HIGHLIGHT
+ },
+ {
+ 8,
+ 22,
+ "Warranty:",
+ TEXT_STYLE_HIGHLIGHT
+ },
+ {
+ 8,
+ 24,
+ "This is free software; see the source for copying conditions.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 25,
+ "There is NO warranty; not even for MERCHANTABILITY or",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 26,
+ "FITNESS FOR A PARTICULAR PURPOSE",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Ga terug",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLDevicePageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "Onderstaande lijst bevat de huidige apparaatinstellingen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 24,
+ 11,
+ "Computer:",
+ TEXT_STYLE_NORMAL | TEXT_ALIGN_RIGHT
+ },
+ {
+ 24,
+ 12,
+ "Beeldscherm:",
+ TEXT_STYLE_NORMAL | TEXT_ALIGN_RIGHT
+ },
+ {
+ 24,
+ 13,
+ "Toetsenbord:",
+ TEXT_STYLE_NORMAL | TEXT_ALIGN_RIGHT
+ },
+ {
+ 24,
+ 14,
+ "Toetsenbord indeling:",
+ TEXT_STYLE_NORMAL | TEXT_ALIGN_RIGHT
+ },
+ {
+ 24,
+ 16,
+ "Accepteren:",
+ TEXT_STYLE_NORMAL | TEXT_ALIGN_RIGHT
+ },
+ {
+ 25,
+ 16, "Accepteren van apparaatinstellingen",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 19,
+ "Selecteer een apparaatinstelling door middel van de pijltjestoetsen",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 20,
+ "Druk daarna op de ENTER toets om de instelling aan te passen",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 23,
+ "Als alle instellingen juist zijn, selecteer ",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 24,
+ "\"Accepteren van apparaatinstellingen\" en druk op ENTER.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Doorgaan F3 = Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLRepairPageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "ReactOS Setup is nog in een vroege ontwikkelingsfase",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 9,
+ "Het ondersteunt nog niet alle functies van een volledig",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 10,
+ "setup programma.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 12,
+ "De herstel functies zijn nog niet geimplementeerd.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 15,
+ "\x07 Druk op U om Reactos bij te werken.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 17,
+ "\x07 Druk op R voor de Herstelconsole.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 19,
+ "\x07 Druk op ESC om terug naar het hoofdscherm te gaan.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 21,
+ "\x07 Druk op ENTER om de computer opnieuw op te starten.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ESC = Hoofdscherm U = Bijwerken R = Herstelconsole ENTER = Reboot",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+static MUI_ENTRY nlNLComputerPageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "U wilt het te installeren computer type instellen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 10,
+ "\x07 Selecteer het gewenste computer type met behulp van de",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 11,
+ " pijltjestoetsen en Druk daarna op ENTER.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 13,
+ "\x07 Druk op de ESC toets om naar het vorige scherm te gaan",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 14,
+ " zonder het computer type te wijzigen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Doorgaan ESC = Annuleren F3 = Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLFlushPageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 10,
+ 6,
+ "Het systeem is alle gegegevens naar schijf aan het wegschrijven.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 10,
+ 8,
+ "Dit kan enige minuten duren",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 10,
+ 9,
+ "Wanneer gereed, zal uw computer automatisch opnieuw opstarten",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "Cache wordt geleegd",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLQuitPageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 10,
+ 6,
+ "ReactOS is niet volledig geinstalleerd",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 10,
+ 8,
+ "Verwijder de floppy disk uit Station A: en",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 10,
+ 9,
+ "alle CD-ROMs uit de CD-Stations.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 10,
+ 11,
+ "Druk op ENTER om uw computer opnieuw op te starten.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "Een ogenblik geduld ...",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG,
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLDisplayPageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "U wilt het te installeren beeldscherm type instellen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 10,
+ "\x07 Selecteer het gewenste beeldscherm type met behulp van de",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 11,
+ " pijltjestoetsen en Druk daarna op ENTER.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 13,
+ "\x07 Druk op de ESC toets om naar het vorige scherm te gaan",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 14,
+ " zonder het beeldscherm type te wijzigen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Doorgaan ESC = Annuleren F3 = Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLSuccessPageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 10,
+ 6,
+ "De basisonderdelen van ReactOS zijn succesvol geinstalleerd.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 10,
+ 8,
+ "Verwijder de floppy disk uit Station A: en",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 10,
+ 9,
+ "alle CD-ROMs uit de CD-Stations.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 10,
+ 11,
+ "Druk op ENTER om uw computer opnieuw op te starten.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Opnieuw op starten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLBootPageEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "Setup kan de bootloader niet op de harde schijf van uw computer",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 9,
+ "installeren",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 13,
+ "Voer een geformatteerde floppy disk in Station A: en",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 14,
+ "Druk op ENTER.",
+ TEXT_STYLE_NORMAL,
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Doorgaan F3 = Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+
+};
+
+static MUI_ENTRY nlNLSelectPartitionEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "Onderstaande lijst bevat de huidige partities en ongebruikte",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 9,
+ "ruimte voor nieuwe partities.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 11,
+ "\x07 Selecteer een partitie door middel van de pijltjestoetsen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 13,
+ "\x07 Druk op ENTER om ReactOS te installeren op de geselecteerde partitie.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 15,
+ "\x07 Druk op C om een nieuwe partitie aan te maken.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 17,
+ "\x07 Druk op D om een bestaande partitie te verwijderen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "Een ogenblik geduld ...",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLFormatPartitionEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "Partitie formatteren",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 10,
+ "Setup gaat nu de partitie formatteren. Druk op ENTER om door te gaan.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Doorgaan F3 = Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ TEXT_STYLE_NORMAL
+ }
+};
+
+static MUI_ENTRY nlNLInstallDirectoryEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "Setup installeert ReactOS bestanden op de geselecteerde partitie.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 9,
+ "kies een directory waar ReactOS geinstalleerd moet worden:",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 14,
+ "Om de voorgestelde directory te wijzigen: druk op BACKSPACE om",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 15,
+ "karakters te verwijderen en voer dan de directory in waar u ReactOS",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 6,
+ 16,
+ "wilt installeren.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Doorgaan F3 = Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLFileCopyEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 0,
+ 12,
+ "Wacht u terwijl ReactOS Setup bestanden kopieeert naar",
+ TEXT_STYLE_NORMAL | TEXT_ALIGN_CENTER
+ },
+ {
+ 0,
+ 13,
+ "uw ReactOS installatie folder.",
+ TEXT_STYLE_NORMAL | TEXT_ALIGN_CENTER
+ },
+ {
+ 0,
+ 14,
+ "Dit kan enkele minuten duren.",
+ TEXT_STYLE_NORMAL | TEXT_ALIGN_CENTER
+ },
+ {
+ 50,
+ 0,
+ "\xB3 Een ogenblik geduld ...",
+ TEXT_TYPE_STATUS
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLBootLoaderEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "Setup installeert de bootloader",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 12,
+ "Installeer de bootloader op de harde schijf (MBR).",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 13,
+ "Installeer de bootloader op een floppy disk.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 14,
+ "Installeren bootloader overslaan.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Doorgaan F3 = Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLkeyboardSettingsEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "U wilt het te installeren toetsenbord type instellen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 10,
+ "\x07 Selecteer het gewenste toetsenbord type met behulp van de",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 11,
+ " pijltjestoetsen en druk daarna op ENTER.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 13,
+ "\x07 Druk op de ESC toets om naar het vorige scherm te gaan",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 14,
+ " zonder het toetsenbord type te wijzigen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Doorgaan ESC = Annuleren F3 = Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLLayoutSettingsEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "U wilt de te installeren standaard indeling instellen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 10,
+ "\x07 Selecteer de gewenste standaard indeling met behulp van de",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 11,
+ " pijltjestoetsen en Druk daarna op ENTER.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 13,
+ "\x07 Druk op de ESC toets om naar het vorige scherm te gaan",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 14,
+ " zonder de standaard indeling te wijzigen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Doorgaan ESC = Annuleren F3 = Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ },
+
+};
+
+static MUI_ENTRY nlNLPrepareCopyEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "Setup bereidt uw computer voor op het kopieeren van ReactOS bestanden.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "Aanmaken van de lijst van te kopieeren bestanden...",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ },
+
+};
+
+static MUI_ENTRY nlNLSelectFSEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 17,
+ "Selecteer een bestandssysteem uit onderstaande lijst.",
+ 0
+ },
+ {
+ 8,
+ 19,
+ "\x07 Gebruik de pijltjestoetsen om een bestandssysteem te selecteren.",
+ 0
+ },
+ {
+ 8,
+ 21,
+ "\x07 Druk op ENTER om de partitie te formatteren.",
+ 0
+ },
+ {
+ 8,
+ 23,
+ "\x07 Druk op ESC om een andere partitie te selecteren.",
+ 0
+ },
+ {
+ 0,
+ 0,
+ "ENTER = Doorgaan ESC = Annuleren F3 = Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLDeletePartitionEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "U wilt de partitie verwijderen",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 18,
+ "\x07 Druk op D om de partitie te verwijderen.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 11,
+ 19,
+ "WAARSCHUWING: Alle gegevens op deze partitie worden gewist!",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 8,
+ 21,
+ "\x07 Druk op ESC om te annuleren.",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "D = Delete Partitie ESC = Annuleren F3 = Afsluiten",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ }
+};
+
+static MUI_ENTRY nlNLRegistryEntries[] =
+{
+ {
+ 4,
+ 3,
+ " ReactOS " KERNEL_VERSION_STR " Setup ",
+ TEXT_STYLE_UNDERLINE
+ },
+ {
+ 6,
+ 8,
+ "Setup is de systeemconfiguratie aan het bijwerken. ",
+ TEXT_STYLE_NORMAL
+ },
+ {
+ 0,
+ 0,
+ "Registry hives aanmaken...",
+ TEXT_TYPE_STATUS | TEXT_PADDING_BIG
+ },
+ {
+ 0,
+ 0,
+ NULL,
+ 0
+ },
+
+};
+
+MUI_ERROR nlNLErrorEntries[] =
+{
+ {
+ //ERROR_NOT_INSTALLED
+ "ReactOS is niet geheel geinstalleerd op uw\n"
+ "computer. Als u Setup nu afsluit moet u\n"
+ "Setup opnieuw starten om ReactOS te installeren.\n"
+ "\n"
+ " \x07 Druk op ENTER om door te gaan met Setup.\n"
+ " \x07 Druk op F3 om Setup af te sluiten.",
+ "F3 = Afsluiten ENTER = Doorgaan"
+ },
+ {
+ //ERROR_NO_HDD
+ "Setup kan geen harde schijf vinden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_NO_SOURCE_DRIVE
+ "Setup kan zijn station met bronbestanden niet vinden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_LOAD_TXTSETUPSIF
+ "Setup kan het bestand TXTSETUP.SIF niet laden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_CORRUPT_TXTSETUPSIF
+ "Setup heeft een ongeldig TXTSETUP.SIF gevonden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_SIGNATURE_TXTSETUPSIF,
+ "Setup heeft een ongeldige signatuur in TXTSETUP.SIF gevonden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_DRIVE_INFORMATION
+ "Setup kan de systeem drive informatie niet laden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_WRITE_BOOT,
+ "Setup kan de FAT bootcode op de system partitie niet installeren.",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_LOAD_COMPUTER,
+ "Setup kan de computer type lijst niet laden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_LOAD_DISPLAY,
+ "Setup kan de beeldscherm instellingen lijst niet laden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_LOAD_KEYBOARD,
+ "Setup kan de toetsenbord type lijst niet laden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_LOAD_KBLAYOUT,
+ "Setup kan de toetsenbord indeling lijst niet laden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_WARN_PARTITION,
+ "Setup ontdekte dat ten minste 1 harde schijf een niet compatibel\n"
+ "partitietabel bevat dat niet goed wordt ondersteund!\n"
+ "\n"
+ "Aanmaken of verwijderen van partities kan de partitie tabel\n"
+ "vernietigen.\n"
+ "\n"
+ " \x07 Druk op F3 om Setup af te sluiten.\n"
+ " \x07 Druk op ENTER om door te gaan.",
+ "F3= Afsluiten ENTER = Doorgaan"
+ },
+ {
+ //ERROR_NEW_PARTITION,
+ "U kunt geen nieuwe partitie aanmaken binnen\n"
+ "een reeds bestaande partitie!\n"
+ "\n"
+ " * Druk op een willekeurige toets om door te gaan.",
+ NULL
+ },
+ {
+ //ERROR_DELETE_SPACE,
+ "U kunt ongebruikte schijfruimte voor partities niet verwijderen!\n"
+ "\n"
+ " * Druk op een willekeurige toets om door te gaan.",
+ NULL
+ },
+ {
+ //ERROR_INSTALL_BOOTCODE,
+ "Setup kan de FAT bootcode op de systeem partitie niet installeren.",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_NO_FLOPPY,
+ "Geen schijf in station A:.",
+ "ENTER = Doorgaan"
+ },
+ {
+ //ERROR_UPDATE_KBSETTINGS,
+ "Setup kan de toetsbord indeling instellingen niet bijwerken.",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_UPDATE_DISPLAY_SETTINGS,
+ "Setup kan de beeldscherm registry instellingen niet bijwerken.",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_IMPORT_HIVE,
+ "Setup kan een hive bestand niet importeren.",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_FIND_REGISTRY
+ "Setup kan de registry data bestanden niet vinden.",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_CREATE_HIVE,
+ "Setup kan de registry hives niet aanmaken.",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_INITIALIZE_REGISTRY,
+ "Setup kan de registry niet initialiseren.",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_INVALID_CABINET_INF,
+ "Cabinet has no valid inf file.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_CABINET_MISSING,
+ "Cabinet bestand niet gevonden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_CABINET_SCRIPT,
+ "Cabinet bestand heeft geen setup script.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_COPY_QUEUE,
+ "Setup kan de ljst met te kopieeren bestanden niet vinden.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_CREATE_DIR,
+ "Setup kan de installatie directories niet aanmaken.",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_TXTSETUP_SECTION,
+ "Setup kan de 'Directories' sectie niet vinden\n"
+ "in TXTSETUP.SIF.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_CABINET_SECTION,
+ "Setup kan de 'Directories' sectie niet vinden\n"
+ "in het cabinet bestand.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_CREATE_INSTALL_DIR
+ "Setup kan de installatie directory niet aanmaken.",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_FIND_SETUPDATA,
+ "Setup kan de 'SetupData' sectie niet vinden\n"
+ "in TXTSETUP.SIF.\n",
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_WRITE_PTABLE,
+ "Setup kan de partitietabellen niet schrijven.\n"
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_ADDING_CODEPAGE,
+ "Setup kan de codepagina niet toevoegen aan de registry.\n"
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_UPDATE_LOCALESETTINGS,
+ "Setup kan de systeemtaal niet instellen.\n"
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_ADDING_KBLAYOUTS,
+ "Setup kan de toetsenbord indelingen niet toevoegen aan de registry.\n"
+ "ENTER = Reboot computer"
+ },
+ {
+ //ERROR_UPDATE_GEOID,
+ "Setup kan de geografische positie niet instellen.\n"
+ "ENTER = Reboot computer"
+ },
+ {
+ NULL,
+ NULL
+ }
+};
+
+
+MUI_PAGE nlNLPages[] =
+{
+ {
+ LANGUAGE_PAGE,
+ nlNLLanguagePageEntries
+ },
+ {
+ START_PAGE,
+ nlNLWelcomePageEntries
+ },
+ {
+ INSTALL_INTRO_PAGE,
+ nlNLIntroPageEntries
+ },
+ {
+ LICENSE_PAGE,
+ nlNLLicensePageEntries
+ },
+ {
+ DEVICE_SETTINGS_PAGE,
+ nlNLDevicePageEntries
+ },
+ {
+ REPAIR_INTRO_PAGE,
+ nlNLRepairPageEntries
+ },
+ {
+ COMPUTER_SETTINGS_PAGE,
+ nlNLComputerPageEntries
+ },
+ {
+ DISPLAY_SETTINGS_PAGE,
+ nlNLDisplayPageEntries
+ },
+ {
+ FLUSH_PAGE,
+ nlNLFlushPageEntries
+ },
+ {
+ SELECT_PARTITION_PAGE,
+ nlNLSelectPartitionEntries
+ },
+ {
+ SELECT_FILE_SYSTEM_PAGE,
+ nlNLSelectFSEntries
+ },
+ {
+ FORMAT_PARTITION_PAGE,
+ nlNLFormatPartitionEntries
+ },
+ {
+ DELETE_PARTITION_PAGE,
+ nlNLDeletePartitionEntries
+ },
+ {
+ INSTALL_DIRECTORY_PAGE,
+ nlNLInstallDirectoryEntries
+ },
+ {
+ PREPARE_COPY_PAGE,
+ nlNLPrepareCopyEntries
+ },
+ {
+ FILE_COPY_PAGE,
+ nlNLFileCopyEntries
+ },
+ {
+ KEYBOARD_SETTINGS_PAGE,
+ nlNLkeyboardSettingsEntries
+ },
+ {
+ BOOT_LOADER_PAGE,
+ nlNLBootLoaderEntries
+ },
+ {
+ LAYOUT_SETTINGS_PAGE,
+ nlNLLayoutSettingsEntries
+ },
+ {
+ QUIT_PAGE,
+ nlNLQuitPageEntries
+ },
+ {
+ SUCCESS_PAGE,
+ nlNLSuccessPageEntries
+ },
+ {
+ BOOT_LOADER_FLOPPY_PAGE,
+ nlNLBootPageEntries
+ },
+ {
+ REGISTRY_PAGE,
+ nlNLRegistryEntries
+ },
+ {
+ -1,
+ NULL
+ }
+};
+
+MUI_STRING nlNLStrings[] =
+{
+ {STRING_PLEASEWAIT,
+ " Een ogenblik geduld..."},
+ {STRING_INSTALLCREATEPARTITION,
+ " ENTER = Installeren C = Partitie aanmaken F3 = Afsluiten"},
+ {STRING_INSTALLDELETEPARTITION,
+ " ENTER = Installeren D = Partitie verwijderen F3 = Afsluiten"},
+ {STRING_PARTITIONSIZE,
+ "Grotte nieuwe partitie:"},
+ {STRING_CHOOSENEWPARTITION,
+ "U wilt een nieuwe partitie aanmaken op"},
+ {STRING_HDDSIZE,
+ "Voert u de grootte van de nieuwe partitie in in megabytes."},
+ {STRING_CREATEPARTITION,
+ " ENTER = Partitie Aanmaken ESC = Annuleren F3 = Afsluiten"},
+ {STRING_PARTFORMAT,
+ "Deze partitie zal vervolgens geformatteerd worden."},
+ {STRING_NONFORMATTEDPART,
+ "U wilt ReactOS installeren op een nieuwe of ongeformatteerde partitie."},
+ {STRING_INSTALLONPART,
+ "Setup installeert ReactOS op Partitie"},
+ {STRING_CHECKINGPART,
+ "Setup controleert nu de geselecteerde partitie."},
+ {STRING_QUITCONTINUE,
+ "F3= Afsluiten ENTER = Doorgaan"},
+ {STRING_REBOOTCOMPUTER,
+ "ENTER = Reboot computer"},
+ {STRING_TXTSETUPFAILED,
+ "Setup kan de '%S' sectie niet vinden\nin TXTSETUP.SIF.\n"},
+ {STRING_COPYING,
+ "\xB3 Kopieeren bestand: %S"},
+ {STRING_SETUPCOPYINGFILES,
+ "Setup is bestand aan het kopieeren..."},
+ {STRING_REGHIVEUPDATE,
+ " Bijwerken registry hives..."},
+ {STRING_IMPORTFILE,
+ " Importeren %S..."},
+ {STRING_DISPLAYETTINGSUPDATE,
+ " Bijwerken registry instellingen beeldscherm..."},
+ {STRING_LOCALESETTINGSUPDATE,
+ " Bijwerken systeemtaal instellingen..."},
+ {STRING_KEYBOARDSETTINGSUPDATE,
+ " Bijwerken toetsboard indeling..."},
+ {STRING_CODEPAGEINFOUPDATE,
+ " Toevoegen informatie codepagina aan registry..."},
+ {STRING_DONE,
+ " Voltooid..."},
+ {STRING_REBOOTCOMPUTER2,
+ " ENTER = Reboot computer"},
+ {STRING_CONSOLEFAIL1,
+ "Kan console niet openen\n\n"},
+ {STRING_CONSOLEFAIL2,
+ "De meest voorkomende oorzaak is het gebruik van een USB toetsenbord\n"},
+ {STRING_CONSOLEFAIL3,
+ "USB toetsenborden worden nog niet volledig ondersteund\n"},
+ {STRING_FORMATTINGDISK,
+ "Setup is de harde schijf aan het formatteren"},
+ {STRING_CHECKINGDISK,
+ "Setup is de harde schijf aan het controleren"},
+ {STRING_FORMATDISK1,
+ " Formatteer partition als %S bestandssysteem (snel) "},
+ {STRING_FORMATDISK2,
+ " Formatteer partition als %S bestandssysteem "},
+ {STRING_KEEPFORMAT,
+ " Behoud huidig bestandssysteem (geen wijzigingen) "},
+ {STRING_HDINFOPARTCREATE,
+ "%I64u %s Schijf %lu (Port=%hu, Bus=%hu, Id=%hu) op %wZ."},
+ {STRING_HDDINFOUNK1,
+ "%I64u %s Schijf %lu (Port=%hu, Bus=%hu, Id=%hu)."},
+ {STRING_HDDINFOUNK2,
+ " %c%c Type %lu %I64u %s"},
+ {STRING_HDINFOPARTDELETE,
+ "op %I64u %s Schijf %lu (Port=%hu, Bus=%hu, Id=%hu) op %wZ."},
+ {STRING_HDDINFOUNK3,
+ "op %I64u %s Schijf %lu (Port=%hu, Bus=%hu, Id=%hu)."},
+ {STRING_HDINFOPARTZEROED,
+ "Schijf %lu (%I64u %s), Port=%hu, Bus=%hu, Id=%hu (%wZ)."},
+ {STRING_HDDINFOUNK4,
+ "%c%c Type %lu %I64u %s"},
+ {STRING_HDINFOPARTEXISTS,
+ "op Schijf %lu (%I64u %s), Port=%hu, Bus=%hu, Id=%hu (%wZ)."},
+ {STRING_HDDINFOUNK5,
+ "%c%c Type %-3u %6lu %s"},
+ {STRING_HDINFOPARTSELECT,
+ "%6lu %s Schijf %lu (Port=%hu, Bus=%hu, Id=%hu) op %S"},
+ {STRING_HDDINFOUNK6,
+ "%6lu %s Schijf %lu (Port=%hu, Bus=%hu, Id=%hu)"},
+ {STRING_NEWPARTITION,
+ "Setup heeft een nieuwe partitie aangemaakt op"},
+ {STRING_UNPSPACE,
+ " Niet gepartitioneerde ruimte %6lu %s"},
+ {STRING_MAXSIZE,
+ "MB (max. %lu MB)"},
+ {STRING_UNFORMATTED,
+ "Nieuw (Ongeformatteerd)"},
+ {STRING_FORMATUNUSED,
+ "Ongebruikt"},
+ {STRING_FORMATUNKNOWN,
+ "Onbekend"},
+ {STRING_KB,
+ "KB"},
+ {STRING_MB,
+ "MB"},
+ {STRING_GB,
+ "GB"},
+ {STRING_ADDKBLAYOUTS,
+ "Toevoegen toetsenbord indelingen"},
+ {0, 0}
+};
+
+
#endif
diff --git a/reactos/base/setup/usetup/mui.c b/reactos/base/setup/usetup/mui.c
index 6b80e5170ad..4071e13dc2d 100644
--- a/reactos/base/setup/usetup/mui.c
+++ b/reactos/base/setup/usetup/mui.c
@@ -235,7 +235,7 @@ AddHotkeySettings(IN LPCWSTR Hotkey, IN LPCWSTR LangHotkey, IN LPCWSTR LayoutHot
NULL);
Status = NtCreateKey(&KeyHandle,
- KEY_ALL_ACCESS,
+ KEY_SET_VALUE,
&ObjectAttributes,
0,
NULL,
@@ -326,7 +326,7 @@ AddKbLayoutsToRegistry(IN const MUI_LAYOUTS * MuiLayouts)
NULL);
Status = NtCreateKey(&KeyHandle,
- KEY_ALL_ACCESS,
+ KEY_CREATE_SUB_KEY,
&ObjectAttributes,
0,
NULL,
@@ -358,7 +358,7 @@ AddKbLayoutsToRegistry(IN const MUI_LAYOUTS * MuiLayouts)
NULL);
Status = NtCreateKey(&KeyHandle,
- KEY_ALL_ACCESS,
+ KEY_SET_VALUE,
&ObjectAttributes,
0,
NULL,
@@ -379,7 +379,7 @@ AddKbLayoutsToRegistry(IN const MUI_LAYOUTS * MuiLayouts)
NULL);
Status = NtCreateKey(&SubKeyHandle,
- KEY_ALL_ACCESS,
+ KEY_SET_VALUE,
&ObjectAttributes,
0,
NULL,
diff --git a/reactos/base/setup/usetup/muilanguages.h b/reactos/base/setup/usetup/muilanguages.h
index 92b837298fc..59b9fed42fd 100644
--- a/reactos/base/setup/usetup/muilanguages.h
+++ b/reactos/base/setup/usetup/muilanguages.h
@@ -174,8 +174,8 @@ const MUI_LANGUAGE LanguageList[] =
{L"00000405", L"1250", L"852", L"10029", L"Czech", L"420", csCZPages, csCZErrorEntries, csCZStrings, LatinFonts, csCZLayouts },
{L"00000406", L"1252", L"850", L"10000", L"Danish", L"45", enUSPages, enUSErrorEntries, enUSStrings, LatinFonts, daDKLayouts },
{L"00000465", L"0", L"1", L"2", L"Divehi (Maldives)", L"960", enUSPages, enUSErrorEntries, enUSStrings, UnicodeFonts, dvMVLayouts },
- {L"00000413", L"1252", L"850", L"10000", L"Dutch (Netherlands)", L"31", enUSPages, enUSErrorEntries, enUSStrings, LatinFonts, nlNLLayouts },
- {L"00000813", L"1252", L"850", L"10000", L"Dutch (Belgium)", L"32", enUSPages, enUSErrorEntries, enUSStrings, LatinFonts, nlBELayouts },
+ {L"00000413", L"1252", L"850", L"10000", L"Dutch (Netherlands)", L"31", nlNLPages, nlNLErrorEntries, nlNLStrings, LatinFonts, nlNLLayouts },
+ {L"00000813", L"1252", L"850", L"10000", L"Dutch (Belgium)", L"32", nlNLPages, nlNLErrorEntries, nlNLStrings, LatinFonts, nlBELayouts },
{L"00000409", L"1252", L"437", L"10000", L"English (United States)", L"1", enUSPages, enUSErrorEntries, enUSStrings, LatinFonts, enUSLayouts },
{L"00000809", L"1252", L"850", L"10000", L"English (United Kingdom)", L"44", enUSPages, enUSErrorEntries, enUSStrings, LatinFonts, enGBLayouts },
{L"00000C09", L"1252", L"850", L"10000", L"English (Australia)", L"61", enUSPages, enUSErrorEntries, enUSStrings, LatinFonts, enAULayouts },
diff --git a/reactos/base/setup/usetup/settings.c b/reactos/base/setup/usetup/settings.c
index f51bf04f068..eb74c6b78bd 100644
--- a/reactos/base/setup/usetup/settings.c
+++ b/reactos/base/setup/usetup/settings.c
@@ -241,7 +241,7 @@ GetDisplayIdentifier(PWSTR Identifier,
NULL);
Status = NtOpenKey(&BusKey,
- KEY_ALL_ACCESS,
+ KEY_ENUMERATE_SUB_KEYS,
&ObjectAttributes);
if (!NT_SUCCESS(Status))
{
@@ -262,7 +262,7 @@ GetDisplayIdentifier(PWSTR Identifier,
NULL);
Status = NtOpenKey(&BusInstanceKey,
- KEY_ALL_ACCESS,
+ KEY_ENUMERATE_SUB_KEYS,
&ObjectAttributes);
if (!NT_SUCCESS(Status))
{
@@ -281,7 +281,7 @@ GetDisplayIdentifier(PWSTR Identifier,
NULL);
Status = NtOpenKey(&ControllerKey,
- KEY_ALL_ACCESS,
+ KEY_ENUMERATE_SUB_KEYS,
&ObjectAttributes);
if (NT_SUCCESS(Status))
{
@@ -300,7 +300,7 @@ GetDisplayIdentifier(PWSTR Identifier,
NULL);
Status = NtOpenKey(&ControllerInstanceKey,
- KEY_ALL_ACCESS,
+ KEY_QUERY_VALUE,
&ObjectAttributes);
if (!NT_SUCCESS(Status))
{
@@ -648,7 +648,7 @@ ProcessLocaleRegistry(PGENERIC_LIST List)
NULL);
Status = NtOpenKey(&KeyHandle,
- KEY_ALL_ACCESS,
+ KEY_SET_VALUE,
&ObjectAttributes);
if (!NT_SUCCESS(Status))
@@ -976,7 +976,7 @@ SetGeoID(PWCHAR Id)
NULL);
Status = NtOpenKey(&KeyHandle,
- KEY_ALL_ACCESS,
+ KEY_SET_VALUE,
&ObjectAttributes);
if(!NT_SUCCESS(Status))
{
diff --git a/reactos/base/setup/vmwinst/vmwinst.c b/reactos/base/setup/vmwinst/vmwinst.c
index dbfc9de36fa..e76a0e563b2 100644
--- a/reactos/base/setup/vmwinst/vmwinst.c
+++ b/reactos/base/setup/vmwinst/vmwinst.c
@@ -29,6 +29,7 @@
#include
#include
#include
+#include
#include "vmwinst.h"
#include
@@ -61,14 +62,6 @@ static LONG AbortInstall = 0;
#define WM_INSTSTATUSUPDATE (WM_USER + 4)
/* Helper functions */
-
-LONG CALLBACK VectoredExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo)
-{
- /* we're not running in VMware, just terminate the process */
- ExitProcess(ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_PRIV_INSTRUCTION);
- return EXCEPTION_CONTINUE_EXECUTION;
-}
-
BOOL
DetectVMware(int *Version)
{
@@ -77,16 +70,35 @@ DetectVMware(int *Version)
magic = 0;
ver = 0;
- /* Try using a VMware I/O port. If not running in VMware this'll throw an
- exception! */
-#ifndef _MSC_VER
- __asm__ __volatile__("inl %%dx, %%eax"
- : "=a" (ver), "=b" (magic)
- : "0" (0x564d5868), "d" (0x5658), "c" (0xa));
+ _SEH2_TRY
+ {
+ /* Try using a VMware I/O port. If not running in VMware this'll throw an
+ exception! */
+#if defined(__GNUC__)
+ __asm__ __volatile__("inl %%dx, %%eax"
+ : "=a" (ver), "=b" (magic)
+ : "0" (0x564d5868), "d" (0x5658), "c" (0xa));
+#elif defined(_MSC_VER)
+ __asm
+ {
+ push ebx
+ mov ecx, 0xa
+ mov edx, 0x5658
+ mov eax, 0x564d5868
+ in eax, dx
+ mov [ver], eax
+ mov [magic], ebx
+ pop ebx
+ }
#else
-#error PLEASE WRITE THIS IN ASSEMBLY
+#error TODO
#endif
-
+ }
+ _SEH2_EXCEPT(_SEH2_GetExceptionCode() == EXCEPTION_PRIV_INSTRUCTION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
+ {
+ return FALSE;
+ }
+ _SEH2_END;
if(magic == 0x564d5868)
{
@@ -1036,29 +1048,16 @@ wWinMain(HINSTANCE hInstance,
int nCmdShow)
{
- PVOID ExceptionHandler;
int Version;
WCHAR *lc;
hAppInstance = hInstance;
- /* Setup a vectored exception handler to protect the detection. Don't use SEH
- here so we notice the next time someone removes support for vectored
- exception handling from ros... */
- if (!(ExceptionHandler = AddVectoredExceptionHandler(0,
- VectoredExceptionHandler)))
- {
- return 1;
- }
-
if(!DetectVMware(&Version))
{
return 1;
}
- /* unregister the handler */
- RemoveVectoredExceptionHandler(ExceptionHandler);
-
lc = DestinationPath;
lc += GetSystemDirectory(DestinationPath, MAX_PATH) - 1;
if(lc >= DestinationPath && *lc != L'\\')
diff --git a/reactos/base/setup/vmwinst/vmwinst.rbuild b/reactos/base/setup/vmwinst/vmwinst.rbuild
index 343cb8e083f..a7c7fe15060 100644
--- a/reactos/base/setup/vmwinst/vmwinst.rbuild
+++ b/reactos/base/setup/vmwinst/vmwinst.rbuild
@@ -11,6 +11,7 @@
setupapi
shell32
ntdll
+ pseh
vmwinst.c
vmwinst.rc
diff --git a/reactos/base/shell/cmd/cmd.c b/reactos/base/shell/cmd/cmd.c
index 0ef2ce25a9a..233cffa8931 100644
--- a/reactos/base/shell/cmd/cmd.c
+++ b/reactos/base/shell/cmd/cmd.c
@@ -182,7 +182,7 @@ WORD wDefColor; /* default color */
INT
ConvertULargeInteger(ULONGLONG num, LPTSTR des, INT len, BOOL bPutSeperator)
{
- TCHAR temp[32];
+ TCHAR temp[39]; /* maximum length with nNumberGroups == 1 */
UINT n, iTarget;
if (len <= 1)
@@ -198,15 +198,15 @@ ConvertULargeInteger(ULONGLONG num, LPTSTR des, INT len, BOOL bPutSeperator)
if (iTarget == n && bPutSeperator)
{
iTarget += nNumberGroups + 1;
- temp[31 - n++] = cThousandSeparator;
+ temp[38 - n++] = cThousandSeparator;
}
- temp[31 - n++] = (TCHAR)(num % 10) + _T('0');
+ temp[38 - n++] = (TCHAR)(num % 10) + _T('0');
num /= 10;
} while (num > 0);
if (n > len-1)
n = len-1;
- memcpy(des, temp + 32 - n, n * sizeof(TCHAR));
+ memcpy(des, temp + 39 - n, n * sizeof(TCHAR));
des[n] = _T('\0');
return n;
@@ -484,15 +484,24 @@ Execute (LPTSTR Full, LPTSTR First, LPTSTR Rest, PARSED_COMMAND *Cmd)
INT
DoCommand(LPTSTR first, LPTSTR rest, PARSED_COMMAND *Cmd)
{
- TCHAR com[_tcslen(first) + _tcslen(rest) + 2]; /* full command line */
+ TCHAR *com;
TCHAR *cp;
LPTSTR param; /* pointer to command's parameters */
INT cl;
LPCOMMAND cmdptr;
BOOL nointernal = FALSE;
+ INT ret;
TRACE ("DoCommand: (\'%s\' \'%s\')\n", debugstr_aw(first), debugstr_aw(rest));
+ /* full command line */
+ com = cmd_alloc((_tcslen(first) + _tcslen(rest) + 2) * sizeof(TCHAR));
+ if (com == NULL)
+ {
+ error_out_of_memory();
+ return 1;
+ }
+
/* If present in the first word, these characters end the name of an
* internal command and become the beginning of its parameters. */
cp = first + _tcscspn(first, _T("\t +,/;=[]"));
@@ -526,11 +535,15 @@ DoCommand(LPTSTR first, LPTSTR rest, PARSED_COMMAND *Cmd)
if (_tcsicmp(cmdptr->name, _T("echo")) != 0)
while (_istspace(*param))
param++;
- return cmdptr->func(param);
+ ret = cmdptr->func(param);
+ cmd_free(com);
+ return ret;
}
}
- return Execute(com, first, rest, Cmd);
+ ret = Execute(com, first, rest, Cmd);
+ cmd_free(com);
+ return ret;
}
diff --git a/reactos/base/shell/cmd/console.c b/reactos/base/shell/cmd/console.c
index cfed1a421c2..18541bf389f 100644
--- a/reactos/base/shell/cmd/console.c
+++ b/reactos/base/shell/cmd/console.c
@@ -125,20 +125,36 @@ static VOID ConWrite(TCHAR *str, DWORD len, DWORD nStdHandle)
if (bUnicodeOutput)
{
#ifndef _UNICODE
- WCHAR buffer[len];
+ WCHAR *buffer = cmd_alloc(len * sizeof(WCHAR));
+ if (!buffer)
+ {
+ error_out_of_memory();
+ return;
+ }
len = MultiByteToWideChar(OutputCodePage, 0, str, len, buffer, len, NULL, NULL);
str = (PVOID)buffer;
#endif
WriteFile(hOutput, str, len * sizeof(WCHAR), &dwWritten, NULL);
+#ifndef _UNICODE
+ cmd_free(buffer);
+#endif
}
else
{
#ifdef _UNICODE
- CHAR buffer[len * MB_LEN_MAX];
+ CHAR *buffer = cmd_alloc(len * MB_LEN_MAX * sizeof(CHAR));
+ if (!buffer)
+ {
+ error_out_of_memory();
+ return;
+ }
len = WideCharToMultiByte(OutputCodePage, 0, str, len, buffer, len * MB_LEN_MAX, NULL, NULL);
str = (PVOID)buffer;
#endif
WriteFile(hOutput, str, len, &dwWritten, NULL);
+#ifdef _UNICODE
+ cmd_free(buffer);
+#endif
}
}
diff --git a/reactos/base/shell/cmd/dir.c b/reactos/base/shell/cmd/dir.c
index 7348a31970e..ce1e5657771 100644
--- a/reactos/base/shell/cmd/dir.c
+++ b/reactos/base/shell/cmd/dir.c
@@ -176,22 +176,16 @@ typedef struct _DirSwitchesFlags
{
DWORD dwAttribVal; /* The desired state of attribute */
DWORD dwAttribMask; /* Which attributes to check */
- BOOL bUnSet; /* A helper flag if "-" was given with the switch */
- BOOL bParSetted; /* A helper flag if parameters of switch were given */
} stAttribs; /* Displays files with this attributes only */
struct
{
enum EOrderBy eCriteria[3]; /* Criterias used to order by */
BOOL bCriteriaRev[3]; /* If the criteria is in reversed order */
short sCriteriaCount; /* The quantity of criterias */
- BOOL bUnSet; /* A helper flag if "-" was given with the switch */
- BOOL bParSetted; /* A helper flag if parameters of switch were given */
} stOrderBy; /* Ordered by criterias */
struct
{
enum ETimeField eTimeField; /* The time field that will be used for */
- BOOL bUnSet; /* A helper flag if "-" was given with the switch */
- BOOL bParSetted; /* A helper flag if parameters of switch were given */
} stTimeField; /* The time field to display or use for sorting */
} DIRSWITCHFLAGS, *LPDIRSWITCHFLAGS;
@@ -247,6 +241,7 @@ DirReadParam(LPTSTR Line, /* [IN] The line with the parameters & switches */
BOOL bIntoQuotes; /* A flag showing if we are in quotes (") */
LPTSTR ptrStart; /* A pointer to the first character of a parameter */
LPTSTR ptrEnd; /* A pointer to the last character of a parameter */
+ BOOL bOrderByNoPar; /* A flag to indicate /O with no switch parameter */
LPTSTR temp;
/* Initialize parameter array */
@@ -261,10 +256,7 @@ DirReadParam(LPTSTR Line, /* [IN] The line with the parameters & switches */
/* We suppose that switch parameters
were given to avoid setting them to default
if the switch was not given */
- lpFlags->stAttribs.bParSetted = TRUE;
- lpFlags->stOrderBy.bParSetted = TRUE;
- lpFlags->stTimeField.bParSetted = TRUE;
-
+ bOrderByNoPar = FALSE;
/* Main Loop (see README_DIR.txt) */
/* scan the command line char per char, and we process its char */
@@ -278,24 +270,46 @@ DirReadParam(LPTSTR Line, /* [IN] The line with the parameters & switches */
/* When a switch is expecting */
if (cCurSwitch == _T('/'))
{
+ while (*Line == _T(' '))
+ Line++;
+
+ bNegative = (*Line == _T('-'));
+ Line += bNegative;
+
+ cCurChar = *Line;
+ cCurUChar = _totupper(*Line);
+
if ((cCurUChar == _T('A')) ||(cCurUChar == _T('T')) || (cCurUChar == _T('O')))
{
- cCurSwitch = cCurUChar;
+ /* If positive, prepare for parameters... if negative, reset to defaults */
switch (cCurUChar)
{
case _T('A'):
- lpFlags->stAttribs.bUnSet = bNegative;
- lpFlags->stAttribs.bParSetted = FALSE;
+ lpFlags->stAttribs.dwAttribVal = 0L;
+ lpFlags->stAttribs.dwAttribMask = 0L;
+ if (bNegative)
+ lpFlags->stAttribs.dwAttribMask = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
break;
case _T('T'):
- lpFlags->stTimeField.bUnSet = bNegative;
- lpFlags->stTimeField.bParSetted = FALSE;
+ if (bNegative)
+ lpFlags->stTimeField.eTimeField = TF_MODIFIEDDATE;
break;
case _T('O'):
- lpFlags->stOrderBy.bUnSet = bNegative;
- lpFlags->stOrderBy.bParSetted = FALSE;
+ bOrderByNoPar = !bNegative;
+ lpFlags->stOrderBy.sCriteriaCount = 0;
break;
}
+
+ if (!bNegative)
+ {
+ /* Positive switch, so it can take parameters. */
+ cCurSwitch = cCurUChar;
+ Line++;
+ /* Skip optional leading colon */
+ if (*Line == _T(':'))
+ Line++;
+ continue;
+ }
}
else if (cCurUChar == _T('L'))
lpFlags->bLowerCase = ! bNegative;
@@ -324,24 +338,20 @@ DirReadParam(LPTSTR Line, /* [IN] The line with the parameters & switches */
DirHelp();
return FALSE;
}
- else if (cCurChar == _T('-'))
- {
- bNegative = TRUE;
- }
else
{
error_invalid_switch ((TCHAR)_totupper (*Line));
return FALSE;
}
- /* We check if we calculated the negative value and realese the flag */
- if ((cCurChar != _T('-')) && bNegative)
- bNegative = FALSE;
-
- /* if not a,o,t or - option then next parameter is not a switch */
- if ((cCurSwitch == _T('/')) && (!bNegative))
- cCurSwitch = _T(' ');
+ /* Make sure there's no extra characters at the end of the switch */
+ if (Line[1] && Line[1] != _T('/') && Line[1] != _T(' '))
+ {
+ error_parameter_format(Line[1]);
+ return FALSE;
+ }
+ cCurSwitch = _T(' ');
}
else if (cCurSwitch == _T(' '))
{
@@ -393,20 +403,14 @@ DirReadParam(LPTSTR Line, /* [IN] The line with the parameters & switches */
if ((cCurChar == _T('/')) || ( cCurChar == _T(' ')))
{
/* Wrong desicion path, reprocess current character */
- cCurSwitch = cCurChar;
+ cCurSwitch = _T(' ');
continue;
}
/* Process parameter switch */
switch(cCurSwitch)
{
case _T('A'): /* Switch parameters for /A (attributes filter) */
- /* Ok a switch parameter was given */
- lpFlags->stAttribs.bParSetted = TRUE;
-
- if (cCurChar == _T(':'))
- /* =V= dead command, used to make the "if" work */
- cCurChar = cCurChar;
- else if(cCurChar == _T('-'))
+ if(cCurChar == _T('-'))
bPNegative = TRUE;
else if(cCurUChar == _T('D'))
{
@@ -455,14 +459,7 @@ DirReadParam(LPTSTR Line, /* [IN] The line with the parameters & switches */
}
break;
case _T('T'): /* Switch parameters for /T (time field) */
-
- /* Ok a switch parameter was given */
- lpFlags->stTimeField.bParSetted = TRUE;
-
- if (cCurChar == _T(':'))
- /* =V= dead command, used to make the "if" work */
- cCurChar = cCurChar;
- else if(cCurUChar == _T('C'))
+ if(cCurUChar == _T('C'))
lpFlags->stTimeField.eTimeField= TF_CREATIONDATE ;
else if(cCurUChar == _T('A'))
lpFlags->stTimeField.eTimeField= TF_LASTACCESSEDDATE ;
@@ -476,12 +473,9 @@ DirReadParam(LPTSTR Line, /* [IN] The line with the parameters & switches */
break;
case _T('O'): /* Switch parameters for /O (order) */
/* Ok a switch parameter was given */
- lpFlags->stOrderBy.bParSetted = TRUE;
+ bOrderByNoPar = FALSE;
- if (cCurChar == _T(':'))
- /* <== dead command, used to make the "if" work */
- cCurChar = cCurChar;
- else if(cCurChar == _T('-'))
+ if(cCurChar == _T('-'))
bPNegative = TRUE;
else if(cCurUChar == _T('N'))
{
@@ -530,38 +524,16 @@ DirReadParam(LPTSTR Line, /* [IN] The line with the parameters & switches */
Line++;
}
- /* Calculate the switches with no switch paramater */
- if (!(lpFlags->stAttribs.bParSetted))
+ /* /O with no switch parameters acts like /O:GN */
+ if (bOrderByNoPar)
{
- lpFlags->stAttribs.dwAttribVal = 0L;
- lpFlags->stAttribs.dwAttribMask = lpFlags->stAttribs.dwAttribVal;
- }
- if (!(lpFlags->stOrderBy.bParSetted))
- {
- lpFlags->stOrderBy.sCriteriaCount = 1;
- lpFlags->stOrderBy.eCriteria[0] = ORDER_NAME;
+ lpFlags->stOrderBy.sCriteriaCount = 2;
+ lpFlags->stOrderBy.eCriteria[0] = ORDER_DIRECTORY;
lpFlags->stOrderBy.bCriteriaRev[0] = FALSE;
+ lpFlags->stOrderBy.eCriteria[1] = ORDER_NAME;
+ lpFlags->stOrderBy.bCriteriaRev[1] = FALSE;
}
- if (!(lpFlags->stTimeField.bParSetted))
- lpFlags->stTimeField.eTimeField = TF_MODIFIEDDATE ;
- /* Calculate the unsetted switches (the "-" prefixed)*/
- if (lpFlags->stAttribs.bUnSet)
- {
- lpFlags->stAttribs.bUnSet = FALSE;
- lpFlags->stAttribs.dwAttribVal = 0L;
- lpFlags->stAttribs.dwAttribMask = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
- }
- if (lpFlags->stOrderBy.bUnSet)
- {
- lpFlags->stOrderBy.bUnSet = FALSE;
- lpFlags->stOrderBy.sCriteriaCount = 0;
- }
- if (lpFlags->stTimeField.bUnSet )
- {
- lpFlags->stTimeField.bUnSet = FALSE;
- lpFlags->stTimeField.eTimeField = TF_MODIFIEDDATE;
- }
return TRUE;
}
@@ -1600,12 +1572,9 @@ CommandDir(LPTSTR rest)
stFlags.bWideList = FALSE;
stFlags.bWideListColSort = FALSE;
stFlags.stTimeField.eTimeField = TF_MODIFIEDDATE;
- stFlags.stTimeField.bUnSet = FALSE;
stFlags.stAttribs.dwAttribMask = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
stFlags.stAttribs.dwAttribVal = 0L;
- stFlags.stAttribs.bUnSet = FALSE;
stFlags.stOrderBy.sCriteriaCount = 0;
- stFlags.stOrderBy.bUnSet = FALSE;
nErrorLevel = 0;
diff --git a/reactos/base/shell/cmd/memory.c b/reactos/base/shell/cmd/memory.c
index 81d53acfd90..2b44ce9b0ab 100644
--- a/reactos/base/shell/cmd/memory.c
+++ b/reactos/base/shell/cmd/memory.c
@@ -25,6 +25,7 @@ INT CommandMemory (LPTSTR param)
TCHAR szAvailPageFile[40];
TCHAR szTotalVirtual[40];
TCHAR szAvailVirtual[40];
+ BOOL (WINAPI *GlobalMemoryStatusEx)(LPMEMORYSTATUSEX);
if (!_tcsncmp (param, _T("/?"), 2))
{
@@ -32,8 +33,8 @@ INT CommandMemory (LPTSTR param)
return 0;
}
- BOOL (WINAPI *GlobalMemoryStatusEx)(LPMEMORYSTATUSEX)
- = (PVOID)GetProcAddress(GetModuleHandle(_T("KERNEL32")), "GlobalMemoryStatusEx");
+ GlobalMemoryStatusEx
+ = (BOOL (WINAPI *)(LPMEMORYSTATUSEX))GetProcAddress(GetModuleHandle(_T("KERNEL32")), "GlobalMemoryStatusEx");
if (GlobalMemoryStatusEx)
{
msex.dwLength = sizeof(MEMORYSTATUSEX);
diff --git a/reactos/base/shell/cmd/misc.c b/reactos/base/shell/cmd/misc.c
index f44ff43bd6c..4e3947fee68 100644
--- a/reactos/base/shell/cmd/misc.c
+++ b/reactos/base/shell/cmd/misc.c
@@ -38,7 +38,8 @@
/*
* get a character out-of-band and honor Ctrl-Break characters
*/
-TCHAR cgetchar (VOID)
+TCHAR
+cgetchar (VOID)
{
HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
INPUT_RECORD irBuffer;
diff --git a/reactos/base/shell/cmd/mklink.c b/reactos/base/shell/cmd/mklink.c
index ecd0a81b72e..5c2d1236f44 100644
--- a/reactos/base/shell/cmd/mklink.c
+++ b/reactos/base/shell/cmd/mklink.c
@@ -39,9 +39,9 @@ static BOOL CreateJunction(LPCTSTR LinkName, LPCTSTR TargetName)
HMODULE hNTDLL = GetModuleHandle(_T("NTDLL"));
BOOLEAN (WINAPI *RtlDosPathNameToNtPathName_U)(PCWSTR, PUNICODE_STRING, PCWSTR *, CURDIR *)
- = (BOOLEAN (WINAPI *)())GetProcAddress(hNTDLL, "RtlDosPathNameToNtPathName_U");
+ = (BOOLEAN (WINAPI *)(PCWSTR, PUNICODE_STRING, PCWSTR *, CURDIR *))GetProcAddress(hNTDLL, "RtlDosPathNameToNtPathName_U");
VOID (WINAPI *RtlFreeUnicodeString)(PUNICODE_STRING)
- = (VOID (WINAPI *)())GetProcAddress(hNTDLL, "RtlFreeUnicodeString");
+ = (VOID (WINAPI *)(PUNICODE_STRING))GetProcAddress(hNTDLL, "RtlFreeUnicodeString");
TCHAR TargetFullPath[MAX_PATH];
#ifdef UNICODE
@@ -177,9 +177,9 @@ cmd_mklink(LPTSTR param)
* so load dynamically */
BOOL (WINAPI *CreateSymbolicLink)(LPCTSTR, LPCTSTR, DWORD)
#ifdef UNICODE
- = (BOOL (WINAPI *)())GetProcAddress(hKernel32, "CreateSymbolicLinkW");
+ = (BOOL (WINAPI *)(LPCTSTR, LPCTSTR, DWORD))GetProcAddress(hKernel32, "CreateSymbolicLinkW");
#else
- = (BOOL (WINAPI *)())GetProcAddress(hKernel32, "CreateSymbolicLinkA");
+ = (BOOL (WINAPI *)(LPCTSTR, LPCTSTR, DWORD))GetProcAddress(hKernel32, "CreateSymbolicLinkA");
#endif
if (CreateSymbolicLink && CreateSymbolicLink(Name[0], Name[1], Flags))
{
@@ -193,9 +193,9 @@ cmd_mklink(LPTSTR param)
* so load dynamically */
BOOL (WINAPI *CreateHardLink)(LPCTSTR, LPCTSTR, LPSECURITY_ATTRIBUTES)
#ifdef UNICODE
- = (BOOL (WINAPI *)())GetProcAddress(hKernel32, "CreateHardLinkW");
+ = (BOOL (WINAPI *)(LPCTSTR, LPCTSTR, LPSECURITY_ATTRIBUTES))GetProcAddress(hKernel32, "CreateHardLinkW");
#else
- = (BOOL (WINAPI *)())GetProcAddress(hKernel32, "CreateHardLinkA");
+ = (BOOL (WINAPI *)(LPCTSTR, LPCTSTR, LPSECURITY_ATTRIBUTES))GetProcAddress(hKernel32, "CreateHardLinkA");
#endif
if (CreateHardLink && CreateHardLink(Name[0], Name[1], NULL))
{
diff --git a/reactos/base/shell/cmd/parser.c b/reactos/base/shell/cmd/parser.c
index 02cc9980447..511625d86ea 100644
--- a/reactos/base/shell/cmd/parser.c
+++ b/reactos/base/shell/cmd/parser.c
@@ -326,10 +326,11 @@ static PARSED_COMMAND *ParseBlock(REDIRECTION *RedirList)
static PARSED_COMMAND *ParseIf(void)
{
PARSED_COMMAND *Cmd = cmd_alloc(sizeof(PARSED_COMMAND));
+ int Type;
memset(Cmd, 0, sizeof(PARSED_COMMAND));
Cmd->Type = C_IF;
- int Type = CurrentTokenType;
+ Type = CurrentTokenType;
if (_tcsicmp(CurrentToken, _T("/I")) == 0)
{
Cmd->If.Flags |= IFFLAG_IGNORECASE;
@@ -619,8 +620,9 @@ static PARSED_COMMAND *ParsePrimary(void)
if (CurChar == _T('@'))
{
+ PARSED_COMMAND *Cmd;
ParseChar();
- PARSED_COMMAND *Cmd = cmd_alloc(sizeof(PARSED_COMMAND));
+ Cmd = cmd_alloc(sizeof(PARSED_COMMAND));
Cmd->Type = C_QUIET;
Cmd->Next = NULL;
/* @ acts like a unary operator with low precedence,
diff --git a/reactos/base/shell/explorer-new/lang/bg-BG.rc b/reactos/base/shell/explorer-new/lang/bg-BG.rc
index 53c78ab4749..759461ce9a6 100644
--- a/reactos/base/shell/explorer-new/lang/bg-BG.rc
+++ b/reactos/base/shell/explorer-new/lang/bg-BG.rc
@@ -5,7 +5,7 @@ BEGIN
POPUP ""
BEGIN
MENUITEM SEPARATOR
- MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM " ", ID_SHELL_CMD_OPEN_TASKMGR
MENUITEM SEPARATOR
MENUITEM "& ", ID_LOCKTASKBAR
MENUITEM "&", ID_SHELL_CMD_PROPERTIES
@@ -68,62 +68,62 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPT
CAPTION "Taskbar"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
- GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ GROUPBOX " ", IDC_STATIC, 6,6,240,121, WS_DISABLED
CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
- AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
- AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
- AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
- AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
- AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
- AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+ AUTOCHECKBOX "& ", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX " &", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX " & ", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "& ", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX " & ", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "& ()", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
END
IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Start Menu"
+CAPTION " "
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
- AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
- LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
- PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
- AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
- LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
- PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
- GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
- AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
- AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+ AUTORADIOBUTTON "& ", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT " , .", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "&...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON " &", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT " .",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX " &", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX " &",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
END
IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Notification Area"
+CAPTION ""
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
- GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
- LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
- AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
- PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
- GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
- LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
- AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
- AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
- AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
- AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+ GROUPBOX "", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT " , , .", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "& ", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX " ", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT " .", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "&", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "&", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "&", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
END
IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Toolbars"
+CAPTION " "
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
- LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ LTEXT " .", IDC_STATIC, 7,7,223,12, WS_DISABLED
CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION " "
END
diff --git a/reactos/base/shell/explorer-new/lang/ja-JP.rc b/reactos/base/shell/explorer-new/lang/ja-JP.rc
index 485680aa8a3..5084e2c79b2 100644
--- a/reactos/base/shell/explorer-new/lang/ja-JP.rc
+++ b/reactos/base/shell/explorer-new/lang/ja-JP.rc
@@ -5,7 +5,7 @@ BEGIN
POPUP ""
BEGIN
MENUITEM SEPARATOR
- MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM "^XN }l[W", ID_SHELL_CMD_OPEN_TASKMGR
MENUITEM SEPARATOR
MENUITEM "^XN o[Œ肷(&L)", ID_LOCKTASKBAR
MENUITEM "vpeB(R)", ID_SHELL_CMD_PROPERTIES
@@ -19,15 +19,15 @@ BEGIN
MENUITEM "", -1, MFT_SEPARATOR
POPUP "vO(&P)", IDM_PROGRAMS
BEGIN
- MENUITEM "(Empty)", -1, MFT_STRING, MFS_GRAYED
+ MENUITEM "(Ȃ)", -1, MFT_STRING, MFS_GRAYED
END
POPUP "Cɓ(F&)", IDM_FAVORITES
BEGIN
- MENUITEM "(Empty)", -1, MFT_STRING, MFS_GRAYED
+ MENUITEM "(Ȃ)", -1, MFT_STRING, MFS_GRAYED
END
POPUP "ŋߎgt@C(&D)", IDM_DOCUMENTS
BEGIN
- MENUITEM "(Empty)", -1, MFT_STRING, MFS_GRAYED
+ MENUITEM "(Ȃ)", -1, MFT_STRING, MFS_GRAYED
END
POPUP "ݒ(&S)", IDM_SETTINGS
BEGIN
@@ -53,6 +53,67 @@ BEGIN
END
END
+
+IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "^XNo["
+FONT 9, "MS UI Gothic", 0, 0, 0x1
+BEGIN
+ GROUPBOX "^XNo[̊O", IDC_STATIC, 6,6,240,121
+ CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21
+ AUTOCHECKBOX "^XNo[Œ肷(&L)", IDC_TASKBARPROP_LOCK, 13,45,200,10
+ AUTOCHECKBOX "^XNo[IɉB(&U)", IDC_TASKBARPROP_HIDE, 13,58,200,10
+ AUTOCHECKBOX "^XNo[𑼂̃EChEɕۂ(&T)", IDC_TASKBARPROP_ONTOP, 13,71,200,10
+ AUTOCHECKBOX "ގ^XNo[{^O[v(&G)", IDC_TASKBARPROP_GROUP, 13,84,200,10
+ AUTOCHECKBOX "NCbNN̕\(&Q)", IDC_TASKBARPROP_SHOWQL, 13,97,200,10
+ AUTOCHECKBOX "EChẼvr[\(TlC)(&S)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10
+END
+
+IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "X^[gj["
+FONT 9, "MS UI Gothic", 0, 0, 0x1
+BEGIN
+ AUTORADIOBUTTON "X^[gj[(&S)", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "̃j[X^C̓tH_ACɓ̃vOAւ̊ȒPȃANZX܂B", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "JX^}CY(&C)...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "NVbN X^[gj[(&M)", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "̃j[X^C̓NVbNȊOρA@\܂",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "JX^}CY(&C)...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ GROUPBOX "vCoV[",IDC_STATIC, 7,100,238,42
+ AUTOCHECKBOX "ŋߊJt@C̃XgLĕ\(&F)", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "ŋߊJvÕXgLĕ\(&P)",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+END
+
+IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "ʒm̈"
+FONT 9, "MS UI Gothic", 0, 0, 0x1
+BEGIN
+ CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
+ GROUPBOX "ACR", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "ŋ߃NbNĂȂACRBĒʒm̈肳邱Ƃł܂B", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "ANeBułȂACRB(&H)", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "JX^}CY(&C)...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "VXe ACR", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "ɕ\VXeACRIĂB", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "v(&K)", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ AUTOCHECKBOX "(&V)", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+ AUTOCHECKBOX "lbg[N(&N)", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "d(&P)", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+
+END
+
+IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "c[o["
+FONT 9, "MS UI Gothic", 0, 0, 0x1
+BEGIN
+ LTEXT "^XNo[ɒljc[o[IĂB", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
+END
+
+
STRINGTABLE DISCARDABLE
BEGIN
IDS_START "X^[g"
@@ -61,68 +122,7 @@ BEGIN
IDS_EXPLORE_ALL_USERS "GNXv[ - All Users(&E)"
END
-
-IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Taskbar"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
- GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
- CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
- AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
- AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
- AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
- AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
- AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
- AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
-END
-
-IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Start Menu"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
- AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
- LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
- PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
- AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
- LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
- PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
- GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
- AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
- AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
-END
-
-IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Notification Area"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
- CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
- GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
- LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
- AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
- PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
- GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
- LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
- AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
- AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
- AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
- AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
-
-END
-
-IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Toolbars"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
- LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
- CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
-END
-
-
STRINGTABLE DISCARDABLE
BEGIN
- IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "^XNo[ƃX^[gj[̃vpeB"
END
diff --git a/reactos/base/shell/explorer-new/lang/nl-NL.rc b/reactos/base/shell/explorer-new/lang/nl-NL.rc
index d94cde17719..d74963510c3 100644
--- a/reactos/base/shell/explorer-new/lang/nl-NL.rc
+++ b/reactos/base/shell/explorer-new/lang/nl-NL.rc
@@ -5,9 +5,9 @@ BEGIN
POPUP ""
BEGIN
MENUITEM SEPARATOR
- MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+ MENUITEM "Taakbeheer", ID_SHELL_CMD_OPEN_TASKMGR
MENUITEM SEPARATOR
- MENUITEM "&Takenbalk vergrendelen", ID_LOCKTASKBAR
+ MENUITEM "&Taakbalk vergrendelen", ID_LOCKTASKBAR
MENUITEM "&Eigenschappen", ID_SHELL_CMD_PROPERTIES
END
END
@@ -19,15 +19,15 @@ BEGIN
MENUITEM "", -1, MFT_SEPARATOR
POPUP "&Programma's", IDM_PROGRAMS
BEGIN
- MENUITEM "(Empty)", -1, MFT_STRING, MFS_GRAYED
+ MENUITEM "(Leeg)", -1, MFT_STRING, MFS_GRAYED
END
POPUP "F&avorieten", IDM_FAVORITES
BEGIN
- MENUITEM "(Empty)", -1, MFT_STRING, MFS_GRAYED
+ MENUITEM "(Leeg)", -1, MFT_STRING, MFS_GRAYED
END
POPUP "&Documenten", IDM_DOCUMENTS
BEGIN
- MENUITEM "(Empty)", -1, MFT_STRING, MFS_GRAYED
+ MENUITEM "(Leeg)", -1, MFT_STRING, MFS_GRAYED
END
POPUP "&Instellingen", IDM_SETTINGS
BEGIN
@@ -36,7 +36,7 @@ BEGIN
MENUITEM "&Beveiliging...", IDM_SECURITY, MFT_STRING, MFS_ENABLED
MENUITEM "&Netwerkverbindingen", IDM_NETWORKCONNECTIONS, MFT_STRING, MFS_ENABLED
MENUITEM "&Printers en Faxapparaten", IDM_PRINTERSANDFAXES, MFT_STRING, MFS_ENABLED
- MENUITEM "&Takenbalk en het Start-Menu", IDM_TASKBARANDSTARTMENU, MFT_STRING, MFS_ENABLED
+ MENUITEM "&Taakbalk en het menu Start", IDM_TASKBARANDSTARTMENU, MFT_STRING, MFS_ENABLED
END
POPUP "&Zoeken", IDM_SEARCH
BEGIN
@@ -46,7 +46,7 @@ BEGIN
MENUITEM "&Uitvoeren...", IDM_RUN, MFT_STRING, MFS_ENABLED
MENUITEM "", 450, MFT_SEPARATOR, MFS_ENABLED
MENUITEM "&Synchroniseren", IDM_SYNCHRONIZE, MFT_STRING, MFS_ENABLED
- MENUITEM "&Afloggen %s...", IDM_LOGOFF, MFT_STRING, MFS_ENABLED
+ MENUITEM "&Afmelden %s...", IDM_LOGOFF, MFT_STRING, MFS_ENABLED
MENUITEM "&Verbinding Verbreken...", IDM_DISCONNECT, MFT_STRING, MFS_ENABLED
MENUITEM "&Computer Ontkoppelen", IDM_UNDOCKCOMPUTER, MFT_STRING, MFS_ENABLED
MENUITEM "A&fsluiten...", IDM_SHUTDOWN, MFT_STRING, MFS_ENABLED
@@ -57,72 +57,72 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_START "&Start"
IDS_PROPERTIES "&Eigenschappen"
- IDS_OPEN_ALL_USERS "&Open Alle Gebruikers"
- IDS_EXPLORE_ALL_USERS "&Alle Gebruikers V&erkennen"
+ IDS_OPEN_ALL_USERS "&Alle Gebruikers weergeven"
+ IDS_EXPLORE_ALL_USERS "Alle Gebruikers V&erkennen"
END
IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Taskbar"
+CAPTION "Taakbalk"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
- GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121, WS_DISABLED
+ GROUPBOX "Taakbalkweergave", IDC_STATIC, 6,6,240,121, WS_DISABLED
CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21, WS_DISABLED
- AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
- AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
- AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
- AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
- AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
- AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
+ AUTOCHECKBOX "Taakbalk &vergrendelen", IDC_TASKBARPROP_LOCK, 13,45,200,10, WS_DISABLED
+ AUTOCHECKBOX "Taakbalk a&utomatisch verbergen", IDC_TASKBARPROP_HIDE, 13,58,200,10, WS_DISABLED
+ AUTOCHECKBOX "Taakbalk altijd o&p voorgrond weergeven", IDC_TASKBARPROP_ONTOP, 13,71,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Gelijksoortige knoppen gegroepeerd weergeven", IDC_TASKBARPROP_GROUP, 13,84,200,10, WS_DISABLED
+ AUTOCHECKBOX "Werkbalk &Snel starten weergeven", IDC_TASKBARPROP_SHOWQL, 13,97,200,10, WS_DISABLED
+ AUTOCHECKBOX "Venstervoorbeelden (miniatuurweergaven) &weergeven", IDC_TASKBARPROP_WNDPREV, 13,110,200,10, WS_DISABLED
END
IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Start Menu"
+CAPTION "Menu Start"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
- AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
- LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
- PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
- AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
- LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
- PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+ AUTORADIOBUTTON "&Menu Start", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+ LTEXT "Deze menustijl biedt u eenvoudige toegang tot uw mappen, favoriete programma's en zoekopdrachten.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+ PUSHBUTTON "Aan&passen...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+ AUTORADIOBUTTON "&Klassiek menu Start", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+ LTEXT "Deze menustijl biedt u de weergave en functionaliteit van vorige versies van Windows.",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Aanpassen...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42
- AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
- AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+ AUTOCHECKBOX "Een lijst met onlangs geopende &bestanden opslaan en weergeven", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Een lijst met onlangs geopende &programma's opslaan en weergeven",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
END
IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Notification Area"
+CAPTION "Systeemvak"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
- GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
- LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
- AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
- PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
- GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
- LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
- AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+ GROUPBOX "Pictogrammen", IDC_STATIC, 6,33,240,58, WS_DISABLED
+ LTEXT "U kunt het systeemvak opruimen door pictogrammen te verbergen waarop u recentelijk niet hebt geklikt.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Inactieve pictogrammen verbergen", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+ PUSHBUTTON "&Aanpassen...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+ GROUPBOX "Systeempictogrammen", IDC_STATIC, 6,97,240,84, WS_DISABLED
+ LTEXT "Selecteer welke systeempictogrammen altijd worden weergegeven.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+ AUTOCHECKBOX "&Klok", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
- AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
- AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Netwerk", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+ AUTOCHECKBOX "&Energie", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
END
IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Toolbars"
+CAPTION "Werkbalken"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
- LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+ LTEXT "Selecteert u de werkbalken welke aan de taakbalk toegevoegd moeten worden.", IDC_STATIC, 7,7,223,12, WS_DISABLED
CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
END
STRINGTABLE DISCARDABLE
BEGIN
- IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+ IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taakbalk en menu Start eigenschappen"
END
diff --git a/reactos/base/shell/explorer/shell/mainframe.cpp b/reactos/base/shell/explorer/shell/mainframe.cpp
index a70c1bf91ac..c68fe221d49 100644
--- a/reactos/base/shell/explorer/shell/mainframe.cpp
+++ b/reactos/base/shell/explorer/shell/mainframe.cpp
@@ -153,6 +153,11 @@ MainFrameBase::MainFrameBase(HWND hwnd)
: super(hwnd)
{
HDC hDC = GetDC(NULL);
+#ifndef _NO_REBAR
+ //static WCHAR Title1[] = TEXT("Toolbar");
+ static WCHAR Title2[] = TEXT("Address :");
+#endif
+
if (hDC)
{
DWORD ilMask;
@@ -264,7 +269,7 @@ MainFrameBase::MainFrameBase(HWND hwnd)
rbBand.cyMaxChild = 0;
rbBand.cyIntegral = btn_hgt;
- rbBand.lpText = NULL;//TEXT("Toolbar");
+ rbBand.lpText = NULL;//Title1
rbBand.hwndChild = _htoolbar;
rbBand.cxMinChild = 0;
rbBand.cyMinChild = btn_hgt;
@@ -273,7 +278,7 @@ MainFrameBase::MainFrameBase(HWND hwnd)
rbBand.fStyle &= ~RBBS_HIDETITLE;
rbBand.fStyle |= RBBS_BREAK;
- rbBand.lpText = TEXT("Address :");
+ rbBand.lpText = Title2;
rbBand.hwndChild = _haddrcombo;
rbBand.cxMinChild = 0;
rbBand.cyMinChild = btn_hgt;
diff --git a/reactos/base/shell/explorer/shell/pane.cpp b/reactos/base/shell/explorer/shell/pane.cpp
index 154a9c5b5e2..5320b3db24a 100644
--- a/reactos/base/shell/explorer/shell/pane.cpp
+++ b/reactos/base/shell/explorer/shell/pane.cpp
@@ -42,7 +42,7 @@ enum IMAGE {
#define IMAGE_HEIGHT 13
-static const LPTSTR g_pos_names[COLUMNS] = {
+static const TCHAR* g_pos_names[COLUMNS] = {
TEXT(""), /* symbol */
TEXT("Name"),
TEXT("Type"),
@@ -141,7 +141,7 @@ bool Pane::create_header(HWND hparent, int id)
hdi.mask = HDI_TEXT|HDI_WIDTH|HDI_FORMAT;
for(int idx=0; idxcx-_taskbar_pos-quicklaunch_width-(notifyarea_width+1);
+ rbBand.cxMinChild = 50;
rbBand.wID = IDW_TASKTOOLBAR;
SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
#endif
diff --git a/reactos/base/shell/explorer/taskbar/quicklaunch.cpp b/reactos/base/shell/explorer/taskbar/quicklaunch.cpp
index ee973c764bd..90bc5d8fc82 100644
--- a/reactos/base/shell/explorer/taskbar/quicklaunch.cpp
+++ b/reactos/base/shell/explorer/taskbar/quicklaunch.cpp
@@ -154,8 +154,6 @@ void QuickLaunchBar::AddShortcuts()
}
DeleteDC(hdc);
- SendMessage(_hwnd, TB_INSERTBUTTON, INT_MAX, (LPARAM)&sep);
-
for(Entry*entry=_dir->_down; entry; entry=entry->_next) {
// hide files like "desktop.ini"
if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c
index ae7405a00b4..6dcfe57e596 100644
--- a/reactos/base/system/services/rpcserver.c
+++ b/reactos/base/system/services/rpcserver.c
@@ -5084,7 +5084,7 @@ DWORD RFunction55(
}
-void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
+void __RPC_FAR * __RPC_USER midl_user_allocate(SIZE_T len)
{
return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
}
diff --git a/reactos/base/system/winlogon/winlogon.c b/reactos/base/system/winlogon/winlogon.c
index 7a10e904c12..79535666a82 100644
--- a/reactos/base/system/winlogon/winlogon.c
+++ b/reactos/base/system/winlogon/winlogon.c
@@ -34,7 +34,7 @@ PlayLogonSoundThread(
DWORD dwSize = sizeof(szBuffer);
HMODULE hLibrary;
SERVICE_STATUS_PROCESS Info;
- typedef BOOL WINAPI (*PLAYSOUNDW)(LPCWSTR,HMODULE,DWORD);
+ typedef BOOL (WINAPI *PLAYSOUNDW)(LPCWSTR,HMODULE,DWORD);
PLAYSOUNDW Play;
ULONG Index = 0;
@@ -65,7 +65,7 @@ PlayLogonSoundThread(
if (!hSCManager)
ExitThread(0);;
- hService = OpenServiceW(hSCManager, L"sysaudio", GENERIC_READ);
+ hService = OpenServiceW(hSCManager, L"wdmaud", GENERIC_READ);
if (!hService)
{
CloseServiceHandle(hSCManager);
diff --git a/reactos/baseaddress.rbuild b/reactos/baseaddress.rbuild
index b68e4a567c4..5ec3e97f213 100644
--- a/reactos/baseaddress.rbuild
+++ b/reactos/baseaddress.rbuild
@@ -6,6 +6,7 @@
+
@@ -21,6 +22,7 @@
+
@@ -107,6 +109,7 @@
+
diff --git a/reactos/boot/bootdata/bootcdregtest/bootcdregtest.rbuild b/reactos/boot/bootdata/bootcdregtest/bootcdregtest.rbuild
index 2ca7398f23c..f3b85391618 100644
--- a/reactos/boot/bootdata/bootcdregtest/bootcdregtest.rbuild
+++ b/reactos/boot/bootdata/bootcdregtest/bootcdregtest.rbuild
@@ -1,5 +1,6 @@
-
+
isobtrt
+ unattend.inf
diff --git a/reactos/boot/bootdata/bootdata.rbuild b/reactos/boot/bootdata/bootdata.rbuild
index 732da3f8348..205bcefc192 100644
--- a/reactos/boot/bootdata/bootdata.rbuild
+++ b/reactos/boot/bootdata/bootdata.rbuild
@@ -11,7 +11,7 @@
hivesft_$(ARCH).inf
hivesys_$(ARCH).inf
txtsetup.sif
- unattend.inf
+ unattend.inf
diff --git a/reactos/boot/bootdata/hivedef_arm.inf b/reactos/boot/bootdata/hivedef_arm.inf
index 5cdbcd9761c..93e8b57d4f6 100644
--- a/reactos/boot/bootdata/hivedef_arm.inf
+++ b/reactos/boot/bootdata/hivedef_arm.inf
@@ -1504,4 +1504,158 @@ HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0"
HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php"
HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\"
+; Sound Schemes
+HKCU,"AppEvents",,0x00000012
+HKCU,"AppEvents\Schemes","",0x00000000,".Default"
+HKCU,"AppEvents\Schemes\Apps",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default","",0x00000000,"ReactOS"
+HKCU,"AppEvents\Schemes\Apps\.Default","DispFileName",0x00000000,"@mmsys.cpl,-5856"
+HKCU,"AppEvents\Schemes\Apps\.Default\.Default",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\.Default\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\.Default\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Close",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\Close\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Close\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Maximize",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\Maximize\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Maximize\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Minimize",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\Minimize\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Minimize\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Open",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\Open\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Open\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart\.Current","",0x00020000,"%SystemRoot%\media\ReactOS_LogOn.wav"
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart\.Default","",0x00020000,"%SystemRoot%\media\ReactOS_LogOn.wav"
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\Explorer","",0x00000002,"ReactOS Explorer"
+HKCU,"AppEvents\Schemes\Apps\Explorer","DispFileName",0x00000000,"@mmsys.cpl,-5854"
+HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Names",,0x00000012
+HKCU,"AppEvents\Schemes\Names\.Default","",0x00000002,"ReactOS Default"
+HKCU,"AppEvents\Schemes\Names\.None","",0x00000002,"No sounds"
+
+HKCU,"AppEvents\EventLabels",,0x00000012
+HKCU,"AppEvents\EventLabels\.Default","",0x00000000,"Default Beep"
+HKCU,"AppEvents\EventLabels\.Default","DispFileName",0x00000000,"@mmsys.cpl,-5824"
+HKCU,"AppEvents\EventLabels\AppGPFault","",0x00000000,"Program error"
+HKCU,"AppEvents\EventLabels\AppGPFault","DispFileName",0x00000000,"@mmsys.cpl,-5825"
+HKCU,"AppEvents\EventLabels\Close","",0x00000000,"Close program"
+HKCU,"AppEvents\EventLabels\Close","DispFileName",0x00000000,"@mmsys.cpl,-5826"
+HKCU,"AppEvents\EventLabels\CriticalBatteryAlarm","",0x00000000,"Critical Battery Alarm"
+HKCU,"AppEvents\EventLabels\CriticalBatteryAlarm","DispFileName",0x00000000,"@mmsys.cpl,-5827"
+HKCU,"AppEvents\EventLabels\DeviceConnect","",0x00000000,"Device Connect"
+HKCU,"AppEvents\EventLabels\DeviceConnect","DispFileName",0x00000000,"@mmsys.cpl,-5828"
+HKCU,"AppEvents\EventLabels\DeviceDisconnect","",0x00000000,"Device Disconnect"
+HKCU,"AppEvents\EventLabels\DeviceDisconnect","DispFileName",0x00000000,"@mmsys.cpl,-5829"
+HKCU,"AppEvents\EventLabels\DeviceFail","",0x00000000,"Device Failed to Connect"
+HKCU,"AppEvents\EventLabels\DeviceFail","DispFileName",0x00000000,"@mmsys.cpl,-5830"
+HKCU,"AppEvents\EventLabels\EmptyRecycleBin","",0x00000000,"Empty Recycle Bin"
+HKCU,"AppEvents\EventLabels\EmptyRecycleBin","DispFileName",0x00000000,"@mmsys.cpl,-5831"
+HKCU,"AppEvents\EventLabels\LowBatteryAlarm","",0x00000000,"Low Battery Alarm"
+HKCU,"AppEvents\EventLabels\LowBatteryAlarm","DispFileName",0x00000000,"@mmsys.cpl,-5832"
+HKCU,"AppEvents\EventLabels\Maximize","",0x00000000,"Maximize"
+HKCU,"AppEvents\EventLabels\Maximize","DispFileName",0x00000000,"@mmsys.cpl,-5833"
+HKCU,"AppEvents\EventLabels\MenuCommand","",0x00000000,"Menu command"
+HKCU,"AppEvents\EventLabels\MenuCommand","DispFileName",0x00000000,"@mmsys.cpl,-5834"
+HKCU,"AppEvents\EventLabels\MenuPopup","",0x00000000,"Menu popup"
+HKCU,"AppEvents\EventLabels\MenuPopup","DispFileName",0x00000000,"@mmsys.cpl,-5835"
+HKCU,"AppEvents\EventLabels\Minimize","",0x00000000,"Minimize"
+HKCU,"AppEvents\EventLabels\Minimize","DispFileName",0x00000000,"@mmsys.cpl,-5836"
+HKCU,"AppEvents\EventLabels\MailBeep","",0x00000000,"New Mail Notification"
+HKCU,"AppEvents\EventLabels\MailBeep","DispFileName",0x00000000,"@mmsys.cpl,-5837"
+HKCU,"AppEvents\EventLabels\Navigating","",0x00000000,"Start Navigation"
+HKCU,"AppEvents\EventLabels\Navigating","DispFileName",0x00000000,"@mmsys.cpl,-5838"
+HKCU,"AppEvents\EventLabels\Open","",0x00000000,"Open program"
+HKCU,"AppEvents\EventLabels\Open","DispFileName",0x00000000,"@mmsys.cpl,-5839"
+HKCU,"AppEvents\EventLabels\PrintComplete","",0x00000000,"Print Complete"
+HKCU,"AppEvents\EventLabels\PrintComplete","DispFileName",0x00000000,"@mmsys.cpl,-5840"
+HKCU,"AppEvents\EventLabels\RestoreDown","",0x00000000,"Restore Down"
+HKCU,"AppEvents\EventLabels\RestoreDown","DispFileName",0x00000000,"@mmsys.cpl,-5841"
+HKCU,"AppEvents\EventLabels\RestoreUp","",0x00000000,"Restore Up"
+HKCU,"AppEvents\EventLabels\RestoreUp","DispFileName",0x00000000,"@mmsys.cpl,-5842"
+HKCU,"AppEvents\EventLabels\SystemAsterisk","",0x00000000,"Asterisk"
+HKCU,"AppEvents\EventLabels\SystemAsterisk","DispFileName",0x00000000,"@mmsys.cpl,-5843"
+HKCU,"AppEvents\EventLabels\SystemExclamation","",0x00000000,"Exclamation"
+HKCU,"AppEvents\EventLabels\SystemExclamation","DispFileName",0x00000000,"@mmsys.cpl,-5845"
+HKCU,"AppEvents\EventLabels\SystemExit","",0x00000000,"Exit ReactOS"
+HKCU,"AppEvents\EventLabels\SystemExit","DispFileName",0x00000000,"@mmsys.cpl,-5846"
+HKCU,"AppEvents\EventLabels\SystemHand","",0x00000000,"Critical Stop"
+HKCU,"AppEvents\EventLabels\SystemHand","DispFileName",0x00000000,"@mmsys.cpl,-5847"
+HKCU,"AppEvents\EventLabels\SystemNotification","",0x00000000,"System Notification"
+HKCU,"AppEvents\EventLabels\SystemNotification","DispFileName",0x00000000,"@mmsys.cpl,-5848"
+HKCU,"AppEvents\EventLabels\SystemQuestion","",0x00000000,"Question"
+HKCU,"AppEvents\EventLabels\SystemQuestion","DispFileName",0x00000000,"@mmsys.cpl,-5849"
+HKCU,"AppEvents\EventLabels\SystemStart","",0x00000000,"Start ReactOS"
+HKCU,"AppEvents\EventLabels\SystemStart","DispFileName",0x00000000,"@mmsys.cpl,-5850"
+HKCU,"AppEvents\EventLabels\WindowsLogoff","",0x00000000,"ReactOS Logoff"
+HKCU,"AppEvents\EventLabels\WindowsLogoff","DispFileName",0x00000000,"@mmsys.cpl,-5852"
+HKCU,"AppEvents\EventLabels\WindowsLogon","",0x00000000,"ReactOS Logon"
+HKCU,"AppEvents\EventLabels\WindowsLogon","DispFileName",0x00000000,"@mmsys.cpl,-5853"
+
; EOF
diff --git a/reactos/boot/bootdata/hivedef_i386.inf b/reactos/boot/bootdata/hivedef_i386.inf
index 7be1e27bffe..ed70cd50af8 100644
--- a/reactos/boot/bootdata/hivedef_i386.inf
+++ b/reactos/boot/bootdata/hivedef_i386.inf
@@ -1522,4 +1522,158 @@ HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0"
HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php"
HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\"
+; Sound Schemes
+HKCU,"AppEvents",,0x00000012
+HKCU,"AppEvents\Schemes","",0x00000000,".Default"
+HKCU,"AppEvents\Schemes\Apps",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default","",0x00000000,"ReactOS"
+HKCU,"AppEvents\Schemes\Apps\.Default","DispFileName",0x00000000,"@mmsys.cpl,-5856"
+HKCU,"AppEvents\Schemes\Apps\.Default\.Default",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\.Default\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\.Default\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Close",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\Close\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Close\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Maximize",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\Maximize\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Maximize\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Minimize",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\Minimize\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Minimize\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Open",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\Open\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\Open\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart\.Current","",0x00020000,"%SystemRoot%\media\ReactOS_LogOn.wav"
+HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart\.Default","",0x00020000,"%SystemRoot%\media\ReactOS_LogOn.wav"
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\Explorer","",0x00000002,"ReactOS Explorer"
+HKCU,"AppEvents\Schemes\Apps\Explorer","DispFileName",0x00000000,"@mmsys.cpl,-5854"
+HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating",,0x00000012
+HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating\.Current","",0x00020000,""
+HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating\.Default","",0x00020000,""
+HKCU,"AppEvents\Schemes\Names",,0x00000012
+HKCU,"AppEvents\Schemes\Names\.Default","",0x00000002,"ReactOS Default"
+HKCU,"AppEvents\Schemes\Names\.None","",0x00000002,"No sounds"
+
+HKCU,"AppEvents\EventLabels",,0x00000012
+HKCU,"AppEvents\EventLabels\.Default","",0x00000000,"Default Beep"
+HKCU,"AppEvents\EventLabels\.Default","DispFileName",0x00000000,"@mmsys.cpl,-5824"
+HKCU,"AppEvents\EventLabels\AppGPFault","",0x00000000,"Program error"
+HKCU,"AppEvents\EventLabels\AppGPFault","DispFileName",0x00000000,"@mmsys.cpl,-5825"
+HKCU,"AppEvents\EventLabels\Close","",0x00000000,"Close program"
+HKCU,"AppEvents\EventLabels\Close","DispFileName",0x00000000,"@mmsys.cpl,-5826"
+HKCU,"AppEvents\EventLabels\CriticalBatteryAlarm","",0x00000000,"Critical Battery Alarm"
+HKCU,"AppEvents\EventLabels\CriticalBatteryAlarm","DispFileName",0x00000000,"@mmsys.cpl,-5827"
+HKCU,"AppEvents\EventLabels\DeviceConnect","",0x00000000,"Device Connect"
+HKCU,"AppEvents\EventLabels\DeviceConnect","DispFileName",0x00000000,"@mmsys.cpl,-5828"
+HKCU,"AppEvents\EventLabels\DeviceDisconnect","",0x00000000,"Device Disconnect"
+HKCU,"AppEvents\EventLabels\DeviceDisconnect","DispFileName",0x00000000,"@mmsys.cpl,-5829"
+HKCU,"AppEvents\EventLabels\DeviceFail","",0x00000000,"Device Failed to Connect"
+HKCU,"AppEvents\EventLabels\DeviceFail","DispFileName",0x00000000,"@mmsys.cpl,-5830"
+HKCU,"AppEvents\EventLabels\EmptyRecycleBin","",0x00000000,"Empty Recycle Bin"
+HKCU,"AppEvents\EventLabels\EmptyRecycleBin","DispFileName",0x00000000,"@mmsys.cpl,-5831"
+HKCU,"AppEvents\EventLabels\LowBatteryAlarm","",0x00000000,"Low Battery Alarm"
+HKCU,"AppEvents\EventLabels\LowBatteryAlarm","DispFileName",0x00000000,"@mmsys.cpl,-5832"
+HKCU,"AppEvents\EventLabels\Maximize","",0x00000000,"Maximize"
+HKCU,"AppEvents\EventLabels\Maximize","DispFileName",0x00000000,"@mmsys.cpl,-5833"
+HKCU,"AppEvents\EventLabels\MenuCommand","",0x00000000,"Menu command"
+HKCU,"AppEvents\EventLabels\MenuCommand","DispFileName",0x00000000,"@mmsys.cpl,-5834"
+HKCU,"AppEvents\EventLabels\MenuPopup","",0x00000000,"Menu popup"
+HKCU,"AppEvents\EventLabels\MenuPopup","DispFileName",0x00000000,"@mmsys.cpl,-5835"
+HKCU,"AppEvents\EventLabels\Minimize","",0x00000000,"Minimize"
+HKCU,"AppEvents\EventLabels\Minimize","DispFileName",0x00000000,"@mmsys.cpl,-5836"
+HKCU,"AppEvents\EventLabels\MailBeep","",0x00000000,"New Mail Notification"
+HKCU,"AppEvents\EventLabels\MailBeep","DispFileName",0x00000000,"@mmsys.cpl,-5837"
+HKCU,"AppEvents\EventLabels\Navigating","",0x00000000,"Start Navigation"
+HKCU,"AppEvents\EventLabels\Navigating","DispFileName",0x00000000,"@mmsys.cpl,-5838"
+HKCU,"AppEvents\EventLabels\Open","",0x00000000,"Open program"
+HKCU,"AppEvents\EventLabels\Open","DispFileName",0x00000000,"@mmsys.cpl,-5839"
+HKCU,"AppEvents\EventLabels\PrintComplete","",0x00000000,"Print Complete"
+HKCU,"AppEvents\EventLabels\PrintComplete","DispFileName",0x00000000,"@mmsys.cpl,-5840"
+HKCU,"AppEvents\EventLabels\RestoreDown","",0x00000000,"Restore Down"
+HKCU,"AppEvents\EventLabels\RestoreDown","DispFileName",0x00000000,"@mmsys.cpl,-5841"
+HKCU,"AppEvents\EventLabels\RestoreUp","",0x00000000,"Restore Up"
+HKCU,"AppEvents\EventLabels\RestoreUp","DispFileName",0x00000000,"@mmsys.cpl,-5842"
+HKCU,"AppEvents\EventLabels\SystemAsterisk","",0x00000000,"Asterisk"
+HKCU,"AppEvents\EventLabels\SystemAsterisk","DispFileName",0x00000000,"@mmsys.cpl,-5843"
+HKCU,"AppEvents\EventLabels\SystemExclamation","",0x00000000,"Exclamation"
+HKCU,"AppEvents\EventLabels\SystemExclamation","DispFileName",0x00000000,"@mmsys.cpl,-5845"
+HKCU,"AppEvents\EventLabels\SystemExit","",0x00000000,"Exit ReactOS"
+HKCU,"AppEvents\EventLabels\SystemExit","DispFileName",0x00000000,"@mmsys.cpl,-5846"
+HKCU,"AppEvents\EventLabels\SystemHand","",0x00000000,"Critical Stop"
+HKCU,"AppEvents\EventLabels\SystemHand","DispFileName",0x00000000,"@mmsys.cpl,-5847"
+HKCU,"AppEvents\EventLabels\SystemNotification","",0x00000000,"System Notification"
+HKCU,"AppEvents\EventLabels\SystemNotification","DispFileName",0x00000000,"@mmsys.cpl,-5848"
+HKCU,"AppEvents\EventLabels\SystemQuestion","",0x00000000,"Question"
+HKCU,"AppEvents\EventLabels\SystemQuestion","DispFileName",0x00000000,"@mmsys.cpl,-5849"
+HKCU,"AppEvents\EventLabels\SystemStart","",0x00000000,"Start ReactOS"
+HKCU,"AppEvents\EventLabels\SystemStart","DispFileName",0x00000000,"@mmsys.cpl,-5850"
+HKCU,"AppEvents\EventLabels\WindowsLogoff","",0x00000000,"ReactOS Logoff"
+HKCU,"AppEvents\EventLabels\WindowsLogoff","DispFileName",0x00000000,"@mmsys.cpl,-5852"
+HKCU,"AppEvents\EventLabels\WindowsLogon","",0x00000000,"ReactOS Logon"
+HKCU,"AppEvents\EventLabels\WindowsLogon","DispFileName",0x00000000,"@mmsys.cpl,-5853"
+
; EOF
diff --git a/reactos/boot/bootdata/hivesft_arm.inf b/reactos/boot/bootdata/hivesft_arm.inf
index 1d565b6c16c..d34bf15efcc 100644
--- a/reactos/boot/bootdata/hivesft_arm.inf
+++ b/reactos/boot/bootdata/hivesft_arm.inf
@@ -61,6 +61,7 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","wavemapper",0x000
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","midi",0x00000000,"beepmidi.dll"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msadpcm",0x00000000,"msadp32.acm"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msg711",0x00000000,"msg711.acm"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msgsm610",0x00000000,"msgsm32.acm"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.imaadpcm",0x00000000,"imaadp32.acm"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.winemp3",0x00000000,"winemp3.acm"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.cvid",0x00000000,"iccvid.dll"
@@ -72,11 +73,38 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI32","CDAudio",0x00000002,"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI32","Sequencer",0x00000002,"mciseq.dll"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI32","WaveAudio",0x00000002,"mciwave.dll"
-HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","avi",0x00000002,"avivideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","aifc",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","asf",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","asx",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","au",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","avi",0x00000002,"AVIVideo"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","cda",0x00000002,"CDAudio"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","lsf",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","lsx",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","m1v",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","m3u",0x00000002,"MPEGVideo"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mid",0x00000002,"Sequencer"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","midi",0x00000002,"Sequencer"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mp2",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mp2v",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mp3",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpa",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpe",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpeg",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpg",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpv",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpv2",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","rmi",0x00000002,"MPEGVideo"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","rmi",0x00000002,"Sequencer"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","snd",0x00000002,"MPEGVideo"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wav",0x00000002,"WaveAudio"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wax",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wm",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wma",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wmp",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wmv",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wmx",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wvx",0x00000002,"MPEGVideo"
; Mesa OpenGL Driver
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers","DefaultDriver",0x00000000,"Mesa"
diff --git a/reactos/boot/bootdata/hivesft_i386.inf b/reactos/boot/bootdata/hivesft_i386.inf
index ef2d5fe8333..870dc7aca19 100644
--- a/reactos/boot/bootdata/hivesft_i386.inf
+++ b/reactos/boot/bootdata/hivesft_i386.inf
@@ -66,6 +66,7 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","wavemapper",0x000
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","midi",0x00000000,"beepmidi.dll"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msadpcm",0x00000000,"msadp32.acm"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msg711",0x00000000,"msg711.acm"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msgsm610",0x00000000,"msgsm32.acm"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.imaadpcm",0x00000000,"imaadp32.acm"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.winemp3",0x00000000,"winemp3.acm"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.cvid",0x00000000,"iccvid.dll"
@@ -77,11 +78,38 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI32","CDAudio",0x00000002,"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI32","Sequencer",0x00000002,"mciseq.dll"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI32","WaveAudio",0x00000002,"mciwave.dll"
-HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","avi",0x00000002,"avivideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","aifc",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","asf",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","asx",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","au",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","avi",0x00000002,"AVIVideo"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","cda",0x00000002,"CDAudio"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","lsf",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","lsx",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","m1v",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","m3u",0x00000002,"MPEGVideo"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mid",0x00000002,"Sequencer"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","midi",0x00000002,"Sequencer"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mp2",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mp2v",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mp3",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpa",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpe",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpeg",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpg",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpv",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","mpv2",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","rmi",0x00000002,"MPEGVideo"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","rmi",0x00000002,"Sequencer"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","snd",0x00000002,"MPEGVideo"
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wav",0x00000002,"WaveAudio"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wax",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wm",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wma",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wmp",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wmv",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wmx",0x00000002,"MPEGVideo"
+HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions","wvx",0x00000002,"MPEGVideo"
; Mesa OpenGL Driver
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers","DefaultDriver",0x00000000,"Mesa"
@@ -1101,6 +1129,9 @@ HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Controls Folder\Device\shellex\P
; deskmon.dll shell extension
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Controls Folder\Device\shellex\PropertySheetHandlers\Display Monitor CPL Extension","",0x00000000,"{42071713-76d4-11d1-8b24-00a0c9068ff3}"
+HKLM,"SOFTWARE\Microsoft\Ole","EnableDCOM",0x00000000,"Y"
+HKLM,"SOFTWARE\Microsoft\Ole","EnableRemoteConnect",0x00000000,"N"
+
; Keyboard layout switcher
;HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Run","kbswitch",0x00000000,"kbswitch.exe"
diff --git a/reactos/boot/bootdata/livecdregtest/livecdregtest.rbuild b/reactos/boot/bootdata/livecdregtest/livecdregtest.rbuild
index 9ed5e2954ba..52836fabe65 100644
--- a/reactos/boot/bootdata/livecdregtest/livecdregtest.rbuild
+++ b/reactos/boot/bootdata/livecdregtest/livecdregtest.rbuild
@@ -1,5 +1,5 @@
-
+
isobtrt
\ No newline at end of file
diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff
index eb969c325d4..b229a3a7243 100644
--- a/reactos/boot/bootdata/packages/reactos.dff
+++ b/reactos/boot/bootdata/packages/reactos.dff
@@ -42,16 +42,10 @@ Signature = "$ReactOS$"
;base\applications\cmdutils\more\more.exe 1
;base\applications\cmdutils\xcopy\xcopy.exe 1
;base\applications\control\control.exe 1
-;base\applications\downloader\downloader.exe 1
-;base\applications\downloader\downloader.xml 1
;base\applications\dxdiag\dxdiag.exe 1
-;base\applications\mscutils\devmgmt\devmgmt.exe 1
;base\applications\mscutils\eventvwr\eventvwr.exe 1
-;base\applications\games\solitaire\sol.exe 1
;base\applications\games\winemine\winemine.exe 1
-;base\applications\hh\hh.exe 4
;base\applications\kbswitch\kbswitch.exe 1
-;base\applications\kbswitch\kbsdll\kbsdll.dll 1
;base\applications\logoff\logoff.exe 1
;base\applications\mplay32\mplay32.exe 1
;base\applications\msconfig\msconfig.exe 1
@@ -68,6 +62,8 @@ Signature = "$ReactOS$"
;base\applications\network\tracert\tracert.exe 1
;base\applications\network\whois\whois.exe 1
;base\applications\notepad\notepad.exe 1
+;base\applications\paint\paint.exe 1
+;base\applications\rapps\rapps.exe 1
;base\applications\regedit\regedit.exe 4
;base\applications\regedit\clb\clb.dll 1
;base\applications\regedt32\regedt32.exe 1
@@ -79,6 +75,7 @@ Signature = "$ReactOS$"
;base\applications\sndvol32\sndvol32.exe 1
;base\applications\taskmgr\taskmgr.exe 1
;base\applications\winhlp32\winhlp32.exe 4
+;base\applications\winver\winver.exe 1
;base\applications\wordpad\wordpad.exe 1
;base\applications\write\write.exe 1
@@ -251,7 +248,9 @@ base\services\svchost\svchost.exe 1
;dll\win32\actxprxy\actxprxy.dll 1
;dll\win32\atl\atl.dll 1
;dll\win32\authz\authz.dll 1
+;dll\win32\avicap32\avicap32.dll 1
;dll\win32\avifil32\avifil32.dll 1
+;dll\win32\bcrypt\bcrypt.dll 1
;dll\win32\beepmidi\beepmidi.dll 1
;dll\win32\browseui\browseui.dll 1
;dll\win32\cabinet\cabinet.dll 1
@@ -284,6 +283,7 @@ base\services\svchost\svchost.exe 1
;dll\win32\hhctrl.ocx\hhctrl.ocx 1
;dll\win32\hid\hid.dll 1
;dll\win32\hlink\hlink.dll 1
+;dll\win32\hnetcfg\hnetcfg.dll 1
;dll\win32\httpapi\httpapi.dll 1
;dll\win32\iccvid\iccvid.dll 1
;dll\win32\icmp\icmp.dll 1
@@ -316,6 +316,7 @@ base\services\svchost\svchost.exe 1
;dll\win32\mpr\mpr.dll 1
;dll\win32\mprapi\mprapi.dll 1
;dll\win32\msacm32\msacm32.dll 1
+;dll\win32\msacm32\msacm32.drv\msacm32.drv 1
;dll\win32\msadp32.acm\msadp32.acm 1
;dll\win32\msafd\msafd.dll 1
;dll\win32\mscat32\mscat32.dll 1
@@ -325,6 +326,7 @@ base\services\svchost\svchost.exe 1
;dll\win32\msftedit\msftedit.dll 1
;dll\win32\msg711.acm\msg711.acm 1
;dll\win32\msgina\msgina.dll 1
+;dll\win32\msgsm32.acm\msgsm32.acm 1
;dll\win32\mshtml\mshtml.dll 1
;dll\win32\mshtml.tlb\mshtml.tlb 1
;dll\win32\msi\msi.dll 1
@@ -351,6 +353,7 @@ base\services\svchost\svchost.exe 1
;dll\win32\netshell\netshell.dll 1
;dll\win32\newdev\newdev.dll 1
;dll\win32\ntdsapi\ntdsapi.dll 1
+;dll\win32\ntlanman\ntlanman.dll 1
;dll\win32\ntmarta\ntmarta.dll 1
;dll\win32\ntprint\ntprint.dll 1
;dll\win32\objsel\objsel.dll 1
@@ -411,6 +414,7 @@ base\services\svchost\svchost.exe 1
;dll\win32\sti\sti.dll 1
;dll\win32\sxs\sxs.dll 1
;dll\win32\syssetup\syssetup.dll 1
+;dll\win32\t2embed\t2embed.dll 1
;dll\win32\tapi32\tapi32.dll 1
;dll\win32\tapiui\tapiui.dll 1
;dll\win32\traffic\traffic.dll 1
@@ -428,6 +432,7 @@ base\services\svchost\svchost.exe 1
;dll\win32\uxtheme\uxtheme.dll 1
;dll\win32\vdmdbg\vdmdbg.dll 1
;dll\win32\version\version.dll 1
+;dll\win32\windowscodecs\windowscodecs.dll 1
;dll\win32\winemp3.acm\winemp3.acm 1
;dll\win32\winfax\winfax.dll 1
;dll\win32\winhttp\winhttp.dll 1
@@ -435,7 +440,6 @@ base\services\svchost\svchost.exe 1
;dll\win32\winmm\winmm.dll 1
;dll\win32\winspool\winspool.drv 1
;dll\win32\winsta\winsta.dll 1
-;dll\win32\wintab32\wintab32.dll 1
;dll\win32\wlanapi\wlanapi.dll 1
;dll\win32\wintrust\wintrust.dll 1
;dll\win32\wldap32\wldap32.dll 1
@@ -447,8 +451,12 @@ base\services\svchost\svchost.exe 1
;dll\win32\wsock32\wsock32.dll 1
;dll\win32\wtsapi32\wtsapi32.dll 1
;dll\win32\wuapi\wuapi.dll 1
+;dll\win32\xinput1_1\xinput1_1.dll 1
+;dll\win32\xinput1_2\xinput1_2.dll 1
+;dll\win32\xinput1_3\xinput1_3.dll 1
+;dll\win32\xinput9_1_0\xinput9_1_0.dll 1
+;dll\win32\xmllite\xmllite.dll 1
;dll\win32\winmm\midimap\midimap.dll 1
-;dll\win32\winmm\wavemap\msacm32.drv 1 optional
;dll\win32\wdmaud.drv\wdmaud.drv 1
; Shell Extensions
@@ -648,15 +656,19 @@ modules\optional\kvmnet.inf 6 optional
modules\optional\kvmnet.sys 2 optional
modules\optional\mfc42.dll 1 optional
modules\optional\mfc42u.dll 1 optional
+modules\optional\mfc71.dll 1 optional
+modules\optional\mfc71u.dll 1 optional
modules\optional\msvbvm50.dll 1 optional
modules\optional\msvbvm60.dll 1 optional
modules\optional\msvcirt.dll 1 optional
+modules\optional\msvcp71.dll 1 optional
+modules\optional\msvcr71.dll 1 optional
modules\optional\Systema.ttf 3 optional
modules\optional\vmx_fb.dll 1 optional
modules\optional\vmx_mode.dll 1 optional
modules\optional\vmx_svga.inf 6 optional
modules\optional\vmx_svga.sys 2 optional
-modules\optional\wine_gecko-0.9.1.cab 4 optional
+modules\optional\wine_gecko-1.0.0-x86.cab 4 optional
; Rosapps
modules\rosapps\applications\screensavers\cylfrac\cylfrac.scr 1 optional
diff --git a/reactos/boot/bootdata/system.ini b/reactos/boot/bootdata/system.ini
index fd6d529b934..285e9fff87e 100644
--- a/reactos/boot/bootdata/system.ini
+++ b/reactos/boot/bootdata/system.ini
@@ -2,6 +2,7 @@
msacm.imaadpcm=imaadp32.acm
msacm.msadpcm=msadp32.acm
msacm.msg711=msg711.acm
+msacm.msgsm610=msgsm32.acm
msacm.winemp3=winemp3.acm
vidc.mrle=msrle32.dll
vidc.msvc=msvidc32.dll
diff --git a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c
index b334c3bbf34..0aad13b6e29 100644
--- a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c
+++ b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c
@@ -102,14 +102,6 @@ ArmHwDetect(VOID)
//
FldrCreateSystemKey(&RootNode);
- //
- // Write null component information
- //
- FldrSetComponentInformation(RootNode,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
//
// TODO:
// There's no such thing as "PnP" on embedded hardware.
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c
index b6b693ad742..2f800beb1d9 100644
--- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c
+++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c
@@ -236,24 +236,6 @@ DetectPnpBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
DPRINTM(DPRINT_HWDETECT, "MaxNodeSize %u NodeCount %u\n", NodeSize, NodeCount);
DPRINTM(DPRINT_HWDETECT, "Estimated buffer size %u\n", NodeSize * NodeCount);
- /* Create component key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BusKey);
- (*BusNumber)++;
-
- /* Set the component information */
- FldrSetComponentInformation(BusKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Set the identifier */
- FldrSetIdentifier(BusKey, "PNP BIOS");
-
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + (NodeSize * NodeCount);
PartialResourceList = MmHeapAlloc(Size);
@@ -319,16 +301,28 @@ DetectPnpBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
DPRINTM(DPRINT_HWDETECT, "Real buffer size: %u\n", PnpBufferSize);
DPRINTM(DPRINT_HWDETECT, "Resource size: %u\n", Size);
-
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
+
+ /* Create component key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "PNP BIOS",
+ PartialResourceList,
+ Size,
+ &BusKey);
+
+ (*BusNumber)++;
+
MmHeapFree(PartialResourceList);
}
-static VOID
-SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
- ULONG DriveNumber)
+static PCM_PARTIAL_RESOURCE_LIST
+GetHarddiskConfigurationData(ULONG DriveNumber, ULONG* pSize)
{
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
PCM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry;
@@ -336,6 +330,11 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
GEOMETRY Geometry;
ULONG Size;
+ //
+ // Initialize returned size
+ //
+ *pSize = 0;
+
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
sizeof(CM_DISK_GEOMETRY_DEVICE_DATA);
@@ -344,7 +343,7 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
{
DPRINTM(DPRINT_HWDETECT,
"Failed to allocate a full resource descriptor\n");
- return;
+ return NULL;
}
memset(PartialResourceList, 0, Size);
@@ -381,7 +380,7 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
{
DPRINTM(DPRINT_HWDETECT, "Reading disk geometry failed\n");
MmHeapFree(PartialResourceList);
- return;
+ return NULL;
}
DPRINTM(DPRINT_HWDETECT,
"Disk %x: %u Cylinders %u Heads %u Sectors %u Bytes\n",
@@ -391,8 +390,11 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
DiskGeometry->SectorsPerTrack,
DiskGeometry->BytesPerSector);
- FldrSetConfigurationData(DiskKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
+ //
+ // Return configuration data
+ //
+ *pSize = Size;
+ return PartialResourceList;
}
typedef struct tagDISKCONTEXT
@@ -449,19 +451,26 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
static LONG DiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
{
DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+ UCHAR* Ptr = (UCHAR*)Buffer;
+ ULONG i;
BOOLEAN ret;
*Count = 0;
if (N & (Context->SectorSize - 1))
return EINVAL;
- ret = MachDiskReadLogicalSectors(
- Context->DriveNumber,
- Context->SectorNumber + Context->SectorOffset,
- N / Context->SectorSize,
- Buffer);
- if (!ret)
- return EIO;
+ for (i = 0; i < N / Context->SectorSize; i++)
+ {
+ ret = MachDiskReadLogicalSectors(
+ Context->DriveNumber,
+ Context->SectorNumber + Context->SectorOffset + i,
+ 1,
+ (PVOID)DISKREADBUFFER);
+ if (!ret)
+ return EIO;
+ RtlCopyMemory(Ptr, (PVOID)DISKREADBUFFER, Context->SectorSize);
+ Ptr += Context->SectorSize;
+ }
*Count = N;
return ESUCCESS;
@@ -490,7 +499,7 @@ static const DEVVTBL DiskVtbl = {
};
static VOID
-SetHarddiskIdentifier(PCONFIGURATION_COMPONENT_DATA DiskKey,
+GetHarddiskIdentifier(PCHAR Identifier,
ULONG DriveNumber)
{
PMASTER_BOOT_RECORD Mbr;
@@ -498,7 +507,6 @@ SetHarddiskIdentifier(PCONFIGURATION_COMPONENT_DATA DiskKey,
ULONG i;
ULONG Checksum;
ULONG Signature;
- CHAR Identifier[20];
CHAR ArcName[256];
PARTITION_TABLE_ENTRY PartitionTableEntry;
@@ -572,9 +580,6 @@ SetHarddiskIdentifier(PCONFIGURATION_COMPONENT_DATA DiskKey,
Identifier[18] = 'A';
Identifier[19] = 0;
DPRINTM(DPRINT_HWDETECT, "Identifier: %s\n", Identifier);
-
- /* Set identifier */
- FldrSetIdentifier(DiskKey, Identifier);
}
static ULONG
@@ -640,19 +645,9 @@ DetectBiosFloppyPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey)
DiskResetController(FloppyNumber);
Ptr = GetInt1eTable();
-
- FldrCreateComponentKey(ControllerKey,
- L"FloppyDiskPeripheral",
- FloppyNumber,
- PeripheralClass,
- FloppyDiskPeripheral,
- &PeripheralKey);
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(PeripheralKey,
- Input | Output,
- FloppyNumber,
- 0xFFFFFFFF);
+ /* Set 'Identifier' value */
+ sprintf(Identifier, "FLOPPY%ld", FloppyNumber + 1);
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
sizeof(CM_FLOPPY_DEVICE_DATA);
@@ -685,21 +680,26 @@ DetectBiosFloppyPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey)
FloppyData->MaximumTrackValue = (FloppyType == 1) ? 39 : 79;
FloppyData->DataTransferRate = 0;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(PeripheralKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
+ FldrCreateComponentKey(ControllerKey,
+ PeripheralClass,
+ FloppyDiskPeripheral,
+ Input | Output,
+ FloppyNumber,
+ 0xFFFFFFFF,
+ Identifier,
+ PartialResourceList,
+ Size,
+ &PeripheralKey);
- /* Set 'Identifier' value */
- sprintf(Identifier, "FLOPPY%ld", FloppyNumber + 1);
- FldrSetIdentifier(PeripheralKey, Identifier);
+ MmHeapFree(PartialResourceList);
}
}
static VOID
-DetectBiosFloppyController(PCONFIGURATION_COMPONENT_DATA BusKey,
- PCONFIGURATION_COMPONENT_DATA ControllerKey)
+DetectBiosFloppyController(PCONFIGURATION_COMPONENT_DATA BusKey)
{
+ PCONFIGURATION_COMPONENT_DATA ControllerKey;
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
ULONG Size;
@@ -752,26 +752,35 @@ DetectBiosFloppyController(PCONFIGURATION_COMPONENT_DATA BusKey,
PartialDescriptor->u.Dma.Channel = 2;
PartialDescriptor->u.Dma.Port = 0;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
+ /* Create floppy disk controller */
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ DiskController,
+ Output | Input,
+ 0x0,
+ 0xFFFFFFFF,
+ NULL,
+ PartialResourceList,
+ Size,
+ &ControllerKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: DiskController\\0\n");
+
MmHeapFree(PartialResourceList);
if (FloppyCount) DetectBiosFloppyPeripheral(ControllerKey);
}
-static VOID
-DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
- PCONFIGURATION_COMPONENT_DATA BusKey)
+static PCONFIGURATION_COMPONENT_DATA
+DetectSystem(VOID)
{
+ PCONFIGURATION_COMPONENT_DATA SystemKey;
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
PCM_INT13_DRIVE_PARAMETER Int13Drives;
GEOMETRY Geometry;
- PCONFIGURATION_COMPONENT_DATA DiskKey, ControllerKey;
ULONG DiskCount;
ULONG Size;
ULONG i;
- BOOLEAN Changed, BootDriveReported = FALSE;
- CHAR BootPath[512];
+ BOOLEAN Changed;
/* Count the number of visible drives */
DiskReportError(FALSE);
@@ -803,22 +812,6 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
DPRINTM(DPRINT_HWDETECT, "BIOS reports %d harddisk%s\n",
(int)DiskCount, (DiskCount == 1) ? "": "s");
- FldrCreateComponentKey(BusKey,
- L"DiskController",
- 0,
- ControllerClass,
- DiskController,
- &ControllerKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: DiskController\\0\n");
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Output | Input | Removable,
- 0,
- 0xFFFFFFFF);
-
- DetectBiosFloppyController(BusKey, ControllerKey);
-
/* Allocate resource descriptor */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
sizeof(CM_INT13_DRIVE_PARAMETER) * DiskCount;
@@ -827,7 +820,7 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
{
DPRINTM(DPRINT_HWDETECT,
"Failed to allocate resource descriptor\n");
- return;
+ return NULL;
}
/* Initialize resource descriptor */
@@ -845,9 +838,6 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
Int13Drives = (PVOID)(((ULONG_PTR)PartialResourceList) + sizeof(CM_PARTIAL_RESOURCE_LIST));
for (i = 0; i < DiskCount; i++)
{
- if (BootDrive == 0x80 + i)
- BootDriveReported = TRUE;
-
if (MachDiskGetDriveGeometry(0x80 + i, &Geometry))
{
Int13Drives[i].DriveSelect = 0x80 + i;
@@ -865,31 +855,104 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
Geometry.BytesPerSector);
}
}
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(SystemKey, PartialResourceList, Size);
+
+ FldrCreateComponentKey(NULL,
+ SystemClass,
+ MaximumType,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ NULL,
+ PartialResourceList,
+ Size,
+ &SystemKey);
+
MmHeapFree(PartialResourceList);
+
+ return SystemKey;
+}
+
+static ULONG
+GetDiskCount(PCONFIGURATION_COMPONENT_DATA BusKey)
+{
+ PCONFIGURATION_COMPONENT_DATA System;
+ ULONG ConfigurationDataLength;
+ ULONG DiskCount = 0;
+
+ //
+ // Get root component
+ //
+ System = BusKey;
+ while (System->Parent)
+ System = System->Parent;
+
+ //
+ // Get root configuration data length
+ //
+ ConfigurationDataLength = System->ComponentEntry.ConfigurationDataLength;
+
+ //
+ // We assume that nothing wrong happened, and that configuration
+ // only consists of one CM_PARTIAL_RESOURCE_LIST entry, followed
+ // by n entries of CM_INT13_DRIVE_PARAMETER
+ //
+ if (ConfigurationDataLength > 0)
+ DiskCount = (ConfigurationDataLength - sizeof(CM_PARTIAL_RESOURCE_LIST))
+ / sizeof(CM_INT13_DRIVE_PARAMETER);
+
+ //
+ // Return number of disks
+ //
+ DPRINTM(DPRINT_HWDETECT, "Retrieving %lu INT13 disks\\0\n");
+ return DiskCount;
+};
+
+static VOID
+DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA BusKey)
+{
+ PCONFIGURATION_COMPONENT_DATA DiskKey, ControllerKey;
+ BOOLEAN BootDriveReported = FALSE;
+ ULONG i;
+ ULONG DiskCount = GetDiskCount(BusKey);
+ CHAR BootPath[512];
+
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ DiskController,
+ Output | Input,
+ 0x0,
+ 0xFFFFFFFF,
+ NULL,
+ NULL,
+ 0,
+ &ControllerKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: DiskController\\0\n");
/* Create and fill subkey for each harddisk */
for (i = 0; i < DiskCount; i++)
{
+ PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
+ ULONG Size;
+ CHAR Identifier[20];
+
+ if (BootDrive == 0x80 + i)
+ BootDriveReported = TRUE;
+
+ /* Get disk values */
+ PartialResourceList = GetHarddiskConfigurationData(0x80 + i, &Size);
+ GetHarddiskIdentifier(Identifier, 0x80 + i);
+
/* Create disk key */
FldrCreateComponentKey(ControllerKey,
- L"DiskPeripheral",
- i,
PeripheralClass,
DiskPeripheral,
+ Output | Input,
+ 0x0,
+ 0xFFFFFFFF,
+ Identifier,
+ PartialResourceList,
+ Size,
&DiskKey);
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(DiskKey,
- Output | Input,
- 0,
- 0xFFFFFFFF);
-
- /* Set disk values */
- SetHarddiskConfigurationData(DiskKey, 0x80 + i);
- SetHarddiskIdentifier(DiskKey, 0x80 + i);
}
/* Get the drive we're booting from */
@@ -1215,35 +1278,27 @@ DetectSerialPointerPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey,
}
}
- /* Create 'PointerPeripheral' key */
- FldrCreateComponentKey(ControllerKey,
- L"PointerPeripheral",
- 0,
- PeripheralClass,
- PointerPeripheral,
- &PeripheralKey);
- DPRINTM(DPRINT_HWDETECT,
- "Created key: PointerPeripheral\\0\n");
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(PeripheralKey,
- Input,
- 0,
- 0xFFFFFFFF);
-
/* Set 'Configuration Data' value */
memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
PartialResourceList.Version = 1;
PartialResourceList.Revision = 1;
PartialResourceList.Count = 0;
- FldrSetConfigurationData(PeripheralKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST) -
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
+ /* Create 'PointerPeripheral' key */
+ FldrCreateComponentKey(ControllerKey,
+ PeripheralClass,
+ PointerPeripheral,
+ Input,
+ 0x0,
+ 0xFFFFFFFF,
+ Identifier,
+ &PartialResourceList,
+ sizeof(CM_PARTIAL_RESOURCE_LIST) -
+ sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR),
+ &PeripheralKey);
- /* Set 'Identifier' value */
- FldrSetIdentifier(PeripheralKey, Identifier);
+ DPRINTM(DPRINT_HWDETECT,
+ "Created key: PointerPeripheral\\0\n");
}
}
@@ -1278,19 +1333,8 @@ DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey)
i + 1,
Base);
- /* Create controller key */
- FldrCreateComponentKey(BusKey,
- L"SerialController",
- ControllerNumber,
- ControllerClass,
- SerialController,
- &ControllerKey);
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Output | Input | ConsoleIn | ConsoleOut,
- ControllerNumber,
- 0xFFFFFFFF);
+ /* Set 'Identifier' value */
+ sprintf(Buffer, "COM%ld", i + 1);
/* Build full device descriptor */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
@@ -1339,16 +1383,19 @@ DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey)
(PCM_SERIAL_DEVICE_DATA)&PartialResourceList->PartialDescriptors[3];
SerialDeviceData->BaudClock = 1843200; /* UART Clock frequency (Hertz) */
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
+ /* Create controller key */
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ SerialController,
+ Output | Input | ConsoleIn | ConsoleOut,
+ ControllerNumber,
+ 0xFFFFFFFF,
+ Buffer,
+ PartialResourceList,
+ Size,
+ &ControllerKey);
- /* Set 'Identifier' value */
- sprintf(Buffer, "COM%ld", i + 1);
- FldrSetIdentifier(ControllerKey, Buffer);
- DPRINTM(DPRINT_HWDETECT,
- "Created value: Identifier %s\n",
- Buffer);
+ MmHeapFree(PartialResourceList);
if (!Rs232PortInUse(Base))
{
@@ -1390,19 +1437,8 @@ DetectParallelPorts(PCONFIGURATION_COMPONENT_DATA BusKey)
ControllerNumber,
Base);
- /* Create controller key */
- FldrCreateComponentKey(BusKey,
- L"ParallelController",
- ControllerNumber,
- ControllerClass,
- ParallelController,
- &ControllerKey);
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Output,
- ControllerNumber,
- 0xFFFFFFFF);
+ /* Set 'Identifier' value */
+ sprintf(Buffer, "PARALLEL%ld", i + 1);
/* Build full device descriptor */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST);
@@ -1444,16 +1480,19 @@ DetectParallelPorts(PCONFIGURATION_COMPONENT_DATA BusKey)
PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF;
}
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
+ /* Create controller key */
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ ParallelController,
+ Output,
+ ControllerNumber,
+ 0xFFFFFFFF,
+ Buffer,
+ PartialResourceList,
+ Size,
+ &ControllerKey);
- /* Set 'Identifier' value */
- sprintf(Buffer, "PARALLEL%ld", i + 1);
- FldrSetIdentifier(ControllerKey, Buffer);
- DPRINTM(DPRINT_HWDETECT,
- "Created value: Identifier %s\n",
- Buffer);
+ MmHeapFree(PartialResourceList);
ControllerNumber++;
}
@@ -1545,21 +1584,6 @@ DetectKeyboardPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey)
/* HACK: don't call DetectKeyboardDevice() as it fails in Qemu 0.8.2 */
if (TRUE || DetectKeyboardDevice())
{
- /* Create controller key */
- FldrCreateComponentKey(ControllerKey,
- L"KeyboardPeripheral",
- 0,
- PeripheralClass,
- KeyboardPeripheral,
- &PeripheralKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: KeyboardPeripheral\\0\n");
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(PeripheralKey,
- Input | ConsoleIn,
- 0,
- 0xFFFFFFFF);
-
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
sizeof(CM_KEYBOARD_DEVICE_DATA);
@@ -1589,12 +1613,20 @@ DetectKeyboardPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey)
KeyboardData->Subtype = 0;
KeyboardData->KeyboardFlags = 0x20;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(PeripheralKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
+ /* Create controller key */
+ FldrCreateComponentKey(ControllerKey,
+ PeripheralClass,
+ KeyboardPeripheral,
+ Input | ConsoleIn,
+ 0x0,
+ 0xFFFFFFFF,
+ "PCAT_ENHANCED",
+ PartialResourceList,
+ Size,
+ &PeripheralKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: KeyboardPeripheral\\0\n");
- /* Set 'Identifier' value */
- FldrSetIdentifier(PeripheralKey, "PCAT_ENHANCED");
+ MmHeapFree(PartialResourceList);
}
}
@@ -1607,21 +1639,6 @@ DetectKeyboardController(PCONFIGURATION_COMPONENT_DATA BusKey)
PCONFIGURATION_COMPONENT_DATA ControllerKey;
ULONG Size;
- /* Create controller key */
- FldrCreateComponentKey(BusKey,
- L"KeyboardController",
- 0,
- ControllerClass,
- KeyboardController,
- &ControllerKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: KeyboardController\\0\n");
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Input | ConsoleIn,
- 0,
- 0xFFFFFFFF);
-
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
@@ -1666,8 +1683,19 @@ DetectKeyboardController(PCONFIGURATION_COMPONENT_DATA BusKey)
PartialDescriptor->u.Port.Start.HighPart = 0x0;
PartialDescriptor->u.Port.Length = 1;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey, PartialResourceList, Size);
+ /* Create controller key */
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ KeyboardController,
+ Input | ConsoleIn,
+ 0x0,
+ 0xFFFFFFFF,
+ NULL,
+ PartialResourceList,
+ Size,
+ &ControllerKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: KeyboardController\\0\n");
+
MmHeapFree(PartialResourceList);
DetectKeyboardPeripheral(ControllerKey);
@@ -1794,21 +1822,6 @@ DetectPS2Mouse(PCONFIGURATION_COMPONENT_DATA BusKey)
{
DPRINTM(DPRINT_HWDETECT, "Detected PS2 port\n");
- /* Create controller key */
- FldrCreateComponentKey(BusKey,
- L"PointerController",
- 0,
- ControllerClass,
- PointerController,
- &ControllerKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: PointerController\\0\n");
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Input,
- 0,
- 0xFFFFFFFF);
-
memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
/* Initialize resource descriptor */
@@ -1824,44 +1837,42 @@ DetectPS2Mouse(PCONFIGURATION_COMPONENT_DATA BusKey)
PartialResourceList.PartialDescriptors[0].u.Interrupt.Vector = 0;
PartialResourceList.PartialDescriptors[0].u.Interrupt.Affinity = 0xFFFFFFFF;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(ControllerKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST));
+ /* Create controller key */
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ PointerController,
+ Input,
+ 0x0,
+ 0xFFFFFFFF,
+ NULL,
+ &PartialResourceList,
+ sizeof(CM_PARTIAL_RESOURCE_LIST),
+ &ControllerKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: PointerController\\0\n");
if (DetectPS2AuxDevice())
{
DPRINTM(DPRINT_HWDETECT, "Detected PS2 mouse\n");
- /* Create peripheral key */
- FldrCreateComponentKey(ControllerKey,
- L"PointerPeripheral",
- 0,
- ControllerClass,
- PointerPeripheral,
- &PeripheralKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: PointerPeripheral\\0\n");
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(PeripheralKey,
- Input,
- 0,
- 0xFFFFFFFF);
-
/* Initialize resource descriptor */
memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
PartialResourceList.Version = 1;
PartialResourceList.Revision = 1;
PartialResourceList.Count = 0;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(PeripheralKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST) -
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(PeripheralKey, "MICROSOFT PS2 MOUSE");
+ /* Create peripheral key */
+ FldrCreateComponentKey(ControllerKey,
+ ControllerClass,
+ PointerPeripheral,
+ Input,
+ 0x0,
+ 0xFFFFFFFF,
+ "MICROSOFT PS2 MOUSE",
+ &PartialResourceList,
+ sizeof(CM_PARTIAL_RESOURCE_LIST) -
+ sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR),
+ &PeripheralKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: PointerPeripheral\\0\n");
}
}
}
@@ -1874,20 +1885,6 @@ DetectDisplayController(PCONFIGURATION_COMPONENT_DATA BusKey)
PCONFIGURATION_COMPONENT_DATA ControllerKey;
USHORT VesaVersion;
- FldrCreateComponentKey(BusKey,
- L"DisplayController",
- 0,
- ControllerClass,
- DisplayController,
- &ControllerKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: DisplayController\\0\n");
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- 0x00,
- 0,
- 0xFFFFFFFF);
-
/* FIXME: Set 'ComponentInformation' value */
VesaVersion = BiosIsVesaSupported();
@@ -1915,8 +1912,17 @@ DetectDisplayController(PCONFIGURATION_COMPONENT_DATA BusKey)
"VGA Display");
}
- /* Set 'Identifier' value */
- FldrSetIdentifier(ControllerKey, Buffer);
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ DisplayController,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ Buffer,
+ NULL,
+ 0,
+ &ControllerKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: DisplayController\\0\n");
/* FIXME: Add display peripheral (monitor) data */
}
@@ -1929,26 +1935,9 @@ DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
PCONFIGURATION_COMPONENT_DATA BusKey;
ULONG Size;
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BusKey);
-
- /* Set 'Component Information' value similar to my NT4 box */
- FldrSetComponentInformation(BusKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
/* Increment bus number */
(*BusNumber)++;
- /* Set 'Identifier' value */
- FldrSetIdentifier(BusKey, "ISA");
-
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) -
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
@@ -1966,12 +1955,24 @@ DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
PartialResourceList->Revision = 1;
PartialResourceList->Count = 0;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
+ /* Create new bus key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "ISA",
+ PartialResourceList,
+ Size,
+ &BusKey);
+
MmHeapFree(PartialResourceList);
/* Detect ISA/BIOS devices */
- DetectBiosDisks(SystemKey, BusKey);
+ DetectBiosDisks(BusKey);
+
+ DetectBiosFloppyController(BusKey);
DetectSerialPorts(BusKey);
@@ -1996,13 +1997,7 @@ PcHwDetect(VOID)
DPRINTM(DPRINT_HWDETECT, "DetectHardware()\n");
/* Create the 'System' key */
- FldrCreateSystemKey(&SystemKey);
-
- /* Set empty component information */
- FldrSetComponentInformation(SystemKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
+ SystemKey = DetectSystem();
/* Detect buses */
DetectPciBios(SystemKey, &BusNumber);
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c b/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c
index a578b8ff70e..a15e31abed0 100644
--- a/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c
+++ b/reactos/boot/freeldr/freeldr/arch/i386/hwacpi.c
@@ -67,20 +67,6 @@ DetectAcpiBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
AcpiPresent = TRUE;
LoaderBlock.Flags |= MB_FLAGS_ACPI_TABLE;
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BiosKey);
-
- /* Set 'Component Information' */
- FldrSetComponentInformation(BiosKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
/* Get BIOS memory map */
RtlZeroMemory(BiosMemoryMap, sizeof(BIOS_MEMORY_MAP) * 32);
BiosMemoryMapEntryCount = PcMemGetMemoryMap(BiosMemoryMap,
@@ -113,16 +99,21 @@ DetectAcpiBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
DPRINTM(DPRINT_HWDETECT, "RSDT %p, data size %x\n", Rsdp->rsdt_physical_address,
TableSize);
- FldrSetConfigurationData(BiosKey,
- PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST) + TableSize
- );
+ /* Create new bus key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "ACPI BIOS",
+ PartialResourceList,
+ sizeof(CM_PARTIAL_RESOURCE_LIST) + TableSize,
+ &BiosKey);
/* Increment bus number */
(*BusNumber)++;
- /* Set 'Identifier' value */
- FldrSetIdentifier(BiosKey, "ACPI BIOS");
MmHeapFree(PartialResourceList);
}
}
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c b/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c
index 8eab8b38d63..fa3e39fd81f 100644
--- a/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c
+++ b/reactos/boot/freeldr/freeldr/arch/i386/hwapm.c
@@ -61,35 +61,27 @@ DetectApmBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
if (FindApmBios())
{
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BiosKey);
-
- /* Set 'Component Information' */
- FldrSetComponentInformation(BiosKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Set 'Configuration Data' value */
+ /* Create 'Configuration Data' value */
memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST));
PartialResourceList.Version = 0;
PartialResourceList.Revision = 0;
PartialResourceList.Count = 0;
- FldrSetConfigurationData(BiosKey,
- &PartialResourceList,
- sizeof(CM_PARTIAL_RESOURCE_LIST) -
- sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
+
+ /* Create new bus key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "APM",
+ &PartialResourceList,
+ sizeof(CM_PARTIAL_RESOURCE_LIST) -
+ sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR),
+ &BiosKey);
/* Increment bus number */
(*BusNumber)++;
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(BiosKey, "APM");
}
/* FIXME: Add configuration data */
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c b/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c
index fd0533bf426..6f962cfa0de 100644
--- a/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c
+++ b/reactos/boot/freeldr/freeldr/arch/i386/hwpci.c
@@ -154,22 +154,6 @@ DetectPciIrqRoutingTable(PCONFIGURATION_COMPONENT_DATA BusKey)
{
DPRINTM(DPRINT_HWDETECT, "Table size: %u\n", Table->Size);
- FldrCreateComponentKey(BusKey,
- L"RealModeIrqRoutingTable",
- 0,
- PeripheralClass,
- RealModeIrqRoutingTable,
- &TableKey);
-
- /* Set 'Component Information' */
- FldrSetComponentInformation(TableKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(TableKey, "PCI Real-mode IRQ Routing Table");
-
/* Set 'Configuration Data' value */
Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, PartialDescriptors) +
2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) + Table->Size;
@@ -201,8 +185,17 @@ DetectPciIrqRoutingTable(PCONFIGURATION_COMPONENT_DATA BusKey)
memcpy(&PartialResourceList->PartialDescriptors[2],
Table, Table->Size);
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(TableKey, PartialResourceList, Size);
+ FldrCreateComponentKey(BusKey,
+ PeripheralClass,
+ RealModeIrqRoutingTable,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "PCI Real-mode IRQ Routing Table",
+ PartialResourceList,
+ Size,
+ &TableKey);
+
MmHeapFree(PartialResourceList);
}
}
@@ -218,31 +211,10 @@ DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
ULONG Size;
PCONFIGURATION_COMPONENT_DATA BusKey;
ULONG i;
- CHAR szPci[] = "PCI";
/* Report the PCI BIOS */
if (FindPciBios(&BusData))
{
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BiosKey);
-
- /* Set 'Component Information' */
- FldrSetComponentInformation(BiosKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Increment bus number */
- (*BusNumber)++;
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(BiosKey, "PCI BIOS");
-
/* Set 'Configuration Data' value */
Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST,
PartialDescriptors);
@@ -257,8 +229,21 @@ DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
/* Initialize resource descriptor */
memset(PartialResourceList, 0, Size);
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BiosKey, PartialResourceList, Size);
+ /* Create new bus key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "PCI BIOS",
+ PartialResourceList,
+ Size,
+ &BiosKey);
+
+ /* Increment bus number */
+ (*BusNumber)++;
+
MmHeapFree(PartialResourceList);
DetectPciIrqRoutingTable(BiosKey);
@@ -266,20 +251,6 @@ DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
/* Report PCI buses */
for (i = 0; i < (ULONG)BusData.NoBuses; i++)
{
- /* Create the bus key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BusKey);
-
- /* Set 'Component Information' */
- FldrSetComponentInformation(BusKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
/* Check if this is the first bus */
if (i == 0)
{
@@ -308,10 +279,6 @@ DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
memcpy(&PartialResourceList->PartialDescriptors[1],
&BusData,
sizeof(PCI_REGISTRY_INFO));
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
}
else
{
@@ -328,17 +295,24 @@ DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
/* Initialize resource descriptor */
memset(PartialResourceList, 0, Size);
-
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
}
+ /* Create the bus key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "PCI",
+ PartialResourceList,
+ Size,
+ &BusKey);
+
+ MmHeapFree(PartialResourceList);
+
/* Increment bus number */
(*BusNumber)++;
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(BusKey, szPci);
}
}
}
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386idt.S b/reactos/boot/freeldr/freeldr/arch/i386/i386idt.S
index 7fc46fa9ff0..22e931f2ee7 100644
--- a/reactos/boot/freeldr/freeldr/arch/i386/i386idt.S
+++ b/reactos/boot/freeldr/freeldr/arch/i386/i386idt.S
@@ -27,91 +27,91 @@
.p2align 2 /* force 4-byte alignment */
EXTERN(i386idt)
/* Exception 0 - Divide By Zero */
- .word i386DivideByZero /* Offset 0 - 15 */
+ .word i386DivideByZero /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Flags, Zero Byte */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 1 - Debug Exception */
- .word i386DebugException /* Offset 0 - 15 */
+ .word i386DebugException /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 2 - NMI */
- .word i386NMIException /* Offset 0 - 15 */
+ .word i386NMIException /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 3 - Breakpoint (INT 3) */
- .word i386Breakpoint /* Offset 0 - 15 */
+ .word i386Breakpoint /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 4 - Overflow (INTO with EFLAGS[OF] set) */
- .word i386Overflow /* Offset 0 - 15 */
+ .word i386Overflow /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 5 - Bound Exception */
- .word i386BoundException /* Offset 0 - 15 */
+ .word i386BoundException /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 6 - Invalid Opcode */
- .word i386InvalidOpcode /* Offset 0 - 15 */
+ .word i386InvalidOpcode /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 7 - FPU Not Available */
- .word i386FPUNotAvailable /* Offset 0 - 15 */
+ .word i386FPUNotAvailable /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 8 - Double Fault */
- .word i386DoubleFault /* Offset 0 - 15 */
+ .word i386DoubleFault /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 9 - Coprocessor Segment Overrun */
- .word i386CoprocessorSegment /* Offset 0 - 15 */
+ .word i386CoprocessorSegment /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 10 (0x0A) - Invalid TSS */
- .word i386InvalidTSS /* Offset 0 - 15 */
+ .word i386InvalidTSS /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 11 (0x0B) - Segment Not Present */
- .word i386SegmentNotPresent /* Offset 0 - 15 */
+ .word i386SegmentNotPresent /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 12 (0x0C) - Stack Exception */
- .word i386StackException /* Offset 0 - 15 */
+ .word i386StackException /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 13 (0x0D) - General Protection Fault */
- .word i386GeneralProtectionFault /* Offset 0 - 15 */
+ .word i386GeneralProtectionFault /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 14 (0x0E) - Page Fault */
- .word i386PageFault /* Offset 0 - 15 */
+ .word i386PageFault /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
@@ -123,19 +123,19 @@ EXTERN(i386idt)
.word 0x0000 /* Offset 16 - 31 */
/* Exception 16 (0x10) - Coprocessor Error */
- .word i386CoprocessorError /* Offset 0 - 15 */
+ .word i386CoprocessorError /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 17 (0x11) - Alignment Check */
- .word i386AlignmentCheck /* Offset 0 - 15 */
+ .word i386AlignmentCheck /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
/* Exception 18 (0x12) - Machine Check */
- .word i386MachineCheck /* Offset 0 - 15 */
+ .word i386MachineCheck /* Offset 0 - 15 */
.word 0x0008 /* Selector */
.word 0x8e00 /* Zero byte, flags */
.word 0x0000 /* Offset 16 - 31 */
@@ -220,5 +220,5 @@ EXTERN(i386idt)
/* IDT table pointer */
EXTERN(i386idtptr)
- .word (i386idtptr-i386idt) /* Limit */
+ .word (i386idtptr - i386idt - 1) /* Limit */
.long i386idt /* Base Address */
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c b/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c
index 7ce47976282..4b080ec4cf0 100644
--- a/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c
+++ b/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c
@@ -29,9 +29,8 @@ extern ULONG reactos_disk_count;
extern ARC_DISK_SIGNATURE reactos_arc_disk_info[];
extern char reactos_arc_strings[32][256];
-static VOID
-SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
- ULONG DriveNumber)
+static PCM_PARTIAL_RESOURCE_LIST
+GetHarddiskConfigurationData(ULONG DriveNumber, ULONG* pSize)
{
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
PCM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry;
@@ -39,6 +38,11 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
GEOMETRY Geometry;
ULONG Size;
+ //
+ // Initialize returned size
+ //
+ *pSize = 0;
+
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
sizeof(CM_DISK_GEOMETRY_DEVICE_DATA);
@@ -47,7 +51,7 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
{
DPRINTM(DPRINT_HWDETECT,
"Failed to allocate a full resource descriptor\n");
- return;
+ return NULL;
}
memset(PartialResourceList, 0, Size);
@@ -78,7 +82,7 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
{
DPRINTM(DPRINT_HWDETECT, "Reading disk geometry failed\n");
MmHeapFree(PartialResourceList);
- return;
+ return NULL;
}
DPRINTM(DPRINT_HWDETECT,
"Disk %x: %u Cylinders %u Heads %u Sectors %u Bytes\n",
@@ -88,13 +92,16 @@ SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey,
DiskGeometry->SectorsPerTrack,
DiskGeometry->BytesPerSector);
- FldrSetConfigurationData(DiskKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
+ //
+ // Return configuration data
+ //
+ *pSize = Size;
+ return PartialResourceList;
}
static VOID
-SetHarddiskIdentifier(PCONFIGURATION_COMPONENT_DATA DiskKey,
+GetHarddiskIdentifier(PCHAR Identifier,
ULONG DriveNumber)
{
PMASTER_BOOT_RECORD Mbr;
@@ -102,7 +109,6 @@ SetHarddiskIdentifier(PCONFIGURATION_COMPONENT_DATA DiskKey,
ULONG i;
ULONG Checksum;
ULONG Signature;
- CHAR Identifier[20];
CHAR ArcName[256];
/* Read the MBR */
@@ -158,9 +164,6 @@ SetHarddiskIdentifier(PCONFIGURATION_COMPONENT_DATA DiskKey,
Identifier[18] = 'A';
Identifier[19] = 0;
DPRINTM(DPRINT_HWDETECT, "Identifier: %s\n", Identifier);
-
- /* Set identifier */
- FldrSetIdentifier(DiskKey, Identifier);
}
static VOID
@@ -206,21 +209,7 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
DPRINTM(DPRINT_HWDETECT, "BIOS reports %d harddisk%s\n",
(int)DiskCount, (DiskCount == 1) ? "": "s");
- FldrCreateComponentKey(BusKey,
- L"DiskController",
- 0,
- ControllerClass,
- DiskController,
- &ControllerKey);
- DPRINTM(DPRINT_HWDETECT, "Created key: DiskController\\0\n");
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(ControllerKey,
- Output | Input | Removable,
- 0,
- 0xFFFFFFFF);
-
- //DetectBiosFloppyController(BusKey, ControllerKey);
+ //DetectBiosFloppyController(BusKey);
/* Allocate resource descriptor */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
@@ -266,30 +255,45 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey,
}
}
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(SystemKey, PartialResourceList, Size);
+ FldrCreateComponentKey(BusKey,
+ ControllerClass,
+ DiskController,
+ Output | Input,
+ 0,
+ 0xFFFFFFFF,
+ NULL,
+ PartialResourceList,
+ Size,
+ &ControllerKey);
+ DPRINTM(DPRINT_HWDETECT, "Created key: DiskController\\0\n");
+
MmHeapFree(PartialResourceList);
/* Create and fill subkey for each harddisk */
for (i = 0; i < DiskCount; i++)
{
+ PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
+ ULONG Size;
+ CHAR Identifier[20];
+
+ /* Get disk values */
+ PartialResourceList = GetHarddiskConfigurationData(0x80 + i, &Size);
+ GetHarddiskIdentifier(Identifier, 0x80 + i);
+
/* Create disk key */
FldrCreateComponentKey(ControllerKey,
- L"DiskPeripheral",
- i,
PeripheralClass,
DiskPeripheral,
+ Output | Input,
+ 0,
+ 0xFFFFFFFF,
+ Identifier,
+ PartialResourceList,
+ Size,
&DiskKey);
-
- /* Set 'ComponentInformation' value */
- FldrSetComponentInformation(DiskKey,
- Output | Input,
- 0,
- 0xFFFFFFFF);
-
- /* Set disk values */
- SetHarddiskConfigurationData(DiskKey, 0x80 + i);
- SetHarddiskIdentifier(DiskKey, 0x80 + i);
+
+ if (PartialResourceList)
+ MmHeapFree(PartialResourceList);
}
}
@@ -300,26 +304,6 @@ DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
PCONFIGURATION_COMPONENT_DATA BusKey;
ULONG Size;
- /* Create new bus key */
- FldrCreateComponentKey(SystemKey,
- L"MultifunctionAdapter",
- *BusNumber,
- AdapterClass,
- MultiFunctionAdapter,
- &BusKey);
-
- /* Set 'Component Information' value similar to my NT4 box */
- FldrSetComponentInformation(BusKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
- /* Increment bus number */
- (*BusNumber)++;
-
- /* Set 'Identifier' value */
- FldrSetIdentifier(BusKey, "ISA");
-
/* Set 'Configuration Data' value */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) -
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
@@ -337,10 +321,22 @@ DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
PartialResourceList->Revision = 1;
PartialResourceList->Count = 0;
- /* Set 'Configuration Data' value */
- FldrSetConfigurationData(BusKey, PartialResourceList, Size);
- MmHeapFree(PartialResourceList);
+ /* Create new bus key */
+ FldrCreateComponentKey(SystemKey,
+ AdapterClass,
+ MultiFunctionAdapter,
+ 0x0,
+ 0x0,
+ 0xFFFFFFFF,
+ "ISA",
+ PartialResourceList,
+ Size,
+ &BusKey);
+ /* Increment bus number */
+ (*BusNumber)++;
+
+ MmHeapFree(PartialResourceList);
/* Detect ISA/BIOS devices */
DetectBiosDisks(SystemKey, BusKey);
@@ -360,12 +356,6 @@ XboxHwDetect(VOID)
/* Create the 'System' key */
FldrCreateSystemKey(&SystemKey);
- /* Set empty component information */
- FldrSetComponentInformation(SystemKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
/* TODO: Build actual xbox's hardware configuration tree */
DetectIsaBios(SystemKey, &BusNumber);
diff --git a/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c b/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c
index 01434aa3878..e6840f07358 100644
--- a/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c
+++ b/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c
@@ -264,11 +264,7 @@ BOOLEAN PpcDiskGetBootVolume( PULONG DriveNumber, PULONGLONG StartSector, PULONG
BOOLEAN PpcDiskGetSystemVolume( char *SystemPath,
char *RemainingPath,
- PULONG Device,
- PULONG DriveNumber,
- PULONGLONG StartSector,
- PULONGLONG SectorCount,
- int *FsType ) {
+ PULONG Device ) {
char *remain = strchr(SystemPath, '\\');
if( remain ) {
strcpy( RemainingPath, remain+1 );
@@ -278,7 +274,7 @@ BOOLEAN PpcDiskGetSystemVolume( char *SystemPath,
*Device = 0;
// Hack to be a bit easier on ram
CacheSizeLimit = 64 * 1024;
- return MachDiskGetBootVolume(DriveNumber, StartSector, SectorCount, FsType);
+ return TRUE;
}
BOOLEAN PpcDiskGetBootPath( char *OutBootPath, unsigned Size ) {
@@ -392,14 +388,16 @@ VOID OfwCopyDeviceTree
/* Create a key for this device */
FldrCreateComponentKey
(ParentKey,
- wide_name,
- 0,
AdapterClass,
MultiFunctionAdapter,
+ 0,
+ 0,
+ (ULONG)-1,
+ NULL,
+ NULL,
+ 0,
&NewKey);
- FldrSetComponentInformation(NewKey, 0, 0, (ULONG)-1);
-
/* Add properties */
for (prev_name = ""; ofw_nextprop(node, prev_name, cur_name) == 1; )
{
@@ -456,8 +454,6 @@ PCONFIGURATION_COMPONENT_DATA PpcHwDetect() {
FldrCreateSystemKey(&RootKey);
- FldrSetComponentInformation(RootKey, 0, 0, (ULONG)-1);
-
OfwCopyDeviceTree(RootKey,"/",node,&BusNumber,&DiskController,&DiskNumber);
return RootKey;
}
diff --git a/reactos/boot/freeldr/freeldr/arch/powerpc/prep.c b/reactos/boot/freeldr/freeldr/arch/powerpc/prep.c
index b4c3fff3631..0491ff4a139 100644
--- a/reactos/boot/freeldr/freeldr/arch/powerpc/prep.c
+++ b/reactos/boot/freeldr/freeldr/arch/powerpc/prep.c
@@ -114,12 +114,6 @@ PCONFIGURATION_COMPONENT_DATA PpcPrepHwDetect() {
/* Create the 'System' key */
FldrCreateSystemKey(&SystemKey);
- /* Set empty component information */
- FldrSetComponentInformation(SystemKey,
- 0x0,
- 0x0,
- 0xFFFFFFFF);
-
printf("DetectHardware() Done\n");
return SystemKey;
}
diff --git a/reactos/boot/freeldr/freeldr/bootmgr.c b/reactos/boot/freeldr/freeldr/bootmgr.c
index d2d8783dd9a..c3ec84aebfb 100644
--- a/reactos/boot/freeldr/freeldr/bootmgr.c
+++ b/reactos/boot/freeldr/freeldr/bootmgr.c
@@ -31,9 +31,10 @@ VOID RunLoader(VOID)
LONG TimeOut;
ULONG SelectedOperatingSystem;
- if (!FsOpenBootVolume())
+ // FIXME: if possible, only detect and register ARC devices...
+ if (!MachHwDetect())
{
- UiMessageBoxCritical("Error opening boot partition for file access.");
+ UiMessageBoxCritical("Error when detecting hardware");
return;
}
diff --git a/reactos/boot/freeldr/freeldr/debug.c b/reactos/boot/freeldr/freeldr/debug.c
index a4b5990e009..3ea5ec34878 100644
--- a/reactos/boot/freeldr/freeldr/debug.c
+++ b/reactos/boot/freeldr/freeldr/debug.c
@@ -102,15 +102,14 @@ VOID DebugPrintChar(UCHAR Character)
ULONG
DbgPrint(const char *Format, ...)
{
+ int i;
+ int Length;
va_list ap;
CHAR Buffer[512];
- ULONG Length;
- char *ptr = Buffer;
va_start(ap, Format);
-
- /* Construct a string */
- Length = _vsnprintf(Buffer, 512, Format, ap);
+ Length = _vsnprintf(Buffer, sizeof(Buffer), Format, ap);
+ va_end(ap);
/* Check if we went past the buffer */
if (Length == -1)
@@ -122,12 +121,11 @@ DbgPrint(const char *Format, ...)
Length = sizeof(Buffer);
}
- while (*ptr)
+ for (i = 0; i < Length; i++)
{
- DebugPrintChar(*ptr++);
+ DebugPrintChar(Buffer[i]);
}
- va_end(ap);
return 0;
}
@@ -199,7 +197,7 @@ VOID DbgPrintMask(ULONG Mask, char *format, ...)
// Print the header if we have started a new line
if (DebugStartOfLine)
{
- DbgPrint("(%s:%d) ", g_file, g_line);
+ DbgPrint("(%s:%d) ", g_file, g_line);
DebugPrintHeader(Mask);
DebugStartOfLine = FALSE;
}
@@ -207,6 +205,7 @@ VOID DbgPrintMask(ULONG Mask, char *format, ...)
va_start(ap, format);
vsprintf(Buffer, format, ap);
va_end(ap);
+
while (*ptr)
{
DebugPrintChar(*ptr++);
diff --git a/reactos/boot/freeldr/freeldr/disk/disk.c b/reactos/boot/freeldr/freeldr/disk/disk.c
index 44a7e2b7c88..c9b31422b00 100644
--- a/reactos/boot/freeldr/freeldr/disk/disk.c
+++ b/reactos/boot/freeldr/freeldr/disk/disk.c
@@ -241,22 +241,19 @@ DiskBootingFromFloppy(VOID)
BOOLEAN DiskGetSystemVolume(char *SystemPath,
char *RemainingPath,
- PULONG Device,
- PULONG DriveNumber,
- PULONGLONG StartSector,
- PULONGLONG SectorCount,
- int *FsType)
+ PULONG Device)
{
ULONG PartitionNumber;
PARTITION_TABLE_ENTRY PartitionTableEntry;
UCHAR VolumeType;
CHAR BootPath[256];
unsigned i, RosPartition;
+ ULONG DriveNumber;
/*
* Verify system path
*/
- if (!DissectArcPath(SystemPath, BootPath, DriveNumber, &PartitionNumber))
+ if (!DissectArcPath(SystemPath, BootPath, &DriveNumber, &PartitionNumber))
{
return FALSE;
}
@@ -278,7 +275,7 @@ BOOLEAN DiskGetSystemVolume(char *SystemPath,
RosPartition = 0;
while (1)
{
- if (!MachDiskGetPartitionEntry(*DriveNumber, ++i, &PartitionTableEntry))
+ if (!MachDiskGetPartitionEntry(DriveNumber, ++i, &PartitionTableEntry))
{
return FALSE;
}
@@ -294,33 +291,28 @@ BOOLEAN DiskGetSystemVolume(char *SystemPath,
}
/* Check for ISO9660 file system type */
- if (*DriveNumber >= 0x80 && FsRecIsIso9660(*DriveNumber))
+ if (DriveNumber >= 0x80 && FsRecIsIso9660(DriveNumber))
{
DPRINTM(DPRINT_FILESYSTEM, "Drive is a cdrom drive. Assuming ISO-9660 file system.\n");
if (NULL != Device)
{
- ((char *)Device)[0] = (char)(*DriveNumber);
+ ((char *)Device)[0] = (char)DriveNumber;
((char *)Device)[1] = (char)i;
}
- *StartSector = 0;
- *SectorCount = 0;
- *FsType = FS_ISO9660;
return TRUE;
}
- if (!FsRecognizeVolume(*DriveNumber, PartitionTableEntry.SectorCountBeforePartition, &VolumeType))
+ if (!FsRecognizeVolume(DriveNumber, PartitionTableEntry.SectorCountBeforePartition, &VolumeType))
{
return FALSE;
}
if (NULL != Device)
{
- ((char *)Device)[0] = (char)(*DriveNumber);
+ ((char *)Device)[0] = (char)DriveNumber;
((char *)Device)[1] = (char)i;
}
- *StartSector = PartitionTableEntry.SectorCountBeforePartition;
- *SectorCount = PartitionTableEntry.PartitionSectorCount;
switch (VolumeType)
{
@@ -330,16 +322,10 @@ BOOLEAN DiskGetSystemVolume(char *SystemPath,
case PARTITION_XINT13:
case PARTITION_FAT32:
case PARTITION_FAT32_XINT13:
- *FsType = FS_FAT;
- return TRUE;
case PARTITION_EXT2:
- *FsType = FS_EXT2;
- return TRUE;
case PARTITION_NTFS:
- *FsType = FS_NTFS;
return TRUE;
default:
- *FsType = 0;
return FALSE;
}
@@ -361,6 +347,8 @@ DiskGetBootPath(char *BootPath, unsigned Size)
strcat(BootPath, MachDiskBootingFromFloppy() ? "fdisk" : "cdrom");
strcat(strcat(strcat(BootPath, "("), Device), ")");
+ if (strcmp(BootPath, "multi(0)disk(0)cdrom(128)") == 0)
+ strcpy(BootPath, "multi(0)disk(0)rdisk(0)partition(1)");
return TRUE;
}
diff --git a/reactos/boot/freeldr/freeldr/fs/ext2.c b/reactos/boot/freeldr/freeldr/fs/ext2.c
index 319adb1456e..3f78d4b7f0a 100644
--- a/reactos/boot/freeldr/freeldr/fs/ext2.c
+++ b/reactos/boot/freeldr/freeldr/fs/ext2.c
@@ -20,13 +20,38 @@
#include
#include
-GEOMETRY Ext2DiskGeometry; // Ext2 file system disk geometry
+BOOLEAN Ext2OpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount);
+PEXT2_FILE_INFO Ext2OpenFile(PCSTR FileName);
+BOOLEAN Ext2LookupFile(PCSTR FileName, PEXT2_FILE_INFO Ext2FileInfoPointer);
+BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PEXT2_DIR_ENTRY DirectoryEntry);
+BOOLEAN Ext2ReadVolumeSectors(UCHAR DriveNumber, ULONGLONG SectorNumber, ULONGLONG SectorCount, PVOID Buffer);
+
+BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer);
+BOOLEAN Ext2ReadSuperBlock(VOID);
+BOOLEAN Ext2ReadGroupDescriptors(VOID);
+BOOLEAN Ext2ReadDirectory(ULONG Inode, PVOID* DirectoryBuffer, PEXT2_INODE InodePointer);
+BOOLEAN Ext2ReadBlock(ULONG BlockNumber, PVOID Buffer);
+BOOLEAN Ext2ReadPartialBlock(ULONG BlockNumber, ULONG StartingOffset, ULONG Length, PVOID Buffer);
+ULONG Ext2GetGroupDescBlockNumber(ULONG Group);
+ULONG Ext2GetGroupDescOffsetInBlock(ULONG Group);
+ULONG Ext2GetInodeGroupNumber(ULONG Inode);
+ULONG Ext2GetInodeBlockNumber(ULONG Inode);
+ULONG Ext2GetInodeOffsetInBlock(ULONG Inode);
+BOOLEAN Ext2ReadInode(ULONG Inode, PEXT2_INODE InodeBuffer);
+BOOLEAN Ext2ReadGroupDescriptor(ULONG Group, PEXT2_GROUP_DESC GroupBuffer);
+ULONG* Ext2ReadBlockPointerList(PEXT2_INODE Inode);
+ULONGLONG Ext2GetInodeFileSize(PEXT2_INODE Inode);
+BOOLEAN Ext2CopyIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG IndirectBlock);
+BOOLEAN Ext2CopyDoubleIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG DoubleIndirectBlock);
+BOOLEAN Ext2CopyTripleIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG TripleIndirectBlock);
+
+GEOMETRY Ext2DiskGeometry; // Ext2 file system disk geometry
PEXT2_SUPER_BLOCK Ext2SuperBlock = NULL; // Ext2 file system super block
PEXT2_GROUP_DESC Ext2GroupDescriptors = NULL; // Ext2 file system group descriptors
UCHAR Ext2DriveNumber = 0; // Ext2 file system drive number
-ULONGLONG Ext2VolumeStartSector = 0; // Ext2 file system starting sector
+ULONGLONG Ext2VolumeStartSector = 0; // Ext2 file system starting sector
ULONG Ext2BlockSizeInBytes = 0; // Block size in bytes
ULONG Ext2BlockSizeInSectors = 0; // Block size in sectors
ULONG Ext2FragmentSizeInBytes = 0; // Fragment size in bytes
@@ -77,17 +102,17 @@ BOOLEAN Ext2OpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG
* Tries to open the file 'name' and returns true or false
* for success and failure respectively
*/
-FILE* Ext2OpenFile(PCSTR FileName)
+PEXT2_FILE_INFO Ext2OpenFile(PCSTR FileName)
{
EXT2_FILE_INFO TempExt2FileInfo;
PEXT2_FILE_INFO FileHandle;
- CHAR SymLinkPath[EXT3_NAME_LEN];
- CHAR FullPath[EXT3_NAME_LEN * 2];
- ULONG Index;
+ CHAR SymLinkPath[EXT2_NAME_LEN];
+ CHAR FullPath[EXT2_NAME_LEN * 2];
+ ULONG Index;
DPRINTM(DPRINT_FILESYSTEM, "Ext2OpenFile() FileName = %s\n", FileName);
- RtlZeroMemory(SymLinkPath, EXT3_NAME_LEN);
+ RtlZeroMemory(SymLinkPath, sizeof(SymLinkPath));
// Lookup the file in the file system
if (!Ext2LookupFile(FileName, &TempExt2FileInfo))
@@ -97,7 +122,7 @@ FILE* Ext2OpenFile(PCSTR FileName)
// If we got a symbolic link then fix up the path
// and re-call this function
- if ((TempExt2FileInfo.Inode.i_mode & EXT2_S_IFMT) == EXT2_S_IFLNK)
+ if ((TempExt2FileInfo.Inode.mode & EXT2_S_IFMT) == EXT2_S_IFLNK)
{
DPRINTM(DPRINT_FILESYSTEM, "File is a symbolic link\n");
@@ -169,7 +194,7 @@ FILE* Ext2OpenFile(PCSTR FileName)
RtlCopyMemory(FileHandle, &TempExt2FileInfo, sizeof(EXT2_FILE_INFO));
- return (FILE*)FileHandle;
+ return FileHandle;
}
}
@@ -182,12 +207,12 @@ FILE* Ext2OpenFile(PCSTR FileName)
*/
BOOLEAN Ext2LookupFile(PCSTR FileName, PEXT2_FILE_INFO Ext2FileInfoPointer)
{
- UINT32 i;
- ULONG NumberOfPathParts;
- CHAR PathPart[261];
- PVOID DirectoryBuffer;
- ULONG DirectoryInode = EXT3_ROOT_INO;
- EXT2_INODE InodeData;
+ UINT32 i;
+ ULONG NumberOfPathParts;
+ CHAR PathPart[261];
+ PVOID DirectoryBuffer;
+ ULONG DirectoryInode = EXT2_ROOT_INO;
+ EXT2_INODE InodeData;
EXT2_DIR_ENTRY DirectoryEntry;
DPRINTM(DPRINT_FILESYSTEM, "Ext2LookupFile() FileName = %s\n", FileName);
@@ -244,8 +269,8 @@ BOOLEAN Ext2LookupFile(PCSTR FileName, PEXT2_FILE_INFO Ext2FileInfoPointer)
return FALSE;
}
- if (((InodeData.i_mode & EXT2_S_IFMT) != EXT2_S_IFREG) &&
- ((InodeData.i_mode & EXT2_S_IFMT) != EXT2_S_IFLNK))
+ if (((InodeData.mode & EXT2_S_IFMT) != EXT2_S_IFREG) &&
+ ((InodeData.mode & EXT2_S_IFMT) != EXT2_S_IFLNK))
{
FileSystemError("Inode is not a regular file or symbolic link.");
return FALSE;
@@ -257,8 +282,8 @@ BOOLEAN Ext2LookupFile(PCSTR FileName, PEXT2_FILE_INFO Ext2FileInfoPointer)
// If it's a regular file or a regular symbolic link
// then get the block pointer list otherwise it must
// be a fast symbolic link which doesn't have a block list
- if (((InodeData.i_mode & EXT2_S_IFMT) == EXT2_S_IFREG) ||
- ((InodeData.i_mode & EXT2_S_IFMT) == EXT2_S_IFLNK && InodeData.i_size > FAST_SYMLINK_MAX_NAME_SIZE))
+ if (((InodeData.mode & EXT2_S_IFMT) == EXT2_S_IFREG) ||
+ ((InodeData.mode & EXT2_S_IFMT) == EXT2_S_IFLNK && InodeData.size > FAST_SYMLINK_MAX_NAME_SIZE))
{
Ext2FileInfoPointer->FileBlockList = Ext2ReadBlockPointerList(&InodeData);
@@ -281,7 +306,7 @@ BOOLEAN Ext2LookupFile(PCSTR FileName, PEXT2_FILE_INFO Ext2FileInfoPointer)
BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PEXT2_DIR_ENTRY DirectoryEntry)
{
- ULONG CurrentOffset;
+ ULONG CurrentOffset;
PEXT2_DIR_ENTRY CurrentDirectoryEntry;
DPRINTM(DPRINT_FILESYSTEM, "Ext2SearchDirectoryBufferForFile() DirectoryBuffer = 0x%x DirectorySize = %d FileName = %s\n", DirectoryBuffer, DirectorySize, FileName);
@@ -290,32 +315,32 @@ BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectoryS
{
CurrentDirectoryEntry = (PEXT2_DIR_ENTRY)((ULONG_PTR)DirectoryBuffer + CurrentOffset);
- if (CurrentDirectoryEntry->rec_len == 0)
+ if (CurrentDirectoryEntry->direntlen == 0)
{
break;
}
- if ((CurrentDirectoryEntry->rec_len + CurrentOffset) > DirectorySize)
+ if ((CurrentDirectoryEntry->direntlen + CurrentOffset) > DirectorySize)
{
FileSystemError("Directory entry extends past end of directory file.");
return FALSE;
}
DPRINTM(DPRINT_FILESYSTEM, "Dumping directory entry at offset %d:\n", CurrentOffset);
- DbgDumpBuffer(DPRINT_FILESYSTEM, CurrentDirectoryEntry, CurrentDirectoryEntry->rec_len);
+ DbgDumpBuffer(DPRINT_FILESYSTEM, CurrentDirectoryEntry, CurrentDirectoryEntry->direntlen);
- if ((_strnicmp(FileName, CurrentDirectoryEntry->name, CurrentDirectoryEntry->name_len) == 0) &&
- (strlen(FileName) == CurrentDirectoryEntry->name_len))
+ if ((_strnicmp(FileName, CurrentDirectoryEntry->name, CurrentDirectoryEntry->namelen) == 0) &&
+ (strlen(FileName) == CurrentDirectoryEntry->namelen))
{
RtlCopyMemory(DirectoryEntry, CurrentDirectoryEntry, sizeof(EXT2_DIR_ENTRY));
DPRINTM(DPRINT_FILESYSTEM, "EXT2 Directory Entry:\n");
DPRINTM(DPRINT_FILESYSTEM, "inode = %d\n", DirectoryEntry->inode);
- DPRINTM(DPRINT_FILESYSTEM, "rec_len = %d\n", DirectoryEntry->rec_len);
- DPRINTM(DPRINT_FILESYSTEM, "name_len = %d\n", DirectoryEntry->name_len);
- DPRINTM(DPRINT_FILESYSTEM, "file_type = %d\n", DirectoryEntry->file_type);
+ DPRINTM(DPRINT_FILESYSTEM, "direntlen = %d\n", DirectoryEntry->direntlen);
+ DPRINTM(DPRINT_FILESYSTEM, "namelen = %d\n", DirectoryEntry->namelen);
+ DPRINTM(DPRINT_FILESYSTEM, "filetype = %d\n", DirectoryEntry->filetype);
DPRINTM(DPRINT_FILESYSTEM, "name = ");
- for (CurrentOffset=0; CurrentOffsetname_len; CurrentOffset++)
+ for (CurrentOffset=0; CurrentOffsetnamelen; CurrentOffset++)
{
DPRINTM(DPRINT_FILESYSTEM, "%c", DirectoryEntry->name[CurrentOffset]);
}
@@ -324,7 +349,7 @@ BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectoryS
return TRUE;
}
- CurrentOffset += CurrentDirectoryEntry->rec_len;
+ CurrentOffset += CurrentDirectoryEntry->direntlen;
}
return FALSE;
@@ -335,9 +360,8 @@ BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectoryS
* Reads BytesToRead from open file and
* returns the number of bytes read in BytesRead
*/
-BOOLEAN Ext2ReadFileBig(FILE *FileHandle, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer)
+BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer)
{
- PEXT2_FILE_INFO Ext2FileInfo = (PEXT2_FILE_INFO)FileHandle;
ULONG BlockNumber;
ULONG BlockNumberIndex;
ULONG OffsetInBlock;
@@ -356,7 +380,7 @@ BOOLEAN Ext2ReadFileBig(FILE *FileHandle, ULONGLONG BytesToRead, ULONGLONG* Byte
{
// Block pointer list is NULL
// so this better be a fast symbolic link or else
- if (((Ext2FileInfo->Inode.i_mode & EXT2_S_IFMT) != EXT2_S_IFLNK) ||
+ if (((Ext2FileInfo->Inode.mode & EXT2_S_IFMT) != EXT2_S_IFLNK) ||
(Ext2FileInfo->FileSize > FAST_SYMLINK_MAX_NAME_SIZE))
{
FileSystemError("Block pointer list is NULL and file is not a fast symbolic link.");
@@ -385,13 +409,13 @@ BOOLEAN Ext2ReadFileBig(FILE *FileHandle, ULONGLONG BytesToRead, ULONGLONG* Byte
// Check if this is a fast symbolic link
// if so then the read is easy
- if (((Ext2FileInfo->Inode.i_mode & EXT2_S_IFMT) == EXT2_S_IFLNK) &&
+ if (((Ext2FileInfo->Inode.mode & EXT2_S_IFMT) == EXT2_S_IFLNK) &&
(Ext2FileInfo->FileSize <= FAST_SYMLINK_MAX_NAME_SIZE))
{
DPRINTM(DPRINT_FILESYSTEM, "Reading fast symbolic link data\n");
// Copy the data from the link
- RtlCopyMemory(Buffer, (PVOID)((ULONG_PTR)Ext2FileInfo->FilePointer + Ext2FileInfo->Inode.i_block), BytesToRead);
+ RtlCopyMemory(Buffer, (PVOID)((ULONG_PTR)Ext2FileInfo->FilePointer + Ext2FileInfo->Inode.symlink), BytesToRead);
if (BytesRead != NULL)
{
@@ -519,43 +543,6 @@ BOOLEAN Ext2ReadFileBig(FILE *FileHandle, ULONGLONG BytesToRead, ULONGLONG* Byte
return TRUE;
}
-BOOLEAN Ext2ReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer)
-{
- BOOLEAN Success;
- ULONGLONG BytesReadBig;
-
- Success = Ext2ReadFileBig(FileHandle, BytesToRead, &BytesReadBig, Buffer);
- *BytesRead = (ULONG)BytesReadBig;
- return Success;
-}
-
-ULONG Ext2GetFileSize(FILE *FileHandle)
-{
- PEXT2_FILE_INFO Ext2FileHandle = (PEXT2_FILE_INFO)FileHandle;
-
- DPRINTM(DPRINT_FILESYSTEM, "Ext2GetFileSize() FileSize = %d\n", Ext2FileHandle->FileSize);
-
- return Ext2FileHandle->FileSize;
-}
-
-VOID Ext2SetFilePointer(FILE *FileHandle, ULONG NewFilePointer)
-{
- PEXT2_FILE_INFO Ext2FileHandle = (PEXT2_FILE_INFO)FileHandle;
-
- DPRINTM(DPRINT_FILESYSTEM, "Ext2SetFilePointer() NewFilePointer = %d\n", NewFilePointer);
-
- Ext2FileHandle->FilePointer = NewFilePointer;
-}
-
-ULONG Ext2GetFilePointer(FILE *FileHandle)
-{
- PEXT2_FILE_INFO Ext2FileHandle = (PEXT2_FILE_INFO)FileHandle;
-
- DPRINTM(DPRINT_FILESYSTEM, "Ext2GetFilePointer() FilePointer = %d\n", Ext2FileHandle->FilePointer);
-
- return Ext2FileHandle->FilePointer;
-}
-
BOOLEAN Ext2ReadVolumeSectors(UCHAR DriveNumber, ULONGLONG SectorNumber, ULONGLONG SectorCount, PVOID Buffer)
{
//GEOMETRY DiskGeometry;
@@ -609,60 +596,47 @@ BOOLEAN Ext2ReadSuperBlock(VOID)
RtlCopyMemory(Ext2SuperBlock, (PVOID)((ULONG_PTR)DISKREADBUFFER + 1024), 1024);
DPRINTM(DPRINT_FILESYSTEM, "Dumping super block:\n");
-
- DPRINTM(DPRINT_FILESYSTEM, "s_inodes_count: %d\n", Ext2SuperBlock->s_inodes_count);
- DPRINTM(DPRINT_FILESYSTEM, "s_blocks_count: %d\n", Ext2SuperBlock->s_blocks_count);
- DPRINTM(DPRINT_FILESYSTEM, "s_r_blocks_count: %d\n", Ext2SuperBlock->s_r_blocks_count);
- DPRINTM(DPRINT_FILESYSTEM, "s_free_blocks_count: %d\n", Ext2SuperBlock->s_free_blocks_count);
- DPRINTM(DPRINT_FILESYSTEM, "s_free_inodes_count: %d\n", Ext2SuperBlock->s_free_inodes_count);
- DPRINTM(DPRINT_FILESYSTEM, "s_first_data_block: %d\n", Ext2SuperBlock->s_first_data_block);
- DPRINTM(DPRINT_FILESYSTEM, "s_log_block_size: %d\n", Ext2SuperBlock->s_log_block_size);
- DPRINTM(DPRINT_FILESYSTEM, "s_log_frag_size: %d\n", Ext2SuperBlock->s_log_frag_size);
- DPRINTM(DPRINT_FILESYSTEM, "s_blocks_per_group: %d\n", Ext2SuperBlock->s_blocks_per_group);
- DPRINTM(DPRINT_FILESYSTEM, "s_frags_per_group: %d\n", Ext2SuperBlock->s_frags_per_group);
- DPRINTM(DPRINT_FILESYSTEM, "s_inodes_per_group: %d\n", Ext2SuperBlock->s_inodes_per_group);
- DPRINTM(DPRINT_FILESYSTEM, "s_mtime: %d\n", Ext2SuperBlock->s_mtime);
- DPRINTM(DPRINT_FILESYSTEM, "s_wtime: %d\n", Ext2SuperBlock->s_wtime);
- DPRINTM(DPRINT_FILESYSTEM, "s_mnt_count: %d\n", Ext2SuperBlock->s_mnt_count);
- DPRINTM(DPRINT_FILESYSTEM, "s_max_mnt_count: %d\n", Ext2SuperBlock->s_max_mnt_count);
- DPRINTM(DPRINT_FILESYSTEM, "s_magic: 0x%x\n", Ext2SuperBlock->s_magic);
- DPRINTM(DPRINT_FILESYSTEM, "s_state: %d\n", Ext2SuperBlock->s_state);
- DPRINTM(DPRINT_FILESYSTEM, "s_errors: %d\n", Ext2SuperBlock->s_errors);
- DPRINTM(DPRINT_FILESYSTEM, "s_minor_rev_level: %d\n", Ext2SuperBlock->s_minor_rev_level);
- DPRINTM(DPRINT_FILESYSTEM, "s_lastcheck: %d\n", Ext2SuperBlock->s_lastcheck);
- DPRINTM(DPRINT_FILESYSTEM, "s_checkinterval: %d\n", Ext2SuperBlock->s_checkinterval);
- DPRINTM(DPRINT_FILESYSTEM, "s_creator_os: %d\n", Ext2SuperBlock->s_creator_os);
- DPRINTM(DPRINT_FILESYSTEM, "s_rev_level: %d\n", Ext2SuperBlock->s_rev_level);
- DPRINTM(DPRINT_FILESYSTEM, "s_def_resuid: %d\n", Ext2SuperBlock->s_def_resuid);
- DPRINTM(DPRINT_FILESYSTEM, "s_def_resgid: %d\n", Ext2SuperBlock->s_def_resgid);
- DPRINTM(DPRINT_FILESYSTEM, "s_first_ino: %d\n", Ext2SuperBlock->s_first_ino);
- DPRINTM(DPRINT_FILESYSTEM, "s_inode_size: %d\n", Ext2SuperBlock->s_inode_size);
- DPRINTM(DPRINT_FILESYSTEM, "s_block_group_nr: %d\n", Ext2SuperBlock->s_block_group_nr);
- DPRINTM(DPRINT_FILESYSTEM, "s_feature_compat: 0x%x\n", Ext2SuperBlock->s_feature_compat);
- DPRINTM(DPRINT_FILESYSTEM, "s_feature_incompat: 0x%x\n", Ext2SuperBlock->s_feature_incompat);
- DPRINTM(DPRINT_FILESYSTEM, "s_feature_ro_compat: 0x%x\n", Ext2SuperBlock->s_feature_ro_compat);
- DPRINTM(DPRINT_FILESYSTEM, "s_uuid[16] = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", Ext2SuperBlock->s_uuid[0], Ext2SuperBlock->s_uuid[1], Ext2SuperBlock->s_uuid[2], Ext2SuperBlock->s_uuid[3], Ext2SuperBlock->s_uuid[4], Ext2SuperBlock->s_uuid[5], Ext2SuperBlock->s_uuid[6], Ext2SuperBlock->s_uuid[7], Ext2SuperBlock->s_uuid[8], Ext2SuperBlock->s_uuid[9], Ext2SuperBlock->s_uuid[10], Ext2SuperBlock->s_uuid[11], Ext2SuperBlock->s_uuid[12], Ext2SuperBlock->s_uuid[13], Ext2SuperBlock->s_uuid[14], Ext2SuperBlock->s_uuid[15]);
- DPRINTM(DPRINT_FILESYSTEM, "s_volume_name[16] = '%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c'\n", Ext2SuperBlock->s_volume_name[0], Ext2SuperBlock->s_volume_name[1], Ext2SuperBlock->s_volume_name[2], Ext2SuperBlock->s_volume_name[3], Ext2SuperBlock->s_volume_name[4], Ext2SuperBlock->s_volume_name[5], Ext2SuperBlock->s_volume_name[6], Ext2SuperBlock->s_volume_name[7], Ext2SuperBlock->s_volume_name[8], Ext2SuperBlock->s_volume_name[9], Ext2SuperBlock->s_volume_name[10], Ext2SuperBlock->s_volume_name[11], Ext2SuperBlock->s_volume_name[12], Ext2SuperBlock->s_volume_name[13], Ext2SuperBlock->s_volume_name[14], Ext2SuperBlock->s_volume_name[15]);
- DPRINTM(DPRINT_FILESYSTEM, "s_last_mounted[64]='%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c'\n", Ext2SuperBlock->s_last_mounted[0], Ext2SuperBlock->s_last_mounted[1], Ext2SuperBlock->s_last_mounted[2], Ext2SuperBlock->s_last_mounted[3], Ext2SuperBlock->s_last_mounted[4], Ext2SuperBlock->s_last_mounted[5], Ext2SuperBlock->s_last_mounted[6], Ext2SuperBlock->s_last_mounted[7], Ext2SuperBlock->s_last_mounted[8], Ext2SuperBlock->s_last_mounted[9],
- Ext2SuperBlock->s_last_mounted[10], Ext2SuperBlock->s_last_mounted[11], Ext2SuperBlock->s_last_mounted[12], Ext2SuperBlock->s_last_mounted[13], Ext2SuperBlock->s_last_mounted[14], Ext2SuperBlock->s_last_mounted[15], Ext2SuperBlock->s_last_mounted[16], Ext2SuperBlock->s_last_mounted[17], Ext2SuperBlock->s_last_mounted[18], Ext2SuperBlock->s_last_mounted[19],
- Ext2SuperBlock->s_last_mounted[20], Ext2SuperBlock->s_last_mounted[21], Ext2SuperBlock->s_last_mounted[22], Ext2SuperBlock->s_last_mounted[23], Ext2SuperBlock->s_last_mounted[24], Ext2SuperBlock->s_last_mounted[25], Ext2SuperBlock->s_last_mounted[26], Ext2SuperBlock->s_last_mounted[27], Ext2SuperBlock->s_last_mounted[28], Ext2SuperBlock->s_last_mounted[29],
- Ext2SuperBlock->s_last_mounted[30], Ext2SuperBlock->s_last_mounted[31], Ext2SuperBlock->s_last_mounted[32], Ext2SuperBlock->s_last_mounted[33], Ext2SuperBlock->s_last_mounted[34], Ext2SuperBlock->s_last_mounted[35], Ext2SuperBlock->s_last_mounted[36], Ext2SuperBlock->s_last_mounted[37], Ext2SuperBlock->s_last_mounted[38], Ext2SuperBlock->s_last_mounted[39],
- Ext2SuperBlock->s_last_mounted[40], Ext2SuperBlock->s_last_mounted[41], Ext2SuperBlock->s_last_mounted[42], Ext2SuperBlock->s_last_mounted[43], Ext2SuperBlock->s_last_mounted[44], Ext2SuperBlock->s_last_mounted[45], Ext2SuperBlock->s_last_mounted[46], Ext2SuperBlock->s_last_mounted[47], Ext2SuperBlock->s_last_mounted[48], Ext2SuperBlock->s_last_mounted[49],
- Ext2SuperBlock->s_last_mounted[50], Ext2SuperBlock->s_last_mounted[51], Ext2SuperBlock->s_last_mounted[52], Ext2SuperBlock->s_last_mounted[53], Ext2SuperBlock->s_last_mounted[54], Ext2SuperBlock->s_last_mounted[55], Ext2SuperBlock->s_last_mounted[56], Ext2SuperBlock->s_last_mounted[57], Ext2SuperBlock->s_last_mounted[58], Ext2SuperBlock->s_last_mounted[59],
- Ext2SuperBlock->s_last_mounted[60], Ext2SuperBlock->s_last_mounted[61], Ext2SuperBlock->s_last_mounted[62], Ext2SuperBlock->s_last_mounted[63]);
- DPRINTM(DPRINT_FILESYSTEM, "s_algorithm_usage_bitmap = 0x%x\n", Ext2SuperBlock->s_algorithm_usage_bitmap);
- DPRINTM(DPRINT_FILESYSTEM, "s_prealloc_blocks = %d\n", Ext2SuperBlock->s_prealloc_blocks);
- DPRINTM(DPRINT_FILESYSTEM, "s_prealloc_dir_blocks = %d\n", Ext2SuperBlock->s_prealloc_dir_blocks);
- DPRINTM(DPRINT_FILESYSTEM, "s_padding1 = %d\n", Ext2SuperBlock->s_padding1);
- DPRINTM(DPRINT_FILESYSTEM, "s_journal_uuid[16] = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", Ext2SuperBlock->s_journal_uuid[0], Ext2SuperBlock->s_journal_uuid[1], Ext2SuperBlock->s_journal_uuid[2], Ext2SuperBlock->s_journal_uuid[3], Ext2SuperBlock->s_journal_uuid[4], Ext2SuperBlock->s_journal_uuid[5], Ext2SuperBlock->s_journal_uuid[6], Ext2SuperBlock->s_journal_uuid[7], Ext2SuperBlock->s_journal_uuid[8], Ext2SuperBlock->s_journal_uuid[9], Ext2SuperBlock->s_journal_uuid[10], Ext2SuperBlock->s_journal_uuid[11], Ext2SuperBlock->s_journal_uuid[12], Ext2SuperBlock->s_journal_uuid[13], Ext2SuperBlock->s_journal_uuid[14], Ext2SuperBlock->s_journal_uuid[15]);
- DPRINTM(DPRINT_FILESYSTEM, "s_journal_inum = %d\n", Ext2SuperBlock->s_journal_inum);
- DPRINTM(DPRINT_FILESYSTEM, "s_journal_dev = %d\n", Ext2SuperBlock->s_journal_dev);
- DPRINTM(DPRINT_FILESYSTEM, "s_last_orphan = %d\n", Ext2SuperBlock->s_last_orphan);
+ DPRINTM(DPRINT_FILESYSTEM, "total_inodes: %d\n", Ext2SuperBlock->total_inodes);
+ DPRINTM(DPRINT_FILESYSTEM, "total_blocks: %d\n", Ext2SuperBlock->total_blocks);
+ DPRINTM(DPRINT_FILESYSTEM, "reserved_blocks: %d\n", Ext2SuperBlock->reserved_blocks);
+ DPRINTM(DPRINT_FILESYSTEM, "free_blocks: %d\n", Ext2SuperBlock->free_blocks);
+ DPRINTM(DPRINT_FILESYSTEM, "free_inodes: %d\n", Ext2SuperBlock->free_inodes);
+ DPRINTM(DPRINT_FILESYSTEM, "first_data_block: %d\n", Ext2SuperBlock->first_data_block);
+ DPRINTM(DPRINT_FILESYSTEM, "log2_block_size: %d\n", Ext2SuperBlock->log2_block_size);
+ DPRINTM(DPRINT_FILESYSTEM, "log2_fragment_size: %d\n", Ext2SuperBlock->log2_fragment_size);
+ DPRINTM(DPRINT_FILESYSTEM, "blocks_per_group: %d\n", Ext2SuperBlock->blocks_per_group);
+ DPRINTM(DPRINT_FILESYSTEM, "fragments_per_group: %d\n", Ext2SuperBlock->fragments_per_group);
+ DPRINTM(DPRINT_FILESYSTEM, "inodes_per_group: %d\n", Ext2SuperBlock->inodes_per_group);
+ DPRINTM(DPRINT_FILESYSTEM, "mtime: %d\n", Ext2SuperBlock->mtime);
+ DPRINTM(DPRINT_FILESYSTEM, "utime: %d\n", Ext2SuperBlock->utime);
+ DPRINTM(DPRINT_FILESYSTEM, "mnt_count: %d\n", Ext2SuperBlock->mnt_count);
+ DPRINTM(DPRINT_FILESYSTEM, "max_mnt_count: %d\n", Ext2SuperBlock->max_mnt_count);
+ DPRINTM(DPRINT_FILESYSTEM, "magic: 0x%x\n", Ext2SuperBlock->magic);
+ DPRINTM(DPRINT_FILESYSTEM, "fs_state: %d\n", Ext2SuperBlock->fs_state);
+ DPRINTM(DPRINT_FILESYSTEM, "error_handling: %d\n", Ext2SuperBlock->error_handling);
+ DPRINTM(DPRINT_FILESYSTEM, "minor_revision_level: %d\n", Ext2SuperBlock->minor_revision_level);
+ DPRINTM(DPRINT_FILESYSTEM, "lastcheck: %d\n", Ext2SuperBlock->lastcheck);
+ DPRINTM(DPRINT_FILESYSTEM, "checkinterval: %d\n", Ext2SuperBlock->checkinterval);
+ DPRINTM(DPRINT_FILESYSTEM, "creator_os: %d\n", Ext2SuperBlock->creator_os);
+ DPRINTM(DPRINT_FILESYSTEM, "revision_level: %d\n", Ext2SuperBlock->revision_level);
+ DPRINTM(DPRINT_FILESYSTEM, "uid_reserved: %d\n", Ext2SuperBlock->uid_reserved);
+ DPRINTM(DPRINT_FILESYSTEM, "gid_reserved: %d\n", Ext2SuperBlock->gid_reserved);
+ DPRINTM(DPRINT_FILESYSTEM, "first_inode: %d\n", Ext2SuperBlock->first_inode);
+ DPRINTM(DPRINT_FILESYSTEM, "inode_size: %d\n", Ext2SuperBlock->inode_size);
+ DPRINTM(DPRINT_FILESYSTEM, "block_group_number: %d\n", Ext2SuperBlock->block_group_number);
+ DPRINTM(DPRINT_FILESYSTEM, "feature_compatibility: 0x%x\n", Ext2SuperBlock->feature_compatibility);
+ DPRINTM(DPRINT_FILESYSTEM, "feature_incompat: 0x%x\n", Ext2SuperBlock->feature_incompat);
+ DPRINTM(DPRINT_FILESYSTEM, "feature_ro_compat: 0x%x\n", Ext2SuperBlock->feature_ro_compat);
+ DPRINTM(DPRINT_FILESYSTEM, "unique_id = { 0x%x, 0x%x, 0x%x, 0x%x }\n",
+ Ext2SuperBlock->unique_id[0], Ext2SuperBlock->unique_id[1], Ext2SuperBlock->unique_id[2], Ext2SuperBlock->unique_id[3]);
+ DPRINTM(DPRINT_FILESYSTEM, "volume_name = '%.16s'\n", Ext2SuperBlock->volume_name);
+ DPRINTM(DPRINT_FILESYSTEM, "last_mounted_on = '%.64s'\n", Ext2SuperBlock->last_mounted_on);
+ DPRINTM(DPRINT_FILESYSTEM, "compression_info = 0x%x\n", Ext2SuperBlock->compression_info);
//
// Check the super block magic
//
- if (Ext2SuperBlock->s_magic != EXT3_SUPER_MAGIC)
+ if (Ext2SuperBlock->magic != EXT2_MAGIC)
{
FileSystemError("Invalid super block magic (0xef53)");
return FALSE;
@@ -671,7 +645,7 @@ BOOLEAN Ext2ReadSuperBlock(VOID)
//
// Check the revision level
//
- if (Ext2SuperBlock->s_rev_level > EXT3_DYNAMIC_REV)
+ if (Ext2SuperBlock->revision_level > EXT2_DYNAMIC_REVISION)
{
FileSystemError("FreeLoader does not understand the revision of this EXT2/EXT3 filesystem.\nPlease update FreeLoader.");
return FALSE;
@@ -682,33 +656,33 @@ BOOLEAN Ext2ReadSuperBlock(VOID)
// Don't need to check the compatible or read-only compatible features
// because we only mount the filesystem as read-only
//
- if ((Ext2SuperBlock->s_rev_level >= EXT3_DYNAMIC_REV) &&
+ if ((Ext2SuperBlock->revision_level >= EXT2_DYNAMIC_REVISION) &&
(/*((Ext2SuperBlock->s_feature_compat & ~EXT3_FEATURE_COMPAT_SUPP) != 0) ||*/
/*((Ext2SuperBlock->s_feature_ro_compat & ~EXT3_FEATURE_RO_COMPAT_SUPP) != 0) ||*/
- ((Ext2SuperBlock->s_feature_incompat & ~EXT3_FEATURE_INCOMPAT_SUPP) != 0)))
+ ((Ext2SuperBlock->feature_incompat & ~EXT3_FEATURE_INCOMPAT_SUPP) != 0)))
{
FileSystemError("FreeLoader does not understand features of this EXT2/EXT3 filesystem.\nPlease update FreeLoader.");
return FALSE;
}
// Calculate the group count
- Ext2GroupCount = (Ext2SuperBlock->s_blocks_count - Ext2SuperBlock->s_first_data_block + Ext2SuperBlock->s_blocks_per_group - 1) / Ext2SuperBlock->s_blocks_per_group;
+ Ext2GroupCount = (Ext2SuperBlock->total_blocks - Ext2SuperBlock->first_data_block + Ext2SuperBlock->blocks_per_group - 1) / Ext2SuperBlock->blocks_per_group;
DPRINTM(DPRINT_FILESYSTEM, "Ext2GroupCount: %d\n", Ext2GroupCount);
// Calculate the block size
- Ext2BlockSizeInBytes = 1024 << Ext2SuperBlock->s_log_block_size;
+ Ext2BlockSizeInBytes = 1024 << Ext2SuperBlock->log2_block_size;
Ext2BlockSizeInSectors = Ext2BlockSizeInBytes / Ext2DiskGeometry.BytesPerSector;
DPRINTM(DPRINT_FILESYSTEM, "Ext2BlockSizeInBytes: %d\n", Ext2BlockSizeInBytes);
DPRINTM(DPRINT_FILESYSTEM, "Ext2BlockSizeInSectors: %d\n", Ext2BlockSizeInSectors);
// Calculate the fragment size
- if (Ext2SuperBlock->s_log_frag_size >= 0)
+ if (Ext2SuperBlock->log2_fragment_size >= 0)
{
- Ext2FragmentSizeInBytes = 1024 << Ext2SuperBlock->s_log_frag_size;
+ Ext2FragmentSizeInBytes = 1024 << Ext2SuperBlock->log2_fragment_size;
}
else
{
- Ext2FragmentSizeInBytes = 1024 >> -(Ext2SuperBlock->s_log_frag_size);
+ Ext2FragmentSizeInBytes = 1024 >> -(Ext2SuperBlock->log2_fragment_size);
}
Ext2FragmentSizeInSectors = Ext2FragmentSizeInBytes / Ext2DiskGeometry.BytesPerSector;
DPRINTM(DPRINT_FILESYSTEM, "Ext2FragmentSizeInBytes: %d\n", Ext2FragmentSizeInBytes);
@@ -722,11 +696,11 @@ BOOLEAN Ext2ReadSuperBlock(VOID)
}
// Calculate the number of inodes in one block
- Ext2InodesPerBlock = Ext2BlockSizeInBytes / EXT3_INODE_SIZE(Ext2SuperBlock);
+ Ext2InodesPerBlock = Ext2BlockSizeInBytes / EXT2_INODE_SIZE(Ext2SuperBlock);
DPRINTM(DPRINT_FILESYSTEM, "Ext2InodesPerBlock: %d\n", Ext2InodesPerBlock);
// Calculate the number of group descriptors in one block
- Ext2GroupDescPerBlock = EXT3_DESC_PER_BLOCK(Ext2SuperBlock);
+ Ext2GroupDescPerBlock = EXT2_DESC_PER_BLOCK(Ext2SuperBlock);
DPRINTM(DPRINT_FILESYSTEM, "Ext2GroupDescPerBlock: %d\n", Ext2GroupDescPerBlock);
return TRUE;
@@ -767,7 +741,7 @@ BOOLEAN Ext2ReadGroupDescriptors(VOID)
// Now read the group descriptors
for (CurrentGroupDescBlock=0; CurrentGroupDescBlocks_first_data_block + 1 + CurrentGroupDescBlock, (PVOID)FILESYSBUFFER))
+ if (!Ext2ReadBlock(Ext2SuperBlock->first_data_block + 1 + CurrentGroupDescBlock, (PVOID)FILESYSBUFFER))
{
return FALSE;
}
@@ -791,7 +765,7 @@ BOOLEAN Ext2ReadDirectory(ULONG Inode, PVOID* DirectoryBuffer, PEXT2_INODE Inode
}
// Make sure it is a directory inode
- if ((InodePointer->i_mode & EXT2_S_IFMT) != EXT2_S_IFDIR)
+ if ((InodePointer->mode & EXT2_S_IFMT) != EXT2_S_IFDIR)
{
FileSystemError("Inode is not a directory.");
return FALSE;
@@ -839,12 +813,12 @@ BOOLEAN Ext2ReadDirectory(ULONG Inode, PVOID* DirectoryBuffer, PEXT2_INODE Inode
BOOLEAN Ext2ReadBlock(ULONG BlockNumber, PVOID Buffer)
{
- CHAR ErrorString[80];
+ CHAR ErrorString[80];
DPRINTM(DPRINT_FILESYSTEM, "Ext2ReadBlock() BlockNumber = %d Buffer = 0x%x\n", BlockNumber, Buffer);
// Make sure its a valid block
- if (BlockNumber > Ext2SuperBlock->s_blocks_count)
+ if (BlockNumber > Ext2SuperBlock->total_blocks)
{
sprintf(ErrorString, "Error reading block %d - block out of range.", (int) BlockNumber);
FileSystemError(ErrorString);
@@ -885,7 +859,7 @@ BOOLEAN Ext2ReadPartialBlock(ULONG BlockNumber, ULONG StartingOffset, ULONG Leng
ULONG Ext2GetGroupDescBlockNumber(ULONG Group)
{
- return (((Group * sizeof(EXT2_GROUP_DESC)) / Ext2GroupDescPerBlock) + Ext2SuperBlock->s_first_data_block + 1);
+ return (((Group * sizeof(EXT2_GROUP_DESC)) / Ext2GroupDescPerBlock) + Ext2SuperBlock->first_data_block + 1);
}
ULONG Ext2GetGroupDescOffsetInBlock(ULONG Group)
@@ -895,31 +869,31 @@ ULONG Ext2GetGroupDescOffsetInBlock(ULONG Group)
ULONG Ext2GetInodeGroupNumber(ULONG Inode)
{
- return ((Inode - 1) / Ext2SuperBlock->s_inodes_per_group);
+ return ((Inode - 1) / Ext2SuperBlock->inodes_per_group);
}
ULONG Ext2GetInodeBlockNumber(ULONG Inode)
{
- return (((Inode - 1) % Ext2SuperBlock->s_inodes_per_group) / Ext2InodesPerBlock);
+ return (((Inode - 1) % Ext2SuperBlock->inodes_per_group) / Ext2InodesPerBlock);
}
ULONG Ext2GetInodeOffsetInBlock(ULONG Inode)
{
- return (((Inode - 1) % Ext2SuperBlock->s_inodes_per_group) % Ext2InodesPerBlock);
+ return (((Inode - 1) % Ext2SuperBlock->inodes_per_group) % Ext2InodesPerBlock);
}
BOOLEAN Ext2ReadInode(ULONG Inode, PEXT2_INODE InodeBuffer)
{
- ULONG InodeGroupNumber;
- ULONG InodeBlockNumber;
- ULONG InodeOffsetInBlock;
- CHAR ErrorString[80];
+ ULONG InodeGroupNumber;
+ ULONG InodeBlockNumber;
+ ULONG InodeOffsetInBlock;
+ CHAR ErrorString[80];
EXT2_GROUP_DESC GroupDescriptor;
DPRINTM(DPRINT_FILESYSTEM, "Ext2ReadInode() Inode = %d\n", Inode);
// Make sure its a valid inode
- if ((Inode < 1) || (Inode > Ext2SuperBlock->s_inodes_count))
+ if ((Inode < 1) || (Inode > Ext2SuperBlock->total_inodes))
{
sprintf(ErrorString, "Error reading inode %ld - inode out of range.", Inode);
FileSystemError(ErrorString);
@@ -941,7 +915,7 @@ BOOLEAN Ext2ReadInode(ULONG Inode, PEXT2_INODE InodeBuffer)
}
// Add the start block of the inode table to the inode block number
- InodeBlockNumber += GroupDescriptor.bg_inode_table;
+ InodeBlockNumber += GroupDescriptor.inode_table_id;
DPRINTM(DPRINT_FILESYSTEM, "InodeBlockNumber (after group desc correction) = %d\n", InodeBlockNumber);
// Read the block
@@ -951,29 +925,34 @@ BOOLEAN Ext2ReadInode(ULONG Inode, PEXT2_INODE InodeBuffer)
}
// Copy the data to their buffer
- RtlCopyMemory(InodeBuffer, (PVOID)((ULONG_PTR)FILESYSBUFFER + (InodeOffsetInBlock * EXT3_INODE_SIZE(Ext2SuperBlock))), sizeof(EXT2_INODE));
+ RtlCopyMemory(InodeBuffer, (PVOID)((ULONG_PTR)FILESYSBUFFER + (InodeOffsetInBlock * EXT2_INODE_SIZE(Ext2SuperBlock))), sizeof(EXT2_INODE));
DPRINTM(DPRINT_FILESYSTEM, "Dumping inode information:\n");
- DPRINTM(DPRINT_FILESYSTEM, "i_mode = 0x%x\n", InodeBuffer->i_mode);
- DPRINTM(DPRINT_FILESYSTEM, "i_uid = %d\n", InodeBuffer->i_uid);
- DPRINTM(DPRINT_FILESYSTEM, "i_size = %d\n", InodeBuffer->i_size);
- DPRINTM(DPRINT_FILESYSTEM, "i_atime = %d\n", InodeBuffer->i_atime);
- DPRINTM(DPRINT_FILESYSTEM, "i_ctime = %d\n", InodeBuffer->i_ctime);
- DPRINTM(DPRINT_FILESYSTEM, "i_mtime = %d\n", InodeBuffer->i_mtime);
- DPRINTM(DPRINT_FILESYSTEM, "i_dtime = %d\n", InodeBuffer->i_dtime);
- DPRINTM(DPRINT_FILESYSTEM, "i_gid = %d\n", InodeBuffer->i_gid);
- DPRINTM(DPRINT_FILESYSTEM, "i_links_count = %d\n", InodeBuffer->i_links_count);
- DPRINTM(DPRINT_FILESYSTEM, "i_blocks = %d\n", InodeBuffer->i_blocks);
- DPRINTM(DPRINT_FILESYSTEM, "i_flags = 0x%x\n", InodeBuffer->i_flags);
- DPRINTM(DPRINT_FILESYSTEM, "i_block[EXT3_N_BLOCKS (%d)] =\n%d,\n%d,\n%d,\n%d,\n%d,\n%d,\n%d,\n%d,\n%d,\n%d,\n%d,\n%d,\n%d,\n%d,\n%d\n", EXT3_N_BLOCKS, InodeBuffer->i_block[0], InodeBuffer->i_block[1], InodeBuffer->i_block[2], InodeBuffer->i_block[3], InodeBuffer->i_block[4], InodeBuffer->i_block[5], InodeBuffer->i_block[6], InodeBuffer->i_block[7], InodeBuffer->i_block[8], InodeBuffer->i_block[9], InodeBuffer->i_block[10], InodeBuffer->i_block[11], InodeBuffer->i_block[12], InodeBuffer->i_block[13], InodeBuffer->i_block[14]);
- DPRINTM(DPRINT_FILESYSTEM, "i_generation = %d\n", InodeBuffer->i_generation);
- DPRINTM(DPRINT_FILESYSTEM, "i_file_acl = %d\n", InodeBuffer->i_file_acl);
- DPRINTM(DPRINT_FILESYSTEM, "i_dir_acl = %d\n", InodeBuffer->i_dir_acl);
- DPRINTM(DPRINT_FILESYSTEM, "i_faddr = %d\n", InodeBuffer->i_faddr);
- DPRINTM(DPRINT_FILESYSTEM, "l_i_frag = %d\n", InodeBuffer->osd2.linux2.l_i_frag);
- DPRINTM(DPRINT_FILESYSTEM, "l_i_fsize = %d\n", InodeBuffer->osd2.linux2.l_i_fsize);
- DPRINTM(DPRINT_FILESYSTEM, "l_i_uid_high = %d\n", InodeBuffer->osd2.linux2.l_i_uid_high);
- DPRINTM(DPRINT_FILESYSTEM, "l_i_gid_high = %d\n", InodeBuffer->osd2.linux2.l_i_gid_high);
+ DPRINTM(DPRINT_FILESYSTEM, "mode = 0x%x\n", InodeBuffer->mode);
+ DPRINTM(DPRINT_FILESYSTEM, "uid = %d\n", InodeBuffer->uid);
+ DPRINTM(DPRINT_FILESYSTEM, "size = %d\n", InodeBuffer->size);
+ DPRINTM(DPRINT_FILESYSTEM, "atime = %d\n", InodeBuffer->atime);
+ DPRINTM(DPRINT_FILESYSTEM, "ctime = %d\n", InodeBuffer->ctime);
+ DPRINTM(DPRINT_FILESYSTEM, "mtime = %d\n", InodeBuffer->mtime);
+ DPRINTM(DPRINT_FILESYSTEM, "dtime = %d\n", InodeBuffer->dtime);
+ DPRINTM(DPRINT_FILESYSTEM, "gid = %d\n", InodeBuffer->gid);
+ DPRINTM(DPRINT_FILESYSTEM, "nlinks = %d\n", InodeBuffer->nlinks);
+ DPRINTM(DPRINT_FILESYSTEM, "blockcnt = %d\n", InodeBuffer->blockcnt);
+ DPRINTM(DPRINT_FILESYSTEM, "flags = 0x%x\n", InodeBuffer->flags);
+ DPRINTM(DPRINT_FILESYSTEM, "osd1 = 0x%x\n", InodeBuffer->osd1);
+ DPRINTM(DPRINT_FILESYSTEM, "dir_blocks = { %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u }\n",
+ InodeBuffer->blocks.dir_blocks[0], InodeBuffer->blocks.dir_blocks[1], InodeBuffer->blocks.dir_blocks[ 2], InodeBuffer->blocks.dir_blocks[ 3],
+ InodeBuffer->blocks.dir_blocks[4], InodeBuffer->blocks.dir_blocks[5], InodeBuffer->blocks.dir_blocks[ 6], InodeBuffer->blocks.dir_blocks[ 7],
+ InodeBuffer->blocks.dir_blocks[8], InodeBuffer->blocks.dir_blocks[9], InodeBuffer->blocks.dir_blocks[10], InodeBuffer->blocks.dir_blocks[11]);
+ DPRINTM(DPRINT_FILESYSTEM, "indir_block = %u\n", InodeBuffer->blocks.indir_block);
+ DPRINTM(DPRINT_FILESYSTEM, "double_indir_block = %u\n", InodeBuffer->blocks.double_indir_block);
+ DPRINTM(DPRINT_FILESYSTEM, "tripple_indir_block = %u\n", InodeBuffer->blocks.tripple_indir_block);
+ DPRINTM(DPRINT_FILESYSTEM, "version = %d\n", InodeBuffer->version);
+ DPRINTM(DPRINT_FILESYSTEM, "acl = %d\n", InodeBuffer->acl);
+ DPRINTM(DPRINT_FILESYSTEM, "dir_acl = %d\n", InodeBuffer->dir_acl);
+ DPRINTM(DPRINT_FILESYSTEM, "fragment_addr = %d\n", InodeBuffer->fragment_addr);
+ DPRINTM(DPRINT_FILESYSTEM, "osd2 = { %d, %d, %d }\n",
+ InodeBuffer->osd2[0], InodeBuffer->osd2[1], InodeBuffer->osd2[2]);
return TRUE;
}
@@ -992,12 +971,12 @@ BOOLEAN Ext2ReadGroupDescriptor(ULONG Group, PEXT2_GROUP_DESC GroupBuffer)
RtlCopyMemory(GroupBuffer, &Ext2GroupDescriptors[Group], sizeof(EXT2_GROUP_DESC));
DPRINTM(DPRINT_FILESYSTEM, "Dumping group descriptor:\n");
- DPRINTM(DPRINT_FILESYSTEM, "bg_block_bitmap = %d\n", GroupBuffer->bg_block_bitmap);
- DPRINTM(DPRINT_FILESYSTEM, "bg_inode_bitmap = %d\n", GroupBuffer->bg_inode_bitmap);
- DPRINTM(DPRINT_FILESYSTEM, "bg_inode_table = %d\n", GroupBuffer->bg_inode_table);
- DPRINTM(DPRINT_FILESYSTEM, "bg_free_blocks_count = %d\n", GroupBuffer->bg_free_blocks_count);
- DPRINTM(DPRINT_FILESYSTEM, "bg_free_inodes_count = %d\n", GroupBuffer->bg_free_inodes_count);
- DPRINTM(DPRINT_FILESYSTEM, "bg_used_dirs_count = %d\n", GroupBuffer->bg_used_dirs_count);
+ DPRINTM(DPRINT_FILESYSTEM, "block_id = %d\n", GroupBuffer->block_id);
+ DPRINTM(DPRINT_FILESYSTEM, "inode_id = %d\n", GroupBuffer->inode_id);
+ DPRINTM(DPRINT_FILESYSTEM, "inode_table_id = %d\n", GroupBuffer->inode_table_id);
+ DPRINTM(DPRINT_FILESYSTEM, "free_blocks = %d\n", GroupBuffer->free_blocks);
+ DPRINTM(DPRINT_FILESYSTEM, "free_inodes = %d\n", GroupBuffer->free_inodes);
+ DPRINTM(DPRINT_FILESYSTEM, "used_dirs = %d\n", GroupBuffer->used_dirs);
return TRUE;
}
@@ -1030,19 +1009,19 @@ ULONG* Ext2ReadBlockPointerList(PEXT2_INODE Inode)
}
RtlZeroMemory(BlockList, BlockCount * sizeof(ULONG));
- CurrentBlockInList = 0;
// Copy the direct block pointers
- for (CurrentBlock=0; CurrentBlockInListi_block[CurrentBlock];
- CurrentBlockInList++;
+ BlockList[CurrentBlockInList] = Inode->blocks.dir_blocks[CurrentBlock];
}
// Copy the indirect block pointers
if (CurrentBlockInList < BlockCount)
{
- if (!Ext2CopyIndirectBlockPointers(BlockList, &CurrentBlockInList, BlockCount, Inode->i_block[EXT3_IND_BLOCK]))
+ if (!Ext2CopyIndirectBlockPointers(BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.indir_block))
{
MmHeapFree(BlockList);
return FALSE;
@@ -1052,7 +1031,7 @@ ULONG* Ext2ReadBlockPointerList(PEXT2_INODE Inode)
// Copy the double indirect block pointers
if (CurrentBlockInList < BlockCount)
{
- if (!Ext2CopyDoubleIndirectBlockPointers(BlockList, &CurrentBlockInList, BlockCount, Inode->i_block[EXT3_DIND_BLOCK]))
+ if (!Ext2CopyDoubleIndirectBlockPointers(BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.double_indir_block))
{
MmHeapFree(BlockList);
return FALSE;
@@ -1062,7 +1041,7 @@ ULONG* Ext2ReadBlockPointerList(PEXT2_INODE Inode)
// Copy the triple indirect block pointers
if (CurrentBlockInList < BlockCount)
{
- if (!Ext2CopyTripleIndirectBlockPointers(BlockList, &CurrentBlockInList, BlockCount, Inode->i_block[EXT3_TIND_BLOCK]))
+ if (!Ext2CopyTripleIndirectBlockPointers(BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.tripple_indir_block))
{
MmHeapFree(BlockList);
return FALSE;
@@ -1074,21 +1053,21 @@ ULONG* Ext2ReadBlockPointerList(PEXT2_INODE Inode)
ULONGLONG Ext2GetInodeFileSize(PEXT2_INODE Inode)
{
- if ((Inode->i_mode & EXT2_S_IFMT) == EXT2_S_IFDIR)
+ if ((Inode->mode & EXT2_S_IFMT) == EXT2_S_IFDIR)
{
- return (ULONGLONG)(Inode->i_size);
+ return (ULONGLONG)(Inode->size);
}
else
{
- return ((ULONGLONG)(Inode->i_size) | ((ULONGLONG)(Inode->i_dir_acl) << 32));
+ return ((ULONGLONG)(Inode->size) | ((ULONGLONG)(Inode->dir_acl) << 32));
}
}
BOOLEAN Ext2CopyIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG IndirectBlock)
{
ULONG* BlockBuffer = (ULONG*)FILESYSBUFFER;
- ULONG CurrentBlock;
- ULONG BlockPointersPerBlock;
+ ULONG CurrentBlock;
+ ULONG BlockPointersPerBlock;
DPRINTM(DPRINT_FILESYSTEM, "Ext2CopyIndirectBlockPointers() BlockCount = %d\n", BlockCount);
@@ -1111,8 +1090,8 @@ BOOLEAN Ext2CopyIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInLis
BOOLEAN Ext2CopyDoubleIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG DoubleIndirectBlock)
{
ULONG* BlockBuffer;
- ULONG CurrentBlock;
- ULONG BlockPointersPerBlock;
+ ULONG CurrentBlock;
+ ULONG BlockPointersPerBlock;
DPRINTM(DPRINT_FILESYSTEM, "Ext2CopyDoubleIndirectBlockPointers() BlockCount = %d\n", BlockCount);
@@ -1146,8 +1125,8 @@ BOOLEAN Ext2CopyDoubleIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBloc
BOOLEAN Ext2CopyTripleIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG TripleIndirectBlock)
{
ULONG* BlockBuffer;
- ULONG CurrentBlock;
- ULONG BlockPointersPerBlock;
+ ULONG CurrentBlock;
+ ULONG BlockPointersPerBlock;
DPRINTM(DPRINT_FILESYSTEM, "Ext2CopyTripleIndirectBlockPointers() BlockCount = %d\n", BlockCount);
@@ -1178,12 +1157,144 @@ BOOLEAN Ext2CopyTripleIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBloc
return TRUE;
}
-const FS_VTBL Ext2Vtbl = {
- Ext2OpenVolume,
- Ext2OpenFile,
- NULL,
- Ext2ReadFile,
- Ext2GetFileSize,
- Ext2SetFilePointer,
- Ext2GetFilePointer,
+LONG Ext2Close(ULONG FileId)
+{
+ PEXT2_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
+
+ MmHeapFree(FileHandle);
+
+ return ESUCCESS;
+}
+
+LONG Ext2GetFileInformation(ULONG FileId, FILEINFORMATION* Information)
+{
+ PEXT2_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
+
+ RtlZeroMemory(Information, sizeof(FILEINFORMATION));
+ Information->EndingAddress.LowPart = FileHandle->FileSize;
+ Information->CurrentAddress.LowPart = FileHandle->FilePointer;
+
+ DPRINTM(DPRINT_FILESYSTEM, "Ext2GetFileInformation() FileSize = %d\n",
+ Information->EndingAddress.LowPart);
+ DPRINTM(DPRINT_FILESYSTEM, "Ext2GetFileInformation() FilePointer = %d\n",
+ Information->CurrentAddress.LowPart);
+
+ return ESUCCESS;
+}
+
+LONG Ext2Open(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
+{
+ PEXT2_FILE_INFO FileHandle;
+ ULONG DeviceId;
+
+ if (OpenMode != OpenReadOnly)
+ return EACCES;
+
+ DeviceId = FsGetDeviceId(*FileId);
+
+ DPRINTM(DPRINT_FILESYSTEM, "Ext2Open() FileName = %s\n", Path);
+
+ //
+ // Call old open method
+ //
+ FileHandle = Ext2OpenFile(Path);
+
+ //
+ // Check for error
+ //
+ if (!FileHandle)
+ return ENOENT;
+
+ //
+ // Success. Remember the handle
+ //
+ FsSetDeviceSpecific(*FileId, FileHandle);
+ return ESUCCESS;
+}
+
+LONG Ext2Read(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
+{
+ PEXT2_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
+ ULONGLONG BytesReadBig;
+ BOOLEAN ret;
+
+ //
+ // Read data
+ //
+ ret = Ext2ReadFileBig(FileHandle, N, &BytesReadBig, Buffer);
+ *Count = (ULONG)BytesReadBig;
+
+ //
+ // Check for success
+ //
+ if (ret)
+ return ESUCCESS;
+ else
+ return EIO;
+}
+
+LONG Ext2Seek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode)
+{
+ PEXT2_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
+
+ DPRINTM(DPRINT_FILESYSTEM, "Ext2Seek() NewFilePointer = %lu\n", Position->LowPart);
+
+ if (SeekMode != SeekAbsolute)
+ return EINVAL;
+ if (Position->HighPart != 0)
+ return EINVAL;
+ if (Position->LowPart >= FileHandle->FileSize)
+ return EINVAL;
+
+ FileHandle->FilePointer = Position->LowPart;
+ return ESUCCESS;
+}
+
+const DEVVTBL Ext2FuncTable =
+{
+ Ext2Close,
+ Ext2GetFileInformation,
+ Ext2Open,
+ Ext2Read,
+ Ext2Seek,
};
+
+const DEVVTBL* Ext2Mount(ULONG DeviceId)
+{
+ EXT2_SUPER_BLOCK SuperBlock;
+ LARGE_INTEGER Position;
+ ULONG Count;
+ LONG ret;
+
+ //
+ // Read the SuperBlock
+ //
+ Position.HighPart = 0;
+ Position.LowPart = 2 * 512;
+ ret = ArcSeek(DeviceId, &Position, SeekAbsolute);
+ if (ret != ESUCCESS)
+ return NULL;
+ ret = ArcRead(DeviceId, &SuperBlock, sizeof(SuperBlock), &Count);
+ if (ret != ESUCCESS || Count != sizeof(SuperBlock))
+ return NULL;
+
+ //
+ // Check if SuperBlock is valid. If yes, return Ext2 function table
+ //
+ if (SuperBlock.magic == EXT2_MAGIC)
+ {
+ //
+ // Compatibility hack as long as FS is not using underlying device DeviceId
+ //
+ ULONG DriveNumber;
+ ULONGLONG StartSector;
+ ULONGLONG SectorCount;
+ int Type;
+ if (!MachDiskGetBootVolume(&DriveNumber, &StartSector, &SectorCount, &Type))
+ return NULL;
+ Ext2OpenVolume(DriveNumber, StartSector, SectorCount);
+ return &Ext2FuncTable;
+ }
+ else
+ return NULL;
+}
diff --git a/reactos/boot/freeldr/freeldr/fs/fat.c b/reactos/boot/freeldr/freeldr/fs/fat.c
index 5f24cef22e9..ee40b891360 100644
--- a/reactos/boot/freeldr/freeldr/fs/fat.c
+++ b/reactos/boot/freeldr/freeldr/fs/fat.c
@@ -22,6 +22,20 @@
#define NDEBUG
#include
+ULONG FatDetermineFatType(PFAT_BOOTSECTOR FatBootSector, ULONG PartitionSectorCount);
+PVOID FatBufferDirectory(ULONG DirectoryStartCluster, ULONG* EntryCountPointer, BOOLEAN RootDirectory);
+BOOLEAN FatSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG EntryCount, PCHAR FileName, PFAT_FILE_INFO FatFileInfoPointer);
+LONG FatLookupFile(PCSTR FileName, ULONG DeviceId, PFAT_FILE_INFO FatFileInfoPointer);
+void FatParseShortFileName(PCHAR Buffer, PDIRENTRY DirEntry);
+BOOLEAN FatGetFatEntry(ULONG Cluster, ULONG* ClusterPointer);
+ULONG FatCountClustersInChain(ULONG StartCluster);
+ULONG* FatGetClusterChainArray(ULONG StartCluster);
+BOOLEAN FatReadCluster(ULONG ClusterNumber, PVOID Buffer);
+BOOLEAN FatReadClusterChain(ULONG StartClusterNumber, ULONG NumberOfClusters, PVOID Buffer);
+BOOLEAN FatReadPartialCluster(ULONG ClusterNumber, ULONG StartingOffset, ULONG Length, PVOID Buffer);
+BOOLEAN FatReadFile(PFAT_FILE_INFO FatFileInfo, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer);
+BOOLEAN FatReadVolumeSectors(ULONG DriveNumber, ULONG SectorNumber, ULONG SectorCount, PVOID Buffer);
+
BOOLEAN gCacheEnabled = FALSE;
ULONG BytesPerSector; /* Number of bytes per sector */
@@ -778,11 +792,10 @@ static BOOLEAN FatXSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG Dir
/*
* FatLookupFile()
* This function searches the file system for the
- * specified filename and fills in a FAT_FILE_INFO structure
- * with info describing the file, etc. returns true
- * if the file exists or false otherwise
+ * specified filename and fills in an FAT_FILE_INFO structure
+ * with info describing the file, etc. returns ARC error code
*/
-BOOLEAN FatLookupFile(PCSTR FileName, PFAT_FILE_INFO FatFileInfoPointer)
+LONG FatLookupFile(PCSTR FileName, ULONG DeviceId, PFAT_FILE_INFO FatFileInfoPointer)
{
UINT32 i;
ULONG NumberOfPathParts;
@@ -825,7 +838,7 @@ BOOLEAN FatLookupFile(PCSTR FileName, PFAT_FILE_INFO FatFileInfoPointer)
DirectoryBuffer = FatBufferDirectory(DirectoryStartCluster, &DirectorySize, (i == 0) );
if (DirectoryBuffer == NULL)
{
- return FALSE;
+ return ENOMEM;
}
//
@@ -836,7 +849,7 @@ BOOLEAN FatLookupFile(PCSTR FileName, PFAT_FILE_INFO FatFileInfoPointer)
if (!FatXSearchDirectoryBufferForFile(DirectoryBuffer, DirectorySize, PathPart, &FatFileInfo))
{
MmHeapFree(DirectoryBuffer);
- return FALSE;
+ return ENOENT;
}
}
else
@@ -844,7 +857,7 @@ BOOLEAN FatLookupFile(PCSTR FileName, PFAT_FILE_INFO FatFileInfoPointer)
if (!FatSearchDirectoryBufferForFile(DirectoryBuffer, DirectorySize, PathPart, &FatFileInfo))
{
MmHeapFree(DirectoryBuffer);
- return FALSE;
+ return ENOENT;
}
}
@@ -863,7 +876,7 @@ BOOLEAN FatLookupFile(PCSTR FileName, PFAT_FILE_INFO FatFileInfoPointer)
memcpy(FatFileInfoPointer, &FatFileInfo, sizeof(FAT_FILE_INFO));
- return TRUE;
+ return ESUCCESS;
}
/*
@@ -1008,35 +1021,6 @@ BOOLEAN FatGetFatEntry(ULONG Cluster, ULONG* ClusterPointer)
return TRUE;
}
-/*
- * FatOpenFile()
- * Tries to open the file 'name' and returns true or false
- * for success and failure respectively
- */
-FILE* FatOpenFile(PCSTR FileName)
-{
- FAT_FILE_INFO TempFatFileInfo;
- PFAT_FILE_INFO FileHandle;
-
- DPRINTM(DPRINT_FILESYSTEM, "FatOpenFile() FileName = %s\n", FileName);
-
- if (!FatLookupFile(FileName, &TempFatFileInfo))
- {
- return NULL;
- }
-
- FileHandle = MmHeapAlloc(sizeof(FAT_FILE_INFO));
-
- if (FileHandle == NULL)
- {
- return NULL;
- }
-
- memcpy(FileHandle, &TempFatFileInfo, sizeof(FAT_FILE_INFO));
-
- return (FILE*)FileHandle;
-}
-
ULONG FatCountClustersInChain(ULONG StartCluster)
{
ULONG ClusterCount = 0;
@@ -1240,9 +1224,8 @@ BOOLEAN FatReadPartialCluster(ULONG ClusterNumber, ULONG StartingOffset, ULONG L
* Reads BytesToRead from open file and
* returns the number of bytes read in BytesRead
*/
-BOOLEAN FatReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer)
+BOOLEAN FatReadFile(PFAT_FILE_INFO FatFileInfo, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer)
{
- PFAT_FILE_INFO FatFileInfo = (PFAT_FILE_INFO)FileHandle;
ULONG ClusterNumber;
ULONG OffsetInCluster;
ULONG LengthInCluster;
@@ -1394,33 +1377,6 @@ BOOLEAN FatReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID
return TRUE;
}
-ULONG FatGetFileSize(FILE *FileHandle)
-{
- PFAT_FILE_INFO FatFileHandle = (PFAT_FILE_INFO)FileHandle;
-
- DPRINTM(DPRINT_FILESYSTEM, "FatGetFileSize() FileSize = %d\n", FatFileHandle->FileSize);
-
- return FatFileHandle->FileSize;
-}
-
-VOID FatSetFilePointer(FILE *FileHandle, ULONG NewFilePointer)
-{
- PFAT_FILE_INFO FatFileHandle = (PFAT_FILE_INFO)FileHandle;
-
- DPRINTM(DPRINT_FILESYSTEM, "FatSetFilePointer() NewFilePointer = %d\n", NewFilePointer);
-
- FatFileHandle->FilePointer = NewFilePointer;
-}
-
-ULONG FatGetFilePointer(FILE *FileHandle)
-{
- PFAT_FILE_INFO FatFileHandle = (PFAT_FILE_INFO)FileHandle;
-
- DPRINTM(DPRINT_FILESYSTEM, "FatGetFilePointer() FilePointer = %d\n", FatFileHandle->FilePointer);
-
- return FatFileHandle->FilePointer;
-}
-
BOOLEAN FatReadVolumeSectors(ULONG DriveNumber, ULONG SectorNumber, ULONG SectorCount, PVOID Buffer)
{
if (gCacheEnabled)
@@ -1443,12 +1399,147 @@ BOOLEAN FatReadVolumeSectors(ULONG DriveNumber, ULONG SectorNumber, ULONG Sector
}
}
-const FS_VTBL FatVtbl = {
- FatOpenVolume,
- FatOpenFile,
- NULL,
- FatReadFile,
- FatGetFileSize,
- FatSetFilePointer,
- FatGetFilePointer,
+LONG FatClose(ULONG FileId)
+{
+ PFAT_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
+
+ MmHeapFree(FileHandle);
+
+ return ESUCCESS;
+}
+
+LONG FatGetFileInformation(ULONG FileId, FILEINFORMATION* Information)
+{
+ PFAT_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
+
+ RtlZeroMemory(Information, sizeof(FILEINFORMATION));
+ Information->EndingAddress.LowPart = FileHandle->FileSize;
+ Information->CurrentAddress.LowPart = FileHandle->FilePointer;
+
+ DPRINTM(DPRINT_FILESYSTEM, "FatGetFileInformation() FileSize = %d\n",
+ Information->EndingAddress.LowPart);
+ DPRINTM(DPRINT_FILESYSTEM, "FatGetFileInformation() FilePointer = %d\n",
+ Information->CurrentAddress.LowPart);
+
+ return ESUCCESS;
+}
+
+LONG FatOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
+{
+ FAT_FILE_INFO TempFileInfo;
+ PFAT_FILE_INFO FileHandle;
+ ULONG DeviceId;
+ LONG ret;
+
+ if (OpenMode != OpenReadOnly)
+ return EACCES;
+
+ DeviceId = FsGetDeviceId(*FileId);
+
+ DPRINTM(DPRINT_FILESYSTEM, "FatOpen() FileName = %s\n", Path);
+
+ RtlZeroMemory(&TempFileInfo, sizeof(TempFileInfo));
+ ret = FatLookupFile(Path, DeviceId, &TempFileInfo);
+ if (ret != ESUCCESS)
+ return ENOENT;
+
+ FileHandle = MmHeapAlloc(sizeof(FAT_FILE_INFO));
+ if (!FileHandle)
+ return ENOMEM;
+
+ RtlCopyMemory(FileHandle, &TempFileInfo, sizeof(FAT_FILE_INFO));
+
+ FsSetDeviceSpecific(*FileId, FileHandle);
+ return ESUCCESS;
+}
+
+LONG FatRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
+{
+ PFAT_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
+ BOOLEAN ret;
+
+ //
+ // Call old read method
+ //
+ ret = FatReadFile(FileHandle, N, Count, Buffer);
+
+ //
+ // Check for success
+ //
+ if (ret)
+ return ESUCCESS;
+ else
+ return EIO;
+}
+
+LONG FatSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode)
+{
+ PFAT_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
+
+ DPRINTM(DPRINT_FILESYSTEM, "FatSeek() NewFilePointer = %lu\n", Position->LowPart);
+
+ if (SeekMode != SeekAbsolute)
+ return EINVAL;
+ if (Position->HighPart != 0)
+ return EINVAL;
+ if (Position->LowPart >= FileHandle->FileSize)
+ return EINVAL;
+
+ FileHandle->FilePointer = Position->LowPart;
+ return ESUCCESS;
+}
+
+const DEVVTBL FatFuncTable =
+{
+ FatClose,
+ FatGetFileInformation,
+ FatOpen,
+ FatRead,
+ FatSeek,
};
+
+const DEVVTBL* FatMount(ULONG DeviceId)
+{
+ UCHAR Buffer[512];
+ PFAT_BOOTSECTOR BootSector = (PFAT_BOOTSECTOR)Buffer;
+ PFAT32_BOOTSECTOR BootSector32 = (PFAT32_BOOTSECTOR)Buffer;
+ PFATX_BOOTSECTOR BootSectorX = (PFATX_BOOTSECTOR)Buffer;
+ LARGE_INTEGER Position;
+ ULONG Count;
+ LONG ret;
+
+ //
+ // Read the BootSector
+ //
+ Position.HighPart = 0;
+ Position.LowPart = 0;
+ ret = ArcSeek(DeviceId, &Position, SeekAbsolute);
+ if (ret != ESUCCESS)
+ return NULL;
+ ret = ArcRead(DeviceId, Buffer, sizeof(Buffer), &Count);
+ if (ret != ESUCCESS || Count != sizeof(Buffer))
+ return NULL;
+
+ //
+ // Check if BootSector is valid. If yes, return FAT function table
+ //
+ if (RtlEqualMemory(BootSector->FileSystemType, "FAT12 ", 8) ||
+ RtlEqualMemory(BootSector->FileSystemType, "FAT16 ", 8) ||
+ RtlEqualMemory(BootSector32->FileSystemType, "FAT32 ", 8) ||
+ RtlEqualMemory(BootSectorX->FileSystemType, "FATX", 4))
+ {
+ //
+ // Compatibility hack as long as FS is not using underlying device DeviceId
+ //
+ ULONG DriveNumber;
+ ULONGLONG StartSector;
+ ULONGLONG SectorCount;
+ int Type;
+ if (!MachDiskGetBootVolume(&DriveNumber, &StartSector, &SectorCount, &Type))
+ return NULL;
+ FatOpenVolume(DriveNumber, StartSector, SectorCount);
+ return &FatFuncTable;
+ }
+ else
+ return NULL;
+}
diff --git a/reactos/boot/freeldr/freeldr/fs/fs.c b/reactos/boot/freeldr/freeldr/fs/fs.c
index fdd095b4787..cf46406264b 100644
--- a/reactos/boot/freeldr/freeldr/fs/fs.c
+++ b/reactos/boot/freeldr/freeldr/fs/fs.c
@@ -1,6 +1,7 @@
/*
* FreeLoader
* Copyright (C) 1998-2003 Brian Palmer
+ * Copyright (C) 2008-2009 Herv Poussineau
*
* 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
@@ -22,13 +23,6 @@
#define NDEBUG
#include
-/////////////////////////////////////////////////////////////////////////////////////////////
-// DATA
-/////////////////////////////////////////////////////////////////////////////////////////////
-
-const FS_VTBL* pFSVtbl = NULL; // Type of filesystem on boot device, set by FsOpenVolume()
-PVOID FsStaticBufferDisk = 0, FsStaticBufferData = 0;
-
/////////////////////////////////////////////////////////////////////////////////////////////
// FUNCTIONS
/////////////////////////////////////////////////////////////////////////////////////////////
@@ -40,103 +34,11 @@ VOID FileSystemError(PCSTR ErrorString)
UiMessageBox(ErrorString);
}
-/*
- *
- * BOOLEAN FsOpenVolume(ULONG DriveNumber, ULONGLONG StartSector, ULONGLONG SectorCount, int Type);
- *
- * This function is called to open a disk volume for file access.
- * It must be called before any of the file functions will work.
- *
- */
-static BOOLEAN FsOpenVolume(ULONG DriveNumber, ULONGLONG StartSector, ULONGLONG SectorCount, int Type)
-{
- CHAR ErrorText[80];
-
- if( !FsStaticBufferDisk )
- FsStaticBufferDisk = MmAllocateMemory( 0x20000 );
- if( !FsStaticBufferDisk )
- {
- FileSystemError("could not allocate filesystem static buffer");
- return FALSE;
- }
- FsStaticBufferData = ((PCHAR)FsStaticBufferDisk) + 0x10000;
-
- switch (Type)
- {
- case FS_FAT:
- pFSVtbl = &FatVtbl;
- break;
- case FS_NTFS:
- pFSVtbl = &NtfsVtbl;
- break;
- case FS_EXT2:
- pFSVtbl = &Ext2Vtbl;
- break;
- case FS_ISO9660:
- pFSVtbl = &Iso9660Vtbl;
- break;
- default:
- pFSVtbl = NULL;
- break;
- }
-
- if (pFSVtbl && pFSVtbl->OpenVolume)
- {
- return (*pFSVtbl->OpenVolume)(DriveNumber, StartSector, SectorCount);
- }
- else
- {
- sprintf(ErrorText, "Unsupported file system. Type: 0x%x", Type);
- FileSystemError(ErrorText);
- }
-
- return FALSE;
-}
-/*
- *
- * BOOLEAN FsOpenBootVolume()
- *
- * This function is called to open the boot disk volume for file access.
- * It must be called before any of the file functions will work.
- */
-BOOLEAN FsOpenBootVolume()
-{
- ULONG DriveNumber;
- ULONGLONG StartSector;
- ULONGLONG SectorCount;
- int Type;
-
- if (! MachDiskGetBootVolume(&DriveNumber, &StartSector, &SectorCount, &Type))
- {
- FileSystemError("Unable to locate boot partition\n");
- return FALSE;
- }
-
- return FsOpenVolume(DriveNumber, StartSector, SectorCount, Type);
-}
-
-BOOLEAN FsOpenSystemVolume(char *SystemPath, char *RemainingPath, PULONG Device)
-{
- ULONG DriveNumber;
- ULONGLONG StartSector;
- ULONGLONG SectorCount;
- int Type;
-
- if (! MachDiskGetSystemVolume(SystemPath, RemainingPath, Device,
- &DriveNumber, &StartSector, &SectorCount,
- &Type))
- {
- FileSystemError("Unable to locate system partition\n");
- return FALSE;
- }
-
- return FsOpenVolume(DriveNumber, StartSector, SectorCount, Type);
-}
-
-
PFILE FsOpenFile(PCSTR FileName)
{
- PFILE FileHandle = NULL;
+ CHAR FullPath[MAX_PATH];
+ ULONG FileId;
+ LONG ret;
//
// Print status message
@@ -144,51 +46,38 @@ PFILE FsOpenFile(PCSTR FileName)
DPRINTM(DPRINT_FILESYSTEM, "Opening file '%s'...\n", FileName);
//
- // Check and see if the first character is '\' or '/' and remove it if so
+ // Create full file name
//
- while ((*FileName == '\\') || (*FileName == '/'))
- {
- FileName++;
- }
+ MachDiskGetBootPath(FullPath, sizeof(FullPath));
+ strcat(FullPath, FileName);
//
- // Check file system type and pass off to appropriate handler
+ // Open the file
//
- if (pFSVtbl && pFSVtbl->OpenFile)
- {
- FileHandle = pFSVtbl->OpenFile(FileName);
- }
+ ret = ArcOpen(FullPath, OpenReadOnly, &FileId);
+
+ //
+ // Check for success
+ //
+ if (ret == ESUCCESS)
+ return (PFILE)FileId;
else
- {
- FileSystemError("Error: Unknown filesystem.");
- }
-
- //
- // Check return value
- //
- if (FileHandle != NULL)
- {
- DPRINTM(DPRINT_FILESYSTEM, "FsOpenFile() succeeded. FileHandle: 0x%x\n", FileHandle);
- }
- else
- {
- DPRINTM(DPRINT_FILESYSTEM, "FsOpenFile() failed.\n");
- }
-
- return FileHandle;
+ return (PFILE)0;
}
VOID FsCloseFile(PFILE FileHandle)
{
- if (pFSVtbl)
- {
- if (pFSVtbl->CloseFile)
- (*pFSVtbl->CloseFile)(FileHandle);
- }
- else
- {
- FileSystemError("Error: Unknown filesystem.");
- }
+ ULONG FileId = (ULONG)FileHandle;
+
+ //
+ // Close the handle
+ //
+ ArcClose(FileId);
+
+ //
+ // Do not check for error; this function is
+ // supposed to always succeed
+ //
}
/*
@@ -197,73 +86,62 @@ VOID FsCloseFile(PFILE FileHandle)
*/
BOOLEAN FsReadFile(PFILE FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer)
{
- //
- // Set the number of bytes read equal to zero
- //
- if (BytesRead != NULL)
- {
- *BytesRead = 0;
- }
+ ULONG FileId = (ULONG)FileHandle;
+ LONG ret;
- if (pFSVtbl && pFSVtbl->ReadFile)
- {
- return (*pFSVtbl->ReadFile)(FileHandle, BytesToRead, BytesRead, Buffer);
- }
+ //
+ // Read the file
+ //
+ ret = ArcRead(FileId, Buffer, BytesToRead, BytesRead);
+
+ //
+ // Check for success
+ //
+ if (ret == ESUCCESS)
+ return TRUE;
else
- {
- FileSystemError("Unknown file system.");
return FALSE;
- }
}
ULONG FsGetFileSize(PFILE FileHandle)
{
- if (pFSVtbl && pFSVtbl->GetFileSize)
- {
- return (*pFSVtbl->GetFileSize)(FileHandle);
- }
- else
- {
- FileSystemError("Unknown file system.");
+ ULONG FileId = (ULONG)FileHandle;
+ FILEINFORMATION Information;
+ LONG ret;
+
+ //
+ // Query file informations
+ //
+ ret = ArcGetFileInformation(FileId, &Information);
+
+ //
+ // Check for error
+ //
+ if (ret != ESUCCESS || Information.EndingAddress.HighPart != 0)
return 0;
- }
+
+ //
+ // Return file size
+ //
+ return Information.EndingAddress.LowPart;
}
VOID FsSetFilePointer(PFILE FileHandle, ULONG NewFilePointer)
{
- if (pFSVtbl && pFSVtbl->SetFilePointer)
- {
- (*pFSVtbl->SetFilePointer)(FileHandle, NewFilePointer);
- }
- else
- {
- FileSystemError("Unknown file system.");
- }
-}
+ ULONG FileId = (ULONG)FileHandle;
+ LARGE_INTEGER Position;
-ULONG FsGetFilePointer(PFILE FileHandle)
-{
- if (pFSVtbl && pFSVtbl->SetFilePointer)
- {
- return (*pFSVtbl->GetFilePointer)(FileHandle);
- }
- else
- {
- FileSystemError("Unknown file system.");
- return 0;
- }
-}
+ //
+ // Set file position
+ //
+ Position.HighPart = 0;
+ Position.LowPart = NewFilePointer;
+ ArcSeek(FileId, &Position, SeekAbsolute);
-BOOLEAN FsIsEndOfFile(PFILE FileHandle)
-{
- if (FsGetFilePointer(FileHandle) >= FsGetFileSize(FileHandle))
- {
- return TRUE;
- }
- else
- {
- return FALSE;
- }
+ //
+ // Do not check for error; this function is
+ // supposed to always succeed
+ //
}
/*
@@ -320,72 +198,7 @@ VOID FsGetFirstNameFromPath(PCHAR Buffer, PCSTR Path)
DPRINTM(DPRINT_FILESYSTEM, "FatGetFirstNameFromPath() Path = %s FirstName = %s\n", Path, Buffer);
}
-LONG CompatFsClose(ULONG FileId)
-{
- PFILE FileHandle = FsGetDeviceSpecific(FileId);
-
- FsCloseFile(FileHandle);
- return ESUCCESS;
-}
-
-LONG CompatFsGetFileInformation(ULONG FileId, FILEINFORMATION* Information)
-{
- PFILE FileHandle = FsGetDeviceSpecific(FileId);
-
- memset(Information, 0, sizeof(FILEINFORMATION));
- Information->EndingAddress.LowPart = FsGetFileSize(FileHandle);
- Information->CurrentAddress.LowPart = FsGetFilePointer(FileHandle);
- return ESUCCESS;
-}
-
-LONG CompatFsOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
-{
- PFILE FileHandle;
- static BOOLEAN bVolumeOpened = FALSE;
-
- if (!bVolumeOpened)
- {
- bVolumeOpened = FsOpenBootVolume();
- if (!bVolumeOpened)
- return EIO;
- }
-
- FileHandle = FsOpenFile(Path);
- if (!FileHandle)
- return EIO;
- FsSetDeviceSpecific(*FileId, FileHandle);
- return ESUCCESS;
-}
-
-LONG CompatFsRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
-{
- PFILE FileHandle = FsGetDeviceSpecific(FileId);
- BOOLEAN ret;
-
- ret = FsReadFile(FileHandle, N, Count, Buffer);
- return (ret ? ESUCCESS : EFAULT);
-}
-
-LONG CompatFsSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode)
-{
- PFILE FileHandle = FsGetDeviceSpecific(FileId);
-
- if (SeekMode != SeekAbsolute)
- return EINVAL;
-
- FsSetFilePointer(FileHandle, Position->LowPart);
- return ESUCCESS;
-}
-
-const DEVVTBL CompatFsFuncTable = {
- CompatFsClose,
- CompatFsGetFileInformation,
- CompatFsOpen,
- CompatFsRead,
- CompatFsSeek,
-};
-
-#define MAX_FDS 20
+#define MAX_FDS 60
typedef struct tagFILEDATA
{
ULONG DeviceId;
@@ -420,6 +233,7 @@ LONG ArcClose(ULONG FileId)
{
FileData[FileId].FuncTable = NULL;
FileData[FileId].Specific = NULL;
+ FileData[FileId].DeviceId = -1;
}
return ret;
}
@@ -444,6 +258,9 @@ LONG ArcOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
OPENMODE DeviceOpenMode;
ULONG DeviceId;
+ /* Print status message */
+ DPRINTM(DPRINT_FILESYSTEM, "Opening file '%s'...\n", Path);
+
*FileId = MAX_FDS;
/* Search last ')', which delimits device and path */
@@ -505,8 +322,19 @@ LONG ArcOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
}
/* Try to detect the file system */
- /* FIXME: we link there to old infrastructure... */
- FileData[DeviceId].FileFuncTable = &CompatFsFuncTable;
+ FileData[DeviceId].FileFuncTable = IsoMount(DeviceId);
+ if (!FileData[DeviceId].FileFuncTable)
+ FileData[DeviceId].FileFuncTable = FatMount(DeviceId);
+ if (!FileData[DeviceId].FileFuncTable)
+ FileData[DeviceId].FileFuncTable = NtfsMount(DeviceId);
+ if (!FileData[DeviceId].FileFuncTable)
+ FileData[DeviceId].FileFuncTable = Ext2Mount(DeviceId);
+ if (!FileData[DeviceId].FileFuncTable)
+ {
+ /* Error, unable to detect file system */
+ FileData[DeviceId].FuncTable = NULL;
+ return ENODEV;
+ }
pDevice->DeviceId = DeviceId;
}
@@ -533,8 +361,13 @@ LONG ArcOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
if (i == MAX_FDS)
return EMFILE;
+ /* Skip leading backslash, if any */
+ if (*FileName == '\\')
+ FileName++;
+
/* Open the file */
FileData[i].FuncTable = FileData[DeviceId].FileFuncTable;
+ FileData[i].DeviceId = DeviceId;
*FileId = i;
ret = FileData[i].FuncTable->Open(FileName, OpenMode, FileId);
if (ret != ESUCCESS)
@@ -590,8 +423,20 @@ VOID* FsGetDeviceSpecific(ULONG FileId)
return FileData[FileId].Specific;
}
+ULONG FsGetDeviceId(ULONG FileId)
+{
+ if (FileId >= MAX_FDS)
+ return (ULONG)-1;
+ return FileData[FileId].DeviceId;
+}
+
VOID FsInit(VOID)
{
- memset(FileData, 0, sizeof(FileData));
+ ULONG i;
+
+ RtlZeroMemory(FileData, sizeof(FileData));
+ for (i = 0; i < MAX_FDS; i++)
+ FileData[i].DeviceId = (ULONG)-1;
+
InitializeListHead(&DeviceListHead);
}
diff --git a/reactos/boot/freeldr/freeldr/fs/fsrec.c b/reactos/boot/freeldr/freeldr/fs/fsrec.c
index d0ea2207004..6ba1899a8eb 100644
--- a/reactos/boot/freeldr/freeldr/fs/fsrec.c
+++ b/reactos/boot/freeldr/freeldr/fs/fsrec.c
@@ -83,7 +83,7 @@ BOOLEAN FsRecIsExt2(ULONG DriveNumber, ULONG VolumeStartSector)
return FALSE;
}
- if (SuperBlock->s_magic == EXT3_SUPER_MAGIC)
+ if (SuperBlock->magic == EXT2_MAGIC)
{
return TRUE;
}
diff --git a/reactos/boot/freeldr/freeldr/fs/iso.c b/reactos/boot/freeldr/freeldr/fs/iso.c
index eac636f4caf..bcc2132284e 100644
--- a/reactos/boot/freeldr/freeldr/fs/iso.c
+++ b/reactos/boot/freeldr/freeldr/fs/iso.c
@@ -1,6 +1,7 @@
/*
* FreeLoader
* Copyright (C) 1998-2003 Brian Palmer
+ * Copyright (C) 2009 Herv Poussineau
*
* 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
@@ -22,39 +23,6 @@
#define SECTORSIZE 2048
-static ULONG IsoRootSector; // Starting sector of the root directory
-static ULONG IsoRootLength; // Length of the root directory
-
-ULONG IsoDriveNumber = 0;
-
-
-BOOLEAN IsoOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount)
-{
- PPVD Pvd = (PPVD)DISKREADBUFFER;
-
- DPRINTM(DPRINT_FILESYSTEM, "IsoOpenVolume() DriveNumber = 0x%x VolumeStartSector = 16\n", DriveNumber);
-
- // Store the drive number
- IsoDriveNumber = DriveNumber;
-
- IsoRootSector = 0;
- IsoRootLength = 0;
-
- if (!MachDiskReadLogicalSectors(DriveNumber, 16, 1, Pvd))
- {
- FileSystemError("Failed to read the PVD.");
- return FALSE;
- }
-
- IsoRootSector = Pvd->RootDirRecord.ExtentLocationL;
- IsoRootLength = Pvd->RootDirRecord.DataLengthL;
-
- DPRINTM(DPRINT_FILESYSTEM, "IsoRootSector = %u IsoRootLegth = %u\n", IsoRootSector, IsoRootLength);
-
- return TRUE;
-}
-
-
static BOOLEAN IsoSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectoryLength, PCHAR FileName, PISO_FILE_INFO IsoFileInfoPointer)
{
PDIR_RECORD Record;
@@ -119,16 +87,18 @@ static BOOLEAN IsoSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG Dire
/*
* IsoBufferDirectory()
* This function allocates a buffer, reads the specified directory
- * and returns a pointer to that buffer. The function returns NULL
- * if allocation or read fails. The directory is specified by its
- * starting sector and length.
+ * and returns a pointer to that buffer into pDirectoryBuffer. The
+ * function returns an ARC error code. The directory is specified
+ * by its starting sector and length.
*/
-static PVOID IsoBufferDirectory(ULONG DirectoryStartSector, ULONG DirectoryLength)
+static LONG IsoBufferDirectory(ULONG DeviceId, ULONG DirectoryStartSector, ULONG DirectoryLength,
+ PVOID* pDirectoryBuffer)
{
- PVOID DirectoryBuffer;
- PVOID Ptr;
- ULONG SectorCount;
- ULONG i;
+ PVOID DirectoryBuffer;
+ ULONG SectorCount;
+ LARGE_INTEGER Position;
+ ULONG Count;
+ ULONG ret;
DPRINTM(DPRINT_FILESYSTEM, "IsoBufferDirectory() DirectoryStartSector = %d DirectoryLength = %d\n", DirectoryStartSector, DirectoryLength);
@@ -140,26 +110,29 @@ static PVOID IsoBufferDirectory(ULONG DirectoryStartSector, ULONG DirectoryLengt
//
DPRINTM(DPRINT_FILESYSTEM, "Trying to allocate (DirectoryLength) %d bytes.\n", DirectoryLength);
DirectoryBuffer = MmHeapAlloc(DirectoryLength);
-
- if (DirectoryBuffer == NULL)
- {
- return NULL;
- }
+ if (!DirectoryBuffer)
+ return ENOMEM;
//
// Now read directory contents into DirectoryBuffer
//
- for (i = 0, Ptr = DirectoryBuffer; i < SectorCount; i++, Ptr = (PVOID)((ULONG_PTR)Ptr + SECTORSIZE))
+ Position.HighPart = 0;
+ Position.LowPart = DirectoryStartSector * SECTORSIZE;
+ ret = ArcSeek(DeviceId, &Position, SeekAbsolute);
+ if (ret != ESUCCESS)
{
- if (!MachDiskReadLogicalSectors(IsoDriveNumber, DirectoryStartSector + i, 1, (PVOID)DISKREADBUFFER))
- {
- MmHeapFree(DirectoryBuffer);
- return NULL;
- }
- RtlCopyMemory(Ptr, (PVOID)DISKREADBUFFER, SECTORSIZE);
+ MmHeapFree(DirectoryBuffer);
+ return ret;
+ }
+ ret = ArcRead(DeviceId, DirectoryBuffer, SectorCount * SECTORSIZE, &Count);
+ if (ret != ESUCCESS || Count != SectorCount * SECTORSIZE)
+ {
+ MmHeapFree(DirectoryBuffer);
+ return EIO;
}
- return DirectoryBuffer;
+ *pDirectoryBuffer = DirectoryBuffer;
+ return ESUCCESS;
}
@@ -167,11 +140,12 @@ static PVOID IsoBufferDirectory(ULONG DirectoryStartSector, ULONG DirectoryLengt
* IsoLookupFile()
* This function searches the file system for the
* specified filename and fills in an ISO_FILE_INFO structure
- * with info describing the file, etc. returns true
- * if the file exists or false otherwise
+ * with info describing the file, etc. returns ARC error code
*/
-static BOOLEAN IsoLookupFile(PCSTR FileName, PISO_FILE_INFO IsoFileInfoPointer)
+static LONG IsoLookupFile(PCSTR FileName, ULONG DeviceId, PISO_FILE_INFO IsoFileInfoPointer)
{
+ UCHAR Buffer[SECTORSIZE];
+ PPVD Pvd = (PPVD)Buffer;
UINT32 i;
ULONG NumberOfPathParts;
CHAR PathPart[261];
@@ -179,19 +153,34 @@ static BOOLEAN IsoLookupFile(PCSTR FileName, PISO_FILE_INFO IsoFileInfoPointer)
ULONG DirectorySector;
ULONG DirectoryLength;
ISO_FILE_INFO IsoFileInfo;
+ LARGE_INTEGER Position;
+ ULONG Count;
+ LONG ret;
DPRINTM(DPRINT_FILESYSTEM, "IsoLookupFile() FileName = %s\n", FileName);
RtlZeroMemory(IsoFileInfoPointer, sizeof(ISO_FILE_INFO));
+ //
+ // Read The Primary Volume Descriptor
+ //
+ Position.HighPart = 0;
+ Position.LowPart = 16 * SECTORSIZE;
+ ret = ArcSeek(DeviceId, &Position, SeekAbsolute);
+ if (ret != ESUCCESS)
+ return ret;
+ ret = ArcRead(DeviceId, Pvd, SECTORSIZE, &Count);
+ if (ret != ESUCCESS || Count < sizeof(PVD))
+ return EIO;
+
+ DirectorySector = Pvd->RootDirRecord.ExtentLocationL;
+ DirectoryLength = Pvd->RootDirRecord.DataLengthL;
+
//
// Figure out how many sub-directories we are nested in
//
NumberOfPathParts = FsGetNumPathParts(FileName);
- DirectorySector = IsoRootSector;
- DirectoryLength = IsoRootLength;
-
//
// Loop once for each part
//
@@ -213,11 +202,9 @@ static BOOLEAN IsoLookupFile(PCSTR FileName, PISO_FILE_INFO IsoFileInfoPointer)
//
// Buffer the directory contents
//
- DirectoryBuffer = IsoBufferDirectory(DirectorySector, DirectoryLength);
- if (DirectoryBuffer == NULL)
- {
- return FALSE;
- }
+ ret = IsoBufferDirectory(DeviceId, DirectorySector, DirectoryLength, &DirectoryBuffer);
+ if (ret != ESUCCESS)
+ return ret;
//
// Search for file name in directory
@@ -225,7 +212,7 @@ static BOOLEAN IsoLookupFile(PCSTR FileName, PISO_FILE_INFO IsoFileInfoPointer)
if (!IsoSearchDirectoryBufferForFile(DirectoryBuffer, DirectoryLength, PathPart, &IsoFileInfo))
{
MmHeapFree(DirectoryBuffer);
- return FALSE;
+ return ENOENT;
}
MmHeapFree(DirectoryBuffer);
@@ -244,78 +231,98 @@ static BOOLEAN IsoLookupFile(PCSTR FileName, PISO_FILE_INFO IsoFileInfoPointer)
RtlCopyMemory(IsoFileInfoPointer, &IsoFileInfo, sizeof(ISO_FILE_INFO));
- return TRUE;
+ return ESUCCESS;
}
-
-/*
- * IsoOpenFile()
- * Tries to open the file 'name' and returns true or false
- * for success and failure respectively
- */
-FILE* IsoOpenFile(PCSTR FileName)
+LONG IsoClose(ULONG FileId)
{
- ISO_FILE_INFO TempFileInfo;
- PISO_FILE_INFO FileHandle;
+ PISO_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
- DPRINTM(DPRINT_FILESYSTEM, "IsoOpenFile() FileName = %s\n", FileName);
+ MmHeapFree(FileHandle);
- if (!IsoLookupFile(FileName, &TempFileInfo))
- {
- return NULL;
- }
+ return ESUCCESS;
+}
+
+LONG IsoGetFileInformation(ULONG FileId, FILEINFORMATION* Information)
+{
+ PISO_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
+
+ DPRINTM(DPRINT_FILESYSTEM, "IsoGetFileInformation() FileSize = %d\n", FileHandle->FileSize);
+ DPRINTM(DPRINT_FILESYSTEM, "IsoGetFileInformation() FilePointer = %d\n", FileHandle->FilePointer);
+
+ RtlZeroMemory(Information, sizeof(FILEINFORMATION));
+ Information->EndingAddress.LowPart = FileHandle->FileSize;
+ Information->CurrentAddress.LowPart = FileHandle->FilePointer;
+
+ return ESUCCESS;
+}
+
+LONG IsoOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
+{
+ ISO_FILE_INFO TempFileInfo;
+ PISO_FILE_INFO FileHandle;
+ ULONG DeviceId;
+ LONG ret;
+
+ if (OpenMode != OpenReadOnly)
+ return EACCES;
+
+ DeviceId = FsGetDeviceId(*FileId);
+
+ DPRINTM(DPRINT_FILESYSTEM, "IsoOpen() FileName = %s\n", Path);
+
+ RtlZeroMemory(&TempFileInfo, sizeof(TempFileInfo));
+ ret = IsoLookupFile(Path, DeviceId, &TempFileInfo);
+ if (ret != ESUCCESS)
+ return ENOENT;
FileHandle = MmHeapAlloc(sizeof(ISO_FILE_INFO));
-
- if (FileHandle == NULL)
- {
- return NULL;
- }
+ if (!FileHandle)
+ return ENOMEM;
RtlCopyMemory(FileHandle, &TempFileInfo, sizeof(ISO_FILE_INFO));
- return (FILE*)FileHandle;
+ FsSetDeviceSpecific(*FileId, FileHandle);
+ return ESUCCESS;
}
-
-/*
- * IsoReadFile()
- * Reads BytesToRead from open file and
- * returns the number of bytes read in BytesRead
- */
-BOOLEAN IsoReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer)
+LONG IsoRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
{
- PISO_FILE_INFO IsoFileInfo = (PISO_FILE_INFO)FileHandle;
+ PISO_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
+ UCHAR SectorBuffer[SECTORSIZE];
+ LARGE_INTEGER Position;
+ ULONG DeviceId;
+ ULONG FilePointer;
ULONG SectorNumber;
ULONG OffsetInSector;
ULONG LengthInSector;
ULONG NumberOfSectors;
- ULONG i;
+ ULONG BytesRead;
+ LONG ret;
- DPRINTM(DPRINT_FILESYSTEM, "IsoReadFile() BytesToRead = %d Buffer = 0x%x\n", BytesToRead, Buffer);
+ DPRINTM(DPRINT_FILESYSTEM, "IsoRead() Buffer = %p, N = %lu\n", Buffer, N);
- if (BytesRead != NULL)
- {
- *BytesRead = 0;
- }
+ DeviceId = FsGetDeviceId(FileId);
+ *Count = 0;
//
// If they are trying to read past the
// end of the file then return success
- // with BytesRead == 0
+ // with Count == 0
//
- if (IsoFileInfo->FilePointer >= IsoFileInfo->FileSize)
+ FilePointer = FileHandle->FilePointer;
+ if (FilePointer >= FileHandle->FileSize)
{
- return TRUE;
+ return ESUCCESS;
}
//
// If they are trying to read more than there is to read
// then adjust the amount to read
//
- if ((IsoFileInfo->FilePointer + BytesToRead) > IsoFileInfo->FileSize)
+ if (FilePointer + N > FileHandle->FileSize)
{
- BytesToRead = (IsoFileInfo->FileSize - IsoFileInfo->FilePointer);
+ N = FileHandle->FileSize - FilePointer;
}
//
@@ -332,7 +339,7 @@ BOOLEAN IsoReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID
// | |
// +---------------+--------------------+
// |
- // BytesToRead -------+
+ // N -----------------+
//
// 1 - The first calculation (and read) will align
// the file pointer with the next sector
@@ -351,129 +358,154 @@ BOOLEAN IsoReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID
// Only do the first read if we
// aren't aligned on a cluster boundary
//
- if (IsoFileInfo->FilePointer % SECTORSIZE)
+ if (FilePointer % SECTORSIZE)
{
//
// Do the math for our first read
//
- SectorNumber = IsoFileInfo->FileStart + (IsoFileInfo->FilePointer / SECTORSIZE);
- OffsetInSector = IsoFileInfo->FilePointer % SECTORSIZE;
- LengthInSector = (BytesToRead > (SECTORSIZE - OffsetInSector)) ? (SECTORSIZE - OffsetInSector) : BytesToRead;
+ SectorNumber = FileHandle->FileStart + (FilePointer / SECTORSIZE);
+ OffsetInSector = FilePointer % SECTORSIZE;
+ LengthInSector = (N > (SECTORSIZE - OffsetInSector)) ? (SECTORSIZE - OffsetInSector) : N;
//
- // Now do the read and update BytesRead, BytesToRead, FilePointer, & Buffer
+ // Now do the read and update Count, N, FilePointer, & Buffer
//
- if (!MachDiskReadLogicalSectors(IsoDriveNumber, SectorNumber, 1, (PVOID)DISKREADBUFFER))
+ Position.HighPart = 0;
+ Position.LowPart = SectorNumber * SECTORSIZE;
+ ret = ArcSeek(DeviceId, &Position, SeekAbsolute);
+ if (ret != ESUCCESS)
{
- return FALSE;
+ return ret;
}
- RtlCopyMemory(Buffer, (PVOID)((ULONG_PTR)DISKREADBUFFER + OffsetInSector), LengthInSector);
- if (BytesRead != NULL)
+ ret = ArcRead(DeviceId, SectorBuffer, SECTORSIZE, &BytesRead);
+ if (ret != ESUCCESS || BytesRead != SECTORSIZE)
{
- *BytesRead += LengthInSector;
+ return EIO;
}
- BytesToRead -= LengthInSector;
- IsoFileInfo->FilePointer += LengthInSector;
+ RtlCopyMemory(Buffer, SectorBuffer + OffsetInSector, LengthInSector);
+ *Count += LengthInSector;
+ N -= LengthInSector;
+ FilePointer += LengthInSector;
Buffer = (PVOID)((ULONG_PTR)Buffer + LengthInSector);
}
//
// Do the math for our second read (if any data left)
//
- if (BytesToRead > 0)
+ if (N > 0)
{
//
// Determine how many full clusters we need to read
//
- NumberOfSectors = (BytesToRead / SECTORSIZE);
+ NumberOfSectors = (N / SECTORSIZE);
- for (i = 0; i < NumberOfSectors; i++)
+ SectorNumber = FileHandle->FileStart + (FilePointer / SECTORSIZE);
+
+ //
+ // Now do the read and update Count, N, FilePointer, & Buffer
+ //
+ Position.HighPart = 0;
+ Position.LowPart = SectorNumber * SECTORSIZE;
+ ret = ArcSeek(DeviceId, &Position, SeekAbsolute);
+ if (ret != ESUCCESS)
{
- SectorNumber = IsoFileInfo->FileStart + (IsoFileInfo->FilePointer / SECTORSIZE);
-
- //
- // Now do the read and update BytesRead, BytesToRead, FilePointer, & Buffer
- //
- if (!MachDiskReadLogicalSectors(IsoDriveNumber, SectorNumber, 1, (PVOID)DISKREADBUFFER))
- {
- return FALSE;
- }
-
- RtlCopyMemory(Buffer, (PVOID)DISKREADBUFFER, SECTORSIZE);
-
- if (BytesRead != NULL)
- {
- *BytesRead += SECTORSIZE;
- }
- BytesToRead -= SECTORSIZE;
- IsoFileInfo->FilePointer += SECTORSIZE;
- Buffer = (PVOID)((ULONG_PTR)Buffer + SECTORSIZE);
+ return ret;
}
+ ret = ArcRead(DeviceId, Buffer, NumberOfSectors * SECTORSIZE, &BytesRead);
+ if (ret != ESUCCESS || BytesRead != NumberOfSectors * SECTORSIZE)
+ {
+ return EIO;
+ }
+
+ *Count += NumberOfSectors * SECTORSIZE;
+ N -= NumberOfSectors * SECTORSIZE;
+ FilePointer += NumberOfSectors * SECTORSIZE;
+ Buffer = (PVOID)((ULONG_PTR)Buffer + NumberOfSectors * SECTORSIZE);
}
//
// Do the math for our third read (if any data left)
//
- if (BytesToRead > 0)
+ if (N > 0)
{
- SectorNumber = IsoFileInfo->FileStart + (IsoFileInfo->FilePointer / SECTORSIZE);
+ SectorNumber = FileHandle->FileStart + (FilePointer / SECTORSIZE);
//
- // Now do the read and update BytesRead, BytesToRead, FilePointer, & Buffer
+ // Now do the read and update Count, N, FilePointer, & Buffer
//
- if (!MachDiskReadLogicalSectors(IsoDriveNumber, SectorNumber, 1, (PVOID)DISKREADBUFFER))
+ Position.HighPart = 0;
+ Position.LowPart = SectorNumber * SECTORSIZE;
+ ret = ArcSeek(DeviceId, &Position, SeekAbsolute);
+ if (ret != ESUCCESS)
{
- return FALSE;
+ return ret;
}
- RtlCopyMemory(Buffer, (PVOID)DISKREADBUFFER, BytesToRead);
- if (BytesRead != NULL)
+ ret = ArcRead(DeviceId, SectorBuffer, SECTORSIZE, &BytesRead);
+ if (ret != ESUCCESS || BytesRead != SECTORSIZE)
{
- *BytesRead += BytesToRead;
+ return EIO;
}
- IsoFileInfo->FilePointer += BytesToRead;
- BytesToRead -= BytesToRead;
- Buffer = (PVOID)((ULONG_PTR)Buffer + BytesToRead);
+ RtlCopyMemory(Buffer, SectorBuffer, N);
+ *Count += N;
+ FilePointer += N;
}
- DPRINTM(DPRINT_FILESYSTEM, "IsoReadFile() done\n");
+ DPRINTM(DPRINT_FILESYSTEM, "IsoRead() done\n");
- return TRUE;
+ return ESUCCESS;
}
-
-ULONG IsoGetFileSize(FILE *FileHandle)
+LONG IsoSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode)
{
- PISO_FILE_INFO IsoFileHandle = (PISO_FILE_INFO)FileHandle;
+ PISO_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId);
- DPRINTM(DPRINT_FILESYSTEM, "IsoGetFileSize() FileSize = %d\n", IsoFileHandle->FileSize);
+ DPRINTM(DPRINT_FILESYSTEM, "IsoSeek() NewFilePointer = %lu\n", Position->LowPart);
- return IsoFileHandle->FileSize;
+ if (SeekMode != SeekAbsolute)
+ return EINVAL;
+ if (Position->HighPart != 0)
+ return EINVAL;
+ if (Position->LowPart >= FileHandle->FileSize)
+ return EINVAL;
+
+ FileHandle->FilePointer = Position->LowPart;
+ return ESUCCESS;
}
-VOID IsoSetFilePointer(FILE *FileHandle, ULONG NewFilePointer)
+const DEVVTBL Iso9660FuncTable =
{
- PISO_FILE_INFO IsoFileHandle = (PISO_FILE_INFO)FileHandle;
-
- DPRINTM(DPRINT_FILESYSTEM, "IsoSetFilePointer() NewFilePointer = %d\n", NewFilePointer);
-
- IsoFileHandle->FilePointer = NewFilePointer;
-}
-
-ULONG IsoGetFilePointer(FILE *FileHandle)
-{
- PISO_FILE_INFO IsoFileHandle = (PISO_FILE_INFO)FileHandle;
-
- DPRINTM(DPRINT_FILESYSTEM, "IsoGetFilePointer() FilePointer = %d\n", IsoFileHandle->FilePointer);
-
- return IsoFileHandle->FilePointer;
-}
-
-const FS_VTBL Iso9660Vtbl = {
- IsoOpenVolume,
- IsoOpenFile,
- NULL,
- IsoReadFile,
- IsoGetFileSize,
- IsoSetFilePointer,
- IsoGetFilePointer,
+ IsoClose,
+ IsoGetFileInformation,
+ IsoOpen,
+ IsoRead,
+ IsoSeek,
};
+
+const DEVVTBL* IsoMount(ULONG DeviceId)
+{
+ UCHAR Buffer[SECTORSIZE];
+ PPVD Pvd = (PPVD)Buffer;
+ LARGE_INTEGER Position;
+ ULONG Count;
+ LONG ret;
+
+ //
+ // Read The Primary Volume Descriptor
+ //
+ Position.HighPart = 0;
+ Position.LowPart = 16 * SECTORSIZE;
+ ret = ArcSeek(DeviceId, &Position, SeekAbsolute);
+ if (ret != ESUCCESS)
+ return NULL;
+ ret = ArcRead(DeviceId, Pvd, SECTORSIZE, &Count);
+ if (ret != ESUCCESS || Count < sizeof(PVD))
+ return NULL;
+
+ //
+ // Check if PVD is valid. If yes, return ISO9660 function table
+ //
+ if (Pvd->VdType == 1 && RtlEqualMemory(Pvd->StandardId, "CD001", 5))
+ return &Iso9660FuncTable;
+ else
+ return NULL;
+}
diff --git a/reactos/boot/freeldr/freeldr/fs/ntfs.c b/reactos/boot/freeldr/freeldr/fs/ntfs.c
index ecd4f678846..fba7cc5c22c 100644
--- a/reactos/boot/freeldr/freeldr/fs/ntfs.c
+++ b/reactos/boot/freeldr/freeldr/fs/ntfs.c
@@ -760,74 +760,156 @@ BOOLEAN NtfsOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG
return TRUE;
}
-FILE* NtfsOpenFile(PCSTR FileName)
+LONG NtfsClose(ULONG FileId)
+{
+ PNTFS_FILE_HANDLE FileHandle = FsGetDeviceSpecific(FileId);
+
+ NtfsReleaseAttributeContext(FileHandle->DataContext);
+ MmHeapFree(FileHandle);
+
+ return ESUCCESS;
+}
+
+LONG NtfsGetFileInformation(ULONG FileId, FILEINFORMATION* Information)
+{
+ PNTFS_FILE_HANDLE FileHandle = FsGetDeviceSpecific(FileId);
+
+ RtlZeroMemory(Information, sizeof(FILEINFORMATION));
+ Information->EndingAddress.LowPart = (ULONG)NtfsGetAttributeSize(&FileHandle->DataContext->Record);
+ Information->CurrentAddress.LowPart = FileHandle->Offset;
+
+ DPRINTM(DPRINT_FILESYSTEM, "NtfsGetFileInformation() FileSize = %d\n",
+ Information->EndingAddress.LowPart);
+ DPRINTM(DPRINT_FILESYSTEM, "NtfsGetFileInformation() FilePointer = %d\n",
+ Information->CurrentAddress.LowPart);
+
+ return ESUCCESS;
+}
+
+LONG NtfsOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
{
PNTFS_FILE_HANDLE FileHandle;
PNTFS_MFT_RECORD MftRecord;
+ ULONG DeviceId;
+ //
+ // Check parameters
+ //
+ if (OpenMode != OpenReadOnly)
+ return EACCES;
+
+ //
+ // Get underlying device
+ //
+ DeviceId = FsGetDeviceId(*FileId);
+
+ DPRINTM(DPRINT_FILESYSTEM, "NtfsOpen() FileName = %s\n", Path);
+
+ //
+ // Allocate file structure
+ //
FileHandle = MmHeapAlloc(sizeof(NTFS_FILE_HANDLE) + NtfsMftRecordSize);
- if (FileHandle == NULL)
+ if (!FileHandle)
{
- return NULL;
+ return ENOMEM;
}
+ RtlZeroMemory(FileHandle, sizeof(NTFS_FILE_HANDLE) + NtfsMftRecordSize);
+ //
+ // Search file entry
+ //
MftRecord = (PNTFS_MFT_RECORD)(FileHandle + 1);
- if (!NtfsLookupFile(FileName, MftRecord, &FileHandle->DataContext))
+ if (!NtfsLookupFile(Path, MftRecord, &FileHandle->DataContext))
{
MmHeapFree(FileHandle);
- return NULL;
+ return ENOENT;
}
- FileHandle->Offset = 0;
-
- return (FILE*)FileHandle;
+ return ESUCCESS;
}
-VOID NtfsCloseFile(FILE *File)
+LONG NtfsRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
{
- PNTFS_FILE_HANDLE FileHandle = (PNTFS_FILE_HANDLE)File;
- NtfsReleaseAttributeContext(FileHandle->DataContext);
- MmHeapFree(FileHandle);
-}
-
-BOOLEAN NtfsReadFile(FILE *File, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer)
-{
- PNTFS_FILE_HANDLE FileHandle = (PNTFS_FILE_HANDLE)File;
+ PNTFS_FILE_HANDLE FileHandle = FsGetDeviceSpecific(FileId);
ULONGLONG BytesRead64;
- BytesRead64 = NtfsReadAttribute(FileHandle->DataContext, FileHandle->Offset, Buffer, BytesToRead);
- if (BytesRead64)
- {
- *BytesRead = (ULONG)BytesRead64;
- FileHandle->Offset += BytesRead64;
- return TRUE;
- }
- return FALSE;
+
+ //
+ // Read file
+ //
+ BytesRead64 = NtfsReadAttribute(FileHandle->DataContext, FileHandle->Offset, Buffer, N);
+ *Count = (ULONG)BytesRead64;
+
+ //
+ // Check for success
+ //
+ if (BytesRead64 > 0)
+ return ESUCCESS;
+ else
+ return EIO;
}
-ULONG NtfsGetFileSize(FILE *File)
+LONG NtfsSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode)
{
- PNTFS_FILE_HANDLE FileHandle = (PNTFS_FILE_HANDLE)File;
- return (ULONG)NtfsGetAttributeSize(&FileHandle->DataContext->Record);
+ PNTFS_FILE_HANDLE FileHandle = FsGetDeviceSpecific(FileId);
+
+ DPRINTM(DPRINT_FILESYSTEM, "NtfsSeek() NewFilePointer = %lu\n", Position->LowPart);
+
+ if (SeekMode != SeekAbsolute)
+ return EINVAL;
+ if (Position->HighPart != 0)
+ return EINVAL;
+ if (Position->LowPart >= (ULONG)NtfsGetAttributeSize(&FileHandle->DataContext->Record))
+ return EINVAL;
+
+ FileHandle->Offset = Position->LowPart;
+ return ESUCCESS;
}
-VOID NtfsSetFilePointer(FILE *File, ULONG NewFilePointer)
+const DEVVTBL NtfsFuncTable =
{
- PNTFS_FILE_HANDLE FileHandle = (PNTFS_FILE_HANDLE)File;
- FileHandle->Offset = NewFilePointer;
-}
-
-ULONG NtfsGetFilePointer(FILE *File)
-{
- PNTFS_FILE_HANDLE FileHandle = (PNTFS_FILE_HANDLE)File;
- return FileHandle->Offset;
-}
-
-const FS_VTBL NtfsVtbl = {
- NtfsOpenVolume,
- NtfsOpenFile,
- NtfsCloseFile,
- NtfsReadFile,
- NtfsGetFileSize,
- NtfsSetFilePointer,
- NtfsGetFilePointer,
+ NtfsClose,
+ NtfsGetFileInformation,
+ NtfsOpen,
+ NtfsRead,
+ NtfsSeek,
};
+
+const DEVVTBL* NtfsMount(ULONG DeviceId)
+{
+ NTFS_BOOTSECTOR BootSector;
+ LARGE_INTEGER Position;
+ ULONG Count;
+ LONG ret;
+
+ //
+ // Read the BootSector
+ //
+ Position.HighPart = 0;
+ Position.LowPart = 0;
+ ret = ArcSeek(DeviceId, &Position, SeekAbsolute);
+ if (ret != ESUCCESS)
+ return NULL;
+ ret = ArcRead(DeviceId, &BootSector, sizeof(BootSector), &Count);
+ if (ret != ESUCCESS || Count != sizeof(BootSector))
+ return NULL;
+
+ //
+ // Check if BootSector is valid. If yes, return NTFS function table
+ //
+ if (RtlEqualMemory(BootSector.SystemId, "NTFS", 4))
+ {
+ //
+ // Compatibility hack as long as FS is not using underlying device DeviceId
+ //
+ ULONG DriveNumber;
+ ULONGLONG StartSector;
+ ULONGLONG SectorCount;
+ int Type;
+ if (!MachDiskGetBootVolume(&DriveNumber, &StartSector, &SectorCount, &Type))
+ return NULL;
+ NtfsOpenVolume(DriveNumber, StartSector, SectorCount);
+ return &NtfsFuncTable;
+ }
+ else
+ return NULL;
+}
diff --git a/reactos/boot/freeldr/freeldr/include/arch.h b/reactos/boot/freeldr/freeldr/include/arch.h
index d73786f96d6..9a4f3575c7f 100644
--- a/reactos/boot/freeldr/freeldr/include/arch.h
+++ b/reactos/boot/freeldr/freeldr/include/arch.h
@@ -47,7 +47,6 @@
#define FILESYSBUFFER 0x80000 /* Buffer to store file system data (e.g. cluster buffer for FAT) */
#define DISKREADBUFFER 0x90000 /* Buffer to store data read in from the disk via the BIOS */
#elif defined(_M_PPC) || defined(_M_MIPS) || defined(_M_ARM)
-extern PVOID FsStaticBufferDisk, FsStaticBufferData;
#define DISKREADBUFFER 0x80000000
#define FILESYSBUFFER 0x80000000
#endif
diff --git a/reactos/boot/freeldr/freeldr/include/arch/amd64/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/amd64/hardware.h
index d6ecd7e30e8..9c6c41c101a 100644
--- a/reactos/boot/freeldr/freeldr/include/arch/amd64/hardware.h
+++ b/reactos/boot/freeldr/freeldr/include/arch/amd64/hardware.h
@@ -38,22 +38,6 @@
//
// ARC Component Configuration Routines
//
-VOID
-NTAPI
-FldrSetComponentInformation(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
- IN IDENTIFIER_FLAG Flags,
- IN ULONG Key,
- IN ULONG Affinity
-);
-
-VOID
-NTAPI
-FldrSetIdentifier(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
- IN PCHAR Identifier
-);
-
VOID
NTAPI
FldrCreateSystemKey(
@@ -64,22 +48,17 @@ VOID
NTAPI
FldrCreateComponentKey(
IN PCONFIGURATION_COMPONENT_DATA SystemKey,
- IN PWCHAR BusName,
- IN ULONG BusNumber,
IN CONFIGURATION_CLASS Class,
IN CONFIGURATION_TYPE Type,
+ IN IDENTIFIER_FLAG Flags,
+ IN ULONG Key,
+ IN ULONG Affinity,
+ IN PCHAR IdentifierString,
+ IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
+ IN ULONG Size,
OUT PCONFIGURATION_COMPONENT_DATA *ComponentKey
);
-VOID
-NTAPI
-FldrSetConfigurationData(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
- IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
- IN ULONG Size
-);
-
-
/* PROTOTYPES ***************************************************************/
/* hardware.c */
diff --git a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h
index 893fa77674b..549eefeaf71 100644
--- a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h
+++ b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h
@@ -58,22 +58,6 @@ typedef struct _ARM_BOARD_CONFIGURATION_BLOCK
//
// ARC Component Configuration Routines
//
-VOID
-NTAPI
-FldrSetComponentInformation(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
- IN IDENTIFIER_FLAG Flags,
- IN ULONG Key,
- IN ULONG Affinity
-);
-
-VOID
-NTAPI
-FldrSetIdentifier(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
- IN PCHAR Identifier
-);
-
VOID
NTAPI
FldrCreateSystemKey(
@@ -83,20 +67,16 @@ FldrCreateSystemKey(
VOID
NTAPI
FldrCreateComponentKey(
- IN PCONFIGURATION_COMPONENT_DATA SystemKey,
- IN PWCHAR BusName,
- IN ULONG BusNumber,
+ IN PCONFIGURATION_COMPONENT_DATA SystemKey,,
IN CONFIGURATION_CLASS Class,
IN CONFIGURATION_TYPE Type,
- OUT PCONFIGURATION_COMPONENT_DATA *ComponentKey
-);
-
-VOID
-NTAPI
-FldrSetConfigurationData(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
+ IN IDENTIFIER_FLAG Flags,
+ IN ULONG Key,
+ IN ULONG Affinity,
+ IN PCHAR IdentifierString,
IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
- IN ULONG Size
+ IN ULONG Size,
+ OUT PCONFIGURATION_COMPONENT_DATA *ComponentKey
);
VOID
diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h
index 1f0e1f0f69d..314cd63ae6f 100644
--- a/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h
+++ b/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h
@@ -38,22 +38,6 @@
//
// ARC Component Configuration Routines
//
-VOID
-NTAPI
-FldrSetComponentInformation(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
- IN IDENTIFIER_FLAG Flags,
- IN ULONG Key,
- IN ULONG Affinity
-);
-
-VOID
-NTAPI
-FldrSetIdentifier(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
- IN PCHAR Identifier
-);
-
VOID
NTAPI
FldrCreateSystemKey(
@@ -64,22 +48,17 @@ VOID
NTAPI
FldrCreateComponentKey(
IN PCONFIGURATION_COMPONENT_DATA SystemKey,
- IN PWCHAR BusName,
- IN ULONG BusNumber,
IN CONFIGURATION_CLASS Class,
IN CONFIGURATION_TYPE Type,
+ IN IDENTIFIER_FLAG Flags,
+ IN ULONG Key,
+ IN ULONG Affinity,
+ IN PCHAR IdentifierString,
+ IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
+ IN ULONG Size,
OUT PCONFIGURATION_COMPONENT_DATA *ComponentKey
);
-VOID
-NTAPI
-FldrSetConfigurationData(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
- IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
- IN ULONG Size
-);
-
-
/* PROTOTYPES ***************************************************************/
/* hardware.c */
diff --git a/reactos/boot/freeldr/freeldr/include/arch/powerpc/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/powerpc/hardware.h
index 943f2254809..9d9c229ad56 100644
--- a/reactos/boot/freeldr/freeldr/include/arch/powerpc/hardware.h
+++ b/reactos/boot/freeldr/freeldr/include/arch/powerpc/hardware.h
@@ -37,22 +37,6 @@
//
// ARC Component Configuration Routines
//
-VOID
-NTAPI
-FldrSetComponentInformation(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
- IN IDENTIFIER_FLAG Flags,
- IN ULONG Key,
- IN ULONG Affinity
-);
-
-VOID
-NTAPI
-FldrSetIdentifier(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
- IN PCHAR Identifier
-);
-
VOID
NTAPI
FldrCreateSystemKey(
@@ -63,22 +47,17 @@ VOID
NTAPI
FldrCreateComponentKey(
IN PCONFIGURATION_COMPONENT_DATA SystemKey,
- IN PWCHAR BusName,
- IN ULONG BusNumber,
IN CONFIGURATION_CLASS Class,
IN CONFIGURATION_TYPE Type,
+ IN IDENTIFIER_FLAG Flags,
+ IN ULONG Key,
+ IN ULONG Affinity,
+ IN PCHAR IdentifierString,
+ IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
+ IN ULONG Size,
OUT PCONFIGURATION_COMPONENT_DATA *ComponentKey
);
-VOID
-NTAPI
-FldrSetConfigurationData(
- IN PCONFIGURATION_COMPONENT_DATA ComponentKey,
- IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
- IN ULONG Size
-);
-
-
/* PROTOTYPES ***************************************************************/
/* hardware.c */
diff --git a/reactos/boot/freeldr/freeldr/include/disk.h b/reactos/boot/freeldr/freeldr/include/disk.h
index d9f6138a098..7a3b18fd1c6 100644
--- a/reactos/boot/freeldr/freeldr/include/disk.h
+++ b/reactos/boot/freeldr/freeldr/include/disk.h
@@ -130,9 +130,7 @@ extern ULONG BootPartition;
BOOLEAN DiskGetBootVolume(PULONG DriveNumber, PULONGLONG StartSector,
PULONGLONG SectorCount, int *FsType);
BOOLEAN DiskGetSystemVolume(char *SystemPath, char *RemainingPath,
- PULONG Device, PULONG DriveNumber,
- PULONGLONG StartSector,
- PULONGLONG SectorCount, int *FsType);
+ PULONG Device);
BOOLEAN DiskGetBootPath(char *BootPath, unsigned Size);
VOID DiskGetBootDevice(PULONG BootDevice);
BOOLEAN DiskBootingFromFloppy(VOID);
diff --git a/reactos/boot/freeldr/freeldr/include/fs.h b/reactos/boot/freeldr/freeldr/include/fs.h
index cc2add6a170..47362b88c7e 100644
--- a/reactos/boot/freeldr/freeldr/include/fs.h
+++ b/reactos/boot/freeldr/freeldr/include/fs.h
@@ -29,21 +29,17 @@ typedef struct tagDEVVTBL
ARC_SEEK Seek;
} DEVVTBL;
-//#define EOF -1
-
#define FS_FAT 1
#define FS_NTFS 2
#define FS_EXT2 3
-#define FS_REISER 4
#define FS_ISO9660 5
-#define FS_PXE 6
-#define FILE VOID
-#define PFILE FILE *
+#define PFILE ULONG
VOID FsRegisterDevice(CHAR* Prefix, const DEVVTBL* FuncTable);
VOID FsSetDeviceSpecific(ULONG FileId, VOID* Specific);
VOID* FsGetDeviceSpecific(ULONG FileId);
+ULONG FsGetDeviceId(ULONG FileId);
VOID FsInit(VOID);
LONG ArcClose(ULONG FileId);
@@ -53,27 +49,12 @@ LONG ArcRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count);
LONG ArcSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode);
VOID FileSystemError(PCSTR ErrorString);
-BOOLEAN FsOpenBootVolume();
-BOOLEAN FsOpenSystemVolume(PCHAR SystemPath, PCHAR RemainingPath, PULONG BootDevice);
PFILE FsOpenFile(PCSTR FileName);
VOID FsCloseFile(PFILE FileHandle);
BOOLEAN FsReadFile(PFILE FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer);
ULONG FsGetFileSize(PFILE FileHandle);
VOID FsSetFilePointer(PFILE FileHandle, ULONG NewFilePointer);
-ULONG FsGetFilePointer(PFILE FileHandle);
-BOOLEAN FsIsEndOfFile(PFILE FileHandle);
ULONG FsGetNumPathParts(PCSTR Path);
VOID FsGetFirstNameFromPath(PCHAR Buffer, PCSTR Path);
-typedef struct
-{
- BOOLEAN (*OpenVolume)(UCHAR DriveNumber, ULONGLONG StartSector, ULONGLONG SectorCount);
- PFILE (*OpenFile)(PCSTR FileName);
- VOID (*CloseFile)(PFILE FileHandle);
- BOOLEAN (*ReadFile)(PFILE FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer);
- ULONG (*GetFileSize)(PFILE FileHandle);
- VOID (*SetFilePointer)(PFILE FileHandle, ULONG NewFilePointer);
- ULONG (*GetFilePointer)(PFILE FileHandle);
-} FS_VTBL;
-
#endif // #defined __FS_H
diff --git a/reactos/boot/freeldr/freeldr/include/fs/ext2.h b/reactos/boot/freeldr/freeldr/include/fs/ext2.h
index 99d232dd65d..bd1644275ed 100644
--- a/reactos/boot/freeldr/freeldr/include/fs/ext2.h
+++ b/reactos/boot/freeldr/freeldr/include/fs/ext2.h
@@ -20,615 +20,183 @@
#ifndef __EXT2_H
#define __EXT2_H
-
/*
- * linux/include/linux/ext3_fs.h
+ * grub/fs/ext2.c
*
- * Copyright (C) 1992, 1993, 1994, 1995
- * Remy Card (card@masi.ibp.fr)
- * Laboratoire MASI - Institut Blaise Pascal
- * Universite Pierre et Marie Curie (Paris VI)
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2003,2004,2005,2007 Free Software Foundation, Inc.
*
- * from
+ * 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.
*
- * linux/include/linux/minix_fs.h
+ * 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.
*
- * Copyright (C) 1991, 1992 Linus Torvalds
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see .
*/
-#ifndef _LINUX_EXT3_FS_H
-#define _LINUX_EXT3_FS_H
+/* Magic value used to identify an ext2 filesystem. */
+#define EXT2_MAGIC 0xEF53
+/* Amount of indirect blocks in an inode. */
+#define INDIRECT_BLOCKS 12
+/* Maximum lenght of a pathname. */
+#define EXT2_PATH_MAX 4096
+/* Maximum nesting of symlinks, used to prevent a loop. */
+#define EXT2_MAX_SYMLINKCNT 8
-//#include
+/* The good old revision and the default inode size. */
+#define EXT2_GOOD_OLD_REVISION 0
+#define EXT2_DYNAMIC_REVISION 1
+#define EXT2_GOOD_OLD_INODE_SIZE 128
-/*
- * The second extended filesystem constants/structures
- */
+/* Filetype used in directory entry. */
+#define FILETYPE_UNKNOWN 0
+#define FILETYPE_REG 1
+#define FILETYPE_DIRECTORY 2
+#define FILETYPE_SYMLINK 7
-/*
- * Define EXT3FS_DEBUG to produce debug messages
- */
-#undef EXT3FS_DEBUG
+/* Filetype information as used in inodes. */
+#define FILETYPE_INO_MASK 0170000
+#define FILETYPE_INO_REG 0100000
+#define FILETYPE_INO_DIRECTORY 0040000
+#define FILETYPE_INO_SYMLINK 0120000
-/*
- * Define EXT3_PREALLOCATE to preallocate data blocks for expanding files
- */
-#undef EXT3_PREALLOCATE /* @@@ Fix this! */
-#define EXT3_DEFAULT_PREALLOC_BLOCKS 8
-
-/*
- * The second extended file system version
- */
-#define EXT3FS_DATE "10 Jan 2002"
-#define EXT3FS_VERSION "2.4-0.9.17"
-
-/*
- * Debug code
- */
-#ifdef EXT3FS_DEBUG
-#define ext3_debug(f, a...) \
- do { \
- printk (KERN_DEBUG "EXT3-fs DEBUG (%s, %d): %s:", \
- __FILE__, __LINE__, __FUNCTION__); \
- printk (KERN_DEBUG f, ## a); \
- } while (0)
-#else
- #ifdef __GNUC__
- #define ext3_debug(f, a...) do {} while (0)
- #else
- #define ext3_debug
- #endif
-#endif
-
-/*
- * Special inodes numbers
- */
-#define EXT3_BAD_INO 1 /* Bad blocks inode */
-#define EXT3_ROOT_INO 2 /* Root inode */
-#define EXT3_ACL_IDX_INO 3 /* ACL inode */
-#define EXT3_ACL_DATA_INO 4 /* ACL inode */
-#define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */
-#define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */
-#define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */
-#define EXT3_JOURNAL_INO 8 /* Journal inode */
-
-/* First non-reserved inode for old ext3 filesystems */
-#define EXT3_GOOD_OLD_FIRST_INO 11
-
-/*
- * The second extended file system magic number
- */
-#define EXT3_SUPER_MAGIC 0xEF53
-
-/*
- * Maximal count of links to a file
- */
-#define EXT3_LINK_MAX 32000
-
-/*
- * Macro-instructions used to manage several block sizes
- */
-#define EXT3_MIN_BLOCK_SIZE 1024
-#define EXT3_MAX_BLOCK_SIZE 4096
-#define EXT3_MIN_BLOCK_LOG_SIZE 10
-#ifdef __KERNEL__
-# define EXT3_BLOCK_SIZE(s) ((s)->s_blocksize)
-#else
-# define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size)
-#endif
-#define EXT3_ACLE_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_acl_entry))
-#define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (ULONG))
-#ifdef __KERNEL__
-# define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits)
-#else
-# define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10)
-#endif
-#ifdef __KERNEL__
-#define EXT3_ADDR_PER_BLOCK_BITS(s) ((s)->u.ext3_sb.s_addr_per_block_bits)
-#define EXT3_INODE_SIZE(s) ((s)->u.ext3_sb.s_inode_size)
-#define EXT3_FIRST_INO(s) ((s)->u.ext3_sb.s_first_ino)
-#else
-#define EXT3_INODE_SIZE(s) (((s)->s_rev_level == EXT3_GOOD_OLD_REV) ? \
- EXT3_GOOD_OLD_INODE_SIZE : \
- (s)->s_inode_size)
-#define EXT3_FIRST_INO(s) (((s)->s_rev_level == EXT3_GOOD_OLD_REV) ? \
- EXT3_GOOD_OLD_FIRST_INO : \
- (s)->s_first_ino)
-#endif
-
-/*
- * Macro-instructions used to manage fragments
- */
-#define EXT3_MIN_FRAG_SIZE 1024
-#define EXT3_MAX_FRAG_SIZE 4096
-#define EXT3_MIN_FRAG_LOG_SIZE 10
-#ifdef __KERNEL__
-# define EXT3_FRAG_SIZE(s) ((s)->u.ext3_sb.s_frag_size)
-# define EXT3_FRAGS_PER_BLOCK(s) ((s)->u.ext3_sb.s_frags_per_block)
-#else
-# define EXT3_FRAG_SIZE(s) (EXT3_MIN_FRAG_SIZE << (s)->s_log_frag_size)
-# define EXT3_FRAGS_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / EXT3_FRAG_SIZE(s))
-#endif
-
-/*
- * ACL structures
- */
-struct ext3_acl_header /* Header of Access Control Lists */
+/* The ext2 superblock. */
+struct ext2_sblock
{
- ULONG aclh_size;
- ULONG aclh_file_count;
- ULONG aclh_acle_count;
- ULONG aclh_first_acle;
+ ULONG total_inodes;
+ ULONG total_blocks;
+ ULONG reserved_blocks;
+ ULONG free_blocks;
+ ULONG free_inodes;
+ ULONG first_data_block;
+ ULONG log2_block_size;
+ ULONG log2_fragment_size;
+ ULONG blocks_per_group;
+ ULONG fragments_per_group;
+ ULONG inodes_per_group;
+ ULONG mtime;
+ ULONG utime;
+ USHORT mnt_count;
+ USHORT max_mnt_count;
+ USHORT magic;
+ USHORT fs_state;
+ USHORT error_handling;
+ USHORT minor_revision_level;
+ ULONG lastcheck;
+ ULONG checkinterval;
+ ULONG creator_os;
+ ULONG revision_level;
+ USHORT uid_reserved;
+ USHORT gid_reserved;
+ ULONG first_inode;
+ USHORT inode_size;
+ USHORT block_group_number;
+ ULONG feature_compatibility;
+ ULONG feature_incompat;
+ ULONG feature_ro_compat;
+ ULONG unique_id[4];
+ char volume_name[16];
+ char last_mounted_on[64];
+ ULONG compression_info;
+ ULONG padding[77];
};
-struct ext3_acl_entry /* Access Control List Entry */
+/* The ext2 blockgroup. */
+struct ext2_block_group
{
- ULONG acle_size;
- USHORT acle_perms; /* Access permissions */
- USHORT acle_type; /* Type of entry */
- USHORT acle_tag; /* User or group identity */
- USHORT acle_pad1;
- ULONG acle_next; /* Pointer on next entry for the */
- /* same inode or on next free entry */
+ ULONG block_id;
+ ULONG inode_id;
+ ULONG inode_table_id;
+ USHORT free_blocks;
+ USHORT free_inodes;
+ USHORT used_dirs;
+ USHORT pad;
+ ULONG reserved[3];
};
-/*
- * Structure of a blocks group descriptor
- */
-struct ext3_group_desc
+/* The ext2 inode. */
+struct ext2_inode
{
- ULONG bg_block_bitmap; /* Blocks bitmap block */
- ULONG bg_inode_bitmap; /* Inodes bitmap block */
- ULONG bg_inode_table; /* Inodes table block */
- USHORT bg_free_blocks_count; /* Free blocks count */
- USHORT bg_free_inodes_count; /* Free inodes count */
- USHORT bg_used_dirs_count; /* Directories count */
- USHORT bg_pad;
- ULONG bg_reserved[3];
+ USHORT mode;
+ USHORT uid;
+ ULONG size;
+ ULONG atime;
+ ULONG ctime;
+ ULONG mtime;
+ ULONG dtime;
+ USHORT gid;
+ USHORT nlinks;
+ ULONG blockcnt; /* Blocks of 512 bytes!! */
+ ULONG flags;
+ ULONG osd1;
+ union
+ {
+ struct datablocks
+ {
+ ULONG dir_blocks[INDIRECT_BLOCKS];
+ ULONG indir_block;
+ ULONG double_indir_block;
+ ULONG tripple_indir_block;
+ } blocks;
+ char symlink[60];
+ };
+ ULONG version;
+ ULONG acl;
+ ULONG dir_acl;
+ ULONG fragment_addr;
+ ULONG osd2[3];
};
-/*
- * Macro-instructions used to manage group descriptors
- */
-#ifdef __KERNEL__
-# define EXT3_BLOCKS_PER_GROUP(s) ((s)->u.ext3_sb.s_blocks_per_group)
-# define EXT3_DESC_PER_BLOCK(s) ((s)->u.ext3_sb.s_desc_per_block)
-# define EXT3_INODES_PER_GROUP(s) ((s)->u.ext3_sb.s_inodes_per_group)
-# define EXT3_DESC_PER_BLOCK_BITS(s) ((s)->u.ext3_sb.s_desc_per_block_bits)
-#else
-# define EXT3_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group)
-# define EXT3_DESC_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_group_desc))
-# define EXT3_INODES_PER_GROUP(s) ((s)->s_inodes_per_group)
-#endif
+/* The header of an ext2 directory entry. */
+#define EXT2_NAME_LEN 255
-/*
- * Constants relative to the data blocks
- */
-#define EXT3_NDIR_BLOCKS 12
-#define EXT3_IND_BLOCK EXT3_NDIR_BLOCKS
-#define EXT3_DIND_BLOCK (EXT3_IND_BLOCK + 1)
-#define EXT3_TIND_BLOCK (EXT3_DIND_BLOCK + 1)
-#define EXT3_N_BLOCKS (EXT3_TIND_BLOCK + 1)
-
-/*
- * Inode flags
- */
-#define EXT3_SECRM_FL 0x00000001 /* Secure deletion */
-#define EXT3_UNRM_FL 0x00000002 /* Undelete */
-#define EXT3_COMPR_FL 0x00000004 /* Compress file */
-#define EXT3_SYNC_FL 0x00000008 /* Synchronous updates */
-#define EXT3_IMMUTABLE_FL 0x00000010 /* Immutable file */
-#define EXT3_APPEND_FL 0x00000020 /* writes to file may only append */
-#define EXT3_NODUMP_FL 0x00000040 /* do not dump file */
-#define EXT3_NOATIME_FL 0x00000080 /* do not update atime */
-/* Reserved for compression usage... */
-#define EXT3_DIRTY_FL 0x00000100
-#define EXT3_COMPRBLK_FL 0x00000200 /* One or more compressed clusters */
-#define EXT3_NOCOMPR_FL 0x00000400 /* Don't compress */
-#define EXT3_ECOMPR_FL 0x00000800 /* Compression error */
-/* End compression flags --- maybe not all used */
-#define EXT3_INDEX_FL 0x00001000 /* hash-indexed directory */
-#define EXT3_IMAGIC_FL 0x00002000 /* AFS directory */
-#define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */
-#define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */
-
-#define EXT3_FL_USER_VISIBLE 0x00005FFF /* User visible flags */
-#define EXT3_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */
-
-/*
- * Inode dynamic state flags
- */
-#define EXT3_STATE_JDATA 0x00000001 /* journaled data exists */
-#define EXT3_STATE_NEW 0x00000002 /* inode is newly created */
-
-/*
- * ioctl commands
- */
-#define EXT3_IOC_GETFLAGS _IOR('f', 1, long)
-#define EXT3_IOC_SETFLAGS _IOW('f', 2, long)
-#define EXT3_IOC_GETVERSION _IOR('f', 3, long)
-#define EXT3_IOC_SETVERSION _IOW('f', 4, long)
-#define EXT3_IOC_GETVERSION_OLD _IOR('v', 1, long)
-#define EXT3_IOC_SETVERSION_OLD _IOW('v', 2, long)
-#ifdef CONFIG_JBD_DEBUG
-#define EXT3_IOC_WAIT_FOR_READONLY _IOR('f', 99, long)
-#endif
-
-/*
- * Structure of an inode on the disk
- */
-struct ext3_inode {
- USHORT i_mode; /* File mode */
- USHORT i_uid; /* Low 16 bits of Owner Uid */
- ULONG i_size; /* Size in bytes */
- ULONG i_atime; /* Access time */
- ULONG i_ctime; /* Creation time */
- ULONG i_mtime; /* Modification time */
- ULONG i_dtime; /* Deletion Time */
- USHORT i_gid; /* Low 16 bits of Group Id */
- USHORT i_links_count; /* Links count */
- ULONG i_blocks; /* Blocks count */
- ULONG i_flags; /* File flags */
- union {
- struct {
- ULONG l_i_reserved1;
- } linux1;
- struct {
- ULONG h_i_translator;
- } hurd1;
- struct {
- ULONG m_i_reserved1;
- } masix1;
- } osd1; /* OS dependent 1 */
- ULONG i_block[EXT3_N_BLOCKS];/* Pointers to blocks */
- ULONG i_generation; /* File version (for NFS) */
- ULONG i_file_acl; /* File ACL */
- ULONG i_dir_acl; /* Directory ACL */
- ULONG i_faddr; /* Fragment address */
- union {
- struct {
- UCHAR l_i_frag; /* Fragment number */
- UCHAR l_i_fsize; /* Fragment size */
- USHORT i_pad1;
- USHORT l_i_uid_high; /* these 2 fields */
- USHORT l_i_gid_high; /* were reserved2[0] */
- ULONG l_i_reserved2;
- } linux2;
- struct {
- UCHAR h_i_frag; /* Fragment number */
- UCHAR h_i_fsize; /* Fragment size */
- USHORT h_i_mode_high;
- USHORT h_i_uid_high;
- USHORT h_i_gid_high;
- ULONG h_i_author;
- } hurd2;
- struct {
- UCHAR m_i_frag; /* Fragment number */
- UCHAR m_i_fsize; /* Fragment size */
- USHORT m_pad1;
- ULONG m_i_reserved2[2];
- } masix2;
- } osd2; /* OS dependent 2 */
-};
-
-#define i_size_high i_dir_acl
-
-#if defined(__KERNEL__) || defined(__linux__)
-#define i_reserved1 osd1.linux1.l_i_reserved1
-#define i_frag osd2.linux2.l_i_frag
-#define i_fsize osd2.linux2.l_i_fsize
-#define i_uid_low i_uid
-#define i_gid_low i_gid
-#define i_uid_high osd2.linux2.l_i_uid_high
-#define i_gid_high osd2.linux2.l_i_gid_high
-#define i_reserved2 osd2.linux2.l_i_reserved2
-
-#elif defined(__GNU__)
-
-#define i_translator osd1.hurd1.h_i_translator
-#define i_frag osd2.hurd2.h_i_frag;
-#define i_fsize osd2.hurd2.h_i_fsize;
-#define i_uid_high osd2.hurd2.h_i_uid_high
-#define i_gid_high osd2.hurd2.h_i_gid_high
-#define i_author osd2.hurd2.h_i_author
-
-#elif defined(__masix__)
-
-#define i_reserved1 osd1.masix1.m_i_reserved1
-#define i_frag osd2.masix2.m_i_frag
-#define i_fsize osd2.masix2.m_i_fsize
-#define i_reserved2 osd2.masix2.m_i_reserved2
-
-#endif /* defined(__KERNEL__) || defined(__linux__) */
-
-/*
- * File system states
- */
-#define EXT3_VALID_FS 0x0001 /* Unmounted cleanly */
-#define EXT3_ERROR_FS 0x0002 /* Errors detected */
-#define EXT3_ORPHAN_FS 0x0004 /* Orphans being recovered */
-
-/*
- * Mount flags
- */
-#define EXT3_MOUNT_CHECK 0x0001 /* Do mount-time checks */
-#define EXT3_MOUNT_GRPID 0x0004 /* Create files with directory's group */
-#define EXT3_MOUNT_DEBUG 0x0008 /* Some debugging messages */
-#define EXT3_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */
-#define EXT3_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */
-#define EXT3_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */
-#define EXT3_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */
-#define EXT3_MOUNT_NOLOAD 0x0100 /* Don't use existing journal*/
-#define EXT3_MOUNT_ABORT 0x0200 /* Fatal error detected */
-#define EXT3_MOUNT_DATA_FLAGS 0x0C00 /* Mode for data writes: */
- #define EXT3_MOUNT_JOURNAL_DATA 0x0400 /* Write data to journal */
- #define EXT3_MOUNT_ORDERED_DATA 0x0800 /* Flush data before commit */
- #define EXT3_MOUNT_WRITEBACK_DATA 0x0C00 /* No data ordering */
-#define EXT3_MOUNT_UPDATE_JOURNAL 0x1000 /* Update the journal format */
-#define EXT3_MOUNT_NO_UID32 0x2000 /* Disable 32-bit UIDs */
-
-/* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */
-#ifndef _LINUX_EXT2_FS_H
-#define clear_opt(o, opt) o &= ~EXT3_MOUNT_##opt
-#define set_opt(o, opt) o |= EXT3_MOUNT_##opt
-#define test_opt(sb, opt) ((sb)->u.ext3_sb.s_mount_opt & \
- EXT3_MOUNT_##opt)
-#else
-#define EXT2_MOUNT_NOLOAD EXT3_MOUNT_NOLOAD
-#define EXT2_MOUNT_ABORT EXT3_MOUNT_ABORT
-#endif
-
-#define ext3_set_bit ext2_set_bit
-#define ext3_clear_bit ext2_clear_bit
-#define ext3_test_bit ext2_test_bit
-#define ext3_find_first_zero_bit ext2_find_first_zero_bit
-#define ext3_find_next_zero_bit ext2_find_next_zero_bit
-
-/*
- * Maximal mount counts between two filesystem checks
- */
-#define EXT3_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */
-#define EXT3_DFL_CHECKINTERVAL 0 /* Don't use interval check */
-
-/*
- * Behaviour when detecting errors
- */
-#define EXT3_ERRORS_CONTINUE 1 /* Continue execution */
-#define EXT3_ERRORS_RO 2 /* Remount fs read-only */
-#define EXT3_ERRORS_PANIC 3 /* Panic */
-#define EXT3_ERRORS_DEFAULT EXT3_ERRORS_CONTINUE
-
-/*
- * Structure of the super block
- */
-struct ext3_super_block {
-/*00*/ ULONG s_inodes_count; /* Inodes count */
- ULONG s_blocks_count; /* Blocks count */
- ULONG s_r_blocks_count; /* Reserved blocks count */
- ULONG s_free_blocks_count; /* Free blocks count */
-/*10*/ ULONG s_free_inodes_count; /* Free inodes count */
- ULONG s_first_data_block; /* First Data Block */
- ULONG s_log_block_size; /* Block size */
- LONG s_log_frag_size; /* Fragment size */
-/*20*/ ULONG s_blocks_per_group; /* # Blocks per group */
- ULONG s_frags_per_group; /* # Fragments per group */
- ULONG s_inodes_per_group; /* # Inodes per group */
- ULONG s_mtime; /* Mount time */
-/*30*/ ULONG s_wtime; /* Write time */
- USHORT s_mnt_count; /* Mount count */
- SHORT s_max_mnt_count; /* Maximal mount count */
- USHORT s_magic; /* Magic signature */
- USHORT s_state; /* File system state */
- USHORT s_errors; /* Behaviour when detecting errors */
- USHORT s_minor_rev_level; /* minor revision level */
-/*40*/ ULONG s_lastcheck; /* time of last check */
- ULONG s_checkinterval; /* max. time between checks */
- ULONG s_creator_os; /* OS */
- ULONG s_rev_level; /* Revision level */
-/*50*/ USHORT s_def_resuid; /* Default uid for reserved blocks */
- USHORT s_def_resgid; /* Default gid for reserved blocks */
- /*
- * These fields are for EXT3_DYNAMIC_REV superblocks only.
- *
- * Note: the difference between the compatible feature set and
- * the incompatible feature set is that if there is a bit set
- * in the incompatible feature set that the kernel doesn't
- * know about, it should refuse to mount the filesystem.
- *
- * e2fsck's requirements are more strict; if it doesn't know
- * about a feature in either the compatible or incompatible
- * feature set, it must abort and not try to meddle with
- * things it doesn't understand...
- */
- ULONG s_first_ino; /* First non-reserved inode */
- USHORT s_inode_size; /* size of inode structure */
- USHORT s_block_group_nr; /* block group # of this superblock */
- ULONG s_feature_compat; /* compatible feature set */
-/*60*/ ULONG s_feature_incompat; /* incompatible feature set */
- ULONG s_feature_ro_compat; /* readonly-compatible feature set */
-/*68*/ UCHAR s_uuid[16]; /* 128-bit uuid for volume */
-/*78*/ char s_volume_name[16]; /* volume name */
-/*88*/ char s_last_mounted[64]; /* directory where last mounted */
-/*C8*/ ULONG s_algorithm_usage_bitmap; /* For compression */
- /*
- * Performance hints. Directory preallocation should only
- * happen if the EXT3_FEATURE_COMPAT_DIR_PREALLOC flag is on.
- */
- UCHAR s_prealloc_blocks; /* Nr of blocks to try to preallocate*/
- UCHAR s_prealloc_dir_blocks; /* Nr to preallocate for dirs */
- USHORT s_padding1;
- /*
- * Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.
- */
-/*D0*/ UCHAR s_journal_uuid[16]; /* uuid of journal superblock */
-/*E0*/ ULONG s_journal_inum; /* inode number of journal file */
- ULONG s_journal_dev; /* device number of journal file */
- ULONG s_last_orphan; /* start of list of inodes to delete */
-
-/*EC*/ ULONG s_reserved[197]; /* Padding to the end of the block */
-};
-
-#ifdef __KERNEL__
-#define EXT3_SB(sb) (&((sb)->u.ext3_sb))
-#define EXT3_I(inode) (&((inode)->u.ext3_i))
-#else
-/* Assume that user mode programs are passing in an ext3fs superblock, not
- * a kernel struct super_block. This will allow us to call the feature-test
- * macros from user land. */
-#define EXT3_SB(sb) (sb)
-#endif
-
-#define NEXT_ORPHAN(inode) (inode)->u.ext3_i.i_dtime
-
-/*
- * Codes for operating systems
- */
-#define EXT3_OS_LINUX 0
-#define EXT3_OS_HURD 1
-#define EXT3_OS_MASIX 2
-#define EXT3_OS_FREEBSD 3
-#define EXT3_OS_LITES 4
-
-/*
- * Revision levels
- */
-#define EXT3_GOOD_OLD_REV 0 /* The good old (original) format */
-#define EXT3_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */
-
-#define EXT3_CURRENT_REV EXT3_GOOD_OLD_REV
-#define EXT3_MAX_SUPP_REV EXT3_DYNAMIC_REV
-
-#define EXT3_GOOD_OLD_INODE_SIZE 128
-
-/*
- * Feature set definitions
- */
-
-#define EXT3_HAS_COMPAT_FEATURE(sb,mask) \
- ( EXT3_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) )
-#define EXT3_HAS_RO_COMPAT_FEATURE(sb,mask) \
- ( EXT3_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) )
-#define EXT3_HAS_INCOMPAT_FEATURE(sb,mask) \
- ( EXT3_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) )
-#define EXT3_SET_COMPAT_FEATURE(sb,mask) \
- EXT3_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask)
-#define EXT3_SET_RO_COMPAT_FEATURE(sb,mask) \
- EXT3_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask)
-#define EXT3_SET_INCOMPAT_FEATURE(sb,mask) \
- EXT3_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask)
-#define EXT3_CLEAR_COMPAT_FEATURE(sb,mask) \
- EXT3_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask)
-#define EXT3_CLEAR_RO_COMPAT_FEATURE(sb,mask) \
- EXT3_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask)
-#define EXT3_CLEAR_INCOMPAT_FEATURE(sb,mask) \
- EXT3_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask)
-
-#define EXT3_FEATURE_COMPAT_DIR_PREALLOC 0x0001
-#define EXT3_FEATURE_COMPAT_IMAGIC_INODES 0x0002
-#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004
-#define EXT3_FEATURE_COMPAT_EXT_ATTR 0x0008
-#define EXT3_FEATURE_COMPAT_RESIZE_INODE 0x0010
-#define EXT3_FEATURE_COMPAT_DIR_INDEX 0x0020
-
-#define EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
-#define EXT3_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
-#define EXT3_FEATURE_RO_COMPAT_BTREE_DIR 0x0004
-
-#define EXT3_FEATURE_INCOMPAT_COMPRESSION 0x0001
-#define EXT3_FEATURE_INCOMPAT_FILETYPE 0x0002
-#define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */
-#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */
-
-#define EXT3_FEATURE_COMPAT_SUPP 0
-/*#define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \
- EXT3_FEATURE_INCOMPAT_RECOVER)*/
-#define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE)
-#define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \
- EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \
- EXT3_FEATURE_RO_COMPAT_BTREE_DIR)
-
-/*
- * Default values for user and/or group using reserved blocks
- */
-#define EXT3_DEF_RESUID 0
-#define EXT3_DEF_RESGID 0
-
-/*
- * Structure of a directory entry
- */
-#define EXT3_NAME_LEN 255
-
-struct ext3_dir_entry {
- ULONG inode; /* Inode number */
- USHORT rec_len; /* Directory entry length */
- USHORT name_len; /* Name length */
- CHAR name[EXT3_NAME_LEN]; /* File name */
-};
-
-/*
- * The new version of the directory entry. Since EXT3 structures are
- * stored in intel byte order, and the name_len field could never be
- * bigger than 255 chars, it's safe to reclaim the extra byte for the
- * file_type field.
- */
-struct ext3_dir_entry_2 {
- ULONG inode; /* Inode number */
- USHORT rec_len; /* Directory entry length */
- UCHAR name_len; /* Name length */
- UCHAR file_type;
- CHAR name[EXT3_NAME_LEN]; /* File name */
-};
-
-/*
- * Ext3 directory file types. Only the low 3 bits are used. The
- * other bits are reserved for now.
- */
-#define EXT3_FT_UNKNOWN 0
-#define EXT3_FT_REG_FILE 1
-#define EXT3_FT_DIR 2
-#define EXT3_FT_CHRDEV 3
-#define EXT3_FT_BLKDEV 4
-#define EXT3_FT_FIFO 5
-#define EXT3_FT_SOCK 6
-#define EXT3_FT_SYMLINK 7
-
-#define EXT3_FT_MAX 8
-
-/*
- * EXT3_DIR_PAD defines the directory entries boundaries
- *
- * NOTE: It must be a multiple of 4
- */
-#define EXT3_DIR_PAD 4
-#define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1)
-#define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \
- ~EXT3_DIR_ROUND)
-
-#ifdef __KERNEL__
-/*
- * Describe an inode's exact location on disk and in memory
- */
-struct ext3_iloc
+struct ext2_dirent
{
- struct buffer_head *bh;
- struct ext3_inode *raw_inode;
- unsigned long block_group;
+ ULONG inode;
+ USHORT direntlen;
+ UCHAR namelen;
+ UCHAR filetype;
+ CHAR name[EXT2_NAME_LEN];
};
+/*
+ * End of code from grub/fs/ext2.c
+ */
+typedef struct ext2_sblock EXT2_SUPER_BLOCK, *PEXT2_SUPER_BLOCK;
+typedef struct ext2_inode EXT2_INODE, *PEXT2_INODE;
+typedef struct ext2_block_group EXT2_GROUP_DESC, *PEXT2_GROUP_DESC;
+typedef struct ext2_dirent EXT2_DIR_ENTRY, *PEXT2_DIR_ENTRY;
-#endif /* __KERNEL__ */
+/* Special inode numbers. */
+#define EXT2_ROOT_INO 2
-#endif /* _LINUX_EXT3_FS_H */
+/* Feature set definitions. */
+#define EXT3_FEATURE_INCOMPAT_SUPP 0x0002
+/* Log2 size of ext2 block in bytes. */
+#define LOG2_BLOCK_SIZE(sb) (sb->log2_block_size + 10)
+/* The size of an ext2 block in bytes. */
+#define EXT2_BLOCK_SIZE(sb) (1 << LOG2_BLOCK_SIZE(sb))
-typedef struct ext3_super_block EXT2_SUPER_BLOCK, *PEXT2_SUPER_BLOCK;
-typedef struct ext3_inode EXT2_INODE, *PEXT2_INODE;
-typedef struct ext3_group_desc EXT2_GROUP_DESC, *PEXT2_GROUP_DESC;
-typedef struct ext3_dir_entry_2 EXT2_DIR_ENTRY, *PEXT2_DIR_ENTRY;
+/* The revision level. */
+#define EXT2_REVISION(sb) (sb->revision_level)
-// EXT2_INODE::i_mode values
+/* The inode size. */
+#define EXT2_INODE_SIZE(sb) (EXT2_REVISION(sb) == EXT2_GOOD_OLD_REVISION \
+ ? EXT2_GOOD_OLD_INODE_SIZE \
+ : sb->inode_size)
+
+#define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof(struct ext2_block_group))
+
+// EXT2_INODE::mode values
#define EXT2_S_IRWXO 0x0007 // Other mask
#define EXT2_S_IXOTH 0x0001 // ---------x execute
#define EXT2_S_IWOTH 0x0002 // --------w- write
@@ -657,48 +225,17 @@ typedef struct ext3_dir_entry_2 EXT2_DIR_ENTRY, *PEXT2_DIR_ENTRY;
#define EXT2_S_IFLNK 0xA000 // Symbolic link
#define EXT2_S_IFSOCK 0xC000 // Socket
-#define FAST_SYMLINK_MAX_NAME_SIZE (EXT3_N_BLOCKS * sizeof(ULONG)) /* 60 bytes */
+#define FAST_SYMLINK_MAX_NAME_SIZE 60
typedef struct
{
- ULONGLONG FileSize; // File size
- ULONGLONG FilePointer; // File pointer
+ ULONGLONG FileSize; // File size
+ ULONGLONG FilePointer; // File pointer
ULONG* FileBlockList; // File block list
- UCHAR DriveNumber; // Drive number of open file
- EXT2_INODE Inode; // File's inode
+ UCHAR DriveNumber; // Drive number of open file
+ EXT2_INODE Inode; // File's inode
} EXT2_FILE_INFO, * PEXT2_FILE_INFO;
-
-
-BOOLEAN Ext2OpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount);
-FILE* Ext2OpenFile(PCSTR FileName);
-BOOLEAN Ext2LookupFile(PCSTR FileName, PEXT2_FILE_INFO Ext2FileInfoPointer);
-BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PEXT2_DIR_ENTRY DirectoryEntry);
-BOOLEAN Ext2ReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer);
-ULONG Ext2GetFileSize(FILE *FileHandle);
-VOID Ext2SetFilePointer(FILE *FileHandle, ULONG NewFilePointer);
-ULONG Ext2GetFilePointer(FILE *FileHandle);
-BOOLEAN Ext2ReadVolumeSectors(UCHAR DriveNumber, ULONGLONG SectorNumber, ULONGLONG SectorCount, PVOID Buffer);
-
-BOOLEAN Ext2ReadFileBig(FILE *FileHandle, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer);
-BOOLEAN Ext2ReadSuperBlock(VOID);
-BOOLEAN Ext2ReadGroupDescriptors(VOID);
-BOOLEAN Ext2ReadDirectory(ULONG Inode, PVOID* DirectoryBuffer, PEXT2_INODE InodePointer);
-BOOLEAN Ext2ReadBlock(ULONG BlockNumber, PVOID Buffer);
-BOOLEAN Ext2ReadPartialBlock(ULONG BlockNumber, ULONG StartingOffset, ULONG Length, PVOID Buffer);
-ULONG Ext2GetGroupDescBlockNumber(ULONG Group);
-ULONG Ext2GetGroupDescOffsetInBlock(ULONG Group);
-ULONG Ext2GetInodeGroupNumber(ULONG Inode);
-ULONG Ext2GetInodeBlockNumber(ULONG Inode);
-ULONG Ext2GetInodeOffsetInBlock(ULONG Inode);
-BOOLEAN Ext2ReadInode(ULONG Inode, PEXT2_INODE InodeBuffer);
-BOOLEAN Ext2ReadGroupDescriptor(ULONG Group, PEXT2_GROUP_DESC GroupBuffer);
-ULONG* Ext2ReadBlockPointerList(PEXT2_INODE Inode);
-ULONGLONG Ext2GetInodeFileSize(PEXT2_INODE Inode);
-BOOLEAN Ext2CopyIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG IndirectBlock);
-BOOLEAN Ext2CopyDoubleIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG DoubleIndirectBlock);
-BOOLEAN Ext2CopyTripleIndirectBlockPointers(ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG TripleIndirectBlock);
-
-extern const FS_VTBL Ext2Vtbl;
+const DEVVTBL* Ext2Mount(ULONG DeviceId);
#endif // #defined __EXT2_H
diff --git a/reactos/boot/freeldr/freeldr/include/fs/fat.h b/reactos/boot/freeldr/freeldr/include/fs/fat.h
index 5736792d83c..f5cd6b26e1c 100644
--- a/reactos/boot/freeldr/freeldr/include/fs/fat.h
+++ b/reactos/boot/freeldr/freeldr/include/fs/fat.h
@@ -152,28 +152,6 @@ typedef struct
ULONG DriveNumber;
} FAT_FILE_INFO, * PFAT_FILE_INFO;
-
-
-BOOLEAN FatOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount);
-ULONG FatDetermineFatType(PFAT_BOOTSECTOR FatBootSector, ULONG PartitionSectorCount);
-PVOID FatBufferDirectory(ULONG DirectoryStartCluster, ULONG* EntryCountPointer, BOOLEAN RootDirectory);
-BOOLEAN FatSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG EntryCount, PCHAR FileName, PFAT_FILE_INFO FatFileInfoPointer);
-BOOLEAN FatLookupFile(PCSTR FileName, PFAT_FILE_INFO FatFileInfoPointer);
-void FatParseShortFileName(PCHAR Buffer, PDIRENTRY DirEntry);
-BOOLEAN FatGetFatEntry(ULONG Cluster, ULONG* ClusterPointer);
-FILE* FatOpenFile(PCSTR FileName);
-ULONG FatCountClustersInChain(ULONG StartCluster);
-ULONG* FatGetClusterChainArray(ULONG StartCluster);
-BOOLEAN FatReadCluster(ULONG ClusterNumber, PVOID Buffer);
-BOOLEAN FatReadClusterChain(ULONG StartClusterNumber, ULONG NumberOfClusters, PVOID Buffer);
-BOOLEAN FatReadPartialCluster(ULONG ClusterNumber, ULONG StartingOffset, ULONG Length, PVOID Buffer);
-BOOLEAN FatReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer);
-ULONG FatGetFileSize(FILE *FileHandle);
-VOID FatSetFilePointer(FILE *FileHandle, ULONG NewFilePointer);
-ULONG FatGetFilePointer(FILE *FileHandle);
-BOOLEAN FatReadVolumeSectors(ULONG DriveNumber, ULONG SectorNumber, ULONG SectorCount, PVOID Buffer);
-
-
#define ATTR_NORMAL 0x00
#define ATTR_READONLY 0x01
#define ATTR_HIDDEN 0x02
@@ -191,6 +169,6 @@ BOOLEAN FatReadVolumeSectors(ULONG DriveNumber, ULONG SectorNumber, ULONG Sector
#define ISFATX(FT) ((FT) == FATX16 || (FT) == FATX32)
-extern const FS_VTBL FatVtbl;
+const DEVVTBL* FatMount(ULONG DeviceId);
#endif // #defined __FAT_H
diff --git a/reactos/boot/freeldr/freeldr/include/fs/iso.h b/reactos/boot/freeldr/freeldr/include/fs/iso.h
index 05263ac00f7..fb3d10f10c3 100644
--- a/reactos/boot/freeldr/freeldr/include/fs/iso.h
+++ b/reactos/boot/freeldr/freeldr/include/fs/iso.h
@@ -99,14 +99,6 @@ typedef struct
ULONG DriveNumber;
} ISO_FILE_INFO, * PISO_FILE_INFO;
-
-BOOLEAN IsoOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount);
-FILE* IsoOpenFile(PCSTR FileName);
-BOOLEAN IsoReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer);
-ULONG IsoGetFileSize(FILE *FileHandle);
-VOID IsoSetFilePointer(FILE *FileHandle, ULONG NewFilePointer);
-ULONG IsoGetFilePointer(FILE *FileHandle);
-
-extern const FS_VTBL Iso9660Vtbl;
+const DEVVTBL* IsoMount(ULONG DeviceId);
#endif // #defined __FAT_H
diff --git a/reactos/boot/freeldr/freeldr/include/fs/ntfs.h b/reactos/boot/freeldr/freeldr/include/fs/ntfs.h
index c8665f93833..c755b4c93d5 100644
--- a/reactos/boot/freeldr/freeldr/include/fs/ntfs.h
+++ b/reactos/boot/freeldr/freeldr/include/fs/ntfs.h
@@ -222,14 +222,6 @@ typedef struct
} NTFS_FILE_HANDLE, *PNTFS_FILE_HANDLE;
#include
-BOOLEAN NtfsOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount);
-FILE* NtfsOpenFile(PCSTR FileName);
-VOID NtfsCloseFile(FILE *FileHandle);
-BOOLEAN NtfsReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer);
-ULONG NtfsGetFileSize(FILE *FileHandle);
-VOID NtfsSetFilePointer(FILE *FileHandle, ULONG NewFilePointer);
-ULONG NtfsGetFilePointer(FILE *FileHandle);
-
-extern const FS_VTBL NtfsVtbl;
+const DEVVTBL* NtfsMount(ULONG DeviceId);
#endif // #defined __NTFS_H
diff --git a/reactos/boot/freeldr/freeldr/include/inifile.h b/reactos/boot/freeldr/freeldr/include/inifile.h
index a36d4577685..af737031a92 100644
--- a/reactos/boot/freeldr/freeldr/include/inifile.h
+++ b/reactos/boot/freeldr/freeldr/include/inifile.h
@@ -54,8 +54,6 @@ extern BOOLEAN IniFileSectionInitialized;
extern ULONG IniFileSectionCount;
extern ULONG IniFileSettingCount;
-PFILE IniOpenIniFile();
-
BOOLEAN IniParseFile(PCHAR IniFileData, ULONG IniFileSize);
ULONG IniGetNextLineSize(PCHAR IniFileData, ULONG IniFileSize, ULONG CurrentOffset);
ULONG IniGetNextLine(PCHAR IniFileData, ULONG IniFileSize, PCHAR Buffer, ULONG BufferSize, ULONG CurrentOffset);
diff --git a/reactos/boot/freeldr/freeldr/include/machine.h b/reactos/boot/freeldr/freeldr/include/machine.h
index 94c737391b9..f185affe1c2 100644
--- a/reactos/boot/freeldr/freeldr/include/machine.h
+++ b/reactos/boot/freeldr/freeldr/include/machine.h
@@ -63,7 +63,7 @@ typedef struct tagMACHVTBL
ULONG (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize);
BOOLEAN (*DiskGetBootVolume)(PULONG DriveNumber, PULONGLONG StartSector, PULONGLONG SectorCount, int *FsType);
- BOOLEAN (*DiskGetSystemVolume)(char *SystemPath, char *RemainingPath, PULONG Device, PULONG DriveNumber, PULONGLONG StartSector, PULONGLONG SectorCount, int *FsType);
+ BOOLEAN (*DiskGetSystemVolume)(char *SystemPath, char *RemainingPath, PULONG Device);
BOOLEAN (*DiskGetBootPath)(char *BootPath, unsigned Size);
VOID (*DiskGetBootDevice)(PULONG BootDevice);
BOOLEAN (*DiskBootingFromFloppy)(VOID);
@@ -104,11 +104,7 @@ BOOLEAN MachDiskGetBootVolume(PULONG DriveNumber, PULONGLONG StartSector, PULONG
BOOLEAN
MachDiskGetSystemVolume(char *SystemPath,
char *RemainingPath,
- PULONG Device,
- PULONG DriveNumber,
- PULONGLONG StartSector,
- PULONGLONG SectorCount,
- int *FsType);
+ PULONG Device);
BOOLEAN MachDiskGetBootPath(char *BootPath, unsigned Size);
VOID MachDiskGetBootDevice(PULONG BootDevice);
BOOLEAN MachDiskBootingFromFloppy();
@@ -140,7 +136,7 @@ VOID MachPrepareForReactOS(IN BOOLEAN Setup);
#define MachBeep() MachVtbl.Beep()
#define MachPrepareForReactOS(a) MachVtbl.PrepareForReactOS(a)
#define MachDiskGetBootVolume(Drv, Start, Cnt, FsType) MachVtbl.DiskGetBootVolume((Drv), (Start), (Cnt), (FsType))
-#define MachDiskGetSystemVolume(SysPath, RemPath, Dev, Drv, Start, Cnt, FsType) MachVtbl.DiskGetSystemVolume((SysPath), (RemPath), (Dev), (Drv), (Start), (Cnt), (FsType))
+#define MachDiskGetSystemVolume(SysPath, RemPath, Dev) MachVtbl.DiskGetSystemVolume((SysPath), (RemPath), (Dev))
#define MachDiskGetBootPath(Path, Size) MachVtbl.DiskGetBootPath((Path), (Size))
#define MachDiskGetBootDevice(BootDevice) MachVtbl.DiskGetBootDevice(BootDevice)
#define MachDiskBootingFromFloppy() MachVtbl.DiskBootingFromFloppy()
diff --git a/reactos/boot/freeldr/freeldr/include/reactos.h b/reactos/boot/freeldr/freeldr/include/reactos.h
index 0b627bd5268..32e7fe1804d 100644
--- a/reactos/boot/freeldr/freeldr/include/reactos.h
+++ b/reactos/boot/freeldr/freeldr/include/reactos.h
@@ -98,9 +98,9 @@ extern reactos_mem_data_t reactos_mem_data;
VOID FASTCALL FrLdrSetupPae(ULONG Magic);
VOID FASTCALL FrLdrSetupPageDirectory(VOID);
VOID FASTCALL FrLdrGetPaeMode(VOID);
-BOOLEAN NTAPI FrLdrMapKernel(FILE *KernelImage);
+BOOLEAN NTAPI FrLdrMapKernel(PFILE KernelImage);
ULONG_PTR NTAPI FrLdrCreateModule(LPCSTR ModuleName);
-ULONG_PTR NTAPI FrLdrLoadModule(FILE *ModuleImage, LPCSTR ModuleName, PULONG ModuleSize);
+ULONG_PTR NTAPI FrLdrLoadModule(PFILE ModuleImage, LPCSTR ModuleName, PULONG ModuleSize);
BOOLEAN NTAPI FrLdrCloseModule(ULONG_PTR ModuleBase, ULONG dwModuleSize);
VOID NTAPI FrLdrStartup(ULONG Magic);
typedef VOID (FASTCALL *ROS_KERNEL_ENTRY_POINT)(ULONG Magic, PROS_LOADER_PARAMETER_BLOCK LoaderBlock);
@@ -108,7 +108,7 @@ typedef VOID (FASTCALL *ROS_KERNEL_ENTRY_POINT)(ULONG Magic, PROS_LOADER_PARAMET
PVOID
NTAPI
FrLdrMapImage(
- IN FILE *Image,
+ IN PFILE Image,
IN PCHAR ShortName,
IN ULONG ImageType
);
@@ -116,7 +116,7 @@ FrLdrMapImage(
PVOID
NTAPI
FrLdrReadAndMapImage(
- IN FILE *Image,
+ IN PFILE Image,
IN PCHAR ShortName,
IN ULONG ImageType
);
diff --git a/reactos/boot/freeldr/freeldr/inffile/inffile.c b/reactos/boot/freeldr/freeldr/inffile/inffile.c
index 420e0862226..de3de98b86a 100644
--- a/reactos/boot/freeldr/freeldr/inffile/inffile.c
+++ b/reactos/boot/freeldr/freeldr/inffile/inffile.c
@@ -873,91 +873,107 @@ InfOpenFile(PHINF InfHandle,
PCSTR FileName,
PULONG ErrorLine)
{
- PFILE FileHandle;
- PCHAR FileBuffer;
- ULONG FileSize;
- PINFCACHE Cache;
- BOOLEAN Success;
+ FILEINFORMATION Information;
+ ULONG FileId;
+ PCHAR FileBuffer;
+ ULONG FileSize, Count;
+ PINFCACHE Cache;
+ BOOLEAN Success;
+ LONG ret;
+ *InfHandle = NULL;
+ *ErrorLine = (ULONG)-1;
- *InfHandle = NULL;
- *ErrorLine = (ULONG)-1;
-
-
- /* Open the inf file */
- FileHandle = FsOpenFile (FileName);
- if (FileHandle == NULL)
+ //
+ // Open the .inf file
+ //
+ FileId = FsOpenFile(FileName);
+ if (!FileId)
{
-// DPRINT("NtOpenFile() failed (Status %lx)\n", Status);
- return FALSE;
+ return FALSE;
}
-// DPRINT("NtOpenFile() successful\n");
-
- /* Query file size */
- FileSize = FsGetFileSize (FileHandle);
- if (FileSize == 0)
+ //
+ // Query file size
+ //
+ ret = ArcGetFileInformation(FileId, &Information);
+ if (ret != ESUCCESS || Information.EndingAddress.HighPart != 0)
{
-// DPRINT("NtQueryInformationFile() failed (Status %lx)\n", Status);
- FsCloseFile (FileHandle);
- return FALSE;
+ ArcClose(FileId);
+ return FALSE;
+ }
+ FileSize = Information.EndingAddress.LowPart;
+
+ //
+ // Allocate buffer to cache the file
+ //
+ FileBuffer = MmHeapAlloc(FileSize + 1);
+ if (!FileBuffer)
+ {
+ ArcClose(FileId);
+ return FALSE;
}
-// DPRINT("File size: %lu\n", FileLength);
-
- /* Allocate file buffer */
- FileBuffer = MmHeapAlloc (FileSize + 1);
- if (FileBuffer == NULL)
+ //
+ // Read file into memory
+ //
+ ret = ArcRead(FileId, FileBuffer, FileSize, &Count);
+ if (ret != ESUCCESS || Count != FileSize)
{
-// DPRINT1("RtlAllocateHeap() failed\n");
- FsCloseFile (FileHandle);
- return FALSE;
+ ArcClose(FileId);
+ MmHeapFree(FileBuffer);
+ return FALSE;
}
- /* Read file */
- Success = FsReadFile(FileHandle, FileSize, NULL, FileBuffer);
+ //
+ // We don't need the file anymore. Close it
+ //
+ ArcClose(FileId);
- FsCloseFile (FileHandle);
- if (!Success)
+ //
+ // Append string terminator
+ //
+ FileBuffer[FileSize] = 0;
+
+ //
+ // Allocate infcache header
+ //
+ Cache = (PINFCACHE)MmHeapAlloc(sizeof(INFCACHE));
+ if (!Cache)
{
-// DPRINT("FsReadFile() failed\n");
- MmHeapFree (FileBuffer);
- return FALSE;
+ MmHeapFree (FileBuffer);
+ return FALSE;
}
- /* Append string terminator */
- FileBuffer[FileSize] = 0;
+ //
+ // Initialize inicache header
+ //
+ RtlZeroMemory(Cache, sizeof(INFCACHE));
- /* Allocate infcache header */
- Cache = (PINFCACHE)MmHeapAlloc (sizeof(INFCACHE));
- if (Cache == NULL)
+ //
+ // Parse the inf buffer
+ //
+ Success = InfpParseBuffer(Cache,
+ FileBuffer,
+ FileBuffer + FileSize,
+ ErrorLine);
+ if (!Success)
{
-// DPRINT("RtlAllocateHeap() failed\n");
- MmHeapFree (FileBuffer);
- return FALSE;
+ MmHeapFree(Cache);
+ Cache = NULL;
}
- /* Initialize inicache header */
- RtlZeroMemory(Cache,
- sizeof(INFCACHE));
+ //
+ // Free file buffer, as it has been parsed
+ //
+ MmHeapFree(FileBuffer);
- /* Parse the inf buffer */
- Success = InfpParseBuffer (Cache,
- FileBuffer,
- FileBuffer + FileSize,
- ErrorLine);
- if (!Success)
- {
- MmHeapFree (Cache);
- Cache = NULL;
- }
+ //
+ // Return .inf parsed contents
+ //
+ *InfHandle = (HINF)Cache;
- /* Free file buffer */
- MmHeapFree (FileBuffer);
-
- *InfHandle = (HINF)Cache;
-
- return Success;
+ return Success;
}
diff --git a/reactos/boot/freeldr/freeldr/inifile/ini_init.c b/reactos/boot/freeldr/freeldr/inifile/ini_init.c
index b5892a15f40..6e5fdfca978 100644
--- a/reactos/boot/freeldr/freeldr/inifile/ini_init.c
+++ b/reactos/boot/freeldr/freeldr/inifile/ini_init.c
@@ -1,6 +1,6 @@
/*
* FreeLoader
- * Copyright (C) 1998-2003 Brian Palmer
+ * Copyright (C) 2009 Herv Poussineau
*
* 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
@@ -19,58 +19,86 @@
#include
+static LONG IniOpenIniFile(ULONG* FileId)
+{
+ CHAR FreeldrPath[MAX_PATH];
+ LONG ret;
+
+ //
+ // Create full freeldr.ini path
+ //
+ MachDiskGetBootPath(FreeldrPath, sizeof(FreeldrPath));
+ strcat(FreeldrPath, "\\freeldr.ini");
+
+ // Try to open freeldr.ini
+ ret = ArcOpen(FreeldrPath, OpenReadOnly, FileId);
+
+ return ret;
+}
+
BOOLEAN IniFileInitialize(VOID)
{
- PFILE Freeldr_Ini; // File handle for freeldr.ini
- PCHAR FreeLoaderIniFileData;
- ULONG FreeLoaderIniFileSize;
- BOOLEAN Success;
+ FILEINFORMATION FileInformation;
+ ULONG FileId; // File handle for freeldr.ini
+ PCHAR FreeLoaderIniFileData;
+ ULONG FreeLoaderIniFileSize, Count;
+ LONG ret;
+ BOOLEAN Success;
+ //
// Open freeldr.ini
- Freeldr_Ini = IniOpenIniFile();
-
- if (Freeldr_Ini == NULL)
+ //
+ ret = IniOpenIniFile(&FileId);
+ if (ret != ESUCCESS)
{
UiMessageBoxCritical("Error opening freeldr.ini or file not found.\nYou need to re-install FreeLoader.");
return FALSE;
}
- // Get the file size & allocate enough memory for it
- FreeLoaderIniFileSize = FsGetFileSize(Freeldr_Ini);
- FreeLoaderIniFileData = MmHeapAlloc(FreeLoaderIniFileSize);
+ //
+ // Get the file size
+ //
+ ret = ArcGetFileInformation(FileId, &FileInformation);
+ if (ret != ESUCCESS || FileInformation.EndingAddress.HighPart != 0)
+ {
+ UiMessageBoxCritical("Error while getting informations about freeldr.ini.\nYou need to re-install FreeLoader.");
+ return FALSE;
+ }
+ FreeLoaderIniFileSize = FileInformation.EndingAddress.LowPart;
- // If we are out of memory then return FALSE
- if (FreeLoaderIniFileData == NULL)
+ //
+ // Allocate memory to cache the whole freeldr.ini
+ //
+ FreeLoaderIniFileData = MmHeapAlloc(FreeLoaderIniFileSize);
+ if (!FreeLoaderIniFileData)
{
UiMessageBoxCritical("Out of memory while loading freeldr.ini.");
- FsCloseFile(Freeldr_Ini);
+ ArcClose(FileId);
return FALSE;
}
+ //
// Read freeldr.ini off the disk
- if (!FsReadFile(Freeldr_Ini, FreeLoaderIniFileSize, NULL, FreeLoaderIniFileData))
+ //
+ ret = ArcRead(FileId, FreeLoaderIniFileData, FreeLoaderIniFileSize, &Count);
+ if (ret != ESUCCESS || Count != FreeLoaderIniFileSize)
{
- FsCloseFile(Freeldr_Ini);
+ UiMessageBoxCritical("Error while reading freeldr.ini.");
+ ArcClose(FileId);
MmHeapFree(FreeLoaderIniFileData);
return FALSE;
}
- FsCloseFile(Freeldr_Ini);
-
+ //
// Parse the .ini file data
+ //
Success = IniParseFile(FreeLoaderIniFileData, FreeLoaderIniFileSize);
+ //
+ // Do some cleanup, and return
+ //
+ ArcClose(FileId);
MmHeapFree(FreeLoaderIniFileData);
return Success;
}
-
-PFILE IniOpenIniFile()
-{
- PFILE IniFileHandle; // File handle for freeldr.ini
-
- // Try to open freeldr.ini
- IniFileHandle = FsOpenFile("freeldr.ini");
-
- return IniFileHandle;
-}
diff --git a/reactos/boot/freeldr/freeldr/linuxboot.c b/reactos/boot/freeldr/freeldr/linuxboot.c
index 38ff7afff4b..eef427e1643 100644
--- a/reactos/boot/freeldr/freeldr/linuxboot.c
+++ b/reactos/boot/freeldr/freeldr/linuxboot.c
@@ -43,8 +43,8 @@ CHAR LinuxBootPath[260] = "";
VOID LoadAndBootLinux(PCSTR OperatingSystemName, PCSTR Description)
{
- PFILE LinuxKernel = NULL;
- PFILE LinuxInitrdFile = NULL;
+ PFILE LinuxKernel = 0;
+ PFILE LinuxInitrdFile = 0;
CHAR TempString[260];
UiDrawBackdrop();
@@ -73,15 +73,15 @@ VOID LoadAndBootLinux(PCSTR OperatingSystemName, PCSTR Description)
UiMessageBox("Invalid boot path");
goto LinuxBootFailed;
}
- if (!FsOpenSystemVolume(LinuxBootPath, NULL, NULL))
+ if (!MachDiskGetSystemVolume(LinuxBootPath, NULL, NULL))
{
- UiMessageBox("Failed to open boot drive.");
+ UiMessageBox("Failed to get system volume.");
goto LinuxBootFailed;
}
// Open the kernel
LinuxKernel = FsOpenFile(LinuxKernelName);
- if (LinuxKernel == NULL)
+ if (!LinuxKernel)
{
sprintf(TempString, "Linux kernel \'%s\' not found.", LinuxKernelName);
UiMessageBox(TempString);
@@ -92,7 +92,7 @@ VOID LoadAndBootLinux(PCSTR OperatingSystemName, PCSTR Description)
if (LinuxHasInitrd)
{
LinuxInitrdFile = FsOpenFile(LinuxInitrdName);
- if (LinuxInitrdFile == NULL)
+ if (!LinuxInitrdFile)
{
sprintf(TempString, "Linux initrd image \'%s\' not found.", LinuxInitrdName);
UiMessageBox(TempString);
@@ -178,11 +178,11 @@ VOID LoadAndBootLinux(PCSTR OperatingSystemName, PCSTR Description)
LinuxBootFailed:
- if (LinuxKernel != NULL)
+ if (LinuxKernel)
{
FsCloseFile(LinuxKernel);
}
- if (LinuxInitrdFile != NULL)
+ if (LinuxInitrdFile)
{
FsCloseFile(LinuxInitrdFile);
}
diff --git a/reactos/boot/freeldr/freeldr/machine.c b/reactos/boot/freeldr/freeldr/machine.c
index 2bdc6051de7..0c397211275 100644
--- a/reactos/boot/freeldr/freeldr/machine.c
+++ b/reactos/boot/freeldr/freeldr/machine.c
@@ -333,15 +333,9 @@ MachDiskGetBootVolume(PULONG DriveNumber, PULONGLONG StartSector, PULONGLONG Sec
BOOLEAN
MachDiskGetSystemVolume(char *SystemPath,
char *RemainingPath,
- PULONG Device,
- PULONG DriveNumber,
- PULONGLONG StartSector,
- PULONGLONG SectorCount,
- int *FsType)
+ PULONG Device)
{
- return MachVtbl.DiskGetSystemVolume(SystemPath, RemainingPath, Device,
- DriveNumber, StartSector, SectorCount,
- FsType);
+ return MachVtbl.DiskGetSystemVolume(SystemPath, RemainingPath, Device);
}
BOOLEAN
diff --git a/reactos/boot/freeldr/freeldr/miscboot.c b/reactos/boot/freeldr/freeldr/miscboot.c
index a96bbd5cd28..ad52593d938 100644
--- a/reactos/boot/freeldr/freeldr/miscboot.c
+++ b/reactos/boot/freeldr/freeldr/miscboot.c
@@ -51,14 +51,14 @@ VOID LoadAndBootBootSector(PCSTR OperatingSystemName)
return;
}
- if (!FsOpenSystemVolume(FileName, FileName, NULL))
+ if (!MachDiskGetSystemVolume(FileName, FileName, NULL))
{
- UiMessageBox("Failed to open boot drive.");
+ UiMessageBox("Failed to get system volume.");
return;
}
FilePointer = FsOpenFile(FileName);
- if (FilePointer == NULL)
+ if (!FilePointer)
{
strcat(FileName, " not found.");
UiMessageBox(FileName);
diff --git a/reactos/boot/freeldr/freeldr/mm/meminit.c b/reactos/boot/freeldr/freeldr/mm/meminit.c
index a89c1922deb..0cac2740cba 100644
--- a/reactos/boot/freeldr/freeldr/mm/meminit.c
+++ b/reactos/boot/freeldr/freeldr/mm/meminit.c
@@ -277,6 +277,38 @@ VOID MmInitPageLookupTable(PVOID PageLookupTable, ULONG TotalPageCount)
MemoryMapPageAllocated = LoaderFree;
break;
}
+ case MemoryFirmwarePermanent:
+ {
+ //
+ // Firmware permanent memory
+ //
+ MemoryMapPageAllocated = LoaderFirmwarePermanent;
+ break;
+ }
+ case MemoryFirmwareTemporary:
+ {
+ //
+ // Firmware temporary memory
+ //
+ MemoryMapPageAllocated = LoaderFirmwareTemporary;
+ break;
+ }
+ case MemoryLoadedProgram:
+ {
+ //
+ // Bootloader code
+ //
+ MemoryMapPageAllocated = LoaderLoadedProgram;
+ break;
+ }
+ case MemorySpecialMemory:
+ {
+ //
+ // Special reserved memory
+ //
+ MemoryMapPageAllocated = LoaderSpecialMemory;
+ break;
+ }
default:
{
//
diff --git a/reactos/boot/freeldr/freeldr/reactos/archwsup.c b/reactos/boot/freeldr/freeldr/reactos/archwsup.c
index 5cbb942537f..5abf4d02f7c 100644
--- a/reactos/boot/freeldr/freeldr/reactos/archwsup.c
+++ b/reactos/boot/freeldr/freeldr/reactos/archwsup.c
@@ -20,6 +20,12 @@ PCONFIGURATION_COMPONENT_DATA FldrArcHwTreeRoot;
BOOLEAN UseRealHeap = FALSE;
+VOID
+NTAPI
+FldrSetConfigurationData(IN PCONFIGURATION_COMPONENT_DATA ComponentData,
+ IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
+ IN ULONG Size);
+
/* FUNCTIONS ******************************************************************/
PVOID
@@ -51,23 +57,6 @@ FldrpHwHeapAlloc(IN ULONG Size)
return Buffer;
}
-VOID
-NTAPI
-FldrSetComponentInformation(IN PCONFIGURATION_COMPONENT_DATA ComponentData,
- IN IDENTIFIER_FLAG Flags,
- IN ULONG Key,
- IN ULONG Affinity)
-{
- PCONFIGURATION_COMPONENT Component = &ComponentData->ComponentEntry;
-
- /* Set component information */
- Component->Flags = Flags;
- Component->Version = 0;
- Component->Revision = 0;
- Component->Key = Key;
- Component->AffinityMask = Affinity;
-}
-
VOID
NTAPI
FldrSetIdentifier(IN PCONFIGURATION_COMPONENT_DATA ComponentData,
@@ -107,6 +96,11 @@ FldrCreateSystemKey(OUT PCONFIGURATION_COMPONENT_DATA *SystemNode)
Component->ConfigurationDataLength = 0;
Component->Identifier = 0;
Component->IdentifierLength = 0;
+ Component->Flags = 0;
+ Component->Version = 0;
+ Component->Revision = 0;
+ Component->Key = 0;
+ Component->AffinityMask = 0xFFFFFFFF;
/* Return the node */
*SystemNode = FldrArcHwTreeRoot;
@@ -145,10 +139,14 @@ FldrLinkToParent(IN PCONFIGURATION_COMPONENT_DATA Parent,
VOID
NTAPI
FldrCreateComponentKey(IN PCONFIGURATION_COMPONENT_DATA SystemNode,
- IN PWCHAR BusName,
- IN ULONG BusNumber,
IN CONFIGURATION_CLASS Class,
IN CONFIGURATION_TYPE Type,
+ IN IDENTIFIER_FLAG Flags,
+ IN ULONG Key,
+ IN ULONG Affinity,
+ IN PCHAR IdentifierString,
+ IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
+ IN ULONG Size,
OUT PCONFIGURATION_COMPONENT_DATA *ComponentKey)
{
PCONFIGURATION_COMPONENT_DATA ComponentData;
@@ -162,12 +160,24 @@ FldrCreateComponentKey(IN PCONFIGURATION_COMPONENT_DATA SystemNode,
ComponentData->Parent = SystemNode;
/* Link us to the parent */
- FldrLinkToParent(SystemNode, ComponentData);
+ if (SystemNode)
+ FldrLinkToParent(SystemNode, ComponentData);
/* Set us up */
Component = &ComponentData->ComponentEntry;
Component->Class = Class;
Component->Type = Type;
+ Component->Flags = Flags;
+ Component->Key = Key;
+ Component->AffinityMask = Affinity;
+
+ /* Set identifier */
+ if (IdentifierString)
+ FldrSetIdentifier(ComponentData, IdentifierString);
+
+ /* Set configuration data */
+ if (ResourceList)
+ FldrSetConfigurationData(ComponentData, ResourceList, Size);
/* Return the child */
*ComponentKey = ComponentData;
diff --git a/reactos/boot/freeldr/freeldr/reactos/imageldr.c b/reactos/boot/freeldr/freeldr/reactos/imageldr.c
index e1669706fea..1a3af5eeb6b 100644
--- a/reactos/boot/freeldr/freeldr/reactos/imageldr.c
+++ b/reactos/boot/freeldr/freeldr/reactos/imageldr.c
@@ -65,7 +65,7 @@ LdrPEGetOrLoadModule(IN PCHAR ModuleName,
ULONG_PTR
NTAPI
-FrLdrLoadModule(FILE *ModuleImage,
+FrLdrLoadModule(PFILE ModuleImage,
LPCSTR ModuleName,
PULONG ModuleSize)
{
@@ -435,7 +435,7 @@ LdrPEFixupImports(IN PVOID DllBase,
PVOID
NTAPI
-FrLdrReadAndMapImage(IN FILE *Image,
+FrLdrReadAndMapImage(IN PFILE Image,
IN PCHAR Name,
IN ULONG ImageType)
{
@@ -674,7 +674,7 @@ FrLdrReMapImage(IN PVOID Base,
PVOID
NTAPI
-FrLdrMapImage(IN FILE *Image,
+FrLdrMapImage(IN PFILE Image,
IN PCHAR Name,
IN ULONG ImageType)
{
diff --git a/reactos/boot/freeldr/freeldr/reactos/reactos.c b/reactos/boot/freeldr/freeldr/reactos/reactos.c
index f7b0227bd2b..ec27cac271d 100644
--- a/reactos/boot/freeldr/freeldr/reactos/reactos.c
+++ b/reactos/boot/freeldr/freeldr/reactos/reactos.c
@@ -67,7 +67,7 @@ FrLdrLoadDriver(PCHAR szFileName,
FilePointer = FsOpenFile(szFileName);
/* Try under the system root in the main dir and drivers */
- if (FilePointer == NULL)
+ if (!FilePointer)
{
strcpy(value, SystemRoot);
if(value[strlen(value)-1] != '\\')
@@ -76,7 +76,7 @@ FrLdrLoadDriver(PCHAR szFileName,
FilePointer = FsOpenFile(value);
}
- if (FilePointer == NULL)
+ if (!FilePointer)
{
strcpy(value, SystemRoot);
if(value[strlen(value)-1] != '\\')
@@ -86,7 +86,7 @@ FrLdrLoadDriver(PCHAR szFileName,
FilePointer = FsOpenFile(value);
}
- if (FilePointer == NULL)
+ if (!FilePointer)
{
strcpy(value, SystemRoot);
if(value[strlen(value)-1] != '\\')
@@ -97,7 +97,7 @@ FrLdrLoadDriver(PCHAR szFileName,
}
/* Make sure we did */
- if (FilePointer == NULL) {
+ if (!FilePointer) {
/* Fail if file wasn't opened */
strcpy(value, szFileName);
@@ -201,7 +201,7 @@ FrLdrLoadNlsFile(PCSTR szFileName,
FilePointer = FsOpenFile(szFileName);
/* Make sure we did */
- if (FilePointer == NULL) {
+ if (!FilePointer) {
/* Fail if file wasn't opened */
strcpy(value, szFileName);
@@ -756,11 +756,11 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
RamDiskSwitchFromBios();
/*
- * Try to open system drive
+ * Try to get system volume
*/
- if (!FsOpenSystemVolume(SystemPath, szBootPath, &LoaderBlock.BootDevice))
+ if (!MachDiskGetSystemVolume(SystemPath, szBootPath, &LoaderBlock.BootDevice))
{
- UiMessageBox("Failed to open system drive.");
+ UiMessageBox("Failed to get system volume.");
return;
}
@@ -847,7 +847,7 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
DPRINTM(DPRINT_REACTOS, "SystemHive: '%s'", szFileName);
FilePointer = FsOpenFile(szFileName);
- if (FilePointer == NULL)
+ if (!FilePointer)
{
UiMessageBox("Could not find the System hive!");
return;
@@ -871,7 +871,7 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
UiMessageBox("Could not load the System hive!\n");
return;
}
- DPRINTM(DPRINT_REACTOS, "SystemHive loaded at 0x%x size %u", (unsigned)Base, (unsigned)Size);
+ DPRINTM(DPRINT_REACTOS, "SystemHive loaded at 0x%x size %u\n", (unsigned)Base, (unsigned)Size);
/*
* Import the loaded system hive
diff --git a/reactos/boot/freeldr/freeldr/reactos/setupldr.c b/reactos/boot/freeldr/freeldr/reactos/setupldr.c
index 2cea745ca3c..d71812e2353 100644
--- a/reactos/boot/freeldr/freeldr/reactos/setupldr.c
+++ b/reactos/boot/freeldr/freeldr/reactos/setupldr.c
@@ -119,13 +119,6 @@ VOID LoadReactOSSetup(VOID)
/* set boot device */
MachDiskGetBootDevice(&LoaderBlock.BootDevice);
- /* Open boot drive */
- if (!FsOpenBootVolume())
- {
- UiMessageBox("Failed to open boot drive.");
- return;
- }
-
UiDrawStatusText("Loading txtsetup.sif...");
/* Open 'txtsetup.sif' */
for (i = MachDiskBootingFromFloppy() ? 0 : 1; ; i++)
@@ -202,13 +195,6 @@ VOID LoadReactOSSetup(VOID)
{
UiMessageBox("Please insert \"ReactOS Boot Disk 2\" and press ENTER");
- /* Open boot drive */
- if (!FsOpenBootVolume())
- {
- UiMessageBox("Failed to open boot drive.");
- return;
- }
-
/* FIXME: check volume label or disk marker file */
}
diff --git a/reactos/boot/freeldr/freeldr/ui/tui.c b/reactos/boot/freeldr/freeldr/ui/tui.c
index 38081d59d09..a0926064762 100644
--- a/reactos/boot/freeldr/freeldr/ui/tui.c
+++ b/reactos/boot/freeldr/freeldr/ui/tui.c
@@ -22,61 +22,28 @@
PVOID TextVideoBuffer = NULL;
/*
- * printf() - prints formatted text to stdout
- * originally from GRUB
+ * TuiPrintf()
+ * Prints formatted text to the screen
*/
-int TuiPrintf(const char *format, ... )
+int TuiPrintf(const char *Format, ...)
{
- char c, *ptr, str[16];
+ int i;
+ int Length;
va_list ap;
- va_start(ap,format);
+ CHAR Buffer[512];
- while ((c = *(format++)))
+ va_start(ap, Format);
+ Length = _vsnprintf(Buffer, sizeof(Buffer), Format, ap);
+ va_end(ap);
+
+ if (Length == -1) Length = sizeof(Buffer);
+
+ for (i = 0; i < Length; i++)
{
- if (c != '%')
- {
- MachConsPutChar(c);
- }
- else
- {
- switch (c = *(format++))
- {
- case 'c':
- MachConsPutChar((va_arg(ap, int)) & 0xff);
- break;
- case 's':
- ptr = va_arg(ap, char *);
- while ((c = *(ptr++)))
- {
- MachConsPutChar(c);
- }
- break;
- case '%':
- MachConsPutChar(c);
- break;
- case 'l':
- c = *(format++);
- /* Fall through. */
- case 'd': case 'u': case 'x':
- if (c == 'x')
- _itoa(va_arg(ap, unsigned long), str, 16);
- else
- _itoa(va_arg(ap, unsigned long), str, 10);
- ptr = str;
- while (*ptr)
- {
- MachConsPutChar(*(ptr++));
- }
- break;
- default:
- printf("\nprintf() invalid format specifier - %%%c\n", c);
- break;
- }
- }
+ MachConsPutChar(Buffer[i]);
}
- va_end(ap);
- return 0;
+ return Length;
}
BOOLEAN TuiInitialize(VOID)
@@ -447,8 +414,8 @@ VOID TuiUpdateDateTime(VOID)
CHAR TempString[20];
BOOLEAN PMHour = FALSE;
- /* Don't draw the time if this has been disabled */
- if (!UiDrawTime) return;
+ /* Don't draw the time if this has been disabled */
+ if (!UiDrawTime) return;
TimeInfo = ArcGetTime();
if (TimeInfo->Year < 1 || 9999 < TimeInfo->Year ||
diff --git a/reactos/boot/freeldr/freeldr/windows/setupldr2.c b/reactos/boot/freeldr/freeldr/windows/setupldr2.c
index 4d53a6fde22..e4e27319a98 100644
--- a/reactos/boot/freeldr/freeldr/windows/setupldr2.c
+++ b/reactos/boot/freeldr/freeldr/windows/setupldr2.c
@@ -186,9 +186,6 @@ VOID LoadReactOSSetup2(VOID)
NULL
};
- /* Try to open system drive */
- FsOpenBootVolume();
-
/* Open 'txtsetup.sif' from any of source paths */
MachDiskGetBootPath(SystemPath, sizeof(SystemPath));
for (i = MachDiskBootingFromFloppy() ? 0 : 1; ; i++)
diff --git a/reactos/boot/freeldr/freeldr/windows/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/wlmemory.c
index 2de36ab08e2..5384c400a38 100644
--- a/reactos/boot/freeldr/freeldr/windows/wlmemory.c
+++ b/reactos/boot/freeldr/freeldr/windows/wlmemory.c
@@ -912,7 +912,7 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss)
//
// Copy the old IDT
- RtlCopyMemory(pIdt, (PVOID)OldIdt.Base, OldIdt.Limit);
+ RtlCopyMemory(pIdt, (PVOID)OldIdt.Base, OldIdt.Limit + 1);
// Mask interrupts
//asm("cli\n"); // they are already masked before enabling paged mode
diff --git a/reactos/dll/3rdparty/libjpeg/jmorecfg.h b/reactos/dll/3rdparty/libjpeg/jmorecfg.h
index f54191b002e..41b329ef306 100644
--- a/reactos/dll/3rdparty/libjpeg/jmorecfg.h
+++ b/reactos/dll/3rdparty/libjpeg/jmorecfg.h
@@ -24,7 +24,6 @@
#if (defined (_MSC_VER) && (_MSC_VER >= 800))
#define HAVE_UNSIGNED_CHAR
-#define HAVE_ALL_INTS
#define EXTERN(type) extern type __cdecl
#endif
@@ -240,7 +239,7 @@ typedef unsigned int JDIMENSION;
/* a function referenced thru EXTERNs: */
#define GLOBAL(type) type JPEG_API
/* a reference to a GLOBAL function: */
-#ifndef EXTERN
+#ifndef EXTERN
# define EXTERN(type) extern JPEG_IMPEXP type JPEG_API
/* a reference to a "GLOBAL" function exported by sourcefiles of utility progs */
#endif /* EXTERN */
diff --git a/reactos/dll/3rdparty/libjpeg/libjpeg.rbuild b/reactos/dll/3rdparty/libjpeg/libjpeg.rbuild
index 2fbf58c2d06..e3083df6efe 100644
--- a/reactos/dll/3rdparty/libjpeg/libjpeg.rbuild
+++ b/reactos/dll/3rdparty/libjpeg/libjpeg.rbuild
@@ -1,7 +1,6 @@
-
diff --git a/reactos/dll/3rdparty/libjpeg/libjpeg.reactos.diff b/reactos/dll/3rdparty/libjpeg/libjpeg.reactos.diff
new file mode 100644
index 00000000000..5793f5153bf
--- /dev/null
+++ b/reactos/dll/3rdparty/libjpeg/libjpeg.reactos.diff
@@ -0,0 +1,12 @@
+Index: jmorecfg.h
+===================================================================
+--- jmorecfg.h (revision 42441)
++++ jmorecfg.h (working copy)
+@@ -24,7 +24,6 @@
+
+ #if (defined (_MSC_VER) && (_MSC_VER >= 800))
+ #define HAVE_UNSIGNED_CHAR
+-#define HAVE_ALL_INTS
+ #define EXTERN(type) extern type __cdecl
+ #endif
+
diff --git a/reactos/dll/3rdparty/mesa32/reactos.diff b/reactos/dll/3rdparty/mesa32/reactos.diff
index 87d3d6b7348..f864c7420cb 100644
--- a/reactos/dll/3rdparty/mesa32/reactos.diff
+++ b/reactos/dll/3rdparty/mesa32/reactos.diff
@@ -3995,3 +3995,55 @@ Index: x86/common_x86.c
if ( cpu_has_xmm ) {
_mesa_debug(NULL, "Yes.\n");
+Index: main/imports.c
+===================================================================
+--- main/imports.c (revision 42472)
++++ main/imports.c (working copy)
+@@ -104,7 +104,7 @@
+
+ (void) posix_memalign(& mem, alignment, bytes);
+ return mem;
+-#elif defined(_WIN32) && defined(_MSC_VER)
++#elif 0/*defined(_WIN32) && defined(_MSC_VER)*/
+ return _aligned_malloc(bytes, alignment);
+ #else
+ uintptr_t ptr, buf;
+@@ -146,7 +146,7 @@
+ }
+
+ return mem;
+-#elif defined(_WIN32) && defined(_MSC_VER)
++#elif 0/*defined(_WIN32) && defined(_MSC_VER)*/
+ void *mem;
+
+ mem = _aligned_malloc(bytes, alignment);
+Index: main/imports.h
+===================================================================
+--- main/imports.h (revision 42472)
++++ main/imports.h (working copy)
+@@ -482,10 +482,10 @@
+ /* This function/macro is sensitive to precision. Test very carefully
+ * if you change it!
+ */
+-#define UNCLAMPED_FLOAT_TO_UBYTE(UB, F) \
++#define UNCLAMPED_FLOAT_TO_UBYTE(UB, F_) \
+ do { \
+ fi_type __tmp; \
+- __tmp.f = (F); \
++ __tmp.f = (F_); \
+ if (__tmp.i < 0) \
+ UB = (GLubyte) 0; \
+ else if (__tmp.i >= IEEE_0996) \
+@@ -495,10 +495,10 @@
+ UB = (GLubyte) __tmp.i; \
+ } \
+ } while (0)
+-#define CLAMPED_FLOAT_TO_UBYTE(UB, F) \
++#define CLAMPED_FLOAT_TO_UBYTE(UB, F_) \
+ do { \
+ fi_type __tmp; \
+- __tmp.f = (F) * (255.0F/256.0F) + 32768.0F; \
++ __tmp.f = (F_) * (255.0F/256.0F) + 32768.0F; \
+ UB = (GLubyte) __tmp.i; \
+ } while (0)
+ #else
diff --git a/reactos/dll/3rdparty/mesa32/src/main/imports.c b/reactos/dll/3rdparty/mesa32/src/main/imports.c
index 0c2c894eef0..1623b216236 100644
--- a/reactos/dll/3rdparty/mesa32/src/main/imports.c
+++ b/reactos/dll/3rdparty/mesa32/src/main/imports.c
@@ -104,7 +104,7 @@ _mesa_align_malloc(size_t bytes, unsigned long alignment)
(void) posix_memalign(& mem, alignment, bytes);
return mem;
-#elif defined(_WIN32) && defined(_MSC_VER)
+#elif 0/*defined(_WIN32) && defined(_MSC_VER)*/
return _aligned_malloc(bytes, alignment);
#else
uintptr_t ptr, buf;
@@ -146,7 +146,7 @@ _mesa_align_calloc(size_t bytes, unsigned long alignment)
}
return mem;
-#elif defined(_WIN32) && defined(_MSC_VER)
+#elif 0/*defined(_WIN32) && defined(_MSC_VER)*/
void *mem;
mem = _aligned_malloc(bytes, alignment);
diff --git a/reactos/dll/3rdparty/mesa32/src/main/imports.h b/reactos/dll/3rdparty/mesa32/src/main/imports.h
index e560bc0599e..8056e3401aa 100644
--- a/reactos/dll/3rdparty/mesa32/src/main/imports.h
+++ b/reactos/dll/3rdparty/mesa32/src/main/imports.h
@@ -482,10 +482,10 @@ _mesa_is_pow_two(int x)
/* This function/macro is sensitive to precision. Test very carefully
* if you change it!
*/
-#define UNCLAMPED_FLOAT_TO_UBYTE(UB, F) \
+#define UNCLAMPED_FLOAT_TO_UBYTE(UB, F_) \
do { \
fi_type __tmp; \
- __tmp.f = (F); \
+ __tmp.f = (F_); \
if (__tmp.i < 0) \
UB = (GLubyte) 0; \
else if (__tmp.i >= IEEE_0996) \
@@ -495,10 +495,10 @@ _mesa_is_pow_two(int x)
UB = (GLubyte) __tmp.i; \
} \
} while (0)
-#define CLAMPED_FLOAT_TO_UBYTE(UB, F) \
+#define CLAMPED_FLOAT_TO_UBYTE(UB, F_) \
do { \
fi_type __tmp; \
- __tmp.f = (F) * (255.0F/256.0F) + 32768.0F; \
+ __tmp.f = (F_) * (255.0F/256.0F) + 32768.0F; \
UB = (GLubyte) __tmp.i; \
} while (0)
#else
diff --git a/reactos/dll/cpl/appwiz-new/appwiz.c b/reactos/dll/cpl/appwiz-new/appwiz.c
deleted file mode 100644
index 326b3c46761..00000000000
--- a/reactos/dll/cpl/appwiz-new/appwiz.c
+++ /dev/null
@@ -1,1076 +0,0 @@
-/*
- *
- * PROJECT: ReactOS Software Control Panel
- * FILE: dll/cpl/appwiz/appwiz.c
- * PURPOSE: ReactOS Software Control Panel
- * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
- * UPDATE HISTORY:
- * 02-09-2008 Created
- */
-
-#include "appwiz.h"
-
-WCHAR* DescriptionHeadline = L"";
-WCHAR* DescriptionText = L"";
-HBITMAP hUnderline;
-WCHAR Strings[2][256];
-HICON hSearchIcon;
-HTREEITEM hRootItem; // First item in actions list
-HFONT hMainFont;
-HIMAGELIST hImageAppList; // Image list for programs list
-BOOL bAscending = TRUE; // Sorting programs list
-
-HDC BackbufferHdc = NULL;
-HBITMAP BackbufferBmp = NULL;
-
-
-VOID
-ShowMessage(WCHAR* title, WCHAR* message)
-{
- DescriptionHeadline = title;
- DescriptionText = message;
- InvalidateRect(hMainWnd,NULL,TRUE);
- UpdateWindow(hMainWnd);
-}
-
-static VOID
-DrawBitmap(HDC hdc, int x, int y, HBITMAP hBmp)
-{
- BITMAP bm;
- HDC hdcMem = CreateCompatibleDC(hdc);
-
- SelectObject(hdcMem, hBmp);
- GetObject(hBmp, sizeof(bm), &bm);
- TransparentBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, 0xFFFFFF);
-
- DeleteDC(hdcMem);
-}
-
-static VOID
-DrawDescription(HDC hdc, RECT DescriptionRect)
-{
- int i;
- HFONT Font;
- RECT Rect = {DescriptionRect.left+5, DescriptionRect.top+5, DescriptionRect.right-2, DescriptionRect.top+22};
-
- // Backgroud
- Rectangle(hdc, DescriptionRect.left, DescriptionRect.top, DescriptionRect.right, DescriptionRect.bottom);
-
- // Underline
- for (i=DescriptionRect.left+1;i 1900) && ((int)localtime.wYear < 3000))
- {
- GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &localtime,
- NULL, szLastUsed, 256);
- }
- else wcscpy(szLastUsed,L"---");
- }
- else wcscpy(szLastUsed,L"---");
- }
- else wcscpy(szLastUsed,L"---");
- }
- else
- {
- wcscpy(szPath,L"---");
- wcscpy(szSize,L"---");
- wcscpy(szLastUsed,L"---");
- }
- }
- RegCloseKey(hKey);
-}
-
-/*
- AddItemToList - create application list
-
- hSubKey - handle to the sub key for adding to LPARAM
- szDisplayName - display name
- ItemIndex - item index
- AppName - application name (for getting ARPCache info)
-*/
-static VOID
-AddItemToList(LPARAM hSubKey, LPWSTR szDisplayName, INT ItemIndex, LPWSTR AppName)
-{
- int index;
- HICON hIcon = NULL;
- LV_ITEM listItem;
- WCHAR IconPath[MAX_PATH], AppSize[256], LastUsed[256];
- int iIndex;
-
- GetARPInfo(AppName, IconPath, AppSize, LastUsed);
-
- if (GetFileAttributes(IconPath) != 0xFFFFFFFF)
- {
- // FIXME: This function not getting 32-bits icon
- ExtractIconEx(IconPath, 0, NULL, &hIcon, 1);
- }
-
- if (hIcon == NULL)
- {
- hIcon = LoadImage(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM), IMAGE_ICON, 16, 16, LR_CREATEDIBSECTION);
- }
- index = ImageList_AddIcon(hImageAppList, hIcon);
- DestroyIcon(hIcon);
-
- ZeroMemory(&listItem, sizeof(LV_ITEM));
- listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
- listItem.pszText = (LPTSTR)szDisplayName;
- listItem.lParam = (LPARAM)hSubKey;
- listItem.iItem = (int)ItemIndex;
- listItem.iImage = index;
- iIndex = ListView_InsertItem(hAppList, &listItem);
- ListView_SetItemText(hAppList, iIndex, 1, LastUsed);
- ListView_SetItemText(hAppList, iIndex, 2, AppSize);
-}
-
-/*
- ShowMode:
- if ShowMode = 0 - programs and updates
- if ShowMode = 1 - show programs only
- if ShowMode = 2 - show updates only
-*/
-static VOID
-FillSoftwareList(INT ShowMode)
-{
- WCHAR pszName[MAX_PATH];
- WCHAR pszDisplayName[MAX_PATH];
- WCHAR pszParentKeyName[MAX_PATH];
- FILETIME FileTime;
- HKEY hKey;
- HKEY hSubKey;
- DWORD dwType;
- DWORD dwSize = MAX_PATH;
- DWORD dwValue = 0;
- BOOL bIsUpdate = FALSE;
- BOOL bIsSystemComponent = FALSE;
- INT ItemIndex = 0;
- DEVMODE pDevMode;
- int ColorDepth;
-
- (VOID) ImageList_Destroy(hImageAppList);
- (VOID) ListView_DeleteAllItems(hAppList);
-
- pDevMode.dmSize = sizeof(DEVMODE);
- pDevMode.dmDriverExtra = 0;
- EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &pDevMode);
- switch (pDevMode.dmBitsPerPel)
- {
- case 32: ColorDepth = ILC_COLOR32; break;
- case 24: ColorDepth = ILC_COLOR24; break;
- case 16: ColorDepth = ILC_COLOR16; break;
- case 8: ColorDepth = ILC_COLOR8; break;
- case 4: ColorDepth = ILC_COLOR4; break;
- default: ColorDepth = ILC_COLOR; break;
- }
-
- hImageAppList = ImageList_Create(16, 16, ColorDepth | ILC_MASK, 0, 1);
- SendMessage(hAppList, WM_SETREDRAW, FALSE, 0);
-
- if (RegOpenKey(HKEY_LOCAL_MACHINE,
- L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
- &hKey) != ERROR_SUCCESS)
- {
- WCHAR Buf[256];
-
- LoadString(hApplet, IDS_UNABLEOPEN_UNINSTKEY, Buf, sizeof(Buf) / sizeof(WCHAR));
- MessageBox(hMainWnd, Buf, NULL, MB_ICONWARNING);
- return;
- }
-
- ItemIndex = 0;
- dwSize = MAX_PATH;
- while (RegEnumKeyEx(hKey, ItemIndex, pszName, &dwSize, NULL, NULL, NULL, &FileTime) == ERROR_SUCCESS)
- {
- if (RegOpenKey(hKey,pszName,&hSubKey) == ERROR_SUCCESS)
- {
- dwType = REG_DWORD;
- dwSize = sizeof(DWORD);
- if (RegQueryValueEx(hSubKey, L"SystemComponent",
- NULL, &dwType,
- (LPBYTE)&dwValue, &dwSize) == ERROR_SUCCESS)
- {
- bIsSystemComponent = (dwValue == 0x1);
- }
- else
- {
- bIsSystemComponent = FALSE;
- }
-
- dwType = REG_SZ;
- dwSize = MAX_PATH;
- bIsUpdate = (RegQueryValueEx(hSubKey, L"ParentKeyName",
- NULL, &dwType,
- (LPBYTE)pszParentKeyName,
- &dwSize) == ERROR_SUCCESS);
- dwSize = MAX_PATH;
- if (RegQueryValueEx(hSubKey, L"DisplayName",
- NULL, &dwType,
- (LPBYTE)pszDisplayName,
- &dwSize) == ERROR_SUCCESS)
- {
- if ((ShowMode < 0)||(ShowMode > 2)) ShowMode = 0;
- if (!bIsSystemComponent)
- {
- if (ShowMode == 0)
- {
- AddItemToList((LPARAM)hSubKey, (LPWSTR)pszDisplayName, ItemIndex, pszName);
- }
- if ((ShowMode == 1)&&(!bIsUpdate))
- {
- AddItemToList((LPARAM)hSubKey, (LPWSTR)pszDisplayName, ItemIndex, pszName);
- }
- if ((ShowMode == 2)&&(bIsUpdate))
- {
- AddItemToList((LPARAM)hSubKey, (LPWSTR)pszDisplayName, ItemIndex, pszName);
- }
- }
- }
- }
-
- dwSize = MAX_PATH;
- ItemIndex++;
- }
-
- (VOID) ListView_SetImageList(hAppList, hImageAppList, LVSIL_SMALL);
- SendMessage(hAppList, WM_SETREDRAW, TRUE, 0);
- RegCloseKey(hSubKey);
- RegCloseKey(hKey);
-}
-
-static BOOL
-GetAppString(LPCWSTR lpKeyName, LPWSTR lpString)
-{
- HKEY hKey;
- INT nIndex;
- DWORD dwSize;
- DWORD dwType = REG_SZ;
-
- nIndex = (INT)SendMessage(hAppList,LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
- if (nIndex != -1)
- {
- LVITEM item;
-
- ZeroMemory(&item, sizeof(LVITEM));
- item.mask = LVIF_PARAM;
- item.iItem = nIndex;
- (VOID) ListView_GetItem(hAppList,&item);
- hKey = (HKEY)item.lParam;
-
- if (RegQueryValueEx(hKey, lpKeyName, NULL, &dwType,
- (LPBYTE)lpString, &dwSize) == ERROR_SUCCESS)
- {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static VOID
-CallUninstall(VOID)
-{
- INT nIndex;
- HKEY hKey;
- DWORD dwType, dwRet;
- WCHAR pszUninstallString[MAX_PATH];
- DWORD dwSize;
- MSG msg;
-
- nIndex = (INT)SendMessage(hAppList,LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
- if (nIndex != -1)
- {
- LVITEM item;
-
- ZeroMemory(&item, sizeof(LVITEM));
- item.mask = LVIF_PARAM;
- item.iItem = nIndex;
- (VOID) ListView_GetItem(hAppList,&item);
- hKey = (HKEY)item.lParam;
-
- dwType = REG_SZ;
- dwSize = MAX_PATH;
- if (RegQueryValueEx(hKey, L"UninstallString", NULL, &dwType,
- (LPBYTE)pszUninstallString, &dwSize) == ERROR_SUCCESS)
- {
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
-
- ZeroMemory(&si, sizeof(si));
- si.cb = sizeof(si);
- si.wShowWindow = SW_SHOW;
- if (CreateProcess(NULL,pszUninstallString,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
- {
- CloseHandle(pi.hThread);
- EnableWindow(hMainWnd, FALSE);
-
- for (;;)
- {
- dwRet = MsgWaitForMultipleObjects(1, &pi.hProcess, FALSE, INFINITE, QS_ALLEVENTS);
- if (dwRet == WAIT_OBJECT_0 + 1)
- {
- while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- else if (dwRet == WAIT_OBJECT_0 || dwRet == WAIT_FAILED)
- break;
- }
- CloseHandle(pi.hProcess);
-
- EnableWindow(hMainWnd, TRUE);
- // Disable all buttons
- EnableWindow(hRemoveBtn,FALSE);
- EnableWindow(hModifyBtn,FALSE);
- // Update software list
- FillSoftwareList(0);
- SetActiveWindow(hMainWnd);
- }
- }
- else
- {
- WCHAR szBuf[256];
-
- LoadString(hApplet, IDS_UNABLEREAD_UNINSTSTR, szBuf, sizeof(szBuf) / sizeof(WCHAR));
- MessageBox(hMainWnd, szBuf, NULL, MB_ICONWARNING);
- }
- }
-}
-
-static VOID
-ShowPopupMenu(HWND hwndDlg, INT xPos, INT yPos)
-{
- INT nIndex;
- nIndex = (INT)SendMessage(hAppList,LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
- if ( nIndex != -1)
- {
- POINT pt;
- RECT lvRect;
- HMENU hMenu;
-
- GetCursorPos(&pt);
-
- GetWindowRect(hAppList, &lvRect);
- if (PtInRect(&lvRect, pt))
- {
- hMenu = GetSubMenu(LoadMenu(hApplet, MAKEINTRESOURCE(IDR_POPUP_APP)),0);
- TrackPopupMenuEx(hMenu, TPM_RIGHTBUTTON, xPos, yPos, hwndDlg, NULL);
- DestroyMenu(hMenu);
- }
- }
-}
-
-static VOID
-GetAppInfo(LPWSTR lpInfo)
-{
- WCHAR szBuf[1024], szDesc[1024];
- INT iIndex;
- HKEY hKey;
-
- iIndex = SendMessage(hAppList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
- if (iIndex != -1)
- {
- LVITEM item;
- DWORD dwSize = 2048;
-
- ZeroMemory(&item, sizeof(LVITEM));
- item.mask = LVIF_PARAM;
- item.iItem = iIndex;
- (VOID) ListView_GetItem(hAppList,&item);
- hKey = (HKEY)item.lParam;
-
- wcscpy(lpInfo,L"\0");
- if (RegQueryValueEx(hKey, L"Publisher", NULL, NULL, (LPBYTE)szBuf, &dwSize) == ERROR_SUCCESS)
- {
- LoadString(hApplet, IDS_INF_PUBLISHER, szDesc, sizeof(szDesc) / sizeof(WCHAR));
- //wcscat(lpInfo, szDesc);
- swprintf(lpInfo, L"%s%s\n", szDesc, szBuf);
- }
- if (RegQueryValueEx(hKey, L"RegOwner", NULL, NULL, (LPBYTE)szBuf, &dwSize) == ERROR_SUCCESS)
- {
- LoadString(hApplet, IDS_INF_REG_OWNER, szDesc, sizeof(szDesc) / sizeof(WCHAR));
- wcscat(lpInfo, szDesc);
- swprintf(lpInfo,L"%s%s\n", lpInfo, szBuf);
- }
- if (RegQueryValueEx(hKey, L"ProductID", NULL, NULL, (LPBYTE)szBuf, &dwSize) == ERROR_SUCCESS)
- {
- LoadString(hApplet, IDS_INF_PRODUCT_ID, szDesc, sizeof(szDesc) / sizeof(WCHAR));
- wcscat(lpInfo, szDesc);
- swprintf(lpInfo,L"%s%s\n", lpInfo, szBuf);
- }
- if (RegQueryValueEx(hKey, L"DisplayVersion", NULL, NULL, (LPBYTE)szBuf, &dwSize) == ERROR_SUCCESS)
- {
- LoadString(hApplet, IDS_INF_VERSION, szDesc, sizeof(szDesc) / sizeof(WCHAR));
- wcscat(lpInfo, szDesc);
- swprintf(lpInfo,L"%s%s\n", lpInfo, szBuf);
- }
- if (RegQueryValueEx(hKey, L"Contact", NULL, NULL, (LPBYTE)szBuf, &dwSize) == ERROR_SUCCESS)
- {
- LoadString(hApplet, IDS_INF_CONTACT, szDesc, sizeof(szDesc) / sizeof(WCHAR));
- wcscat(lpInfo, szDesc);
- swprintf(lpInfo,L"%s%s\n", lpInfo, szBuf);
- }
- if (RegQueryValueEx(hKey, L"HelpLink", NULL, NULL, (LPBYTE)szBuf, &dwSize) == ERROR_SUCCESS)
- {
- LoadString(hApplet, IDS_INF_SUP_INFO, szDesc, sizeof(szDesc) / sizeof(WCHAR));
- wcscat(lpInfo, szDesc);
- swprintf(lpInfo,L"%s%s\n", lpInfo, szBuf);
- }
- if (RegQueryValueEx(hKey, L"HelpTelephone", NULL, NULL, (LPBYTE)szBuf, &dwSize) == ERROR_SUCCESS)
- {
- LoadString(hApplet, IDS_INF_SUP_PHONE, szDesc, sizeof(szDesc) / sizeof(WCHAR));
- wcscat(lpInfo, szDesc);
- swprintf(lpInfo,L"%s%s\n", lpInfo, szBuf);
- }
- if (RegQueryValueEx(hKey, L"URLUpdateInfo", NULL, NULL, (LPBYTE)szBuf, &dwSize) == ERROR_SUCCESS)
- {
- LoadString(hApplet, IDS_INF_PRODUCT_UPD, szDesc, sizeof(szDesc) / sizeof(WCHAR));
- wcscat(lpInfo, szDesc);
- swprintf(lpInfo,L"%s%s\n", lpInfo, szBuf);
- }
- if (RegQueryValueEx(hKey, L"Readme", NULL, NULL, (LPBYTE)szBuf, &dwSize) == ERROR_SUCCESS)
- {
- LoadString(hApplet, IDS_INF_README, szDesc, sizeof(szDesc) / sizeof(WCHAR));
- wcscat(lpInfo, szDesc);
- swprintf(lpInfo,L"%s%s\n", lpInfo, szBuf);
- }
- if (RegQueryValueEx(hKey, L"Comments", NULL, NULL, (LPBYTE)szBuf, &dwSize) == ERROR_SUCCESS)
- {
- LoadString(hApplet, IDS_INF_COMMENTS, szDesc, sizeof(szDesc) / sizeof(WCHAR));
- wcscat(lpInfo, szDesc);
- swprintf(lpInfo,L"%s%s\n", lpInfo, szBuf);
- }
- if (wcslen(lpInfo) < 10)
- {
- LoadString(hApplet, IDS_NO_INFORMATION, szDesc, sizeof(szDesc) / sizeof(WCHAR));
- wcscpy(lpInfo, szDesc);
- }
- }
-}
-
-static VOID
-ShowAppInfo(VOID)
-{
- WCHAR Info[2048], szBuf[1024];
-
- if (-1 != (INT) SendMessage(hAppList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED))
- {
- GetAppInfo(Info);
- ListView_GetItemText(hAppList, SendMessage(hAppList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED), 0, szBuf, sizeof(szBuf));
- ShowMessage(szBuf, Info);
- }
-}
-
-static VOID
-GetListItemText(LPARAM lParam1, LPARAM lParam2, INT iSubItem, LPWSTR Item1, LPWSTR Item2)
-{
- LVFINDINFO find;
- INT iIndex;
-
- find.flags = LVFI_PARAM;
-
- find.lParam = lParam1;
- iIndex = ListView_FindItem(hAppList, -1, &find);
- ListView_GetItemText(hAppList, iIndex, iSubItem, Item1, sizeof(Item1));
-
- find.lParam = lParam2;
- iIndex = ListView_FindItem(hAppList, -1, &find);
- ListView_GetItemText(hAppList, iIndex, iSubItem, Item2, sizeof(Item2));
-}
-
-static INT CALLBACK
-CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
-{
- WCHAR szItem1[MAX_PATH], szItem2[MAX_PATH];
-
- switch ((INT)lParamSort)
- {
- case 0: // Name
- {
- GetListItemText(lParam1, lParam2, 0, szItem1, szItem2);
- if (bAscending == TRUE)
- return wcscmp(szItem2, szItem1);
- else
- return wcscmp(szItem1, szItem2);
- }
- case 1: // Date
- GetListItemText(lParam1, lParam2, 1, szItem1, szItem2);
- if (bAscending == TRUE)
- return wcscmp(szItem2, szItem1);
- else
- return wcscmp(szItem1, szItem2);
- case 2: // Size
- {
- // FIXME: No correct sorting by application size
- INT Size1, Size2;
-
- GetListItemText(lParam1, lParam2, 2, szItem1, szItem2);
- if (wcscmp(szItem1, L"---") == 0) wcscpy(szItem1, L"0");
- if (wcscmp(szItem2, L"---") == 0) wcscpy(szItem2, L"0");
- Size1 = _wtoi(szItem1);
- Size2 = _wtoi(szItem2);
- if (Size1 < Size2)
- {
- return (bAscending ? -1 : 1);
- }
- else if (Size1 == Size2)
- {
- return 0;
- }
- else if (Size1 > Size2)
- {
- return (bAscending ? 1 : -1);
- }
- }
- }
-
- return 0;
-}
-
-static BOOL
-LoadSettings(VOID)
-{
- HKEY hKey;
- DWORD dwSize;
- BOOL Ret;
-
- if (RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\ReactOS\\AppWiz", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
- {
- dwSize = sizeof(APPWIZSETTINGS);
- if (RegQueryValueEx(hKey, L"Settings", NULL, NULL, (LPBYTE)&AppWizSettings, &dwSize) == ERROR_SUCCESS)
- {
- Ret = (AppWizSettings.Size == sizeof(APPWIZSETTINGS));
- }
- else Ret = FALSE;
- }
- else Ret = FALSE;
-
- RegCloseKey(hKey);
- return Ret;
-}
-
-static BOOL
-SaveSettings(VOID)
-{
- HKEY hKey;
- BOOL Ret;
-
- if (RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\ReactOS\\AppWiz", 0, NULL,
- REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
- {
- AppWizSettings.Size = sizeof(APPWIZSETTINGS);
- Ret = (RegSetValueEx(hKey, L"Settings", 0, REG_BINARY, (LPBYTE)&AppWizSettings, sizeof(APPWIZSETTINGS)) == ERROR_SUCCESS);
- }
- else Ret = FALSE;
-
- RegCloseKey(hKey);
- return Ret;
-}
-
-static void UpdateBitmap(HWND hWnd, RECT WndRect, RECT DescriptionRect)
-{
- HDC hdc = GetDC(hWnd);
-
- if (!BackbufferHdc)
- BackbufferHdc = CreateCompatibleDC(hdc);
-
- if (BackbufferBmp)
- DeleteObject(BackbufferBmp);
-
- BackbufferBmp = CreateCompatibleBitmap(hdc, WndRect.right, WndRect.bottom);
-
- SelectObject(BackbufferHdc, BackbufferBmp);
- FillRect(BackbufferHdc, &WndRect, (HBRUSH)COLOR_APPWORKSPACE);
- DrawIconEx(BackbufferHdc, 153, 1, hSearchIcon, 24, 24, 0, NULL, DI_NORMAL|DI_COMPAT);
- DrawDescription(BackbufferHdc, DescriptionRect);
-
- ReleaseDC(hWnd, hdc);
-}
-
-static LRESULT CALLBACK
-WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
-{
- static RECT DescriptionRect;
- static RECT AppRect;
- WCHAR szBuf[1024];
-
- switch (Message)
- {
- case WM_CREATE:
- {
- hMainWnd = hwnd;
- MoveWindow(hMainWnd, AppWizSettings.Left, AppWizSettings.Top,
- AppWizSettings.Right - AppWizSettings.Left,
- AppWizSettings.Bottom - AppWizSettings.Top, TRUE);
- if (AppWizSettings.Maximized) ShowWindow(hMainWnd, SW_MAXIMIZE);
- ShowMessage(Strings[0],Strings[1]); // Welcome message
- InitControls();
- }
- break;
- case WM_COMMAND:
- {
- switch (LOWORD(wParam))
- {
- case ID_APP_REMOVE:
- CallUninstall();
- break;
- }
- if(HIWORD(wParam) == BN_CLICKED)
- {
- if (lParam == (LPARAM)hRemoveBtn)
- {
- CallUninstall();
- }
- }
- if (lParam == (LPARAM)hSearch)
- {
- switch (HIWORD(wParam))
- {
- case EN_SETFOCUS:
- {
- WCHAR Tmp[1024];
-
- LoadString(hApplet, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR));
- GetWindowText(hSearch, Tmp, 1024);
- if (wcscmp(szBuf, Tmp) == 0) SetWindowText(hSearch, L"");
- }
- break;
- case EN_KILLFOCUS:
- {
- GetWindowText(hSearch, szBuf, 1024);
- if (wcslen(szBuf) < 1)
- {
- LoadString(hApplet, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR));
- SetWindowText(hSearch, szBuf);
- }
- }
- break;
- case EN_CHANGE:
- break;
- }
- }
- }
- break;
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- HDC hdc = BeginPaint(hwnd, &ps);
- BitBlt(hdc, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom, BackbufferHdc, 0, 0, SRCCOPY);
- EndPaint(hwnd, &ps);
- }
- break;
- case WM_NOTIFY:
- {
- LPNMHDR data = (LPNMHDR)lParam;
-
- switch (data->code)
- {
- case TVN_SELCHANGED:
- if(data->hwndFrom == hActList)
- {
- // Add items to programs list
- FillSoftwareList(((LPNMTREEVIEW)lParam)->itemNew.lParam);
- // Set default titile and message
- ShowMessage(Strings[0], Strings[1]);
- // Disable all buttons
- EnableWindow(hRemoveBtn, FALSE);
- EnableWindow(hModifyBtn, FALSE);
- }
- break;
- case NM_CLICK:
- if(data->hwndFrom == hAppList)
- {
- if (-1 != (INT) SendMessage(hAppList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED))
- {
- EnableWindow(hRemoveBtn, TRUE);
- if (GetAppString(L"ModifyPath", NULL))
- EnableWindow(hModifyBtn, TRUE);
- }
- ShowAppInfo();
- UpdateBitmap(hwnd, AppRect, DescriptionRect);
- InvalidateRect(hwnd, &DescriptionRect, FALSE);
- }
- break;
- case NM_DBLCLK:
- if(data->hwndFrom == hAppList)
- {
- if (-1 != (INT) SendMessage(hAppList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED))
- {
- CallUninstall();
- }
- }
- break;
- case LVN_COLUMNCLICK:
- {
- LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
- (VOID) ListView_SortItems(hAppList, CompareFunc, pnmv->iSubItem);
- bAscending = !bAscending;
- }
- break;
- }
- }
- break;
- case WM_SIZING:
- {
- LPRECT pRect = (LPRECT)lParam;
- if (pRect->right-pRect->left < 520)
- pRect->right = pRect->left + 520;
-
- if (pRect->bottom-pRect->top < 400)
- pRect->bottom = pRect->top + 400;
- }
- break;
- case WM_SIZE:
- {
- RECT Rect = {1, HIWORD(lParam)-178, LOWORD(lParam)-1, HIWORD(lParam)-1};
- SetRect(&AppRect, 0, 0, LOWORD(lParam)-1, HIWORD(lParam)-1);
- DescriptionRect = Rect;
-
- // Actions list
- ResizeControl(hActList, 0, 1, 150, HIWORD(lParam)-180);
-
- // Applications list
- ResizeControl(hAppList, 152, 25, LOWORD(lParam), HIWORD(lParam)-180);
-
- // Search Edit
- ResizeControl(hSearch, 180, 1, LOWORD(lParam), 25);
-
- // Buttons
- MoveWindow(hRemoveBtn, LOWORD(lParam)-105, HIWORD(lParam)-30, 100, 25, TRUE); // Remove button
- MoveWindow(hModifyBtn, LOWORD(lParam)-208, HIWORD(lParam)-30, 100, 25, TRUE); // Modify button
-
- (VOID) ListView_SetColumnWidth(hAppList, 0, LOWORD(lParam)-330);
-
- // Update title and info
- ShowAppInfo();
- UpdateBitmap(hwnd, AppRect, DescriptionRect);
- InvalidateRect(hwnd, &DescriptionRect, FALSE);
- }
- break;
- case WM_ACTIVATEAPP:
- ShowAppInfo();
- break;
- case WM_CONTEXTMENU:
- {
- // Show popup menu for programs list
- ShowPopupMenu(hwnd, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
- }
- break;
- case WM_DESTROY:
- {
- WINDOWPLACEMENT wp;
-
- // Save settings
- ShowWindow(hMainWnd, SW_HIDE);
- wp.length = sizeof(WINDOWPLACEMENT);
- GetWindowPlacement(hMainWnd, &wp);
- AppWizSettings.Left = wp.rcNormalPosition.left;
- AppWizSettings.Top = wp.rcNormalPosition.top;
- AppWizSettings.Right = wp.rcNormalPosition.right;
- AppWizSettings.Bottom = wp.rcNormalPosition.bottom;
- AppWizSettings.Maximized = (IsZoomed(hMainWnd) || (wp.flags & WPF_RESTORETOMAXIMIZED));
- SaveSettings();
- // Destroy all and quit
- if (BackbufferHdc)
- DeleteDC(BackbufferHdc);
- if (BackbufferBmp)
- DeleteObject(BackbufferBmp);
- DeleteObject(hMainFont);
- DeleteObject(hSearchIcon);
- PostQuitMessage(0);
- }
- break;
- }
- return DefWindowProc(hwnd, Message, wParam, lParam);
-}
-
-static VOID
-InitSettings(VOID)
-{
- if (!LoadSettings())
- {
- AppWizSettings.Maximized = FALSE;
- AppWizSettings.Left = 0;
- AppWizSettings.Top = 0;
- AppWizSettings.Right = 520;
- AppWizSettings.Bottom = 400;
- }
-}
-
-static INT
-MainWindowCreate(VOID)
-{
- WNDCLASS WndClass = {0};
- MSG msg;
- WCHAR szBuf[256];
-
- // Load welcome strings
- LoadString(hApplet, IDS_WELCOME_TITLE, Strings[0], sizeof(szBuf) / sizeof(WCHAR));
- LoadString(hApplet, IDS_WELCOME_MSG, Strings[1], sizeof(szBuf) / sizeof(WCHAR));
-
- InitSettings();
-
- // Create the window
- WndClass.lpszClassName = L"rosappwiz";
- WndClass.lpfnWndProc = (WNDPROC)WndProc;
- WndClass.hInstance = hApplet;
- WndClass.style = CS_HREDRAW | CS_VREDRAW;
- WndClass.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
- WndClass.hCursor = LoadCursor(hApplet, IDC_ARROW);
- WndClass.hbrBackground = (HBRUSH)COLOR_BTNFACE + 1;
-
- if (!RegisterClass(&WndClass)) return 0;
-
- LoadString(hApplet, IDS_CPLSYSTEMNAME, szBuf, 256);
- hMainWnd = CreateWindow(L"rosappwiz", szBuf,
- WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE | WS_CAPTION,
- CW_USEDEFAULT, CW_USEDEFAULT,
- 0, 0, NULL, NULL, hApplet, NULL);
-
- // Show it
- ShowWindow(hMainWnd, SW_SHOW);
- UpdateWindow(hMainWnd);
-
- // Message Loop
- while(GetMessage(&msg,NULL,0,0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
-
- return 0;
-}
-
-/* Control Panel Callback */
-LONG CALLBACK
-CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
-{
- CPLINFO *CPlInfo;
- DWORD i;
-
- UNREFERENCED_PARAMETER(hwndCPl);
-
- i = (DWORD)lParam1;
- switch (uMsg)
- {
- case CPL_INIT:
- return TRUE;
-
- case CPL_GETCOUNT:
- return 1;
-
- case CPL_INQUIRE:
- CPlInfo = (CPLINFO*)lParam2;
- CPlInfo->lData = 0;
- CPlInfo->idIcon = IDI_CPLSYSTEM;
- CPlInfo->idName = IDS_CPLSYSTEMNAME;
- CPlInfo->idInfo = IDS_CPLSYSTEMDESCRIPTION;
- break;
-
- case CPL_DBLCLK:
- MainWindowCreate();
- break;
- }
-
- return FALSE;
-}
-
-
-BOOL WINAPI
-DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
-{
- UNREFERENCED_PARAMETER(lpvReserved);
-
- switch (dwReason)
- {
- case DLL_PROCESS_ATTACH:
- case DLL_THREAD_ATTACH:
- CoInitialize(NULL);
- hApplet = hinstDLL;
- break;
- }
-
- return TRUE;
-}
diff --git a/reactos/dll/cpl/appwiz-new/appwiz.h b/reactos/dll/cpl/appwiz-new/appwiz.h
deleted file mode 100644
index a66dc03f8f3..00000000000
--- a/reactos/dll/cpl/appwiz-new/appwiz.h
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef __CPL_APPWIZ_H
-#define __CPL_APPWIZ_H
-
-#define COBJMACROS
-#include
-#include /* GET_X/Y_LPARAM */
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "resource.h"
-
-typedef LONG (CALLBACK *CPLAPPLET_PROC)(VOID);
-
-typedef struct
-{
- int idIcon;
- int idName;
- int idDescription;
- CPLAPPLET_PROC AppletProc;
-} APPLET, *PAPPLET;
-
-typedef struct
-{
- WCHAR szTarget[MAX_PATH];
- WCHAR szWorkingDirectory[MAX_PATH];
- WCHAR szDescription[MAX_PATH];
- WCHAR szLinkName[MAX_PATH];
-} CREATE_LINK_CONTEXT, *PCREATE_LINK_CONTEXT;
-
-typedef struct
-{
- DWORD Size;
- DWORD Masks;
- ULONGLONG AppSize;
- FILETIME LastUsed;
- int TimesUsed;
- WCHAR ImagePath[MAX_PATH];
-} APPARPINFO;
-
-typedef struct
-{
- DWORD Size;
- BOOL Maximized;
- INT Left;
- INT Top;
- INT Right;
- INT Bottom;
-} APPWIZSETTINGS;
-
-/* appwiz.c */
-HINSTANCE hApplet; // Main applet instance
-HWND hMainWnd, // Main window
- hActList, // Actions list
- hAppList, // Programs list
- hSearch, //Search line
- hRemoveBtn, // Remove button
- hModifyBtn; // Modify button
-
-APPWIZSETTINGS AppWizSettings;
-
-void ShowLastWin32Error(HWND hWndOwner);
-
-#endif /* __CPL_APPWIZ_H */
-
-/* EOF */
diff --git a/reactos/dll/cpl/appwiz-new/appwiz.rbuild b/reactos/dll/cpl/appwiz-new/appwiz.rbuild
deleted file mode 100644
index ef470669f54..00000000000
--- a/reactos/dll/cpl/appwiz-new/appwiz.rbuild
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- .
- kernel32
- advapi32
- user32
- comctl32
- ole32
- uuid
- shell32
- msimg32
- gdi32
- appwiz.c
- createlink.c
- appwiz.rc
-
diff --git a/reactos/dll/cpl/appwiz-new/appwiz.rc b/reactos/dll/cpl/appwiz-new/appwiz.rc
deleted file mode 100644
index c00ff7046ef..00000000000
--- a/reactos/dll/cpl/appwiz-new/appwiz.rc
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "resource.h"
-#include
-
-LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
-
-#define REACTOS_VERSION_DLL
-#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Software Control Panel\0"
-#define REACTOS_STR_INTERNAL_NAME "appwiz\0"
-#define REACTOS_STR_ORIGINAL_FILENAME "appwiz.cpl\0"
-#ifdef _MSC_VER
-#include <../../../reactos/version.rc>
-#else
-#include
-#endif
-
-IDI_CPLSYSTEM ICON "resources/applet.ico"
-IDI_APPICO ICON "resources/1501.ico"
-IDI_INSTICO ICON "resources/1502.ico"
-IDI_RECBINICO ICON "resources/1503.ico"
-IDI_SEARCH ICON "resources/search.ico"
-
-IDB_WATERMARK BITMAP "resources/watermark.bmp"
-IDB_UNDERLINE BITMAP "resources/underline.bmp"
-IDB_SELECT BITMAP "resources/select.bmp"
-IDB_ICON BITMAP "resources/icon.bmp"
-
-#include "rsrc.rc"
diff --git a/reactos/dll/cpl/appwiz-new/appwiz.spec b/reactos/dll/cpl/appwiz-new/appwiz.spec
deleted file mode 100644
index cc66da371b1..00000000000
--- a/reactos/dll/cpl/appwiz-new/appwiz.spec
+++ /dev/null
@@ -1,4 +0,0 @@
-@ stdcall CPlApplet(ptr long ptr ptr)
-@ stdcall NewLinkHere(ptr long ptr ptr)
-@ stdcall NewLinkHereA(ptr long ptr ptr)
-@ stdcall NewLinkHereW(ptr long ptr ptr)
\ No newline at end of file
diff --git a/reactos/dll/cpl/appwiz-new/createlink.c b/reactos/dll/cpl/appwiz-new/createlink.c
deleted file mode 100644
index 9e5f5ee0427..00000000000
--- a/reactos/dll/cpl/appwiz-new/createlink.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *
- * PROJECT: ReactOS Software Control Panel
- * FILE: dll/cpl/appwiz/createlink.c
- * PURPOSE: ReactOS Software Control Panel
- * PROGRAMMER: Gero Kuehn (reactos.filter@gkware.com)
- * Dmitry Chapyshev (lentind@yandex.ru)
- * Johannes Anderwald
- * UPDATE HISTORY:
- * 06-17-2004 Created
- */
-
-#include "appwiz.h"
-
-LONG
-CALLBACK
-NewLinkHere(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
-{
- return -1;
-}
-
-LONG
-CALLBACK
-NewLinkHereA(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
-{
- return -1;
-}
-
-LONG
-CALLBACK
-NewLinkHereW(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
-{
- return -1;
-}
diff --git a/reactos/dll/cpl/appwiz-new/lang/bg-BG.rc b/reactos/dll/cpl/appwiz-new/lang/bg-BG.rc
deleted file mode 100644
index 9883213b9d3..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/bg-BG.rc
+++ /dev/null
@@ -1,199 +0,0 @@
-LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&", ID_APP_REMOVE
- MENUITEM "&", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "&...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT "& . , .", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " , , .", -1, 97, 7, 195, 28
- LTEXT "& :", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT " .", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&, :", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON " &...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "& :", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " .", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "& :", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "&:", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " .", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " , INI .", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " .", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT " .", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "& :", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "", IDOK, 118, 100, 60, 14
- PUSHBUTTON "", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION ""
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT " , .", -1, 37, 8, 214, 10
- LTEXT " , , .", -1, 37, 23, 212, 22
- LTEXT " , , .", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "& ", IDC_SWITCHUSER, 20, 81, 110, 14
- PUSHBUTTON "&", IDOK, 125, 81, 60, 14
- PUSHBUTTON "", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " /"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "& , .", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "&", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT " , . , , .", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON "& ", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON " & ", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME " "
- IDS_CPLSYSTEMDESCRIPTION " ."
- IDS_UNABLEOPEN_UNINSTKEY " "
- IDS_LIST_TITLE ""
- IDS_SIZE_TITLE " ()"
- IDS_LAST_USED " "
- IDS_PROGANDUPDATES " "
- IDS_PROGRAMS_ONLY " "
- IDS_UPDATES_ONLY " "
- IDS_WELCOME_TITLE " ."
- IDS_WELCOME_MSG " , ."
- IDS_SEARCH_TEXT " "
- IDS_REMOVE_BTN "&"
- IDS_MODIFY_BTN "&"
- IDS_UNABLEREAD_UNINSTSTR " . MSI ."
- IDS_INF_REG_OWNER " :"
- IDS_INF_PRODUCT_ID " :"
- IDS_INF_PUBLISHER ":"
- IDS_INF_VERSION ":"
- IDS_INF_CONTACT " :"
- IDS_INF_SUP_INFO " :"
- IDS_INF_SUP_PHONE " :"
- IDS_INF_PRODUCT_UPD " :"
- IDS_INF_README ":"
- IDS_INF_COMMENTS ":"
- IDS_NO_INFORMATION " ."
-END
diff --git a/reactos/dll/cpl/appwiz-new/lang/cs-CZ.rc b/reactos/dll/cpl/appwiz-new/lang/cs-CZ.rc
deleted file mode 100644
index 47db0fba254..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/cs-CZ.rc
+++ /dev/null
@@ -1,204 +0,0 @@
-/* FILE: dll/cpl/appwiz-new/lang/cs-CZ.rc
- * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com)
- * UPDATED: 2008-07-27
- */
-
-LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Odebrat", ID_APP_REMOVE
- MENUITEM "&Zmnit", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Sov instalace"
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "&Instalovat...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT "&Nsledujc software me bt automaticky nainstalovn systmem ReactOS. Program vybran v seznamu nainstalujete klepnutm na tlatko Instalovat.", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Vytvoit zstupce"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Tento prvodce pome s vytvoenm zstupc k mstnm i sovm programm, souborm, potam nebo internetovm adresm.", -1, 97, 7, 195, 28
- LTEXT "&Zadejte umstn poloky:", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "P&rochzet...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT "Pokraujte klepnutm na tlatko Dal.", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Vbr sloky"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Zvolte sloku, kam bude tento zstupce umstn:", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON "&Nov sloka...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Vbr popisku programu"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Zadejte nzev tohoto zstupce:", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Kliknutm na Dokonit se vytvo zstupce.", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Vbr ikony"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Zvolte ikonu pro tohoto zstupce:", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Nainstalovat program z diskety nebo CD-ROM"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Spustit instalan program"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "&Otevt:", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "P&rochzet...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Zmnit uivatelsk nastaven"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Tento program lze umonit kadmu uivateli.", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "Instalovat", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "Spustit", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Dokonit administrtorskou instalaci"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Kliknutm na Dokonit se zmn mapovn ini zpt.", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Po instalaci"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Prosm stisknte tlatko Dal.", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Spustit instalan program"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Prosm urete umstn odinstalanho programu.", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "&Pkazov dek pro odinstalan program:", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "P&rochzet...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "OK", IDOK, 118, 100, 60, 14
- PUSHBUTTON "Storno", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Varovn"
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT "K tomuto potai jsou pihlen dal uivatel.", -1, 37, 8, 214, 10
- LTEXT "Odinstalace programu, kter je sputn jinm uivatelem, nemus probhnout kompletn.", -1, 37, 23, 212, 22
- LTEXT "Pro plnou zmnu nebo odstrann programu se pepnte na ostatn uivatele a odhlate je.", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "&Pepnout uivatele", IDC_SWITCHUSER, 61, 81, 60, 14
- PUSHBUTTON "Po&kraovat", IDOK, 125, 81, 60, 14
- PUSHBUTTON "Storno", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Odebrat zstupce/sloky"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Pro odebrn vybran poloky ze Start menu klepnte na tlatko Odstranit.", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "&Odebrat", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "Zavt", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION "Pidat pozdji"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Lze zvolit datum a as, kdy m bt tento program pidn do tohoto potae. Napklad je mon nastavit pidn na dobu va neptomnosti u potae.", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON "&Pidat program pozdji", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON "&Nepidvat program", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "OK", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "Storno", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME "Pidat nebo odebrat programy"
- IDS_CPLSYSTEMDESCRIPTION "Nainstaluje nebo odebere programy a sousti systmu ReactOS."
- IDS_UNABLEOPEN_UNINSTKEY "Nelze otevt kl Uninstall"
- IDS_LIST_TITLE "Seznam"
- IDS_SIZE_TITLE "Velikost (MB)"
- IDS_LAST_USED "Naposledy pouito"
- IDS_PROGANDUPDATES "Programy & aktualizace"
- IDS_PROGRAMS_ONLY "Jen programy"
- IDS_UPDATES_ONLY "Jen aktualizace"
- IDS_WELCOME_TITLE "Vtejte v prvodci k Pidat nebo odebrat programy"
- IDS_WELCOME_MSG "Prosm zvolte kategorii vlevo i zvolte aplikaci v seznamu pro odebrn nebo zobrazen informac."
- IDS_SEARCH_TEXT "Hledat v seznamu..."
- IDS_REMOVE_BTN "&Odebrat"
- IDS_MODIFY_BTN "&Zmnit"
- IDS_UNABLEREAD_UNINSTSTR "Nelze nast. Tento zpis je neplatn nebo byl vytvoen MSI instaltorem."
- IDS_INF_REG_OWNER "Registrovan vlastnk: "
- IDS_INF_PRODUCT_ID "ID produktu: "
- IDS_INF_PUBLISHER "Vydavatel: "
- IDS_INF_VERSION "Verze: "
- IDS_INF_CONTACT "Kontakt: "
- IDS_INF_SUP_INFO "Informace o podpoe: "
- IDS_INF_SUP_PHONE "Telefon na podporu: "
- IDS_INF_PRODUCT_UPD "Aktualizace produktu: "
- IDS_INF_README "Readme: "
- IDS_INF_COMMENTS "Komente: "
- IDS_NO_INFORMATION "O tomto programu nejsou dn informace."
-END
diff --git a/reactos/dll/cpl/appwiz-new/lang/de-DE.rc b/reactos/dll/cpl/appwiz-new/lang/de-DE.rc
deleted file mode 100644
index a63c208804e..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/de-DE.rc
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * translated by EmuandCo - Daniel Reimer (Feb, 2008)
- * reimer.daniel@freenet.de
- */
-
-LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Entfernen", ID_APP_REMOVE
- MENUITEM "&ndern", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Netzwerkinstallation"
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "&Installieren...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT "&Die folgende Software kann von ReactOS automatisch installiert werden. Um ein Programm zu installieren, whlen Sie es aus der Liste und klicken Sie auf Installieren.", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Verknpfung erstellen"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Dieser Assistent wird Ihnen helfen, Verknpfungen zu lokalen oder Netzwerkprogrammen, Dateien, Ordnern, Computern, oder Internet Adressen zu erstellen.", -1, 97, 7, 195, 28
- LTEXT "&Geben Sie den Pfad zum Element ein:", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&Durchsuchen...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT "Klicken Sie auf Weiter, um fortzusetzen.", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Programmordner whlen"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Whlen Sie einen Zielordner fr die Verknpfung:", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON "Neuer &Ordner...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Whlen Sie einen Titel fr das Programm"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Geben Sie einen Namen fr die Verknpfung ein:", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Klicken Sie auf Fertig, um die Verknpfung zu erstellen.", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Whlen Sie ein Icon"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Whlen Sie ein Icon fr die Verknpfung:", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Installieren eines Programmes von Floppy Disk oder CD-ROM"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Installationsprogramm starten"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "&ffnen:", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&Durchsuchen...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Benutzeroptionen ndern"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Sie haben die Mglichkeit dieses Programm fr alle Benutzer zugnglich zu machen.", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "Installieren", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "Ausfhren", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Administrative Installation fertigstellen"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "INI Mapping wird durch klicken auf Fertig zurckgesetzt.", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Nach der Installation"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Bitte drcken Sie auf Weiter.", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Installationsprogramm starten"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Bitte legen Sie den Pfad zum Deinstallationsprogramm fest.", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "&Kommandozeile fr das Deinstallationsprogramm:", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&Durchsuchen...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "OK", IDOK, 118, 100, 60, 14
- PUSHBUTTON "Abbrechen", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Warnung"
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT "Es sind weitere Benutzer auf diesem Computer angemeldet.", -1, 37, 8, 214, 10
- LTEXT "Wenn Sie das Programm deinstallieren, whrend andere Benutzer es verwenden, wird es wahrscheinlich nicht vollstndig deinstalliert.", -1, 37, 23, 212, 22
- LTEXT "Um dieses Programm ordnungsgem zu entfernen, wechseln Sie zu jedem Benutzer und melden Sie jeden einzeln ab, bevor Sie fortsetzen.", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "&Benutzer wechseln", IDC_SWITCHUSER, 56, 81, 65, 14
- PUSHBUTTON "&Fortsetzen", IDOK, 125, 81, 60, 14
- PUSHBUTTON "Abbrechen", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Verknpfungen/Ordner lschen"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Um einen Eintrag aus dem Startmen zu entfernen, whlen Sie des Eintrag aus und klicken Sie auf lschen.", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "&Entfernen", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "Schlieen", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION "Spter hinzufgen"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Sie knnen ein Datum und eine Uhrzeit whlen, zu der Sie das Programm auf ihren Computer hinzufgen wollen. Zum Beispiel knnen Sie dies so planen, dass es startet, wenn Sie nicht an Ihrem Computer arbeiten.", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON "&Programm spter hinzufgen", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON "&Programm nicht hinzufgen", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "OK", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "Abbrechen", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME "Programme hinzufgen oder entfernen"
- IDS_CPLSYSTEMDESCRIPTION "Installieren oder entfernen Sie Programme und ReactOS Komponenten."
- IDS_UNABLEOPEN_UNINSTKEY "Konnte Deinstallationsschlssel nicht ffnen"
- IDS_LIST_TITLE "Liste"
- IDS_SIZE_TITLE "Gre (MB)"
- IDS_LAST_USED "Zuletzt genutzt"
- IDS_PROGANDUPDATES "Programme & Updates"
- IDS_PROGRAMS_ONLY "Nur Programme"
- IDS_UPDATES_ONLY "Nur Updates"
- IDS_WELCOME_TITLE "Willkommen im Assistent zum Programme hinzufgen oder entfernen"
- IDS_WELCOME_MSG "Bitte whlen Sie links eine Kategorie oder rechts eine Anwendung aus der Liste, um sie zu entfernen oder Informationen einzusehen."
- IDS_SEARCH_TEXT "Liste durchsuchen..."
- IDS_REMOVE_BTN "&Entfernen"
- IDS_MODIFY_BTN "&ndern"
- IDS_UNABLEREAD_UNINSTSTR "Konnte den UninstallString nicht lesen. Dieser Eintrag ist ungltig oder wurde von einem MSI Installer erstellt."
- IDS_INF_REG_OWNER "Registrierter Eigentmer: "
- IDS_INF_PRODUCT_ID "Produkt ID: "
- IDS_INF_PUBLISHER "Herausgeber: "
- IDS_INF_VERSION "Version: "
- IDS_INF_CONTACT "Kontakt: "
- IDS_INF_SUP_INFO "Support Informationen: "
- IDS_INF_SUP_PHONE "Support Telefon: "
- IDS_INF_PRODUCT_UPD "Produkt Updates: "
- IDS_INF_README "Liesmich: "
- IDS_INF_COMMENTS "Kommentare: "
- IDS_NO_INFORMATION "Keine Informationen ber dieses Programm."
-END
diff --git a/reactos/dll/cpl/appwiz-new/lang/en-US.rc b/reactos/dll/cpl/appwiz-new/lang/en-US.rc
deleted file mode 100644
index c4be0132a72..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/en-US.rc
+++ /dev/null
@@ -1,199 +0,0 @@
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Remove", ID_APP_REMOVE
- MENUITEM "&Modify", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Network Install"
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "&Install...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT "&The following software can be automatically installed by ReactOS. To install a program, select it from the list and click Install.", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Create Shortcut"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "This wizard helps you to create shortcuts to local or network programs, files, folders, computers, or Internet addresses.", -1, 97, 7, 195, 28
- LTEXT "&Type the location of the item:", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "B&rowse...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT "Click Next to continue.", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Select Program Folder"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Select a folder to place this shortcut in:", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON "New &Folder...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Select a Title for the Program"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Type a name for this shortcut:", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Click Finish to create the shortcut.", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Select an Icon"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Select an icon for the shortcut:", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Install Program From Floppy Disk or CD-ROM"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Run Installation Program"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "&Open:", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "B&rowse...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Change User Option"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "You have the option to make this new program available to every User.", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "Install", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "Execute", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Finish Admin Install"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Change ini mapping back by clicking Finish.", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "After Installation"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Please press Next.", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Run Installation Program"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Please specify the uninstall program location.", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "&Command line for the uninstall program:", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "B&rowse...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "OK", IDOK, 118, 100, 60, 14
- PUSHBUTTON "Cancel", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Warning"
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT "There are other users logged on to this computer.", -1, 37, 8, 214, 10
- LTEXT "If you uninstall this program while another user is running it, the program might not uninstall completely.", -1, 37, 23, 212, 22
- LTEXT "To properly change or remove this program, switch to and log off each user before you continue.", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "&Switch User", IDC_SWITCHUSER, 61, 81, 60, 14
- PUSHBUTTON "&Continue", IDOK, 125, 81, 60, 14
- PUSHBUTTON "Cancel", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Remove Shortcuts/Folders"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&To remove an item from the Start menu, select the item and click Remove.", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "&Remove", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "Close", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION "Add Later"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "You may choose a date and time when you would like to add this program to your computer. For example, you can schedule this to happen when you are away from your computer.", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON "&Add program later", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON "&Do not add program", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "OK", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "Cancel", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME "Add or Remove Programs"
- IDS_CPLSYSTEMDESCRIPTION "Install or remove programs and ReactOS components."
- IDS_UNABLEOPEN_UNINSTKEY "Unable to open Uninstall Key"
- IDS_LIST_TITLE "List"
- IDS_SIZE_TITLE "Size (MB)"
- IDS_LAST_USED "Last Used"
- IDS_PROGANDUPDATES "Programs & Updates"
- IDS_PROGRAMS_ONLY "Programs only"
- IDS_UPDATES_ONLY "Updates only"
- IDS_WELCOME_TITLE "Welcome to the Assistant to Add or Remove Programs"
- IDS_WELCOME_MSG "Please choose a category on the left or select application on the list for removing or viewing information."
- IDS_SEARCH_TEXT "Search in the list..."
- IDS_REMOVE_BTN "&Remove"
- IDS_MODIFY_BTN "&Modify"
- IDS_UNABLEREAD_UNINSTSTR "Unable to read UninstallString. This entry is invalid or has been created by an MSI installer."
- IDS_INF_REG_OWNER "Registered Owner: "
- IDS_INF_PRODUCT_ID "Product ID: "
- IDS_INF_PUBLISHER "Publisher: "
- IDS_INF_VERSION "Version: "
- IDS_INF_CONTACT "Contact: "
- IDS_INF_SUP_INFO "Support Information: "
- IDS_INF_SUP_PHONE "Support Telephone: "
- IDS_INF_PRODUCT_UPD "Product Updates: "
- IDS_INF_README "Readme: "
- IDS_INF_COMMENTS "Comments: "
- IDS_NO_INFORMATION "No information about this program."
-END
diff --git a/reactos/dll/cpl/appwiz-new/lang/es-ES.rc b/reactos/dll/cpl/appwiz-new/lang/es-ES.rc
deleted file mode 100644
index 13ce3cfeddd..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/es-ES.rc
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Traducido por: Javier Remacha (feb,2008)
- */
-
-LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Quitar", ID_APP_REMOVE
- MENUITEM "&Modificar", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Instalacin de red"
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "&Instalar...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT "&Los siguientes programas pueden ser instalados automticamente por ReactOS. Para instalar un programa, seleccionelo de la lista y presione Instalar.", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Crear Acceso directo"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Este asistente le ayudar a crear accesos directos a programas locales o en red, archivos, carpetas, computadoras, o direcciones de Internet..", -1, 97, 7, 195, 28
- LTEXT "&Escriba la ubicacin del elemento:", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "E&xaminar...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT "Haga clic en Siguiente para continuar.", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Buscar carpeta"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Seleccione el destino del acceso directo a continuacin:", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON "N&ueva carpeta...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Seleccionar un ttulo para el programa"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Escriba un nombre para este acceso directo:", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Haga clic en Finalizar para crear el acceso directo.", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Seleccionar un Icono"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Seleccione un icono para el acceso directo:", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Agregar Programas desde un disquete o CD-ROM"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Ejecutar programa de instalacin"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "&Abrir:", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "E&xplorar...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Cambiar opcin de usuario"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Tiene la opcin de hacer el nuevo programa disponible para todos los usuarios.", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "Instalar", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "Ejecutar", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Finalizar Instalacin Administrativa"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Restaurar mapa ini al presionar Finalizar.", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Finalizar Instalacin"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Presione Siguiente para continuar.", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Ejecutar programa de Instalacin"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "POr favor especifique la ruta del programa de desinstalacin.", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "Lnea de &Comandos para desinstalar el programa:", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "E&xplorar...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "Aceptar", IDOK, 118, 100, 60, 14
- PUSHBUTTON "Cancelar", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Advertencia"
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT "Hay otras sesiones abiertas en este equipo.", -1, 37, 8, 214, 10
- LTEXT "Si desintala este programa mientras otro usuario est ejecutandolo, el programa puede no desinstalarse completamente.", -1, 37, 23, 212, 22
- LTEXT "Para cambiar o quitar este programa correctamente, cambie de usuario y cierre la sesin antes de continuar.", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "C&ambiar de Usuario", IDC_SWITCHUSER, 61, 81, 60, 14
- PUSHBUTTON "&Continuar", IDOK, 125, 81, 60, 14
- PUSHBUTTON "Cancelar", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Quitar Accesos directos/Carpetas"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Para quitar un elemento del men de Inicio, seleccione el elemento y presione Quitar.", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "&Quitar", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "Cerrar", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION "Aadir ms tarde"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Puede elegir una fecha y hora cuando quiere aadir este programa en su equipo. Por ejemplo, puede programarlo para que ocurra cuando no est delante de su equipo.", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON "&Aadir programa ms tarde", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON "&No aadir programa", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "Aceptar", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "Cancelar", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME "Aadir o Quitar Programas"
- IDS_CPLSYSTEMDESCRIPTION "Instala o quita programas y componentes de ReactOS."
- IDS_UNABLEOPEN_UNINSTKEY "Incapaz de abrir la llave de desinstalacin"
- IDS_LIST_TITLE "Lista"
- IDS_SIZE_TITLE "Tamao (MB)"
- IDS_LAST_USED "ltimo uso"
- IDS_PROGANDUPDATES "Programas & Actualizaciones"
- IDS_PROGRAMS_ONLY "Slo programas"
- IDS_UPDATES_ONLY "Slo actualizaciones"
- IDS_WELCOME_TITLE "Bienvenido al Asistente para Aadir o Quitar Programas"
- IDS_WELCOME_MSG "Por favor, seleccione una categora de la izquierda o seleccione una aplicacin de la lista para quitarla o ver su informacin."
- IDS_SEARCH_TEXT "Buscar en la lista..."
- IDS_REMOVE_BTN "&Quitar"
- IDS_MODIFY_BTN "&Modificar"
- IDS_UNABLEREAD_UNINSTSTR "Imposible leer la cadena de desinstalacin. Esta entrada es incorrecta o ha sido creada por un instalador MSI."
- IDS_INF_REG_OWNER "Usuario Registrado: "
- IDS_INF_PRODUCT_ID "Producto ID: "
- IDS_INF_PUBLISHER "Autor: "
- IDS_INF_VERSION "Versin: "
- IDS_INF_CONTACT "Contacto: "
- IDS_INF_SUP_INFO "Informacin de Ayuda: "
- IDS_INF_SUP_PHONE "Telfono de Ayuda: "
- IDS_INF_PRODUCT_UPD "Actualizaciones de Producto: "
- IDS_INF_README "Leeme: "
- IDS_INF_COMMENTS "Comentarios: "
- IDS_NO_INFORMATION "Sin informacin acerca de este programa."
-END
diff --git a/reactos/dll/cpl/appwiz-new/lang/fr-FR.rc b/reactos/dll/cpl/appwiz-new/lang/fr-FR.rc
deleted file mode 100644
index 270b044f8ff..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/fr-FR.rc
+++ /dev/null
@@ -1,199 +0,0 @@
-LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Supprimer", ID_APP_REMOVE
- MENUITEM "&Modifier", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Installation rseau"
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "&Installer...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT "&Le logiciel suivant peut tre install automatiquement par ReactOS. Pour installer un programme, slectionnez le dans la liste et cliquez sur Installer.", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Crer un raccourci"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Cet assistant vous aide crer des raccourcis vers des programmes locaux ou en rseau, fichiers, rpertoires, ordinateurs, ou des adresses Internet.", -1, 97, 7, 195, 28
- LTEXT "&Indiquez l'emplacement de l'objet :", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "P&arcourir...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT "Cliquez sur Suivant pour continuer.", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Slectionnez le rpertoire du Programme"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Slectionnez le rpertoire o placer le raccourci :", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON "Nouveau &rpertoire...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Slectionnez le titre du Programme"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Entrez un nom pour le raccourci :", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Cliquez sur Terminer pour crer le raccourci.", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Slectionnez une Icne"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Slectionnez une Icne pour le raccourci :", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Installer le Programme depuis une Disquette ou un CD-ROM"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Lancer le Programme d'Installation"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "&Ouvrir :", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "P&arcourir...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Changer l'option utilisateur"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Vous avez l'option de rendre ce nouveau programme accessible tous.", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "Installer", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "Excuter", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Terminer l'Installation Admin"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Change ini mapping back by clicking Finish.", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Aprs l'Installation"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Veuillez appuyer sur suivant.", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Lancer le Programme d'Installation"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Veuillez spcifier l'emplacement du programme de dsinstallation", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "Ligne de commande pour le programme de dsinstallation :", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "P&arcourir...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "OK", IDOK, 118, 100, 60, 14
- PUSHBUTTON "Annuler", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Attention"
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT "Il y a d'autres utilisateurs loggus sur cet ordinateur.", -1, 37, 8, 214, 10
- LTEXT "Si vous dsinstallez ce programme alors qu'un autre utilisateur le fait tourner, le programme pourrait ne pas se dsinstaller compltement.", -1, 37, 23, 212, 22
- LTEXT "Pour modidier ou syupprimer correctement ce programme, changez d'utilisateur et dlogguez chaque utilisateur avant de continuer.", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "&Changer d'utilisateur", IDC_SWITCHUSER, 61, 81, 60, 14
- PUSHBUTTON "&Continuer", IDOK, 125, 81, 60, 14
- PUSHBUTTON "Annuler", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Supprimer des Raccourci/Rpertoires"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Pour supprimer un objet du menu Dmarrer, slectionnez l'objet et cliquez sur Supprimer.", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "&Supprimer", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "Fermer", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION "Ajouter plus tard"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Vous pouvez choisir une date et une heure laquelle vous voudriez ajouter ce programme votre ordinateur. Par exemple, vous pouvez le programmer quand vous absent de votre ordinateur.", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON "&Ajouter le programme plus tard ", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON "&Ne pas ajouter le programme", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "OK", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "Annuler", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME "Ajouter ou Supprimer des Programmes"
- IDS_CPLSYSTEMDESCRIPTION "Installer ou supprimer des programmes et des composants de ReactOS."
- IDS_UNABLEOPEN_UNINSTKEY "Impossible d'ouvrir la cl de Dsinstallation"
- IDS_LIST_TITLE "Liste"
- IDS_SIZE_TITLE "Taille (MO)"
- IDS_LAST_USED "Utilis en dernier"
- IDS_PROGANDUPDATES "Programmes & mises jour"
- IDS_PROGRAMS_ONLY "Programmes seulement"
- IDS_UPDATES_ONLY "Mises jour seulement"
- IDS_WELCOME_TITLE "Bienvenue Ajouter ou Supprimer des Programmes"
- IDS_WELCOME_MSG "Veuillez choisir une catgorie gauche ou slectionnez une application dans la liste pour la supprimer ou pour voir ses informations."
- IDS_SEARCH_TEXT "Chercher dans la liste..."
- IDS_REMOVE_BTN "&Supprimer"
- IDS_MODIFY_BTN "&Modifier"
- IDS_UNABLEREAD_UNINSTSTR "Impossibler de lire UninstallString. Cette entre est invalide ou a t cre par un installateur MSI."
- IDS_INF_REG_OWNER "Utilisateur Enregistr : "
- IDS_INF_PRODUCT_ID "ID du Produit : "
- IDS_INF_PUBLISHER "Editeur : "
- IDS_INF_VERSION "Version: "
- IDS_INF_CONTACT "Contact: "
- IDS_INF_SUP_INFO "Informations de support : "
- IDS_INF_SUP_PHONE "Tlphone du support : "
- IDS_INF_PRODUCT_UPD "Mises jour du Produit : "
- IDS_INF_README "Lisez-moi : "
- IDS_INF_COMMENTS "Commentaires : "
- IDS_NO_INFORMATION "Pas d'informations propos de ce programme."
-END
diff --git a/reactos/dll/cpl/appwiz-new/lang/it-IT.rc b/reactos/dll/cpl/appwiz-new/lang/it-IT.rc
deleted file mode 100644
index 4927df6af5c..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/it-IT.rc
+++ /dev/null
@@ -1,199 +0,0 @@
-LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Rimozione", ID_APP_REMOVE
- MENUITEM "&Modifica", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Installazione da rete"
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "&Installazione...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT "&Il software seguente pu essere installato automaticamente da ReactOS. Per installare un programma, selezionarlo nella lista e cliccare Installazione.", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Crea Collegamento"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Questo wizard aiuta a creare collegamenti a programmi, file, cartelle, o indirizzi internet.", -1, 97, 7, 195, 28
- LTEXT "&Digitare la posizione dell'elemento:", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&Sfoglia...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT "Premere avanti per continuare.", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Selezione della cartella"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Selezionare una cartella dove collocare il collegamento:", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON "&Nuova cartella...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Selezione del titolo del programma"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Digitare il nome di questo collegamento:", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Cliccare Fine per creare il collegamento.", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Selezione dell'icona"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Selezionare un icona per i collegamento:", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Installazione di un programma da floppy o CD-ROM"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Esecuzione del programma di installazione"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "&Apri:", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&Sfoglia...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Modifica delle opzioni utente"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Potete rendere disponibile questo programm a tutti gli utenti.", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "Installazione", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "Esecuzione", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Conclusione della installazione come amministratore"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Cliccando fine verranno ripristinate le mappature di ""ini.""", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Dopo l'installazione"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Premere avanti.", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Esecuzione del programma di installazione"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Indicare la posizione del programma di disinstallazione.", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "&Comando per il programma di disinstallazione:", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&Sfoglia...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "OK", IDOK, 118, 100, 60, 14
- PUSHBUTTON "Annulla", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Attenzione"
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT "Ci sono altri utenti attivi su questo computer.", -1, 37, 8, 214, 10
- LTEXT "Se questo programma viene disinstallato mentre un altro utente lo sta usando il programma potrebbe non essere rimosso in modo completo.", -1, 37, 23, 212, 22
- LTEXT "Per rimuovere correttamente questo programma chiudere le sessioni degli altri utenti prima di continuare.", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "&Cambia utente", IDC_SWITCHUSER, 61, 81, 60, 14
- PUSHBUTTON "&Continua", IDOK, 125, 81, 60, 14
- PUSHBUTTON "Annulla", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Rimozione di collegamenti e cartelle"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Per rimuovere un elemento dal menu di avvio selezionarlo e premere Rimuovi.", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "&Rimuovi", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "Chiudi", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION "Aggiungere dopo"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Potete scegliere data e ora in cui aggiungere il programma al computer. Per esempio potete schedulare che accada mentre siete lontano dal computer.", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON "&Aggiungere il programma dopo", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON "&Non aggiungere il programma", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "OK", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "Annulla", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME "Installazione applicazioni"
- IDS_CPLSYSTEMDESCRIPTION "Installazione di componenti di ReactOS o di applicazioni."
- IDS_UNABLEOPEN_UNINSTKEY "Impossibile aprire la chiave di disinstallazione"
- IDS_LIST_TITLE "Lista"
- IDS_SIZE_TITLE "Dimensione (MB)"
- IDS_LAST_USED "Ultimo usato"
- IDS_PROGANDUPDATES "Programmi e aggiornamenti"
- IDS_PROGRAMS_ONLY "Solo programmi"
- IDS_UPDATES_ONLY "Solo aggiornamenti"
- IDS_WELCOME_TITLE "Benvenuto all'assistente per la installazione o rimozione dei programmi"
- IDS_WELCOME_MSG "Scegliere una categoria a sinistra o scegliere una applicazione nella lista per la rimozione o visualizzazione delle informazioni."
- IDS_SEARCH_TEXT "Cerca nella lista..."
- IDS_REMOVE_BTN "&Rimuovi"
- IDS_MODIFY_BTN "&Modifica"
- IDS_UNABLEREAD_UNINSTSTR "Impossibile leggere UninstallString. L'elemento non valido o stato creato da un installatore MSI."
- IDS_INF_REG_OWNER "Proprietario registrato: "
- IDS_INF_PRODUCT_ID "ID del prodotto: "
- IDS_INF_PUBLISHER "Pubblicato da: "
- IDS_INF_VERSION "Versione: "
- IDS_INF_CONTACT "Contatti: "
- IDS_INF_SUP_INFO "Informazioni per il supporto: "
- IDS_INF_SUP_PHONE "Telefono per il supporto: "
- IDS_INF_PRODUCT_UPD "Aggiornamenti del prodotto: "
- IDS_INF_README "Leggimi: "
- IDS_INF_COMMENTS "Commenti: "
- IDS_NO_INFORMATION "Nessuna informazione su questo programma."
-END
diff --git a/reactos/dll/cpl/appwiz-new/lang/no-NO.rc b/reactos/dll/cpl/appwiz-new/lang/no-NO.rc
deleted file mode 100644
index b85a4fcb07f..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/no-NO.rc
+++ /dev/null
@@ -1,199 +0,0 @@
-LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Fjern", ID_APP_REMOVE
- MENUITEM "&Endre", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Nettverk installering"
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "&Installering...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT "&Flgende programvare kan bli automatisk installert av ReactOS. For installere et program, velg det fra listen og klikk installer.", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Opprett snarvei"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Denne veiviseren vil hjelpe deg med opprette en snarvei til lokale programmer eller nettverksprogrammer, filer, mapper, datamaskiner, eller internett addresser.", -1, 97, 7, 195, 28
- LTEXT "&Velg plasseringen for enheten:", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "B&la gjennom...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT "Klikk p neste for forsette.", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Velg Program mappe"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Velg en mappe for plassere denne snarveien i:", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON "Ny &mappe...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Velg en tittel for programmet"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Velg et navn for denne snarveien:", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Klikk fullfrt for opprette snarveien.", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Velg en ikon"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Velg en ikon for snarveien:", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Innstaller program fra diskett eller CD-stasjon"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Kjr innstallasjon programmet"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "&pne:", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "B&la gjennom...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Endre bruker valg"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Du har valget for gjre dette nye programmet tilgjengelig for alle brukere.", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "Installere", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "Kjr", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Fullfre admin installasjon"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Endre ini mapper tilbake ved trykke p Fullfrt.", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Etter Installasjon"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Vennligst trykk p neste.", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Kjr installasjons program"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Vennligst velg avinnstalleringsprogram plassering.", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "&Komando linje for avinnstalleringsprogrammet:", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "B&la gjennom...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "OK", IDOK, 118, 100, 60, 14
- PUSHBUTTON "Avbryt", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Advarsel"
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT "Det er andre brukere som er logget p denne datamaskinen.", -1, 37, 8, 214, 10
- LTEXT "Hvis du vil avinstallere dette programmet mens en annen bruker det, vil ikke programmet bli fjernet fullstendig.", -1, 37, 23, 212, 22
- LTEXT "For fullstendig endre eller fjerne dette programmet, bytt til og logg av alle brukere fr du fortsetter.", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "&Bytt bruker", IDC_SWITCHUSER, 61, 81, 60, 14
- PUSHBUTTON "&Fortsett", IDOK, 125, 81, 60, 14
- PUSHBUTTON "Avbryt", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Fjern snarveier/mapper"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&For fjerne en enhet fra Start menyen, velg en enhet og trykk p Fjern.", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "&Fjern", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "Lukk", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION "Legg til senere"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Du kan ha valgt en dato og tid nr du vil legge til dette programmet til din datamaskin. For eksempel, kan du planlegge det som skal skje nr du er borte din datamaskin.", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON "&Legg til et program senere", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON "&Ikke legg til programmer", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "OK", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "Avbryt", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME "Legg til eller fjern programmer"
- IDS_CPLSYSTEMDESCRIPTION "Innstaller eller fjern programmer og ReactOS komponenter."
- IDS_UNABLEOPEN_UNINSTKEY "Ikke mulig pne avinnstallering nkkel"
- IDS_LIST_TITLE "Liste"
- IDS_SIZE_TITLE "Strrelse (MB)"
- IDS_LAST_USED "Sist bruk"
- IDS_PROGANDUPDATES "Programmer & oppdateringer"
- IDS_PROGRAMS_ONLY "Bare programmer"
- IDS_UPDATES_ONLY "Bare oppdateringer"
- IDS_WELCOME_TITLE "Velkommen til assistenten for legg til eller fjerne programmer"
- IDS_WELCOME_MSG "Venligst velg en kategori til venstre eller velg et program p listen for fjerne eller vise informasjon."
- IDS_SEARCH_TEXT "Sk i listen..."
- IDS_REMOVE_BTN "&Fjern"
- IDS_MODIFY_BTN "&Endre"
- IDS_UNABLEREAD_UNINSTSTR "Ikke mulig lese Avinnstallerings streng. Denne enheten er ugyldig eller har blitt opprettet av en MSI installering."
- IDS_INF_REG_OWNER "Registerert eier: "
- IDS_INF_PRODUCT_ID "Produkt ID: "
- IDS_INF_PUBLISHER "Utgiver: "
- IDS_INF_VERSION "Versjon: "
- IDS_INF_CONTACT "Kontakt: "
- IDS_INF_SUP_INFO "Hjelp informasjon: "
- IDS_INF_SUP_PHONE "Hjelp telefon: "
- IDS_INF_PRODUCT_UPD "Produkt oppdateringer: "
- IDS_INF_README "Les meg: "
- IDS_INF_COMMENTS "Kommentarer: "
- IDS_NO_INFORMATION "Ingen informasjon om dette programmet."
-END
diff --git a/reactos/dll/cpl/appwiz-new/lang/pl-PL.rc b/reactos/dll/cpl/appwiz-new/lang/pl-PL.rc
deleted file mode 100644
index 9b0f7db240b..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/pl-PL.rc
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * translated by Caemyr - Olaf Siejka (Feb, 2008)
- * Use ReactOS forum PM or IRC to contact me
- * http://www.reactos.org
- * IRC: irc.freenode.net #reactos-pl;
- */
-
-LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
-
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Usu", ID_APP_REMOVE
- MENUITEM "&Zmie", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Instalacja sieciowa"
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "&Instaluj...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT "&ReactOS moe zainstalowa nastpujce oprogramowanie automagicznie. Aby zainstalowa dany program, wybierz go na licie i nacinij Instaluj.", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Utwrz skrt"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Ta aplikacja pomoe ci utworzy skrt do programw, plikw, katalogw - zarwno lokalnych jak i sieciowych, a take komputerw czy adresw internetowych.", -1, 97, 7, 195, 28
- LTEXT "&Podaj lokalizacj:", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "P&rzegldaj...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT "Nacinij Dalej aby kontynuowa.", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Wybierz katalog"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Wybierz katalog, w ktrym ma by umieszczony skrt:", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON "Nowy &Katalog...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Wybierz nazw"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Wpisz nazw dla skrtu:", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Nacinij Zakocz by utworzy skrt.", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Wybierz ikon"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Wybierz ikon dla skrtu:", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Instaluj Program Z Dyskietki lub CD-ROMu"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Uruchom Program Instalacyjny"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "&Otwrz:", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "P&rzegldaj...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Zmie opcje uytkownika"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Moesz udostpni ten nowy program dla wszystkich uytkownikw.", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "Instaluj", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "Wykonaj", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Zakoczenie Instalacji W Trybie Administratora"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Zmie mapowani ini klikajc w Zakocz.", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Po Instalacji"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "Prosz nacisn Dalej.", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Uruchom Program Instalacyjny"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Prosz wskaza lokalizacj programu dezinstalacyjnego.", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "&Linia polecenia dla programu dezinstalacyjnego:", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "P&rzegldaj...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "OK", IDOK, 118, 100, 60, 14
- PUSHBUTTON "Anuluj", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Ostrzeenie"
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT "W tej chwili s zalogowani inni uytkownicy na tym komputerze.", -1, 37, 8, 214, 10
- LTEXT "Jeli odinstalujesz ten program, podczas gdy inni uytkownicy bd z niego korzysta, dezinstalacja moe nie by kompletna.", -1, 37, 23, 212, 22
- LTEXT "Aby poprawnie zmieni bd usun program, upewnij si, e wszyscy uytkownicy s wylogowani.", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "&Zmie uytkownika", IDC_SWITCHUSER, 61, 81, 60, 14
- PUSHBUTTON "&Kontynuuj", IDOK, 125, 81, 60, 14
- PUSHBUTTON "Anuluj", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Usu Skrty/Katalogi"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "&Aby usun element z menu Start, wybierz go na licie i nacinij usu.", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "&Usu", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "Zamknij", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION "Dodaj pniej"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Moesz wybra dat i czas, kiedy dokadnie chcesz zainstalowa dany program. Moesz, na przykad ustawi by stao si to gdy nie bdziesz na nim pracowa.", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON "&Dodaj program pniej ", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON "&Nie dodawaj pogramu", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "OK", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "Anuluj", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME "Dodaj lub Usu Programy"
- IDS_CPLSYSTEMDESCRIPTION "Zainstaluj lub Usu programy i komponenty ReactOSa."
- IDS_UNABLEOPEN_UNINSTKEY "Otwarcie klucza dezinstalacji nieudane"
- IDS_LIST_TITLE "Lista"
- IDS_SIZE_TITLE "Rozmiar (MB)"
- IDS_LAST_USED "Ostatnio uyty"
- IDS_PROGANDUPDATES "Programy i uaktualnienia"
- IDS_PROGRAMS_ONLY "Tylko programy"
- IDS_UPDATES_ONLY "Tylko uaktualnienia"
- IDS_WELCOME_TITLE "Witamy w Dodaj lub Usu Programy"
- IDS_WELCOME_MSG "Prosz wybra kategori po lewej albo program z listy by go usun lub obejrze informacje o nim."
- IDS_SEARCH_TEXT "Wyszukaj na licie..."
- IDS_REMOVE_BTN "&Usu"
- IDS_MODIFY_BTN "&Zmie"
- IDS_UNABLEREAD_UNINSTSTR "Nie mona odczyta UninstallString. Ta pozycja jest nieprawidowa albo zostaa utworzona za pomoc instalatora MSI."
- IDS_INF_REG_OWNER "Zarejestrowany Waciciel: "
- IDS_INF_PRODUCT_ID "ID Produktu: "
- IDS_INF_PUBLISHER "Wydawca: "
- IDS_INF_VERSION "Wersja: "
- IDS_INF_CONTACT "Kontakt: "
- IDS_INF_SUP_INFO "Informacje o wsparciu: "
- IDS_INF_SUP_PHONE "Telefon do wsparcia: "
- IDS_INF_PRODUCT_UPD "Uaktualnienia: "
- IDS_INF_README "CzytajTo: "
- IDS_INF_COMMENTS "Komentarze: "
- IDS_NO_INFORMATION "Brak informacji o programie."
-END
diff --git a/reactos/dll/cpl/appwiz-new/lang/ru-RU.rc b/reactos/dll/cpl/appwiz-new/lang/ru-RU.rc
deleted file mode 100644
index d1df7ba16c5..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/ru-RU.rc
+++ /dev/null
@@ -1,199 +0,0 @@
-LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&", ID_APP_REMOVE
- MENUITEM "&", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "&...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT "& . """".", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " , , , , .", -1, 97, 7, 195, 28
- LTEXT "& :", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT " """".", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "& , :", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON "& ...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "& :", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " , """".", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "& :", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " -"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "&:", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " .", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " """" INI-.", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " """".", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT " ", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "& :", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "OK", IDOK, 118, 100, 60, 14
- PUSHBUTTON "", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION ""
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT " , .", -1, 37, 8, 214, 10
- LTEXT " , , .", -1, 37, 23, 212, 22
- LTEXT " , .", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "& ", IDC_SWITCHUSER, 29, 81, 92, 14
- PUSHBUTTON "&", IDOK, 125, 81, 60, 14
- PUSHBUTTON "", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "& """".", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "&", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT " . , , .", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON "& ", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON "& ", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "OK", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME " "
- IDS_CPLSYSTEMDESCRIPTION " ReactOS."
- IDS_UNABLEOPEN_UNINSTKEY " Uninstall"
- IDS_LIST_TITLE ""
- IDS_SIZE_TITLE " ()"
- IDS_LAST_USED " "
- IDS_PROGANDUPDATES " "
- IDS_PROGRAMS_ONLY " "
- IDS_UPDATES_ONLY " "
- IDS_WELCOME_TITLE " !"
- IDS_WELCOME_MSG ", ."
- IDS_SEARCH_TEXT " ..."
- IDS_REMOVE_BTN "&"
- IDS_MODIFY_BTN "&"
- IDS_UNABLEREAD_UNINSTSTR " UninstallString. MSI-."
- IDS_INF_REG_OWNER " : "
- IDS_INF_PRODUCT_ID " : "
- IDS_INF_PUBLISHER ": "
- IDS_INF_VERSION ": "
- IDS_INF_CONTACT " : "
- IDS_INF_SUP_INFO " : "
- IDS_INF_SUP_PHONE " : "
- IDS_INF_PRODUCT_UPD " : "
- IDS_INF_README " ""Readme"": "
- IDS_INF_COMMENTS ": "
- IDS_NO_INFORMATION " ."
-END
diff --git a/reactos/dll/cpl/appwiz-new/lang/uk-UA.rc b/reactos/dll/cpl/appwiz-new/lang/uk-UA.rc
deleted file mode 100644
index 7a7d26e9fb6..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/uk-UA.rc
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * PROJECT: ReactOS Software Control Panel Applet
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: dll/cpl/appwiz-new/lang/uk-UA.rc
- * PURPOSE: Ukraianian Language File for appwiz
- * PROGRAMMERS: Artem Reznikov
- */
-
-LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&", ID_APP_REMOVE
- MENUITEM "&", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "&...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT " & . , """".", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " , , , , ' .", -1, 97, 7, 195, 28
- LTEXT "& ':", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT " , """".", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "& , :", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON "& ...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "& ' :", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " , """".", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "& :", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " -"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "&³:", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " .", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " """" INI-.", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "ϳ "
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT " """".", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT " .", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "& :", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "&...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "OK", IDOK, 118, 100, 60, 14
- PUSHBUTTON "", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION ""
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT " ' .", -1, 37, 8, 214, 10
- LTEXT " , , .", -1, 37, 23, 212, 22
- LTEXT " , .", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "& ", IDC_SWITCHUSER, 61, 81, 60, 14
- PUSHBUTTON "&", IDOK, 125, 81, 60, 14
- PUSHBUTTON "", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "& """", """".", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "&", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION "³ "
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT " '. , , , '.", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON " & ", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON "& ", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "OK", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME " "
- IDS_CPLSYSTEMDESCRIPTION " ReactOS."
- IDS_UNABLEOPEN_UNINSTKEY " Uninstall"
- IDS_LIST_TITLE ""
- IDS_SIZE_TITLE " ()"
- IDS_LAST_USED " "
- IDS_PROGANDUPDATES " "
- IDS_PROGRAMS_ONLY "ҳ "
- IDS_UPDATES_ONLY "ҳ "
- IDS_WELCOME_TITLE " "
- IDS_WELCOME_MSG " ."
- IDS_SEARCH_TEXT " ..."
- IDS_REMOVE_BTN "&"
- IDS_MODIFY_BTN "&"
- IDS_UNABLEREAD_UNINSTSTR " UninstallString. MSI-."
- IDS_INF_REG_OWNER " : "
- IDS_INF_PRODUCT_ID " : "
- IDS_INF_PUBLISHER ": "
- IDS_INF_VERSION ": "
- IDS_INF_CONTACT ": "
- IDS_INF_SUP_INFO "³ : "
- IDS_INF_SUP_PHONE " : "
- IDS_INF_PRODUCT_UPD " : "
- IDS_INF_README " ""Readme"": "
- IDS_INF_COMMENTS ": "
- IDS_NO_INFORMATION " ."
-END
diff --git a/reactos/dll/cpl/appwiz-new/lang/zh-CN.rc b/reactos/dll/cpl/appwiz-new/lang/zh-CN.rc
deleted file mode 100644
index d97b28fd375..00000000000
--- a/reactos/dll/cpl/appwiz-new/lang/zh-CN.rc
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Simplified Chinese resource for appwiz-new (dll/cpl/appwiz-new/lang/zh-CN.rc)
- *
- * TRANSLATOR: Jingjing Fu (jingjingf AT 188.com)
- * CREATED: 2009-04-25
- */
-
-LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
-
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "ɾ(&R)", ID_APP_REMOVE
- MENUITEM "(&M)", ID_APP_MODIFY, GRAYED
- END
-END
-
-IDD_NETINSTALL DIALOGEX 0, 0, 242, 221
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "簲װ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- PUSHBUTTON "װ(&I)...", IDC_INSTALL, 150, 171, 85, 14
- LTEXT "ReactOSԶװҪװijбѡóȻװť(&T)", IDC_NETTEXT, 40, 6, 195, 32
- LISTBOX IDC_NETPROGLIST, 7, 42, 228, 125, LBS_STANDARD | WS_TABSTOP
- ICON IDI_APPICO, IDC_NETICON, 9, 10, 20, 20
-END
-
-IDD_CREATESHORTCUT DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "½ݷʽ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "ػļĿ¼InternetַĿݷʽ", -1, 97, 7, 195, 28
- LTEXT "Ŀλ(&T)", IDC_LOCATIONITEM, 98, 46, 196, 8
- EDITTEXT IDC_LOCITEMEDIT, 97, 58, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "(&R)...", IDC_LOCBROWSE, 233, 58, 60, 14
- LTEXT "һ", -1, 97, 95, 198, 8
-END
-
-IDD_SELPROGFOLDER DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "ѡļ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "ѡŸÿݷʽļ(&S):", -1, 100, 7, 193, 10
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000028, 100, 19, 193, 90
- PUSHBUTTON "½ļ(&F)...", IDC_NEWFOLDERBTN, 218, 116, 75, 14
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_SELPROGTITLE DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "ѡ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "ÿݷʽ(&T):", -1, 100, 10, 194, 10
- EDITTEXT IDC_NAMESCEDIT, 100, 23, 194, 14, ES_AUTOHSCROLL
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "ɡݷʽ", -1, 100, 61, 194, 8
-END
-
-IDD_SELPROGICON DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "ѡͼ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "ѡݷʽͼ(&S):", -1, 100, 8, 195, 10
- LISTBOX IDC_SELICONLIST, 100, 20, 192, 130, LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
-END
-
-IDD_INSTFROMCD DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "̻̰װ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 7, 193, 28
- ICON 0, IDC_INSTFROMCDICON, 100, 60, 18, 20
- LTEXT "", IDC_INSTFROMCDTEXT, 123, 66, 146, 8
-END
-
-IDD_RUNINSTPROG DIALOGEX 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "аװ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "", IDC_HEADTEXT, 101, 6, 195, 28
- LTEXT "(&O)", IDC_LOCATIONITEM, 100, 53, 195, 8
- EDITTEXT IDC_LOCITEMEDIT, 98, 64, 133, 14, ES_AUTOHSCROLL
- PUSHBUTTON "(&R)...", IDC_LOCBROWSE, 234, 64, 60, 14
-END
-
-IDD_CHANGEUSEROPT DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "ûѡ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "ѡǷ˶ʹøó", 1012, 101, 5, 194, 40
- AUTORADIOBUTTON "Install", IDC_INSTALLRB, 108, 51, 146, 14, BS_MULTILINE | WS_GROUP
- AUTORADIOBUTTON "Execute", IDC_LOCATIONITEM, 108, 74, 146, 14, BS_MULTILINE | NOT WS_TABSTOP
-END
-
-IDD_FINISHADMINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Աװ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "ɡ ini ӳ", IDC_HEADTEXT, 98, 7, 196, 40
-END
-
-IDD_AFTERINST DIALOG 0, 0, SHORTCUTDLG_WIDTH, SHORTCUTDLG_HEIGHT
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "װ֮"
-FONT 8, "MS Shell Dlg"
-BEGIN
- CONTROL "", IDB_WATERMARK, "STATIC", SS_BITMAP | SS_REALSIZEIMAGE, 0, 0, WATERMARK_WIDTH, SHORTCUTDLG_HEIGHT
- LTEXT "밴һ", IDC_HEADTEXT, 98, 7, 197, 40
-END
-
-IDD_RUNINSTPROG2 DIALOG 0, 0, 250, 120
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "аװ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "ָжسλ", IDC_UNINSTLOCTEXT, 9, 8, 235, 37
- LTEXT "жس(&C):", IDC_LOCATIONITEM, 9, 57, 237, 8
- EDITTEXT IDC_LOCITEMEDIT, 7, 69, 165, 14, ES_AUTOHSCROLL
- PUSHBUTTON "(&R)...", IDC_LOCBROWSE, 178, 69, 66, 14
- DEFPUSHBUTTON "ȷ", IDOK, 118, 100, 60, 14
- PUSHBUTTON "ȡ", IDCANCEL, 184, 100, 60, 14
-END
-
-IDD_WARNING DIALOG 20, 20, 255, 100
-STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION ""
-FONT 8, "MS Shell Dlg"
-BEGIN
- ICON "", IDC_WARNINGICON, 8, 10, 20, 20
- LTEXT "û¼˼", -1, 37, 8, 214, 10
- LTEXT "ûд˳ʱж˳ܲȫжء", -1, 37, 23, 212, 22
- LTEXT "ҪȷظĻɾ˳ڼǰлעÿû", IDC_WARNINGTEXT, 37, 46, 212, 26
- PUSHBUTTON "лû(&S)", IDC_SWITCHUSER, 61, 81, 60, 14
- PUSHBUTTON "(&C)", IDOK, 125, 81, 60, 14
- PUSHBUTTON "ȡ", IDCANCEL, 189, 81, 60, 14
-END
-
-IDD_REMSHORTCUTS DIALOGEX 20, 20, 220, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "ɾݷʽ/ļ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "Ҫɾʼ˵еĿѡĿȻɾť(&T)", IDC_UNINSTLOCTEXT, 10, 7, 204, 16
- CONTROL "", IDC_SELFOLDER, "SYSTREEVIEW32", WS_BORDER | WS_TABSTOP | 0x00000023, 10, 28, 200, 145
- PUSHBUTTON "ɾ(&R)", IDC_REMOVEBTN, 84, 182, 60, 14
- DEFPUSHBUTTON "ر", IDOK, 151, 182, 60, 14
-END
-
-IDD_ADDLATER DIALOGEX 0, 0, 220, 160
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTERMOUSE | WS_POPUPWINDOW | WS_CAPTION
-CAPTION "Ժ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT "ѡ뽫óӵϵںʱ䡣磬뿪ʱִиò", IDC_UNINSTLOCTEXT, 7, 4, 208, 33
- AUTORADIOBUTTON "Ժӳ (&A)", IDC_ADDPROGLATER, 7, 47, 207, 10, WS_GROUP
- CONTROL "Picker", 12368, "SYSDATETIMEPICK32", WS_BORDER | WS_TABSTOP | 0x0000000C, 29, 62, 107, 14
- AUTORADIOBUTTON "ӳ(&D)", IDC_NOTADDPROG, 7, 87, 208, 10
- DEFPUSHBUTTON "ȷ", IDOK, 89, 141, 60, 14, WS_GROUP
- PUSHBUTTON "ȡ", IDCANCEL, 154, 141, 60, 14, NOT WS_TABSTOP
-END
-
-STRINGTABLE
-BEGIN
- IDS_CPLSYSTEMNAME "ӻɾ"
- IDS_CPLSYSTEMDESCRIPTION "װɾReactOS"
- IDS_UNABLEOPEN_UNINSTKEY "жؼ"
- IDS_LIST_TITLE "б"
- IDS_SIZE_TITLE "С (MB)"
- IDS_LAST_USED "ʹ"
- IDS_PROGANDUPDATES ""
- IDS_PROGRAMS_ONLY ""
- IDS_UPDATES_ONLY ""
- IDS_WELCOME_TITLE "ӭʹɾ"
- IDS_WELCOME_MSG "ѡбѡҪɾ鿴Ϣij"
- IDS_SEARCH_TEXT "бв..."
- IDS_REMOVE_BTN "ɾ(&R)"
- IDS_MODIFY_BTN "(&M)"
- IDS_UNABLEREAD_UNINSTSTR "ȡжַĿЧMSI Installer"
- IDS_INF_REG_OWNER "עˣ"
- IDS_INF_PRODUCT_ID "ƷID"
- IDS_INF_PUBLISHER "̣"
- IDS_INF_VERSION "汾"
- IDS_INF_CONTACT "ϵˣ"
- IDS_INF_SUP_INFO "֧Ϣ"
- IDS_INF_SUP_PHONE "ֵ֧绰"
- IDS_INF_PRODUCT_UPD "Ʒ£"
- IDS_INF_README "ļ"
- IDS_INF_COMMENTS "ע"
- IDS_NO_INFORMATION "ڴ˳Ϣ"
-END
diff --git a/reactos/dll/cpl/appwiz-new/resource.h b/reactos/dll/cpl/appwiz-new/resource.h
deleted file mode 100644
index a68362315ae..00000000000
--- a/reactos/dll/cpl/appwiz-new/resource.h
+++ /dev/null
@@ -1,99 +0,0 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
-
-/* dialog sizes */
-#define SHORTCUTDLG_WIDTH 300
-#define SHORTCUTDLG_HEIGHT 160
-#define WATERMARK_WIDTH 90
-
-/* menus */
-#define IDR_POPUP_APP 14000
-
-/* menu items */
-#define ID_APP_REMOVE 14100
-#define ID_APP_MODIFY 14101
-
-/* icons */
-#define IDI_CPLSYSTEM 1500
-#define IDI_APPICO 1501
-#define IDI_INSTICO 1502
-#define IDI_RECBINICO 1503
-#define IDI_SEARCH 1504
-
-/* dialogs */
-#define IDD_NETINSTALL 100
-#define IDD_CREATESHORTCUT 200
-#define IDD_SELPROGFOLDER 201
-#define IDD_SELPROGTITLE 202
-#define IDD_SELPROGICON 203
-#define IDD_INSTFROMCD 300
-#define IDD_RUNINSTPROG 301
-#define IDD_CHANGEUSEROPT 302
-#define IDD_FINISHADMINST 304
-#define IDD_AFTERINST 305
-#define IDD_RUNINSTPROG2 306
-#define IDD_WARNING 307
-#define IDD_REMSHORTCUTS 400
-#define IDD_ADDLATER 12544
-
-/* bitmaps */
-#define IDB_WATERMARK 1019
-#define IDB_UNDERLINE 10000
-#define IDB_ICON 10001
-#define IDB_SELECT 10002
-
-/* strings */
-#define IDS_CPLSYSTEMNAME 2001
-#define IDS_CPLSYSTEMDESCRIPTION 2002
-#define IDS_UNABLEOPEN_UNINSTKEY 15000
-#define IDS_LIST_TITLE 15001
-#define IDS_SIZE_TITLE 15002
-#define IDS_LAST_USED 15003
-#define IDS_PROGANDUPDATES 15004
-#define IDS_PROGRAMS_ONLY 15005
-#define IDS_UPDATES_ONLY 15006
-#define IDS_WELCOME_TITLE 15007
-#define IDS_WELCOME_MSG 15008
-#define IDS_SEARCH_TEXT 15009
-#define IDS_REMOVE_BTN 15010
-#define IDS_MODIFY_BTN 15011
-#define IDS_UNABLEREAD_UNINSTSTR 15012
-#define IDS_INF_REG_OWNER 15013
-#define IDS_INF_PRODUCT_ID 15014
-#define IDS_INF_PUBLISHER 15015
-#define IDS_INF_VERSION 15016
-#define IDS_INF_CONTACT 15017
-#define IDS_INF_SUP_INFO 15018
-#define IDS_INF_SUP_PHONE 15019
-#define IDS_INF_PRODUCT_UPD 15020
-#define IDS_INF_README 15021
-#define IDS_INF_COMMENTS 15022
-#define IDS_NO_INFORMATION 15023
-
-/* controls */
-#define IDC_INSTALL 1000
-#define IDC_INSTALLRB 1001
-#define IDC_LOCATIONITEM 1002
-#define IDC_LOCITEMEDIT 1003
-#define IDC_LOCBROWSE 1004
-#define IDC_INSTFROMCDTEXT 1005
-#define IDC_INSTFROMCDICON 1006
-#define IDC_NETPROGLIST 1011
-#define IDC_HEADTEXT 1012
-#define IDC_WARNINGICON 1013
-#define IDC_SWITCHUSER 1014
-#define IDC_WARNINGTEXT 1017
-#define IDC_NAMESCEDIT 1020
-#define IDC_SELICONLIST 1021
-#define IDC_SELFOLDER 1022
-#define IDC_NEWFOLDERBTN 1027
-#define IDC_REMOVEBTN 1030
-#define IDC_UNINSTLOCTEXT 1031
-#define IDC_NETTEXT 1050
-#define IDC_NETICON 1051
-#define IDC_ADDPROGLATER 12369
-#define IDC_NOTADDPROG 12370
-
-#endif /* __CPL_RESOURCE_H */
-
-/* EOF */
diff --git a/reactos/dll/cpl/appwiz-new/resources/1501.ico b/reactos/dll/cpl/appwiz-new/resources/1501.ico
deleted file mode 100644
index 1d264f42012..00000000000
Binary files a/reactos/dll/cpl/appwiz-new/resources/1501.ico and /dev/null differ
diff --git a/reactos/dll/cpl/appwiz-new/resources/1502.ico b/reactos/dll/cpl/appwiz-new/resources/1502.ico
deleted file mode 100644
index a0ef055933d..00000000000
Binary files a/reactos/dll/cpl/appwiz-new/resources/1502.ico and /dev/null differ
diff --git a/reactos/dll/cpl/appwiz-new/resources/1503.ico b/reactos/dll/cpl/appwiz-new/resources/1503.ico
deleted file mode 100644
index abedc0dcf62..00000000000
Binary files a/reactos/dll/cpl/appwiz-new/resources/1503.ico and /dev/null differ
diff --git a/reactos/dll/cpl/appwiz-new/resources/applet.ico b/reactos/dll/cpl/appwiz-new/resources/applet.ico
deleted file mode 100644
index 530f089eeb6..00000000000
Binary files a/reactos/dll/cpl/appwiz-new/resources/applet.ico and /dev/null differ
diff --git a/reactos/dll/cpl/appwiz-new/resources/icon.bmp b/reactos/dll/cpl/appwiz-new/resources/icon.bmp
deleted file mode 100644
index b0346d6904e..00000000000
Binary files a/reactos/dll/cpl/appwiz-new/resources/icon.bmp and /dev/null differ
diff --git a/reactos/dll/cpl/appwiz-new/resources/search.ico b/reactos/dll/cpl/appwiz-new/resources/search.ico
deleted file mode 100644
index 07cf1b22443..00000000000
Binary files a/reactos/dll/cpl/appwiz-new/resources/search.ico and /dev/null differ
diff --git a/reactos/dll/cpl/appwiz-new/resources/select.bmp b/reactos/dll/cpl/appwiz-new/resources/select.bmp
deleted file mode 100644
index e31ccefe737..00000000000
Binary files a/reactos/dll/cpl/appwiz-new/resources/select.bmp and /dev/null differ
diff --git a/reactos/dll/cpl/appwiz-new/resources/underline.bmp b/reactos/dll/cpl/appwiz-new/resources/underline.bmp
deleted file mode 100644
index 012d13a4f64..00000000000
Binary files a/reactos/dll/cpl/appwiz-new/resources/underline.bmp and /dev/null differ
diff --git a/reactos/dll/cpl/appwiz-new/resources/watermark.bmp b/reactos/dll/cpl/appwiz-new/resources/watermark.bmp
deleted file mode 100644
index e2cd36d824c..00000000000
Binary files a/reactos/dll/cpl/appwiz-new/resources/watermark.bmp and /dev/null differ
diff --git a/reactos/dll/cpl/appwiz/add.c b/reactos/dll/cpl/appwiz/add.c
deleted file mode 100644
index 33bdd89e016..00000000000
--- a/reactos/dll/cpl/appwiz/add.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * ReactOS
- * Copyright (C) 2004 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-/*
- *
- * PROJECT: ReactOS Software Control Panel
- * FILE: dll/cpl/appwiz/add.c
- * PURPOSE: ReactOS Software Control Panel
- * PROGRAMMERS: Gero Kuehn (reactos.filter@gkware.com)
- * Dmitry Chapyshev (lentind@yandex.ru)
- * UPDATE HISTORY:
- * 06-17-2004 Created
- * 09-25-2007 Modify
- */
-
-#include "appwiz.h"
-
-BOOL
-CheckDownload(VOID)
-{
- TCHAR Buf[MAX_PATH];
- if(!GetSystemDirectory(Buf,MAX_PATH)) return FALSE;
- lstrcat((LPTSTR)Buf, L"\\downloader.exe");
- if (GetFileAttributes(Buf) != 0xFFFFFFFF) return TRUE;
- return FALSE;
-}
-
-BOOL
-LaunchDownload(HWND hwndDlg)
-{
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
- TCHAR Buf[MAX_PATH];
-
- ZeroMemory(&si, sizeof(si));
- si.cb = sizeof(si);
- ZeroMemory(&pi, sizeof(pi));
-
- if(!GetSystemDirectory(Buf,MAX_PATH)) return FALSE;
- lstrcat((LPTSTR)Buf, L"\\downloader.exe");
-
- if(CreateProcess(NULL,Buf,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
- {
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- return TRUE;
- }
- return FALSE;
-}
-
-/* Property page dialog callback */
-INT_PTR CALLBACK
-AddPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- UNREFERENCED_PARAMETER(lParam);
- UNREFERENCED_PARAMETER(wParam);
- UNREFERENCED_PARAMETER(hwndDlg);
-
- switch (uMsg)
- {
- case WM_INITDIALOG:
- EnableWindow(GetDlgItem(hwndDlg, IDC_INSTALL), FALSE);
- if (CheckDownload()) EnableWindow(GetDlgItem(hwndDlg, IDC_ADD_DOWNLOAD_BUTTON), TRUE);
- break;
- case WM_COMMAND:
- switch (LOWORD(wParam))
- {
- case IDC_ADD_DOWNLOAD_BUTTON:
- LaunchDownload(hwndDlg);
- break;
- }
- break;
- }
-
- return FALSE;
-}
diff --git a/reactos/dll/cpl/appwiz/appwiz.c b/reactos/dll/cpl/appwiz/appwiz.c
index 63cee16055d..6c816945f7b 100644
--- a/reactos/dll/cpl/appwiz/appwiz.c
+++ b/reactos/dll/cpl/appwiz/appwiz.c
@@ -1,127 +1,50 @@
/*
- * ReactOS
- * Copyright (C) 2004 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-/* $Id$
- *
- * PROJECT: ReactOS Software Control Panel
- * FILE: dll/cpl/appwiz/appwiz.c
- * PURPOSE: ReactOS Software Control Panel
- * PROGRAMMERS: Gero Kuehn (reactos.filter@gkware.com)
- * Dmitry Chapyshev (lentind@yandex.ru)
- * UPDATE HISTORY:
- * 06-17-2004 Created
- * 09-25-2007 Modify
+ * PROJECT: ReactOS Software Control Panel
+ * FILE: dll/cpl/appwiz/appwiz.c
+ * PURPOSE: ReactOS Software Control Panel
+ * PROGRAMMERS: Gero Kuehn (reactos.filter@gkware.com)
+ * Dmitry Chapyshev (dmitry@reactos.org)
*/
#include "appwiz.h"
-#define NUM_APPLETS (1)
-
-LONG CALLBACK SystemApplet(VOID);
-INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-INT_PTR CALLBACK ComputerPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-HINSTANCE hApplet = 0;
-HWND hCPLWindow;
-
-/* Applets */
-
-APPLET Applets[NUM_APPLETS] =
-{
- {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}
-};
-
-static VOID
-InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
-{
- ZeroMemory(psp, sizeof(PROPSHEETPAGE));
- psp->dwSize = sizeof(PROPSHEETPAGE);
- psp->dwFlags = PSP_DEFAULT;
- psp->hInstance = hApplet;
- psp->pszTemplate = MAKEINTRESOURCE(idDlg);
- psp->pfnDlgProc = DlgProc;
-}
-
-
-/* First Applet */
-LONG CALLBACK
-SystemApplet(VOID)
-{
- PROPSHEETPAGE psp[4];
- PROPSHEETHEADER psh;
- TCHAR Caption[1024];
-
- LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
-
- ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
- psh.dwSize = sizeof(PROPSHEETHEADER);
- psh.dwFlags = PSH_PROPSHEETPAGE;
- psh.hwndParent = hCPLWindow;
- psh.hInstance = hApplet;
- psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
- psh.pszCaption = Caption;
- psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
- psh.nStartPage = 0;
- psh.ppsp = psp;
- psh.pfnCallback = NULL;
-
- InitPropSheetPage(&psp[0], IDD_PROPPAGEINSTALL, (DLGPROC) RemovePageProc);
- InitPropSheetPage(&psp[1], IDD_PROPPAGEUPDATES, (DLGPROC) UpdatesPageProc);
- InitPropSheetPage(&psp[2], IDD_PROPPAGEADD, (DLGPROC) AddPageProc);
- InitPropSheetPage(&psp[3], IDD_PROPPAGEROSSETUP, (DLGPROC) RosPageProc);
-
- return (LONG)(PropertySheet(&psh) != -1);
-}
-
+HINSTANCE hApplet = NULL;
/* Control Panel Callback */
LONG CALLBACK
CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
{
CPLINFO *CPlInfo;
- DWORD i;
- i = (DWORD)lParam1;
switch (uMsg)
{
case CPL_INIT:
return TRUE;
case CPL_GETCOUNT:
- return NUM_APPLETS;
+ return 1;
case CPL_INQUIRE:
CPlInfo = (CPLINFO*)lParam2;
CPlInfo->lData = 0;
- CPlInfo->idIcon = Applets[i].idIcon;
- CPlInfo->idName = Applets[i].idName;
- CPlInfo->idInfo = Applets[i].idDescription;
+ CPlInfo->idIcon = IDI_CPLSYSTEM;
+ CPlInfo->idName = IDS_CPLSYSTEMNAME;
+ CPlInfo->idInfo = IDS_CPLSYSTEMDESCRIPTION;
break;
case CPL_DBLCLK:
- hCPLWindow = hwndCPl;
- Applets[i].AppletProc();
+ ShellExecute(NULL,
+ NULL,
+ _T("rapps.exe"),
+ NULL,
+ NULL,
+ 1);
break;
}
return FALSE;
}
-
BOOL WINAPI
DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
diff --git a/reactos/dll/cpl/appwiz/appwiz.h b/reactos/dll/cpl/appwiz/appwiz.h
index 70f6be025b9..c243997817a 100644
--- a/reactos/dll/cpl/appwiz/appwiz.h
+++ b/reactos/dll/cpl/appwiz/appwiz.h
@@ -3,7 +3,6 @@
#define COBJMACROS
#include
-#include /* GET_X/Y_LPARAM */
#include
#include
#include
@@ -20,69 +19,16 @@
#include "resource.h"
-typedef LONG (CALLBACK *CPLAPPLET_PROC)(VOID);
-
-typedef struct
-{
- int idIcon;
- int idName;
- int idDescription;
- CPLAPPLET_PROC AppletProc;
-} APPLET, *PAPPLET;
-
typedef struct
{
WCHAR szTarget[MAX_PATH];
WCHAR szWorkingDirectory[MAX_PATH];
WCHAR szDescription[MAX_PATH];
WCHAR szLinkName[MAX_PATH];
-}CREATE_LINK_CONTEXT, *PCREATE_LINK_CONTEXT;
-
+} CREATE_LINK_CONTEXT, *PCREATE_LINK_CONTEXT;
extern HINSTANCE hApplet;
-/* remove.c */
-INT_PTR CALLBACK
-RemovePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-VOID
-AddListColumn(HWND hList, LPTSTR Caption);
-
-VOID
-FillSoftwareList(HWND hwndDlg, BOOL bShowUpdates, UINT Control);
-
-VOID
-AddItemsToViewControl(HWND hwndDlg, UINT Control);
-
-VOID
-FindItems(HWND hwndDlg, UINT ListControl, UINT EditControl, UINT RemBtn, UINT InfoBtn);
-
-VOID
-CallUninstall(HWND hwndDlg, UINT Control, UINT RemBtn, UINT InfoBtn, BOOL isUpdate);
-
-VOID
-GetCurrentView(HWND hwndDlg, UINT ViewControl, UINT ListControl);
-
-VOID
-CallInformation(HWND hwndDlg, HWND infDlg, UINT Control);
-
-VOID
-ShowPopupMenu(HWND hwndDlg, UINT ResMenu, INT xPos, INT yPos, UINT Control);
-
-BOOL
-IsItemSelected(HWND hwndDlg, UINT Control);
-
-VOID
-ButtonStatus(HWND hwndDlg, BOOL Status, UINT RemBtn, UINT InfoBtn);
-
-/* add.c */
-INT_PTR CALLBACK
-AddPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-/* rossetup.c */
-INT_PTR CALLBACK
-RosPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
/* createlink.c */
INT_PTR CALLBACK
WelcomeDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
@@ -93,10 +39,6 @@ FinishDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
LONG CALLBACK
NewLinkHere(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
-/* updates.c */
-INT_PTR CALLBACK
-UpdatesPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
void ShowLastWin32Error(HWND hWndOwner);
#endif /* __CPL_APPWIZ_H */
diff --git a/reactos/dll/cpl/appwiz/appwiz.rbuild b/reactos/dll/cpl/appwiz/appwiz.rbuild
index fb67d5a66b8..ce017a96552 100644
--- a/reactos/dll/cpl/appwiz/appwiz.rbuild
+++ b/reactos/dll/cpl/appwiz/appwiz.rbuild
@@ -1,6 +1,6 @@
-
+
.
kernel32
@@ -11,10 +11,6 @@
uuid
shell32
appwiz.c
- remove.c
- add.c
- rossetup.c
createlink.c
- updates.c
appwiz.rc
diff --git a/reactos/dll/cpl/appwiz/appwiz.rc b/reactos/dll/cpl/appwiz/appwiz.rc
index f7f0ae4b10f..94ff3b59381 100644
--- a/reactos/dll/cpl/appwiz/appwiz.rc
+++ b/reactos/dll/cpl/appwiz/appwiz.rc
@@ -7,11 +7,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Software Control Panel\0"
#define REACTOS_STR_INTERNAL_NAME "appwiz\0"
#define REACTOS_STR_ORIGINAL_FILENAME "appwiz.cpl\0"
-#ifdef _MSC_VER
-#include <../../../reactos/version.rc>
-#else
#include
-#endif
IDI_CPLSYSTEM ICON "resources/applet.ico"
IDI_APPICO ICON "resources/1501.ico"
@@ -19,8 +15,6 @@ IDI_INSTICO ICON "resources/1502.ico"
IDI_RECBINICO ICON "resources/1503.ico"
IDI_DOWNLOADICO ICON "resources/1504.ico"
IDI_APPINETICO ICON "resources/1505.ico"
-IDI_UPDATES ICON "resources/updates.ico"
-IDI_REACTOS ICON "resources/reactos.ico"
IDB_WATERMARK BITMAP "resources/watermark.bmp"
diff --git a/reactos/dll/cpl/appwiz/lang/bg-BG.rc b/reactos/dll/cpl/appwiz/lang/bg-BG.rc
index 7cc3748d3f4..33f7248fd2f 100644
--- a/reactos/dll/cpl/appwiz/lang/bg-BG.rc
+++ b/reactos/dll/cpl/appwiz/lang/bg-BG.rc
@@ -1,83 +1,5 @@
LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "/&",ID_APP_MODIFYREMOVE
- MENUITEM "&", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&", ID_UPD_REMOVE
- MENUITEM "&", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT " . , ""/ "".",-1,36,7,PROPSHEETWIDTH-48,32
- LTEXT ":",-1,PROPSHEETPADDING,33,50,14
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT ":",-1,250,33,40,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "/ &", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT " . , """".",-1,36,7,PROPSHEETWIDTH-48,32
- LTEXT ":",-1,PROPSHEETPADDING,33,50,14
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "",-1,250,33,40,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "&", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT " , """".",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT " , """".",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT " "" "", , .",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "& ", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,32
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION " "
@@ -119,52 +41,10 @@ BEGIN
LTEXT " """" .", -1, 120, 50, 170, 10
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 200
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION ""
-FONT 8, "MS Shell Dlg"
-BEGIN
- LTEXT " ", IDS_INFO_DISPNAME, PROPSHEETPADDING, 8, 160, 24
- LTEXT " :", -1, PROPSHEETPADDING, 25, 160, 17
- LTEXT "", IDS_INFO_REGOWNER, PROPSHEETPADDING+75, 25, 160, 17
- LTEXT " :", -1, PROPSHEETPADDING, 40, 160, 17
- LTEXT "", IDS_INFO_PRODUCTID, PROPSHEETPADDING+105, 40, 160, 17 // +75, 40, 160, 17
- LTEXT ":", -1, PROPSHEETPADDING, 55, 160, 17
- LTEXT "", IDS_INFO_PUBLISHER, PROPSHEETPADDING+105, 55, 160, 17
- LTEXT ":", -1, PROPSHEETPADDING, 70, 160, 17
- LTEXT "", IDS_INFO_VERSION, PROPSHEETPADDING+105, 70, 160, 17
- LTEXT " :", -1, PROPSHEETPADDING, 85, 160, 17
- LTEXT "", IDS_INFO_CONTACT, PROPSHEETPADDING+105, 85, 160, 17
- LTEXT " :", -1, PROPSHEETPADDING, 100, 160, 17
- LTEXT "", IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+105, 100, 160, 17
- LTEXT " :", -1, PROPSHEETPADDING, 115, 160, 17
- LTEXT "", IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+105, 115, 160, 17
- LTEXT " :", -1, PROPSHEETPADDING, 130, 160, 17
- LTEXT "", IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+105, 130, 160, 17
- LTEXT ":", -1, PROPSHEETPADDING, 145, 160, 17
- LTEXT "", IDS_INFO_README, PROPSHEETPADDING+105, 145, 160, 17
- LTEXT ":", -1, PROPSHEETPADDING, 160, 160, 17
- LTEXT "", IDS_INFO_COMMENTS, PROPSHEETPADDING+105, 160, 160, 17
- PUSHBUTTON "&", IDCANCEL, 212, 180, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME "/ "
IDS_CPLSYSTEMDESCRIPTION " ."
-// IDS_NOITEM_SELECTED " !"
- IDS_ERROR ""
- IDS_UNABLEREAD_UNINSTSTR " . MSI ."
- IDS_UNABLEOPEN_UNINSTKEY " "
- IDS_APPLIST " "
- IDS_UPDATESLIST " "
- IDS_LARGEICONS " "
- IDS_LIST ""
- IDS_DETAILS ""
IDS_CREATE_SHORTCUT " "
IDS_ERROR_NOT_FOUND " %s."
- IDS_UNABLEREAD_INFORMATION "Unable to open Information Keys"
- IDS_NO_INFORMATION "No information"
- IDS_NONE_APP "There are no installed applications."
- IDS_NONE_UPD "There are no installed updates."
END
diff --git a/reactos/dll/cpl/appwiz/lang/cs-CZ.rc b/reactos/dll/cpl/appwiz/lang/cs-CZ.rc
index 03f7c7feea7..5f59fbf8e70 100644
--- a/reactos/dll/cpl/appwiz/lang/cs-CZ.rc
+++ b/reactos/dll/cpl/appwiz/lang/cs-CZ.rc
@@ -5,84 +5,6 @@
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "Zmnit/&Odebrat",ID_APP_MODIFYREMOVE
- MENUITEM "&Informace", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Odebrat", ID_UPD_REMOVE
- MENUITEM "&Informace", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Zmnit nebo odebrat programy"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Nsledujc software me bt automaticky odebrn. Pro odebrn nebo zmnu jeho instalovanch komponent jej vyberte ze seznamu a kliknte na Zmnit/odebrat.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Najt:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Zobrazit:",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "Zmnit/&odebrat", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informace", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Odebrat aktualizace"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Nsledujc aktualizace mohou bt automaticky odebrny. Pro odebrn aktualizace ji vyberte ze seznamu a kliknte na Odebrat.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Najt:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Zobrazit:",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "&Odebrat", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informace", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Pidat nov programy"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT "Nov program lze nainstalovat kliknutm na ""Instalovat"".",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&Instalovat...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT "Nov program lze sthnout a nainstalovat kliknutm na ""Download!"".",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Download!", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT "Stisknte tlatko ""Najt na internetu"" pro vyhledn novch aplikac dostupnch pomoc pipojen k internetu.",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Vlastnosti...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "&Najt na internetu", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "ReactOS Setup"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Create link"
@@ -124,51 +46,10 @@ BEGIN
LTEXT "Kliknutm na Dokonit vytvote zstupce.", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Informace"
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Registrovan vlastnk:", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "ID produktu:", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Vydavatel:", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Verze:", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Kontakt:", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Informace o podpoe:", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Telefon na podporu:", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Updaty produktu:", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Readme:", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Komente:", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&zavit", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME "Pidat/Odebrat programy"
IDS_CPLSYSTEMDESCRIPTION "Nastavuje programy a vytv zstupce."
- IDS_ERROR "Chyba"
- IDS_UNABLEREAD_UNINSTSTR "Nelze nast UninstallString. Tento zpis je neplatn nebo byl vytvoen MSI instaltorem."
- IDS_UNABLEOPEN_UNINSTKEY "Nelze otevt kl Uninstall"
- IDS_APPLIST "Aktuln nainstalovan programy"
- IDS_UPDATESLIST "Aktuln nainstalovan aktualizace"
- IDS_LARGEICONS "Velk ikony"
- IDS_LIST "Seznam"
- IDS_DETAILS "Podrobnosti"
IDS_CREATE_SHORTCUT "Vytvoit zstupce"
IDS_ERROR_NOT_FOUND "Soubor %s nebyl nalezen."
- IDS_UNABLEREAD_INFORMATION "Nelze otevt kle Information"
- IDS_NO_INFORMATION "dn informace"
- IDS_NONE_APP "Nejsou nainstalovny dn aplikace."
- IDS_NONE_UPD "Nejsou nainstalovny dn aktualizace."
END
diff --git a/reactos/dll/cpl/appwiz/lang/de-DE.rc b/reactos/dll/cpl/appwiz/lang/de-DE.rc
index 15e6363ca11..fe55301c09f 100644
--- a/reactos/dll/cpl/appwiz/lang/de-DE.rc
+++ b/reactos/dll/cpl/appwiz/lang/de-DE.rc
@@ -1,83 +1,5 @@
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "ndern/&Entfernen",ID_APP_MODIFYREMOVE
- MENUITEM "&Informationen", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Entfernen", ID_UPD_REMOVE
- MENUITEM "&Informationen", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Programme ndern oder entfernen"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Die folgende Software kann automatisch entfernt werden. Whlen Sie das Programm aus der Liste aus und klicken Sie auf ndern/Entfernen, um es zu entfernen oder um installierte Komponenten zu ndern.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Finden:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Ansehen:",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "ndern/Entfernen", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informationen", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Updates entfernen"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Die folgenden Updates knnen automatisch entfernt werden. Um ein Update zu entfernen, whlen Sie es von der Liste und whlen Sie Entfernen.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Finden:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Ansehen:",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "&Entfernen", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informationen", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Neue Programme hinzufgen"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT "Um neue Programme zu installieren, whlen Sie Installieren.",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&Installieren...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT "Um neue Programme herunterzuladen und zu installieren, whlen Sie Download.",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Download", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT "Drcken Sie Im Internet suchen, um nach neuen verfgbaren Anwendungen im Internet zu suchen.",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Einstellungen...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "&Im Internet suchen", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "ReactOS Setup"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Verknpfung erstellen"
@@ -119,51 +41,10 @@ BEGIN
LTEXT "Klicken Sie auf Fertig stellen, um die Verknpfung zu erstellen.", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Informationen"
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Registrierter Eigentmer:", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Produkt ID:", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Herausgeber:", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Version:", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Kontakt:", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Supportinformationen:", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Supportrufnummer:", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Produktupdates:", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Readme:", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Kommentare:", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&Schliessen", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME "Programme Hinzufgen/Entfernen"
IDS_CPLSYSTEMDESCRIPTION "Installiert Programme und erstellt Verknpfungen."
- IDS_ERROR "Fehler"
- IDS_UNABLEREAD_UNINSTSTR "UninstallString konnte nicht geffnet werden. Dieser Eintrag ist entweder ungltig oder wurde von einem MSI Installer erstellt."
- IDS_UNABLEOPEN_UNINSTKEY "Uninstall Key konnte nicht geffnet werden"
- IDS_APPLIST "Derzeit installierte Programme"
- IDS_UPDATESLIST "Derzeit installierte Updates"
- IDS_LARGEICONS "Groe Symbole"
- IDS_LIST "Liste"
- IDS_DETAILS "Details"
IDS_CREATE_SHORTCUT "Verknpfung erstellen"
IDS_ERROR_NOT_FOUND "Die Datei %s konnte nicht gefunden werden."
- IDS_UNABLEREAD_INFORMATION "Information Keys konnten nicht geffnet werden"
- IDS_NO_INFORMATION "Keine Informationen"
- IDS_NONE_APP "Keine Anwendungen installiert."
- IDS_NONE_UPD "Keine Updates installiert."
END
diff --git a/reactos/dll/cpl/appwiz/lang/el-GR.rc b/reactos/dll/cpl/appwiz/lang/el-GR.rc
index ff091b27436..fffe34c0ec0 100644
--- a/reactos/dll/cpl/appwiz/lang/el-GR.rc
+++ b/reactos/dll/cpl/appwiz/lang/el-GR.rc
@@ -1,83 +1,5 @@
LANGUAGE LANG_GREEK, SUBLANG_DEFAULT
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "/&",ID_APP_MODIFYREMOVE
- MENUITEM "&", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&", ID_UPD_REMOVE
- MENUITEM "&", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT " . , '/'.",-1,36,3,PROPSHEETWIDTH-48,25
- LTEXT ":",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT ":",-1,247,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "/&", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT " . ''",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT ":",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT ":",-1,247,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "&", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT " , ''.",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT " """" , ''.",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT " "" "" .",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "& ", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " ReactOS"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION " "
@@ -119,51 +41,10 @@ BEGIN
LTEXT " '' .", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION ""
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " ", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME " "
IDS_CPLSYSTEMDESCRIPTION " ."
- IDS_ERROR ""
- IDS_UNABLEREAD_UNINSTSTR "Unable to read UninstallString. This entry is invalid or has been created by an MSI installer."
- IDS_UNABLEOPEN_UNINSTKEY "Unable to open Uninstall Key"
- IDS_APPLIST " "
- IDS_UPDATESLIST " "
- IDS_LARGEICONS " "
- IDS_LIST ""
- IDS_DETAILS ""
IDS_CREATE_SHORTCUT " "
IDS_ERROR_NOT_FOUND " %s ."
- IDS_UNABLEREAD_INFORMATION "Unable to open Information Keys"
- IDS_NO_INFORMATION " "
- IDS_NONE_APP " ."
- IDS_NONE_UPD " ."
END
diff --git a/reactos/dll/cpl/appwiz/lang/en-US.rc b/reactos/dll/cpl/appwiz/lang/en-US.rc
index de637d7c375..f41ad96f6e4 100644
--- a/reactos/dll/cpl/appwiz/lang/en-US.rc
+++ b/reactos/dll/cpl/appwiz/lang/en-US.rc
@@ -1,83 +1,5 @@
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "Modify/&Remove",ID_APP_MODIFYREMOVE
- MENUITEM "&Information", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Remove", ID_UPD_REMOVE
- MENUITEM "&Information", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Change or Remove Programs"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT "The following Software can be automatically removed. To remove a program or to modify its installed components, select it from the list and click Modify/Remove.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Find:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "View:",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "Modify/&Remove", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Information", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Remove Updates"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT "The following Updates can be automatically removed. To remove a update, select it from the list and click Remove.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Find:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "View:",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "&Remove", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Information", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Add New Programs"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT "To install a new program, click ""Install"".",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&Install...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT "To download and install new applications, press ""Download !"".",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Download !", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT "Press ""Find in the Internet"" button in order to search for new applications available via Internet connection.",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Properties...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "&Find in the Internet", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "ReactOS Setup"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Create link"
@@ -119,51 +41,10 @@ BEGIN
LTEXT "Click Finish to create the shortcut.", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Information"
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Registered Owner:", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Product ID:", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Publisher:", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Version:", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Contact:", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Support Information:", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Support Telephone:", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Product Updates:", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Readme:", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Comments:", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&Close", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME "Add/Remove Programs"
IDS_CPLSYSTEMDESCRIPTION "Sets up programs and creates shortcuts."
- IDS_ERROR "Error"
- IDS_UNABLEREAD_UNINSTSTR "Unable to read UninstallString. This entry is invalid or has been created by an MSI installer."
- IDS_UNABLEOPEN_UNINSTKEY "Unable to open Uninstall Key"
- IDS_APPLIST "Currently installed programs"
- IDS_UPDATESLIST "Currently installed updates"
- IDS_LARGEICONS "Large Icons"
- IDS_LIST "List"
- IDS_DETAILS "Details"
IDS_CREATE_SHORTCUT "Create Shortcut"
IDS_ERROR_NOT_FOUND "The file %s was not found."
- IDS_UNABLEREAD_INFORMATION "Unable to open Information Keys"
- IDS_NO_INFORMATION "No information"
- IDS_NONE_APP "There are no installed applications."
- IDS_NONE_UPD "There are no installed updates."
END
diff --git a/reactos/dll/cpl/appwiz/lang/es-ES.rc b/reactos/dll/cpl/appwiz/lang/es-ES.rc
index 4de4d80bed7..2a7ad5d5f72 100644
--- a/reactos/dll/cpl/appwiz/lang/es-ES.rc
+++ b/reactos/dll/cpl/appwiz/lang/es-ES.rc
@@ -5,84 +5,6 @@
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "Modificar/&Quitar",ID_APP_MODIFYREMOVE
- MENUITEM "&Informacin", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Quitar", ID_UPD_REMOVE
- MENUITEM "&Informacin", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Cambiar o quitar programas"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT "El siguiente Software puede ser quitado automaticamente. Para quitar un programa o modificar sus componentes instalados, seleccionelo de la lista y presione Modificar/Quitar.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Examinar:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Ver:",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "Modificar/&Quitar", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informacin", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Quitar Actualizaciones"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Las siguientes actualizaciones pueden ser quitadas automaticamente. Para quitar una actualizacin, seleccionela de la lista y presione Quitar.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Examinar:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Ver:",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "&Quitar", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informacin", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Aadir nuevos programas"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT "Para instalar un programa nuevo, presione ""Instalar"".",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&Instalar...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT "Para descargar e instalar nuevas aplicaciones, presione ""Descargar !"".",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Descargar !", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT "Presione el botn ""Buscar en Internet"" para buscar nuevas aplicaciones a travs de la conexin a Internet.",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Propiedades...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "&Buscar en Internet", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Instalador de ReactOS"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Crear Enlace"
@@ -124,51 +46,10 @@ BEGIN
LTEXT "Haga Click en Finalizar para crear el acceso directo.", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Informacin"
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Usuario Registrado:", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Producto ID:", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Autor:", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Versin:", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Contacto:", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Informacin de Ayuda:", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Telfono de Ayuda:", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Actualizaciones de Producto:", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Leeme:", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Comentarios:", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&Cerrar", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME "Aadir/Quitar Programas"
IDS_CPLSYSTEMDESCRIPTION "Aade programas y crea accesos directos."
- IDS_ERROR "Error"
- IDS_UNABLEREAD_UNINSTSTR "Incapaz de leer el archivo de desinstalacin. La estrada es incorrecta o fue creada por un instalador MSI."
- IDS_UNABLEOPEN_UNINSTKEY "Incapaz de abrir la llave de desinstalacin"
- IDS_APPLIST "Programas instalados"
- IDS_UPDATESLIST "Actualizaciones instaladas"
- IDS_LARGEICONS "Iconos Grandes"
- IDS_LIST "Lista"
- IDS_DETAILS "Detalles"
IDS_CREATE_SHORTCUT "Crear acceso directo"
IDS_ERROR_NOT_FOUND "El archivo %s no fue encontrado."
- IDS_UNABLEREAD_INFORMATION "Unable to open Information Keys"
- IDS_NO_INFORMATION "Sin informacin"
- IDS_NONE_APP "No hay aplicaciones instaladas."
- IDS_NONE_UPD "No hay actualizaciones instaladas."
END
diff --git a/reactos/dll/cpl/appwiz/lang/fr-FR.rc b/reactos/dll/cpl/appwiz/lang/fr-FR.rc
index 33f9135c7d8..a321a267d06 100644
--- a/reactos/dll/cpl/appwiz/lang/fr-FR.rc
+++ b/reactos/dll/cpl/appwiz/lang/fr-FR.rc
@@ -1,83 +1,5 @@
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "Modifier/Supp&rimer",ID_APP_MODIFYREMOVE
- MENUITEM "&Informations", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "Supp&rimer", ID_UPD_REMOVE
- MENUITEM "&Informations", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Changer ou Supprimer des programmes"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Les logiciels suivants peuvent tre automatiquement supprims. Pour supprimer un programme ou modifier ses lments installs, slectionnez-le dans la liste et cliquez sur Modifier/Supprimer.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Chercher :",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Affichage :",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "Modifier/Supp&rimer", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informations", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Supprimer des mises--jour"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Les mises--jour suivantes peuvent tre automatiquement supprimes. Pour supprimer une mises--jour, slectionnez-la dans la liste et cliquez sur Supprimer.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Chercher :",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Affichage :",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "Supp&rimer", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informations", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Ajouter de nouveaux programmes"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT "Pour installer un nouveau programme, cliquez sur ""Installer"".",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&Installer...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT "Pour tlcharger et installer de nouvelles applications, cliquez sur ""Download !"".",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Download !", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT "Cliquez sur le bouton ""Chercher sur l'Internet"" pour rechercher de nouvelles applications disponibles via une connexion Internet.",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Proprits...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "Chercher sur l'Internet", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Installation de ReactOS"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Crer un lien"
@@ -119,51 +41,10 @@ BEGIN
LTEXT "Cliquez sur Terminer pour crer le raccourci.", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Informations"
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Propritaire enregistr :", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "ID du produit :", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "diteur :", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Version :", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Contact :", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Informations sur le support :", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Support tlphonique :", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Mises--jour du produit :", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Lisez-moi :", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Commentaires :", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "Fermer", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME "Ajouter/Supprimer des Programmes"
IDS_CPLSYSTEMDESCRIPTION "Installe des programmes et cr des raccourcis."
- IDS_ERROR "Erreur"
- IDS_UNABLEREAD_UNINSTSTR "Impossible de lire UninstallString. Cette entre est invalide ou a t cre par un installateur MSI."
- IDS_UNABLEOPEN_UNINSTKEY "Impossible d'ouvrir la cl de dsinstallation"
- IDS_APPLIST "Programmes actuellement installs"
- IDS_UPDATESLIST "Mises--jour actuellement installes"
- IDS_LARGEICONS "Grandes icnes"
- IDS_LIST "Liste"
- IDS_DETAILS "Dtails"
- IDS_CREATE_SHORTCUT "Crer un raccourci"
- IDS_ERROR_NOT_FOUND "Le fichier %s n'a pas t trouv."
- IDS_UNABLEREAD_INFORMATION "Impossible d'ouvrir les cls d'informations"
- IDS_NO_INFORMATION "Aucune information"
- IDS_NONE_APP "Il n'y a pas d'application installe."
- IDS_NONE_UPD "Il n'y a pas de mise--jour installe."
+ IDS_CREATE_SHORTCUT "Crer un raccourci"
+ IDS_ERROR_NOT_FOUND "Le fichier %s n'a pas t trouv."
END
diff --git a/reactos/dll/cpl/appwiz/lang/it-IT.rc b/reactos/dll/cpl/appwiz/lang/it-IT.rc
index 36c1acf02f1..0e27003333e 100644
--- a/reactos/dll/cpl/appwiz/lang/it-IT.rc
+++ b/reactos/dll/cpl/appwiz/lang/it-IT.rc
@@ -1,83 +1,5 @@
LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "Modifica/&Rimuovi",ID_APP_MODIFYREMOVE
- MENUITEM "&Informazioni", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Removi", ID_UPD_REMOVE
- MENUITEM "&Informazioni", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Modifica o rimozione programmi"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Il software seguente pu essere rimosso automaticamente. Per rimuovere un programma o modificarne i componenti installati, selezionarlo nella lista e cliccare Modifica/Rimuovi.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Cerca:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Visualizza:",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "Modifica/&Rimuovi", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informationi", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Rimozione aggiornamenti"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Gli aggiornamenti seguenti possono essere rimossi automaticamente. Per rimuovere un aggiornamento, Selezionarlo nella lista e cliccare Rimuovi.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Cerca:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Visualizza:",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "&Rimuovi", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informationi", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Aggiungi un nuovo programma"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT "Per installare un programma, cliccare ""Installa"".",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&Installa...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT "Per scaricare e installare una applicazione premere ""Scarica !"".",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Download !", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT "Premere ""Cerca in Internet"" per cercare una applicazione disponibile attraverso una connessione a internet..",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Propriet...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "&Cerca in Internet", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "ReactOS Setup"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Crea collegamento"
@@ -119,51 +41,10 @@ BEGIN
LTEXT "Premere Fine per creare il collegamento.", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Informationi"
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Proprietario Registrato:", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "ID Prodotto:", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Pubblicato da:", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Versione:", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Contto:", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Informazioni per Supporto:", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Telefono:", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Aggiornamenti del prodotto:", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Informazioni in breve:", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Commenti:", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&Chiudi", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME "Aggiunge/Rimuove programmi"
IDS_CPLSYSTEMDESCRIPTION "Predispone i programmi e crea collegamenti."
- IDS_ERROR "Errore"
- IDS_UNABLEREAD_UNINSTSTR "Impossibile leggere la stringa UninstallString. Questo elemento corrotto o stato creato da MSI installer."
- IDS_UNABLEOPEN_UNINSTKEY "Impossibile aprire la Chiave di Disinstallazione"
- IDS_APPLIST "Programmi attualmente installati"
- IDS_UPDATESLIST "Aggiornamenti attualmente installati"
- IDS_LARGEICONS "Icone Grandi"
- IDS_LIST "Lista"
- IDS_DETAILS "Dettagli"
IDS_CREATE_SHORTCUT "Crea collegamento"
IDS_ERROR_NOT_FOUND "Il file %s non stato trovato."
- IDS_UNABLEREAD_INFORMATION "Impossibile aprire la Chiavi delle informazioni"
- IDS_NO_INFORMATION "Nessuna informazione"
- IDS_NONE_APP "Non ci sono applicazioni installate."
- IDS_NONE_UPD "Non ci sono aggiornamenti installati."
END
diff --git a/reactos/dll/cpl/appwiz/lang/no-NO.rc b/reactos/dll/cpl/appwiz/lang/no-NO.rc
index 529a23d67b2..b1bbea99ca2 100644
--- a/reactos/dll/cpl/appwiz/lang/no-NO.rc
+++ b/reactos/dll/cpl/appwiz/lang/no-NO.rc
@@ -1,83 +1,5 @@
LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "Endre/&fjerne",ID_APP_MODIFYREMOVE
- MENUITEM "&Informasjon", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Fjern", ID_UPD_REMOVE
- MENUITEM "&Informasjon", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Endre eller fjern programmer"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Flgende programvare kan bli fjernet automatisk. For fjerne et program eller endre dems innstallerte komponenter, velg de fra listen og klikk Endre/Fjerne.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Finn:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Vis:",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "Endre/&Fjerne", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informasjon", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Fjern oppdateringer"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Flgende oppdateringer kan bli fjernet automatisk. For fjerne oppdateringer, velg de fra listen og klikk Fjerne.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Finn:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Vis:",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "&Fjerne", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informasjon", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Legg til et nytt program"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT "For innstallere et nytt program, klikk ""Innstallere"".",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&Innstallere...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT "For nedlaste og installere nytt applikasjon, trykk p ""Nedlasting !"".",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Nedlasting !", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT "Trykk p ""Finn p internett"" Knappen for ske for nye applikasjoner som er tilgjengelig ved hjelp av internett forbindelsen.",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Egenskaper...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "&Finn p internett", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "ReactOS Innstallering"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Opprett lenke"
@@ -102,8 +24,8 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Opprett snarvei"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
- LTEXT "This wizard helps you to create shortcuts to local or\nnetwork programs, files, folders, computers, or Internet\naddresses.", -1, 120, 15, 200, 30
- LTEXT "Type the location of the item:", -1, 120, 50, 120, 10
+ LTEXT "Denne veiviseren vil hjelper deg lage snarvei til en lokal eller \nnettverk programmer, filer, mapper, datamaskiner, eller internett\nadresse.", -1, 120, 15, 200, 30
+ LTEXT "Velg din lagring plassering:", -1, 120, 50, 120, 10
EDITTEXT IDC_SHORTCUT_LOCATION, 120, 65, 150, 15, ES_LEFT
PUSHBUTTON "Bla gjennom...", IDC_SHORTCUT_BROWSE, 272, 65, 55, 15, ES_LEFT
LTEXT "Trykk p neste for fortsette.", -1, 120, 97, 162, 10
@@ -111,59 +33,18 @@ END
IDD_SHORTCUT_FINISH DIALOGEX 0, 0, 340, 200
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Select a Title for the Program"
+CAPTION "Velg en tittel for programmet"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
- LTEXT "&Type a name for this shortcut:", -1, 120, 15, 150, 10
+ LTEXT "&Skriv inn et navn for denne snarveien:", -1, 120, 15, 150, 10
EDITTEXT IDC_SHORTCUT_NAME, 120, 35, 150, 15, ES_LEFT
LTEXT "Trykk p fullfrt for opprette snarveien.", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Informasjon"
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Registerert eier:", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Produkt ID:", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Utgiver:", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Versjon:", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Kontakt:", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Hjelp informasjon:", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Hjelp Telefon:", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Produkt oppdateringer:", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Readme:", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Kommentarer:", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&Lukk", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME "Legg til/Fjern Programmer"
IDS_CPLSYSTEMDESCRIPTION "Sett opp programmer og opprett snarveier."
- IDS_ERROR "Feil"
- IDS_UNABLEREAD_UNINSTSTR "Unable to read UninstallString. This entry is invalid or has been created by an MSI installer."
- IDS_UNABLEOPEN_UNINSTKEY "Ikke mulig pne avinnstallert nkkel"
- IDS_APPLIST "Nvrende installerte programmer"
- IDS_UPDATESLIST "Nvrende installerte oppdateringer"
- IDS_LARGEICONS "Store ikoner"
- IDS_LIST "Liste"
- IDS_DETAILS "Detailjer"
IDS_CREATE_SHORTCUT "Opprett snarveier"
IDS_ERROR_NOT_FOUND "Filen %s ble ikke funnet."
- IDS_UNABLEREAD_INFORMATION "Ikke mulig pne informasjons nkkel"
- IDS_NO_INFORMATION "Ingen informasjon"
- IDS_NONE_APP "Det er ingen installerte applikasjoner."
- IDS_NONE_UPD "Det er ingen installerte oppdateringer."
END
diff --git a/reactos/dll/cpl/appwiz/lang/pl-PL.rc b/reactos/dll/cpl/appwiz/lang/pl-PL.rc
index 32bad8c76c2..eada53d8597 100644
--- a/reactos/dll/cpl/appwiz/lang/pl-PL.rc
+++ b/reactos/dll/cpl/appwiz/lang/pl-PL.rc
@@ -7,84 +7,6 @@
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "Modikuj/&Usu",ID_APP_MODIFYREMOVE
- MENUITEM "&Informacje", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&Usu", ID_UPD_REMOVE
- MENUITEM "&Informacje", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Zmnie lub Usu programy"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Nastpujce programy mog zosta usunite automatycznie. Aby usun program albo by zmodyfikowa jego zainstalowane skadniki, znajd program na licie i nacinij Modyfikuj/Usu.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Wyszukaj:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Podgld:",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "Modifikuj/&Usu", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informacje", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Usu Uaktualnienia"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Nastpujce uaktualnienia mog zosta automatycznie usunite. Aby usun uaktualnienie, wyszukaj je na licie i nacinij Usu.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Wyszukaj:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Podgld:",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "&Usu", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informacje", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Dodaj nowe programy"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT "Aby zainstalowa nowy program, nacinij ""Instaluj"".",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&Instaluj...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT "Aby cign i zainstalowa now aplikacj, nacinij ""cignij !"".",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&cignij !", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT "Nacinij przycisk ""Szukaj w Internecie"" by poszuka nowych aplikacji z internetu, uywajc poczenia internetowego.",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&Waciwoci...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "&Szukaj w Internecie", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Ustawienia ReactOS"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Utwrz cze"
@@ -126,51 +48,10 @@ BEGIN
LTEXT "Nacinij Zakocz by utworzy skrt.", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Informacje"
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Waciciel:", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "ID Produktu:", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Wydawca:", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Wersja:", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Kontakt:", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Informacje o wsparciu:", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Wsparcie Telefoniczne:", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Uaktualnienia:", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Czytaj-to:", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Komentarze:", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&Zamknij", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME "Dodaj/Usu Programy"
IDS_CPLSYSTEMDESCRIPTION "Instaluje bd usuwa programy oraz tworzy skrty."
- IDS_ERROR "Bd"
- IDS_UNABLEREAD_UNINSTSTR "Nie mona odczyta cigu Uninstall. Ten skadnik nie jest prawidowy albo zosta utworzony instalatorem MSI."
- IDS_UNABLEOPEN_UNINSTKEY "Nie mona otworzy klucza Uninstall"
- IDS_APPLIST "Obecnie zainstalowane programy"
- IDS_UPDATESLIST "Obecnie zainstalowane uaktualnienia"
- IDS_LARGEICONS "Due ikony"
- IDS_LIST "Lista"
- IDS_DETAILS "Szczegy"
IDS_CREATE_SHORTCUT "Utwrz skrt"
IDS_ERROR_NOT_FOUND "Plik %s nie zosta znaleziony."
- IDS_UNABLEREAD_INFORMATION "Nie mona otworzy Kluczy Informacyjnych"
- IDS_NO_INFORMATION "Brak informacji"
- IDS_NONE_APP "Brak zainstalowanych programw."
- IDS_NONE_UPD "Brak zainstalowanych uaktualnie."
END
diff --git a/reactos/dll/cpl/appwiz/lang/ru-RU.rc b/reactos/dll/cpl/appwiz/lang/ru-RU.rc
index 9f715aa6c2b..253ed9a766e 100644
--- a/reactos/dll/cpl/appwiz/lang/ru-RU.rc
+++ b/reactos/dll/cpl/appwiz/lang/ru-RU.rc
@@ -1,83 +1,5 @@
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "/&",ID_APP_MODIFYREMOVE
- MENUITEM "&", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&", ID_UPD_REMOVE
- MENUITEM "&", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT " . ""/"".",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT ":",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT ":",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "/&", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT " . """".",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT ":",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT ":",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "&", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT " """".",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT " , "" !"".",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "& !", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT " "" "" .",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "& ", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " ReactOS"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION " "
@@ -119,51 +41,10 @@ BEGIN
LTEXT " """" .", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION ""
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " ""Readme"":", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME " "
IDS_CPLSYSTEMDESCRIPTION " , ."
- IDS_ERROR ""
- IDS_UNABLEREAD_UNINSTSTR " UninstallString. MSI-."
- IDS_UNABLEOPEN_UNINSTKEY " "
- IDS_APPLIST " "
- IDS_UPDATESLIST " "
- IDS_LARGEICONS " "
- IDS_LIST ""
- IDS_DETAILS ""
IDS_CREATE_SHORTCUT " "
IDS_ERROR_NOT_FOUND " %s ."
- IDS_UNABLEREAD_INFORMATION " "
- IDS_NO_INFORMATION " "
- IDS_NONE_APP " ."
- IDS_NONE_UPD " ."
END
diff --git a/reactos/dll/cpl/appwiz/lang/sk-SK.rc b/reactos/dll/cpl/appwiz/lang/sk-SK.rc
index 37b9a5f5d6d..f98b375f6d4 100644
--- a/reactos/dll/cpl/appwiz/lang/sk-SK.rc
+++ b/reactos/dll/cpl/appwiz/lang/sk-SK.rc
@@ -4,84 +4,6 @@
LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "Upravi/Odst&rni",ID_APP_MODIFYREMOVE
- MENUITEM "&Informcie", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "Odst&rni", ID_UPD_REMOVE
- MENUITEM "&Informcie", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Zmeni alebo odstrni programy"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Nasledujci softvr me by odstrnen automaticky. Pre odintalovanie softvru alebo zmenu jeho naintalovanch ast, vyberte softvr zo zoznamu a kliknite na tlaidlo Upravi/Odstrni.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Njs:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Zobrazi:",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "Upravi/Odst&rni", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informcie", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Odstrni aktualizcie"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT "Nasledujce aktualizcie mu by odstrnen automaticky. Aktualizciu odintalujete vybratm zo zoznamu a kliknutm na tlaidlo Odstrni.",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "Njs:",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "Zobrazi:",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "Odst&rni", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&Informcie", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Prida nov programy"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT "Pre naintalovanie novho programu kliknite na tlaidlo ""Intalova..."".",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&Intalova...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT "Pre stiahnutie a naintalovanie novch aplikci stlate tlaidlo ""ahaj!"".",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "a&haj!", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT "Stlate tlaidlo ""Njs na internete"" za elom vyhadania novch aplikcii dostupnch prostrednctvom pripojenia k sieti Internet.",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "Vl&astnosti...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "&Njs na internete", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Intaltor systmu ReactOS"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Vytvori linku"
@@ -123,51 +45,10 @@ BEGIN
LTEXT "Kliknite na tlaidlo Dokoni pre vytvorenie odkazu.", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Informcie"
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Registrovan vlastnk:", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "ID produktu:", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Vydavate:", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Verzia:", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Kontakt:", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Informcie o podpore:", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Telefonick podpora:", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Aktualizcie produktu:", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "taj ma:", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Poznmky:", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&Zavrie", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME "Prida alebo odstrni programy"
IDS_CPLSYSTEMDESCRIPTION "Nastav programy a vytvor odkazy."
- IDS_ERROR "Chyba"
- IDS_UNABLEREAD_UNINSTSTR "Unable to read UninstallString. This entry is invalid or has been created by an MSI installer."
- IDS_UNABLEOPEN_UNINSTKEY "Unable to open Uninstall Key"
- IDS_APPLIST "Aktulne naintalovan programy"
- IDS_UPDATESLIST "Aktulne naintalovan aktualizcie"
- IDS_LARGEICONS "Vek ikony"
- IDS_LIST "Zoznam"
- IDS_DETAILS "Podrobnosti"
IDS_CREATE_SHORTCUT "Vytvori odkaz"
IDS_ERROR_NOT_FOUND "Sbor %s nebol njden."
- IDS_UNABLEREAD_INFORMATION "Unable to open Information Keys"
- IDS_NO_INFORMATION "iadne informcie"
- IDS_NONE_APP "Nie s naintalovan iadne programy."
- IDS_NONE_UPD "Nie s naintalovan iadne aktualizcie."
END
diff --git a/reactos/dll/cpl/appwiz/lang/uk-UA.rc b/reactos/dll/cpl/appwiz/lang/uk-UA.rc
index 1bd48c78f59..e9dd0bb6b68 100644
--- a/reactos/dll/cpl/appwiz/lang/uk-UA.rc
+++ b/reactos/dll/cpl/appwiz/lang/uk-UA.rc
@@ -8,84 +8,6 @@
LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "/&",ID_APP_MODIFYREMOVE
- MENUITEM "&³", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "&", ID_UPD_REMOVE
- MENUITEM "&³", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT " . , ""/"".",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT ":",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT ":",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "/&", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&³", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT " . , """".",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT ":",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT ":",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "&", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "&³", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Add New Programs"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT " , """".",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "&...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT " , "" !"".",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "& !", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT " "" Internet"" , -'.",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "&...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "& Internet", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION " ReactOS"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION " "
@@ -127,51 +49,10 @@ BEGIN
LTEXT " , """".", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "³"
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "³ :", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " :", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT " ""Readme"":", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT ":", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "&", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME " "
IDS_CPLSYSTEMDESCRIPTION " ."
- IDS_ERROR ""
- IDS_UNABLEREAD_UNINSTSTR " UninstallString. MSI-."
- IDS_UNABLEOPEN_UNINSTKEY " "
- IDS_APPLIST " "
- IDS_UPDATESLIST " "
- IDS_LARGEICONS " "
- IDS_LIST ""
- IDS_DETAILS ""
IDS_CREATE_SHORTCUT " "
IDS_ERROR_NOT_FOUND " %s ."
- IDS_UNABLEREAD_INFORMATION " "
- IDS_NO_INFORMATION " "
- IDS_NONE_APP " ."
- IDS_NONE_UPD " ."
END
diff --git a/reactos/dll/cpl/appwiz/lang/zh-CN.rc b/reactos/dll/cpl/appwiz/lang/zh-CN.rc
index 30f655a1a09..f927de5ce42 100644
--- a/reactos/dll/cpl/appwiz/lang/zh-CN.rc
+++ b/reactos/dll/cpl/appwiz/lang/zh-CN.rc
@@ -7,84 +7,6 @@
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
-IDR_POPUP_APP MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "/ɾ(&R)",ID_APP_MODIFYREMOVE
- MENUITEM "Ϣ(&I)", ID_APP_INFORMATION
- END
-END
-
-IDR_POPUP_UPD MENU
-BEGIN
- POPUP "popup"
- BEGIN
- MENUITEM "ɾ(&R)", ID_UPD_REMOVE
- MENUITEM "Ϣ(&I)", ID_UPD_INFORMATION
- END
-END
-
-IDD_PROPPAGEINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Ļɾ"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,6,16,16
- LTEXT "гԱԶɾбѡг/ɾťɾó",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "ң",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "ͼ",-1,250,33,30,8
- COMBOBOX IDC_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_SOFTWARELIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "/ɾ(&R)", IDC_ADDREMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "Ϣ(&I)", IDC_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEUPDATES DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "ɾ"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_UPDATES,-1,PROPSHEETPADDING,6,16,16
- LTEXT "и¿ԱԶɾбѡи²ɾťɾø¡",-1,36,7,PROPSHEETWIDTH-48,22
- LTEXT "ң",-1,PROPSHEETPADDING,33,30,8
- EDITTEXT IDC_UPD_FIND_EDIT, PROPSHEETPADDING+30, 30, 180, 14, WS_VISIBLE | WS_TABSTOP
- LTEXT "ͼ",-1,250,33,30,8
- COMBOBOX IDC_UPD_VIEW_COMBO, 280, 30, 94, 80, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
- CONTROL "", IDC_UPDATESLIST, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL, PROPSHEETPADDING, 50, PROPSHEETWIDTH-12, 155, WS_EX_CLIENTEDGE
- PUSHBUTTON "ɾ(&R)", IDC_UPD_REMOVE, PROPSHEETPADDING, 210, 80, 14, WS_DISABLED
- PUSHBUTTON "Ϣ(&I)", IDC_UPD_INFO_BUTTON, PROPSHEETPADDING+85, 210, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEADD DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "³"
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_CPLSYSTEM,-1,PROPSHEETPADDING,10,32,32
- LTEXT "װť³",-1,36,11,PROPSHEETWIDTH-48,8
- PUSHBUTTON "װ(&I)...", IDC_INSTALL, PROPSHEETWIDTH-(90), 46, 80, 14
- LTEXT "", -1, PROPSHEETPADDING, 70, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_DOWNLOADICO,-1,PROPSHEETPADDING,80,32,32
- LTEXT "ءťزװ³",-1,36,83,PROPSHEETWIDTH-48,17
- PUSHBUTTON "أ(&D)", IDC_ADD_DOWNLOAD_BUTTON, PROPSHEETWIDTH-(90), 125, 80, 14, WS_DISABLED
- LTEXT "", -1, PROPSHEETPADDING, 150, PROPSHEETWIDTH-12, 1, NOT WS_GROUP | SS_SUNKEN
- ICON IDI_APPINETICO,-1,PROPSHEETPADDING,160,32,32
- LTEXT "InternetͨInternetӲҿó",-1,36,161,PROPSHEETWIDTH-48,17
- PUSHBUTTON "(&P)...", IDC_ADD_PROP_BUTTON, PROPSHEETWIDTH-(175), 205, 80, 14, WS_DISABLED
- PUSHBUTTON "Internet", IDC_ADD_FIND_BUTTON, PROPSHEETWIDTH-(90), 205, 80, 14, WS_DISABLED
-END
-
-IDD_PROPPAGEROSSETUP DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
-STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "ReactOS "
-FONT 8, "MS Shell Dlg", 0, 0, 0x0
-BEGIN
- ICON IDI_REACTOS,-1,PROPSHEETPADDING,6,16,16
- LTEXT "",-1,36,7,PROPSHEETWIDTH-48,22
-END
-
IDD_FIRSTPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "½"
@@ -126,51 +48,10 @@ BEGIN
LTEXT "ɡݷʽ", -1, 118, 97, 178, 17
END
-IDD_INFORMATION DIALOGEX 5, 100, 269, 218
-STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Ϣ"
-FONT 8, "MS Shell Dlg"
-BEGIN
- EDITTEXT IDS_INFO_DISPNAME, PROPSHEETPADDING, 6, 258, 15, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "עˣ", -1, PROPSHEETPADDING, 27, 97, 8
- EDITTEXT IDS_INFO_REGOWNER, PROPSHEETPADDING+97, 25, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "ƷID", -1, PROPSHEETPADDING, 44, 97, 8
- EDITTEXT IDS_INFO_PRODUCTID, PROPSHEETPADDING+97, 42, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "̣", -1, PROPSHEETPADDING, 61, 97, 8
- EDITTEXT IDS_INFO_PUBLISHER, PROPSHEETPADDING+97, 59, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "汾", -1, PROPSHEETPADDING, 78, 97, 8
- EDITTEXT IDS_INFO_VERSION, PROPSHEETPADDING+97, 76, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "ϵˣ", -1, PROPSHEETPADDING, 95, 97, 8
- EDITTEXT IDS_INFO_CONTACT, PROPSHEETPADDING+97, 93, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "֧Ϣ", -1, PROPSHEETPADDING, 112, 97, 8
- EDITTEXT IDS_INFO_SUPPORTINFO, PROPSHEETPADDING+97, 110, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "ֵ֧绰", -1, PROPSHEETPADDING, 129, 97, 8
- EDITTEXT IDS_INFO_SUPPORTPHONE, PROPSHEETPADDING+97, 127, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "Ʒ£", -1, PROPSHEETPADDING, 146, 97, 8
- EDITTEXT IDS_INFO_PRODUCT_UPDATES, PROPSHEETPADDING+97, 144, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "ļ", -1, PROPSHEETPADDING, 163, 97, 8
- EDITTEXT IDS_INFO_README, PROPSHEETPADDING+97, 161, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- LTEXT "ע", -1, PROPSHEETPADDING, 180, 97, 8
- EDITTEXT IDS_INFO_COMMENTS, PROPSHEETPADDING+97, 178, 160, 14, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP
- PUSHBUTTON "ر(&C)", IDCANCEL, 212, 198, 50, 14
-END
-
STRINGTABLE
BEGIN
IDS_CPLSYSTEMNAME "/ɾ"
IDS_CPLSYSTEMDESCRIPTION "óͿݷʽ"
- IDS_ERROR ""
- IDS_UNABLEREAD_UNINSTSTR "ȡжַĿЧMSI Installer"
- IDS_UNABLEOPEN_UNINSTKEY "жؼ"
- IDS_APPLIST "Ѱװ"
- IDS_UPDATESLIST "Ѱװ"
- IDS_LARGEICONS "ͼ"
- IDS_LIST "б"
- IDS_DETAILS "ϸ"
IDS_CREATE_SHORTCUT "ݷʽ"
IDS_ERROR_NOT_FOUND "Ҳļ %s"
- IDS_UNABLEREAD_INFORMATION "Ϣ"
- IDS_NO_INFORMATION "Ϣ"
- IDS_NONE_APP "Ѱװ"
- IDS_NONE_UPD "Ѱװ¡"
END
diff --git a/reactos/dll/cpl/appwiz/remove.c b/reactos/dll/cpl/appwiz/remove.c
deleted file mode 100644
index 0ca41030351..00000000000
--- a/reactos/dll/cpl/appwiz/remove.c
+++ /dev/null
@@ -1,621 +0,0 @@
-/*
- * ReactOS
- * Copyright (C) 2004 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-/*
- *
- * PROJECT: ReactOS Software Control Panel
- * FILE: dll/cpl/appwiz/remove.c
- * PURPOSE: ReactOS Software Control Panel
- * PROGRAMMERS: Gero Kuehn (reactos.filter@gkware.com)
- * Dmitry Chapyshev (lentind@yandex.ru)
- * UPDATE HISTORY:
- * 06-17-2004 Created
- * 09-25-2007 Modify
- */
-
-#include "appwiz.h"
-
-HWND InfoDialog;
-
-BOOL
-GetInfoItem(HWND hwndDlg, HKEY hKey, LPCTSTR RegName, UINT Control)
-{
- DWORD dwSize = 1024;
- TCHAR pszInfoString[1024];
-
- if (RegQueryValueEx(hKey,
- RegName,
- NULL,
- NULL,
- (LPBYTE)pszInfoString,
- &dwSize) == ERROR_SUCCESS)
- {
- SendMessage(GetDlgItem(hwndDlg, Control), WM_SETTEXT, -1, (LPARAM)pszInfoString);
- return TRUE;
- }
- else
- {
- dwSize = 1024;
- LoadString(hApplet, IDS_NO_INFORMATION, pszInfoString, sizeof(pszInfoString) / sizeof(TCHAR));
- SendMessage(GetDlgItem(hwndDlg, Control), WM_SETTEXT, -1, (LPARAM)pszInfoString);
- return FALSE;
- }
-}
-
-VOID
-CallInformation(HWND hwndDlg, HWND infDlg, UINT Control)
-{
- INT nIndex;
- HKEY hKey;
- TCHAR Buf[256],Title[256];
-
- nIndex = (INT)SendMessage(GetDlgItem(infDlg, Control),LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
- if (nIndex != -1)
- {
- LVITEM item;
-
- ZeroMemory(&item, sizeof(LVITEM));
- item.mask = LVIF_PARAM;
- item.iItem = nIndex;
- (void)ListView_GetItem(GetDlgItem(infDlg,Control),&item);
- hKey = (HKEY)item.lParam;
-
- if (!GetInfoItem(hwndDlg, hKey, L"DisplayName", IDS_INFO_DISPNAME))
- {
- LoadString(hApplet, IDS_UNABLEREAD_INFORMATION, Buf, sizeof(Buf) / sizeof(TCHAR));
- LoadString(hApplet, IDS_ERROR, Title, sizeof(Title) / sizeof(TCHAR));
- MessageBox(hwndDlg,
- Buf,
- Title,
- MB_ICONSTOP);
- return;
- }
-
- (void)GetInfoItem(hwndDlg, hKey, L"RegOwner", IDS_INFO_REGOWNER);
- (void)GetInfoItem(hwndDlg, hKey, L"ProductID", IDS_INFO_PRODUCTID);
- (void)GetInfoItem(hwndDlg, hKey, L"Publisher", IDS_INFO_PUBLISHER);
- (void)GetInfoItem(hwndDlg, hKey, L"DisplayVersion", IDS_INFO_VERSION);
- (void)GetInfoItem(hwndDlg, hKey, L"Contact", IDS_INFO_CONTACT);
- (void)GetInfoItem(hwndDlg, hKey, L"HelpLink", IDS_INFO_SUPPORTINFO);
- (void)GetInfoItem(hwndDlg, hKey, L"HelpTelephone", IDS_INFO_SUPPORTPHONE);
- (void)GetInfoItem(hwndDlg, hKey, L"URLUpdateInfo", IDS_INFO_PRODUCT_UPDATES);
- (void)GetInfoItem(hwndDlg, hKey, L"Readme", IDS_INFO_README);
- (void)GetInfoItem(hwndDlg, hKey, L"Comments", IDS_INFO_COMMENTS);
- }
-}
-
-VOID
-CallUninstall(HWND hwndDlg, UINT Control, UINT RemBtn, UINT InfoBtn, BOOL isUpdate)
-{
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
- INT nIndex;
- HKEY hKey;
- DWORD dwType, dwRet;
- TCHAR pszUninstallString[MAX_PATH];
- DWORD dwSize;
- TCHAR Buf[256],Title[256];
- MSG msg;
-
- nIndex = (INT)SendMessage(GetDlgItem(hwndDlg, Control),LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
- if (nIndex != -1)
- {
- LVITEM item;
-
- ZeroMemory(&item, sizeof(LVITEM));
- item.mask = LVIF_PARAM;
- item.iItem = nIndex;
- (void)ListView_GetItem(GetDlgItem(hwndDlg,Control),&item);
- hKey = (HKEY)item.lParam;
-
- dwType = REG_SZ;
- dwSize = MAX_PATH;
- if (RegQueryValueEx(hKey,
- _TEXT("UninstallString"),
- NULL,
- &dwType,
- (LPBYTE)pszUninstallString,
- &dwSize) == ERROR_SUCCESS)
- {
- ZeroMemory(&si, sizeof(si));
- si.cb = sizeof(si);
- si.wShowWindow = SW_SHOW;
- if (CreateProcess(NULL,pszUninstallString,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
- {
- CloseHandle(pi.hThread);
- EnableWindow(GetParent(hwndDlg), FALSE);
- ButtonStatus(hwndDlg, FALSE, RemBtn, InfoBtn);
-
- for (;;)
- {
- dwRet = MsgWaitForMultipleObjects(1, &pi.hProcess, FALSE, INFINITE, QS_ALLEVENTS);
- if (dwRet == WAIT_OBJECT_0 + 1)
- {
- while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- else if (dwRet == WAIT_OBJECT_0 || dwRet == WAIT_FAILED)
- break;
-
- }
- CloseHandle(pi.hProcess);
- EnableWindow(GetParent(hwndDlg), TRUE);
-
- // Update software list
- (void)ListView_DeleteAllItems(GetDlgItem(hwndDlg, Control));
- FillSoftwareList(hwndDlg, isUpdate, Control);
- }
- }
- else
- {
- LoadString(hApplet, IDS_UNABLEREAD_UNINSTSTR, Buf, sizeof(Buf) / sizeof(TCHAR));
- LoadString(hApplet, IDS_ERROR, Title, sizeof(Title) / sizeof(TCHAR));
- MessageBox(hwndDlg,
- Buf,
- Title,
- MB_ICONSTOP);
- }
- }
-}
-
-VOID
-AddListColumn(HWND hList, LPTSTR Caption)
-{
- LV_COLUMN dummy;
- RECT rect;
-
- GetClientRect(hList, &rect);
- ZeroMemory(&dummy, sizeof(LV_COLUMN));
- dummy.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
- dummy.iSubItem = 0;
- dummy.pszText = Caption;
- dummy.cx = rect.right - rect.left - GetSystemMetrics(SM_CXVSCROLL);
- (void)ListView_InsertColumn(hList, 0, &dummy);
-}
-
-static VOID
-AddItemToList(HWND hwndDlg, LPARAM hSubKey, LPTSTR pszDisplayName, INT ItemIndex, UINT Control)
-{
- int index;
- HIMAGELIST hImgListSmall;
- HIMAGELIST hImgListLarge;
- HICON hIcon;
- HWND hList;
- LV_ITEM listItem;
- int ColorDepth;
- DEVMODE pDevMode;
-
- /* Icon drawing mode */
- pDevMode.dmSize = sizeof(DEVMODE);
- pDevMode.dmDriverExtra = 0;
- EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&pDevMode);
- switch (pDevMode.dmBitsPerPel)
- {
- case 32: ColorDepth = ILC_COLOR32; break;
- case 24: ColorDepth = ILC_COLOR24; break;
- case 16: ColorDepth = ILC_COLOR16; break;
- case 8: ColorDepth = ILC_COLOR8; break;
- case 4: ColorDepth = ILC_COLOR4; break;
- default: ColorDepth = ILC_COLOR; break;
- }
-
- hImgListSmall = ImageList_Create(16,16,ColorDepth | ILC_MASK,5,5);
- hImgListLarge = ImageList_Create(32,32,ColorDepth | ILC_MASK,5,5);
-
- hIcon = LoadImage(hApplet,MAKEINTRESOURCE(IDI_CPLSYSTEM),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
- index = ImageList_AddIcon(hImgListSmall,hIcon);
- DestroyIcon(hIcon);
- hIcon = LoadImage(hApplet,MAKEINTRESOURCE(IDI_CPLSYSTEM),IMAGE_ICON,32,32,LR_DEFAULTCOLOR);
- ImageList_AddIcon(hImgListLarge,hIcon);
- DestroyIcon(hIcon);
-
- hList = GetDlgItem(hwndDlg, Control);
-
- ZeroMemory(&listItem, sizeof(LV_ITEM));
- listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
- listItem.pszText = (LPTSTR)pszDisplayName;
- listItem.lParam = (LPARAM)hSubKey;
- listItem.iItem = (int)ItemIndex;
- listItem.iImage = index;
- (void)ListView_InsertItem(hList, &listItem);
-
- (void)ListView_SetImageList(hList,hImgListSmall,LVSIL_SMALL);
- (void)ListView_SetImageList(hList,hImgListLarge,LVSIL_NORMAL);
-}
-
-VOID
-SetNoneAppMsg(HWND hwndDlg, BOOL IsUpdates)
-{
- TCHAR Buf[256];
-
- if (IsUpdates)
- {
- LoadString(hApplet, IDS_NONE_UPD, Buf, sizeof(Buf) / sizeof(TCHAR));
- AddItemToList(hwndDlg, -1, (LPTSTR)Buf, 0, IDC_UPDATESLIST);
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPD_FIND_EDIT),FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPD_VIEW_COMBO),FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATESLIST),FALSE);
- }
- else
- {
- LoadString(hApplet, IDS_NONE_APP, Buf, sizeof(Buf) / sizeof(TCHAR));
- AddItemToList(hwndDlg, -1, (LPTSTR)Buf, 0, IDC_SOFTWARELIST);
- EnableWindow(GetDlgItem(hwndDlg, IDC_FIND_EDIT),FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_VIEW_COMBO),FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_SOFTWARELIST),FALSE);
- }
-}
-
-VOID
-FillSoftwareList(HWND hwndDlg, BOOL bShowUpdates, UINT Control)
-{
- TCHAR pszName[MAX_PATH];
- TCHAR pszDisplayName[MAX_PATH];
- TCHAR pszParentKeyName[MAX_PATH];
- FILETIME FileTime;
- HKEY hKey;
- HKEY hSubKey;
- DWORD dwType;
- DWORD dwSize = MAX_PATH;
- DWORD dwValue = 0;
- BOOL bIsUpdate = FALSE;
- BOOL bIsSystemComponent = FALSE;
- INT ItemIndex = 0;
- TCHAR Buf[256],Title[256];
- BOOL IsAdd = FALSE;
-
- if (RegOpenKey(HKEY_LOCAL_MACHINE,
- TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"),
- &hKey) != ERROR_SUCCESS)
- {
- LoadString(hApplet, IDS_UNABLEOPEN_UNINSTKEY, Buf, sizeof(Buf) / sizeof(TCHAR));
- LoadString(hApplet, IDS_ERROR, Title, sizeof(Title) / sizeof(TCHAR));
- MessageBox(hwndDlg,
- Buf,
- Title,
- MB_ICONSTOP);
- return;
- }
-
- ItemIndex = 0;
- dwSize = MAX_PATH;
- while (RegEnumKeyEx(hKey, ItemIndex, pszName, &dwSize, NULL, NULL, NULL, &FileTime) == ERROR_SUCCESS)
- {
- if (RegOpenKey(hKey,pszName,&hSubKey) == ERROR_SUCCESS)
- {
- dwType = REG_DWORD;
- dwSize = sizeof(DWORD);
- if (RegQueryValueEx(hSubKey,
- TEXT("SystemComponent"),
- NULL,
- &dwType,
- (LPBYTE)&dwValue,
- &dwSize) == ERROR_SUCCESS)
- {
- bIsSystemComponent = (dwValue == 0x1);
- }
- else
- {
- bIsSystemComponent = FALSE;
- }
-
- dwType = REG_SZ;
- dwSize = MAX_PATH;
- bIsUpdate = (RegQueryValueEx(hSubKey,
- TEXT("ParentKeyName"),
- NULL,
- &dwType,
- (LPBYTE)pszParentKeyName,
- &dwSize) == ERROR_SUCCESS);
- dwSize = MAX_PATH;
- if (RegQueryValueEx(hSubKey,
- TEXT("DisplayName"),
- NULL,
- &dwType,
- (LPBYTE)pszDisplayName,
- &dwSize) == ERROR_SUCCESS)
- {
- if ((!bIsUpdate) && (!bIsSystemComponent) && (!bShowUpdates))
- {
- AddItemToList(hwndDlg, (LPARAM)hSubKey, (LPTSTR)pszDisplayName, ItemIndex, Control);
- IsAdd = TRUE;
- }
- else if (bIsUpdate && bShowUpdates)
- {
- AddItemToList(hwndDlg, (LPARAM)hSubKey, (LPTSTR)pszDisplayName, ItemIndex, Control);
- IsAdd = TRUE;
- }
- }
- }
-
- dwSize = MAX_PATH;
- ItemIndex++;
- }
-
- RegCloseKey(hKey);
-
- if (!IsAdd) SetNoneAppMsg(hwndDlg, bShowUpdates);
-
-}
-
-VOID
-AddItemsToViewControl(HWND hwndDlg, UINT Control)
-{
- TCHAR Buf[256];
- int Index;
- HWND hList;
-
- hList = GetDlgItem(hwndDlg, Control);
- // Large Icons
- LoadString(hApplet, IDS_LARGEICONS, Buf, sizeof(Buf) / sizeof(TCHAR));
- Index = (int)SendMessage(hList,
- CB_ADDSTRING,
- 0,
- (LPARAM)Buf);
- SendMessage(hList,
- CB_SETITEMDATA,
- Index,
- (LPARAM)Index);
- // List
- LoadString(hApplet, IDS_LIST, Buf, sizeof(Buf) / sizeof(TCHAR));
- Index = (int)SendMessage(hList,
- CB_ADDSTRING,
- 0,
- (LPARAM)Buf);
- SendMessage(hList,
- CB_SETITEMDATA,
- Index,
- (LPARAM)Index);
- // Details
- LoadString(hApplet, IDS_DETAILS, Buf, sizeof(Buf) / sizeof(TCHAR));
- Index = (int)SendMessage(hList,
- CB_ADDSTRING,
- 0,
- (LPARAM)Buf);
- SendMessage(hList,
- CB_SETITEMDATA,
- Index,
- (LPARAM)Index);
-
- // Select string
- SendMessage(hList,
- CB_SELECTSTRING,
- -1,
- (LPARAM)Buf);
-}
-
-VOID
-FindItems(HWND hwndDlg, UINT ListControl, UINT EditControl, UINT RemBtn, UINT InfoBtn)
-{
- HWND hList;
- HWND hEdit;
- TCHAR szText[1024], szItemText[1024];
- INT Index;
- size_t i;
- LV_ITEM listItem;
- BOOL comp = TRUE;
-
- hList = GetDlgItem(hwndDlg, ListControl);
- hEdit = GetDlgItem(hwndDlg, EditControl);
-
- SendMessage(hEdit, WM_GETTEXT, 128, (LPARAM)szText);
-
- ZeroMemory(&listItem, sizeof(LV_ITEM));
- listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
- listItem.pszText = (LPTSTR)szText;
- listItem.iImage = -1;
- Index = ListView_InsertItem(hList, &listItem);
-
- SendMessage(hList, LVM_DELETEITEM, Index, 0);
- ListView_GetItemText(hList, Index, 0, (LPTSTR)szItemText, 1024);
-
- for (i = 0; i < _tcslen(szText); i++)
- {
- if (szText[i] != szItemText[i]) comp = FALSE;
- }
- ListView_SetItemState(hList, Index, LVIS_SELECTED | LVIS_FOCUSED, -1);
- if (comp)
- ButtonStatus(hwndDlg, TRUE, RemBtn, InfoBtn);
- else
- ButtonStatus(hwndDlg, FALSE, RemBtn, InfoBtn);
-}
-
-VOID
-GetCurrentView(HWND hwndDlg, UINT ViewControl, UINT ListControl)
-{
- int nCurrSel;
- nCurrSel = (int)SendMessage(GetDlgItem(hwndDlg, ViewControl),
- CB_GETCURSEL,
- (WPARAM)0,
- (LPARAM)0);
- switch (nCurrSel)
- {
- case 0:
- SetWindowLongPtr(GetDlgItem(hwndDlg, ListControl),
- GWL_STYLE, LVS_ICON | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP);
- break;
- case 1:
- SetWindowLongPtr(GetDlgItem(hwndDlg, ListControl),
- GWL_STYLE,LVS_LIST | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP);
- break;
- case 2:
- SetWindowLongPtr(GetDlgItem(hwndDlg, ListControl),
- GWL_STYLE,LVS_REPORT | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP);
- break;
- }
-}
-
-VOID
-ShowPopupMenu(HWND hwndDlg, UINT ResMenu, INT xPos, INT yPos, UINT Control)
-{
- INT nIndex;
- nIndex = (INT)SendMessage(GetDlgItem(hwndDlg, Control),LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
- if ( nIndex != -1)
- {
- POINT pt;
- RECT lvRect;
- HMENU hMenu;
-
- GetCursorPos(&pt);
-
- GetWindowRect(GetDlgItem(hwndDlg, Control), &lvRect);
- if (PtInRect(&lvRect, pt))
- {
- hMenu = GetSubMenu(LoadMenu(hApplet, MAKEINTRESOURCE(ResMenu)),0);
- TrackPopupMenuEx(hMenu,
- TPM_RIGHTBUTTON,
- xPos,
- yPos,
- hwndDlg,
- NULL);
- DestroyMenu(hMenu);
- }
- }
-}
-
-static
-INT_PTR CALLBACK
-InfoPropDlgProc(HWND hDlg,
- UINT message,
- WPARAM wParam,
- LPARAM lParam)
-{
- UNREFERENCED_PARAMETER(lParam);
-
- switch (message)
- {
- case WM_INITDIALOG:
- {
- CallInformation(hDlg, InfoDialog, IDC_SOFTWARELIST);
- }
- case WM_COMMAND:
- {
- switch (LOWORD(wParam))
- {
- case IDCANCEL:
- EndDialog(hDlg,LOWORD(wParam));
- break;
- }
- }
- break;
- }
-
- return FALSE;
-}
-
-BOOL
-IsItemSelected(HWND hwndDlg, UINT Control)
-{
- INT nIndex;
- nIndex = (INT)SendMessage(GetDlgItem(hwndDlg, Control),LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
- if (nIndex != -1) return TRUE;
- return FALSE;
-}
-
-VOID
-ButtonStatus(HWND hwndDlg, BOOL Status, UINT RemBtn, UINT InfoBtn)
-{
- EnableWindow(GetDlgItem(hwndDlg, RemBtn),Status);
- EnableWindow(GetDlgItem(hwndDlg, InfoBtn),Status);
-}
-
-/* Property page dialog callback */
-INT_PTR CALLBACK
-RemovePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- TCHAR Buf[256];
- UNREFERENCED_PARAMETER(lParam);
-
- switch (uMsg)
- {
- case WM_INITDIALOG:
- AddItemsToViewControl(hwndDlg, IDC_VIEW_COMBO);
- LoadString(hApplet, IDS_APPLIST, Buf, sizeof(Buf) / sizeof(TCHAR));
- AddListColumn(GetDlgItem(hwndDlg, IDC_SOFTWARELIST),Buf);
- FillSoftwareList(hwndDlg, FALSE, IDC_SOFTWARELIST);
- InfoDialog = hwndDlg;
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam))
- {
- case IDC_FIND_EDIT:
- if (HIWORD(wParam) == EN_CHANGE)
- {
- FindItems(hwndDlg,IDC_SOFTWARELIST,IDC_FIND_EDIT,IDC_ADDREMOVE,IDC_INFO_BUTTON);
- }
- break;
- case ID_APP_MODIFYREMOVE:
- case IDC_ADDREMOVE:
- CallUninstall(hwndDlg, IDC_SOFTWARELIST, IDC_ADDREMOVE, IDC_INFO_BUTTON, FALSE);
- break;
- case ID_APP_INFORMATION:
- case IDC_INFO_BUTTON:
- {
- if (IsItemSelected(hwndDlg, IDC_SOFTWARELIST))
- DialogBox(hApplet,
- MAKEINTRESOURCE(IDD_INFORMATION),
- hwndDlg,
- InfoPropDlgProc);
- }
- break;
- case IDC_VIEW_COMBO:
- if (HIWORD(wParam) == CBN_SELCHANGE)
- GetCurrentView(hwndDlg, IDC_VIEW_COMBO, IDC_SOFTWARELIST);
- break;
- }
- break;
- case WM_NOTIFY:
- {
- switch (LOWORD(wParam))
- {
- case IDC_SOFTWARELIST:
- switch (((LPNMHDR)lParam)->code)
- {
- case NM_DBLCLK:
- CallUninstall(hwndDlg, IDC_SOFTWARELIST, IDC_ADDREMOVE, IDC_INFO_BUTTON, FALSE);
- break;
- case NM_CLICK:
- {
- if (!IsItemSelected(hwndDlg, IDC_SOFTWARELIST))
- ButtonStatus(hwndDlg, FALSE, IDC_ADDREMOVE, IDC_INFO_BUTTON);
- else
- ButtonStatus(hwndDlg, TRUE, IDC_ADDREMOVE, IDC_INFO_BUTTON);
- }
- break;
- }
- break;
- }
- }
- break;
- case WM_CONTEXTMENU:
- {
- ShowPopupMenu(hwndDlg,
- IDR_POPUP_APP,
- GET_X_LPARAM(lParam),
- GET_Y_LPARAM(lParam),
- IDC_SOFTWARELIST);
- }
- break;
- }
-
- return FALSE;
-}
diff --git a/reactos/dll/cpl/appwiz/resource.h b/reactos/dll/cpl/appwiz/resource.h
index 430f11324c4..e889fafe2f6 100644
--- a/reactos/dll/cpl/appwiz/resource.h
+++ b/reactos/dll/cpl/appwiz/resource.h
@@ -5,11 +5,6 @@
#define PROPSHEETWIDTH 380
#define PROPSHEETHEIGHT 228
#define PROPSHEETPADDING 6
-#define SYSTEM_COLUMN (0 * PROPSHEETPADDING)
-// this is not supported by the MS Resource compiler:
-//#define LABELLINE(x) 0 //(((PROPSHEETPADDING + 2) * x) + (x + 2))
-
-#define ICONSIZE 16
/* icons */
#define IDI_CPLSYSTEM 1500
@@ -18,26 +13,10 @@
#define IDI_RECBINICO 1503
#define IDI_DOWNLOADICO 1504
#define IDI_APPINETICO 1505
-#define IDI_UPDATES 1506
-#define IDI_REACTOS 1507
-
-/* menus */
-#define IDR_POPUP_APP 3000
-#define IDR_POPUP_UPD 3001
-
-#define ID_APP_MODIFYREMOVE 3500
-#define ID_APP_INFORMATION 3501
-#define ID_UPD_REMOVE 3502
-#define ID_UPD_INFORMATION 3503
/* dialogs */
-#define IDD_PROPPAGEINSTALL 200
-#define IDD_PROPPAGEROSSETUP 201
-#define IDD_PROPPAGEADD 202
#define IDD_SHORTCUT_LOCATION 203
#define IDD_SHORTCUT_FINISH 204
-#define IDD_PROPPAGEUPDATES 205
-#define IDD_INFORMATION 206
/* bitmaps */
#define IDB_WATERMARK 5001
@@ -45,50 +24,13 @@
/* strings */
#define IDS_CPLSYSTEMNAME 1001
#define IDS_CPLSYSTEMDESCRIPTION 2001
-#define IDS_ERROR 2002
-#define IDS_UNABLEREAD_UNINSTSTR 2003
-#define IDS_UNABLEOPEN_UNINSTKEY 2004
-#define IDS_APPLIST 2005
-#define IDS_LARGEICONS 2006
-#define IDS_LIST 2007
-#define IDS_DETAILS 2008
-#define IDS_UPDATESLIST 2009
-#define IDS_INFO_DISPNAME 2010
-#define IDS_INFO_PUBLISHER 2011
-#define IDS_INFO_VERSION 2012
-#define IDS_INFO_CONTACT 2013
-#define IDS_INFO_SUPPORTINFO 2014
-#define IDS_INFO_SUPPORTPHONE 2015
-#define IDS_INFO_PRODUCT_UPDATES 2016
-#define IDS_INFO_COMMENTS 2017
-#define IDS_INFO_REGOWNER 2018
-#define IDS_INFO_PRODUCTID 2019
-#define IDS_INFO_README 2020
#define IDS_CREATE_SHORTCUT 2021
#define IDS_ERROR_NOT_FOUND 2022
-#define IDS_UNABLEREAD_INFORMATION 2023
-#define IDS_NO_INFORMATION 2024
-#define IDS_NONE_APP 2025
-#define IDS_NONE_UPD 2026
/* controls */
-#define IDC_INSTALL 101
-#define IDC_SOFTWARELIST 102
-#define IDC_ADDREMOVE 103
-#define IDC_FIND_EDIT 104
-#define IDC_INFO_BUTTON 105
-#define IDC_VIEW_COMBO 106
#define IDC_SHORTCUT_LOCATION 107
#define IDC_SHORTCUT_BROWSE 108
#define IDC_SHORTCUT_NAME 109
-#define IDC_ADD_DOWNLOAD_BUTTON 110
-#define IDC_ADD_FIND_BUTTON 111
-#define IDC_ADD_PROP_BUTTON 112
-#define IDC_UPD_VIEW_COMBO 113
-#define IDC_UPDATESLIST 114
-#define IDC_UPD_FIND_EDIT 115
-#define IDC_UPD_REMOVE 116
-#define IDC_UPD_INFO_BUTTON 117
#endif /* __CPL_RESOURCE_H */
diff --git a/reactos/dll/cpl/appwiz/resources/reactos.ico b/reactos/dll/cpl/appwiz/resources/reactos.ico
deleted file mode 100644
index dd7881716ae..00000000000
Binary files a/reactos/dll/cpl/appwiz/resources/reactos.ico and /dev/null differ
diff --git a/reactos/dll/cpl/appwiz/resources/updates.ico b/reactos/dll/cpl/appwiz/resources/updates.ico
deleted file mode 100644
index 82b4a1f986a..00000000000
Binary files a/reactos/dll/cpl/appwiz/resources/updates.ico and /dev/null differ
diff --git a/reactos/dll/cpl/appwiz/rossetup.c b/reactos/dll/cpl/appwiz/rossetup.c
deleted file mode 100644
index 8f2e5314f29..00000000000
--- a/reactos/dll/cpl/appwiz/rossetup.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * ReactOS
- * Copyright (C) 2004 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-/*
- *
- * PROJECT: ReactOS Software Control Panel
- * FILE: dll/cpl/appwiz/rossetup.c
- * PURPOSE: ReactOS Software Control Panel
- * PROGRAMMERS: Gero Kuehn (reactos.filter@gkware.com)
- * Dmitry Chapyshev (lentind@yandex.ru)
- * UPDATE HISTORY:
- * 06-17-2004 Created
- * 09-25-2007 Modify
- */
-
-#include "appwiz.h"
-
-
-/* Property page dialog callback */
-INT_PTR CALLBACK
-RosPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- UNREFERENCED_PARAMETER(lParam);
- UNREFERENCED_PARAMETER(wParam);
- UNREFERENCED_PARAMETER(hwndDlg);
-
- switch (uMsg)
- {
- case WM_INITDIALOG:
- break;
- }
-
- return FALSE;
-}
diff --git a/reactos/dll/cpl/appwiz/updates.c b/reactos/dll/cpl/appwiz/updates.c
deleted file mode 100644
index 5d79985f121..00000000000
--- a/reactos/dll/cpl/appwiz/updates.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * ReactOS
- * Copyright (C) 2004 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-/*
- *
- * PROJECT: ReactOS Software Control Panel
- * FILE: dll/cpl/appwiz/updates.c
- * PURPOSE: ReactOS Software Control Panel
- * PROGRAMMERS: Gero Kuehn (reactos.filter@gkware.com)
- * Dmitry Chapyshev (lentind@yandex.ru)
- * UPDATE HISTORY:
- * 06-17-2004 Created
- * 09-25-2007 Modify
- */
-
-#include "appwiz.h"
-
-HWND UpdInfoDialog;
-
-static
-INT_PTR CALLBACK
-InfoPropDlgProc(HWND hDlg,
- UINT message,
- WPARAM wParam,
- LPARAM lParam)
-{
- UNREFERENCED_PARAMETER(lParam);
-
- switch (message)
- {
- case WM_INITDIALOG:
- {
- CallInformation(hDlg, UpdInfoDialog, IDC_UPDATESLIST);
- }
- case WM_COMMAND:
- {
- switch (LOWORD(wParam))
- {
- case IDCANCEL:
- EndDialog(hDlg,LOWORD(wParam));
- break;
- }
- }
- break;
- }
-
- return FALSE;
-}
-
-/* Property page dialog callback */
-INT_PTR CALLBACK
-UpdatesPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- TCHAR Buf[256];
-
- UNREFERENCED_PARAMETER(lParam);
- UNREFERENCED_PARAMETER(wParam);
- UNREFERENCED_PARAMETER(hwndDlg);
-
- switch (uMsg)
- {
- case WM_INITDIALOG:
- AddItemsToViewControl(hwndDlg, IDC_UPD_VIEW_COMBO);
- LoadString(hApplet, IDS_UPDATESLIST, Buf, sizeof(Buf) / sizeof(TCHAR));
- AddListColumn(GetDlgItem(hwndDlg, IDC_UPDATESLIST),Buf);
- FillSoftwareList(hwndDlg, TRUE, IDC_UPDATESLIST);
- UpdInfoDialog = hwndDlg;
- break;
- case WM_COMMAND:
- switch (LOWORD(wParam))
- {
- case IDC_UPD_FIND_EDIT:
- if (HIWORD(wParam) == EN_CHANGE)
- {
- FindItems(hwndDlg,IDC_UPDATESLIST,IDC_UPD_FIND_EDIT,IDC_UPD_REMOVE,IDC_UPD_INFO_BUTTON);
- }
- break;
- case ID_UPD_INFORMATION:
- case IDC_UPD_INFO_BUTTON:
- {
- if (IsItemSelected(hwndDlg, IDC_SOFTWARELIST))
- DialogBox(hApplet,
- MAKEINTRESOURCE(IDD_INFORMATION),
- hwndDlg,
- InfoPropDlgProc);
- }
- break;
- case ID_UPD_REMOVE:
- case IDC_UPD_REMOVE:
- CallUninstall(hwndDlg, IDC_UPDATESLIST, IDC_UPD_REMOVE, IDC_UPD_INFO_BUTTON, TRUE);
- break;
- case IDC_UPD_VIEW_COMBO:
- if (HIWORD(wParam) == CBN_SELCHANGE)
- GetCurrentView(hwndDlg, IDC_UPD_VIEW_COMBO, IDC_UPDATESLIST);
- break;
- }
- break;
- case WM_NOTIFY:
- switch (LOWORD(wParam))
- {
- case IDC_UPDATESLIST:
- switch (((LPNMHDR)lParam)->code)
- {
- case NM_DBLCLK:
- CallUninstall(hwndDlg, IDC_UPDATESLIST, IDC_UPD_REMOVE, IDC_UPD_INFO_BUTTON, TRUE);
- break;
- case NM_CLICK:
- ButtonStatus(hwndDlg, (IsItemSelected(hwndDlg, IDC_UPDATESLIST)), IDC_UPD_REMOVE, IDC_UPD_INFO_BUTTON);
- break;
- }
- break;
- }
- break;
- case WM_CONTEXTMENU:
- {
- ShowPopupMenu(hwndDlg,
- IDR_POPUP_UPD,
- GET_X_LPARAM(lParam),
- GET_Y_LPARAM(lParam),
- IDC_UPDATESLIST);
- }
- break;
- }
-
- return FALSE;
-}
diff --git a/reactos/dll/cpl/cpl.rbuild b/reactos/dll/cpl/cpl.rbuild
index afe420991bd..95c9c19850e 100644
--- a/reactos/dll/cpl/cpl.rbuild
+++ b/reactos/dll/cpl/cpl.rbuild
@@ -7,9 +7,6 @@
-
-
-
diff --git a/reactos/dll/cpl/desk/preview.c b/reactos/dll/cpl/desk/preview.c
index bee6ac10f2c..1f2cdb222f0 100644
--- a/reactos/dll/cpl/desk/preview.c
+++ b/reactos/dll/cpl/desk/preview.c
@@ -332,7 +332,7 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
hUser32 = LoadLibrary(_T("user32.dll"));
if(hUser32 == NULL)
- return FALSE;
+ return;
DrawCaptionTemp = (DCT_PROC)GetProcAddress(hUser32, (LPCSTR)DCT_ORD);
DrawMenuBarTemp = (DMBT_PROC)GetProcAddress(hUser32, (LPCSTR)DMBT_ORD);
diff --git a/reactos/dll/cpl/desk/settings.c b/reactos/dll/cpl/desk/settings.c
index 5b05d377bd4..1ede0e78fce 100644
--- a/reactos/dll/cpl/desk/settings.c
+++ b/reactos/dll/cpl/desk/settings.c
@@ -626,11 +626,10 @@ INT_PTR CALLBACK
SettingsPageProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
{
PGLOBAL_DATA pGlobalData;
+ TCHAR Message[1024], Title[256];
pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
- TCHAR Message[1024], Title[256];
-
switch(uMsg)
{
case WM_INITDIALOG:
diff --git a/reactos/dll/cpl/input/add.c b/reactos/dll/cpl/input/add.c
index 5eaaddb89c8..20849f16ca8 100644
--- a/reactos/dll/cpl/input/add.c
+++ b/reactos/dll/cpl/input/add.c
@@ -188,9 +188,11 @@ CreateKeyboardLayoutList(HWND hItemsList)
while (RegEnumKeyEx(hKey, dwIndex, szLayoutID, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
+ INT iIndex;
+
GetLayoutName(szLayoutID, KeyName);
- INT iIndex = (INT) SendMessage(hItemsList, CB_ADDSTRING, 0, (LPARAM)KeyName);
+ iIndex = (INT) SendMessage(hItemsList, CB_ADDSTRING, 0, (LPARAM)KeyName);
pstrLayoutID = (PTSTR)HeapAlloc(hProcessHeap, 0, sizeof(szLayoutID));
lstrcpy(pstrLayoutID, szLayoutID);
diff --git a/reactos/dll/cpl/input/input.rc b/reactos/dll/cpl/input/input.rc
index bcdbf3a3553..170571835a0 100644
--- a/reactos/dll/cpl/input/input.rc
+++ b/reactos/dll/cpl/input/input.rc
@@ -7,11 +7,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Language Control Panel\0"
#define REACTOS_STR_INTERNAL_NAME "input\0"
#define REACTOS_STR_ORIGINAL_FILENAME "input.dll\0"
-#ifdef _MSC_VER
-#include <../../../reactos/version.rc>
-#else
#include
-#endif
IDI_KEY_SHORT_ICO ICON "resources/keyboard-shortcuts.ico"
diff --git a/reactos/dll/cpl/joy/joy.rc b/reactos/dll/cpl/joy/joy.rc
index 1686e95417f..5a94ebe203e 100644
--- a/reactos/dll/cpl/joy/joy.rc
+++ b/reactos/dll/cpl/joy/joy.rc
@@ -7,11 +7,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Software Control Panel\0"
#define REACTOS_STR_INTERNAL_NAME "joy\0"
#define REACTOS_STR_ORIGINAL_FILENAME "joy.cpl\0"
-#ifdef _MSC_VER
-#include <../../../reactos/version.rc>
-#else
#include
-#endif
IDI_CPLSYSTEM ICON "resources/applet.ico"
diff --git a/reactos/dll/cpl/mmsys/audio.c b/reactos/dll/cpl/mmsys/audio.c
index 778d3dc5d4c..b04707315d5 100644
--- a/reactos/dll/cpl/mmsys/audio.c
+++ b/reactos/dll/cpl/mmsys/audio.c
@@ -23,29 +23,38 @@ InitAudioDlg(HWND hwnd)
WAVEOUTCAPS waveOutputPaps;
WAVEINCAPS waveInputPaps;
MIDIOUTCAPS midiOutCaps;
+ TCHAR szNoDevices[256];
UINT DevsNum;
UINT uIndex;
HWND hCB;
LRESULT Res;
+ LoadString(hApplet, IDS_NO_DEVICES, szNoDevices, sizeof(szNoDevices) / sizeof(TCHAR));
+
// Init sound playback devices list
hCB = GetDlgItem(hwnd, IDC_DEVICE_PLAY_LIST);
DevsNum = waveOutGetNumDevs();
- if (DevsNum < 1) return;
-
- for (uIndex = 0; uIndex < DevsNum; uIndex++)
+ if (DevsNum < 1)
{
- if (waveOutGetDevCaps(uIndex, &waveOutputPaps, sizeof(waveOutputPaps)))
- continue;
-
- Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM) waveOutputPaps.szPname);
-
- if (CB_ERR != Res)
+ Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices);
+ SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
+ }
+ else
+ {
+ for (uIndex = 0; uIndex < DevsNum; uIndex++)
{
- SendMessage(hCB, CB_SETITEMDATA, Res, (LPARAM) uIndex);
- // TODO: Getting default device
- SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
+ if (waveOutGetDevCaps(uIndex, &waveOutputPaps, sizeof(waveOutputPaps)))
+ continue;
+
+ Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM) waveOutputPaps.szPname);
+
+ if (CB_ERR != Res)
+ {
+ SendMessage(hCB, CB_SETITEMDATA, Res, (LPARAM) uIndex);
+ // TODO: Getting default device
+ SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
+ }
}
}
@@ -53,20 +62,26 @@ InitAudioDlg(HWND hwnd)
hCB = GetDlgItem(hwnd, IDC_DEVICE_REC_LIST);
DevsNum = waveInGetNumDevs();
- if (DevsNum < 1) return;
-
- for (uIndex = 0; uIndex < DevsNum; uIndex++)
+ if (DevsNum < 1)
{
- if (waveInGetDevCaps(uIndex, &waveInputPaps, sizeof(waveInputPaps)))
- continue;
-
- Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM) waveInputPaps.szPname);
-
- if (CB_ERR != Res)
+ Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices);
+ SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
+ }
+ else
+ {
+ for (uIndex = 0; uIndex < DevsNum; uIndex++)
{
- SendMessage(hCB, CB_SETITEMDATA, Res, (LPARAM) uIndex);
- // TODO: Getting default device
- SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
+ if (waveInGetDevCaps(uIndex, &waveInputPaps, sizeof(waveInputPaps)))
+ continue;
+
+ Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM) waveInputPaps.szPname);
+
+ if (CB_ERR != Res)
+ {
+ SendMessage(hCB, CB_SETITEMDATA, Res, (LPARAM) uIndex);
+ // TODO: Getting default device
+ SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
+ }
}
}
@@ -74,20 +89,26 @@ InitAudioDlg(HWND hwnd)
hCB = GetDlgItem(hwnd, IDC_DEVICE_MIDI_LIST);
DevsNum = midiOutGetNumDevs();
- if (DevsNum < 1) return;
-
- for (uIndex = 0; uIndex < DevsNum; uIndex++)
+ if (DevsNum < 1)
{
- if (midiOutGetDevCaps(uIndex, &midiOutCaps, sizeof(midiOutCaps)))
- continue;
-
- Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM) midiOutCaps.szPname);
-
- if (CB_ERR != Res)
+ Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM)szNoDevices);
+ SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
+ }
+ else
+ {
+ for (uIndex = 0; uIndex < DevsNum; uIndex++)
{
- SendMessage(hCB, CB_SETITEMDATA, Res, (LPARAM) uIndex);
- // TODO: Getting default device
- SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
+ if (midiOutGetDevCaps(uIndex, &midiOutCaps, sizeof(midiOutCaps)))
+ continue;
+
+ Res = SendMessage(hCB, CB_ADDSTRING, 0, (LPARAM) midiOutCaps.szPname);
+
+ if (CB_ERR != Res)
+ {
+ SendMessage(hCB, CB_SETITEMDATA, Res, (LPARAM) uIndex);
+ // TODO: Getting default device
+ SendMessage(hCB, CB_SETCURSEL, (WPARAM) Res, 0);
+ }
}
}
}
@@ -128,9 +149,10 @@ AudioDlgProc(HWND hwndDlg,
{
case WM_INITDIALOG:
{
- UINT NumWavOut;
+ UINT NumWavOut = waveOutGetNumDevs();
+
+ InitAudioDlg(hwndDlg);
- NumWavOut = waveOutGetNumDevs();
if (!NumWavOut)
{
EnableWindow(GetDlgItem(hwndDlg, IDC_DEVICE_PLAY_LIST), FALSE);
@@ -144,10 +166,6 @@ AudioDlgProc(HWND hwndDlg,
EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME3_BTN), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_ADV3_BTN), FALSE);
}
- else
- {
- InitAudioDlg(hwndDlg);
- }
}
break;
diff --git a/reactos/dll/cpl/mmsys/lang/bg-BG.rc b/reactos/dll/cpl/mmsys/lang/bg-BG.rc
index 0e169f2d67d..13c5395f760 100644
--- a/reactos/dll/cpl/mmsys/lang/bg-BG.rc
+++ b/reactos/dll/cpl/mmsys/lang/bg-BG.rc
@@ -236,6 +236,7 @@ BEGIN
IDS_CPLNAME " "
IDS_CPLDESCRIPTION " ."
IDS_NO_SOUND "()"
+ IDS_NO_DEVICES "No Devices"
5825 " "
5826 " "
@@ -266,4 +267,5 @@ BEGIN
5851 " "
5852 " "
5853 " "
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/cs-CZ.rc b/reactos/dll/cpl/mmsys/lang/cs-CZ.rc
index 314ab2aa0ca..2c2d0e7f69d 100644
--- a/reactos/dll/cpl/mmsys/lang/cs-CZ.rc
+++ b/reactos/dll/cpl/mmsys/lang/cs-CZ.rc
@@ -239,6 +239,7 @@ BEGIN
IDS_CPLNAME "Zvuky a zvukov zazen"
IDS_CPLDESCRIPTION "Uprav zvukov schma Vaeho potae, nebo nastav reproduktory a nahrvac zazen."
IDS_NO_SOUND "(Nen)"
+ IDS_NO_DEVICES "No Devices"
5825 "Chyba programu"
5826 "Ukonen programu"
@@ -269,4 +270,5 @@ BEGIN
5851 "Oteven nabdky Start"
5852 "Odhlen od systmu ReactOS"
5853 "Pihlen k systmu ReactOS"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/de-DE.rc b/reactos/dll/cpl/mmsys/lang/de-DE.rc
index 062d15199ba..cfcfb47cbaf 100644
--- a/reactos/dll/cpl/mmsys/lang/de-DE.rc
+++ b/reactos/dll/cpl/mmsys/lang/de-DE.rc
@@ -234,6 +234,7 @@ BEGIN
IDS_CPLNAME "Sounds und Audio Gerte"
IDS_CPLDESCRIPTION "ndert das Sound-Schema Ihres Computers, oder konfiguriert die Einstellungen fr Ihre Lautsprecher und Aufnahmegerte."
IDS_NO_SOUND "(Kein)"
+ IDS_NO_DEVICES "No Devices"
5825 "Programmfehler"
5826 "Programm schlieen"
@@ -264,4 +265,5 @@ BEGIN
5851 "Startmen"
5852 "ReactOS-Abmeldung"
5853 "ReactOS-Anmeldung"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/el-GR.rc b/reactos/dll/cpl/mmsys/lang/el-GR.rc
index e5522ca17e2..0e8da1d6ab3 100644
--- a/reactos/dll/cpl/mmsys/lang/el-GR.rc
+++ b/reactos/dll/cpl/mmsys/lang/el-GR.rc
@@ -234,6 +234,7 @@ BEGIN
IDS_CPLNAME " "
IDS_CPLDESCRIPTION " ."
IDS_NO_SOUND "(None)"
+ IDS_NO_DEVICES "No Devices"
5825 "Program error"
5826 "Close program"
@@ -264,4 +265,5 @@ BEGIN
5851 "Start Menu"
5852 "ReactOS Logoff"
5853 "ReactOS Logon"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/en-US.rc b/reactos/dll/cpl/mmsys/lang/en-US.rc
index 4d5a700275d..af811c57737 100644
--- a/reactos/dll/cpl/mmsys/lang/en-US.rc
+++ b/reactos/dll/cpl/mmsys/lang/en-US.rc
@@ -6,12 +6,12 @@ CAPTION "Volume"
FONT 8, "MS Shell Dlg"
BEGIN
ICON IDI_CPLICON, IDI_CPLICON, 8,5,32,32
- LTEXT "",IDC_DEVICE_NAME,40,10,194,36
+ LTEXT "",IDC_DEVICE_NAME,40,10,194,20
GROUPBOX "Device volume", -1, 7,30,230,100
CONTROL "", IDC_MUTE_ICON, "Static", SS_ICON | WS_VISIBLE,17,45,32,32
CONTROL "",IDC_VOLUME_TRACKBAR, "msctls_trackbar32", TBS_AUTOTICKS | TBS_ENABLESELRANGE | TBS_BOTTOM | TBS_HORZ | WS_TABSTOP, 65, 45, 140, 14
- LTEXT "Low",-1,62,66,30,17
- LTEXT "High",-1,195,66,30,17
+ LTEXT "Low",-1,62,66,30,9
+ LTEXT "High",-1,195,66,30,9
CHECKBOX "&Mute", IDC_MUTE_CHECKBOX, 50, 78, 140, 10
CHECKBOX "Place volume &icon in the taskbar", IDC_ICON_IN_TASKBAR, 50, 92, 140, 10
PUSHBUTTON "Ad&vanced...", IDC_ADVANCED_BTN, 150,105,75,15
@@ -27,15 +27,15 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Sounds"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "A sound scheme is a set of sounds applied to events to in ReactOS and programs. You can select an existing scheme or save one you have modified.",-1,8,7,230,40
- LTEXT "Sound s&cheme:",-1,8,42,150,17
+ LTEXT "A sound scheme is a set of sounds applied to events to in ReactOS and programs. You can select an existing scheme or save one you have modified.",-1,8,7,230,30
+ LTEXT "Sound s&cheme:",-1,8,42,150,9
COMBOBOX IDC_SOUND_SCHEME, 8, 53, 230, 46, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Sav&e As...", IDC_SAVEAS_BTN, 134,70,50,15
PUSHBUTTON "&Delete", IDC_DELETE_BTN, 188,70,50,15
- LTEXT "To change sounds, click a program event in the following list and then select a sound to apply. You can save the changes as a new sound scheme.",-1,8,90,230,40
- LTEXT "&Program events:",-1,8,118,150,17
+ LTEXT "To change sounds, click a program event in the following list and then select a sound to apply. You can save the changes as a new sound scheme.",-1,8,90,230,27
+ LTEXT "&Program events:",-1,8,118,150,9
CONTROL "", IDC_SCHEME_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, 8, 130, 230, 60, WS_EX_CLIENTEDGE
- LTEXT "&Sounds:",IDC_TEXT_SOUND,8,194,80,17, WS_DISABLED
+ LTEXT "&Sounds:",IDC_TEXT_SOUND,8,194,80,9, WS_DISABLED
COMBOBOX IDC_SOUND_LIST, 8, 205, 155, 146, CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
PUSHBUTTON "", IDC_PLAY_SOUND, 168,205,15,15, WS_DISABLED | BS_ICON
PUSHBUTTON "&Browse...", IDC_BROWSE_SOUND, 188,205,50,15, WS_DISABLED
@@ -48,19 +48,19 @@ FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Sound playback", -1, 7,7,230,60
ICON IDI_CPLICON, IDI_CPLICON, 15,20,32,32
- LTEXT "&Default device:",-1,50,20,80,17
+ LTEXT "&Default device:",-1,50,20,80,9
COMBOBOX IDC_DEVICE_PLAY_LIST, 50, 30, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "&Volume...", IDC_VOLUME1_BTN, 85,47,70,15
PUSHBUTTON "Adva&nced...", IDC_ADV2_BTN, 160,47,70,15
GROUPBOX "Sound recording", -1, 7,75,230,60
ICON IDI_MICROPHONE_ICON, IDI_MICROPHONE_ICON, 15,88,32,32
- LTEXT "D&efault device:",-1,50,88,80,17
+ LTEXT "D&efault device:",-1,50,88,80,9
COMBOBOX IDC_DEVICE_REC_LIST, 50, 98, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "V&olume...", IDC_VOLUME2_BTN, 85,115,70,15
PUSHBUTTON "Advan&ced...", IDC_ADV1_BTN, 160,115,70,15
GROUPBOX "MIDI music playback", -1, 7,145,230,60
ICON IDI_MIDICON, IDI_MIDICON, 15,158,32,32
- LTEXT "De&fault device:",-1,50,158,80,17
+ LTEXT "De&fault device:",-1,50,158,80,9
COMBOBOX IDC_DEVICE_MIDI_LIST, 50, 168, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "Volu&me...", IDC_VOLUME3_BTN, 85,185,70,15
PUSHBUTTON "A&bout...", IDC_ADV3_BTN, 160,185,70,15
@@ -75,13 +75,13 @@ BEGIN
LTEXT "These settings control volume and advanced options for the voice playback or recording device you selected.",-1,8,7,230,40
GROUPBOX "Voice playback", -1, 7,37,230,60
ICON IDI_CPLICON, IDI_CPLICON, 15,50,32,32
- LTEXT "&Default device:",-1,50,50,80,17
+ LTEXT "&Default device:",-1,50,50,80,9
COMBOBOX IDC_DEVICE_VOICE_LIST, 50, 60, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "&Volume...", IDC_VOLUME4_BTN, 85,77,70,15
PUSHBUTTON "Adva&nced...", IDC_ADV4_BTN, 160,77,70,15
GROUPBOX "Voice recording", -1, 7,105,230,60
ICON IDI_MICROPHONE_ICON, IDI_MICROPHONE_ICON, 15,118,32,32
- LTEXT "D&efault device:",-1,50,118,80,17
+ LTEXT "D&efault device:",-1,50,118,80,9
COMBOBOX IDC_DEVICE_VOICE_REC_LIST, 50, 128, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "V&olume...", IDC_VOLUME5_BTN, 85,145,70,15
PUSHBUTTON "Advan&ced...", IDC_ADV5_BTN, 160,145,70,15
@@ -148,9 +148,9 @@ BEGIN
LTEXT "These settings control how ReactOS records audio. They can help you troubleshoot audio-related problems.", 8492, 34, 7, 217, 20
GROUPBOX "Audio recording", 8494, 7, 29, 242, 122
ICON 4380, 8512, 8, 7, 20, 20
- LTEXT "&Hardware acceleration:", 8495, 13, 46, 103, 17
+ LTEXT "&Hardware acceleration:", 8495, 13, 46, 103, 9
CONTROL "Slider1", 5395, "MSCTLS_TRACKBAR32", WS_GROUP | WS_TABSTOP | 0x00000401, 150, 43, 62, 18
- LTEXT "&Sample rate conversion quality:", 8496, 13, 103, 103, 17
+ LTEXT "&Sample rate conversion quality:", 8496, 13, 103, 103, 9
CONTROL "Slider1", 5396, "MSCTLS_TRACKBAR32", WS_TABSTOP | 0x00000401, 150, 101, 62, 18
PUSHBUTTON "&Restore Defaults", 5400, 9, 158, 110, 14
LTEXT "None", 8497, 125, 46, 24, 10
@@ -234,6 +234,7 @@ BEGIN
IDS_CPLNAME "Sound and Audio Devices"
IDS_CPLDESCRIPTION "Changes the sound scheme for your computer, or configure the settings for your speakers and recording devices."
IDS_NO_SOUND "(None)"
+ IDS_NO_DEVICES "No Devices"
5825 "Program error"
5826 "Close program"
@@ -264,4 +265,5 @@ BEGIN
5851 "Start Menu"
5852 "ReactOS Logoff"
5853 "ReactOS Logon"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/es-ES.rc b/reactos/dll/cpl/mmsys/lang/es-ES.rc
index adb65dd9087..3e8a81af654 100644
--- a/reactos/dll/cpl/mmsys/lang/es-ES.rc
+++ b/reactos/dll/cpl/mmsys/lang/es-ES.rc
@@ -234,6 +234,7 @@ BEGIN
IDS_CPLNAME "Dispositivos de sonido y audio"
IDS_CPLDESCRIPTION "Cambie la combinacin de sonidos para el equipo, o configure los parmetros para sus altavoces y dispositivos de grabacin."
IDS_NO_SOUND "(Ninguno)"
+ IDS_NO_DEVICES "No Devices"
5825 "Program error"
5826 "Cerrar programa"
@@ -264,4 +265,5 @@ BEGIN
5851 "Menu de Inicio"
5852 "Cierre de sesin de ReactOS"
5853 "Inicio de sesin en ReactOS"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/fr-FR.rc b/reactos/dll/cpl/mmsys/lang/fr-FR.rc
index 13f0638d7ab..5430201250a 100644
--- a/reactos/dll/cpl/mmsys/lang/fr-FR.rc
+++ b/reactos/dll/cpl/mmsys/lang/fr-FR.rc
@@ -234,6 +234,7 @@ BEGIN
IDS_CPLNAME "Son et priphriques audio"
IDS_CPLDESCRIPTION "Change le modle de sons de votre ordinateur, ou configure les paramtres de vos hauts-parleurs et de vos priphriques d'enregistrement."
IDS_NO_SOUND "(Aucun)"
+ IDS_NO_DEVICES "No Devices"
5825 "Erreur programme"
5826 "Fermeture programme"
@@ -264,4 +265,5 @@ BEGIN
5851 "Menu dmarrer"
5852 "Dconnexion ReactOS"
5853 "Connexion ReactOS"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/id-ID.rc b/reactos/dll/cpl/mmsys/lang/id-ID.rc
index c4b6b09dfb3..867528c3754 100644
--- a/reactos/dll/cpl/mmsys/lang/id-ID.rc
+++ b/reactos/dll/cpl/mmsys/lang/id-ID.rc
@@ -234,6 +234,7 @@ BEGIN
IDS_CPLNAME "Suara dan Audio Devices"
IDS_CPLDESCRIPTION "Mengubah skema suara untuk komputer anda, atau mengkonfigurasi setelan untuk speaker dan device perekaman anda."
IDS_NO_SOUND "(None)"
+ IDS_NO_DEVICES "No Devices"
5825 "Program error"
5826 "Close program"
@@ -264,4 +265,5 @@ BEGIN
5851 "Start Menu"
5852 "ReactOS Logoff"
5853 "ReactOS Logon"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/it-IT.rc b/reactos/dll/cpl/mmsys/lang/it-IT.rc
index 8f892ca711c..fd3c88d9ace 100644
--- a/reactos/dll/cpl/mmsys/lang/it-IT.rc
+++ b/reactos/dll/cpl/mmsys/lang/it-IT.rc
@@ -234,6 +234,7 @@ BEGIN
IDS_CPLNAME "Suoni e Dispositivi audio"
IDS_CPLDESCRIPTION "Cambia lo schema dei suoni per il tuo computer o configura le impostazioni per gli altoparlanti e i dispositivi di registrazione."
IDS_NO_SOUND "(nessuno)"
+ IDS_NO_DEVICES "No Devices"
5825 "Errore del programma"
5826 "Chiudere il programma"
@@ -264,4 +265,5 @@ BEGIN
5851 "Menu avvio"
5852 "Fine sessione di ReactOS"
5853 "Inizio sessione di ReactOS"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/nl-NL.rc b/reactos/dll/cpl/mmsys/lang/nl-NL.rc
index f47c12ba2c2..fb62de1f1f9 100644
--- a/reactos/dll/cpl/mmsys/lang/nl-NL.rc
+++ b/reactos/dll/cpl/mmsys/lang/nl-NL.rc
@@ -235,6 +235,7 @@ BEGIN
IDS_CPLNAME "Geluid en Audio apparaten"
IDS_CPLDESCRIPTION "Verander het geluidsschema van uw computer of configureer de aanwezige geluidsapparatuur."
IDS_NO_SOUND "(Geen)"
+ IDS_NO_DEVICES "No Devices"
5825 "Program error"
5826 "Close program"
@@ -265,4 +266,5 @@ BEGIN
5851 "Start Menu"
5852 "ReactOS Logoff"
5853 "ReactOS Logon"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/no-NO.rc b/reactos/dll/cpl/mmsys/lang/no-NO.rc
index f95a59c3066..02e655aa5a0 100644
--- a/reactos/dll/cpl/mmsys/lang/no-NO.rc
+++ b/reactos/dll/cpl/mmsys/lang/no-NO.rc
@@ -18,7 +18,7 @@ BEGIN
GROUPBOX "Hytaller innstilling", IDC_SPEAKER_SET_BTN, 7,140,230,80
CONTROL "", IDC_SPEAKIMG, "Static", SS_OWNERDRAW, 4, 160, 70, 70
LTEXT "Bruk innstillingen under for endre individuell hytaller volum og andre innstillinger.",-1,70,155,150,36
- PUSHBUTTON "&Hytaller Volum...", IDC_SPEAKER_VOL_BTN, 70,195,75,15
+ PUSHBUTTON "&Hytallervolum...", IDC_SPEAKER_VOL_BTN, 70,195,75,15
PUSHBUTTON "A&vansert...", IDC_ADVANCED2_BTN, 150,195,75,15
END
@@ -54,17 +54,17 @@ BEGIN
PUSHBUTTON "Ava&nsert...", IDC_ADV2_BTN, 160,47,70,15
GROUPBOX "Lyd opptak", -1, 7,75,230,60
ICON IDI_MICROPHONE_ICON, IDI_MICROPHONE_ICON, 15,88,32,32
- LTEXT "S&tandard enhet:",-1,50,88,80,17
+ LTEXT "S&tandardenhet:",-1,50,88,80,17
COMBOBOX IDC_DEVICE_REC_LIST, 50, 98, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "V&olum...", IDC_VOLUME2_BTN, 85,115,70,15
PUSHBUTTON "Avan&sert...", IDC_ADV1_BTN, 160,115,70,15
GROUPBOX "MIDI musikk avspilling", -1, 7,145,230,60
ICON IDI_MIDICON, IDI_MIDICON, 15,158,32,32
- LTEXT "St&andard enhet:",-1,50,158,80,17
+ LTEXT "St&andardenhet:",-1,50,158,80,17
COMBOBOX IDC_DEVICE_MIDI_LIST, 50, 168, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "Volu&m...", IDC_VOLUME3_BTN, 85,185,70,15
PUSHBUTTON "O&m...", IDC_ADV3_BTN, 160,185,70,15
- CHECKBOX "&Bruk bare standard enheter", IDC_DEFAULT_DEV_CHECKBOX, 7, 212, 140, 10
+ CHECKBOX "&Bruk bare standard-enheter", IDC_DEFAULT_DEV_CHECKBOX, 7, 212, 140, 10
END
IDD_VOICE DIALOGEX 0, 0, 246, 228
@@ -81,7 +81,7 @@ BEGIN
PUSHBUTTON "Ava&nsert...", IDC_ADV4_BTN, 160,77,70,15
GROUPBOX "Stemme opptak", -1, 7,105,230,60
ICON IDI_MICROPHONE_ICON, IDI_MICROPHONE_ICON, 15,118,32,32
- LTEXT "S&tandard enhet:",-1,50,118,80,17
+ LTEXT "S&tandardenhet:",-1,50,118,80,17
COMBOBOX IDC_DEVICE_VOICE_REC_LIST, 50, 128, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "V&olum...", IDC_VOLUME5_BTN, 85,145,70,15
PUSHBUTTON "Avan&sert...", IDC_ADV5_BTN, 160,145,70,15
@@ -98,10 +98,10 @@ END
IDD_SAVE_SCHEME_AS DIALOG 9, 23, 225, 54
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Lagre Scheme som"
+CAPTION "Lagre lyd oppsett som"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "&Lagre denne lyd scheme som:", -1, 7, 7, 212, 9
+ LTEXT "&Lagre denne lyd oppsett som:", -1, 7, 7, 212, 9
EDITTEXT 8960, 7, 17, 211, 14, ES_AUTOHSCROLL
DEFPUSHBUTTON "OK", IDOK, 93, 36, 60, 14
PUSHBUTTON "Avbryt", IDCANCEL, 157, 36, 60, 14
@@ -145,7 +145,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Ytelse"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "These settings control how ReactOS records audio. They can help you troubleshoot audio-related problems.", 8492, 34, 7, 217, 20
+ LTEXT "Disse innstillingene kontollerer hvordan ReactOS tar opp lyd. De kan hjelpe deg feilske lyd-relaterte problemer.", 8492, 34, 7, 217, 20
GROUPBOX "Lyd opptak", 8494, 7, 29, 242, 122
ICON 4380, 8512, 8, 7, 20, 20
LTEXT "&Maskinvare akselerasjon:", 8495, 13, 46, 103, 17
@@ -168,11 +168,11 @@ FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "ReactOS lyd", 10243, 7, 5, 213, 192
ICON 4393, 10241, 26, 26, 20, 20
- LTEXT "This computer cannot play audio because the ReactOS Audio service is not enabled.", 10245, 60, 25, 150, 40
+ LTEXT "Denne datamaskinen kan ikke spille av lyd fordi ReactOS lydtjeneste er ikke aktivert.", 10245, 60, 25, 150, 40
AUTOCHECKBOX "&Aktiverer ReactOS lyd", 10253, 60, 68, 150, 9
LTEXT "Notater", 10246, 58, 87, 150, 11
- LTEXT "1. You must be an administrator to enable this service. If you are not logged on as administrator, you will be prompted for an administrator name and password.", 10247, 60, 100, 150, 40
- LTEXT "2. After you enable ReactOS Audio you will have to restart the computer.", 10248, 60, 140, 150, 40
+ LTEXT "1. Du trenger vre en administrator for aktivere denne tjenesten. Hvis du ikke er en administrator, vil du bli spurt etter et administrator navn og passord.", 10247, 60, 100, 150, 40
+ LTEXT "2. Etter at du aktiverer ReactOS lyd vil du trenge starte maskinen p nytt.", 10248, 60, 140, 150, 40
END
IDD_MULTICHANNEL DIALOG 0, 0, 227, 218
@@ -213,7 +213,7 @@ BEGIN
LTEXT "", 9500, 5, 164, 55, 8
CONTROL "Slider1", 9503, "MSCTLS_TRACKBAR32", WS_TABSTOP | 0x00000401, 87, 162, 108, 17
LTEXT "Hyt", 9502, 202, 164, 17, 8
- AUTOCHECKBOX "&Move all slide indicators at the same time", 9504, 5, 185, 216, 9
+ AUTOCHECKBOX "&Flytt alle slide indicators av gangen", 9504, 5, 185, 216, 9
PUSHBUTTON "Gjenopprett &standard", 9505, 110, 199, 110, 14
END
@@ -224,7 +224,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "ReactOS lyd", 10259, 7, 5, 213, 192
ICON 4394, 10257, 25, 25, 20, 20
- LTEXT "The ReactOS Audio service is now enabled. However, audio may not function properly until you restart ReactOS. If you want to restart now, first save your work and close all programs.", 10261, 60, 25, 150, 50
+ LTEXT "ReactOS lydtjeneste er n aktivert. Uansett, lyden vil kanskje ikke fungere optimalt fr du starter ReactOS p nytt. Hvis du nsker starte p nytt n, frst lagre ditt arbeid og lukk alle dine programmer.", 10261, 60, 25, 150, 50
LTEXT "For starte ReactOS p nytt, trykk p OK.", 10262, 60, 75, 150, 20
LTEXT "Hvis du trykker avbryt, vil du trenge starte p nytt senere for at ReactOS lyd skal fungere riktig.", 10263, 60, 100, 150, 40
END
@@ -232,10 +232,11 @@ END
STRINGTABLE
BEGIN
IDS_CPLNAME "Lyder og lydenheter"
- IDS_CPLDESCRIPTION "Changes the sound scheme for your computer, or configure the settings for your speakers and recording devices."
+ IDS_CPLDESCRIPTION "Endre lydenheten for din datamaskin, eller konfigurer innstillinger for dine hytaller og opptak enheter."
IDS_NO_SOUND "(Ingen)"
+ IDS_NO_DEVICES "Ingen enheter"
- 5825 "Program feil"
+ 5825 "Programfeil"
5826 "Avslutt program"
5827 "Kritisk batteri Alarm"
5828 "Enhet tilkoblet"
@@ -254,14 +255,15 @@ BEGIN
5841 "Restore Down"
5842 "Restore Up"
5843 "Asterisk"
- 5844 "Standard lyd"
+ 5844 "Standardlyd"
5845 "Exclamation"
5846 "Avslutt ReactOS"
5847 "Kritisk Stopp"
- 5848 "System Notification"
+ 5848 "System notifikasjon"
5849 "Sprsml"
5850 "Start ReactOS"
5851 "Start Meny"
5852 "ReactOS Logg av"
5853 "ReactOS Logg p"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/pl-PL.rc b/reactos/dll/cpl/mmsys/lang/pl-PL.rc
index ffa982ffe31..1765b4a273c 100644
--- a/reactos/dll/cpl/mmsys/lang/pl-PL.rc
+++ b/reactos/dll/cpl/mmsys/lang/pl-PL.rc
@@ -244,6 +244,7 @@ BEGIN
IDS_CPLNAME "Dwik i urzdzenia audio"
IDS_CPLDESCRIPTION "Zmie schemat dwikowy dla tego komputera lub skonfiguruj ustawienia gonikw i urzdze nagrywajcych."
IDS_NO_SOUND "(Brak)"
+ IDS_NO_DEVICES "Brak urzdze"
5825 "Bd programu"
5826 "Zamknij program"
@@ -274,4 +275,5 @@ BEGIN
5851 "Menu Start"
5852 "Wylogowanie z ReactOS"
5853 "Logowanie do ReactOS"
+ 5854 "Eksplorator ReactOS"
END
diff --git a/reactos/dll/cpl/mmsys/lang/pt-BR.rc b/reactos/dll/cpl/mmsys/lang/pt-BR.rc
index 8091f9a6669..edaca87dceb 100644
--- a/reactos/dll/cpl/mmsys/lang/pt-BR.rc
+++ b/reactos/dll/cpl/mmsys/lang/pt-BR.rc
@@ -234,6 +234,7 @@ BEGIN
IDS_CPLNAME "Sons e dispositivos de audio"
IDS_CPLDESCRIPTION "Altera o esquema de som para o seu computador ou define as configuraes para os auto-falantes e dispositivos de gravao."
IDS_NO_SOUND "(None)"
+ IDS_NO_DEVICES "No Devices"
5825 "Program error"
5826 "Close program"
@@ -264,4 +265,5 @@ BEGIN
5851 "Start Menu"
5852 "ReactOS Logoff"
5853 "ReactOS Logon"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/ro-RO.rc b/reactos/dll/cpl/mmsys/lang/ro-RO.rc
index 7f4f475da94..94631712a12 100644
--- a/reactos/dll/cpl/mmsys/lang/ro-RO.rc
+++ b/reactos/dll/cpl/mmsys/lang/ro-RO.rc
@@ -236,6 +236,7 @@ BEGIN
IDS_CPLNAME "Sunet și dispozitive audio"
IDS_CPLDESCRIPTION "Schimbă schema de sunete a computerului și modifică setările pentru dispozitivele de redare și de înregistrare sunet instalate."
IDS_NO_SOUND "(Niciunul)"
+ IDS_NO_DEVICES "No Devices"
5825 "Eroare program"
5826 "Închidere program"
@@ -266,6 +267,7 @@ BEGIN
5851 "Meniu Start"
5852 "Ieșire din ReactOS"
5853 "Intrare în ReactOS"
+ 5854 "ReactOS Explorer"
END
#pragma code_page(default)
diff --git a/reactos/dll/cpl/mmsys/lang/ru-RU.rc b/reactos/dll/cpl/mmsys/lang/ru-RU.rc
index d145ac56d1b..a1c537a5509 100644
--- a/reactos/dll/cpl/mmsys/lang/ru-RU.rc
+++ b/reactos/dll/cpl/mmsys/lang/ru-RU.rc
@@ -6,12 +6,12 @@ CAPTION "
FONT 8, "MS Shell Dlg"
BEGIN
ICON IDI_CPLICON, IDI_CPLICON, 8,5,32,32
- LTEXT "",IDC_DEVICE_NAME,40,10,194,36
+ LTEXT "",IDC_DEVICE_NAME,40,10,194,19
GROUPBOX " ", -1, 7,30,230,100
CONTROL "", IDC_MUTE_ICON, "Static", SS_ICON | WS_VISIBLE,17,45,32,32
CONTROL "",IDC_VOLUME_TRACKBAR, "msctls_trackbar32", TBS_AUTOTICKS | TBS_ENABLESELRANGE | TBS_BOTTOM | TBS_HORZ | WS_TABSTOP, 65, 45, 140, 14
- LTEXT "",-1,62,66,30,17
- LTEXT "",-1,195,66,30,17
+ LTEXT "",-1,62,66,30,9
+ LTEXT "",-1,195,66,30,9
CHECKBOX "& ", IDC_MUTE_CHECKBOX, 50, 78, 140, 10
CHECKBOX " & ", IDC_ICON_IN_TASKBAR, 50, 92, 140, 10
PUSHBUTTON "&...", IDC_ADVANCED_BTN, 155,110,75,15
@@ -27,15 +27,15 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION ""
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT " , ReactOS . .",-1,8,7,230,40
- LTEXT " &:",-1,8,42,150,17
+ LTEXT " , ReactOS . .",-1,8,7,230,30
+ LTEXT " &:",-1,8,42,150,9
COMBOBOX IDC_SOUND_SCHEME, 8, 53, 230, 46, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON " &...", IDC_SAVEAS_BTN, 119,70,65,15
PUSHBUTTON "&", IDC_DELETE_BTN, 188,70,50,15
- LTEXT " , . .",-1,8,90,230,40
- LTEXT " &:",-1,8,118,150,17
+ LTEXT " , . .",-1,8,90,230,28
+ LTEXT " &:",-1,8,118,150,9
CONTROL "", IDC_SCHEME_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, 8, 130, 230, 60, WS_EX_CLIENTEDGE
- LTEXT "&:",IDC_TEXT_SOUND,8,194,80,17, WS_DISABLED
+ LTEXT "&:",IDC_TEXT_SOUND,8,194,80,9, WS_DISABLED
COMBOBOX IDC_SOUND_LIST, 8, 205, 155, 146, CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
PUSHBUTTON "", IDC_PLAY_SOUND, 168,205,15,15, WS_DISABLED | BS_ICON
PUSHBUTTON "&...", IDC_BROWSE_SOUND, 188,205,50,15, WS_DISABLED
@@ -48,19 +48,19 @@ FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX " ", -1, 7,7,230,60
ICON IDI_CPLICON, IDI_CPLICON, 15,20,32,32
- LTEXT "& :",-1,50,20,180,17
+ LTEXT "& :",-1,50,20,180,9
COMBOBOX IDC_DEVICE_PLAY_LIST, 50, 30, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "&...", IDC_VOLUME1_BTN, 85,47,70,15
PUSHBUTTON "&...", IDC_ADV2_BTN, 160,47,70,15
GROUPBOX " ", -1, 7,75,230,60
ICON IDI_MICROPHONE_ICON, IDI_MICROPHONE_ICON, 15,88,32,32
- LTEXT "& :",-1,50,88,180,17
+ LTEXT "& :",-1,50,88,180,9
COMBOBOX IDC_DEVICE_REC_LIST, 50, 98, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "&...", IDC_VOLUME2_BTN, 85,115,70,15
PUSHBUTTON "&...", IDC_ADV1_BTN, 160,115,70,15
GROUPBOX " MIDI", -1, 7,145,230,60
ICON IDI_MIDICON, IDI_MIDICON, 15,158,32,32
- LTEXT "& :",-1,50,158,180,17
+ LTEXT "& :",-1,50,158,180,9
COMBOBOX IDC_DEVICE_MIDI_LIST, 50, 168, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "&...", IDC_VOLUME3_BTN, 85,185,70,15
PUSHBUTTON "&...", IDC_ADV3_BTN, 160,185,70,15
@@ -72,16 +72,16 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION ""
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT " .",-1,8,7,230,40
+ LTEXT " .",-1,8,7,230,30
GROUPBOX " ", -1, 7,37,230,60
ICON IDI_CPLICON, IDI_CPLICON, 15,50,32,32
- LTEXT "& :",-1,50,50,180,17
+ LTEXT "& :",-1,50,50,180,9
COMBOBOX IDC_DEVICE_VOICE_LIST, 50, 60, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "&...", IDC_VOLUME4_BTN, 85,77,70,15
PUSHBUTTON "&...", IDC_ADV4_BTN, 160,77,70,15
GROUPBOX " ", -1, 7,105,230,60
ICON IDI_MICROPHONE_ICON, IDI_MICROPHONE_ICON, 15,118,32,32
- LTEXT "& :",-1,50,118,180,17
+ LTEXT "& :",-1,50,118,180,9
COMBOBOX IDC_DEVICE_VOICE_REC_LIST, 50, 128, 180, 46, CBS_DROPDOWNLIST
PUSHBUTTON "&...", IDC_VOLUME5_BTN, 85,145,70,15
PUSHBUTTON "&...", IDC_ADV5_BTN, 160,145,70,15
@@ -114,13 +114,13 @@ BEGIN
ICON 4379, -1, 7, 8, 20, 20
LTEXT " , .", -1, 36, 8, 215, 27
CONTROL 110, 5376, "STATIC", SS_BITMAP | SS_CENTERIMAGE, 37, 40, 209, 112, WS_EX_TRANSPARENT
- LTEXT "& :", 8502, 53, 169, 55, 10
+ LTEXT "& :", 8502, 53, 169, 100, 10
COMBOBOX 5401, 52, 182, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP
END
IDD_PERFORMANCE1 DIALOG 0, 0, 257, 218
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Performance"
+CAPTION ""
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT " .", 8492, 34, 7, 218, 23
@@ -132,7 +132,7 @@ BEGIN
CONTROL "Slider1", 5396, "MSCTLS_TRACKBAR32", WS_TABSTOP | 0x00000401, 150, 121, 62, 18
PUSHBUTTON "& ", 5400, 7, 191, 110, 14
LTEXT "", 8497, 128, 56, 21, 10
- LTEXT "", 8498, 214, 56, 21, 9
+ LTEXT "", 8498, 214, 56, 30, 9
LTEXT "", 8499, 128, 123, 21, 10
LTEXT "", 8500, 214, 123, 23, 9
LTEXT " ", 5399, 13, 145, 227, 21
@@ -141,23 +141,23 @@ END
IDD_PERFORMANCE2 DIALOG 0, 0, 257, 218
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Performance"
+CAPTION ""
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT " .", 8492, 34, 7, 217, 20
GROUPBOX " ", 8494, 7, 29, 242, 122
ICON 4380, 8512, 8, 7, 20, 20
- LTEXT "& :", 8495, 13, 46, 103, 17
+ LTEXT "& :", 8495, 13, 46, 103, 9
CONTROL "Slider1", 5395, "MSCTLS_TRACKBAR32", WS_GROUP | WS_TABSTOP | 0x00000401, 150, 43, 62, 18
- LTEXT "& :", 8496, 13, 103, 103, 17
+ LTEXT "& :", 8496, 13, 103, 103, 9
CONTROL "Slider1", 5396, "MSCTLS_TRACKBAR32", WS_TABSTOP | 0x00000401, 150, 101, 62, 18
PUSHBUTTON "& ", 5400, 9, 158, 110, 14
LTEXT "", 8497, 125, 46, 24, 10
- LTEXT "", 8498, 217, 46, 19, 9
+ LTEXT "", 8498, 217, 46, 30, 9
LTEXT "", 8499, 125, 103, 24, 10
LTEXT "", 8500, 217, 103, 19, 9
LTEXT " ", 5399, 13, 125, 222, 21
- LTEXT " ", 5398, 13, 68, 218, 24
+ LTEXT " ", 5398, 13, 68, 218, 17
END
IDD_SETUP1 DIALOG 0, 0, 227, 206
@@ -169,7 +169,7 @@ BEGIN
ICON 4393, 10241, 26, 26, 20, 20
LTEXT " ReactOS .", 10245, 60, 25, 150, 40
AUTOCHECKBOX "& ReactOS", 10253, 60, 68, 150, 9
- LTEXT "", 10246, 58, 87, 150, 11
+ LTEXT "", 10246, 58, 87, 150, 9
LTEXT "1. You must be an administrator to enable this service. If you are not logged on as administrator, you will be prompted for an administrator name and password.", 10247, 60, 100, 150, 40
LTEXT "2. , ReactOS, .", 10248, 60, 140, 150, 40
END
@@ -233,6 +233,7 @@ BEGIN
IDS_CPLNAME " "
IDS_CPLDESCRIPTION " , ."
IDS_NO_SOUND "()"
+ IDS_NO_DEVICES "No Devices"
5825 " "
5826 " "
@@ -263,4 +264,5 @@ BEGIN
5851 " "
5852 " ReactOS"
5853 " ReactOS"
+ 5854 " ReactOS"
END
diff --git a/reactos/dll/cpl/mmsys/lang/sk-SK.rc b/reactos/dll/cpl/mmsys/lang/sk-SK.rc
index 6efeec3ae04..7ca4b027407 100644
--- a/reactos/dll/cpl/mmsys/lang/sk-SK.rc
+++ b/reactos/dll/cpl/mmsys/lang/sk-SK.rc
@@ -1,6 +1,6 @@
/* TRANSLATOR : Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
* DATE OF TR.: 28-04-2008
- * LAST CHANGE: 11-02-2009
+ * LAST CHANGE: 26-08-2009
*/
LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
@@ -239,6 +239,7 @@ BEGIN
IDS_CPLNAME "Zvuk a zvukov zariadenia"
IDS_CPLDESCRIPTION "Changes the sound scheme for your computer, or configure the settings for your speakers and recording devices."
IDS_NO_SOUND "(iadne)"
+ IDS_NO_DEVICES "iadne zariadenia"
5825 "Chyba programu"
5826 "Zavrie program"
@@ -259,7 +260,7 @@ BEGIN
5841 "Restore Down"
5842 "Restore Up"
5843 "Hviezdika"
- 5844 "Default sound"
+ 5844 "Predvolen zvuk" //Default sound
5845 "Vkrik"
5846 "Ukonenie systmu ReactOS"
5847 "Kritick zastavenie"
@@ -269,4 +270,5 @@ BEGIN
5851 "Ponuka tart"
5852 "Odhlsenie zo systmu ReactOS"
5853 "Prihlsenie do systmu ReactOS"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/uk-UA.rc b/reactos/dll/cpl/mmsys/lang/uk-UA.rc
index adabea2d194..90b9f5a2992 100644
--- a/reactos/dll/cpl/mmsys/lang/uk-UA.rc
+++ b/reactos/dll/cpl/mmsys/lang/uk-UA.rc
@@ -242,6 +242,7 @@ BEGIN
IDS_CPLNAME " "
IDS_CPLDESCRIPTION " ', ."
IDS_NO_SOUND "()"
+ IDS_NO_DEVICES "No Devices"
5825 " "
5826 " "
@@ -272,4 +273,5 @@ BEGIN
5851 " "
5852 " ReactOS"
5853 " ReactOS"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/lang/zh-CN.rc b/reactos/dll/cpl/mmsys/lang/zh-CN.rc
index 81bab64e00a..219abc22369 100644
--- a/reactos/dll/cpl/mmsys/lang/zh-CN.rc
+++ b/reactos/dll/cpl/mmsys/lang/zh-CN.rc
@@ -242,6 +242,7 @@ BEGIN
IDS_CPLNAME "Ƶ豸"
IDS_CPLDESCRIPTION "ļ¼豸"
IDS_NO_SOUND "()"
+ IDS_NO_DEVICES "No Devices"
5825 ""
5826 "رճ"
@@ -272,4 +273,5 @@ BEGIN
5851 "ʼ˵"
5852 "ReactOS ע"
5853 "ReactOS ¼"
+ 5854 "ReactOS Explorer"
END
diff --git a/reactos/dll/cpl/mmsys/resource.h b/reactos/dll/cpl/mmsys/resource.h
index 1b344f68b5c..c8511da90c0 100644
--- a/reactos/dll/cpl/mmsys/resource.h
+++ b/reactos/dll/cpl/mmsys/resource.h
@@ -66,8 +66,8 @@
#define IDC_SPEAKIMG 4625
#define IDC_MUTE_ICON 4626
-#define IDS_REACTOS_LOGON 5853
#define IDS_REACTOS_LOGOFF 5852
+#define IDS_REACTOS_LOGON 5853
#define IDS_REACTOS_DEFAULT_SCHEME 5856
@@ -75,6 +75,7 @@
#define IDS_CPLNAME 1000
#define IDS_CPLDESCRIPTION 1001
#define IDS_NO_SOUND 1002
+#define IDS_NO_DEVICES 1003
#endif /* __CPL_RESOURCE_H */
diff --git a/reactos/dll/cpl/mmsys/sounds.c b/reactos/dll/cpl/mmsys/sounds.c
index 420f7c2525d..e77364e892b 100644
--- a/reactos/dll/cpl/mmsys/sounds.c
+++ b/reactos/dll/cpl/mmsys/sounds.c
@@ -795,16 +795,7 @@ SoundsDlgProc(HWND hwndDlg,
{
case WM_INITDIALOG:
{
- UINT NumWavOut;
-
- NumWavOut = waveOutGetNumDevs();
- if (!NumWavOut)
- {
- EnableWindow(GetDlgItem(hwndDlg, IDC_SOUND_SCHEME), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_SAVEAS_BTN), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE_BTN), FALSE);
- EnableWindow(GetDlgItem(hwndDlg, IDC_SCHEME_LIST), FALSE);
- }
+ UINT NumWavOut = waveOutGetNumDevs();
SendMessage(GetDlgItem(hwndDlg, IDC_PLAY_SOUND),
BM_SETIMAGE,(WPARAM)IMAGE_ICON,
@@ -814,6 +805,15 @@ SoundsDlgProc(HWND hwndDlg,
LoadSoundProfiles(hwndDlg);
LoadSoundFiles(hwndDlg);
ShowSoundScheme(hwndDlg);
+
+ if (!NumWavOut)
+ {
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SOUND_SCHEME), FALSE);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SAVEAS_BTN), FALSE);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE_BTN), FALSE);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_SCHEME_LIST), FALSE);
+ }
+
if (wParam == (WPARAM)GetDlgItem(hwndDlg, IDC_SOUND_SCHEME))
return TRUE;
SetFocus(GetDlgItem(hwndDlg, IDC_SOUND_SCHEME));
diff --git a/reactos/dll/cpl/mmsys/volume.c b/reactos/dll/cpl/mmsys/volume.c
index 7017e9983a3..c9f345bddd9 100644
--- a/reactos/dll/cpl/mmsys/volume.c
+++ b/reactos/dll/cpl/mmsys/volume.c
@@ -234,6 +234,7 @@ InitVolumeControls(HWND hwndDlg, PGLOBAL_DATA pGlobalData)
EnableWindow(GetDlgItem(hwndDlg, IDC_SPEAKER_SET_BTN), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_SPEAKER_VOL_BTN), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_ADVANCED2_BTN), FALSE);
+ SendDlgItemMessage(hwndDlg, IDC_MUTE_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)pGlobalData->hIconMuted);
return;
}
@@ -292,9 +293,9 @@ VolumeDlgProc(HWND hwndDlg,
LPARAM lParam)
{
static IMGINFO ImgInfo;
+ PGLOBAL_DATA pGlobalData;
UNREFERENCED_PARAMETER(lParam);
UNREFERENCED_PARAMETER(wParam);
- PGLOBAL_DATA pGlobalData;
pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
diff --git a/reactos/dll/cpl/telephon/telephon.rc b/reactos/dll/cpl/telephon/telephon.rc
index f455eacd408..23bc87f10a4 100644
--- a/reactos/dll/cpl/telephon/telephon.rc
+++ b/reactos/dll/cpl/telephon/telephon.rc
@@ -7,11 +7,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Software Control Panel\0"
#define REACTOS_STR_INTERNAL_NAME "telephon\0"
#define REACTOS_STR_ORIGINAL_FILENAME "telephon.cpl\0"
-#ifdef _MSC_VER
-#include <../../../reactos/version.rc>
-#else
#include
-#endif
IDI_CPLSYSTEM ICON "resources/applet.ico"
diff --git a/reactos/dll/directx/dsound/dsound.rbuild b/reactos/dll/directx/dsound/dsound.rbuild
index c76e412d415..537b3850e0f 100644
--- a/reactos/dll/directx/dsound/dsound.rbuild
+++ b/reactos/dll/directx/dsound/dsound.rbuild
@@ -5,6 +5,7 @@
.
include/reactos/wine
+
wine
uuid
ntdll
diff --git a/reactos/dll/directx/ksuser/ksuser.c b/reactos/dll/directx/ksuser/ksuser.c
index 8692bb9ce40..ee67184db1c 100644
--- a/reactos/dll/directx/ksuser/ksuser.c
+++ b/reactos/dll/directx/ksuser/ksuser.c
@@ -44,18 +44,19 @@ KsiCreateObjectType( HANDLE hHandle,
Length = wcslen(IID);
- TotalSize = (Length * sizeof(WCHAR)) + BufferSize + 2 * sizeof(WCHAR);
+ TotalSize = (Length * sizeof(WCHAR)) + BufferSize + 4 * sizeof(WCHAR);
pStr = HeapAlloc(GetProcessHeap(), 0, TotalSize);
if (!pStr)
return STATUS_INSUFFICIENT_RESOURCES;
-
- wcscpy(pStr, (LPWSTR)IID);
- pStr[Length] = L'\\';
- memcpy(&pStr[Length+1], Buffer, BufferSize);
- pStr[Length+1+BufferSize] = L'\0';
+ pStr[0] = L'\\';
+ wcscpy(&pStr[1], (LPWSTR)IID);
+ pStr[Length+1] = L'\\';
+ memcpy(&pStr[Length+2], Buffer, BufferSize);
+ pStr[Length+3+(BufferSize/sizeof(WCHAR))] = L'\0';
RtlInitUnicodeString(&ObjectName, pStr);
+ ObjectName.Length = ObjectName.MaximumLength = TotalSize;
InitializeObjectAttributes(&ObjectAttributes, &ObjectName, OBJ_CASE_INSENSITIVE, hHandle, NULL);
@@ -176,7 +177,7 @@ KsCreateClock(HANDLE ConnectionHandle,
*--*/
KSDDKAPI
-NTSTATUS
+DWORD
NTAPI
KsCreatePin(HANDLE FilterHandle,
PKSPIN_CONNECT Connect,
@@ -186,10 +187,7 @@ KsCreatePin(HANDLE FilterHandle,
ULONG BufferSize = sizeof(KSPIN_CONNECT);
PKSDATAFORMAT DataFormat = (PKSDATAFORMAT)(Connect + 1);
- if (DataFormat->Flags & KSDATAFORMAT_ATTRIBUTES)
- {
- BufferSize += (ROUND_UP(DataFormat->FormatSize,sizeof(LONGLONG)) + DataFormat->FormatSize);
- }
+ BufferSize += DataFormat->FormatSize;
return KsiCreateObjectType(FilterHandle,
KSSTRING_Pin,
diff --git a/reactos/dll/directx/wine/d3d8/cubetexture.c b/reactos/dll/directx/wine/d3d8/cubetexture.c
index 32511d6569c..d0b8f724ec0 100644
--- a/reactos/dll/directx/wine/d3d8/cubetexture.c
+++ b/reactos/dll/directx/wine/d3d8/cubetexture.c
@@ -57,9 +57,11 @@ static ULONG WINAPI IDirect3DCubeTexture8Impl_Release(LPDIRECT3DCUBETEXTURE8 ifa
if (ref == 0) {
TRACE("Releasing child %p\n", This->wineD3DCubeTexture);
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
IWineD3DCubeTexture_Destroy(This->wineD3DCubeTexture, D3D8CB_DestroySurface);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
IUnknown_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -73,14 +75,15 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_GetDevice(LPDIRECT3DCUBETEXTURE8
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_GetDevice(This->wineD3DCubeTexture, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -89,9 +92,10 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_SetPrivateData(LPDIRECT3DCUBETEX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_SetPrivateData(This->wineD3DCubeTexture,refguid,pData,SizeOfData,Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -100,9 +104,10 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_GetPrivateData(LPDIRECT3DCUBETEX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_GetPrivateData(This->wineD3DCubeTexture,refguid,pData,pSizeOfData);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -111,9 +116,10 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_FreePrivateData(LPDIRECT3DCUBETE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_FreePrivateData(This->wineD3DCubeTexture,refguid);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -122,9 +128,10 @@ static DWORD WINAPI IDirect3DCubeTexture8Impl_SetPriority(LPDIRECT3DCUBETEXTURE8
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DCubeTexture_SetPriority(This->wineD3DCubeTexture, PriorityNew);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -133,9 +140,10 @@ static DWORD WINAPI IDirect3DCubeTexture8Impl_GetPriority(LPDIRECT3DCUBETEXTURE8
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DCubeTexture_GetPriority(This->wineD3DCubeTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -143,9 +151,9 @@ static void WINAPI IDirect3DCubeTexture8Impl_PreLoad(LPDIRECT3DCUBETEXTURE8 ifac
IDirect3DCubeTexture8Impl *This = (IDirect3DCubeTexture8Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DCubeTexture_PreLoad(This->wineD3DCubeTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
}
static D3DRESOURCETYPE WINAPI IDirect3DCubeTexture8Impl_GetType(LPDIRECT3DCUBETEXTURE8 iface) {
@@ -153,9 +161,10 @@ static D3DRESOURCETYPE WINAPI IDirect3DCubeTexture8Impl_GetType(LPDIRECT3DCUBETE
D3DRESOURCETYPE type;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
type = IWineD3DCubeTexture_GetType(This->wineD3DCubeTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return type;
}
@@ -165,9 +174,10 @@ static DWORD WINAPI IDirect3DCubeTexture8Impl_SetLOD(LPDIRECT3DCUBETEXTURE8 ifac
DWORD lod;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
lod = IWineD3DCubeTexture_SetLOD(This->wineD3DCubeTexture, LODNew);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return lod;
}
@@ -176,9 +186,10 @@ static DWORD WINAPI IDirect3DCubeTexture8Impl_GetLOD(LPDIRECT3DCUBETEXTURE8 ifac
DWORD lod;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
lod = IWineD3DCubeTexture_GetLOD((LPDIRECT3DBASETEXTURE8) This);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return lod;
}
@@ -187,9 +198,10 @@ static DWORD WINAPI IDirect3DCubeTexture8Impl_GetLevelCount(LPDIRECT3DCUBETEXTUR
DWORD cnt;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
cnt = IWineD3DCubeTexture_GetLevelCount(This->wineD3DCubeTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return cnt;
}
@@ -201,22 +213,21 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_GetLevelDesc(LPDIRECT3DCUBETEXTU
TRACE("(%p) Relay\n", This);
- /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */
- wined3ddesc.Format = (WINED3DFORMAT *)&pDesc->Format;
- wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type;
- wined3ddesc.Usage = &pDesc->Usage;
- wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool;
- wined3ddesc.Size = &pDesc->Size;
- wined3ddesc.MultiSampleType = (WINED3DMULTISAMPLE_TYPE *) &pDesc->MultiSampleType;
- wined3ddesc.MultiSampleQuality = NULL; /* DirectX9 only */
- wined3ddesc.Width = &pDesc->Width;
- wined3ddesc.Height = &pDesc->Height;
-
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_GetLevelDesc(This->wineD3DCubeTexture, Level, &wined3ddesc);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
- if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(pDesc->Format);
+ if (SUCCEEDED(hr))
+ {
+ pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.format);
+ pDesc->Type = wined3ddesc.resource_type;
+ pDesc->Usage = wined3ddesc.usage;
+ pDesc->Pool = wined3ddesc.pool;
+ pDesc->Size = wined3ddesc.size;
+ pDesc->MultiSampleType = wined3ddesc.multisample_type;
+ pDesc->Width = wined3ddesc.width;
+ pDesc->Height = wined3ddesc.height;
+ }
return hr;
}
@@ -228,13 +239,14 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_GetCubeMapSurface(LPDIRECT3DCUBE
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DCubeTexture_GetCubeMapSurface(This->wineD3DCubeTexture, (WINED3DCUBEMAP_FACES) FaceType, Level, &mySurface);
if (hrc == D3D_OK && NULL != ppCubeMapSurface) {
IWineD3DCubeTexture_GetParent(mySurface, (IUnknown **)ppCubeMapSurface);
IWineD3DCubeTexture_Release(mySurface);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hrc;
}
@@ -243,9 +255,10 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_LockRect(LPDIRECT3DCUBETEXTURE8
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_LockRect(This->wineD3DCubeTexture, (WINED3DCUBEMAP_FACES) FaceType, Level, (WINED3DLOCKED_RECT *) pLockedRect, pRect, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -254,9 +267,10 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_UnlockRect(LPDIRECT3DCUBETEXTURE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_UnlockRect(This->wineD3DCubeTexture, (WINED3DCUBEMAP_FACES) FaceType, Level);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -265,9 +279,10 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_AddDirtyRect(LPDIRECT3DCUBETEXTU
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_AddDirtyRect(This->wineD3DCubeTexture, (WINED3DCUBEMAP_FACES) FaceType, pDirtyRect);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
diff --git a/reactos/dll/directx/wine/d3d8/d3d8_main.c b/reactos/dll/directx/wine/d3d8/d3d8_main.c
index 8e32dc3f9ad..6300371842a 100644
--- a/reactos/dll/directx/wine/d3d8/d3d8_main.c
+++ b/reactos/dll/directx/wine/d3d8/d3d8_main.c
@@ -24,15 +24,6 @@
#include "d3d8_private.h"
#include "wine/debug.h"
-static CRITICAL_SECTION_DEBUG d3d8_cs_debug =
-{
- 0, 0, &d3d8_cs,
- { &d3d8_cs_debug.ProcessLocksList,
- &d3d8_cs_debug.ProcessLocksList },
- 0, 0, { (DWORD_PTR)(__FILE__ ": d3d8_cs") }
-};
-CRITICAL_SECTION d3d8_cs = { &d3d8_cs_debug, -1, 0, 0, 0, 0 };
-
WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
HRESULT WINAPI D3D8GetSWInfo(void) {
@@ -48,7 +39,8 @@ IDirect3D8* WINAPI Direct3DCreate8(UINT SDKVersion) {
IDirect3D8Impl* object;
TRACE("SDKVersion = %x\n", SDKVersion);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
+
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D8Impl));
object->lpVtbl = &Direct3D8_Vtbl;
@@ -56,7 +48,8 @@ IDirect3D8* WINAPI Direct3DCreate8(UINT SDKVersion) {
object->WineD3D = WineDirect3DCreate(8, (IUnknown *)object);
TRACE("Created Direct3D object @ %p, WineObj @ %p\n", object, object->WineD3D);
- LeaveCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_unlock();
if (!object->WineD3D)
{
@@ -77,14 +70,14 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
}
/***********************************************************************
- * ValidateVertexShader (D3D8.@)
+ * ValidateVertexShader (D3D8.@)
*
* I've seen reserved1 and reserved2 always passed as 0's
- * bool seems always passed as 0 or 1, but other values work as well....
+ * bool seems always passed as 0 or 1, but other values work as well...
* toto result?
*/
HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD* reserved2, BOOL bool, DWORD* toto)
-{
+{
HRESULT ret;
FIXME("(%p %p %p %d %p): stub\n", vertexshader, reserved1, reserved2, bool, toto);
@@ -96,7 +89,7 @@ HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD
switch(*vertexshader) {
case 0xFFFE0101:
- case 0xFFFE0100:
+ case 0xFFFE0100:
ret=S_OK;
break;
default:
@@ -108,7 +101,7 @@ HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD
}
/***********************************************************************
- * ValidatePixelShader (D3D8.@)
+ * ValidatePixelShader (D3D8.@)
*
* PARAMS
* toto result?
@@ -117,12 +110,12 @@ HRESULT WINAPI ValidatePixelShader(DWORD* pixelshader, DWORD* reserved1, BOOL bo
{
HRESULT ret;
FIXME("(%p %p %d %p): stub\n", pixelshader, reserved1, bool, toto);
-
+
if (!pixelshader)
return E_FAIL;
if (reserved1)
- return E_FAIL;
+ return E_FAIL;
switch(*pixelshader) {
case 0xFFFF0100:
diff --git a/reactos/dll/directx/wine/d3d8/d3d8_private.h b/reactos/dll/directx/wine/d3d8/d3d8_private.h
index c38d8cc8b30..52abb84b5ec 100644
--- a/reactos/dll/directx/wine/d3d8/d3d8_private.h
+++ b/reactos/dll/directx/wine/d3d8/d3d8_private.h
@@ -97,6 +97,8 @@
_pD3D8Caps->PixelShaderVersion = _pWineCaps->PixelShaderVersion; \
_pD3D8Caps->MaxPixelShaderValue = _pWineCaps->PixelShader1xMaxValue;
+void fixup_caps(WINED3DCAPS *pWineCaps);
+
/* Direct3D8 Interfaces: */
typedef struct IDirect3DBaseTexture8Impl IDirect3DBaseTexture8Impl;
typedef struct IDirect3DVolumeTexture8Impl IDirect3DVolumeTexture8Impl;
@@ -120,9 +122,6 @@ typedef struct IDirect3DVertexShaderDeclarationImpl IDirect3DVertexShaderDeclara
/* Advance declaration of structures to satisfy compiler */
typedef struct IDirect3DVertexShader8Impl IDirect3DVertexShader8Impl;
-/* Global critical section */
-extern CRITICAL_SECTION d3d8_cs;
-
/* ===========================================================================
The interfaces themselves
=========================================================================== */
@@ -166,10 +165,24 @@ extern const IWineD3DDeviceParentVtbl d3d8_wined3d_device_parent_vtbl;
#define D3D8_INITIAL_HANDLE_TABLE_SIZE 64
#define D3D8_INVALID_HANDLE ~0U
+enum d3d8_handle_type
+{
+ D3D8_HANDLE_FREE,
+ D3D8_HANDLE_VS,
+ D3D8_HANDLE_PS,
+ D3D8_HANDLE_SB,
+};
+
+struct d3d8_handle_entry
+{
+ void *object;
+ enum d3d8_handle_type type;
+};
+
struct d3d8_handle_table
{
- void **entries;
- void **free_entries;
+ struct d3d8_handle_entry *entries;
+ struct d3d8_handle_entry *free_entries;
UINT table_size;
UINT entry_count;
};
@@ -455,7 +468,7 @@ struct IDirect3DVolumeTexture8Impl
/* TODO: Generate a valid GUIDs */
/* {83B073CE-6F30-11d9-C687-00046142C14F} */
-DEFINE_GUID(IID_IDirect3DStateBlock8,
+DEFINE_GUID(IID_IDirect3DStateBlock8,
0x83b073ce, 0x6f30, 0x11d9, 0xc6, 0x87, 0x0, 0x4, 0x61, 0x42, 0xc1, 0x4f);
DEFINE_GUID(IID_IDirect3DVertexDeclaration8,
diff --git a/reactos/dll/directx/wine/d3d8/device.c b/reactos/dll/directx/wine/d3d8/device.c
index 206697d99d4..675eac134f3 100644
--- a/reactos/dll/directx/wine/d3d8/device.c
+++ b/reactos/dll/directx/wine/d3d8/device.c
@@ -69,6 +69,7 @@ D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format)
case WINED3DFMT_X8L8V8U8: return D3DFMT_X8L8V8U8;
case WINED3DFMT_R8G8B8A8_SNORM: return D3DFMT_Q8W8V8U8;
case WINED3DFMT_R16G16_SNORM: return D3DFMT_V16U16;
+ case WINED3DFMT_W11V11U10: return D3DFMT_W11V11U10;
case WINED3DFMT_A2W10V10U10: return D3DFMT_A2W10V10U10;
case WINED3DFMT_D16_LOCKABLE: return D3DFMT_D16_LOCKABLE;
case WINED3DFMT_D32: return D3DFMT_D32;
@@ -119,6 +120,7 @@ WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format)
case D3DFMT_X8L8V8U8: return WINED3DFMT_X8L8V8U8;
case D3DFMT_Q8W8V8U8: return WINED3DFMT_R8G8B8A8_SNORM;
case D3DFMT_V16U16: return WINED3DFMT_R16G16_SNORM;
+ case D3DFMT_W11V11U10: return WINED3DFMT_W11V11U10;
case D3DFMT_A2W10V10U10: return WINED3DFMT_A2W10V10U10;
case D3DFMT_D16_LOCKABLE: return WINED3DFMT_D16_LOCKABLE;
case D3DFMT_D32: return WINED3DFMT_D32;
@@ -163,14 +165,23 @@ static UINT vertex_count_from_primitive_count(D3DPRIMITIVETYPE primitive_type, U
}
/* Handle table functions */
-static DWORD d3d8_allocate_handle(struct d3d8_handle_table *t, void *object)
+static DWORD d3d8_allocate_handle(struct d3d8_handle_table *t, void *object, enum d3d8_handle_type type)
{
+ struct d3d8_handle_entry *entry;
+
if (t->free_entries)
{
/* Use a free handle */
- void **entry = t->free_entries;
- t->free_entries = *entry;
- *entry = object;
+ entry = t->free_entries;
+ if (entry->type != D3D8_HANDLE_FREE)
+ {
+ ERR("Handle %u(%p) is in the free list, but has type %#x.\n", (entry - t->entries), entry, entry->type);
+ return D3D8_INVALID_HANDLE;
+ }
+ t->free_entries = entry->object;
+ entry->object = object;
+ entry->type = type;
+
return entry - t->entries;
}
@@ -178,34 +189,68 @@ static DWORD d3d8_allocate_handle(struct d3d8_handle_table *t, void *object)
{
/* Grow the table */
UINT new_size = t->table_size + (t->table_size >> 1);
- void **new_entries = HeapReAlloc(GetProcessHeap(), 0, t->entries, new_size * sizeof(void *));
- if (!new_entries) return D3D8_INVALID_HANDLE;
+ struct d3d8_handle_entry *new_entries = HeapReAlloc(GetProcessHeap(),
+ 0, t->entries, new_size * sizeof(*t->entries));
+ if (!new_entries)
+ {
+ ERR("Failed to grow the handle table.\n");
+ return D3D8_INVALID_HANDLE;
+ }
t->entries = new_entries;
t->table_size = new_size;
}
- t->entries[t->entry_count] = object;
+ entry = &t->entries[t->entry_count];
+ entry->object = object;
+ entry->type = type;
+
return t->entry_count++;
}
-static void *d3d8_free_handle(struct d3d8_handle_table *t, DWORD handle)
+static void *d3d8_free_handle(struct d3d8_handle_table *t, DWORD handle, enum d3d8_handle_type type)
{
- void **entry, *object;
+ struct d3d8_handle_entry *entry;
+ void *object;
- if (handle >= t->entry_count) return NULL;
+ if (handle == D3D8_INVALID_HANDLE || handle >= t->entry_count)
+ {
+ WARN("Invalid handle %u passed.\n", handle);
+ return NULL;
+ }
entry = &t->entries[handle];
- object = *entry;
- *entry = t->free_entries;
+ if (entry->type != type)
+ {
+ WARN("Handle %u(%p) is not of type %#x.\n", handle, entry, type);
+ return NULL;
+ }
+
+ object = entry->object;
+ entry->object = t->free_entries;
+ entry->type = D3D8_HANDLE_FREE;
t->free_entries = entry;
return object;
}
-static void *d3d8_get_object(struct d3d8_handle_table *t, DWORD handle)
+static void *d3d8_get_object(struct d3d8_handle_table *t, DWORD handle, enum d3d8_handle_type type)
{
- if (handle >= t->entry_count) return NULL;
- return t->entries[handle];
+ struct d3d8_handle_entry *entry;
+
+ if (handle == D3D8_INVALID_HANDLE || handle >= t->entry_count)
+ {
+ WARN("Invalid handle %u passed.\n", handle);
+ return NULL;
+ }
+
+ entry = &t->entries[handle];
+ if (entry->type != type)
+ {
+ WARN("Handle %u(%p) is not of type %#x.\n", handle, entry, type);
+ return NULL;
+ }
+
+ return entry->object;
}
/* IDirect3D IUnknown parts follow: */
@@ -254,7 +299,9 @@ static ULONG WINAPI IDirect3DDevice8Impl_Release(LPDIRECT3DDEVICE8 iface) {
unsigned i;
TRACE("Releasing wined3d device %p\n", This->WineD3DDevice);
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
+
This->inDestruction = TRUE;
for(i = 0; i < This->numConvertedDecls; i++) {
@@ -266,7 +313,8 @@ static ULONG WINAPI IDirect3DDevice8Impl_Release(LPDIRECT3DDEVICE8 iface) {
IWineD3DDevice_Release(This->WineD3DDevice);
HeapFree(GetProcessHeap(), 0, This->handle_table.entries);
HeapFree(GetProcessHeap(), 0, This);
- LeaveCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_unlock();
}
return ref;
}
@@ -277,9 +325,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_TestCooperativeLevel(LPDIRECT3DDEVICE
HRESULT hr;
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DDevice_TestCooperativeLevel(This->WineD3DDevice);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -288,9 +338,11 @@ static UINT WINAPI IDirect3DDevice8Impl_GetAvailableTextureMem(LPDIRECT3DDEVICE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetAvailableTextureMem(This->WineD3DDevice);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -299,9 +351,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_ResourceManagerDiscardBytes(LPDIRECT3
HRESULT hr;
TRACE("(%p) : Relay bytes(%d)\n", This, Bytes);
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DDevice_EvictManagedResources(This->WineD3DDevice);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -316,7 +370,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetDirect3D(LPDIRECT3DDEVICE8 iface,
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetDirect3D(This->WineD3DDevice, &pWineD3D);
if (hr == D3D_OK && pWineD3D != NULL)
{
@@ -326,8 +380,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetDirect3D(LPDIRECT3DDEVICE8 iface,
FIXME("Call to IWineD3DDevice_GetDirect3D failed\n");
*ppD3D8 = NULL;
}
+ wined3d_mutex_unlock();
+
TRACE("(%p) returning %p\n",This , *ppD3D8);
- LeaveCriticalSection(&d3d8_cs);
return hr;
}
@@ -346,21 +401,14 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetDeviceCaps(LPDIRECT3DDEVICE8 iface
return D3DERR_INVALIDCALL; /* well this is what MSDN says to return */
}
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_GetDeviceCaps(This->WineD3DDevice, pWineCaps);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
+ fixup_caps(pWineCaps);
WINECAPSTOD3D8CAPS(pCaps, pWineCaps)
HeapFree(GetProcessHeap(), 0, pWineCaps);
- /* D3D8 doesn't support SM 2.0 or higher, so clamp to 1.x */
- if(pCaps->PixelShaderVersion > D3DPS_VERSION(1,4)){
- pCaps->PixelShaderVersion = D3DPS_VERSION(1,4);
- }
- if(pCaps->VertexShaderVersion > D3DVS_VERSION(1,1)){
- pCaps->VertexShaderVersion = D3DVS_VERSION(1,1);
- }
- pCaps->MaxVertexShaderConst = min(D3D8_MAX_VERTEX_SHADER_CONSTANTF, pCaps->MaxVertexShaderConst);
-
TRACE("Returning %p %p\n", This, pCaps);
return hrc;
}
@@ -370,9 +418,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetDisplayMode(LPDIRECT3DDEVICE8 ifac
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetDisplayMode(This->WineD3DDevice, 0, (WINED3DDISPLAYMODE *) pMode);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
@@ -384,9 +432,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetCreationParameters(LPDIRECT3DDEVIC
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetCreationParameters(This->WineD3DDevice, (WINED3DDEVICE_CREATION_PARAMETERS *) pParameters);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -400,9 +449,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetCursorProperties(LPDIRECT3DDEVICE8
return WINED3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetCursorProperties(This->WineD3DDevice,XHotSpot,YHotSpot,pSurface->wineD3DSurface);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -410,9 +460,9 @@ static void WINAPI IDirect3DDevice8Impl_SetCursorPosition(LPDIRECT3DDEVICE8 ifac
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetCursorPosition(This->WineD3DDevice, XScreenSpace, YScreenSpace, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
}
static BOOL WINAPI IDirect3DDevice8Impl_ShowCursor(LPDIRECT3DDEVICE8 iface, BOOL bShow) {
@@ -420,9 +470,10 @@ static BOOL WINAPI IDirect3DDevice8Impl_ShowCursor(LPDIRECT3DDEVICE8 iface, BOOL
BOOL ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DDevice_ShowCursor(This->WineD3DDevice, bShow);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -465,10 +516,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateAdditionalSwapChain(LPDIRECT3DD
localParameters.PresentationInterval = pPresentationParameters->FullScreen_PresentationInterval;
localParameters.AutoRestoreDisplayMode = TRUE;
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateSwapChain(This->WineD3DDevice, &localParameters,
&object->wineD3DSwapChain, (IUnknown *)object, SURFACE_OPENGL);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
pPresentationParameters->BackBufferWidth = localParameters.BackBufferWidth;
pPresentationParameters->BackBufferHeight = localParameters.BackBufferHeight;
@@ -520,9 +571,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_Reset(LPDIRECT3DDEVICE8 iface, D3DPRE
localParameters.PresentationInterval = pPresentationParameters->FullScreen_PresentationInterval;
localParameters.AutoRestoreDisplayMode = TRUE;
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_Reset(This->WineD3DDevice, &localParameters);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
pPresentationParameters->BackBufferWidth = localParameters.BackBufferWidth;
pPresentationParameters->BackBufferHeight = localParameters.BackBufferHeight;
@@ -546,9 +597,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_Present(LPDIRECT3DDEVICE8 iface, CONS
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_Present(This->WineD3DDevice, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -559,13 +611,14 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
rc = IWineD3DDevice_GetBackBuffer(This->WineD3DDevice, 0, BackBuffer, (WINED3DBACKBUFFER_TYPE) Type, &retSurface);
if (rc == D3D_OK && NULL != retSurface && NULL != ppBackBuffer) {
IWineD3DSurface_GetParent(retSurface, (IUnknown **)ppBackBuffer);
IWineD3DSurface_Release(retSurface);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return rc;
}
@@ -574,9 +627,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetRasterStatus(LPDIRECT3DDEVICE8 ifa
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetRasterStatus(This->WineD3DDevice, 0, (WINED3DRASTER_STATUS *) pRasterStatus);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -585,9 +639,9 @@ static void WINAPI IDirect3DDevice8Impl_SetGammaRamp(LPDIRECT3DDEVICE8 iface, DW
TRACE("(%p) Relay\n", This);
/* Note: D3DGAMMARAMP is compatible with WINED3DGAMMARAMP */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetGammaRamp(This->WineD3DDevice, 0, Flags, (CONST WINED3DGAMMARAMP *) pRamp);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
}
static void WINAPI IDirect3DDevice8Impl_GetGammaRamp(LPDIRECT3DDEVICE8 iface, D3DGAMMARAMP* pRamp) {
@@ -595,9 +649,9 @@ static void WINAPI IDirect3DDevice8Impl_GetGammaRamp(LPDIRECT3DDEVICE8 iface, D3
TRACE("(%p) Relay\n", This);
/* Note: D3DGAMMARAMP is compatible with WINED3DGAMMARAMP */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_GetGammaRamp(This->WineD3DDevice, 0, (WINED3DGAMMARAMP *) pRamp);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
}
static HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, UINT Levels, DWORD Usage,
@@ -619,13 +673,14 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface
object->lpVtbl = &Direct3DTexture8_Vtbl;
object->ref = 1;
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateTexture(This->WineD3DDevice, Width, Height, Levels, Usage & WINED3DUSAGE_MASK,
wined3dformat_from_d3dformat(Format), Pool, &object->wineD3DTexture, (IUnknown *)object);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (FAILED(hrc)) {
- /* free up object */
+ /* free up object */
FIXME("(%p) call to IWineD3DDevice_CreateTexture failed\n", This);
HeapFree(GetProcessHeap(), 0, object);
/* *ppTexture = NULL; */
@@ -639,10 +694,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface
return hrc;
}
-static HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 iface,
- UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage,
- D3DFORMAT Format, D3DPOOL Pool, IDirect3DVolumeTexture8** ppVolumeTexture) {
-
+static HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(IDirect3DDevice8 *iface,
+ UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format,
+ D3DPOOL Pool, IDirect3DVolumeTexture8 **ppVolumeTexture)
+{
IDirect3DVolumeTexture8Impl *object;
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
HRESULT hrc = D3D_OK;
@@ -659,11 +714,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8
object->lpVtbl = &Direct3DVolumeTexture8_Vtbl;
object->ref = 1;
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateVolumeTexture(This->WineD3DDevice, Width, Height, Depth, Levels,
Usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(Format),
Pool, &object->wineD3DVolumeTexture, (IUnknown *)object);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (hrc != D3D_OK) {
@@ -680,9 +736,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8
return hrc;
}
-static HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface, UINT EdgeLength, UINT Levels, DWORD Usage,
- D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture8** ppCubeTexture) {
-
+static HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(IDirect3DDevice8 *iface, UINT EdgeLength,
+ UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture8 **ppCubeTexture)
+{
IDirect3DCubeTexture8Impl *object;
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
HRESULT hr = D3D_OK;
@@ -700,10 +756,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 i
object->lpVtbl = &Direct3DCubeTexture8_Vtbl;
object->ref = 1;
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DDevice_CreateCubeTexture(This->WineD3DDevice, EdgeLength, Levels, Usage & WINED3DUSAGE_MASK,
wined3dformat_from_d3dformat(Format), Pool, &object->wineD3DCubeTexture, (IUnknown *)object);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (hr != D3D_OK){
@@ -737,10 +794,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8
object->lpVtbl = &Direct3DVertexBuffer8_Vtbl;
object->ref = 1;
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage & WINED3DUSAGE_MASK,
0 /* fvf for ddraw only */, (WINED3DPOOL)Pool, &object->wineD3DVertexBuffer, (IUnknown *)object);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
object->fvf = FVF;
if (D3D_OK != hrc) {
@@ -775,10 +834,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 i
object->ref = 1;
object->format = wined3dformat_from_d3dformat(Format);
TRACE("Calling wined3d create index buffer\n");
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateIndexBuffer(This->WineD3DDevice, Length, Usage & WINED3DUSAGE_MASK,
(WINED3DPOOL)Pool, &object->wineD3DIndexBuffer, (IUnknown *)object);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (D3D_OK != hrc) {
@@ -794,7 +854,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 i
return hrc;
}
-static HRESULT IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface8 **ppSurface,D3DRESOURCETYPE Type, UINT Usage,D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality) {
+static HRESULT IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height,
+ D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface8 **ppSurface,
+ UINT Usage, D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality)
+{
HRESULT hrc;
IDirect3DSurface8Impl *object;
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
@@ -823,11 +886,12 @@ static HRESULT IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT
TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p\n", This, Width, Height, Format, *ppSurface);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, wined3dformat_from_d3dformat(Format),
- Lockable, Discard, Level, &object->wineD3DSurface, Type, Usage & WINED3DUSAGE_MASK,
- (WINED3DPOOL)Pool, MultiSample, MultisampleQuality, SURFACE_OPENGL, (IUnknown *)object);
- LeaveCriticalSection(&d3d8_cs);
+ Lockable, Discard, Level, &object->wineD3DSurface, Usage & WINED3DUSAGE_MASK, (WINED3DPOOL)Pool,
+ MultiSample, MultisampleQuality, SURFACE_OPENGL, (IUnknown *)object);
+ wined3d_mutex_unlock();
+
if (hrc != D3D_OK || NULL == object->wineD3DSurface) {
/* free up object */
FIXME("(%p) call to IWineD3DDevice_CreateSurface failed\n", This);
@@ -845,7 +909,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8
HRESULT hr;
TRACE("Relay\n");
- hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, Lockable, FALSE /* Discard */, 0 /* Level */ , ppSurface, D3DRTYPE_SURFACE, D3DUSAGE_RENDERTARGET, D3DPOOL_DEFAULT, MultiSample, 0);
+ hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, Lockable, FALSE /* Discard */,
+ 0 /* Level */, ppSurface, D3DUSAGE_RENDERTARGET, D3DPOOL_DEFAULT, MultiSample, 0);
+
return hr;
}
@@ -854,9 +920,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DD
TRACE("Relay\n");
/* TODO: Verify that Discard is false */
- hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, FALSE, 0 /* Level */
- ,ppSurface, D3DRTYPE_SURFACE, D3DUSAGE_DEPTHSTENCIL,
- D3DPOOL_DEFAULT, MultiSample, 0);
+ hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, FALSE,
+ 0 /* Level */, ppSurface, D3DUSAGE_DEPTHSTENCIL, D3DPOOL_DEFAULT, MultiSample, 0);
+
return hr;
}
@@ -865,8 +931,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8
HRESULT hr;
TRACE("Relay\n");
- hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Loackable */ , FALSE /*Discard*/ , 0 /* Level */ , ppSurface,
- D3DRTYPE_SURFACE, 0 /* Usage (undefined/none) */ , D3DPOOL_SYSTEMMEM, D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */);
+ hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, FALSE /* Discard */,
+ 0 /* Level */, ppSurface, 0 /* Usage (undefined/none) */, D3DPOOL_SYSTEMMEM, D3DMULTISAMPLE_NONE,
+ 0 /* MultisampleQuality */);
+
return hr;
}
@@ -886,25 +954,23 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, ID
/* Check that the source texture is in WINED3DPOOL_SYSTEMMEM and the destination texture is in WINED3DPOOL_DEFAULT */
- memset(&winedesc, 0, sizeof(winedesc));
- winedesc.Format = &srcFormat;
- winedesc.Width = &srcWidth;
- winedesc.Height = &srcHeight;
- winedesc.Size = &srcSize;
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DSurface_GetDesc(Source->wineD3DSurface, &winedesc);
+ srcFormat = winedesc.format;
+ srcWidth = winedesc.width;
+ srcHeight = winedesc.height;
+ srcSize = winedesc.size;
- winedesc.Format = &destFormat;
- winedesc.Width = &destWidth;
- winedesc.Height = &destHeight;
- winedesc.Size = NULL;
IWineD3DSurface_GetDesc(Dest->wineD3DSurface, &winedesc);
+ destFormat = winedesc.format;
+ destWidth = winedesc.width;
+ destHeight = winedesc.height;
/* Check that the source and destination formats match */
if (srcFormat != destFormat && WINED3DFMT_UNKNOWN != destFormat) {
WARN("(%p) source %p format must match the dest %p format, returning WINED3DERR_INVALIDCALL\n", iface, pSourceSurface, pDestinationSurface);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return WINED3DERR_INVALIDCALL;
} else if (WINED3DFMT_UNKNOWN == destFormat) {
TRACE("(%p) : Converting destination surface from WINED3DFMT_UNKNOWN to the source format\n", iface);
@@ -928,7 +994,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, ID
}
}
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -938,9 +1004,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_UpdateTexture(This->WineD3DDevice, ((IDirect3DBaseTexture8Impl *)pSourceTexture)->wineD3DBaseTexture, ((IDirect3DBaseTexture8Impl *)pDestinationTexture)->wineD3DBaseTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -956,9 +1023,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 ifac
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetFrontBufferData(This->WineD3DDevice, 0, destSurface->wineD3DSurface);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -970,7 +1038,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 ifa
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetDepthStencilSurface(This->WineD3DDevice, &original_ds);
if (hr == WINED3D_OK || hr == WINED3DERR_NOTFOUND)
@@ -982,7 +1050,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 ifa
}
if (original_ds) IWineD3DSurface_Release(original_ds);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -996,7 +1065,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetRenderTarget(LPDIRECT3DDEVICE8 i
if (ppRenderTarget == NULL) {
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetRenderTarget(This->WineD3DDevice, 0, &pRenderTarget);
if (hr == D3D_OK && pRenderTarget != NULL) {
@@ -1006,7 +1076,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetRenderTarget(LPDIRECT3DDEVICE8 i
FIXME("Call to IWineD3DDevice_GetRenderTarget failed\n");
*ppRenderTarget = NULL;
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -1021,7 +1091,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetDepthStencilSurface(LPDIRECT3DDE
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr=IWineD3DDevice_GetDepthStencilSurface(This->WineD3DDevice,&pZStencilSurface);
if (hr == WINED3D_OK) {
IWineD3DSurface_GetParent(pZStencilSurface,(IUnknown**)ppZStencilSurface);
@@ -1031,7 +1101,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetDepthStencilSurface(LPDIRECT3DDE
FIXME("Call to IWineD3DDevice_GetDepthStencilSurface failed with 0x%08x\n", hr);
*ppZStencilSurface = NULL;
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -1041,9 +1111,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_BeginScene(LPDIRECT3DDEVICE8 iface) {
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_BeginScene(This->WineD3DDevice);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1052,9 +1123,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) {
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_EndScene(This->WineD3DDevice);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1064,9 +1136,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD
TRACE("(%p) Relay\n" , This);
/* Note: D3DRECT is compatible with WINED3DRECT */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_Clear(This->WineD3DDevice, Count, (CONST WINED3DRECT*) pRects, Flags, Color, Z, Stencil);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1076,9 +1149,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface,
TRACE("(%p) Relay\n" , This);
/* Note: D3DMATRIX is compatible with WINED3DMATRIX */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetTransform(This->WineD3DDevice, State, (CONST WINED3DMATRIX*) lpMatrix);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1088,9 +1162,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetTransform(LPDIRECT3DDEVICE8 iface,
TRACE("(%p) Relay\n" , This);
/* Note: D3DMATRIX is compatible with WINED3DMATRIX */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetTransform(This->WineD3DDevice, State, (WINED3DMATRIX*) pMatrix);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1100,9 +1175,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_MultiplyTransform(LPDIRECT3DDEVICE8 i
TRACE("(%p) Relay\n" , This);
/* Note: D3DMATRIX is compatible with WINED3DMATRIX */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_MultiplyTransform(This->WineD3DDevice, State, (CONST WINED3DMATRIX*) pMatrix);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1112,9 +1188,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetViewport(LPDIRECT3DDEVICE8 iface,
TRACE("(%p) Relay\n" , This);
/* Note: D3DVIEWPORT8 is compatible with WINED3DVIEWPORT */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetViewport(This->WineD3DDevice, (const WINED3DVIEWPORT *)pViewport);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1124,9 +1201,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetViewport(LPDIRECT3DDEVICE8 iface,
TRACE("(%p) Relay\n" , This);
/* Note: D3DVIEWPORT8 is compatible with WINED3DVIEWPORT */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetViewport(This->WineD3DDevice, (WINED3DVIEWPORT *)pViewport);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1136,9 +1214,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetMaterial(LPDIRECT3DDEVICE8 iface,
TRACE("(%p) Relay\n" , This);
/* Note: D3DMATERIAL8 is compatible with WINED3DMATERIAL */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetMaterial(This->WineD3DDevice, (const WINED3DMATERIAL *)pMaterial);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1148,9 +1227,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetMaterial(LPDIRECT3DDEVICE8 iface,
TRACE("(%p) Relay\n" , This);
/* Note: D3DMATERIAL8 is compatible with WINED3DMATERIAL */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetMaterial(This->WineD3DDevice, (WINED3DMATERIAL *)pMaterial);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1158,11 +1238,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetLight(LPDIRECT3DDEVICE8 iface, DWO
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
HRESULT hr;
TRACE("(%p) Relay\n" , This);
-
+
/* Note: D3DLIGHT8 is compatible with WINED3DLIGHT */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetLight(This->WineD3DDevice, Index, (const WINED3DLIGHT *)pLight);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1172,9 +1253,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetLight(LPDIRECT3DDEVICE8 iface, DWO
TRACE("(%p) Relay\n" , This);
/* Note: D3DLIGHT8 is compatible with WINED3DLIGHT */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetLight(This->WineD3DDevice, Index, (WINED3DLIGHT *)pLight);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1183,9 +1265,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_LightEnable(LPDIRECT3DDEVICE8 iface,
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetLightEnable(This->WineD3DDevice, Index, Enable);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1194,9 +1277,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetLightEnable(LPDIRECT3DDEVICE8 ifac
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetLightEnable(This->WineD3DDevice, Index, pEnable);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1205,9 +1289,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetClipPlane(LPDIRECT3DDEVICE8 iface,
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetClipPlane(This->WineD3DDevice, Index, pPlane);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1216,9 +1301,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetClipPlane(LPDIRECT3DDEVICE8 iface,
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetClipPlane(This->WineD3DDevice, Index, pPlane);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1227,9 +1313,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 ifac
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetRenderState(This->WineD3DDevice, State, Value);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1238,9 +1325,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetRenderState(LPDIRECT3DDEVICE8 ifac
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetRenderState(This->WineD3DDevice, State, pValue);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1249,9 +1337,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_BeginStateBlock(LPDIRECT3DDEVICE8 ifa
HRESULT hr;
TRACE("(%p)\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_BeginStateBlock(This->WineD3DDevice);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1266,11 +1355,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_EndStateBlock(LPDIRECT3DDEVICE8 iface
/* Tell wineD3D to endstateblock before anything else (in case we run out
* of memory later and cause locking problems)
*/
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_EndStateBlock(This->WineD3DDevice , &wineD3DStateBlock);
if (hr != D3D_OK) {
WARN("IWineD3DDevice_EndStateBlock returned an error\n");
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -1281,8 +1370,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_EndStateBlock(LPDIRECT3DDEVICE8 iface
object->wineD3DStateBlock = wineD3DStateBlock;
- *pToken = d3d8_allocate_handle(&This->handle_table, object);
- LeaveCriticalSection(&d3d8_cs);
+ *pToken = d3d8_allocate_handle(&This->handle_table, object, D3D8_HANDLE_SB);
+ wined3d_mutex_unlock();
if (*pToken == D3D8_INVALID_HANDLE)
{
@@ -1304,16 +1393,17 @@ static HRESULT WINAPI IDirect3DDevice8Impl_ApplyStateBlock(LPDIRECT3DDEVICE8 ifa
TRACE("(%p) %#x Relay\n", This, Token);
- EnterCriticalSection(&d3d8_cs);
- pSB = d3d8_get_object(&This->handle_table, Token - 1);
+ wined3d_mutex_lock();
+ pSB = d3d8_get_object(&This->handle_table, Token - 1, D3D8_HANDLE_SB);
if (!pSB)
{
WARN("Invalid handle (%#x) passed.\n", Token);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return D3DERR_INVALIDCALL;
}
hr = IWineD3DStateBlock_Apply(pSB->wineD3DStateBlock);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1324,16 +1414,17 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CaptureStateBlock(LPDIRECT3DDEVICE8 i
TRACE("(%p) %#x Relay\n", This, Token);
- EnterCriticalSection(&d3d8_cs);
- pSB = d3d8_get_object(&This->handle_table, Token - 1);
+ wined3d_mutex_lock();
+ pSB = d3d8_get_object(&This->handle_table, Token - 1, D3D8_HANDLE_SB);
if (!pSB)
{
WARN("Invalid handle (%#x) passed.\n", Token);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return D3DERR_INVALIDCALL;
}
hr = IWineD3DStateBlock_Capture(pSB->wineD3DStateBlock);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1343,9 +1434,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeleteStateBlock(LPDIRECT3DDEVICE8 if
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
- pSB = d3d8_free_handle(&This->handle_table, Token - 1);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
+ pSB = d3d8_free_handle(&This->handle_table, Token - 1, D3D8_HANDLE_SB);
+ wined3d_mutex_unlock();
if (!pSB)
{
@@ -1388,19 +1479,19 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateStateBlock(IDirect3DDevice8 *if
object->lpVtbl = &Direct3DStateBlock8_Vtbl;
object->ref = 1;
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_CreateStateBlock(This->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)Type,
&object->wineD3DStateBlock, (IUnknown *)object);
if (FAILED(hr))
{
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
ERR("IWineD3DDevice_CreateStateBlock failed, hr %#x\n", hr);
HeapFree(GetProcessHeap(), 0, object);
return hr;
}
- *handle = d3d8_allocate_handle(&This->handle_table, object);
- LeaveCriticalSection(&d3d8_cs);
+ *handle = d3d8_allocate_handle(&This->handle_table, object, D3D8_HANDLE_SB);
+ wined3d_mutex_unlock();
if (*handle == D3D8_INVALID_HANDLE)
{
@@ -1420,9 +1511,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetClipStatus(LPDIRECT3DDEVICE8 iface
HRESULT hr;
TRACE("(%p) Relay\n" , This);
/* FIXME: Verify that D3DCLIPSTATUS8 ~= WINED3DCLIPSTATUS */
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetClipStatus(This->WineD3DDevice, (const WINED3DCLIPSTATUS *)pClipStatus);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1431,9 +1524,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetClipStatus(LPDIRECT3DDEVICE8 iface
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetClipStatus(This->WineD3DDevice, (WINED3DCLIPSTATUS *)pClipStatus);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1448,7 +1542,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, D
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
rc = IWineD3DDevice_GetTexture(This->WineD3DDevice, Stage, &retTexture);
if (rc == D3D_OK && NULL != retTexture) {
IWineD3DBaseTexture_GetParent(retTexture, (IUnknown **)ppTexture);
@@ -1457,7 +1551,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, D
FIXME("Call to get texture (%d) failed (%p)\n", Stage, retTexture);
*ppTexture = NULL;
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return rc;
}
@@ -1467,10 +1561,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, D
HRESULT hr;
TRACE("(%p) Relay %d %p\n" , This, Stage, pTexture);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetTexture(This->WineD3DDevice, Stage,
pTexture==NULL ? NULL : ((IDirect3DBaseTexture8Impl *)pTexture)->wineD3DBaseTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1518,12 +1613,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetTextureStageState(LPDIRECT3DDEVI
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
-
+ wined3d_mutex_lock();
if (l->sampler_state) hr = IWineD3DDevice_GetSamplerState(This->WineD3DDevice, Stage, l->state, pValue);
else hr = IWineD3DDevice_GetTextureStageState(This->WineD3DDevice, Stage, l->state, pValue);
+ wined3d_mutex_unlock();
- LeaveCriticalSection(&d3d8_cs);
return hr;
}
@@ -1533,12 +1627,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
-
+ wined3d_mutex_lock();
if (l->sampler_state) hr = IWineD3DDevice_SetSamplerState(This->WineD3DDevice, Stage, l->state, Value);
else hr = IWineD3DDevice_SetTextureStageState(This->WineD3DDevice, Stage, l->state, Value);
+ wined3d_mutex_unlock();
- LeaveCriticalSection(&d3d8_cs);
return hr;
}
@@ -1547,9 +1640,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_ValidateDevice(LPDIRECT3DDEVICE8 ifac
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_ValidateDevice(This->WineD3DDevice, pNumPasses);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1564,9 +1658,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetPaletteEntries(LPDIRECT3DDEVICE8 i
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetPaletteEntries(This->WineD3DDevice, PaletteNumber, pEntries);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1575,9 +1670,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetPaletteEntries(LPDIRECT3DDEVICE8 i
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetPaletteEntries(This->WineD3DDevice, PaletteNumber, pEntries);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1586,9 +1682,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetCurrentTexturePalette(LPDIRECT3DDE
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetCurrentTexturePalette(This->WineD3DDevice, PaletteNumber);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1597,22 +1694,26 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetCurrentTexturePalette(LPDIRECT3D
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetCurrentTexturePalette(This->WineD3DDevice, PaletteNumber);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-static HRESULT WINAPI IDirect3DDevice8Impl_DrawPrimitive(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount) {
- IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
+static HRESULT WINAPI IDirect3DDevice8Impl_DrawPrimitive(IDirect3DDevice8 *iface, D3DPRIMITIVETYPE PrimitiveType,
+ UINT StartVertex, UINT PrimitiveCount)
+{
+ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType);
hr = IWineD3DDevice_DrawPrimitive(This->WineD3DDevice, StartVertex,
vertex_count_from_primitive_count(PrimitiveType, PrimitiveCount));
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1622,11 +1723,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DrawIndexedPrimitive(LPDIRECT3DDEVICE
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType);
hr = IWineD3DDevice_DrawIndexedPrimitive(This->WineD3DDevice, MinVertexIndex, NumVertices,
startIndex, vertex_count_from_primitive_count(PrimitiveType, primCount));
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1635,12 +1737,13 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DrawPrimitiveUP(LPDIRECT3DDEVICE8 ifa
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType);
hr = IWineD3DDevice_DrawPrimitiveUP(This->WineD3DDevice,
vertex_count_from_primitive_count(PrimitiveType, PrimitiveCount),
pVertexStreamZeroData, VertexStreamZeroStride);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1652,12 +1755,13 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DrawIndexedPrimitiveUP(LPDIRECT3DDEVI
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType);
hr = IWineD3DDevice_DrawIndexedPrimitiveUP(This->WineD3DDevice, MinVertexIndex, NumVertexIndices,
vertex_count_from_primitive_count(PrimitiveType, PrimitiveCount), pIndexData,
wined3dformat_from_d3dformat(IndexDataFormat), pVertexStreamZeroData, VertexStreamZeroStride);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1667,9 +1771,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_ProcessVertices(LPDIRECT3DDEVICE8 ifa
IDirect3DVertexBuffer8Impl *dest = (IDirect3DVertexBuffer8Impl *) pDestBuffer;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_ProcessVertices(This->WineD3DDevice,SrcStartIndex, DestIndex, VertexCount, dest->wineD3DVertexBuffer, NULL, Flags, dest->fvf);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1704,10 +1809,11 @@ static HRESULT IDirect3DDevice8Impl_CreateVertexDeclaration(IDirect3DDevice8 *if
CopyMemory(object->elements, declaration, object->elements_size);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_CreateVertexDeclaration(This->WineD3DDevice, &object->wined3d_vertex_declaration,
(IUnknown *)object, wined3d_elements, wined3d_element_count);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, wined3d_elements);
if (FAILED(hr)) {
@@ -1726,7 +1832,6 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(LPDIRECT3DDEVICE8
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
HRESULT hrc = D3D_OK;
IDirect3DVertexShader8Impl *object;
- IWineD3DVertexDeclaration *wined3d_vertex_declaration;
const DWORD *token = pDeclaration;
DWORD handle;
@@ -1766,12 +1871,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(LPDIRECT3DDEVICE8
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
- handle = d3d8_allocate_handle(&This->handle_table, object);
+ wined3d_mutex_lock();
+ handle = d3d8_allocate_handle(&This->handle_table, object, D3D8_HANDLE_VS);
if (handle == D3D8_INVALID_HANDLE)
{
ERR("Failed to allocate shader handle\n");
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
IDirect3DVertexDeclaration8_Release(object->vertex_declaration);
HeapFree(GetProcessHeap(), 0, object);
*ppShader = 0;
@@ -1783,19 +1888,17 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(LPDIRECT3DDEVICE8
*ppShader = ((IDirect3DVertexDeclaration8Impl *)object->vertex_declaration)->shader_handle = shader_handle;
}
- wined3d_vertex_declaration = ((IDirect3DVertexDeclaration8Impl *)object->vertex_declaration)->wined3d_vertex_declaration;
-
if (pFunction)
{
/* Usage is missing ... Use SetRenderState to set the sw vp render state in SetVertexShader */
- hrc = IWineD3DDevice_CreateVertexShader(This->WineD3DDevice, wined3d_vertex_declaration,
- pFunction, &object->wineD3DVertexShader, (IUnknown *)object);
+ hrc = IWineD3DDevice_CreateVertexShader(This->WineD3DDevice, pFunction,
+ NULL /* output signature */, &object->wineD3DVertexShader, (IUnknown *)object);
if (FAILED(hrc))
{
/* free up object */
FIXME("Call to IWineD3DDevice_CreateVertexShader failed\n");
- d3d8_free_handle(&This->handle_table, handle);
+ d3d8_free_handle(&This->handle_table, handle, D3D8_HANDLE_VS);
IDirect3DVertexDeclaration8_Release(object->vertex_declaration);
HeapFree(GetProcessHeap(), 0, object);
*ppShader = 0;
@@ -1807,7 +1910,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(LPDIRECT3DDEVICE8
}
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return hrc;
}
@@ -1891,29 +1994,31 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetVertexShader(LPDIRECT3DDEVICE8 ifa
if (VS_HIGHESTFIXEDFXF >= pShader) {
TRACE("Setting FVF, %#x\n", pShader);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetVertexDeclaration(This->WineD3DDevice,
IDirect3DDevice8Impl_FindDecl(This, pShader)->wined3d_vertex_declaration);
IWineD3DDevice_SetVertexShader(This->WineD3DDevice, NULL);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return D3D_OK;
}
TRACE("Setting shader\n");
- EnterCriticalSection(&d3d8_cs);
- shader = d3d8_get_object(&This->handle_table, pShader - (VS_HIGHESTFIXEDFXF + 1));
+ wined3d_mutex_lock();
+ shader = d3d8_get_object(&This->handle_table, pShader - (VS_HIGHESTFIXEDFXF + 1), D3D8_HANDLE_VS);
if (!shader)
{
WARN("Invalid handle (%#x) passed.\n", pShader);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return D3DERR_INVALIDCALL;
}
hr = IWineD3DDevice_SetVertexDeclaration(This->WineD3DDevice,
((IDirect3DVertexDeclaration8Impl *)shader->vertex_declaration)->wined3d_vertex_declaration);
if (SUCCEEDED(hr)) hr = IWineD3DDevice_SetVertexShader(This->WineD3DDevice, shader->wineD3DVertexShader);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
TRACE("Returning hr %#x\n", hr);
@@ -1927,12 +2032,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShader(LPDIRECT3DDEVICE8 ifa
HRESULT hrc;
TRACE("(%p) : Relay device@%p\n", This, This->WineD3DDevice);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_GetVertexDeclaration(This->WineD3DDevice, &wined3d_declaration);
if (FAILED(hrc))
{
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
WARN("(%p) : Call to IWineD3DDevice_GetVertexDeclaration failed %#x (device %p)\n",
This, hrc, This->WineD3DDevice);
return hrc;
@@ -1940,14 +2045,14 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShader(LPDIRECT3DDEVICE8 ifa
if (!wined3d_declaration)
{
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
*ppShader = 0;
return D3D_OK;
}
hrc = IWineD3DVertexDeclaration_GetParent(wined3d_declaration, (IUnknown **)&d3d8_declaration);
IWineD3DVertexDeclaration_Release(wined3d_declaration);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hrc))
{
*ppShader = ((IDirect3DVertexDeclaration8Impl *)d3d8_declaration)->shader_handle;
@@ -1966,13 +2071,13 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeleteVertexShader(LPDIRECT3DDEVICE
TRACE("(%p) : pShader %#x\n", This, pShader);
- EnterCriticalSection(&d3d8_cs);
-
- shader = d3d8_free_handle(&This->handle_table, pShader - (VS_HIGHESTFIXEDFXF + 1));
+ wined3d_mutex_lock();
+ shader = d3d8_free_handle(&This->handle_table, pShader - (VS_HIGHESTFIXEDFXF + 1), D3D8_HANDLE_VS);
if (!shader)
{
WARN("Invalid handle (%#x) passed.\n", pShader);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return D3DERR_INVALIDCALL;
}
@@ -1984,7 +2089,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeleteVertexShader(LPDIRECT3DDEVICE
IWineD3DVertexShader_Release(cur);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (IUnknown_Release((IUnknown *)shader))
{
@@ -2005,9 +2110,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetVertexShaderConstant(LPDIRECT3DDEV
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetVertexShaderConstantF(This->WineD3DDevice, Register, pConstantData, ConstantCount);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -2022,9 +2128,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderConstant(LPDIRECT3DDEV
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetVertexShaderConstantF(This->WineD3DDevice, Register, pConstantData, ConstantCount);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -2035,10 +2142,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderDeclaration(LPDIRECT3D
TRACE("(%p) : pVertexShader 0x%08x, pData %p, *pSizeOfData %u\n", This, pVertexShader, pData, *pSizeOfData);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
+ shader = d3d8_get_object(&This->handle_table, pVertexShader - (VS_HIGHESTFIXEDFXF + 1), D3D8_HANDLE_VS);
+ wined3d_mutex_unlock();
- shader = d3d8_get_object(&This->handle_table, pVertexShader - (VS_HIGHESTFIXEDFXF + 1));
- LeaveCriticalSection(&d3d8_cs);
if (!shader)
{
WARN("Invalid handle (%#x) passed.\n", pVertexShader);
@@ -2071,26 +2178,26 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderFunction(LPDIRECT3DDEV
TRACE("(%p) : pVertexShader %#x, pData %p, pSizeOfData %p\n", This, pVertexShader, pData, pSizeOfData);
- EnterCriticalSection(&d3d8_cs);
-
- shader = d3d8_get_object(&This->handle_table, pVertexShader - (VS_HIGHESTFIXEDFXF + 1));
+ wined3d_mutex_lock();
+ shader = d3d8_get_object(&This->handle_table, pVertexShader - (VS_HIGHESTFIXEDFXF + 1), D3D8_HANDLE_VS);
if (!shader)
{
WARN("Invalid handle (%#x) passed.\n", pVertexShader);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return D3DERR_INVALIDCALL;
}
if (!shader->wineD3DVertexShader)
{
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
*pSizeOfData = 0;
return D3D_OK;
}
hr = IWineD3DVertexShader_GetFunction(shader->wineD3DVertexShader, pData, pSizeOfData);
+ wined3d_mutex_unlock();
- LeaveCriticalSection(&d3d8_cs);
return hr;
}
@@ -2100,18 +2207,19 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetIndices(LPDIRECT3DDEVICE8 iface, I
IDirect3DIndexBuffer8Impl *ib = (IDirect3DIndexBuffer8Impl *)pIndexData;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
/* WineD3D takes an INT(due to d3d9), but d3d8 uses UINTs. Do I have to add a check here that
* the UINT doesn't cause an overflow in the INT? It seems rather unlikely because such large
* vertex buffers can't be created to address them with an index that requires the 32nd bit
* (4 Byte minimum vertex size * 2^31-1 -> 8 gb buffer. The index sign would be the least
* problem)
*/
+ wined3d_mutex_lock();
IWineD3DDevice_SetBaseVertexIndex(This->WineD3DDevice, baseVertexIndex);
hr = IWineD3DDevice_SetIndices(This->WineD3DDevice,
ib ? ib->wineD3DIndexBuffer : NULL,
ib ? ib->format : WINED3DFMT_UNKNOWN);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -2126,8 +2234,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetIndices(LPDIRECT3DDEVICE8 iface, I
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
/* The case from UINT to INT is safe because d3d8 will never set negative values */
+ wined3d_mutex_lock();
IWineD3DDevice_GetBaseVertexIndex(This->WineD3DDevice, (INT *) pBaseVertexIndex);
rc = IWineD3DDevice_GetIndices(This->WineD3DDevice, &retIndexData);
if (SUCCEEDED(rc) && retIndexData) {
@@ -2137,7 +2245,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetIndices(LPDIRECT3DDEVICE8 iface, I
if (FAILED(rc)) FIXME("Call to GetIndices failed\n");
*ppIndexData = NULL;
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return rc;
}
@@ -2164,20 +2272,21 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreatePixelShader(LPDIRECT3DDEVICE8 i
object->ref = 1;
object->lpVtbl = &Direct3DPixelShader8_Vtbl;
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_CreatePixelShader(This->WineD3DDevice, pFunction,
NULL, &object->wineD3DPixelShader, (IUnknown *)object);
if (FAILED(hr))
{
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
FIXME("(%p) call to IWineD3DDevice_CreatePixelShader failed\n", This);
HeapFree(GetProcessHeap(), 0 , object);
*ppShader = 0;
return hr;
}
- handle = d3d8_allocate_handle(&This->handle_table, object);
- LeaveCriticalSection(&d3d8_cs);
+ handle = d3d8_allocate_handle(&This->handle_table, object, D3D8_HANDLE_PS);
+ wined3d_mutex_unlock();
+
if (handle == D3D8_INVALID_HANDLE)
{
ERR("Failed to allocate shader handle\n");
@@ -2198,26 +2307,27 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetPixelShader(LPDIRECT3DDEVICE8 ifac
TRACE("(%p) : pShader %#x\n", This, pShader);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
if (!pShader)
{
hr = IWineD3DDevice_SetPixelShader(This->WineD3DDevice, NULL);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return hr;
}
- shader = d3d8_get_object(&This->handle_table, pShader - (VS_HIGHESTFIXEDFXF + 1));
+ shader = d3d8_get_object(&This->handle_table, pShader - (VS_HIGHESTFIXEDFXF + 1), D3D8_HANDLE_PS);
if (!shader)
{
WARN("Invalid handle (%#x) passed.\n", pShader);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return D3DERR_INVALIDCALL;
}
TRACE("(%p) : Setting shader %p\n", This, shader);
hr = IWineD3DDevice_SetPixelShader(This->WineD3DDevice, shader->wineD3DPixelShader);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -2232,7 +2342,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShader(LPDIRECT3DDEVICE8 ifac
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_GetPixelShader(This->WineD3DDevice, &object);
if (D3D_OK == hrc && NULL != object) {
IDirect3DPixelShader8Impl *d3d8_shader;
@@ -2243,9 +2353,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShader(LPDIRECT3DDEVICE8 ifac
} else {
*ppShader = 0;
}
+ wined3d_mutex_unlock();
TRACE("(%p) : returning %#x\n", This, *ppShader);
- LeaveCriticalSection(&d3d8_cs);
+
return hrc;
}
@@ -2256,14 +2367,14 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeletePixelShader(LPDIRECT3DDEVICE8 i
TRACE("(%p) : pShader %#x\n", This, pShader);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
- shader = d3d8_free_handle(&This->handle_table, pShader - (VS_HIGHESTFIXEDFXF + 1));
+ shader = d3d8_free_handle(&This->handle_table, pShader - (VS_HIGHESTFIXEDFXF + 1), D3D8_HANDLE_PS);
if (!shader)
{
WARN("Invalid handle (%#x) passed.\n", pShader);
- LeaveCriticalSection(&d3d8_cs);
- return D3DERR_INVALIDCALL;
+ wined3d_mutex_unlock();
+ return D3D_OK;
}
IWineD3DDevice_GetPixelShader(This->WineD3DDevice, &cur);
@@ -2274,7 +2385,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeletePixelShader(LPDIRECT3DDEVICE8 i
IWineD3DPixelShader_Release(cur);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (IUnknown_Release((IUnknown *)shader))
{
@@ -2289,9 +2400,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetPixelShaderConstant(LPDIRECT3DDE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetPixelShaderConstantF(This->WineD3DDevice, Register, pConstantData, ConstantCount);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -2300,9 +2412,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShaderConstant(LPDIRECT3DDEVI
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetPixelShaderConstantF(This->WineD3DDevice, Register, pConstantData, ConstantCount);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -2313,17 +2426,19 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShaderFunction(LPDIRECT3DDEVI
TRACE("(%p) : pPixelShader %#x, pData %p, pSizeOfData %p\n", This, pPixelShader, pData, pSizeOfData);
- EnterCriticalSection(&d3d8_cs);
- shader = d3d8_get_object(&This->handle_table, pPixelShader - (VS_HIGHESTFIXEDFXF + 1));
+ wined3d_mutex_lock();
+ shader = d3d8_get_object(&This->handle_table, pPixelShader - (VS_HIGHESTFIXEDFXF + 1), D3D8_HANDLE_PS);
if (!shader)
{
WARN("Invalid handle (%#x) passed.\n", pPixelShader);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return D3DERR_INVALIDCALL;
}
hr = IWineD3DPixelShader_GetFunction(shader->wineD3DPixelShader, pData, pSizeOfData);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -2332,9 +2447,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DrawRectPatch(LPDIRECT3DDEVICE8 iface
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_DrawRectPatch(This->WineD3DDevice, Handle, pNumSegs, (CONST WINED3DRECTPATCH_INFO *)pRectPatchInfo);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -2343,9 +2459,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DrawTriPatch(LPDIRECT3DDEVICE8 iface,
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_DrawTriPatch(This->WineD3DDevice, Handle, pNumSegs, (CONST WINED3DTRIPATCH_INFO *)pTriPatchInfo);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -2354,9 +2471,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeletePatch(LPDIRECT3DDEVICE8 iface,
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_DeletePatch(This->WineD3DDevice, Handle);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -2365,11 +2483,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetStreamSource(LPDIRECT3DDEVICE8 ifa
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetStreamSource(This->WineD3DDevice, StreamNumber,
NULL == pStreamData ? NULL : ((IDirect3DVertexBuffer8Impl *)pStreamData)->wineD3DVertexBuffer,
0/* Offset in bytes */, Stride);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -2384,7 +2503,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetStreamSource(LPDIRECT3DDEVICE8 ifa
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
rc = IWineD3DDevice_GetStreamSource(This->WineD3DDevice, StreamNumber, &retStream, 0 /* Offset in bytes */, pStride);
if (rc == D3D_OK && NULL != retStream) {
IWineD3DBuffer_GetParent(retStream, (IUnknown **)pStream);
@@ -2395,7 +2514,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetStreamSource(LPDIRECT3DDEVICE8 ifa
}
*pStream = NULL;
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return rc;
}
@@ -2564,8 +2683,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParen
hr = IDirect3DDevice8Impl_CreateSurface((IDirect3DDevice8 *)This, width, height,
d3dformat_from_wined3dformat(format), lockable, FALSE /* Discard */, level,
- (IDirect3DSurface8 **)&d3d_surface, D3DRTYPE_SURFACE, usage, pool,
- D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */);
+ (IDirect3DSurface8 **)&d3d_surface, usage, pool, D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */);
if (FAILED(hr))
{
ERR("(%p) CreateSurface failed, returning %#x\n", iface, hr);
diff --git a/reactos/dll/directx/wine/d3d8/directx.c b/reactos/dll/directx/wine/d3d8/directx.c
index d39d3d64768..3368794d732 100644
--- a/reactos/dll/directx/wine/d3d8/directx.c
+++ b/reactos/dll/directx/wine/d3d8/directx.c
@@ -71,9 +71,11 @@ static ULONG WINAPI IDirect3D8Impl_Release(LPDIRECT3D8 iface) {
if (ref == 0) {
TRACE("Releasing wined3d %p\n", This->WineD3D);
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
IWineD3D_Release(This->WineD3D);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This);
}
@@ -86,9 +88,10 @@ static HRESULT WINAPI IDirect3D8Impl_RegisterSoftwareDevice (LPDIRECT3D8 iface,
HRESULT hr;
TRACE("(%p)->(%p)\n", This, pInitializeFunction);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_RegisterSoftwareDevice(This->WineD3D, pInitializeFunction);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -97,36 +100,41 @@ static UINT WINAPI IDirect3D8Impl_GetAdapterCount (LPDIRECT3D8 iface) {
HRESULT hr;
TRACE("(%p)\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_GetAdapterCount(This->WineD3D);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-static HRESULT WINAPI IDirect3D8Impl_GetAdapterIdentifier (LPDIRECT3D8 iface,
- UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER8* pIdentifier) {
+static HRESULT WINAPI IDirect3D8Impl_GetAdapterIdentifier(LPDIRECT3D8 iface,
+ UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER8 *pIdentifier)
+{
IDirect3D8Impl *This = (IDirect3D8Impl *)iface;
WINED3DADAPTER_IDENTIFIER adapter_id;
HRESULT hr;
TRACE("(%p)->(%d,%08x, %p\n", This, Adapter, Flags, pIdentifier);
- EnterCriticalSection(&d3d8_cs);
- /* dx8 and dx9 have different structures to be filled in, with incompatible
- layouts so pass in pointers to the places to be filled via an internal
- structure */
- adapter_id.Driver = pIdentifier->Driver;
- adapter_id.Description = pIdentifier->Description;
- adapter_id.DeviceName = NULL; /* d3d9 only */
- adapter_id.DriverVersion = &pIdentifier->DriverVersion;
- adapter_id.VendorId = &pIdentifier->VendorId;
- adapter_id.DeviceId = &pIdentifier->DeviceId;
- adapter_id.SubSysId = &pIdentifier->SubSysId;
- adapter_id.Revision = &pIdentifier->Revision;
- adapter_id.DeviceIdentifier = &pIdentifier->DeviceIdentifier;
- adapter_id.WHQLLevel = &pIdentifier->WHQLLevel;
+ adapter_id.driver = pIdentifier->Driver;
+ adapter_id.driver_size = sizeof(pIdentifier->Driver);
+ adapter_id.description = pIdentifier->Description;
+ adapter_id.description_size = sizeof(pIdentifier->Description);
+ adapter_id.device_name = NULL; /* d3d9 only */
+ adapter_id.device_name_size = 0; /* d3d9 only */
+
+ wined3d_mutex_lock();
hr = IWineD3D_GetAdapterIdentifier(This->WineD3D, Adapter, Flags, &adapter_id);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
+ pIdentifier->DriverVersion = adapter_id.driver_version;
+ pIdentifier->VendorId = adapter_id.vendor_id;
+ pIdentifier->DeviceId = adapter_id.device_id;
+ pIdentifier->SubSysId = adapter_id.subsystem_id;
+ pIdentifier->Revision = adapter_id.revision;
+ memcpy(&pIdentifier->DeviceIdentifier, &adapter_id.device_identifier, sizeof(pIdentifier->DeviceIdentifier));
+ pIdentifier->WHQLLevel = adapter_id.whql_level;
+
return hr;
}
@@ -135,9 +143,10 @@ static UINT WINAPI IDirect3D8Impl_GetAdapterModeCount (LPDIRECT3D8 iface,UINT Ad
HRESULT hr;
TRACE("(%p)->(%d)\n", This, Adapter);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_GetAdapterModeCount(This->WineD3D, Adapter, 0 /* format */);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -146,9 +155,9 @@ static HRESULT WINAPI IDirect3D8Impl_EnumAdapterModes (LPDIRECT3D8 iface, UINT A
HRESULT hr;
TRACE("(%p)->(%d, %d, %p)\n", This, Adapter, Mode, pMode);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_EnumAdapterModes(This->WineD3D, Adapter, WINED3DFMT_UNKNOWN, Mode, (WINED3DDISPLAYMODE *) pMode);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
@@ -160,9 +169,9 @@ static HRESULT WINAPI IDirect3D8Impl_GetAdapterDisplayMode (LPDIRECT3D8 iface, U
HRESULT hr;
TRACE("(%p)->(%d,%p)\n", This, Adapter, pMode);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_GetAdapterDisplayMode(This->WineD3D, Adapter, (WINED3DDISPLAYMODE *) pMode);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
@@ -176,10 +185,11 @@ static HRESULT WINAPI IDirect3D8Impl_CheckDeviceType (LPDIRECT3D8 i
HRESULT hr;
TRACE("(%p)->(%d, %d, %d, %d, %s)\n", This, Adapter, CheckType, DisplayFormat, BackBufferFormat, Windowed ? "true" : "false");
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_CheckDeviceType(This->WineD3D, Adapter, CheckType, wined3dformat_from_d3dformat(DisplayFormat),
wined3dformat_from_d3dformat(BackBufferFormat), Windowed);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -191,6 +201,14 @@ static HRESULT WINAPI IDirect3D8Impl_CheckDeviceFormat (LPDIRECT3D8 i
WINED3DRESOURCETYPE WineD3DRType;
TRACE("(%p)->(%d, %d, %d, %08x, %d, %d)\n", This, Adapter, DeviceType, AdapterFormat, Usage, RType, CheckFormat);
+ if(CheckFormat == D3DFMT_R8G8B8)
+ {
+ /* See comment in dlls/d3d9/directx.c, IDirect3D9Impl_CheckDeviceFormat for details */
+ WARN("D3DFMT_R8G8B8 is not available on windows, returning D3DERR_NOTAVAILABLE\n");
+ return D3DERR_NOTAVAILABLE;
+ }
+
+
switch(RType) {
case D3DRTYPE_VERTEXBUFFER:
case D3DRTYPE_INDEXBUFFER:
@@ -202,42 +220,59 @@ static HRESULT WINAPI IDirect3D8Impl_CheckDeviceFormat (LPDIRECT3D8 i
break;
}
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_CheckDeviceFormat(This->WineD3D, Adapter, DeviceType, wined3dformat_from_d3dformat(AdapterFormat),
Usage, WineD3DRType, wined3dformat_from_d3dformat(CheckFormat), SURFACE_OPENGL);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-static HRESULT WINAPI IDirect3D8Impl_CheckDeviceMultiSampleType(LPDIRECT3D8 iface,
- UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat,
- BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType) {
+static HRESULT WINAPI IDirect3D8Impl_CheckDeviceMultiSampleType(IDirect3D8 *iface, UINT Adapter,
+ D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat, BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType)
+{
IDirect3D8Impl *This = (IDirect3D8Impl *)iface;
HRESULT hr;
TRACE("(%p)-<(%d, %d, %d, %s, %d)\n", This, Adapter, DeviceType, SurfaceFormat, Windowed ? "true" : "false", MultiSampleType);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_CheckDeviceMultiSampleType(This->WineD3D, Adapter, DeviceType,
wined3dformat_from_d3dformat(SurfaceFormat), Windowed, (WINED3DMULTISAMPLE_TYPE) MultiSampleType, NULL);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-static HRESULT WINAPI IDirect3D8Impl_CheckDepthStencilMatch(LPDIRECT3D8 iface,
- UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat,
- D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat) {
+static HRESULT WINAPI IDirect3D8Impl_CheckDepthStencilMatch(IDirect3D8 *iface, UINT Adapter, D3DDEVTYPE DeviceType,
+ D3DFORMAT AdapterFormat, D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat)
+{
IDirect3D8Impl *This = (IDirect3D8Impl *)iface;
HRESULT hr;
TRACE("(%p)-<(%d, %d, %d, %d, %d)\n", This, Adapter, DeviceType, AdapterFormat, RenderTargetFormat, DepthStencilFormat);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_CheckDepthStencilMatch(This->WineD3D, Adapter, DeviceType,
wined3dformat_from_d3dformat(AdapterFormat), wined3dformat_from_d3dformat(RenderTargetFormat),
wined3dformat_from_d3dformat(DepthStencilFormat));
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
+void fixup_caps(WINED3DCAPS *caps)
+{
+ /* D3D8 doesn't support SM 2.0 or higher, so clamp to 1.x */
+ if (caps->PixelShaderVersion > D3DPS_VERSION(1,4)) {
+ caps->PixelShaderVersion = D3DPS_VERSION(1,4);
+ }
+ if (caps->VertexShaderVersion > D3DVS_VERSION(1,1)) {
+ caps->VertexShaderVersion = D3DVS_VERSION(1,1);
+ }
+ caps->MaxVertexShaderConst = min(D3D8_MAX_VERTEX_SHADER_CONSTANTF, caps->MaxVertexShaderConst);
+
+ caps->StencilCaps &= ~WINED3DSTENCILCAPS_TWOSIDED;
+}
+
static HRESULT WINAPI IDirect3D8Impl_GetDeviceCaps(LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS8* pCaps) {
IDirect3D8Impl *This = (IDirect3D8Impl *)iface;
HRESULT hrc = D3D_OK;
@@ -252,21 +287,15 @@ static HRESULT WINAPI IDirect3D8Impl_GetDeviceCaps(LPDIRECT3D8 iface, UINT Ada
if(pWineCaps == NULL){
return D3DERR_INVALIDCALL; /*well this is what MSDN says to return*/
}
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, pWineCaps);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
+ fixup_caps(pWineCaps);
WINECAPSTOD3D8CAPS(pCaps, pWineCaps)
HeapFree(GetProcessHeap(), 0, pWineCaps);
- /* D3D8 doesn't support SM 2.0 or higher, so clamp to 1.x */
- if(pCaps->PixelShaderVersion > D3DPS_VERSION(1,4)){
- pCaps->PixelShaderVersion = D3DPS_VERSION(1,4);
- }
- if(pCaps->VertexShaderVersion > D3DVS_VERSION(1,1)){
- pCaps->VertexShaderVersion = D3DVS_VERSION(1,1);
- }
- pCaps->MaxVertexShaderConst = min(D3D8_MAX_VERTEX_SHADER_CONSTANTF, pCaps->MaxVertexShaderConst);
-
TRACE("(%p) returning %p\n", This, pCaps);
return hrc;
}
@@ -276,9 +305,10 @@ static HMONITOR WINAPI IDirect3D8Impl_GetAdapterMonitor(LPDIRECT3D8 iface, UINT
HMONITOR ret;
TRACE("(%p)->(%d)\n", This, Adapter);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3D_GetAdapterMonitor(This->WineD3D, Adapter);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -344,14 +374,15 @@ static HRESULT WINAPI IDirect3D8Impl_CreateDevice(LPDIRECT3D8 iface, UINT Adapte
*ppReturnedDeviceInterface = (IDirect3DDevice8 *)object;
/* Allocate an associated WineD3DDevice object */
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_CreateDevice(This->WineD3D, Adapter, DeviceType, hFocusWindow, BehaviourFlags,
(IUnknown *)object, (IWineD3DDeviceParent *)&object->device_parent_vtbl, &object->WineD3DDevice);
if (hr != D3D_OK) {
HeapFree(GetProcessHeap(), 0, object);
*ppReturnedDeviceInterface = NULL;
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -378,7 +409,7 @@ static HRESULT WINAPI IDirect3D8Impl_CreateDevice(LPDIRECT3D8 iface, UINT Adapte
}
hr = IWineD3DDevice_Init3D(object->WineD3DDevice, &localParameters);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
pPresentationParameters->BackBufferWidth = localParameters.BackBufferWidth;
pPresentationParameters->BackBufferHeight = localParameters.BackBufferHeight;
@@ -404,9 +435,11 @@ static HRESULT WINAPI IDirect3D8Impl_CreateDevice(LPDIRECT3D8 iface, UINT Adapte
object->decls = HeapAlloc(GetProcessHeap(), 0, object->declArraySize * sizeof(*object->decls));
if(!object->decls) {
ERR("Out of memory\n");
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
IWineD3DDevice_Release(object->WineD3DDevice);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, object);
*ppReturnedDeviceInterface = NULL;
hr = E_OUTOFMEMORY;
diff --git a/reactos/dll/directx/wine/d3d8/indexbuffer.c b/reactos/dll/directx/wine/d3d8/indexbuffer.c
index a0de5c5caf0..b59b1ab292d 100644
--- a/reactos/dll/directx/wine/d3d8/indexbuffer.c
+++ b/reactos/dll/directx/wine/d3d8/indexbuffer.c
@@ -56,9 +56,10 @@ static ULONG WINAPI IDirect3DIndexBuffer8Impl_Release(LPDIRECT3DINDEXBUFFER8 ifa
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DBuffer_Release(This->wineD3DIndexBuffer);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
IUnknown_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -72,14 +73,15 @@ static HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetDevice(LPDIRECT3DINDEXBUFFER8
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetDevice(This->wineD3DIndexBuffer, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -88,9 +90,10 @@ static HRESULT WINAPI IDirect3DIndexBuffer8Impl_SetPrivateData(LPDIRECT3DINDEXBU
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_SetPrivateData(This->wineD3DIndexBuffer, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -99,9 +102,10 @@ static HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetPrivateData(LPDIRECT3DINDEXBU
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetPrivateData(This->wineD3DIndexBuffer, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -110,9 +114,10 @@ static HRESULT WINAPI IDirect3DIndexBuffer8Impl_FreePrivateData(LPDIRECT3DINDEXB
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_FreePrivateData(This->wineD3DIndexBuffer, refguid);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -121,9 +126,10 @@ static DWORD WINAPI IDirect3DIndexBuffer8Impl_SetPriority(LPDIRECT3DINDEXBUFFER8
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DBuffer_SetPriority(This->wineD3DIndexBuffer, PriorityNew);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -132,9 +138,10 @@ static DWORD WINAPI IDirect3DIndexBuffer8Impl_GetPriority(LPDIRECT3DINDEXBUFFER8
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DBuffer_GetPriority(This->wineD3DIndexBuffer);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -142,9 +149,9 @@ static void WINAPI IDirect3DIndexBuffer8Impl_PreLoad(LPDIRECT3DINDEXBUFFER8 ifac
IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DBuffer_PreLoad(This->wineD3DIndexBuffer);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
}
static D3DRESOURCETYPE WINAPI IDirect3DIndexBuffer8Impl_GetType(LPDIRECT3DINDEXBUFFER8 iface) {
@@ -160,9 +167,10 @@ static HRESULT WINAPI IDirect3DIndexBuffer8Impl_Lock(LPDIRECT3DINDEXBUFFER8 ifac
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_Map(This->wineD3DIndexBuffer, OffsetToLock, SizeToLock, ppbData, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -171,9 +179,10 @@ static HRESULT WINAPI IDirect3DIndexBuffer8Impl_Unlock(LPDIRECT3DINDEXBUFFER8 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_Unmap(This->wineD3DIndexBuffer);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -183,9 +192,9 @@ static HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetDesc(LPDIRECT3DINDEXBUFFER8 i
WINED3DBUFFER_DESC desc;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetDesc(This->wineD3DIndexBuffer, &desc);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hr)) {
pDesc->Format = d3dformat_from_wined3dformat(This->format);
diff --git a/reactos/dll/directx/wine/d3d8/pixelshader.c b/reactos/dll/directx/wine/d3d8/pixelshader.c
index ae8d15fa63f..2f0fb1c4c32 100644
--- a/reactos/dll/directx/wine/d3d8/pixelshader.c
+++ b/reactos/dll/directx/wine/d3d8/pixelshader.c
@@ -56,9 +56,10 @@ static ULONG WINAPI IDirect3DPixelShader8Impl_Release(IDirect3DPixelShader8 * if
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DPixelShader_Release(This->wineD3DPixelShader);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
diff --git a/reactos/dll/directx/wine/d3d8/stateblock.c b/reactos/dll/directx/wine/d3d8/stateblock.c
index ace9211e0a9..04c4e484826 100644
--- a/reactos/dll/directx/wine/d3d8/stateblock.c
+++ b/reactos/dll/directx/wine/d3d8/stateblock.c
@@ -58,9 +58,10 @@ static ULONG WINAPI IDirect3DStateBlock8Impl_Release(IDirect3DStateBlock8 *iface
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DStateBlock_Release(This->wineD3DStateBlock);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
@@ -74,16 +75,14 @@ static HRESULT WINAPI IDirect3DStateBlock8Impl_GetDevice(IDirect3DStateBlock8 *i
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
-
+ wined3d_mutex_lock();
hr = IWineD3DStateBlock_GetDevice(This->wineD3DStateBlock, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
-
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -94,11 +93,9 @@ static HRESULT WINAPI IDirect3DStateBlock8Impl_Capture(IDirect3DStateBlock8 *ifa
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
-
+ wined3d_mutex_lock();
hr = IWineD3DStateBlock_Capture(This->wineD3DStateBlock);
-
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -109,11 +106,9 @@ static HRESULT WINAPI IDirect3DStateBlock8Impl_Apply(IDirect3DStateBlock8 *iface
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
-
+ wined3d_mutex_lock();
hr = IWineD3DStateBlock_Apply(This->wineD3DStateBlock);
-
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
return hr;
}
diff --git a/reactos/dll/directx/wine/d3d8/surface.c b/reactos/dll/directx/wine/d3d8/surface.c
index 4b382ecbc98..3185a1f88ac 100644
--- a/reactos/dll/directx/wine/d3d8/surface.c
+++ b/reactos/dll/directx/wine/d3d8/surface.c
@@ -76,9 +76,10 @@ static ULONG WINAPI IDirect3DSurface8Impl_Release(LPDIRECT3DSURFACE8 iface) {
if (This->parentDevice) IUnknown_Release(This->parentDevice);
/* Implicit surfaces are destroyed with the device, not if refcount reaches 0. */
if (!This->isImplicit) {
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DSurface_Release(This->wineD3DSurface);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This);
}
}
@@ -94,14 +95,15 @@ static HRESULT WINAPI IDirect3DSurface8Impl_GetDevice(LPDIRECT3DSURFACE8 iface,
HRESULT hr;
TRACE("(%p)->(%p)\n", This, ppDevice);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_GetDevice(This->wineD3DSurface, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -110,9 +112,10 @@ static HRESULT WINAPI IDirect3DSurface8Impl_SetPrivateData(LPDIRECT3DSURFACE8 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_SetPrivateData(This->wineD3DSurface, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -121,9 +124,10 @@ static HRESULT WINAPI IDirect3DSurface8Impl_GetPrivateData(LPDIRECT3DSURFACE8 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_GetPrivateData(This->wineD3DSurface, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -132,9 +136,10 @@ static HRESULT WINAPI IDirect3DSurface8Impl_FreePrivateData(LPDIRECT3DSURFACE8 i
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_FreePrivateData(This->wineD3DSurface, refguid);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -159,22 +164,21 @@ static HRESULT WINAPI IDirect3DSurface8Impl_GetDesc(LPDIRECT3DSURFACE8 iface, D3
HRESULT hr;
TRACE("(%p) Relay\n", This);
- /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */
- memset(&wined3ddesc, 0, sizeof(wined3ddesc));
- wined3ddesc.Format = (WINED3DFORMAT *)&pDesc->Format;
- wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type;
- wined3ddesc.Usage = &pDesc->Usage;
- wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool;
- wined3ddesc.Size = &pDesc->Size;
- wined3ddesc.MultiSampleType = (WINED3DMULTISAMPLE_TYPE *) &pDesc->MultiSampleType;
- wined3ddesc.Width = &pDesc->Width;
- wined3ddesc.Height = &pDesc->Height;
-
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_GetDesc(This->wineD3DSurface, &wined3ddesc);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
- if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(pDesc->Format);
+ if (SUCCEEDED(hr))
+ {
+ pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.format);
+ pDesc->Type = wined3ddesc.resource_type;
+ pDesc->Usage = wined3ddesc.usage;
+ pDesc->Pool = wined3ddesc.pool;
+ pDesc->Size = wined3ddesc.size;
+ pDesc->MultiSampleType = wined3ddesc.multisample_type;
+ pDesc->Width = wined3ddesc.width;
+ pDesc->Height = wined3ddesc.height;
+ }
return hr;
}
@@ -185,7 +189,7 @@ static HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D
TRACE("(%p) Relay\n", This);
TRACE("(%p) calling IWineD3DSurface_LockRect %p %p %p %d\n", This, This->wineD3DSurface, pLockedRect, pRect, Flags);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
if (pRect) {
D3DSURFACE_DESC desc;
IDirect3DSurface8_GetDesc(iface, &desc);
@@ -197,13 +201,15 @@ static HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D
|| (pRect->right > desc.Width)
|| (pRect->bottom > desc.Height)) {
WARN("Trying to lock an invalid rectangle, returning D3DERR_INVALIDCALL\n");
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return D3DERR_INVALIDCALL;
}
}
hr = IWineD3DSurface_LockRect(This->wineD3DSurface, (WINED3DLOCKED_RECT *) pLockedRect, pRect, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -212,9 +218,10 @@ static HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface)
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_UnlockRect(This->wineD3DSurface);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
switch(hr)
{
case WINEDDERR_NOTLOCKED: return D3DERR_INVALIDCALL;
diff --git a/reactos/dll/directx/wine/d3d8/swapchain.c b/reactos/dll/directx/wine/d3d8/swapchain.c
index 25d2a0ee346..67f3429cad6 100644
--- a/reactos/dll/directx/wine/d3d8/swapchain.c
+++ b/reactos/dll/directx/wine/d3d8/swapchain.c
@@ -56,9 +56,10 @@ static ULONG WINAPI IDirect3DSwapChain8Impl_Release(LPDIRECT3DSWAPCHAIN8 iface)
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DSwapChain_Destroy(This->wineD3DSwapChain, D3D8CB_DestroyRenderTarget);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
if (This->parentDevice) IUnknown_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -71,9 +72,10 @@ static HRESULT WINAPI IDirect3DSwapChain8Impl_Present(LPDIRECT3DSWAPCHAIN8 iface
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSwapChain_Present(This->wineD3DSwapChain, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion, 0);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -84,13 +86,14 @@ static HRESULT WINAPI IDirect3DSwapChain8Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN8
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DSwapChain_GetBackBuffer(This->wineD3DSwapChain, iBackBuffer, (WINED3DBACKBUFFER_TYPE )Type, &mySurface);
if (hrc == D3D_OK && NULL != mySurface) {
IWineD3DSurface_GetParent(mySurface, (IUnknown **)ppBackBuffer);
IWineD3DSurface_Release(mySurface);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hrc;
}
diff --git a/reactos/dll/directx/wine/d3d8/texture.c b/reactos/dll/directx/wine/d3d8/texture.c
index c1bb91ece65..c22c49111b8 100644
--- a/reactos/dll/directx/wine/d3d8/texture.c
+++ b/reactos/dll/directx/wine/d3d8/texture.c
@@ -57,9 +57,10 @@ static ULONG WINAPI IDirect3DTexture8Impl_Release(LPDIRECT3DTEXTURE8 iface) {
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DTexture_Destroy(This->wineD3DTexture, D3D8CB_DestroySurface);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
IUnknown_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -72,14 +73,16 @@ static HRESULT WINAPI IDirect3DTexture8Impl_GetDevice(LPDIRECT3DTEXTURE8 iface,
IWineD3DDevice *wined3d_device;
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DTexture_GetDevice(This->wineD3DTexture, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -88,9 +91,10 @@ static HRESULT WINAPI IDirect3DTexture8Impl_SetPrivateData(LPDIRECT3DTEXTURE8 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_SetPrivateData(This->wineD3DTexture, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -99,9 +103,10 @@ static HRESULT WINAPI IDirect3DTexture8Impl_GetPrivateData(LPDIRECT3DTEXTURE8 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_GetPrivateData(This->wineD3DTexture, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -110,9 +115,10 @@ static HRESULT WINAPI IDirect3DTexture8Impl_FreePrivateData(LPDIRECT3DTEXTURE8 i
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_FreePrivateData(This->wineD3DTexture, refguid);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -121,9 +127,10 @@ static DWORD WINAPI IDirect3DTexture8Impl_SetPriority(LPDIRECT3DTEXTURE8 iface,
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DTexture_SetPriority(This->wineD3DTexture, PriorityNew);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -132,9 +139,10 @@ static DWORD WINAPI IDirect3DTexture8Impl_GetPriority(LPDIRECT3DTEXTURE8 iface)
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DTexture_GetPriority(This->wineD3DTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -142,9 +150,9 @@ static void WINAPI IDirect3DTexture8Impl_PreLoad(LPDIRECT3DTEXTURE8 iface) {
IDirect3DTexture8Impl *This = (IDirect3DTexture8Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DTexture_PreLoad(This->wineD3DTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
}
static D3DRESOURCETYPE WINAPI IDirect3DTexture8Impl_GetType(LPDIRECT3DTEXTURE8 iface) {
@@ -152,9 +160,10 @@ static D3DRESOURCETYPE WINAPI IDirect3DTexture8Impl_GetType(LPDIRECT3DTEXTURE8 i
D3DRESOURCETYPE type;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
type = IWineD3DTexture_GetType(This->wineD3DTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return type;
}
@@ -164,9 +173,10 @@ static DWORD WINAPI IDirect3DTexture8Impl_SetLOD(LPDIRECT3DTEXTURE8 iface, DWORD
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DTexture_SetLOD(This->wineD3DTexture, LODNew);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -175,9 +185,10 @@ static DWORD WINAPI IDirect3DTexture8Impl_GetLOD(LPDIRECT3DTEXTURE8 iface) {
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DTexture_GetLOD(This->wineD3DTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -186,9 +197,10 @@ static DWORD WINAPI IDirect3DTexture8Impl_GetLevelCount(LPDIRECT3DTEXTURE8 iface
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DTexture_GetLevelCount(This->wineD3DTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -200,22 +212,21 @@ static HRESULT WINAPI IDirect3DTexture8Impl_GetLevelDesc(LPDIRECT3DTEXTURE8 ifac
WINED3DSURFACE_DESC wined3ddesc;
TRACE("(%p) Relay\n", This);
- /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */
- memset(&wined3ddesc, 0, sizeof(wined3ddesc));
- wined3ddesc.Format = (WINED3DFORMAT *)&pDesc->Format;
- wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type;
- wined3ddesc.Usage = &pDesc->Usage;
- wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool;
- wined3ddesc.Size = &pDesc->Size;
- wined3ddesc.MultiSampleType = (WINED3DMULTISAMPLE_TYPE *) &pDesc->MultiSampleType;
- wined3ddesc.Width = &pDesc->Width;
- wined3ddesc.Height = &pDesc->Height;
-
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_GetLevelDesc(This->wineD3DTexture, Level, &wined3ddesc);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
- if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(pDesc->Format);
+ if (SUCCEEDED(hr))
+ {
+ pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.format);
+ pDesc->Type = wined3ddesc.resource_type;
+ pDesc->Usage = wined3ddesc.usage;
+ pDesc->Pool = wined3ddesc.pool;
+ pDesc->Size = wined3ddesc.size;
+ pDesc->MultiSampleType = wined3ddesc.multisample_type;
+ pDesc->Width = wined3ddesc.width;
+ pDesc->Height = wined3ddesc.height;
+ }
return hr;
}
@@ -226,13 +237,15 @@ static HRESULT WINAPI IDirect3DTexture8Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE8 i
IWineD3DSurface *mySurface = NULL;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DTexture_GetSurfaceLevel(This->wineD3DTexture, Level, &mySurface);
if (hrc == D3D_OK && NULL != ppSurfaceLevel) {
IWineD3DSurface_GetParent(mySurface, (IUnknown **)ppSurfaceLevel);
IWineD3DSurface_Release(mySurface);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hrc;
}
@@ -241,9 +254,10 @@ static HRESULT WINAPI IDirect3DTexture8Impl_LockRect(LPDIRECT3DTEXTURE8 iface, U
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_LockRect(This->wineD3DTexture, Level, (WINED3DLOCKED_RECT *) pLockedRect, pRect, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -252,9 +266,10 @@ static HRESULT WINAPI IDirect3DTexture8Impl_UnlockRect(LPDIRECT3DTEXTURE8 iface,
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_UnlockRect(This->wineD3DTexture, Level);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -263,9 +278,10 @@ static HRESULT WINAPI IDirect3DTexture8Impl_AddDirtyRect(LPDIRECT3DTEXTURE8 ifac
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_AddDirtyRect(This->wineD3DTexture, pDirtyRect);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
diff --git a/reactos/dll/directx/wine/d3d8/vertexbuffer.c b/reactos/dll/directx/wine/d3d8/vertexbuffer.c
index a282cda6bf2..617aff3529a 100644
--- a/reactos/dll/directx/wine/d3d8/vertexbuffer.c
+++ b/reactos/dll/directx/wine/d3d8/vertexbuffer.c
@@ -57,9 +57,10 @@ static ULONG WINAPI IDirect3DVertexBuffer8Impl_Release(LPDIRECT3DVERTEXBUFFER8 i
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DBuffer_Release(This->wineD3DVertexBuffer);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
IUnknown_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -74,14 +75,15 @@ static HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetDevice(LPDIRECT3DVERTEXBUFFE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetDevice(This->wineD3DVertexBuffer, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -90,9 +92,10 @@ static HRESULT WINAPI IDirect3DVertexBuffer8Impl_SetPrivateData(LPDIRECT3DVERTEX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_SetPrivateData(This->wineD3DVertexBuffer, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -101,9 +104,10 @@ static HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetPrivateData(LPDIRECT3DVERTEX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetPrivateData(This->wineD3DVertexBuffer, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -112,9 +116,10 @@ static HRESULT WINAPI IDirect3DVertexBuffer8Impl_FreePrivateData(LPDIRECT3DVERTE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_FreePrivateData(This->wineD3DVertexBuffer, refguid);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -123,9 +128,10 @@ static DWORD WINAPI IDirect3DVertexBuffer8Impl_SetPriority(LPDIRECT3DVERTEXBUFFE
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DBuffer_SetPriority(This->wineD3DVertexBuffer, PriorityNew);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -134,9 +140,10 @@ static DWORD WINAPI IDirect3DVertexBuffer8Impl_GetPriority(LPDIRECT3DVERTEXBUFFE
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DBuffer_GetPriority(This->wineD3DVertexBuffer);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -144,9 +151,9 @@ static void WINAPI IDirect3DVertexBuffer8Impl_PreLoad(LPDIRECT3DVERTEXBUFFER8 if
IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DBuffer_PreLoad(This->wineD3DVertexBuffer);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
}
static D3DRESOURCETYPE WINAPI IDirect3DVertexBuffer8Impl_GetType(LPDIRECT3DVERTEXBUFFER8 iface) {
@@ -162,9 +169,10 @@ static HRESULT WINAPI IDirect3DVertexBuffer8Impl_Lock(LPDIRECT3DVERTEXBUFFER8 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_Map(This->wineD3DVertexBuffer, OffsetToLock, SizeToLock, ppbData, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -173,9 +181,10 @@ static HRESULT WINAPI IDirect3DVertexBuffer8Impl_Unlock(LPDIRECT3DVERTEXBUFFER8
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_Unmap(This->wineD3DVertexBuffer);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -185,9 +194,9 @@ static HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetDesc(LPDIRECT3DVERTEXBUFFER8
WINED3DBUFFER_DESC desc;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetDesc(This->wineD3DVertexBuffer, &desc);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hr)) {
pDesc->Type = D3DRTYPE_VERTEXBUFFER;
diff --git a/reactos/dll/directx/wine/d3d8/vertexdeclaration.c b/reactos/dll/directx/wine/d3d8/vertexdeclaration.c
index e9d56d09fbc..2eea098a4e5 100644
--- a/reactos/dll/directx/wine/d3d8/vertexdeclaration.c
+++ b/reactos/dll/directx/wine/d3d8/vertexdeclaration.c
@@ -61,9 +61,10 @@ static ULONG WINAPI IDirect3DVertexDeclaration8Impl_Release(IDirect3DVertexDecla
TRACE("(%p) : Releasing to %d\n", This, ref_count);
if (!ref_count) {
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DVertexDeclaration_Release(This->wined3d_vertex_declaration);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This->elements);
HeapFree(GetProcessHeap(), 0, This);
}
diff --git a/reactos/dll/directx/wine/d3d8/vertexshader.c b/reactos/dll/directx/wine/d3d8/vertexshader.c
index 4ea8b52ac29..1a9b5ea9535 100644
--- a/reactos/dll/directx/wine/d3d8/vertexshader.c
+++ b/reactos/dll/directx/wine/d3d8/vertexshader.c
@@ -59,9 +59,9 @@ static ULONG WINAPI IDirect3DVertexShader8Impl_Release(IDirect3DVertexShader8 *i
IDirect3DVertexDeclaration8_Release(This->vertex_declaration);
if (This->wineD3DVertexShader)
{
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DVertexShader_Release(This->wineD3DVertexShader);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
}
HeapFree(GetProcessHeap(), 0, This);
}
diff --git a/reactos/dll/directx/wine/d3d8/volume.c b/reactos/dll/directx/wine/d3d8/volume.c
index 474aad86230..968b5348a87 100644
--- a/reactos/dll/directx/wine/d3d8/volume.c
+++ b/reactos/dll/directx/wine/d3d8/volume.c
@@ -72,9 +72,10 @@ static ULONG WINAPI IDirect3DVolume8Impl_Release(LPDIRECT3DVOLUME8 iface) {
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DVolume_Release(This->wineD3DVolume);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This);
}
@@ -87,11 +88,12 @@ static HRESULT WINAPI IDirect3DVolume8Impl_GetDevice(LPDIRECT3DVOLUME8 iface, ID
IDirect3DVolume8Impl *This = (IDirect3DVolume8Impl *)iface;
IWineD3DDevice *myDevice = NULL;
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DVolume_GetDevice(This->wineD3DVolume, &myDevice);
IWineD3DDevice_GetParent(myDevice, (IUnknown **)ppDevice);
IWineD3DDevice_Release(myDevice);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return D3D_OK;
}
@@ -100,9 +102,10 @@ static HRESULT WINAPI IDirect3DVolume8Impl_SetPrivateData(LPDIRECT3DVOLUME8 ifac
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_SetPrivateData(This->wineD3DVolume, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -111,9 +114,10 @@ static HRESULT WINAPI IDirect3DVolume8Impl_GetPrivateData(LPDIRECT3DVOLUME8 ifac
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_GetPrivateData(This->wineD3DVolume, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -122,9 +126,10 @@ static HRESULT WINAPI IDirect3DVolume8Impl_FreePrivateData(LPDIRECT3DVOLUME8 ifa
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_FreePrivateData(This->wineD3DVolume, refguid);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -154,21 +159,21 @@ static HRESULT WINAPI IDirect3DVolume8Impl_GetDesc(LPDIRECT3DVOLUME8 iface, D3DV
TRACE("(%p) Relay\n", This);
- /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */
- wined3ddesc.Format = (WINED3DFORMAT *)&pDesc->Format;
- wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type;
- wined3ddesc.Usage = &pDesc->Usage;
- wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool;
- wined3ddesc.Size = &pDesc->Size;
- wined3ddesc.Width = &pDesc->Width;
- wined3ddesc.Height = &pDesc->Height;
- wined3ddesc.Depth = &pDesc->Depth;
-
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_GetDesc(This->wineD3DVolume, &wined3ddesc);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
- if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(pDesc->Format);
+ if (SUCCEEDED(hr))
+ {
+ pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format);
+ pDesc->Type = wined3ddesc.Type;
+ pDesc->Usage = wined3ddesc.Usage;
+ pDesc->Pool = wined3ddesc.Pool;
+ pDesc->Size = wined3ddesc.Size;
+ pDesc->Width = wined3ddesc.Width;
+ pDesc->Height = wined3ddesc.Height;
+ pDesc->Depth = wined3ddesc.Depth;
+ }
return hr;
}
@@ -178,9 +183,10 @@ static HRESULT WINAPI IDirect3DVolume8Impl_LockBox(LPDIRECT3DVOLUME8 iface, D3DL
HRESULT hr;
TRACE("(%p) relay %p %p %p %d\n", This, This->wineD3DVolume, pLockedVolume, pBox, Flags);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_LockBox(This->wineD3DVolume, (WINED3DLOCKED_BOX *) pLockedVolume, (CONST WINED3DBOX *) pBox, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -189,9 +195,10 @@ static HRESULT WINAPI IDirect3DVolume8Impl_UnlockBox(LPDIRECT3DVOLUME8 iface) {
HRESULT hr;
TRACE("(%p) relay %p\n", This, This->wineD3DVolume);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_UnlockBox(This->wineD3DVolume);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
diff --git a/reactos/dll/directx/wine/d3d8/volumetexture.c b/reactos/dll/directx/wine/d3d8/volumetexture.c
index 098827aedd8..1875081a3bd 100644
--- a/reactos/dll/directx/wine/d3d8/volumetexture.c
+++ b/reactos/dll/directx/wine/d3d8/volumetexture.c
@@ -57,9 +57,10 @@ static ULONG WINAPI IDirect3DVolumeTexture8Impl_Release(LPDIRECT3DVOLUMETEXTURE8
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DVolumeTexture_Destroy(This->wineD3DVolumeTexture, D3D8CB_DestroyVolume);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
IUnknown_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -73,14 +74,15 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetDevice(LPDIRECT3DVOLUMETEXT
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_GetDevice(This->wineD3DVolumeTexture, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -89,9 +91,10 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_SetPrivateData(LPDIRECT3DVOLUM
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_SetPrivateData(This->wineD3DVolumeTexture, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -100,9 +103,10 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetPrivateData(LPDIRECT3DVOLUM
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_GetPrivateData(This->wineD3DVolumeTexture, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -111,9 +115,10 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_FreePrivateData(LPDIRECT3DVOLU
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_FreePrivateData(This->wineD3DVolumeTexture, refguid);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -122,9 +127,10 @@ static DWORD WINAPI IDirect3DVolumeTexture8Impl_SetPriority(LPDIRECT3DVOLUMETEXT
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DVolumeTexture_SetPriority(This->wineD3DVolumeTexture, PriorityNew);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -133,9 +139,10 @@ static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetPriority(LPDIRECT3DVOLUMETEXT
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DVolumeTexture_GetPriority(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -143,9 +150,9 @@ static void WINAPI IDirect3DVolumeTexture8Impl_PreLoad(LPDIRECT3DVOLUMETEXTURE8
IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
IWineD3DVolumeTexture_PreLoad(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
}
static D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture8Impl_GetType(LPDIRECT3DVOLUMETEXTURE8 iface) {
@@ -153,9 +160,10 @@ static D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture8Impl_GetType(LPDIRECT3DVOLU
D3DRESOURCETYPE type;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
type = IWineD3DVolumeTexture_GetType(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return type;
}
@@ -165,9 +173,10 @@ static DWORD WINAPI IDirect3DVolumeTexture8Impl_SetLOD(LPDIRECT3DVOLUMETEXTURE8
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DVolumeTexture_SetLOD(This->wineD3DVolumeTexture, LODNew);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -176,9 +185,10 @@ static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetLOD(LPDIRECT3DVOLUMETEXTURE8
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DVolumeTexture_GetLOD(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -187,9 +197,10 @@ static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetLevelCount(LPDIRECT3DVOLUMETE
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
ret = IWineD3DVolumeTexture_GetLevelCount(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -197,26 +208,25 @@ static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetLevelCount(LPDIRECT3DVOLUMETE
static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetLevelDesc(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, D3DVOLUME_DESC* pDesc) {
IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface;
WINED3DVOLUME_DESC wined3ddesc;
- UINT tmpInt = -1;
HRESULT hr;
TRACE("(%p) Relay\n", This);
- /* As d3d8 and d3d8 structures differ, pass in ptrs to where data needs to go */
- wined3ddesc.Format = (WINED3DFORMAT *)&pDesc->Format;
- wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type;
- wined3ddesc.Usage = &pDesc->Usage;
- wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool;
- wined3ddesc.Size = &tmpInt;
- wined3ddesc.Width = &pDesc->Width;
- wined3ddesc.Height = &pDesc->Height;
- wined3ddesc.Depth = &pDesc->Depth;
-
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_GetLevelDesc(This->wineD3DVolumeTexture, Level, &wined3ddesc);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
- if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(pDesc->Format);
+ if (SUCCEEDED(hr))
+ {
+ pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format);
+ pDesc->Type = wined3ddesc.Type;
+ pDesc->Usage = wined3ddesc.Usage;
+ pDesc->Pool = wined3ddesc.Pool;
+ pDesc->Size = wined3ddesc.Size;
+ pDesc->Width = wined3ddesc.Width;
+ pDesc->Height = wined3ddesc.Height;
+ pDesc->Depth = wined3ddesc.Depth;
+ }
return hr;
}
@@ -228,13 +238,14 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetVolumeLevel(LPDIRECT3DVOLUM
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DVolumeTexture_GetVolumeLevel(This->wineD3DVolumeTexture, Level, &myVolume);
if (hrc == D3D_OK && NULL != ppVolumeLevel) {
IWineD3DVolumeTexture_GetParent(myVolume, (IUnknown **)ppVolumeLevel);
IWineD3DVolumeTexture_Release(myVolume);
}
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hrc;
}
@@ -243,9 +254,10 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_LockBox(LPDIRECT3DVOLUMETEXTUR
HRESULT hr;
TRACE("(%p) Relay %p %p %p %d\n", This, This->wineD3DVolumeTexture, pLockedVolume, pBox,Flags);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_LockBox(This->wineD3DVolumeTexture, Level, (WINED3DLOCKED_BOX *) pLockedVolume, (CONST WINED3DBOX *) pBox, Flags);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -254,9 +266,10 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_UnlockBox(LPDIRECT3DVOLUMETEXT
HRESULT hr;
TRACE("(%p) Relay %p %d\n", This, This->wineD3DVolumeTexture, Level);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_UnlockBox(This->wineD3DVolumeTexture, Level);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -265,9 +278,10 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_AddDirtyBox(LPDIRECT3DVOLUMETE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d8_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_AddDirtyBox(This->wineD3DVolumeTexture, (CONST WINED3DBOX *) pDirtyBox);
- LeaveCriticalSection(&d3d8_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
diff --git a/reactos/dll/directx/wine/d3d9/cubetexture.c b/reactos/dll/directx/wine/d3d9/cubetexture.c
index bbd171ea62a..8209d0b367f 100644
--- a/reactos/dll/directx/wine/d3d9/cubetexture.c
+++ b/reactos/dll/directx/wine/d3d9/cubetexture.c
@@ -61,10 +61,10 @@ static ULONG WINAPI IDirect3DCubeTexture9Impl_Release(LPDIRECT3DCUBETEXTURE9 ifa
if (ref == 0) {
TRACE("Releasing child %p\n", This->wineD3DCubeTexture);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DCubeTexture_Destroy(This->wineD3DCubeTexture, D3D9CB_DestroySurface);
IDirect3DDevice9Ex_Release(This->parentDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
HeapFree(GetProcessHeap(), 0, This);
}
@@ -78,14 +78,15 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetDevice(LPDIRECT3DCUBETEXTURE9
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_GetDevice(This->wineD3DCubeTexture, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -94,9 +95,10 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_SetPrivateData(LPDIRECT3DCUBETEX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_SetPrivateData(This->wineD3DCubeTexture,refguid,pData,SizeOfData,Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -105,9 +107,10 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetPrivateData(LPDIRECT3DCUBETEX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_GetPrivateData(This->wineD3DCubeTexture,refguid,pData,pSizeOfData);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -116,9 +119,10 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_FreePrivateData(LPDIRECT3DCUBETE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_FreePrivateData(This->wineD3DCubeTexture,refguid);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -127,9 +131,10 @@ static DWORD WINAPI IDirect3DCubeTexture9Impl_SetPriority(LPDIRECT3DCUBETEXTURE9
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DCubeTexture_SetPriority(This->wineD3DCubeTexture, PriorityNew);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -138,9 +143,10 @@ static DWORD WINAPI IDirect3DCubeTexture9Impl_GetPriority(LPDIRECT3DCUBETEXTURE9
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DCubeTexture_GetPriority(This->wineD3DCubeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -148,9 +154,9 @@ static void WINAPI IDirect3DCubeTexture9Impl_PreLoad(LPDIRECT3DCUBETEXTURE9 ifac
IDirect3DCubeTexture9Impl *This = (IDirect3DCubeTexture9Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DCubeTexture_PreLoad(This->wineD3DCubeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
}
static D3DRESOURCETYPE WINAPI IDirect3DCubeTexture9Impl_GetType(LPDIRECT3DCUBETEXTURE9 iface) {
@@ -158,9 +164,10 @@ static D3DRESOURCETYPE WINAPI IDirect3DCubeTexture9Impl_GetType(LPDIRECT3DCUBETE
D3DRESOURCETYPE ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DCubeTexture_GetType(This->wineD3DCubeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -170,9 +177,10 @@ static DWORD WINAPI IDirect3DCubeTexture9Impl_SetLOD(LPDIRECT3DCUBETEXTURE9 ifac
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DCubeTexture_SetLOD(This->wineD3DCubeTexture, LODNew);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -181,9 +189,10 @@ static DWORD WINAPI IDirect3DCubeTexture9Impl_GetLOD(LPDIRECT3DCUBETEXTURE9 ifac
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DCubeTexture_GetLOD(This->wineD3DCubeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -192,9 +201,10 @@ static DWORD WINAPI IDirect3DCubeTexture9Impl_GetLevelCount(LPDIRECT3DCUBETEXTUR
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DCubeTexture_GetLevelCount(This->wineD3DCubeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -203,9 +213,10 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_SetAutoGenFilterType(LPDIRECT3DC
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_SetAutoGenFilterType(This->wineD3DCubeTexture, (WINED3DTEXTUREFILTERTYPE) FilterType);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -214,9 +225,10 @@ static D3DTEXTUREFILTERTYPE WINAPI IDirect3DCubeTexture9Impl_GetAutoGenFilterTyp
D3DTEXTUREFILTERTYPE ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = (D3DTEXTUREFILTERTYPE) IWineD3DCubeTexture_GetAutoGenFilterType(This->wineD3DCubeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -224,37 +236,34 @@ static void WINAPI IDirect3DCubeTexture9Impl_GenerateMipSubLevels(LPDIRECT3DCUBE
IDirect3DCubeTexture9Impl *This = (IDirect3DCubeTexture9Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DCubeTexture_GenerateMipSubLevels(This->wineD3DCubeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
}
/* IDirect3DCubeTexture9 Interface follow: */
static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetLevelDesc(LPDIRECT3DCUBETEXTURE9 iface, UINT Level, D3DSURFACE_DESC* pDesc) {
IDirect3DCubeTexture9Impl *This = (IDirect3DCubeTexture9Impl *)iface;
- WINED3DSURFACE_DESC wined3ddesc;
- UINT tmpInt = -1;
- WINED3DFORMAT format;
+ WINED3DSURFACE_DESC wined3ddesc;
HRESULT hr;
TRACE("(%p) Relay\n", This);
- /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */
- wined3ddesc.Format = &format;
- wined3ddesc.Type = (WINED3DRESOURCETYPE *) &pDesc->Type;
- wined3ddesc.Usage = &pDesc->Usage;
- wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool;
- wined3ddesc.Size = &tmpInt;
- wined3ddesc.MultiSampleType = (WINED3DMULTISAMPLE_TYPE *) &pDesc->MultiSampleType;
- wined3ddesc.MultiSampleQuality = &pDesc->MultiSampleQuality;
- wined3ddesc.Width = &pDesc->Width;
- wined3ddesc.Height = &pDesc->Height;
-
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_GetLevelDesc(This->wineD3DCubeTexture, Level, &wined3ddesc);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
- if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(format);
+ if (SUCCEEDED(hr))
+ {
+ pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.format);
+ pDesc->Type = wined3ddesc.resource_type;
+ pDesc->Usage = wined3ddesc.usage;
+ pDesc->Pool = wined3ddesc.pool;
+ pDesc->MultiSampleType = wined3ddesc.multisample_type;
+ pDesc->MultiSampleQuality = wined3ddesc.multisample_quality;
+ pDesc->Width = wined3ddesc.width;
+ pDesc->Height = wined3ddesc.height;
+ }
return hr;
}
@@ -266,13 +275,14 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetCubeMapSurface(LPDIRECT3DCUBE
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DCubeTexture_GetCubeMapSurface(This->wineD3DCubeTexture, (WINED3DCUBEMAP_FACES) FaceType, Level, &mySurface);
if (hrc == D3D_OK && NULL != ppCubeMapSurface) {
IWineD3DCubeTexture_GetParent(mySurface, (IUnknown **)ppCubeMapSurface);
IWineD3DCubeTexture_Release(mySurface);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hrc;
}
@@ -281,9 +291,10 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_LockRect(LPDIRECT3DCUBETEXTURE9
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_LockRect(This->wineD3DCubeTexture, (WINED3DCUBEMAP_FACES) FaceType, Level, (WINED3DLOCKED_RECT *) pLockedRect, pRect, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -292,9 +303,10 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_UnlockRect(LPDIRECT3DCUBETEXTURE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_UnlockRect(This->wineD3DCubeTexture, (WINED3DCUBEMAP_FACES) FaceType, Level);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -303,9 +315,10 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_AddDirtyRect(LPDIRECT3DCUBETEXT
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DCubeTexture_AddDirtyRect(This->wineD3DCubeTexture, (WINED3DCUBEMAP_FACES) FaceType, pDirtyRect);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -363,10 +376,11 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateCubeTexture(LPDIRECT3DDEVICE9EX ifac
}
object->lpVtbl = &Direct3DCubeTexture9_Vtbl;
object->ref = 1;
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DDevice_CreateCubeTexture(This->WineD3DDevice, EdgeLength, Levels, Usage,
wined3dformat_from_d3dformat(Format), Pool, &object->wineD3DCubeTexture, (IUnknown *)object);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
if (hr != D3D_OK){
diff --git a/reactos/dll/directx/wine/d3d9/d3d9_main.c b/reactos/dll/directx/wine/d3d9/d3d9_main.c
index 40d73a54e7a..f59fc463247 100644
--- a/reactos/dll/directx/wine/d3d9/d3d9_main.c
+++ b/reactos/dll/directx/wine/d3d9/d3d9_main.c
@@ -25,15 +25,6 @@
#include "initguid.h"
#include "d3d9_private.h"
-static CRITICAL_SECTION_DEBUG d3d9_cs_debug =
-{
- 0, 0, &d3d9_cs,
- { &d3d9_cs_debug.ProcessLocksList,
- &d3d9_cs_debug.ProcessLocksList },
- 0, 0, { (DWORD_PTR)(__FILE__ ": d3d9_cs") }
-};
-CRITICAL_SECTION d3d9_cs = { &d3d9_cs_debug, -1, 0, 0, 0, 0 };
-
WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
static int D3DPERF_event_level = 0;
@@ -47,9 +38,10 @@ IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) {
object->lpVtbl = &Direct3D9_Vtbl;
object->ref = 1;
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
object->WineD3D = WineDirect3DCreate(9, (IUnknown *)object);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
TRACE("SDKVersion = %x, Created Direct3D object @ %p, WineObj @ %p\n", SDKVersion, object, object->WineD3D);
diff --git a/reactos/dll/directx/wine/d3d9/d3d9_private.h b/reactos/dll/directx/wine/d3d9/d3d9_private.h
index 7e439749a7b..b6ef7cf90cb 100644
--- a/reactos/dll/directx/wine/d3d9/d3d9_private.h
+++ b/reactos/dll/directx/wine/d3d9/d3d9_private.h
@@ -3,7 +3,7 @@
*
* Copyright 2002-2003 Jason Edmeades
* Copyright 2002-2003 Raphael Junqueira
- * Copyright 2005 Oliver Stieber
+ * Copyright 2005 Oliver Stieber
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -44,7 +44,6 @@
extern HRESULT vdecl_convert_fvf(
DWORD FVF,
D3DVERTEXELEMENT9** ppVertexElements);
-extern CRITICAL_SECTION d3d9_cs;
D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format);
WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format);
@@ -369,7 +368,6 @@ typedef struct IDirect3DBaseTexture9Impl
/* IDirect3DResource9 fields */
IWineD3DBaseTexture *wineD3DBaseTexture;
-
} IDirect3DBaseTexture9Impl;
/* --------------------- */
diff --git a/reactos/dll/directx/wine/d3d9/device.c b/reactos/dll/directx/wine/d3d9/device.c
index e5ca4c4afd0..5a87a8f1ef3 100644
--- a/reactos/dll/directx/wine/d3d9/device.c
+++ b/reactos/dll/directx/wine/d3d9/device.c
@@ -248,7 +248,7 @@ static ULONG WINAPI IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) {
unsigned i;
This->inDestruction = TRUE;
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
for(i = 0; i < This->numConvertedDecls; i++) {
/* Unless Wine is buggy or the app has a bug the refcount will be 0, because decls hold a reference to the
* device
@@ -259,7 +259,8 @@ static ULONG WINAPI IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) {
IWineD3DDevice_Uninit3D(This->WineD3DDevice, D3D9CB_DestroyDepthStencilSurface, D3D9CB_DestroySwapChain);
IWineD3DDevice_Release(This->WineD3DDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
@@ -271,9 +272,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_TestCooperativeLevel(LPDIRECT3DDEVI
HRESULT hr;
TRACE("(%p)\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_TestCooperativeLevel(This->WineD3DDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
if(hr == WINED3D_OK && This->notreset) {
TRACE("D3D9 Device is marked not reset\n");
hr = D3DERR_DEVICENOTRESET;
@@ -287,9 +289,10 @@ static UINT WINAPI IDirect3DDevice9Impl_GetAvailableTextureMem(LPDIRECT3DDE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetAvailableTextureMem(This->WineD3DDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -298,9 +301,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_EvictManagedResources(LPDIRECT3DDEV
HRESULT hr;
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_EvictManagedResources(This->WineD3DDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -315,7 +319,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetDirect3D(LPDIRECT3DDEVICE9EX iface
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetDirect3D(This->WineD3DDevice, &pWineD3D);
if (hr == D3D_OK && pWineD3D != NULL)
{
@@ -326,7 +330,8 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetDirect3D(LPDIRECT3DDEVICE9EX iface
*ppD3D9 = NULL;
}
TRACE("(%p) returning %p\n", This, *ppD3D9);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -345,9 +350,11 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetDeviceCaps(LPDIRECT3DDEVICE9EX i
}
memset(pCaps, 0, sizeof(*pCaps));
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_GetDeviceCaps(This->WineD3DDevice, pWineCaps);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
WINECAPSTOD3D9CAPS(pCaps, pWineCaps)
HeapFree(GetProcessHeap(), 0, pWineCaps);
@@ -365,9 +372,9 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetDisplayMode(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetDisplayMode(This->WineD3DDevice, iSwapChain, (WINED3DDISPLAYMODE *) pMode);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
@@ -379,9 +386,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetCreationParameters(LPDIRECT3DDEV
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetCreationParameters(This->WineD3DDevice, (WINED3DDEVICE_CREATION_PARAMETERS *) pParameters);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -396,9 +404,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetCursorProperties(LPDIRECT3DDEVIC
return WINED3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetCursorProperties(This->WineD3DDevice, XHotSpot, YHotSpot, pSurface->wineD3DSurface);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -406,9 +415,9 @@ static void WINAPI IDirect3DDevice9Impl_SetCursorPosition(LPDIRECT3DDEVICE9
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetCursorPosition(This->WineD3DDevice, XScreenSpace, YScreenSpace, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
}
static BOOL WINAPI IDirect3DDevice9Impl_ShowCursor(LPDIRECT3DDEVICE9EX iface, BOOL bShow) {
@@ -416,53 +425,35 @@ static BOOL WINAPI IDirect3DDevice9Impl_ShowCursor(LPDIRECT3DDEVICE9EX ifac
BOOL ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DDevice_ShowCursor(This->WineD3DDevice, bShow);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
static HRESULT WINAPI reset_enum_callback(IWineD3DResource *resource, void *data) {
BOOL *resources_ok = data;
- WINED3DRESOURCETYPE type;
+ D3DRESOURCETYPE type;
HRESULT ret = S_OK;
WINED3DSURFACE_DESC surface_desc;
WINED3DVOLUME_DESC volume_desc;
D3DINDEXBUFFER_DESC index_desc;
D3DVERTEXBUFFER_DESC vertex_desc;
- WINED3DFORMAT dummy_format;
- WINED3DMULTISAMPLE_TYPE dummy_multisampletype;
- DWORD dummy_dword;
- WINED3DPOOL pool = WINED3DPOOL_SCRATCH; /* a harmless pool */
+ WINED3DPOOL pool;
IDirect3DResource9 *parent;
IWineD3DResource_GetParent(resource, (IUnknown **) &parent);
type = IDirect3DResource9_GetType(parent);
switch(type) {
case D3DRTYPE_SURFACE:
- surface_desc.Format = &dummy_format;
- surface_desc.Type = &type;
- surface_desc.Usage = &dummy_dword;
- surface_desc.Pool = &pool;
- surface_desc.Size = &dummy_dword;
- surface_desc.MultiSampleType = &dummy_multisampletype;
- surface_desc.MultiSampleQuality = &dummy_dword;
- surface_desc.Width = &dummy_dword;
- surface_desc.Height = &dummy_dword;
-
IWineD3DSurface_GetDesc((IWineD3DSurface *) resource, &surface_desc);
+ pool = surface_desc.pool;
break;
case D3DRTYPE_VOLUME:
- volume_desc.Format = &dummy_format;
- volume_desc.Type = &type;
- volume_desc.Usage = &dummy_dword;
- volume_desc.Pool = &pool;
- volume_desc.Size = &dummy_dword;
- volume_desc.Width = &dummy_dword;
- volume_desc.Height = &dummy_dword;
- volume_desc.Depth = &dummy_dword;
IWineD3DVolume_GetDesc((IWineD3DVolume *) resource, &volume_desc);
+ pool = volume_desc.Pool;
break;
case D3DRTYPE_INDEXBUFFER:
@@ -479,6 +470,7 @@ static HRESULT WINAPI reset_enum_callback(IWineD3DResource *resource, void *data
* is a D3DPOOL_DEFAULT surface or volume as well
*/
default:
+ pool = WINED3DPOOL_SCRATCH; /* a harmless pool */
break;
}
@@ -515,7 +507,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3
* Unsetting them is no problem, because the states are supposed to be reset anyway. If the validation
* below fails, the device is considered "lost", and _Reset and _Release are the only allowed calls
*/
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetIndices(This->WineD3DDevice, NULL, WINED3DFMT_UNKNOWN);
for(i = 0; i < 16; i++) {
IWineD3DDevice_SetStreamSource(This->WineD3DDevice, i, NULL, 0, 0);
@@ -528,7 +520,8 @@ static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3
if(!resources_ok) {
WARN("The application is holding D3DPOOL_DEFAULT resources, rejecting reset\n");
This->notreset = TRUE;
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return WINED3DERR_INVALIDCALL;
}
@@ -570,7 +563,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3
This->notreset = FALSE;
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -581,9 +574,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_Present(LPDIRECT3DDEVICE9EX iface,
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_Present(This->WineD3DDevice, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -594,13 +588,14 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetBackBuffer(LPDIRECT3DDEVICE9EX i
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
rc = IWineD3DDevice_GetBackBuffer(This->WineD3DDevice, iSwapChain, BackBuffer, (WINED3DBACKBUFFER_TYPE) Type, &retSurface);
if (rc == D3D_OK && NULL != retSurface && NULL != ppBackBuffer) {
IWineD3DSurface_GetParent(retSurface, (IUnknown **)ppBackBuffer);
IWineD3DSurface_Release(retSurface);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return rc;
}
static HRESULT WINAPI IDirect3DDevice9Impl_GetRasterStatus(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, D3DRASTER_STATUS* pRasterStatus) {
@@ -608,9 +603,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetRasterStatus(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetRasterStatus(This->WineD3DDevice, iSwapChain, (WINED3DRASTER_STATUS *) pRasterStatus);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -619,48 +615,49 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetDialogBoxMode(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetDialogBoxMode(This->WineD3DDevice, bEnableDialogs);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-static void WINAPI IDirect3DDevice9Impl_SetGammaRamp(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, DWORD Flags, CONST D3DGAMMARAMP* pRamp) {
-
+static void WINAPI IDirect3DDevice9Impl_SetGammaRamp(IDirect3DDevice9Ex *iface, UINT iSwapChain,
+ DWORD Flags, const D3DGAMMARAMP *pRamp)
+{
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
/* Note: D3DGAMMARAMP is compatible with WINED3DGAMMARAMP */
+ wined3d_mutex_lock();
IWineD3DDevice_SetGammaRamp(This->WineD3DDevice, iSwapChain, Flags, (CONST WINED3DGAMMARAMP *)pRamp);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
}
static void WINAPI IDirect3DDevice9Impl_GetGammaRamp(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, D3DGAMMARAMP* pRamp) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
/* Note: D3DGAMMARAMP is compatible with WINED3DGAMMARAMP */
+ wined3d_mutex_lock();
IWineD3DDevice_GetGammaRamp(This->WineD3DDevice, iSwapChain, (WINED3DGAMMARAMP *) pRamp);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
}
-static HRESULT IDirect3DDevice9Impl_CreateSurface(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height, D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface9 **ppSurface,D3DRESOURCETYPE Type, UINT Usage, D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality,HANDLE* pSharedHandle ) {
+static HRESULT IDirect3DDevice9Impl_CreateSurface(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height,
+ D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface9 **ppSurface,
+ UINT Usage, D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality)
+{
HRESULT hrc;
IDirect3DSurface9Impl *object;
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
TRACE("(%p) Relay\n", This);
-
- if(MultisampleQuality > 0){
+
+ if (MultisampleQuality > 0)
+ {
FIXME("MultisampleQuality set to %d, bstituting 0\n", MultisampleQuality);
- /*
- MultisampleQuality
- [in] Quality level. The valid range is between zero and one less than the level returned by pQualityLevels used by IDirect3D9::CheckDeviceMultiSampleType. Passing a larger value returns the error D3DERR_INVALIDCALL. The MultisampleQuality values of paired render targets, depth stencil surfaces, and the MultiSample type must all match.
- */
-
- MultisampleQuality=0;
+ MultisampleQuality = 0;
}
/*FIXME: Check MAX bounds of MultisampleQuality*/
@@ -676,11 +673,11 @@ static HRESULT IDirect3DDevice9Impl_CreateSurface(LPDIRECT3DDEVICE9EX iface, UIN
TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p\n", This, Width, Height, Format, *ppSurface);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, wined3dformat_from_d3dformat(Format),
- Lockable, Discard, Level, &object->wineD3DSurface, Type, Usage & WINED3DUSAGE_MASK,
- (WINED3DPOOL)Pool, MultiSample, MultisampleQuality, SURFACE_OPENGL, (IUnknown *)object);
- LeaveCriticalSection(&d3d9_cs);
+ Lockable, Discard, Level, &object->wineD3DSurface, Usage & WINED3DUSAGE_MASK, (WINED3DPOOL)Pool,
+ MultiSample, MultisampleQuality, SURFACE_OPENGL, (IUnknown *)object);
+ wined3d_mutex_unlock();
if (hrc != D3D_OK || NULL == object->wineD3DSurface) {
@@ -696,17 +693,17 @@ static HRESULT IDirect3DDevice9Impl_CreateSurface(LPDIRECT3DDEVICE9EX iface, UIN
return hrc;
}
-
-
-static HRESULT WINAPI IDirect3DDevice9Impl_CreateRenderTarget(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height,
- D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample,
- DWORD MultisampleQuality, BOOL Lockable,
- IDirect3DSurface9 **ppSurface, HANDLE* pSharedHandle) {
+static HRESULT WINAPI IDirect3DDevice9Impl_CreateRenderTarget(IDirect3DDevice9Ex *iface, UINT Width, UINT Height,
+ D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Lockable,
+ IDirect3DSurface9 **ppSurface, HANDLE *pSharedHandle)
+{
HRESULT hr;
TRACE("Relay\n");
- hr = IDirect3DDevice9Impl_CreateSurface(iface,Width,Height,Format,Lockable,FALSE/*Discard*/, 0/*Level*/, ppSurface,D3DRTYPE_SURFACE,D3DUSAGE_RENDERTARGET,D3DPOOL_DEFAULT,MultiSample,MultisampleQuality,pSharedHandle);
- return hr;
+ hr = IDirect3DDevice9Impl_CreateSurface(iface, Width, Height, Format, Lockable, FALSE /* Discard */,
+ 0 /* Level */, ppSurface, D3DUSAGE_RENDERTARGET, D3DPOOL_DEFAULT, MultiSample, MultisampleQuality);
+
+ return hr;
}
static HRESULT WINAPI IDirect3DDevice9Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height,
@@ -716,10 +713,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_CreateDepthStencilSurface(LPDIRECT3
HRESULT hr;
TRACE("Relay\n");
- hr = IDirect3DDevice9Impl_CreateSurface(iface,Width,Height,Format,TRUE/* Lockable */,Discard, 0/* Level */
- ,ppSurface,D3DRTYPE_SURFACE,D3DUSAGE_DEPTHSTENCIL,
- D3DPOOL_DEFAULT,MultiSample,MultisampleQuality,pSharedHandle);
- return hr;
+ hr = IDirect3DDevice9Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, Discard,
+ 0 /* Level */, ppSurface, D3DUSAGE_DEPTHSTENCIL, D3DPOOL_DEFAULT, MultiSample, MultisampleQuality);
+
+ return hr;
}
@@ -728,9 +725,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_UpdateSurface(LPDIRECT3DDEVICE9EX i
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_UpdateSurface(This->WineD3DDevice, ((IDirect3DSurface9Impl *)pSourceSurface)->wineD3DSurface, pSourceRect, ((IDirect3DSurface9Impl *)pDestinationSurface)->wineD3DSurface, pDestPoint);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -739,9 +737,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_UpdateTexture(LPDIRECT3DDEVICE9EX i
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_UpdateTexture(This->WineD3DDevice, ((IDirect3DBaseTexture9Impl *)pSourceTexture)->wineD3DBaseTexture, ((IDirect3DBaseTexture9Impl *)pDestinationTexture)->wineD3DBaseTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -752,9 +751,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTargetData(LPDIRECT3DDEVIC
HRESULT hr;
TRACE("(%p)->(%p,%p)\n" , This, renderTarget, destSurface);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_BltFast(destSurface->wineD3DSurface, 0, 0, renderTarget->wineD3DSurface, NULL, WINEDDBLTFAST_NOCOLORKEY);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -764,9 +764,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetFrontBufferData(LPDIRECT3DDEVICE
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetFrontBufferData(This->WineD3DDevice, iSwapChain, destSurface->wineD3DSurface);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -777,9 +778,11 @@ static HRESULT WINAPI IDirect3DDevice9Impl_StretchRect(LPDIRECT3DDEVICE9EX ifa
HRESULT hr;
TRACE("(%p)->(%p,%p,%p,%p,%d)\n" , This, src, pSourceRect, dst, pDestRect, Filter);
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DSurface_Blt(dst->wineD3DSurface, pDestRect, src->wineD3DSurface, pSourceRect, 0, NULL, Filter);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -793,19 +796,18 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ColorFill(LPDIRECT3DDEVICE9EX iface
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- memset(&desc, 0, sizeof(desc));
- desc.Usage = &usage;
- desc.Pool = &pool;
- desc.Type = &restype;
+ wined3d_mutex_lock();
- EnterCriticalSection(&d3d9_cs);
IWineD3DSurface_GetDesc(surface->wineD3DSurface, &desc);
+ usage = desc.usage;
+ pool = desc.pool;
+ restype = desc.resource_type;
/* This method is only allowed with surfaces that are render targets, or offscreen plain surfaces
* in D3DPOOL_DEFAULT
*/
- if(!(usage & WINED3DUSAGE_RENDERTARGET) && (pool != D3DPOOL_DEFAULT || restype != D3DRTYPE_SURFACE)) {
- LeaveCriticalSection(&d3d9_cs);
+ if(!(usage & WINED3DUSAGE_RENDERTARGET) && (pool != WINED3DPOOL_DEFAULT || restype != WINED3DRTYPE_SURFACE)) {
+ wined3d_mutex_unlock();
WARN("Surface is not a render target, or not a stand-alone D3DPOOL_DEFAULT surface\n");
return D3DERR_INVALIDCALL;
}
@@ -813,7 +815,9 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ColorFill(LPDIRECT3DDEVICE9EX iface
/* Colorfill can only be used on rendertarget surfaces, or offscreen plain surfaces in D3DPOOL_DEFAULT */
/* Note: D3DRECT is compatible with WINED3DRECT */
hr = IWineD3DDevice_ColorFill(This->WineD3DDevice, surface->wineD3DSurface, (CONST WINED3DRECT*)pRect, color);
- LeaveCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -823,15 +827,17 @@ static HRESULT WINAPI IDirect3DDevice9Impl_CreateOffscreenPlainSurface(LPDIREC
if(Pool == D3DPOOL_MANAGED ){
FIXME("Attempting to create a managed offscreen plain surface\n");
return D3DERR_INVALIDCALL;
- }
+ }
/*
'Off-screen plain surfaces are always lockable, regardless of their pool types.'
but then...
D3DPOOL_DEFAULT is the appropriate pool for use with the IDirect3DDevice9::StretchRect and IDirect3DDevice9::ColorFill.
Why, their always lockable?
- should I change the usage to dynamic?
+ should I change the usage to dynamic?
*/
- hr = IDirect3DDevice9Impl_CreateSurface(iface,Width,Height,Format,TRUE/*Loackable*/,FALSE/*Discard*/,0/*Level*/ , ppSurface,D3DRTYPE_SURFACE, 0/*Usage (undefined/none)*/,(WINED3DPOOL) Pool,D3DMULTISAMPLE_NONE,0/*MultisampleQuality*/,pSharedHandle);
+ hr = IDirect3DDevice9Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, FALSE /* Discard */,
+ 0 /* Level */, ppSurface, 0 /* Usage (undefined/none) */, (WINED3DPOOL)Pool, D3DMULTISAMPLE_NONE,
+ 0 /* MultisampleQuality */);
return hr;
}
@@ -843,16 +849,17 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetRenderTarget(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetRenderTarget(This->WineD3DDevice, RenderTargetIndex, pSurface ? pSurface->wineD3DSurface : NULL);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTarget(LPDIRECT3DDEVICE9EX iface, DWORD RenderTargetIndex, IDirect3DSurface9 **ppRenderTarget) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
- HRESULT hr = D3D_OK;
IWineD3DSurface *pRenderTarget;
+ HRESULT hr;
TRACE("(%p) Relay\n" , This);
@@ -860,17 +867,25 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTarget(LPDIRECT3DDEVICE9EX
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
+
hr=IWineD3DDevice_GetRenderTarget(This->WineD3DDevice,RenderTargetIndex,&pRenderTarget);
- if (hr == D3D_OK && pRenderTarget != NULL) {
- IWineD3DSurface_GetParent(pRenderTarget,(IUnknown**)ppRenderTarget);
- IWineD3DSurface_Release(pRenderTarget);
- } else {
- FIXME("Call to IWineD3DDevice_GetRenderTarget failed\n");
+ if (FAILED(hr))
+ {
+ FIXME("Call to IWineD3DDevice_GetRenderTarget failed, hr %#x\n", hr);
+ }
+ else if (!pRenderTarget)
+ {
*ppRenderTarget = NULL;
}
- LeaveCriticalSection(&d3d9_cs);
+ else
+ {
+ IWineD3DSurface_GetParent(pRenderTarget, (IUnknown **)ppRenderTarget);
+ IWineD3DSurface_Release(pRenderTarget);
+ }
+
+ wined3d_mutex_unlock();
return hr;
}
@@ -882,9 +897,11 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetDepthStencilSurface(LPDIRECT3DDE
TRACE("(%p) Relay\n" , This);
pSurface = (IDirect3DSurface9Impl*)pZStencilSurface;
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetDepthStencilSurface(This->WineD3DDevice, NULL==pSurface ? NULL : pSurface->wineD3DSurface);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -898,7 +915,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetDepthStencilSurface(LPDIRECT3DDE
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetDepthStencilSurface(This->WineD3DDevice,&pZStencilSurface);
if (hr == WINED3D_OK) {
IWineD3DSurface_GetParent(pZStencilSurface,(IUnknown**)ppZStencilSurface);
@@ -908,7 +925,8 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetDepthStencilSurface(LPDIRECT3DDE
WARN("Call to IWineD3DDevice_GetDepthStencilSurface failed with 0x%08x\n", hr);
*ppZStencilSurface = NULL;
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -917,9 +935,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_BeginScene(LPDIRECT3DDEVICE9EX ifac
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_BeginScene(This->WineD3DDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -928,9 +947,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9EX iface)
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_EndScene(This->WineD3DDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -940,9 +960,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_Clear(LPDIRECT3DDEVICE9EX iface, DW
TRACE("(%p) Relay\n" , This);
/* Note: D3DRECT is compatible with WINED3DRECT */
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_Clear(This->WineD3DDevice, Count, (CONST WINED3DRECT*) pRects, Flags, Color, Z, Stencil);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -952,9 +973,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetTransform(LPDIRECT3DDEVICE9EX if
TRACE("(%p) Relay\n" , This);
/* Note: D3DMATRIX is compatible with WINED3DMATRIX */
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetTransform(This->WineD3DDevice, State, (CONST WINED3DMATRIX*) lpMatrix);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -964,10 +986,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetTransform(LPDIRECT3DDEVICE9EX if
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
/* Note: D3DMATRIX is compatible with WINED3DMATRIX */
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetTransform(This->WineD3DDevice, State, (WINED3DMATRIX*) pMatrix);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -978,9 +1000,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_MultiplyTransform(LPDIRECT3DDEVICE9
TRACE("(%p) Relay\n" , This);
/* Note: D3DMATRIX is compatible with WINED3DMATRIX */
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_MultiplyTransform(This->WineD3DDevice, State, (CONST WINED3DMATRIX*) pMatrix);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -990,9 +1013,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetViewport(LPDIRECT3DDEVICE9EX ifa
TRACE("(%p) Relay\n" , This);
/* Note: D3DVIEWPORT9 is compatible with WINED3DVIEWPORT */
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetViewport(This->WineD3DDevice, (const WINED3DVIEWPORT *)pViewport);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1002,9 +1026,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetViewport(LPDIRECT3DDEVICE9EX ifa
TRACE("(%p) Relay\n" , This);
/* Note: D3DVIEWPORT9 is compatible with WINED3DVIEWPORT */
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetViewport(This->WineD3DDevice, (WINED3DVIEWPORT *)pViewport);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1014,9 +1039,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetMaterial(LPDIRECT3DDEVICE9EX ifa
TRACE("(%p) Relay\n" , This);
/* Note: D3DMATERIAL9 is compatible with WINED3DMATERIAL */
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetMaterial(This->WineD3DDevice, (const WINED3DMATERIAL *)pMaterial);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1026,9 +1052,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetMaterial(LPDIRECT3DDEVICE9EX ifa
TRACE("(%p) Relay\n" , This);
/* Note: D3DMATERIAL9 is compatible with WINED3DMATERIAL */
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetMaterial(This->WineD3DDevice, (WINED3DMATERIAL *)pMaterial);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1038,9 +1065,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetLight(LPDIRECT3DDEVICE9EX iface,
TRACE("(%p) Relay\n" , This);
/* Note: D3DLIGHT9 is compatible with WINED3DLIGHT */
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetLight(This->WineD3DDevice, Index, (const WINED3DLIGHT *)pLight);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1050,9 +1078,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetLight(LPDIRECT3DDEVICE9EX iface,
TRACE("(%p) Relay\n" , This);
/* Note: D3DLIGHT9 is compatible with WINED3DLIGHT */
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetLight(This->WineD3DDevice, Index, (WINED3DLIGHT *)pLight);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1061,9 +1090,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_LightEnable(LPDIRECT3DDEVICE9EX ifa
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetLightEnable(This->WineD3DDevice, Index, Enable);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1072,9 +1102,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetLightEnable(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetLightEnable(This->WineD3DDevice, Index, pEnable);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1083,9 +1114,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetClipPlane(LPDIRECT3DDEVICE9EX if
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetClipPlane(This->WineD3DDevice, Index, pPlane);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1094,9 +1126,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetClipPlane(LPDIRECT3DDEVICE9EX if
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetClipPlane(This->WineD3DDevice, Index, pPlane);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1105,9 +1138,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetRenderState(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetRenderState(This->WineD3DDevice, State, Value);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1116,9 +1150,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderState(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetRenderState(This->WineD3DDevice, State, pValue);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1127,9 +1162,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetClipStatus(LPDIRECT3DDEVICE9EX i
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetClipStatus(This->WineD3DDevice, (const WINED3DCLIPSTATUS *)pClipStatus);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1138,9 +1174,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetClipStatus(LPDIRECT3DDEVICE9EX i
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetClipStatus(This->WineD3DDevice, (WINED3DCLIPSTATUS *)pClipStatus);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1155,7 +1192,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetTexture(LPDIRECT3DDEVICE9EX ifac
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
rc = IWineD3DDevice_GetTexture(This->WineD3DDevice, Stage, &retTexture);
if (SUCCEEDED(rc) && NULL != retTexture) {
IWineD3DBaseTexture_GetParent(retTexture, (IUnknown **)ppTexture);
@@ -1166,7 +1203,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetTexture(LPDIRECT3DDEVICE9EX ifac
}
*ppTexture = NULL;
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return rc;
}
@@ -1176,10 +1213,11 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetTexture(LPDIRECT3DDEVICE9EX ifac
HRESULT hr;
TRACE("(%p) Relay %d %p\n" , This, Stage, pTexture);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetTexture(This->WineD3DDevice, Stage,
pTexture==NULL ? NULL:((IDirect3DBaseTexture9Impl *)pTexture)->wineD3DBaseTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1225,9 +1263,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetTextureStageState(LPDIRECT3DDEVI
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetTextureStageState(This->WineD3DDevice, Stage, tss_lookup[Type], pValue);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1236,20 +1275,24 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetTextureStageState(LPDIRECT3DDEVI
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetTextureStageState(This->WineD3DDevice, Stage, tss_lookup[Type], Value);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_GetSamplerState(LPDIRECT3DDEVICE9EX iface, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD* pValue) {
- IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+static HRESULT WINAPI IDirect3DDevice9Impl_GetSamplerState(IDirect3DDevice9Ex *iface, DWORD Sampler,
+ D3DSAMPLERSTATETYPE Type, DWORD *pValue)
+{
+ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetSamplerState(This->WineD3DDevice, Sampler, Type, pValue);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1258,9 +1301,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetSamplerState(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetSamplerState(This->WineD3DDevice, Sampler, Type, Value);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1269,20 +1313,24 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ValidateDevice(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_ValidateDevice(This->WineD3DDevice, pNumPasses);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_SetPaletteEntries(LPDIRECT3DDEVICE9EX iface, UINT PaletteNumber, CONST PALETTEENTRY* pEntries) {
- IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+static HRESULT WINAPI IDirect3DDevice9Impl_SetPaletteEntries(IDirect3DDevice9Ex *iface, UINT PaletteNumber,
+ const PALETTEENTRY *pEntries)
+{
+ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetPaletteEntries(This->WineD3DDevice, PaletteNumber, pEntries);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1291,9 +1339,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetPaletteEntries(LPDIRECT3DDEVICE9
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetPaletteEntries(This->WineD3DDevice, PaletteNumber, pEntries);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1302,9 +1351,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetCurrentTexturePalette(LPDIRECT3D
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetCurrentTexturePalette(This->WineD3DDevice, PaletteNumber);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1313,9 +1363,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetCurrentTexturePalette(LPDIRECT3D
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetCurrentTexturePalette(This->WineD3DDevice, PaletteNumber);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1324,9 +1375,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetScissorRect(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetScissorRect(This->WineD3DDevice, pRect);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1335,9 +1387,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetScissorRect(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetScissorRect(This->WineD3DDevice, pRect);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1346,9 +1399,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetSoftwareVertexProcessing(LPDIREC
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetSoftwareVertexProcessing(This->WineD3DDevice, bSoftware);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1357,9 +1411,10 @@ static BOOL WINAPI IDirect3DDevice9Impl_GetSoftwareVertexProcessing(LPDIREC
BOOL ret;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DDevice_GetSoftwareVertexProcessing(This->WineD3DDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -1368,9 +1423,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetNPatchMode(LPDIRECT3DDEVICE9EX i
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetNPatchMode(This->WineD3DDevice, nSegments);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1379,22 +1435,26 @@ static float WINAPI IDirect3DDevice9Impl_GetNPatchMode(LPDIRECT3DDEVICE9EX i
float ret;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DDevice_GetNPatchMode(This->WineD3DDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_DrawPrimitive(LPDIRECT3DDEVICE9EX iface, D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount) {
- IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+static HRESULT WINAPI IDirect3DDevice9Impl_DrawPrimitive(IDirect3DDevice9Ex *iface, D3DPRIMITIVETYPE PrimitiveType,
+ UINT StartVertex, UINT PrimitiveCount)
+{
+ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType);
hr = IWineD3DDevice_DrawPrimitive(This->WineD3DDevice, StartVertex,
vertex_count_from_primitive_count(PrimitiveType, PrimitiveCount));
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1405,26 +1465,30 @@ static HRESULT WINAPI IDirect3DDevice9Impl_DrawIndexedPrimitive(LPDIRECT3DDEVI
TRACE("(%p) Relay\n" , This);
/* D3D8 passes the baseVertexIndex in SetIndices, and due to the stateblock functions wined3d has to work that way */
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetBaseVertexIndex(This->WineD3DDevice, BaseVertexIndex);
IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType);
hr = IWineD3DDevice_DrawIndexedPrimitive(This->WineD3DDevice, MinVertexIndex, NumVertices,
startIndex, vertex_count_from_primitive_count(PrimitiveType, primCount));
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_DrawPrimitiveUP(LPDIRECT3DDEVICE9EX iface, D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride) {
- IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+static HRESULT WINAPI IDirect3DDevice9Impl_DrawPrimitiveUP(IDirect3DDevice9Ex *iface, D3DPRIMITIVETYPE PrimitiveType,
+ UINT PrimitiveCount, const void *pVertexStreamZeroData, UINT VertexStreamZeroStride)
+{
+ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType);
hr = IWineD3DDevice_DrawPrimitiveUP(This->WineD3DDevice,
vertex_count_from_primitive_count(PrimitiveType, PrimitiveCount),
pVertexStreamZeroData, VertexStreamZeroStride);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1435,12 +1499,13 @@ static HRESULT WINAPI IDirect3DDevice9Impl_DrawIndexedPrimitiveUP(LPDIRECT3DDE
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType);
hr = IWineD3DDevice_DrawIndexedPrimitiveUP(This->WineD3DDevice, MinVertexIndex, NumVertexIndices,
vertex_count_from_primitive_count(PrimitiveType, PrimitiveCount), pIndexData,
wined3dformat_from_d3dformat(IndexDataFormat), pVertexStreamZeroData, VertexStreamZeroStride);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1451,9 +1516,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ProcessVertices(LPDIRECT3DDEVICE9EX
IDirect3DVertexBuffer9Impl *dest = (IDirect3DVertexBuffer9Impl *) pDestBuffer;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_ProcessVertices(This->WineD3DDevice,SrcStartIndex, DestIndex, VertexCount, dest->wineD3DVertexBuffer, Decl ? Decl->wineD3DVertexDeclaration : NULL, Flags, dest->fvf);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1527,9 +1593,9 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetFVF(LPDIRECT3DDEVICE9EX iface, DWO
return D3D_OK;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
decl = getConvertedDecl(This, FVF);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
if (!decl)
{
@@ -1578,11 +1644,12 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSource(LPDIRECT3DDEVICE9EX i
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetStreamSource(This->WineD3DDevice, StreamNumber,
- pStreamData==NULL ? NULL:((IDirect3DVertexBuffer9Impl *)pStreamData)->wineD3DVertexBuffer,
- OffsetInBytes, Stride);
- LeaveCriticalSection(&d3d9_cs);
+ pStreamData ? ((IDirect3DVertexBuffer9Impl *)pStreamData)->wineD3DVertexBuffer : NULL,
+ OffsetInBytes, Stride);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1597,7 +1664,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetStreamSource(LPDIRECT3DDEVICE9EX i
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
rc = IWineD3DDevice_GetStreamSource(This->WineD3DDevice, StreamNumber, &retStream, OffsetInBytes, pStride);
if (rc == D3D_OK && NULL != retStream) {
IWineD3DBuffer_GetParent(retStream, (IUnknown **)pStream);
@@ -1608,19 +1675,22 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetStreamSource(LPDIRECT3DDEVICE9EX i
}
*pStream = NULL;
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return rc;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSourceFreq(LPDIRECT3DDEVICE9EX iface, UINT StreamNumber, UINT Divider) {
- IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+static HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSourceFreq(IDirect3DDevice9Ex *iface, UINT StreamNumber,
+ UINT Divider)
+{
+ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetStreamSourceFreq(This->WineD3DDevice, StreamNumber, Divider);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1629,9 +1699,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetStreamSourceFreq(LPDIRECT3DDEVIC
HRESULT hr;
TRACE("(%p) Relay\n" , This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetStreamSourceFreq(This->WineD3DDevice, StreamNumber, Divider);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1641,11 +1712,12 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetIndices(LPDIRECT3DDEVICE9EX ifac
IDirect3DIndexBuffer9Impl *ib = (IDirect3DIndexBuffer9Impl *) pIndexData;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetIndices(This->WineD3DDevice,
ib ? ib->wineD3DIndexBuffer : NULL,
ib ? ib->format : WINED3DFMT_UNKNOWN);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1660,7 +1732,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetIndices(LPDIRECT3DDEVICE9EX ifac
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
rc = IWineD3DDevice_GetIndices(This->WineD3DDevice, &retIndexData);
if (SUCCEEDED(rc) && retIndexData) {
IWineD3DBuffer_GetParent(retIndexData, (IUnknown **)ppIndexData);
@@ -1669,7 +1741,8 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetIndices(LPDIRECT3DDEVICE9EX ifac
if (FAILED(rc)) FIXME("Call to GetIndices failed\n");
*ppIndexData = NULL;
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return rc;
}
@@ -1678,9 +1751,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_DrawRectPatch(LPDIRECT3DDEVICE9EX i
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_DrawRectPatch(This->WineD3DDevice, Handle, pNumSegs, (CONST WINED3DRECTPATCH_INFO *)pRectPatchInfo);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1689,9 +1763,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_DrawTriPatch(LPDIRECT3DDEVICE9EX if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_DrawTriPatch(This->WineD3DDevice, Handle, pNumSegs, (CONST WINED3DTRIPATCH_INFO *)pTriPatchInfo);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1700,9 +1775,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_DeletePatch(LPDIRECT3DDEVICE9EX ifa
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_DeletePatch(This->WineD3DDevice, Handle);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -1995,12 +2071,12 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParen
"\tpool %#x, level %u, face %u, surface %p\n",
iface, superior, width, height, format, usage, pool, level, face, surface);
- if (pool == D3DPOOL_DEFAULT && !(usage & D3DUSAGE_DYNAMIC)) lockable = FALSE;
+ if (pool == WINED3DPOOL_DEFAULT && !(usage & D3DUSAGE_DYNAMIC))
+ lockable = FALSE;
hr = IDirect3DDevice9Impl_CreateSurface((IDirect3DDevice9Ex *)This, width, height,
d3dformat_from_wined3dformat(format), lockable, FALSE /* Discard */, level,
- (IDirect3DSurface9 **)&d3d_surface, D3DRTYPE_SURFACE, usage, pool,
- D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */, NULL);
+ (IDirect3DSurface9 **)&d3d_surface, usage, pool, D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */);
if (FAILED(hr))
{
ERR("(%p) CreateSurface failed, returning %#x\n", iface, hr);
diff --git a/reactos/dll/directx/wine/d3d9/directx.c b/reactos/dll/directx/wine/d3d9/directx.c
index e9547a764e4..fe229166904 100644
--- a/reactos/dll/directx/wine/d3d9/directx.c
+++ b/reactos/dll/directx/wine/d3d9/directx.c
@@ -69,9 +69,10 @@ static ULONG WINAPI IDirect3D9Impl_Release(LPDIRECT3D9EX iface) {
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3D_Release(This->WineD3D);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This);
}
@@ -84,9 +85,10 @@ static HRESULT WINAPI IDirect3D9Impl_RegisterSoftwareDevice(LPDIRECT3D9EX ifac
HRESULT hr;
TRACE("(%p)->(%p)\n", This, pInitializeFunction);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_RegisterSoftwareDevice(This->WineD3D, pInitializeFunction);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -95,9 +97,10 @@ static UINT WINAPI IDirect3D9Impl_GetAdapterCount(LPDIRECT3D9EX iface) {
HRESULT hr;
TRACE("%p\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_GetAdapterCount(This->WineD3D);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -106,23 +109,25 @@ static HRESULT WINAPI IDirect3D9Impl_GetAdapterIdentifier(LPDIRECT3D9EX iface, U
WINED3DADAPTER_IDENTIFIER adapter_id;
HRESULT hr;
- /* dx8 and dx9 have different structures to be filled in, with incompatible
- layouts so pass in pointers to the places to be filled via an internal
- structure */
- adapter_id.Driver = pIdentifier->Driver;
- adapter_id.Description = pIdentifier->Description;
- adapter_id.DeviceName = pIdentifier->DeviceName;
- adapter_id.DriverVersion = &pIdentifier->DriverVersion;
- adapter_id.VendorId = &pIdentifier->VendorId;
- adapter_id.DeviceId = &pIdentifier->DeviceId;
- adapter_id.SubSysId = &pIdentifier->SubSysId;
- adapter_id.Revision = &pIdentifier->Revision;
- adapter_id.DeviceIdentifier = &pIdentifier->DeviceIdentifier;
- adapter_id.WHQLLevel = &pIdentifier->WHQLLevel;
+ adapter_id.driver = pIdentifier->Driver;
+ adapter_id.driver_size = sizeof(pIdentifier->Driver);
+ adapter_id.description = pIdentifier->Description;
+ adapter_id.description_size = sizeof(pIdentifier->Description);
+ adapter_id.device_name = pIdentifier->DeviceName;
+ adapter_id.device_name_size = sizeof(pIdentifier->DeviceName);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_GetAdapterIdentifier(This->WineD3D, Adapter, Flags, &adapter_id);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
+ pIdentifier->DriverVersion = adapter_id.driver_version;
+ pIdentifier->VendorId = adapter_id.vendor_id;
+ pIdentifier->DeviceId = adapter_id.device_id;
+ pIdentifier->SubSysId = adapter_id.subsystem_id;
+ pIdentifier->Revision = adapter_id.revision;
+ memcpy(&pIdentifier->DeviceIdentifier, &adapter_id.device_identifier, sizeof(pIdentifier->DeviceIdentifier));
+ pIdentifier->WHQLLevel = adapter_id.whql_level;
+
return hr;
}
@@ -136,9 +141,10 @@ static UINT WINAPI IDirect3D9Impl_GetAdapterModeCount(LPDIRECT3D9EX iface, UINT
return 0;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_GetAdapterModeCount(This->WineD3D, Adapter, wined3dformat_from_d3dformat(Format));
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -151,10 +157,10 @@ static HRESULT WINAPI IDirect3D9Impl_EnumAdapterModes(LPDIRECT3D9EX iface, UINT
if(Format != D3DFMT_X8R8G8B8 && Format != D3DFMT_R5G6B5)
return D3DERR_INVALIDCALL;
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_EnumAdapterModes(This->WineD3D, Adapter, wined3dformat_from_d3dformat(Format),
Mode, (WINED3DDISPLAYMODE *) pMode);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
@@ -165,38 +171,51 @@ static HRESULT WINAPI IDirect3D9Impl_GetAdapterDisplayMode(LPDIRECT3D9EX iface,
IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
HRESULT hr;
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_GetAdapterDisplayMode(This->WineD3D, Adapter, (WINED3DDISPLAYMODE *) pMode);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
return hr;
}
-static HRESULT WINAPI IDirect3D9Impl_CheckDeviceType(LPDIRECT3D9EX iface,
- UINT Adapter, D3DDEVTYPE CheckType, D3DFORMAT DisplayFormat,
- D3DFORMAT BackBufferFormat, BOOL Windowed) {
+static HRESULT WINAPI IDirect3D9Impl_CheckDeviceType(IDirect3D9Ex *iface, UINT Adapter,
+ D3DDEVTYPE CheckType, D3DFORMAT DisplayFormat, D3DFORMAT BackBufferFormat, BOOL Windowed)
+{
IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
HRESULT hr;
TRACE("(%p)->(%d, %d, %d, %d, %s\n", This, Adapter, CheckType, DisplayFormat,
BackBufferFormat, Windowed ? "true" : "false");
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_CheckDeviceType(This->WineD3D, Adapter, CheckType, wined3dformat_from_d3dformat(DisplayFormat),
wined3dformat_from_d3dformat(BackBufferFormat), Windowed);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-static HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormat(LPDIRECT3D9EX iface,
- UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat,
- DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat) {
+static HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormat(IDirect3D9Ex *iface, UINT Adapter, D3DDEVTYPE DeviceType,
+ D3DFORMAT AdapterFormat, DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat)
+{
IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
HRESULT hr;
WINED3DRESOURCETYPE WineD3DRType;
TRACE("%p\n", This);
+ /* This format is nothing special and it is supported perfectly.
+ * However, ati and nvidia driver on windows do not mark this format as
+ * supported (tested with the dxCapsViewer) and pretending to
+ * support this format uncovers a bug in Battlefield 1942 (fonts are missing)
+ * So do the same as Windows drivers and pretend not to support it on dx8 and 9
+ */
+ if(CheckFormat == D3DFMT_R8G8B8)
+ {
+ WARN("D3DFMT_R8G8B8 is not available on windows, returning D3DERR_NOTAVAILABLE\n");
+ return D3DERR_NOTAVAILABLE;
+ }
+
switch(RType) {
case D3DRTYPE_VERTEXBUFFER:
case D3DRTYPE_INDEXBUFFER:
@@ -208,39 +227,43 @@ static HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormat(LPDIRECT3D9EX iface,
break;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_CheckDeviceFormat(This->WineD3D, Adapter, DeviceType, wined3dformat_from_d3dformat(AdapterFormat),
Usage, WineD3DRType, wined3dformat_from_d3dformat(CheckFormat), SURFACE_OPENGL);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-static HRESULT WINAPI IDirect3D9Impl_CheckDeviceMultiSampleType(LPDIRECT3D9EX iface,
- UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat,
- BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType, DWORD* pQualityLevels) {
+static HRESULT WINAPI IDirect3D9Impl_CheckDeviceMultiSampleType(IDirect3D9Ex *iface, UINT Adapter,
+ D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat, BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType,
+ DWORD *pQualityLevels)
+{
IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
HRESULT hr;
TRACE("%p\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_CheckDeviceMultiSampleType(This->WineD3D, Adapter, DeviceType,
wined3dformat_from_d3dformat(SurfaceFormat), Windowed, MultiSampleType, pQualityLevels);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-static HRESULT WINAPI IDirect3D9Impl_CheckDepthStencilMatch(LPDIRECT3D9EX iface,
- UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat,
- D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat) {
+static HRESULT WINAPI IDirect3D9Impl_CheckDepthStencilMatch(IDirect3D9Ex *iface, UINT Adapter,
+ D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat)
+{
IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
HRESULT hr;
TRACE("%p\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_CheckDepthStencilMatch(This->WineD3D, Adapter, DeviceType,
wined3dformat_from_d3dformat(AdapterFormat), wined3dformat_from_d3dformat(RenderTargetFormat),
wined3dformat_from_d3dformat(DepthStencilFormat));
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -249,10 +272,11 @@ static HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormatConversion(LPDIRECT3D9EX i
HRESULT hr;
TRACE("%p\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_CheckDeviceFormatConversion(This->WineD3D, Adapter, DeviceType,
wined3dformat_from_d3dformat(SourceFormat), wined3dformat_from_d3dformat(TargetFormat));
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -330,9 +354,11 @@ static HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9EX iface, UINT Ada
return D3DERR_INVALIDCALL; /*well this is what MSDN says to return*/
}
memset(pCaps, 0, sizeof(*pCaps));
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, pWineCaps);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
WINECAPSTOD3D9CAPS(pCaps, pWineCaps)
HeapFree(GetProcessHeap(), 0, pWineCaps);
@@ -350,9 +376,10 @@ static HMONITOR WINAPI IDirect3D9Impl_GetAdapterMonitor(LPDIRECT3D9EX iface, UIN
HMONITOR ret;
TRACE("%p\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3D_GetAdapterMonitor(This->WineD3D, Adapter);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -418,13 +445,14 @@ static HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9EX iface, UINT Adap
*ppReturnedDeviceInterface = (IDirect3DDevice9 *)object;
/* Allocate an associated WineD3DDevice object */
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3D_CreateDevice(This->WineD3D, Adapter, DeviceType, hFocusWindow, BehaviourFlags,
(IUnknown *)object, (IWineD3DDeviceParent *)&object->device_parent_vtbl, &object->WineD3DDevice);
if (hr != D3D_OK) {
HeapFree(GetProcessHeap(), 0, object);
*ppReturnedDeviceInterface = NULL;
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -492,7 +520,7 @@ static HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9EX iface, UINT Adap
* can be used without further checking
*/
object->convertedDecls = HeapAlloc(GetProcessHeap(), 0, 0);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
diff --git a/reactos/dll/directx/wine/d3d9/indexbuffer.c b/reactos/dll/directx/wine/d3d9/indexbuffer.c
index 8802bd19780..49f6fc8013a 100644
--- a/reactos/dll/directx/wine/d3d9/indexbuffer.c
+++ b/reactos/dll/directx/wine/d3d9/indexbuffer.c
@@ -57,9 +57,10 @@ static ULONG WINAPI IDirect3DIndexBuffer9Impl_Release(LPDIRECT3DINDEXBUFFER9 ifa
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DBuffer_Release(This->wineD3DIndexBuffer);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
IDirect3DDevice9Ex_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -73,14 +74,15 @@ static HRESULT WINAPI IDirect3DIndexBuffer9Impl_GetDevice(LPDIRECT3DINDEXBUFFER9
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetDevice(This->wineD3DIndexBuffer, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -89,9 +91,10 @@ static HRESULT WINAPI IDirect3DIndexBuffer9Impl_SetPrivateData(LPDIRECT3DINDEXBU
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_SetPrivateData(This->wineD3DIndexBuffer, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -100,9 +103,10 @@ static HRESULT WINAPI IDirect3DIndexBuffer9Impl_GetPrivateData(LPDIRECT3DINDEXBU
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetPrivateData(This->wineD3DIndexBuffer, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -111,9 +115,10 @@ static HRESULT WINAPI IDirect3DIndexBuffer9Impl_FreePrivateData(LPDIRECT3DINDEXB
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_FreePrivateData(This->wineD3DIndexBuffer, refguid);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -122,9 +127,10 @@ static DWORD WINAPI IDirect3DIndexBuffer9Impl_SetPriority(LPDIRECT3DINDEXBUFFER9
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DBuffer_SetPriority(This->wineD3DIndexBuffer, PriorityNew);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -133,9 +139,10 @@ static DWORD WINAPI IDirect3DIndexBuffer9Impl_GetPriority(LPDIRECT3DINDEXBUFFER9
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DBuffer_GetPriority(This->wineD3DIndexBuffer);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -143,9 +150,9 @@ static void WINAPI IDirect3DIndexBuffer9Impl_PreLoad(LPDIRECT3DINDEXBUFFER9 ifac
IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DBuffer_PreLoad(This->wineD3DIndexBuffer);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
}
static D3DRESOURCETYPE WINAPI IDirect3DIndexBuffer9Impl_GetType(LPDIRECT3DINDEXBUFFER9 iface) {
@@ -161,9 +168,10 @@ static HRESULT WINAPI IDirect3DIndexBuffer9Impl_Lock(LPDIRECT3DINDEXBUFFER9 ifac
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_Map(This->wineD3DIndexBuffer, OffsetToLock, SizeToLock, (BYTE **)ppbData, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -172,9 +180,10 @@ static HRESULT WINAPI IDirect3DIndexBuffer9Impl_Unlock(LPDIRECT3DINDEXBUFFER9 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_Unmap(This->wineD3DIndexBuffer);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -184,9 +193,9 @@ static HRESULT WINAPI IDirect3DIndexBuffer9Impl_GetDesc(LPDIRECT3DINDEXB
WINED3DBUFFER_DESC desc;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetDesc(This->wineD3DIndexBuffer, &desc);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hr)) {
pDesc->Format = d3dformat_from_wined3dformat(This->format);
@@ -223,14 +232,13 @@ static const IDirect3DIndexBuffer9Vtbl Direct3DIndexBuffer9_Vtbl =
/* IDirect3DDevice9 IDirect3DIndexBuffer9 Methods follow: */
-HRESULT WINAPI IDirect3DDevice9Impl_CreateIndexBuffer(LPDIRECT3DDEVICE9EX iface,
- UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool,
- IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle) {
-
+HRESULT WINAPI IDirect3DDevice9Impl_CreateIndexBuffer(IDirect3DDevice9Ex *iface, UINT Length, DWORD Usage,
+ D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9 **ppIndexBuffer, HANDLE *pSharedHandle)
+{
IDirect3DIndexBuffer9Impl *object;
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hrc = D3D_OK;
-
+
TRACE("(%p) Relay\n", This);
/* Allocate the storage for the device */
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
@@ -243,10 +251,12 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateIndexBuffer(LPDIRECT3DDEVICE9EX iface,
object->ref = 1;
object->format = wined3dformat_from_d3dformat(Format);
TRACE("Calling wined3d create index buffer\n");
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateIndexBuffer(This->WineD3DDevice, Length, Usage & WINED3DUSAGE_MASK,
(WINED3DPOOL)Pool, &object->wineD3DIndexBuffer, (IUnknown *)object);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
if (hrc != D3D_OK) {
/* free up object */
diff --git a/reactos/dll/directx/wine/d3d9/pixelshader.c b/reactos/dll/directx/wine/d3d9/pixelshader.c
index 3939f5977a8..37950454521 100644
--- a/reactos/dll/directx/wine/d3d9/pixelshader.c
+++ b/reactos/dll/directx/wine/d3d9/pixelshader.c
@@ -56,9 +56,10 @@ static ULONG WINAPI IDirect3DPixelShader9Impl_Release(LPDIRECT3DPIXELSHADER9 ifa
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DPixelShader_Release(This->wineD3DPixelShader);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
IDirect3DDevice9Ex_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -72,11 +73,12 @@ static HRESULT WINAPI IDirect3DPixelShader9Impl_GetDevice(LPDIRECT3DPIXELSHADER9
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DPixelShader_GetDevice(This->wineD3DPixelShader, &myDevice);
IWineD3DDevice_GetParent(myDevice, (IUnknown **)ppDevice);
IWineD3DDevice_Release(myDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
TRACE("(%p) returning (%p)\n", This, *ppDevice);
return D3D_OK;
}
@@ -86,9 +88,10 @@ static HRESULT WINAPI IDirect3DPixelShader9Impl_GetFunction(LPDIRECT3DPIXELSHADE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DPixelShader_GetFunction(This->wineD3DPixelShader, pData, pSizeOfData);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -127,12 +130,14 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreatePixelShader(LPDIRECT3DDEVICE9EX iface,
object->ref = 1;
object->lpVtbl = &Direct3DPixelShader9_Vtbl;
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreatePixelShader(This->WineD3DDevice, pFunction, NULL,
&object->wineD3DPixelShader, (IUnknown *)object);
- LeaveCriticalSection(&d3d9_cs);
- if (hrc != D3D_OK) {
+ wined3d_mutex_unlock();
+ if (hrc != D3D_OK)
+ {
/* free up object */
FIXME("(%p) call to IWineD3DDevice_CreatePixelShader failed\n", This);
HeapFree(GetProcessHeap(), 0 , object);
@@ -152,9 +157,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShader(LPDIRECT3DDEVICE9EX iface, ID
IDirect3DPixelShader9Impl *shader = (IDirect3DPixelShader9Impl *)pShader;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DDevice_SetPixelShader(This->WineD3DDevice, shader == NULL ? NULL :shader->wineD3DPixelShader);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return D3D_OK;
}
@@ -169,7 +175,7 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(LPDIRECT3DDEVICE9EX iface, ID
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_GetPixelShader(This->WineD3DDevice, &object);
if (SUCCEEDED(hrc))
{
@@ -187,7 +193,7 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(LPDIRECT3DDEVICE9EX iface, ID
{
WARN("(%p) : Call to IWineD3DDevice_GetPixelShader failed %u (device %p)\n", This, hrc, This->WineD3DDevice);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
TRACE("(%p) : returning %p\n", This, *ppShader);
return hrc;
@@ -196,11 +202,12 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(LPDIRECT3DDEVICE9EX iface, ID
HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantF(LPDIRECT3DDEVICE9EX iface, UINT Register, CONST float* pConstantData, UINT Vector4fCount) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
- TRACE("(%p) Relay\n", This);
+ TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetPixelShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -210,9 +217,9 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantF(LPDIRECT3DDEVICE9EX
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetPixelShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -222,9 +229,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantI(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetPixelShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -233,9 +241,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantI(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetPixelShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -244,9 +253,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetPixelShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -255,8 +265,9 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetPixelShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
diff --git a/reactos/dll/directx/wine/d3d9/query.c b/reactos/dll/directx/wine/d3d9/query.c
index 6e4b20a41eb..a17d2e8402a 100644
--- a/reactos/dll/directx/wine/d3d9/query.c
+++ b/reactos/dll/directx/wine/d3d9/query.c
@@ -57,9 +57,10 @@ static ULONG WINAPI IDirect3DQuery9Impl_Release(LPDIRECT3DQUERY9 iface) {
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DQuery_Release(This->wineD3DQuery);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
IDirect3DDevice9Ex_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -74,7 +75,7 @@ static HRESULT WINAPI IDirect3DQuery9Impl_GetDevice(LPDIRECT3DQUERY9 iface, IDir
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DQuery_GetDevice(This->wineD3DQuery, &pDevice);
if(hr != D3D_OK){
*ppDevice = NULL;
@@ -82,7 +83,8 @@ static HRESULT WINAPI IDirect3DQuery9Impl_GetDevice(LPDIRECT3DQUERY9 iface, IDir
hr = IWineD3DDevice_GetParent(pDevice, (IUnknown **)ppDevice);
IWineD3DDevice_Release(pDevice);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -91,9 +93,10 @@ static D3DQUERYTYPE WINAPI IDirect3DQuery9Impl_GetType(LPDIRECT3DQUERY9 iface) {
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DQuery_GetType(This->wineD3DQuery);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -102,9 +105,10 @@ static DWORD WINAPI IDirect3DQuery9Impl_GetDataSize(LPDIRECT3DQUERY9 iface) {
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DQuery_GetDataSize(This->wineD3DQuery);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -113,9 +117,10 @@ static HRESULT WINAPI IDirect3DQuery9Impl_Issue(LPDIRECT3DQUERY9 iface, DWORD dw
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DQuery_Issue(This->wineD3DQuery, dwIssueFlags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -124,9 +129,10 @@ static HRESULT WINAPI IDirect3DQuery9Impl_GetData(LPDIRECT3DQUERY9 iface, void*
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DQuery_GetData(This->wineD3DQuery, pData, dwSize, dwGetDataFlags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -154,9 +160,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(LPDIRECT3DDEVICE9EX iface, D3DQU
if (!ppQuery)
{
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_CreateQuery(This->WineD3DDevice, Type, NULL, NULL);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -169,9 +176,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(LPDIRECT3DDEVICE9EX iface, D3DQU
object->lpVtbl = &Direct3DQuery9_Vtbl;
object->ref = 1;
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DDevice_CreateQuery(This->WineD3DDevice, Type, &object->wineD3DQuery, (IUnknown *)object);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
if (FAILED(hr)) {
diff --git a/reactos/dll/directx/wine/d3d9/stateblock.c b/reactos/dll/directx/wine/d3d9/stateblock.c
index d17233f124f..29ff5b34d19 100644
--- a/reactos/dll/directx/wine/d3d9/stateblock.c
+++ b/reactos/dll/directx/wine/d3d9/stateblock.c
@@ -57,9 +57,10 @@ static ULONG WINAPI IDirect3DStateBlock9Impl_Release(LPDIRECT3DSTATEBLOCK9 iface
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DStateBlock_Release(This->wineD3DStateBlock);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
IDirect3DDevice9Ex_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -73,25 +74,27 @@ static HRESULT WINAPI IDirect3DStateBlock9Impl_GetDevice(LPDIRECT3DSTATEBLOCK9 i
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DStateBlock_GetDevice(This->wineD3DStateBlock, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
static HRESULT WINAPI IDirect3DStateBlock9Impl_Capture(LPDIRECT3DSTATEBLOCK9 iface) {
IDirect3DStateBlock9Impl *This = (IDirect3DStateBlock9Impl *)iface;
HRESULT hr;
- TRACE("(%p) Relay\n", This);
+ TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DStateBlock_Capture(This->wineD3DStateBlock);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -100,9 +103,10 @@ static HRESULT WINAPI IDirect3DStateBlock9Impl_Apply(LPDIRECT3DSTATEBLOCK9 iface
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DStateBlock_Apply(This->wineD3DStateBlock);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -125,7 +129,7 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(LPDIRECT3DDEVICE9EX iface,
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
IDirect3DStateBlock9Impl* object;
HRESULT hrc = D3D_OK;
-
+
TRACE("(%p) Relay\n", This);
if(Type != D3DSBT_ALL && Type != D3DSBT_PIXELSTATE &&
@@ -133,15 +137,16 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(LPDIRECT3DDEVICE9EX iface,
WARN("Unexpected stateblock type, returning D3DERR_INVALIDCALL\n");
return D3DERR_INVALIDCALL;
}
-
+
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlock9Impl));
if (NULL == object) return E_OUTOFMEMORY;
object->lpVtbl = &Direct3DStateBlock9_Vtbl;
object->ref = 1;
-
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateStateBlock(This->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)Type, &object->wineD3DStateBlock, (IUnknown*)object);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
if(hrc != D3D_OK){
FIXME("(%p) Call to IWineD3DDevice_CreateStateBlock failed.\n", This);
HeapFree(GetProcessHeap(), 0, object);
@@ -155,37 +160,41 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(LPDIRECT3DDEVICE9EX iface,
return hrc;
}
-HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(LPDIRECT3DDEVICE9EX iface) {
- IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface)
+{
+ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_BeginStateBlock(This->WineD3DDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
-HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(LPDIRECT3DDEVICE9EX iface, IDirect3DStateBlock9** ppSB) {
- IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface, IDirect3DStateBlock9 **ppSB)
+{
+ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+ IWineD3DStateBlock *wineD3DStateBlock;
+ IDirect3DStateBlock9Impl *object;
HRESULT hr;
- IWineD3DStateBlock* wineD3DStateBlock;
- IDirect3DStateBlock9Impl* object;
- TRACE("(%p) Relay\n", This);
-
+ TRACE("(%p) Relay\n", This);
+
/* Tell wineD3D to endstateblock before anything else (in case we run out
- * of memory later and cause locking problems)
- */
- EnterCriticalSection(&d3d9_cs);
+ * of memory later and cause locking problems) */
+ wined3d_mutex_lock();
hr=IWineD3DDevice_EndStateBlock(This->WineD3DDevice,&wineD3DStateBlock);
- LeaveCriticalSection(&d3d9_cs);
- if(hr!= D3D_OK){
+ wined3d_mutex_unlock();
+
+ if (hr!= D3D_OK)
+ {
WARN("IWineD3DDevice_EndStateBlock returned an error\n");
return hr;
- }
+ }
/* allocate a new IDirectD3DStateBlock */
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY ,sizeof(IDirect3DStateBlock9Impl));
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlock9Impl));
if (!object) return E_OUTOFMEMORY;
object->ref = 1;
object->lpVtbl = &Direct3DStateBlock9_Vtbl;
diff --git a/reactos/dll/directx/wine/d3d9/surface.c b/reactos/dll/directx/wine/d3d9/surface.c
index f95c387d560..b4defaf6ee0 100644
--- a/reactos/dll/directx/wine/d3d9/surface.c
+++ b/reactos/dll/directx/wine/d3d9/surface.c
@@ -78,9 +78,10 @@ static ULONG WINAPI IDirect3DSurface9Impl_Release(LPDIRECT3DSURFACE9 iface) {
if (ref == 0) {
if (This->parentDevice) IDirect3DDevice9Ex_Release(This->parentDevice);
if (!This->isImplicit) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DSurface_Release(This->wineD3DSurface);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This);
}
}
@@ -96,14 +97,15 @@ static HRESULT WINAPI IDirect3DSurface9Impl_GetDevice(LPDIRECT3DSURFACE9 iface,
HRESULT hr;
TRACE("(%p)->(%p)\n", This, ppDevice);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_GetDevice(This->wineD3DSurface, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -112,9 +114,10 @@ static HRESULT WINAPI IDirect3DSurface9Impl_SetPrivateData(LPDIRECT3DSURFACE9 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_SetPrivateData(This->wineD3DSurface, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -123,9 +126,10 @@ static HRESULT WINAPI IDirect3DSurface9Impl_GetPrivateData(LPDIRECT3DSURFACE9 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_GetPrivateData(This->wineD3DSurface, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -134,9 +138,10 @@ static HRESULT WINAPI IDirect3DSurface9Impl_FreePrivateData(LPDIRECT3DSURFACE9 i
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_FreePrivateData(This->wineD3DSurface, refguid);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -145,9 +150,10 @@ static DWORD WINAPI IDirect3DSurface9Impl_SetPriority(LPDIRECT3DSURFACE9 iface,
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_SetPriority(This->wineD3DSurface, PriorityNew);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -156,9 +162,10 @@ static DWORD WINAPI IDirect3DSurface9Impl_GetPriority(LPDIRECT3DSURFACE9 iface)
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_GetPriority(This->wineD3DSurface);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -166,10 +173,9 @@ static void WINAPI IDirect3DSurface9Impl_PreLoad(LPDIRECT3DSURFACE9 iface) {
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DSurface_PreLoad(This->wineD3DSurface);
- LeaveCriticalSection(&d3d9_cs);
- return ;
+ wined3d_mutex_unlock();
}
static D3DRESOURCETYPE WINAPI IDirect3DSurface9Impl_GetType(LPDIRECT3DSURFACE9 iface) {
@@ -177,9 +183,10 @@ static D3DRESOURCETYPE WINAPI IDirect3DSurface9Impl_GetType(LPDIRECT3DSURFACE9 i
D3DRESOURCETYPE ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DSurface_GetType(This->wineD3DSurface);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -205,28 +212,25 @@ static HRESULT WINAPI IDirect3DSurface9Impl_GetContainer(LPDIRECT3DSURFACE9 ifac
static HRESULT WINAPI IDirect3DSurface9Impl_GetDesc(LPDIRECT3DSURFACE9 iface, D3DSURFACE_DESC* pDesc) {
IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface;
- WINED3DSURFACE_DESC wined3ddesc;
- UINT tmpInt = -1;
- WINED3DFORMAT format;
+ WINED3DSURFACE_DESC wined3ddesc;
HRESULT hr;
TRACE("(%p) Relay\n", This);
- /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */
- wined3ddesc.Format = &format;
- wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type;
- wined3ddesc.Usage = &pDesc->Usage;
- wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool;
- wined3ddesc.Size = &tmpInt;
- wined3ddesc.MultiSampleType = (WINED3DMULTISAMPLE_TYPE *) &pDesc->MultiSampleType;
- wined3ddesc.MultiSampleQuality = &pDesc->MultiSampleQuality;
- wined3ddesc.Width = &pDesc->Width;
- wined3ddesc.Height = &pDesc->Height;
-
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_GetDesc(This->wineD3DSurface, &wined3ddesc);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
- if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(format);
+ if (SUCCEEDED(hr))
+ {
+ pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.format);
+ pDesc->Type = wined3ddesc.resource_type;
+ pDesc->Usage = wined3ddesc.usage;
+ pDesc->Pool = wined3ddesc.pool;
+ pDesc->MultiSampleType = wined3ddesc.multisample_type;
+ pDesc->MultiSampleQuality = wined3ddesc.multisample_quality;
+ pDesc->Width = wined3ddesc.width;
+ pDesc->Height = wined3ddesc.height;
+ }
return hr;
}
@@ -236,10 +240,11 @@ static HRESULT WINAPI IDirect3DSurface9Impl_LockRect(LPDIRECT3DSURFACE9 iface, D
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
TRACE("(%p) calling IWineD3DSurface_LockRect %p %p %p %d\n", This, This->wineD3DSurface, pLockedRect, pRect, Flags);
hr = IWineD3DSurface_LockRect(This->wineD3DSurface, (WINED3DLOCKED_RECT *) pLockedRect, pRect, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -248,9 +253,10 @@ static HRESULT WINAPI IDirect3DSurface9Impl_UnlockRect(LPDIRECT3DSURFACE9 iface)
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_UnlockRect(This->wineD3DSurface);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
switch(hr)
{
case WINEDDERR_NOTLOCKED: return D3DERR_INVALIDCALL;
@@ -263,9 +269,10 @@ static HRESULT WINAPI IDirect3DSurface9Impl_GetDC(LPDIRECT3DSURFACE9 iface, HDC*
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_GetDC(This->wineD3DSurface, phdc);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -274,9 +281,10 @@ static HRESULT WINAPI IDirect3DSurface9Impl_ReleaseDC(LPDIRECT3DSURFACE9 iface,
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSurface_ReleaseDC(This->wineD3DSurface, hdc);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
switch(hr) {
case WINEDDERR_NODC: return WINED3DERR_INVALIDCALL;
default: return hr;
diff --git a/reactos/dll/directx/wine/d3d9/swapchain.c b/reactos/dll/directx/wine/d3d9/swapchain.c
index 4f639b17087..fb6680742f2 100644
--- a/reactos/dll/directx/wine/d3d9/swapchain.c
+++ b/reactos/dll/directx/wine/d3d9/swapchain.c
@@ -62,9 +62,10 @@ static ULONG WINAPI IDirect3DSwapChain9Impl_Release(LPDIRECT3DSWAPCHAIN9 iface)
if (ref == 0) {
if (This->parentDevice) IDirect3DDevice9Ex_Release(This->parentDevice);
if (!This->isImplicit) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DSwapChain_Destroy(This->wineD3DSwapChain, D3D9CB_DestroyRenderTarget);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This);
}
}
@@ -78,9 +79,9 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSwapChain_Present(This->wineD3DSwapChain, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion, dwFlags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -90,9 +91,10 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetFrontBufferData(LPDIRECT3DSWAPC
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSwapChain_GetFrontBufferData(This->wineD3DSwapChain, ((IDirect3DSurface9Impl *)pDestSurface)->wineD3DSurface);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -103,13 +105,14 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN9
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DSwapChain_GetBackBuffer(This->wineD3DSwapChain, iBackBuffer, (WINED3DBACKBUFFER_TYPE) Type, &mySurface);
if (hrc == D3D_OK && NULL != mySurface) {
IWineD3DSurface_GetParent(mySurface, (IUnknown **)ppBackBuffer);
IWineD3DSurface_Release(mySurface);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
/* Do not touch the **ppBackBuffer pointer otherwise! (see device test) */
return hrc;
}
@@ -119,9 +122,10 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetRasterStatus(LPDIRECT3DSWAPCHAI
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSwapChain_GetRasterStatus(This->wineD3DSwapChain, (WINED3DRASTER_STATUS *) pRasterStatus);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -130,9 +134,9 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetDisplayMode(LPDIRECT3DSWAPCHAIN
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSwapChain_GetDisplayMode(This->wineD3DSwapChain, (WINED3DDISPLAYMODE *) pMode);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hr)) pMode->Format = d3dformat_from_wined3dformat(pMode->Format);
@@ -146,13 +150,14 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetDevice(LPDIRECT3DSWAPCHAIN9 ifa
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DSwapChain_GetDevice(This->wineD3DSwapChain, &device);
if (hrc == D3D_OK && NULL != device) {
IWineD3DDevice_GetParent(device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(device);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hrc;
}
@@ -163,9 +168,9 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetPresentParameters(LPDIRECT3DSWA
TRACE("(%p)->(%p): Relay\n", This, pPresentationParameters);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DSwapChain_GetPresentParameters(This->wineD3DSwapChain, &winePresentParameters);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
pPresentationParameters->BackBufferWidth = winePresentParameters.BackBufferWidth;
pPresentationParameters->BackBufferHeight = winePresentParameters.BackBufferHeight;
@@ -240,10 +245,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateAdditionalSwapChain(LPDIRECT3DDEVICE
localParameters.PresentationInterval = pPresentationParameters->PresentationInterval;
localParameters.AutoRestoreDisplayMode = TRUE;
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateSwapChain(This->WineD3DDevice, &localParameters,
&object->wineD3DSwapChain, (IUnknown*)object, SURFACE_OPENGL);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
pPresentationParameters->BackBufferWidth = localParameters.BackBufferWidth;
pPresentationParameters->BackBufferHeight = localParameters.BackBufferHeight;
@@ -280,7 +285,7 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UI
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_GetSwapChain(This->WineD3DDevice, iSwapChain, &swapchain);
if (hrc == D3D_OK && NULL != swapchain) {
IWineD3DSwapChain_GetParent(swapchain, (IUnknown **)pSwapChain);
@@ -288,7 +293,8 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UI
} else {
*pSwapChain = NULL;
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hrc;
}
@@ -297,8 +303,9 @@ UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(LPDIRECT3DDEVICE9EX
UINT ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DDevice_GetNumberOfSwapChains(This->WineD3DDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
diff --git a/reactos/dll/directx/wine/d3d9/texture.c b/reactos/dll/directx/wine/d3d9/texture.c
index f0a9c38ad7e..7db70373833 100644
--- a/reactos/dll/directx/wine/d3d9/texture.c
+++ b/reactos/dll/directx/wine/d3d9/texture.c
@@ -59,9 +59,10 @@ static ULONG WINAPI IDirect3DTexture9Impl_Release(LPDIRECT3DTEXTURE9 iface) {
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DTexture_Destroy(This->wineD3DTexture, D3D9CB_DestroySurface);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
IDirect3DDevice9Ex_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -75,14 +76,15 @@ static HRESULT WINAPI IDirect3DTexture9Impl_GetDevice(LPDIRECT3DTEXTURE9 iface,
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_GetDevice(This->wineD3DTexture, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -91,9 +93,10 @@ static HRESULT WINAPI IDirect3DTexture9Impl_SetPrivateData(LPDIRECT3DTEXTURE9 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_SetPrivateData(This->wineD3DTexture, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -102,9 +105,10 @@ static HRESULT WINAPI IDirect3DTexture9Impl_GetPrivateData(LPDIRECT3DTEXTURE9 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_GetPrivateData(This->wineD3DTexture, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -113,9 +117,10 @@ static HRESULT WINAPI IDirect3DTexture9Impl_FreePrivateData(LPDIRECT3DTEXTURE9 i
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_FreePrivateData(This->wineD3DTexture, refguid);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -124,9 +129,10 @@ static DWORD WINAPI IDirect3DTexture9Impl_SetPriority(LPDIRECT3DTEXTURE9 iface,
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DTexture_SetPriority(This->wineD3DTexture, PriorityNew);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -135,9 +141,10 @@ static DWORD WINAPI IDirect3DTexture9Impl_GetPriority(LPDIRECT3DTEXTURE9 iface)
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DTexture_GetPriority(This->wineD3DTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -145,9 +152,9 @@ static void WINAPI IDirect3DTexture9Impl_PreLoad(LPDIRECT3DTEXTURE9 iface) {
IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DTexture_PreLoad(This->wineD3DTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
}
static D3DRESOURCETYPE WINAPI IDirect3DTexture9Impl_GetType(LPDIRECT3DTEXTURE9 iface) {
@@ -155,9 +162,10 @@ static D3DRESOURCETYPE WINAPI IDirect3DTexture9Impl_GetType(LPDIRECT3DTEXTURE9 i
HRESULT ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DTexture_GetType(This->wineD3DTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -167,9 +175,10 @@ static DWORD WINAPI IDirect3DTexture9Impl_SetLOD(LPDIRECT3DTEXTURE9 iface, DWORD
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DTexture_SetLOD(This->wineD3DTexture, LODNew);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -178,9 +187,10 @@ static DWORD WINAPI IDirect3DTexture9Impl_GetLOD(LPDIRECT3DTEXTURE9 iface) {
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DTexture_GetLOD(This->wineD3DTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -189,9 +199,10 @@ static DWORD WINAPI IDirect3DTexture9Impl_GetLevelCount(LPDIRECT3DTEXTURE9 iface
DWORD ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = IWineD3DTexture_GetLevelCount(This->wineD3DTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -200,9 +211,10 @@ static HRESULT WINAPI IDirect3DTexture9Impl_SetAutoGenFilterType(LPDIRECT3DTEXTU
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_SetAutoGenFilterType(This->wineD3DTexture, (WINED3DTEXTUREFILTERTYPE) FilterType);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -211,9 +223,10 @@ static D3DTEXTUREFILTERTYPE WINAPI IDirect3DTexture9Impl_GetAutoGenFilterType(LP
D3DTEXTUREFILTERTYPE ret;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
ret = (D3DTEXTUREFILTERTYPE) IWineD3DTexture_GetAutoGenFilterType(This->wineD3DTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return ret;
}
@@ -221,38 +234,34 @@ static void WINAPI IDirect3DTexture9Impl_GenerateMipSubLevels(LPDIRECT3DTEXTURE9
IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DTexture_GenerateMipSubLevels(This->wineD3DTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
}
/* IDirect3DTexture9 Interface follow: */
static HRESULT WINAPI IDirect3DTexture9Impl_GetLevelDesc(LPDIRECT3DTEXTURE9 iface, UINT Level, D3DSURFACE_DESC* pDesc) {
IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface;
-
- WINED3DSURFACE_DESC wined3ddesc;
- UINT tmpInt = -1;
- HRESULT hr;
- WINED3DFORMAT format;
+ WINED3DSURFACE_DESC wined3ddesc;
+ HRESULT hr;
TRACE("(%p) Relay\n", This);
- /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */
- wined3ddesc.Format = &format;
- wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type;
- wined3ddesc.Usage = &pDesc->Usage;
- wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool;
- wined3ddesc.Size = &tmpInt; /* required for d3d8 */
- wined3ddesc.MultiSampleType = (WINED3DMULTISAMPLE_TYPE *) &pDesc->MultiSampleType;
- wined3ddesc.MultiSampleQuality = &pDesc->MultiSampleQuality;
- wined3ddesc.Width = &pDesc->Width;
- wined3ddesc.Height = &pDesc->Height;
-
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_GetLevelDesc(This->wineD3DTexture, Level, &wined3ddesc);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
- if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(format);
+ if (SUCCEEDED(hr))
+ {
+ pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.format);
+ pDesc->Type = wined3ddesc.resource_type;
+ pDesc->Usage = wined3ddesc.usage;
+ pDesc->Pool = wined3ddesc.pool;
+ pDesc->MultiSampleType = wined3ddesc.multisample_type;
+ pDesc->MultiSampleQuality = wined3ddesc.multisample_quality;
+ pDesc->Width = wined3ddesc.width;
+ pDesc->Height = wined3ddesc.height;
+ }
return hr;
}
@@ -263,13 +272,15 @@ static HRESULT WINAPI IDirect3DTexture9Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE9 i
IWineD3DSurface *mySurface = NULL;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DTexture_GetSurfaceLevel(This->wineD3DTexture, Level, &mySurface);
if (hrc == D3D_OK && NULL != ppSurfaceLevel) {
IWineD3DSurface_GetParent(mySurface, (IUnknown **)ppSurfaceLevel);
IWineD3DSurface_Release(mySurface);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hrc;
}
@@ -278,9 +289,10 @@ static HRESULT WINAPI IDirect3DTexture9Impl_LockRect(LPDIRECT3DTEXTURE9 iface, U
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_LockRect(This->wineD3DTexture, Level, (WINED3DLOCKED_RECT *) pLockedRect, pRect, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -289,9 +301,10 @@ static HRESULT WINAPI IDirect3DTexture9Impl_UnlockRect(LPDIRECT3DTEXTURE9 iface,
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_UnlockRect(This->wineD3DTexture, Level);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -300,9 +313,10 @@ static HRESULT WINAPI IDirect3DTexture9Impl_AddDirtyRect(LPDIRECT3DTEXTURE9 ifac
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DTexture_AddDirtyRect(This->wineD3DTexture, pDirtyRect);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -343,7 +357,7 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateTexture(LPDIRECT3DDEVICE9EX iface, U
IDirect3DTexture9Impl *object;
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hrc = D3D_OK;
-
+
TRACE("(%p) : W(%d) H(%d), Lvl(%d) d(%d), Fmt(%#x), Pool(%d)\n", This, Width, Height, Levels, Usage, Format, Pool);
/* Allocate the storage for the device */
@@ -356,12 +370,14 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateTexture(LPDIRECT3DDEVICE9EX iface, U
object->lpVtbl = &Direct3DTexture9_Vtbl;
object->ref = 1;
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateTexture(This->WineD3DDevice, Width, Height, Levels, Usage & WINED3DUSAGE_MASK,
wined3dformat_from_d3dformat(Format), Pool, &object->wineD3DTexture, (IUnknown *)object);
- LeaveCriticalSection(&d3d9_cs);
- if (FAILED(hrc)) {
+ wined3d_mutex_unlock();
+ if (FAILED(hrc))
+ {
/* free up object */
WARN("(%p) call to IWineD3DDevice_CreateTexture failed\n", This);
HeapFree(GetProcessHeap(), 0, object);
diff --git a/reactos/dll/directx/wine/d3d9/vertexbuffer.c b/reactos/dll/directx/wine/d3d9/vertexbuffer.c
index 501db41439b..226e1139b81 100644
--- a/reactos/dll/directx/wine/d3d9/vertexbuffer.c
+++ b/reactos/dll/directx/wine/d3d9/vertexbuffer.c
@@ -58,9 +58,10 @@ static ULONG WINAPI IDirect3DVertexBuffer9Impl_Release(LPDIRECT3DVERTEXBUFFER9 i
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DBuffer_Release(This->wineD3DVertexBuffer);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
IDirect3DDevice9Ex_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -74,14 +75,15 @@ static HRESULT WINAPI IDirect3DVertexBuffer9Impl_GetDevice(LPDIRECT3DVERTEXBUFFE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetDevice(This->wineD3DVertexBuffer, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -91,9 +93,9 @@ static HRESULT WINAPI IDirect3DVertexBuffer9Impl_SetPrivateData(LPDIRECT3DVERTEX
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_SetPrivateData(This->wineD3DVertexBuffer, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -103,9 +105,10 @@ static HRESULT WINAPI IDirect3DVertexBuffer9Impl_GetPrivateData(LPDIRECT3DVERTEX
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetPrivateData(This->wineD3DVertexBuffer, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -114,9 +117,10 @@ static HRESULT WINAPI IDirect3DVertexBuffer9Impl_FreePrivateData(LPDIRECT3DVERTE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_FreePrivateData(This->wineD3DVertexBuffer, refguid);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -125,9 +129,10 @@ static DWORD WINAPI IDirect3DVertexBuffer9Impl_SetPriority(LPDIRECT3DVERTEXBUFFE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_SetPriority(This->wineD3DVertexBuffer, PriorityNew);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -136,9 +141,10 @@ static DWORD WINAPI IDirect3DVertexBuffer9Impl_GetPriority(LPDIRECT3DVERTEXBUFFE
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetPriority(This->wineD3DVertexBuffer);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -146,10 +152,9 @@ static void WINAPI IDirect3DVertexBuffer9Impl_PreLoad(LPDIRECT3DVERTEXBUFFER9 if
IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DBuffer_PreLoad(This->wineD3DVertexBuffer);
- LeaveCriticalSection(&d3d9_cs);
- return ;
+ wined3d_mutex_unlock();
}
static D3DRESOURCETYPE WINAPI IDirect3DVertexBuffer9Impl_GetType(LPDIRECT3DVERTEXBUFFER9 iface) {
@@ -165,9 +170,10 @@ static HRESULT WINAPI IDirect3DVertexBuffer9Impl_Lock(LPDIRECT3DVERTEXBUFFER9 if
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_Map(This->wineD3DVertexBuffer, OffsetToLock, SizeToLock, (BYTE **)ppbData, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -176,9 +182,10 @@ static HRESULT WINAPI IDirect3DVertexBuffer9Impl_Unlock(LPDIRECT3DVERTEXBUFFER9
HRESULT hr;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_Unmap(This->wineD3DVertexBuffer);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -188,9 +195,9 @@ static HRESULT WINAPI IDirect3DVertexBuffer9Impl_GetDesc(LPDIRECT3DVERTEXBUFFER9
WINED3DBUFFER_DESC desc;
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DBuffer_GetDesc(This->wineD3DVertexBuffer, &desc);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
if (SUCCEEDED(hr)) {
pDesc->Format = D3DFMT_VERTEXDATA;
@@ -228,10 +235,9 @@ static const IDirect3DVertexBuffer9Vtbl Direct3DVertexBuffer9_Vtbl =
/* IDirect3DDevice9 IDirect3DVertexBuffer9 Methods follow: */
-HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexBuffer(LPDIRECT3DDEVICE9EX iface,
- UINT Size, DWORD Usage, DWORD FVF, D3DPOOL Pool,
- IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle) {
-
+HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexBuffer(IDirect3DDevice9Ex *iface, UINT Size, DWORD Usage,
+ DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle)
+{
IDirect3DVertexBuffer9Impl *object;
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hrc = D3D_OK;
@@ -246,11 +252,12 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexBuffer(LPDIRECT3DDEVICE9EX iface
object->lpVtbl = &Direct3DVertexBuffer9_Vtbl;
object->ref = 1;
object->fvf = FVF;
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage & WINED3DUSAGE_MASK,
0 /* fvf for ddraw only */, (WINED3DPOOL) Pool, &(object->wineD3DVertexBuffer), (IUnknown *)object);
- LeaveCriticalSection(&d3d9_cs);
-
+ wined3d_mutex_unlock();
+
if (hrc != D3D_OK) {
/* free up object */
diff --git a/reactos/dll/directx/wine/d3d9/vertexdeclaration.c b/reactos/dll/directx/wine/d3d9/vertexdeclaration.c
index 38f0751bb3f..4ae475194de 100644
--- a/reactos/dll/directx/wine/d3d9/vertexdeclaration.c
+++ b/reactos/dll/directx/wine/d3d9/vertexdeclaration.c
@@ -87,8 +87,7 @@ HRESULT vdecl_convert_fvf(
/* convert the declaration */
elements = HeapAlloc(GetProcessHeap(), 0, size * sizeof(D3DVERTEXELEMENT9));
- if (!elements)
- return D3DERR_OUTOFVIDEOMEMORY;
+ if (!elements) return D3DERR_OUTOFVIDEOMEMORY;
elements[size-1] = end_element;
idx = 0;
@@ -230,9 +229,11 @@ void IDirect3DVertexDeclaration9Impl_Destroy(LPDIRECT3DVERTEXDECLARATION9 iface)
/* Should not happen unless wine has a bug or the application releases references it does not own */
ERR("Destroying vdecl with ref != 0\n");
}
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
IWineD3DVertexDeclaration_Release(This->wineD3DVertexDeclaration);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This->elements);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -262,13 +263,14 @@ static HRESULT WINAPI IDirect3DVertexDeclaration9Impl_GetDevice(LPDIRECT3DVERTEX
TRACE("(%p) : Relay\n", iface);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVertexDeclaration_GetDevice(This->wineD3DVertexDeclaration, &myDevice);
if (hr == D3D_OK && myDevice != NULL) {
hr = IWineD3DDevice_GetParent(myDevice, (IUnknown **)ppDevice);
IWineD3DDevice_Release(myDevice);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -348,8 +350,9 @@ static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9* d3d9_elem
}
/* IDirect3DDevice9 IDirect3DVertexDeclaration9 Methods follow: */
-HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexDeclaration(LPDIRECT3DDEVICE9EX iface, CONST D3DVERTEXELEMENT9* pVertexElements, IDirect3DVertexDeclaration9** ppDecl) {
-
+HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexDeclaration(IDirect3DDevice9Ex *iface,
+ const D3DVERTEXELEMENT9 *pVertexElements, IDirect3DVertexDeclaration9 **ppDecl)
+{
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
IDirect3DVertexDeclaration9Impl *object = NULL;
WINED3DVERTEXELEMENT* wined3d_elements;
@@ -392,10 +395,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexDeclaration(LPDIRECT3DDEVICE9E
CopyMemory(object->elements, pVertexElements, element_count * sizeof(D3DVERTEXELEMENT9));
object->element_count = element_count;
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_CreateVertexDeclaration(This->WineD3DDevice, &object->wineD3DVertexDeclaration,
(IUnknown *)object, wined3d_elements, wined3d_element_count);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
HeapFree(GetProcessHeap(), 0, wined3d_elements);
@@ -421,9 +424,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(LPDIRECT3DDEVICE9EX i
TRACE("(%p) : Relay\n", iface);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetVertexDeclaration(This->WineD3DDevice, pDeclImpl == NULL ? NULL : pDeclImpl->wineD3DVertexDeclaration);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -439,7 +443,8 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(LPDIRECT3DDEVICE9EX i
}
*ppDecl = NULL;
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetVertexDeclaration(This->WineD3DDevice, &pTest);
if (hr == D3D_OK && NULL != pTest) {
IWineD3DVertexDeclaration_GetParent(pTest, (IUnknown **)ppDecl);
@@ -447,7 +452,8 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(LPDIRECT3DDEVICE9EX i
} else {
*ppDecl = NULL;
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
TRACE("(%p) : returning %p\n", This, *ppDecl);
return hr;
}
diff --git a/reactos/dll/directx/wine/d3d9/vertexshader.c b/reactos/dll/directx/wine/d3d9/vertexshader.c
index fd2837d53be..8a5d5bc3e22 100644
--- a/reactos/dll/directx/wine/d3d9/vertexshader.c
+++ b/reactos/dll/directx/wine/d3d9/vertexshader.c
@@ -56,9 +56,10 @@ static ULONG WINAPI IDirect3DVertexShader9Impl_Release(LPDIRECT3DVERTEXSHADER9 i
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DVertexShader_Release(This->wineD3DVertexShader);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
IDirect3DDevice9Ex_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -72,7 +73,7 @@ static HRESULT WINAPI IDirect3DVertexShader9Impl_GetDevice(LPDIRECT3DVERTEXSHADE
HRESULT hr;
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVertexShader_GetDevice(This->wineD3DVertexShader, &myDevice);
if (WINED3D_OK == hr && myDevice != NULL) {
hr = IWineD3DDevice_GetParent(myDevice, (IUnknown **)ppDevice);
@@ -80,7 +81,8 @@ static HRESULT WINAPI IDirect3DVertexShader9Impl_GetDevice(LPDIRECT3DVERTEXSHADE
} else {
*ppDevice = NULL;
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
TRACE("(%p) returning (%p)\n", This, *ppDevice);
return hr;
}
@@ -90,9 +92,10 @@ static HRESULT WINAPI IDirect3DVertexShader9Impl_GetFunction(LPDIRECT3DVERTEXSHA
HRESULT hr;
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVertexShader_GetFunction(This->wineD3DVertexShader, pData, pSizeOfData);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -125,9 +128,11 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexShader(LPDIRECT3DDEVICE9EX iface
object->ref = 1;
object->lpVtbl = &Direct3DVertexShader9_Vtbl;
- EnterCriticalSection(&d3d9_cs);
- hrc= IWineD3DDevice_CreateVertexShader(This->WineD3DDevice, NULL /* declaration */, pFunction, &object->wineD3DVertexShader, (IUnknown *)object);
- LeaveCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
+ hrc= IWineD3DDevice_CreateVertexShader(This->WineD3DDevice, pFunction,
+ NULL /* output signature */, &object->wineD3DVertexShader, (IUnknown *)object);
+ wined3d_mutex_unlock();
if (FAILED(hrc)) {
@@ -150,9 +155,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShader(LPDIRECT3DDEVICE9EX iface, I
HRESULT hrc = D3D_OK;
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_SetVertexShader(This->WineD3DDevice, pShader==NULL?NULL:((IDirect3DVertexShader9Impl *)pShader)->wineD3DVertexShader);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
TRACE("(%p) : returning hr(%u)\n", This, hrc);
return hrc;
@@ -164,7 +170,8 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(LPDIRECT3DDEVICE9EX iface, I
HRESULT hrc = D3D_OK;
TRACE("(%p) : Relay device@%p\n", This, This->WineD3DDevice);
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_GetVertexShader(This->WineD3DDevice, &pShader);
if (SUCCEEDED(hrc))
{
@@ -182,7 +189,8 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(LPDIRECT3DDEVICE9EX iface, I
{
WARN("(%p) : Call to IWineD3DDevice_GetVertexShader failed %u (device %p)\n", This, hrc, This->WineD3DDevice);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
TRACE("(%p) : returning %p\n", This, *ppShader);
return hrc;
}
@@ -198,9 +206,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantF(LPDIRECT3DDEVICE9EX
return D3DERR_INVALIDCALL;
}
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetVertexShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -215,9 +224,11 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantF(LPDIRECT3DDEVICE9EX
}
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetVertexShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -226,9 +237,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantI(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetVertexShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -237,9 +249,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantI(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetVertexShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -248,9 +261,10 @@ HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantB(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_SetVertexShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
@@ -259,8 +273,9 @@ HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantB(LPDIRECT3DDEVICE9EX
HRESULT hr;
TRACE("(%p) : Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DDevice_GetVertexShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
return hr;
}
diff --git a/reactos/dll/directx/wine/d3d9/volume.c b/reactos/dll/directx/wine/d3d9/volume.c
index 93b06b53158..9f1252a15fe 100644
--- a/reactos/dll/directx/wine/d3d9/volume.c
+++ b/reactos/dll/directx/wine/d3d9/volume.c
@@ -72,9 +72,10 @@ static ULONG WINAPI IDirect3DVolume9Impl_Release(LPDIRECT3DVOLUME9 iface) {
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DVolume_Release(This->wineD3DVolume);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
HeapFree(GetProcessHeap(), 0, This);
}
@@ -89,13 +90,13 @@ static HRESULT WINAPI IDirect3DVolume9Impl_GetDevice(LPDIRECT3DVOLUME9 iface, ID
TRACE("iface %p, ppDevice %p\n", iface, ppDevice);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DVolume_GetDevice(This->wineD3DVolume, &myDevice);
IWineD3DDevice_GetParent(myDevice, (IUnknown **)ppDevice);
IWineD3DDevice_Release(myDevice);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return D3D_OK;
}
@@ -106,11 +107,11 @@ static HRESULT WINAPI IDirect3DVolume9Impl_SetPrivateData(LPDIRECT3DVOLUME9 ifac
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_SetPrivateData(This->wineD3DVolume, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -121,11 +122,11 @@ static HRESULT WINAPI IDirect3DVolume9Impl_GetPrivateData(LPDIRECT3DVOLUME9 ifac
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_GetPrivateData(This->wineD3DVolume, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -136,11 +137,11 @@ static HRESULT WINAPI IDirect3DVolume9Impl_FreePrivateData(LPDIRECT3DVOLUME9 ifa
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_FreePrivateData(This->wineD3DVolume, refguid);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -167,29 +168,26 @@ static HRESULT WINAPI IDirect3DVolume9Impl_GetContainer(LPDIRECT3DVOLUME9 iface,
static HRESULT WINAPI IDirect3DVolume9Impl_GetDesc(LPDIRECT3DVOLUME9 iface, D3DVOLUME_DESC* pDesc) {
IDirect3DVolume9Impl *This = (IDirect3DVolume9Impl *)iface;
WINED3DVOLUME_DESC wined3ddesc;
- UINT tmpInt = -1;
- WINED3DFORMAT format;
HRESULT hr;
TRACE("(%p) Relay\n", This);
- /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */
- wined3ddesc.Format = &format;
- wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type;
- wined3ddesc.Usage = &pDesc->Usage;
- wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool;
- wined3ddesc.Size = &tmpInt;
- wined3ddesc.Width = &pDesc->Width;
- wined3ddesc.Height = &pDesc->Height;
- wined3ddesc.Depth = &pDesc->Depth;
-
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_GetDesc(This->wineD3DVolume, &wined3ddesc);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
- if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(format);
+ if (SUCCEEDED(hr))
+ {
+ pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format);
+ pDesc->Type = wined3ddesc.Type;
+ pDesc->Usage = wined3ddesc.Usage;
+ pDesc->Pool = wined3ddesc.Pool;
+ pDesc->Width = wined3ddesc.Width;
+ pDesc->Height = wined3ddesc.Height;
+ pDesc->Depth = wined3ddesc.Depth;
+ }
return hr;
}
@@ -200,12 +198,12 @@ static HRESULT WINAPI IDirect3DVolume9Impl_LockBox(LPDIRECT3DVOLUME9 iface, D3DL
TRACE("(%p) relay %p %p %p %d\n", This, This->wineD3DVolume, pLockedVolume, pBox, Flags);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_LockBox(This->wineD3DVolume, (WINED3DLOCKED_BOX *)pLockedVolume,
(const WINED3DBOX *)pBox, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -216,11 +214,11 @@ static HRESULT WINAPI IDirect3DVolume9Impl_UnlockBox(LPDIRECT3DVOLUME9 iface) {
TRACE("(%p) relay %p\n", This, This->wineD3DVolume);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolume_UnlockBox(This->wineD3DVolume);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
diff --git a/reactos/dll/directx/wine/d3d9/volumetexture.c b/reactos/dll/directx/wine/d3d9/volumetexture.c
index 07b686fe5a4..31b90bce62e 100644
--- a/reactos/dll/directx/wine/d3d9/volumetexture.c
+++ b/reactos/dll/directx/wine/d3d9/volumetexture.c
@@ -58,9 +58,10 @@ static ULONG WINAPI IDirect3DVolumeTexture9Impl_Release(LPDIRECT3DVOLUMETEXTURE9
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DVolumeTexture_Destroy(This->wineD3DVolumeTexture, D3D9CB_DestroyVolume);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
+
IDirect3DDevice9Ex_Release(This->parentDevice);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -75,14 +76,14 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetDevice(LPDIRECT3DVOLUMETEXT
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DStateBlock_GetDevice(This->wineD3DVolumeTexture, &wined3d_device);
if (SUCCEEDED(hr))
{
IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
IWineD3DDevice_Release(wined3d_device);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -93,11 +94,11 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_SetPrivateData(LPDIRECT3DVOLUM
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_SetPrivateData(This->wineD3DVolumeTexture, refguid, pData, SizeOfData, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -108,11 +109,11 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetPrivateData(LPDIRECT3DVOLUM
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_GetPrivateData(This->wineD3DVolumeTexture, refguid, pData, pSizeOfData);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -123,11 +124,11 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_FreePrivateData(LPDIRECT3DVOLU
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_FreePrivateData(This->wineD3DVolumeTexture, refguid);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -138,11 +139,11 @@ static DWORD WINAPI IDirect3DVolumeTexture9Impl_SetPriority(LPDIRECT3DVOLUMETEXT
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
priority = IWineD3DVolumeTexture_SetPriority(This->wineD3DVolumeTexture, PriorityNew);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return priority;
}
@@ -153,11 +154,11 @@ static DWORD WINAPI IDirect3DVolumeTexture9Impl_GetPriority(LPDIRECT3DVOLUMETEXT
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
priority = IWineD3DVolumeTexture_GetPriority(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return priority;
}
@@ -167,11 +168,11 @@ static void WINAPI IDirect3DVolumeTexture9Impl_PreLoad(LPDIRECT3DVOLUMETEXTURE9
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DVolumeTexture_PreLoad(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
}
static D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture9Impl_GetType(LPDIRECT3DVOLUMETEXTURE9 iface) {
@@ -180,11 +181,11 @@ static D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture9Impl_GetType(LPDIRECT3DVOLU
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
type = IWineD3DVolumeTexture_GetType(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return type;
}
@@ -196,11 +197,11 @@ static DWORD WINAPI IDirect3DVolumeTexture9Impl_SetLOD(LPDIRECT3DVOLUMETEXTURE9
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
lod = IWineD3DVolumeTexture_SetLOD(This->wineD3DVolumeTexture, LODNew);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return lod;
}
@@ -211,11 +212,11 @@ static DWORD WINAPI IDirect3DVolumeTexture9Impl_GetLOD(LPDIRECT3DVOLUMETEXTURE9
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
lod = IWineD3DVolumeTexture_GetLOD(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return lod;
}
@@ -226,11 +227,11 @@ static DWORD WINAPI IDirect3DVolumeTexture9Impl_GetLevelCount(LPDIRECT3DVOLUMETE
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
level_count = IWineD3DVolumeTexture_GetLevelCount(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return level_count;
}
@@ -241,11 +242,11 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_SetAutoGenFilterType(LPDIRECT3
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_SetAutoGenFilterType(This->wineD3DVolumeTexture, (WINED3DTEXTUREFILTERTYPE) FilterType);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -256,11 +257,11 @@ static D3DTEXTUREFILTERTYPE WINAPI IDirect3DVolumeTexture9Impl_GetAutoGenFilterT
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
filter_type = (D3DTEXTUREFILTERTYPE)IWineD3DVolumeTexture_GetAutoGenFilterType(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return filter_type;
}
@@ -270,40 +271,37 @@ static void WINAPI IDirect3DVolumeTexture9Impl_GenerateMipSubLevels(LPDIRECT3DVO
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
IWineD3DVolumeTexture_GenerateMipSubLevels(This->wineD3DVolumeTexture);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
}
/* IDirect3DVolumeTexture9 Interface follow: */
static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetLevelDesc(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level, D3DVOLUME_DESC* pDesc) {
IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
WINED3DVOLUME_DESC wined3ddesc;
- UINT tmpInt = -1;
- WINED3DFORMAT format;
HRESULT hr;
TRACE("(%p) Relay\n", This);
- /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */
- wined3ddesc.Format = &format;
- wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type;
- wined3ddesc.Usage = &pDesc->Usage;
- wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool;
- wined3ddesc.Size = &tmpInt;
- wined3ddesc.Width = &pDesc->Width;
- wined3ddesc.Height = &pDesc->Height;
- wined3ddesc.Depth = &pDesc->Depth;
-
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_GetLevelDesc(This->wineD3DVolumeTexture, Level, &wined3ddesc);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
- if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(format);
+ if (SUCCEEDED(hr))
+ {
+ pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format);
+ pDesc->Type = wined3ddesc.Type;
+ pDesc->Usage = wined3ddesc.Usage;
+ pDesc->Pool = wined3ddesc.Pool;
+ pDesc->Width = wined3ddesc.Width;
+ pDesc->Height = wined3ddesc.Height;
+ pDesc->Depth = wined3ddesc.Depth;
+ }
return hr;
}
@@ -315,7 +313,7 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetVolumeLevel(LPDIRECT3DVOLUM
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DVolumeTexture_GetVolumeLevel(This->wineD3DVolumeTexture, Level, &myVolume);
if (hrc == D3D_OK && NULL != ppVolumeLevel) {
@@ -323,7 +321,7 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetVolumeLevel(LPDIRECT3DVOLUM
IWineD3DVolumeTexture_Release(myVolume);
}
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hrc;
}
@@ -334,12 +332,12 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_LockBox(LPDIRECT3DVOLUMETEXTUR
TRACE("(%p) Relay %p %p %p %d\n", This, This->wineD3DVolumeTexture, pLockedVolume, pBox,Flags);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_LockBox(This->wineD3DVolumeTexture, Level, (WINED3DLOCKED_BOX *)pLockedVolume,
(const WINED3DBOX *)pBox, Flags);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -350,11 +348,11 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_UnlockBox(LPDIRECT3DVOLUMETEXT
TRACE("(%p) Relay %p %d\n", This, This->wineD3DVolumeTexture, Level);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_UnlockBox(This->wineD3DVolumeTexture, Level);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -365,11 +363,11 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_AddDirtyBox(LPDIRECT3DVOLUMETE
TRACE("(%p) Relay\n", This);
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hr = IWineD3DVolumeTexture_AddDirtyBox(This->wineD3DVolumeTexture, (CONST WINED3DBOX *)pDirtyBox);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
return hr;
}
@@ -407,11 +405,10 @@ static const IDirect3DVolumeTexture9Vtbl Direct3DVolumeTexture9_Vtbl =
/* IDirect3DDevice9 IDirect3DVolumeTexture9 Methods follow: */
-HRESULT WINAPI IDirect3DDevice9Impl_CreateVolumeTexture(LPDIRECT3DDEVICE9EX iface,
- UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage,
- D3DFORMAT Format, D3DPOOL Pool,
- IDirect3DVolumeTexture9** ppVolumeTexture, HANDLE* pSharedHandle) {
-
+HRESULT WINAPI IDirect3DDevice9Impl_CreateVolumeTexture(IDirect3DDevice9Ex *iface,
+ UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format,
+ D3DPOOL Pool, IDirect3DVolumeTexture9 **ppVolumeTexture, HANDLE *pSharedHandle)
+{
IDirect3DVolumeTexture9Impl *object;
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hrc = D3D_OK;
@@ -428,13 +425,13 @@ HRESULT WINAPI IDirect3DDevice9Impl_CreateVolumeTexture(LPDIRECT3DDEVICE9EX if
object->lpVtbl = &Direct3DVolumeTexture9_Vtbl;
object->ref = 1;
- EnterCriticalSection(&d3d9_cs);
+ wined3d_mutex_lock();
hrc = IWineD3DDevice_CreateVolumeTexture(This->WineD3DDevice, Width, Height, Depth, Levels,
Usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(Format),
Pool, &object->wineD3DVolumeTexture, (IUnknown *)object);
- LeaveCriticalSection(&d3d9_cs);
+ wined3d_mutex_unlock();
if (hrc != D3D_OK) {
diff --git a/reactos/dll/directx/wine/d3dx9_24/d3dx9_24.rbuild b/reactos/dll/directx/wine/d3dx9_24/d3dx9_24.rbuild
new file mode 100644
index 00000000000..a59b236c196
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_24/d3dx9_24.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_24_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_24/d3dx9_24.spec b/reactos/dll/directx/wine/d3dx9_24/d3dx9_24.spec
new file mode 100644
index 00000000000..3a7e007e873
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_24/d3dx9_24.spec
@@ -0,0 +1,320 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stub D3DXCpuOptimizations
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stub D3DXGetTargetDescByName
+@ stub D3DXGetTargetDescByVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_24/d3dx9_24_main.c b/reactos/dll/directx/wine/d3dx9_24/d3dx9_24_main.c
new file mode 100644
index 00000000000..cc6ffbf04e9
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_24/d3dx9_24_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==24)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/base/applications/write/lang/bg-BG.rc b/reactos/dll/directx/wine/d3dx9_24/version.rc
similarity index 70%
rename from reactos/base/applications/write/lang/bg-BG.rc
rename to reactos/dll/directx/wine/d3dx9_24/version.rc
index fbd0812e2b6..8deff200d3e 100644
--- a/reactos/base/applications/write/lang/bg-BG.rc
+++ b/reactos/dll/directx/wine/d3dx9_24/version.rc
@@ -1,7 +1,5 @@
/*
- * Bulgarian language support
- *
- * Copyright (C) 2007 Mikolaj Zalewski
+ * Copyright 2008 Louis Lenders
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,9 +16,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,5,132,0
+#define WINE_FILEVERSION_STR "9.5.132.0"
+#define WINE_PRODUCTVERSION 9,5,132,0
+#define WINE_PRODUCTVERSION_STR "9.5.132.0"
-STRINGTABLE
-{
- IDS_FAILED, " "
-}
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_25/d3dx9_25.rbuild b/reactos/dll/directx/wine/d3dx9_25/d3dx9_25.rbuild
new file mode 100644
index 00000000000..0fadc998ba1
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_25/d3dx9_25.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_25_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_25/d3dx9_25.spec b/reactos/dll/directx/wine/d3dx9_25/d3dx9_25.spec
new file mode 100644
index 00000000000..849d0ababe4
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_25/d3dx9_25.spec
@@ -0,0 +1,323 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCpuOptimizations(long) d3dx9_24.D3DXCpuOptimizations
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stub D3DXGetTargetDescByName
+@ stub D3DXGetTargetDescByVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_25/d3dx9_25_main.c b/reactos/dll/directx/wine/d3dx9_25/d3dx9_25_main.c
new file mode 100644
index 00000000000..57a066964a8
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_25/d3dx9_25_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==25)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/base/applications/write/lang/de-DE.rc b/reactos/dll/directx/wine/d3dx9_25/version.rc
similarity index 70%
rename from reactos/base/applications/write/lang/de-DE.rc
rename to reactos/dll/directx/wine/d3dx9_25/version.rc
index c2afa0848ae..922770c5db3 100644
--- a/reactos/base/applications/write/lang/de-DE.rc
+++ b/reactos/dll/directx/wine/d3dx9_25/version.rc
@@ -1,6 +1,5 @@
/*
- * Copyright (C) 2007 Mikolaj Zalewski
- * Copyright (C) 2008 Michael Stefaniuc
+ * Copyright 2008 Louis Lenders
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,9 +16,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,6,168,0
+#define WINE_FILEVERSION_STR "9.6.168.0"
+#define WINE_PRODUCTVERSION 9,6,168,0
+#define WINE_PRODUCTVERSION_STR "9.6.168.0"
-STRINGTABLE
-{
- IDS_FAILED, "Der Start von Wordpad ist fehlgeschlagen"
-}
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_26/d3dx9_26.rbuild b/reactos/dll/directx/wine/d3dx9_26/d3dx9_26.rbuild
new file mode 100644
index 00000000000..1a5965c2513
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_26/d3dx9_26.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_26_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_26/d3dx9_26.spec b/reactos/dll/directx/wine/d3dx9_26/d3dx9_26.spec
new file mode 100644
index 00000000000..55d40425803
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_26/d3dx9_26.spec
@@ -0,0 +1,327 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCpuOptimizations(long) d3dx9_24.D3DXCpuOptimizations
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stub D3DXGetTargetDescByName
+@ stub D3DXGetTargetDescByVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_26/d3dx9_26_main.c b/reactos/dll/directx/wine/d3dx9_26/d3dx9_26_main.c
new file mode 100644
index 00000000000..1ce818b5b50
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_26/d3dx9_26_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==26)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/base/applications/write/lang/en-US.rc b/reactos/dll/directx/wine/d3dx9_26/version.rc
similarity index 70%
rename from reactos/base/applications/write/lang/en-US.rc
rename to reactos/dll/directx/wine/d3dx9_26/version.rc
index 5215db51dc8..56edd133534 100644
--- a/reactos/base/applications/write/lang/en-US.rc
+++ b/reactos/dll/directx/wine/d3dx9_26/version.rc
@@ -1,7 +1,5 @@
/*
- * English language support
- *
- * Copyright (C) 2007 Mikolaj Zalewski
+ * Copyright 2008 Louis Lenders
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,9 +16,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,7,239,0
+#define WINE_FILEVERSION_STR "9.7.239.0"
+#define WINE_PRODUCTVERSION 9,7,239,0
+#define WINE_PRODUCTVERSION_STR "9.7.239.0"
-STRINGTABLE
-{
- IDS_FAILED, "Starting Wordpad failed"
-}
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_27/d3dx9_27.rbuild b/reactos/dll/directx/wine/d3dx9_27/d3dx9_27.rbuild
new file mode 100644
index 00000000000..daea575dc78
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_27/d3dx9_27.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_27_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_27/d3dx9_27.spec b/reactos/dll/directx/wine/d3dx9_27/d3dx9_27.spec
new file mode 100644
index 00000000000..55d40425803
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_27/d3dx9_27.spec
@@ -0,0 +1,327 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCpuOptimizations(long) d3dx9_24.D3DXCpuOptimizations
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stub D3DXGetTargetDescByName
+@ stub D3DXGetTargetDescByVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_27/d3dx9_27_main.c b/reactos/dll/directx/wine/d3dx9_27/d3dx9_27_main.c
new file mode 100644
index 00000000000..15919832ccd
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_27/d3dx9_27_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==27)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/base/applications/write/lang/es-ES.rc b/reactos/dll/directx/wine/d3dx9_27/version.rc
similarity index 70%
rename from reactos/base/applications/write/lang/es-ES.rc
rename to reactos/dll/directx/wine/d3dx9_27/version.rc
index 0857d6e8572..82be05ef485 100644
--- a/reactos/base/applications/write/lang/es-ES.rc
+++ b/reactos/dll/directx/wine/d3dx9_27/version.rc
@@ -1,7 +1,5 @@
/*
- * Spanish language support
- *
- * Copyright (C) 2009 Elhoir
+ * Copyright 2008 Louis Lenders
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,9 +16,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,8,299,0
+#define WINE_FILEVERSION_STR "9.8.299.0"
+#define WINE_PRODUCTVERSION 9,8,299,0
+#define WINE_PRODUCTVERSION_STR "9.8.299.0"
-STRINGTABLE
-{
- IDS_FAILED, "Fallo al iniciar Wordpad"
-}
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_28/d3dx9_28.rbuild b/reactos/dll/directx/wine/d3dx9_28/d3dx9_28.rbuild
new file mode 100644
index 00000000000..79f53825d46
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_28/d3dx9_28.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_28_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_28/d3dx9_28.spec b/reactos/dll/directx/wine/d3dx9_28/d3dx9_28.spec
new file mode 100644
index 00000000000..e6648b86480
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_28/d3dx9_28.spec
@@ -0,0 +1,332 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCpuOptimizations(long) d3dx9_24.D3DXCpuOptimizations
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stub D3DXGetTargetDescByName
+@ stub D3DXGetTargetDescByVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_28/d3dx9_28_main.c b/reactos/dll/directx/wine/d3dx9_28/d3dx9_28_main.c
new file mode 100644
index 00000000000..2157eec4324
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_28/d3dx9_28_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==28)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_28/version.rc b/reactos/dll/directx/wine/d3dx9_28/version.rc
new file mode 100644
index 00000000000..0f61f70880e
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_28/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,10,455,0
+#define WINE_FILEVERSION_STR "9.10.455.0"
+#define WINE_PRODUCTVERSION 9,10,455,0
+#define WINE_PRODUCTVERSION_STR "9.10.455.0"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_29/d3dx9_29.rbuild b/reactos/dll/directx/wine/d3dx9_29/d3dx9_29.rbuild
new file mode 100644
index 00000000000..61898fcf4f5
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_29/d3dx9_29.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_29_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_29/d3dx9_29.spec b/reactos/dll/directx/wine/d3dx9_29/d3dx9_29.spec
new file mode 100644
index 00000000000..e6648b86480
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_29/d3dx9_29.spec
@@ -0,0 +1,332 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCpuOptimizations(long) d3dx9_24.D3DXCpuOptimizations
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stub D3DXGetTargetDescByName
+@ stub D3DXGetTargetDescByVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_29/d3dx9_29_main.c b/reactos/dll/directx/wine/d3dx9_29/d3dx9_29_main.c
new file mode 100644
index 00000000000..5782417710e
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_29/d3dx9_29_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==29)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_29/version.rc b/reactos/dll/directx/wine/d3dx9_29/version.rc
new file mode 100644
index 00000000000..f6f7b1351d9
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_29/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,11,519,0
+#define WINE_FILEVERSION_STR "9.11.519.0"
+#define WINE_PRODUCTVERSION 9,11,519,0
+#define WINE_PRODUCTVERSION_STR "9.11.519.0"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_30/d3dx9_30.rbuild b/reactos/dll/directx/wine/d3dx9_30/d3dx9_30.rbuild
new file mode 100644
index 00000000000..e7c5eb68535
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_30/d3dx9_30.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_30_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_30/d3dx9_30.spec b/reactos/dll/directx/wine/d3dx9_30/d3dx9_30.spec
new file mode 100644
index 00000000000..e6648b86480
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_30/d3dx9_30.spec
@@ -0,0 +1,332 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCpuOptimizations(long) d3dx9_24.D3DXCpuOptimizations
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stub D3DXGetTargetDescByName
+@ stub D3DXGetTargetDescByVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_30/d3dx9_30_main.c b/reactos/dll/directx/wine/d3dx9_30/d3dx9_30_main.c
new file mode 100644
index 00000000000..ae131156924
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_30/d3dx9_30_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==30)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_30/version.rc b/reactos/dll/directx/wine/d3dx9_30/version.rc
new file mode 100644
index 00000000000..b10286e6b81
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_30/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,12,589,0
+#define WINE_FILEVERSION_STR "9.12.589.0"
+#define WINE_PRODUCTVERSION 9,12,589,0
+#define WINE_PRODUCTVERSION_STR "9.12.589.0"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_31/d3dx9_31.rbuild b/reactos/dll/directx/wine/d3dx9_31/d3dx9_31.rbuild
new file mode 100644
index 00000000000..86b91f21f86
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_31/d3dx9_31.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_31_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_31/d3dx9_31.spec b/reactos/dll/directx/wine/d3dx9_31/d3dx9_31.spec
new file mode 100644
index 00000000000..807b7a90b74
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_31/d3dx9_31.spec
@@ -0,0 +1,329 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_31/d3dx9_31_main.c b/reactos/dll/directx/wine/d3dx9_31/d3dx9_31_main.c
new file mode 100644
index 00000000000..3f38b840b53
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_31/d3dx9_31_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==31)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_31/version.rc b/reactos/dll/directx/wine/d3dx9_31/version.rc
new file mode 100644
index 00000000000..eb974540014
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_31/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,15,779,0
+#define WINE_FILEVERSION_STR "9.15.779.0"
+#define WINE_PRODUCTVERSION 9,15,779,0
+#define WINE_PRODUCTVERSION_STR "9.15.779.0"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_32/d3dx9_32.rbuild b/reactos/dll/directx/wine/d3dx9_32/d3dx9_32.rbuild
new file mode 100644
index 00000000000..f8bc87fa318
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_32/d3dx9_32.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_32_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_32/d3dx9_32.spec b/reactos/dll/directx/wine/d3dx9_32/d3dx9_32.spec
new file mode 100644
index 00000000000..5a152aeeef8
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_32/d3dx9_32.spec
@@ -0,0 +1,334 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx9_36.D3DXSHMultiply2
+@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx9_36.D3DXSHMultiply3
+@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx9_36.D3DXSHMultiply4
+@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx9_36.D3DXSHMultiply5
+@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx9_36.D3DXSHMultiply6
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_32/d3dx9_32_main.c b/reactos/dll/directx/wine/d3dx9_32/d3dx9_32_main.c
new file mode 100644
index 00000000000..90888225952
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_32/d3dx9_32_main.c
@@ -0,0 +1,63 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==32)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_32/version.rc b/reactos/dll/directx/wine/d3dx9_32/version.rc
new file mode 100644
index 00000000000..330f8be684f
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_32/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,16,843,0
+#define WINE_FILEVERSION_STR "9.16.843.0"
+#define WINE_PRODUCTVERSION 9,16,843,0
+#define WINE_PRODUCTVERSION_STR "9.16.843.0"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_33/d3dx9_33.rbuild b/reactos/dll/directx/wine/d3dx9_33/d3dx9_33.rbuild
new file mode 100644
index 00000000000..d45efae1f40
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_33/d3dx9_33.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_33_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_33/d3dx9_33.spec b/reactos/dll/directx/wine/d3dx9_33/d3dx9_33.spec
new file mode 100644
index 00000000000..5a152aeeef8
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_33/d3dx9_33.spec
@@ -0,0 +1,334 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx9_36.D3DXSHMultiply2
+@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx9_36.D3DXSHMultiply3
+@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx9_36.D3DXSHMultiply4
+@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx9_36.D3DXSHMultiply5
+@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx9_36.D3DXSHMultiply6
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_33/d3dx9_33_main.c b/reactos/dll/directx/wine/d3dx9_33/d3dx9_33_main.c
new file mode 100644
index 00000000000..afe8947b1b6
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_33/d3dx9_33_main.c
@@ -0,0 +1,63 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==33)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_33/version.rc b/reactos/dll/directx/wine/d3dx9_33/version.rc
new file mode 100644
index 00000000000..06eba53b470
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_33/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,18,904,15
+#define WINE_FILEVERSION_STR "9.18.904.15"
+#define WINE_PRODUCTVERSION 9,18,904,15
+#define WINE_PRODUCTVERSION_STR "9.18.904.15"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_34/d3dx9_34.rbuild b/reactos/dll/directx/wine/d3dx9_34/d3dx9_34.rbuild
new file mode 100644
index 00000000000..778d6adce91
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_34/d3dx9_34.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_34_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_34/d3dx9_34.spec b/reactos/dll/directx/wine/d3dx9_34/d3dx9_34.spec
new file mode 100644
index 00000000000..5a152aeeef8
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_34/d3dx9_34.spec
@@ -0,0 +1,334 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx9_36.D3DXSHMultiply2
+@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx9_36.D3DXSHMultiply3
+@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx9_36.D3DXSHMultiply4
+@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx9_36.D3DXSHMultiply5
+@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx9_36.D3DXSHMultiply6
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_34/d3dx9_34_main.c b/reactos/dll/directx/wine/d3dx9_34/d3dx9_34_main.c
new file mode 100644
index 00000000000..18acc11e909
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_34/d3dx9_34_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==34)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_34/version.rc b/reactos/dll/directx/wine/d3dx9_34/version.rc
new file mode 100644
index 00000000000..5045d8fa852
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_34/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,19,949,46
+#define WINE_FILEVERSION_STR "9.19.949.46"
+#define WINE_PRODUCTVERSION 9,19,949,46
+#define WINE_PRODUCTVERSION_STR "9.19.949.46"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_35/d3dx9_35.rbuild b/reactos/dll/directx/wine/d3dx9_35/d3dx9_35.rbuild
new file mode 100644
index 00000000000..35bb8b42720
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_35/d3dx9_35.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_35_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_35/d3dx9_35.spec b/reactos/dll/directx/wine/d3dx9_35/d3dx9_35.spec
new file mode 100644
index 00000000000..5a152aeeef8
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_35/d3dx9_35.spec
@@ -0,0 +1,334 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx9_36.D3DXSHMultiply2
+@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx9_36.D3DXSHMultiply3
+@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx9_36.D3DXSHMultiply4
+@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx9_36.D3DXSHMultiply5
+@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx9_36.D3DXSHMultiply6
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_35/d3dx9_35_main.c b/reactos/dll/directx/wine/d3dx9_35/d3dx9_35_main.c
new file mode 100644
index 00000000000..f87861883fa
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_35/d3dx9_35_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==35)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_35/version.rc b/reactos/dll/directx/wine/d3dx9_35/version.rc
new file mode 100644
index 00000000000..6ffaafb4b47
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_35/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,19,949,1104
+#define WINE_FILEVERSION_STR "9.19.949.1104"
+#define WINE_PRODUCTVERSION 9,19,949,1104
+#define WINE_PRODUCTVERSION_STR "9.19.949.1104"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_36/core.c b/reactos/dll/directx/wine/d3dx9_36/core.c
new file mode 100644
index 00000000000..3b63e9e4688
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/core.c
@@ -0,0 +1,120 @@
+/*
+ *
+ * Copyright 2002 Raphael Junqueira
+ *
+ * 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
+
+#define COBJMACROS
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "wine/debug.h"
+#include "wine/unicode.h"
+
+#include "d3dx9_36_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
+
+/* ID3DXBuffer IUnknown parts follow: */
+static HRESULT WINAPI ID3DXBufferImpl_QueryInterface(LPD3DXBUFFER iface, REFIID riid, LPVOID* ppobj)
+{
+ ID3DXBufferImpl *This = (ID3DXBufferImpl *)iface;
+
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_ID3DXBuffer))
+ {
+ IUnknown_AddRef(iface);
+ *ppobj = This;
+ return D3D_OK;
+ }
+
+ WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ID3DXBufferImpl_AddRef(LPD3DXBUFFER iface)
+{
+ ID3DXBufferImpl *This = (ID3DXBufferImpl *)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) : AddRef from %d\n", This, ref - 1);
+
+ return ref;
+}
+
+static ULONG WINAPI ID3DXBufferImpl_Release(LPD3DXBUFFER iface)
+{
+ ID3DXBufferImpl *This = (ID3DXBufferImpl *)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) : ReleaseRef to %d\n", This, ref);
+
+ if (ref == 0)
+ {
+ HeapFree(GetProcessHeap(), 0, This->buffer);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+ return ref;
+}
+
+/* ID3DXBuffer Interface follow: */
+static LPVOID WINAPI ID3DXBufferImpl_GetBufferPointer(LPD3DXBUFFER iface)
+{
+ ID3DXBufferImpl *This = (ID3DXBufferImpl *)iface;
+ return This->buffer;
+}
+
+static DWORD WINAPI ID3DXBufferImpl_GetBufferSize(LPD3DXBUFFER iface)
+{
+ ID3DXBufferImpl *This = (ID3DXBufferImpl *)iface;
+ return This->bufferSize;
+}
+
+const ID3DXBufferVtbl D3DXBuffer_Vtbl =
+{
+ ID3DXBufferImpl_QueryInterface,
+ ID3DXBufferImpl_AddRef,
+ ID3DXBufferImpl_Release,
+ ID3DXBufferImpl_GetBufferPointer,
+ ID3DXBufferImpl_GetBufferSize
+};
+
+HRESULT WINAPI D3DXCreateBuffer(DWORD NumBytes, LPD3DXBUFFER* ppBuffer)
+{
+ ID3DXBufferImpl *object;
+
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXBufferImpl));
+ if (object == NULL)
+ {
+ *ppBuffer = NULL;
+ return E_OUTOFMEMORY;
+ }
+ object->lpVtbl = &D3DXBuffer_Vtbl;
+ object->ref = 1;
+ object->bufferSize = NumBytes;
+ object->buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, NumBytes);
+ if (object->buffer == NULL)
+ {
+ HeapFree(GetProcessHeap(), 0, object);
+ *ppBuffer = NULL;
+ return E_OUTOFMEMORY;
+ }
+
+ *ppBuffer = (LPD3DXBUFFER)object;
+ return D3D_OK;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild
new file mode 100644
index 00000000000..a09c4055f10
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild
@@ -0,0 +1,29 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ msvcrt
+ wined3d
+
+ core.c
+ d3dx9_36_main.c
+ font.c
+ math.c
+ mesh.c
+ shader.c
+ sprite.c
+ surface.c
+ util.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec
new file mode 100644
index 00000000000..d3fe3acad7c
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec
@@ -0,0 +1,336 @@
+@ stub D3DXAssembleShader
+@ stub D3DXAssembleShaderFromFileA
+@ stub D3DXAssembleShaderFromFileW
+@ stub D3DXAssembleShaderFromResourceA
+@ stub D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr)
+@ stub D3DXCheckCubeTextureRequirements
+@ stub D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stub D3DXCheckVolumeTextureRequirements
+@ stub D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long)
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long)
+@ stub D3DXCompileShader
+@ stub D3DXCompileShaderFromFileA
+@ stub D3DXCompileShaderFromFileW
+@ stub D3DXCompileShaderFromResourceA
+@ stub D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr)
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr)
+@ stub D3DXComputeIMTFromPerTexelSignal
+@ stub D3DXComputeIMTFromPerVertexSignal
+@ stub D3DXComputeIMTFromSignal
+@ stub D3DXComputeIMTFromTexture
+@ stub D3DXComputeNormalMap
+@ stub D3DXComputeNormals
+@ stub D3DXComputeTangent
+@ stub D3DXComputeTangentFrame
+@ stub D3DXComputeTangentFrameEx
+@ stub D3DXConcatenateMeshes
+@ stub D3DXConvertMeshSubsetToSingleStrip
+@ stub D3DXConvertMeshSubsetToStrips
+@ stub D3DXCreateAnimationController
+@ stub D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr)
+@ stub D3DXCreateCompressedAnimationSet
+@ stub D3DXCreateCubeTexture
+@ stub D3DXCreateCubeTextureFromFileA
+@ stub D3DXCreateCubeTextureFromFileExA
+@ stub D3DXCreateCubeTextureFromFileExW
+@ stub D3DXCreateCubeTextureFromFileInMemory
+@ stub D3DXCreateCubeTextureFromFileInMemoryEx
+@ stub D3DXCreateCubeTextureFromFileW
+@ stub D3DXCreateCubeTextureFromResourceA
+@ stub D3DXCreateCubeTextureFromResourceExA
+@ stub D3DXCreateCubeTextureFromResourceExW
+@ stub D3DXCreateCubeTextureFromResourceW
+@ stub D3DXCreateCylinder
+@ stub D3DXCreateEffect
+@ stub D3DXCreateEffectCompiler
+@ stub D3DXCreateEffectCompilerFromFileA
+@ stub D3DXCreateEffectCompilerFromFileW
+@ stub D3DXCreateEffectCompilerFromResourceA
+@ stub D3DXCreateEffectCompilerFromResourceW
+@ stub D3DXCreateEffectEx
+@ stub D3DXCreateEffectFromFileA
+@ stub D3DXCreateEffectFromFileExA
+@ stub D3DXCreateEffectFromFileExW
+@ stub D3DXCreateEffectFromFileW
+@ stub D3DXCreateEffectFromResourceA
+@ stub D3DXCreateEffectFromResourceExA
+@ stub D3DXCreateEffectFromResourceExW
+@ stub D3DXCreateEffectFromResourceW
+@ stub D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long str ptr)
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr)
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr)
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long wstr ptr)
+@ stub D3DXCreateFragmentLinker
+@ stub D3DXCreateFragmentLinkerEx
+@ stub D3DXCreateKeyframedAnimationSet
+@ stub D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr)
+@ stub D3DXCreateMesh
+@ stub D3DXCreateMeshFVF
+@ stub D3DXCreateNPatchMesh
+@ stub D3DXCreatePMeshFromStream
+@ stub D3DXCreatePatchMesh
+@ stub D3DXCreatePolygon
+@ stub D3DXCreatePRTBuffer
+@ stub D3DXCreatePRTBufferTex
+@ stub D3DXCreatePRTCompBuffer
+@ stub D3DXCreatePRTEngine
+@ stub D3DXCreateRenderToEnvMap
+@ stub D3DXCreateRenderToSurface
+@ stub D3DXCreateSPMesh
+@ stub D3DXCreateSkinInfo
+@ stub D3DXCreateSkinInfoFromBlendedMesh
+@ stub D3DXCreateSkinInfoFVF
+@ stub D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr)
+@ stub D3DXCreateTeapot
+@ stub D3DXCreateTextA
+@ stub D3DXCreateTextW
+@ stub D3DXCreateTexture
+@ stub D3DXCreateTextureFromFileA
+@ stub D3DXCreateTextureFromFileExA
+@ stub D3DXCreateTextureFromFileExW
+@ stub D3DXCreateTextureFromFileInMemory
+@ stub D3DXCreateTextureFromFileInMemoryEx
+@ stub D3DXCreateTextureFromFileW
+@ stub D3DXCreateTextureFromResourceA
+@ stub D3DXCreateTextureFromResourceExA
+@ stub D3DXCreateTextureFromResourceExW
+@ stub D3DXCreateTextureFromResourceW
+@ stub D3DXCreateTextureGutterHelper
+@ stub D3DXCreateTextureShader
+@ stub D3DXCreateTorus
+@ stub D3DXCreateVolumeTexture
+@ stub D3DXCreateVolumeTextureFromFileA
+@ stub D3DXCreateVolumeTextureFromFileExA
+@ stub D3DXCreateVolumeTextureFromFileExW
+@ stub D3DXCreateVolumeTextureFromFileInMemory
+@ stub D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stub D3DXCreateVolumeTextureFromFileW
+@ stub D3DXCreateVolumeTextureFromResourceA
+@ stub D3DXCreateVolumeTextureFromResourceExA
+@ stub D3DXCreateVolumeTextureFromResourceExW
+@ stub D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long)
+@ stub D3DXDeclaratorFromFVF
+@ stub D3DXDisassembleEffect
+@ stub D3DXDisassembleShader
+@ stub D3DXFileCreate
+@ stub D3DXFillCubeTexture
+@ stub D3DXFillCubeTextureTX
+@ stub D3DXFillTexture
+@ stub D3DXFillTextureTX
+@ stub D3DXFillVolumeTexture
+@ stub D3DXFillVolumeTextureTX
+@ stub D3DXFilterTexture
+@ stub D3DXFindShaderComment
+@ stub D3DXFloat16To32Array
+@ stub D3DXFloat32To16Array
+@ stub D3DXFrameAppendChild
+@ stub D3DXFrameCalculateBoundingSphere
+@ stub D3DXFrameDestroy
+@ stub D3DXFrameFind
+@ stub D3DXFrameNumNamedMatrices
+@ stub D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long)
+@ stub D3DXFVFFromDeclarator
+@ stub D3DXGatherFragments
+@ stub D3DXGatherFragmentsFromFileA
+@ stub D3DXGatherFragmentsFromFileW
+@ stub D3DXGatherFragmentsFromResourceA
+@ stub D3DXGatherFragmentsFromResourceW
+@ stub D3DXGenerateOutputDecl
+@ stub D3DXGeneratePMesh
+@ stub D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long)
+@ stdcall D3DXGetDriverLevel(ptr)
+@ stdcall D3DXGetFVFVertexSize(long)
+@ stdcall D3DXGetImageInfoFromFileA(str ptr)
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr)
+@ stdcall D3DXGetImageInfoFromFileW(wstr ptr)
+@ stdcall D3DXGetImageInfoFromResourceA(long str ptr)
+@ stdcall D3DXGetImageInfoFromResourceW(long wstr ptr)
+@ stdcall D3DXGetPixelShaderProfile(ptr)
+@ stub D3DXGetShaderConstantTable
+@ stub D3DXGetShaderConstantTableEx
+@ stub D3DXGetShaderInputSemantics
+@ stub D3DXGetShaderOutputSemantics
+@ stub D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr)
+@ stdcall D3DXGetShaderVersion(ptr)
+@ stdcall D3DXGetVertexShaderProfile(ptr)
+@ stub D3DXIntersect
+@ stub D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr)
+@ stub D3DXLoadMeshFromXA
+@ stub D3DXLoadMeshFromXInMemory
+@ stub D3DXLoadMeshFromXResource
+@ stub D3DXLoadMeshFromXW
+@ stub D3DXLoadMeshFromXof
+@ stub D3DXLoadMeshHierarchyFromXA
+@ stub D3DXLoadMeshHierarchyFromXInMemory
+@ stub D3DXLoadMeshHierarchyFromXW
+@ stub D3DXLoadPatchMeshFromXof
+@ stub D3DXLoadPRTBufferFromFileA
+@ stub D3DXLoadPRTBufferFromFileW
+@ stub D3DXLoadPRTCompBufferFromFileA
+@ stub D3DXLoadPRTCompBufferFromFileW
+@ stub D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr str ptr long long ptr)
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr)
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr wstr ptr long long ptr)
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long)
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr ptr str ptr long long ptr)
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr ptr wstr ptr long long ptr)
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long long)
+@ stub D3DXLoadVolumeFromFileA
+@ stub D3DXLoadVolumeFromFileInMemory
+@ stub D3DXLoadVolumeFromFileW
+@ stub D3DXLoadVolumeFromMemory
+@ stub D3DXLoadVolumeFromResourceA
+@ stub D3DXLoadVolumeFromResourceW
+@ stub D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr)
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr)
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr)
+@ stdcall D3DXMatrixDeterminant(ptr)
+@ stdcall D3DXMatrixInverse(ptr ptr ptr)
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr)
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr)
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr)
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr)
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long)
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long)
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long)
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long)
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long)
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long)
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long)
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long)
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long)
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long)
+@ stdcall D3DXMatrixReflect(ptr ptr)
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long)
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr)
+@ stdcall D3DXMatrixRotationX(ptr long)
+@ stdcall D3DXMatrixRotationY(ptr long)
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long)
+@ stdcall D3DXMatrixRotationZ(ptr long)
+@ stdcall D3DXMatrixScaling(ptr long long long)
+@ stdcall D3DXMatrixShadow(ptr ptr ptr)
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr)
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr)
+@ stdcall D3DXMatrixTranslation(ptr long long long)
+@ stdcall D3DXMatrixTranspose(ptr ptr)
+@ stub D3DXOptimizeFaces
+@ stub D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
+@ stdcall D3DXPlaneNormalize(ptr ptr)
+@ stdcall D3DXPlaneTransform(ptr ptr ptr)
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long)
+@ stub D3DXPreprocessShader
+@ stub D3DXPreprocessShaderFromFileA
+@ stub D3DXPreprocessShaderFromFileW
+@ stub D3DXPreprocessShaderFromResourceA
+@ stub D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long)
+@ stdcall D3DXQuaternionExp(ptr ptr)
+@ stdcall D3DXQuaternionInverse(ptr ptr)
+@ stdcall D3DXQuaternionLn(ptr ptr)
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr)
+@ stdcall D3DXQuaternionNormalize(ptr ptr)
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long)
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr)
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long)
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long)
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long)
+@ stub D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr)
+@ stub D3DXRectPatchSize
+@ stub D3DXSaveMeshHierarchyToFileA
+@ stub D3DXSaveMeshHierarchyToFileW
+@ stub D3DXSaveMeshToXA
+@ stub D3DXSaveMeshToXW
+@ stub D3DXSavePRTBufferToFileA
+@ stub D3DXSavePRTBufferToFileW
+@ stub D3DXSavePRTCompBufferToFileA
+@ stub D3DXSavePRTCompBufferToFileW
+@ stub D3DXSaveSurfaceToFileA
+@ stub D3DXSaveSurfaceToFileInMemory
+@ stub D3DXSaveSurfaceToFileW
+@ stub D3DXSaveTextureToFileA
+@ stub D3DXSaveTextureToFileInMemory
+@ stub D3DXSaveTextureToFileW
+@ stub D3DXSaveVolumeToFileA
+@ stub D3DXSaveVolumeToFileInMemory
+@ stub D3DXSaveVolumeToFileW
+@ stub D3DXSHAdd
+@ stub D3DXSHDot
+@ stub D3DXSHEvalConeLight
+@ stub D3DXSHEvalDirection
+@ stub D3DXSHEvalDirectionalLight
+@ stub D3DXSHEvalHemisphereLight
+@ stub D3DXSHEvalSphericalLight
+@ stub D3DXSHMultiply2
+@ stub D3DXSHMultiply3
+@ stub D3DXSHMultiply4
+@ stub D3DXSHMultiply5
+@ stub D3DXSHMultiply6
+@ stub D3DXSHProjectCubeMap
+@ stub D3DXSHPRTCompSplitMeshSC
+@ stub D3DXSHPRTCompSuperCluster
+@ stub D3DXSHRotate
+@ stub D3DXSHRotateZ
+@ stub D3DXSHScale
+@ stub D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr)
+@ stub D3DXSplitMesh
+@ stub D3DXTessellateNPatches
+@ stub D3DXTessellateRectPatch
+@ stub D3DXTessellateTriPatch
+@ stub D3DXTriPatchSize
+@ stub D3DXUVAtlasCreate
+@ stub D3DXUVAtlasPack
+@ stub D3DXUVAtlasPartition
+@ stub D3DXValidMesh
+@ stub D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long)
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long)
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long)
+@ stdcall D3DXVec2Normalize(ptr ptr)
+@ stdcall D3DXVec2Transform(ptr ptr ptr)
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long)
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr)
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long)
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr)
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long)
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long)
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long)
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long)
+@ stdcall D3DXVec3Normalize(ptr ptr)
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr)
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long)
+@ stdcall D3DXVec3Transform(ptr ptr ptr)
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long)
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr)
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long)
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr)
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long)
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr)
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long)
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long)
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long)
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr)
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long)
+@ stdcall D3DXVec4Normalize(ptr ptr)
+@ stdcall D3DXVec4Transform(ptr ptr ptr)
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long)
+@ stub D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_36/d3dx9_36_main.c b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36_main.c
new file mode 100644
index 00000000000..e9c700444ef
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36_main.c
@@ -0,0 +1,82 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ * Copyright (C) 2008 Tony Wasserka
+ *
+ * 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 "wine/port.h"
+#include "initguid.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==36)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+/***********************************************************************
+ * D3DXDebugMute
+ * Returns always FALSE for us.
+ */
+BOOL WINAPI D3DXDebugMute(BOOL mute)
+{
+ return FALSE;
+}
+
+/***********************************************************************
+ * D3DXGetDriverLevel.
+ * Returns always 900 (DX 9) for us
+ */
+UINT WINAPI D3DXGetDriverLevel(LPDIRECT3DDEVICE9 device)
+{
+ return 900;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_36/d3dx9_36_private.h b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36_private.h
new file mode 100644
index 00000000000..8568366d277
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36_private.h
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2002 Raphael Junqueira
+ * Copyright (C) 2008 David Adam
+ * Copyright (C) 2008 Tony Wasserka
+ *
+ * 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_D3DX9_36_PRIVATE_H
+#define __WINE_D3DX9_36_PRIVATE_H
+
+#include
+
+#define COBJMACROS
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "d3dx9.h"
+
+/* for internal use */
+HRESULT map_view_of_file(LPCWSTR filename, LPVOID *buffer, DWORD *length);
+HRESULT load_resource_into_memory(HMODULE module, HRSRC resinfo, LPVOID *buffer, DWORD *length);
+
+extern const ID3DXBufferVtbl D3DXBuffer_Vtbl;
+
+/* ID3DXBUFFER */
+typedef struct ID3DXBufferImpl
+{
+ /* IUnknown fields */
+ const ID3DXBufferVtbl *lpVtbl;
+ LONG ref;
+
+ /* ID3DXBuffer fields */
+ DWORD *buffer;
+ DWORD bufferSize;
+} ID3DXBufferImpl;
+
+
+/* ID3DXFont */
+typedef struct ID3DXFontImpl
+{
+ /* IUnknown fields */
+ const ID3DXFontVtbl *lpVtbl;
+ LONG ref;
+
+ /* ID3DXFont fields */
+ IDirect3DDevice9 *device;
+ D3DXFONT_DESCW desc;
+
+ HDC hdc;
+ HFONT hfont;
+} ID3DXFontImpl;
+
+/* ID3DXMatrixStack */
+typedef struct ID3DXMatrixStackImpl
+{
+ /* IUnknown fields */
+ const ID3DXMatrixStackVtbl *lpVtbl;
+ LONG ref;
+
+ /* ID3DXMatrixStack fields */
+ unsigned int current;
+ unsigned int stack_size;
+ D3DXMATRIX *stack;
+} ID3DXMatrixStackImpl;
+
+/*ID3DXSprite */
+typedef struct _SPRITE {
+ LPDIRECT3DTEXTURE9 texture;
+ UINT texw, texh;
+ RECT rect;
+ D3DXVECTOR3 center;
+ D3DXVECTOR3 pos;
+ D3DCOLOR color;
+} SPRITE;
+
+typedef struct ID3DXSpriteImpl
+{
+ /* IUnknown fields */
+ const ID3DXSpriteVtbl *lpVtbl;
+ LONG ref;
+
+ /* ID3DXSprite fields */
+ IDirect3DDevice9 *device;
+ IDirect3DVertexDeclaration9 *vdecl;
+ IDirect3DStateBlock9 *stateblock;
+ D3DXMATRIX transform;
+ D3DXMATRIX view;
+ DWORD flags;
+ BOOL ready;
+
+ /* Store the relevant caps to prevent multiple GetDeviceCaps calls */
+ DWORD texfilter_caps;
+ DWORD maxanisotropy;
+ DWORD alphacmp_caps;
+
+ SPRITE *sprites;
+ int sprite_count; /* number of sprites to be drawn */
+ int allocated_sprites; /* number of (pre-)allocated sprites */
+} ID3DXSpriteImpl;
+
+
+#endif /* __WINE_D3DX9_36_PRIVATE_H */
diff --git a/reactos/dll/directx/wine/d3dx9_36/font.c b/reactos/dll/directx/wine/d3dx9_36/font.c
new file mode 100644
index 00000000000..98b4fe9557f
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/font.c
@@ -0,0 +1,324 @@
+/*
+ * Copyright (C) 2008 Tony Wasserka
+ *
+ * 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 "wine/port.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "d3dx9_36_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
+
+static HRESULT WINAPI ID3DXFontImpl_QueryInterface(LPD3DXFONT iface, REFIID riid, LPVOID *object)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+
+ TRACE("(%p): QueryInterface from %s\n", This, debugstr_guid(riid));
+ if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_ID3DXFont)) {
+ IUnknown_AddRef(iface);
+ *object=This;
+ return S_OK;
+ }
+ WARN("(%p)->(%s, %p): not found\n", iface, debugstr_guid(riid), *object);
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ID3DXFontImpl_AddRef(LPD3DXFONT iface)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ ULONG ref=InterlockedIncrement(&This->ref);
+ TRACE("(%p): AddRef from %d\n", This, ref-1);
+ return ref;
+}
+
+static ULONG WINAPI ID3DXFontImpl_Release(LPD3DXFONT iface)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ ULONG ref=InterlockedDecrement(&This->ref);
+ TRACE("(%p): ReleaseRef to %d\n", This, ref);
+
+ if(ref==0) {
+ DeleteObject(This->hfont);
+ DeleteDC(This->hdc);
+ IDirect3DDevice9_Release(This->device);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+ return ref;
+}
+
+static HRESULT WINAPI ID3DXFontImpl_GetDevice(LPD3DXFONT iface, LPDIRECT3DDEVICE9 *device)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ TRACE("(%p)\n", This);
+
+ if( !device ) return D3DERR_INVALIDCALL;
+ *device = This->device;
+ IDirect3DDevice9_AddRef(This->device);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXFontImpl_GetDescA(LPD3DXFONT iface, D3DXFONT_DESCA *desc)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ TRACE("(%p)\n", This);
+
+ if( !desc ) return D3DERR_INVALIDCALL;
+ memcpy(desc, &This->desc, FIELD_OFFSET(D3DXFONT_DESCA, FaceName));
+ WideCharToMultiByte(CP_ACP, 0, This->desc.FaceName, -1, desc->FaceName, sizeof(desc->FaceName) / sizeof(CHAR), NULL, NULL);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXFontImpl_GetDescW(LPD3DXFONT iface, D3DXFONT_DESCW *desc)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ TRACE("(%p)\n", This);
+
+ if( !desc ) return D3DERR_INVALIDCALL;
+ *desc = This->desc;
+
+ return D3D_OK;
+}
+
+static BOOL WINAPI ID3DXFontImpl_GetTextMetricsA(LPD3DXFONT iface, TEXTMETRICA *metrics)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ TRACE("(%p)\n", This);
+ return GetTextMetricsA(This->hdc, metrics);
+}
+
+static BOOL WINAPI ID3DXFontImpl_GetTextMetricsW(LPD3DXFONT iface, TEXTMETRICW *metrics)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ TRACE("(%p)\n", This);
+ return GetTextMetricsW(This->hdc, metrics);
+}
+
+static HDC WINAPI ID3DXFontImpl_GetDC(LPD3DXFONT iface)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ TRACE("(%p)\n", This);
+ return This->hdc;
+}
+
+static HRESULT WINAPI ID3DXFontImpl_GetGlyphData(LPD3DXFONT iface, UINT glyph, LPDIRECT3DTEXTURE9 *texture, RECT *blackbox, POINT *cellinc)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ FIXME("(%p): stub\n", This);
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXFontImpl_PreloadCharacters(LPD3DXFONT iface, UINT first, UINT last)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ FIXME("(%p): stub\n", This);
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXFontImpl_PreloadGlyphs(LPD3DXFONT iface, UINT first, UINT last)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ FIXME("(%p): stub\n", This);
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXFontImpl_PreloadTextA(LPD3DXFONT iface, LPCSTR string, INT count)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ FIXME("(%p): stub\n", This);
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXFontImpl_PreloadTextW(LPD3DXFONT iface, LPCWSTR string, INT count)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ FIXME("(%p): stub\n", This);
+ return D3D_OK;
+}
+
+static INT WINAPI ID3DXFontImpl_DrawTextA(LPD3DXFONT iface, LPD3DXSPRITE sprite, LPCSTR string, INT count, LPRECT rect, DWORD format, D3DCOLOR color)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ FIXME("(%p): stub\n", This);
+ return 1;
+}
+
+static INT WINAPI ID3DXFontImpl_DrawTextW(LPD3DXFONT iface, LPD3DXSPRITE sprite, LPCWSTR string, INT count, LPRECT rect, DWORD format, D3DCOLOR color)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ FIXME("(%p): stub\n", This);
+ return 1;
+}
+
+static HRESULT WINAPI ID3DXFontImpl_OnLostDevice(LPD3DXFONT iface)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ FIXME("(%p): stub\n", This);
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXFontImpl_OnResetDevice(LPD3DXFONT iface)
+{
+ ID3DXFontImpl *This=(ID3DXFontImpl*)iface;
+ FIXME("(%p): stub\n", This);
+ return D3D_OK;
+}
+
+static const ID3DXFontVtbl D3DXFont_Vtbl =
+{
+ /*** IUnknown methods ***/
+ ID3DXFontImpl_QueryInterface,
+ ID3DXFontImpl_AddRef,
+ ID3DXFontImpl_Release,
+ /*** ID3DXFont methods ***/
+ ID3DXFontImpl_GetDevice,
+ ID3DXFontImpl_GetDescA,
+ ID3DXFontImpl_GetDescW,
+ ID3DXFontImpl_GetTextMetricsA,
+ ID3DXFontImpl_GetTextMetricsW,
+ ID3DXFontImpl_GetDC,
+ ID3DXFontImpl_GetGlyphData,
+ ID3DXFontImpl_PreloadCharacters,
+ ID3DXFontImpl_PreloadGlyphs,
+ ID3DXFontImpl_PreloadTextA,
+ ID3DXFontImpl_PreloadTextW,
+ ID3DXFontImpl_DrawTextA,
+ ID3DXFontImpl_DrawTextW,
+ ID3DXFontImpl_OnLostDevice,
+ ID3DXFontImpl_OnResetDevice
+};
+
+HRESULT WINAPI D3DXCreateFontA(LPDIRECT3DDEVICE9 device, INT height, UINT width, UINT weight, UINT miplevels, BOOL italic, DWORD charset,
+ DWORD precision, DWORD quality, DWORD pitchandfamily, LPCSTR facename, LPD3DXFONT *font)
+{
+ D3DXFONT_DESCA desc;
+
+ if( !device || !font ) return D3DERR_INVALIDCALL;
+
+ desc.Height=height;
+ desc.Width=width;
+ desc.Weight=weight;
+ desc.MipLevels=miplevels;
+ desc.Italic=italic;
+ desc.CharSet=charset;
+ desc.OutputPrecision=precision;
+ desc.Quality=quality;
+ desc.PitchAndFamily=pitchandfamily;
+ if(facename != NULL) lstrcpyA(desc.FaceName, facename);
+ else desc.FaceName[0] = '\0';
+
+ return D3DXCreateFontIndirectA(device, &desc, font);
+}
+
+HRESULT WINAPI D3DXCreateFontW(LPDIRECT3DDEVICE9 device, INT height, UINT width, UINT weight, UINT miplevels, BOOL italic, DWORD charset,
+ DWORD precision, DWORD quality, DWORD pitchandfamily, LPCWSTR facename, LPD3DXFONT *font)
+{
+ D3DXFONT_DESCW desc;
+
+ if( !device || !font ) return D3DERR_INVALIDCALL;
+
+ desc.Height=height;
+ desc.Width=width;
+ desc.Weight=weight;
+ desc.MipLevels=miplevels;
+ desc.Italic=italic;
+ desc.CharSet=charset;
+ desc.OutputPrecision=precision;
+ desc.Quality=quality;
+ desc.PitchAndFamily=pitchandfamily;
+ if(facename != NULL) strcpyW(desc.FaceName, facename);
+ else desc.FaceName[0] = '\0';
+
+ return D3DXCreateFontIndirectW(device, &desc, font);
+}
+
+/***********************************************************************
+ * D3DXCreateFontIndirectA (D3DX9_36.@)
+ */
+HRESULT WINAPI D3DXCreateFontIndirectA(LPDIRECT3DDEVICE9 device, CONST D3DXFONT_DESCA *desc, LPD3DXFONT *font)
+{
+ D3DXFONT_DESCW widedesc;
+
+ if( !device || !desc || !font ) return D3DERR_INVALIDCALL;
+
+ /* Copy everything but the last structure member. This requires the
+ two D3DXFONT_DESC structures to be equal until the FaceName member */
+ memcpy(&widedesc, desc, FIELD_OFFSET(D3DXFONT_DESCA, FaceName));
+ MultiByteToWideChar(CP_ACP, 0, desc->FaceName, -1,
+ widedesc.FaceName, sizeof(widedesc.FaceName)/sizeof(WCHAR));
+ return D3DXCreateFontIndirectW(device, &widedesc, font);
+}
+
+/***********************************************************************
+ * D3DXCreateFontIndirectW (D3DX9_36.@)
+ */
+HRESULT WINAPI D3DXCreateFontIndirectW(LPDIRECT3DDEVICE9 device, CONST D3DXFONT_DESCW *desc, LPD3DXFONT *font)
+{
+ D3DDEVICE_CREATION_PARAMETERS cpars;
+ D3DDISPLAYMODE mode;
+ ID3DXFontImpl *object;
+ IDirect3D9 *d3d;
+ HRESULT hr;
+ FIXME("stub\n");
+
+ if( !device || !desc || !font ) return D3DERR_INVALIDCALL;
+
+ /* the device MUST support D3DFMT_A8R8G8B8 */
+ IDirect3DDevice9_GetDirect3D(device, &d3d);
+ IDirect3DDevice9_GetCreationParameters(device, &cpars);
+ IDirect3DDevice9_GetDisplayMode(device, 0, &mode);
+ hr = IDirect3D9_CheckDeviceFormat(d3d, cpars.AdapterOrdinal, cpars.DeviceType, mode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_A8R8G8B8);
+ if(FAILED(hr)) {
+ IDirect3D9_Release(d3d);
+ return D3DXERR_INVALIDDATA;
+ }
+ IDirect3D9_Release(d3d);
+
+ object=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXFontImpl));
+ if(object==NULL) {
+ *font=NULL;
+ return E_OUTOFMEMORY;
+ }
+ object->lpVtbl=&D3DXFont_Vtbl;
+ object->ref=1;
+ object->device=device;
+ object->desc=*desc;
+
+ object->hdc = CreateCompatibleDC(NULL);
+ if( !object->hdc ) {
+ HeapFree(GetProcessHeap(), 0, object);
+ return D3DXERR_INVALIDDATA;
+ }
+
+ object->hfont = CreateFontW(desc->Height, desc->Width, 0, 0, desc->Weight, desc->Italic, FALSE, FALSE, desc->CharSet,
+ desc->OutputPrecision, CLIP_DEFAULT_PRECIS, desc->Quality, desc->PitchAndFamily, desc->FaceName);
+ if( !object->hfont ) {
+ DeleteDC(object->hdc);
+ HeapFree(GetProcessHeap(), 0, object);
+ return D3DXERR_INVALIDDATA;
+ }
+ SelectObject(object->hdc, object->hfont);
+
+ IDirect3DDevice9_AddRef(device);
+ *font=(LPD3DXFONT)object;
+
+ return D3D_OK;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_36/math.c b/reactos/dll/directx/wine/d3dx9_36/math.c
new file mode 100644
index 00000000000..c2193c83eba
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/math.c
@@ -0,0 +1,1755 @@
+/*
+ * Mathematical operations specific to D3DX9.
+ *
+ * Copyright (C) 2008 David Adam
+ * Copyright (C) 2008 Luis Busquets
+ * Copyright (C) 2008 Jérôme Gardou
+ * Copyright (C) 2008 Philip Nilsson
+ * Copyright (C) 2008 Henri Verbeet
+ *
+ * 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
+ */
+
+#define NONAMELESSUNION
+
+#include "config.h"
+#include "windef.h"
+#include "wingdi.h"
+#include "d3dx9_36_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
+
+static const ID3DXMatrixStackVtbl ID3DXMatrixStack_Vtbl;
+
+/*_________________D3DXColor____________________*/
+
+D3DXCOLOR* WINAPI D3DXColorAdjustContrast(D3DXCOLOR *pout, CONST D3DXCOLOR *pc, FLOAT s)
+{
+ pout->r = 0.5f + s * (pc->r - 0.5f);
+ pout->g = 0.5f + s * (pc->g - 0.5f);
+ pout->b = 0.5f + s * (pc->b - 0.5f);
+ pout->a = pc->a;
+ return pout;
+}
+
+D3DXCOLOR* WINAPI D3DXColorAdjustSaturation(D3DXCOLOR *pout, CONST D3DXCOLOR *pc, FLOAT s)
+{
+ FLOAT grey;
+
+ grey = pc->r * 0.2125f + pc->g * 0.7154f + pc->b * 0.0721f;
+ pout->r = grey + s * (pc->r - grey);
+ pout->g = grey + s * (pc->g - grey);
+ pout->b = grey + s * (pc->b - grey);
+ pout->a = pc->a;
+ return pout;
+}
+
+/*_________________Misc__________________________*/
+
+FLOAT WINAPI D3DXFresnelTerm(FLOAT costheta, FLOAT refractionindex)
+{
+ FLOAT a, d, g, result;
+
+ g = sqrt(refractionindex * refractionindex + costheta * costheta - 1.0f);
+ a = g + costheta;
+ d = g - costheta;
+ result = ( costheta * a - 1.0f ) * ( costheta * a - 1.0f ) / ( ( costheta * d + 1.0f ) * ( costheta * d + 1.0f ) ) + 1.0f;
+ result = result * 0.5f * d * d / ( a * a );
+ return result;
+}
+
+/*_________________D3DXMatrix____________________*/
+
+D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation(D3DXMATRIX *pout, FLOAT scaling, CONST D3DXVECTOR3 *rotationcenter, CONST D3DXQUATERNION *rotation, CONST D3DXVECTOR3 *translation)
+{
+ D3DXMATRIX m1, m2, m3, m4, m5;
+
+ D3DXMatrixScaling(&m1, scaling, scaling, scaling);
+
+ if ( !rotationcenter )
+ {
+ D3DXMatrixIdentity(&m2);
+ D3DXMatrixIdentity(&m4);
+ }
+ else
+ {
+ D3DXMatrixTranslation(&m2, -rotationcenter->x, -rotationcenter->y, -rotationcenter->z);
+ D3DXMatrixTranslation(&m4, rotationcenter->x, rotationcenter->y, rotationcenter->z);
+ }
+
+ if ( !rotation ) D3DXMatrixIdentity(&m3);
+ else D3DXMatrixRotationQuaternion(&m3, rotation);
+
+ if ( !translation ) D3DXMatrixIdentity(&m5);
+ else D3DXMatrixTranslation(&m5, translation->x, translation->y, translation->z);
+
+ D3DXMatrixMultiply(&m1, &m1, &m2);
+ D3DXMatrixMultiply(&m1, &m1, &m3);
+ D3DXMatrixMultiply(&m1, &m1, &m4);
+ D3DXMatrixMultiply(pout, &m1, &m5);
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation2D(D3DXMATRIX *pout, FLOAT scaling, CONST D3DXVECTOR2 *protationcenter, FLOAT rotation, CONST D3DXVECTOR2 *ptranslation)
+{
+ D3DXMATRIX m1, m2, m3, m4, m5;
+ D3DXQUATERNION rot;
+ D3DXVECTOR3 rot_center, trans;
+
+ rot.w=cos(rotation/2.0f);
+ rot.x=0.0f;
+ rot.y=0.0f;
+ rot.z=sin(rotation/2.0f);
+
+ if ( protationcenter )
+ {
+ rot_center.x=protationcenter->x;
+ rot_center.y=protationcenter->y;
+ rot_center.z=0.0f;
+ }
+ else
+ {
+ rot_center.x=0.0f;
+ rot_center.y=0.0f;
+ rot_center.z=0.0f;
+ }
+
+ if ( ptranslation )
+ {
+ trans.x=ptranslation->x;
+ trans.y=ptranslation->y;
+ trans.z=0.0f;
+ }
+ else
+ {
+ trans.x=0.0f;
+ trans.y=0.0f;
+ trans.z=0.0f;
+ }
+
+ D3DXMatrixScaling(&m1, scaling, scaling, 1.0f);
+ D3DXMatrixTranslation(&m2, -rot_center.x, -rot_center.y, -rot_center.z);
+ D3DXMatrixTranslation(&m4, rot_center.x, rot_center.y, rot_center.z);
+ D3DXMatrixRotationQuaternion(&m3, &rot);
+ D3DXMatrixTranslation(&m5, trans.x, trans.y, trans.z);
+
+ D3DXMatrixMultiply(&m1, &m1, &m2);
+ D3DXMatrixMultiply(&m1, &m1, &m3);
+ D3DXMatrixMultiply(&m1, &m1, &m4);
+ D3DXMatrixMultiply(pout, &m1, &m5);
+
+ return pout;
+}
+
+HRESULT WINAPI D3DXMatrixDecompose(D3DXVECTOR3 *poutscale, D3DXQUATERNION *poutrotation, D3DXVECTOR3 *pouttranslation, CONST D3DXMATRIX *pm)
+{
+ D3DXMATRIX normalized;
+ D3DXVECTOR3 vec;
+
+ /*Compute the scaling part.*/
+ vec.x=pm->u.m[0][0];
+ vec.y=pm->u.m[0][1];
+ vec.z=pm->u.m[0][2];
+ poutscale->x=D3DXVec3Length(&vec);
+
+ vec.x=pm->u.m[1][0];
+ vec.y=pm->u.m[1][1];
+ vec.z=pm->u.m[1][2];
+ poutscale->y=D3DXVec3Length(&vec);
+
+ vec.x=pm->u.m[2][0];
+ vec.y=pm->u.m[2][1];
+ vec.z=pm->u.m[2][2];
+ poutscale->z=D3DXVec3Length(&vec);
+
+ /*Compute the translation part.*/
+ pouttranslation->x=pm->u.m[3][0];
+ pouttranslation->y=pm->u.m[3][1];
+ pouttranslation->z=pm->u.m[3][2];
+
+ /*Let's calculate the rotation now*/
+ if ( (poutscale->x == 0.0f) || (poutscale->y == 0.0f) || (poutscale->z == 0.0f) ) return D3DERR_INVALIDCALL;
+
+ normalized.u.m[0][0]=pm->u.m[0][0]/poutscale->x;
+ normalized.u.m[0][1]=pm->u.m[0][1]/poutscale->x;
+ normalized.u.m[0][2]=pm->u.m[0][2]/poutscale->x;
+ normalized.u.m[1][0]=pm->u.m[1][0]/poutscale->y;
+ normalized.u.m[1][1]=pm->u.m[1][1]/poutscale->y;
+ normalized.u.m[1][2]=pm->u.m[1][2]/poutscale->y;
+ normalized.u.m[2][0]=pm->u.m[2][0]/poutscale->z;
+ normalized.u.m[2][1]=pm->u.m[2][1]/poutscale->z;
+ normalized.u.m[2][2]=pm->u.m[2][2]/poutscale->z;
+
+ D3DXQuaternionRotationMatrix(poutrotation,&normalized);
+ return S_OK;
+}
+
+FLOAT WINAPI D3DXMatrixDeterminant(CONST D3DXMATRIX *pm)
+{
+ D3DXVECTOR4 minor, v1, v2, v3;
+ FLOAT det;
+
+ v1.x = pm->u.m[0][0]; v1.y = pm->u.m[1][0]; v1.z = pm->u.m[2][0]; v1.w = pm->u.m[3][0];
+ v2.x = pm->u.m[0][1]; v2.y = pm->u.m[1][1]; v2.z = pm->u.m[2][1]; v2.w = pm->u.m[3][1];
+ v3.x = pm->u.m[0][2]; v3.y = pm->u.m[1][2]; v3.z = pm->u.m[2][2]; v3.w = pm->u.m[3][2];
+ D3DXVec4Cross(&minor, &v1, &v2, &v3);
+ det = - (pm->u.m[0][3] * minor.x + pm->u.m[1][3] * minor.y + pm->u.m[2][3] * minor.z + pm->u.m[3][3] * minor.w);
+ return det;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixInverse(D3DXMATRIX *pout, FLOAT *pdeterminant, CONST D3DXMATRIX *pm)
+{
+ int a, i, j;
+ D3DXMATRIX out;
+ D3DXVECTOR4 v, vec[3];
+ FLOAT det;
+
+ det = D3DXMatrixDeterminant(pm);
+ if ( !det ) return NULL;
+ if ( pdeterminant ) *pdeterminant = det;
+ for (i=0; i<4; i++)
+ {
+ for (j=0; j<4; j++)
+ {
+ if (j != i )
+ {
+ a = j;
+ if ( j > i ) a = a-1;
+ vec[a].x = pm->u.m[j][0];
+ vec[a].y = pm->u.m[j][1];
+ vec[a].z = pm->u.m[j][2];
+ vec[a].w = pm->u.m[j][3];
+ }
+ }
+ D3DXVec4Cross(&v, &vec[0], &vec[1], &vec[2]);
+ out.u.m[0][i] = pow(-1.0f, i) * v.x / det;
+ out.u.m[1][i] = pow(-1.0f, i) * v.y / det;
+ out.u.m[2][i] = pow(-1.0f, i) * v.z / det;
+ out.u.m[3][i] = pow(-1.0f, i) * v.w / det;
+ }
+
+ *pout = out;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixLookAtLH(D3DXMATRIX *pout, CONST D3DXVECTOR3 *peye, CONST D3DXVECTOR3 *pat, CONST D3DXVECTOR3 *pup)
+{
+ D3DXVECTOR3 right, rightn, up, upn, vec, vec2;
+
+ D3DXVec3Subtract(&vec2, pat, peye);
+ D3DXVec3Normalize(&vec, &vec2);
+ D3DXVec3Cross(&right, pup, &vec);
+ D3DXVec3Cross(&up, &vec, &right);
+ D3DXVec3Normalize(&rightn, &right);
+ D3DXVec3Normalize(&upn, &up);
+ pout->u.m[0][0] = rightn.x;
+ pout->u.m[1][0] = rightn.y;
+ pout->u.m[2][0] = rightn.z;
+ pout->u.m[3][0] = -D3DXVec3Dot(&rightn,peye);
+ pout->u.m[0][1] = upn.x;
+ pout->u.m[1][1] = upn.y;
+ pout->u.m[2][1] = upn.z;
+ pout->u.m[3][1] = -D3DXVec3Dot(&upn, peye);
+ pout->u.m[0][2] = vec.x;
+ pout->u.m[1][2] = vec.y;
+ pout->u.m[2][2] = vec.z;
+ pout->u.m[3][2] = -D3DXVec3Dot(&vec, peye);
+ pout->u.m[0][3] = 0.0f;
+ pout->u.m[1][3] = 0.0f;
+ pout->u.m[2][3] = 0.0f;
+ pout->u.m[3][3] = 1.0f;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixLookAtRH(D3DXMATRIX *pout, CONST D3DXVECTOR3 *peye, CONST D3DXVECTOR3 *pat, CONST D3DXVECTOR3 *pup)
+{
+ D3DXVECTOR3 right, rightn, up, upn, vec, vec2;
+
+ D3DXVec3Subtract(&vec2, pat, peye);
+ D3DXVec3Normalize(&vec, &vec2);
+ D3DXVec3Cross(&right, pup, &vec);
+ D3DXVec3Cross(&up, &vec, &right);
+ D3DXVec3Normalize(&rightn, &right);
+ D3DXVec3Normalize(&upn, &up);
+ pout->u.m[0][0] = -rightn.x;
+ pout->u.m[1][0] = -rightn.y;
+ pout->u.m[2][0] = -rightn.z;
+ pout->u.m[3][0] = D3DXVec3Dot(&rightn,peye);
+ pout->u.m[0][1] = upn.x;
+ pout->u.m[1][1] = upn.y;
+ pout->u.m[2][1] = upn.z;
+ pout->u.m[3][1] = -D3DXVec3Dot(&upn, peye);
+ pout->u.m[0][2] = -vec.x;
+ pout->u.m[1][2] = -vec.y;
+ pout->u.m[2][2] = -vec.z;
+ pout->u.m[3][2] = D3DXVec3Dot(&vec, peye);
+ pout->u.m[0][3] = 0.0f;
+ pout->u.m[1][3] = 0.0f;
+ pout->u.m[2][3] = 0.0f;
+ pout->u.m[3][3] = 1.0f;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixMultiply(D3DXMATRIX *pout, CONST D3DXMATRIX *pm1, CONST D3DXMATRIX *pm2)
+{
+ D3DXMATRIX out;
+ int i,j;
+
+ for (i=0; i<4; i++)
+ {
+ for (j=0; j<4; j++)
+ {
+ out.u.m[i][j] = pm1->u.m[i][0] * pm2->u.m[0][j] + pm1->u.m[i][1] * pm2->u.m[1][j] + pm1->u.m[i][2] * pm2->u.m[2][j] + pm1->u.m[i][3] * pm2->u.m[3][j];
+ }
+ }
+
+ *pout = out;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixMultiplyTranspose(D3DXMATRIX *pout, CONST D3DXMATRIX *pm1, CONST D3DXMATRIX *pm2)
+{
+ D3DXMatrixMultiply(pout, pm1, pm2);
+ D3DXMatrixTranspose(pout, pout);
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixOrthoLH(D3DXMATRIX *pout, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 2.0f / w;
+ pout->u.m[1][1] = 2.0f / h;
+ pout->u.m[2][2] = 1.0f / (zf - zn);
+ pout->u.m[3][2] = zn / (zn - zf);
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixOrthoOffCenterLH(D3DXMATRIX *pout, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 2.0f / (r - l);
+ pout->u.m[1][1] = 2.0f / (t - b);
+ pout->u.m[2][2] = 1.0f / (zf -zn);
+ pout->u.m[3][0] = -1.0f -2.0f *l / (r - l);
+ pout->u.m[3][1] = 1.0f + 2.0f * t / (b - t);
+ pout->u.m[3][2] = zn / (zn -zf);
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixOrthoOffCenterRH(D3DXMATRIX *pout, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 2.0f / (r - l);
+ pout->u.m[1][1] = 2.0f / (t - b);
+ pout->u.m[2][2] = 1.0f / (zn -zf);
+ pout->u.m[3][0] = -1.0f -2.0f *l / (r - l);
+ pout->u.m[3][1] = 1.0f + 2.0f * t / (b - t);
+ pout->u.m[3][2] = zn / (zn -zf);
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixOrthoRH(D3DXMATRIX *pout, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 2.0f / w;
+ pout->u.m[1][1] = 2.0f / h;
+ pout->u.m[2][2] = 1.0f / (zn - zf);
+ pout->u.m[3][2] = zn / (zn - zf);
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixPerspectiveFovLH(D3DXMATRIX *pout, FLOAT fovy, FLOAT aspect, FLOAT zn, FLOAT zf)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 1.0f / (aspect * tan(fovy/2.0f));
+ pout->u.m[1][1] = 1.0f / tan(fovy/2.0f);
+ pout->u.m[2][2] = zf / (zf - zn);
+ pout->u.m[2][3] = 1.0f;
+ pout->u.m[3][2] = (zf * zn) / (zn - zf);
+ pout->u.m[3][3] = 0.0f;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixPerspectiveFovRH(D3DXMATRIX *pout, FLOAT fovy, FLOAT aspect, FLOAT zn, FLOAT zf)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 1.0f / (aspect * tan(fovy/2.0f));
+ pout->u.m[1][1] = 1.0f / tan(fovy/2.0f);
+ pout->u.m[2][2] = zf / (zn - zf);
+ pout->u.m[2][3] = -1.0f;
+ pout->u.m[3][2] = (zf * zn) / (zn - zf);
+ pout->u.m[3][3] = 0.0f;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixPerspectiveLH(D3DXMATRIX *pout, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 2.0f * zn / w;
+ pout->u.m[1][1] = 2.0f * zn / h;
+ pout->u.m[2][2] = zf / (zf - zn);
+ pout->u.m[3][2] = (zn * zf) / (zn - zf);
+ pout->u.m[2][3] = 1.0f;
+ pout->u.m[3][3] = 0.0f;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixPerspectiveOffCenterLH(D3DXMATRIX *pout, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 2.0f * zn / (r - l);
+ pout->u.m[1][1] = -2.0f * zn / (b - t);
+ pout->u.m[2][0] = -1.0f - 2.0f * l / (r - l);
+ pout->u.m[2][1] = 1.0f + 2.0f * t / (b - t);
+ pout->u.m[2][2] = - zf / (zn - zf);
+ pout->u.m[3][2] = (zn * zf) / (zn -zf);
+ pout->u.m[2][3] = 1.0f;
+ pout->u.m[3][3] = 0.0f;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixPerspectiveOffCenterRH(D3DXMATRIX *pout, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 2.0f * zn / (r - l);
+ pout->u.m[1][1] = -2.0f * zn / (b - t);
+ pout->u.m[2][0] = 1.0f + 2.0f * l / (r - l);
+ pout->u.m[2][1] = -1.0f -2.0f * t / (b - t);
+ pout->u.m[2][2] = zf / (zn - zf);
+ pout->u.m[3][2] = (zn * zf) / (zn -zf);
+ pout->u.m[2][3] = -1.0f;
+ pout->u.m[3][3] = 0.0f;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixPerspectiveRH(D3DXMATRIX *pout, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 2.0f * zn / w;
+ pout->u.m[1][1] = 2.0f * zn / h;
+ pout->u.m[2][2] = zf / (zn - zf);
+ pout->u.m[3][2] = (zn * zf) / (zn - zf);
+ pout->u.m[2][3] = -1.0f;
+ pout->u.m[3][3] = 0.0f;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixReflect(D3DXMATRIX *pout, CONST D3DXPLANE *pplane)
+{
+ D3DXPLANE Nplane;
+
+ D3DXPlaneNormalize(&Nplane, pplane);
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 1.0f - 2.0f * Nplane.a * Nplane.a;
+ pout->u.m[0][1] = -2.0f * Nplane.a * Nplane.b;
+ pout->u.m[0][2] = -2.0f * Nplane.a * Nplane.c;
+ pout->u.m[1][0] = -2.0f * Nplane.a * Nplane.b;
+ pout->u.m[1][1] = 1.0f - 2.0f * Nplane.b * Nplane.b;
+ pout->u.m[1][2] = -2.0f * Nplane.b * Nplane.c;
+ pout->u.m[2][0] = -2.0f * Nplane.c * Nplane.a;
+ pout->u.m[2][1] = -2.0f * Nplane.c * Nplane.b;
+ pout->u.m[2][2] = 1.0f - 2.0f * Nplane.c * Nplane.c;
+ pout->u.m[3][0] = -2.0f * Nplane.d * Nplane.a;
+ pout->u.m[3][1] = -2.0f * Nplane.d * Nplane.b;
+ pout->u.m[3][2] = -2.0f * Nplane.d * Nplane.c;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixRotationAxis(D3DXMATRIX *pout, CONST D3DXVECTOR3 *pv, FLOAT angle)
+{
+ D3DXVECTOR3 v;
+
+ D3DXVec3Normalize(&v,pv);
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = (1.0f - cos(angle)) * v.x * v.x + cos(angle);
+ pout->u.m[1][0] = (1.0f - cos(angle)) * v.x * v.y - sin(angle) * v.z;
+ pout->u.m[2][0] = (1.0f - cos(angle)) * v.x * v.z + sin(angle) * v.y;
+ pout->u.m[0][1] = (1.0f - cos(angle)) * v.y * v.x + sin(angle) * v.z;
+ pout->u.m[1][1] = (1.0f - cos(angle)) * v.y * v.y + cos(angle);
+ pout->u.m[2][1] = (1.0f - cos(angle)) * v.y * v.z - sin(angle) * v.x;
+ pout->u.m[0][2] = (1.0f - cos(angle)) * v.z * v.x - sin(angle) * v.y;
+ pout->u.m[1][2] = (1.0f - cos(angle)) * v.z * v.y + sin(angle) * v.x;
+ pout->u.m[2][2] = (1.0f - cos(angle)) * v.z * v.z + cos(angle);
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixRotationQuaternion(D3DXMATRIX *pout, CONST D3DXQUATERNION *pq)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = 1.0f - 2.0f * (pq->y * pq->y + pq->z * pq->z);
+ pout->u.m[0][1] = 2.0f * (pq->x *pq->y + pq->z * pq->w);
+ pout->u.m[0][2] = 2.0f * (pq->x * pq->z - pq->y * pq->w);
+ pout->u.m[1][0] = 2.0f * (pq->x * pq->y - pq->z * pq->w);
+ pout->u.m[1][1] = 1.0f - 2.0f * (pq->x * pq->x + pq->z * pq->z);
+ pout->u.m[1][2] = 2.0f * (pq->y *pq->z + pq->x *pq->w);
+ pout->u.m[2][0] = 2.0f * (pq->x * pq->z + pq->y * pq->w);
+ pout->u.m[2][1] = 2.0f * (pq->y *pq->z - pq->x *pq->w);
+ pout->u.m[2][2] = 1.0f - 2.0f * (pq->x * pq->x + pq->y * pq->y);
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixRotationX(D3DXMATRIX *pout, FLOAT angle)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[1][1] = cos(angle);
+ pout->u.m[2][2] = cos(angle);
+ pout->u.m[1][2] = sin(angle);
+ pout->u.m[2][1] = -sin(angle);
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixRotationY(D3DXMATRIX *pout, FLOAT angle)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = cos(angle);
+ pout->u.m[2][2] = cos(angle);
+ pout->u.m[0][2] = -sin(angle);
+ pout->u.m[2][0] = sin(angle);
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixRotationYawPitchRoll(D3DXMATRIX *pout, FLOAT yaw, FLOAT pitch, FLOAT roll)
+{
+ D3DXMATRIX m;
+
+ D3DXMatrixIdentity(pout);
+ D3DXMatrixRotationZ(&m, roll);
+ D3DXMatrixMultiply(pout, pout, &m);
+ D3DXMatrixRotationX(&m, pitch);
+ D3DXMatrixMultiply(pout, pout, &m);
+ D3DXMatrixRotationY(&m, yaw);
+ D3DXMatrixMultiply(pout, pout, &m);
+ return pout;
+}
+D3DXMATRIX* WINAPI D3DXMatrixRotationZ(D3DXMATRIX *pout, FLOAT angle)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = cos(angle);
+ pout->u.m[1][1] = cos(angle);
+ pout->u.m[0][1] = sin(angle);
+ pout->u.m[1][0] = -sin(angle);
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixScaling(D3DXMATRIX *pout, FLOAT sx, FLOAT sy, FLOAT sz)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[0][0] = sx;
+ pout->u.m[1][1] = sy;
+ pout->u.m[2][2] = sz;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixShadow(D3DXMATRIX *pout, CONST D3DXVECTOR4 *plight, CONST D3DXPLANE *pplane)
+{
+ D3DXPLANE Nplane;
+ FLOAT dot;
+
+ D3DXPlaneNormalize(&Nplane, pplane);
+ dot = D3DXPlaneDot(&Nplane, plight);
+ pout->u.m[0][0] = dot - Nplane.a * plight->x;
+ pout->u.m[0][1] = -Nplane.a * plight->y;
+ pout->u.m[0][2] = -Nplane.a * plight->z;
+ pout->u.m[0][3] = -Nplane.a * plight->w;
+ pout->u.m[1][0] = -Nplane.b * plight->x;
+ pout->u.m[1][1] = dot - Nplane.b * plight->y;
+ pout->u.m[1][2] = -Nplane.b * plight->z;
+ pout->u.m[1][3] = -Nplane.b * plight->w;
+ pout->u.m[2][0] = -Nplane.c * plight->x;
+ pout->u.m[2][1] = -Nplane.c * plight->y;
+ pout->u.m[2][2] = dot - Nplane.c * plight->z;
+ pout->u.m[2][3] = -Nplane.c * plight->w;
+ pout->u.m[3][0] = -Nplane.d * plight->x;
+ pout->u.m[3][1] = -Nplane.d * plight->y;
+ pout->u.m[3][2] = -Nplane.d * plight->z;
+ pout->u.m[3][3] = dot - Nplane.d * plight->w;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixTransformation(D3DXMATRIX *pout, CONST D3DXVECTOR3 *pscalingcenter, CONST D3DXQUATERNION *pscalingrotation, CONST D3DXVECTOR3 *pscaling, CONST D3DXVECTOR3 *protationcenter, CONST D3DXQUATERNION *protation, CONST D3DXVECTOR3 *ptranslation)
+{
+ D3DXMATRIX m1, m2, m3, m4, m5, m6, m7;
+ D3DXQUATERNION prc;
+ D3DXVECTOR3 psc, pt;
+
+ if ( !pscalingcenter )
+ {
+ psc.x = 0.0f;
+ psc.y = 0.0f;
+ psc.z = 0.0f;
+ }
+ else
+ {
+ psc.x = pscalingcenter->x;
+ psc.y = pscalingcenter->y;
+ psc.z = pscalingcenter->z;
+ }
+
+ if ( !protationcenter )
+ {
+ prc.x = 0.0f;
+ prc.y = 0.0f;
+ prc.z = 0.0f;
+ }
+ else
+ {
+ prc.x = protationcenter->x;
+ prc.y = protationcenter->y;
+ prc.z = protationcenter->z;
+ }
+
+ if ( !ptranslation )
+ {
+ pt.x = 0.0f;
+ pt.y = 0.0f;
+ pt.z = 0.0f;
+ }
+ else
+ {
+ pt.x = ptranslation->x;
+ pt.y = ptranslation->y;
+ pt.z = ptranslation->z;
+ }
+
+ D3DXMatrixTranslation(&m1, -psc.x, -psc.y, -psc.z);
+
+ if ( !pscalingrotation )
+ {
+ D3DXMatrixIdentity(&m2);
+ D3DXMatrixIdentity(&m4);
+ }
+ else
+ {
+ D3DXMatrixRotationQuaternion(&m4, pscalingrotation);
+ D3DXMatrixInverse(&m2, NULL, &m4);
+ }
+
+ if ( !pscaling ) D3DXMatrixIdentity(&m3);
+ else D3DXMatrixScaling(&m3, pscaling->x, pscaling->y, pscaling->z);
+
+ if ( !protation ) D3DXMatrixIdentity(&m6);
+ else D3DXMatrixRotationQuaternion(&m6, protation);
+
+ D3DXMatrixTranslation(&m5, psc.x - prc.x, psc.y - prc.y, psc.z - prc.z);
+ D3DXMatrixTranslation(&m7, prc.x + pt.x, prc.y + pt.y, prc.z + pt.z);
+ D3DXMatrixMultiply(&m1, &m1, &m2);
+ D3DXMatrixMultiply(&m1, &m1, &m3);
+ D3DXMatrixMultiply(&m1, &m1, &m4);
+ D3DXMatrixMultiply(&m1, &m1, &m5);
+ D3DXMatrixMultiply(&m1, &m1, &m6);
+ D3DXMatrixMultiply(pout, &m1, &m7);
+ return pout;
+}
+D3DXMATRIX* WINAPI D3DXMatrixTransformation2D(D3DXMATRIX *pout, CONST D3DXVECTOR2 *pscalingcenter, FLOAT scalingrotation, CONST D3DXVECTOR2 *pscaling, CONST D3DXVECTOR2 *protationcenter, FLOAT rotation, CONST D3DXVECTOR2 *ptranslation)
+{
+ D3DXQUATERNION rot, sca_rot;
+ D3DXVECTOR3 rot_center, sca, sca_center, trans;
+
+ if ( pscalingcenter )
+ {
+ sca_center.x=pscalingcenter->x;
+ sca_center.y=pscalingcenter->y;
+ sca_center.z=0.0f;
+ }
+ else
+ {
+ sca_center.x=0.0f;
+ sca_center.y=0.0f;
+ sca_center.z=0.0f;
+ }
+
+ if ( pscaling )
+ {
+ sca.x=pscaling->x;
+ sca.y=pscaling->y;
+ sca.z=1.0f;
+ }
+ else
+ {
+ sca.x=1.0f;
+ sca.y=1.0f;
+ sca.z=1.0f;
+ }
+
+ if ( protationcenter )
+ {
+ rot_center.x=protationcenter->x;
+ rot_center.y=protationcenter->y;
+ rot_center.z=0.0f;
+ }
+ else
+ {
+ rot_center.x=0.0f;
+ rot_center.y=0.0f;
+ rot_center.z=0.0f;
+ }
+
+ if ( ptranslation )
+ {
+ trans.x=ptranslation->x;
+ trans.y=ptranslation->y;
+ trans.z=0.0f;
+ }
+ else
+ {
+ trans.x=0.0f;
+ trans.y=0.0f;
+ trans.z=0.0f;
+ }
+
+ rot.w=cos(rotation/2.0f);
+ rot.x=0.0f;
+ rot.y=0.0f;
+ rot.z=sin(rotation/2.0f);
+
+ sca_rot.w=cos(scalingrotation/2.0f);
+ sca_rot.x=0.0f;
+ sca_rot.y=0.0f;
+ sca_rot.z=sin(scalingrotation/2.0f);
+
+ D3DXMatrixTransformation(pout, &sca_center, &sca_rot, &sca, &rot_center, &rot, &trans);
+
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixTranslation(D3DXMATRIX *pout, FLOAT x, FLOAT y, FLOAT z)
+{
+ D3DXMatrixIdentity(pout);
+ pout->u.m[3][0] = x;
+ pout->u.m[3][1] = y;
+ pout->u.m[3][2] = z;
+ return pout;
+}
+
+D3DXMATRIX* WINAPI D3DXMatrixTranspose(D3DXMATRIX *pout, CONST D3DXMATRIX *pm)
+{
+ CONST D3DXMATRIX m = *pm;
+ int i,j;
+
+ for (i=0; i<4; i++)
+ for (j=0; j<4; j++) pout->u.m[i][j] = m.u.m[j][i];
+
+ return pout;
+}
+
+/*_________________D3DXMatrixStack____________________*/
+
+static const unsigned int INITIAL_STACK_SIZE = 32;
+
+HRESULT WINAPI D3DXCreateMatrixStack(DWORD flags, LPD3DXMATRIXSTACK* ppstack)
+{
+ ID3DXMatrixStackImpl* object;
+
+ TRACE("flags %#x, ppstack %p\n", flags, ppstack);
+
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXMatrixStackImpl));
+ if ( object == NULL )
+ {
+ *ppstack = NULL;
+ return E_OUTOFMEMORY;
+ }
+ object->lpVtbl = &ID3DXMatrixStack_Vtbl;
+ object->ref = 1;
+
+ object->stack = HeapAlloc(GetProcessHeap(), 0, INITIAL_STACK_SIZE * sizeof(D3DXMATRIX));
+ if (!object->stack)
+ {
+ HeapFree(GetProcessHeap(), 0, object);
+ *ppstack = NULL;
+ return E_OUTOFMEMORY;
+ }
+
+ object->current = 0;
+ object->stack_size = INITIAL_STACK_SIZE;
+ D3DXMatrixIdentity(&object->stack[0]);
+
+ TRACE("Created matrix stack %p\n", object);
+
+ *ppstack = (LPD3DXMATRIXSTACK)object;
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_QueryInterface(ID3DXMatrixStack *iface, REFIID riid, void **ppobj)
+{
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+ if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_ID3DXMatrixStack))
+ {
+ ID3DXMatrixStack_AddRef(iface);
+ *ppobj = This;
+ return S_OK;
+ }
+ *ppobj = NULL;
+ ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ID3DXMatrixStackImpl_AddRef(ID3DXMatrixStack *iface)
+{
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+ TRACE("(%p) : AddRef from %d\n", This, ref - 1);
+ return ref;
+}
+
+static ULONG WINAPI ID3DXMatrixStackImpl_Release(ID3DXMatrixStack* iface)
+{
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+ if (!ref)
+ {
+ HeapFree(GetProcessHeap(), 0, This->stack);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+ TRACE("(%p) : ReleaseRef to %d\n", This, ref);
+ return ref;
+}
+
+static D3DXMATRIX* WINAPI ID3DXMatrixStackImpl_GetTop(ID3DXMatrixStack *iface)
+{
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ return &This->stack[This->current];
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_LoadIdentity(ID3DXMatrixStack *iface)
+{
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ D3DXMatrixIdentity(&This->stack[This->current]);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_LoadMatrix(ID3DXMatrixStack *iface, CONST D3DXMATRIX *pm)
+{
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ This->stack[This->current] = *pm;
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_MultMatrix(ID3DXMatrixStack *iface, CONST D3DXMATRIX *pm)
+{
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ D3DXMatrixMultiply(&This->stack[This->current], &This->stack[This->current], pm);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_MultMatrixLocal(ID3DXMatrixStack *iface, CONST D3DXMATRIX *pm)
+{
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ D3DXMatrixMultiply(&This->stack[This->current], pm, &This->stack[This->current]);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_Pop(ID3DXMatrixStack *iface)
+{
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ /* Popping the last element on the stack returns D3D_OK, but does nothing. */
+ if (!This->current) return D3D_OK;
+
+ if (This->current <= This->stack_size / 4 && This->stack_size >= INITIAL_STACK_SIZE * 2)
+ {
+ unsigned int new_size;
+ D3DXMATRIX *new_stack;
+
+ new_size = This->stack_size / 2;
+ new_stack = HeapReAlloc(GetProcessHeap(), 0, This->stack, new_size * sizeof(D3DXMATRIX));
+ if (new_stack)
+ {
+ This->stack_size = new_size;
+ This->stack = new_stack;
+ }
+ }
+
+ --This->current;
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_Push(ID3DXMatrixStack *iface)
+{
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ if (This->current == This->stack_size - 1)
+ {
+ unsigned int new_size;
+ D3DXMATRIX *new_stack;
+
+ if (This->stack_size > UINT_MAX / 2) return E_OUTOFMEMORY;
+
+ new_size = This->stack_size * 2;
+ new_stack = HeapReAlloc(GetProcessHeap(), 0, This->stack, new_size * sizeof(D3DXMATRIX));
+ if (!new_stack) return E_OUTOFMEMORY;
+
+ This->stack_size = new_size;
+ This->stack = new_stack;
+ }
+
+ ++This->current;
+ This->stack[This->current] = This->stack[This->current - 1];
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_RotateAxis(ID3DXMatrixStack *iface, CONST D3DXVECTOR3 *pv, FLOAT angle)
+{
+ D3DXMATRIX temp;
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ D3DXMatrixRotationAxis(&temp, pv, angle);
+ D3DXMatrixMultiply(&This->stack[This->current], &This->stack[This->current], &temp);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_RotateAxisLocal(ID3DXMatrixStack *iface, CONST D3DXVECTOR3 *pv, FLOAT angle)
+{
+ D3DXMATRIX temp;
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ D3DXMatrixRotationAxis(&temp, pv, angle);
+ D3DXMatrixMultiply(&This->stack[This->current], &temp, &This->stack[This->current]);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_RotateYawPitchRoll(ID3DXMatrixStack *iface, FLOAT x, FLOAT y, FLOAT z)
+{
+ D3DXMATRIX temp;
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ D3DXMatrixRotationYawPitchRoll(&temp, x, y, z);
+ D3DXMatrixMultiply(&This->stack[This->current], &This->stack[This->current], &temp);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_RotateYawPitchRollLocal(ID3DXMatrixStack *iface, FLOAT x, FLOAT y, FLOAT z)
+{
+ D3DXMATRIX temp;
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ D3DXMatrixRotationYawPitchRoll(&temp, x, y, z);
+ D3DXMatrixMultiply(&This->stack[This->current], &temp, &This->stack[This->current]);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_Scale(ID3DXMatrixStack *iface, FLOAT x, FLOAT y, FLOAT z)
+{
+ D3DXMATRIX temp;
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ D3DXMatrixScaling(&temp, x, y, z);
+ D3DXMatrixMultiply(&This->stack[This->current], &This->stack[This->current], &temp);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_ScaleLocal(ID3DXMatrixStack *iface, FLOAT x, FLOAT y, FLOAT z)
+{
+ D3DXMATRIX temp;
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ D3DXMatrixScaling(&temp, x, y, z);
+ D3DXMatrixMultiply(&This->stack[This->current], &temp, &This->stack[This->current]);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_Translate(ID3DXMatrixStack *iface, FLOAT x, FLOAT y, FLOAT z)
+{
+ D3DXMATRIX temp;
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ D3DXMatrixTranslation(&temp, x, y, z);
+ D3DXMatrixMultiply(&This->stack[This->current], &This->stack[This->current], &temp);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXMatrixStackImpl_TranslateLocal(ID3DXMatrixStack *iface, FLOAT x, FLOAT y, FLOAT z)
+{
+ D3DXMATRIX temp;
+ ID3DXMatrixStackImpl *This = (ID3DXMatrixStackImpl *)iface;
+
+ TRACE("iface %p\n", iface);
+
+ D3DXMatrixTranslation(&temp, x, y, z);
+ D3DXMatrixMultiply(&This->stack[This->current], &temp,&This->stack[This->current]);
+
+ return D3D_OK;
+}
+
+static const ID3DXMatrixStackVtbl ID3DXMatrixStack_Vtbl =
+{
+ ID3DXMatrixStackImpl_QueryInterface,
+ ID3DXMatrixStackImpl_AddRef,
+ ID3DXMatrixStackImpl_Release,
+ ID3DXMatrixStackImpl_Pop,
+ ID3DXMatrixStackImpl_Push,
+ ID3DXMatrixStackImpl_LoadIdentity,
+ ID3DXMatrixStackImpl_LoadMatrix,
+ ID3DXMatrixStackImpl_MultMatrix,
+ ID3DXMatrixStackImpl_MultMatrixLocal,
+ ID3DXMatrixStackImpl_RotateAxis,
+ ID3DXMatrixStackImpl_RotateAxisLocal,
+ ID3DXMatrixStackImpl_RotateYawPitchRoll,
+ ID3DXMatrixStackImpl_RotateYawPitchRollLocal,
+ ID3DXMatrixStackImpl_Scale,
+ ID3DXMatrixStackImpl_ScaleLocal,
+ ID3DXMatrixStackImpl_Translate,
+ ID3DXMatrixStackImpl_TranslateLocal,
+ ID3DXMatrixStackImpl_GetTop
+};
+
+/*_________________D3DXPLANE________________*/
+
+D3DXPLANE* WINAPI D3DXPlaneFromPointNormal(D3DXPLANE *pout, CONST D3DXVECTOR3 *pvpoint, CONST D3DXVECTOR3 *pvnormal)
+{
+ pout->a = pvnormal->x;
+ pout->b = pvnormal->y;
+ pout->c = pvnormal->z;
+ pout->d = -D3DXVec3Dot(pvpoint, pvnormal);
+ return pout;
+}
+
+D3DXPLANE* WINAPI D3DXPlaneFromPoints(D3DXPLANE *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2, CONST D3DXVECTOR3 *pv3)
+{
+ D3DXVECTOR3 edge1, edge2, normal, Nnormal;
+
+ edge1.x = 0.0f; edge1.y = 0.0f; edge1.z = 0.0f;
+ edge2.x = 0.0f; edge2.y = 0.0f; edge2.z = 0.0f;
+ D3DXVec3Subtract(&edge1, pv2, pv1);
+ D3DXVec3Subtract(&edge2, pv3, pv1);
+ D3DXVec3Cross(&normal, &edge1, &edge2);
+ D3DXVec3Normalize(&Nnormal, &normal);
+ D3DXPlaneFromPointNormal(pout, pv1, &Nnormal);
+ return pout;
+}
+
+D3DXVECTOR3* WINAPI D3DXPlaneIntersectLine(D3DXVECTOR3 *pout, CONST D3DXPLANE *pp, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2)
+{
+ D3DXVECTOR3 direction, normal;
+ FLOAT dot, temp;
+
+ normal.x = pp->a;
+ normal.y = pp->b;
+ normal.z = pp->c;
+ direction.x = pv2->x - pv1->x;
+ direction.y = pv2->y - pv1->y;
+ direction.z = pv2->z - pv1->z;
+ dot = D3DXVec3Dot(&normal, &direction);
+ if ( !dot ) return NULL;
+ temp = ( pp->d + D3DXVec3Dot(&normal, pv1) ) / dot;
+ pout->x = pv1->x - temp * direction.x;
+ pout->y = pv1->y - temp * direction.y;
+ pout->z = pv1->z - temp * direction.z;
+ return pout;
+}
+
+D3DXPLANE* WINAPI D3DXPlaneNormalize(D3DXPLANE *pout, CONST D3DXPLANE *pp)
+{
+ D3DXPLANE out;
+ FLOAT norm;
+
+ norm = sqrt(pp->a * pp->a + pp->b * pp->b + pp->c * pp->c);
+ if ( norm )
+ {
+ out.a = pp->a / norm;
+ out.b = pp->b / norm;
+ out.c = pp->c / norm;
+ out.d = pp->d / norm;
+ }
+ else
+ {
+ out.a = 0.0f;
+ out.b = 0.0f;
+ out.c = 0.0f;
+ out.d = 0.0f;
+ }
+ *pout = out;
+ return pout;
+}
+
+D3DXPLANE* WINAPI D3DXPlaneTransform(D3DXPLANE *pout, CONST D3DXPLANE *pplane, CONST D3DXMATRIX *pm)
+{
+ CONST D3DXPLANE plane = *pplane;
+ pout->a = pm->u.m[0][0] * plane.a + pm->u.m[1][0] * plane.b + pm->u.m[2][0] * plane.c + pm->u.m[3][0] * plane.d;
+ pout->b = pm->u.m[0][1] * plane.a + pm->u.m[1][1] * plane.b + pm->u.m[2][1] * plane.c + pm->u.m[3][1] * plane.d;
+ pout->c = pm->u.m[0][2] * plane.a + pm->u.m[1][2] * plane.b + pm->u.m[2][2] * plane.c + pm->u.m[3][2] * plane.d;
+ pout->d = pm->u.m[0][3] * plane.a + pm->u.m[1][3] * plane.b + pm->u.m[2][3] * plane.c + pm->u.m[3][3] * plane.d;
+ return pout;
+}
+
+D3DXPLANE* WINAPI D3DXPlaneTransformArray(D3DXPLANE* out, UINT outstride, CONST D3DXPLANE* in, UINT instride, CONST D3DXMATRIX* matrix, UINT elements)
+{
+ UINT i;
+
+ for (i = 0; i < elements; ++i) {
+ D3DXPlaneTransform(
+ (D3DXPLANE*)((char*)out + outstride * i),
+ (CONST D3DXPLANE*)((const char*)in + instride * i),
+ matrix);
+ }
+ return out;
+}
+
+/*_________________D3DXQUATERNION________________*/
+
+D3DXQUATERNION* WINAPI D3DXQuaternionBaryCentric(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq1, CONST D3DXQUATERNION *pq2, CONST D3DXQUATERNION *pq3, FLOAT f, FLOAT g)
+{
+ D3DXQUATERNION temp1, temp2;
+ D3DXQuaternionSlerp(pout, D3DXQuaternionSlerp(&temp1, pq1, pq2, f + g), D3DXQuaternionSlerp(&temp2, pq1, pq3, f+g), g / (f + g));
+ return pout;
+}
+
+D3DXQUATERNION* WINAPI D3DXQuaternionExp(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq)
+{
+ FLOAT norm;
+
+ norm = sqrt(pq->x * pq->x + pq->y * pq->y + pq->z * pq->z);
+ if (norm )
+ {
+ pout->x = sin(norm) * pq->x / norm;
+ pout->y = sin(norm) * pq->y / norm;
+ pout->z = sin(norm) * pq->z / norm;
+ pout->w = cos(norm);
+ }
+ else
+ {
+ pout->x = 0.0f;
+ pout->y = 0.0f;
+ pout->z = 0.0f;
+ pout->w = 1.0f;
+ }
+ return pout;
+}
+
+D3DXQUATERNION* WINAPI D3DXQuaternionInverse(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq)
+{
+ D3DXQUATERNION out;
+ FLOAT norm;
+
+ norm = D3DXQuaternionLengthSq(pq);
+
+ out.x = -pq->x / norm;
+ out.y = -pq->y / norm;
+ out.z = -pq->z / norm;
+ out.w = pq->w / norm;
+
+ *pout =out;
+ return pout;
+}
+
+D3DXQUATERNION* WINAPI D3DXQuaternionLn(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq)
+{
+ FLOAT norm, normvec, theta;
+
+ norm = D3DXQuaternionLengthSq(pq);
+ if ( norm > 1.0001f )
+ {
+ pout->x = pq->x;
+ pout->y = pq->y;
+ pout->z = pq->z;
+ pout->w = 0.0f;
+ }
+ else if( norm > 0.99999f)
+ {
+ normvec = sqrt( pq->x * pq->x + pq->y * pq->y + pq->z * pq->z );
+ theta = atan2(normvec, pq->w) / normvec;
+ pout->x = theta * pq->x;
+ pout->y = theta * pq->y;
+ pout->z = theta * pq->z;
+ pout->w = 0.0f;
+ }
+ else
+ {
+ FIXME("The quaternion (%f, %f, %f, %f) has a norm <1. This should not happen. Windows returns a result anyway. This case is not implemented yet.\n", pq->x, pq->y, pq->z, pq->w);
+ }
+ return pout;
+}
+
+D3DXQUATERNION* WINAPI D3DXQuaternionMultiply(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq1, CONST D3DXQUATERNION *pq2)
+{
+ D3DXQUATERNION out;
+ out.x = pq2->w * pq1->x + pq2->x * pq1->w + pq2->y * pq1->z - pq2->z * pq1->y;
+ out.y = pq2->w * pq1->y - pq2->x * pq1->z + pq2->y * pq1->w + pq2->z * pq1->x;
+ out.z = pq2->w * pq1->z + pq2->x * pq1->y - pq2->y * pq1->x + pq2->z * pq1->w;
+ out.w = pq2->w * pq1->w - pq2->x * pq1->x - pq2->y * pq1->y - pq2->z * pq1->z;
+ *pout = out;
+ return pout;
+}
+
+D3DXQUATERNION* WINAPI D3DXQuaternionNormalize(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq)
+{
+ D3DXQUATERNION out;
+ FLOAT norm;
+
+ norm = D3DXQuaternionLength(pq);
+
+ out.x = pq->x / norm;
+ out.y = pq->y / norm;
+ out.z = pq->z / norm;
+ out.w = pq->w / norm;
+
+ *pout=out;
+
+ return pout;
+}
+
+D3DXQUATERNION* WINAPI D3DXQuaternionRotationAxis(D3DXQUATERNION *pout, CONST D3DXVECTOR3 *pv, FLOAT angle)
+{
+ D3DXVECTOR3 temp;
+
+ D3DXVec3Normalize(&temp, pv);
+ pout->x = sin( angle / 2.0f ) * temp.x;
+ pout->y = sin( angle / 2.0f ) * temp.y;
+ pout->z = sin( angle / 2.0f ) * temp.z;
+ pout->w = cos( angle / 2.0f );
+ return pout;
+}
+
+D3DXQUATERNION* WINAPI D3DXQuaternionRotationMatrix(D3DXQUATERNION *pout, CONST D3DXMATRIX *pm)
+{
+ int i, maxi;
+ FLOAT maxdiag, S, trace;
+
+ trace = pm->u.m[0][0] + pm->u.m[1][1] + pm->u.m[2][2] + 1.0f;
+ if ( trace > 1.0f)
+ {
+ pout->x = ( pm->u.m[1][2] - pm->u.m[2][1] ) / ( 2.0f * sqrt(trace) );
+ pout->y = ( pm->u.m[2][0] - pm->u.m[0][2] ) / ( 2.0f * sqrt(trace) );
+ pout->z = ( pm->u.m[0][1] - pm->u.m[1][0] ) / ( 2.0f * sqrt(trace) );
+ pout->w = sqrt(trace) / 2.0f;
+ return pout;
+ }
+ maxi = 0;
+ maxdiag = pm->u.m[0][0];
+ for (i=1; i<3; i++)
+ {
+ if ( pm->u.m[i][i] > maxdiag )
+ {
+ maxi = i;
+ maxdiag = pm->u.m[i][i];
+ }
+ }
+ switch( maxi )
+ {
+ case 0:
+ S = 2.0f * sqrt(1.0f + pm->u.m[0][0] - pm->u.m[1][1] - pm->u.m[2][2]);
+ pout->x = 0.25f * S;
+ pout->y = ( pm->u.m[0][1] + pm->u.m[1][0] ) / S;
+ pout->z = ( pm->u.m[0][2] + pm->u.m[2][0] ) / S;
+ pout->w = ( pm->u.m[1][2] - pm->u.m[2][1] ) / S;
+ break;
+ case 1:
+ S = 2.0f * sqrt(1.0f + pm->u.m[1][1] - pm->u.m[0][0] - pm->u.m[2][2]);
+ pout->x = ( pm->u.m[0][1] + pm->u.m[1][0] ) / S;
+ pout->y = 0.25f * S;
+ pout->z = ( pm->u.m[1][2] + pm->u.m[2][1] ) / S;
+ pout->w = ( pm->u.m[2][0] - pm->u.m[0][2] ) / S;
+ break;
+ case 2:
+ S = 2.0f * sqrt(1.0f + pm->u.m[2][2] - pm->u.m[0][0] - pm->u.m[1][1]);
+ pout->x = ( pm->u.m[0][2] + pm->u.m[2][0] ) / S;
+ pout->y = ( pm->u.m[1][2] + pm->u.m[2][1] ) / S;
+ pout->z = 0.25f * S;
+ pout->w = ( pm->u.m[0][1] - pm->u.m[1][0] ) / S;
+ break;
+ }
+ return pout;
+}
+
+D3DXQUATERNION* WINAPI D3DXQuaternionRotationYawPitchRoll(D3DXQUATERNION *pout, FLOAT yaw, FLOAT pitch, FLOAT roll)
+{
+ pout->x = sin( yaw / 2.0f) * cos(pitch / 2.0f) * sin(roll / 2.0f) + cos(yaw / 2.0f) * sin(pitch / 2.0f) * cos(roll / 2.0f);
+ pout->y = sin( yaw / 2.0f) * cos(pitch / 2.0f) * cos(roll / 2.0f) - cos(yaw / 2.0f) * sin(pitch / 2.0f) * sin(roll / 2.0f);
+ pout->z = cos(yaw / 2.0f) * cos(pitch / 2.0f) * sin(roll / 2.0f) - sin( yaw / 2.0f) * sin(pitch / 2.0f) * cos(roll / 2.0f);
+ pout->w = cos( yaw / 2.0f) * cos(pitch / 2.0f) * cos(roll / 2.0f) + sin(yaw / 2.0f) * sin(pitch / 2.0f) * sin(roll / 2.0f);
+ return pout;
+}
+
+D3DXQUATERNION* WINAPI D3DXQuaternionSlerp(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq1, CONST D3DXQUATERNION *pq2, FLOAT t)
+{
+ FLOAT dot, epsilon, temp, theta, u;
+
+ epsilon = 1.0f;
+ temp = 1.0f - t;
+ u = t;
+ dot = D3DXQuaternionDot(pq1, pq2);
+ if ( dot < 0.0f )
+ {
+ epsilon = -1.0f;
+ dot = -dot;
+ }
+ if( 1.0f - dot > 0.001f )
+ {
+ theta = acos(dot);
+ temp = sin(theta * temp) / sin(theta);
+ u = sin(theta * u) / sin(theta);
+ }
+ pout->x = temp * pq1->x + epsilon * u * pq2->x;
+ pout->y = temp * pq1->y + epsilon * u * pq2->y;
+ pout->z = temp * pq1->z + epsilon * u * pq2->z;
+ pout->w = temp * pq1->w + epsilon * u * pq2->w;
+ return pout;
+}
+
+D3DXQUATERNION* WINAPI D3DXQuaternionSquad(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq1, CONST D3DXQUATERNION *pq2, CONST D3DXQUATERNION *pq3, CONST D3DXQUATERNION *pq4, FLOAT t)
+{
+ D3DXQUATERNION temp1, temp2;
+
+ D3DXQuaternionSlerp(pout, D3DXQuaternionSlerp(&temp1, pq1, pq4, t), D3DXQuaternionSlerp(&temp2, pq2, pq3, t), 2.0f * t * (1.0f - t));
+ return pout;
+}
+
+void WINAPI D3DXQuaternionToAxisAngle(CONST D3DXQUATERNION *pq, D3DXVECTOR3 *paxis, FLOAT *pangle)
+{
+ paxis->x = pq->x;
+ paxis->y = pq->y;
+ paxis->z = pq->z;
+ *pangle = 2.0f * acos(pq->w);
+}
+
+/*_________________D3DXVec2_____________________*/
+
+D3DXVECTOR2* WINAPI D3DXVec2BaryCentric(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2, CONST D3DXVECTOR2 *pv3, FLOAT f, FLOAT g)
+{
+ pout->x = (1.0f-f-g) * (pv1->x) + f * (pv2->x) + g * (pv3->x);
+ pout->y = (1.0f-f-g) * (pv1->y) + f * (pv2->y) + g * (pv3->y);
+ return pout;
+}
+
+D3DXVECTOR2* WINAPI D3DXVec2CatmullRom(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv0, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2, CONST D3DXVECTOR2 *pv3, FLOAT s)
+{
+ pout->x = 0.5f * (2.0f * pv1->x + (pv2->x - pv0->x) *s + (2.0f *pv0->x - 5.0f * pv1->x + 4.0f * pv2->x - pv3->x) * s * s + (pv3->x -3.0f * pv2->x + 3.0f * pv1->x - pv0->x) * s * s * s);
+ pout->y = 0.5f * (2.0f * pv1->y + (pv2->y - pv0->y) *s + (2.0f *pv0->y - 5.0f * pv1->y + 4.0f * pv2->y - pv3->y) * s * s + (pv3->y -3.0f * pv2->y + 3.0f * pv1->y - pv0->y) * s * s * s);
+ return pout;
+}
+
+D3DXVECTOR2* WINAPI D3DXVec2Hermite(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pt1, CONST D3DXVECTOR2 *pv2, CONST D3DXVECTOR2 *pt2, FLOAT s)
+{
+ FLOAT h1, h2, h3, h4;
+
+ h1 = 2.0f * s * s * s - 3.0f * s * s + 1.0f;
+ h2 = s * s * s - 2.0f * s * s + s;
+ h3 = -2.0f * s * s * s + 3.0f * s * s;
+ h4 = s * s * s - s * s;
+
+ pout->x = h1 * (pv1->x) + h2 * (pt1->x) + h3 * (pv2->x) + h4 * (pt2->x);
+ pout->y = h1 * (pv1->y) + h2 * (pt1->y) + h3 * (pv2->y) + h4 * (pt2->y);
+ return pout;
+}
+
+D3DXVECTOR2* WINAPI D3DXVec2Normalize(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv)
+{
+ D3DXVECTOR2 out;
+ FLOAT norm;
+
+ norm = D3DXVec2Length(pv);
+ if ( !norm )
+ {
+ out.x = 0.0f;
+ out.y = 0.0f;
+ }
+ else
+ {
+ out.x = pv->x / norm;
+ out.y = pv->y / norm;
+ }
+ *pout=out;
+ return pout;
+}
+
+D3DXVECTOR4* WINAPI D3DXVec2Transform(D3DXVECTOR4 *pout, CONST D3DXVECTOR2 *pv, CONST D3DXMATRIX *pm)
+{
+ pout->x = pm->u.m[0][0] * pv->x + pm->u.m[1][0] * pv->y + pm->u.m[3][0];
+ pout->y = pm->u.m[0][1] * pv->x + pm->u.m[1][1] * pv->y + pm->u.m[3][1];
+ pout->z = pm->u.m[0][2] * pv->x + pm->u.m[1][2] * pv->y + pm->u.m[3][2];
+ pout->w = pm->u.m[0][3] * pv->x + pm->u.m[1][3] * pv->y + pm->u.m[3][3];
+ return pout;
+}
+
+D3DXVECTOR4* WINAPI D3DXVec2TransformArray(D3DXVECTOR4* out, UINT outstride, CONST D3DXVECTOR2* in, UINT instride, CONST D3DXMATRIX* matrix, UINT elements)
+{
+ UINT i;
+
+ for (i = 0; i < elements; ++i) {
+ D3DXVec2Transform(
+ (D3DXVECTOR4*)((char*)out + outstride * i),
+ (CONST D3DXVECTOR2*)((const char*)in + instride * i),
+ matrix);
+ }
+ return out;
+}
+
+D3DXVECTOR2* WINAPI D3DXVec2TransformCoord(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv, CONST D3DXMATRIX *pm)
+{
+ D3DXVECTOR2 v;
+ FLOAT norm;
+
+ v = *pv;
+ norm = pm->u.m[0][3] * pv->x + pm->u.m[1][3] * pv->y + pm->u.m[3][3];
+
+ pout->x = (pm->u.m[0][0] * v.x + pm->u.m[1][0] * v.y + pm->u.m[3][0]) / norm;
+ pout->y = (pm->u.m[0][1] * v.x + pm->u.m[1][1] * v.y + pm->u.m[3][1]) / norm;
+
+ return pout;
+}
+
+D3DXVECTOR2* WINAPI D3DXVec2TransformCoordArray(D3DXVECTOR2* out, UINT outstride, CONST D3DXVECTOR2* in, UINT instride, CONST D3DXMATRIX* matrix, UINT elements)
+{
+ UINT i;
+
+ for (i = 0; i < elements; ++i) {
+ D3DXVec2TransformCoord(
+ (D3DXVECTOR2*)((char*)out + outstride * i),
+ (CONST D3DXVECTOR2*)((const char*)in + instride * i),
+ matrix);
+ }
+ return out;
+}
+
+D3DXVECTOR2* WINAPI D3DXVec2TransformNormal(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv, CONST D3DXMATRIX *pm)
+{
+ CONST D3DXVECTOR2 v = *pv;
+ pout->x = pm->u.m[0][0] * v.x + pm->u.m[1][0] * v.y;
+ pout->y = pm->u.m[0][1] * v.x + pm->u.m[1][1] * v.y;
+ return pout;
+}
+
+D3DXVECTOR2* WINAPI D3DXVec2TransformNormalArray(D3DXVECTOR2* out, UINT outstride, CONST D3DXVECTOR2 *in, UINT instride, CONST D3DXMATRIX *matrix, UINT elements)
+{
+ UINT i;
+
+ for (i = 0; i < elements; ++i) {
+ D3DXVec2TransformNormal(
+ (D3DXVECTOR2*)((char*)out + outstride * i),
+ (CONST D3DXVECTOR2*)((const char*)in + instride * i),
+ matrix);
+ }
+ return out;
+}
+
+/*_________________D3DXVec3_____________________*/
+
+D3DXVECTOR3* WINAPI D3DXVec3BaryCentric(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2, CONST D3DXVECTOR3 *pv3, FLOAT f, FLOAT g)
+{
+ pout->x = (1.0f-f-g) * (pv1->x) + f * (pv2->x) + g * (pv3->x);
+ pout->y = (1.0f-f-g) * (pv1->y) + f * (pv2->y) + g * (pv3->y);
+ pout->z = (1.0f-f-g) * (pv1->z) + f * (pv2->z) + g * (pv3->z);
+ return pout;
+}
+
+D3DXVECTOR3* WINAPI D3DXVec3CatmullRom( D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv0, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pv2, CONST D3DXVECTOR3 *pv3, FLOAT s)
+{
+ pout->x = 0.5f * (2.0f * pv1->x + (pv2->x - pv0->x) *s + (2.0f *pv0->x - 5.0f * pv1->x + 4.0f * pv2->x - pv3->x) * s * s + (pv3->x -3.0f * pv2->x + 3.0f * pv1->x - pv0->x) * s * s * s);
+ pout->y = 0.5f * (2.0f * pv1->y + (pv2->y - pv0->y) *s + (2.0f *pv0->y - 5.0f * pv1->y + 4.0f * pv2->y - pv3->y) * s * s + (pv3->y -3.0f * pv2->y + 3.0f * pv1->y - pv0->y) * s * s * s);
+ pout->z = 0.5f * (2.0f * pv1->z + (pv2->z - pv0->z) *s + (2.0f *pv0->z - 5.0f * pv1->z + 4.0f * pv2->z - pv3->z) * s * s + (pv3->z -3.0f * pv2->z + 3.0f * pv1->z - pv0->z) * s * s * s);
+ return pout;
+}
+
+D3DXVECTOR3* WINAPI D3DXVec3Hermite(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv1, CONST D3DXVECTOR3 *pt1, CONST D3DXVECTOR3 *pv2, CONST D3DXVECTOR3 *pt2, FLOAT s)
+{
+ FLOAT h1, h2, h3, h4;
+
+ h1 = 2.0f * s * s * s - 3.0f * s * s + 1.0f;
+ h2 = s * s * s - 2.0f * s * s + s;
+ h3 = -2.0f * s * s * s + 3.0f * s * s;
+ h4 = s * s * s - s * s;
+
+ pout->x = h1 * (pv1->x) + h2 * (pt1->x) + h3 * (pv2->x) + h4 * (pt2->x);
+ pout->y = h1 * (pv1->y) + h2 * (pt1->y) + h3 * (pv2->y) + h4 * (pt2->y);
+ pout->z = h1 * (pv1->z) + h2 * (pt1->z) + h3 * (pv2->z) + h4 * (pt2->z);
+ return pout;
+}
+
+D3DXVECTOR3* WINAPI D3DXVec3Normalize(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv)
+{
+ D3DXVECTOR3 out;
+ FLOAT norm;
+
+ norm = D3DXVec3Length(pv);
+ if ( !norm )
+ {
+ out.x = 0.0f;
+ out.y = 0.0f;
+ out.z = 0.0f;
+ }
+ else
+ {
+ out.x = pv->x / norm;
+ out.y = pv->y / norm;
+ out.z = pv->z / norm;
+ }
+ *pout = out;
+ return pout;
+}
+
+D3DXVECTOR3* WINAPI D3DXVec3Project(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, CONST D3DVIEWPORT9 *pviewport, CONST D3DXMATRIX *pprojection, CONST D3DXMATRIX *pview, CONST D3DXMATRIX *pworld)
+{
+ D3DXMATRIX m;
+ D3DXVECTOR3 out;
+
+ D3DXMatrixMultiply(&m, pworld, pview);
+ D3DXMatrixMultiply(&m, &m, pprojection);
+ D3DXVec3TransformCoord(&out, pv, &m);
+ out.x = pviewport->X + ( 1.0f + out.x ) * pviewport->Width / 2.0f;
+ out.y = pviewport->Y + ( 1.0f - out.y ) * pviewport->Height / 2.0f;
+ out.z = pviewport->MinZ + out.z * ( pviewport->MaxZ - pviewport->MinZ );
+ *pout = out;
+ return pout;
+}
+
+D3DXVECTOR3* WINAPI D3DXVec3ProjectArray(D3DXVECTOR3* out, UINT outstride, CONST D3DXVECTOR3* in, UINT instride, CONST D3DVIEWPORT9* viewport, CONST D3DXMATRIX* projection, CONST D3DXMATRIX* view, CONST D3DXMATRIX* world, UINT elements)
+{
+ UINT i;
+
+ for (i = 0; i < elements; ++i) {
+ D3DXVec3Project(
+ (D3DXVECTOR3*)((char*)out + outstride * i),
+ (CONST D3DXVECTOR3*)((const char*)in + instride * i),
+ viewport, projection, view, world);
+ }
+ return out;
+}
+
+D3DXVECTOR4* WINAPI D3DXVec3Transform(D3DXVECTOR4 *pout, CONST D3DXVECTOR3 *pv, CONST D3DXMATRIX *pm)
+{
+ pout->x = pm->u.m[0][0] * pv->x + pm->u.m[1][0] * pv->y + pm->u.m[2][0] * pv->z + pm->u.m[3][0];
+ pout->y = pm->u.m[0][1] * pv->x + pm->u.m[1][1] * pv->y + pm->u.m[2][1] * pv->z + pm->u.m[3][1];
+ pout->z = pm->u.m[0][2] * pv->x + pm->u.m[1][2] * pv->y + pm->u.m[2][2] * pv->z + pm->u.m[3][2];
+ pout->w = pm->u.m[0][3] * pv->x + pm->u.m[1][3] * pv->y + pm->u.m[2][3] * pv->z + pm->u.m[3][3];
+ return pout;
+}
+
+D3DXVECTOR4* WINAPI D3DXVec3TransformArray(D3DXVECTOR4* out, UINT outstride, CONST D3DXVECTOR3* in, UINT instride, CONST D3DXMATRIX* matrix, UINT elements)
+{
+ UINT i;
+
+ for (i = 0; i < elements; ++i) {
+ D3DXVec3Transform(
+ (D3DXVECTOR4*)((char*)out + outstride * i),
+ (CONST D3DXVECTOR3*)((const char*)in + instride * i),
+ matrix);
+ }
+ return out;
+}
+
+D3DXVECTOR3* WINAPI D3DXVec3TransformCoord(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, CONST D3DXMATRIX *pm)
+{
+ D3DXVECTOR3 out;
+ FLOAT norm;
+
+ norm = pm->u.m[0][3] * pv->x + pm->u.m[1][3] * pv->y + pm->u.m[2][3] *pv->z + pm->u.m[3][3];
+
+ out.x = (pm->u.m[0][0] * pv->x + pm->u.m[1][0] * pv->y + pm->u.m[2][0] * pv->z + pm->u.m[3][0]) / norm;
+ out.y = (pm->u.m[0][1] * pv->x + pm->u.m[1][1] * pv->y + pm->u.m[2][1] * pv->z + pm->u.m[3][1]) / norm;
+ out.z = (pm->u.m[0][2] * pv->x + pm->u.m[1][2] * pv->y + pm->u.m[2][2] * pv->z + pm->u.m[3][2]) / norm;
+
+ *pout = out;
+
+ return pout;
+}
+
+D3DXVECTOR3* WINAPI D3DXVec3TransformCoordArray(D3DXVECTOR3* out, UINT outstride, CONST D3DXVECTOR3* in, UINT instride, CONST D3DXMATRIX* matrix, UINT elements)
+{
+ UINT i;
+
+ for (i = 0; i < elements; ++i) {
+ D3DXVec3TransformCoord(
+ (D3DXVECTOR3*)((char*)out + outstride * i),
+ (CONST D3DXVECTOR3*)((const char*)in + instride * i),
+ matrix);
+ }
+ return out;
+}
+
+D3DXVECTOR3* WINAPI D3DXVec3TransformNormal(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, CONST D3DXMATRIX *pm)
+{
+ CONST D3DXVECTOR3 v = *pv;
+ pout->x = pm->u.m[0][0] * v.x + pm->u.m[1][0] * v.y + pm->u.m[2][0] * v.z;
+ pout->y = pm->u.m[0][1] * v.x + pm->u.m[1][1] * v.y + pm->u.m[2][1] * v.z;
+ pout->z = pm->u.m[0][2] * v.x + pm->u.m[1][2] * v.y + pm->u.m[2][2] * v.z;
+ return pout;
+
+}
+
+D3DXVECTOR3* WINAPI D3DXVec3TransformNormalArray(D3DXVECTOR3* out, UINT outstride, CONST D3DXVECTOR3* in, UINT instride, CONST D3DXMATRIX* matrix, UINT elements)
+{
+ UINT i;
+
+ for (i = 0; i < elements; ++i) {
+ D3DXVec3TransformNormal(
+ (D3DXVECTOR3*)((char*)out + outstride * i),
+ (CONST D3DXVECTOR3*)((const char*)in + instride * i),
+ matrix);
+ }
+ return out;
+}
+
+D3DXVECTOR3* WINAPI D3DXVec3Unproject(D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *pv, CONST D3DVIEWPORT9 *pviewport, CONST D3DXMATRIX *pprojection, CONST D3DXMATRIX *pview, CONST D3DXMATRIX *pworld)
+{
+ D3DXMATRIX m;
+ D3DXVECTOR3 out;
+
+ D3DXMatrixMultiply(&m, pworld, pview);
+ D3DXMatrixMultiply(&m, &m, pprojection);
+ D3DXMatrixInverse(&m, NULL, &m);
+ out.x = 2.0f * ( pv->x - pviewport->X ) / pviewport->Width - 1.0f;
+ out.y = 1.0f - 2.0f * ( pv->y - pviewport->Y ) / pviewport->Height;
+ out.z = ( pv->z - pviewport->MinZ) / ( pviewport->MaxZ - pviewport->MinZ );
+ D3DXVec3TransformCoord(&out, &out, &m);
+ *pout = out;
+ return pout;
+}
+
+D3DXVECTOR3* WINAPI D3DXVec3UnprojectArray(D3DXVECTOR3* out, UINT outstride, CONST D3DXVECTOR3* in, UINT instride, CONST D3DVIEWPORT9* viewport, CONST D3DXMATRIX* projection, CONST D3DXMATRIX* view, CONST D3DXMATRIX* world, UINT elements)
+{
+ UINT i;
+
+ for (i = 0; i < elements; ++i) {
+ D3DXVec3Unproject(
+ (D3DXVECTOR3*)((char*)out + outstride * i),
+ (CONST D3DXVECTOR3*)((const char*)in + instride * i),
+ viewport, projection, view, world);
+ }
+ return out;
+}
+
+/*_________________D3DXVec4_____________________*/
+
+D3DXVECTOR4* WINAPI D3DXVec4BaryCentric(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2, CONST D3DXVECTOR4 *pv3, FLOAT f, FLOAT g)
+{
+ pout->x = (1.0f-f-g) * (pv1->x) + f * (pv2->x) + g * (pv3->x);
+ pout->y = (1.0f-f-g) * (pv1->y) + f * (pv2->y) + g * (pv3->y);
+ pout->z = (1.0f-f-g) * (pv1->z) + f * (pv2->z) + g * (pv3->z);
+ pout->w = (1.0f-f-g) * (pv1->w) + f * (pv2->w) + g * (pv3->w);
+ return pout;
+}
+
+D3DXVECTOR4* WINAPI D3DXVec4CatmullRom(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv0, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2, CONST D3DXVECTOR4 *pv3, FLOAT s)
+{
+ pout->x = 0.5f * (2.0f * pv1->x + (pv2->x - pv0->x) *s + (2.0f *pv0->x - 5.0f * pv1->x + 4.0f * pv2->x - pv3->x) * s * s + (pv3->x -3.0f * pv2->x + 3.0f * pv1->x - pv0->x) * s * s * s);
+ pout->y = 0.5f * (2.0f * pv1->y + (pv2->y - pv0->y) *s + (2.0f *pv0->y - 5.0f * pv1->y + 4.0f * pv2->y - pv3->y) * s * s + (pv3->y -3.0f * pv2->y + 3.0f * pv1->y - pv0->y) * s * s * s);
+ pout->z = 0.5f * (2.0f * pv1->z + (pv2->z - pv0->z) *s + (2.0f *pv0->z - 5.0f * pv1->z + 4.0f * pv2->z - pv3->z) * s * s + (pv3->z -3.0f * pv2->z + 3.0f * pv1->z - pv0->z) * s * s * s);
+ pout->w = 0.5f * (2.0f * pv1->w + (pv2->w - pv0->w) *s + (2.0f *pv0->w - 5.0f * pv1->w + 4.0f * pv2->w - pv3->w) * s * s + (pv3->w -3.0f * pv2->w + 3.0f * pv1->w - pv0->w) * s * s * s);
+ return pout;
+}
+
+D3DXVECTOR4* WINAPI D3DXVec4Cross(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pv2, CONST D3DXVECTOR4 *pv3)
+{
+ D3DXVECTOR4 out;
+ out.x = pv1->y * (pv2->z * pv3->w - pv3->z * pv2->w) - pv1->z * (pv2->y * pv3->w - pv3->y * pv2->w) + pv1->w * (pv2->y * pv3->z - pv2->z *pv3->y);
+ out.y = -(pv1->x * (pv2->z * pv3->w - pv3->z * pv2->w) - pv1->z * (pv2->x * pv3->w - pv3->x * pv2->w) + pv1->w * (pv2->x * pv3->z - pv3->x * pv2->z));
+ out.z = pv1->x * (pv2->y * pv3->w - pv3->y * pv2->w) - pv1->y * (pv2->x *pv3->w - pv3->x * pv2->w) + pv1->w * (pv2->x * pv3->y - pv3->x * pv2->y);
+ out.w = -(pv1->x * (pv2->y * pv3->z - pv3->y * pv2->z) - pv1->y * (pv2->x * pv3->z - pv3->x *pv2->z) + pv1->z * (pv2->x * pv3->y - pv3->x * pv2->y));
+ *pout = out;
+ return pout;
+}
+
+D3DXVECTOR4* WINAPI D3DXVec4Hermite(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv1, CONST D3DXVECTOR4 *pt1, CONST D3DXVECTOR4 *pv2, CONST D3DXVECTOR4 *pt2, FLOAT s)
+{
+ FLOAT h1, h2, h3, h4;
+
+ h1 = 2.0f * s * s * s - 3.0f * s * s + 1.0f;
+ h2 = s * s * s - 2.0f * s * s + s;
+ h3 = -2.0f * s * s * s + 3.0f * s * s;
+ h4 = s * s * s - s * s;
+
+ pout->x = h1 * (pv1->x) + h2 * (pt1->x) + h3 * (pv2->x) + h4 * (pt2->x);
+ pout->y = h1 * (pv1->y) + h2 * (pt1->y) + h3 * (pv2->y) + h4 * (pt2->y);
+ pout->z = h1 * (pv1->z) + h2 * (pt1->z) + h3 * (pv2->z) + h4 * (pt2->z);
+ pout->w = h1 * (pv1->w) + h2 * (pt1->w) + h3 * (pv2->w) + h4 * (pt2->w);
+ return pout;
+}
+
+D3DXVECTOR4* WINAPI D3DXVec4Normalize(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv)
+{
+ D3DXVECTOR4 out;
+ FLOAT norm;
+
+ norm = D3DXVec4Length(pv);
+
+ out.x = pv->x / norm;
+ out.y = pv->y / norm;
+ out.z = pv->z / norm;
+ out.w = pv->w / norm;
+
+ *pout = out;
+ return pout;
+}
+
+D3DXVECTOR4* WINAPI D3DXVec4Transform(D3DXVECTOR4 *pout, CONST D3DXVECTOR4 *pv, CONST D3DXMATRIX *pm)
+{
+ D3DXVECTOR4 out;
+ out.x = pm->u.m[0][0] * pv->x + pm->u.m[1][0] * pv->y + pm->u.m[2][0] * pv->z + pm->u.m[3][0] * pv->w;
+ out.y = pm->u.m[0][1] * pv->x + pm->u.m[1][1] * pv->y + pm->u.m[2][1] * pv->z + pm->u.m[3][1] * pv->w;
+ out.z = pm->u.m[0][2] * pv->x + pm->u.m[1][2] * pv->y + pm->u.m[2][2] * pv->z + pm->u.m[3][2] * pv->w;
+ out.w = pm->u.m[0][3] * pv->x + pm->u.m[1][3] * pv->y + pm->u.m[2][3] * pv->z + pm->u.m[3][3] * pv->w;
+ *pout = out;
+ return pout;
+}
+
+D3DXVECTOR4* WINAPI D3DXVec4TransformArray(D3DXVECTOR4* out, UINT outstride, CONST D3DXVECTOR4* in, UINT instride, CONST D3DXMATRIX* matrix, UINT elements)
+{
+ UINT i;
+
+ for (i = 0; i < elements; ++i) {
+ D3DXVec4Transform(
+ (D3DXVECTOR4*)((char*)out + outstride * i),
+ (CONST D3DXVECTOR4*)((const char*)in + instride * i),
+ matrix);
+ }
+ return out;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_36/mesh.c b/reactos/dll/directx/wine/d3dx9_36/mesh.c
new file mode 100644
index 00000000000..251bb40f9fc
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/mesh.c
@@ -0,0 +1,316 @@
+ /*
+ * Mesh operations specific to D3DX9.
+ *
+ * Copyright (C) 2009 David Adam
+ *
+ * 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 "wine/port.h"
+#include "wine/debug.h"
+#include "windef.h"
+#include "wingdi.h"
+#include "d3dx9.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
+
+/*************************************************************************
+ * D3DXBoxBoundProbe
+ */
+BOOL WINAPI D3DXBoxBoundProbe(CONST D3DXVECTOR3 *pmin, CONST D3DXVECTOR3 *pmax, CONST D3DXVECTOR3 *prayposition, CONST D3DXVECTOR3 *praydirection)
+
+/* Algorithm taken from the article: An Efficient and Robust Ray-Box Intersection Algoritm
+Amy Williams University of Utah
+Steve Barrus University of Utah
+R. Keith Morley University of Utah
+Peter Shirley University of Utah
+
+International Conference on Computer Graphics and Interactive Techniques archive
+ACM SIGGRAPH 2005 Courses
+Los Angeles, California
+
+This algorithm is free of patents or of copyrights, as confirmed by Peter Shirley himself.
+
+Algorithm: Consider the box as the intersection of three slabs. Clip the ray
+against each slab, if there's anything left of the ray after we're
+done we've got an intersection of the ray with the box.
+*/
+
+{
+ FLOAT div, tmin, tmax, tymin, tymax, tzmin, tzmax;
+
+ div = 1.0f / praydirection->x;
+ if ( div >= 0.0f )
+ {
+ tmin = ( pmin->x - prayposition->x ) * div;
+ tmax = ( pmax->x - prayposition->x ) * div;
+ }
+ else
+ {
+ tmin = ( pmax->x - prayposition->x ) * div;
+ tmax = ( pmin->x - prayposition->x ) * div;
+ }
+
+ if ( tmax < 0.0f ) return FALSE;
+
+ div = 1.0f / praydirection->y;
+ if ( div >= 0.0f )
+ {
+ tymin = ( pmin->y - prayposition->y ) * div;
+ tymax = ( pmax->y - prayposition->y ) * div;
+ }
+ else
+ {
+ tymin = ( pmax->y - prayposition->y ) * div;
+ tymax = ( pmin->y - prayposition->y ) * div;
+ }
+
+ if ( ( tymax < 0.0f ) || ( tmin > tymax ) || ( tymin > tmax ) ) return FALSE;
+
+ if ( tymin > tmin ) tmin = tymin;
+ if ( tymax < tmax ) tmax = tymax;
+
+ div = 1.0f / praydirection->z;
+ if ( div >= 0.0f )
+ {
+ tzmin = ( pmin->z - prayposition->z ) * div;
+ tzmax = ( pmax->z - prayposition->z ) * div;
+ }
+ else
+ {
+ tzmin = ( pmax->z - prayposition->z ) * div;
+ tzmax = ( pmin->z - prayposition->z ) * div;
+ }
+
+ if ( (tzmax < 0.0f ) || ( tmin > tzmax ) || ( tzmin > tmax ) ) return FALSE;
+
+ return TRUE;
+}
+
+/*************************************************************************
+ * D3DXComputeBoundingBox
+ */
+HRESULT WINAPI D3DXComputeBoundingBox(CONST D3DXVECTOR3 *pfirstposition, DWORD numvertices, DWORD dwstride, D3DXVECTOR3 *pmin, D3DXVECTOR3 *pmax)
+{
+ D3DXVECTOR3 vec;
+ unsigned int i;
+
+ if( !pfirstposition || !pmin || !pmax ) return D3DERR_INVALIDCALL;
+
+ *pmin = *pfirstposition;
+ *pmax = *pmin;
+
+ for(i=0; ix ) pmin->x = vec.x;
+ if ( vec.x > pmax->x ) pmax->x = vec.x;
+
+ if ( vec.y < pmin->y ) pmin->y = vec.y;
+ if ( vec.y > pmax->y ) pmax->y = vec.y;
+
+ if ( vec.z < pmin->z ) pmin->z = vec.z;
+ if ( vec.z > pmax->z ) pmax->z = vec.z;
+ }
+
+ return D3D_OK;
+}
+
+/*************************************************************************
+ * D3DXComputeBoundingSphere
+ */
+HRESULT WINAPI D3DXComputeBoundingSphere(CONST D3DXVECTOR3* pfirstposition, DWORD numvertices, DWORD dwstride, D3DXVECTOR3 *pcenter, FLOAT *pradius)
+{
+ D3DXVECTOR3 temp, temp1;
+ FLOAT d;
+ unsigned int i;
+
+ if( !pfirstposition || !pcenter || !pradius ) return D3DERR_INVALIDCALL;
+
+ temp.x = 0.0f;
+ temp.y = 0.0f;
+ temp.z = 0.0f;
+ temp1 = temp;
+ d = 0.0f;
+ *pradius = 0.0f;
+
+ for(i=0; i *pradius ) *pradius = d;
+ }
+ return D3D_OK;
+}
+
+/*************************************************************************
+ * D3DXGetFVFVertexSize
+ */
+static UINT Get_TexCoord_Size_From_FVF(DWORD FVF, int tex_num)
+{
+ return (((((FVF) >> (16 + (2 * (tex_num)))) + 1) & 0x03) + 1);
+}
+
+UINT WINAPI D3DXGetFVFVertexSize(DWORD FVF)
+{
+ DWORD size = 0;
+ UINT i;
+ UINT numTextures = (FVF & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT;
+
+ if (FVF & D3DFVF_NORMAL) size += sizeof(D3DXVECTOR3);
+ if (FVF & D3DFVF_DIFFUSE) size += sizeof(DWORD);
+ if (FVF & D3DFVF_SPECULAR) size += sizeof(DWORD);
+ if (FVF & D3DFVF_PSIZE) size += sizeof(DWORD);
+
+ switch (FVF & D3DFVF_POSITION_MASK)
+ {
+ case D3DFVF_XYZ: size += sizeof(D3DXVECTOR3); break;
+ case D3DFVF_XYZRHW: size += 4 * sizeof(FLOAT); break;
+ case D3DFVF_XYZB1: size += 4 * sizeof(FLOAT); break;
+ case D3DFVF_XYZB2: size += 5 * sizeof(FLOAT); break;
+ case D3DFVF_XYZB3: size += 6 * sizeof(FLOAT); break;
+ case D3DFVF_XYZB4: size += 7 * sizeof(FLOAT); break;
+ case D3DFVF_XYZB5: size += 8 * sizeof(FLOAT); break;
+ case D3DFVF_XYZW: size += 4 * sizeof(FLOAT); break;
+ }
+
+ for (i = 0; i < numTextures; i++)
+ {
+ size += Get_TexCoord_Size_From_FVF(FVF, i) * sizeof(FLOAT);
+ }
+
+ return size;
+}
+
+/*************************************************************************
+ * D3DXGetDeclVertexSize
+ */
+UINT WINAPI D3DXGetDeclVertexSize(const D3DVERTEXELEMENT9 *decl, DWORD stream_idx)
+{
+ const D3DVERTEXELEMENT9 *element;
+ UINT size = 0;
+
+ TRACE("decl %p, stream_idx %u\n", decl, stream_idx);
+
+ if (!decl) return 0;
+
+ for (element = decl; element->Stream != 0xff; ++element)
+ {
+ UINT type_size;
+
+ if (element->Stream != stream_idx) continue;
+
+ switch (element->Type)
+ {
+ case D3DDECLTYPE_FLOAT1: type_size = 1 * 4; break;
+ case D3DDECLTYPE_FLOAT2: type_size = 2 * 4; break;
+ case D3DDECLTYPE_FLOAT3: type_size = 3 * 4; break;
+ case D3DDECLTYPE_FLOAT4: type_size = 4 * 4; break;
+ case D3DDECLTYPE_D3DCOLOR: type_size = 4 * 1; break;
+ case D3DDECLTYPE_UBYTE4: type_size = 4 * 1; break;
+ case D3DDECLTYPE_SHORT2: type_size = 2 * 2; break;
+ case D3DDECLTYPE_SHORT4: type_size = 4 * 2; break;
+ case D3DDECLTYPE_UBYTE4N: type_size = 4 * 1; break;
+ case D3DDECLTYPE_SHORT2N: type_size = 2 * 2; break;
+ case D3DDECLTYPE_SHORT4N: type_size = 4 * 2; break;
+ case D3DDECLTYPE_USHORT2N: type_size = 2 * 2; break;
+ case D3DDECLTYPE_USHORT4N: type_size = 4 * 2; break;
+ case D3DDECLTYPE_UDEC3: type_size = 4; break; /* 3 * 10 bits + 2 padding */
+ case D3DDECLTYPE_DEC3N: type_size = 4; break;
+ case D3DDECLTYPE_FLOAT16_2: type_size = 2 * 2; break;
+ case D3DDECLTYPE_FLOAT16_4: type_size = 4 * 2; break;
+ default:
+ FIXME("Unhandled element type %#x, size will be incorrect.\n", element->Type);
+ type_size = 0;
+ break;
+ }
+
+ if (element->Offset + type_size > size) size = element->Offset + type_size;
+ }
+
+ return size;
+}
+
+/*************************************************************************
+ * D3DXIntersectTri
+ */
+BOOL WINAPI D3DXIntersectTri(CONST D3DXVECTOR3 *p0, CONST D3DXVECTOR3 *p1, CONST D3DXVECTOR3 *p2, CONST D3DXVECTOR3 *praypos, CONST D3DXVECTOR3 *praydir, FLOAT *pu, FLOAT *pv, FLOAT *pdist)
+{
+ D3DXMATRIX m;
+ D3DXVECTOR4 vec;
+
+ m.m[0][0] = p1->x - p0->x;
+ m.m[1][0] = p2->x - p0->x;
+ m.m[2][0] = -praydir->x;
+ m.m[3][0] = 0.0f;
+ m.m[0][1] = p1->y - p0->z;
+ m.m[1][1] = p2->y - p0->z;
+ m.m[2][1] = -praydir->y;
+ m.m[3][1] = 0.0f;
+ m.m[0][2] = p1->z - p0->z;
+ m.m[1][2] = p2->z - p0->z;
+ m.m[2][2] = -praydir->z;
+ m.m[3][2] = 0.0f;
+ m.m[0][3] = 0.0f;
+ m.m[1][3] = 0.0f;
+ m.m[2][3] = 0.0f;
+ m.m[3][3] = 1.0f;
+
+ vec.x = praypos->x - p0->x;
+ vec.y = praypos->y - p0->y;
+ vec.z = praypos->z - p0->z;
+ vec.w = 0.0f;
+
+ if ( D3DXMatrixInverse(&m, NULL, &m) )
+ {
+ D3DXVec4Transform(&vec, &vec, &m);
+ if ( (vec.x >= 0.0f) && (vec.y >= 0.0f) && (vec.x + vec.y <= 1.0f) && (vec.z >= 0.0f) )
+ {
+ *pu = vec.x;
+ *pv = vec.y;
+ *pdist = fabs( vec.z );
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/*************************************************************************
+ * D3DXSphereBoundProbe
+ */
+BOOL WINAPI D3DXSphereBoundProbe(CONST D3DXVECTOR3 *pcenter, FLOAT radius, CONST D3DXVECTOR3 *prayposition, CONST D3DXVECTOR3 *praydirection)
+{
+ D3DXVECTOR3 difference;
+ FLOAT a, b, c, d;
+
+ a = D3DXVec3LengthSq(praydirection);
+ if (!D3DXVec3Subtract(&difference, prayposition, pcenter)) return FALSE;
+ b = D3DXVec3Dot(&difference, praydirection);
+ c = D3DXVec3LengthSq(&difference) - radius * radius;
+ d = b * b - a * c;
+
+ if ( ( d <= 0.0f ) || ( sqrt(d) <= b ) ) return FALSE;
+ return TRUE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_36/shader.c b/reactos/dll/directx/wine/d3dx9_36/shader.c
new file mode 100644
index 00000000000..48499ac6df1
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/shader.c
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2008 Luis Busquets
+ *
+ * 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 "wine/port.h"
+#include "wine/debug.h"
+#include "windef.h"
+#include "wingdi.h"
+#include "d3dx9.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
+
+LPCSTR WINAPI D3DXGetPixelShaderProfile(LPDIRECT3DDEVICE9 device)
+{
+ D3DCAPS9 caps;
+
+ TRACE("device %p\n", device);
+
+ if (!device) return NULL;
+
+ IDirect3DDevice9_GetDeviceCaps(device,&caps);
+
+ switch (caps.PixelShaderVersion)
+ {
+ case D3DPS_VERSION(1, 1):
+ return "ps_1_1";
+
+ case D3DPS_VERSION(1, 2):
+ return "ps_1_2";
+
+ case D3DPS_VERSION(1, 3):
+ return "ps_1_3";
+
+ case D3DPS_VERSION(1, 4):
+ return "ps_1_4";
+
+ case D3DPS_VERSION(2, 0):
+ if ((caps.PS20Caps.NumTemps>=22) &&
+ (caps.PS20Caps.Caps&D3DPS20CAPS_ARBITRARYSWIZZLE) &&
+ (caps.PS20Caps.Caps&D3DPS20CAPS_GRADIENTINSTRUCTIONS) &&
+ (caps.PS20Caps.Caps&D3DPS20CAPS_PREDICATION) &&
+ (caps.PS20Caps.Caps&D3DPS20CAPS_NODEPENDENTREADLIMIT) &&
+ (caps.PS20Caps.Caps&D3DPS20CAPS_NOTEXINSTRUCTIONLIMIT))
+ {
+ return "ps_2_a";
+ }
+ if ((caps.PS20Caps.NumTemps>=32) &&
+ (caps.PS20Caps.Caps&D3DPS20CAPS_NOTEXINSTRUCTIONLIMIT))
+ {
+ return "ps_2_b";
+ }
+ return "ps_2_0";
+
+ case D3DPS_VERSION(3, 0):
+ return "ps_3_0";
+ }
+
+ return NULL;
+}
+
+UINT WINAPI D3DXGetShaderSize(const DWORD *byte_code)
+{
+ const DWORD *ptr = byte_code;
+
+ TRACE("byte_code %p\n", byte_code);
+
+ if (!ptr) return 0;
+
+ /* Look for the END token, skipping the VERSION token */
+ while (*++ptr != D3DSIO_END)
+ {
+ /* Skip comments */
+ if ((*ptr & D3DSI_OPCODE_MASK) == D3DSIO_COMMENT)
+ {
+ ptr += ((*ptr & D3DSI_COMMENTSIZE_MASK) >> D3DSI_COMMENTSIZE_SHIFT);
+ }
+ }
+ ++ptr;
+
+ /* Return the shader size in bytes */
+ return (ptr - byte_code) * sizeof(*ptr);
+}
+
+DWORD WINAPI D3DXGetShaderVersion(const DWORD *byte_code)
+{
+ TRACE("byte_code %p\n", byte_code);
+
+ return byte_code ? *byte_code : 0;
+}
+
+LPCSTR WINAPI D3DXGetVertexShaderProfile(LPDIRECT3DDEVICE9 device)
+{
+ D3DCAPS9 caps;
+
+ TRACE("device %p\n", device);
+
+ if (!device) return NULL;
+
+ IDirect3DDevice9_GetDeviceCaps(device,&caps);
+
+ switch (caps.VertexShaderVersion)
+ {
+ case D3DVS_VERSION(1, 1):
+ return "vs_1_1";
+ case D3DVS_VERSION(2, 0):
+ if ((caps.VS20Caps.NumTemps>=13) &&
+ (caps.VS20Caps.DynamicFlowControlDepth==24) &&
+ (caps.VS20Caps.Caps&D3DPS20CAPS_PREDICATION))
+ {
+ return "vs_2_a";
+ }
+ return "vs_2_0";
+ case D3DVS_VERSION(3, 0):
+ return "vs_3_0";
+ }
+
+ return NULL;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_36/sprite.c b/reactos/dll/directx/wine/d3dx9_36/sprite.c
new file mode 100644
index 00000000000..ce9938e9e55
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/sprite.c
@@ -0,0 +1,506 @@
+/*
+ * Copyright (C) 2008 Tony Wasserka
+ *
+ * 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 "wine/debug.h"
+#include "d3dx9_36_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
+
+/* the combination of all possible D3DXSPRITE flags */
+#define D3DXSPRITE_FLAGLIMIT 511
+
+typedef struct _SPRITEVERTEX {
+ D3DXVECTOR3 pos;
+ DWORD col;
+ D3DXVECTOR2 tex;
+} SPRITEVERTEX;
+
+static HRESULT WINAPI ID3DXSpriteImpl_QueryInterface(LPD3DXSPRITE iface, REFIID riid, LPVOID *object)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+
+ TRACE("(%p): QueryInterface from %s\n", This, debugstr_guid(riid));
+ if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_ID3DXSprite)) {
+ IUnknown_AddRef(iface);
+ *object=This;
+ return S_OK;
+ }
+ WARN("(%p)->(%s, %p): not found\n", iface, debugstr_guid(riid), *object);
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ID3DXSpriteImpl_AddRef(LPD3DXSPRITE iface)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ ULONG ref=InterlockedIncrement(&This->ref);
+ TRACE("(%p): AddRef from %d\n", This, ref-1);
+ return ref;
+}
+
+static ULONG WINAPI ID3DXSpriteImpl_Release(LPD3DXSPRITE iface)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ ULONG ref=InterlockedDecrement(&This->ref);
+ TRACE("(%p): ReleaseRef to %d\n", This, ref);
+
+ if(ref==0) {
+ if(This->sprites) {
+ int i;
+ for(i=0;isprite_count;i++)
+ if(This->sprites[i].texture)
+ IDirect3DTexture9_Release(This->sprites[i].texture);
+
+ HeapFree(GetProcessHeap(), 0, This->sprites);
+ }
+ if(This->stateblock) IDirect3DStateBlock9_Release(This->stateblock);
+ if(This->vdecl) IDirect3DVertexDeclaration9_Release(This->vdecl);
+ if(This->device) IDirect3DDevice9_Release(This->device);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+ return ref;
+}
+
+static HRESULT WINAPI ID3DXSpriteImpl_GetDevice(LPD3DXSPRITE iface, LPDIRECT3DDEVICE9 *device)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if(device==NULL) return D3DERR_INVALIDCALL;
+ *device=This->device;
+ IDirect3DDevice9_AddRef(This->device);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXSpriteImpl_GetTransform(LPD3DXSPRITE iface, D3DXMATRIX *transform)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ TRACE("(%p)\n", This);
+
+ if(transform==NULL) return D3DERR_INVALIDCALL;
+ *transform=This->transform;
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXSpriteImpl_SetTransform(LPD3DXSPRITE iface, CONST D3DXMATRIX *transform)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ TRACE("(%p)\n", This);
+
+ if(transform==NULL) return D3DERR_INVALIDCALL;
+ This->transform=*transform;
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXSpriteImpl_SetWorldViewRH(LPD3DXSPRITE iface, CONST D3DXMATRIX *world, CONST D3DXMATRIX *view)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ FIXME("(%p): stub\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXSpriteImpl_SetWorldViewLH(LPD3DXSPRITE iface, CONST D3DXMATRIX *world, CONST D3DXMATRIX *view)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ FIXME("(%p): stub\n", This);
+ return E_NOTIMPL;
+}
+
+/* Helper function */
+static void set_states(ID3DXSpriteImpl *object)
+{
+ D3DXMATRIX mat;
+ D3DVIEWPORT9 vp;
+
+ /* Miscelaneous stuff */
+ IDirect3DDevice9_SetVertexShader(object->device, NULL);
+ IDirect3DDevice9_SetPixelShader(object->device, NULL);
+ IDirect3DDevice9_SetNPatchMode(object->device, 0.0f);
+
+ /* Render states */
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHABLENDENABLE, TRUE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHAFUNC, D3DCMP_GREATER);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHAREF, 0x00);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHATESTENABLE, object->alphacmp_caps);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_BLENDOP, D3DBLENDOP_ADD);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_CLIPPING, TRUE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_CLIPPLANEENABLE, FALSE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE |
+ D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_CULLMODE, D3DCULL_NONE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_ENABLEADAPTIVETESSELLATION, FALSE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_FILLMODE, D3DFILL_SOLID);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_FOGENABLE, FALSE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_LIGHTING, FALSE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_RANGEFOGENABLE, FALSE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_SEPARATEALPHABLENDENABLE, FALSE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_SPECULARENABLE, FALSE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_SRGBWRITEENABLE, FALSE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_STENCILENABLE, FALSE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_VERTEXBLEND, FALSE);
+ IDirect3DDevice9_SetRenderState(object->device, D3DRS_WRAP0, 0);
+
+ /* Texture stage states */
+ IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
+ IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
+ IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
+ IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
+ IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
+ IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
+ IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_TEXCOORDINDEX, 0);
+ IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
+ IDirect3DDevice9_SetTextureStageState(object->device, 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
+ IDirect3DDevice9_SetTextureStageState(object->device, 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
+
+ /* Sampler states */
+ IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
+ IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
+
+ if(object->texfilter_caps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
+ IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);
+ else IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
+
+ IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAXMIPLEVEL, 0);
+ IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAXANISOTROPY, object->maxanisotropy);
+
+ if(object->texfilter_caps & D3DPTFILTERCAPS_MINFANISOTROPIC)
+ IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
+ else IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
+
+ if(object->texfilter_caps & D3DPTFILTERCAPS_MIPFLINEAR)
+ IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
+ else IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
+
+ IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MIPMAPLODBIAS, 0);
+ IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_SRGBTEXTURE, 0);
+
+ /* Matrices */
+ D3DXMatrixIdentity(&mat);
+ IDirect3DDevice9_SetTransform(object->device, D3DTS_WORLD, &mat);
+ IDirect3DDevice9_SetTransform(object->device, D3DTS_VIEW, &mat);
+ IDirect3DDevice9_GetViewport(object->device, &vp);
+ D3DXMatrixOrthoOffCenterLH(&mat, vp.X+0.5f, (float)vp.Width+vp.X+0.5f, (float)vp.Height+vp.Y+0.5f, vp.Y+0.5f, vp.MinZ, vp.MaxZ);
+ IDirect3DDevice9_SetTransform(object->device, D3DTS_PROJECTION, &mat);
+}
+
+static HRESULT WINAPI ID3DXSpriteImpl_Begin(LPD3DXSPRITE iface, DWORD flags)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ HRESULT hr;
+ TRACE("(%p): relay\n", This);
+
+ if(flags>D3DXSPRITE_FLAGLIMIT || This->ready) return D3DERR_INVALIDCALL;
+
+/* TODO: Implement flags:
+D3DXSPRITE_ALPHABLEND: enables alpha blending
+D3DXSPRITE_BILLBOARD: makes the sprite always face the camera
+D3DXSPRITE_DONOTMODIFY_RENDERSTATE: name says it all
+D3DXSPRITE_OBJECTSPACE: do not change device transforms
+D3DXSPRITE_SORT_DEPTH_BACKTOFRONT: sort by position
+D3DXSPRITE_SORT_DEPTH_FRONTTOBACK: sort by position
+D3DXSPRITE_SORT_TEXTURE: sort by texture (so that it doesn't change too often)
+*/
+ if(This->vdecl==NULL) {
+ static const D3DVERTEXELEMENT9 elements[] =
+ {
+ { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
+ { 0, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 },
+ { 0, 16, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
+ D3DDECL_END()
+ };
+ IDirect3DDevice9_CreateVertexDeclaration(This->device, elements, &This->vdecl);
+ }
+
+ if(!(flags & D3DXSPRITE_DONOTSAVESTATE)) {
+ if(This->stateblock==NULL) {
+ /* Tell our state block what it must store */
+ hr=IDirect3DDevice9_BeginStateBlock(This->device);
+ if(hr!=D3D_OK) return hr;
+
+ set_states(This);
+
+ IDirect3DDevice9_SetVertexDeclaration(This->device, This->vdecl);
+ IDirect3DDevice9_SetStreamSource(This->device, 0, NULL, 0, sizeof(SPRITEVERTEX));
+ IDirect3DDevice9_SetIndices(This->device, NULL);
+ IDirect3DDevice9_SetTexture(This->device, 0, NULL);
+
+ IDirect3DDevice9_EndStateBlock(This->device, &This->stateblock);
+ }
+ IDirect3DStateBlock9_Capture(This->stateblock); /* Save current state */
+ }
+
+ /* Apply device state */
+ set_states(This);
+
+ D3DXMatrixIdentity(&This->transform);
+ D3DXMatrixIdentity(&This->view);
+
+ This->flags=flags;
+ This->ready=TRUE;
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXSpriteImpl_Draw(LPD3DXSPRITE iface, LPDIRECT3DTEXTURE9 texture, CONST RECT *rect, CONST D3DXVECTOR3 *center,
+ CONST D3DXVECTOR3 *position, D3DCOLOR color)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ D3DSURFACE_DESC texdesc;
+ TRACE("(%p): relay\n", This);
+
+ if(texture==NULL) return D3DERR_INVALIDCALL;
+ if(!This->ready) return D3DERR_INVALIDCALL;
+
+ if(This->allocated_sprites==0) {
+ This->sprites=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 32*sizeof(SPRITE));
+ This->allocated_sprites=32;
+ } else if(This->allocated_sprites<=This->sprite_count) {
+ This->allocated_sprites=This->allocated_sprites*3/2;
+ This->sprites=HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->sprites, This->allocated_sprites*sizeof(SPRITE));
+ }
+ This->sprites[This->sprite_count].texture=texture;
+ if(!(This->flags & D3DXSPRITE_DO_NOT_ADDREF_TEXTURE))
+ IDirect3DTexture9_AddRef(texture);
+
+ /* Reuse the texture desc if possible */
+ if(This->sprite_count) {
+ if(This->sprites[This->sprite_count-1].texture!=texture) {
+ IDirect3DTexture9_GetLevelDesc(texture, 0, &texdesc);
+ } else {
+ texdesc.Width=This->sprites[This->sprite_count-1].texw;
+ texdesc.Height=This->sprites[This->sprite_count-1].texh;
+ }
+ } else IDirect3DTexture9_GetLevelDesc(texture, 0, &texdesc);
+
+ This->sprites[This->sprite_count].texw=texdesc.Width;
+ This->sprites[This->sprite_count].texh=texdesc.Height;
+
+ if(rect==NULL) {
+ This->sprites[This->sprite_count].rect.left=0;
+ This->sprites[This->sprite_count].rect.top=0;
+ This->sprites[This->sprite_count].rect.right=texdesc.Width;
+ This->sprites[This->sprite_count].rect.bottom=texdesc.Height;
+ } else This->sprites[This->sprite_count].rect=*rect;
+
+ if(center==NULL) {
+ This->sprites[This->sprite_count].center.x=0.0f;
+ This->sprites[This->sprite_count].center.y=0.0f;
+ This->sprites[This->sprite_count].center.z=0.0f;
+ } else This->sprites[This->sprite_count].center=*center;
+
+ if(position==NULL) {
+ This->sprites[This->sprite_count].pos.x=0.0f;
+ This->sprites[This->sprite_count].pos.y=0.0f;
+ This->sprites[This->sprite_count].pos.z=0.0f;
+ } else This->sprites[This->sprite_count].pos=*position;
+
+ This->sprites[This->sprite_count].color=color;
+ This->sprite_count++;
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXSpriteImpl_Flush(LPD3DXSPRITE iface)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ SPRITEVERTEX *vertices;
+ int i;
+ TRACE("(%p): relay\n", This);
+
+ if(!This->ready) return D3DERR_INVALIDCALL;
+ if(!This->sprite_count) return D3D_OK;
+
+/* TODO: use of a vertex buffer here */
+ vertices=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SPRITEVERTEX)*4*This->sprite_count);
+
+ for(i=0;isprite_count;i++) {
+ float spritewidth=(float)This->sprites[i].rect.right-(float)This->sprites[i].rect.left;
+ float spriteheight=(float)This->sprites[i].rect.bottom-(float)This->sprites[i].rect.top;
+
+ vertices[4*i ].pos.x = This->sprites[i].pos.x - This->sprites[i].center.x;
+ vertices[4*i ].pos.y = This->sprites[i].pos.y - This->sprites[i].center.y;
+ vertices[4*i ].pos.z = This->sprites[i].pos.z - This->sprites[i].center.z;
+ vertices[4*i+1].pos.x = spritewidth + This->sprites[i].pos.x - This->sprites[i].center.x;
+ vertices[4*i+1].pos.y = This->sprites[i].pos.y - This->sprites[i].center.y;
+ vertices[4*i+1].pos.z = This->sprites[i].pos.z - This->sprites[i].center.z;
+ vertices[4*i+2].pos.x = spritewidth + This->sprites[i].pos.x - This->sprites[i].center.x;
+ vertices[4*i+2].pos.y = spriteheight + This->sprites[i].pos.y - This->sprites[i].center.y;
+ vertices[4*i+2].pos.z = This->sprites[i].pos.z - This->sprites[i].center.z;
+ vertices[4*i+3].pos.x = This->sprites[i].pos.x - This->sprites[i].center.x;
+ vertices[4*i+3].pos.y = spriteheight + This->sprites[i].pos.y - This->sprites[i].center.y;
+ vertices[4*i+3].pos.z = This->sprites[i].pos.z - This->sprites[i].center.z;
+ vertices[4*i ].col = This->sprites[i].color;
+ vertices[4*i+1].col = This->sprites[i].color;
+ vertices[4*i+2].col = This->sprites[i].color;
+ vertices[4*i+3].col = This->sprites[i].color;
+ vertices[4*i ].tex.x = (float)This->sprites[i].rect.left / (float)This->sprites[i].texw;
+ vertices[4*i ].tex.y = (float)This->sprites[i].rect.top / (float)This->sprites[i].texh;
+ vertices[4*i+1].tex.x = (float)This->sprites[i].rect.right / (float)This->sprites[i].texw;
+ vertices[4*i+1].tex.y = (float)This->sprites[i].rect.top / (float)This->sprites[i].texh;
+ vertices[4*i+2].tex.x = (float)This->sprites[i].rect.right / (float)This->sprites[i].texw;
+ vertices[4*i+2].tex.y = (float)This->sprites[i].rect.bottom / (float)This->sprites[i].texh;
+ vertices[4*i+3].tex.x = (float)This->sprites[i].rect.left / (float)This->sprites[i].texw;
+ vertices[4*i+3].tex.y = (float)This->sprites[i].rect.bottom / (float)This->sprites[i].texh;
+ }
+
+ D3DXVec3TransformCoordArray(&vertices[0].pos, sizeof(SPRITEVERTEX), &vertices[0].pos, sizeof(SPRITEVERTEX), &This->transform, 4*This->sprite_count);
+ D3DXVec3TransformCoordArray(&vertices[0].pos, sizeof(SPRITEVERTEX), &vertices[0].pos, sizeof(SPRITEVERTEX), &This->view, 4*This->sprite_count);
+
+ IDirect3DDevice9_SetVertexDeclaration(This->device, This->vdecl);
+
+ for(i=0;isprite_count;i++) {
+ if(!i)
+ IDirect3DDevice9_SetTexture(This->device, 0, (LPDIRECT3DBASETEXTURE9)(This->sprites[i].texture));
+ else if(This->sprites[i].texture!=This->sprites[i-1].texture)
+ IDirect3DDevice9_SetTexture(This->device, 0, (LPDIRECT3DBASETEXTURE9)(This->sprites[i].texture));
+
+ IDirect3DDevice9_DrawPrimitiveUP(This->device, D3DPT_TRIANGLEFAN, 2, vertices+4*i, sizeof(SPRITEVERTEX));
+ }
+ HeapFree(GetProcessHeap(), 0, vertices);
+
+ if(!(This->flags & D3DXSPRITE_DO_NOT_ADDREF_TEXTURE))
+ for(i=0;isprite_count;i++)
+ IDirect3DTexture9_Release(This->sprites[i].texture);
+
+ This->sprite_count=0;
+
+ /* Flush may be called more than once, so we don't reset This->ready here */
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXSpriteImpl_End(LPD3DXSPRITE iface)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if(!This->ready) return D3DERR_INVALIDCALL;
+
+ ID3DXSprite_Flush(iface);
+
+ if(!(This->flags & D3DXSPRITE_DONOTSAVESTATE))
+ if(This->stateblock) IDirect3DStateBlock9_Apply(This->stateblock); /* Restore old state */
+
+ This->ready=FALSE;
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXSpriteImpl_OnLostDevice(LPD3DXSPRITE iface)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ TRACE("(%p)\n", This);
+
+ if(This->stateblock) IDirect3DStateBlock9_Release(This->stateblock);
+ if(This->vdecl) IDirect3DVertexDeclaration9_Release(This->vdecl);
+ This->vdecl=NULL;
+ This->stateblock=NULL;
+
+ /* Reset some variables */
+ ID3DXSprite_OnResetDevice(iface);
+
+ return D3D_OK;
+}
+
+static HRESULT WINAPI ID3DXSpriteImpl_OnResetDevice(LPD3DXSPRITE iface)
+{
+ ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ int i;
+
+ TRACE("(%p)\n", This);
+
+ for(i=0;isprite_count;i++)
+ if(This->sprites[i].texture)
+ IDirect3DTexture9_Release(This->sprites[i].texture);
+
+ This->sprite_count=0;
+
+ This->flags=0;
+ This->ready=FALSE;
+
+ /* keep matrices */
+ /* device objects get restored on Begin */
+
+ return D3D_OK;
+}
+
+static const ID3DXSpriteVtbl D3DXSprite_Vtbl =
+{
+ /*** IUnknown methods ***/
+ ID3DXSpriteImpl_QueryInterface,
+ ID3DXSpriteImpl_AddRef,
+ ID3DXSpriteImpl_Release,
+ /*** ID3DXSprite methods ***/
+ ID3DXSpriteImpl_GetDevice,
+ ID3DXSpriteImpl_GetTransform,
+ ID3DXSpriteImpl_SetTransform,
+ ID3DXSpriteImpl_SetWorldViewRH,
+ ID3DXSpriteImpl_SetWorldViewLH,
+ ID3DXSpriteImpl_Begin,
+ ID3DXSpriteImpl_Draw,
+ ID3DXSpriteImpl_Flush,
+ ID3DXSpriteImpl_End,
+ ID3DXSpriteImpl_OnLostDevice,
+ ID3DXSpriteImpl_OnResetDevice
+};
+
+HRESULT WINAPI D3DXCreateSprite(LPDIRECT3DDEVICE9 device, LPD3DXSPRITE *sprite)
+{
+ ID3DXSpriteImpl *object;
+ D3DCAPS9 caps;
+ TRACE("(void): relay\n");
+
+ if(device==NULL || sprite==NULL) return D3DERR_INVALIDCALL;
+
+ object=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXSpriteImpl));
+ if(object==NULL) {
+ *sprite=NULL;
+ return E_OUTOFMEMORY;
+ }
+ object->lpVtbl=&D3DXSprite_Vtbl;
+ object->ref=1;
+ object->device=device;
+ IUnknown_AddRef(device);
+
+ object->vdecl=NULL;
+ object->stateblock=NULL;
+
+ D3DXMatrixIdentity(&object->transform);
+ D3DXMatrixIdentity(&object->view);
+
+ IDirect3DDevice9_GetDeviceCaps(device, &caps);
+ object->texfilter_caps=caps.TextureFilterCaps;
+ object->maxanisotropy=caps.MaxAnisotropy;
+ object->alphacmp_caps=caps.AlphaCmpCaps;
+
+ ID3DXSprite_OnResetDevice((ID3DXSprite*)object);
+
+ object->sprites=NULL;
+ object->allocated_sprites=0;
+ *sprite=(ID3DXSprite*)object;
+
+ return D3D_OK;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_36/surface.c b/reactos/dll/directx/wine/d3dx9_36/surface.c
new file mode 100644
index 00000000000..0bee7c8cde9
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/surface.c
@@ -0,0 +1,427 @@
+/*
+ * Copyright (C) 2009 Tony Wasserka
+ *
+ * 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 "wine/debug.h"
+#include "wine/unicode.h"
+#include "d3dx9_36_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
+
+
+/************************************************************
+ * D3DXGetImageInfoFromFileInMemory
+ *
+ * Fills a D3DXIMAGE_INFO structure with info about an image
+ *
+ * PARAMS
+ * data [I] pointer to the image file data
+ * datasize [I] size of the passed data
+ * info [O] pointer to the destination structure
+ *
+ * RETURNS
+ * Success: D3D_OK, if info is not NULL and data and datasize make up a valid image file or
+ * if info is NULL and data and datasize are not NULL
+ * Failure: D3DXERR_INVALIDDATA, if data is no valid image file and datasize and info are not NULL
+ * D3DERR_INVALIDCALL, if data is NULL or
+ * if datasize is 0
+ *
+ * NOTES
+ * datasize may be bigger than the actual file size
+ *
+ */
+HRESULT WINAPI D3DXGetImageInfoFromFileInMemory(LPCVOID data, UINT datasize, D3DXIMAGE_INFO *info)
+{
+ FIXME("stub\n");
+
+ if(data && datasize && !info) return D3D_OK;
+ if( !data || !datasize ) return D3DERR_INVALIDCALL;
+
+ return E_NOTIMPL;
+}
+
+/************************************************************
+ * D3DXGetImageInfoFromFile
+ *
+ * RETURNS
+ * Success: D3D_OK, if we successfully load a valid image file or
+ * if we successfully load a file which is no valid image and info is NULL
+ * Failure: D3DXERR_INVALIDDATA, if we fail to load file or
+ * if file is not a valid image file and info is not NULL
+ * D3DERR_INVALIDCALL, if file is NULL
+ *
+ */
+HRESULT WINAPI D3DXGetImageInfoFromFileA(LPCSTR file, D3DXIMAGE_INFO *info)
+{
+ LPWSTR widename;
+ HRESULT hr;
+ int strlength;
+ TRACE("(void): relay\n");
+
+ if( !file ) return D3DERR_INVALIDCALL;
+
+ strlength = MultiByteToWideChar(CP_ACP, 0, file, -1, NULL, 0);
+ widename = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, strlength * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, file, -1, widename, strlength);
+
+ hr = D3DXGetImageInfoFromFileW(widename, info);
+ HeapFree(GetProcessHeap(), 0, widename);
+
+ return hr;
+}
+
+HRESULT WINAPI D3DXGetImageInfoFromFileW(LPCWSTR file, D3DXIMAGE_INFO *info)
+{
+ HRESULT hr;
+ DWORD size;
+ LPVOID buffer;
+ TRACE("(void): relay\n");
+
+ if( !file ) return D3DERR_INVALIDCALL;
+
+ hr = map_view_of_file(file, &buffer, &size);
+ if(FAILED(hr)) return D3DXERR_INVALIDDATA;
+
+ hr = D3DXGetImageInfoFromFileInMemory(buffer, size, info);
+ UnmapViewOfFile(buffer);
+
+ return hr;
+}
+
+/************************************************************
+ * D3DXGetImageInfoFromResource
+ *
+ * RETURNS
+ * Success: D3D_OK, if resource is a valid image file
+ * Failure: D3DXERR_INVALIDDATA, if resource is no valid image file or NULL or
+ * if we fail to load resource
+ *
+ */
+HRESULT WINAPI D3DXGetImageInfoFromResourceA(HMODULE module, LPCSTR resource, D3DXIMAGE_INFO *info)
+{
+ HRSRC resinfo;
+ TRACE("(void)\n");
+
+ resinfo = FindResourceA(module, resource, (LPCSTR)RT_RCDATA);
+ if(resinfo) {
+ LPVOID buffer;
+ HRESULT hr;
+ DWORD size;
+
+ hr = load_resource_into_memory(module, resinfo, &buffer, &size);
+ if(FAILED(hr)) return D3DXERR_INVALIDDATA;
+ return D3DXGetImageInfoFromFileInMemory(buffer, size, info);
+ }
+
+ resinfo = FindResourceA(module, resource, (LPCSTR)RT_BITMAP);
+ if(resinfo) {
+ FIXME("Implement loading bitmaps from resource type RT_BITMAP\n");
+ return E_NOTIMPL;
+ }
+ return D3DXERR_INVALIDDATA;
+}
+
+HRESULT WINAPI D3DXGetImageInfoFromResourceW(HMODULE module, LPCWSTR resource, D3DXIMAGE_INFO *info)
+{
+ HRSRC resinfo;
+ TRACE("(void)\n");
+
+ resinfo = FindResourceW(module, resource, (LPCWSTR)RT_RCDATA);
+ if(resinfo) {
+ LPVOID buffer;
+ HRESULT hr;
+ DWORD size;
+
+ hr = load_resource_into_memory(module, resinfo, &buffer, &size);
+ if(FAILED(hr)) return D3DXERR_INVALIDDATA;
+ return D3DXGetImageInfoFromFileInMemory(buffer, size, info);
+ }
+
+ resinfo = FindResourceW(module, resource, (LPCWSTR)RT_BITMAP);
+ if(resinfo) {
+ FIXME("Implement loading bitmaps from resource type RT_BITMAP\n");
+ return E_NOTIMPL;
+ }
+ return D3DXERR_INVALIDDATA;
+}
+
+/************************************************************
+ * D3DXLoadSurfaceFromFileInMemory
+ *
+ * Loads data from a given buffer into a surface and fills a given
+ * D3DXIMAGE_INFO structure with info about the source data.
+ *
+ * PARAMS
+ * pDestSurface [I] pointer to the surface
+ * pDestPalette [I] palette to use
+ * pDestRect [I] to be filled area of the surface
+ * pSrcData [I] pointer to the source data
+ * SrcDataSize [I] size of the source data in bytes
+ * pSrcRect [I] area of the source data to load
+ * dwFilter [I] filter to apply on stretching
+ * Colorkey [I] colorkey
+ * pSrcInfo [O] pointer to a D3DXIMAGE_INFO structure
+ *
+ * RETURNS
+ * Success: D3D_OK
+ * Failure: D3DERR_INVALIDCALL, if pDestSurface or pSrcData or SrcDataSize are NULL
+ * D3DXERR_INVALIDDATA, if pSrcData is no valid image file
+ *
+ */
+HRESULT WINAPI D3DXLoadSurfaceFromFileInMemory(LPDIRECT3DSURFACE9 pDestSurface,
+ CONST PALETTEENTRY *pDestPalette,
+ CONST RECT *pDestRect,
+ LPCVOID pSrcData,
+ UINT SrcDataSize,
+ CONST RECT *pSrcRect,
+ DWORD dwFilter,
+ D3DCOLOR Colorkey,
+ D3DXIMAGE_INFO *pSrcInfo)
+{
+ FIXME("stub\n");
+ if( !pDestSurface || !pSrcData | !SrcDataSize ) return D3DERR_INVALIDCALL;
+ return E_NOTIMPL;
+}
+
+/************************************************************
+ * D3DXLoadSurfaceFromFile
+ */
+HRESULT WINAPI D3DXLoadSurfaceFromFileA(LPDIRECT3DSURFACE9 pDestSurface,
+ CONST PALETTEENTRY *pDestPalette,
+ CONST RECT *pDestRect,
+ LPCSTR pSrcFile,
+ CONST RECT *pSrcRect,
+ DWORD dwFilter,
+ D3DCOLOR Colorkey,
+ D3DXIMAGE_INFO *pSrcInfo)
+{
+ LPWSTR pWidename;
+ HRESULT hr;
+ int strlength;
+ TRACE("(void): relay\n");
+
+ if( !pSrcFile || !pDestSurface ) return D3DERR_INVALIDCALL;
+
+ strlength = MultiByteToWideChar(CP_ACP, 0, pSrcFile, -1, NULL, 0);
+ pWidename = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, strlength * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, pSrcFile, -1, pWidename, strlength);
+
+ hr = D3DXLoadSurfaceFromFileW(pDestSurface, pDestPalette, pDestRect, pWidename, pSrcRect, dwFilter, Colorkey, pSrcInfo);
+ HeapFree(GetProcessHeap(), 0, pWidename);
+
+ return hr;
+}
+
+HRESULT WINAPI D3DXLoadSurfaceFromFileW(LPDIRECT3DSURFACE9 pDestSurface,
+ CONST PALETTEENTRY *pDestPalette,
+ CONST RECT *pDestRect,
+ LPCWSTR pSrcFile,
+ CONST RECT *pSrcRect,
+ DWORD Filter,
+ D3DCOLOR Colorkey,
+ D3DXIMAGE_INFO *pSrcInfo)
+{
+ HRESULT hr;
+ DWORD dwSize;
+ LPVOID pBuffer;
+ TRACE("(void): relay\n");
+
+ if( !pSrcFile || !pDestSurface ) return D3DERR_INVALIDCALL;
+
+ hr = map_view_of_file(pSrcFile, &pBuffer, &dwSize);
+ if(FAILED(hr)) return D3DXERR_INVALIDDATA;
+
+ hr = D3DXLoadSurfaceFromFileInMemory(pDestSurface, pDestPalette, pDestRect, pBuffer, dwSize, pSrcRect, Filter, Colorkey, pSrcInfo);
+ UnmapViewOfFile(pBuffer);
+
+ return hr;
+}
+
+/************************************************************
+ * D3DXLoadSurfaceFromResource
+ */
+HRESULT WINAPI D3DXLoadSurfaceFromResourceA(LPDIRECT3DSURFACE9 pDestSurface,
+ CONST PALETTEENTRY *pDestPalette,
+ CONST RECT *pDestRect,
+ HMODULE hSrcModule,
+ LPCSTR pResource,
+ CONST RECT *pSrcRect,
+ DWORD dwFilter,
+ D3DCOLOR Colorkey,
+ D3DXIMAGE_INFO *pSrcInfo)
+{
+ HRSRC hResInfo;
+ TRACE("(void): relay\n");
+
+ if( !pDestSurface ) return D3DERR_INVALIDCALL;
+
+ hResInfo = FindResourceA(hSrcModule, pResource, (LPCSTR)RT_RCDATA);
+ if(hResInfo) {
+ LPVOID pBuffer;
+ HRESULT hr;
+ DWORD dwSize;
+
+ hr = load_resource_into_memory(hSrcModule, hResInfo, &pBuffer, &dwSize);
+ if(FAILED(hr)) return D3DXERR_INVALIDDATA;
+ return D3DXLoadSurfaceFromFileInMemory(pDestSurface, pDestPalette, pDestRect, pBuffer, dwSize, pSrcRect, dwFilter, Colorkey, pSrcInfo);
+ }
+
+ hResInfo = FindResourceA(hSrcModule, pResource, (LPCSTR)RT_BITMAP);
+ if(hResInfo) {
+ FIXME("Implement loading bitmaps from resource type RT_BITMAP\n");
+ return E_NOTIMPL;
+ }
+ return D3DXERR_INVALIDDATA;
+}
+
+HRESULT WINAPI D3DXLoadSurfaceFromResourceW(LPDIRECT3DSURFACE9 pDestSurface,
+ CONST PALETTEENTRY *pDestPalette,
+ CONST RECT *pDestRect,
+ HMODULE hSrcModule,
+ LPCWSTR pResource,
+ CONST RECT *pSrcRect,
+ DWORD dwFilter,
+ D3DCOLOR Colorkey,
+ D3DXIMAGE_INFO *pSrcInfo)
+{
+ HRSRC hResInfo;
+ TRACE("(void): relay\n");
+
+ if( !pDestSurface ) return D3DERR_INVALIDCALL;
+
+ hResInfo = FindResourceW(hSrcModule, pResource, (LPCWSTR)RT_RCDATA);
+ if(hResInfo) {
+ LPVOID pBuffer;
+ HRESULT hr;
+ DWORD dwSize;
+
+ hr = load_resource_into_memory(hSrcModule, hResInfo, &pBuffer, &dwSize);
+ if(FAILED(hr)) return D3DXERR_INVALIDDATA;
+ return D3DXLoadSurfaceFromFileInMemory(pDestSurface, pDestPalette, pDestRect, pBuffer, dwSize, pSrcRect, dwFilter, Colorkey, pSrcInfo);
+ }
+
+ hResInfo = FindResourceW(hSrcModule, pResource, (LPCWSTR)RT_BITMAP);
+ if(hResInfo) {
+ FIXME("Implement loading bitmaps from resource type RT_BITMAP\n");
+ return E_NOTIMPL;
+ }
+ return D3DXERR_INVALIDDATA;
+}
+
+/************************************************************
+ * D3DXLoadSurfaceFromMemory
+ *
+ * Loads data from a given memory chunk into a surface,
+ * applying any of the specified filters.
+ *
+ * PARAMS
+ * pDestSurface [I] pointer to the surface
+ * pDestPalette [I] palette to use
+ * pDestRect [I] to be filled area of the surface
+ * pSrcMemory [I] pointer to the source data
+ * SrcFormat [I] format of the source pixel data
+ * SrcPitch [I] number of bytes in a row
+ * pSrcPalette [I] palette used in the source image
+ * pSrcRect [I] area of the source data to load
+ * dwFilter [I] filter to apply on stretching
+ * Colorkey [I] colorkey
+ *
+ * RETURNS
+ * Success: D3D_OK, if we successfully load the pixel data into our surface or
+ * if pSrcMemory is NULL but the other parameters are valid
+ * Failure: D3DERR_INVALIDCALL, if pDestSurface, SrcPitch or pSrcRect are NULL or
+ * if SrcFormat is an invalid format (other than D3DFMT_UNKNOWN)
+ * D3DXERR_INVALIDDATA, if we fail to lock pDestSurface
+ * E_FAIL, if SrcFormat is D3DFMT_UNKNOWN or the dimensions of pSrcRect are invalid
+ *
+ * NOTES
+ * pSrcRect specifies the dimensions of the source data
+ *
+ */
+HRESULT WINAPI D3DXLoadSurfaceFromMemory(LPDIRECT3DSURFACE9 pDestSurface,
+ CONST PALETTEENTRY *pDestPalette,
+ CONST RECT *pDestRect,
+ LPCVOID pSrcMemory,
+ D3DFORMAT SrcFormat,
+ UINT SrcPitch,
+ CONST PALETTEENTRY *pSrcPalette,
+ CONST RECT *pSrcRect,
+ DWORD dwFilter,
+ D3DCOLOR Colorkey)
+{
+ TRACE("stub\n");
+
+ if( !pDestSurface || !pSrcMemory || !pSrcRect ) return D3DERR_INVALIDCALL;
+ if(SrcFormat == D3DFMT_UNKNOWN || pSrcRect->left >= pSrcRect->right || pSrcRect->top >= pSrcRect->bottom) return E_FAIL;
+ return E_NOTIMPL;
+}
+
+/************************************************************
+ * D3DXLoadSurfaceFromSurface
+ *
+ * Copies the contents from one surface to another, performing any required
+ * format conversion, resizing or filtering.
+ *
+ * PARAMS
+ * pDestSurface [I] pointer to the destination surface
+ * pDestPalette [I] palette to use
+ * pDestRect [I] to be filled area of the surface
+ * pSrcSurface [I] pointer to the source surface
+ * pSrcPalette [I] palette used for the source surface
+ * pSrcRect [I] area of the source data to load
+ * dwFilter [I] filter to apply on resizing
+ * Colorkey [I] any ARGB value or 0 to disable color-keying
+ *
+ * RETURNS
+ * Success: D3D_OK
+ * Failure: D3DERR_INVALIDCALL, if pDestSurface or pSrcSurface are NULL
+ * D3DXERR_INVALIDDATA, if one of the surfaces is not lockable
+ *
+ */
+HRESULT WINAPI D3DXLoadSurfaceFromSurface(LPDIRECT3DSURFACE9 pDestSurface,
+ CONST PALETTEENTRY *pDestPalette,
+ CONST RECT *pDestRect,
+ LPDIRECT3DSURFACE9 pSrcSurface,
+ CONST PALETTEENTRY *pSrcPalette,
+ CONST RECT *pSrcRect,
+ DWORD dwFilter,
+ D3DCOLOR Colorkey)
+{
+ RECT rect;
+ D3DLOCKED_RECT lock;
+ D3DSURFACE_DESC SrcDesc;
+ HRESULT hr;
+ TRACE("(void): relay\n");
+
+ if( !pDestSurface || !pSrcSurface ) return D3DERR_INVALIDCALL;
+
+ IDirect3DSurface9_GetDesc(pSrcSurface, &SrcDesc);
+
+ if( !pSrcRect ) SetRect(&rect, 0, 0, SrcDesc.Width, SrcDesc.Height);
+ else rect = *pSrcRect;
+
+ hr = IDirect3DSurface9_LockRect(pSrcSurface, &lock, NULL, D3DLOCK_READONLY);
+ if(FAILED(hr)) return D3DXERR_INVALIDDATA;
+
+ hr = D3DXLoadSurfaceFromMemory(pDestSurface, pDestPalette, pDestRect,
+ lock.pBits, SrcDesc.Format, lock.Pitch,
+ pSrcPalette, &rect, dwFilter, Colorkey);
+
+ IDirect3DSurface9_UnlockRect(pSrcSurface);
+ return hr;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_36/util.c b/reactos/dll/directx/wine/d3dx9_36/util.c
new file mode 100644
index 00000000000..ff41ee718b1
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/util.c
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2009 Tony Wasserka
+ *
+ * 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 "wine/debug.h"
+#include "d3dx9_36_private.h"
+
+/************************************************************
+ * map_view_of_file
+ *
+ * Loads a file into buffer and stores the number of read bytes in length.
+ *
+ * PARAMS
+ * filename [I] name of the file to be loaded
+ * buffer [O] pointer to destination buffer
+ * length [O] size of the obtained data
+ *
+ * RETURNS
+ * Success: D3D_OK
+ * Failure:
+ * see error codes for CreateFileW, GetFileSize, CreateFileMapping and MapViewOfFile
+ *
+ * NOTES
+ * The caller must UnmapViewOfFile when it doesn't need the data anymore
+ *
+ */
+HRESULT map_view_of_file(LPCWSTR filename, LPVOID *buffer, DWORD *length)
+{
+ HANDLE hfile, hmapping = NULL;
+
+ hfile = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
+ if(hfile == INVALID_HANDLE_VALUE) goto error;
+
+ *length = GetFileSize(hfile, NULL);
+ if(*length == INVALID_FILE_SIZE) goto error;
+
+ hmapping = CreateFileMappingW(hfile, NULL, PAGE_READONLY, 0, 0, NULL);
+ if(!hmapping) goto error;
+
+ *buffer = MapViewOfFile(hmapping, FILE_MAP_READ, 0, 0, 0);
+ if(*buffer == NULL) goto error;
+
+ CloseHandle(hmapping);
+ CloseHandle(hfile);
+
+ return S_OK;
+
+error:
+ CloseHandle(hmapping);
+ CloseHandle(hfile);
+ return HRESULT_FROM_WIN32(GetLastError());
+}
+
+/************************************************************
+ * load_resource_into_memory
+ *
+ * Loads a resource into buffer and stores the number of
+ * read bytes in length.
+ *
+ * PARAMS
+ * module [I] handle to the module
+ * resinfo [I] handle to the resource's information block
+ * buffer [O] pointer to destination buffer
+ * length [O] size of the obtained data
+ *
+ * RETURNS
+ * Success: D3D_OK
+ * Failure:
+ * See error codes for SizeofResource, LoadResource and LockResource
+ *
+ * NOTES
+ * The memory doesn't need to be freed by the caller manually
+ *
+ */
+HRESULT load_resource_into_memory(HMODULE module, HRSRC resinfo, LPVOID *buffer, DWORD *length)
+{
+ HGLOBAL resource;
+
+ *length = SizeofResource(module, resinfo);
+ if(*length == 0) return HRESULT_FROM_WIN32(GetLastError());
+
+ resource = LoadResource(module, resinfo);
+ if( !resource ) return HRESULT_FROM_WIN32(GetLastError());
+
+ *buffer = LockResource(resource);
+ if(*buffer == NULL) return HRESULT_FROM_WIN32(GetLastError());
+
+ return S_OK;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_36/version.rc b/reactos/dll/directx/wine/d3dx9_36/version.rc
new file mode 100644
index 00000000000..8ca195d5c66
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_36/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,19,949,2111
+#define WINE_FILEVERSION_STR "9.19.949.2111"
+#define WINE_PRODUCTVERSION 9,19,949,2111
+#define WINE_PRODUCTVERSION_STR "9.19.949.2111"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_37/d3dx9_37.rbuild b/reactos/dll/directx/wine/d3dx9_37/d3dx9_37.rbuild
new file mode 100644
index 00000000000..56a701bd5d4
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_37/d3dx9_37.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_37_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_37/d3dx9_37.spec b/reactos/dll/directx/wine/d3dx9_37/d3dx9_37.spec
new file mode 100644
index 00000000000..bdd1c73fdcc
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_37/d3dx9_37.spec
@@ -0,0 +1,336 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateFragmentLinkerEx(ptr long long ptr) d3dx9_36.D3DXCreateFragmentLinkerEx
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderConstantTableEx(ptr long ptr) d3dx9_36.D3DXGetShaderConstantTableEx
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx9_36.D3DXSHMultiply2
+@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx9_36.D3DXSHMultiply3
+@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx9_36.D3DXSHMultiply4
+@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx9_36.D3DXSHMultiply5
+@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx9_36.D3DXSHMultiply6
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_37/d3dx9_37_main.c b/reactos/dll/directx/wine/d3dx9_37/d3dx9_37_main.c
new file mode 100644
index 00000000000..21700098a23
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_37/d3dx9_37_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==37)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_37/version.rc b/reactos/dll/directx/wine/d3dx9_37/version.rc
new file mode 100644
index 00000000000..aeb99d2cf9c
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_37/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,22,949,2248
+#define WINE_FILEVERSION_STR "9.22.949.2248"
+#define WINE_PRODUCTVERSION 9,22,949,2248
+#define WINE_PRODUCTVERSION_STR "9.22.949.2248"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_38/d3dx9_38.rbuild b/reactos/dll/directx/wine/d3dx9_38/d3dx9_38.rbuild
new file mode 100644
index 00000000000..1bf726c9928
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_38/d3dx9_38.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_38_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_38/d3dx9_38.spec b/reactos/dll/directx/wine/d3dx9_38/d3dx9_38.spec
new file mode 100644
index 00000000000..bdd1c73fdcc
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_38/d3dx9_38.spec
@@ -0,0 +1,336 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateFragmentLinkerEx(ptr long long ptr) d3dx9_36.D3DXCreateFragmentLinkerEx
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderConstantTableEx(ptr long ptr) d3dx9_36.D3DXGetShaderConstantTableEx
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx9_36.D3DXSHMultiply2
+@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx9_36.D3DXSHMultiply3
+@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx9_36.D3DXSHMultiply4
+@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx9_36.D3DXSHMultiply5
+@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx9_36.D3DXSHMultiply6
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_38/d3dx9_38_main.c b/reactos/dll/directx/wine/d3dx9_38/d3dx9_38_main.c
new file mode 100644
index 00000000000..5165ad66b33
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_38/d3dx9_38_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==38)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_38/version.rc b/reactos/dll/directx/wine/d3dx9_38/version.rc
new file mode 100644
index 00000000000..a8fdca8e3bc
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_38/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,23,949,2378
+#define WINE_FILEVERSION_STR "9.23.949.2378"
+#define WINE_PRODUCTVERSION 9,23,949,2378
+#define WINE_PRODUCTVERSION_STR "9.23.949.2378"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_39/d3dx9_39.rbuild b/reactos/dll/directx/wine/d3dx9_39/d3dx9_39.rbuild
new file mode 100644
index 00000000000..2b16c77c65e
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_39/d3dx9_39.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_39_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_39/d3dx9_39.spec b/reactos/dll/directx/wine/d3dx9_39/d3dx9_39.spec
new file mode 100644
index 00000000000..bdd1c73fdcc
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_39/d3dx9_39.spec
@@ -0,0 +1,336 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateFragmentLinkerEx(ptr long long ptr) d3dx9_36.D3DXCreateFragmentLinkerEx
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderConstantTableEx(ptr long ptr) d3dx9_36.D3DXGetShaderConstantTableEx
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx9_36.D3DXSHMultiply2
+@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx9_36.D3DXSHMultiply3
+@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx9_36.D3DXSHMultiply4
+@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx9_36.D3DXSHMultiply5
+@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx9_36.D3DXSHMultiply6
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_39/d3dx9_39_main.c b/reactos/dll/directx/wine/d3dx9_39/d3dx9_39_main.c
new file mode 100644
index 00000000000..2386be79485
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_39/d3dx9_39_main.c
@@ -0,0 +1,62 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==39)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_39/version.rc b/reactos/dll/directx/wine/d3dx9_39/version.rc
new file mode 100644
index 00000000000..234dcb9149c
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_39/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,24,949,2307
+#define WINE_FILEVERSION_STR "9.24.949.2307"
+#define WINE_PRODUCTVERSION 9,24,949,2307
+#define WINE_PRODUCTVERSION_STR "9.24.949.2307"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_40/d3dx9_40.rbuild b/reactos/dll/directx/wine/d3dx9_40/d3dx9_40.rbuild
new file mode 100644
index 00000000000..f6bb05dd6c4
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_40/d3dx9_40.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_40_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_40/d3dx9_40.spec b/reactos/dll/directx/wine/d3dx9_40/d3dx9_40.spec
new file mode 100644
index 00000000000..bdd1c73fdcc
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_40/d3dx9_40.spec
@@ -0,0 +1,336 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateFragmentLinkerEx(ptr long long ptr) d3dx9_36.D3DXCreateFragmentLinkerEx
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderConstantTableEx(ptr long ptr) d3dx9_36.D3DXGetShaderConstantTableEx
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx9_36.D3DXSHMultiply2
+@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx9_36.D3DXSHMultiply3
+@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx9_36.D3DXSHMultiply4
+@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx9_36.D3DXSHMultiply5
+@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx9_36.D3DXSHMultiply6
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_40/d3dx9_40_main.c b/reactos/dll/directx/wine/d3dx9_40/d3dx9_40_main.c
new file mode 100644
index 00000000000..f603db927a2
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_40/d3dx9_40_main.c
@@ -0,0 +1,63 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ * Copyright (C) 2009 Rico Schüller
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==40)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_40/version.rc b/reactos/dll/directx/wine/d3dx9_40/version.rc
new file mode 100644
index 00000000000..f951079abd0
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_40/version.rc
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2008 Louis Lenders
+ * Copyright 2009 Rico Schüller
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,24,950,2656
+#define WINE_FILEVERSION_STR "9.24.950.2656"
+#define WINE_PRODUCTVERSION 9,24,950,2656
+#define WINE_PRODUCTVERSION_STR "9.24.950.2656"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/d3dx9_41/d3dx9_41.rbuild b/reactos/dll/directx/wine/d3dx9_41/d3dx9_41.rbuild
new file mode 100644
index 00000000000..386bc8b8fe9
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_41/d3dx9_41.rbuild
@@ -0,0 +1,20 @@
+
+
+
+
+ .
+ include/reactos/wine
+
+
+ d3d9
+ wine
+ user32
+ gdi32
+ advapi32
+ wined3d
+
+ d3dx9_41_main.c
+ version.rc
+
+ wineheaders
+
diff --git a/reactos/dll/directx/wine/d3dx9_41/d3dx9_41.spec b/reactos/dll/directx/wine/d3dx9_41/d3dx9_41.spec
new file mode 100644
index 00000000000..bdd1c73fdcc
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_41/d3dx9_41.spec
@@ -0,0 +1,336 @@
+@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader
+@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA
+@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW
+@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA
+@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW
+@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe
+@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements
+@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements
+@ stdcall D3DXCheckVersion(long long)
+@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements
+@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh
+@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast
+@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader
+@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA
+@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW
+@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA
+@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW
+@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox
+@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere
+@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal
+@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal
+@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal
+@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture
+@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap
+@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals
+@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent
+@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame
+@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx
+@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
+@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
+@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
+@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
+@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
+@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
+@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet
+@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture
+@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA
+@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW
+@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory
+@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW
+@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
+@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA
+@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW
+@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW
+@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder
+@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect
+@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler
+@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA
+@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW
+@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA
+@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW
+@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx
+@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA
+@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA
+@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW
+@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW
+@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA
+@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA
+@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW
+@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW
+@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool
+@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA
+@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA
+@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW
+@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW
+@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker
+@ stdcall D3DXCreateFragmentLinkerEx(ptr long long ptr) d3dx9_36.D3DXCreateFragmentLinkerEx
+@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet
+@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine
+@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack
+@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh
+@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF
+@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh
+@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream
+@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh
+@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon
+@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer
+@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex
+@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer
+@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine
+@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap
+@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface
+@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh
+@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo
+@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh
+@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF
+@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere
+@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite
+@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot
+@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA
+@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture
+@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA
+@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA
+@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW
+@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory
+@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx
+@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW
+@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA
+@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA
+@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW
+@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW
+@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper
+@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader
+@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus
+@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture
+@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA
+@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW
+@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory
+@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW
+@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA
+@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA
+@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW
+@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW
+@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute
+@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF
+@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect
+@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader
+@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate
+@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture
+@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX
+@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture
+@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX
+@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture
+@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX
+@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment
+@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array
+@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array
+@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild
+@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere
+@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy
+@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind
+@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices
+@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices
+@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm
+@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator
+@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments
+@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA
+@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW
+@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA
+@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW
+@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl
+@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh
+@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength
+@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize
+@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel
+@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize
+@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA
+@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory
+@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW
+@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA
+@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW
+@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile
+@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable
+@ stdcall D3DXGetShaderConstantTableEx(ptr long ptr) d3dx9_36.D3DXGetShaderConstantTableEx
+@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics
+@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics
+@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
+@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
+@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
+@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
+@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
+@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
+@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri
+@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA
+@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory
+@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource
+@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW
+@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof
+@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA
+@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory
+@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW
+@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof
+@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA
+@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW
+@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA
+@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW
+@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof
+@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA
+@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory
+@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW
+@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
+@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
+@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
+@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
+@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory
+@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA
+@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW
+@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume
+@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation
+@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D
+@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose
+@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant
+@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse
+@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH
+@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH
+@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply
+@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose
+@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH
+@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH
+@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH
+@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH
+@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH
+@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH
+@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH
+@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH
+@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH
+@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH
+@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect
+@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis
+@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion
+@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX
+@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY
+@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll
+@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ
+@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling
+@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow
+@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation
+@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D
+@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation
+@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces
+@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices
+@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal
+@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints
+@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine
+@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize
+@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform
+@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray
+@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader
+@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA
+@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW
+@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA
+@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW
+@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric
+@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp
+@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse
+@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn
+@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply
+@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize
+@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis
+@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix
+@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll
+@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp
+@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad
+@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup
+@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle
+@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize
+@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA
+@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW
+@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA
+@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW
+@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA
+@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW
+@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA
+@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW
+@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA
+@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory
+@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW
+@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA
+@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory
+@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW
+@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA
+@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory
+@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW
+@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd
+@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot
+@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight
+@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection
+@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight
+@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight
+@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight
+@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx9_36.D3DXSHMultiply2
+@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx9_36.D3DXSHMultiply3
+@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx9_36.D3DXSHMultiply4
+@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx9_36.D3DXSHMultiply5
+@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx9_36.D3DXSHMultiply6
+@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap
+@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC
+@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster
+@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate
+@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ
+@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale
+@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh
+@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe
+@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh
+@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches
+@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch
+@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch
+@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize
+@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate
+@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack
+@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition
+@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh
+@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh
+@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric
+@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom
+@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite
+@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize
+@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform
+@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray
+@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord
+@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray
+@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal
+@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray
+@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric
+@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom
+@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite
+@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize
+@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project
+@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray
+@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform
+@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray
+@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord
+@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray
+@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal
+@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray
+@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject
+@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray
+@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric
+@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom
+@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross
+@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite
+@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize
+@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform
+@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray
+@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices
diff --git a/reactos/dll/directx/wine/d3dx9_41/d3dx9_41_main.c b/reactos/dll/directx/wine/d3dx9_41/d3dx9_41_main.c
new file mode 100644
index 00000000000..51a92c5ade2
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_41/d3dx9_41_main.c
@@ -0,0 +1,63 @@
+/*
+ * Direct3D X 9 main file
+ *
+ * Copyright (C) 2007 David Adam
+ * Copyright (C) 2009 Rico Schüller
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+#include "d3dx9.h"
+
+/***********************************************************************
+ * DllMain.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+ switch(reason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(inst);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ * D3DXCheckVersion
+ * Checks whether we are compiling against the correct d3d and d3dx library.
+ */
+BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers)
+{
+ if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==41)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/reactos/dll/directx/wine/d3dx9_41/version.rc b/reactos/dll/directx/wine/d3dx9_41/version.rc
new file mode 100644
index 00000000000..6db7842c738
--- /dev/null
+++ b/reactos/dll/directx/wine/d3dx9_41/version.rc
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2008 Louis Lenders
+ * Copyright 2009 Rico Schüller
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine D3DX9"
+#define WINE_FILENAME_STR "d3dx9.dll"
+#define WINE_FILEVERSION 9,26,952,2844
+#define WINE_FILEVERSION_STR "9.26.952.2844"
+#define WINE_PRODUCTVERSION 9,26,952,2844
+#define WINE_PRODUCTVERSION_STR "9.26.952.2844"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/directx/wine/ddraw/ddraw.c b/reactos/dll/directx/wine/ddraw/ddraw.c
index 7011afa4004..0d1b6dda237 100644
--- a/reactos/dll/directx/wine/ddraw/ddraw.c
+++ b/reactos/dll/directx/wine/ddraw/ddraw.c
@@ -816,7 +816,7 @@ IDirectDrawImpl_GetDisplayMode(IDirectDraw7 *iface,
EnterCriticalSection(&ddraw_cs);
/* This seems sane */
- if(!DDSD)
+ if (!DDSD)
{
LeaveCriticalSection(&ddraw_cs);
return DDERR_INVALIDPARAMS;
@@ -841,7 +841,7 @@ IDirectDrawImpl_GetDisplayMode(IDirectDraw7 *iface,
DDSD->dwSize = Size;
DDSD->dwFlags |= DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_PITCH | DDSD_REFRESHRATE;
DDSD->dwWidth = Mode.Width;
- DDSD->dwHeight = Mode.Height;
+ DDSD->dwHeight = Mode.Height;
DDSD->u2.dwRefreshRate = 60;
DDSD->ddsCaps.dwCaps = 0;
DDSD->u4.ddpfPixelFormat.dwSize = sizeof(DDSD->u4.ddpfPixelFormat);
@@ -1101,7 +1101,7 @@ IDirectDrawImpl_FlipToGDISurface(IDirectDraw7 *iface)
* Returns:
* Always returns DD_OK
*
- *****************************************************************************/
+ *****************************************************************************/
static HRESULT WINAPI
IDirectDrawImpl_WaitForVerticalBlank(IDirectDraw7 *iface,
DWORD Flags,
@@ -1135,7 +1135,7 @@ IDirectDrawImpl_WaitForVerticalBlank(IDirectDraw7 *iface,
* Returns:
* Always returns DD_OK
*
- *****************************************************************************/
+ *****************************************************************************/
static HRESULT WINAPI IDirectDrawImpl_GetScanLine(IDirectDraw7 *iface, DWORD *Scanline)
{
IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
@@ -1155,7 +1155,7 @@ static HRESULT WINAPI IDirectDrawImpl_GetScanLine(IDirectDraw7 *iface, DWORD *Sc
&Mode);
/* Fake the line sweeping of the monitor */
- /* FIXME: We should synchronize with a source to keep the refresh rate */
+ /* FIXME: We should synchronize with a source to keep the refresh rate */
*Scanline = This->cur_scanline++;
/* Assume 20 scan lines in the vertical blank */
if (This->cur_scanline >= Mode.Height + 20)
@@ -1176,7 +1176,7 @@ static HRESULT WINAPI IDirectDrawImpl_GetScanLine(IDirectDraw7 *iface, DWORD *Sc
* DDERR_NOEXCLUSIVEMODE or DDERR_EXCLUSIVEMODEALREADYSET
* if the state is not correct(See below)
*
- *****************************************************************************/
+ *****************************************************************************/
static HRESULT WINAPI
IDirectDrawImpl_TestCooperativeLevel(IDirectDraw7 *iface)
{
@@ -1187,8 +1187,8 @@ IDirectDrawImpl_TestCooperativeLevel(IDirectDraw7 *iface)
EnterCriticalSection(&ddraw_cs);
/* Description from MSDN:
* For fullscreen apps return DDERR_NOEXCLUSIVEMODE if the user switched
- * away from the app with e.g. alt-tab. Windowed apps receive
- * DDERR_EXCLUSIVEMODEALREADYSET if another application created a
+ * away from the app with e.g. alt-tab. Windowed apps receive
+ * DDERR_EXCLUSIVEMODEALREADYSET if another application created a
* DirectDraw object in exclusive mode. DDERR_WRONGMODE is returned,
* when the video mode has changed
*/
@@ -1243,7 +1243,7 @@ IDirectDrawImpl_TestCooperativeLevel(IDirectDraw7 *iface)
* DD_OK if the surface was found
* DDERR_NOTFOUND if the GDI surface wasn't found
*
- *****************************************************************************/
+ *****************************************************************************/
static HRESULT WINAPI
IDirectDrawImpl_GetGDISurface(IDirectDraw7 *iface,
IDirectDrawSurface7 **GDISurface)
@@ -1311,7 +1311,7 @@ IDirectDrawImpl_GetGDISurface(IDirectDraw7 *iface,
* DD_OK on success
* DDERR_INVALIDPARAMS if the callback wasn't set
*
- *****************************************************************************/
+ *****************************************************************************/
static HRESULT WINAPI
IDirectDrawImpl_EnumDisplayModes(IDirectDraw7 *iface,
DWORD Flags,
@@ -1664,10 +1664,8 @@ IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf,
WINED3DSURFACE_DESC Desc;
WINED3DFORMAT Format;
- WINED3DRESOURCETYPE Type;
DWORD Usage;
WINED3DPOOL Pool;
- UINT Size;
WINED3DMULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality;
@@ -1702,19 +1700,17 @@ IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf,
IWineD3DSurface_GetClipper(wineD3DSurface, &clipper);
/* Get the surface properties */
- Desc.Format = &Format;
- Desc.Type = &Type;
- Desc.Usage = &Usage;
- Desc.Pool = &Pool;
- Desc.Size = &Size;
- Desc.MultiSampleType = &MultiSampleType;
- Desc.MultiSampleQuality = &MultiSampleQuality;
- Desc.Width = &Width;
- Desc.Height = &Height;
-
hr = IWineD3DSurface_GetDesc(wineD3DSurface, &Desc);
if(hr != D3D_OK) return hr;
+ Format = Desc.format;
+ Usage = Desc.usage;
+ Pool = Desc.pool;
+ MultiSampleType = Desc.multisample_type;
+ MultiSampleQuality = Desc.multisample_quality;
+ Width = Desc.width;
+ Height = Desc.height;
+
if(swapchain) {
/* If there's a swapchain, it owns the IParent interface. Create a new one for the
* new surface
@@ -1729,7 +1725,7 @@ IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf,
/* Create the new surface */
hr = IWineD3DDevice_CreateSurface(This->wineD3DDevice, Width, Height, Format,
TRUE /* Lockable */, FALSE /* Discard */, surfImpl->mipmap_level, &surfImpl->WineD3DSurface,
- Type, Usage, Pool, MultiSampleType, MultiSampleQuality, This->ImplType, Parent);
+ Usage, Pool, MultiSampleType, MultiSampleQuality, This->ImplType, Parent);
if(hr != D3D_OK)
return hr;
@@ -1840,9 +1836,8 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This,
UINT level)
{
HRESULT hr;
- UINT Width = 0, Height = 0;
+ UINT Width, Height;
WINED3DFORMAT Format = WINED3DFMT_UNKNOWN;
- WINED3DRESOURCETYPE ResType = WINED3DRTYPE_SURFACE;
DWORD Usage = 0;
WINED3DSURFTYPE ImplType = This->ImplType;
WINED3DSURFACE_DESC Desc;
@@ -1850,12 +1845,6 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This,
IParentImpl *parImpl = NULL;
WINED3DPOOL Pool = WINED3DPOOL_DEFAULT;
- /* Dummies for GetDesc */
- WINED3DPOOL dummy_d3dpool;
- WINED3DMULTISAMPLE_TYPE dummy_mst;
- UINT dummy_uint;
- DWORD dummy_dword;
-
if (TRACE_ON(ddraw))
{
TRACE(" (%p) Requesting surface desc :\n", This);
@@ -1897,8 +1886,9 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This,
}
else
{
- if((pDDSD->ddsCaps.dwCaps & DDSCAPS_3DDEVICE ) &&
- (This->ImplType != SURFACE_OPENGL ) && DefaultSurfaceType == SURFACE_UNKNOWN)
+ if ((pDDSD->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)
+ && (This->ImplType != SURFACE_OPENGL)
+ && DefaultSurfaceType == SURFACE_UNKNOWN)
{
/* We have to change to OpenGL,
* and re-create all WineD3DSurfaces
@@ -2026,8 +2016,8 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This,
/* Now create the WineD3D Surface */
hr = IWineD3DDevice_CreateSurface(This->wineD3DDevice, pDDSD->dwWidth, pDDSD->dwHeight, Format,
- TRUE /* Lockable */, FALSE /* Discard */, level, &(*ppSurf)->WineD3DSurface, ResType, Usage,
- Pool, WINED3DMULTISAMPLE_NONE, 0 /* MultiSampleQuality */, ImplType, Parent);
+ TRUE /* Lockable */, FALSE /* Discard */, level, &(*ppSurf)->WineD3DSurface,
+ Usage, Pool, WINED3DMULTISAMPLE_NONE, 0 /* MultiSampleQuality */, ImplType, Parent);
if(hr != D3D_OK)
{
@@ -2058,16 +2048,6 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This,
* Don't use the Format choosen above, WineD3D might have
* changed it
*/
- Desc.Format = &Format;
- Desc.Type = &ResType;
- Desc.Usage = &Usage;
- Desc.Pool = &dummy_d3dpool;
- Desc.Size = &dummy_uint;
- Desc.MultiSampleType = &dummy_mst;
- Desc.MultiSampleQuality = &dummy_dword;
- Desc.Width = &Width;
- Desc.Height = &Height;
-
(*ppSurf)->surface_desc.dwFlags |= DDSD_PIXELFORMAT;
hr = IWineD3DSurface_GetDesc((*ppSurf)->WineD3DSurface, &Desc);
if(hr != D3D_OK)
@@ -2077,6 +2057,10 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This,
return hr;
}
+ Format = Desc.format;
+ Width = Desc.width;
+ Height = Desc.height;
+
if(Format == WINED3DFMT_UNKNOWN)
{
FIXME("IWineD3DSurface::GetDesc returned WINED3DFMT_UNKNOWN\n");
diff --git a/reactos/dll/directx/wine/ddraw/ddraw.rbuild b/reactos/dll/directx/wine/ddraw/ddraw.rbuild
index 98663668d4f..9a905af1940 100644
--- a/reactos/dll/directx/wine/ddraw/ddraw.rbuild
+++ b/reactos/dll/directx/wine/ddraw/ddraw.rbuild
@@ -7,6 +7,7 @@
include/reactos/wine
+ /FIwine/typeof.h
advapi32
dxguid
diff --git a/reactos/dll/directx/wine/ddraw/device.c b/reactos/dll/directx/wine/ddraw/device.c
index 3b7778f69b6..09bc3e64391 100644
--- a/reactos/dll/directx/wine/ddraw/device.c
+++ b/reactos/dll/directx/wine/ddraw/device.c
@@ -94,7 +94,7 @@ static inline WORD d3d_fpu_setup(void)
}
/*****************************************************************************
- * IUnknown Methods. Common for Version 1, 2, 3 and 7
+ * IUnknown Methods. Common for Version 1, 2, 3 and 7
*****************************************************************************/
/*****************************************************************************
@@ -2558,7 +2558,6 @@ IDirect3DDeviceImpl_3_GetRenderState(IDirect3DDevice3 *iface,
BOOL tex_alpha = FALSE;
IWineD3DBaseTexture *tex = NULL;
WINED3DSURFACE_DESC desc;
- WINED3DFORMAT fmt;
DDPIXELFORMAT ddfmt;
hr = IWineD3DDevice_GetTexture(This->wineD3DDevice,
@@ -2567,13 +2566,11 @@ IDirect3DDeviceImpl_3_GetRenderState(IDirect3DDevice3 *iface,
if(hr == WINED3D_OK && tex)
{
- memset(&desc, 0, sizeof(desc));
- desc.Format = &fmt;
hr = IWineD3DTexture_GetLevelDesc((IWineD3DTexture*) tex, 0, &desc);
if (SUCCEEDED(hr))
{
ddfmt.dwSize = sizeof(ddfmt);
- PixelFormat_WineD3DtoDD(&ddfmt, fmt);
+ PixelFormat_WineD3DtoDD(&ddfmt, desc.format);
if (ddfmt.u5.dwRGBAlphaBitMask) tex_alpha = TRUE;
}
@@ -2642,7 +2639,7 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
{
case D3DRENDERSTATE_TEXTUREMAG:
{
- WINED3DTEXTUREFILTERTYPE tex_mag = WINED3DTEXF_NONE;
+ WINED3DTEXTUREFILTERTYPE tex_mag = WINED3DTEXF_POINT;
switch ((D3DTEXTUREFILTER) Value)
{
@@ -2666,7 +2663,7 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
case D3DRENDERSTATE_TEXTUREMIN:
{
- WINED3DTEXTUREFILTERTYPE tex_min = WINED3DTEXF_NONE;
+ WINED3DTEXTUREFILTERTYPE tex_min = WINED3DTEXF_POINT;
WINED3DTEXTUREFILTERTYPE tex_mip = WINED3DTEXF_NONE;
switch ((D3DTEXTUREFILTER) Value)
@@ -2678,11 +2675,11 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
tex_min = WINED3DTEXF_LINEAR;
break;
case D3DFILTER_MIPNEAREST:
- tex_min = WINED3DTEXF_NONE;
+ tex_min = WINED3DTEXF_POINT;
tex_mip = WINED3DTEXF_POINT;
break;
case D3DFILTER_MIPLINEAR:
- tex_min = WINED3DTEXF_NONE;
+ tex_min = WINED3DTEXF_POINT;
tex_mip = WINED3DTEXF_LINEAR;
break;
case D3DFILTER_LINEARMIPNEAREST:
@@ -2833,7 +2830,6 @@ IDirect3DDeviceImpl_3_SetRenderState(IDirect3DDevice3 *iface,
BOOL tex_alpha = FALSE;
IWineD3DBaseTexture *tex = NULL;
WINED3DSURFACE_DESC desc;
- WINED3DFORMAT fmt;
DDPIXELFORMAT ddfmt;
hr = IWineD3DDevice_GetTexture(This->wineD3DDevice,
@@ -2843,12 +2839,11 @@ IDirect3DDeviceImpl_3_SetRenderState(IDirect3DDevice3 *iface,
if(hr == WINED3D_OK && tex)
{
memset(&desc, 0, sizeof(desc));
- desc.Format = &fmt;
hr = IWineD3DTexture_GetLevelDesc((IWineD3DTexture*) tex, 0, &desc);
if (SUCCEEDED(hr))
{
ddfmt.dwSize = sizeof(ddfmt);
- PixelFormat_WineD3DtoDD(&ddfmt, fmt);
+ PixelFormat_WineD3DtoDD(&ddfmt, desc.format);
if (ddfmt.u5.dwRGBAlphaBitMask) tex_alpha = TRUE;
}
@@ -2961,7 +2956,7 @@ IDirect3DDeviceImpl_3_SetLightState(IDirect3DDevice3 *iface,
TRACE("(%p)->(%08x,%08x)\n", This, LightStateType, Value);
- if (!LightStateType && (LightStateType > D3DLIGHTSTATE_COLORVERTEX))
+ if (!LightStateType || (LightStateType > D3DLIGHTSTATE_COLORVERTEX))
{
TRACE("Unexpected Light State Type\n");
return DDERR_INVALIDPARAMS;
@@ -3094,7 +3089,7 @@ IDirect3DDeviceImpl_3_GetLightState(IDirect3DDevice3 *iface,
TRACE("(%p)->(%08x,%p)\n", This, LightStateType, Value);
- if (!LightStateType && (LightStateType > D3DLIGHTSTATE_COLORVERTEX))
+ if (!LightStateType || (LightStateType > D3DLIGHTSTATE_COLORVERTEX))
{
TRACE("Unexpected Light State Type\n");
return DDERR_INVALIDPARAMS;
@@ -4507,7 +4502,7 @@ IDirect3DDeviceImpl_7_GetTexture(IDirect3DDevice7 *iface,
EnterCriticalSection(&ddraw_cs);
hr = IWineD3DDevice_GetTexture(This->wineD3DDevice, Stage, &Surf);
- if( (hr != D3D_OK) || (!Surf) )
+ if( (hr != D3D_OK) || (!Surf) )
{
*Texture = NULL;
LeaveCriticalSection(&ddraw_cs);
@@ -4648,7 +4643,6 @@ IDirect3DDeviceImpl_3_SetTexture(IDirect3DDevice3 *iface,
BOOL tex_alpha = FALSE;
IWineD3DBaseTexture *tex = NULL;
WINED3DSURFACE_DESC desc;
- WINED3DFORMAT fmt;
DDPIXELFORMAT ddfmt;
HRESULT result;
@@ -4659,12 +4653,11 @@ IDirect3DDeviceImpl_3_SetTexture(IDirect3DDevice3 *iface,
if(result == WINED3D_OK && tex)
{
memset(&desc, 0, sizeof(desc));
- desc.Format = &fmt;
result = IWineD3DTexture_GetLevelDesc((IWineD3DTexture*) tex, 0, &desc);
if (SUCCEEDED(result))
{
ddfmt.dwSize = sizeof(ddfmt);
- PixelFormat_WineD3DtoDD(&ddfmt, fmt);
+ PixelFormat_WineD3DtoDD(&ddfmt, desc.format);
if (ddfmt.u5.dwRGBAlphaBitMask) tex_alpha = TRUE;
}
@@ -5309,7 +5302,7 @@ IDirect3DDeviceImpl_7_GetMaterial(IDirect3DDevice7 *iface,
TRACE("(%p)->(%p): Relay!\n", This, Mat);
EnterCriticalSection(&ddraw_cs);
- /* Note: D3DMATERIAL7 is compatible with WINED3DMATERIAL */
+ /* Note: D3DMATERIAL7 is compatible with WINED3DMATERIAL */
hr = IWineD3DDevice_GetMaterial(This->wineD3DDevice,
(WINED3DMATERIAL*) Mat);
LeaveCriticalSection(&ddraw_cs);
@@ -5944,8 +5937,8 @@ static BOOL is_mip_level_subset(IDirectDrawSurfaceImpl *dest,
static void copy_mipmap_chain(IDirect3DDeviceImpl *device,
IDirectDrawSurfaceImpl *dest,
IDirectDrawSurfaceImpl *src,
- POINT *DestPoint,
- RECT *SrcRect)
+ const POINT *DestPoint,
+ const RECT *SrcRect)
{
IDirectDrawSurfaceImpl *src_level, *dest_level;
IDirectDrawSurface7 *temp;
diff --git a/reactos/dll/directx/wine/ddraw/direct3d.c b/reactos/dll/directx/wine/ddraw/direct3d.c
index 9ce0d3664af..88d5f2f8507 100644
--- a/reactos/dll/directx/wine/ddraw/direct3d.c
+++ b/reactos/dll/directx/wine/ddraw/direct3d.c
@@ -1324,7 +1324,7 @@ IDirect3DImpl_GetCaps(IWineD3D *WineD3D,
Desc7->dwStencilCaps &= (
D3DSTENCILCAPS_KEEP | D3DSTENCILCAPS_ZERO | D3DSTENCILCAPS_REPLACE |
D3DSTENCILCAPS_INCRSAT | D3DSTENCILCAPS_DECRSAT | D3DSTENCILCAPS_INVERT |
- D3DSTENCILCAPS_INCR | D3DSTENCILCAPS_DECR | D3DSTENCILCAPS_TWOSIDED);
+ D3DSTENCILCAPS_INCR | D3DSTENCILCAPS_DECR);
/* FVF caps ?*/
diff --git a/reactos/dll/directx/wine/ddraw/executebuffer.c b/reactos/dll/directx/wine/ddraw/executebuffer.c
index 3ff794d93b8..996c558bad2 100644
--- a/reactos/dll/directx/wine/ddraw/executebuffer.c
+++ b/reactos/dll/directx/wine/ddraw/executebuffer.c
@@ -227,14 +227,14 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
} else if(lpDevice->Handles[ci->u2.dwArg[0] - 1].type != DDrawHandle_Matrix) {
ERR("Handle %d is not a matrix handle\n", ci->u2.dwArg[0]);
} else {
- if(ci->u1.drstRenderStateType == D3DTRANSFORMSTATE_WORLD)
+ if(ci->u1.dtstTransformStateType == D3DTRANSFORMSTATE_WORLD)
lpDevice->world = ci->u2.dwArg[0];
- if(ci->u1.drstRenderStateType == D3DTRANSFORMSTATE_VIEW)
+ if(ci->u1.dtstTransformStateType == D3DTRANSFORMSTATE_VIEW)
lpDevice->view = ci->u2.dwArg[0];
- if(ci->u1.drstRenderStateType == D3DTRANSFORMSTATE_PROJECTION)
+ if(ci->u1.dtstTransformStateType == D3DTRANSFORMSTATE_PROJECTION)
lpDevice->proj = ci->u2.dwArg[0];
IDirect3DDevice7_SetTransform((IDirect3DDevice7 *)lpDevice,
- ci->u1.drstRenderStateType, (LPD3DMATRIX)lpDevice->Handles[ci->u2.dwArg[0] - 1].ptr);
+ ci->u1.dtstTransformStateType, (LPD3DMATRIX)lpDevice->Handles[ci->u2.dwArg[0] - 1].ptr);
}
instr += size;
}
@@ -249,7 +249,7 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
TRACE("(%08x,%08x)\n", ci->u1.dlstLightStateType, ci->u2.dwArg[0]);
- if (!ci->u1.dlstLightStateType && (ci->u1.dlstLightStateType > D3DLIGHTSTATE_COLORVERTEX))
+ if (!ci->u1.dlstLightStateType || (ci->u1.dlstLightStateType > D3DLIGHTSTATE_COLORVERTEX))
ERR("Unexpected Light State Type\n");
else if (ci->u1.dlstLightStateType == D3DLIGHTSTATE_MATERIAL /* 1 */) {
DWORD matHandle = ci->u2.dwArg[0];
@@ -317,7 +317,7 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
for (i = 0; i < count; i++) {
LPD3DSTATE ci = (LPD3DSTATE) instr;
-
+
IDirect3DDevice2_SetRenderState(d3d_device2, ci->u1.drstRenderStateType, ci->u2.dwArg[0]);
instr += size;
@@ -369,33 +369,33 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
TRACE("UPDATEEXTENTS ");
TRACE("\n");
}
-
+
/* This is where doing Direct3D on top on OpenGL is quite difficult.
This method transforms a set of vertices using the CURRENT state
(lighting, projection, ...) but does not rasterize them.
They will only be put on screen later (with the POINT / LINE and
TRIANGLE op-codes). The problem is that you can have a triangle
with each point having been transformed using another state...
-
+
In this implementation, I will emulate only ONE thing : each
vertex can have its own "WORLD" transformation (this is used in the
TWIST.EXE demo of the 5.2 SDK). I suppose that all vertices of the
execute buffer use the same state.
-
+
If I find applications that change other states, I will try to do a
more 'fine-tuned' state emulation (but I may become quite tricky if
it changes a light position in the middle of a triangle).
-
+
In this case, a 'direct' approach (i.e. without using OpenGL, but
writing our own 3D rasterizer) would be easier. */
-
+
/* The current method (with the hypothesis that only the WORLD matrix
will change between two points) is like this :
- I transform 'manually' all the vertices with the current WORLD
matrix and store them in the vertex buffer
- during the rasterization phase, the WORLD matrix will be set to
the Identity matrix */
-
+
/* Enough for the moment */
if (ci->dwFlags == D3DPROCESSVERTICES_TRANSFORMLIGHT) {
unsigned int nb;
@@ -439,7 +439,7 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
src++;
dst++;
-
+
}
} else if (ci->dwFlags == D3DPROCESSVERTICES_TRANSFORM) {
unsigned int nb;
@@ -465,7 +465,7 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
dst->u6.specular = src->u5.specular;
dst->u7.tu = src->u6.tu;
dst->u8.tv = src->u7.tv;
-
+
/* Now, the matrix multiplication */
dst->u1.sx = (src->u1.x * mat._11) + (src->u2.y * mat._21) + (src->u3.z * mat._31) + (1.0 * mat._41);
dst->u2.sy = (src->u1.x * mat._12) + (src->u2.y * mat._22) + (src->u3.z * mat._32) + (1.0 * mat._42);
@@ -551,7 +551,7 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
for (i = 0; i < count; i++) {
LPD3DSTATUS ci = (LPD3DSTATUS) instr;
-
+
This->data.dsStatus = *ci;
instr += size;
@@ -705,7 +705,7 @@ IDirect3DExecuteBufferImpl_Lock(IDirect3DExecuteBuffer *iface,
dwSize = lpDesc->dwSize;
memset(lpDesc, 0, dwSize);
memcpy(lpDesc, &This->desc, dwSize);
-
+
if (TRACE_ON(d3d7)) {
TRACE(" Returning description :\n");
_dump_D3DEXECUTEBUFFERDESC(lpDesc);
@@ -756,7 +756,7 @@ IDirect3DExecuteBufferImpl_SetExecuteData(IDirect3DExecuteBuffer *iface,
/* Get the number of vertices in the execute buffer */
nbvert = This->data.dwVertexCount;
-
+
/* Prepares the transformed vertex buffer */
HeapFree(GetProcessHeap(), 0, This->vertex_data);
This->vertex_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nbvert * sizeof(D3DTLVERTEX));
diff --git a/reactos/dll/directx/wine/ddraw/light.c b/reactos/dll/directx/wine/ddraw/light.c
index 4a759eb2463..030dcf030c4 100644
--- a/reactos/dll/directx/wine/ddraw/light.c
+++ b/reactos/dll/directx/wine/ddraw/light.c
@@ -179,17 +179,17 @@ IDirect3DLightImpl_SetLight(IDirect3DLight *iface,
if ( (lpLight->dltType == 0) || (lpLight->dltType > D3DLIGHT_PARALLELPOINT) )
return DDERR_INVALIDPARAMS;
-
+
if ( lpLight->dltType == D3DLIGHT_PARALLELPOINT )
- FIXME("D3DLIGHT_PARALLELPOINT no supported\n");
-
+ FIXME("D3DLIGHT_PARALLELPOINT no supported\n");
+
/* Translate D3DLIGH2 structure to D3DLIGHT7 */
light7->dltType = lpLight->dltType;
light7->dcvDiffuse = lpLight->dcvColor;
- if ((((LPD3DLIGHT2)lpLight)->dwFlags & D3DLIGHT_NO_SPECULAR) != 0)
+ if ((((LPD3DLIGHT2)lpLight)->dwFlags & D3DLIGHT_NO_SPECULAR) != 0)
light7->dcvSpecular = lpLight->dcvColor;
else
- light7->dcvSpecular = *(const D3DCOLORVALUE*)zero_value;
+ light7->dcvSpecular = *(const D3DCOLORVALUE*)zero_value;
light7->dcvAmbient = lpLight->dcvColor;
light7->dvPosition = lpLight->dvPosition;
light7->dvDirection = lpLight->dvDirection;
@@ -204,7 +204,7 @@ IDirect3DLightImpl_SetLight(IDirect3DLight *iface,
EnterCriticalSection(&ddraw_cs);
memcpy(&This->light, lpLight, lpLight->dwSize);
if ((This->light.dwFlags & D3DLIGHT_ACTIVE) != 0) {
- This->update(This);
+ This->update(This);
}
LeaveCriticalSection(&ddraw_cs);
return D3D_OK;
@@ -274,7 +274,7 @@ void light_activate(IDirect3DLightImpl* This)
if (!This->active_viewport || !This->active_viewport->active_device)
return;
device = This->active_viewport->active_device;
-
+
light_update(This);
/* If was not active, activate it */
if ((This->light.dwFlags & D3DLIGHT_ACTIVE) == 0) {
@@ -299,7 +299,7 @@ void light_desactivate(IDirect3DLightImpl* This)
if (!This->active_viewport || !This->active_viewport->active_device)
return;
device = This->active_viewport->active_device;
-
+
/* If was not active, activate it */
if ((This->light.dwFlags & D3DLIGHT_ACTIVE) != 0) {
IDirect3DDevice7_LightEnable((IDirect3DDevice7 *)device, This->dwLightIndex, FALSE);
diff --git a/reactos/dll/directx/wine/ddraw/parent.c b/reactos/dll/directx/wine/ddraw/parent.c
index ec4cfde7cfd..473152ed740 100644
--- a/reactos/dll/directx/wine/ddraw/parent.c
+++ b/reactos/dll/directx/wine/ddraw/parent.c
@@ -117,8 +117,7 @@ IParentImpl_AddRef(IParent *iface)
* The new refcount
*
*****************************************************************************/
-static ULONG WINAPI
-IParentImpl_Release(IParent *iface)
+static ULONG WINAPI IParentImpl_Release(IParent *iface)
{
IParentImpl *This = (IParentImpl *)iface;
ULONG ref = InterlockedDecrement(&This->ref);
diff --git a/reactos/dll/directx/wine/ddraw/surface.c b/reactos/dll/directx/wine/ddraw/surface.c
index 14fc721ca3e..6d92c0d837c 100644
--- a/reactos/dll/directx/wine/ddraw/surface.c
+++ b/reactos/dll/directx/wine/ddraw/surface.c
@@ -920,9 +920,6 @@ IDirectDrawSurfaceImpl_AddAttachedSurface(IDirectDrawSurfaceImpl *This,
IDirect3DDeviceImpl_UpdateDepthStencil(This->ddraw->d3ddevice);
}
- /* MSDN:
- * "This method increments the reference count of the surface being attached."
- */
IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)Surf);
LeaveCriticalSection(&ddraw_cs);
return DD_OK;
@@ -1033,7 +1030,7 @@ IDirectDrawSurfaceImpl_AddOverlayDirtyRect(IDirectDrawSurface7 *iface,
IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
TRACE("(%p)->(%p)\n",This,Rect);
- /* MSDN says it's not implemented. I could forward it to WineD3D,
+ /* MSDN says it's not implemented. I could forward it to WineD3D,
* then we'd implement it, but I don't think that's a good idea
* (Stefan Dösinger)
*/
diff --git a/reactos/dll/directx/wine/ddraw/utils.c b/reactos/dll/directx/wine/ddraw/utils.c
index 18114922485..17b4d34defa 100644
--- a/reactos/dll/directx/wine/ddraw/utils.c
+++ b/reactos/dll/directx/wine/ddraw/utils.c
@@ -349,7 +349,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat,
WINED3DFORMAT
PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat)
{
- TRACE("Convert a DirectDraw Pixelformat to a WineD3D Pixelformat\n");
+ TRACE("Convert a DirectDraw Pixelformat to a WineD3D Pixelformat\n");
if(TRACE_ON(ddraw))
{
DDRAW_dump_pixelformat(DDPixelFormat);
diff --git a/reactos/dll/directx/wine/ddraw/viewport.c b/reactos/dll/directx/wine/ddraw/viewport.c
index c6e346e2294..9b0698903f5 100644
--- a/reactos/dll/directx/wine/ddraw/viewport.c
+++ b/reactos/dll/directx/wine/ddraw/viewport.c
@@ -84,7 +84,7 @@ void viewport_activate(IDirect3DViewportImpl* This, BOOL ignore_lights) {
vp.dvMinZ = This->viewports.vp1.dvMinZ;
vp.dvMaxZ = This->viewports.vp1.dvMaxZ;
}
-
+
/* And also set the viewport */
IDirect3DDevice7_SetViewport((IDirect3DDevice7 *)This->active_device, &vp);
}
@@ -657,11 +657,8 @@ IDirect3DViewportImpl_GetBackgroundDepth(IDirect3DViewport3 *iface,
* The return value of IDirect3DDevice7::Clear
*
*****************************************************************************/
-static HRESULT WINAPI
-IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
- DWORD dwCount,
- D3DRECT *lpRects,
- DWORD dwFlags)
+static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
+ DWORD dwCount, D3DRECT *lpRects, DWORD dwFlags)
{
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
DWORD color = 0x00000000;
@@ -679,14 +676,15 @@ IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
EnterCriticalSection(&ddraw_cs);
if (dwFlags & D3DCLEAR_TARGET) {
if (This->background == NULL) {
- ERR(" Trying to clear the color buffer without background material !\n");
- } else {
- color =
- ((int) ((This->background->mat.u.diffuse.u1.r) * 255) << 16) |
- ((int) ((This->background->mat.u.diffuse.u2.g) * 255) << 8) |
- ((int) ((This->background->mat.u.diffuse.u3.b) * 255) << 0) |
- ((int) ((This->background->mat.u.diffuse.u4.a) * 255) << 24);
- }
+ ERR(" Trying to clear the color buffer without background material !\n");
+ }
+ else
+ {
+ color = ((int)((This->background->mat.u.diffuse.u1.r) * 255) << 16)
+ | ((int) ((This->background->mat.u.diffuse.u2.g) * 255) << 8)
+ | ((int) ((This->background->mat.u.diffuse.u3.b) * 255) << 0)
+ | ((int) ((This->background->mat.u.diffuse.u4.a) * 255) << 24);
+ }
}
/* Need to temporarily activate viewport to clear it. Previously active one will be restored
@@ -729,7 +727,7 @@ IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface,
IDirect3DLightImpl *lpDirect3DLightImpl = (IDirect3DLightImpl *)lpDirect3DLight;
DWORD i = 0;
DWORD map = This->map_lights;
-
+
TRACE("(%p)->(%p)\n", This, lpDirect3DLight);
EnterCriticalSection(&ddraw_cs);
@@ -755,7 +753,7 @@ IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface,
/* Attach the light to the viewport */
lpDirect3DLightImpl->active_viewport = This;
-
+
/* If active, activate the light */
if (This->active_device != NULL) {
lpDirect3DLightImpl->activate(lpDirect3DLightImpl);
@@ -785,7 +783,7 @@ IDirect3DViewportImpl_DeleteLight(IDirect3DViewport3 *iface,
IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
IDirect3DLightImpl *lpDirect3DLightImpl = (IDirect3DLightImpl *)lpDirect3DLight;
IDirect3DLightImpl *cur_light, *prev_light = NULL;
-
+
TRACE("(%p)->(%p)\n", This, lpDirect3DLight);
EnterCriticalSection(&ddraw_cs);
diff --git a/reactos/dll/directx/wine/wine.rbuild b/reactos/dll/directx/wine/wine.rbuild
index 63d13cfabef..042e8c5b621 100644
--- a/reactos/dll/directx/wine/wine.rbuild
+++ b/reactos/dll/directx/wine/wine.rbuild
@@ -10,6 +10,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/reactos/dll/directx/wine/wined3d/arb_program_shader.c b/reactos/dll/directx/wine/wined3d/arb_program_shader.c
index 56ee162e232..a26950cd169 100644
--- a/reactos/dll/directx/wine/wined3d/arb_program_shader.c
+++ b/reactos/dll/directx/wine/wined3d/arb_program_shader.c
@@ -41,48 +41,242 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d);
#define GLINFO_LOCATION (*gl_info)
-/* We have to subtract any other PARAMs that we might use in our shader programs.
- * ATI seems to count 2 implicit PARAMs when we use fog and NVIDIA counts 1,
- * and we reference one row of the PROJECTION matrix which counts as 1 PARAM. */
-#define ARB_SHADER_RESERVED_VS_CONSTS 3
+/* GL locking for state handlers is done by the caller. */
+static BOOL need_mova_const(IWineD3DBaseShader *shader, const struct wined3d_gl_info *gl_info)
+{
+ IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *) shader;
+ if(!This->baseShader.reg_maps.usesmova) return FALSE;
+ return !GL_SUPPORT(NV_VERTEX_PROGRAM2_OPTION);
+}
-/* The arb shader only loads the bump mapping environment matrix into the shader if it finds
- * a free constant to do that, so only reduce the number of available constants by 2 for the fog states.
- */
-#define ARB_SHADER_RESERVED_PS_CONSTS 2
+/* Returns TRUE if result.clip from GL_NV_vertex_program2 should be used and FALSE otherwise */
+static inline BOOL use_nv_clip(const struct wined3d_gl_info *gl_info)
+{
+ return GL_SUPPORT(NV_VERTEX_PROGRAM2_OPTION);
+}
+
+static BOOL need_helper_const(const struct wined3d_gl_info *gl_info)
+{
+ if (!GL_SUPPORT(NV_VERTEX_PROGRAM) /* Need to init colors. */
+ || gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT /* Load the immval offset. */
+ || gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W /* Have to init texcoords. */
+ || (!use_nv_clip(gl_info)) /* Init the clip texcoord */)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static unsigned int reserved_vs_const(IWineD3DBaseShader *shader, const struct wined3d_gl_info *gl_info)
+{
+ unsigned int ret = 1;
+ /* We use one PARAM for the pos fixup, and in some cases one to load
+ * some immediate values into the shader
+ */
+ if(need_helper_const(gl_info)) ret++;
+ if(need_mova_const(shader, gl_info)) ret++;
+ return ret;
+}
+
+static inline BOOL ffp_clip_emul(IWineD3DStateBlockImpl *stateblock)
+{
+ return stateblock->lowest_disabled_stage < 7;
+}
/* Internally used shader constants. Applications can use constants 0 to GL_LIMITS(vshader_constantsF) - 1,
* so upload them above that
*/
-#define ARB_SHADER_PRIVCONST_BASE (GL_LIMITS(vshader_constantsF) - ARB_SHADER_RESERVED_VS_CONSTS)
+#define ARB_SHADER_PRIVCONST_BASE (GL_LIMITS(vshader_constantsF) - 1)
#define ARB_SHADER_PRIVCONST_POS ARB_SHADER_PRIVCONST_BASE + 0
/* ARB_program_shader private data */
-struct shader_arb_priv {
+
+struct control_frame
+{
+ struct list entry;
+ enum
+ {
+ IF,
+ IFC,
+ LOOP,
+ REP
+ } type;
+ BOOL muting;
+ BOOL outer_loop;
+ union
+ {
+ unsigned int loop_no;
+ unsigned int ifc_no;
+ };
+ struct wined3d_shader_loop_control loop_control;
+ BOOL had_else;
+};
+
+struct arb_ps_np2fixup_info
+{
+ struct ps_np2fixup_info super;
+ /* For ARB we need a offset value:
+ * With both GLSL and ARB mode the NP2 fixup information (the texture dimensions) are stored in a
+ * consecutive way (GLSL uses a uniform array). Since ARB doesn't know the notion of a "standalone"
+ * array we need an offset to the index inside the program local parameter array. */
+ UINT offset;
+};
+
+struct arb_ps_compile_args
+{
+ struct ps_compile_args super;
+ DWORD bools; /* WORD is enough, use DWORD for alignment */
+ unsigned char loop_ctrl[MAX_CONST_I][3];
+};
+
+struct stb_const_desc
+{
+ unsigned char texunit;
+ UINT const_num;
+};
+
+struct arb_ps_compiled_shader
+{
+ struct arb_ps_compile_args args;
+ struct arb_ps_np2fixup_info np2fixup_info;
+ struct stb_const_desc bumpenvmatconst[MAX_TEXTURES];
+ struct stb_const_desc luminanceconst[MAX_TEXTURES];
+ UINT int_consts[MAX_CONST_I];
+ GLuint prgId;
+ UINT ycorrection;
+ unsigned char numbumpenvmatconsts;
+ char num_int_consts;
+};
+
+struct arb_vs_compile_args
+{
+ struct vs_compile_args super;
+ union
+ {
+ struct
+ {
+ WORD bools;
+ char clip_control[2];
+ } boolclip;
+ DWORD boolclip_compare;
+ };
+ DWORD ps_signature;
+ union
+ {
+ unsigned char vertex_samplers[4];
+ DWORD vertex_samplers_compare;
+ };
+ unsigned char loop_ctrl[MAX_CONST_I][3];
+};
+
+struct arb_vs_compiled_shader
+{
+ struct arb_vs_compile_args args;
+ GLuint prgId;
+ UINT int_consts[MAX_CONST_I];
+ char num_int_consts;
+ char need_color_unclamp;
+ UINT pos_fixup;
+};
+
+struct recorded_instruction
+{
+ struct wined3d_shader_instruction ins;
+ struct list entry;
+};
+
+struct shader_arb_ctx_priv
+{
+ char addr_reg[20];
+ enum
+ {
+ /* plain GL_ARB_vertex_program or GL_ARB_fragment_program */
+ ARB,
+ /* GL_NV_vertex_progam2_option or GL_NV_fragment_program_option */
+ NV2,
+ /* GL_NV_vertex_program3 or GL_NV_fragment_program2 */
+ NV3
+ } target_version;
+
+ const struct arb_vs_compile_args *cur_vs_args;
+ const struct arb_ps_compile_args *cur_ps_args;
+ const struct arb_ps_compiled_shader *compiled_fprog;
+ const struct arb_vs_compiled_shader *compiled_vprog;
+ struct arb_ps_np2fixup_info *cur_np2fixup_info;
+ struct list control_frames;
+ struct list record;
+ BOOL recording;
+ BOOL muted;
+ unsigned int num_loops, loop_depth, num_ifcs;
+ int aL;
+
+ unsigned int vs_clipplanes;
+ BOOL footer_written;
+ BOOL in_main_func;
+
+ /* For 3.0 vertex shaders */
+ const char *vs_output[MAX_REG_OUTPUT];
+ /* For 2.x and earlier vertex shaders */
+ const char *texcrd_output[8], *color_output[2], *fog_output;
+
+ /* 3.0 pshader input for compatibility with fixed function */
+ const char *ps_input[MAX_REG_INPUT];
+};
+
+struct ps_signature
+{
+ struct wined3d_shader_signature_element *sig;
+ DWORD idx;
+ struct wine_rb_entry entry;
+};
+
+struct arb_pshader_private {
+ struct arb_ps_compiled_shader *gl_shaders;
+ UINT num_gl_shaders, shader_array_size;
+ BOOL has_signature_idx;
+ DWORD input_signature_idx;
+ DWORD clipplane_emulation;
+ BOOL clamp_consts;
+};
+
+struct arb_vshader_private {
+ struct arb_vs_compiled_shader *gl_shaders;
+ UINT num_gl_shaders, shader_array_size;
+};
+
+struct shader_arb_priv
+{
GLuint current_vprogram_id;
GLuint current_fprogram_id;
+ const struct arb_ps_compiled_shader *compiled_fprog;
+ const struct arb_vs_compiled_shader *compiled_vprog;
GLuint depth_blt_vprogram_id;
GLuint depth_blt_fprogram_id[tex_type_count];
BOOL use_arbfp_fixed_func;
- struct hash_table_t *fragment_shaders;
+ struct wine_rb_tree fragment_shaders;
+ BOOL last_ps_const_clamped;
+ BOOL last_vs_color_unclamp;
+
+ struct wine_rb_tree signature_tree;
+ DWORD ps_sig_number;
};
/********************************************************
* ARB_[vertex/fragment]_program helper functions follow
********************************************************/
-/**
- * Loads floating point constants into the currently set ARB_vertex/fragment_program.
+/* Loads floating point constants into the currently set ARB_vertex/fragment_program.
* When constant_list == NULL, it will load all the constants.
- *
+ *
* @target_type should be either GL_VERTEX_PROGRAM_ARB (for vertex shaders)
* or GL_FRAGMENT_PROGRAM_ARB (for pixel shaders)
*/
-static unsigned int shader_arb_load_constantsF(IWineD3DBaseShaderImpl* This, const WineD3D_GL_Info *gl_info,
+/* GL locking is done by the caller */
+static unsigned int shader_arb_load_constantsF(IWineD3DBaseShaderImpl *This, const struct wined3d_gl_info *gl_info,
GLuint target_type, unsigned int max_constants, const float *constants, char *dirty_consts)
{
local_constant* lconst;
- DWORD i, j;
+ DWORD i = 0, j;
unsigned int ret;
if (TRACE_ON(d3d_shader)) {
@@ -97,54 +291,65 @@ static unsigned int shader_arb_load_constantsF(IWineD3DBaseShaderImpl* This, con
if (target_type == GL_FRAGMENT_PROGRAM_ARB && This->baseShader.reg_maps.shader_version.major == 1)
{
float lcl_const[4];
- for(i = 0; i < max_constants; i++) {
+ /* ps 1.x supports only 8 constants, clamp only those. When switching between 1.x and higher
+ * shaders, the first 8 constants are marked dirty for reload
+ */
+ for(; i < min(8, max_constants); i++) {
if(!dirty_consts[i]) continue;
dirty_consts[i] = 0;
j = 4 * i;
- if(constants[j + 0] > 1.0) lcl_const[0] = 1.0;
- else if(constants[j + 0] < -1.0) lcl_const[0] = -1.0;
+ if (constants[j + 0] > 1.0f) lcl_const[0] = 1.0f;
+ else if (constants[j + 0] < -1.0f) lcl_const[0] = -1.0f;
else lcl_const[0] = constants[j + 0];
- if(constants[j + 1] > 1.0) lcl_const[1] = 1.0;
- else if(constants[j + 1] < -1.0) lcl_const[1] = -1.0;
+ if (constants[j + 1] > 1.0f) lcl_const[1] = 1.0f;
+ else if (constants[j + 1] < -1.0f) lcl_const[1] = -1.0f;
else lcl_const[1] = constants[j + 1];
- if(constants[j + 2] > 1.0) lcl_const[2] = 1.0;
- else if(constants[j + 2] < -1.0) lcl_const[2] = -1.0;
+ if (constants[j + 2] > 1.0f) lcl_const[2] = 1.0f;
+ else if (constants[j + 2] < -1.0f) lcl_const[2] = -1.0f;
else lcl_const[2] = constants[j + 2];
- if(constants[j + 3] > 1.0) lcl_const[3] = 1.0;
- else if(constants[j + 3] < -1.0) lcl_const[3] = -1.0;
+ if (constants[j + 3] > 1.0f) lcl_const[3] = 1.0f;
+ else if (constants[j + 3] < -1.0f) lcl_const[3] = -1.0f;
else lcl_const[3] = constants[j + 3];
GL_EXTCALL(glProgramEnvParameter4fvARB(target_type, i, lcl_const));
}
- } else {
- if(GL_SUPPORT(EXT_GPU_PROGRAM_PARAMETERS)) {
- /* TODO: Benchmark if we're better of with finding the dirty constants ourselves,
- * or just reloading *all* constants at once
- *
- GL_EXTCALL(glProgramEnvParameters4fvEXT(target_type, 0, max_constants, constants));
- */
- for(i = 0; i < max_constants; i++) {
- if(!dirty_consts[i]) continue;
- /* Find the next block of dirty constants */
+ /* If further constants are dirty, reload them without clamping.
+ *
+ * The alternative is not to touch them, but then we cannot reset the dirty constant count
+ * to zero. That's bad for apps that only use PS 1.x shaders, because in that case the code
+ * above would always re-check the first 8 constants since max_constant remains at the init
+ * value
+ */
+ }
+
+ if(GL_SUPPORT(EXT_GPU_PROGRAM_PARAMETERS)) {
+ /* TODO: Benchmark if we're better of with finding the dirty constants ourselves,
+ * or just reloading *all* constants at once
+ *
+ GL_EXTCALL(glProgramEnvParameters4fvEXT(target_type, i, max_constants, constants + (i * 4)));
+ */
+ for(; i < max_constants; i++) {
+ if(!dirty_consts[i]) continue;
+
+ /* Find the next block of dirty constants */
+ dirty_consts[i] = 0;
+ j = i;
+ for(i++; (i < max_constants) && dirty_consts[i]; i++) {
dirty_consts[i] = 0;
- j = i;
- for(i++; (i < max_constants) && dirty_consts[i]; i++) {
- dirty_consts[i] = 0;
- }
-
- GL_EXTCALL(glProgramEnvParameters4fvEXT(target_type, j, i - j, constants + (j * 4)));
}
- } else {
- for(i = 0; i < max_constants; i++) {
- if(dirty_consts[i]) {
- dirty_consts[i] = 0;
- GL_EXTCALL(glProgramEnvParameter4fvARB(target_type, i, constants + (i * 4)));
- }
+
+ GL_EXTCALL(glProgramEnvParameters4fvEXT(target_type, j, i - j, constants + (j * 4)));
+ }
+ } else {
+ for(; i < max_constants; i++) {
+ if(dirty_consts[i]) {
+ dirty_consts[i] = 0;
+ GL_EXTCALL(glProgramEnvParameter4fvARB(target_type, i, constants + (i * 4)));
}
}
}
@@ -180,93 +385,203 @@ static void shader_arb_load_np2fixup_constants(
IWineD3DDevice* device,
char usePixelShader,
char useVertexShader) {
- /* not implemented */
+
+ IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl *) device;
+ const struct shader_arb_priv* const priv = (const struct shader_arb_priv *) deviceImpl->shader_priv;
+ IWineD3DStateBlockImpl* stateBlock = deviceImpl->stateBlock;
+ const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
+
+ if (!usePixelShader) {
+ /* NP2 texcoord fixup is (currently) only done for pixelshaders. */
+ return;
+ }
+
+ if (priv->compiled_fprog && priv->compiled_fprog->np2fixup_info.super.active) {
+ const struct arb_ps_np2fixup_info* const fixup = &priv->compiled_fprog->np2fixup_info;
+ UINT i;
+ WORD active = fixup->super.active;
+ GLfloat np2fixup_constants[4 * MAX_FRAGMENT_SAMPLERS];
+
+ for (i = 0; active; active >>= 1, ++i) {
+ const unsigned char idx = fixup->super.idx[i];
+ const IWineD3DTextureImpl* const tex = (const IWineD3DTextureImpl*) stateBlock->textures[i];
+ GLfloat* tex_dim = &np2fixup_constants[(idx >> 1) * 4];
+
+ if (!(active & 1)) continue;
+
+ if (!tex) {
+ FIXME("Nonexistent texture is flagged for NP2 texcoord fixup\n");
+ continue;
+ }
+
+ if (idx % 2) {
+ tex_dim[2] = tex->baseTexture.pow2Matrix[0]; tex_dim[3] = tex->baseTexture.pow2Matrix[5];
+ } else {
+ tex_dim[0] = tex->baseTexture.pow2Matrix[0]; tex_dim[1] = tex->baseTexture.pow2Matrix[5];
+ }
+ }
+
+ for (i = 0; i < fixup->super.num_consts; ++i) {
+ GL_EXTCALL(glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB,
+ fixup->offset + i, &np2fixup_constants[i * 4]));
+ }
+ }
+}
+
+/* GL locking is done by the caller. */
+static inline void shader_arb_ps_local_constants(IWineD3DDeviceImpl* deviceImpl)
+{
+ const struct wined3d_context *context = context_get_current();
+ IWineD3DStateBlockImpl* stateBlock = deviceImpl->stateBlock;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ unsigned char i;
+ struct shader_arb_priv *priv = deviceImpl->shader_priv;
+ const struct arb_ps_compiled_shader *gl_shader = priv->compiled_fprog;
+
+ for(i = 0; i < gl_shader->numbumpenvmatconsts; i++)
+ {
+ int texunit = gl_shader->bumpenvmatconst[i].texunit;
+
+ /* The state manager takes care that this function is always called if the bump env matrix changes */
+ const float *data = (const float *)&stateBlock->textureState[texunit][WINED3DTSS_BUMPENVMAT00];
+ GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->bumpenvmatconst[i].const_num, data));
+
+ if (gl_shader->luminanceconst[i].const_num != WINED3D_CONST_NUM_UNUSED)
+ {
+ /* WINED3DTSS_BUMPENVLSCALE and WINED3DTSS_BUMPENVLOFFSET are next to each other.
+ * point gl to the scale, and load 4 floats. x = scale, y = offset, z and w are junk, we
+ * don't care about them. The pointers are valid for sure because the stateblock is bigger.
+ * (they're WINED3DTSS_TEXTURETRANSFORMFLAGS and WINED3DTSS_ADDRESSW, so most likely 0 or NaN
+ */
+ const float *scale = (const float *)&stateBlock->textureState[texunit][WINED3DTSS_BUMPENVLSCALE];
+ GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->luminanceconst[i].const_num, scale));
+ }
+ }
+ checkGLcall("Load bumpmap consts");
+
+ if(gl_shader->ycorrection != WINED3D_CONST_NUM_UNUSED)
+ {
+ /* ycorrection.x: Backbuffer height(onscreen) or 0(offscreen).
+ * ycorrection.y: -1.0(onscreen), 1.0(offscreen)
+ * ycorrection.z: 1.0
+ * ycorrection.w: 0.0
+ */
+ float val[4];
+ val[0] = context->render_offscreen ? 0.0f
+ : ((IWineD3DSurfaceImpl *) deviceImpl->render_targets[0])->currentDesc.Height;
+ val[1] = context->render_offscreen ? 1.0f : -1.0f;
+ val[2] = 1.0f;
+ val[3] = 0.0f;
+ GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->ycorrection, val));
+ checkGLcall("y correction loading");
+ }
+
+ if(gl_shader->num_int_consts == 0) return;
+
+ for(i = 0; i < MAX_CONST_I; i++)
+ {
+ if(gl_shader->int_consts[i] != WINED3D_CONST_NUM_UNUSED)
+ {
+ float val[4];
+ val[0] = stateBlock->pixelShaderConstantI[4 * i];
+ val[1] = stateBlock->pixelShaderConstantI[4 * i + 1];
+ val[2] = stateBlock->pixelShaderConstantI[4 * i + 2];
+ val[3] = -1.0f;
+
+ GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->int_consts[i], val));
+ }
+ }
+ checkGLcall("Load ps int consts");
+}
+
+/* GL locking is done by the caller. */
+static inline void shader_arb_vs_local_constants(IWineD3DDeviceImpl* deviceImpl)
+{
+ IWineD3DStateBlockImpl* stateBlock;
+ const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
+ unsigned char i;
+ struct shader_arb_priv *priv = deviceImpl->shader_priv;
+ const struct arb_vs_compiled_shader *gl_shader = priv->compiled_vprog;
+
+ /* Upload the position fixup */
+ GL_EXTCALL(glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, gl_shader->pos_fixup, deviceImpl->posFixup));
+
+ if(gl_shader->num_int_consts == 0) return;
+
+ stateBlock = deviceImpl->stateBlock;
+
+ for(i = 0; i < MAX_CONST_I; i++)
+ {
+ if(gl_shader->int_consts[i] != WINED3D_CONST_NUM_UNUSED)
+ {
+ float val[4];
+ val[0] = stateBlock->vertexShaderConstantI[4 * i];
+ val[1] = stateBlock->vertexShaderConstantI[4 * i + 1];
+ val[2] = stateBlock->vertexShaderConstantI[4 * i + 2];
+ val[3] = -1.0f;
+
+ GL_EXTCALL(glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, gl_shader->int_consts[i], val));
+ }
+ }
+ checkGLcall("Load vs int consts");
}
/**
* Loads the app-supplied constants into the currently set ARB_[vertex/fragment]_programs.
- *
- * We only support float constants in ARB at the moment, so don't
+ *
+ * We only support float constants in ARB at the moment, so don't
* worry about the Integers or Booleans
*/
-static void shader_arb_load_constants(
- IWineD3DDevice* device,
- char usePixelShader,
- char useVertexShader) {
-
- IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) device;
- IWineD3DStateBlockImpl* stateBlock = deviceImpl->stateBlock;
- const WineD3D_GL_Info *gl_info = &deviceImpl->adapter->gl_info;
- unsigned char i;
+/* GL locking is done by the caller (state handler) */
+static void shader_arb_load_constants(const struct wined3d_context *context, char usePixelShader, char useVertexShader)
+{
+ IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice;
+ IWineD3DStateBlockImpl* stateBlock = device->stateBlock;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
if (useVertexShader) {
IWineD3DBaseShaderImpl* vshader = (IWineD3DBaseShaderImpl*) stateBlock->vertexShader;
/* Load DirectX 9 float constants for vertex shader */
- deviceImpl->highest_dirty_vs_const = shader_arb_load_constantsF(
- vshader, gl_info, GL_VERTEX_PROGRAM_ARB,
- deviceImpl->highest_dirty_vs_const,
- stateBlock->vertexShaderConstantF,
- deviceImpl->activeContext->vshader_const_dirty);
-
- /* Upload the position fixup */
- GL_EXTCALL(glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, ARB_SHADER_PRIVCONST_POS, deviceImpl->posFixup));
+ device->highest_dirty_vs_const = shader_arb_load_constantsF(vshader, gl_info, GL_VERTEX_PROGRAM_ARB,
+ device->highest_dirty_vs_const, stateBlock->vertexShaderConstantF, context->vshader_const_dirty);
+ shader_arb_vs_local_constants(device);
}
if (usePixelShader) {
-
IWineD3DBaseShaderImpl* pshader = (IWineD3DBaseShaderImpl*) stateBlock->pixelShader;
- IWineD3DPixelShaderImpl *psi = (IWineD3DPixelShaderImpl *) pshader;
/* Load DirectX 9 float constants for pixel shader */
- deviceImpl->highest_dirty_ps_const = shader_arb_load_constantsF(
- pshader, gl_info, GL_FRAGMENT_PROGRAM_ARB,
- deviceImpl->highest_dirty_ps_const,
- stateBlock->pixelShaderConstantF,
- deviceImpl->activeContext->pshader_const_dirty);
-
- for(i = 0; i < psi->numbumpenvmatconsts; i++) {
- /* The state manager takes care that this function is always called if the bump env matrix changes
- */
- const float *data = (const float *)&stateBlock->textureState[(int) psi->bumpenvmatconst[i].texunit][WINED3DTSS_BUMPENVMAT00];
- GL_EXTCALL(glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, psi->bumpenvmatconst[i].const_num, data));
- deviceImpl->activeContext->pshader_const_dirty[psi->bumpenvmatconst[i].const_num] = 1;
-
- if (psi->luminanceconst[i].const_num != WINED3D_CONST_NUM_UNUSED)
- {
- /* WINED3DTSS_BUMPENVLSCALE and WINED3DTSS_BUMPENVLOFFSET are next to each other.
- * point gl to the scale, and load 4 floats. x = scale, y = offset, z and w are junk, we
- * don't care about them. The pointers are valid for sure because the stateblock is bigger.
- * (they're WINED3DTSS_TEXTURETRANSFORMFLAGS and WINED3DTSS_ADDRESSW, so most likely 0 or NaN
- */
- const float *scale = (const float *)&stateBlock->textureState[(int) psi->luminanceconst[i].texunit][WINED3DTSS_BUMPENVLSCALE];
- GL_EXTCALL(glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, psi->luminanceconst[i].const_num, scale));
- deviceImpl->activeContext->pshader_const_dirty[psi->luminanceconst[i].const_num] = 1;
- }
- }
+ device->highest_dirty_ps_const = shader_arb_load_constantsF(pshader, gl_info, GL_FRAGMENT_PROGRAM_ARB,
+ device->highest_dirty_ps_const, stateBlock->pixelShaderConstantF, context->pshader_const_dirty);
+ shader_arb_ps_local_constants(device);
}
}
static void shader_arb_update_float_vertex_constants(IWineD3DDevice *iface, UINT start, UINT count)
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ struct wined3d_context *context = context_get_current();
/* We don't want shader constant dirtification to be an O(contexts), so just dirtify the active
* context. On a context switch the old context will be fully dirtified */
- memset(This->activeContext->vshader_const_dirty + start, 1,
- sizeof(*This->activeContext->vshader_const_dirty) * count);
- This->highest_dirty_vs_const = max(This->highest_dirty_vs_const, start + count + 1);
+ if (!context || ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice != This) return;
+
+ memset(context->vshader_const_dirty + start, 1, sizeof(*context->vshader_const_dirty) * count);
+ This->highest_dirty_vs_const = max(This->highest_dirty_vs_const, start + count);
}
static void shader_arb_update_float_pixel_constants(IWineD3DDevice *iface, UINT start, UINT count)
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ struct wined3d_context *context = context_get_current();
/* We don't want shader constant dirtification to be an O(contexts), so just dirtify the active
* context. On a context switch the old context will be fully dirtified */
- memset(This->activeContext->pshader_const_dirty + start, 1,
- sizeof(*This->activeContext->pshader_const_dirty) * count);
- This->highest_dirty_ps_const = max(This->highest_dirty_ps_const, start + count + 1);
+ if (!context || ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice != This) return;
+
+ memset(context->pshader_const_dirty + start, 1, sizeof(*context->pshader_const_dirty) * count);
+ This->highest_dirty_ps_const = max(This->highest_dirty_ps_const, start + count);
}
static DWORD *local_const_mapping(IWineD3DBaseShaderImpl *This)
@@ -277,7 +592,7 @@ static DWORD *local_const_mapping(IWineD3DBaseShaderImpl *This)
if(This->baseShader.load_local_constsF || list_empty(&This->baseShader.constantsF)) return NULL;
- ret = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD) * This->baseShader.limits.temporary);
+ ret = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD) * This->baseShader.limits.constant_float);
if(!ret) {
ERR("Out of memory\n");
return NULL;
@@ -290,83 +605,75 @@ static DWORD *local_const_mapping(IWineD3DBaseShaderImpl *This)
}
/* Generate the variable & register declarations for the ARB_vertex_program output target */
-static void shader_generate_arb_declarations(IWineD3DBaseShader *iface, const shader_reg_maps *reg_maps,
- SHADER_BUFFER *buffer, const WineD3D_GL_Info *gl_info, DWORD *lconst_map)
+static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const shader_reg_maps *reg_maps,
+ struct wined3d_shader_buffer *buffer, const struct wined3d_gl_info *gl_info, DWORD *lconst_map,
+ DWORD *num_clipplanes, struct shader_arb_ctx_priv *ctx)
{
IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface;
- IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device;
- DWORD i, cur;
+ DWORD i, next_local = 0;
char pshader = shader_is_pshader_version(reg_maps->shader_version.type);
- unsigned max_constantsF = min(This->baseShader.limits.constant_float,
- (pshader ? GL_LIMITS(pshader_constantsF) - ARB_SHADER_RESERVED_PS_CONSTS :
- GL_LIMITS(vshader_constantsF) - ARB_SHADER_RESERVED_VS_CONSTS));
- UINT extra_constants_needed = 0;
+ unsigned max_constantsF;
const local_constant *lconst;
+ DWORD map;
- /* Temporary Output register */
- shader_addline(buffer, "TEMP TMP_OUT;\n");
+ /* In pixel shaders, all private constants are program local, we don't need anything
+ * from program.env. Thus we can advertise the full set of constants in pixel shaders.
+ * If we need a private constant the GL implementation will squeeze it in somewhere
+ *
+ * With vertex shaders we need the posFixup and on some GL implementations 4 helper
+ * immediate values. The posFixup is loaded using program.env for now, so always
+ * subtract one from the number of constants. If the shader uses indirect addressing,
+ * account for the helper const too because we have to declare all availabke d3d constants
+ * and don't know which are actually used.
+ */
+ if(pshader) {
+ max_constantsF = GL_LIMITS(pshader_constantsF);
+ } else {
+ if(This->baseShader.reg_maps.usesrelconstF) {
+ DWORD highest_constf = 0, clip_limit;
+ max_constantsF = GL_LIMITS(vshader_constantsF) - reserved_vs_const(iface, gl_info);
+ max_constantsF -= count_bits(This->baseShader.reg_maps.integer_constants);
- for(i = 0; i < This->baseShader.limits.temporary; i++) {
- if (reg_maps->temporary[i])
- shader_addline(buffer, "TEMP R%u;\n", i);
- }
-
- for (i = 0; i < This->baseShader.limits.address; i++) {
- if (reg_maps->address[i])
- shader_addline(buffer, "ADDRESS A%d;\n", i);
- }
-
- for(i = 0; i < This->baseShader.limits.texcoord; i++) {
- if (reg_maps->texcoord[i])
- shader_addline(buffer,"TEMP T%u;\n", i);
- }
-
- /* Texture coordinate registers must be pre-loaded */
- for (i = 0; i < This->baseShader.limits.texcoord; i++) {
- if (reg_maps->texcoord[i])
- shader_addline(buffer, "MOV T%u, fragment.texcoord[%u];\n", i, i);
- }
-
- for(i = 0; i < (sizeof(reg_maps->bumpmat) / sizeof(reg_maps->bumpmat[0])); i++) {
- IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) This;
- if(!reg_maps->bumpmat[i]) continue;
-
- cur = ps->numbumpenvmatconsts;
- ps->bumpenvmatconst[cur].const_num = -1;
- ps->bumpenvmatconst[cur].texunit = i;
- ps->luminanceconst[cur].const_num = -1;
- ps->luminanceconst[cur].texunit = i;
-
- /* If the shader does not use all available constants, use the next free constant to load the bump mapping environment matrix from
- * the stateblock into the shader. If no constant is available don't load, texbem will then just sample the texture without applying
- * bump mapping.
- */
- if(max_constantsF + extra_constants_needed < GL_LIMITS(pshader_constantsF) - ARB_SHADER_RESERVED_PS_CONSTS) {
- ps->bumpenvmatconst[cur].const_num = max_constantsF + extra_constants_needed;
- shader_addline(buffer, "PARAM bumpenvmat%d = program.env[%d];\n",
- i, ps->bumpenvmatconst[cur].const_num);
- extra_constants_needed++;
-
- if(reg_maps->luminanceparams && max_constantsF + extra_constants_needed < GL_LIMITS(pshader_constantsF) - ARB_SHADER_RESERVED_PS_CONSTS) {
- ((IWineD3DPixelShaderImpl *)This)->luminanceconst[cur].const_num = max_constantsF + extra_constants_needed;
- shader_addline(buffer, "PARAM luminance%d = program.env[%d];\n",
- i, ps->luminanceconst[cur].const_num);
- extra_constants_needed++;
- } else if(reg_maps->luminanceparams) {
- FIXME("No free constant to load the luminance parameters\n");
+ for(i = 0; i < This->baseShader.limits.constant_float; i++)
+ {
+ DWORD idx = i >> 5;
+ DWORD shift = i & 0x1f;
+ if(reg_maps->constf[idx] & (1 << shift)) highest_constf = i;
}
- } else {
- FIXME("No free constant found to load environment bump mapping matrix into the shader. texbem instruction will not apply bump mapping\n");
- }
- ps->numbumpenvmatconsts = cur + 1;
+ clip_limit = GL_LIMITS(clipplanes);
+ if(ctx->target_version == ARB) clip_limit = min(clip_limit, 4);
+ *num_clipplanes = min(clip_limit, max_constantsF - highest_constf - 1);
+ max_constantsF -= *num_clipplanes;
+ if(*num_clipplanes < clip_limit)
+ {
+ WARN("Only %u clipplanes out of %u enabled\n", *num_clipplanes, GL_LIMITS(clipplanes));
+ }
+ }
+ else
+ {
+ if(ctx->target_version >= NV2) *num_clipplanes = GL_LIMITS(clipplanes);
+ else *num_clipplanes = min(GL_LIMITS(clipplanes), 4);
+ max_constantsF = GL_LIMITS(vshader_constantsF);
+ }
}
- if(device->stateBlock->renderState[WINED3DRS_SRGBWRITEENABLE] && pshader) {
- shader_addline(buffer, "PARAM srgb_consts1 = {%f, %f, %f, %f};\n",
- srgb_mul_low, srgb_cmp, srgb_pow, srgb_mul_high);
- shader_addline(buffer, "PARAM srgb_consts2 = {%f, %f, %f, %f};\n",
- srgb_sub_high, 0.0, 0.0, 0.0);
+ for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i)
+ {
+ if (map & 1) shader_addline(buffer, "TEMP R%u;\n", i);
+ }
+
+ for (i = 0, map = reg_maps->address; map; map >>= 1, ++i)
+ {
+ if (map & 1) shader_addline(buffer, "ADDRESS A%u;\n", i);
+ }
+
+ if (pshader && reg_maps->shader_version.major == 1 && reg_maps->shader_version.minor <= 3)
+ {
+ for (i = 0, map = reg_maps->texcoord; map; map >>= 1, ++i)
+ {
+ if (map & 1) shader_addline(buffer, "TEMP T%u;\n", i);
+ }
}
/* Load local constants using the program-local space,
@@ -376,6 +683,7 @@ static void shader_generate_arb_declarations(IWineD3DBaseShader *iface, const sh
LIST_FOR_EACH_ENTRY(lconst, &This->baseShader.constantsF, local_constant, entry) {
shader_addline(buffer, "PARAM C%u = program.local[%u];\n", lconst->idx,
lconst_map[lconst->idx]);
+ next_local = max(next_local, lconst_map[lconst->idx] + 1);
}
}
@@ -399,6 +707,8 @@ static void shader_generate_arb_declarations(IWineD3DBaseShader *iface, const sh
}
}
}
+
+ return next_local;
}
static const char * const shift_tab[] = {
@@ -424,14 +734,8 @@ static void shader_arb_get_write_mask(const struct wined3d_shader_instruction *i
const struct wined3d_shader_dst_param *dst, char *write_mask)
{
char *ptr = write_mask;
- char vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
- if (vshader && dst->reg.type == WINED3DSPR_ADDR)
- {
- *ptr++ = '.';
- *ptr++ = 'x';
- }
- else if (dst->write_mask != WINED3DSP_WRITEMASK_ALL)
+ if (dst->write_mask != WINED3DSP_WRITEMASK_ALL)
{
*ptr++ = '.';
if (dst->write_mask & WINED3DSP_WRITEMASK_0) *ptr++ = 'x';
@@ -476,73 +780,207 @@ static void shader_arb_get_swizzle(const struct wined3d_shader_src_param *param,
*ptr = '\0';
}
-static void shader_arb_get_register_name(IWineD3DBaseShader *iface, WINED3DSHADER_PARAM_REGISTER_TYPE register_type,
- UINT register_idx, BOOL rel_addr, char *register_name, BOOL *is_color)
+static void shader_arb_request_a0(const struct wined3d_shader_instruction *ins, const char *src)
+{
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+
+ if(strcmp(priv->addr_reg, src) == 0) return;
+
+ strcpy(priv->addr_reg, src);
+ shader_addline(buffer, "ARL A0.x, %s;\n", src);
+}
+
+static void shader_arb_get_src_param(const struct wined3d_shader_instruction *ins,
+ const struct wined3d_shader_src_param *src, unsigned int tmpreg, char *outregstr);
+
+static void shader_arb_get_register_name(const struct wined3d_shader_instruction *ins,
+ const struct wined3d_shader_register *reg, char *register_name, BOOL *is_color)
{
/* oPos, oFog and oPts in D3D */
static const char * const rastout_reg_names[] = {"TMP_OUT", "result.fogcoord", "result.pointsize"};
- IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)iface;
+ IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
BOOL pshader = shader_is_pshader_version(This->baseShader.reg_maps.shader_version.type);
+ struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
*is_color = FALSE;
- switch (register_type)
+ switch (reg->type)
{
case WINED3DSPR_TEMP:
- sprintf(register_name, "R%u", register_idx);
+ sprintf(register_name, "R%u", reg->idx);
break;
case WINED3DSPR_INPUT:
if (pshader)
{
- if (register_idx == 0) strcpy(register_name, "fragment.color.primary");
- else strcpy(register_name, "fragment.color.secondary");
+ if(This->baseShader.reg_maps.shader_version.major < 3)
+ {
+ if (reg->idx == 0) strcpy(register_name, "fragment.color.primary");
+ else strcpy(register_name, "fragment.color.secondary");
+ }
+ else
+ {
+ if(reg->rel_addr)
+ {
+ char rel_reg[50];
+ shader_arb_get_src_param(ins, reg->rel_addr, 0, rel_reg);
+
+ if(strcmp(rel_reg, "**aL_emul**") == 0)
+ {
+ DWORD idx = ctx->aL + reg->idx;
+ if(idx < MAX_REG_INPUT)
+ {
+ strcpy(register_name, ctx->ps_input[idx]);
+ }
+ else
+ {
+ ERR("Pixel shader input register out of bounds: %u\n", idx);
+ sprintf(register_name, "out_of_bounds_%u", idx);
+ }
+ }
+ else if(This->baseShader.reg_maps.input_registers & 0x0300)
+ {
+ /* There are two ways basically:
+ *
+ * 1) Use the unrolling code that is used for loop emulation and unroll the loop.
+ * That means trouble if the loop also contains a breakc or if the control values
+ * aren't local constants.
+ * 2) Generate an if block that checks if aL.y < 8, == 8 or == 9 and selects the
+ * source dynamically. The trouble is that we cannot simply read aL.y because it
+ * is an ADDRESS register. We could however push it, load .zw with a value and use
+ * ADAC to load the condition code register and pop it again afterwards
+ */
+ FIXME("Relative input register addressing with more than 8 registers\n");
+
+ /* This is better than nothing for now */
+ sprintf(register_name, "fragment.texcoord[%s + %u]", rel_reg, reg->idx);
+ }
+ else if(ctx->cur_ps_args->super.vp_mode != vertexshader)
+ {
+ /* This is problematic because we'd have to consult the ctx->ps_input strings
+ * for where to find the varying. Some may be "0.0", others can be texcoords or
+ * colors. This needs either a pipeline replacement to make the vertex shader feed
+ * proper varyings, or loop unrolling
+ *
+ * For now use the texcoords and hope for the best
+ */
+ FIXME("Non-vertex shader varying input with indirect addressing\n");
+ sprintf(register_name, "fragment.texcoord[%s + %u]", rel_reg, reg->idx);
+ }
+ else
+ {
+ /* D3D supports indirect addressing only with aL in loop registers. The loop instruction
+ * pulls GL_NV_fragment_program2 in
+ */
+ sprintf(register_name, "fragment.texcoord[%s + %u]", rel_reg, reg->idx);
+ }
+ }
+ else
+ {
+ if(reg->idx < MAX_REG_INPUT)
+ {
+ strcpy(register_name, ctx->ps_input[reg->idx]);
+ }
+ else
+ {
+ ERR("Pixel shader input register out of bounds: %u\n", reg->idx);
+ sprintf(register_name, "out_of_bounds_%u", reg->idx);
+ }
+ }
+ }
}
else
{
- if (((IWineD3DVertexShaderImpl *)This)->cur_args->swizzle_map & (1 << register_idx)) *is_color = TRUE;
- sprintf(register_name, "vertex.attrib[%u]", register_idx);
+ if (ctx->cur_vs_args->super.swizzle_map & (1 << reg->idx)) *is_color = TRUE;
+ sprintf(register_name, "vertex.attrib[%u]", reg->idx);
}
break;
case WINED3DSPR_CONST:
- if (!pshader && rel_addr)
+ if (!pshader && reg->rel_addr)
{
+ BOOL aL = FALSE;
+ char rel_reg[50];
UINT rel_offset = ((IWineD3DVertexShaderImpl *)This)->rel_offset;
- if (register_idx >= rel_offset)
- sprintf(register_name, "C[A0.x + %u]", register_idx - rel_offset);
+ if(This->baseShader.reg_maps.shader_version.major < 2) {
+ sprintf(rel_reg, "A0.x");
+ } else {
+ shader_arb_get_src_param(ins, reg->rel_addr, 0, rel_reg);
+ if(ctx->target_version == ARB) {
+ if(strcmp(rel_reg, "**aL_emul**") == 0) {
+ aL = TRUE;
+ } else {
+ shader_arb_request_a0(ins, rel_reg);
+ sprintf(rel_reg, "A0.x");
+ }
+ }
+ }
+ if(aL)
+ sprintf(register_name, "C[%u]", ctx->aL + reg->idx);
+ else if (reg->idx >= rel_offset)
+ sprintf(register_name, "C[%s + %u]", rel_reg, reg->idx - rel_offset);
else
- sprintf(register_name, "C[A0.x - %u]", -register_idx + rel_offset);
+ sprintf(register_name, "C[%s - %u]", rel_reg, -reg->idx + rel_offset);
}
else
{
if (This->baseShader.reg_maps.usesrelconstF)
- sprintf(register_name, "C[%u]", register_idx);
+ sprintf(register_name, "C[%u]", reg->idx);
else
- sprintf(register_name, "C%u", register_idx);
+ sprintf(register_name, "C%u", reg->idx);
}
break;
case WINED3DSPR_TEXTURE: /* case WINED3DSPR_ADDR: */
- if (pshader) sprintf(register_name, "T%u", register_idx);
- else sprintf(register_name, "A%u", register_idx);
+ if (pshader) {
+ if(This->baseShader.reg_maps.shader_version.major == 1 &&
+ This->baseShader.reg_maps.shader_version.minor <= 3) {
+ /* In ps <= 1.3, Tx is a temporary register as destination to all instructions,
+ * and as source to most instructions. For some instructions it is the texcoord
+ * input. Those instructions know about the special use
+ */
+ sprintf(register_name, "T%u", reg->idx);
+ } else {
+ /* in ps 1.4 and 2.x Tx is always a (read-only) varying */
+ sprintf(register_name, "fragment.texcoord[%u]", reg->idx);
+ }
+ }
+ else
+ {
+ if(This->baseShader.reg_maps.shader_version.major == 1 || ctx->target_version >= NV2)
+ {
+ sprintf(register_name, "A%u", reg->idx);
+ }
+ else
+ {
+ sprintf(register_name, "A%u_SHADOW", reg->idx);
+ }
+ }
break;
case WINED3DSPR_COLOROUT:
- if (register_idx == 0)
+ if(ctx->cur_ps_args->super.srgb_correction && reg->idx == 0)
{
strcpy(register_name, "TMP_COLOR");
}
else
{
- /* TODO: See GL_ARB_draw_buffers */
- FIXME("Unsupported write to render target %u\n", register_idx);
- sprintf(register_name, "unsupported_register");
+ if(ctx->cur_ps_args->super.srgb_correction) FIXME("sRGB correction on higher render targets\n");
+ if(This->baseShader.reg_maps.highest_render_target > 0)
+ {
+ sprintf(register_name, "result.color[%u]", reg->idx);
+ }
+ else
+ {
+ strcpy(register_name, "result.color");
+ }
}
break;
case WINED3DSPR_RASTOUT:
- sprintf(register_name, "%s", rastout_reg_names[register_idx]);
+ if(reg->idx == 1) sprintf(register_name, "%s", ctx->fog_output);
+ else sprintf(register_name, "%s", rastout_reg_names[reg->idx]);
break;
case WINED3DSPR_DEPTHOUT:
@@ -550,19 +988,71 @@ static void shader_arb_get_register_name(IWineD3DBaseShader *iface, WINED3DSHADE
break;
case WINED3DSPR_ATTROUT:
- if (pshader) sprintf(register_name, "oD[%u]", register_idx);
- else if (register_idx == 0) strcpy(register_name, "result.color.primary");
- else strcpy(register_name, "result.color.secondary");
+ /* case WINED3DSPR_OUTPUT: */
+ if (pshader) sprintf(register_name, "oD[%u]", reg->idx);
+ else strcpy(register_name, ctx->color_output[reg->idx]);
break;
case WINED3DSPR_TEXCRDOUT:
- if (pshader) sprintf(register_name, "oT[%u]", register_idx);
- else sprintf(register_name, "result.texcoord[%u]", register_idx);
+ if (pshader)
+ {
+ sprintf(register_name, "oT[%u]", reg->idx);
+ }
+ else
+ {
+ if(This->baseShader.reg_maps.shader_version.major < 3)
+ {
+ strcpy(register_name, ctx->texcrd_output[reg->idx]);
+ }
+ else
+ {
+ strcpy(register_name, ctx->vs_output[reg->idx]);
+ }
+ }
+ break;
+
+ case WINED3DSPR_LOOP:
+ if(ctx->target_version >= NV2)
+ {
+ /* Pshader has an implicitly declared loop index counter A0.x that cannot be renamed */
+ if(pshader) sprintf(register_name, "A0.x");
+ else sprintf(register_name, "aL.y");
+ }
+ else
+ {
+ /* Unfortunately this code cannot return the value of ctx->aL here. An immediate value
+ * would be valid, but if aL is used for indexing(its only use), there's likely an offset,
+ * thus the result would be something like C[15 + 30], which is not valid in the ARB program
+ * grammar. So return a marker for the emulated aL and intercept it in constant and varying
+ * indexing
+ */
+ sprintf(register_name, "**aL_emul**");
+ }
+
+ break;
+
+ case WINED3DSPR_CONSTINT:
+ sprintf(register_name, "I%u", reg->idx);
+ break;
+
+ case WINED3DSPR_MISCTYPE:
+ if(reg->idx == 0)
+ {
+ sprintf(register_name, "vpos");
+ }
+ else if(reg->idx == 1)
+ {
+ sprintf(register_name, "fragment.facing.x");
+ }
+ else
+ {
+ FIXME("Unknown MISCTYPE register index %u\n", reg->idx);
+ }
break;
default:
- FIXME("Unhandled register type %#x[%u]\n", register_type, register_idx);
- sprintf(register_name, "unrecognized_register[%u]", register_idx);
+ FIXME("Unhandled register type %#x[%u]\n", reg->type, reg->idx);
+ sprintf(register_name, "unrecognized_register[%u]", reg->idx);
break;
}
}
@@ -574,8 +1064,7 @@ static void shader_arb_get_dst_param(const struct wined3d_shader_instruction *in
char write_mask[6];
BOOL is_color;
- shader_arb_get_register_name(ins->ctx->shader, wined3d_dst->reg.type,
- wined3d_dst->reg.idx, !!wined3d_dst->reg.rel_addr, register_name, &is_color);
+ shader_arb_get_register_name(ins, &wined3d_dst->reg, register_name, &is_color);
strcpy(str, register_name);
shader_arb_get_write_mask(ins, wined3d_dst, write_mask);
@@ -598,8 +1087,8 @@ static const char *shader_arb_get_fixup_swizzle(enum fixup_channel_source channe
}
}
-static void gen_color_correction(SHADER_BUFFER *buffer, const char *reg, DWORD dst_mask,
- const char *one, const char *two, struct color_fixup_desc fixup)
+static void gen_color_correction(struct wined3d_shader_buffer *buffer, const char *reg,
+ DWORD dst_mask, const char *one, const char *two, struct color_fixup_desc fixup)
{
DWORD mask;
@@ -650,14 +1139,63 @@ static void gen_color_correction(SHADER_BUFFER *buffer, const char *reg, DWORD d
}
}
-static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD sampler_idx,
- const char *dst_str, const char *coord_reg, BOOL projected, BOOL bias)
+static const char *shader_arb_get_modifier(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ DWORD mod;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ if (!ins->dst_count) return "";
+
+ mod = ins->dst[0].modifiers;
+
+ /* Silently ignore PARTIALPRECISION if its not supported */
+ if(priv->target_version == ARB) mod &= ~WINED3DSPDM_PARTIALPRECISION;
+
+ if(mod & WINED3DSPDM_MSAMPCENTROID)
+ {
+ FIXME("Unhandled modifier WINED3DSPDM_MSAMPCENTROID\n");
+ mod &= ~WINED3DSPDM_MSAMPCENTROID;
+ }
+
+ switch(mod)
+ {
+ case WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION:
+ return "H_SAT";
+
+ case WINED3DSPDM_SATURATE:
+ return "_SAT";
+
+ case WINED3DSPDM_PARTIALPRECISION:
+ return "H";
+
+ case 0:
+ return "";
+
+ default:
+ FIXME("Unknown modifiers 0x%08x\n", mod);
+ return "";
+ }
+}
+
+#define TEX_PROJ 0x1
+#define TEX_BIAS 0x2
+#define TEX_LOD 0x4
+#define TEX_DERIV 0x10
+
+static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD sampler_idx,
+ const char *dst_str, const char *coord_reg, WORD flags, const char *dsx, const char *dsy)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
DWORD sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
const char *tex_type;
+ BOOL np2_fixup = FALSE;
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ const char *mod;
+ BOOL pshader = shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type);
+
+ /* D3D vertex shader sampler IDs are vertex samplers(0-3), not global d3d samplers */
+ if(!pshader) sampler_idx += MAX_FRAGMENT_SAMPLERS;
switch(sampler_type) {
case WINED3DSTT_1D:
@@ -673,10 +1211,11 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
}
if (shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type))
{
- const IWineD3DPixelShaderImpl* const ps = (const IWineD3DPixelShaderImpl*)This;
- if(ps->cur_args->np2_fixup & (1 << sampler_idx)) {
- FIXME("NP2 texcoord fixup is currently not implemented in ARB mode (use GLSL instead).\n");
- }
+ if (priv->cur_np2fixup_info->super.active & (1 << sampler_idx))
+ {
+ if (flags) FIXME("Only ordinary sampling from NP2 textures is supported.\n");
+ else np2_fixup = TRUE;
+ }
}
break;
@@ -693,22 +1232,61 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
tex_type = "";
}
- if (bias) {
- /* Shouldn't be possible, but let's check for it */
- if(projected) FIXME("Biased and Projected texture sampling\n");
- /* TXB takes the 4th component of the source vector automatically, as d3d. Nothing more to do */
- shader_addline(buffer, "TXB %s, %s, texture[%u], %s;\n", dst_str, coord_reg, sampler_idx, tex_type);
- } else if (projected) {
- shader_addline(buffer, "TXP %s, %s, texture[%u], %s;\n", dst_str, coord_reg, sampler_idx, tex_type);
- } else {
- shader_addline(buffer, "TEX %s, %s, texture[%u], %s;\n", dst_str, coord_reg, sampler_idx, tex_type);
+ /* TEX, TXL, TXD and TXP do not support the "H" modifier,
+ * so don't use shader_arb_get_modifier
+ */
+ if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE) mod = "_SAT";
+ else mod = "";
+
+ /* Fragment samplers always have indentity mapping */
+ if(sampler_idx >= MAX_FRAGMENT_SAMPLERS)
+ {
+ sampler_idx = priv->cur_vs_args->vertex_samplers[sampler_idx - MAX_FRAGMENT_SAMPLERS];
}
- if (shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type))
+ if (flags & TEX_DERIV)
+ {
+ if(flags & TEX_PROJ) FIXME("Projected texture sampling with custom derivatives\n");
+ if(flags & TEX_BIAS) FIXME("Biased texture sampling with custom derivatives\n");
+ shader_addline(buffer, "TXD%s %s, %s, %s, %s, texture[%u], %s;\n", mod, dst_str, coord_reg,
+ dsx, dsy,sampler_idx, tex_type);
+ }
+ else if(flags & TEX_LOD)
+ {
+ if(flags & TEX_PROJ) FIXME("Projected texture sampling with explicit lod\n");
+ if(flags & TEX_BIAS) FIXME("Biased texture sampling with explicit lod\n");
+ shader_addline(buffer, "TXL%s %s, %s, texture[%u], %s;\n", mod, dst_str, coord_reg,
+ sampler_idx, tex_type);
+ }
+ else if (flags & TEX_BIAS)
+ {
+ /* Shouldn't be possible, but let's check for it */
+ if(flags & TEX_PROJ) FIXME("Biased and Projected texture sampling\n");
+ /* TXB takes the 4th component of the source vector automatically, as d3d. Nothing more to do */
+ shader_addline(buffer, "TXB%s %s, %s, texture[%u], %s;\n", mod, dst_str, coord_reg, sampler_idx, tex_type);
+ }
+ else if (flags & TEX_PROJ)
+ {
+ shader_addline(buffer, "TXP%s %s, %s, texture[%u], %s;\n", mod, dst_str, coord_reg, sampler_idx, tex_type);
+ }
+ else
+ {
+ if (np2_fixup)
+ {
+ const unsigned char idx = priv->cur_np2fixup_info->super.idx[sampler_idx];
+ shader_addline(buffer, "MUL TA, np2fixup[%u].%s, %s;\n", idx >> 1,
+ (idx % 2) ? "zwxy" : "xyzw", coord_reg);
+
+ shader_addline(buffer, "TEX%s %s, TA, texture[%u], %s;\n", mod, dst_str, sampler_idx, tex_type);
+ }
+ else
+ shader_addline(buffer, "TEX%s %s, %s, texture[%u], %s;\n", mod, dst_str, coord_reg, sampler_idx, tex_type);
+ }
+
+ if (pshader)
{
- IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
gen_color_correction(buffer, dst_str, ins->dst[0].write_mask,
- "one", "coefmul.x", ps->cur_args->color_fixup[sampler_idx]);
+ "one", "coefmul.x", priv->cur_ps_args->super.color_fixup[sampler_idx]);
}
}
@@ -720,14 +1298,14 @@ static void shader_arb_get_src_param(const struct wined3d_shader_instruction *in
char regstr[256];
char swzstr[20];
int insert_line;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
/* Assume a new line will be added */
insert_line = 1;
/* Get register name */
- shader_arb_get_register_name(ins->ctx->shader, src->reg.type,
- src->reg.idx, !!src->reg.rel_addr, regstr, &is_color);
+ shader_arb_get_register_name(ins, &src->reg, regstr, &is_color);
shader_arb_get_swizzle(src, is_color, swzstr);
switch (src->modifiers)
@@ -769,6 +1347,23 @@ static void shader_arb_get_src_param(const struct wined3d_shader_instruction *in
shader_addline(buffer, "RCP T%c, %s.w;\n", 'A' + tmpreg, regstr);
shader_addline(buffer, "MUL T%c, %s, T%c;\n", 'A' + tmpreg, regstr, 'A' + tmpreg);
break;
+ case WINED3DSPSM_ABS:
+ if(ctx->target_version >= NV2) {
+ sprintf(outregstr, "|%s%s|", regstr, swzstr);
+ insert_line = 0;
+ } else {
+ shader_addline(buffer, "ABS T%c, %s;\n", 'A' + tmpreg, regstr);
+ }
+ break;
+ case WINED3DSPSM_ABSNEG:
+ if(ctx->target_version >= NV2) {
+ sprintf(outregstr, "-|%s%s|", regstr, swzstr);
+ } else {
+ shader_addline(buffer, "ABS T%c, %s;\n", 'A' + tmpreg, regstr);
+ sprintf(outregstr, "-T%c%s", 'A' + tmpreg, swzstr);
+ }
+ insert_line = 0;
+ break;
default:
sprintf(outregstr, "%s%s", regstr, swzstr);
insert_line = 0;
@@ -781,106 +1376,116 @@ static void shader_arb_get_src_param(const struct wined3d_shader_instruction *in
static void pshader_hw_bem(const struct wined3d_shader_instruction *ins)
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char dst_name[50];
char src_name[2][50];
- char dst_wmask[20];
DWORD sampler_code = dst->reg.idx;
- BOOL has_bumpmat = FALSE;
- BOOL is_color;
- int i;
- for(i = 0; i < This->numbumpenvmatconsts; i++) {
- if (This->bumpenvmatconst[i].const_num != WINED3D_CONST_NUM_UNUSED
- && This->bumpenvmatconst[i].texunit == sampler_code)
- {
- has_bumpmat = TRUE;
- break;
- }
- }
+ shader_arb_get_dst_param(ins, dst, dst_name);
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, dst_name, &is_color);
- shader_arb_get_write_mask(ins, dst, dst_wmask);
- strcat(dst_name, dst_wmask);
+ /* Sampling the perturbation map in Tsrc was done already, including the signedness correction if needed
+ *
+ * Keep in mind that src_name[1] can be "TB" and src_name[0] can be "TA" because modifiers like _x2 are valid
+ * with bem. So delay loading the first parameter until after the perturbation calculation which needs two
+ * temps is done.
+ */
+ shader_arb_get_src_param(ins, &ins->src[1], 1, src_name[1]);
+ shader_addline(buffer, "SWZ TA, bumpenvmat%d, x, z, 0, 0;\n", sampler_code);
+ shader_addline(buffer, "DP3 TC.r, TA, %s;\n", src_name[1]);
+ shader_addline(buffer, "SWZ TA, bumpenvmat%d, y, w, 0, 0;\n", sampler_code);
+ shader_addline(buffer, "DP3 TC.g, TA, %s;\n", src_name[1]);
shader_arb_get_src_param(ins, &ins->src[0], 0, src_name[0]);
- shader_arb_get_src_param(ins, &ins->src[1], 1, src_name[1]);
+ shader_addline(buffer, "ADD %s, %s, TC;\n", dst_name, src_name[0]);
+}
- if(has_bumpmat) {
- /* Sampling the perturbation map in Tsrc was done already, including the signedness correction if needed */
- shader_addline(buffer, "SWZ TMP2, bumpenvmat%d, x, z, 0, 0;\n", sampler_code);
- shader_addline(buffer, "DP3 TMP.r, TMP2, %s;\n", src_name[1]);
- shader_addline(buffer, "SWZ TMP2, bumpenvmat%d, y, w, 0, 0;\n", sampler_code);
- shader_addline(buffer, "DP3 TMP.g, TMP2, %s;\n", src_name[1]);
-
- shader_addline(buffer, "ADD %s, %s, TMP;\n", dst_name, src_name[0]);
- } else {
- shader_addline(buffer, "MOV %s, %s;\n", dst_name, src_name[0]);
+static DWORD negate_modifiers(DWORD mod, char *extra_char)
+{
+ *extra_char = ' ';
+ switch(mod)
+ {
+ case WINED3DSPSM_NONE: return WINED3DSPSM_NEG;
+ case WINED3DSPSM_NEG: return WINED3DSPSM_NONE;
+ case WINED3DSPSM_BIAS: return WINED3DSPSM_BIASNEG;
+ case WINED3DSPSM_BIASNEG: return WINED3DSPSM_BIAS;
+ case WINED3DSPSM_SIGN: return WINED3DSPSM_SIGNNEG;
+ case WINED3DSPSM_SIGNNEG: return WINED3DSPSM_SIGN;
+ case WINED3DSPSM_COMP: *extra_char = '-'; return WINED3DSPSM_COMP;
+ case WINED3DSPSM_X2: return WINED3DSPSM_X2NEG;
+ case WINED3DSPSM_X2NEG: return WINED3DSPSM_X2;
+ case WINED3DSPSM_DZ: *extra_char = '-'; return WINED3DSPSM_DZ;
+ case WINED3DSPSM_DW: *extra_char = '-'; return WINED3DSPSM_DW;
+ case WINED3DSPSM_ABS: return WINED3DSPSM_ABSNEG;
+ case WINED3DSPSM_ABSNEG: return WINED3DSPSM_ABS;
}
+ FIXME("Unknown modifier %u\n", mod);
+ return mod;
}
static void pshader_hw_cnd(const struct wined3d_shader_instruction *ins)
{
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
- char dst_wmask[20];
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char dst_name[50];
char src_name[3][50];
- BOOL sat = dst->modifiers & WINED3DSPDM_SATURATE;
- BOOL is_color;
DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
ins->ctx->reg_maps->shader_version.minor);
+ BOOL is_color;
- /* FIXME: support output modifiers */
-
- /* Handle output register */
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, dst_name, &is_color);
- shader_arb_get_write_mask(ins, dst, dst_wmask);
-
- /* Generate input register names (with modifiers) */
- shader_arb_get_src_param(ins, &ins->src[0], 0, src_name[0]);
+ shader_arb_get_dst_param(ins, dst, dst_name);
shader_arb_get_src_param(ins, &ins->src[1], 1, src_name[1]);
- shader_arb_get_src_param(ins, &ins->src[2], 2, src_name[2]);
/* The coissue flag changes the semantic of the cnd instruction in <= 1.3 shaders */
if (shader_version <= WINED3D_SHADER_VERSION(1, 3) && ins->coissue)
{
- shader_addline(buffer, "MOV%s %s%s, %s;\n", sat ? "_SAT" : "", dst_name, dst_wmask, src_name[1]);
+ shader_addline(buffer, "MOV%s %s, %s;\n", shader_arb_get_modifier(ins), dst_name, src_name[1]);
} else {
- shader_addline(buffer, "ADD TMP, -%s, coefdiv.x;\n", src_name[0]);
- shader_addline(buffer, "CMP%s %s%s, TMP, %s, %s;\n",
- sat ? "_SAT" : "", dst_name, dst_wmask, src_name[1], src_name[2]);
+ struct wined3d_shader_src_param src0_copy = ins->src[0];
+ char extra_neg;
+
+ /* src0 may have a negate srcmod set, so we can't blindly add "-" to the name */
+ src0_copy.modifiers = negate_modifiers(src0_copy.modifiers, &extra_neg);
+
+ shader_arb_get_src_param(ins, &src0_copy, 0, src_name[0]);
+ shader_arb_get_src_param(ins, &ins->src[2], 2, src_name[2]);
+ shader_addline(buffer, "ADD TA, %c%s, coefdiv.x;\n", extra_neg, src_name[0]);
+ /* No modifiers supported on CMP */
+ shader_addline(buffer, "CMP %s, TA, %s, %s;\n", dst_name, src_name[1], src_name[2]);
+
+ /* _SAT on CMP doesn't make much sense, but it is not a pure NOP */
+ if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE)
+ {
+ shader_arb_get_register_name(ins, &dst->reg, src_name[0], &is_color);
+ shader_addline(buffer, "MOV_SAT %s, %s;\n", dst_name, dst_name);
+ }
}
}
static void pshader_hw_cmp(const struct wined3d_shader_instruction *ins)
{
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
- char dst_wmask[20];
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char dst_name[50];
char src_name[3][50];
- BOOL sat = dst->modifiers & WINED3DSPDM_SATURATE;
BOOL is_color;
- /* FIXME: support output modifiers */
-
- /* Handle output register */
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, dst_name, &is_color);
- shader_arb_get_write_mask(ins, dst, dst_wmask);
+ shader_arb_get_dst_param(ins, dst, dst_name);
/* Generate input register names (with modifiers) */
shader_arb_get_src_param(ins, &ins->src[0], 0, src_name[0]);
shader_arb_get_src_param(ins, &ins->src[1], 1, src_name[1]);
shader_arb_get_src_param(ins, &ins->src[2], 2, src_name[2]);
- shader_addline(buffer, "CMP%s %s%s, %s, %s, %s;\n", sat ? "_SAT" : "", dst_name, dst_wmask,
+ /* No modifiers are supported on CMP */
+ shader_addline(buffer, "CMP %s, %s, %s, %s;\n", dst_name,
src_name[0], src_name[2], src_name[1]);
+
+ if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE)
+ {
+ shader_arb_get_register_name(ins, &dst->reg, src_name[0], &is_color);
+ shader_addline(buffer, "MOV_SAT %s, %s;\n", dst_name, src_name[0]);
+ }
}
/** Process the WINED3DSIO_DP2ADD instruction in ARB.
@@ -888,37 +1493,64 @@ static void pshader_hw_cmp(const struct wined3d_shader_instruction *ins)
static void pshader_hw_dp2add(const struct wined3d_shader_instruction *ins)
{
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
- char dst_wmask[20];
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char dst_name[50];
char src_name[3][50];
- BOOL sat = dst->modifiers & WINED3DSPDM_SATURATE;
- BOOL is_color;
-
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, dst_name, &is_color);
- shader_arb_get_write_mask(ins, dst, dst_wmask);
+ struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
+ shader_arb_get_dst_param(ins, dst, dst_name);
shader_arb_get_src_param(ins, &ins->src[0], 0, src_name[0]);
- shader_arb_get_src_param(ins, &ins->src[1], 1, src_name[1]);
shader_arb_get_src_param(ins, &ins->src[2], 2, src_name[2]);
- /* Emulate a DP2 with a DP3 and 0.0 */
- shader_addline(buffer, "MOV TMP, %s;\n", src_name[0]);
- shader_addline(buffer, "MOV TMP.z, 0.0;\n");
- shader_addline(buffer, "DP3 TMP2, TMP, %s;\n", src_name[1]);
- shader_addline(buffer, "ADD%s %s%s, TMP2, %s;\n", sat ? "_SAT" : "", dst_name, dst_wmask, src_name[2]);
+ if(ctx->target_version >= NV3)
+ {
+ /* GL_NV_fragment_program2 has a 1:1 matching instruction */
+ shader_arb_get_src_param(ins, &ins->src[1], 1, src_name[1]);
+ shader_addline(buffer, "DP2A%s %s, %s, %s, %s;\n", shader_arb_get_modifier(ins),
+ dst_name, src_name[0], src_name[1], src_name[2]);
+ }
+ else if(ctx->target_version >= NV2)
+ {
+ /* dst.x = src2.?, src0.x, src1.x + src0.y * src1.y
+ * dst.y = src2.?, src0.x, src1.z + src0.y * src1.w
+ * dst.z = src2.?, src0.x, src1.x + src0.y * src1.y
+ * dst.z = src2.?, src0.x, src1.z + src0.y * src1.w
+ *
+ * Make sure that src1.zw = src1.xy, then we get a classic dp2add
+ *
+ * .xyxy and other swizzles that we could get with this are not valid in
+ * plain ARBfp, but luckily the NV extension grammar lifts this limitation.
+ */
+ struct wined3d_shader_src_param tmp_param = ins->src[1];
+ DWORD swizzle = tmp_param.swizzle & 0xf; /* Selects .xy */
+ tmp_param.swizzle = swizzle | (swizzle << 4); /* Creates .xyxy */
+
+ shader_arb_get_src_param(ins, &tmp_param, 1, src_name[1]);
+
+ shader_addline(buffer, "X2D%s %s, %s, %s, %s;\n", shader_arb_get_modifier(ins),
+ dst_name, src_name[2], src_name[0], src_name[1]);
+ }
+ else
+ {
+ shader_arb_get_src_param(ins, &ins->src[1], 1, src_name[1]);
+ /* Emulate a DP2 with a DP3 and 0.0. Don't use the dest as temp register, it could be src[1] or src[2]
+ * src_name[0] can be TA, but TA is a private temp for modifiers, so it is save to overwrite
+ */
+ shader_addline(buffer, "MOV TA, %s;\n", src_name[0]);
+ shader_addline(buffer, "MOV TA.z, 0.0;\n");
+ shader_addline(buffer, "DP3 TA, TA, %s;\n", src_name[1]);
+ shader_addline(buffer, "ADD%s %s, TA, %s;\n", shader_arb_get_modifier(ins), dst_name, src_name[2]);
+ }
}
/* Map the opcode 1-to-1 to the GL code */
static void shader_hw_map2gl(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
const char *instruction;
char arguments[256], dst_str[50];
unsigned int i;
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- const char *modifier;
switch (ins->handler_idx)
{
@@ -928,31 +1560,25 @@ static void shader_hw_map2gl(const struct wined3d_shader_instruction *ins)
case WINED3DSIH_DP3: instruction = "DP3"; break;
case WINED3DSIH_DP4: instruction = "DP4"; break;
case WINED3DSIH_DST: instruction = "DST"; break;
- case WINED3DSIH_EXP: instruction = "EX2"; break;
- case WINED3DSIH_EXPP: instruction = "EXP"; break;
case WINED3DSIH_FRC: instruction = "FRC"; break;
case WINED3DSIH_LIT: instruction = "LIT"; break;
- case WINED3DSIH_LOG: instruction = "LG2"; break;
- case WINED3DSIH_LOGP: instruction = "LOG"; break;
case WINED3DSIH_LRP: instruction = "LRP"; break;
case WINED3DSIH_MAD: instruction = "MAD"; break;
case WINED3DSIH_MAX: instruction = "MAX"; break;
case WINED3DSIH_MIN: instruction = "MIN"; break;
case WINED3DSIH_MOV: instruction = "MOV"; break;
case WINED3DSIH_MUL: instruction = "MUL"; break;
- case WINED3DSIH_POW: instruction = "POW"; break;
case WINED3DSIH_SGE: instruction = "SGE"; break;
case WINED3DSIH_SLT: instruction = "SLT"; break;
case WINED3DSIH_SUB: instruction = "SUB"; break;
+ case WINED3DSIH_MOVA:instruction = "ARR"; break;
+ case WINED3DSIH_SGN: instruction = "SSG"; break;
+ case WINED3DSIH_DSX: instruction = "DDX"; break;
default: instruction = "";
FIXME("Unhandled opcode %#x\n", ins->handler_idx);
break;
}
- /* All instructions handled by this function have a destination parameter */
- if(dst->modifiers & WINED3DSPDM_SATURATE) modifier = "_SAT";
- else modifier = "";
-
/* Note that shader_arb_add_dst_param() adds spaces. */
arguments[0] = '\0';
shader_arb_get_dst_param(ins, dst, dst_str);
@@ -963,36 +1589,67 @@ static void shader_hw_map2gl(const struct wined3d_shader_instruction *ins)
shader_arb_get_src_param(ins, &ins->src[i], i, operand);
strcat(arguments, operand);
}
- shader_addline(buffer, "%s%s %s%s;\n", instruction, modifier, dst_str, arguments);
+ shader_addline(buffer, "%s%s %s%s;\n", instruction, shader_arb_get_modifier(ins), dst_str, arguments);
}
static void shader_hw_nop(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
shader_addline(buffer, "NOP;\n");
}
static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
{
IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ BOOL pshader = shader_is_pshader_version(shader->baseShader.reg_maps.shader_version.type);
+ struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
- if ((ins->ctx->reg_maps->shader_version.major == 1
- && !shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type)
- && ins->dst[0].reg.type == WINED3DSPR_ADDR)
- || ins->handler_idx == WINED3DSIH_MOVA)
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char src0_param[256];
+
+ if(ins->handler_idx == WINED3DSIH_MOVA) {
+ char write_mask[6];
+
+ if(ctx->target_version >= NV2) {
+ shader_hw_map2gl(ins);
+ return;
+ }
+ shader_arb_get_src_param(ins, &ins->src[0], 0, src0_param);
+ shader_arb_get_write_mask(ins, &ins->dst[0], write_mask);
+
+ /* This implements the mova formula used in GLSL. The first two instructions
+ * prepare the sign() part. Note that it is fine to have my_sign(0.0) = 1.0
+ * in this case:
+ * mova A0.x, 0.0
+ *
+ * A0.x = arl(floor(abs(0.0) + 0.5) * 1.0) = floor(0.5) = 0.0 since arl does a floor
+ *
+ * The ARL is performed when A0 is used - the requested component is read from A0_SHADOW into
+ * A0.x. We can use the overwritten component of A0_shadow as temporary storage for the sign.
+ */
+ shader_addline(buffer, "SGE A0_SHADOW%s, %s, mova_const.y;\n", write_mask, src0_param);
+ shader_addline(buffer, "MAD A0_SHADOW%s, A0_SHADOW, mova_const.z, -mova_const.w;\n", write_mask);
+
+ shader_addline(buffer, "ABS TA%s, %s;\n", write_mask, src0_param);
+ shader_addline(buffer, "ADD TA%s, TA, mova_const.x;\n", write_mask);
+ shader_addline(buffer, "FLR TA%s, TA;\n", write_mask);
+ if (((IWineD3DVertexShaderImpl *)shader)->rel_offset)
+ {
+ shader_addline(buffer, "ADD TA%s, TA, helper_const.z;\n", write_mask);
+ }
+ shader_addline(buffer, "MUL A0_SHADOW%s, TA, A0_SHADOW;\n", write_mask);
+
+ ((struct shader_arb_ctx_priv *)ins->ctx->backend_data)->addr_reg[0] = '\0';
+ } else if (ins->ctx->reg_maps->shader_version.major == 1
+ && !shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type)
+ && ins->dst[0].reg.type == WINED3DSPR_ADDR)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
- char src0_param[256];
-
- if (ins->handler_idx == WINED3DSIH_MOVA)
- FIXME("mova should round\n");
-
src0_param[0] = '\0';
if (((IWineD3DVertexShaderImpl *)shader)->rel_offset)
{
shader_arb_get_src_param(ins, &ins->src[0], 0, src0_param);
- shader_addline(buffer, "ADD TMP.x, %s, helper_const.z;\n", src0_param);
- shader_addline(buffer, "ARL A0.x, TMP.x;\n");
+ shader_addline(buffer, "ADD TA.x, %s, helper_const.z;\n", src0_param);
+ shader_addline(buffer, "ARL A0.x, TA.x;\n");
}
else
{
@@ -1005,6 +1662,16 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
shader_addline(buffer, "ARL A0.x, %s;\n", src0_param);
}
}
+ else if(ins->dst[0].reg.type == WINED3DSPR_COLOROUT && ins->dst[0].reg.idx == 0 && pshader)
+ {
+ IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) shader;
+ if(ctx->cur_ps_args->super.srgb_correction && ps->color0_mov)
+ {
+ shader_addline(buffer, "#mov handled in srgb write code\n");
+ return;
+ }
+ shader_hw_map2gl(ins);
+ }
else
{
shader_hw_map2gl(ins);
@@ -1014,7 +1681,7 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
static void pshader_hw_texkill(const struct wined3d_shader_instruction *ins)
{
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char reg_dest[40];
/* No swizzles are allowed in d3d's texkill. PS 1.x ignores the 4th component as documented,
@@ -1024,14 +1691,42 @@ static void pshader_hw_texkill(const struct wined3d_shader_instruction *ins)
if (ins->ctx->reg_maps->shader_version.major >= 2)
{
- /* The arb backend doesn't claim ps 2.0 support, but try to eat what the app feeds to us */
- shader_addline(buffer, "KIL %s;\n", reg_dest);
+ const char *kilsrc = "TA";
+ BOOL is_color;
+
+ shader_arb_get_register_name(ins, &dst->reg, reg_dest, &is_color);
+ if(dst->write_mask == WINED3DSP_WRITEMASK_ALL)
+ {
+ kilsrc = reg_dest;
+ }
+ else
+ {
+ /* Sigh. KIL doesn't support swizzles/writemasks. KIL passes a writemask, but ".xy" for example
+ * is not valid as a swizzle in ARB (needs ".xyyy"). Use SWZ to load the register properly, and set
+ * masked out components to 0(won't kill)
+ */
+ char x = '0', y = '0', z = '0', w = '0';
+ if(dst->write_mask & WINED3DSP_WRITEMASK_0) x = 'x';
+ if(dst->write_mask & WINED3DSP_WRITEMASK_1) y = 'y';
+ if(dst->write_mask & WINED3DSP_WRITEMASK_2) z = 'z';
+ if(dst->write_mask & WINED3DSP_WRITEMASK_3) w = 'w';
+ shader_addline(buffer, "SWZ TA, %s, %c, %c, %c, %c;\n", reg_dest, x, y, z, w);
+ }
+ shader_addline(buffer, "KIL %s;\n", kilsrc);
} else {
/* ARB fp doesn't like swizzles on the parameter of the KIL instruction. To mask the 4th component,
* copy the register into our general purpose TMP variable, overwrite .w and pass TMP to KIL
+ *
+ * ps_1_3 shaders use the texcoord incarnation of the Tx register. ps_1_4 shaders can use the same,
+ * or pass in any temporary register(in shader phase 2)
*/
- shader_addline(buffer, "SWZ TMP, %s, x, y, z, 1;\n", reg_dest);
- shader_addline(buffer, "KIL TMP;\n");
+ if(ins->ctx->reg_maps->shader_version.minor <= 3) {
+ sprintf(reg_dest, "fragment.texcoord[%u]", dst->reg.idx);
+ } else {
+ shader_arb_get_dst_param(ins, dst, reg_dest);
+ }
+ shader_addline(buffer, "SWZ TA, %s, x, y, z, 1;\n", reg_dest);
+ shader_addline(buffer, "KIL TA;\n");
}
}
@@ -1040,217 +1735,213 @@ static void pshader_hw_tex(const struct wined3d_shader_instruction *ins)
IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- BOOL is_color;
DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
ins->ctx->reg_maps->shader_version.minor);
- BOOL projected = FALSE, bias = FALSE;
+ struct wined3d_shader_src_param src;
char reg_dest[40];
char reg_coord[40];
DWORD reg_sampler_code;
+ DWORD myflags = 0;
/* All versions have a destination register */
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, reg_dest, &is_color);
+ shader_arb_get_dst_param(ins, dst, reg_dest);
- /* 1.0-1.3: Use destination register as coordinate source.
+ /* 1.0-1.4: Use destination register number as texture code.
+ 2.0+: Use provided sampler number as texure code. */
+ if (shader_version < WINED3D_SHADER_VERSION(2,0))
+ reg_sampler_code = dst->reg.idx;
+ else
+ reg_sampler_code = ins->src[1].reg.idx;
+
+ /* 1.0-1.3: Use the texcoord varying.
1.4+: Use provided coordinate source register. */
- if (shader_version < WINED3D_SHADER_VERSION(1,4))
- strcpy(reg_coord, reg_dest);
- else
- shader_arb_get_src_param(ins, &ins->src[0], 0, reg_coord);
+ if (shader_version < WINED3D_SHADER_VERSION(1,4))
+ sprintf(reg_coord, "fragment.texcoord[%u]", reg_sampler_code);
+ else {
+ /* TEX is the only instruction that can handle DW and DZ natively */
+ src = ins->src[0];
+ if(src.modifiers == WINED3DSPSM_DW) src.modifiers = WINED3DSPSM_NONE;
+ if(src.modifiers == WINED3DSPSM_DZ) src.modifiers = WINED3DSPSM_NONE;
+ shader_arb_get_src_param(ins, &src, 0, reg_coord);
+ }
- /* 1.0-1.4: Use destination register number as texture code.
- 2.0+: Use provided sampler number as texure code. */
- if (shader_version < WINED3D_SHADER_VERSION(2,0))
- reg_sampler_code = dst->reg.idx;
- else
- reg_sampler_code = ins->src[1].reg.idx;
-
- /* projection flag:
- * 1.1, 1.2, 1.3: Use WINED3DTSS_TEXTURETRANSFORMFLAGS
- * 1.4: Use WINED3DSPSM_DZ or WINED3DSPSM_DW on src[0]
- * 2.0+: Use WINED3DSI_TEXLD_PROJECT on the opcode
- */
- if (shader_version < WINED3D_SHADER_VERSION(1,4))
- {
- DWORD flags = 0;
- if(reg_sampler_code < MAX_TEXTURES) {
- flags = deviceImpl->stateBlock->textureState[reg_sampler_code][WINED3DTSS_TEXTURETRANSFORMFLAGS];
- }
- if (flags & WINED3DTTFF_PROJECTED) {
- projected = TRUE;
- }
- }
- else if (shader_version < WINED3D_SHADER_VERSION(2,0))
- {
- DWORD src_mod = ins->src[0].modifiers;
- if (src_mod == WINED3DSPSM_DZ) {
- projected = TRUE;
- } else if(src_mod == WINED3DSPSM_DW) {
- projected = TRUE;
- }
- } else {
- if (ins->flags & WINED3DSI_TEXLD_PROJECT) projected = TRUE;
- if (ins->flags & WINED3DSI_TEXLD_BIAS) bias = TRUE;
- }
- shader_hw_sample(ins, reg_sampler_code, reg_dest, reg_coord, projected, bias);
+ /* projection flag:
+ * 1.1, 1.2, 1.3: Use WINED3DTSS_TEXTURETRANSFORMFLAGS
+ * 1.4: Use WINED3DSPSM_DZ or WINED3DSPSM_DW on src[0]
+ * 2.0+: Use WINED3DSI_TEXLD_PROJECT on the opcode
+ */
+ if (shader_version < WINED3D_SHADER_VERSION(1,4))
+ {
+ DWORD flags = 0;
+ if(reg_sampler_code < MAX_TEXTURES) {
+ flags = deviceImpl->stateBlock->textureState[reg_sampler_code][WINED3DTSS_TEXTURETRANSFORMFLAGS];
+ }
+ if (flags & WINED3DTTFF_PROJECTED) {
+ myflags |= TEX_PROJ;
+ }
+ }
+ else if (shader_version < WINED3D_SHADER_VERSION(2,0))
+ {
+ DWORD src_mod = ins->src[0].modifiers;
+ if (src_mod == WINED3DSPSM_DZ) {
+ /* TXP cannot handle DZ natively, so move the z coordinate to .w. reg_coord is a read-only
+ * varying register, so we need a temp reg
+ */
+ shader_addline(ins->ctx->buffer, "SWZ TA, %s, x, y, z, z;\n", reg_coord);
+ strcpy(reg_coord, "TA");
+ myflags |= TEX_PROJ;
+ } else if(src_mod == WINED3DSPSM_DW) {
+ myflags |= TEX_PROJ;
+ }
+ } else {
+ if (ins->flags & WINED3DSI_TEXLD_PROJECT) myflags |= TEX_PROJ;
+ if (ins->flags & WINED3DSI_TEXLD_BIAS) myflags |= TEX_BIAS;
+ }
+ shader_hw_sample(ins, reg_sampler_code, reg_dest, reg_coord, myflags, NULL, NULL);
}
static void pshader_hw_texcoord(const struct wined3d_shader_instruction *ins)
{
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
ins->ctx->reg_maps->shader_version.minor);
+ char dst_str[50];
- char tmp[20];
- shader_arb_get_write_mask(ins, dst, tmp);
- if (shader_version != WINED3D_SHADER_VERSION(1,4))
+ if (shader_version < WINED3D_SHADER_VERSION(1,4))
{
DWORD reg = dst->reg.idx;
- shader_addline(buffer, "MOV_SAT T%u%s, fragment.texcoord[%u];\n", reg, tmp, reg);
+
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str);
+ shader_addline(buffer, "MOV_SAT %s, fragment.texcoord[%u];\n", dst_str, reg);
} else {
char reg_src[40];
shader_arb_get_src_param(ins, &ins->src[0], 0, reg_src);
- shader_addline(buffer, "MOV R%u%s, %s;\n", dst->reg.idx, tmp, reg_src);
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str);
+ shader_addline(buffer, "MOV %s, %s;\n", dst_str, reg_src);
}
}
static void pshader_hw_texreg2ar(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
DWORD flags;
DWORD reg1 = ins->dst[0].reg.idx;
- char dst_str[8];
+ char dst_str[50];
char src_str[50];
- sprintf(dst_str, "T%u", reg1);
+ /* Note that texreg2ar treats Tx as a temporary register, not as a varying */
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str);
shader_arb_get_src_param(ins, &ins->src[0], 0, src_str);
- shader_addline(buffer, "MOV TMP.x, %s.w;\n", src_str);
- shader_addline(buffer, "MOV TMP.y, %s.x;\n", src_str);
+ /* Move .x first in case src_str is "TA" */
+ shader_addline(buffer, "MOV TA.y, %s.x;\n", src_str);
+ shader_addline(buffer, "MOV TA.x, %s.w;\n", src_str);
flags = reg1 < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg1][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0;
- shader_hw_sample(ins, reg1, dst_str, "TMP", flags & WINED3DTTFF_PROJECTED, FALSE);
+ shader_hw_sample(ins, reg1, dst_str, "TA", flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL);
}
static void pshader_hw_texreg2gb(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
DWORD reg1 = ins->dst[0].reg.idx;
- char dst_str[8];
+ char dst_str[50];
char src_str[50];
- sprintf(dst_str, "T%u", reg1);
+ /* Note that texreg2gb treats Tx as a temporary register, not as a varying */
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str);
shader_arb_get_src_param(ins, &ins->src[0], 0, src_str);
- shader_addline(buffer, "MOV TMP.x, %s.y;\n", src_str);
- shader_addline(buffer, "MOV TMP.y, %s.z;\n", src_str);
- shader_hw_sample(ins, reg1, dst_str, "TMP", FALSE, FALSE);
+ shader_addline(buffer, "MOV TA.x, %s.y;\n", src_str);
+ shader_addline(buffer, "MOV TA.y, %s.z;\n", src_str);
+ shader_hw_sample(ins, reg1, dst_str, "TA", 0, NULL, NULL);
}
static void pshader_hw_texreg2rgb(const struct wined3d_shader_instruction *ins)
{
DWORD reg1 = ins->dst[0].reg.idx;
- char dst_str[8];
+ char dst_str[50];
char src_str[50];
- sprintf(dst_str, "T%u", reg1);
+ /* Note that texreg2rg treats Tx as a temporary register, not as a varying */
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str);
shader_arb_get_src_param(ins, &ins->src[0], 0, src_str);
- shader_hw_sample(ins, reg1, dst_str, src_str, FALSE, FALSE);
+ shader_hw_sample(ins, reg1, dst_str, src_str, 0, NULL, NULL);
}
static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins)
{
IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- BOOL has_bumpmat = FALSE;
- BOOL has_luminance = FALSE;
- BOOL is_color;
- int i;
-
- SHADER_BUFFER *buffer = ins->ctx->buffer;
-
- char reg_coord[40];
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char reg_coord[40], dst_reg[50], src_reg[50];
DWORD reg_dest_code;
- /* All versions have a destination register */
+ /* All versions have a destination register. The Tx where the texture coordinates come
+ * from is the varying incarnation of the texture register
+ */
reg_dest_code = dst->reg.idx;
- /* Can directly use the name because texbem is only valid for <= 1.3 shaders */
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, reg_coord, &is_color);
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_reg);
+ shader_arb_get_src_param(ins, &ins->src[0], 0, src_reg);
+ sprintf(reg_coord, "fragment.texcoord[%u]", reg_dest_code);
- for(i = 0; i < This->numbumpenvmatconsts; i++) {
- if (This->bumpenvmatconst[i].const_num != WINED3D_CONST_NUM_UNUSED
- && reg_dest_code == This->bumpenvmatconst[i].texunit)
- {
- has_bumpmat = TRUE;
- break;
- }
- }
- for(i = 0; i < This->numbumpenvmatconsts; i++) {
- if (This->luminanceconst[i].const_num != WINED3D_CONST_NUM_UNUSED
- && reg_dest_code == This->luminanceconst[i].texunit)
- {
- has_luminance = TRUE;
- break;
- }
- }
-
- if(has_bumpmat) {
- DWORD src = ins->src[0].reg.idx;
-
- /* Sampling the perturbation map in Tsrc was done already, including the signedness correction if needed */
-
- shader_addline(buffer, "SWZ TMP2, bumpenvmat%d, x, z, 0, 0;\n", reg_dest_code);
- shader_addline(buffer, "DP3 TMP.x, TMP2, T%u;\n", src);
- shader_addline(buffer, "SWZ TMP2, bumpenvmat%d, y, w, 0, 0;\n", reg_dest_code);
- shader_addline(buffer, "DP3 TMP.y, TMP2, T%u;\n", src);
-
- /* with projective textures, texbem only divides the static texture coord, not the displacement,
- * so we can't let the GL handle this.
- */
- if (((IWineD3DDeviceImpl*) This->baseShader.device)->stateBlock->textureState[reg_dest_code][WINED3DTSS_TEXTURETRANSFORMFLAGS]
- & WINED3DTTFF_PROJECTED) {
- shader_addline(buffer, "RCP TMP2.w, %s.w;\n", reg_coord);
- shader_addline(buffer, "MUL TMP2.xy, %s, TMP2.w;\n", reg_coord);
- shader_addline(buffer, "ADD TMP.xy, TMP, TMP2;\n");
- } else {
- shader_addline(buffer, "ADD TMP.xy, TMP, %s;\n", reg_coord);
- }
-
- shader_hw_sample(ins, reg_dest_code, reg_coord, "TMP", FALSE, FALSE);
-
- if (ins->handler_idx == WINED3DSIH_TEXBEML && has_luminance)
- {
- shader_addline(buffer, "MAD TMP, T%u.z, luminance%d.x, luminance%d.y;\n",
- src, reg_dest_code, reg_dest_code);
- shader_addline(buffer, "MUL %s, %s, TMP;\n", reg_coord, reg_coord);
- }
+ /* Sampling the perturbation map in Tsrc was done already, including the signedness correction if needed
+ * The Tx in which the perturbation map is stored is the tempreg incarnation of the texture register
+ *
+ * GL_NV_fragment_program_option could handle this in one instruction via X2D:
+ * X2D TA.xy, fragment.texcoord, T%u, bumpenvmat%u.xzyw
+ *
+ * However, the NV extensions are never enabled for <= 2.0 shaders because of the performance penalty that
+ * comes with it, and texbem is an 1.x only instruction. No 1.x instruction forces us to enable the NV
+ * extension.
+ */
+ shader_addline(buffer, "SWZ TB, bumpenvmat%d, x, z, 0, 0;\n", reg_dest_code);
+ shader_addline(buffer, "DP3 TA.x, TB, %s;\n", src_reg);
+ shader_addline(buffer, "SWZ TB, bumpenvmat%d, y, w, 0, 0;\n", reg_dest_code);
+ shader_addline(buffer, "DP3 TA.y, TB, %s;\n", src_reg);
+ /* with projective textures, texbem only divides the static texture coord, not the displacement,
+ * so we can't let the GL handle this.
+ */
+ if (((IWineD3DDeviceImpl*) This->baseShader.device)->stateBlock->textureState[reg_dest_code][WINED3DTSS_TEXTURETRANSFORMFLAGS]
+ & WINED3DTTFF_PROJECTED) {
+ shader_addline(buffer, "RCP TB.w, %s.w;\n", reg_coord);
+ shader_addline(buffer, "MUL TB.xy, %s, TB.w;\n", reg_coord);
+ shader_addline(buffer, "ADD TA.xy, TA, TB;\n");
} else {
- DWORD tf;
- if(reg_dest_code < MAX_TEXTURES) {
- tf = ((IWineD3DDeviceImpl*) This->baseShader.device)->stateBlock->textureState[reg_dest_code][WINED3DTSS_TEXTURETRANSFORMFLAGS];
- } else {
- tf = 0;
- }
- /* Without a bump matrix loaded, just sample with the unmodified coordinates */
- shader_hw_sample(ins, reg_dest_code, reg_coord, reg_coord, tf & WINED3DTTFF_PROJECTED, FALSE);
+ shader_addline(buffer, "ADD TA.xy, TA, %s;\n", reg_coord);
+ }
+
+ shader_hw_sample(ins, reg_dest_code, dst_reg, "TA", 0, NULL, NULL);
+
+ if (ins->handler_idx == WINED3DSIH_TEXBEML)
+ {
+ /* No src swizzles are allowed, so this is ok */
+ shader_addline(buffer, "MAD TA, %s.z, luminance%d.x, luminance%d.y;\n",
+ src_reg, reg_dest_code, reg_dest_code);
+ shader_addline(buffer, "MUL %s, %s, TA;\n", dst_reg, dst_reg);
}
}
static void pshader_hw_texm3x2pad(const struct wined3d_shader_instruction *ins)
{
DWORD reg = ins->dst[0].reg.idx;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
- char src0_name[50];
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char src0_name[50], dst_name[50];
+ BOOL is_color;
+ struct wined3d_shader_register tmp_reg = ins->dst[0].reg;
shader_arb_get_src_param(ins, &ins->src[0], 0, src0_name);
- shader_addline(buffer, "DP3 TMP.x, T%u, %s;\n", reg, src0_name);
+ /* The next instruction will be a texm3x2tex or texm3x2depth that writes to the uninitialized
+ * T register. Use this register to store the calculated vector
+ */
+ tmp_reg.idx = reg + 1;
+ shader_arb_get_register_name(ins, &tmp_reg, dst_name, &is_color);
+ shader_addline(buffer, "DP3 %s.x, fragment.texcoord[%u], %s;\n", dst_name, reg, src0_name);
}
static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins)
@@ -1259,27 +1950,42 @@ static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins)
IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
DWORD flags;
DWORD reg = ins->dst[0].reg.idx;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
- char dst_str[8];
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char dst_str[50];
char src0_name[50];
+ char dst_reg[50];
+ BOOL is_color;
- sprintf(dst_str, "T%u", reg);
+ /* We know that we're writing to the uninitialized T register, so use it for temporary storage */
+ shader_arb_get_register_name(ins, &ins->dst[0].reg, dst_reg, &is_color);
+
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str);
shader_arb_get_src_param(ins, &ins->src[0], 0, src0_name);
- shader_addline(buffer, "DP3 TMP.y, T%u, %s;\n", reg, src0_name);
+ shader_addline(buffer, "DP3 %s.y, fragment.texcoord[%u], %s;\n", dst_reg, reg, src0_name);
flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0;
- shader_hw_sample(ins, reg, dst_str, "TMP", flags & WINED3DTTFF_PROJECTED, FALSE);
+ shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL);
}
static void pshader_hw_texm3x3pad(const struct wined3d_shader_instruction *ins)
{
IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
DWORD reg = ins->dst[0].reg.idx;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
- char src0_name[50];
+ char src0_name[50], dst_name[50];
+ struct wined3d_shader_register tmp_reg = ins->dst[0].reg;
+ BOOL is_color;
+
+ /* There are always 2 texm3x3pad instructions followed by one texm3x3[tex,vspec, ...] instruction, with
+ * incrementing ins->dst[0].register_idx numbers. So the pad instruction already knows the final destination
+ * register, and this register is uninitialized(otherwise the assembler complains that it is 'redeclared')
+ */
+ tmp_reg.idx = reg + 2 - current_state->current_row;
+ shader_arb_get_register_name(ins, &tmp_reg, dst_name, &is_color);
shader_arb_get_src_param(ins, &ins->src[0], 0, src0_name);
- shader_addline(buffer, "DP3 TMP.%c, T%u, %s;\n", 'x' + current_state->current_row, reg, src0_name);
+ shader_addline(buffer, "DP3 %s.%c, fragment.texcoord[%u], %s;\n",
+ dst_name, 'x' + current_state->current_row, reg, src0_name);
current_state->texcoord_w[current_state->current_row++] = reg;
}
@@ -1289,18 +1995,20 @@ static void pshader_hw_texm3x3tex(const struct wined3d_shader_instruction *ins)
IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
DWORD flags;
DWORD reg = ins->dst[0].reg.idx;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
- char dst_str[8];
- char src0_name[50];
+ char dst_str[50];
+ char src0_name[50], dst_name[50];
+ BOOL is_color;
+ shader_arb_get_register_name(ins, &ins->dst[0].reg, dst_name, &is_color);
shader_arb_get_src_param(ins, &ins->src[0], 0, src0_name);
- shader_addline(buffer, "DP3 TMP.z, T%u, %s;\n", reg, src0_name);
+ shader_addline(buffer, "DP3 %s.z, fragment.texcoord[%u], %s;\n", dst_name, reg, src0_name);
/* Sample the texture using the calculated coordinates */
- sprintf(dst_str, "T%u", reg);
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str);
flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0;
- shader_hw_sample(ins, reg, dst_str, "TMP", flags & WINED3DTTFF_PROJECTED, FALSE);
+ shader_hw_sample(ins, reg, dst_str, dst_name, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL);
current_state->current_row = 0;
}
@@ -1310,33 +2018,39 @@ static void pshader_hw_texm3x3vspec(const struct wined3d_shader_instruction *ins
IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
DWORD flags;
DWORD reg = ins->dst[0].reg.idx;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
- char dst_str[8];
+ char dst_str[50];
char src0_name[50];
+ char dst_reg[50];
+ BOOL is_color;
+ /* Get the dst reg without writemask strings. We know this register is uninitialized, so we can use all
+ * components for temporary data storage
+ */
+ shader_arb_get_register_name(ins, &ins->dst[0].reg, dst_reg, &is_color);
shader_arb_get_src_param(ins, &ins->src[0], 0, src0_name);
- shader_addline(buffer, "DP3 TMP.z, T%u, %s;\n", reg, src0_name);
+ shader_addline(buffer, "DP3 %s.z, fragment.texcoord[%u], %s;\n", dst_reg, reg, src0_name);
/* Construct the eye-ray vector from w coordinates */
- shader_addline(buffer, "MOV TMP2.x, fragment.texcoord[%u].w;\n", current_state->texcoord_w[0]);
- shader_addline(buffer, "MOV TMP2.y, fragment.texcoord[%u].w;\n", current_state->texcoord_w[1]);
- shader_addline(buffer, "MOV TMP2.z, fragment.texcoord[%u].w;\n", reg);
+ shader_addline(buffer, "MOV TB.x, fragment.texcoord[%u].w;\n", current_state->texcoord_w[0]);
+ shader_addline(buffer, "MOV TB.y, fragment.texcoord[%u].w;\n", current_state->texcoord_w[1]);
+ shader_addline(buffer, "MOV TB.z, fragment.texcoord[%u].w;\n", reg);
/* Calculate reflection vector
*/
- shader_addline(buffer, "DP3 TMP.w, TMP, TMP2;\n");
- /* The .w is ignored when sampling, so I can use TMP2.w to calculate dot(N, N) */
- shader_addline(buffer, "DP3 TMP2.w, TMP, TMP;\n");
- shader_addline(buffer, "RCP TMP2.w, TMP2.w;\n");
- shader_addline(buffer, "MUL TMP.w, TMP.w, TMP2.w;\n");
- shader_addline(buffer, "MUL TMP, TMP.w, TMP;\n");
- shader_addline(buffer, "MAD TMP, coefmul.x, TMP, -TMP2;\n");
+ shader_addline(buffer, "DP3 %s.w, %s, TB;\n", dst_reg, dst_reg);
+ /* The .w is ignored when sampling, so I can use TB.w to calculate dot(N, N) */
+ shader_addline(buffer, "DP3 TB.w, %s, %s;\n", dst_reg, dst_reg);
+ shader_addline(buffer, "RCP TB.w, TB.w;\n");
+ shader_addline(buffer, "MUL %s.w, %s.w, TB.w;\n", dst_reg, dst_reg);
+ shader_addline(buffer, "MUL %s, %s.w, %s;\n", dst_reg, dst_reg, dst_reg);
+ shader_addline(buffer, "MAD %s, coefmul.x, %s, -TB;\n", dst_reg, dst_reg);
/* Sample the texture using the calculated coordinates */
- sprintf(dst_str, "T%u", reg);
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str);
flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0;
- shader_hw_sample(ins, reg, dst_str, "TMP", flags & WINED3DTTFF_PROJECTED, FALSE);
+ shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL);
current_state->current_row = 0;
}
@@ -1347,51 +2061,53 @@ static void pshader_hw_texm3x3spec(const struct wined3d_shader_instruction *ins)
DWORD flags;
DWORD reg = ins->dst[0].reg.idx;
SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
- char dst_str[8];
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char dst_str[50];
char src0_name[50];
char src1_name[50];
+ char dst_reg[50];
+ BOOL is_color;
shader_arb_get_src_param(ins, &ins->src[0], 0, src0_name);
shader_arb_get_src_param(ins, &ins->src[0], 1, src1_name);
- shader_addline(buffer, "DP3 TMP.z, T%u, %s;\n", reg, src0_name);
+ shader_arb_get_register_name(ins, &ins->dst[0].reg, dst_reg, &is_color);
+ /* Note: dst_reg.xy is input here, generated by two texm3x3pad instructions */
+ shader_addline(buffer, "DP3 %s.z, fragment.texcoord[%u], %s;\n", dst_reg, reg, src0_name);
/* Calculate reflection vector.
*
- * dot(N, E)
- * TMP.xyz = 2 * --------- * N - E
- * dot(N, N)
+ * dot(N, E)
+ * dst_reg.xyz = 2 * --------- * N - E
+ * dot(N, N)
*
* Which normalizes the normal vector
*/
- shader_addline(buffer, "DP3 TMP.w, TMP, %s;\n", src1_name);
- shader_addline(buffer, "DP3 TMP2.w, TMP, TMP;\n");
- shader_addline(buffer, "RCP TMP2.w, TMP2.w;\n");
- shader_addline(buffer, "MUL TMP.w, TMP.w, TMP2.w;\n");
- shader_addline(buffer, "MUL TMP, TMP.w, TMP;\n");
- shader_addline(buffer, "MAD TMP, coefmul.x, TMP, -%s;\n", src1_name);
+ shader_addline(buffer, "DP3 %s.w, %s, %s;\n", dst_reg, dst_reg, src1_name);
+ shader_addline(buffer, "DP3 TC.w, %s, %s;\n", dst_reg, dst_reg);
+ shader_addline(buffer, "RCP TC.w, TC.w;\n");
+ shader_addline(buffer, "MUL %s.w, %s.w, TC.w;\n", dst_reg, dst_reg);
+ shader_addline(buffer, "MUL %s, %s.w, %s;\n", dst_reg, dst_reg, dst_reg);
+ shader_addline(buffer, "MAD %s, coefmul.x, %s, -%s;\n", dst_reg, dst_reg, src1_name);
/* Sample the texture using the calculated coordinates */
- sprintf(dst_str, "T%u", reg);
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str);
flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0;
- shader_hw_sample(ins, reg, dst_str, "TMP", flags & WINED3DTTFF_PROJECTED, FALSE);
+ shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL);
current_state->current_row = 0;
}
static void pshader_hw_texdepth(const struct wined3d_shader_instruction *ins)
{
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char dst_name[50];
- BOOL is_color;
/* texdepth has an implicit destination, the fragment depth value. It's only parameter,
* which is essentially an input, is the destination register because it is the first
* parameter. According to the msdn, this must be register r5, but let's keep it more flexible
- * here
+ * here(writemasks/swizzles are not valid on texdepth)
*/
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, dst_name, &is_color);
+ shader_arb_get_dst_param(ins, dst, dst_name);
/* According to the msdn, the source register(must be r5) is unusable after
* the texdepth instruction, so we're free to modify it
@@ -1403,9 +2119,9 @@ static void pshader_hw_texdepth(const struct wined3d_shader_instruction *ins)
* result. But if r = 0.0, then 0 * inf = 0, which is incorrect.
*/
shader_addline(buffer, "RCP %s.y, %s.y;\n", dst_name, dst_name);
- shader_addline(buffer, "MUL TMP.x, %s.x, %s.y;\n", dst_name, dst_name);
- shader_addline(buffer, "MIN TMP.x, TMP.x, one.x;\n");
- shader_addline(buffer, "MAX result.depth, TMP.x, 0.0;\n");
+ shader_addline(buffer, "MUL TA.x, %s.x, %s.y;\n", dst_name, dst_name);
+ shader_addline(buffer, "MIN TA.x, TA.x, one.x;\n");
+ shader_addline(buffer, "MAX result.depth, TA.x, 0.0;\n");
}
/** Process the WINED3DSIO_TEXDP3TEX instruction in ARB:
@@ -1413,17 +2129,17 @@ static void pshader_hw_texdepth(const struct wined3d_shader_instruction *ins)
* then perform a 1D texture lookup from stage dstregnum, place into dst. */
static void pshader_hw_texdp3tex(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
DWORD sampler_idx = ins->dst[0].reg.idx;
char src0[50];
- char dst_str[8];
+ char dst_str[50];
shader_arb_get_src_param(ins, &ins->src[0], 0, src0);
- shader_addline(buffer, "MOV TMP, 0.0;\n");
- shader_addline(buffer, "DP3 TMP.x, T%u, %s;\n", sampler_idx, src0);
+ shader_addline(buffer, "MOV TB, 0.0;\n");
+ shader_addline(buffer, "DP3 TB.x, fragment.texcoord[%u], %s;\n", sampler_idx, src0);
- sprintf(dst_str, "T%u", sampler_idx);
- shader_hw_sample(ins, sampler_idx, dst_str, "TMP", FALSE /* Only one coord, can't be projected */, FALSE);
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str);
+ shader_hw_sample(ins, sampler_idx, dst_str, "TB", 0 /* Only one coord, can't be projected */, NULL, NULL);
}
/** Process the WINED3DSIO_TEXDP3 instruction in ARB:
@@ -1433,19 +2149,12 @@ static void pshader_hw_texdp3(const struct wined3d_shader_instruction *ins)
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
char src0[50];
char dst_str[50];
- char dst_mask[6];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
- BOOL is_color;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
/* Handle output register */
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, dst_str, &is_color);
- shader_arb_get_write_mask(ins, dst, dst_mask);
-
+ shader_arb_get_dst_param(ins, dst, dst_str);
shader_arb_get_src_param(ins, &ins->src[0], 0, src0);
- shader_addline(buffer, "DP3 %s%s, T%u, %s;\n", dst_str, dst_mask, dst->reg.idx, src0);
-
- /* TODO: Handle output modifiers */
+ shader_addline(buffer, "DP3 %s, fragment.texcoord[%u], %s;\n", dst_str, dst->reg.idx, src0);
}
/** Process the WINED3DSIO_TEXM3X3 instruction in ARB
@@ -1453,21 +2162,16 @@ static void pshader_hw_texdp3(const struct wined3d_shader_instruction *ins)
static void pshader_hw_texm3x3(const struct wined3d_shader_instruction *ins)
{
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
- char dst_str[50];
- char dst_mask[6];
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char dst_str[50], dst_name[50];
char src0[50];
BOOL is_color;
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, dst_str, &is_color);
- shader_arb_get_write_mask(ins, dst, dst_mask);
-
+ shader_arb_get_dst_param(ins, dst, dst_str);
shader_arb_get_src_param(ins, &ins->src[0], 0, src0);
- shader_addline(buffer, "DP3 TMP.z, T%u, %s;\n", dst->reg.idx, src0);
- shader_addline(buffer, "MOV %s%s, TMP;\n", dst_str, dst_mask);
-
- /* TODO: Handle output modifiers */
+ shader_arb_get_register_name(ins, &ins->dst[0].reg, dst_name, &is_color);
+ shader_addline(buffer, "DP3 %s.z, fragment.texcoord[%u], %s;\n", dst_name, dst->reg.idx, src0);
+ shader_addline(buffer, "MOV %s, %s;\n", dst_str, dst_name);
}
/** Process the WINED3DSIO_TEXM3X2DEPTH instruction in ARB:
@@ -1477,21 +2181,23 @@ static void pshader_hw_texm3x3(const struct wined3d_shader_instruction *ins)
*/
static void pshader_hw_texm3x2depth(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
- DWORD dst_reg = ins->dst[0].reg.idx;
- char src0[50];
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ const struct wined3d_shader_dst_param *dst = &ins->dst[0];
+ char src0[50], dst_name[50];
+ BOOL is_color;
shader_arb_get_src_param(ins, &ins->src[0], 0, src0);
- shader_addline(buffer, "DP3 TMP.y, T%u, %s;\n", dst_reg, src0);
+ shader_arb_get_register_name(ins, &ins->dst[0].reg, dst_name, &is_color);
+ shader_addline(buffer, "DP3 %s.y, fragment.texcoord[%u], %s;\n", dst_name, dst->reg.idx, src0);
/* How to deal with the special case dst_name.g == 0? if r != 0, then
* the r * (1 / 0) will give infinity, which is clamped to 1.0, the correct
* result. But if r = 0.0, then 0 * inf = 0, which is incorrect.
*/
- shader_addline(buffer, "RCP TMP.y, TMP.y;\n");
- shader_addline(buffer, "MUL TMP.x, TMP.x, TMP.y;\n");
- shader_addline(buffer, "MIN TMP.x, TMP.x, one.x;\n");
- shader_addline(buffer, "MAX result.depth, TMP.x, 0.0;\n");
+ shader_addline(buffer, "RCP %s.y, %s.y;\n", dst_name, dst_name);
+ shader_addline(buffer, "MUL %s.x, %s.x, %s.y;\n", dst_name, dst_name, dst_name);
+ shader_addline(buffer, "MIN %s.x, %s.x, one.x;\n", dst_name, dst_name);
+ shader_addline(buffer, "MAX result.depth, %s.x, 0.0;\n", dst_name);
}
/** Handles transforming all WINED3DSIO_M?x? opcodes for
@@ -1550,26 +2256,25 @@ static void shader_hw_mnxn(const struct wined3d_shader_instruction *ins)
}
}
-static void shader_hw_rsq_rcp(const struct wined3d_shader_instruction *ins)
+static void shader_hw_scalar_op(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
- const char *instruction, *sat;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ const char *instruction;
char dst[50];
char src[50];
switch(ins->handler_idx)
{
- case WINED3DSIH_RSQ: instruction = "RSQ"; break;
- case WINED3DSIH_RCP: instruction = "RCP"; break;
+ case WINED3DSIH_RSQ: instruction = "RSQ"; break;
+ case WINED3DSIH_RCP: instruction = "RCP"; break;
+ case WINED3DSIH_EXP: instruction = "EX2"; break;
+ case WINED3DSIH_EXPP: instruction = "EXP"; break;
default: instruction = "";
FIXME("Unhandled opcode %#x\n", ins->handler_idx);
break;
}
- if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE) sat = "_SAT";
- else sat = "";
-
shader_arb_get_dst_param(ins, &ins->dst[0], dst); /* Destination */
shader_arb_get_src_param(ins, &ins->src[0], 0, src);
if (ins->src[0].swizzle == WINED3DSP_NOSWIZZLE)
@@ -1580,29 +2285,54 @@ static void shader_hw_rsq_rcp(const struct wined3d_shader_instruction *ins)
strcat(src, ".w");
}
- shader_addline(buffer, "%s%s %s, %s;\n", instruction, sat, dst, src);
+ shader_addline(buffer, "%s%s %s, %s;\n", instruction, shader_arb_get_modifier(ins), dst, src);
}
static void shader_hw_nrm(const struct wined3d_shader_instruction *ins)
{
- const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char dst_name[50];
char src_name[50];
- char dst_wmask[20];
- BOOL sat = dst->modifiers & WINED3DSPDM_SATURATE;
- BOOL is_color;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ BOOL pshader = shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type);
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, dst_name, &is_color);
- shader_arb_get_write_mask(ins, dst, dst_wmask);
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_name);
+ shader_arb_get_src_param(ins, &ins->src[0], 1 /* Use TB */, src_name);
- shader_arb_get_src_param(ins, &ins->src[0], 0, src_name);
- shader_addline(buffer, "DP3 TMP, %s, %s;\n", src_name, src_name);
- shader_addline(buffer, "RSQ TMP, TMP.x;\n");
- /* dst.w = src[0].w * 1 / (src.x^2 + src.y^2 + src.z^2)^(1/2) according to msdn*/
- shader_addline(buffer, "MUL%s %s%s, %s, TMP;\n", sat ? "_SAT" : "", dst_name, dst_wmask,
- src_name);
+ if(pshader && priv->target_version >= NV3)
+ {
+ shader_addline(buffer, "NRM%s %s, %s;\n", shader_arb_get_modifier(ins), dst_name, src_name);
+ }
+ else
+ {
+ shader_addline(buffer, "DP3 TA, %s, %s;\n", src_name, src_name);
+ shader_addline(buffer, "RSQ TA, TA.x;\n");
+ /* dst.w = src[0].w * 1 / (src.x^2 + src.y^2 + src.z^2)^(1/2) according to msdn*/
+ shader_addline(buffer, "MUL%s %s, %s, TA;\n", shader_arb_get_modifier(ins), dst_name,
+ src_name);
+ }
+}
+
+static void shader_hw_lrp(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char dst_name[50];
+ char src_name[3][50];
+
+ /* ARB_fragment_program has a convenient LRP instruction */
+ if(shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type)) {
+ shader_hw_map2gl(ins);
+ return;
+ }
+
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_name);
+ shader_arb_get_src_param(ins, &ins->src[0], 0, src_name[0]);
+ shader_arb_get_src_param(ins, &ins->src[1], 1, src_name[1]);
+ shader_arb_get_src_param(ins, &ins->src[2], 2, src_name[2]);
+
+ shader_addline(buffer, "SUB TA, %s, %s;\n", src_name[1], src_name[2]);
+ shader_addline(buffer, "MAD%s %s, %s, TA, %s;\n", shader_arb_get_modifier(ins),
+ dst_name, src_name[0], src_name[2]);
}
static void shader_hw_sincos(const struct wined3d_shader_instruction *ins)
@@ -1611,26 +2341,661 @@ static void shader_hw_sincos(const struct wined3d_shader_instruction *ins)
* must contain fixed constants. So we need a separate function to filter those constants and
* can't use map2gl
*/
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
char dst_name[50];
- char src_name[50];
- char dst_wmask[20];
- BOOL sat = dst->modifiers & WINED3DSPDM_SATURATE;
+ char src_name0[50], src_name1[50], src_name2[50];
BOOL is_color;
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, dst_name, &is_color);
- shader_arb_get_write_mask(ins, dst, dst_wmask);
+ shader_arb_get_src_param(ins, &ins->src[0], 0, src_name0);
+ if(shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type)) {
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_name);
+ /* No modifiers are supported on SCS */
+ shader_addline(buffer, "SCS %s, %s;\n", dst_name, src_name0);
- shader_arb_get_src_param(ins, &ins->src[0], 0, src_name);
- shader_addline(buffer, "SCS%s %s%s, %s;\n", sat ? "_SAT" : "", dst_name, dst_wmask,
- src_name);
+ if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE)
+ {
+ shader_arb_get_register_name(ins, &dst->reg, src_name0, &is_color);
+ shader_addline(buffer, "MOV_SAT %s, %s;\n", dst_name, src_name0);
+ }
+ } else if(priv->target_version >= NV2) {
+ shader_arb_get_register_name(ins, &dst->reg, dst_name, &is_color);
+
+ /* Sincos writemask must be .x, .y or .xy */
+ if(dst->write_mask & WINED3DSP_WRITEMASK_0)
+ shader_addline(buffer, "COS%s %s.x, %s;\n", shader_arb_get_modifier(ins), dst_name, src_name0);
+ if(dst->write_mask & WINED3DSP_WRITEMASK_1)
+ shader_addline(buffer, "SIN%s %s.y, %s;\n", shader_arb_get_modifier(ins), dst_name, src_name0);
+ } else {
+ /* Approximate sine and cosine with a taylor series, as per math textbook. The application passes 8
+ * helper constants(D3DSINCOSCONST1 and D3DSINCOSCONST2) in src1 and src2.
+ *
+ * sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...
+ * cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! + ...
+ *
+ * The constants we get are:
+ *
+ * +1 +1, -1 -1 +1 +1 -1 -1
+ * ---- , ---- , ---- , ----- , ----- , ----- , ------
+ * 1!*2 2!*4 3!*8 4!*16 5!*32 6!*64 7!*128
+ *
+ * If used with x^2, x^3, x^4 etc they calculate sin(x/2) and cos(x/2):
+ *
+ * (x/2)^2 = x^2 / 4
+ * (x/2)^3 = x^3 / 8
+ * (x/2)^4 = x^4 / 16
+ * (x/2)^5 = x^5 / 32
+ * etc
+ *
+ * To get the final result:
+ * sin(x) = 2 * sin(x/2) * cos(x/2)
+ * cos(x) = cos(x/2)^2 - sin(x/2)^2
+ * (from sin(x+y) and cos(x+y) rules)
+ *
+ * As per MSDN, dst.z is undefined after the operation, and so is
+ * dst.x and dst.y if they're masked out by the writemask. Ie
+ * sincos dst.y, src1, c0, c1
+ * returns the sine in dst.y. dst.x and dst.z are undefined, dst.w is not touched. The assembler
+ * vsa.exe also stops with an error if the dest register is the same register as the source
+ * register. This means we can use dest.xyz as temporary storage. The assembler vsa.exe output also
+ * indicates that sincos consumes 8 instruction slots in vs_2_0(and, strangely, in vs_3_0).
+ */
+ shader_arb_get_src_param(ins, &ins->src[1], 1, src_name1);
+ shader_arb_get_src_param(ins, &ins->src[2], 2, src_name2);
+ shader_arb_get_register_name(ins, &dst->reg, dst_name, &is_color);
+
+ shader_addline(buffer, "MUL %s.x, %s, %s;\n", dst_name, src_name0, src_name0); /* x ^ 2 */
+ shader_addline(buffer, "MUL TA.y, %s.x, %s;\n", dst_name, src_name0); /* x ^ 3 */
+ shader_addline(buffer, "MUL %s.y, TA.y, %s;\n", dst_name, src_name0); /* x ^ 4 */
+ shader_addline(buffer, "MUL TA.z, %s.y, %s;\n", dst_name, src_name0); /* x ^ 5 */
+ shader_addline(buffer, "MUL %s.z, TA.z, %s;\n", dst_name, src_name0); /* x ^ 6 */
+ shader_addline(buffer, "MUL TA.w, %s.z, %s;\n", dst_name, src_name0); /* x ^ 7 */
+
+ /* sin(x/2)
+ *
+ * Unfortunately we don't get the constants in a DP4-capable form. Is there a way to
+ * properly merge that with MULs in the code above?
+ * The swizzles .yz and xw however fit into the .yzxw swizzle added to ps_2_0. Maybe
+ * we can merge the sine and cosine MAD rows to calculate them together.
+ */
+ shader_addline(buffer, "MUL TA.x, %s, %s.w;\n", src_name0, src_name2); /* x^1, +1/(1!*2) */
+ shader_addline(buffer, "MAD TA.x, TA.y, %s.x, TA.x;\n", src_name2); /* -1/(3!*8) */
+ shader_addline(buffer, "MAD TA.x, TA.z, %s.w, TA.x;\n", src_name1); /* +1/(5!*32) */
+ shader_addline(buffer, "MAD TA.x, TA.w, %s.x, TA.x;\n", src_name1); /* -1/(7!*128) */
+
+ /* cos(x/2) */
+ shader_addline(buffer, "MAD TA.y, %s.x, %s.y, %s.z;\n", dst_name, src_name2, src_name2); /* -1/(2!*4), +1.0 */
+ shader_addline(buffer, "MAD TA.y, %s.y, %s.z, TA.y;\n", dst_name, src_name1); /* +1/(4!*16) */
+ shader_addline(buffer, "MAD TA.y, %s.z, %s.y, TA.y;\n", dst_name, src_name1); /* -1/(6!*64) */
+
+ if(dst->write_mask & WINED3DSP_WRITEMASK_0) {
+ /* cos x */
+ shader_addline(buffer, "MUL TA.z, TA.y, TA.y;\n");
+ shader_addline(buffer, "MAD %s.x, -TA.x, TA.x, TA.z;\n", dst_name);
+ }
+ if(dst->write_mask & WINED3DSP_WRITEMASK_1) {
+ /* sin x */
+ shader_addline(buffer, "MUL %s.y, TA.x, TA.y;\n", dst_name);
+ shader_addline(buffer, "ADD %s.y, %s.y, %s.y;\n", dst_name, dst_name, dst_name);
+ }
+ }
}
-static GLuint create_arb_blt_vertex_program(const WineD3D_GL_Info *gl_info)
+static void shader_hw_sgn(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char dst_name[50];
+ char src_name[50];
+ struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
+
+ /* SGN is only valid in vertex shaders */
+ if(ctx->target_version == NV2) {
+ shader_hw_map2gl(ins);
+ return;
+ }
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst_name);
+ shader_arb_get_src_param(ins, &ins->src[0], 0, src_name);
+
+ /* If SRC > 0.0, -SRC < SRC = TRUE, otherwise false.
+ * if SRC < 0.0, SRC < -SRC = TRUE. If neither is true, src = 0.0
+ */
+ if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE) {
+ shader_addline(buffer, "SLT %s, -%s, %s;\n", dst_name, src_name, src_name);
+ } else {
+ /* src contains TA? Write to the dest first. This won't overwrite our destination.
+ * Then use TA, and calculate the final result
+ *
+ * Not reading from TA? Store the first result in TA to avoid overwriting the
+ * destination if src reg = dst reg
+ */
+ if(strstr(src_name, "TA"))
+ {
+ shader_addline(buffer, "SLT %s, %s, -%s;\n", dst_name, src_name, src_name);
+ shader_addline(buffer, "SLT TA, -%s, %s;\n", src_name, src_name);
+ shader_addline(buffer, "ADD %s, %s, -TA;\n", dst_name, dst_name);
+ }
+ else
+ {
+ shader_addline(buffer, "SLT TA, -%s, %s;\n", src_name, src_name);
+ shader_addline(buffer, "SLT %s, %s, -%s;\n", dst_name, src_name, src_name);
+ shader_addline(buffer, "ADD %s, TA, -%s;\n", dst_name, dst_name);
+ }
+ }
+}
+
+static void shader_hw_dsy(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char src[50];
+ char dst[50];
+ char dst_name[50];
+ BOOL is_color;
+
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst);
+ shader_arb_get_src_param(ins, &ins->src[0], 0, src);
+ shader_arb_get_register_name(ins, &ins->dst[0].reg, dst_name, &is_color);
+
+ shader_addline(buffer, "DDY %s, %s;\n", dst, src);
+ shader_addline(buffer, "MUL%s %s, %s, ycorrection.y;\n", shader_arb_get_modifier(ins), dst, dst_name);
+}
+
+static DWORD abs_modifier(DWORD mod, BOOL *need_abs)
+{
+ *need_abs = FALSE;
+
+ switch(mod)
+ {
+ case WINED3DSPSM_NONE: return WINED3DSPSM_ABS;
+ case WINED3DSPSM_NEG: return WINED3DSPSM_ABS;
+ case WINED3DSPSM_BIAS: *need_abs = TRUE; return WINED3DSPSM_BIAS;
+ case WINED3DSPSM_BIASNEG: *need_abs = TRUE; return WINED3DSPSM_BIASNEG;
+ case WINED3DSPSM_SIGN: *need_abs = TRUE; return WINED3DSPSM_SIGN;
+ case WINED3DSPSM_SIGNNEG: *need_abs = TRUE; return WINED3DSPSM_SIGNNEG;
+ case WINED3DSPSM_COMP: *need_abs = TRUE; return WINED3DSPSM_COMP;
+ case WINED3DSPSM_X2: *need_abs = TRUE; return WINED3DSPSM_X2;
+ case WINED3DSPSM_X2NEG: *need_abs = TRUE; return WINED3DSPSM_X2NEG;
+ case WINED3DSPSM_DZ: *need_abs = TRUE; return WINED3DSPSM_DZ;
+ case WINED3DSPSM_DW: *need_abs = TRUE; return WINED3DSPSM_DW;
+ case WINED3DSPSM_ABS: return WINED3DSPSM_ABS;
+ case WINED3DSPSM_ABSNEG: return WINED3DSPSM_ABS;
+ }
+ FIXME("Unknown modifier %u\n", mod);
+ return mod;
+}
+
+static void shader_hw_log_pow(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char src0[50], src1[50], dst[50];
+ struct wined3d_shader_src_param src0_copy = ins->src[0];
+ BOOL need_abs = FALSE;
+ const char *instr;
+ BOOL arg2 = FALSE;
+
+ switch(ins->handler_idx)
+ {
+ case WINED3DSIH_LOG: instr = "LG2"; break;
+ case WINED3DSIH_LOGP: instr = "LOG"; break;
+ case WINED3DSIH_POW: instr = "POW"; arg2 = TRUE; break;
+ default:
+ ERR("Unexpected instruction %d\n", ins->handler_idx);
+ return;
+ }
+
+ /* LOG, LOGP and POW operate on the absolute value of the input */
+ src0_copy.modifiers = abs_modifier(src0_copy.modifiers, &need_abs);
+
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst);
+ shader_arb_get_src_param(ins, &src0_copy, 0, src0);
+ if(arg2) shader_arb_get_src_param(ins, &ins->src[1], 1, src1);
+
+ if(need_abs)
+ {
+ shader_addline(buffer, "ABS TA, %s;\n", src0);
+ if(arg2)
+ {
+ shader_addline(buffer, "%s%s %s, TA, %s;\n", instr, shader_arb_get_modifier(ins), dst, src1);
+ }
+ else
+ {
+ shader_addline(buffer, "%s%s %s, TA;\n", instr, shader_arb_get_modifier(ins), dst);
+ }
+ }
+ else if(arg2)
+ {
+ shader_addline(buffer, "%s%s %s, %s, %s;\n", instr, shader_arb_get_modifier(ins), dst, src0, src1);
+ }
+ else
+ {
+ shader_addline(buffer, "%s%s %s, %s;\n", instr, shader_arb_get_modifier(ins), dst, src0);
+ }
+}
+
+static void shader_hw_loop(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char src_name[50];
+ BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
+
+ /* src0 is aL */
+ shader_arb_get_src_param(ins, &ins->src[1], 0, src_name);
+
+ if(vshader)
+ {
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ struct list *e = list_head(&priv->control_frames);
+ struct control_frame *control_frame = LIST_ENTRY(e, struct control_frame, entry);
+
+ if(priv->loop_depth > 1) shader_addline(buffer, "PUSHA aL;\n");
+ /* The constant loader makes sure to load -1 into iX.w */
+ shader_addline(buffer, "ARLC aL, %s.xywz;\n", src_name);
+ shader_addline(buffer, "BRA loop_%u_end (LE.x);\n", control_frame->loop_no);
+ shader_addline(buffer, "loop_%u_start:\n", control_frame->loop_no);
+ }
+ else
+ {
+ shader_addline(buffer, "LOOP %s;\n", src_name);
+ }
+}
+
+static void shader_hw_rep(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ char src_name[50];
+ BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
+
+ shader_arb_get_src_param(ins, &ins->src[0], 0, src_name);
+
+ /* The constant loader makes sure to load -1 into iX.w */
+ if(vshader)
+ {
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ struct list *e = list_head(&priv->control_frames);
+ struct control_frame *control_frame = LIST_ENTRY(e, struct control_frame, entry);
+
+ if(priv->loop_depth > 1) shader_addline(buffer, "PUSHA aL;\n");
+
+ shader_addline(buffer, "ARLC aL, %s.xywz;\n", src_name);
+ shader_addline(buffer, "BRA loop_%u_end (LE.x);\n", control_frame->loop_no);
+ shader_addline(buffer, "loop_%u_start:\n", control_frame->loop_no);
+ }
+ else
+ {
+ shader_addline(buffer, "REP %s;\n", src_name);
+ }
+}
+
+static void shader_hw_endloop(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
+
+ if(vshader)
+ {
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ struct list *e = list_head(&priv->control_frames);
+ struct control_frame *control_frame = LIST_ENTRY(e, struct control_frame, entry);
+
+ shader_addline(buffer, "ARAC aL.xy, aL;\n");
+ shader_addline(buffer, "BRA loop_%u_start (GT.x);\n", control_frame->loop_no);
+ shader_addline(buffer, "loop_%u_end:\n", control_frame->loop_no);
+
+ if(priv->loop_depth > 1) shader_addline(buffer, "POPA aL;\n");
+ }
+ else
+ {
+ shader_addline(buffer, "ENDLOOP;\n");
+ }
+}
+
+static void shader_hw_endrep(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
+
+ if(vshader)
+ {
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ struct list *e = list_head(&priv->control_frames);
+ struct control_frame *control_frame = LIST_ENTRY(e, struct control_frame, entry);
+
+ shader_addline(buffer, "ARAC aL.xy, aL;\n");
+ shader_addline(buffer, "BRA loop_%u_start (GT.x);\n", control_frame->loop_no);
+ shader_addline(buffer, "loop_%u_end:\n", control_frame->loop_no);
+
+ if(priv->loop_depth > 1) shader_addline(buffer, "POPA aL;\n");
+ }
+ else
+ {
+ shader_addline(buffer, "ENDREP;\n");
+ }
+}
+
+static const struct control_frame *find_last_loop(const struct shader_arb_ctx_priv *priv)
+{
+ struct control_frame *control_frame;
+
+ LIST_FOR_EACH_ENTRY(control_frame, &priv->control_frames, struct control_frame, entry)
+ {
+ if(control_frame->type == LOOP || control_frame->type == REP) return control_frame;
+ }
+ ERR("Could not find loop for break\n");
+ return NULL;
+}
+
+static void shader_hw_break(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ const struct control_frame *control_frame = find_last_loop(ins->ctx->backend_data);
+ BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
+
+ if(vshader)
+ {
+ shader_addline(buffer, "BRA loop_%u_end;\n", control_frame->loop_no);
+ }
+ else
+ {
+ shader_addline(buffer, "BRK;\n");
+ }
+}
+
+static const char *get_compare(COMPARISON_TYPE flags)
+{
+ switch (flags)
+ {
+ case COMPARISON_GT: return "GT";
+ case COMPARISON_EQ: return "EQ";
+ case COMPARISON_GE: return "GE";
+ case COMPARISON_LT: return "LT";
+ case COMPARISON_NE: return "NE";
+ case COMPARISON_LE: return "LE";
+ default:
+ FIXME("Unrecognized comparison value: %u\n", flags);
+ return "(\?\?)";
+ }
+}
+
+static COMPARISON_TYPE invert_compare(COMPARISON_TYPE flags)
+{
+ switch (flags)
+ {
+ case COMPARISON_GT: return COMPARISON_LE;
+ case COMPARISON_EQ: return COMPARISON_NE;
+ case COMPARISON_GE: return COMPARISON_LT;
+ case COMPARISON_LT: return COMPARISON_GE;
+ case COMPARISON_NE: return COMPARISON_EQ;
+ case COMPARISON_LE: return COMPARISON_GT;
+ default:
+ FIXME("Unrecognized comparison value: %u\n", flags);
+ return -1;
+ }
+}
+
+static void shader_hw_breakc(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
+ const struct control_frame *control_frame = find_last_loop(ins->ctx->backend_data);
+ char src_name0[50];
+ char src_name1[50];
+ const char *comp = get_compare(ins->flags);
+
+ shader_arb_get_src_param(ins, &ins->src[0], 0, src_name0);
+ shader_arb_get_src_param(ins, &ins->src[1], 1, src_name1);
+
+ if(vshader)
+ {
+ /* SUBC CC, src0, src1" works only in pixel shaders, so use TA to throw
+ * away the subtraction result
+ */
+ shader_addline(buffer, "SUBC TA, %s, %s;\n", src_name0, src_name1);
+ shader_addline(buffer, "BRA loop_%u_end (%s.x);\n", control_frame->loop_no, comp);
+ }
+ else
+ {
+ shader_addline(buffer, "SUBC TA, %s, %s;\n", src_name0, src_name1);
+ shader_addline(buffer, "BRK (%s.x);\n", comp);
+ }
+}
+
+static void shader_hw_ifc(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ struct list *e = list_head(&priv->control_frames);
+ struct control_frame *control_frame = LIST_ENTRY(e, struct control_frame, entry);
+ const char *comp;
+ char src_name0[50];
+ char src_name1[50];
+ BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
+
+ shader_arb_get_src_param(ins, &ins->src[0], 0, src_name0);
+ shader_arb_get_src_param(ins, &ins->src[1], 1, src_name1);
+
+ if(vshader)
+ {
+ /* Invert the flag. We jump to the else label if the condition is NOT true */
+ comp = get_compare(invert_compare(ins->flags));
+ shader_addline(buffer, "SUBC TA, %s, %s;\n", src_name0, src_name1);
+ shader_addline(buffer, "BRA ifc_%u_else (%s.x);\n", control_frame->ifc_no, comp);
+ }
+ else
+ {
+ comp = get_compare(ins->flags);
+ shader_addline(buffer, "SUBC TA, %s, %s;\n", src_name0, src_name1);
+ shader_addline(buffer, "IF %s.x;\n", comp);
+ }
+}
+
+static void shader_hw_else(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ struct list *e = list_head(&priv->control_frames);
+ struct control_frame *control_frame = LIST_ENTRY(e, struct control_frame, entry);
+ BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
+
+ if(vshader)
+ {
+ shader_addline(buffer, "BRA ifc_%u_endif;\n", control_frame->ifc_no);
+ shader_addline(buffer, "ifc_%u_else:\n", control_frame->ifc_no);
+ control_frame->had_else = TRUE;
+ }
+ else
+ {
+ shader_addline(buffer, "ELSE;\n");
+ }
+}
+
+static void shader_hw_endif(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ struct list *e = list_head(&priv->control_frames);
+ struct control_frame *control_frame = LIST_ENTRY(e, struct control_frame, entry);
+ BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
+
+ if(vshader)
+ {
+ if(control_frame->had_else)
+ {
+ shader_addline(buffer, "ifc_%u_endif:\n", control_frame->ifc_no);
+ }
+ else
+ {
+ shader_addline(buffer, "#No else branch. else is endif\n");
+ shader_addline(buffer, "ifc_%u_else:\n", control_frame->ifc_no);
+ }
+ }
+ else
+ {
+ shader_addline(buffer, "ENDIF;\n");
+ }
+}
+
+static void shader_hw_texldd(const struct wined3d_shader_instruction *ins)
+{
+ DWORD sampler_idx = ins->src[1].reg.idx;
+ char reg_dest[40];
+ char reg_src[3][40];
+ DWORD flags = TEX_DERIV;
+
+ shader_arb_get_dst_param(ins, &ins->dst[0], reg_dest);
+ shader_arb_get_src_param(ins, &ins->src[0], 0, reg_src[0]);
+ shader_arb_get_src_param(ins, &ins->src[2], 1, reg_src[1]);
+ shader_arb_get_src_param(ins, &ins->src[3], 2, reg_src[2]);
+
+ if (ins->flags & WINED3DSI_TEXLD_PROJECT) flags |= TEX_PROJ;
+ if (ins->flags & WINED3DSI_TEXLD_BIAS) flags |= TEX_BIAS;
+
+ shader_hw_sample(ins, sampler_idx, reg_dest, reg_src[0], flags, reg_src[1], reg_src[2]);
+}
+
+static void shader_hw_texldl(const struct wined3d_shader_instruction *ins)
+{
+ DWORD sampler_idx = ins->src[1].reg.idx;
+ char reg_dest[40];
+ char reg_coord[40];
+ DWORD flags = TEX_LOD;
+
+ shader_arb_get_dst_param(ins, &ins->dst[0], reg_dest);
+ shader_arb_get_src_param(ins, &ins->src[0], 0, reg_coord);
+
+ if (ins->flags & WINED3DSI_TEXLD_PROJECT) flags |= TEX_PROJ;
+ if (ins->flags & WINED3DSI_TEXLD_BIAS) flags |= TEX_BIAS;
+
+ shader_hw_sample(ins, sampler_idx, reg_dest, reg_coord, flags, NULL, NULL);
+}
+
+static void shader_hw_label(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+
+ priv->in_main_func = FALSE;
+ /* Call instructions activate the NV extensions, not labels and rets. If there is an uncalled
+ * subroutine, don't generate a label that will make GL complain
+ */
+ if(priv->target_version == ARB) return;
+
+ shader_addline(buffer, "l%u:\n", ins->src[0].reg.idx);
+}
+
+static void vshader_add_footer(IWineD3DVertexShaderImpl *This, struct wined3d_shader_buffer *buffer,
+ const struct arb_vs_compile_args *args, struct shader_arb_ctx_priv *priv_ctx)
+{
+ const shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ unsigned int i;
+
+ /* The D3DRS_FOGTABLEMODE render state defines if the shader-generated fog coord is used
+ * or if the fragment depth is used. If the fragment depth is used(FOGTABLEMODE != NONE),
+ * the fog frag coord is thrown away. If the fog frag coord is used, but not written by
+ * the shader, it is set to 0.0(fully fogged, since start = 1.0, end = 0.0)
+ */
+ if(args->super.fog_src == VS_FOG_Z) {
+ shader_addline(buffer, "MOV result.fogcoord, TMP_OUT.z;\n");
+ } else if (!reg_maps->fog) {
+ /* posFixup.x is always 1.0, so we can savely use it */
+ shader_addline(buffer, "ADD result.fogcoord, posFixup.x, -posFixup.x;\n");
+ }
+
+ /* Write the final position.
+ *
+ * OpenGL coordinates specify the center of the pixel while d3d coords specify
+ * the corner. The offsets are stored in z and w in posFixup. posFixup.y contains
+ * 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x
+ * contains 1.0 to allow a mad, but arb vs swizzles are too restricted for that.
+ */
+ shader_addline(buffer, "MUL TA, posFixup, TMP_OUT.w;\n");
+ shader_addline(buffer, "ADD TMP_OUT.x, TMP_OUT.x, TA.z;\n");
+ shader_addline(buffer, "MAD TMP_OUT.y, TMP_OUT.y, posFixup.y, TA.w;\n");
+
+ if(use_nv_clip(gl_info) && priv_ctx->target_version >= NV2)
+ {
+ for(i = 0; i < priv_ctx->vs_clipplanes; i++)
+ {
+ shader_addline(buffer, "DP4 result.clip[%u].x, TMP_OUT, state.clip[%u].plane;\n", i, i);
+ }
+ }
+ else if(args->boolclip.clip_control[0])
+ {
+ unsigned int cur_clip = 0;
+ char component[4] = {'x', 'y', 'z', 'w'};
+
+ for(i = 0; i < GL_LIMITS(clipplanes); i++)
+ {
+ if(args->boolclip.clip_control[1] & (1 << i))
+ {
+ shader_addline(buffer, "DP4 TA.%c, TMP_OUT, state.clip[%u].plane;\n",
+ component[cur_clip++], i);
+ }
+ }
+ switch(cur_clip)
+ {
+ case 0:
+ shader_addline(buffer, "MOV TA, -helper_const.w;\n");
+ break;
+ case 1:
+ shader_addline(buffer, "MOV TA.yzw, -helper_const.w;\n");
+ break;
+ case 2:
+ shader_addline(buffer, "MOV TA.zw, -helper_const.w;\n");
+ break;
+ case 3:
+ shader_addline(buffer, "MOV TA.w, -helper_const.w;\n");
+ break;
+ }
+ shader_addline(buffer, "MOV result.texcoord[%u], TA;\n",
+ args->boolclip.clip_control[0] - 1);
+ }
+
+ /* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
+ * and the glsl equivalent
+ */
+ if(need_helper_const(gl_info)) {
+ shader_addline(buffer, "MAD TMP_OUT.z, TMP_OUT.z, helper_const.x, -TMP_OUT.w;\n");
+ } else {
+ shader_addline(buffer, "ADD TMP_OUT.z, TMP_OUT.z, TMP_OUT.z;\n");
+ shader_addline(buffer, "ADD TMP_OUT.z, TMP_OUT.z, -TMP_OUT.w;\n");
+ }
+
+ shader_addline(buffer, "MOV result.position, TMP_OUT;\n");
+
+ priv_ctx->footer_written = TRUE;
+}
+
+static void shader_hw_ret(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *) ins->ctx->shader;
+ BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
+
+ if(priv->target_version == ARB) return;
+
+ if(vshader)
+ {
+ if(priv->in_main_func) vshader_add_footer((IWineD3DVertexShaderImpl *) shader, buffer, priv->cur_vs_args, priv);
+ }
+
+ shader_addline(buffer, "RET;\n");
+}
+
+static void shader_hw_call(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ shader_addline(buffer, "CAL l%u;\n", ins->src[0].reg.idx);
+}
+
+/* GL locking is done by the caller */
+static GLuint create_arb_blt_vertex_program(const struct wined3d_gl_info *gl_info)
{
GLuint program_id = 0;
+ GLint pos;
+
const char *blt_vprogram =
"!!ARBvp1.0\n"
"PARAM c[1] = { { 1, 0.5 } };\n"
@@ -1641,21 +3006,34 @@ static GLuint create_arb_blt_vertex_program(const WineD3D_GL_Info *gl_info)
GL_EXTCALL(glGenProgramsARB(1, &program_id));
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, program_id));
- GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(blt_vprogram), blt_vprogram));
+ GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
+ strlen(blt_vprogram), blt_vprogram));
+ checkGLcall("glProgramStringARB()");
- if (glGetError() == GL_INVALID_OPERATION) {
- GLint pos;
- glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
+ glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
+ if (pos != -1)
+ {
FIXME("Vertex program error at position %d: %s\n", pos,
debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
}
+ else
+ {
+ GLint native;
+
+ GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
+ checkGLcall("glGetProgramivARB()");
+ if (!native) WARN("Program exceeds native resource limits.\n");
+ }
return program_id;
}
-static GLuint create_arb_blt_fragment_program(const WineD3D_GL_Info *gl_info, enum tex_types tex_type)
+/* GL locking is done by the caller */
+static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_info, enum tex_types tex_type)
{
GLuint program_id = 0;
+ GLint pos;
+
static const char * const blt_fprograms[tex_type_count] =
{
/* tex_1d */
@@ -1690,223 +3068,269 @@ static GLuint create_arb_blt_fragment_program(const WineD3D_GL_Info *gl_info, en
GL_EXTCALL(glGenProgramsARB(1, &program_id));
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, program_id));
- GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(blt_fprograms[tex_type]), blt_fprograms[tex_type]));
+ GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
+ strlen(blt_fprograms[tex_type]), blt_fprograms[tex_type]));
+ checkGLcall("glProgramStringARB()");
- if (glGetError() == GL_INVALID_OPERATION) {
- GLint pos;
- glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
+ glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
+ if (pos != -1)
+ {
FIXME("Fragment program error at position %d: %s\n", pos,
debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
}
+ else
+ {
+ GLint native;
+
+ GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
+ checkGLcall("glGetProgramivARB()");
+ if (!native) WARN("Program exceeds native resource limits.\n");
+ }
return program_id;
}
-static void shader_arb_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- struct shader_arb_priv *priv = This->shader_priv;
- const WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
-
- if (useVS) {
- struct vs_compile_args compile_args;
-
- TRACE("Using vertex shader\n");
- find_vs_compile_args((IWineD3DVertexShaderImpl *) This->stateBlock->vertexShader, This->stateBlock, &compile_args);
- priv->current_vprogram_id = find_gl_vshader((IWineD3DVertexShaderImpl *) This->stateBlock->vertexShader, &compile_args);
-
- /* Bind the vertex program */
- GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id));
- checkGLcall("glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id);");
-
- /* Enable OpenGL vertex programs */
- glEnable(GL_VERTEX_PROGRAM_ARB);
- checkGLcall("glEnable(GL_VERTEX_PROGRAM_ARB);");
- TRACE("(%p) : Bound vertex program %u and enabled GL_VERTEX_PROGRAM_ARB\n", This, priv->current_vprogram_id);
- } else if(GL_SUPPORT(ARB_VERTEX_PROGRAM)) {
- priv->current_vprogram_id = 0;
- glDisable(GL_VERTEX_PROGRAM_ARB);
- checkGLcall("glDisable(GL_VERTEX_PROGRAM_ARB)");
- }
-
- if (usePS) {
- struct ps_compile_args compile_args;
- TRACE("Using pixel shader\n");
- find_ps_compile_args((IWineD3DPixelShaderImpl *) This->stateBlock->pixelShader, This->stateBlock, &compile_args);
- priv->current_fprogram_id = find_gl_pshader((IWineD3DPixelShaderImpl *) This->stateBlock->pixelShader,
- &compile_args);
-
- /* Bind the fragment program */
- GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->current_fprogram_id));
- checkGLcall("glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->current_fprogram_id);");
-
- if(!priv->use_arbfp_fixed_func) {
- /* Enable OpenGL fragment programs */
- glEnable(GL_FRAGMENT_PROGRAM_ARB);
- checkGLcall("glEnable(GL_FRAGMENT_PROGRAM_ARB);");
- }
- TRACE("(%p) : Bound fragment program %u and enabled GL_FRAGMENT_PROGRAM_ARB\n", This, priv->current_fprogram_id);
- } else if(GL_SUPPORT(ARB_FRAGMENT_PROGRAM) && !priv->use_arbfp_fixed_func) {
- /* Disable only if we're not using arbfp fixed function fragment processing. If this is used,
- * keep GL_FRAGMENT_PROGRAM_ARB enabled, and the fixed function pipeline will bind the fixed function
- * replacement shader
- */
- glDisable(GL_FRAGMENT_PROGRAM_ARB);
- checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
- priv->current_fprogram_id = 0;
- }
-}
-
-static void shader_arb_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- struct shader_arb_priv *priv = This->shader_priv;
- GLuint *blt_fprogram = &priv->depth_blt_fprogram_id[tex_type];
- const WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
-
- if (!priv->depth_blt_vprogram_id) priv->depth_blt_vprogram_id = create_arb_blt_vertex_program(gl_info);
- GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->depth_blt_vprogram_id));
- glEnable(GL_VERTEX_PROGRAM_ARB);
-
- if (!*blt_fprogram) *blt_fprogram = create_arb_blt_fragment_program(gl_info, tex_type);
- GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, *blt_fprogram));
- glEnable(GL_FRAGMENT_PROGRAM_ARB);
-}
-
-static void shader_arb_deselect_depth_blt(IWineD3DDevice *iface) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- struct shader_arb_priv *priv = This->shader_priv;
- const WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
-
- if (priv->current_vprogram_id) {
- GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id));
- checkGLcall("glBindProgramARB(GL_VERTEX_PROGRAM_ARB, vertexShader->prgId);");
-
- glEnable(GL_VERTEX_PROGRAM_ARB);
- checkGLcall("glEnable(GL_VERTEX_PROGRAM_ARB);");
-
- TRACE("(%p) : Bound vertex program %u and enabled GL_VERTEX_PROGRAM_ARB\n", This, priv->current_vprogram_id);
- } else {
- glDisable(GL_VERTEX_PROGRAM_ARB);
- checkGLcall("glDisable(GL_VERTEX_PROGRAM_ARB)");
- }
-
- if (priv->current_fprogram_id) {
- GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->current_fprogram_id));
- checkGLcall("glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, pixelShader->prgId);");
-
- glEnable(GL_FRAGMENT_PROGRAM_ARB);
- checkGLcall("glEnable(GL_FRAGMENT_PROGRAM_ARB);");
-
- TRACE("(%p) : Bound fragment program %u and enabled GL_FRAGMENT_PROGRAM_ARB\n", This, priv->current_fprogram_id);
- } else {
- glDisable(GL_FRAGMENT_PROGRAM_ARB);
- checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
- }
-}
-
-static void shader_arb_destroy(IWineD3DBaseShader *iface) {
- IWineD3DBaseShaderImpl *baseShader = (IWineD3DBaseShaderImpl *) iface;
- const WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)baseShader->baseShader.device)->adapter->gl_info;
-
- if (shader_is_pshader_version(baseShader->baseShader.reg_maps.shader_version.type))
- {
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *) iface;
- UINT i;
-
- ENTER_GL();
- for(i = 0; i < This->num_gl_shaders; i++) {
- GL_EXTCALL(glDeleteProgramsARB(1, &This->gl_shaders[i].prgId));
- checkGLcall("GL_EXTCALL(glDeleteProgramsARB(1, &This->gl_shaders[i].prgId))");
- }
- LEAVE_GL();
- HeapFree(GetProcessHeap(), 0, This->gl_shaders);
- This->gl_shaders = NULL;
- This->num_gl_shaders = 0;
- This->shader_array_size = 0;
- } else {
- IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *) iface;
- UINT i;
-
- ENTER_GL();
- for(i = 0; i < This->num_gl_shaders; i++) {
- GL_EXTCALL(glDeleteProgramsARB(1, &This->gl_shaders[i].prgId));
- checkGLcall("GL_EXTCALL(glDeleteProgramsARB(1, &This->gl_shaders[i].prgId))");
- }
- LEAVE_GL();
- HeapFree(GetProcessHeap(), 0, This->gl_shaders);
- This->gl_shaders = NULL;
- This->num_gl_shaders = 0;
- This->shader_array_size = 0;
- }
-}
-
-static HRESULT shader_arb_alloc(IWineD3DDevice *iface) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- This->shader_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct shader_arb_priv));
- return WINED3D_OK;
-}
-
-static void shader_arb_free(IWineD3DDevice *iface) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- const WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
- struct shader_arb_priv *priv = This->shader_priv;
- int i;
-
- if(priv->depth_blt_vprogram_id) {
- GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_vprogram_id));
- }
- for (i = 0; i < tex_type_count; ++i) {
- if (priv->depth_blt_fprogram_id[i]) {
- GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_fprogram_id[i]));
- }
- }
-
- HeapFree(GetProcessHeap(), 0, This->shader_priv);
-}
-
-static BOOL shader_arb_dirty_const(IWineD3DDevice *iface) {
- return TRUE;
-}
-
-static void arbfp_add_sRGB_correction(SHADER_BUFFER *buffer, const char *fragcolor, const char *tmp1,
- const char *tmp2, const char *tmp3, const char *tmp4) {
+static void arbfp_add_sRGB_correction(struct wined3d_shader_buffer *buffer, const char *fragcolor,
+ const char *tmp1, const char *tmp2, const char *tmp3, const char *tmp4, BOOL condcode)
+{
/* Perform sRGB write correction. See GLX_EXT_framebuffer_sRGB */
- /* Calculate the > 0.0031308 case */
- shader_addline(buffer, "POW %s.x, %s.x, srgb_consts1.z;\n", tmp1, fragcolor);
- shader_addline(buffer, "POW %s.y, %s.y, srgb_consts1.z;\n", tmp1, fragcolor);
- shader_addline(buffer, "POW %s.z, %s.z, srgb_consts1.z;\n", tmp1, fragcolor);
- shader_addline(buffer, "MUL %s, %s, srgb_consts1.w;\n", tmp1, tmp1);
- shader_addline(buffer, "SUB %s, %s, srgb_consts2.x;\n", tmp1, tmp1);
- /* Calculate the < case */
- shader_addline(buffer, "MUL %s, srgb_consts1.x, %s;\n", tmp2, fragcolor);
- /* Get 1.0 / 0.0 masks for > 0.0031308 and < 0.0031308 */
- shader_addline(buffer, "SLT %s, srgb_consts1.y, %s;\n", tmp3, fragcolor);
- shader_addline(buffer, "SGE %s, srgb_consts1.y, %s;\n", tmp4, fragcolor);
- /* Store the components > 0.0031308 in the destination */
- shader_addline(buffer, "MUL %s, %s, %s;\n", fragcolor, tmp1, tmp3);
- /* Add the components that are < 0.0031308 */
- shader_addline(buffer, "MAD result.color.xyz, %s, %s, %s;\n", tmp2, tmp4, fragcolor);
+ if(condcode)
+ {
+ /* Sigh. MOVC CC doesn't work, so use one of the temps as dummy dest */
+ shader_addline(buffer, "SUBC %s, %s.x, srgb_consts1.y;\n", tmp1, fragcolor);
+ /* Calculate the > 0.0031308 case */
+ shader_addline(buffer, "POW %s.x (GE), %s.x, srgb_consts1.z;\n", fragcolor, fragcolor);
+ shader_addline(buffer, "POW %s.y (GE), %s.y, srgb_consts1.z;\n", fragcolor, fragcolor);
+ shader_addline(buffer, "POW %s.z (GE), %s.z, srgb_consts1.z;\n", fragcolor, fragcolor);
+ shader_addline(buffer, "MUL %s.xyz (GE), %s, srgb_consts1.w;\n", fragcolor, fragcolor);
+ shader_addline(buffer, "SUB %s.xyz (GE), %s, srgb_consts2.x;\n", fragcolor, fragcolor);
+ /* Calculate the < case */
+ shader_addline(buffer, "MUL %s.xyz (LT), srgb_consts1.x, %s;\n", fragcolor, fragcolor);
+ }
+ else
+ {
+ /* Calculate the > 0.0031308 case */
+ shader_addline(buffer, "POW %s.x, %s.x, srgb_consts1.z;\n", tmp1, fragcolor);
+ shader_addline(buffer, "POW %s.y, %s.y, srgb_consts1.z;\n", tmp1, fragcolor);
+ shader_addline(buffer, "POW %s.z, %s.z, srgb_consts1.z;\n", tmp1, fragcolor);
+ shader_addline(buffer, "MUL %s, %s, srgb_consts1.w;\n", tmp1, tmp1);
+ shader_addline(buffer, "SUB %s, %s, srgb_consts2.x;\n", tmp1, tmp1);
+ /* Calculate the < case */
+ shader_addline(buffer, "MUL %s, srgb_consts1.x, %s;\n", tmp2, fragcolor);
+ /* Get 1.0 / 0.0 masks for > 0.0031308 and < 0.0031308 */
+ shader_addline(buffer, "SLT %s, srgb_consts1.y, %s;\n", tmp3, fragcolor);
+ shader_addline(buffer, "SGE %s, srgb_consts1.y, %s;\n", tmp4, fragcolor);
+ /* Store the components > 0.0031308 in the destination */
+ shader_addline(buffer, "MUL %s.xyz, %s, %s;\n", fragcolor, tmp1, tmp3);
+ /* Add the components that are < 0.0031308 */
+ shader_addline(buffer, "MAD %s.xyz, %s, %s, %s;\n", fragcolor, tmp2, tmp4, fragcolor);
+ /* Move everything into result.color at once. Nvidia hardware cannot handle partial
+ * result.color writes(.rgb first, then .a), or handle overwriting already written
+ * components. The assembler uses a temporary register in this case, which is usually
+ * not allocated from one of our registers that were used earlier.
+ */
+ }
+ shader_addline(buffer, "MOV result.color, %s;\n", fragcolor);
/* [0.0;1.0] clamping. Not needed, this is done implicitly */
}
-static GLuint shader_arb_generate_pshader(IWineD3DPixelShader *iface,
- SHADER_BUFFER *buffer, const struct ps_compile_args *args)
+static const DWORD *find_loop_control_values(IWineD3DBaseShaderImpl *This, DWORD idx)
+{
+ const local_constant *constant;
+
+ LIST_FOR_EACH_ENTRY(constant, &This->baseShader.constantsI, local_constant, entry)
+ {
+ if (constant->idx == idx)
+ {
+ return constant->value;
+ }
+ }
+ return NULL;
+}
+
+static void init_ps_input(const IWineD3DPixelShaderImpl *This, const struct arb_ps_compile_args *args,
+ struct shader_arb_ctx_priv *priv)
+{
+ const char *texcoords[8] =
+ {
+ "fragment.texcoord[0]", "fragment.texcoord[1]", "fragment.texcoord[2]", "fragment.texcoord[3]",
+ "fragment.texcoord[4]", "fragment.texcoord[5]", "fragment.texcoord[6]", "fragment.texcoord[7]"
+ };
+ unsigned int i;
+ const struct wined3d_shader_signature_element *sig = This->input_signature;
+ const char *semantic_name;
+ DWORD semantic_idx;
+
+ switch(args->super.vp_mode)
+ {
+ case pretransformed:
+ case fixedfunction:
+ /* The pixelshader has to collect the varyings on its own. In any case properly load
+ * color0 and color1. In the case of pretransformed vertices also load texcoords. Set
+ * other attribs to 0.0.
+ *
+ * For fixedfunction this behavior is correct, according to the tests. For pretransformed
+ * we'd either need a replacement shader that can load other attribs like BINORMAL, or
+ * load the texcoord attrib pointers to match the pixel shader signature
+ */
+ for(i = 0; i < MAX_REG_INPUT; i++)
+ {
+ semantic_name = sig[i].semantic_name;
+ semantic_idx = sig[i].semantic_idx;
+ if(semantic_name == NULL) continue;
+
+ if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_COLOR))
+ {
+ if(semantic_idx == 0) priv->ps_input[i] = "fragment.color.primary";
+ else if(semantic_idx == 1) priv->ps_input[i] = "fragment.color.secondary";
+ else priv->ps_input[i] = "0.0";
+ }
+ else if(args->super.vp_mode == fixedfunction)
+ {
+ priv->ps_input[i] = "0.0";
+ }
+ else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_TEXCOORD))
+ {
+ if(semantic_idx < 8) priv->ps_input[i] = texcoords[semantic_idx];
+ else priv->ps_input[i] = "0.0";
+ }
+ else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_FOG))
+ {
+ if(semantic_idx == 0) priv->ps_input[i] = "fragment.fogcoord";
+ else priv->ps_input[i] = "0.0";
+ }
+ else
+ {
+ priv->ps_input[i] = "0.0";
+ }
+
+ TRACE("v%u, semantic %s%u is %s\n", i, semantic_name, semantic_idx, priv->ps_input[i]);
+ }
+ break;
+
+ case vertexshader:
+ /* That one is easy. The vertex shaders provide v0-v7 in fragment.texcoord and v8 and v9 in
+ * fragment.color
+ */
+ for(i = 0; i < 8; i++)
+ {
+ priv->ps_input[i] = texcoords[i];
+ }
+ priv->ps_input[8] = "fragment.color.primary";
+ priv->ps_input[9] = "fragment.color.secondary";
+ break;
+ }
+}
+
+/* GL locking is done by the caller */
+static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct wined3d_shader_buffer *buffer,
+ const struct arb_ps_compile_args *args, struct arb_ps_compiled_shader *compiled)
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface;
const shader_reg_maps* reg_maps = &This->baseShader.reg_maps;
CONST DWORD *function = This->baseShader.function;
- const WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info;
const local_constant *lconst;
GLuint retval;
- const char *fragcolor;
- DWORD *lconst_map = local_const_mapping((IWineD3DBaseShaderImpl *) This);
+ char fragcolor[16];
+ DWORD *lconst_map = local_const_mapping((IWineD3DBaseShaderImpl *) This), next_local, cur;
+ struct shader_arb_ctx_priv priv_ctx;
+ BOOL dcl_tmp = args->super.srgb_correction, dcl_td = FALSE;
+ BOOL want_nv_prog = FALSE;
+ struct arb_pshader_private *shader_priv = This->backend_priv;
+ GLint errPos;
+ DWORD map;
+
+ char srgbtmp[4][4];
+ unsigned int i, found = 0;
+
+ for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i)
+ {
+ if (!(map & 1)
+ || (This->color0_mov && i == This->color0_reg)
+ || (reg_maps->shader_version.major < 2 && i == 0))
+ continue;
+
+ sprintf(srgbtmp[found], "R%u", i);
+ ++found;
+ if (found == 4) break;
+ }
+
+ switch(found) {
+ case 4: dcl_tmp = FALSE; break;
+ case 0:
+ sprintf(srgbtmp[0], "TA");
+ sprintf(srgbtmp[1], "TB");
+ sprintf(srgbtmp[2], "TC");
+ sprintf(srgbtmp[3], "TD");
+ dcl_td = TRUE;
+ break;
+ case 1:
+ sprintf(srgbtmp[1], "TA");
+ sprintf(srgbtmp[2], "TB");
+ sprintf(srgbtmp[3], "TC");
+ break;
+ case 2:
+ sprintf(srgbtmp[2], "TA");
+ sprintf(srgbtmp[3], "TB");
+ break;
+ case 3:
+ sprintf(srgbtmp[3], "TA");
+ break;
+ }
/* Create the hw ARB shader */
+ memset(&priv_ctx, 0, sizeof(priv_ctx));
+ priv_ctx.cur_ps_args = args;
+ priv_ctx.compiled_fprog = compiled;
+ priv_ctx.cur_np2fixup_info = &compiled->np2fixup_info;
+ init_ps_input(This, args, &priv_ctx);
+ list_init(&priv_ctx.control_frames);
+
+ /* Avoid enabling NV_fragment_program* if we do not need it.
+ *
+ * Enabling GL_NV_fragment_program_option causes the driver to occupy a temporary register,
+ * and it slows down the shader execution noticeably(about 5%). Usually our instruction emulation
+ * is faster than what we gain from using higher native instructions. There are some things though
+ * that cannot be emulated. In that case enable the extensions.
+ * If the extension is enabled, instruction handlers that support both ways will use it.
+ *
+ * Testing shows no performance difference between OPTION NV_fragment_program2 and NV_fragment_program.
+ * So enable the best we can get.
+ */
+ if(reg_maps->usesdsx || reg_maps->usesdsy || reg_maps->loop_depth > 0 || reg_maps->usestexldd ||
+ reg_maps->usestexldl || reg_maps->usesfacing || reg_maps->usesifc || reg_maps->usescall)
+ {
+ want_nv_prog = TRUE;
+ }
+
shader_addline(buffer, "!!ARBfp1.0\n");
+ if(want_nv_prog && GL_SUPPORT(NV_FRAGMENT_PROGRAM2)) {
+ shader_addline(buffer, "OPTION NV_fragment_program2;\n");
+ priv_ctx.target_version = NV3;
+ } else if(want_nv_prog && GL_SUPPORT(NV_FRAGMENT_PROGRAM_OPTION)) {
+ shader_addline(buffer, "OPTION NV_fragment_program;\n");
+ priv_ctx.target_version = NV2;
+ } else {
+ if(want_nv_prog)
+ {
+ /* This is an error - either we're advertising the wrong shader version, or aren't enforcing some
+ * limits properly
+ */
+ ERR("The shader requires instructions that are not available in plain GL_ARB_fragment_program\n");
+ ERR("Try GLSL\n");
+ }
+ priv_ctx.target_version = ARB;
+ }
+
+ if(This->baseShader.reg_maps.highest_render_target > 0)
+ {
+ shader_addline(buffer, "OPTION ARB_draw_buffers;\n");
+ }
if (reg_maps->shader_version.major < 3)
{
- switch(args->fog) {
+ switch(args->super.fog) {
case FOG_OFF:
break;
case FOG_LINEAR:
@@ -1921,33 +3345,171 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShader *iface,
}
}
- shader_addline(buffer, "TEMP TMP;\n"); /* Used in matrix ops */
- shader_addline(buffer, "TEMP TMP2;\n"); /* Used in matrix ops */
+ /* For now always declare the temps. At least the Nvidia assembler optimizes completely
+ * unused temps away(but occupies them for the whole shader if they're used once). Always
+ * declaring them avoids tricky bookkeeping work
+ */
shader_addline(buffer, "TEMP TA;\n"); /* Used for modifiers */
shader_addline(buffer, "TEMP TB;\n"); /* Used for modifiers */
shader_addline(buffer, "TEMP TC;\n"); /* Used for modifiers */
+ if(dcl_td) shader_addline(buffer, "TEMP TD;\n"); /* Used for sRGB writing */
shader_addline(buffer, "PARAM coefdiv = { 0.5, 0.25, 0.125, 0.0625 };\n");
shader_addline(buffer, "PARAM coefmul = { 2, 4, 8, 16 };\n");
shader_addline(buffer, "PARAM one = { 1.0, 1.0, 1.0, 1.0 };\n");
if (reg_maps->shader_version.major < 2)
{
- fragcolor = "R0";
+ strcpy(fragcolor, "R0");
} else {
- shader_addline(buffer, "TEMP TMP_COLOR;\n");
- fragcolor = "TMP_COLOR";
+ if(args->super.srgb_correction) {
+ if(This->color0_mov) {
+ sprintf(fragcolor, "R%u", This->color0_reg);
+ } else {
+ shader_addline(buffer, "TEMP TMP_COLOR;\n");
+ strcpy(fragcolor, "TMP_COLOR");
+ }
+ } else {
+ strcpy(fragcolor, "result.color");
+ }
+ }
+
+ if(args->super.srgb_correction) {
+ shader_addline(buffer, "PARAM srgb_consts1 = {%f, %f, %f, %f};\n",
+ srgb_mul_low, srgb_cmp, srgb_pow, srgb_mul_high);
+ shader_addline(buffer, "PARAM srgb_consts2 = {%f, %f, %f, %f};\n",
+ srgb_sub_high, 0.0, 0.0, 0.0);
}
/* Base Declarations */
- shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION, lconst_map);
+ next_local = shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION,
+ lconst_map, NULL, &priv_ctx);
+
+ for (i = 0, map = reg_maps->bumpmat; map; map >>= 1, ++i)
+ {
+ if (!(map & 1)) continue;
+
+ cur = compiled->numbumpenvmatconsts;
+ compiled->bumpenvmatconst[cur].const_num = WINED3D_CONST_NUM_UNUSED;
+ compiled->bumpenvmatconst[cur].texunit = i;
+ compiled->luminanceconst[cur].const_num = WINED3D_CONST_NUM_UNUSED;
+ compiled->luminanceconst[cur].texunit = i;
+
+ /* We can fit the constants into the constant limit for sure because texbem, texbeml, bem and beml are only supported
+ * in 1.x shaders, and GL_ARB_fragment_program has a constant limit of 24 constants. So in the worst case we're loading
+ * 8 shader constants, 8 bump matrices and 8 luminance parameters and are perfectly fine. (No NP2 fixup on bumpmapped
+ * textures due to conditional NP2 restrictions)
+ *
+ * Use local constants to load the bump env parameters, not program.env. This avoids collisions with d3d constants of
+ * shaders in newer shader models. Since the bump env parameters have to share their space with NP2 fixup constants,
+ * their location is shader dependent anyway and they cannot be loaded globally.
+ */
+ compiled->bumpenvmatconst[cur].const_num = next_local++;
+ shader_addline(buffer, "PARAM bumpenvmat%d = program.local[%d];\n",
+ i, compiled->bumpenvmatconst[cur].const_num);
+ compiled->numbumpenvmatconsts = cur + 1;
+
+ if (!(reg_maps->luminanceparams & (1 << i))) continue;
+
+ compiled->luminanceconst[cur].const_num = next_local++;
+ shader_addline(buffer, "PARAM luminance%d = program.local[%d];\n",
+ i, compiled->luminanceconst[cur].const_num);
+ }
+
+ for(i = 0; i < MAX_CONST_I; i++)
+ {
+ compiled->int_consts[i] = WINED3D_CONST_NUM_UNUSED;
+ if (reg_maps->integer_constants & (1 << i) && priv_ctx.target_version >= NV2)
+ {
+ const DWORD *control_values = find_loop_control_values((IWineD3DBaseShaderImpl *) This, i);
+
+ if(control_values)
+ {
+ shader_addline(buffer, "PARAM I%u = {%u, %u, %u, -1};\n", i,
+ control_values[0], control_values[1], control_values[2]);
+ }
+ else
+ {
+ compiled->int_consts[i] = next_local;
+ compiled->num_int_consts++;
+ shader_addline(buffer, "PARAM I%u = program.local[%u];\n", i, next_local++);
+ }
+ }
+ }
+
+ if(reg_maps->vpos || reg_maps->usesdsy)
+ {
+ compiled->ycorrection = next_local;
+ shader_addline(buffer, "PARAM ycorrection = program.local[%u];\n", next_local++);
+
+ if(reg_maps->vpos)
+ {
+ shader_addline(buffer, "TEMP vpos;\n");
+ /* ycorrection.x: Backbuffer height(onscreen) or 0(offscreen).
+ * ycorrection.y: -1.0(onscreen), 1.0(offscreen)
+ * ycorrection.z: 1.0
+ * ycorrection.w: 0.0
+ */
+ shader_addline(buffer, "MAD vpos, fragment.position, ycorrection.zyww, ycorrection.wxww;\n");
+ shader_addline(buffer, "FLR vpos.xy, vpos;\n");
+ }
+ }
+ else
+ {
+ compiled->ycorrection = WINED3D_CONST_NUM_UNUSED;
+ }
+
+ /* Load constants to fixup NP2 texcoords if there are still free constants left:
+ * Constants (texture dimensions) for the NP2 fixup are loaded as local program parameters. This will consume
+ * at most 8 (MAX_FRAGMENT_SAMPLERS / 2) parameters, which is highly unlikely, since the application had to
+ * use 16 NP2 textures at the same time. In case that we run out of constants the fixup is simply not
+ * applied / activated. This will probably result in wrong rendering of the texture, but will save us from
+ * shader compilation errors and the subsequent errors when drawing with this shader. */
+ if (priv_ctx.cur_ps_args->super.np2_fixup) {
+
+ struct arb_ps_np2fixup_info* const fixup = priv_ctx.cur_np2fixup_info;
+ const WORD map = priv_ctx.cur_ps_args->super.np2_fixup;
+ const UINT max_lconsts = gl_info->ps_arb_max_local_constants;
+
+ fixup->offset = next_local;
+ fixup->super.active = 0;
+
+ cur = 0;
+ for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) {
+ if (!(map & (1 << i))) continue;
+
+ if (fixup->offset + (cur >> 1) < max_lconsts) {
+ fixup->super.active |= (1 << i);
+ fixup->super.idx[i] = cur++;
+ } else {
+ FIXME("No free constant found to load NP2 fixup data into shader. "
+ "Sampling from this texture will probably look wrong.\n");
+ break;
+ }
+ }
+
+ fixup->super.num_consts = (cur + 1) >> 1;
+ if (fixup->super.num_consts) {
+ shader_addline(buffer, "PARAM np2fixup[%u] = { program.env[%u..%u] };\n",
+ fixup->super.num_consts, fixup->offset, fixup->super.num_consts + fixup->offset - 1);
+ }
+
+ next_local += fixup->super.num_consts;
+ }
+
+ if (shader_priv->clipplane_emulation != ~0U)
+ {
+ shader_addline(buffer, "KIL fragment.texcoord[%u];\n", shader_priv->clipplane_emulation);
+ }
/* Base Shader Body */
- shader_generate_main((IWineD3DBaseShader *)This, buffer, reg_maps, function);
+ shader_generate_main((IWineD3DBaseShader *)This, buffer, reg_maps, function, &priv_ctx);
- if(args->srgb_correction) {
- arbfp_add_sRGB_correction(buffer, fragcolor, "TMP", "TMP2", "TA", "TB");
+ if(args->super.srgb_correction) {
+ arbfp_add_sRGB_correction(buffer, fragcolor, srgbtmp[0], srgbtmp[1], srgbtmp[2], srgbtmp[3],
+ priv_ctx.target_version >= NV2);
+ } else if(reg_maps->shader_version.major < 2) {
+ shader_addline(buffer, "MOV result.color, %s;\n", fragcolor);
}
- shader_addline(buffer, "MOV result.color, %s;\n", fragcolor);
shader_addline(buffer, "END\n");
/* TODO: change to resource.glObjectHandle or something like that */
@@ -1960,14 +3522,23 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShader *iface,
/* Create the program and check for errors */
GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
buffer->bsize, buffer->buffer));
+ checkGLcall("glProgramStringARB()");
- if (glGetError() == GL_INVALID_OPERATION) {
- GLint errPos;
- glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
+ glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
+ if (errPos != -1)
+ {
FIXME("HW PixelShader Error at position %d: %s\n",
errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
retval = 0;
}
+ else
+ {
+ GLint native;
+
+ GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
+ checkGLcall("glGetProgramivARB()");
+ if (!native) WARN("Program exceeds native resource limits.\n");
+ }
/* Load immediate constants */
if(lconst_map) {
@@ -1982,34 +3553,332 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShader *iface,
return retval;
}
-static GLuint shader_arb_generate_vshader(IWineD3DVertexShader *iface,
- SHADER_BUFFER *buffer, const struct vs_compile_args *args)
+static int compare_sig(const struct wined3d_shader_signature_element *sig1, const struct wined3d_shader_signature_element *sig2)
+{
+ unsigned int i;
+ int ret;
+
+ for(i = 0; i < MAX_REG_INPUT; i++)
+ {
+ if(sig1[i].semantic_name == NULL || sig2[i].semantic_name == NULL)
+ {
+ /* Compare pointers, not contents. One string is NULL(element does not exist), the other one is not NULL */
+ if(sig1[i].semantic_name != sig2[i].semantic_name) return sig1[i].semantic_name < sig2[i].semantic_name ? -1 : 1;
+ continue;
+ }
+
+ ret = strcmp(sig1[i].semantic_name, sig2[i].semantic_name);
+ if(ret != 0) return ret;
+ if(sig1[i].semantic_idx != sig2[i].semantic_idx) return sig1[i].semantic_idx < sig2[i].semantic_idx ? -1 : 1;
+ if(sig1[i].sysval_semantic != sig2[i].sysval_semantic) return sig1[i].sysval_semantic < sig2[i].sysval_semantic ? -1 : 1;
+ if(sig1[i].component_type != sig2[i].component_type) return sig1[i].sysval_semantic < sig2[i].component_type ? -1 : 1;
+ if(sig1[i].register_idx != sig2[i].register_idx) return sig1[i].register_idx < sig2[i].register_idx ? -1 : 1;
+ if(sig1[i].mask != sig2->mask) return sig1[i].mask < sig2[i].mask ? -1 : 1;
+ }
+ return 0;
+}
+
+static struct wined3d_shader_signature_element *clone_sig(const struct wined3d_shader_signature_element *sig)
+{
+ struct wined3d_shader_signature_element *new;
+ int i;
+ char *name;
+
+ new = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*new) * MAX_REG_INPUT);
+ for(i = 0; i < MAX_REG_INPUT; i++)
+ {
+ if(sig[i].semantic_name == NULL)
+ {
+ continue;
+ }
+
+ new[i] = sig[i];
+ /* Clone the semantic string */
+ name = HeapAlloc(GetProcessHeap(), 0, strlen(sig[i].semantic_name) + 1);
+ strcpy(name, sig[i].semantic_name);
+ new[i].semantic_name = name;
+ }
+ return new;
+}
+
+static DWORD find_input_signature(struct shader_arb_priv *priv, const struct wined3d_shader_signature_element *sig)
+{
+ struct wine_rb_entry *entry = wine_rb_get(&priv->signature_tree, sig);
+ struct ps_signature *found_sig;
+
+ if(entry != NULL)
+ {
+ found_sig = WINE_RB_ENTRY_VALUE(entry, struct ps_signature, entry);
+ TRACE("Found existing signature %u\n", found_sig->idx);
+ return found_sig->idx;
+ }
+ found_sig = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*sig));
+ found_sig->sig = clone_sig(sig);
+ found_sig->idx = priv->ps_sig_number++;
+ TRACE("New signature stored and assigned number %u\n", found_sig->idx);
+ if(wine_rb_put(&priv->signature_tree, sig, &found_sig->entry) == -1)
+ {
+ ERR("Failed to insert program entry.\n");
+ }
+ return found_sig->idx;
+}
+
+static void init_output_registers(IWineD3DVertexShaderImpl *shader, DWORD sig_num, struct shader_arb_ctx_priv *priv_ctx,
+ struct arb_vs_compiled_shader *compiled)
+{
+ unsigned int i, j;
+ static const char *texcoords[8] =
+ {
+ "result.texcoord[0]", "result.texcoord[1]", "result.texcoord[2]", "result.texcoord[3]",
+ "result.texcoord[4]", "result.texcoord[5]", "result.texcoord[6]", "result.texcoord[7]"
+ };
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) shader->baseShader.device;
+ const struct wined3d_shader_signature_element *sig;
+ const char *semantic_name;
+ DWORD semantic_idx, reg_idx;
+
+ /* Write generic input varyings 0 to 7 to result.texcoord[], varying 8 to result.color.primary
+ * and varying 9 to result.color.secondary
+ */
+ const char *decl_idx_to_string[MAX_REG_INPUT] =
+ {
+ texcoords[0], texcoords[1], texcoords[2], texcoords[3],
+ texcoords[4], texcoords[5], texcoords[6], texcoords[7],
+ "result.color.primary", "result.color.secondary"
+ };
+
+ if(sig_num == ~0)
+ {
+ TRACE("Pixel shader uses builtin varyings\n");
+ /* Map builtins to builtins */
+ for(i = 0; i < 8; i++)
+ {
+ priv_ctx->texcrd_output[i] = texcoords[i];
+ }
+ priv_ctx->color_output[0] = "result.color.primary";
+ priv_ctx->color_output[1] = "result.color.secondary";
+ priv_ctx->fog_output = "result.fogcoord";
+
+ /* Map declared regs to builtins. Use "TA" to /dev/null unread output */
+ for(i = 0; i < (sizeof(shader->output_signature) / sizeof(*shader->output_signature)); i++)
+ {
+ semantic_name = shader->output_signature[i].semantic_name;
+ if(semantic_name == NULL) continue;
+
+ if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_POSITION))
+ {
+ TRACE("o%u is TMP_OUT\n", i);
+ if(shader->output_signature[i].semantic_idx == 0) priv_ctx->vs_output[i] = "TMP_OUT";
+ else priv_ctx->vs_output[i] = "TA";
+ }
+ else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_PSIZE))
+ {
+ TRACE("o%u is result.pointsize\n", i);
+ if(shader->output_signature[i].semantic_idx == 0) priv_ctx->vs_output[i] = "result.pointsize";
+ else priv_ctx->vs_output[i] = "TA";
+ }
+ else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_COLOR))
+ {
+ TRACE("o%u is result.color.?, idx %u\n", i, shader->output_signature[i].semantic_idx);
+ if(shader->output_signature[i].semantic_idx == 0) priv_ctx->vs_output[i] = "result.color.primary";
+ else if(shader->output_signature[i].semantic_idx == 1) priv_ctx->vs_output[i] = "result.color.secondary";
+ else priv_ctx->vs_output[i] = "TA";
+ }
+ else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_TEXCOORD))
+ {
+ TRACE("o%u is %s\n", i, texcoords[shader->output_signature[i].semantic_idx]);
+ if(shader->output_signature[i].semantic_idx >= 8) priv_ctx->vs_output[i] = "TA";
+ else priv_ctx->vs_output[i] = texcoords[shader->output_signature[i].semantic_idx];
+ }
+ else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_FOG))
+ {
+ TRACE("o%u is result.fogcoord\n", i);
+ if(shader->output_signature[i].semantic_idx > 0) priv_ctx->vs_output[i] = "TA";
+ else priv_ctx->vs_output[i] = "result.fogcoord";
+ }
+ else
+ {
+ priv_ctx->vs_output[i] = "TA";
+ }
+ }
+ return;
+ }
+
+ /* Instead of searching for the signature in the signature list, read the one from the current pixel shader.
+ * Its maybe not the shader where the signature came from, but it is the same signature and faster to find
+ */
+ sig = ((IWineD3DPixelShaderImpl *)device->stateBlock->pixelShader)->input_signature;
+ TRACE("Pixel shader uses declared varyings\n");
+
+ /* Map builtin to declared. /dev/null the results by default to the TA temp reg */
+ for(i = 0; i < 8; i++)
+ {
+ priv_ctx->texcrd_output[i] = "TA";
+ }
+ priv_ctx->color_output[0] = "TA";
+ priv_ctx->color_output[1] = "TA";
+ priv_ctx->fog_output = "TA";
+
+ for(i = 0; i < MAX_REG_INPUT; i++)
+ {
+ semantic_name = sig[i].semantic_name;
+ semantic_idx = sig[i].semantic_idx;
+ reg_idx = sig[i].register_idx;
+ if(semantic_name == NULL) continue;
+
+ /* If a declared input register is not written by builtin arguments, don't write to it.
+ * GL_NV_vertex_program makes sure the input defaults to 0.0, which is correct with D3D
+ *
+ * Don't care about POSITION and PSIZE here - this is a builtin vertex shader, position goes
+ * to TMP_OUT in any case
+ */
+ if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_TEXCOORD))
+ {
+ if(semantic_idx < 8) priv_ctx->texcrd_output[semantic_idx] = decl_idx_to_string[reg_idx];
+ }
+ else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_COLOR))
+ {
+ if(semantic_idx < 2) priv_ctx->color_output[semantic_idx] = decl_idx_to_string[reg_idx];
+ }
+ else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_FOG))
+ {
+ if(semantic_idx == 0) priv_ctx->fog_output = decl_idx_to_string[reg_idx];
+ }
+ else
+ {
+ continue;
+ }
+
+ if(strcmp(decl_idx_to_string[reg_idx], "result.color.primary") == 0 ||
+ strcmp(decl_idx_to_string[reg_idx], "result.color.secondary") == 0)
+ {
+ compiled->need_color_unclamp = TRUE;
+ }
+ }
+
+ /* Map declared to declared */
+ for(i = 0; i < (sizeof(shader->output_signature) / sizeof(*shader->output_signature)); i++)
+ {
+ /* Write unread output to TA to throw them away */
+ priv_ctx->vs_output[i] = "TA";
+ semantic_name = shader->output_signature[i].semantic_name;
+ if(semantic_name == NULL)
+ {
+ continue;
+ }
+
+ if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_POSITION) &&
+ shader->output_signature[i].semantic_idx == 0)
+ {
+ priv_ctx->vs_output[i] = "TMP_OUT";
+ continue;
+ }
+ else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_PSIZE) &&
+ shader->output_signature[i].semantic_idx == 0)
+ {
+ priv_ctx->vs_output[i] = "result.pointsize";
+ continue;
+ }
+
+ for(j = 0; j < MAX_REG_INPUT; j++)
+ {
+ if(sig[j].semantic_name == NULL)
+ {
+ continue;
+ }
+
+ if(strcmp(sig[j].semantic_name, semantic_name) == 0 &&
+ sig[j].semantic_idx == shader->output_signature[i].semantic_idx)
+ {
+ priv_ctx->vs_output[i] = decl_idx_to_string[sig[j].register_idx];
+
+ if(strcmp(priv_ctx->vs_output[i], "result.color.primary") == 0 ||
+ strcmp(priv_ctx->vs_output[i], "result.color.secondary") == 0)
+ {
+ compiled->need_color_unclamp = TRUE;
+ }
+ }
+ }
+ }
+}
+
+/* GL locking is done by the caller */
+static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct wined3d_shader_buffer *buffer,
+ const struct arb_vs_compile_args *args, struct arb_vs_compiled_shader *compiled)
{
- IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface;
const shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
CONST DWORD *function = This->baseShader.function;
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device;
- const WineD3D_GL_Info *gl_info = &device->adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
const local_constant *lconst;
GLuint ret;
- DWORD *lconst_map = local_const_mapping((IWineD3DBaseShaderImpl *) This);
+ DWORD next_local, *lconst_map = local_const_mapping((IWineD3DBaseShaderImpl *) This);
+ struct shader_arb_ctx_priv priv_ctx;
+ unsigned int i;
+ GLint errPos;
+
+ memset(&priv_ctx, 0, sizeof(priv_ctx));
+ priv_ctx.cur_vs_args = args;
+ list_init(&priv_ctx.control_frames);
+ init_output_registers(This, args->ps_signature, &priv_ctx, compiled);
/* Create the hw ARB shader */
shader_addline(buffer, "!!ARBvp1.0\n");
- shader_addline(buffer, "PARAM helper_const = { 2.0, -1.0, %d.0, 0.0 };\n", This->rel_offset);
- /* Mesa supports only 95 constants */
- if (GL_VEND(MESA) || GL_VEND(WINE))
- This->baseShader.limits.constant_float =
- min(95, This->baseShader.limits.constant_float);
+ /* Always enable the NV extension if available. Unlike fragment shaders, there is no
+ * mesurable performance penalty, and we can always make use of it for clipplanes.
+ */
+ if(GL_SUPPORT(NV_VERTEX_PROGRAM3)) {
+ shader_addline(buffer, "OPTION NV_vertex_program3;\n");
+ priv_ctx.target_version = NV3;
+ shader_addline(buffer, "ADDRESS aL;\n");
+ } else if(GL_SUPPORT(NV_VERTEX_PROGRAM2_OPTION)) {
+ shader_addline(buffer, "OPTION NV_vertex_program2;\n");
+ priv_ctx.target_version = NV2;
+ shader_addline(buffer, "ADDRESS aL;\n");
+ } else {
+ priv_ctx.target_version = ARB;
+ }
- shader_addline(buffer, "TEMP TMP;\n");
+ shader_addline(buffer, "TEMP TMP_OUT;\n");
+ if(need_helper_const(gl_info)) {
+ shader_addline(buffer, "PARAM helper_const = { 2.0, -1.0, %d.0, 0.0 };\n", This->rel_offset);
+ }
+ if(need_mova_const((IWineD3DBaseShader *) This, gl_info)) {
+ shader_addline(buffer, "PARAM mova_const = { 0.5, 0.0, 2.0, 1.0 };\n");
+ shader_addline(buffer, "TEMP A0_SHADOW;\n");
+ }
+
+ shader_addline(buffer, "TEMP TA;\n");
/* Base Declarations */
- shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION, lconst_map);
+ next_local = shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION,
+ lconst_map, &priv_ctx.vs_clipplanes, &priv_ctx);
+
+ for(i = 0; i < MAX_CONST_I; i++)
+ {
+ compiled->int_consts[i] = WINED3D_CONST_NUM_UNUSED;
+ if(reg_maps->integer_constants & (1 << i) && priv_ctx.target_version >= NV2)
+ {
+ const DWORD *control_values = find_loop_control_values((IWineD3DBaseShaderImpl *) This, i);
+
+ if(control_values)
+ {
+ shader_addline(buffer, "PARAM I%u = {%u, %u, %u, -1};\n", i,
+ control_values[0], control_values[1], control_values[2]);
+ }
+ else
+ {
+ compiled->int_consts[i] = next_local;
+ compiled->num_int_consts++;
+ shader_addline(buffer, "PARAM I%u = program.local[%u];\n", i, next_local++);
+ }
+ }
+ }
/* We need a constant to fixup the final position */
- shader_addline(buffer, "PARAM posFixup = program.env[%d];\n", ARB_SHADER_PRIVCONST_POS);
+ shader_addline(buffer, "PARAM posFixup = program.local[%u];\n", next_local);
+ compiled->pos_fixup = next_local++;
/* Initialize output parameters. GL_ARB_vertex_program does not require special initialization values
* for output parameters. D3D in theory does not do that either, but some applications depend on a
@@ -2025,7 +3894,8 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShader *iface,
if(!GL_SUPPORT(NV_VERTEX_PROGRAM)) {
shader_addline(buffer, "MOV result.color.secondary, -helper_const.wwwy;\n");
- if((GLINFO_LOCATION).set_texcoord_w && !device->frag_pipe->ffp_proj_control) {
+ if ((GLINFO_LOCATION).quirks & WINED3D_QUIRK_SET_TEXCOORD_W && !device->frag_pipe->ffp_proj_control)
+ {
int i;
for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) {
if(This->baseShader.reg_maps.texcoord_mask[i] != 0 &&
@@ -2036,37 +3906,12 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShader *iface,
}
}
+ /* The shader starts with the main function */
+ priv_ctx.in_main_func = TRUE;
/* Base Shader Body */
- shader_generate_main((IWineD3DBaseShader *)This, buffer, reg_maps, function);
+ shader_generate_main((IWineD3DBaseShader *)This, buffer, reg_maps, function, &priv_ctx);
- /* The D3DRS_FOGTABLEMODE render state defines if the shader-generated fog coord is used
- * or if the fragment depth is used. If the fragment depth is used(FOGTABLEMODE != NONE),
- * the fog frag coord is thrown away. If the fog frag coord is used, but not written by
- * the shader, it is set to 0.0(fully fogged, since start = 1.0, end = 0.0)
- */
- if(args->fog_src == VS_FOG_Z) {
- shader_addline(buffer, "MOV result.fogcoord, TMP_OUT.z;\n");
- } else if (!reg_maps->fog) {
- shader_addline(buffer, "MOV result.fogcoord, helper_const.w;\n");
- }
-
- /* Write the final position.
- *
- * OpenGL coordinates specify the center of the pixel while d3d coords specify
- * the corner. The offsets are stored in z and w in posFixup. posFixup.y contains
- * 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x
- * contains 1.0 to allow a mad, but arb vs swizzles are too restricted for that.
- */
- shader_addline(buffer, "MUL TMP, posFixup, TMP_OUT.w;\n");
- shader_addline(buffer, "ADD TMP_OUT.x, TMP_OUT.x, TMP.z;\n");
- shader_addline(buffer, "MAD TMP_OUT.y, TMP_OUT.y, posFixup.y, TMP.w;\n");
-
- /* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
- * and the glsl equivalent
- */
- shader_addline(buffer, "MAD TMP_OUT.z, TMP_OUT.z, helper_const.x, -TMP_OUT.w;\n");
-
- shader_addline(buffer, "MOV result.position, TMP_OUT;\n");
+ if(!priv_ctx.footer_written) vshader_add_footer(This, buffer, args, &priv_ctx);
shader_addline(buffer, "END\n");
@@ -2080,14 +3925,23 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShader *iface,
/* Create the program and check for errors */
GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
buffer->bsize, buffer->buffer));
+ checkGLcall("glProgramStringARB()");
- if (glGetError() == GL_INVALID_OPERATION) {
- GLint errPos;
- glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
+ glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
+ if (errPos != -1)
+ {
FIXME("HW VertexShader Error at position %d: %s\n",
errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
ret = -1;
- } else {
+ }
+ else
+ {
+ GLint native;
+
+ GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
+ checkGLcall("glGetProgramivARB()");
+ if (!native) WARN("Program exceeds native resource limits.\n");
+
/* Load immediate constants */
if(lconst_map) {
LIST_FOR_EACH_ENTRY(lconst, &This->baseShader.constantsF, local_constant, entry) {
@@ -2101,7 +3955,535 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShader *iface,
return ret;
}
-static void shader_arb_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_info, struct shader_caps *pCaps)
+/* GL locking is done by the caller */
+static struct arb_ps_compiled_shader *find_arb_pshader(IWineD3DPixelShaderImpl *shader, const struct arb_ps_compile_args *args)
+{
+ UINT i;
+ DWORD new_size;
+ struct arb_ps_compiled_shader *new_array;
+ struct wined3d_shader_buffer buffer;
+ struct arb_pshader_private *shader_data;
+ GLuint ret;
+
+ if(!shader->backend_priv) {
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) shader->baseShader.device;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ struct shader_arb_priv *priv = device->shader_priv;
+
+ shader->backend_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data));
+ shader_data = shader->backend_priv;
+ shader_data->clamp_consts = shader->baseShader.reg_maps.shader_version.major == 1;
+
+ if(shader->baseShader.reg_maps.shader_version.major < 3) shader_data->input_signature_idx = ~0;
+ else shader_data->input_signature_idx = find_input_signature(priv, shader->input_signature);
+
+ shader_data->has_signature_idx = TRUE;
+ TRACE("Shader got assigned input signature index %u\n", shader_data->input_signature_idx);
+
+ if (!device->vs_clipping)
+ shader_data->clipplane_emulation = shader_find_free_input_register(&shader->baseShader.reg_maps,
+ GL_LIMITS(texture_stages) - 1);
+ else
+ shader_data->clipplane_emulation = ~0U;
+ }
+ shader_data = shader->backend_priv;
+
+ /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
+ * so a linear search is more performant than a hashmap or a binary search
+ * (cache coherency etc)
+ */
+ for(i = 0; i < shader_data->num_gl_shaders; i++) {
+ if(memcmp(&shader_data->gl_shaders[i].args, args, sizeof(*args)) == 0) {
+ return &shader_data->gl_shaders[i];
+ }
+ }
+
+ TRACE("No matching GL shader found, compiling a new shader\n");
+ if(shader_data->shader_array_size == shader_data->num_gl_shaders) {
+ if (shader_data->num_gl_shaders)
+ {
+ new_size = shader_data->shader_array_size + max(1, shader_data->shader_array_size / 2);
+ new_array = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, shader_data->gl_shaders,
+ new_size * sizeof(*shader_data->gl_shaders));
+ } else {
+ new_array = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data->gl_shaders));
+ new_size = 1;
+ }
+
+ if(!new_array) {
+ ERR("Out of memory\n");
+ return 0;
+ }
+ shader_data->gl_shaders = new_array;
+ shader_data->shader_array_size = new_size;
+ }
+
+ shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args;
+
+ pixelshader_update_samplers(&shader->baseShader.reg_maps,
+ ((IWineD3DDeviceImpl *)shader->baseShader.device)->stateBlock->textures);
+
+ if (!shader_buffer_init(&buffer))
+ {
+ ERR("Failed to initialize shader buffer.\n");
+ return 0;
+ }
+
+ ret = shader_arb_generate_pshader(shader, &buffer, args,
+ &shader_data->gl_shaders[shader_data->num_gl_shaders]);
+ shader_buffer_free(&buffer);
+ shader_data->gl_shaders[shader_data->num_gl_shaders].prgId = ret;
+
+ return &shader_data->gl_shaders[shader_data->num_gl_shaders++];
+}
+
+static inline BOOL vs_args_equal(const struct arb_vs_compile_args *stored, const struct arb_vs_compile_args *new,
+ const DWORD use_map, BOOL skip_int) {
+ if((stored->super.swizzle_map & use_map) != new->super.swizzle_map) return FALSE;
+ if(stored->super.fog_src != new->super.fog_src) return FALSE;
+ if(stored->boolclip_compare != new->boolclip_compare) return FALSE;
+ if(stored->ps_signature != new->ps_signature) return FALSE;
+ if(stored->vertex_samplers_compare != new->vertex_samplers_compare) return FALSE;
+ if(skip_int) return TRUE;
+
+ return memcmp(stored->loop_ctrl, new->loop_ctrl, sizeof(stored->loop_ctrl)) == 0;
+}
+
+static struct arb_vs_compiled_shader *find_arb_vshader(IWineD3DVertexShaderImpl *shader, const struct arb_vs_compile_args *args)
+{
+ UINT i;
+ DWORD new_size;
+ struct arb_vs_compiled_shader *new_array;
+ DWORD use_map = ((IWineD3DDeviceImpl *)shader->baseShader.device)->strided_streams.use_map;
+ struct wined3d_shader_buffer buffer;
+ struct arb_vshader_private *shader_data;
+ GLuint ret;
+ const struct wined3d_gl_info *gl_info = &((IWineD3DDeviceImpl *)shader->baseShader.device)->adapter->gl_info;
+
+ if(!shader->backend_priv) {
+ shader->backend_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data));
+ }
+ shader_data = shader->backend_priv;
+
+ /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
+ * so a linear search is more performant than a hashmap or a binary search
+ * (cache coherency etc)
+ */
+ for(i = 0; i < shader_data->num_gl_shaders; i++) {
+ if(vs_args_equal(&shader_data->gl_shaders[i].args, args, use_map, GL_SUPPORT(NV_VERTEX_PROGRAM2_OPTION))) {
+ return &shader_data->gl_shaders[i];
+ }
+ }
+
+ TRACE("No matching GL shader found, compiling a new shader\n");
+
+ if(shader_data->shader_array_size == shader_data->num_gl_shaders) {
+ if (shader_data->num_gl_shaders)
+ {
+ new_size = shader_data->shader_array_size + max(1, shader_data->shader_array_size / 2);
+ new_array = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, shader_data->gl_shaders,
+ new_size * sizeof(*shader_data->gl_shaders));
+ } else {
+ new_array = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data->gl_shaders));
+ new_size = 1;
+ }
+
+ if(!new_array) {
+ ERR("Out of memory\n");
+ return 0;
+ }
+ shader_data->gl_shaders = new_array;
+ shader_data->shader_array_size = new_size;
+ }
+
+ shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args;
+
+ if (!shader_buffer_init(&buffer))
+ {
+ ERR("Failed to initialize shader buffer.\n");
+ return 0;
+ }
+
+ ret = shader_arb_generate_vshader(shader, &buffer, args,
+ &shader_data->gl_shaders[shader_data->num_gl_shaders]);
+ shader_buffer_free(&buffer);
+ shader_data->gl_shaders[shader_data->num_gl_shaders].prgId = ret;
+
+ return &shader_data->gl_shaders[shader_data->num_gl_shaders++];
+}
+
+static inline void find_arb_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImpl *stateblock,
+ struct arb_ps_compile_args *args)
+{
+ int i;
+ WORD int_skip;
+ const struct wined3d_gl_info *gl_info = &((IWineD3DDeviceImpl *)shader->baseShader.device)->adapter->gl_info;
+ find_ps_compile_args(shader, stateblock, &args->super);
+
+ /* This forces all local boolean constants to 1 to make them stateblock independent */
+ args->bools = shader->baseShader.reg_maps.local_bool_consts;
+
+ for(i = 0; i < MAX_CONST_B; i++)
+ {
+ if(stateblock->pixelShaderConstantB[i]) args->bools |= ( 1 << i);
+ }
+
+ /* Skip if unused or local, or supported natively */
+ int_skip = ~shader->baseShader.reg_maps.integer_constants | shader->baseShader.reg_maps.local_int_consts;
+ if(int_skip == 0xffff || GL_SUPPORT(NV_FRAGMENT_PROGRAM_OPTION))
+ {
+ memset(&args->loop_ctrl, 0, sizeof(args->loop_ctrl));
+ return;
+ }
+
+ for(i = 0; i < MAX_CONST_I; i++)
+ {
+ if(int_skip & (1 << i))
+ {
+ args->loop_ctrl[i][0] = 0;
+ args->loop_ctrl[i][1] = 0;
+ args->loop_ctrl[i][2] = 0;
+ }
+ else
+ {
+ args->loop_ctrl[i][0] = stateblock->pixelShaderConstantI[i * 4];
+ args->loop_ctrl[i][1] = stateblock->pixelShaderConstantI[i * 4 + 1];
+ args->loop_ctrl[i][2] = stateblock->pixelShaderConstantI[i * 4 + 2];
+ }
+ }
+}
+
+static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IWineD3DStateBlockImpl *stateblock,
+ struct arb_vs_compile_args *args)
+{
+ int i;
+ WORD int_skip;
+ IWineD3DDeviceImpl *dev = (IWineD3DDeviceImpl *)shader->baseShader.device;
+ const struct wined3d_gl_info *gl_info = &dev->adapter->gl_info;
+ find_vs_compile_args(shader, stateblock, &args->super);
+
+ args->boolclip_compare = 0;
+ if(use_ps(stateblock))
+ {
+ IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) stateblock->pixelShader;
+ struct arb_pshader_private *shader_priv = ps->backend_priv;
+ args->ps_signature = shader_priv->input_signature_idx;
+
+ args->boolclip.clip_control[0] = shader_priv->clipplane_emulation + 1;
+ }
+ else
+ {
+ args->ps_signature = ~0;
+ if(!dev->vs_clipping)
+ {
+ args->boolclip.clip_control[0] = ffp_clip_emul(stateblock) ? GL_LIMITS(texture_stages) : 0;
+ }
+ /* Otherwise: Setting boolclip_compare set clip_control[0] to 0 */
+ }
+
+ if(args->boolclip.clip_control[0])
+ {
+ if(stateblock->renderState[WINED3DRS_CLIPPING])
+ {
+ args->boolclip.clip_control[1] = stateblock->renderState[WINED3DRS_CLIPPLANEENABLE];
+ }
+ /* clip_control[1] was set to 0 by setting boolclip_compare to 0 */
+ }
+
+ /* This forces all local boolean constants to 1 to make them stateblock independent */
+ args->boolclip.bools = shader->baseShader.reg_maps.local_bool_consts;
+ /* TODO: Figure out if it would be better to store bool constants as bitmasks in the stateblock */
+ for(i = 0; i < MAX_CONST_B; i++)
+ {
+ if(stateblock->vertexShaderConstantB[i]) args->boolclip.bools |= ( 1 << i);
+ }
+
+ args->vertex_samplers[0] = dev->texUnitMap[MAX_FRAGMENT_SAMPLERS + 0];
+ args->vertex_samplers[1] = dev->texUnitMap[MAX_FRAGMENT_SAMPLERS + 1];
+ args->vertex_samplers[2] = dev->texUnitMap[MAX_FRAGMENT_SAMPLERS + 2];
+ args->vertex_samplers[3] = 0;
+
+ /* Skip if unused or local */
+ int_skip = ~shader->baseShader.reg_maps.integer_constants | shader->baseShader.reg_maps.local_int_consts;
+ if(int_skip == 0xffff || GL_SUPPORT(NV_VERTEX_PROGRAM2_OPTION)) /* This is about flow control, not clipping */
+ {
+ memset(&args->loop_ctrl, 0, sizeof(args->loop_ctrl));
+ return;
+ }
+
+ for(i = 0; i < MAX_CONST_I; i++)
+ {
+ if(int_skip & (1 << i))
+ {
+ args->loop_ctrl[i][0] = 0;
+ args->loop_ctrl[i][1] = 0;
+ args->loop_ctrl[i][2] = 0;
+ }
+ else
+ {
+ args->loop_ctrl[i][0] = stateblock->vertexShaderConstantI[i * 4];
+ args->loop_ctrl[i][1] = stateblock->vertexShaderConstantI[i * 4 + 1];
+ args->loop_ctrl[i][2] = stateblock->vertexShaderConstantI[i * 4 + 2];
+ }
+ }
+}
+
+/* GL locking is done by the caller */
+static void shader_arb_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS)
+{
+ IWineD3DDeviceImpl *This = ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice;
+ struct shader_arb_priv *priv = This->shader_priv;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ int i;
+
+ /* Deal with pixel shaders first so the vertex shader arg function has the input signature ready */
+ if (usePS) {
+ struct arb_ps_compile_args compile_args;
+ struct arb_ps_compiled_shader *compiled;
+ IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) This->stateBlock->pixelShader;
+
+ TRACE("Using pixel shader %p\n", This->stateBlock->pixelShader);
+ find_arb_ps_compile_args(ps, This->stateBlock, &compile_args);
+ compiled = find_arb_pshader(ps, &compile_args);
+ priv->current_fprogram_id = compiled->prgId;
+ priv->compiled_fprog = compiled;
+
+ /* Bind the fragment program */
+ GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->current_fprogram_id));
+ checkGLcall("glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->current_fprogram_id);");
+
+ if(!priv->use_arbfp_fixed_func) {
+ /* Enable OpenGL fragment programs */
+ glEnable(GL_FRAGMENT_PROGRAM_ARB);
+ checkGLcall("glEnable(GL_FRAGMENT_PROGRAM_ARB);");
+ }
+ TRACE("(%p) : Bound fragment program %u and enabled GL_FRAGMENT_PROGRAM_ARB\n", This, priv->current_fprogram_id);
+
+ /* Pixel Shader 1.x constants are clamped to [-1;1], Pixel Shader 2.0 constants are not. If switching between
+ * a 1.x and newer shader, reload the first 8 constants
+ */
+ if(priv->last_ps_const_clamped != ((struct arb_pshader_private *) ps->backend_priv)->clamp_consts)
+ {
+ priv->last_ps_const_clamped = ((struct arb_pshader_private *) ps->backend_priv)->clamp_consts;
+ This->highest_dirty_ps_const = max(This->highest_dirty_ps_const, 8);
+ for(i = 0; i < 8; i++)
+ {
+ context->pshader_const_dirty[i] = 1;
+ }
+ /* Also takes care of loading local constants */
+ shader_arb_load_constants(context, TRUE, FALSE);
+ }
+ else
+ {
+ shader_arb_ps_local_constants(This);
+ }
+
+ /* Force constant reloading for the NP2 fixup (see comment in shader_glsl_select for more info) */
+ if (compiled->np2fixup_info.super.active)
+ shader_arb_load_np2fixup_constants((IWineD3DDevice *)This, usePS, useVS);
+ } else if(GL_SUPPORT(ARB_FRAGMENT_PROGRAM) && !priv->use_arbfp_fixed_func) {
+ /* Disable only if we're not using arbfp fixed function fragment processing. If this is used,
+ * keep GL_FRAGMENT_PROGRAM_ARB enabled, and the fixed function pipeline will bind the fixed function
+ * replacement shader
+ */
+ glDisable(GL_FRAGMENT_PROGRAM_ARB);
+ checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
+ priv->current_fprogram_id = 0;
+ }
+
+ if (useVS) {
+ struct arb_vs_compile_args compile_args;
+ struct arb_vs_compiled_shader *compiled;
+ IWineD3DVertexShaderImpl *vs = (IWineD3DVertexShaderImpl *) This->stateBlock->vertexShader;
+
+ TRACE("Using vertex shader %p\n", This->stateBlock->vertexShader);
+ find_arb_vs_compile_args(vs, This->stateBlock, &compile_args);
+ compiled = find_arb_vshader(vs, &compile_args);
+ priv->current_vprogram_id = compiled->prgId;
+ priv->compiled_vprog = compiled;
+
+ /* Bind the vertex program */
+ GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id));
+ checkGLcall("glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id);");
+
+ /* Enable OpenGL vertex programs */
+ glEnable(GL_VERTEX_PROGRAM_ARB);
+ checkGLcall("glEnable(GL_VERTEX_PROGRAM_ARB);");
+ TRACE("(%p) : Bound vertex program %u and enabled GL_VERTEX_PROGRAM_ARB\n", This, priv->current_vprogram_id);
+ shader_arb_vs_local_constants(This);
+
+ if(priv->last_vs_color_unclamp != compiled->need_color_unclamp) {
+ priv->last_vs_color_unclamp = compiled->need_color_unclamp;
+
+ if (GL_SUPPORT(ARB_COLOR_BUFFER_FLOAT)) {
+ GL_EXTCALL(glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, !compiled->need_color_unclamp));
+ checkGLcall("glClampColorARB");
+ } else {
+ FIXME("vertex color clamp needs to be changed, but extension not supported.\n");
+ }
+ }
+ } else if(GL_SUPPORT(ARB_VERTEX_PROGRAM)) {
+ priv->current_vprogram_id = 0;
+ glDisable(GL_VERTEX_PROGRAM_ARB);
+ checkGLcall("glDisable(GL_VERTEX_PROGRAM_ARB)");
+ }
+}
+
+/* GL locking is done by the caller */
+static void shader_arb_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ struct shader_arb_priv *priv = This->shader_priv;
+ GLuint *blt_fprogram = &priv->depth_blt_fprogram_id[tex_type];
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+
+ if (!priv->depth_blt_vprogram_id) priv->depth_blt_vprogram_id = create_arb_blt_vertex_program(gl_info);
+ GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->depth_blt_vprogram_id));
+ glEnable(GL_VERTEX_PROGRAM_ARB);
+
+ if (!*blt_fprogram) *blt_fprogram = create_arb_blt_fragment_program(gl_info, tex_type);
+ GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, *blt_fprogram));
+ glEnable(GL_FRAGMENT_PROGRAM_ARB);
+}
+
+/* GL locking is done by the caller */
+static void shader_arb_deselect_depth_blt(IWineD3DDevice *iface) {
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ struct shader_arb_priv *priv = This->shader_priv;
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+
+ if (priv->current_vprogram_id) {
+ GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id));
+ checkGLcall("glBindProgramARB(GL_VERTEX_PROGRAM_ARB, vertexShader->prgId);");
+
+ TRACE("(%p) : Bound vertex program %u and enabled GL_VERTEX_PROGRAM_ARB\n", This, priv->current_vprogram_id);
+ } else {
+ glDisable(GL_VERTEX_PROGRAM_ARB);
+ checkGLcall("glDisable(GL_VERTEX_PROGRAM_ARB)");
+ }
+
+ if (priv->current_fprogram_id) {
+ GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->current_fprogram_id));
+ checkGLcall("glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, pixelShader->prgId);");
+
+ TRACE("(%p) : Bound fragment program %u and enabled GL_FRAGMENT_PROGRAM_ARB\n", This, priv->current_fprogram_id);
+ } else if(!priv->use_arbfp_fixed_func) {
+ glDisable(GL_FRAGMENT_PROGRAM_ARB);
+ checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
+ }
+}
+
+static void shader_arb_destroy(IWineD3DBaseShader *iface) {
+ IWineD3DBaseShaderImpl *baseShader = (IWineD3DBaseShaderImpl *) iface;
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)baseShader->baseShader.device;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+
+ if (shader_is_pshader_version(baseShader->baseShader.reg_maps.shader_version.type))
+ {
+ IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *) iface;
+ struct arb_pshader_private *shader_data = This->backend_priv;
+ UINT i;
+
+ if(!shader_data) return; /* This can happen if a shader was never compiled */
+ ENTER_GL();
+
+ if(shader_data->num_gl_shaders) ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
+
+ for(i = 0; i < shader_data->num_gl_shaders; i++) {
+ GL_EXTCALL(glDeleteProgramsARB(1, &shader_data->gl_shaders[i].prgId));
+ checkGLcall("GL_EXTCALL(glDeleteProgramsARB(1, &shader_data->gl_shaders[i].prgId))");
+ }
+ LEAVE_GL();
+ HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
+ HeapFree(GetProcessHeap(), 0, shader_data);
+ This->backend_priv = NULL;
+ } else {
+ IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *) iface;
+ struct arb_vshader_private *shader_data = This->backend_priv;
+ UINT i;
+
+ if(!shader_data) return; /* This can happen if a shader was never compiled */
+ ENTER_GL();
+
+ if(shader_data->num_gl_shaders) ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
+
+ for(i = 0; i < shader_data->num_gl_shaders; i++) {
+ GL_EXTCALL(glDeleteProgramsARB(1, &shader_data->gl_shaders[i].prgId));
+ checkGLcall("GL_EXTCALL(glDeleteProgramsARB(1, &shader_data->gl_shaders[i].prgId))");
+ }
+ LEAVE_GL();
+ HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
+ HeapFree(GetProcessHeap(), 0, shader_data);
+ This->backend_priv = NULL;
+ }
+}
+
+static int sig_tree_compare(const void *key, const struct wine_rb_entry *entry)
+{
+ struct ps_signature *e = WINE_RB_ENTRY_VALUE(entry, struct ps_signature, entry);
+ return compare_sig(key, e->sig);
+}
+
+struct wine_rb_functions sig_tree_functions =
+{
+ wined3d_rb_alloc,
+ wined3d_rb_realloc,
+ wined3d_rb_free,
+ sig_tree_compare
+};
+
+static HRESULT shader_arb_alloc(IWineD3DDevice *iface) {
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ struct shader_arb_priv *priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*priv));
+ if(wine_rb_init(&priv->signature_tree, &sig_tree_functions) == -1)
+ {
+ ERR("RB tree init failed\n");
+ HeapFree(GetProcessHeap(), 0, priv);
+ return E_OUTOFMEMORY;
+ }
+ This->shader_priv = priv;
+ return WINED3D_OK;
+}
+
+static void release_signature(struct wine_rb_entry *entry, void *context)
+{
+ struct ps_signature *sig = WINE_RB_ENTRY_VALUE(entry, struct ps_signature, entry);
+ int i;
+ for(i = 0; i < MAX_REG_INPUT; i++)
+ {
+ HeapFree(GetProcessHeap(), 0, (char *) sig->sig[i].semantic_name);
+ }
+ HeapFree(GetProcessHeap(), 0, sig->sig);
+ HeapFree(GetProcessHeap(), 0, sig);
+}
+
+/* Context activation is done by the caller. */
+static void shader_arb_free(IWineD3DDevice *iface) {
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+ struct shader_arb_priv *priv = This->shader_priv;
+ int i;
+
+ ENTER_GL();
+ if(priv->depth_blt_vprogram_id) {
+ GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_vprogram_id));
+ }
+ for (i = 0; i < tex_type_count; ++i) {
+ if (priv->depth_blt_fprogram_id[i]) {
+ GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_fprogram_id[i]));
+ }
+ }
+ LEAVE_GL();
+
+ wine_rb_destroy(&priv->signature_tree, release_signature, NULL);
+ HeapFree(GetProcessHeap(), 0, This->shader_priv);
+}
+
+static BOOL shader_arb_dirty_const(IWineD3DDevice *iface) {
+ return TRUE;
+}
+
+static void shader_arb_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info,
+ struct shader_caps *pCaps)
{
/* We don't have an ARB fixed function pipeline yet, so let the none backend set its caps,
* then overwrite the shader specific ones
@@ -2109,17 +4491,47 @@ static void shader_arb_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *g
none_shader_backend.shader_get_caps(devtype, gl_info, pCaps);
if(GL_SUPPORT(ARB_VERTEX_PROGRAM)) {
- pCaps->VertexShaderVersion = WINED3DVS_VERSION(1,1);
- TRACE_(d3d_caps)("Hardware vertex shader version 1.1 enabled (ARB_PROGRAM)\n");
- pCaps->MaxVertexShaderConst = GL_LIMITS(vshader_constantsF) - ARB_SHADER_RESERVED_VS_CONSTS;
+ if(GL_SUPPORT(NV_VERTEX_PROGRAM3))
+ {
+ pCaps->VertexShaderVersion = WINED3DVS_VERSION(3,0);
+ TRACE_(d3d_caps)("Hardware vertex shader version 3.0 enabled (NV_VERTEX_PROGRAM3)\n");
+ }
+ else if(GL_LIMITS(vshader_constantsF) >= 256)
+ {
+ /* Shader Model 2.0 requires at least 256 vertex shader constants */
+ pCaps->VertexShaderVersion = WINED3DVS_VERSION(2,0);
+ TRACE_(d3d_caps)("Hardware vertex shader version 2.0 enabled (ARB_PROGRAM)\n");
+ }
+ else
+ {
+ pCaps->VertexShaderVersion = WINED3DVS_VERSION(1,1);
+ TRACE_(d3d_caps)("Hardware vertex shader version 1.1 enabled (ARB_PROGRAM)\n");
+ }
+ pCaps->MaxVertexShaderConst = GL_LIMITS(vshader_constantsF);
}
if(GL_SUPPORT(ARB_FRAGMENT_PROGRAM)) {
- pCaps->PixelShaderVersion = WINED3DPS_VERSION(1,4);
- pCaps->PixelShader1xMaxValue = 8.0;
- TRACE_(d3d_caps)("Hardware pixel shader version 1.4 enabled (ARB_PROGRAM)\n");
- pCaps->MaxPixelShaderConst = GL_LIMITS(pshader_constantsF) - ARB_SHADER_RESERVED_PS_CONSTS;
+ if(GL_SUPPORT(NV_FRAGMENT_PROGRAM2))
+ {
+ pCaps->PixelShaderVersion = WINED3DPS_VERSION(3,0);
+ TRACE_(d3d_caps)("Hardware pixel shader version 3.0 enabled (NV_FRAGMENT_PROGRAM2)\n");
+ }
+ else if(GL_LIMITS(pshader_constantsF) >= 32)
+ {
+ /* Shader Model 2.0 requires at least 32 pixel shader constants */
+ pCaps->PixelShaderVersion = WINED3DPS_VERSION(2,0);
+ TRACE_(d3d_caps)("Hardware pixel shader version 2.0 enabled (ARB_PROGRAM)\n");
+ }
+ else
+ {
+ pCaps->PixelShaderVersion = WINED3DPS_VERSION(1,4);
+ TRACE_(d3d_caps)("Hardware pixel shader version 1.4 enabled (ARB_PROGRAM)\n");
+ }
+ pCaps->PixelShader1xMaxValue = 8.0f;
+ pCaps->MaxPixelShaderConst = GL_LIMITS(pshader_constantsF);
}
+
+ pCaps->VSClipping = use_nv_clip(gl_info);
}
static BOOL shader_arb_color_fixup_supported(struct color_fixup_desc fixup)
@@ -2142,10 +4554,9 @@ static BOOL shader_arb_color_fixup_supported(struct color_fixup_desc fixup)
}
static void shader_arb_add_instruction_modifiers(const struct wined3d_shader_instruction *ins) {
- BOOL saturate;
DWORD shift;
char write_mask[20], regstr[50];
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
BOOL is_color = FALSE;
const struct wined3d_shader_dst_param *dst;
@@ -2154,14 +4565,15 @@ static void shader_arb_add_instruction_modifiers(const struct wined3d_shader_ins
dst = &ins->dst[0];
shift = dst->shift;
if(shift == 0) return; /* Saturate alone is handled by the instructions */
- saturate = dst->modifiers & WINED3DSPDM_SATURATE;
shader_arb_get_write_mask(ins, dst, write_mask);
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, regstr, &is_color);
+ shader_arb_get_register_name(ins, &dst->reg, regstr, &is_color);
- /* Generate a line that does the output modifier computation */
- shader_addline(buffer, "MUL%s %s%s, %s, %s;\n", saturate ? "_SAT" : "",
+ /* Generate a line that does the output modifier computation
+ * FIXME: _SAT vs shift? _SAT alone is already handled in the instructions, if this
+ * maps problems in e.g. _d4_sat modify shader_arb_get_modifier
+ */
+ shader_addline(buffer, "MUL%s %s%s, %s, %s;\n", shader_arb_get_modifier(ins),
regstr, write_mask, regstr, shift_tab[shift]);
}
@@ -2170,10 +4582,10 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
/* WINED3DSIH_ABS */ shader_hw_map2gl,
/* WINED3DSIH_ADD */ shader_hw_map2gl,
/* WINED3DSIH_BEM */ pshader_hw_bem,
- /* WINED3DSIH_BREAK */ NULL,
- /* WINED3DSIH_BREAKC */ NULL,
+ /* WINED3DSIH_BREAK */ shader_hw_break,
+ /* WINED3DSIH_BREAKC */ shader_hw_breakc,
/* WINED3DSIH_BREAKP */ NULL,
- /* WINED3DSIH_CALL */ NULL,
+ /* WINED3DSIH_CALL */ shader_hw_call,
/* WINED3DSIH_CALLNZ */ NULL,
/* WINED3DSIH_CMP */ pshader_hw_cmp,
/* WINED3DSIH_CND */ pshader_hw_cnd,
@@ -2186,23 +4598,23 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
/* WINED3DSIH_DP3 */ shader_hw_map2gl,
/* WINED3DSIH_DP4 */ shader_hw_map2gl,
/* WINED3DSIH_DST */ shader_hw_map2gl,
- /* WINED3DSIH_DSX */ NULL,
- /* WINED3DSIH_DSY */ NULL,
- /* WINED3DSIH_ELSE */ NULL,
- /* WINED3DSIH_ENDIF */ NULL,
- /* WINED3DSIH_ENDLOOP */ NULL,
- /* WINED3DSIH_ENDREP */ NULL,
- /* WINED3DSIH_EXP */ shader_hw_map2gl,
- /* WINED3DSIH_EXPP */ shader_hw_map2gl,
+ /* WINED3DSIH_DSX */ shader_hw_map2gl,
+ /* WINED3DSIH_DSY */ shader_hw_dsy,
+ /* WINED3DSIH_ELSE */ shader_hw_else,
+ /* WINED3DSIH_ENDIF */ shader_hw_endif,
+ /* WINED3DSIH_ENDLOOP */ shader_hw_endloop,
+ /* WINED3DSIH_ENDREP */ shader_hw_endrep,
+ /* WINED3DSIH_EXP */ shader_hw_scalar_op,
+ /* WINED3DSIH_EXPP */ shader_hw_scalar_op,
/* WINED3DSIH_FRC */ shader_hw_map2gl,
- /* WINED3DSIH_IF */ NULL,
- /* WINED3DSIH_IFC */ NULL,
- /* WINED3DSIH_LABEL */ NULL,
+ /* WINED3DSIH_IF */ NULL /* Hardcoded into the shader */,
+ /* WINED3DSIH_IFC */ shader_hw_ifc,
+ /* WINED3DSIH_LABEL */ shader_hw_label,
/* WINED3DSIH_LIT */ shader_hw_map2gl,
- /* WINED3DSIH_LOG */ shader_hw_map2gl,
- /* WINED3DSIH_LOGP */ shader_hw_map2gl,
- /* WINED3DSIH_LOOP */ NULL,
- /* WINED3DSIH_LRP */ shader_hw_map2gl,
+ /* WINED3DSIH_LOG */ shader_hw_log_pow,
+ /* WINED3DSIH_LOGP */ shader_hw_log_pow,
+ /* WINED3DSIH_LOOP */ shader_hw_loop,
+ /* WINED3DSIH_LRP */ shader_hw_lrp,
/* WINED3DSIH_M3x2 */ shader_hw_mnxn,
/* WINED3DSIH_M3x3 */ shader_hw_mnxn,
/* WINED3DSIH_M3x4 */ shader_hw_mnxn,
@@ -2217,14 +4629,14 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
/* WINED3DSIH_NOP */ shader_hw_nop,
/* WINED3DSIH_NRM */ shader_hw_nrm,
/* WINED3DSIH_PHASE */ NULL,
- /* WINED3DSIH_POW */ shader_hw_map2gl,
- /* WINED3DSIH_RCP */ shader_hw_rsq_rcp,
- /* WINED3DSIH_REP */ NULL,
- /* WINED3DSIH_RET */ NULL,
- /* WINED3DSIH_RSQ */ shader_hw_rsq_rcp,
+ /* WINED3DSIH_POW */ shader_hw_log_pow,
+ /* WINED3DSIH_RCP */ shader_hw_scalar_op,
+ /* WINED3DSIH_REP */ shader_hw_rep,
+ /* WINED3DSIH_RET */ shader_hw_ret,
+ /* WINED3DSIH_RSQ */ shader_hw_scalar_op,
/* WINED3DSIH_SETP */ NULL,
/* WINED3DSIH_SGE */ shader_hw_map2gl,
- /* WINED3DSIH_SGN */ NULL,
+ /* WINED3DSIH_SGN */ shader_hw_sgn,
/* WINED3DSIH_SINCOS */ shader_hw_sincos,
/* WINED3DSIH_SLT */ shader_hw_map2gl,
/* WINED3DSIH_SUB */ shader_hw_map2gl,
@@ -2236,8 +4648,8 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
/* WINED3DSIH_TEXDP3 */ pshader_hw_texdp3,
/* WINED3DSIH_TEXDP3TEX */ pshader_hw_texdp3tex,
/* WINED3DSIH_TEXKILL */ pshader_hw_texkill,
- /* WINED3DSIH_TEXLDD */ NULL,
- /* WINED3DSIH_TEXLDL */ NULL,
+ /* WINED3DSIH_TEXLDD */ shader_hw_texldd,
+ /* WINED3DSIH_TEXLDL */ shader_hw_texldl,
/* WINED3DSIH_TEXM3x2DEPTH */ pshader_hw_texm3x2depth,
/* WINED3DSIH_TEXM3x2PAD */ pshader_hw_texm3x2pad,
/* WINED3DSIH_TEXM3x2TEX */ pshader_hw_texm3x2tex,
@@ -2252,8 +4664,391 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
/* WINED3DSIH_TEXREG2RGB */ pshader_hw_texreg2rgb,
};
+static inline BOOL get_bool_const(const struct wined3d_shader_instruction *ins, IWineD3DBaseShaderImpl *This, DWORD idx)
+{
+ BOOL vshader = shader_is_vshader_version(This->baseShader.reg_maps.shader_version.type);
+ WORD bools = 0;
+ WORD flag = (1 << idx);
+ const local_constant *constant;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+
+ if(This->baseShader.reg_maps.local_bool_consts & flag)
+ {
+ /* What good is a if(bool) with a hardcoded local constant? I don't know, but handle it */
+ LIST_FOR_EACH_ENTRY(constant, &This->baseShader.constantsB, local_constant, entry)
+ {
+ if (constant->idx == idx)
+ {
+ return constant->value[0];
+ }
+ }
+ ERR("Local constant not found\n");
+ return FALSE;
+ }
+ else
+ {
+ if(vshader) bools = priv->cur_vs_args->boolclip.bools;
+ else bools = priv->cur_ps_args->bools;
+ return bools & flag;
+ }
+}
+
+static void get_loop_control_const(const struct wined3d_shader_instruction *ins,
+ IWineD3DBaseShaderImpl *This, UINT idx, struct wined3d_shader_loop_control *loop_control)
+{
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+
+ /* Integer constants can either be a local constant, or they can be stored in the shader
+ * type specific compile args. */
+ if (This->baseShader.reg_maps.local_int_consts & (1 << idx))
+ {
+ const local_constant *constant;
+
+ LIST_FOR_EACH_ENTRY(constant, &This->baseShader.constantsI, local_constant, entry)
+ {
+ if (constant->idx == idx)
+ {
+ loop_control->count = constant->value[0];
+ loop_control->start = constant->value[1];
+ /* Step is signed. */
+ loop_control->step = (int)constant->value[2];
+ return;
+ }
+ }
+ /* If this happens the flag was set incorrectly */
+ ERR("Local constant not found\n");
+ loop_control->count = 0;
+ loop_control->start = 0;
+ loop_control->step = 0;
+ return;
+ }
+
+ switch (This->baseShader.reg_maps.shader_version.type)
+ {
+ case WINED3D_SHADER_TYPE_VERTEX:
+ /* Count and aL start value are unsigned */
+ loop_control->count = priv->cur_vs_args->loop_ctrl[idx][0];
+ loop_control->start = priv->cur_vs_args->loop_ctrl[idx][1];
+ /* Step is signed. */
+ loop_control->step = ((char)priv->cur_vs_args->loop_ctrl[idx][2]);
+ break;
+
+ case WINED3D_SHADER_TYPE_PIXEL:
+ loop_control->count = priv->cur_ps_args->loop_ctrl[idx][0];
+ loop_control->start = priv->cur_ps_args->loop_ctrl[idx][1];
+ loop_control->step = ((char)priv->cur_ps_args->loop_ctrl[idx][2]);
+ break;
+
+ default:
+ FIXME("Unhandled shader type %#x.\n", This->baseShader.reg_maps.shader_version.type);
+ break;
+ }
+}
+
+static void record_instruction(struct list *list, const struct wined3d_shader_instruction *ins)
+{
+ unsigned int i;
+ struct wined3d_shader_dst_param *dst_param = NULL;
+ struct wined3d_shader_src_param *src_param = NULL, *rel_addr = NULL;
+ struct recorded_instruction *rec = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*rec));
+ if(!rec)
+ {
+ ERR("Out of memory\n");
+ return;
+ }
+
+ rec->ins = *ins;
+ dst_param = HeapAlloc(GetProcessHeap(), 0, sizeof(*dst_param));
+ if(!dst_param) goto free;
+ *dst_param = *ins->dst;
+ if(ins->dst->reg.rel_addr)
+ {
+ rel_addr = HeapAlloc(GetProcessHeap(), 0, sizeof(*dst_param->reg.rel_addr));
+ if(!rel_addr) goto free;
+ *rel_addr = *ins->dst->reg.rel_addr;
+ dst_param->reg.rel_addr = rel_addr;
+ }
+ rec->ins.dst = dst_param;
+
+ src_param = HeapAlloc(GetProcessHeap(), 0, sizeof(*src_param) * ins->src_count);
+ if(!src_param) goto free;
+ for(i = 0; i < ins->src_count; i++)
+ {
+ src_param[i] = ins->src[i];
+ if(ins->src[i].reg.rel_addr)
+ {
+ rel_addr = HeapAlloc(GetProcessHeap(), 0, sizeof(*rel_addr));
+ if(!rel_addr) goto free;
+ *rel_addr = *ins->src[i].reg.rel_addr;
+ src_param[i].reg.rel_addr = rel_addr;
+ }
+ }
+ rec->ins.src = src_param;
+ list_add_tail(list, &rec->entry);
+ return;
+
+free:
+ ERR("Out of memory\n");
+ if(dst_param)
+ {
+ HeapFree(GetProcessHeap(), 0, (void *) dst_param->reg.rel_addr);
+ HeapFree(GetProcessHeap(), 0, dst_param);
+ }
+ if(src_param)
+ {
+ for(i = 0; i < ins->src_count; i++)
+ {
+ HeapFree(GetProcessHeap(), 0, (void *) src_param[i].reg.rel_addr);
+ }
+ HeapFree(GetProcessHeap(), 0, src_param);
+ }
+ HeapFree(GetProcessHeap(), 0, rec);
+}
+
+static void free_recorded_instruction(struct list *list)
+{
+ struct recorded_instruction *rec_ins, *entry2;
+ unsigned int i;
+
+ LIST_FOR_EACH_ENTRY_SAFE(rec_ins, entry2, list, struct recorded_instruction, entry)
+ {
+ list_remove(&rec_ins->entry);
+ if(rec_ins->ins.dst)
+ {
+ HeapFree(GetProcessHeap(), 0, (void *) rec_ins->ins.dst->reg.rel_addr);
+ HeapFree(GetProcessHeap(), 0, (void *) rec_ins->ins.dst);
+ }
+ if(rec_ins->ins.src)
+ {
+ for(i = 0; i < rec_ins->ins.src_count; i++)
+ {
+ HeapFree(GetProcessHeap(), 0, (void *) rec_ins->ins.src[i].reg.rel_addr);
+ }
+ HeapFree(GetProcessHeap(), 0, (void *) rec_ins->ins.src);
+ }
+ HeapFree(GetProcessHeap(), 0, rec_ins);
+ }
+}
+
+static void shader_arb_handle_instruction(const struct wined3d_shader_instruction *ins) {
+ SHADER_HANDLER hw_fct;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+ struct control_frame *control_frame;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ BOOL bool_const;
+
+ if(ins->handler_idx == WINED3DSIH_LOOP || ins->handler_idx == WINED3DSIH_REP)
+ {
+ control_frame = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*control_frame));
+ list_add_head(&priv->control_frames, &control_frame->entry);
+
+ if(ins->handler_idx == WINED3DSIH_LOOP) control_frame->type = LOOP;
+ if(ins->handler_idx == WINED3DSIH_REP) control_frame->type = REP;
+
+ if(priv->target_version >= NV2)
+ {
+ control_frame->loop_no = priv->num_loops++;
+ priv->loop_depth++;
+ }
+ else
+ {
+ /* Don't bother recording when we're in a not used if branch */
+ if(priv->muted)
+ {
+ return;
+ }
+
+ if(!priv->recording)
+ {
+ list_init(&priv->record);
+ priv->recording = TRUE;
+ control_frame->outer_loop = TRUE;
+ get_loop_control_const(ins, This, ins->src[0].reg.idx, &control_frame->loop_control);
+ return; /* Instruction is handled */
+ }
+ /* Record this loop in the outer loop's recording */
+ }
+ }
+ else if(ins->handler_idx == WINED3DSIH_ENDLOOP || ins->handler_idx == WINED3DSIH_ENDREP)
+ {
+ if(priv->target_version >= NV2)
+ {
+ /* Nothing to do. The control frame is popped after the HW instr handler */
+ }
+ else
+ {
+ struct list *e = list_head(&priv->control_frames);
+ control_frame = LIST_ENTRY(e, struct control_frame, entry);
+ list_remove(&control_frame->entry);
+
+ if(control_frame->outer_loop)
+ {
+ int iteration, aL = 0;
+ struct list copy;
+
+ /* Turn off recording before playback */
+ priv->recording = FALSE;
+
+ /* Move the recorded instructions to a separate list and get them out of the private data
+ * structure. If there are nested loops, the shader_arb_handle_instruction below will
+ * be recorded again, thus priv->record might be overwritten
+ */
+ list_init(©);
+ list_move_tail(©, &priv->record);
+ list_init(&priv->record);
+
+ if(ins->handler_idx == WINED3DSIH_ENDLOOP)
+ {
+ shader_addline(buffer, "#unrolling loop: %u iterations, aL=%u, inc %d\n",
+ control_frame->loop_control.count, control_frame->loop_control.start,
+ control_frame->loop_control.step);
+ aL = control_frame->loop_control.start;
+ }
+ else
+ {
+ shader_addline(buffer, "#unrolling rep: %u iterations\n", control_frame->loop_control.count);
+ }
+
+ for (iteration = 0; iteration < control_frame->loop_control.count; ++iteration)
+ {
+ struct recorded_instruction *rec_ins;
+ if(ins->handler_idx == WINED3DSIH_ENDLOOP)
+ {
+ priv->aL = aL;
+ shader_addline(buffer, "#Iteration %d, aL=%d\n", iteration, aL);
+ }
+ else
+ {
+ shader_addline(buffer, "#Iteration %d\n", iteration);
+ }
+
+ LIST_FOR_EACH_ENTRY(rec_ins, ©, struct recorded_instruction, entry)
+ {
+ shader_arb_handle_instruction(&rec_ins->ins);
+ }
+
+ if(ins->handler_idx == WINED3DSIH_ENDLOOP)
+ {
+ aL += control_frame->loop_control.step;
+ }
+ }
+ shader_addline(buffer, "#end loop/rep\n");
+
+ free_recorded_instruction(©);
+ HeapFree(GetProcessHeap(), 0, control_frame);
+ return; /* Instruction is handled */
+ }
+ else
+ {
+ /* This is a nested loop. Proceed to the normal recording function */
+ HeapFree(GetProcessHeap(), 0, control_frame);
+ }
+ }
+ }
+
+ if(priv->recording)
+ {
+ record_instruction(&priv->record, ins);
+ return;
+ }
+
+ /* boolean if */
+ if(ins->handler_idx == WINED3DSIH_IF)
+ {
+ control_frame = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*control_frame));
+ list_add_head(&priv->control_frames, &control_frame->entry);
+ control_frame->type = IF;
+
+ bool_const = get_bool_const(ins, This, ins->src[0].reg.idx);
+ if(ins->src[0].modifiers == WINED3DSPSM_NOT) bool_const = !bool_const;
+ if(!priv->muted && bool_const == FALSE)
+ {
+ shader_addline(buffer, "#if(FALSE){\n");
+ priv->muted = TRUE;
+ control_frame->muting = TRUE;
+ }
+ else shader_addline(buffer, "#if(TRUE) {\n");
+
+ return; /* Instruction is handled */
+ }
+ else if(ins->handler_idx == WINED3DSIH_IFC)
+ {
+ /* IF(bool) and if_cond(a, b) use the same ELSE and ENDIF tokens */
+ control_frame = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*control_frame));
+ control_frame->type = IFC;
+ control_frame->ifc_no = priv->num_ifcs++;
+ list_add_head(&priv->control_frames, &control_frame->entry);
+ }
+ else if(ins->handler_idx == WINED3DSIH_ELSE)
+ {
+ struct list *e = list_head(&priv->control_frames);
+ control_frame = LIST_ENTRY(e, struct control_frame, entry);
+
+ if(control_frame->type == IF)
+ {
+ shader_addline(buffer, "#} else {\n");
+ if(!priv->muted && !control_frame->muting)
+ {
+ priv->muted = TRUE;
+ control_frame->muting = TRUE;
+ }
+ else if(control_frame->muting) priv->muted = FALSE;
+ return; /* Instruction is handled. */
+ }
+ /* In case of an ifc, generate a HW shader instruction */
+ }
+ else if(ins->handler_idx == WINED3DSIH_ENDIF)
+ {
+ struct list *e = list_head(&priv->control_frames);
+ control_frame = LIST_ENTRY(e, struct control_frame, entry);
+
+ if(control_frame->type == IF)
+ {
+ shader_addline(buffer, "#} endif\n");
+ if(control_frame->muting) priv->muted = FALSE;
+ list_remove(&control_frame->entry);
+ HeapFree(GetProcessHeap(), 0, control_frame);
+ return; /* Instruction is handled */
+ }
+ }
+
+ if(priv->muted) return;
+
+ /* Select handler */
+ hw_fct = shader_arb_instruction_handler_table[ins->handler_idx];
+
+ /* Unhandled opcode */
+ if (!hw_fct)
+ {
+ FIXME("Backend can't handle opcode %#x\n", ins->handler_idx);
+ return;
+ }
+ hw_fct(ins);
+
+ if(ins->handler_idx == WINED3DSIH_ENDLOOP || ins->handler_idx == WINED3DSIH_ENDREP)
+ {
+ struct list *e = list_head(&priv->control_frames);
+ control_frame = LIST_ENTRY(e, struct control_frame, entry);
+ list_remove(&control_frame->entry);
+ HeapFree(GetProcessHeap(), 0, control_frame);
+ priv->loop_depth--;
+ }
+ else if(ins->handler_idx == WINED3DSIH_ENDIF)
+ {
+ /* Non-ifc ENDIFs don't reach that place because of the return in the if block above */
+ struct list *e = list_head(&priv->control_frames);
+ control_frame = LIST_ENTRY(e, struct control_frame, entry);
+ list_remove(&control_frame->entry);
+ HeapFree(GetProcessHeap(), 0, control_frame);
+ }
+
+
+ shader_arb_add_instruction_modifiers(ins);
+}
+
const shader_backend_t arb_program_shader_backend = {
- shader_arb_instruction_handler_table,
+ shader_arb_handle_instruction,
shader_arb_select,
shader_arb_select_depth_blt,
shader_arb_deselect_depth_blt,
@@ -2265,11 +5060,8 @@ const shader_backend_t arb_program_shader_backend = {
shader_arb_alloc,
shader_arb_free,
shader_arb_dirty_const,
- shader_arb_generate_pshader,
- shader_arb_generate_vshader,
shader_arb_get_caps,
shader_arb_color_fixup_supported,
- shader_arb_add_instruction_modifiers,
};
/* ARB_fragment_program fixed function pipeline replacement definitions */
@@ -2286,7 +5078,9 @@ struct arbfp_ffp_desc
unsigned int num_textures_used;
};
+/* Context activation is done by the caller. */
static void arbfp_enable(IWineD3DDevice *iface, BOOL enable) {
+ ENTER_GL();
if(enable) {
glEnable(GL_FRAGMENT_PROGRAM_ARB);
checkGLcall("glEnable(GL_FRAGMENT_PROGRAM_ARB)");
@@ -2294,6 +5088,7 @@ static void arbfp_enable(IWineD3DDevice *iface, BOOL enable) {
glDisable(GL_FRAGMENT_PROGRAM_ARB);
checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
}
+ LEAVE_GL();
}
static HRESULT arbfp_alloc(IWineD3DDevice *iface) {
@@ -2310,14 +5105,21 @@ static HRESULT arbfp_alloc(IWineD3DDevice *iface) {
if(!This->fragment_priv) return E_OUTOFMEMORY;
}
priv = This->fragment_priv;
- priv->fragment_shaders = hash_table_create(ffp_frag_program_key_hash, ffp_frag_program_key_compare);
+ if (wine_rb_init(&priv->fragment_shaders, &wined3d_ffp_frag_program_rb_functions) == -1)
+ {
+ ERR("Failed to initialize rbtree.\n");
+ HeapFree(GetProcessHeap(), 0, This->fragment_priv);
+ return E_OUTOFMEMORY;
+ }
priv->use_arbfp_fixed_func = TRUE;
return WINED3D_OK;
}
-static void arbfp_free_ffpshader(void *value, void *gli) {
- const WineD3D_GL_Info *gl_info = gli;
- struct arbfp_ffp_desc *entry_arb = value;
+/* Context activation is done by the caller. */
+static void arbfp_free_ffpshader(struct wine_rb_entry *entry, void *context)
+{
+ const struct wined3d_gl_info *gl_info = context;
+ struct arbfp_ffp_desc *entry_arb = WINE_RB_ENTRY_VALUE(entry, struct arbfp_ffp_desc, parent.entry);
ENTER_GL();
GL_EXTCALL(glDeleteProgramsARB(1, &entry_arb->shader));
@@ -2326,11 +5128,12 @@ static void arbfp_free_ffpshader(void *value, void *gli) {
LEAVE_GL();
}
+/* Context activation is done by the caller. */
static void arbfp_free(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
struct shader_arb_priv *priv = This->fragment_priv;
- hash_table_destroy(priv->fragment_shaders, arbfp_free_ffpshader, &This->adapter->gl_info);
+ wine_rb_destroy(&priv->fragment_shaders, arbfp_free_ffpshader, &This->adapter->gl_info);
priv->use_arbfp_fixed_func = FALSE;
if(This->shader_backend != &arb_program_shader_backend) {
@@ -2338,7 +5141,7 @@ static void arbfp_free(IWineD3DDevice *iface) {
}
}
-static void arbfp_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_info, struct fragment_caps *caps)
+static void arbfp_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
{
caps->TextureOpCaps = WINED3DTEXOPCAPS_DISABLE |
WINED3DTEXOPCAPS_SELECTARG1 |
@@ -2376,7 +5179,8 @@ static void arbfp_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_inf
#undef GLINFO_LOCATION
#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info
-static void state_texfactor_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_texfactor_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
float col[4];
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
@@ -2387,7 +5191,7 @@ static void state_texfactor_arbfp(DWORD state, IWineD3DStateBlockImpl *statebloc
if (use_ps(stateblock)) return;
device = stateblock->wineD3DDevice;
- device->activeContext->pshader_const_dirty[ARB_FFP_CONST_TFACTOR] = 1;
+ context->pshader_const_dirty[ARB_FFP_CONST_TFACTOR] = 1;
device->highest_dirty_ps_const = max(device->highest_dirty_ps_const, ARB_FFP_CONST_TFACTOR + 1);
}
@@ -2397,7 +5201,8 @@ static void state_texfactor_arbfp(DWORD state, IWineD3DStateBlockImpl *statebloc
}
-static void state_arb_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_arb_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
float col[4];
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
@@ -2408,31 +5213,33 @@ static void state_arb_specularenable(DWORD state, IWineD3DStateBlockImpl *stateb
if (use_ps(stateblock)) return;
device = stateblock->wineD3DDevice;
- device->activeContext->pshader_const_dirty[ARB_FFP_CONST_SPECULAR_ENABLE] = 1;
+ context->pshader_const_dirty[ARB_FFP_CONST_SPECULAR_ENABLE] = 1;
device->highest_dirty_ps_const = max(device->highest_dirty_ps_const, ARB_FFP_CONST_SPECULAR_ENABLE + 1);
}
if(stateblock->renderState[WINED3DRS_SPECULARENABLE]) {
/* The specular color has no alpha */
- col[0] = 1.0; col[1] = 1.0;
- col[2] = 1.0; col[3] = 0.0;
+ col[0] = 1.0f; col[1] = 1.0f;
+ col[2] = 1.0f; col[3] = 0.0f;
} else {
- col[0] = 0.0; col[1] = 0.0;
- col[2] = 0.0; col[3] = 0.0;
+ col[0] = 0.0f; col[1] = 0.0f;
+ col[2] = 0.0f; col[3] = 0.0f;
}
GL_EXTCALL(glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_SPECULAR_ENABLE, col));
checkGLcall("glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_SPECULAR_ENABLE, col)");
}
-static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
float mat[2][2];
if (use_ps(stateblock))
{
- if(stage != 0 &&
- ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.bumpmat[stage]) {
+ if (stage != 0
+ && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.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
*/
@@ -2446,7 +5253,7 @@ static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, W
return;
}
} else if(device->shader_backend == &arb_program_shader_backend) {
- device->activeContext->pshader_const_dirty[ARB_FFP_CONST_BUMPMAT(stage)] = 1;
+ context->pshader_const_dirty[ARB_FFP_CONST_BUMPMAT(stage)] = 1;
device->highest_dirty_ps_const = max(device->highest_dirty_ps_const, ARB_FFP_CONST_BUMPMAT(stage) + 1);
}
@@ -2459,15 +5266,17 @@ static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, W
checkGLcall("glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_BUMPMAT(stage), &mat[0][0])");
}
-static void tex_bumpenvlum_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void tex_bumpenvlum_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
float param[4];
if (use_ps(stateblock))
{
- if(stage != 0 &&
- ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.luminanceparams[stage]) {
+ if (stage != 0
+ && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.luminanceparams & (1 << stage)))
+ {
/* The pixel shader has to know the luminance offset. Do a constants update if it
* isn't scheduled anyway
*/
@@ -2481,20 +5290,21 @@ static void tex_bumpenvlum_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock
return;
}
} else if(device->shader_backend == &arb_program_shader_backend) {
- device->activeContext->pshader_const_dirty[ARB_FFP_CONST_LUMINANCE(stage)] = 1;
+ context->pshader_const_dirty[ARB_FFP_CONST_LUMINANCE(stage)] = 1;
device->highest_dirty_ps_const = max(device->highest_dirty_ps_const, ARB_FFP_CONST_LUMINANCE(stage) + 1);
}
param[0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVLSCALE]);
param[1] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVLOFFSET]);
- param[2] = 0.0;
- param[3] = 0.0;
+ param[2] = 0.0f;
+ param[3] = 0.0f;
GL_EXTCALL(glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_LUMINANCE(stage), param));
checkGLcall("glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_LUMINANCE(stage), param)");
}
-static const char *get_argreg(SHADER_BUFFER *buffer, DWORD argnum, unsigned int stage, DWORD arg) {
+static const char *get_argreg(struct wined3d_shader_buffer *buffer, DWORD argnum, unsigned int stage, DWORD arg)
+{
const char *ret;
if(arg == ARG_UNUSED) return "unused"; /* This is the marker for unused registers */
@@ -2565,8 +5375,9 @@ static const char *get_argreg(SHADER_BUFFER *buffer, DWORD argnum, unsigned int
return ret;
}
-static void gen_ffp_instr(SHADER_BUFFER *buffer, unsigned int stage, BOOL color, BOOL alpha,
- DWORD dst, DWORD op, DWORD dw_arg0, DWORD dw_arg1, DWORD dw_arg2) {
+static void gen_ffp_instr(struct wined3d_shader_buffer *buffer, unsigned int stage, BOOL color,
+ BOOL alpha, DWORD dst, DWORD op, DWORD dw_arg0, DWORD dw_arg1, DWORD dw_arg2)
+{
const char *dstmask, *dstreg, *arg0, *arg1, *arg2;
unsigned int mul = 1;
BOOL mul_final_dest = FALSE;
@@ -2707,7 +5518,7 @@ static void gen_ffp_instr(SHADER_BUFFER *buffer, unsigned int stage, BOOL color,
static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWineD3DStateBlockImpl *stateblock)
{
unsigned int stage;
- SHADER_BUFFER buffer;
+ struct wined3d_shader_buffer buffer;
BOOL tex_read[MAX_TEXTURES] = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE};
BOOL bump_used[MAX_TEXTURES] = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE};
BOOL luminance_used[MAX_TEXTURES] = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE};
@@ -2719,6 +5530,7 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi
BOOL tempreg_used = FALSE, tfactor_used = FALSE;
BOOL op_equal;
const char *final_combiner_src = "ret";
+ GLint pos;
/* Find out which textures are read */
for(stage = 0; stage < MAX_TEXTURES; stage++) {
@@ -2770,7 +5582,11 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi
}
/* Shader header */
- shader_buffer_init(&buffer);
+ if (!shader_buffer_init(&buffer))
+ {
+ ERR("Failed to initialize shader buffer.\n");
+ return 0;
+ }
shader_addline(&buffer, "!!ARBfp1.0\n");
@@ -2809,6 +5625,8 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi
srgb_sub_high, 0.0, 0.0, 0.0);
}
+ if(ffp_clip_emul(stateblock) && settings->emul_clipplanes) shader_addline(&buffer, "KIL fragment.texcoord[7];\n");
+
/* Generate texture sampling instructions) */
for(stage = 0; stage < MAX_TEXTURES && settings->op[stage].cop != WINED3DTOP_DISABLE; stage++) {
if(!tex_read[stage]) continue;
@@ -2935,8 +5753,7 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi
if(settings->sRGB_write) {
shader_addline(&buffer, "MAD ret, fragment.color.secondary, specular_enable, %s;\n", final_combiner_src);
- arbfp_add_sRGB_correction(&buffer, "ret", "arg0", "arg1", "arg2", "tempreg");
- shader_addline(&buffer, "MOV result.color.w, ret.w;\n");
+ arbfp_add_sRGB_correction(&buffer, "ret", "arg0", "arg1", "arg2", "tempreg", FALSE);
} else {
shader_addline(&buffer, "MAD result.color, fragment.color.secondary, specular_enable, %s;\n", final_combiner_src);
}
@@ -2947,19 +5764,31 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi
/* Generate the shader */
GL_EXTCALL(glGenProgramsARB(1, &ret));
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, ret));
- GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(buffer.buffer), buffer.buffer));
+ GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
+ strlen(buffer.buffer), buffer.buffer));
+ checkGLcall("glProgramStringARB()");
- if (glGetError() == GL_INVALID_OPERATION) {
- GLint pos;
- glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
+ glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
+ if (pos != -1)
+ {
FIXME("Fragment program error at position %d: %s\n", pos,
debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
}
+ else
+ {
+ GLint native;
+
+ GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
+ checkGLcall("glGetProgramivARB()");
+ if (!native) WARN("Program exceeds native resource limits.\n");
+ }
+
shader_buffer_free(&buffer);
return ret;
}
-static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
struct shader_arb_priv *priv = device->fragment_priv;
BOOL use_pshader = use_ps(stateblock);
@@ -2979,7 +5808,7 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock,
state_texfactor_arbfp(STATE_RENDER(WINED3DRS_TEXTUREFACTOR), stateblock, context);
state_arb_specularenable(STATE_RENDER(WINED3DRS_SPECULARENABLE), stateblock, context);
} else if(use_pshader && !isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) {
- device->shader_backend->shader_select((IWineD3DDevice *)stateblock->wineD3DDevice, use_pshader, use_vshader);
+ device->shader_backend->shader_select(context, use_pshader, use_vshader);
}
return;
}
@@ -2987,7 +5816,7 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock,
if(!use_pshader) {
/* Find or create a shader implementing the fixed function pipeline settings, then activate it */
gen_ffp_frag_op(stateblock, &settings, FALSE);
- desc = (const struct arbfp_ffp_desc *)find_ffp_frag_shader(priv->fragment_shaders, &settings);
+ desc = (const struct arbfp_ffp_desc *)find_ffp_frag_shader(&priv->fragment_shaders, &settings);
if(!desc) {
struct arbfp_ffp_desc *new_desc = HeapAlloc(GetProcessHeap(), 0, sizeof(*new_desc));
if (!new_desc)
@@ -3003,7 +5832,7 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock,
memcpy(&new_desc->parent.settings, &settings, sizeof(settings));
new_desc->shader = gen_arbfp_ffp_shader(&settings, stateblock);
- add_ffp_frag_shader(priv->fragment_shaders, &new_desc->parent);
+ add_ffp_frag_shader(&priv->fragment_shaders, &new_desc->parent);
TRACE("Allocated fixed function replacement shader descriptor %p\n", new_desc);
desc = new_desc;
}
@@ -3039,7 +5868,7 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock,
* shader handler
*/
if(!isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) {
- device->shader_backend->shader_select((IWineD3DDevice *)stateblock->wineD3DDevice, use_pshader, use_vshader);
+ device->shader_backend->shader_select(context, use_pshader, use_vshader);
if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vshader || use_pshader)) {
device->StateTable[STATE_VERTEXSHADERCONSTANT].apply(STATE_VERTEXSHADERCONSTANT, stateblock, context);
@@ -3056,7 +5885,8 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock,
* is that changing the fog start and fog end(which links to FOGENABLE in vertex) results in the
* fragment_prog_arbfp function being called because FOGENABLE is dirty, which calls this function here
*/
-static void state_arbfp_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_arbfp_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
enum fogsource new_source;
TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context);
@@ -3086,7 +5916,8 @@ static void state_arbfp_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, Win
}
}
-static void textransform(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void textransform(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(!isStateDirty(context, STATE_PIXELSHADER)) {
fragment_prog_arbfp(state, stateblock, context);
}
@@ -3095,154 +5926,154 @@ static void textransform(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3
#undef GLINFO_LOCATION
static const struct StateEntryTemplate arbfp_fragmentstate_template[] = {
- {STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 0 },
- {STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, 0 },
- {STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, 0 },
- {STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, 0 },
- {STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler_texdim }, 0 },
- {STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler_texdim }, 0 },
- {STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texdim }, 0 },
- {STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texdim }, 0 },
- {STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, 0 },
- {STATE_PIXELSHADER, { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, 0 },
- {STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, 0 },
- {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, 0 },
- {STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, 0 },
- {STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, 0 },
- {STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, fragment_prog_arbfp }, 0 },
- {STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, 0 },
- {STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, 0 },
- {STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(1, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(2, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(3, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(4, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_RENDER(WINED3DRS_SPECULARENABLE), { STATE_RENDER(WINED3DRS_SPECULARENABLE), state_arb_specularenable}, 0 },
- {0 /* Terminate */, { 0, 0 }, 0 },
+ {STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, 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 },
+ {STATE_PIXELSHADER, { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, 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), state_fogstartend }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, fragment_prog_arbfp }, 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_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(1, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(2, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(3, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(4, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_SPECULARENABLE), { STATE_RENDER(WINED3DRS_SPECULARENABLE), state_arb_specularenable}, WINED3D_GL_EXT_NONE },
+ {0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE },
};
const struct fragment_pipeline arbfp_fragment_pipeline = {
@@ -3272,6 +6103,8 @@ static HRESULT arbfp_blit_alloc(IWineD3DDevice *iface) {
}
return WINED3D_OK;
}
+
+/* Context activation is done by the caller. */
static void arbfp_blit_free(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
struct arbfp_blit_priv *priv = device->blit_priv;
@@ -3283,11 +6116,12 @@ static void arbfp_blit_free(IWineD3DDevice *iface) {
GL_EXTCALL(glDeleteProgramsARB(1, &priv->uyvy_2d_shader));
GL_EXTCALL(glDeleteProgramsARB(1, &priv->yv12_rect_shader));
GL_EXTCALL(glDeleteProgramsARB(1, &priv->yv12_2d_shader));
- checkGLcall("Delete yuv programs\n");
+ checkGLcall("Delete yuv programs");
LEAVE_GL();
}
-static BOOL gen_planar_yuv_read(SHADER_BUFFER *buffer, enum yuv_fixup yuv_fixup, GLenum textype, char *luminance)
+static BOOL gen_planar_yuv_read(struct wined3d_shader_buffer *buffer, enum yuv_fixup yuv_fixup,
+ GLenum textype, char *luminance)
{
char chroma;
const char *tex, *texinstr;
@@ -3374,7 +6208,7 @@ static BOOL gen_planar_yuv_read(SHADER_BUFFER *buffer, enum yuv_fixup yuv_fixup,
return TRUE;
}
-static BOOL gen_yv12_read(SHADER_BUFFER *buffer, GLenum textype, char *luminance)
+static BOOL gen_yv12_read(struct wined3d_shader_buffer *buffer, GLenum textype, char *luminance)
{
const char *tex;
@@ -3425,7 +6259,7 @@ static BOOL gen_yv12_read(SHADER_BUFFER *buffer, GLenum textype, char *luminance
* go from 0 to d3d_height, whereas the opengl texture height is 1.5 * d3d_height
*/
shader_addline(buffer, "PARAM yv12_coef = {%f, %f, %f, %f};\n",
- 2.0 / 3.0, 1.0 / 6.0, (2.0 / 3.0) + (1.0 / 6.0), 1.0 / 3.0);
+ 2.0f / 3.0f, 1.0f / 6.0f, (2.0f / 3.0f) + (1.0f / 6.0f), 1.0f / 3.0f);
shader_addline(buffer, "MOV texcrd, fragment.texcoord[0];\n");
/* the chroma planes have only half the width */
@@ -3520,15 +6354,21 @@ static BOOL gen_yv12_read(SHADER_BUFFER *buffer, GLenum textype, char *luminance
return TRUE;
}
+/* Context activation is done by the caller. */
static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixup, GLenum textype)
{
GLenum shader;
- SHADER_BUFFER buffer;
+ struct wined3d_shader_buffer buffer;
char luminance_component;
struct arbfp_blit_priv *priv = device->blit_priv;
+ GLint pos;
/* Shader header */
- shader_buffer_init(&buffer);
+ if (!shader_buffer_init(&buffer))
+ {
+ ERR("Failed to initialize shader buffer.\n");
+ return 0;
+ }
ENTER_GL();
GL_EXTCALL(glGenProgramsARB(1, &shader));
@@ -3624,14 +6464,25 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
shader_addline(&buffer, "END\n");
ENTER_GL();
- GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(buffer.buffer), buffer.buffer));
+ GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
+ strlen(buffer.buffer), buffer.buffer));
+ checkGLcall("glProgramStringARB()");
- if (glGetError() == GL_INVALID_OPERATION) {
- GLint pos;
- glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
+ glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
+ if (pos != -1)
+ {
FIXME("Fragment program error at position %d: %s\n", pos,
debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
}
+ else
+ {
+ GLint native;
+
+ GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
+ checkGLcall("glGetProgramivARB()");
+ if (!native) WARN("Program exceeds native resource limits.\n");
+ }
+
shader_buffer_free(&buffer);
LEAVE_GL();
@@ -3656,6 +6507,7 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
return shader;
}
+/* Context activation is done by the caller. */
static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatDesc *format_desc,
GLenum textype, UINT width, UINT height)
{
@@ -3716,6 +6568,7 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
return WINED3D_OK;
}
+/* Context activation is done by the caller. */
static void arbfp_blit_unset(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
diff --git a/reactos/dll/directx/wine/wined3d/ati_fragment_shader.c b/reactos/dll/directx/wine/wined3d/ati_fragment_shader.c
index a8c137f9b45..aea942cc47e 100644
--- a/reactos/dll/directx/wine/wined3d/ati_fragment_shader.c
+++ b/reactos/dll/directx/wine/wined3d/ati_fragment_shader.c
@@ -28,6 +28,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
WINE_DECLARE_DEBUG_CHANNEL(d3d);
+/* GL locking for state handlers is done by the caller. */
+
/* Some private defines, Constant associations, etc.
* Env bump matrix and per stage constant should be independent,
* a stage that bump maps can't read the per state constant
@@ -51,8 +53,7 @@ struct atifs_ffp_desc
struct atifs_private_data
{
- struct hash_table_t *fragment_shaders; /* A hashtable to track fragment pipeline replacement shaders */
-
+ struct wine_rb_tree fragment_shaders; /* A rb-tree to track fragment pipeline replacement shaders */
};
static const char *debug_dstmod(GLuint mod) {
@@ -191,8 +192,9 @@ static const char *debug_mask(GLuint mask) {
}
#define GLINFO_LOCATION (*gl_info)
-static void wrap_op1(const WineD3D_GL_Info *gl_info, GLuint op, GLuint dst, GLuint dstMask, GLuint dstMod,
- GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) {
+static void wrap_op1(const struct wined3d_gl_info *gl_info, GLuint op, GLuint dst, GLuint dstMask, GLuint dstMod,
+ GLuint arg1, GLuint arg1Rep, GLuint arg1Mod)
+{
if(dstMask == GL_ALPHA) {
TRACE("glAlphaFragmentOp1ATI(%s, %s, %s, %s, %s, %s)\n", debug_op(op), debug_register(dst), debug_dstmod(dstMod),
debug_register(arg1), debug_rep(arg1Rep), debug_argmod(arg1Mod));
@@ -205,9 +207,9 @@ static void wrap_op1(const WineD3D_GL_Info *gl_info, GLuint op, GLuint dst, GLui
}
}
-static void wrap_op2(const WineD3D_GL_Info *gl_info, GLuint op, GLuint dst, GLuint dstMask, GLuint dstMod,
- GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
- GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) {
+static void wrap_op2(const struct wined3d_gl_info *gl_info, GLuint op, GLuint dst, GLuint dstMask, GLuint dstMod,
+ GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod)
+{
if(dstMask == GL_ALPHA) {
TRACE("glAlphaFragmentOp2ATI(%s, %s, %s, %s, %s, %s, %s, %s, %s)\n", debug_op(op), debug_register(dst), debug_dstmod(dstMod),
debug_register(arg1), debug_rep(arg1Rep), debug_argmod(arg1Mod),
@@ -222,10 +224,10 @@ static void wrap_op2(const WineD3D_GL_Info *gl_info, GLuint op, GLuint dst, GLui
}
}
-static void wrap_op3(const WineD3D_GL_Info *gl_info, GLuint op, GLuint dst, GLuint dstMask, GLuint dstMod,
- GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
- GLuint arg2, GLuint arg2Rep, GLuint arg2Mod,
- GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) {
+static void wrap_op3(const struct wined3d_gl_info *gl_info, GLuint op, GLuint dst, GLuint dstMask, GLuint dstMod,
+ GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod,
+ GLuint arg3, GLuint arg3Rep, GLuint arg3Mod)
+{
if(dstMask == GL_ALPHA) {
/* Leave some free space to fit "GL_NONE, " in to align most alpha and color op lines */
TRACE("glAlphaFragmentOp3ATI(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\n", debug_op(op), debug_register(dst), debug_dstmod(dstMod),
@@ -249,7 +251,7 @@ static void wrap_op3(const WineD3D_GL_Info *gl_info, GLuint op, GLuint dst, GLui
}
}
-static GLuint register_for_arg(DWORD arg, const WineD3D_GL_Info *gl_info,
+static GLuint register_for_arg(DWORD arg, const struct wined3d_gl_info *gl_info,
unsigned int stage, GLuint *mod, GLuint *rep, GLuint tmparg)
{
GLenum ret;
@@ -377,7 +379,7 @@ static GLuint find_tmpreg(const struct texture_stage_op op[MAX_TEXTURES])
}
}
-static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], const WineD3D_GL_Info *gl_info)
+static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], const struct wined3d_gl_info *gl_info)
{
GLuint ret = GL_EXTCALL(glGenFragmentShadersATI(1));
unsigned int stage;
@@ -422,13 +424,6 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
GL_EXTCALL(glPassTexCoordATI(GL_REG_0_ATI + stage + 1,
GL_TEXTURE0_ARB + stage + 1,
swizzle));
-
- /* We need GL_REG_5_ATI as a temporary register to swizzle the bump matrix. So we run into
- * issues if we're bump mapping on stage 4 or 5
- */
- if(stage >= 4) {
- FIXME("Bump mapping in stage %d\n", stage);
- }
}
/* Pass 2: Generate perturbation calculations */
@@ -459,22 +454,24 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
ATI_FFP_CONST_BUMPMAT(stage), GL_NONE, GL_2X_BIT_ATI | GL_BIAS_BIT_ATI,
GL_REG_0_ATI + stage + 1, GL_RED, GL_NONE);
- /* FIXME: How can I make GL_DOT2_ADD_ATI read the factors from blue and alpha? It defaults to red and green,
- * and it is fairly easy to make it read GL_BLUE or BL_ALPHA, but I can't get an R * B + G * A. So we're wasting
- * one register and two instructions in this pass for a simple swizzling operation.
- * For starters it might be good enough to merge the two movs into one, but even that isn't possible :-(
+ /* Don't use GL_DOT2_ADD_ATI here because we cannot configure it to read the blue and alpha
+ * component of the bump matrix. Instead do this with two MADs:
*
- * NOTE: GL_BLUE | GL_ALPHA is not possible. It doesn't throw a compilation error, but an OR operation on the
- * constants doesn't make sense, considering their values.
+ * coord.a = tex.r * bump.b + coord.g
+ * coord.g = tex.g * bump.a + coord.a
+ *
+ * The first instruction writes to alpha so it can be coissued with the above DOT2_ADD.
+ * coord.a is unused. If the perturbed texture is projected, this was already handled
+ * in the glPassTexCoordATI above.
*/
- wrap_op1(gl_info, GL_MOV_ATI, GL_REG_5_ATI, GL_RED_BIT_ATI, GL_NONE,
- ATI_FFP_CONST_BUMPMAT(stage), GL_BLUE, GL_NONE);
- wrap_op1(gl_info, GL_MOV_ATI, GL_REG_5_ATI, GL_GREEN_BIT_ATI, GL_NONE,
- ATI_FFP_CONST_BUMPMAT(stage), GL_ALPHA, GL_NONE);
- wrap_op3(gl_info, GL_DOT2_ADD_ATI, GL_REG_0_ATI + stage + 1, GL_GREEN_BIT_ATI, GL_NONE,
- GL_REG_0_ATI + stage, GL_NONE, argmodextra_y,
- GL_REG_5_ATI, GL_NONE, GL_2X_BIT_ATI | GL_BIAS_BIT_ATI,
+ wrap_op3(gl_info, GL_MAD_ATI, GL_REG_0_ATI + stage + 1, GL_ALPHA, GL_NONE,
+ GL_REG_0_ATI + stage, GL_RED, argmodextra_y,
+ ATI_FFP_CONST_BUMPMAT(stage), GL_BLUE, GL_NONE,
GL_REG_0_ATI + stage + 1, GL_GREEN, GL_NONE);
+ wrap_op3(gl_info, GL_MAD_ATI, GL_REG_0_ATI + stage + 1, GL_GREEN_BIT_ATI, GL_NONE,
+ GL_REG_0_ATI + stage, GL_GREEN, argmodextra_y,
+ ATI_FFP_CONST_BUMPMAT(stage), GL_ALPHA, GL_NONE,
+ GL_REG_0_ATI + stage + 1, GL_ALPHA, GL_NONE);
}
/* Pass 3: Generate sampling instructions for regular textures */
@@ -799,7 +796,8 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
#undef GLINFO_LOCATION
#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info
-static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
IWineD3DDeviceImpl *This = stateblock->wineD3DDevice;
const struct atifs_ffp_desc *desc;
struct ffp_frag_settings settings;
@@ -808,7 +806,7 @@ static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, Wi
unsigned int i;
gen_ffp_frag_op(stateblock, &settings, TRUE);
- desc = (const struct atifs_ffp_desc *)find_ffp_frag_shader(priv->fragment_shaders, &settings);
+ desc = (const struct atifs_ffp_desc *)find_ffp_frag_shader(&priv->fragment_shaders, &settings);
if(!desc) {
struct atifs_ffp_desc *new_desc = HeapAlloc(GetProcessHeap(), 0, sizeof(*new_desc));
if (!new_desc)
@@ -824,7 +822,7 @@ static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, Wi
memcpy(&new_desc->parent.settings, &settings, sizeof(settings));
new_desc->shader = gen_ati_shader(settings.op, &GLINFO_LOCATION);
- add_ffp_frag_shader(priv->fragment_shaders, &new_desc->parent);
+ add_ffp_frag_shader(&priv->fragment_shaders, &new_desc->parent);
TRACE("Allocated fixed function replacement shader descriptor %p\n", new_desc);
desc = new_desc;
}
@@ -845,7 +843,8 @@ static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, Wi
GL_EXTCALL(glBindFragmentShaderATI(desc->shader));
}
-static void state_texfactor_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_texfactor_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
float col[4];
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col);
@@ -853,7 +852,8 @@ static void state_texfactor_atifs(DWORD state, IWineD3DStateBlockImpl *statebloc
checkGLcall("glSetFragmentShaderConstantATI(ATI_FFP_CONST_TFACTOR, col)");
}
-static void set_bumpmat(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void set_bumpmat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
float mat[2][2];
@@ -868,21 +868,23 @@ static void set_bumpmat(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
* shader(it is free). This might potentially reduce precision. However, if the hardware does
* support proper floats it shouldn't, and if it doesn't we can't get anything better anyway
*/
- mat[0][0] = (mat[0][0] + 1.0) * 0.5;
- mat[1][0] = (mat[1][0] + 1.0) * 0.5;
- mat[0][1] = (mat[0][1] + 1.0) * 0.5;
- mat[1][1] = (mat[1][1] + 1.0) * 0.5;
+ mat[0][0] = (mat[0][0] + 1.0f) * 0.5f;
+ mat[1][0] = (mat[1][0] + 1.0f) * 0.5f;
+ mat[0][1] = (mat[0][1] + 1.0f) * 0.5f;
+ mat[1][1] = (mat[1][1] + 1.0f) * 0.5f;
GL_EXTCALL(glSetFragmentShaderConstantATI(ATI_FFP_CONST_BUMPMAT(stage), (float *) mat));
checkGLcall("glSetFragmentShaderConstantATI(ATI_FFP_CONST_BUMPMAT(stage), mat)");
}
-static void textransform(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void textransform(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(!isStateDirty(context, STATE_PIXELSHADER)) {
set_tex_op_atifs(state, stateblock, context);
}
}
-static void atifs_apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void atifs_apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
BOOL use_vshader = use_vs(stateblock);
@@ -899,7 +901,7 @@ static void atifs_apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *statebl
* simpler.
*/
if(!isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) {
- device->shader_backend->shader_select((IWineD3DDevice *)stateblock->wineD3DDevice, FALSE, use_vshader);
+ device->shader_backend->shader_select(context, FALSE, use_vshader);
if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && use_vshader) {
device->StateTable[STATE_VERTEXSHADERCONSTANT].apply(STATE_VERTEXSHADERCONSTANT, stateblock, context);
@@ -910,139 +912,141 @@ static void atifs_apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *statebl
#undef GLINFO_LOCATION
static const struct StateEntryTemplate atifs_fragmentstate_template[] = {
- {STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor_atifs }, 0 },
- {STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, 0 },
- {STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, 0 },
- {STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 0 },
- {STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 0 },
- {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 0 },
- {STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, 0 },
- {STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 0 },
- { STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, 0 },
- { STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, 0 },
- { STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, 0 },
- { STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler_texdim }, 0 },
- { STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler_texdim }, 0 },
- { STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texdim }, 0 },
- { STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texdim }, 0 },
- { STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, 0 },
- {STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(1, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(2, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(3, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(4, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 },
- {STATE_PIXELSHADER, { STATE_PIXELSHADER, atifs_apply_pixelshader }, 0 },
- {0 /* Terminate */, { 0, 0 }, 0 },
+ {STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor_atifs }, 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), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 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), state_fogstartend }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, 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 },
+ {STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(1, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(2, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(3, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(4, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
+ {STATE_PIXELSHADER, { STATE_PIXELSHADER, atifs_apply_pixelshader }, WINED3D_GL_EXT_NONE },
+ {0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE },
};
+/* Context activation is done by the caller. */
static void atifs_enable(IWineD3DDevice *iface, BOOL enable) {
+ ENTER_GL();
if(enable) {
glEnable(GL_FRAGMENT_SHADER_ATI);
checkGLcall("glEnable(GL_FRAGMENT_SHADER_ATI)");
@@ -1050,9 +1054,10 @@ static void atifs_enable(IWineD3DDevice *iface, BOOL enable) {
glDisable(GL_FRAGMENT_SHADER_ATI);
checkGLcall("glDisable(GL_FRAGMENT_SHADER_ATI)");
}
+ LEAVE_GL();
}
-static void atifs_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_info, struct fragment_caps *caps)
+static void atifs_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
{
caps->TextureOpCaps = WINED3DTEXOPCAPS_DISABLE |
WINED3DTEXOPCAPS_SELECTARG1 |
@@ -1110,14 +1115,21 @@ static HRESULT atifs_alloc(IWineD3DDevice *iface) {
return E_OUTOFMEMORY;
}
priv = This->fragment_priv;
- priv->fragment_shaders = hash_table_create(ffp_frag_program_key_hash, ffp_frag_program_key_compare);
+ if (wine_rb_init(&priv->fragment_shaders, &wined3d_ffp_frag_program_rb_functions) == -1)
+ {
+ ERR("Failed to initialize rbtree.\n");
+ HeapFree(GetProcessHeap(), 0, This->fragment_priv);
+ return E_OUTOFMEMORY;
+ }
return WINED3D_OK;
}
#define GLINFO_LOCATION This->adapter->gl_info
-static void atifs_free_ffpshader(void *value, void *device) {
- IWineD3DDeviceImpl *This = device;
- struct atifs_ffp_desc *entry_ati = value;
+/* Context activation is done by the caller. */
+static void atifs_free_ffpshader(struct wine_rb_entry *entry, void *context)
+{
+ IWineD3DDeviceImpl *This = context;
+ struct atifs_ffp_desc *entry_ati = WINE_RB_ENTRY_VALUE(entry, struct atifs_ffp_desc, parent.entry);
ENTER_GL();
GL_EXTCALL(glDeleteFragmentShaderATI(entry_ati->shader));
@@ -1126,11 +1138,12 @@ static void atifs_free_ffpshader(void *value, void *device) {
LEAVE_GL();
}
+/* Context activation is done by the caller. */
static void atifs_free(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
struct atifs_private_data *priv = This->fragment_priv;
- hash_table_destroy(priv->fragment_shaders, atifs_free_ffpshader, This);
+ wine_rb_destroy(&priv->fragment_shaders, atifs_free_ffpshader, This);
HeapFree(GetProcessHeap(), 0, priv);
This->fragment_priv = NULL;
diff --git a/reactos/dll/directx/wine/wined3d/baseshader.c b/reactos/dll/directx/wine/wined3d/baseshader.c
index 8b8aef4d15a..c983e80a35a 100644
--- a/reactos/dll/directx/wine/wined3d/baseshader.c
+++ b/reactos/dll/directx/wine/wined3d/baseshader.c
@@ -138,35 +138,41 @@ const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token
}
}
-static inline BOOL shader_is_version_token(DWORD token) {
- return shader_is_pshader_version(token) ||
- shader_is_vshader_version(token);
-}
-
-void shader_buffer_init(struct SHADER_BUFFER *buffer)
+void shader_buffer_clear(struct wined3d_shader_buffer *buffer)
{
- buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE);
buffer->buffer[0] = '\0';
buffer->bsize = 0;
buffer->lineNo = 0;
buffer->newline = TRUE;
}
-void shader_buffer_free(struct SHADER_BUFFER *buffer)
+BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer)
+{
+ buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE);
+ if (!buffer->buffer)
+ {
+ ERR("Failed to allocate shader buffer memory.\n");
+ return FALSE;
+ }
+
+ shader_buffer_clear(buffer);
+ return TRUE;
+}
+
+void shader_buffer_free(struct wined3d_shader_buffer *buffer)
{
HeapFree(GetProcessHeap(), 0, buffer->buffer);
}
-int shader_vaddline(SHADER_BUFFER* buffer, const char *format, va_list args)
+int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *format, va_list args)
{
char* base = buffer->buffer + buffer->bsize;
int rc;
rc = vsnprintf(base, SHADER_PGMSIZE - 1 - buffer->bsize, format, args);
- if (rc < 0 || /* C89 */
- rc > SHADER_PGMSIZE - 1 - buffer->bsize) { /* C99 */
-
+ if (rc < 0 /* C89 */ || (unsigned int)rc > SHADER_PGMSIZE - 1 - buffer->bsize /* C99 */)
+ {
ERR("The buffer allocated for the shader program string "
"is too small at %d bytes.\n", SHADER_PGMSIZE);
buffer->bsize = SHADER_PGMSIZE - 1;
@@ -188,7 +194,7 @@ int shader_vaddline(SHADER_BUFFER* buffer, const char *format, va_list args)
return 0;
}
-int shader_addline(SHADER_BUFFER* buffer, const char *format, ...)
+int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ...)
{
int ret;
va_list args;
@@ -246,24 +252,23 @@ static inline void set_bitmap_bit(DWORD *bitmap, DWORD bit)
}
static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct shader_reg_maps *reg_maps,
- DWORD register_type, UINT register_idx, BOOL has_rel_addr, BOOL pshader)
+ const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type)
{
- switch (register_type)
+ switch (reg->type)
{
case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
- if (pshader) reg_maps->texcoord[register_idx] = 1;
- else reg_maps->address[register_idx] = 1;
+ if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord |= 1 << reg->idx;
+ else reg_maps->address |= 1 << reg->idx;
break;
case WINED3DSPR_TEMP:
- reg_maps->temporary[register_idx] = 1;
+ reg_maps->temporary |= 1 << reg->idx;
break;
case WINED3DSPR_INPUT:
- if (!pshader) reg_maps->attributes[register_idx] = 1;
- else
+ if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
{
- if (has_rel_addr)
+ if (reg->rel_addr)
{
/* If relative addressing is used, we must assume that all registers
* are used. Even if it is a construct like v3[aL], we can't assume
@@ -276,84 +281,142 @@ static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct sh
}
else
{
- ((IWineD3DPixelShaderImpl *)This)->input_reg_used[register_idx] = TRUE;
+ ((IWineD3DPixelShaderImpl *)This)->input_reg_used[reg->idx] = TRUE;
}
}
+ else reg_maps->input_registers |= 1 << reg->idx;
break;
case WINED3DSPR_RASTOUT:
- if (register_idx == 1) reg_maps->fog = 1;
+ if (reg->idx == 1) reg_maps->fog = 1;
break;
case WINED3DSPR_MISCTYPE:
- if (pshader && register_idx == 0) reg_maps->vpos = 1;
+ if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
+ {
+ if (reg->idx == 0) reg_maps->vpos = 1;
+ else if (reg->idx == 1) reg_maps->usesfacing = 1;
+ }
break;
case WINED3DSPR_CONST:
- if (has_rel_addr)
+ if (reg->rel_addr)
{
- if (!pshader)
+ if (shader_type != WINED3D_SHADER_TYPE_PIXEL)
{
- if (register_idx <= ((IWineD3DVertexShaderImpl *)This)->min_rel_offset)
- ((IWineD3DVertexShaderImpl *)This)->min_rel_offset = register_idx;
- else if (register_idx >= ((IWineD3DVertexShaderImpl *)This)->max_rel_offset)
- ((IWineD3DVertexShaderImpl *)This)->max_rel_offset = register_idx;
+ if (reg->idx < ((IWineD3DVertexShaderImpl *)This)->min_rel_offset)
+ {
+ ((IWineD3DVertexShaderImpl *)This)->min_rel_offset = reg->idx;
+ }
+ if (reg->idx > ((IWineD3DVertexShaderImpl *)This)->max_rel_offset)
+ {
+ ((IWineD3DVertexShaderImpl *)This)->max_rel_offset = reg->idx;
+ }
}
reg_maps->usesrelconstF = TRUE;
}
else
{
- set_bitmap_bit(reg_maps->constf, register_idx);
+ set_bitmap_bit(reg_maps->constf, reg->idx);
}
break;
case WINED3DSPR_CONSTINT:
- reg_maps->integer_constants |= (1 << register_idx);
+ reg_maps->integer_constants |= (1 << reg->idx);
break;
case WINED3DSPR_CONSTBOOL:
- reg_maps->boolean_constants |= (1 << register_idx);
+ reg_maps->boolean_constants |= (1 << reg->idx);
+ break;
+
+ case WINED3DSPR_COLOROUT:
+ reg_maps->highest_render_target = max(reg_maps->highest_render_target, reg->idx);
break;
default:
- TRACE("Not recording register of type %#x and idx %u\n", register_type, register_idx);
+ TRACE("Not recording register of type %#x and idx %u\n", reg->type, reg->idx);
break;
}
}
-static unsigned char get_instr_regcount(enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, int param)
+static unsigned int get_instr_extra_regcount(enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, unsigned int param)
{
switch(instr)
{
case WINED3DSIH_M4x4:
case WINED3DSIH_M3x4:
- return param == 1 ? 4 : 1;
+ return param == 1 ? 3 : 0;
case WINED3DSIH_M4x3:
case WINED3DSIH_M3x3:
- return param == 1 ? 3 : 1;
+ return param == 1 ? 2 : 0;
case WINED3DSIH_M3x2:
- return param == 1 ? 2 : 1;
+ return param == 1 ? 1 : 0;
default:
- return 1;
+ return 0;
}
}
+static const char *shader_semantic_name_from_usage(WINED3DDECLUSAGE usage)
+{
+ static const char *semantic_names[] =
+ {
+ /* WINED3DDECLUSAGE_POSITION */ "SV_POSITION",
+ /* WINED3DDECLUSAGE_BLENDWEIGHT */ "BLENDWEIGHT",
+ /* WINED3DDECLUSAGE_BLENDINDICES */ "BLENDINDICES",
+ /* WINED3DDECLUSAGE_NORMAL */ "NORMAL",
+ /* WINED3DDECLUSAGE_PSIZE */ "PSIZE",
+ /* WINED3DDECLUSAGE_TEXCOORD */ "TEXCOORD",
+ /* WINED3DDECLUSAGE_TANGENT */ "TANGENT",
+ /* WINED3DDECLUSAGE_BINORMAL */ "BINORMAL",
+ /* WINED3DDECLUSAGE_TESSFACTOR */ "TESSFACTOR",
+ /* WINED3DDECLUSAGE_POSITIONT */ "POSITIONT",
+ /* WINED3DDECLUSAGE_COLOR */ "COLOR",
+ /* WINED3DDECLUSAGE_FOG */ "FOG",
+ /* WINED3DDECLUSAGE_DEPTH */ "DEPTH",
+ /* WINED3DDECLUSAGE_SAMPLE */ "SAMPLE",
+ };
+
+ if (usage >= sizeof(semantic_names) / sizeof(*semantic_names))
+ {
+ FIXME("Unrecognized usage %#x\n", usage);
+ return "UNRECOGNIZED";
+ }
+
+ return semantic_names[usage];
+}
+
+BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage)
+{
+ return !strcmp(semantic_name, shader_semantic_name_from_usage(usage));
+}
+
+static void shader_signature_from_semantic(struct wined3d_shader_signature_element *e,
+ const struct wined3d_shader_semantic *s)
+{
+ e->semantic_name = shader_semantic_name_from_usage(s->usage);
+ e->semantic_idx = s->usage_idx;
+ e->sysval_semantic = 0;
+ e->component_type = 0;
+ e->register_idx = s->reg.reg.idx;
+ e->mask = s->reg.write_mask;
+}
+
/* Note that this does not count the loop register
* as an address register. */
HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe,
- struct shader_reg_maps *reg_maps, struct wined3d_shader_semantic *semantics_in,
- struct wined3d_shader_semantic *semantics_out, const DWORD *byte_code, DWORD constf_size)
+ struct shader_reg_maps *reg_maps, struct wined3d_shader_attribute *attributes,
+ struct wined3d_shader_signature_element *input_signature,
+ struct wined3d_shader_signature_element *output_signature, const DWORD *byte_code, DWORD constf_size)
{
IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface;
void *fe_data = This->baseShader.frontend_data;
struct wined3d_shader_version shader_version;
unsigned int cur_loop_depth = 0, max_loop_depth = 0;
const DWORD* pToken = byte_code;
- char pshader;
/* There are some minor differences between pixel and vertex shaders */
@@ -368,7 +431,6 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
fe->shader_read_header(fe_data, &pToken, &shader_version);
reg_maps->shader_version = shader_version;
- pshader = shader_is_pshader_version(shader_version.type);
reg_maps->constf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(*reg_maps->constf) * ((constf_size + 31) / 32));
@@ -410,15 +472,22 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
/* Vshader: mark attributes used
* Pshader: mark 3.0 input registers used, save token */
case WINED3DSPR_INPUT:
- if (!pshader) reg_maps->attributes[semantic.reg.reg.idx] = 1;
- else reg_maps->packed_input[semantic.reg.reg.idx] = 1;
- semantics_in[semantic.reg.reg.idx] = semantic;
+ reg_maps->input_registers |= 1 << semantic.reg.reg.idx;
+ if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
+ {
+ attributes[semantic.reg.reg.idx].usage = semantic.usage;
+ attributes[semantic.reg.reg.idx].usage_idx = semantic.usage_idx;
+ }
+ else
+ {
+ shader_signature_from_semantic(&input_signature[semantic.reg.reg.idx], &semantic);
+ }
break;
/* Vshader: mark 3.0 output registers used, save token */
case WINED3DSPR_OUTPUT:
- reg_maps->packed_output[semantic.reg.reg.idx] = 1;
- semantics_out[semantic.reg.reg.idx] = semantic;
+ reg_maps->output_registers |= 1 << semantic.reg.reg.idx;
+ shader_signature_from_semantic(&output_signature[semantic.reg.reg.idx], &semantic);
if (semantic.usage == WINED3DDECLUSAGE_FOG) reg_maps->fog = 1;
break;
@@ -447,17 +516,17 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
pToken += 4;
/* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
- if (shader_version.major == 1 && pshader)
+ if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
{
float *value = (float *) lconst->value;
- if(value[0] < -1.0) value[0] = -1.0;
- else if(value[0] > 1.0) value[0] = 1.0;
- if(value[1] < -1.0) value[1] = -1.0;
- else if(value[1] > 1.0) value[1] = 1.0;
- if(value[2] < -1.0) value[2] = -1.0;
- else if(value[2] > 1.0) value[2] = 1.0;
- if(value[3] < -1.0) value[3] = -1.0;
- else if(value[3] > 1.0) value[3] = 1.0;
+ if (value[0] < -1.0f) value[0] = -1.0f;
+ else if (value[0] > 1.0f) value[0] = 1.0f;
+ if (value[1] < -1.0f) value[1] = -1.0f;
+ else if (value[1] > 1.0f) value[1] = 1.0f;
+ if (value[2] < -1.0f) value[2] = -1.0f;
+ else if (value[2] > 1.0f) value[2] = 1.0f;
+ if (value[3] < -1.0f) value[3] = -1.0f;
+ else if (value[3] > 1.0f) value[3] = 1.0f;
}
list_add_head(&This->baseShader.constantsF, &lconst->entry);
@@ -477,6 +546,7 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
pToken += 4;
list_add_head(&This->baseShader.constantsI, &lconst->entry);
+ reg_maps->local_int_consts |= (1 << dst.reg.idx);
}
else if (ins.handler_idx == WINED3DSIH_DEFB)
{
@@ -493,6 +563,7 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
++pToken;
list_add_head(&This->baseShader.constantsB, &lconst->entry);
+ reg_maps->local_bool_consts |= (1 << dst.reg.idx);
}
/* If there's a loop in the shader */
else if (ins.handler_idx == WINED3DSIH_LOOP
@@ -528,12 +599,13 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
struct wined3d_shader_src_param src, rel_addr;
fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr);
- reg_maps->labels[src.reg.idx] = 1;
+ reg_maps->labels |= 1 << src.reg.idx;
}
/* Set texture, address, temporary registers */
else
{
int i, limit;
+ BOOL color0_mov = FALSE;
/* This will loop over all the registers and try to
* make a bitmask of the ones we're interested in.
@@ -549,22 +621,49 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr);
+ shader_record_register_usage(This, reg_maps, &dst_param.reg, shader_version.type);
+
/* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and
* is used in >= 3.0 shaders. Filter 3.0 shaders to prevent overflows, and also filter pixel
* shaders because TECRDOUT isn't used in them, but future register types might cause issues */
- if (!pshader && shader_version.major < 3 && dst_param.reg.type == WINED3DSPR_TEXCRDOUT)
+ if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3
+ && dst_param.reg.type == WINED3DSPR_TEXCRDOUT)
{
- reg_maps->texcoord_mask[dst_param.reg.type] |= dst_param.write_mask;
+ reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask;
}
- else
+
+ if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
{
- shader_record_register_usage(This, reg_maps, dst_param.reg.type,
- dst_param.reg.idx, !!dst_param.reg.rel_addr, pshader);
+ IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)This;
+
+ if(dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0)
+ {
+ /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to
+ * COLOROUT 0. If we know this in advance, the ARB shader backend can skip
+ * the mov and perform the sRGB write correction from the source register.
+ *
+ * However, if the mov is only partial, we can't do this, and if the write
+ * comes from an instruction other than MOV it is hard to do as well. If
+ * COLOROUT 0 is overwritten partially later, the marker is dropped again. */
+
+ ps->color0_mov = FALSE;
+ if (ins.handler_idx == WINED3DSIH_MOV)
+ {
+ /* Used later when the source register is read. */
+ color0_mov = TRUE;
+ }
+ }
+ /* Also drop the MOV marker if the source register is overwritten prior to the shader
+ * end
+ */
+ else if(dst_param.reg.type == WINED3DSPR_TEMP && dst_param.reg.idx == ps->color0_reg)
+ {
+ ps->color0_mov = FALSE;
+ }
}
/* Declare 1.X samplers implicitly, based on the destination reg. number */
if (shader_version.major == 1
- && pshader /* Filter different instructions with the same enum values in VS */
&& (ins.handler_idx == WINED3DSIH_TEX
|| ins.handler_idx == WINED3DSIH_TEXBEM
|| ins.handler_idx == WINED3DSIH_TEXBEML
@@ -587,16 +686,16 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
if (ins.handler_idx == WINED3DSIH_TEXBEM
|| ins.handler_idx == WINED3DSIH_TEXBEML)
{
- reg_maps->bumpmat[sampler_code] = TRUE;
+ reg_maps->bumpmat |= 1 << dst_param.reg.idx;
if (ins.handler_idx == WINED3DSIH_TEXBEML)
{
- reg_maps->luminanceparams[sampler_code] = TRUE;
+ reg_maps->luminanceparams |= 1 << dst_param.reg.idx;
}
}
}
- else if (pshader && ins.handler_idx == WINED3DSIH_BEM)
+ else if (ins.handler_idx == WINED3DSIH_BEM)
{
- reg_maps->bumpmat[dst_param.reg.idx] = TRUE;
+ reg_maps->bumpmat |= 1 << dst_param.reg.idx;
}
}
@@ -608,45 +707,77 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
{
reg_maps->usesdsy = 1;
}
+ else if (ins.handler_idx == WINED3DSIH_DSX)
+ {
+ reg_maps->usesdsx = 1;
+ }
else if(ins.handler_idx == WINED3DSIH_TEXLDD)
{
reg_maps->usestexldd = 1;
}
+ else if(ins.handler_idx == WINED3DSIH_TEXLDL)
+ {
+ reg_maps->usestexldl = 1;
+ }
+ else if(ins.handler_idx == WINED3DSIH_MOVA)
+ {
+ reg_maps->usesmova = 1;
+ }
+ else if(ins.handler_idx == WINED3DSIH_IFC)
+ {
+ reg_maps->usesifc = 1;
+ }
+ else if(ins.handler_idx == WINED3DSIH_CALL)
+ {
+ reg_maps->usescall = 1;
+ }
limit = ins.src_count + (ins.predicate ? 1 : 0);
for (i = 0; i < limit; ++i)
{
struct wined3d_shader_src_param src_param, src_rel_addr;
+ unsigned int count;
fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr);
- switch(get_instr_regcount(ins.handler_idx, i))
+ count = get_instr_extra_regcount(ins.handler_idx, i);
+
+ shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type);
+ while (count)
{
- case 4:
- shader_record_register_usage(This, reg_maps, src_param.reg.type,
- src_param.reg.idx + 3, !!src_param.reg.rel_addr, pshader);
- /* drop through */
- case 3:
- shader_record_register_usage(This, reg_maps, src_param.reg.type,
- src_param.reg.idx + 2, !!src_param.reg.rel_addr, pshader);
- /* drop through */
- case 2:
- shader_record_register_usage(This, reg_maps, src_param.reg.type,
- src_param.reg.idx + 1, !!src_param.reg.rel_addr, pshader);
- /* drop through */
- case 1:
- shader_record_register_usage(This, reg_maps, src_param.reg.type,
- src_param.reg.idx, !!src_param.reg.rel_addr, pshader);
+ ++src_param.reg.idx;
+ shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type);
+ --count;
+ }
+
+ if(color0_mov)
+ {
+ IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) This;
+ if(src_param.reg.type == WINED3DSPR_TEMP &&
+ src_param.swizzle == WINED3DSP_NOSWIZZLE)
+ {
+ ps->color0_mov = TRUE;
+ ps->color0_reg = src_param.reg.idx;
+ }
}
}
}
}
reg_maps->loop_depth = max_loop_depth;
- This->baseShader.functionLength = ((char *)pToken - (char *)byte_code);
+ This->baseShader.functionLength = ((const char *)pToken - (const char *)byte_code);
return WINED3D_OK;
}
+unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max)
+{
+ DWORD map = 1 << max;
+ map |= map - 1;
+ map &= reg_maps->shader_version.major < 3 ? ~reg_maps->texcoord : ~reg_maps->input_registers;
+
+ return wined3d_log2i(map);
+}
+
static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semantic,
const struct wined3d_shader_version *shader_version)
{
@@ -665,7 +796,7 @@ static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semanti
else
{
/* Pixel shaders 3.0 don't have usage semantics */
- if (shader_is_pshader_version(shader_version->type) && shader_version->major < 3)
+ if (shader_version->major < 3 && shader_version->type == WINED3D_SHADER_TYPE_PIXEL)
return;
else
TRACE("_");
@@ -721,15 +852,14 @@ static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semanti
}
}
-static void shader_dump_register(WINED3DSHADER_PARAM_REGISTER_TYPE register_type, UINT register_idx,
- enum wined3d_immconst_type immconst_type, const DWORD *immconst_data,
- const struct wined3d_shader_src_param *rel_addr, const struct wined3d_shader_version *shader_version)
+static void shader_dump_register(const struct wined3d_shader_register *reg,
+ const struct wined3d_shader_version *shader_version)
{
static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"};
static const char * const misctype_reg_names[] = {"vPos", "vFace"};
- UINT offset = register_idx;
+ UINT offset = reg->idx;
- switch (register_type)
+ switch (reg->type)
{
case WINED3DSPR_TEMP:
TRACE("r");
@@ -744,15 +874,15 @@ static void shader_dump_register(WINED3DSHADER_PARAM_REGISTER_TYPE register_type
case WINED3DSPR_CONST3:
case WINED3DSPR_CONST4:
TRACE("c");
- offset = shader_get_float_offset(register_type, register_idx);
+ offset = shader_get_float_offset(reg->type, reg->idx);
break;
case WINED3DSPR_TEXTURE: /* vs: case WINED3DSPR_ADDR */
- TRACE("%c", shader_is_pshader_version(shader_version->type) ? 't' : 'a');
+ TRACE("%c", shader_version->type == WINED3D_SHADER_TYPE_PIXEL ? 't' : 'a');
break;
case WINED3DSPR_RASTOUT:
- TRACE("%s", rastout_reg_names[register_idx]);
+ TRACE("%s", rastout_reg_names[reg->idx]);
break;
case WINED3DSPR_COLOROUT:
@@ -795,8 +925,8 @@ static void shader_dump_register(WINED3DSHADER_PARAM_REGISTER_TYPE register_type
break;
case WINED3DSPR_MISCTYPE:
- if (register_idx > 1) FIXME("Unhandled misctype register %d\n", register_idx);
- else TRACE("%s", misctype_reg_names[register_idx]);
+ if (reg->idx > 1) FIXME("Unhandled misctype register %d\n", reg->idx);
+ else TRACE("%s", misctype_reg_names[reg->idx]);
break;
case WINED3DSPR_PREDICATE:
@@ -807,42 +937,59 @@ static void shader_dump_register(WINED3DSHADER_PARAM_REGISTER_TYPE register_type
TRACE("l");
break;
+ case WINED3DSPR_CONSTBUFFER:
+ TRACE("cb");
+ break;
+
default:
- TRACE("unhandled_rtype(%#x)", register_type);
+ TRACE("unhandled_rtype(%#x)", reg->type);
break;
}
- if (register_type == WINED3DSPR_IMMCONST)
+ if (reg->type == WINED3DSPR_IMMCONST)
{
TRACE("(");
- switch (immconst_type)
+ switch (reg->immconst_type)
{
case WINED3D_IMMCONST_FLOAT:
- TRACE("%.8e", *(float *)immconst_data);
+ TRACE("%.8e", *(const float *)reg->immconst_data);
break;
case WINED3D_IMMCONST_FLOAT4:
TRACE("%.8e, %.8e, %.8e, %.8e",
- *(float *)&immconst_data[0], *(float *)&immconst_data[1],
- *(float *)&immconst_data[2], *(float *)&immconst_data[3]);
+ *(const float *)®->immconst_data[0], *(const float *)®->immconst_data[1],
+ *(const float *)®->immconst_data[2], *(const float *)®->immconst_data[3]);
break;
default:
- TRACE("", immconst_type);
+ TRACE("", reg->immconst_type);
break;
}
TRACE(")");
}
- else if (register_type != WINED3DSPR_RASTOUT && register_type != WINED3DSPR_MISCTYPE)
+ else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE)
{
- if (rel_addr)
+ if (reg->array_idx != ~0U)
{
- TRACE("[");
- shader_dump_src_param(rel_addr, shader_version);
- TRACE(" + ");
+ TRACE("%u[%u", offset, reg->array_idx);
+ if (reg->rel_addr)
+ {
+ TRACE(" + ");
+ shader_dump_src_param(reg->rel_addr, shader_version);
+ }
+ TRACE("]");
+ }
+ else
+ {
+ if (reg->rel_addr)
+ {
+ TRACE("[");
+ shader_dump_src_param(reg->rel_addr, shader_version);
+ TRACE(" + ");
+ }
+ TRACE("%u", offset);
+ if (reg->rel_addr) TRACE("]");
}
- TRACE("%u", offset);
- if (rel_addr) TRACE("]");
}
}
@@ -851,7 +998,7 @@ void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
{
DWORD write_mask = param->write_mask;
- shader_dump_register(param->reg.type, param->reg.idx, 0, NULL, param->reg.rel_addr, shader_version);
+ shader_dump_register(¶m->reg, shader_version);
if (write_mask != WINED3DSP_WRITEMASK_ALL)
{
@@ -885,8 +1032,7 @@ void shader_dump_src_param(const struct wined3d_shader_src_param *param,
if (src_modifier == WINED3DSPSM_ABS || src_modifier == WINED3DSPSM_ABSNEG)
TRACE("abs(");
- shader_dump_register(param->reg.type, param->reg.idx, param->reg.immconst_type,
- param->reg.immconst_data, param->reg.rel_addr, shader_version);
+ shader_dump_register(¶m->reg, shader_version);
if (src_modifier)
{
@@ -935,12 +1081,11 @@ void shader_dump_src_param(const struct wined3d_shader_src_param *param,
/* Shared code in order to generate the bulk of the shader string.
* NOTE: A description of how to parse tokens can be found on msdn */
-void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER *buffer,
- const shader_reg_maps *reg_maps, const DWORD *pFunction)
+void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer,
+ const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx)
{
IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface;
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device; /* To access shader backend callbacks */
- const SHADER_HANDLER *handler_table = device->shader_backend->shader_instruction_handler_table;
const struct wined3d_shader_frontend *fe = This->baseShader.frontend;
void *fe_data = This->baseShader.frontend_data;
struct wined3d_shader_src_param src_rel_addr[4];
@@ -951,13 +1096,13 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER *buffer,
struct wined3d_shader_instruction ins;
struct wined3d_shader_context ctx;
const DWORD *pToken = pFunction;
- SHADER_HANDLER hw_fct;
DWORD i;
/* Initialize current parsing state */
ctx.shader = iface;
ctx.reg_maps = reg_maps;
ctx.buffer = buffer;
+ ctx.backend_data = backend_ctx;
ins.ctx = &ctx;
ins.dst = &dst_param;
@@ -992,24 +1137,12 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER *buffer,
|| ins.handler_idx == WINED3DSIH_DEF
|| ins.handler_idx == WINED3DSIH_DEFI
|| ins.handler_idx == WINED3DSIH_DEFB
- || ins.handler_idx == WINED3DSIH_PHASE
- || ins.handler_idx == WINED3DSIH_RET)
+ || ins.handler_idx == WINED3DSIH_PHASE)
{
pToken += param_size;
continue;
}
- /* Select handler */
- hw_fct = handler_table[ins.handler_idx];
-
- /* Unhandled opcode */
- if (!hw_fct)
- {
- FIXME("Backend can't handle opcode %#x\n", ins.handler_idx);
- pToken += param_size;
- continue;
- }
-
/* Destination token */
if (ins.dst_count) fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr);
@@ -1023,10 +1156,7 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER *buffer,
}
/* Call appropriate function for output target */
- hw_fct(&ins);
-
- /* Process instruction modifiers for GLSL apps ( _sat, etc. ) */
- device->shader_backend->shader_add_instruction_modifiers(&ins);
+ device->shader_backend->shader_handle_instruction(&ins);
}
}
@@ -1059,14 +1189,34 @@ void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data,
{
struct wined3d_shader_version shader_version;
const DWORD* pToken = pFunction;
+ const char *type_prefix;
DWORD i;
TRACE("Parsing %p\n", pFunction);
fe->shader_read_header(fe_data, &pToken, &shader_version);
- TRACE("%s_%u_%u\n", shader_is_pshader_version(shader_version.type) ? "ps": "vs",
- shader_version.major, shader_version.minor);
+ switch (shader_version.type)
+ {
+ case WINED3D_SHADER_TYPE_VERTEX:
+ type_prefix = "vs";
+ break;
+
+ case WINED3D_SHADER_TYPE_GEOMETRY:
+ type_prefix = "gs";
+ break;
+
+ case WINED3D_SHADER_TYPE_PIXEL:
+ type_prefix = "ps";
+ break;
+
+ default:
+ FIXME("Unhandled shader type %#x.\n", shader_version.type);
+ type_prefix = "unknown";
+ break;
+ }
+
+ TRACE("%s_%u_%u\n", type_prefix, shader_version.major, shader_version.minor);
while (!fe->shader_is_end(fe_data, &pToken))
{
@@ -1224,39 +1374,27 @@ void shader_cleanup(IWineD3DBaseShader *iface)
}
}
-static const SHADER_HANDLER shader_none_instruction_handler_table[WINED3DSIH_TABLE_SIZE] = {0};
-static void shader_none_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) {}
+static void shader_none_handle_instruction(const struct wined3d_shader_instruction *ins) {}
+static void shader_none_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS) {}
static void shader_none_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {}
static void shader_none_deselect_depth_blt(IWineD3DDevice *iface) {}
static void shader_none_update_float_vertex_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
static void shader_none_update_float_pixel_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
-static void shader_none_load_constants(IWineD3DDevice *iface, char usePS, char useVS) {}
+static void shader_none_load_constants(const struct wined3d_context *context, char usePS, char useVS) {}
static void shader_none_load_np2fixup_constants(IWineD3DDevice *iface, char usePS, char useVS) {}
static void shader_none_destroy(IWineD3DBaseShader *iface) {}
static HRESULT shader_none_alloc(IWineD3DDevice *iface) {return WINED3D_OK;}
static void shader_none_free(IWineD3DDevice *iface) {}
static BOOL shader_none_dirty_const(IWineD3DDevice *iface) {return FALSE;}
-static GLuint shader_none_generate_pshader(IWineD3DPixelShader *iface,
- SHADER_BUFFER *buffer, const struct ps_compile_args *args)
-{
- FIXME("NONE shader backend asked to generate a pixel shader\n");
- return 0;
-}
-static GLuint shader_none_generate_vshader(IWineD3DVertexShader *iface,
- SHADER_BUFFER *buffer, const struct vs_compile_args *args)
-{
- FIXME("NONE shader backend asked to generate a vertex shader\n");
- return 0;
-}
-static void shader_none_add_instruction_modifiers(const struct wined3d_shader_instruction *ins) {}
#define GLINFO_LOCATION (*gl_info)
-static void shader_none_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_info, struct shader_caps *pCaps)
+static void shader_none_get_caps(WINED3DDEVTYPE devtype,
+ const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
{
/* Set the shader caps to 0 for the none shader backend */
pCaps->VertexShaderVersion = 0;
pCaps->PixelShaderVersion = 0;
- pCaps->PixelShader1xMaxValue = 0.0;
+ pCaps->PixelShader1xMaxValue = 0.0f;
}
#undef GLINFO_LOCATION
static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
@@ -1279,7 +1417,7 @@ static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
}
const shader_backend_t none_shader_backend = {
- shader_none_instruction_handler_table,
+ shader_none_handle_instruction,
shader_none_select,
shader_none_select_depth_blt,
shader_none_deselect_depth_blt,
@@ -1291,9 +1429,6 @@ const shader_backend_t none_shader_backend = {
shader_none_alloc,
shader_none_free,
shader_none_dirty_const,
- shader_none_generate_pshader,
- shader_none_generate_vshader,
shader_none_get_caps,
shader_none_color_fixup_supported,
- shader_none_add_instruction_modifiers,
};
diff --git a/reactos/dll/directx/wine/wined3d/basetexture.c b/reactos/dll/directx/wine/wined3d/basetexture.c
index caf2148ba55..ab38b625aae 100644
--- a/reactos/dll/directx/wine/wined3d/basetexture.c
+++ b/reactos/dll/directx/wine/wined3d/basetexture.c
@@ -27,32 +27,44 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
#define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
-void basetexture_init(struct IWineD3DBaseTextureClass *texture, UINT levels, DWORD usage)
+HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DRESOURCETYPE resource_type,
+ IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
+ WINED3DPOOL pool, IUnknown *parent)
{
- texture->levels = levels;
- texture->filterType = (usage & WINED3DUSAGE_AUTOGENMIPMAP) ? WINED3DTEXF_LINEAR : WINED3DTEXF_NONE;
- texture->LOD = 0;
- texture->dirty = TRUE;
- texture->srgbDirty = TRUE;
- texture->is_srgb = FALSE;
- texture->pow2Matrix_identity = TRUE;
+ HRESULT hr;
+
+ hr = resource_init((IWineD3DResource *)texture, resource_type, device, size, usage, format_desc, pool, parent);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize resource, returning %#x\n", hr);
+ return hr;
+ }
+
+ texture->baseTexture.levels = levels;
+ texture->baseTexture.filterType = (usage & WINED3DUSAGE_AUTOGENMIPMAP) ? WINED3DTEXF_LINEAR : WINED3DTEXF_NONE;
+ texture->baseTexture.LOD = 0;
+ texture->baseTexture.dirty = TRUE;
+ texture->baseTexture.srgbDirty = TRUE;
+ texture->baseTexture.is_srgb = FALSE;
+ texture->baseTexture.pow2Matrix_identity = TRUE;
+
+ if (texture->resource.format_desc->Flags & WINED3DFMT_FLAG_FILTERING)
+ {
+ texture->baseTexture.minMipLookup = minMipLookup;
+ texture->baseTexture.magLookup = magLookup;
+ }
+ else
+ {
+ texture->baseTexture.minMipLookup = minMipLookup_noFilter;
+ texture->baseTexture.magLookup = magLookup_noFilter;
+ }
+
+ return WINED3D_OK;
}
void basetexture_cleanup(IWineD3DBaseTexture *iface)
{
- IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface;
- IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
-
- TRACE("(%p) : textureName(%d)\n", This, This->baseTexture.textureName);
- if (This->baseTexture.textureName != 0) {
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
- ENTER_GL();
- TRACE("(%p) : Deleting texture %d\n", This, This->baseTexture.textureName);
- glDeleteTextures(1, &This->baseTexture.textureName);
- glDeleteTextures(1, &This->baseTexture.srgbTextureName);
- LEAVE_GL();
- }
-
+ basetexture_unload(iface);
resource_cleanup((IWineD3DResource *)iface);
}
@@ -62,11 +74,17 @@ void basetexture_unload(IWineD3DBaseTexture *iface)
IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
if(This->baseTexture.textureName) {
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
glDeleteTextures(1, &This->baseTexture.textureName);
- glDeleteTextures(1, &This->baseTexture.srgbTextureName);
This->baseTexture.textureName = 0;
+ LEAVE_GL();
+ }
+
+ if(This->baseTexture.srgbTextureName) {
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
+ ENTER_GL();
+ glDeleteTextures(1, &This->baseTexture.srgbTextureName);
This->baseTexture.srgbTextureName = 0;
LEAVE_GL();
}
@@ -74,33 +92,41 @@ void basetexture_unload(IWineD3DBaseTexture *iface)
This->baseTexture.srgbDirty = TRUE;
}
-/* There is no OpenGL equivalent of setLOD, getLOD. All they do anyway is prioritize texture loading
- * so just pretend that they work unless something really needs a failure. */
DWORD basetexture_set_lod(IWineD3DBaseTexture *iface, DWORD LODNew)
{
IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface;
+ DWORD old = This->baseTexture.LOD;
+ /* The d3d9:texture test shows that SetLOD is ignored on non-managed
+ * textures. The call always returns 0, and GetLOD always returns 0
+ */
if (This->resource.pool != WINED3DPOOL_MANAGED) {
- return WINED3DERR_INVALIDCALL;
+ TRACE("Ignoring SetLOD on %s texture, returning 0\n", debug_d3dpool(This->resource.pool));
+ return 0;
}
if(LODNew >= This->baseTexture.levels)
LODNew = This->baseTexture.levels - 1;
- This->baseTexture.LOD = LODNew;
- TRACE("(%p) : set bogus LOD to %d\n", This, This->baseTexture.LOD);
+ if(This->baseTexture.LOD != LODNew) {
+ This->baseTexture.LOD = LODNew;
- return This->baseTexture.LOD;
+ This->baseTexture.states[WINED3DTEXSTA_MAXMIPLEVEL] = ~0U;
+ This->baseTexture.srgbstates[WINED3DTEXSTA_MAXMIPLEVEL] = ~0U;
+ if(This->baseTexture.bindCount) {
+ IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_SAMPLER(This->baseTexture.sampler));
+ }
+ }
+
+ TRACE("(%p) : set LOD to %d\n", This, This->baseTexture.LOD);
+
+ return old;
}
DWORD basetexture_get_lod(IWineD3DBaseTexture *iface)
{
IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface;
- if (This->resource.pool != WINED3DPOOL_MANAGED) {
- return WINED3DERR_INVALIDCALL;
- }
-
TRACE("(%p) : returning %d\n", This, This->baseTexture.LOD);
return This->baseTexture.LOD;
@@ -128,7 +154,7 @@ HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DT
* Or should we delay the applying until the texture is used for drawing? For now, apply
* immediately.
*/
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
glBindTexture(textureDimensions, This->baseTexture.textureName);
checkGLcall("glBindTexture");
@@ -158,12 +184,11 @@ HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DT
WINED3DTEXTUREFILTERTYPE basetexture_get_autogen_filter_type(IWineD3DBaseTexture *iface)
{
- IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface;
- FIXME("(%p) : stub\n", This);
- if (!(This->resource.usage & WINED3DUSAGE_AUTOGENMIPMAP)) {
- return WINED3DTEXF_NONE;
- }
- return This->baseTexture.filterType;
+ IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface;
+
+ FIXME("(%p) : stub\n", This);
+
+ return This->baseTexture.filterType;
}
void basetexture_generate_mipmaps(IWineD3DBaseTexture *iface)
@@ -190,6 +215,7 @@ BOOL basetexture_get_dirty(IWineD3DBaseTexture *iface)
return This->baseTexture.dirty || This->baseTexture.srgbDirty;
}
+/* Context activation is done by the caller. */
HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surface_desc)
{
IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface;
@@ -234,7 +260,7 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac
states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; /* GL_NEAREST_MIPMAP_LINEAR */
states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_LINEAR; /* GL_NEAREST_MIPMAP_LINEAR */
states[WINED3DTEXSTA_MAXMIPLEVEL] = 0;
- states[WINED3DTEXSTA_MAXANISOTROPY] = 0;
+ states[WINED3DTEXSTA_MAXANISOTROPY] = 1;
states[WINED3DTEXSTA_SRGBTEXTURE] = 0;
states[WINED3DTEXSTA_ELEMENTINDEX] = 0;
states[WINED3DTEXSTA_DMAPOFFSET] = 0;
@@ -288,6 +314,7 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac
return hr;
}
+/* GL locking is done by the caller */
static inline void apply_wrap(const GLint textureDimensions, const DWORD state, const GLint type,
BOOL cond_np2) {
GLint wrapParm;
@@ -313,6 +340,7 @@ static inline void apply_wrap(const GLint textureDimensions, const DWORD state,
}
}
+/* GL locking is done by the caller (state handler) */
void basetexture_apply_state_changes(IWineD3DBaseTexture *iface,
const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1],
const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1])
@@ -321,6 +349,9 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface,
DWORD state, *states;
GLint textureDimensions = IWineD3DBaseTexture_GetTextureDimensions(iface);
BOOL cond_np2 = IWineD3DBaseTexture_IsCondNP2(iface);
+ DWORD aniso;
+
+ TRACE("iface %p, textureStates %p, samplerStates %p\n", iface, textureStates, samplerStates);
if(This->baseTexture.is_srgb) {
states = This->baseTexture.srgbstates;
@@ -328,7 +359,7 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface,
states = This->baseTexture.states;
}
- /* ApplyStateChanges relies on the correct texture being bound and loaded. */
+ /* This function relies on the correct texture being bound and loaded. */
if(samplerStates[WINED3DSAMP_ADDRESSU] != states[WINED3DTEXSTA_ADDRESSU]) {
state = samplerStates[WINED3DSAMP_ADDRESSU];
@@ -364,17 +395,14 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface,
state = samplerStates[WINED3DSAMP_MAGFILTER];
if (state > WINED3DTEXF_ANISOTROPIC) {
FIXME("Unrecognized or unsupported MAGFILTER* value %d\n", state);
- } else {
- glValue = This->baseTexture.magLookup[state - WINED3DTEXF_NONE];
- TRACE("ValueMAG=%d setting MAGFILTER to %x\n", state, glValue);
- glTexParameteri(textureDimensions, GL_TEXTURE_MAG_FILTER, glValue);
- /* We need to reset the Anisotropic filtering state when we change the mag filter to WINED3DTEXF_ANISOTROPIC (this seems a bit weird, check the documentation to see how it should be switched off. */
- if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC) && WINED3DTEXF_ANISOTROPIC == state &&
- !cond_np2) {
- glTexParameteri(textureDimensions, GL_TEXTURE_MAX_ANISOTROPY_EXT, samplerStates[WINED3DSAMP_MAXANISOTROPY]);
- }
- states[WINED3DTEXSTA_MAGFILTER] = state;
}
+
+ glValue = wined3d_gl_mag_filter(This->baseTexture.magLookup,
+ min(max(state, WINED3DTEXF_POINT), WINED3DTEXF_LINEAR));
+ TRACE("ValueMAG=%d setting MAGFILTER to %x\n", state, glValue);
+ glTexParameteri(textureDimensions, GL_TEXTURE_MAG_FILTER, glValue);
+
+ states[WINED3DTEXSTA_MAGFILTER] = state;
}
if((samplerStates[WINED3DSAMP_MINFILTER] != states[WINED3DTEXSTA_MINFILTER] ||
@@ -386,17 +414,17 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface,
states[WINED3DTEXSTA_MINFILTER] = samplerStates[WINED3DSAMP_MINFILTER];
states[WINED3DTEXSTA_MAXMIPLEVEL] = samplerStates[WINED3DSAMP_MAXMIPLEVEL];
- if (states[WINED3DTEXSTA_MINFILTER] > WINED3DTEXF_ANISOTROPIC ||
- states[WINED3DTEXSTA_MIPFILTER] > WINED3DTEXF_LINEAR)
+ if (states[WINED3DTEXSTA_MINFILTER] > WINED3DTEXF_ANISOTROPIC
+ || states[WINED3DTEXSTA_MIPFILTER] > WINED3DTEXF_ANISOTROPIC)
{
FIXME("Unrecognized or unsupported D3DSAMP_MINFILTER value %d D3DSAMP_MIPFILTER value %d\n",
states[WINED3DTEXSTA_MINFILTER],
states[WINED3DTEXSTA_MIPFILTER]);
}
- glValue = This->baseTexture.minMipLookup
- [min(max(samplerStates[WINED3DSAMP_MINFILTER],WINED3DTEXF_NONE), WINED3DTEXF_ANISOTROPIC)]
- .mip[min(max(samplerStates[WINED3DSAMP_MIPFILTER],WINED3DTEXF_NONE), WINED3DTEXF_LINEAR)];
+ glValue = wined3d_gl_min_mip_filter(This->baseTexture.minMipLookup,
+ min(max(samplerStates[WINED3DSAMP_MINFILTER], WINED3DTEXF_POINT), WINED3DTEXF_LINEAR),
+ min(max(samplerStates[WINED3DSAMP_MIPFILTER], WINED3DTEXF_NONE), WINED3DTEXF_LINEAR));
TRACE("ValueMIN=%d, ValueMIP=%d, setting MINFILTER to %x\n",
samplerStates[WINED3DSAMP_MINFILTER],
@@ -406,23 +434,46 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface,
if(!cond_np2) {
if(states[WINED3DTEXSTA_MIPFILTER] == WINED3DTEXF_NONE) {
- glValue = 0;
+ glValue = This->baseTexture.LOD;
} else if(states[WINED3DTEXSTA_MAXMIPLEVEL] >= This->baseTexture.levels) {
glValue = This->baseTexture.levels - 1;
+ } else if(states[WINED3DTEXSTA_MAXMIPLEVEL] < This->baseTexture.LOD) {
+ /* baseTexture.LOD is already clamped in the setter */
+ glValue = This->baseTexture.LOD;
} else {
glValue = states[WINED3DTEXSTA_MAXMIPLEVEL];
}
+ /* Note that D3DSAMP_MAXMIPLEVEL specifies the biggest mipmap(default 0), while
+ * GL_TEXTURE_MAX_LEVEL specifies the smallest mimap used(default 1000).
+ * So D3DSAMP_MAXMIPLEVEL is the same as GL_TEXTURE_BASE_LEVEL.
+ */
glTexParameteri(textureDimensions, GL_TEXTURE_BASE_LEVEL, glValue);
}
}
- if(samplerStates[WINED3DSAMP_MAXANISOTROPY] != states[WINED3DTEXSTA_MAXANISOTROPY]) {
- if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC) && !cond_np2) {
- glTexParameteri(textureDimensions, GL_TEXTURE_MAX_ANISOTROPY_EXT, samplerStates[WINED3DSAMP_MAXANISOTROPY]);
- checkGLcall("glTexParameteri GL_TEXTURE_MAX_ANISOTROPY_EXT ...");
- } else {
- WARN("Unsupported in local OpenGL implementation: glTexParameteri GL_TEXTURE_MAX_ANISOTROPY_EXT\n");
+ if ((states[WINED3DSAMP_MAGFILTER] != WINED3DTEXF_ANISOTROPIC
+ && states[WINED3DSAMP_MINFILTER] != WINED3DTEXF_ANISOTROPIC
+ && states[WINED3DSAMP_MIPFILTER] != WINED3DTEXF_ANISOTROPIC)
+ || cond_np2)
+ {
+ aniso = 1;
+ }
+ else
+ {
+ aniso = samplerStates[WINED3DSAMP_MAXANISOTROPY];
+ }
+
+ if (states[WINED3DTEXSTA_MAXANISOTROPY] != aniso)
+ {
+ if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC))
+ {
+ glTexParameteri(textureDimensions, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
+ checkGLcall("glTexParameteri(GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso)");
}
- states[WINED3DTEXSTA_MAXANISOTROPY] = samplerStates[WINED3DSAMP_MAXANISOTROPY];
+ else
+ {
+ WARN("Anisotropic filtering not supported.\n");
+ }
+ states[WINED3DTEXSTA_MAXANISOTROPY] = aniso;
}
}
diff --git a/reactos/dll/directx/wine/wined3d/buffer.c b/reactos/dll/directx/wine/wined3d/buffer.c
index 666de8eadc1..104f572106d 100644
--- a/reactos/dll/directx/wine/wined3d/buffer.c
+++ b/reactos/dll/directx/wine/wined3d/buffer.c
@@ -34,16 +34,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
#define VB_MAXDECLCHANGES 100 /* After that number we stop converting */
#define VB_RESETDECLCHANGE 1000 /* Reset the changecount after that number of draws */
+/* Context activation is done by the caller. */
static void buffer_create_buffer_object(struct wined3d_buffer *This)
{
GLenum error, gl_usage;
- IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
TRACE("Creating an OpenGL vertex buffer object for IWineD3DVertexBuffer %p Usage(%s)\n",
This, debug_d3dusage(This->resource.usage));
- /* Make sure that a context is there. Needed in a multithreaded environment. Otherwise this call is a nop */
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
/* Make sure that the gl error is cleared. Do not use checkGLcall
@@ -200,17 +198,20 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
return ret;
}
-static BOOL buffer_check_attribute(struct wined3d_buffer *This,
- const struct wined3d_stream_info_element *attrib, const BOOL check_d3dcolor, const BOOL is_ffp_position,
- const BOOL is_ffp_color, DWORD *stride_this_run, BOOL *float16_used)
+static BOOL buffer_check_attribute(struct wined3d_buffer *This, const struct wined3d_stream_info *si,
+ UINT attrib_idx, const BOOL check_d3dcolor, const BOOL is_ffp_position, const BOOL is_ffp_color,
+ DWORD *stride_this_run, BOOL *float16_used)
{
+ const struct wined3d_stream_info_element *attrib = &si->elements[attrib_idx];
BOOL ret = FALSE;
WINED3DFORMAT format;
/* Ignore attributes that do not have our vbo. After that check we can be sure that the attribute is
* there, on nonexistent attribs the vbo is 0.
*/
- if (attrib->buffer_object != This->buffer_object) return FALSE;
+ if (!(si->use_map & (1 << attrib_idx))
+ || attrib->buffer_object != This->buffer_object)
+ return FALSE;
format = attrib->format_desc->format;
/* Look for newly appeared conversion */
@@ -257,7 +258,7 @@ static UINT *find_conversion_shift(struct wined3d_buffer *This,
{
WINED3DFORMAT format;
- if (strided->elements[i].buffer_object != This->buffer_object) continue;
+ if (!(strided->use_map & (1 << i)) || strided->elements[i].buffer_object != This->buffer_object) continue;
format = strided->elements[i].format_desc->format;
if (format == WINED3DFMT_R16G16_FLOAT)
@@ -308,6 +309,7 @@ static UINT *find_conversion_shift(struct wined3d_buffer *This,
static BOOL buffer_find_decl(struct wined3d_buffer *This)
{
IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+ const struct wined3d_stream_info *si = &device->strided_streams;
UINT stride_this_run = 0;
BOOL float16_used = FALSE;
BOOL ret = FALSE;
@@ -395,8 +397,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This)
}
for (i = 0; i < MAX_ATTRIBS; ++i)
{
- ret = buffer_check_attribute(This, &device->strided_streams.elements[i],
- FALSE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
+ ret = buffer_check_attribute(This, si, i, FALSE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
}
/* Recalculate the conversion shift map if the declaration has changed,
@@ -405,7 +406,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This)
if (ret && (float16_used || This->conversion_map))
{
HeapFree(GetProcessHeap(), 0, This->conversion_shift);
- This->conversion_shift = find_conversion_shift(This, &device->strided_streams, This->stride);
+ This->conversion_shift = find_conversion_shift(This, si, This->stride);
}
}
else
@@ -415,29 +416,29 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This)
* the attributes that our current fixed function pipeline implementation cares for.
*/
BOOL support_d3dcolor = GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA);
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_POSITION],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_POSITION,
TRUE, TRUE, FALSE, &stride_this_run, &float16_used) || ret;
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_NORMAL],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_NORMAL,
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_DIFFUSE],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_DIFFUSE,
!support_d3dcolor, FALSE, TRUE, &stride_this_run, &float16_used) || ret;
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_SPECULAR],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_SPECULAR,
!support_d3dcolor, FALSE, TRUE, &stride_this_run, &float16_used) || ret;
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD0],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD0,
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD1],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD1,
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD2],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD2,
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD3],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD3,
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD4],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD4,
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD5],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD5,
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD6],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD6,
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
- ret = buffer_check_attribute(This, &device->strided_streams.elements[WINED3D_FFP_TEXCOORD7],
+ ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD7,
TRUE, FALSE, FALSE, &stride_this_run, &float16_used) || ret;
if (float16_used) FIXME("Float16 conversion used with fixed function vertex processing\n");
@@ -457,6 +458,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This)
return ret;
}
+/* Context activation is done by the caller. */
static void buffer_check_buffer_object_size(struct wined3d_buffer *This)
{
UINT size = This->conversion_stride ?
@@ -506,29 +508,18 @@ static inline void fixup_d3dcolor(DWORD *dst_color)
static inline void fixup_transformed_pos(float *p)
{
- float x, y, z, w;
-
- /* rhw conversion like in drawStridedSlow */
- if (p[3] == 1.0 || ((p[3] < eps) && (p[3] > -eps)))
+ /* rhw conversion like in position_float4(). */
+ if (p[3] != 1.0f && p[3] != 0.0f)
{
- x = p[0];
- y = p[1];
- z = p[2];
- w = 1.0;
+ float w = 1.0f / p[3];
+ p[0] *= w;
+ p[1] *= w;
+ p[2] *= w;
+ p[3] = w;
}
- else
- {
- w = 1.0 / p[3];
- x = p[0] * w;
- y = p[1] * w;
- z = p[2] * w;
- }
- p[0] = x;
- p[1] = y;
- p[2] = z;
- p[3] = w;
}
+/* Context activation is done by the caller. */
const BYTE *buffer_get_memory(IWineD3DBuffer *iface, UINT offset, GLuint *buffer_object)
{
struct wined3d_buffer *This = (struct wined3d_buffer *)iface;
@@ -588,7 +579,8 @@ static ULONG STDMETHODCALLTYPE buffer_AddRef(IWineD3DBuffer *iface)
return refcount;
}
-const BYTE *buffer_get_sysmem(struct wined3d_buffer *This)
+/* Context activation is done by the caller. */
+BYTE *buffer_get_sysmem(struct wined3d_buffer *This)
{
/* AllocatedMemory exists if the buffer is double buffered or has no buffer object at all */
if(This->resource.allocatedMemory) return This->resource.allocatedMemory;
@@ -614,7 +606,7 @@ static void STDMETHODCALLTYPE buffer_UnLoad(IWineD3DBuffer *iface)
{
IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
/* Download the buffer, but don't permanently enable double buffering */
if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER))
@@ -701,6 +693,8 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
TRACE("iface %p\n", iface);
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
+
if (!This->buffer_object)
{
/* TODO: Make converting independent from VBOs */
@@ -736,7 +730,7 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
if (This->conversion_count > VB_MAXDECLCHANGES)
{
FIXME("Too many declaration changes, stopping converting\n");
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+
ENTER_GL();
GL_EXTCALL(glDeleteBuffersARB(1, &This->buffer_object));
checkGLcall("glDeleteBuffersARB");
@@ -809,7 +803,7 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
if (!device->isInDraw)
{
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
}
ENTER_GL();
GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
@@ -959,7 +953,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_INDEXBUFFER);
}
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB));
@@ -985,6 +979,16 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface)
TRACE("(%p)\n", This);
+ /* In the case that the number of Unmap calls > the
+ * number of Map calls, d3d returns always D3D_OK.
+ * This is also needed to prevent Map from returning garbage on
+ * the next call (this will happen if the lock_count is < 0). */
+ if(This->lock_count == 0)
+ {
+ TRACE("Unmap called without a previous Map call!\n");
+ return WINED3D_OK;
+ }
+
if (InterlockedDecrement(&This->lock_count))
{
/* Delay loading the buffer until everything is unlocked */
@@ -1001,7 +1005,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface)
IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_INDEXBUFFER);
}
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
GL_EXTCALL(glUnmapBufferARB(This->buffer_type_hint));
diff --git a/reactos/dll/directx/wine/wined3d/context.c b/reactos/dll/directx/wine/wined3d/context.c
index 2c6703f3603..c4cd43659f5 100644
--- a/reactos/dll/directx/wine/wined3d/context.c
+++ b/reactos/dll/directx/wine/wined3d/context.c
@@ -2,6 +2,7 @@
* Context and render target management in wined3d
*
* Copyright 2007-2008 Stefan Dösinger for CodeWeavers
+ * Copyright 2009 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
@@ -27,38 +28,66 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION This->adapter->gl_info
+#define GLINFO_LOCATION (*gl_info)
-/* The last used device.
- *
- * If the application creates multiple devices and switches between them, ActivateContext has to
- * change the opengl context. This flag allows to keep track which device is active
- */
-static IWineD3DDeviceImpl *last_device;
+static DWORD wined3d_context_tls_idx;
/* FBO helper functions */
-void context_bind_fbo(IWineD3DDevice *iface, GLenum target, GLuint *fbo)
+/* GL locking is done by the caller */
+void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fbo)
{
- const IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ GLuint f;
- if (!*fbo)
+ if (!fbo)
{
- GL_EXTCALL(glGenFramebuffersEXT(1, fbo));
- checkGLcall("glGenFramebuffersEXT()");
- TRACE("Created FBO %d\n", *fbo);
+ f = 0;
+ }
+ else
+ {
+ if (!*fbo)
+ {
+ GL_EXTCALL(glGenFramebuffersEXT(1, fbo));
+ checkGLcall("glGenFramebuffersEXT()");
+ TRACE("Created FBO %u.\n", *fbo);
+ }
+ f = *fbo;
}
- GL_EXTCALL(glBindFramebufferEXT(target, *fbo));
+ switch (target)
+ {
+ case GL_READ_FRAMEBUFFER_EXT:
+ if (context->fbo_read_binding == f) return;
+ context->fbo_read_binding = f;
+ break;
+
+ case GL_DRAW_FRAMEBUFFER_EXT:
+ if (context->fbo_draw_binding == f) return;
+ context->fbo_draw_binding = f;
+ break;
+
+ case GL_FRAMEBUFFER_EXT:
+ if (context->fbo_read_binding == f
+ && context->fbo_draw_binding == f) return;
+ context->fbo_read_binding = f;
+ context->fbo_draw_binding = f;
+ break;
+
+ default:
+ FIXME("Unhandled target %#x.\n", target);
+ break;
+ }
+
+ GL_EXTCALL(glBindFramebufferEXT(target, f));
checkGLcall("glBindFramebuffer()");
}
-static void context_destroy_fbo(IWineD3DDeviceImpl *This, const GLuint *fbo)
+/* GL locking is done by the caller */
+static void context_clean_fbo_attachments(const struct wined3d_gl_info *gl_info)
{
unsigned int i;
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, *fbo));
- checkGLcall("glBindFramebuffer()");
for (i = 0; i < GL_LIMITS(buffers); ++i)
{
GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i, GL_TEXTURE_2D, 0, 0));
@@ -66,16 +95,29 @@ static void context_destroy_fbo(IWineD3DDeviceImpl *This, const GLuint *fbo)
}
GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0));
checkGLcall("glFramebufferTexture2D()");
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glBindFramebuffer()");
+
+ GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0));
+ checkGLcall("glFramebufferTexture2D()");
+}
+
+/* GL locking is done by the caller */
+static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo)
+{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, fbo);
+ context_clean_fbo_attachments(gl_info);
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL);
+
GL_EXTCALL(glDeleteFramebuffersEXT(1, fbo));
checkGLcall("glDeleteFramebuffers()");
}
-static void context_apply_attachment_filter_states(IWineD3DDevice *iface, IWineD3DSurface *surface, BOOL force_preload)
+/* GL locking is done by the caller */
+static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOOL force_preload)
{
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
+ IWineD3DDeviceImpl *device = surface_impl->resource.wineD3DDevice;
IWineD3DBaseTextureImpl *texture_impl;
BOOL update_minfilter = FALSE;
BOOL update_magfilter = FALSE;
@@ -100,7 +142,7 @@ static void context_apply_attachment_filter_states(IWineD3DDevice *iface, IWineD
if (texture_impl->baseTexture.bindCount)
{
WARN("Render targets should not be bound to a sampler\n");
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SAMPLER(texture_impl->baseTexture.sampler));
+ IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(texture_impl->baseTexture.sampler));
}
IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl);
@@ -111,7 +153,7 @@ static void context_apply_attachment_filter_states(IWineD3DDevice *iface, IWineD
GLenum target, bind_target;
GLint old_binding;
- target = surface_impl->glDescription.target;
+ target = surface_impl->texture_target;
if (target == GL_TEXTURE_2D)
{
bind_target = GL_TEXTURE_2D;
@@ -126,7 +168,7 @@ static void context_apply_attachment_filter_states(IWineD3DDevice *iface, IWineD
surface_internal_preload(surface, SRGB_RGB);
- glBindTexture(bind_target, surface_impl->glDescription.textureName);
+ glBindTexture(bind_target, surface_impl->texture_name);
if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glBindTexture(bind_target, old_binding);
@@ -135,44 +177,93 @@ static void context_apply_attachment_filter_states(IWineD3DDevice *iface, IWineD
checkGLcall("apply_attachment_filter_states()");
}
-/* TODO: Handle stencil attachments */
-void context_attach_depth_stencil_fbo(IWineD3DDeviceImpl *This, GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer)
+/* GL locking is done by the caller */
+void context_attach_depth_stencil_fbo(struct wined3d_context *context,
+ GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer)
{
IWineD3DSurfaceImpl *depth_stencil_impl = (IWineD3DSurfaceImpl *)depth_stencil;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
TRACE("Attach depth stencil %p\n", depth_stencil);
if (depth_stencil)
{
+ DWORD format_flags = depth_stencil_impl->resource.format_desc->Flags;
+
if (use_render_buffer && depth_stencil_impl->current_renderbuffer)
{
- GL_EXTCALL(glFramebufferRenderbufferEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_stencil_impl->current_renderbuffer->id));
- checkGLcall("glFramebufferRenderbufferEXT()");
- } else {
- context_apply_attachment_filter_states((IWineD3DDevice *)This, depth_stencil, TRUE);
+ if (format_flags & WINED3DFMT_FLAG_DEPTH)
+ {
+ GL_EXTCALL(glFramebufferRenderbufferEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, depth_stencil_impl->current_renderbuffer->id));
+ checkGLcall("glFramebufferRenderbufferEXT()");
+ }
- GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, depth_stencil_impl->glDescription.target,
- depth_stencil_impl->glDescription.textureName, depth_stencil_impl->glDescription.level));
+ if (format_flags & WINED3DFMT_FLAG_STENCIL)
+ {
+ GL_EXTCALL(glFramebufferRenderbufferEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, depth_stencil_impl->current_renderbuffer->id));
+ checkGLcall("glFramebufferRenderbufferEXT()");
+ }
+ }
+ else
+ {
+ context_apply_attachment_filter_states(depth_stencil, TRUE);
+
+ if (format_flags & WINED3DFMT_FLAG_DEPTH)
+ {
+ GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT,
+ depth_stencil_impl->texture_target, depth_stencil_impl->texture_name,
+ depth_stencil_impl->texture_level));
+ checkGLcall("glFramebufferTexture2DEXT()");
+ }
+
+ if (format_flags & WINED3DFMT_FLAG_STENCIL)
+ {
+ GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT,
+ depth_stencil_impl->texture_target, depth_stencil_impl->texture_name,
+ depth_stencil_impl->texture_level));
+ checkGLcall("glFramebufferTexture2DEXT()");
+ }
+ }
+
+ if (!(format_flags & WINED3DFMT_FLAG_DEPTH))
+ {
+ GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0));
checkGLcall("glFramebufferTexture2DEXT()");
}
- } else {
+
+ if (!(format_flags & WINED3DFMT_FLAG_STENCIL))
+ {
+ GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0));
+ checkGLcall("glFramebufferTexture2DEXT()");
+ }
+ }
+ else
+ {
GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0));
checkGLcall("glFramebufferTexture2DEXT()");
+
+ GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0));
+ checkGLcall("glFramebufferTexture2DEXT()");
}
}
-void context_attach_surface_fbo(IWineD3DDeviceImpl *This, GLenum fbo_target, DWORD idx, IWineD3DSurface *surface)
+/* GL locking is done by the caller */
+void context_attach_surface_fbo(const struct wined3d_context *context,
+ GLenum fbo_target, DWORD idx, IWineD3DSurface *surface)
{
const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
TRACE("Attach surface %p to %u\n", surface, idx);
if (surface)
{
- context_apply_attachment_filter_states((IWineD3DDevice *)This, surface, TRUE);
+ context_apply_attachment_filter_states(surface, TRUE);
- GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_COLOR_ATTACHMENT0_EXT + idx, surface_impl->glDescription.target,
- surface_impl->glDescription.textureName, surface_impl->glDescription.level));
+ GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_COLOR_ATTACHMENT0_EXT + idx, surface_impl->texture_target,
+ surface_impl->texture_name, surface_impl->texture_level));
checkGLcall("glFramebufferTexture2DEXT()");
} else {
GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_COLOR_ATTACHMENT0_EXT + idx, GL_TEXTURE_2D, 0, 0));
@@ -180,9 +271,10 @@ void context_attach_surface_fbo(IWineD3DDeviceImpl *This, GLenum fbo_target, DWO
}
}
-static void context_check_fbo_status(IWineD3DDevice *iface)
+/* GL locking is done by the caller */
+static void context_check_fbo_status(struct wined3d_context *context)
{
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
GLenum status;
status = GL_EXTCALL(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT));
@@ -197,7 +289,7 @@ static void context_check_fbo_status(IWineD3DDevice *iface)
/* Dump the FBO attachments */
for (i = 0; i < GL_LIMITS(buffers); ++i)
{
- attachment = (IWineD3DSurfaceImpl *)This->activeContext->current_fbo->render_targets[i];
+ attachment = (IWineD3DSurfaceImpl *)context->current_fbo->render_targets[i];
if (attachment)
{
FIXME("\tColor attachment %d: (%p) %s %ux%u\n",
@@ -205,7 +297,7 @@ static void context_check_fbo_status(IWineD3DDevice *iface)
attachment->pow2Width, attachment->pow2Height);
}
}
- attachment = (IWineD3DSurfaceImpl *)This->activeContext->current_fbo->depth_stencil;
+ attachment = (IWineD3DSurfaceImpl *)context->current_fbo->depth_stencil;
if (attachment)
{
FIXME("\tDepth attachment: (%p) %s %ux%u\n",
@@ -215,113 +307,270 @@ static void context_check_fbo_status(IWineD3DDevice *iface)
}
}
-static struct fbo_entry *context_create_fbo_entry(IWineD3DDevice *iface)
+static struct fbo_entry *context_create_fbo_entry(struct wined3d_context *context)
{
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
struct fbo_entry *entry;
entry = HeapAlloc(GetProcessHeap(), 0, sizeof(*entry));
entry->render_targets = HeapAlloc(GetProcessHeap(), 0, GL_LIMITS(buffers) * sizeof(*entry->render_targets));
- memcpy(entry->render_targets, This->render_targets, GL_LIMITS(buffers) * sizeof(*entry->render_targets));
- entry->depth_stencil = This->stencilBufferTarget;
+ memcpy(entry->render_targets, device->render_targets, GL_LIMITS(buffers) * sizeof(*entry->render_targets));
+ entry->depth_stencil = device->stencilBufferTarget;
entry->attached = FALSE;
entry->id = 0;
return entry;
}
-static void context_destroy_fbo_entry(IWineD3DDeviceImpl *This, struct fbo_entry *entry)
+/* GL locking is done by the caller */
+static void context_reuse_fbo_entry(struct wined3d_context *context, struct fbo_entry *entry)
+{
+ IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &entry->id);
+ context_clean_fbo_attachments(gl_info);
+
+ memcpy(entry->render_targets, device->render_targets, GL_LIMITS(buffers) * sizeof(*entry->render_targets));
+ entry->depth_stencil = device->stencilBufferTarget;
+ entry->attached = FALSE;
+}
+
+/* GL locking is done by the caller */
+static void context_destroy_fbo_entry(struct wined3d_context *context, struct fbo_entry *entry)
{
if (entry->id)
{
TRACE("Destroy FBO %d\n", entry->id);
- context_destroy_fbo(This, &entry->id);
+ context_destroy_fbo(context, &entry->id);
}
+ --context->fbo_entry_count;
list_remove(&entry->entry);
HeapFree(GetProcessHeap(), 0, entry->render_targets);
HeapFree(GetProcessHeap(), 0, entry);
}
-static struct fbo_entry *context_find_fbo_entry(IWineD3DDevice *iface, WineD3DContext *context)
+/* GL locking is done by the caller */
+static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context)
{
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
struct fbo_entry *entry;
LIST_FOR_EACH_ENTRY(entry, &context->fbo_list, struct fbo_entry, entry)
{
- if (!memcmp(entry->render_targets, This->render_targets, GL_LIMITS(buffers) * sizeof(*entry->render_targets))
- && entry->depth_stencil == This->stencilBufferTarget)
+ if (!memcmp(entry->render_targets, device->render_targets, GL_LIMITS(buffers) * sizeof(*entry->render_targets))
+ && entry->depth_stencil == device->stencilBufferTarget)
{
+ list_remove(&entry->entry);
+ list_add_head(&context->fbo_list, &entry->entry);
return entry;
}
}
- entry = context_create_fbo_entry(iface);
- list_add_head(&context->fbo_list, &entry->entry);
+ if (context->fbo_entry_count < WINED3D_MAX_FBO_ENTRIES)
+ {
+ entry = context_create_fbo_entry(context);
+ list_add_head(&context->fbo_list, &entry->entry);
+ ++context->fbo_entry_count;
+ }
+ else
+ {
+ entry = LIST_ENTRY(list_tail(&context->fbo_list), struct fbo_entry, entry);
+ context_reuse_fbo_entry(context, entry);
+ list_remove(&entry->entry);
+ list_add_head(&context->fbo_list, &entry->entry);
+ }
+
return entry;
}
-static void context_apply_fbo_entry(IWineD3DDevice *iface, struct fbo_entry *entry)
+/* GL locking is done by the caller */
+static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_entry *entry)
{
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
unsigned int i;
- context_bind_fbo(iface, GL_FRAMEBUFFER_EXT, &entry->id);
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &entry->id);
if (!entry->attached)
{
/* Apply render targets */
for (i = 0; i < GL_LIMITS(buffers); ++i)
{
- IWineD3DSurface *render_target = This->render_targets[i];
- context_attach_surface_fbo(This, GL_FRAMEBUFFER_EXT, i, render_target);
+ IWineD3DSurface *render_target = device->render_targets[i];
+ context_attach_surface_fbo(context, GL_FRAMEBUFFER_EXT, i, render_target);
}
/* Apply depth targets */
- if (This->stencilBufferTarget) {
- unsigned int w = ((IWineD3DSurfaceImpl *)This->render_targets[0])->pow2Width;
- unsigned int h = ((IWineD3DSurfaceImpl *)This->render_targets[0])->pow2Height;
+ if (device->stencilBufferTarget)
+ {
+ unsigned int w = ((IWineD3DSurfaceImpl *)device->render_targets[0])->pow2Width;
+ unsigned int h = ((IWineD3DSurfaceImpl *)device->render_targets[0])->pow2Height;
- surface_set_compatible_renderbuffer(This->stencilBufferTarget, w, h);
+ surface_set_compatible_renderbuffer(device->stencilBufferTarget, w, h);
}
- context_attach_depth_stencil_fbo(This, GL_FRAMEBUFFER_EXT, This->stencilBufferTarget, TRUE);
+ context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER_EXT, device->stencilBufferTarget, TRUE);
entry->attached = TRUE;
} else {
for (i = 0; i < GL_LIMITS(buffers); ++i)
{
- if (This->render_targets[i])
- context_apply_attachment_filter_states(iface, This->render_targets[i], FALSE);
+ if (device->render_targets[i])
+ context_apply_attachment_filter_states(device->render_targets[i], FALSE);
}
- if (This->stencilBufferTarget)
- context_apply_attachment_filter_states(iface, This->stencilBufferTarget, FALSE);
+ if (device->stencilBufferTarget)
+ context_apply_attachment_filter_states(device->stencilBufferTarget, FALSE);
}
for (i = 0; i < GL_LIMITS(buffers); ++i)
{
- if (This->render_targets[i])
- This->draw_buffers[i] = GL_COLOR_ATTACHMENT0_EXT + i;
+ if (device->render_targets[i])
+ device->draw_buffers[i] = GL_COLOR_ATTACHMENT0_EXT + i;
else
- This->draw_buffers[i] = GL_NONE;
+ device->draw_buffers[i] = GL_NONE;
}
}
-static void context_apply_fbo_state(IWineD3DDevice *iface)
+/* GL locking is done by the caller */
+static void context_apply_fbo_state(struct wined3d_context *context)
{
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- WineD3DContext *context = This->activeContext;
-
- if (This->render_offscreen)
+ if (context->render_offscreen)
{
- context->current_fbo = context_find_fbo_entry(iface, context);
- context_apply_fbo_entry(iface, context->current_fbo);
+ context->current_fbo = context_find_fbo_entry(context);
+ context_apply_fbo_entry(context, context->current_fbo);
} else {
context->current_fbo = NULL;
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL);
}
- context_check_fbo_status(iface);
+ context_check_fbo_status(context);
+}
+
+/* Context activation is done by the caller. */
+void context_alloc_occlusion_query(struct wined3d_context *context, struct wined3d_occlusion_query *query)
+{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
+ if (context->free_occlusion_query_count)
+ {
+ query->id = context->free_occlusion_queries[--context->free_occlusion_query_count];
+ }
+ else
+ {
+ if (GL_SUPPORT(ARB_OCCLUSION_QUERY))
+ {
+ ENTER_GL();
+ GL_EXTCALL(glGenQueriesARB(1, &query->id));
+ checkGLcall("glGenQueriesARB");
+ LEAVE_GL();
+
+ TRACE("Allocated occlusion query %u in context %p.\n", query->id, context);
+ }
+ else
+ {
+ WARN("Occlusion queries not supported, not allocating query id.\n");
+ query->id = 0;
+ }
+ }
+
+ query->context = context;
+ list_add_head(&context->occlusion_queries, &query->entry);
+}
+
+void context_free_occlusion_query(struct wined3d_occlusion_query *query)
+{
+ struct wined3d_context *context = query->context;
+
+ list_remove(&query->entry);
+ query->context = NULL;
+
+ if (context->free_occlusion_query_count >= context->free_occlusion_query_size - 1)
+ {
+ UINT new_size = context->free_occlusion_query_size << 1;
+ GLuint *new_data = HeapReAlloc(GetProcessHeap(), 0, context->free_occlusion_queries,
+ new_size * sizeof(*context->free_occlusion_queries));
+
+ if (!new_data)
+ {
+ ERR("Failed to grow free list, leaking query %u in context %p.\n", query->id, context);
+ return;
+ }
+
+ context->free_occlusion_query_size = new_size;
+ context->free_occlusion_queries = new_data;
+ }
+
+ context->free_occlusion_queries[context->free_occlusion_query_count++] = query->id;
+}
+
+/* Context activation is done by the caller. */
+void context_alloc_event_query(struct wined3d_context *context, struct wined3d_event_query *query)
+{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
+ if (context->free_event_query_count)
+ {
+ query->id = context->free_event_queries[--context->free_event_query_count];
+ }
+ else
+ {
+ if (GL_SUPPORT(APPLE_FENCE))
+ {
+ ENTER_GL();
+ GL_EXTCALL(glGenFencesAPPLE(1, &query->id));
+ checkGLcall("glGenFencesAPPLE");
+ LEAVE_GL();
+
+ TRACE("Allocated event query %u in context %p.\n", query->id, context);
+ }
+ else if(GL_SUPPORT(NV_FENCE))
+ {
+ ENTER_GL();
+ GL_EXTCALL(glGenFencesNV(1, &query->id));
+ checkGLcall("glGenFencesNV");
+ LEAVE_GL();
+
+ TRACE("Allocated event query %u in context %p.\n", query->id, context);
+ }
+ else
+ {
+ WARN("Event queries not supported, not allocating query id.\n");
+ query->id = 0;
+ }
+ }
+
+ query->context = context;
+ list_add_head(&context->event_queries, &query->entry);
+}
+
+void context_free_event_query(struct wined3d_event_query *query)
+{
+ struct wined3d_context *context = query->context;
+
+ list_remove(&query->entry);
+ query->context = NULL;
+
+ if (context->free_event_query_count >= context->free_event_query_size - 1)
+ {
+ UINT new_size = context->free_event_query_size << 1;
+ GLuint *new_data = HeapReAlloc(GetProcessHeap(), 0, context->free_event_queries,
+ new_size * sizeof(*context->free_event_queries));
+
+ if (!new_data)
+ {
+ ERR("Failed to grow free list, leaking query %u in context %p.\n", query->id, context);
+ return;
+ }
+
+ context->free_event_query_size = new_size;
+ context->free_event_queries = new_data;
+ }
+
+ context->free_event_queries[context->free_event_query_count++] = query->id;
}
void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource, WINED3DRESOURCETYPE type)
@@ -329,15 +578,25 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
UINT i;
+ if (!This->d3d_initialized) return;
+
switch(type)
{
case WINED3DRTYPE_SURFACE:
{
+ ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
+
for (i = 0; i < This->numContexts; ++i)
{
+ struct wined3d_context *context = This->contexts[i];
+ const struct wined3d_gl_info *gl_info = context->gl_info;
struct fbo_entry *entry, *entry2;
- LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &This->contexts[i]->fbo_list, struct fbo_entry, entry)
+ if (context->current_rt == (IWineD3DSurface *)resource) context->current_rt = NULL;
+
+ ENTER_GL();
+
+ LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry)
{
BOOL destroyed = FALSE;
UINT j;
@@ -346,14 +605,16 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
{
if (entry->render_targets[j] == (IWineD3DSurface *)resource)
{
- context_destroy_fbo_entry(This, entry);
+ context_destroy_fbo_entry(context, entry);
destroyed = TRUE;
}
}
if (!destroyed && entry->depth_stencil == (IWineD3DSurface *)resource)
- context_destroy_fbo_entry(This, entry);
+ context_destroy_fbo_entry(context, entry);
}
+
+ LEAVE_GL();
}
break;
@@ -364,6 +625,156 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
}
}
+static void context_destroy_gl_resources(struct wined3d_context *context)
+{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ struct wined3d_occlusion_query *occlusion_query;
+ struct wined3d_event_query *event_query;
+ struct fbo_entry *entry, *entry2;
+ BOOL has_glctx;
+
+ has_glctx = pwglMakeCurrent(context->hdc, context->glCtx);
+ if (!has_glctx) WARN("Failed to activate context. Window already destroyed?\n");
+
+ ENTER_GL();
+
+ LIST_FOR_EACH_ENTRY(occlusion_query, &context->occlusion_queries, struct wined3d_occlusion_query, entry)
+ {
+ if (has_glctx && GL_SUPPORT(ARB_OCCLUSION_QUERY)) GL_EXTCALL(glDeleteQueriesARB(1, &occlusion_query->id));
+ occlusion_query->context = NULL;
+ }
+
+ LIST_FOR_EACH_ENTRY(event_query, &context->event_queries, struct wined3d_event_query, entry)
+ {
+ if (has_glctx)
+ {
+ if (GL_SUPPORT(APPLE_FENCE)) GL_EXTCALL(glDeleteFencesAPPLE(1, &event_query->id));
+ else if (GL_SUPPORT(NV_FENCE)) GL_EXTCALL(glDeleteFencesNV(1, &event_query->id));
+ }
+ event_query->context = NULL;
+ }
+
+ LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry) {
+ if (!has_glctx) entry->id = 0;
+ context_destroy_fbo_entry(context, entry);
+ }
+ if (has_glctx)
+ {
+ if (context->src_fbo)
+ {
+ TRACE("Destroy src FBO %d\n", context->src_fbo);
+ context_destroy_fbo(context, &context->src_fbo);
+ }
+ if (context->dst_fbo)
+ {
+ TRACE("Destroy dst FBO %d\n", context->dst_fbo);
+ context_destroy_fbo(context, &context->dst_fbo);
+ }
+ if (context->dummy_arbfp_prog)
+ {
+ GL_EXTCALL(glDeleteProgramsARB(1, &context->dummy_arbfp_prog));
+ }
+
+ if (GL_SUPPORT(ARB_OCCLUSION_QUERY))
+ GL_EXTCALL(glDeleteQueriesARB(context->free_occlusion_query_count, context->free_occlusion_queries));
+
+ if (GL_SUPPORT(APPLE_FENCE))
+ GL_EXTCALL(glDeleteFencesAPPLE(context->free_event_query_count, context->free_event_queries));
+ else if (GL_SUPPORT(NV_FENCE))
+ GL_EXTCALL(glDeleteFencesNV(context->free_event_query_count, context->free_event_queries));
+
+ checkGLcall("context cleanup");
+ }
+
+ LEAVE_GL();
+
+ HeapFree(GetProcessHeap(), 0, context->free_occlusion_queries);
+ HeapFree(GetProcessHeap(), 0, context->free_event_queries);
+
+ if (!pwglMakeCurrent(NULL, NULL))
+ {
+ ERR("Failed to disable GL context.\n");
+ }
+
+ if (context->isPBuffer)
+ {
+ GL_EXTCALL(wglReleasePbufferDCARB(context->pbuffer, context->hdc));
+ GL_EXTCALL(wglDestroyPbufferARB(context->pbuffer));
+ }
+ else
+ {
+ ReleaseDC(context->win_handle, context->hdc);
+ }
+
+ if (!pwglDeleteContext(context->glCtx))
+ {
+ DWORD err = GetLastError();
+ ERR("wglDeleteContext(%p) failed, last error %#x.\n", context->glCtx, err);
+ }
+}
+
+DWORD context_get_tls_idx(void)
+{
+ return wined3d_context_tls_idx;
+}
+
+void context_set_tls_idx(DWORD idx)
+{
+ wined3d_context_tls_idx = idx;
+}
+
+struct wined3d_context *context_get_current(void)
+{
+ return TlsGetValue(wined3d_context_tls_idx);
+}
+
+BOOL context_set_current(struct wined3d_context *ctx)
+{
+ struct wined3d_context *old = context_get_current();
+
+ if (old == ctx)
+ {
+ TRACE("Already using D3D context %p.\n", ctx);
+ return TRUE;
+ }
+
+ if (old)
+ {
+ if (old->destroyed)
+ {
+ TRACE("Switching away from destroyed context %p.\n", old);
+ context_destroy_gl_resources(old);
+ HeapFree(GetProcessHeap(), 0, old);
+ }
+ else
+ {
+ old->current = 0;
+ }
+ }
+
+ if (ctx)
+ {
+ TRACE("Switching to D3D context %p, GL context %p, device context %p.\n", ctx, ctx->glCtx, ctx->hdc);
+ if (!pwglMakeCurrent(ctx->hdc, ctx->glCtx))
+ {
+ ERR("Failed to make GL context %p current on device context %p.\n", ctx->glCtx, ctx->hdc);
+ return FALSE;
+ }
+ ctx->current = 1;
+ }
+ else
+ {
+ TRACE("Clearing current D3D context.\n");
+ if (!pwglMakeCurrent(NULL, NULL))
+ {
+ ERR("Failed to clear current GL context.\n");
+ return FALSE;
+ }
+ }
+
+ return TlsSetValue(wined3d_context_tls_idx, ctx);
+}
+
/*****************************************************************************
* Context_MarkStateDirty
*
@@ -377,12 +788,13 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
* StateTable: Pointer to the state table in use(for state grouping)
*
*****************************************************************************/
-static void Context_MarkStateDirty(WineD3DContext *context, DWORD state, const struct StateEntry *StateTable) {
+static void Context_MarkStateDirty(struct wined3d_context *context, DWORD state, const struct StateEntry *StateTable)
+{
DWORD rep = StateTable[state].representative;
DWORD idx;
BYTE shift;
- if(!rep || isStateDirty(context, rep)) return;
+ if (isStateDirty(context, rep)) return;
context->dirtyArray[context->numDirtyEntries++] = rep;
idx = rep >> 5;
@@ -406,8 +818,10 @@ static void Context_MarkStateDirty(WineD3DContext *context, DWORD state, const s
* pbuffer: optional pbuffer used with this context
*
*****************************************************************************/
-static WineD3DContext *AddContextToArray(IWineD3DDeviceImpl *This, HWND win_handle, HDC hdc, HGLRC glCtx, HPBUFFERARB pbuffer) {
- WineD3DContext **oldArray = This->contexts;
+static struct wined3d_context *AddContextToArray(IWineD3DDeviceImpl *This,
+ HWND win_handle, HDC hdc, HGLRC glCtx, HPBUFFERARB pbuffer)
+{
+ struct wined3d_context **oldArray = This->contexts;
DWORD state;
This->contexts = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->contexts) * (This->numContexts + 1));
@@ -420,7 +834,7 @@ static WineD3DContext *AddContextToArray(IWineD3DDeviceImpl *This, HWND win_hand
memcpy(This->contexts, oldArray, sizeof(*This->contexts) * This->numContexts);
}
- This->contexts[This->numContexts] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WineD3DContext));
+ This->contexts[This->numContexts] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(**This->contexts));
if(This->contexts[This->numContexts] == NULL) {
ERR("Unable to allocate a new context\n");
HeapFree(GetProcessHeap(), 0, This->contexts);
@@ -437,7 +851,8 @@ static WineD3DContext *AddContextToArray(IWineD3DDeviceImpl *This, HWND win_hand
/* Mark all states dirty to force a proper initialization of the states on the first use of the context
*/
for(state = 0; state <= STATE_HIGHEST; state++) {
- Context_MarkStateDirty(This->contexts[This->numContexts], state, This->StateTable);
+ if (This->StateTable[state].representative)
+ Context_MarkStateDirty(This->contexts[This->numContexts], state, This->StateTable);
}
This->numContexts++;
@@ -636,12 +1051,15 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
* pPresentParameters: contains the pixelformats to use for onscreen rendering
*
*****************************************************************************/
-WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win_handle, BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms) {
- HDC oldDrawable, hdc;
+struct wined3d_context *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target,
+ HWND win_handle, BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms)
+{
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+ struct wined3d_context *ret = NULL;
HPBUFFERARB pbuffer = NULL;
- HGLRC ctx = NULL, oldCtx;
- WineD3DContext *ret = NULL;
unsigned int s;
+ HGLRC ctx;
+ HDC hdc;
TRACE("(%p): Creating a %s context for render target %p\n", This, create_pbuffer ? "offscreen" : "onscreen", target);
@@ -757,7 +1175,7 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
/* If we still don't have a pixel format, something is very wrong as ChoosePixelFormat barely fails */
if(!iPixelFormat) {
ERR("Can't find a suitable iPixelFormat\n");
- return FALSE;
+ return NULL;
}
DescribePixelFormat(hdc, iPixelFormat, sizeof(pfd), &pfd);
@@ -776,7 +1194,7 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
if(!res) {
ERR("wglSetPixelFormatWINE failed on HDC=%p for iPixelFormat=%d\n", hdc, iPixelFormat);
- return FALSE;
+ return NULL;
}
} else if(oldPixelFormat) {
/* OpenGL doesn't allow pixel format adjustments. Print an error and continue using the old format.
@@ -784,13 +1202,21 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
ERR("HDC=%p is already set to iPixelFormat=%d and OpenGL doesn't allow changes!\n", hdc, oldPixelFormat);
} else {
ERR("SetPixelFormat failed on HDC=%p for iPixelFormat=%d\n", hdc, iPixelFormat);
- return FALSE;
+ return NULL;
}
}
}
ctx = pwglCreateContext(hdc);
- if(This->numContexts) pwglShareLists(This->contexts[0]->glCtx, ctx);
+ if (This->numContexts)
+ {
+ if (!pwglShareLists(This->contexts[0]->glCtx, ctx))
+ {
+ DWORD err = GetLastError();
+ ERR("wglShareLists(%p, %p) failed, last error %#x.\n",
+ This->contexts[0]->glCtx, ctx, err);
+ }
+ }
if(!ctx) {
ERR("Failed to create a WGL context\n");
@@ -803,14 +1229,20 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
ret = AddContextToArray(This, win_handle, hdc, ctx, pbuffer);
if(!ret) {
ERR("Failed to add the newly created context to the context list\n");
- pwglDeleteContext(ctx);
+ if (!pwglDeleteContext(ctx))
+ {
+ DWORD err = GetLastError();
+ ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx, err);
+ }
if(create_pbuffer) {
GL_EXTCALL(wglReleasePbufferDCARB(pbuffer, hdc));
GL_EXTCALL(wglDestroyPbufferARB(pbuffer));
}
goto out;
}
+ ret->gl_info = &This->adapter->gl_info;
ret->surface = (IWineD3DSurface *) target;
+ ret->current_rt = (IWineD3DSurface *)target;
ret->isPBuffer = create_pbuffer;
ret->tid = GetCurrentThreadId();
if(This->shader_backend->shader_dirtifyable_constants((IWineD3DDevice *) This)) {
@@ -825,18 +1257,27 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
sizeof(*ret->pshader_const_dirty) * GL_LIMITS(pshader_constantsF));
}
+ ret->free_occlusion_query_size = 4;
+ ret->free_occlusion_queries = HeapAlloc(GetProcessHeap(), 0,
+ ret->free_occlusion_query_size * sizeof(*ret->free_occlusion_queries));
+ if (!ret->free_occlusion_queries) goto out;
+
+ list_init(&ret->occlusion_queries);
+
+ ret->free_event_query_size = 4;
+ ret->free_event_queries = HeapAlloc(GetProcessHeap(), 0,
+ ret->free_event_query_size * sizeof(*ret->free_event_queries));
+ if (!ret->free_event_queries) goto out;
+
+ list_init(&ret->event_queries);
+
TRACE("Successfully created new context %p\n", ret);
list_init(&ret->fbo_list);
/* Set up the context defaults */
- oldCtx = pwglGetCurrentContext();
- oldDrawable = pwglGetCurrentDC();
- if(oldCtx && oldDrawable) {
- /* See comment in ActivateContext context switching */
- This->frag_pipe->enable_extension((IWineD3DDevice *) This, FALSE);
- }
- if(pwglMakeCurrent(hdc, ctx) == FALSE) {
+ if (!context_set_current(ret))
+ {
ERR("Cannot activate context to set up defaults\n");
goto out;
}
@@ -847,7 +1288,7 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
TRACE("Setting up the screen\n");
/* Clear the screen */
- glClearColor(1.0, 0.0, 0.0, 0.0);
+ glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
checkGLcall("glClearColor");
glClearIndex(0);
glClearDepth(1);
@@ -891,30 +1332,54 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
for(s = 1; s < GL_LIMITS(textures); s++) {
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + s));
glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + s - 1);
- checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, ...\n");
+ checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, ...");
}
}
+ if(GL_SUPPORT(ARB_FRAGMENT_PROGRAM)) {
+ /* MacOS(radeon X1600 at least, but most likely others too) refuses to draw if GLSL and ARBFP are
+ * enabled, but the currently bound arbfp program is 0. Enabling ARBFP with prog 0 is invalid, but
+ * GLSL should bypass this. This causes problems in programs that never use the fixed function pipeline,
+ * because the ARBFP extension is enabled by the ARBFP pipeline at context creation, but no program
+ * is ever assigned.
+ *
+ * So make sure a program is assigned to each context. The first real ARBFP use will set a different
+ * program and the dummy program is destroyed when the context is destroyed.
+ */
+ const char *dummy_program =
+ "!!ARBfp1.0\n"
+ "MOV result.color, fragment.color.primary;\n"
+ "END\n";
+ GL_EXTCALL(glGenProgramsARB(1, &ret->dummy_arbfp_prog));
+ GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, ret->dummy_arbfp_prog));
+ GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(dummy_program), dummy_program));
+ }
for(s = 0; s < GL_LIMITS(point_sprite_units); s++) {
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + s));
glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
- checkGLcall("glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE)\n");
+ checkGLcall("glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE)");
}
+
+ if (GL_SUPPORT(EXT_PROVOKING_VERTEX))
+ {
+ GL_EXTCALL(glProvokingVertexEXT(GL_FIRST_VERTEX_CONVENTION_EXT));
+ }
+
LEAVE_GL();
- /* Never keep GL_FRAGMENT_SHADER_ATI enabled on a context that we switch away from,
- * but enable it for the first context we create, and reenable it on the old context
- */
- if(oldDrawable && oldCtx) {
- pwglMakeCurrent(oldDrawable, oldCtx);
- } else {
- last_device = This;
- }
This->frag_pipe->enable_extension((IWineD3DDevice *) This, TRUE);
return ret;
out:
+ if (ret)
+ {
+ HeapFree(GetProcessHeap(), 0, ret->free_event_queries);
+ HeapFree(GetProcessHeap(), 0, ret->free_occlusion_queries);
+ HeapFree(GetProcessHeap(), 0, ret->pshader_const_dirty);
+ HeapFree(GetProcessHeap(), 0, ret->vshader_const_dirty);
+ HeapFree(GetProcessHeap(), 0, ret);
+ }
return NULL;
}
@@ -932,8 +1397,9 @@ out:
* context: Context to remove
*
*****************************************************************************/
-static void RemoveContextFromArray(IWineD3DDeviceImpl *This, WineD3DContext *context) {
- WineD3DContext **new_array;
+static void RemoveContextFromArray(IWineD3DDeviceImpl *This, struct wined3d_context *context)
+{
+ struct wined3d_context **new_array;
BOOL found = FALSE;
UINT i;
@@ -943,7 +1409,6 @@ static void RemoveContextFromArray(IWineD3DDeviceImpl *This, WineD3DContext *con
{
if (This->contexts[i] == context)
{
- HeapFree(GetProcessHeap(), 0, context);
found = TRUE;
break;
}
@@ -989,52 +1454,35 @@ static void RemoveContextFromArray(IWineD3DDeviceImpl *This, WineD3DContext *con
* context: Context to destroy
*
*****************************************************************************/
-void DestroyContext(IWineD3DDeviceImpl *This, WineD3DContext *context) {
- struct fbo_entry *entry, *entry2;
+void DestroyContext(IWineD3DDeviceImpl *This, struct wined3d_context *context)
+{
+ BOOL destroy;
TRACE("Destroying ctx %p\n", context);
- /* The correct GL context needs to be active to cleanup the GL resources below */
- if(pwglGetCurrentContext() != context->glCtx){
- pwglMakeCurrent(context->hdc, context->glCtx);
- last_device = NULL;
- }
-
- ENTER_GL();
-
- LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry) {
- context_destroy_fbo_entry(This, entry);
- }
- if (context->src_fbo) {
- TRACE("Destroy src FBO %d\n", context->src_fbo);
- context_destroy_fbo(This, &context->src_fbo);
- }
- if (context->dst_fbo) {
- TRACE("Destroy dst FBO %d\n", context->dst_fbo);
- context_destroy_fbo(This, &context->dst_fbo);
- }
-
- LEAVE_GL();
-
- if (This->activeContext == context)
+ if (context->tid == GetCurrentThreadId() || !context->current)
{
- This->activeContext = NULL;
- TRACE("Destroying the active context.\n");
- }
+ context_destroy_gl_resources(context);
+ destroy = TRUE;
- /* Cleanup the GL context */
- pwglMakeCurrent(NULL, NULL);
- if(context->isPBuffer) {
- GL_EXTCALL(wglReleasePbufferDCARB(context->pbuffer, context->hdc));
- GL_EXTCALL(wglDestroyPbufferARB(context->pbuffer));
- } else ReleaseDC(context->win_handle, context->hdc);
- pwglDeleteContext(context->glCtx);
+ if (!context_set_current(NULL))
+ {
+ ERR("Failed to clear current D3D context.\n");
+ }
+ }
+ else
+ {
+ context->destroyed = 1;
+ destroy = FALSE;
+ }
HeapFree(GetProcessHeap(), 0, context->vshader_const_dirty);
HeapFree(GetProcessHeap(), 0, context->pshader_const_dirty);
RemoveContextFromArray(This, context);
+ if (destroy) HeapFree(GetProcessHeap(), 0, context);
}
+/* GL locking is done by the caller */
static inline void set_blit_dimension(UINT width, UINT height) {
glMatrixMode(GL_PROJECTION);
checkGLcall("glMatrixMode(GL_PROJECTION)");
@@ -1064,14 +1512,20 @@ static inline void set_blit_dimension(UINT width, UINT height) {
* height: render target height
*
*****************************************************************************/
-static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *context, UINT width, UINT height) {
- int i, sampler;
+/* Context activation is done by the caller. */
+static inline void SetupForBlit(IWineD3DDeviceImpl *This, struct wined3d_context *context, UINT width, UINT height)
+{
+ int i;
const struct StateEntry *StateTable = This->StateTable;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ DWORD sampler;
TRACE("Setting up context %p for blitting\n", context);
if(context->last_was_blit) {
if(context->blit_w != width || context->blit_h != height) {
+ ENTER_GL();
set_blit_dimension(width, height);
+ LEAVE_GL();
context->blit_w = width; context->blit_h = height;
/* No need to dirtify here, the states are still dirtified because they weren't
* applied since the last SetupForBlit call. Otherwise last_was_blit would not
@@ -1086,7 +1540,10 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex
/* TODO: Use a display list */
/* Disable shaders */
- This->shader_backend->shader_select((IWineD3DDevice *)This, FALSE, FALSE);
+ ENTER_GL();
+ This->shader_backend->shader_select(context, FALSE, FALSE);
+ LEAVE_GL();
+
Context_MarkStateDirty(context, STATE_VSHADER, StateTable);
Context_MarkStateDirty(context, STATE_PIXELSHADER, StateTable);
@@ -1124,7 +1581,8 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);");
- if (sampler != -1) {
+ if (sampler != WINED3D_UNMAPPED_STAGE)
+ {
if (sampler < MAX_TEXTURES) {
Context_MarkStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP), StateTable);
}
@@ -1159,11 +1617,12 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex
if (GL_SUPPORT(EXT_TEXTURE_LOD_BIAS)) {
glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT,
GL_TEXTURE_LOD_BIAS_EXT,
- 0.0);
+ 0.0f);
checkGLcall("glTexEnvi GL_TEXTURE_LOD_BIAS_EXT ...");
}
- if (sampler != -1) {
+ if (sampler != WINED3D_UNMAPPED_STAGE)
+ {
if (sampler < MAX_TEXTURES) {
Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_TEXTURE0 + sampler), StateTable);
Context_MarkStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP), StateTable);
@@ -1203,7 +1662,7 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex
}
glColorMask(GL_TRUE, GL_TRUE,GL_TRUE,GL_TRUE);
checkGLcall("glColorMask");
- Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_CLIPPING), StateTable);
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_COLORWRITEENABLE), StateTable);
if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
glDisable(GL_COLOR_SUM_EXT);
Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SPECULARENABLE), StateTable);
@@ -1227,9 +1686,11 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex
glDisable(GL_CLIP_PLANE4); checkGLcall("glDisable(clip plane 4)");
glDisable(GL_CLIP_PLANE5); checkGLcall("glDisable(clip plane 5)");
Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_CLIPPING), StateTable);
- LEAVE_GL();
set_blit_dimension(width, height);
+
+ LEAVE_GL();
+
context->blit_w = width; context->blit_h = height;
Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable);
Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION), StateTable);
@@ -1245,7 +1706,8 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex
* If none can be found the swapchain is requested to create a new context
*
*****************************************************************************/
-static WineD3DContext *findThreadContextForSwapChain(IWineD3DSwapChain *swapchain, DWORD tid) {
+static struct wined3d_context *findThreadContextForSwapChain(IWineD3DSwapChain *swapchain, DWORD tid)
+{
unsigned int i;
for(i = 0; i < ((IWineD3DSwapChainImpl *) swapchain)->num_contexts; i++) {
@@ -1271,26 +1733,35 @@ static WineD3DContext *findThreadContextForSwapChain(IWineD3DSwapChain *swapchai
* Returns: The needed context
*
*****************************************************************************/
-static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, DWORD tid) {
+static inline struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, DWORD tid)
+{
IWineD3DSwapChain *swapchain = NULL;
- BOOL readTexture = wined3d_settings.offscreen_rendering_mode != ORM_FBO && This->render_offscreen;
- WineD3DContext *context = This->activeContext;
- BOOL oldRenderOffscreen = This->render_offscreen;
- const struct GlPixelFormatDesc *old = ((IWineD3DSurfaceImpl *)This->lastActiveRenderTarget)->resource.format_desc;
- const struct GlPixelFormatDesc *new = ((IWineD3DSurfaceImpl *)target)->resource.format_desc;
+ struct wined3d_context *current_context = context_get_current();
const struct StateEntry *StateTable = This->StateTable;
+ struct wined3d_context *context;
+ BOOL old_render_offscreen;
- /* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers
- * the alpha blend state changes with different render target formats
- */
- if (old->format != new->format)
+ if (current_context && current_context->destroyed) current_context = NULL;
+
+ if (!target)
{
- /* Disable blending when the alpha mask has changed and when a format doesn't support blending */
- if ((old->alpha_mask && !new->alpha_mask) || (!old->alpha_mask && new->alpha_mask)
- || !(new->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
+ if (current_context
+ && current_context->current_rt
+ && ((IWineD3DSurfaceImpl *)current_context->surface)->resource.wineD3DDevice == This)
{
- Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
+ target = current_context->current_rt;
}
+ else
+ {
+ IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)This->swapchains[0];
+ if (swapchain->backBuffer) target = swapchain->backBuffer[0];
+ else target = swapchain->frontBuffer;
+ }
+ }
+
+ if (current_context && current_context->current_rt == target)
+ {
+ return current_context;
}
if (SUCCEEDED(IWineD3DSurface_GetContainer(target, &IID_IWineD3DSwapChain, (void **)&swapchain))) {
@@ -1298,7 +1769,8 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
context = findThreadContextForSwapChain(swapchain, tid);
- This->render_offscreen = FALSE;
+ old_render_offscreen = context->render_offscreen;
+ context->render_offscreen = FALSE;
/* The context != This->activeContext will catch a NOP context change. This can occur
* if we are switching back to swapchain rendering in case of FBO or Back Buffer offscreen
* rendering. No context change is needed in that case
@@ -1310,157 +1782,161 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
}
}
IWineD3DSwapChain_Release(swapchain);
-
- if(oldRenderOffscreen) {
- Context_MarkStateDirty(context, WINED3DTS_PROJECTION, StateTable);
- Context_MarkStateDirty(context, STATE_VDECL, StateTable);
- Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable);
- Context_MarkStateDirty(context, STATE_SCISSORRECT, StateTable);
- Context_MarkStateDirty(context, STATE_FRONTFACE, StateTable);
- }
-
- } else {
+ }
+ else
+ {
TRACE("Rendering offscreen\n");
- This->render_offscreen = TRUE;
- switch(wined3d_settings.offscreen_rendering_mode) {
- case ORM_FBO:
- /* FBOs do not need a different context. Stay with whatever context is active at the moment */
- if(This->activeContext && tid == This->lastThread) {
- context = This->activeContext;
- } else {
- /* This may happen if the app jumps straight into offscreen rendering
- * Start using the context of the primary swapchain. tid == 0 is no problem
- * for findThreadContextForSwapChain.
- *
- * Can also happen on thread switches - in that case findThreadContextForSwapChain
- * is perfect to call.
- */
- context = findThreadContextForSwapChain(This->swapchains[0], tid);
- }
- break;
-
- case ORM_PBUFFER:
+retry:
+ if (wined3d_settings.offscreen_rendering_mode == ORM_PBUFFER)
+ {
+ IWineD3DSurfaceImpl *targetimpl = (IWineD3DSurfaceImpl *)target;
+ if (!This->pbufferContext
+ || This->pbufferWidth < targetimpl->currentDesc.Width
+ || This->pbufferHeight < targetimpl->currentDesc.Height)
{
- IWineD3DSurfaceImpl *targetimpl = (IWineD3DSurfaceImpl *) target;
- if(This->pbufferContext == NULL ||
- This->pbufferWidth < targetimpl->currentDesc.Width ||
- This->pbufferHeight < targetimpl->currentDesc.Height) {
- if(This->pbufferContext) {
- DestroyContext(This, This->pbufferContext);
- }
+ if (This->pbufferContext) DestroyContext(This, This->pbufferContext);
- /* The display is irrelevant here, the window is 0. But CreateContext needs a valid X connection.
- * Create the context on the same server as the primary swapchain. The primary swapchain is exists at this point.
- */
- This->pbufferContext = CreateContext(This, targetimpl,
- ((IWineD3DSwapChainImpl *) This->swapchains[0])->context[0]->win_handle,
- TRUE /* pbuffer */, &((IWineD3DSwapChainImpl *)This->swapchains[0])->presentParms);
- This->pbufferWidth = targetimpl->currentDesc.Width;
- This->pbufferHeight = targetimpl->currentDesc.Height;
- }
-
- if(This->pbufferContext) {
- if(This->pbufferContext->tid != 0 && This->pbufferContext->tid != tid) {
- FIXME("The PBuffr context is only supported for one thread for now!\n");
- }
- This->pbufferContext->tid = tid;
- context = This->pbufferContext;
- break;
- } else {
- ERR("Failed to create a buffer context and drawable, falling back to back buffer offscreen rendering\n");
- wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER;
- }
+ /* The display is irrelevant here, the window is 0. But
+ * CreateContext needs a valid X connection. Create the context
+ * on the same server as the primary swapchain. The primary
+ * swapchain is exists at this point. */
+ This->pbufferContext = CreateContext(This, targetimpl,
+ ((IWineD3DSwapChainImpl *)This->swapchains[0])->context[0]->win_handle,
+ TRUE /* pbuffer */, &((IWineD3DSwapChainImpl *)This->swapchains[0])->presentParms);
+ This->pbufferWidth = targetimpl->currentDesc.Width;
+ This->pbufferHeight = targetimpl->currentDesc.Height;
}
- case ORM_BACKBUFFER:
- /* Stay with the currently active context for back buffer rendering */
- if(This->activeContext && tid == This->lastThread) {
- context = This->activeContext;
- } else {
- /* This may happen if the app jumps straight into offscreen rendering
- * Start using the context of the primary swapchain. tid == 0 is no problem
- * for findThreadContextForSwapChain.
- *
- * Can also happen on thread switches - in that case findThreadContextForSwapChain
- * is perfect to call.
- */
- context = findThreadContextForSwapChain(This->swapchains[0], tid);
+ if (This->pbufferContext)
+ {
+ if (This->pbufferContext->tid && This->pbufferContext->tid != tid)
+ {
+ FIXME("The PBuffer context is only supported for one thread for now!\n");
}
- break;
+ This->pbufferContext->tid = tid;
+ context = This->pbufferContext;
+ }
+ else
+ {
+ ERR("Failed to create a buffer context and drawable, falling back to back buffer offscreen rendering.\n");
+ wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER;
+ goto retry;
+ }
+ }
+ else
+ {
+ /* Stay with the currently active context. */
+ if (current_context
+ && ((IWineD3DSurfaceImpl *)current_context->surface)->resource.wineD3DDevice == This)
+ {
+ context = current_context;
+ }
+ else
+ {
+ /* This may happen if the app jumps straight into offscreen rendering
+ * Start using the context of the primary swapchain. tid == 0 is no problem
+ * for findThreadContextForSwapChain.
+ *
+ * Can also happen on thread switches - in that case findThreadContextForSwapChain
+ * is perfect to call. */
+ context = findThreadContextForSwapChain(This->swapchains[0], tid);
+ }
}
- if(!oldRenderOffscreen) {
- Context_MarkStateDirty(context, WINED3DTS_PROJECTION, StateTable);
- Context_MarkStateDirty(context, STATE_VDECL, StateTable);
- Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable);
- Context_MarkStateDirty(context, STATE_SCISSORRECT, StateTable);
- Context_MarkStateDirty(context, STATE_FRONTFACE, StateTable);
+ old_render_offscreen = context->render_offscreen;
+ context->render_offscreen = TRUE;
+ }
+
+ if (context->render_offscreen != old_render_offscreen)
+ {
+ Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION), StateTable);
+ Context_MarkStateDirty(context, STATE_VDECL, StateTable);
+ Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable);
+ Context_MarkStateDirty(context, STATE_SCISSORRECT, StateTable);
+ Context_MarkStateDirty(context, STATE_FRONTFACE, StateTable);
+ }
+
+ /* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers
+ * the alpha blend state changes with different render target formats. */
+ if (!context->current_rt)
+ {
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
+ }
+ else
+ {
+ const struct GlPixelFormatDesc *old = ((IWineD3DSurfaceImpl *)context->current_rt)->resource.format_desc;
+ const struct GlPixelFormatDesc *new = ((IWineD3DSurfaceImpl *)target)->resource.format_desc;
+
+ if (old->format != new->format)
+ {
+ /* Disable blending when the alpha mask has changed and when a format doesn't support blending. */
+ if ((old->alpha_mask && !new->alpha_mask) || (!old->alpha_mask && new->alpha_mask)
+ || !(new->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
+ {
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
+ }
+ }
+
+ /* When switching away from an offscreen render target, and we're not
+ * using FBOs, we have to read the drawable into the texture. This is
+ * done via PreLoad (and SFLAG_INDRAWABLE set on the surface). There
+ * are some things that need care though. PreLoad needs a GL context,
+ * and FindContext is called before the context is activated. It also
+ * has to be called with the old rendertarget active, otherwise a
+ * wrong drawable is read. */
+ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO
+ && old_render_offscreen && context->current_rt != target)
+ {
+ BOOL oldInDraw = This->isInDraw;
+
+ /* surface_internal_preload() requires a context to load the
+ * texture, so it will call ActivateContext. Set isInDraw to true
+ * to signal surface_internal_preload() that it has a context. */
+
+ /* FIXME: This is just broken. There's no guarantee whatsoever
+ * that the currently active context, if any, is appropriate for
+ * reading back the render target. We should probably call
+ * context_set_current(context) here and then rely on
+ * ActivateContext() doing the right thing. */
+ This->isInDraw = TRUE;
+
+ /* Read the back buffer of the old drawable into the destination texture. */
+ if (((IWineD3DSurfaceImpl *)context->current_rt)->texture_name_srgb)
+ {
+ surface_internal_preload(context->current_rt, SRGB_BOTH);
+ }
+ else
+ {
+ surface_internal_preload(context->current_rt, SRGB_RGB);
+ }
+
+ IWineD3DSurface_ModifyLocation(context->current_rt, SFLAG_INDRAWABLE, FALSE);
+
+ This->isInDraw = oldInDraw;
}
}
- /* When switching away from an offscreen render target, and we're not using FBOs,
- * we have to read the drawable into the texture. This is done via PreLoad(and
- * SFLAG_INDRAWABLE set on the surface). There are some things that need care though.
- * PreLoad needs a GL context, and FindContext is called before the context is activated.
- * It also has to be called with the old rendertarget active, otherwise a wrong drawable
- * is read. This leads to these possible situations:
- *
- * 0) lastActiveRenderTarget == target && oldTid == newTid:
- * Nothing to do, we don't even reach this code in this case...
- *
- * 1) lastActiveRenderTarget != target && oldTid == newTid:
- * The currently active context is OK for readback. Call PreLoad, and it
- * performs the read
- *
- * 2) lastActiveRenderTarget == target && oldTid != newTid:
- * Nothing to do - the drawable is unchanged
- *
- * 3) lastActiveRenderTarget != target && oldTid != newTid:
- * This is tricky. We have to get a context with the old drawable from somewhere
- * before we can switch to the new context. In this case, PreLoad calls
- * ActivateContext(lastActiveRenderTarget) from the new(current) thread. This
- * is case (2) then. The old drawable is activated for the new thread, and the
- * readback can be done. The recursed ActivateContext does *not* call PreLoad again.
- * After that, the outer ActivateContext(which calls PreLoad) can activate the new
- * target for the new thread
- */
- if (readTexture && This->lastActiveRenderTarget != target) {
- BOOL oldInDraw = This->isInDraw;
-
- /* PreLoad requires a context to load the texture, thus it will call ActivateContext.
- * Set the isInDraw to true to signal PreLoad that it has a context. Will be tricky
- * when using offscreen rendering with multithreading
- */
- This->isInDraw = TRUE;
-
- /* Do that before switching the context:
- * Read the back buffer of the old drawable into the destination texture
- */
- if(((IWineD3DSurfaceImpl *)This->lastActiveRenderTarget)->glDescription.srgbTextureName) {
- surface_internal_preload(This->lastActiveRenderTarget, SRGB_BOTH);
- } else {
- surface_internal_preload(This->lastActiveRenderTarget, SRGB_RGB);
- }
-
- /* Assume that the drawable will be modified by some other things now */
- IWineD3DSurface_ModifyLocation(This->lastActiveRenderTarget, SFLAG_INDRAWABLE, FALSE);
-
- This->isInDraw = oldInDraw;
- }
+ context->draw_buffer_dirty = TRUE;
+ context->current_rt = target;
return context;
}
-static void apply_draw_buffer(IWineD3DDeviceImpl *This, IWineD3DSurface *target, BOOL blit)
+/* Context activation is done by the caller. */
+static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ IWineD3DSurface *rt = context->current_rt;
IWineD3DSwapChain *swapchain;
+ IWineD3DDeviceImpl *device;
- if (SUCCEEDED(IWineD3DSurface_GetContainer(target, &IID_IWineD3DSwapChain, (void **)&swapchain)))
+ device = ((IWineD3DSurfaceImpl *)rt)->resource.wineD3DDevice;
+ if (SUCCEEDED(IWineD3DSurface_GetContainer(rt, &IID_IWineD3DSwapChain, (void **)&swapchain)))
{
IWineD3DSwapChain_Release((IUnknown *)swapchain);
ENTER_GL();
- glDrawBuffer(surface_get_gl_buffer(target, swapchain));
+ glDrawBuffer(surface_get_gl_buffer(rt, swapchain));
checkGLcall("glDrawBuffers()");
LEAVE_GL();
}
@@ -1473,12 +1949,12 @@ static void apply_draw_buffer(IWineD3DDeviceImpl *This, IWineD3DSurface *target,
{
if (GL_SUPPORT(ARB_DRAW_BUFFERS))
{
- GL_EXTCALL(glDrawBuffersARB(GL_LIMITS(buffers), This->draw_buffers));
+ GL_EXTCALL(glDrawBuffersARB(GL_LIMITS(buffers), device->draw_buffers));
checkGLcall("glDrawBuffers()");
}
else
{
- glDrawBuffer(This->draw_buffers[0]);
+ glDrawBuffer(device->draw_buffers[0]);
checkGLcall("glDrawBuffer()");
}
} else {
@@ -1488,7 +1964,7 @@ static void apply_draw_buffer(IWineD3DDeviceImpl *This, IWineD3DSurface *target,
}
else
{
- glDrawBuffer(This->offscreenBuffer);
+ glDrawBuffer(device->offscreenBuffer);
checkGLcall("glDrawBuffer()");
}
LEAVE_GL();
@@ -1508,89 +1984,75 @@ static void apply_draw_buffer(IWineD3DDeviceImpl *This, IWineD3DSurface *target,
* usage: Prepares the context for blitting, drawing or other actions
*
*****************************************************************************/
-void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextUsage usage) {
+struct wined3d_context *ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, enum ContextUsage usage)
+{
+ struct wined3d_context *current_context = context_get_current();
DWORD tid = GetCurrentThreadId();
DWORD i, dirtyState, idx;
BYTE shift;
- WineD3DContext *context;
const struct StateEntry *StateTable = This->StateTable;
+ const struct wined3d_gl_info *gl_info;
+ struct wined3d_context *context;
TRACE("(%p): Selecting context for render target %p, thread %d\n", This, target, tid);
- if(This->lastActiveRenderTarget != target || tid != This->lastThread) {
- context = FindContext(This, target, tid);
- context->draw_buffer_dirty = TRUE;
- This->lastActiveRenderTarget = target;
- This->lastThread = tid;
- } else {
- /* Stick to the old context */
- context = This->activeContext;
- }
+
+ context = FindContext(This, target, tid);
+
+ gl_info = context->gl_info;
/* Activate the opengl context */
- if(last_device != This || context != This->activeContext) {
- BOOL ret;
+ if (context != current_context)
+ {
+ if (!context_set_current(context)) ERR("Failed to activate the new context.\n");
+ else This->frag_pipe->enable_extension((IWineD3DDevice *)This, !context->last_was_blit);
- /* Prevent an unneeded context switch as those are expensive */
- if(context->glCtx && (context->glCtx == pwglGetCurrentContext())) {
- TRACE("Already using gl context %p\n", context->glCtx);
+ if (context->vshader_const_dirty)
+ {
+ memset(context->vshader_const_dirty, 1,
+ sizeof(*context->vshader_const_dirty) * GL_LIMITS(vshader_constantsF));
+ This->highest_dirty_vs_const = GL_LIMITS(vshader_constantsF);
}
- else {
- TRACE("Switching gl ctx to %p, hdc=%p ctx=%p\n", context, context->hdc, context->glCtx);
-
- ret = pwglMakeCurrent(context->hdc, context->glCtx);
- if(ret == FALSE) {
- ERR("Failed to activate the new context\n");
- } else if(!context->last_was_blit) {
- This->frag_pipe->enable_extension((IWineD3DDevice *) This, TRUE);
- } else {
- This->frag_pipe->enable_extension((IWineD3DDevice *) This, FALSE);
- }
+ if (context->pshader_const_dirty)
+ {
+ memset(context->pshader_const_dirty, 1,
+ sizeof(*context->pshader_const_dirty) * GL_LIMITS(pshader_constantsF));
+ This->highest_dirty_ps_const = GL_LIMITS(pshader_constantsF);
}
- if(This->activeContext->vshader_const_dirty) {
- memset(This->activeContext->vshader_const_dirty, 1,
- sizeof(*This->activeContext->vshader_const_dirty) * GL_LIMITS(vshader_constantsF));
- }
- if(This->activeContext->pshader_const_dirty) {
- memset(This->activeContext->pshader_const_dirty, 1,
- sizeof(*This->activeContext->pshader_const_dirty) * GL_LIMITS(pshader_constantsF));
- }
- This->activeContext = context;
- last_device = This;
}
switch (usage) {
case CTXUSAGE_CLEAR:
case CTXUSAGE_DRAWPRIM:
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
- context_apply_fbo_state((IWineD3DDevice *)This);
+ ENTER_GL();
+ context_apply_fbo_state(context);
+ LEAVE_GL();
}
if (context->draw_buffer_dirty) {
- apply_draw_buffer(This, target, FALSE);
+ context_apply_draw_buffer(context, FALSE);
context->draw_buffer_dirty = FALSE;
}
break;
case CTXUSAGE_BLIT:
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
- if (This->render_offscreen) {
+ if (context->render_offscreen)
+ {
FIXME("Activating for CTXUSAGE_BLIT for an offscreen target with ORM_FBO. This should be avoided.\n");
- context_bind_fbo((IWineD3DDevice *)This, GL_FRAMEBUFFER_EXT, &context->dst_fbo);
- context_attach_surface_fbo(This, GL_FRAMEBUFFER_EXT, 0, target);
-
ENTER_GL();
- GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0));
- checkGLcall("glFramebufferRenderbufferEXT");
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &context->dst_fbo);
+ context_attach_surface_fbo(context, GL_FRAMEBUFFER_EXT, 0, target);
+ context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER_EXT, NULL, FALSE);
LEAVE_GL();
} else {
ENTER_GL();
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glFramebufferRenderbufferEXT");
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL);
LEAVE_GL();
}
context->draw_buffer_dirty = TRUE;
}
if (context->draw_buffer_dirty) {
- apply_draw_buffer(This, target, TRUE);
+ context_apply_draw_buffer(context, TRUE);
if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) {
context->draw_buffer_dirty = FALSE;
}
@@ -1636,6 +2098,7 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU
IWineD3DDeviceImpl_FindTexUnitMap(This);
+ ENTER_GL();
for(i=0; i < context->numDirtyEntries; i++) {
dirtyState = context->dirtyArray[i];
idx = dirtyState >> 5;
@@ -1643,6 +2106,7 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU
context->isStateDirty[idx] &= ~(1 << shift);
StateTable[dirtyState].apply(dirtyState, This->stateBlock, context);
}
+ LEAVE_GL();
context->numDirtyEntries = 0; /* This makes the whole list clean */
context->last_was_blit = FALSE;
break;
@@ -1656,8 +2120,6 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU
default:
FIXME("Unexpected context usage requested\n");
}
-}
-WineD3DContext *getActiveContext(void) {
- return last_device->activeContext;
+ return context;
}
diff --git a/reactos/dll/directx/wine/wined3d/cubetexture.c b/reactos/dll/directx/wine/wined3d/cubetexture.c
index ce5f6b618bc..4b6900a87f8 100644
--- a/reactos/dll/directx/wine/wined3d/cubetexture.c
+++ b/reactos/dll/directx/wine/wined3d/cubetexture.c
@@ -25,11 +25,241 @@
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
-#define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
+
+#define GLINFO_LOCATION (*gl_info)
+
+static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb)
+{
+ /* Override the IWineD3DResource Preload method. */
+ IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
+ IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+ unsigned int i, j;
+ BOOL srgb_mode;
+ BOOL *dirty;
+
+ switch (srgb)
+ {
+ case SRGB_RGB:
+ srgb_mode = FALSE;
+ break;
+
+ case SRGB_BOTH:
+ cubetexture_internal_preload(iface, SRGB_RGB);
+ /* Fallthrough */
+
+ case SRGB_SRGB:
+ srgb_mode = TRUE;
+ break;
+
+ default:
+ srgb_mode = This->baseTexture.is_srgb;
+ break;
+ }
+ dirty = srgb_mode ? &This->baseTexture.srgbDirty : &This->baseTexture.dirty;
+
+ TRACE("(%p) : About to load texture: dirtified(%u).\n", This, *dirty);
+
+ /* We only have to activate a context for gl when we're not drawing.
+ * In most cases PreLoad will be called during draw and a context was
+ * activated at the beginning of drawPrimitive. */
+ if (!device->isInDraw)
+ {
+ /* No danger of recursive calls, ActivateContext sets isInDraw to true
+ * when loading offscreen render targets into their texture. */
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
+ }
+
+ if (This->resource.format_desc->format == WINED3DFMT_P8
+ || This->resource.format_desc->format == WINED3DFMT_A8P8)
+ {
+ for (i = 0; i < This->baseTexture.levels; ++i)
+ {
+ for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z; ++j)
+ {
+ if (palette9_changed((IWineD3DSurfaceImpl *)This->surfaces[j][i]))
+ {
+ TRACE("Reloading surface because the d3d8/9 palette was changed.\n");
+ /* TODO: This is not necessarily needed with hw palettized texture support. */
+ IWineD3DSurface_LoadLocation(This->surfaces[j][i], SFLAG_INSYSMEM, NULL);
+ /* Make sure the texture is reloaded because of the palette change,
+ * this kills performance though :( */
+ IWineD3DSurface_ModifyLocation(This->surfaces[j][i], SFLAG_INTEXTURE, FALSE);
+ }
+ }
+ }
+ }
+
+ /* If the texture is marked dirty or the srgb sampler setting has changed
+ * since the last load then reload the surfaces. */
+ if (*dirty)
+ {
+ for (i = 0; i < This->baseTexture.levels; ++i)
+ {
+ for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z; ++j)
+ {
+ IWineD3DSurface_LoadTexture(This->surfaces[j][i], srgb_mode);
+ }
+ }
+ }
+ else
+ {
+ TRACE("(%p) Texture not dirty, nothing to do.\n" , iface);
+ }
+
+ /* No longer dirty. */
+ *dirty = FALSE;
+}
+
+static void cubetexture_cleanup(IWineD3DCubeTextureImpl *This, D3DCB_DESTROYSURFACEFN surface_destroy_cb)
+{
+ unsigned int i, j;
+
+ TRACE("(%p) : Cleaning up.\n", This);
+
+ for (i = 0; i < This->baseTexture.levels; ++i)
+ {
+ for (j = 0; j < 6; ++j)
+ {
+ IWineD3DSurface *surface = This->surfaces[j][i];
+
+ if (surface)
+ {
+ /* Clean out the texture name we gave to the surface so that the
+ * surface doesn't try and release it. */
+ surface_set_texture_name(surface, 0, TRUE);
+ surface_set_texture_name(surface, 0, FALSE);
+ surface_set_texture_target(surface, 0);
+ IWineD3DSurface_SetContainer(surface, NULL);
+ surface_destroy_cb(surface);
+ }
+ }
+ }
+ basetexture_cleanup((IWineD3DBaseTexture *)This);
+}
+
+HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UINT levels,
+ IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent)
+{
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ UINT pow2_edge_length;
+ unsigned int i, j;
+ UINT tmp_w;
+ HRESULT hr;
+
+ /* TODO: It should only be possible to create textures for formats
+ * that are reported as supported. */
+ if (WINED3DFMT_UNKNOWN >= format)
+ {
+ WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture);
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ if (!GL_SUPPORT(ARB_TEXTURE_CUBE_MAP) && pool != WINED3DPOOL_SCRATCH)
+ {
+ WARN("(%p) : Tried to create not supported cube texture.\n", texture);
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ /* Calculate levels for mip mapping */
+ if (usage & WINED3DUSAGE_AUTOGENMIPMAP)
+ {
+ if (!GL_SUPPORT(SGIS_GENERATE_MIPMAP))
+ {
+ WARN("No mipmap generation support, returning D3DERR_INVALIDCALL.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ if (levels > 1)
+ {
+ WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ levels = 1;
+ }
+ else if (!levels)
+ {
+ levels = wined3d_log2i(edge_length) + 1;
+ TRACE("Calculated levels = %u.\n", levels);
+ }
+
+ hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels,
+ WINED3DRTYPE_CUBETEXTURE, device, 0, usage, format_desc, pool, parent);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize basetexture, returning %#x\n", hr);
+ return hr;
+ }
+
+ /* Find the nearest pow2 match. */
+ pow2_edge_length = 1;
+ while (pow2_edge_length < edge_length) pow2_edge_length <<= 1;
+
+ if (GL_SUPPORT(ARB_TEXTURE_NON_POWER_OF_TWO) || (edge_length == pow2_edge_length))
+ {
+ /* Precalculated scaling for 'faked' non power of two texture coords. */
+ texture->baseTexture.pow2Matrix[0] = 1.0f;
+ texture->baseTexture.pow2Matrix[5] = 1.0f;
+ texture->baseTexture.pow2Matrix[10] = 1.0f;
+ texture->baseTexture.pow2Matrix[15] = 1.0f;
+ }
+ else
+ {
+ /* Precalculated scaling for 'faked' non power of two texture coords. */
+ texture->baseTexture.pow2Matrix[0] = ((float)edge_length) / ((float)pow2_edge_length);
+ texture->baseTexture.pow2Matrix[5] = ((float)edge_length) / ((float)pow2_edge_length);
+ texture->baseTexture.pow2Matrix[10] = ((float)edge_length) / ((float)pow2_edge_length);
+ texture->baseTexture.pow2Matrix[15] = 1.0f;
+ texture->baseTexture.pow2Matrix_identity = FALSE;
+ }
+
+ /* Generate all the surfaces. */
+ tmp_w = edge_length;
+ for (i = 0; i < texture->baseTexture.levels; ++i)
+ {
+ /* Create the 6 faces. */
+ for (j = 0; j < 6; ++j)
+ {
+ static const GLenum cube_targets[6] =
+ {
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB,
+ };
+
+ hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_w,
+ format, usage, pool, i /* Level */, j, &texture->surfaces[j][i]);
+ if (FAILED(hr))
+ {
+ FIXME("(%p) Failed to create surface, hr %#x.\n", texture, hr);
+ texture->surfaces[j][i] = NULL;
+ cubetexture_cleanup(texture, D3DCB_DefaultDestroySurface);
+ return hr;
+ }
+
+ IWineD3DSurface_SetContainer(texture->surfaces[j][i], (IWineD3DBase *)texture);
+ TRACE("Created surface level %u @ %p.\n", i, texture->surfaces[j][i]);
+ surface_set_texture_target(texture->surfaces[j][i], cube_targets[j]);
+ }
+ tmp_w = max(1, tmp_w >> 1);
+ }
+ texture->baseTexture.internal_preload = cubetexture_internal_preload;
+
+ return WINED3D_OK;
+}
+
+#undef GLINFO_LOCATION
/* *******************************************
IWineD3DCubeTexture IUnknown parts follow
******************************************* */
+
+#define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
+
static HRESULT WINAPI IWineD3DCubeTextureImpl_QueryInterface(IWineD3DCubeTexture *iface, REFIID riid, LPVOID *ppobj)
{
IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
@@ -91,65 +321,6 @@ static DWORD WINAPI IWineD3DCubeTextureImpl_GetPriority(IWineD3DCubeTexture *ifa
return resource_get_priority((IWineD3DResource *)iface);
}
-void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb) {
- /* Override the IWineD3DResource Preload method */
- unsigned int i,j;
- IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
- IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
- BOOL srgb_mode;
- BOOL *dirty;
-
- switch(srgb) {
- case SRGB_RGB: srgb_mode = FALSE; break;
- case SRGB_BOTH: cubetexture_internal_preload(iface, SRGB_RGB);
- case SRGB_SRGB: srgb_mode = TRUE; break;
- /* DONTKNOW, and shut up the compiler */
- default: srgb_mode = This->baseTexture.is_srgb; break;
- }
- dirty = srgb_mode ? &This->baseTexture.srgbDirty : &This->baseTexture.dirty;
-
- TRACE("(%p) : About to load texture: dirtified(%d)\n", This, *dirty);
-
- /* We only have to activate a context for gl when we're not drawing. In most cases PreLoad will be called during draw
- * and a context was activated at the beginning of drawPrimitive
- */
- if(!device->isInDraw) {
- /* No danger of recursive calls, ActivateContext sets isInDraw to true when loading
- * offscreen render targets into their texture
- */
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
- }
-
- if (This->resource.format_desc->format == WINED3DFMT_P8 || This->resource.format_desc->format == WINED3DFMT_A8P8)
- {
- for (i = 0; i < This->baseTexture.levels; i++) {
- for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z ; j++) {
- if(palette9_changed((IWineD3DSurfaceImpl *)This->surfaces[j][i])) {
- TRACE("Reloading surface because the d3d8/9 palette was changed\n");
- /* TODO: This is not necessarily needed with hw palettized texture support */
- IWineD3DSurface_LoadLocation(This->surfaces[j][i], SFLAG_INSYSMEM, NULL);
- /* Make sure the texture is reloaded because of the palette change, this kills performance though :( */
- IWineD3DSurface_ModifyLocation(This->surfaces[j][i], SFLAG_INTEXTURE, FALSE);
- }
- }
- }
- }
- /* If the texture is marked dirty or the srgb sampler setting has changed since the last load then reload the surfaces */
- if (*dirty) {
- for (i = 0; i < This->baseTexture.levels; i++) {
- for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z ; j++) {
- IWineD3DSurface_LoadTexture(This->surfaces[j][i], srgb_mode);
- }
- }
- } else {
- TRACE("(%p) Texture not dirty, nothing to do\n" , iface);
- }
-
- /* No longer dirty */
- *dirty = FALSE;
- return;
-}
-
static void WINAPI IWineD3DCubeTextureImpl_PreLoad(IWineD3DCubeTexture *iface) {
cubetexture_internal_preload((IWineD3DBaseTexture *) iface, SRGB_ANY);
}
@@ -219,6 +390,7 @@ static BOOL WINAPI IWineD3DCubeTextureImpl_GetDirty(IWineD3DCubeTexture *iface)
return basetexture_get_dirty((IWineD3DBaseTexture *)iface);
}
+/* Context activation is done by the caller. */
static HRESULT WINAPI IWineD3DCubeTextureImpl_BindTexture(IWineD3DCubeTexture *iface, BOOL srgb) {
IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
BOOL set_gl_texture_desc;
@@ -257,36 +429,13 @@ static BOOL WINAPI IWineD3DCubeTextureImpl_IsCondNP2(IWineD3DCubeTexture *iface)
return FALSE;
}
-static void WINAPI IWineD3DCubeTextureImpl_ApplyStateChanges(IWineD3DCubeTexture *iface,
- const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1],
- const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]) {
- TRACE("(%p) : relay to BaseTexture\n", iface);
- basetexture_apply_state_changes((IWineD3DBaseTexture *)iface, textureStates, samplerStates);
-}
-
-
/* *******************************************
IWineD3DCubeTexture IWineD3DCubeTexture parts follow
******************************************* */
static void WINAPI IWineD3DCubeTextureImpl_Destroy(IWineD3DCubeTexture *iface, D3DCB_DESTROYSURFACEFN D3DCB_DestroySurface) {
IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
- unsigned int i,j;
- TRACE("(%p) : Cleaning up\n",This);
- for (i = 0; i < This->baseTexture.levels; i++) {
- for (j = 0; j < 6; j++) {
- if (This->surfaces[j][i] != NULL) {
- IWineD3DSurface *surface = This->surfaces[j][i];
- /* Clean out the texture name we gave to the surface so that the surface doesn't try and release it */
- surface_set_texture_name(surface, 0, TRUE);
- surface_set_texture_name(surface, 0, FALSE);
- surface_set_texture_target(surface, 0);
- /* Cleanup the container */
- IWineD3DSurface_SetContainer(This->surfaces[j][i], 0);
- D3DCB_DestroySurface(This->surfaces[j][i]);
- }
- }
- }
- basetexture_cleanup((IWineD3DBaseTexture *)iface);
+
+ cubetexture_cleanup(This, D3DCB_DestroySurface);
/* finally delete the object */
HeapFree(GetProcessHeap(), 0, This);
}
@@ -399,7 +548,6 @@ const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl =
IWineD3DCubeTextureImpl_BindTexture,
IWineD3DCubeTextureImpl_GetTextureDimensions,
IWineD3DCubeTextureImpl_IsCondNP2,
- IWineD3DCubeTextureImpl_ApplyStateChanges,
/* IWineD3DCubeTexture */
IWineD3DCubeTextureImpl_Destroy,
IWineD3DCubeTextureImpl_GetLevelDesc,
diff --git a/reactos/dll/directx/wine/wined3d/device.c b/reactos/dll/directx/wine/wined3d/device.c
index ec6d3f0422e..58e3b699d95 100644
--- a/reactos/dll/directx/wine/wined3d/device.c
+++ b/reactos/dll/directx/wine/wined3d/device.c
@@ -38,26 +38,29 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
/* Define the default light parameters as specified by MSDN */
const WINED3DLIGHT WINED3D_default_light = {
- WINED3DLIGHT_DIRECTIONAL, /* Type */
- { 1.0, 1.0, 1.0, 0.0 }, /* Diffuse r,g,b,a */
- { 0.0, 0.0, 0.0, 0.0 }, /* Specular r,g,b,a */
- { 0.0, 0.0, 0.0, 0.0 }, /* Ambient r,g,b,a, */
- { 0.0, 0.0, 0.0 }, /* Position x,y,z */
- { 0.0, 0.0, 1.0 }, /* Direction x,y,z */
- 0.0, /* Range */
- 0.0, /* Falloff */
- 0.0, 0.0, 0.0, /* Attenuation 0,1,2 */
- 0.0, /* Theta */
- 0.0 /* Phi */
+ WINED3DLIGHT_DIRECTIONAL, /* Type */
+ { 1.0f, 1.0f, 1.0f, 0.0f }, /* Diffuse r,g,b,a */
+ { 0.0f, 0.0f, 0.0f, 0.0f }, /* Specular r,g,b,a */
+ { 0.0f, 0.0f, 0.0f, 0.0f }, /* Ambient r,g,b,a, */
+ { 0.0f, 0.0f, 0.0f }, /* Position x,y,z */
+ { 0.0f, 0.0f, 1.0f }, /* Direction x,y,z */
+ 0.0f, /* Range */
+ 0.0f, /* Falloff */
+ 0.0f, 0.0f, 0.0f, /* Attenuation 0,1,2 */
+ 0.0f, /* Theta */
+ 0.0f /* Phi */
};
-/* static function declarations */
-static void IWineD3DDeviceImpl_AddResource(IWineD3DDevice *iface, IWineD3DResource *resource);
-
/**********************************************************
* Global variable / Constants follow
**********************************************************/
-const float identity[16] = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; /* When needed for comparisons */
+const float identity[] =
+{
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f,
+}; /* When needed for comparisons */
/* Note that except for WINED3DPT_POINTLIST and WINED3DPT_LINELIST these
* actually have the same values in GL and D3D. */
@@ -169,6 +172,7 @@ static BOOL fixed_get_input(BYTE usage, BYTE usage_idx, unsigned int *regnum)
return TRUE;
}
+/* Context activation is done by the caller. */
void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup)
{
@@ -178,7 +182,8 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
const DWORD *streams = declaration->streams;
unsigned int i;
- memset(stream_info, 0, sizeof(*stream_info));
+ stream_info->use_map = 0;
+ stream_info->swizzle_map = 0;
/* Check for transformed vertices, disable vertex shader if present. */
stream_info->position_transformed = declaration->position_transformed;
@@ -440,6 +445,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateBuffer(IWineD3DDevice *iface,
struct wined3d_buffer_desc *desc, const void *data, IUnknown *parent, IWineD3DBuffer **buffer)
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(WINED3DFMT_UNKNOWN, &This->adapter->gl_info);
struct wined3d_buffer *object;
HRESULT hr;
@@ -457,8 +463,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateBuffer(IWineD3DDevice *iface,
FIXME("Ignoring access flags (pool)\n");
- hr = resource_init(&object->resource, WINED3DRTYPE_BUFFER, This, desc->byte_width,
- desc->usage, WINED3DFMT_UNKNOWN, WINED3DPOOL_MANAGED, parent);
+ hr = resource_init((IWineD3DResource *)object, WINED3DRTYPE_BUFFER, This, desc->byte_width,
+ desc->usage, format_desc, WINED3DPOOL_MANAGED, parent);
if (FAILED(hr))
{
WARN("Failed to initialize resource, returning %#x\n", hr);
@@ -469,8 +475,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateBuffer(IWineD3DDevice *iface,
TRACE("Created resource %p\n", object);
- IWineD3DDeviceImpl_AddResource(iface, (IWineD3DResource *)object);
-
TRACE("size %#x, usage=%#x, format %s, memory @ %p, iface @ %p\n", object->resource.size, object->resource.usage,
debug_d3dformat(object->resource.format_desc->format), object->resource.allocatedMemory, object);
@@ -535,7 +539,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *ifac
}
object->vtbl = &wined3d_buffer_vtbl;
- hr = resource_init(&object->resource, WINED3DRTYPE_BUFFER, This, Size, Usage, format_desc, Pool, parent);
+ hr = resource_init((IWineD3DResource *)object, WINED3DRTYPE_BUFFER, This, Size, Usage, format_desc, Pool, parent);
if (FAILED(hr))
{
WARN("Failed to initialize resource, returning %#x\n", hr);
@@ -547,8 +551,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *ifac
TRACE("(%p) : Created resource %p\n", This, object);
- IWineD3DDeviceImpl_AddResource(iface, (IWineD3DResource *)object);
-
TRACE("(%p) : Size=%d, Usage=0x%08x, FVF=%x, Pool=%d - Memory@%p, Iface@%p\n", This, Size, Usage, FVF, Pool, object->resource.allocatedMemory, object);
*ppVertexBuffer = (IWineD3DBuffer *)object;
@@ -602,7 +604,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateIndexBuffer(IWineD3DDevice *iface
}
object->vtbl = &wined3d_buffer_vtbl;
- hr = resource_init(&object->resource, WINED3DRTYPE_BUFFER, This, Length, Usage, format_desc, Pool, parent);
+ hr = resource_init((IWineD3DResource *)object, WINED3DRTYPE_BUFFER, This, Length, Usage, format_desc, Pool, parent);
if (FAILED(hr))
{
WARN("Failed to initialize resource, returning %#x\n", hr);
@@ -614,8 +616,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateIndexBuffer(IWineD3DDevice *iface
TRACE("(%p) : Created resource %p\n", This, object);
- IWineD3DDeviceImpl_AddResource(iface, (IWineD3DResource *)object);
-
if(Pool != WINED3DPOOL_SYSTEMMEM && !(Usage & WINED3DUSAGE_DYNAMIC) && GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT)) {
object->flags |= WINED3D_BUFFER_CREATEBO;
}
@@ -897,171 +897,45 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface,
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface,
- UINT Width, UINT Height, WINED3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level,
- IWineD3DSurface **ppSurface, WINED3DRESOURCETYPE Type, DWORD Usage, WINED3DPOOL Pool,
- WINED3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, WINED3DSURFTYPE Impl, IUnknown *parent)
+static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UINT Width, UINT Height,
+ WINED3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IWineD3DSurface **ppSurface,
+ DWORD Usage, WINED3DPOOL Pool, WINED3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality,
+ WINED3DSURFTYPE Impl, IUnknown *parent)
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- IWineD3DSurfaceImpl *object; /*NOTE: impl ref allowed since this is a create function */
- unsigned int Size = 1;
- const struct GlPixelFormatDesc *glDesc = getFormatDescEntry(Format, &GLINFO_LOCATION);
- UINT mul_4w, mul_4h;
+ IWineD3DSurfaceImpl *object;
HRESULT hr;
TRACE("(%p) Create surface\n",This);
- if(MultisampleQuality > 0) {
- FIXME("MultisampleQuality set to %d, substituting 0\n", MultisampleQuality);
- MultisampleQuality=0;
+ if (Impl == SURFACE_OPENGL && !This->adapter)
+ {
+ ERR("OpenGL surfaces are not available without OpenGL.\n");
+ return WINED3DERR_NOTAVAILABLE;
}
- /** FIXME: Check that the format is supported
- * by the device.
- *******************************/
-
- /** DXTn mipmaps use the same number of 'levels' down to eg. 8x1, but since
- * it is based around 4x4 pixel blocks it requires padding, so allocate enough
- * space!
- *********************************/
- mul_4w = (Width + 3) & ~3;
- mul_4h = (Height + 3) & ~3;
- if (WINED3DFMT_UNKNOWN == Format) {
- Size = 0;
- } else if (Format == WINED3DFMT_DXT1) {
- /* DXT1 is half byte per pixel */
- Size = (mul_4w * glDesc->byte_count * mul_4h) >> 1;
-
- } else if (Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3 ||
- Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5 ||
- Format == WINED3DFMT_ATI2N) {
- Size = (mul_4w * glDesc->byte_count * mul_4h);
- } else {
- /* The pitch is a multiple of 4 bytes */
- Size = ((Width * glDesc->byte_count) + This->surface_alignment - 1) & ~(This->surface_alignment - 1);
- Size *= Height;
- }
-
- if(glDesc->heightscale != 0.0) Size *= glDesc->heightscale;
-
- /** Create and initialise the surface resource **/
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (!object)
{
- ERR("Out of memory\n");
+ ERR("Failed to allocate surface memory.\n");
*ppSurface = NULL;
return WINED3DERR_OUTOFVIDEOMEMORY;
}
- /* Look at the implementation and set the correct Vtable */
- switch(Impl)
- {
- case SURFACE_OPENGL:
- /* Check if a 3D adapter is available when creating gl surfaces */
- if (!This->adapter)
- {
- ERR("OpenGL surfaces are not available without opengl\n");
- HeapFree(GetProcessHeap(), 0, object);
- return WINED3DERR_NOTAVAILABLE;
- }
- object->lpVtbl = &IWineD3DSurface_Vtbl;
- break;
-
- case SURFACE_GDI:
- object->lpVtbl = &IWineGDISurface_Vtbl;
- break;
-
- default:
- /* To be sure to catch this */
- ERR("Unknown requested surface implementation %d!\n", Impl);
- HeapFree(GetProcessHeap(), 0, object);
- return WINED3DERR_INVALIDCALL;
- }
-
- hr = resource_init(&object->resource, WINED3DRTYPE_SURFACE, This, Size, Usage, glDesc, Pool, parent);
+ hr = surface_init(object, Impl, This->surface_alignment, Width, Height, Level, Lockable,
+ Discard, MultiSample, MultisampleQuality, This, Usage, Format, Pool, parent);
if (FAILED(hr))
{
- WARN("Failed to initialize resource, returning %#x\n", hr);
+ WARN("Failed to initialize surface, returning %#x.\n", hr);
HeapFree(GetProcessHeap(), 0, object);
*ppSurface = NULL;
return hr;
}
- TRACE("(%p) : Created resource %p\n", This, object);
-
- IWineD3DDeviceImpl_AddResource(iface, (IWineD3DResource *)object);
+ TRACE("(%p) : Created surface %p\n", This, object);
*ppSurface = (IWineD3DSurface *)object;
- /* "Standalone" surface */
- IWineD3DSurface_SetContainer((IWineD3DSurface *)object, NULL);
-
- object->currentDesc.Width = Width;
- object->currentDesc.Height = Height;
- object->currentDesc.MultiSampleType = MultiSample;
- object->currentDesc.MultiSampleQuality = MultisampleQuality;
- object->glDescription.level = Level;
- list_init(&object->overlays);
-
- /* Flags */
- object->Flags = SFLAG_NORMCOORD; /* Default to normalized coords */
- object->Flags |= Discard ? SFLAG_DISCARD : 0;
- object->Flags |= (WINED3DFMT_D16_LOCKABLE == Format) ? SFLAG_LOCKABLE : 0;
- object->Flags |= Lockable ? SFLAG_LOCKABLE : 0;
-
- TRACE("Pool %d %d %d %d\n",Pool, WINED3DPOOL_DEFAULT, WINED3DPOOL_MANAGED, WINED3DPOOL_SYSTEMMEM);
-
- /** Quick lockable sanity check TODO: remove this after surfaces, usage and lockability have been debugged properly
- * this function is too deep to need to care about things like this.
- * Levels need to be checked too, and possibly Type since they all affect what can be done.
- * ****************************************/
- switch(Pool) {
- case WINED3DPOOL_SCRATCH:
- if(!Lockable)
- FIXME("Create surface called with a pool of SCRATCH and a Lockable of FALSE "
- "which are mutually exclusive, setting lockable to TRUE\n");
- Lockable = TRUE;
- break;
- case WINED3DPOOL_SYSTEMMEM:
- if(!Lockable) FIXME("Create surface called with a pool of SYSTEMMEM and a Lockable of FALSE, "
- "this is acceptable but unexpected (I can't know how the surface can be usable!)\n");
- case WINED3DPOOL_MANAGED:
- if(Usage == WINED3DUSAGE_DYNAMIC) FIXME("Create surface called with a pool of MANAGED and a "
- "Usage of DYNAMIC which are mutually exclusive, not doing "
- "anything just telling you.\n");
- break;
- case WINED3DPOOL_DEFAULT: /*TODO: Create offscreen plain can cause this check to fail..., find out if it should */
- if(!(Usage & WINED3DUSAGE_DYNAMIC) && !(Usage & WINED3DUSAGE_RENDERTARGET)
- && !(Usage && WINED3DUSAGE_DEPTHSTENCIL ) && Lockable)
- WARN("Creating a surface with a POOL of DEFAULT with Lockable true, that doesn't specify DYNAMIC usage.\n");
- break;
- default:
- FIXME("(%p) Unknown pool %d\n", This, Pool);
- break;
- };
-
- if (Usage & WINED3DUSAGE_RENDERTARGET && Pool != WINED3DPOOL_DEFAULT) {
- FIXME("Trying to create a render target that isn't in the default pool\n");
- }
-
- /* mark the texture as dirty so that it gets loaded first time around*/
- surface_add_dirty_rect(*ppSurface, NULL);
- TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) lockable(%d) surf@%p, surfmem@%p, %d bytes\n",
- This, Width, Height, Format, debug_d3dformat(Format),
- (WINED3DFMT_D16_LOCKABLE == Format), *ppSurface, object->resource.allocatedMemory, object->resource.size);
-
- list_init(&object->renderbuffers);
-
- /* Call the private setup routine */
- hr = IWineD3DSurface_PrivateSetup((IWineD3DSurface *)object);
- if (FAILED(hr))
- {
- ERR("Private setup failed, returning %#x\n", hr);
- IWineD3DSurface_Release(*ppSurface);
- *ppSurface = NULL;
- return hr;
- }
-
return hr;
}
@@ -1093,73 +967,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateTexture(IWineD3DDevice *iface,
WINED3DPOOL Pool, IWineD3DTexture **ppTexture, IUnknown *parent)
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(Format, &This->adapter->gl_info);
IWineD3DTextureImpl *object;
- unsigned int i;
- UINT tmpW;
- UINT tmpH;
HRESULT hr;
- unsigned int pow2Width;
- unsigned int pow2Height;
TRACE("(%p) : Width %d, Height %d, Levels %d, Usage %#x\n", This, Width, Height, Levels, Usage);
TRACE("Format %#x (%s), Pool %#x, ppTexture %p, parent %p\n",
Format, debug_d3dformat(Format), Pool, ppTexture, parent);
- /* TODO: It should only be possible to create textures for formats
- that are reported as supported */
- if (WINED3DFMT_UNKNOWN >= Format) {
- WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN\n", This);
- return WINED3DERR_INVALIDCALL;
- }
-
- /* Non-power2 support */
- if (GL_SUPPORT(ARB_TEXTURE_NON_POWER_OF_TWO))
- {
- pow2Width = Width;
- pow2Height = Height;
- }
- else
- {
- /* Find the nearest pow2 match */
- pow2Width = pow2Height = 1;
- while (pow2Width < Width) pow2Width <<= 1;
- while (pow2Height < Height) pow2Height <<= 1;
-
- if (pow2Width != Width || pow2Height != Height)
- {
- if (Levels > 1)
- {
- WARN("Attempted to create a mipmapped np2 texture without unconditional np2 support\n");
- return WINED3DERR_INVALIDCALL;
- }
- Levels = 1;
- }
- }
-
- /* Calculate levels for mip mapping */
- if (Usage & WINED3DUSAGE_AUTOGENMIPMAP)
- {
- if (!GL_SUPPORT(SGIS_GENERATE_MIPMAP))
- {
- WARN("No mipmap generation support, returning D3DERR_INVALIDCALL\n");
- return WINED3DERR_INVALIDCALL;
- }
-
- if (Levels > 1)
- {
- WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL\n");
- return WINED3DERR_INVALIDCALL;
- }
-
- Levels = 1;
- }
- else if (!Levels)
- {
- Levels = wined3d_log2i(max(Width, Height)) + 1;
- TRACE("Calculated levels = %d\n", Levels);
- }
-
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (!object)
{
@@ -1169,106 +983,20 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateTexture(IWineD3DDevice *iface,
}
object->lpVtbl = &IWineD3DTexture_Vtbl;
- hr = resource_init(&object->resource, WINED3DRTYPE_TEXTURE, This, 0, Usage, format_desc, Pool, parent);
+
+ hr = texture_init(object, Width, Height, Levels, This, Usage, Format, Pool, parent);
if (FAILED(hr))
{
- WARN("Failed to initialize resource, returning %#x\n", hr);
+ WARN("Failed to initialize texture, returning %#x\n", hr);
HeapFree(GetProcessHeap(), 0, object);
*ppTexture = NULL;
return hr;
}
- TRACE("(%p) : Created resource %p\n", This, object);
-
- IWineD3DDeviceImpl_AddResource(iface, (IWineD3DResource *)object);
-
*ppTexture = (IWineD3DTexture *)object;
- basetexture_init(&object->baseTexture, Levels, Usage);
+ TRACE("(%p) : Created texture %p\n", This, object);
- if (object->resource.format_desc->Flags & WINED3DFMT_FLAG_FILTERING)
- {
- object->baseTexture.minMipLookup = minMipLookup;
- object->baseTexture.magLookup = magLookup;
- } else {
- object->baseTexture.minMipLookup = minMipLookup_noFilter;
- object->baseTexture.magLookup = magLookup_noFilter;
- }
-
- /** FIXME: add support for real non-power-two if it's provided by the video card **/
- /* Precalculated scaling for 'faked' non power of two texture coords.
- Second also don't use ARB_TEXTURE_RECTANGLE in case the surface format is P8 and EXT_PALETTED_TEXTURE
- is used in combination with texture uploads (RTL_READTEX/RTL_TEXTEX). The reason is that EXT_PALETTED_TEXTURE
- doesn't work in combination with ARB_TEXTURE_RECTANGLE.
- */
- if(GL_SUPPORT(WINE_NORMALIZED_TEXRECT) && (Width != pow2Width || Height != pow2Height)) {
- object->baseTexture.pow2Matrix[0] = 1.0;
- object->baseTexture.pow2Matrix[5] = 1.0;
- object->baseTexture.pow2Matrix[10] = 1.0;
- object->baseTexture.pow2Matrix[15] = 1.0;
- object->target = GL_TEXTURE_2D;
- object->cond_np2 = TRUE;
- object->baseTexture.minMipLookup = minMipLookup_noFilter;
- } else if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE) &&
- (Width != pow2Width || Height != pow2Height) &&
- !((Format == WINED3DFMT_P8) && GL_SUPPORT(EXT_PALETTED_TEXTURE) && (wined3d_settings.rendertargetlock_mode == RTL_READTEX || wined3d_settings.rendertargetlock_mode == RTL_TEXTEX)))
- {
- if ((Width != 1) || (Height != 1)) {
- object->baseTexture.pow2Matrix_identity = FALSE;
- }
-
- object->baseTexture.pow2Matrix[0] = (float)Width;
- object->baseTexture.pow2Matrix[5] = (float)Height;
- object->baseTexture.pow2Matrix[10] = 1.0;
- object->baseTexture.pow2Matrix[15] = 1.0;
- object->target = GL_TEXTURE_RECTANGLE_ARB;
- object->cond_np2 = TRUE;
- object->baseTexture.minMipLookup = minMipLookup_noFilter;
- } else {
- if ((Width != pow2Width) || (Height != pow2Height)) {
- object->baseTexture.pow2Matrix_identity = FALSE;
- object->baseTexture.pow2Matrix[0] = (((float)Width) / ((float)pow2Width));
- object->baseTexture.pow2Matrix[5] = (((float)Height) / ((float)pow2Height));
- } else {
- object->baseTexture.pow2Matrix[0] = 1.0;
- object->baseTexture.pow2Matrix[5] = 1.0;
- }
-
- object->baseTexture.pow2Matrix[10] = 1.0;
- object->baseTexture.pow2Matrix[15] = 1.0;
- object->target = GL_TEXTURE_2D;
- object->cond_np2 = FALSE;
- }
- TRACE(" xf(%f) yf(%f)\n", object->baseTexture.pow2Matrix[0], object->baseTexture.pow2Matrix[5]);
-
- /* Generate all the surfaces */
- tmpW = Width;
- tmpH = Height;
- for (i = 0; i < object->baseTexture.levels; i++)
- {
- /* use the callback to create the texture surface */
- hr = IWineD3DDeviceParent_CreateSurface(This->device_parent, parent, tmpW, tmpH, Format,
- Usage, Pool, i, WINED3DCUBEMAP_FACE_POSITIVE_X, &object->surfaces[i]);
- if (hr!= WINED3D_OK || ( (IWineD3DSurfaceImpl *) object->surfaces[i])->Flags & SFLAG_OVERSIZE) {
- FIXME("Failed to create surface %p\n", object);
- /* clean up */
- object->surfaces[i] = NULL;
- IWineD3DTexture_Release((IWineD3DTexture *)object);
-
- *ppTexture = NULL;
- return hr;
- }
-
- IWineD3DSurface_SetContainer(object->surfaces[i], (IWineD3DBase *)object);
- TRACE("Created surface level %d @ %p\n", i, object->surfaces[i]);
- surface_set_texture_target(object->surfaces[i], object->target);
- /* calculate the next mipmap level */
- tmpW = max(1, tmpW >> 1);
- tmpH = max(1, tmpH >> 1);
- }
- object->baseTexture.internal_preload = texture_internal_preload;
-
- TRACE("(%p) : Created texture %p\n", This, object);
return WINED3D_OK;
}
@@ -1277,47 +1005,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolumeTexture(IWineD3DDevice *ifa
WINED3DPOOL Pool, IWineD3DVolumeTexture **ppVolumeTexture, IUnknown *parent)
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(Format, &This->adapter->gl_info);
IWineD3DVolumeTextureImpl *object;
- unsigned int i;
- UINT tmpW;
- UINT tmpH;
- UINT tmpD;
HRESULT hr;
- /* TODO: It should only be possible to create textures for formats
- that are reported as supported */
- if (WINED3DFMT_UNKNOWN >= Format) {
- WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN\n", This);
- return WINED3DERR_INVALIDCALL;
- }
- if(!GL_SUPPORT(EXT_TEXTURE3D)) {
- WARN("(%p) : Texture cannot be created - no volume texture support\n", This);
- return WINED3DERR_INVALIDCALL;
- }
-
- /* Calculate levels for mip mapping */
- if (Usage & WINED3DUSAGE_AUTOGENMIPMAP)
- {
- if (!GL_SUPPORT(SGIS_GENERATE_MIPMAP))
- {
- WARN("No mipmap generation support, returning D3DERR_INVALIDCALL\n");
- return WINED3DERR_INVALIDCALL;
- }
-
- if (Levels > 1)
- {
- WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL\n");
- return WINED3DERR_INVALIDCALL;
- }
-
- Levels = 1;
- }
- else if (!Levels)
- {
- Levels = wined3d_log2i(max(max(Width, Height), Depth)) + 1;
- TRACE("Calculated levels = %d\n", Levels);
- }
+ TRACE("(%p) : W(%u) H(%u) D(%u), Lvl(%u) Usage(%#x), Fmt(%u,%s), Pool(%s)\n", This, Width, Height,
+ Depth, Levels, Usage, Format, debug_d3dformat(Format), debug_d3dpool(Pool));
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (!object)
@@ -1328,69 +1020,18 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolumeTexture(IWineD3DDevice *ifa
}
object->lpVtbl = &IWineD3DVolumeTexture_Vtbl;
- hr = resource_init(&object->resource, WINED3DRTYPE_VOLUMETEXTURE, This, 0, Usage, format_desc, Pool, parent);
+ hr = volumetexture_init(object, Width, Height, Depth, Levels, This, Usage, Format, Pool, parent);
if (FAILED(hr))
{
- WARN("Failed to initialize resource, returning %#x\n", hr);
+ WARN("Failed to initialize volumetexture, returning %#x\n", hr);
HeapFree(GetProcessHeap(), 0, object);
*ppVolumeTexture = NULL;
return hr;
}
- TRACE("(%p) : Created resource %p\n", This, object);
+ TRACE("(%p) : Created volume texture %p.\n", This, object);
+ *ppVolumeTexture = (IWineD3DVolumeTexture *)object;
- IWineD3DDeviceImpl_AddResource(iface, (IWineD3DResource *)object);
-
- basetexture_init(&object->baseTexture, Levels, Usage);
-
- TRACE("(%p) : W(%d) H(%d) D(%d), Lvl(%d) Usage(%d), Fmt(%u,%s), Pool(%s)\n", This, Width, Height,
- Depth, Levels, Usage, Format, debug_d3dformat(Format), debug_d3dpool(Pool));
-
- /* Is NP2 support for volumes needed? */
- object->baseTexture.pow2Matrix[ 0] = 1.0;
- object->baseTexture.pow2Matrix[ 5] = 1.0;
- object->baseTexture.pow2Matrix[10] = 1.0;
- object->baseTexture.pow2Matrix[15] = 1.0;
-
- if (object->resource.format_desc->Flags & WINED3DFMT_FLAG_FILTERING)
- {
- object->baseTexture.minMipLookup = minMipLookup;
- object->baseTexture.magLookup = magLookup;
- } else {
- object->baseTexture.minMipLookup = minMipLookup_noFilter;
- object->baseTexture.magLookup = magLookup_noFilter;
- }
-
- /* Generate all the surfaces */
- tmpW = Width;
- tmpH = Height;
- tmpD = Depth;
-
- for (i = 0; i < object->baseTexture.levels; i++)
- {
- HRESULT hr;
- /* Create the volume */
- hr = IWineD3DDeviceParent_CreateVolume(This->device_parent, parent,
- tmpW, tmpH, tmpD, Format, Pool, Usage, &object->volumes[i]);
- if(FAILED(hr)) {
- ERR("Creating a volume for the volume texture failed(%08x)\n", hr);
- IWineD3DVolumeTexture_Release((IWineD3DVolumeTexture *) object);
- *ppVolumeTexture = NULL;
- return hr;
- }
-
- /* Set its container to this object */
- IWineD3DVolume_SetContainer(object->volumes[i], (IWineD3DBase *)object);
-
- /* calculate the next mipmap level */
- tmpW = max(1, tmpW >> 1);
- tmpH = max(1, tmpH >> 1);
- tmpD = max(1, tmpD >> 1);
- }
- object->baseTexture.internal_preload = volumetexture_internal_preload;
-
- *ppVolumeTexture = (IWineD3DVolumeTexture *) object;
- TRACE("(%p) : Created volume texture %p\n", This, object);
return WINED3D_OK;
}
@@ -1417,7 +1058,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface,
}
object->lpVtbl = &IWineD3DVolume_Vtbl;
- hr = resource_init(&object->resource, WINED3DRTYPE_VOLUME, This,
+ hr = resource_init((IWineD3DResource *)object, WINED3DRTYPE_VOLUME, This,
Width * Height * Depth * format_desc->byte_count, Usage, format_desc, Pool, parent);
if (FAILED(hr))
{
@@ -1429,8 +1070,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface,
TRACE("(%p) : Created resource %p\n", This, object);
- IWineD3DDeviceImpl_AddResource(iface, (IWineD3DResource *)object);
-
*ppVolume = (IWineD3DVolume *)object;
TRACE("(%p) : W(%d) H(%d) D(%d), Usage(%d), Fmt(%u,%s), Pool(%s)\n", This, Width, Height,
@@ -1456,47 +1095,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface
WINED3DPOOL Pool, IWineD3DCubeTexture **ppCubeTexture, IUnknown *parent)
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(Format, &This->adapter->gl_info);
IWineD3DCubeTextureImpl *object; /** NOTE: impl ref allowed since this is a create function **/
- unsigned int i, j;
- UINT tmpW;
HRESULT hr;
- unsigned int pow2EdgeLength;
-
- /* TODO: It should only be possible to create textures for formats
- that are reported as supported */
- if (WINED3DFMT_UNKNOWN >= Format) {
- WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN\n", This);
- return WINED3DERR_INVALIDCALL;
- }
-
- if (!GL_SUPPORT(ARB_TEXTURE_CUBE_MAP) && Pool != WINED3DPOOL_SCRATCH) {
- WARN("(%p) : Tried to create not supported cube texture\n", This);
- return WINED3DERR_INVALIDCALL;
- }
-
- /* Calculate levels for mip mapping */
- if (Usage & WINED3DUSAGE_AUTOGENMIPMAP)
- {
- if (!GL_SUPPORT(SGIS_GENERATE_MIPMAP))
- {
- WARN("No mipmap generation support, returning D3DERR_INVALIDCALL\n");
- return WINED3DERR_INVALIDCALL;
- }
-
- if (Levels > 1)
- {
- WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL\n");
- return WINED3DERR_INVALIDCALL;
- }
-
- Levels = 1;
- }
- else if (!Levels)
- {
- Levels = wined3d_log2i(EdgeLength) + 1;
- TRACE("Calculated levels = %d\n", Levels);
- }
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (!object)
@@ -1507,85 +1107,18 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface
}
object->lpVtbl = &IWineD3DCubeTexture_Vtbl;
- hr = resource_init(&object->resource, WINED3DRTYPE_CUBETEXTURE, This, 0, Usage, format_desc, Pool, parent);
+ hr = cubetexture_init(object, EdgeLength, Levels, This, Usage, Format, Pool, parent);
if (FAILED(hr))
{
- WARN("Failed to initialize resource, returning %#x\n", hr);
+ WARN("Failed to initialize cubetexture, returning %#x\n", hr);
HeapFree(GetProcessHeap(), 0, object);
*ppCubeTexture = NULL;
return hr;
}
- TRACE("(%p) : Created resource %p\n", This, object);
-
- IWineD3DDeviceImpl_AddResource(iface, (IWineD3DResource *)object);
-
- basetexture_init(&object->baseTexture, Levels, Usage);
-
- TRACE("(%p) Create Cube Texture\n", This);
-
- /* Find the nearest pow2 match */
- pow2EdgeLength = 1;
- while (pow2EdgeLength < EdgeLength) pow2EdgeLength <<= 1;
-
- if (GL_SUPPORT(ARB_TEXTURE_NON_POWER_OF_TWO) || (EdgeLength == pow2EdgeLength)) {
- /* Precalculated scaling for 'faked' non power of two texture coords */
- object->baseTexture.pow2Matrix[ 0] = 1.0;
- object->baseTexture.pow2Matrix[ 5] = 1.0;
- object->baseTexture.pow2Matrix[10] = 1.0;
- object->baseTexture.pow2Matrix[15] = 1.0;
- } else {
- /* Precalculated scaling for 'faked' non power of two texture coords */
- object->baseTexture.pow2Matrix[ 0] = ((float)EdgeLength) / ((float)pow2EdgeLength);
- object->baseTexture.pow2Matrix[ 5] = ((float)EdgeLength) / ((float)pow2EdgeLength);
- object->baseTexture.pow2Matrix[10] = ((float)EdgeLength) / ((float)pow2EdgeLength);
- object->baseTexture.pow2Matrix[15] = 1.0;
- object->baseTexture.pow2Matrix_identity = FALSE;
- }
-
- if (object->resource.format_desc->Flags & WINED3DFMT_FLAG_FILTERING)
- {
- object->baseTexture.minMipLookup = minMipLookup;
- object->baseTexture.magLookup = magLookup;
- } else {
- object->baseTexture.minMipLookup = minMipLookup_noFilter;
- object->baseTexture.magLookup = magLookup_noFilter;
- }
-
- /* Generate all the surfaces */
- tmpW = EdgeLength;
- for (i = 0; i < object->baseTexture.levels; i++) {
-
- /* Create the 6 faces */
- for (j = 0; j < 6; j++) {
- static const GLenum cube_targets[6] = {
- GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
- GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
- GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
- GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
- GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
- GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB
- };
-
- hr = IWineD3DDeviceParent_CreateSurface(This->device_parent, parent, tmpW, tmpW,
- Format, Usage, Pool, i /* Level */, j, &object->surfaces[j][i]);
- if (FAILED(hr))
- {
- FIXME("(%p) Failed to create surface\n",object);
- IWineD3DCubeTexture_Release((IWineD3DCubeTexture *)object);
- *ppCubeTexture = NULL;
- return hr;
- }
- IWineD3DSurface_SetContainer(object->surfaces[j][i], (IWineD3DBase *)object);
- TRACE("Created surface level %d @ %p,\n", i, object->surfaces[j][i]);
- surface_set_texture_target(object->surfaces[j][i], cube_targets[j]);
- }
- tmpW = max(1, tmpW >> 1);
- }
- object->baseTexture.internal_preload = cubetexture_internal_preload;
-
TRACE("(%p) : Created Cube Texture %p\n", This, object);
- *ppCubeTexture = (IWineD3DCubeTexture *) object;
+ *ppCubeTexture = (IWineD3DCubeTexture *)object;
+
return WINED3D_OK;
}
@@ -1659,32 +1192,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, WINE
/* allocated the 'extended' data based on the type of query requested */
switch(Type){
case WINED3DQUERYTYPE_OCCLUSION:
- object->extendedData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WineQueryOcclusionData));
- ((WineQueryOcclusionData *)(object->extendedData))->ctx = This->activeContext;
+ object->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_occlusion_query));
+ ((struct wined3d_occlusion_query *)object->extendedData)->context = NULL;
+ break;
- if(GL_SUPPORT(ARB_OCCLUSION_QUERY)) {
- TRACE("(%p) Allocating data for an occlusion query\n", This);
-
- ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
- ENTER_GL();
- GL_EXTCALL(glGenQueriesARB(1, &((WineQueryOcclusionData *)(object->extendedData))->queryId));
- LEAVE_GL();
- break;
- }
case WINED3DQUERYTYPE_EVENT:
- object->extendedData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WineQueryEventData));
- ((WineQueryEventData *)(object->extendedData))->ctx = This->activeContext;
-
- ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
- ENTER_GL();
- if(GL_SUPPORT(APPLE_FENCE)) {
- GL_EXTCALL(glGenFencesAPPLE(1, &((WineQueryEventData *)(object->extendedData))->fenceId));
- checkGLcall("glGenFencesAPPLE");
- } else if(GL_SUPPORT(NV_FENCE)) {
- GL_EXTCALL(glGenFencesNV(1, &((WineQueryEventData *)(object->extendedData))->fenceId));
- checkGLcall("glGenFencesNV");
- }
- LEAVE_GL();
+ object->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_event_query));
+ ((struct wined3d_event_query *)object->extendedData)->context = NULL;
break;
case WINED3DQUERYTYPE_VCACHE:
@@ -2327,7 +1841,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclarationFromFVF(IWineD3D
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexShader(IWineD3DDevice *iface, IWineD3DVertexDeclaration *vertex_declaration, CONST DWORD *pFunction, IWineD3DVertexShader **ppVertexShader, IUnknown *parent) {
+static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexShader(IWineD3DDevice *iface,
+ const DWORD *pFunction, const struct wined3d_shader_signature *output_signature,
+ IWineD3DVertexShader **ppVertexShader, IUnknown *parent)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DVertexShaderImpl *object; /* NOTE: impl usage is ok, this is a create */
HRESULT hr = WINED3D_OK;
@@ -2350,11 +1867,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexShader(IWineD3DDevice *ifac
TRACE("(%p) : Created vertex shader %p\n", This, *ppVertexShader);
- if (vertex_declaration) {
- IWineD3DVertexShader_FakeSemantics(*ppVertexShader, vertex_declaration);
- }
-
- hr = IWineD3DVertexShader_SetFunction(*ppVertexShader, pFunction, NULL);
+ hr = IWineD3DVertexShader_SetFunction(*ppVertexShader, pFunction, output_signature);
if (FAILED(hr))
{
WARN("(%p) : Failed to set function, returning %#x\n", iface, hr);
@@ -2468,9 +1981,8 @@ static void IWineD3DDeviceImpl_LoadLogo(IWineD3DDeviceImpl *This, const char *fi
bm.bmHeight = 32;
}
- hr = IWineD3DDevice_CreateSurface((IWineD3DDevice *) This, bm.bmWidth, bm.bmHeight, WINED3DFMT_R5G6B5,
- TRUE, FALSE, 0, &This->logo_surface, WINED3DRTYPE_SURFACE, 0,
- WINED3DPOOL_DEFAULT, WINED3DMULTISAMPLE_NONE, 0, SURFACE_OPENGL, NULL);
+ hr = IWineD3DDevice_CreateSurface((IWineD3DDevice *) This, bm.bmWidth, bm.bmHeight, WINED3DFMT_R5G6B5, TRUE,
+ FALSE, 0, &This->logo_surface, 0, WINED3DPOOL_DEFAULT, WINED3DMULTISAMPLE_NONE, 0, SURFACE_OPENGL, NULL);
if(FAILED(hr)) {
ERR("Wine logo requested, but failed to create surface\n");
goto out;
@@ -2500,6 +2012,7 @@ static void IWineD3DDeviceImpl_LoadLogo(IWineD3DDeviceImpl *This, const char *fi
return;
}
+/* Context activation is done by the caller. */
static void create_dummy_textures(IWineD3DDeviceImpl *This) {
unsigned int i;
/* Under DirectX you can have texture stage operations even if no texture is
@@ -2601,12 +2114,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
This->texUnitMap[state] = state;
This->rev_tex_unit_map[state] = state;
} else {
- This->texUnitMap[state] = -1;
- This->rev_tex_unit_map[state] = -1;
+ This->texUnitMap[state] = WINED3D_UNMAPPED_STAGE;
+ This->rev_tex_unit_map[state] = WINED3D_UNMAPPED_STAGE;
}
}
- /* Setup the implicit swapchain */
+ /* Setup the implicit swapchain. This also initializes a context. */
TRACE("Creating implicit swapchain\n");
hr = IWineD3DDeviceParent_CreateSwapChain(This->device_parent,
pPresentationParameters, (IWineD3DSwapChain **)&swapchain);
@@ -2627,16 +2140,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
if(swapchain->backBuffer && swapchain->backBuffer[0]) {
TRACE("Setting rendertarget to %p\n", swapchain->backBuffer);
This->render_targets[0] = swapchain->backBuffer[0];
- This->lastActiveRenderTarget = swapchain->backBuffer[0];
}
else {
TRACE("Setting rendertarget to %p\n", swapchain->frontBuffer);
This->render_targets[0] = swapchain->frontBuffer;
- This->lastActiveRenderTarget = swapchain->frontBuffer;
}
IWineD3DSurface_AddRef(This->render_targets[0]);
- This->activeContext = swapchain->context[0];
- This->lastThread = GetCurrentThreadId();
/* Depth Stencil support */
This->stencilBufferTarget = This->auto_depth_stencil_buffer;
@@ -2682,7 +2191,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
case ORM_BACKBUFFER:
{
- if(This->activeContext->aux_buffers > 0) {
+ if (context_get_current()->aux_buffers > 0)
+ {
TRACE("Using auxilliary buffer for offscreen rendering\n");
This->offscreenBuffer = GL_AUX0;
} else {
@@ -2698,7 +2208,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
/* Clear the screen */
IWineD3DDevice_Clear((IWineD3DDevice *) This, 0, NULL,
WINED3DCLEAR_TARGET | pPresentationParameters->EnableAutoDepthStencil ? WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL : 0,
- 0x00, 1.0, 0);
+ 0x00, 1.0f, 0);
This->d3d_initialized = TRUE;
@@ -2787,7 +2297,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_D
/* I don't think that the interface guarantees that the device is destroyed from the same thread
* it was created. Thus make sure a context is active for the glDelete* calls
*/
- ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
if(This->logo_surface) IWineD3DSurface_Release(This->logo_surface);
@@ -2834,11 +2344,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_D
* private data, it might contain opengl pointers
*/
if(This->depth_blt_texture) {
+ ENTER_GL();
glDeleteTextures(1, &This->depth_blt_texture);
+ LEAVE_GL();
This->depth_blt_texture = 0;
}
if (This->depth_blt_rb) {
+ ENTER_GL();
GL_EXTCALL(glDeleteRenderbuffersEXT(1, &This->depth_blt_rb));
+ LEAVE_GL();
This->depth_blt_rb = 0;
This->depth_blt_rb_w = 0;
This->depth_blt_rb_h = 0;
@@ -3269,7 +2783,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
/* Incorrect attenuation values can cause the gl driver to crash. Happens with Need for speed
* most wanted
*/
- if(pLight->Attenuation0 < 0.0 || pLight->Attenuation1 < 0.0 || pLight->Attenuation2 < 0.0) {
+ if (pLight->Attenuation0 < 0.0f || pLight->Attenuation1 < 0.0f || pLight->Attenuation2 < 0.0f)
+ {
WARN("Attenuation is negative, returning WINED3DERR_INVALIDCALL\n");
return WINED3DERR_INVALIDCALL;
}
@@ -3331,7 +2846,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
object->lightPosn[0] = -pLight->Direction.x;
object->lightPosn[1] = -pLight->Direction.y;
object->lightPosn[2] = -pLight->Direction.z;
- object->lightPosn[3] = 0.0;
+ object->lightPosn[3] = 0.0f;
object->exponent = 0.0f;
object->cutoff = 180.0f;
break;
@@ -3341,13 +2856,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
object->lightPosn[0] = pLight->Position.x;
object->lightPosn[1] = pLight->Position.y;
object->lightPosn[2] = pLight->Position.z;
- object->lightPosn[3] = 1.0;
+ object->lightPosn[3] = 1.0f;
/* Direction */
object->lightDirn[0] = pLight->Direction.x;
object->lightDirn[1] = pLight->Direction.y;
object->lightDirn[2] = pLight->Direction.z;
- object->lightDirn[3] = 1.0;
+ object->lightDirn[3] = 1.0f;
/*
* opengl-ish and d3d-ish spot lights use too different models for the
@@ -3362,14 +2877,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I
* will always be 1.0 for both of them, and we don't have to care for the
* rest of the rather complex calculation
*/
- object->exponent = 0;
+ object->exponent = 0.0f;
} else {
rho = pLight->Theta + (pLight->Phi - pLight->Theta)/(2*pLight->Falloff);
- if (rho < 0.0001) rho = 0.0001f;
- object->exponent = -0.3/log(cos(rho/2));
+ if (rho < 0.0001f) rho = 0.0001f;
+ object->exponent = -0.3f/logf(cosf(rho/2));
}
- if (object->exponent > 128.0) {
- object->exponent = 128.0;
+ if (object->exponent > 128.0f)
+ {
+ object->exponent = 128.0f;
}
object->cutoff = pLight->Phi*90/M_PI;
@@ -3420,9 +2936,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLightEnable(IWineD3DDevice *iface, D
struct list *e;
TRACE("(%p) : Idx(%d), enable? %d\n", This, Index, Enable);
- /* Tests show true = 128...not clear why */
- Enable = Enable? 128: 0;
-
LIST_FOR_EACH(e, &This->updateStateBlock->lightMap[Hi]) {
lightInfo = LIST_ENTRY(e, PLIGHTINFOEL, entry);
if(lightInfo->OriginalIndex == Index) break;
@@ -4123,18 +3636,21 @@ static inline void markTextureStagesDirty(IWineD3DDeviceImpl *This, DWORD stage)
}
}
-static void device_map_stage(IWineD3DDeviceImpl *This, int stage, int unit) {
- int i = This->rev_tex_unit_map[unit];
- int j = This->texUnitMap[stage];
+static void device_map_stage(IWineD3DDeviceImpl *This, DWORD stage, DWORD unit)
+{
+ DWORD i = This->rev_tex_unit_map[unit];
+ DWORD j = This->texUnitMap[stage];
This->texUnitMap[stage] = unit;
- if (i != -1 && i != stage) {
- This->texUnitMap[i] = -1;
+ if (i != WINED3D_UNMAPPED_STAGE && i != stage)
+ {
+ This->texUnitMap[i] = WINED3D_UNMAPPED_STAGE;
}
This->rev_tex_unit_map[unit] = stage;
- if (j != -1 && j != unit) {
- This->rev_tex_unit_map[j] = -1;
+ if (j != WINED3D_UNMAPPED_STAGE && j != unit)
+ {
+ This->rev_tex_unit_map[j] = WINED3D_UNMAPPED_STAGE;
}
}
@@ -4228,14 +3744,12 @@ static void device_map_psamplers(IWineD3DDeviceImpl *This) {
}
static BOOL device_unit_free_for_vs(IWineD3DDeviceImpl *This, const DWORD *pshader_sampler_tokens,
- const DWORD *vshader_sampler_tokens, int unit)
+ const DWORD *vshader_sampler_tokens, DWORD unit)
{
- int current_mapping = This->rev_tex_unit_map[unit];
+ DWORD current_mapping = This->rev_tex_unit_map[unit];
- if (current_mapping == -1) {
- /* Not currently used */
- return TRUE;
- }
+ /* Not currently used */
+ if (current_mapping == WINED3D_UNMAPPED_STAGE) return TRUE;
if (current_mapping < MAX_FRAGMENT_SAMPLERS) {
/* Used by a fragment sampler */
@@ -4250,14 +3764,14 @@ static BOOL device_unit_free_for_vs(IWineD3DDeviceImpl *This, const DWORD *pshad
}
/* Used by a vertex sampler */
- return !vshader_sampler_tokens[current_mapping];
+ return !vshader_sampler_tokens[current_mapping - MAX_FRAGMENT_SAMPLERS];
}
static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps) {
const WINED3DSAMPLER_TEXTURE_TYPE *vshader_sampler_type =
((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->baseShader.reg_maps.sampler_type;
const WINED3DSAMPLER_TEXTURE_TYPE *pshader_sampler_type = NULL;
- int start = GL_LIMITS(combined_samplers) - 1;
+ int start = min(MAX_COMBINED_SAMPLERS, GL_LIMITS(combined_samplers)) - 1;
int i;
if (ps) {
@@ -4269,7 +3783,7 @@ static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps) {
}
for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i) {
- int vsampler_idx = i + MAX_FRAGMENT_SAMPLERS;
+ DWORD vsampler_idx = i + MAX_FRAGMENT_SAMPLERS;
if (vshader_sampler_type[i])
{
if (This->texUnitMap[vsampler_idx] != WINED3D_UNMAPPED_STAGE)
@@ -4510,6 +4024,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetPixelShaderConstantF(
return WINED3D_OK;
}
+/* Context activation is done by the caller. */
#define copy_and_next(dest, src, size) memcpy(dest, src, size); dest += (size)
static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIndex, DWORD dwCount,
const struct wined3d_stream_info *stream_info, struct wined3d_buffer *dest, DWORD dwFlags,
@@ -4522,12 +4037,12 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn
BOOL doClip;
DWORD numTextures;
- if (stream_info->elements[WINED3D_FFP_NORMAL].data)
+ if (stream_info->use_map & (1 << WINED3D_FFP_NORMAL))
{
WARN(" lighting state not saved yet... Some strange stuff may happen !\n");
}
- if (!stream_info->elements[WINED3D_FFP_POSITION].data)
+ if (!(stream_info->use_map & (1 << WINED3D_FFP_POSITION)))
{
ERR("Source has no position mask\n");
return WINED3DERR_INVALIDCALL;
@@ -4637,10 +4152,10 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn
TRACE("In: ( %06.2f %06.2f %06.2f )\n", p[0], p[1], p[2]);
/* Multiplication with world, view and projection matrix */
- x = (p[0] * mat.u.s._11) + (p[1] * mat.u.s._21) + (p[2] * mat.u.s._31) + (1.0 * mat.u.s._41);
- y = (p[0] * mat.u.s._12) + (p[1] * mat.u.s._22) + (p[2] * mat.u.s._32) + (1.0 * mat.u.s._42);
- z = (p[0] * mat.u.s._13) + (p[1] * mat.u.s._23) + (p[2] * mat.u.s._33) + (1.0 * mat.u.s._43);
- rhw = (p[0] * mat.u.s._14) + (p[1] * mat.u.s._24) + (p[2] * mat.u.s._34) + (1.0 * mat.u.s._44);
+ x = (p[0] * mat.u.s._11) + (p[1] * mat.u.s._21) + (p[2] * mat.u.s._31) + (1.0f * mat.u.s._41);
+ y = (p[0] * mat.u.s._12) + (p[1] * mat.u.s._22) + (p[2] * mat.u.s._32) + (1.0f * mat.u.s._42);
+ z = (p[0] * mat.u.s._13) + (p[1] * mat.u.s._23) + (p[2] * mat.u.s._33) + (1.0f * mat.u.s._43);
+ rhw = (p[0] * mat.u.s._14) + (p[1] * mat.u.s._24) + (p[2] * mat.u.s._34) + (1.0f * mat.u.s._44);
TRACE("x=%f y=%f z=%f rhw=%f\n", x, y, z, rhw);
@@ -4663,7 +4178,7 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn
if( !doClip ||
( (-rhw -eps < x) && (-rhw -eps < y) && ( -eps < z) &&
- (x <= rhw + eps) && (y <= rhw + eps ) && (z <= rhw + eps) &&
+ (x <= rhw + eps) && (y <= rhw + eps ) && (z <= rhw + eps) &&
( rhw > eps ) ) ) {
/* "Normal" viewport transformation (not clipped)
@@ -4760,7 +4275,8 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn
if (DestFVF & WINED3DFVF_DIFFUSE) {
const struct wined3d_stream_info_element *element = &stream_info->elements[WINED3D_FFP_DIFFUSE];
const DWORD *color_d = (const DWORD *)(element->data + i * element->stride);
- if(!color_d) {
+ if (!(stream_info->use_map & (1 << WINED3D_FFP_DIFFUSE)))
+ {
static BOOL warned = FALSE;
if(!warned) {
@@ -4787,11 +4303,13 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn
}
}
- if (DestFVF & WINED3DFVF_SPECULAR) {
+ if (DestFVF & WINED3DFVF_SPECULAR)
+ {
/* What's the color value in the feedback buffer? */
const struct wined3d_stream_info_element *element = &stream_info->elements[WINED3D_FFP_SPECULAR];
const DWORD *color_s = (const DWORD *)(element->data + i * element->stride);
- if(!color_s) {
+ if (!(stream_info->use_map & (1 << WINED3D_FFP_SPECULAR)))
+ {
static BOOL warned = FALSE;
if(!warned) {
@@ -4821,7 +4339,8 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn
for (tex_index = 0; tex_index < numTextures; tex_index++) {
const struct wined3d_stream_info_element *element = &stream_info->elements[WINED3D_FFP_TEXCOORD0 + tex_index];
const float *tex_coord = (const float *)(element->data + i * element->stride);
- if(!tex_coord) {
+ if (!(stream_info->use_map & (1 << (WINED3D_FFP_TEXCOORD0 + tex_index))))
+ {
ERR("No source texture, but destination requests one\n");
dest_ptr+=GET_TEXCOORD_SIZE_FROM_FVF(DestFVF, tex_index) * sizeof(float);
if(dest_conv) dest_conv += GET_TEXCOORD_SIZE_FROM_FVF(DestFVF, tex_index) * sizeof(float);
@@ -4865,7 +4384,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
}
/* Need any context to write to the vbo. */
- ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
/* ProcessVertices reads from vertex buffers, which have to be assigned. DrawPrimitive and DrawPrimitiveUP
* control the streamIsUP flag, thus restore it afterwards.
@@ -4883,7 +4402,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
*/
for (i = 0; i < (sizeof(stream_info.elements) / sizeof(*stream_info.elements)); ++i)
{
- struct wined3d_stream_info_element *e = &stream_info.elements[i];
+ struct wined3d_stream_info_element *e;
+
+ if (!(stream_info.use_map & (1 << i))) continue;
+
+ e = &stream_info.elements[i];
if (e->buffer_object)
{
struct wined3d_buffer *vb = (struct wined3d_buffer *)This->stateBlock->streamSource[e->stream_idx];
@@ -5331,9 +4854,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_EndScene(IWineD3DDevice *iface) {
return WINED3DERR_INVALIDCALL;
}
- ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
/* We only have to do this if we need to read the, swapbuffers performs a flush for us */
- glFlush();
+ wglFlush();
/* No checkGLcall here to avoid locking the lock just for checking a call that hardly ever
* fails
*/
@@ -5375,6 +4898,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
UINT drawable_width, drawable_height;
IWineD3DSurfaceImpl *depth_stencil = (IWineD3DSurfaceImpl *) This->stencilBufferTarget;
IWineD3DSwapChainImpl *swapchain = NULL;
+ struct wined3d_context *context;
/* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the
* drawable. After the clear we'll mark the drawable up to date, so we have to make sure that this is true
@@ -5410,9 +4934,10 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
}
}
- target->get_drawable_size(target, &drawable_width, &drawable_height);
+ context = ActivateContext(This, (IWineD3DSurface *)target, CTXUSAGE_CLEAR);
+
+ target->get_drawable_size(context, &drawable_width, &drawable_height);
- ActivateContext(This, (IWineD3DSurface *) target, CTXUSAGE_CLEAR);
ENTER_GL();
/* Only set the values up once, as they are not changing */
@@ -5424,7 +4949,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
}
if (Flags & WINED3DCLEAR_ZBUFFER) {
- DWORD location = This->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
+ DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
glDepthMask(GL_TRUE);
glClearDepth(Z);
checkGLcall("glClearDepth");
@@ -5433,19 +4958,19 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
if (vp->X != 0 || vp->Y != 0 ||
vp->Width < depth_stencil->currentDesc.Width || vp->Height < depth_stencil->currentDesc.Height) {
- surface_load_ds_location(This->stencilBufferTarget, location);
+ surface_load_ds_location(This->stencilBufferTarget, context, location);
}
else if (This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE] && (
This->stateBlock->scissorRect.left > 0 || This->stateBlock->scissorRect.top > 0 ||
This->stateBlock->scissorRect.right < depth_stencil->currentDesc.Width ||
This->stateBlock->scissorRect.bottom < depth_stencil->currentDesc.Height)) {
- surface_load_ds_location(This->stencilBufferTarget, location);
+ surface_load_ds_location(This->stencilBufferTarget, context, location);
}
else if (Count > 0 && pRects && (
pRects[0].x1 > 0 || pRects[0].y1 > 0 ||
pRects[0].x2 < depth_stencil->currentDesc.Width ||
pRects[0].y2 < depth_stencil->currentDesc.Height)) {
- surface_load_ds_location(This->stencilBufferTarget, location);
+ surface_load_ds_location(This->stencilBufferTarget, context, location);
}
}
@@ -5470,7 +4995,8 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
if(This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE]) {
IntersectRect(&vp_rect, &vp_rect, &This->stateBlock->scissorRect);
}
- if(This->render_offscreen) {
+ if (context->render_offscreen)
+ {
glScissor(vp_rect.left, vp_rect.top,
vp_rect.right - vp_rect.left, vp_rect.bottom - vp_rect.top);
} else {
@@ -5502,7 +5028,8 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
continue;
}
- if(This->render_offscreen) {
+ if (context->render_offscreen)
+ {
glScissor(curRect.x1, curRect.y1,
curRect.x2 - curRect.x1, curRect.y2 - curRect.y1);
} else {
@@ -5530,11 +5057,11 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
/* Dirtify the target surface for now. If the surface is locked regularly, and an up to date sysmem copy exists,
* it is most likely more efficient to perform a clear on the sysmem copy too instead of downloading it
*/
- IWineD3DSurface_ModifyLocation(This->lastActiveRenderTarget, SFLAG_INDRAWABLE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, TRUE);
}
if (Flags & WINED3DCLEAR_ZBUFFER) {
/* Note that WINED3DCLEAR_ZBUFFER implies a depth stencil exists on the device */
- DWORD location = This->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
+ DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
surface_modify_ds_location(This->stencilBufferTarget, location);
}
@@ -5542,7 +5069,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)target, &IID_IWineD3DSwapChain, (void **)&swapchain))) {
if (target == (IWineD3DSurfaceImpl*) swapchain->frontBuffer) {
- glFlush();
+ wglFlush();
}
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
}
@@ -6203,6 +5730,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
* NOTE: move code to surface to accomplish this
****************************************/
IWineD3DSurfaceImpl *pSrcSurface = (IWineD3DSurfaceImpl *)pSourceSurface;
+ IWineD3DSurfaceImpl *dst_impl = (IWineD3DSurfaceImpl *)pDestinationSurface;
int srcWidth, srcHeight;
unsigned int srcSurfaceWidth, srcSurfaceHeight, destSurfaceWidth, destSurfaceHeight;
WINED3DFORMAT destFormat, srcFormat;
@@ -6211,31 +5739,28 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
WINED3DPOOL srcPool, destPool;
int offset = 0;
int rowoffset = 0; /* how many bytes to add onto the end of a row to wraparound to the beginning of the next */
- glDescriptor *glDescription = NULL;
const struct GlPixelFormatDesc *src_format_desc, *dst_format_desc;
GLenum dummy;
- int sampler;
+ DWORD sampler;
int bpp;
CONVERT_TYPES convert = NO_CONVERSION;
WINED3DSURFACE_DESC winedesc;
TRACE("(%p) : Source (%p) Rect (%p) Destination (%p) Point(%p)\n", This, pSourceSurface, pSourceRect, pDestinationSurface, pDestPoint);
- memset(&winedesc, 0, sizeof(winedesc));
- winedesc.Width = &srcSurfaceWidth;
- winedesc.Height = &srcSurfaceHeight;
- winedesc.Pool = &srcPool;
- winedesc.Format = &srcFormat;
IWineD3DSurface_GetDesc(pSourceSurface, &winedesc);
-
- winedesc.Width = &destSurfaceWidth;
- winedesc.Height = &destSurfaceHeight;
- winedesc.Pool = &destPool;
- winedesc.Format = &destFormat;
- winedesc.Size = &destSize;
+ srcSurfaceWidth = winedesc.width;
+ srcSurfaceHeight = winedesc.height;
+ srcPool = winedesc.pool;
+ srcFormat = winedesc.format;
IWineD3DSurface_GetDesc(pDestinationSurface, &winedesc);
+ destSurfaceWidth = winedesc.width;
+ destSurfaceHeight = winedesc.height;
+ destPool = winedesc.pool;
+ destFormat = winedesc.format;
+ destSize = winedesc.size;
if(srcPool != WINED3DPOOL_SYSTEMMEM || destPool != WINED3DPOOL_DEFAULT){
WARN("source %p must be SYSTEMMEM and dest %p must be DEFAULT, returning WINED3DERR_INVALIDCALL\n", pSourceSurface, pDestinationSurface);
@@ -6246,8 +5771,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
* destination's sysmem copy. If surface conversion is needed, use BltFast instead to
* copy in sysmem and use regular surface loading.
*/
- d3dfmt_get_conv((IWineD3DSurfaceImpl *) pDestinationSurface, FALSE, TRUE,
- &dummy, &dummy, &dummy, &convert, &bpp, FALSE);
+ d3dfmt_get_conv(dst_impl, FALSE, TRUE, &dummy, &dummy, &dummy, &convert, &bpp, FALSE);
if(convert != NO_CONVERSION) {
return IWineD3DSurface_BltFast(pDestinationSurface,
pDestPoint ? pDestPoint->x : 0,
@@ -6263,7 +5787,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
IWineD3DSurface_GetDesc(pDestinationSurface, &winedesc);
}
- ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));
@@ -6274,10 +5798,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
surface_internal_preload(pDestinationSurface, SRGB_RGB);
IWineD3DSurface_BindTexture(pDestinationSurface, FALSE);
- IWineD3DSurface_GetGlDesc(pDestinationSurface, &glDescription);
-
src_format_desc = ((IWineD3DSurfaceImpl *)pSrcSurface)->resource.format_desc;
- dst_format_desc = ((IWineD3DSurfaceImpl *)pDestinationSurface)->resource.format_desc;
+ dst_format_desc = dst_impl->resource.format_desc;
/* this needs to be done in lines if the sourceRect != the sourceWidth */
srcWidth = pSourceRect ? pSourceRect->right - pSourceRect->left : srcSurfaceWidth;
@@ -6300,7 +5822,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
offset += pSourceRect->top * srcSurfaceWidth * src_format_desc->byte_count;
}
TRACE("(%p) glTexSubImage2D, level %d, left %d, top %d, width %d, height %d, fmt %#x, type %#x, memory %p+%#x\n",
- This, glDescription->level, destLeft, destTop, srcWidth, srcHeight, dst_format_desc->glFormat,
+ This, dst_impl->texture_level, destLeft, destTop, srcWidth, srcHeight, dst_format_desc->glFormat,
dst_format_desc->glType, IWineD3DSurface_GetData(pSourceSurface), offset);
/* Sanity check */
@@ -6322,7 +5844,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
for (j = destTop; j < (srcHeight + destTop); ++j)
{
- glTexSubImage2D(glDescription->target, glDescription->level, destLeft, j,
+ glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, j,
srcWidth, 1, dst_format_desc->glFormat, dst_format_desc->glType,data);
data += rowoffset;
}
@@ -6330,28 +5852,26 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
} else { /* Full width, so just write out the whole texture */
const unsigned char* data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset;
- if (WINED3DFMT_DXT1 == destFormat ||
- WINED3DFMT_DXT2 == destFormat ||
- WINED3DFMT_DXT3 == destFormat ||
- WINED3DFMT_DXT4 == destFormat ||
- WINED3DFMT_DXT5 == destFormat) {
- if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
- if (destSurfaceHeight != srcHeight || destSurfaceWidth != srcWidth) {
- /* FIXME: The easy way to do this is to lock the destination, and copy the bits across */
- FIXME("Updating part of a compressed texture is not supported at the moment\n");
- } if (destFormat != srcFormat) {
- FIXME("Updating mixed format compressed texture is not curretly support\n");
- } else {
- GL_EXTCALL(glCompressedTexImage2DARB(glDescription->target, glDescription->level,
- dst_format_desc->glInternal, srcWidth, srcHeight, 0, destSize, data));
- }
- } else {
- FIXME("Attempting to update a DXT compressed texture without hardware support\n");
+ if (dst_format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
+ {
+ if (destSurfaceHeight != srcHeight || destSurfaceWidth != srcWidth)
+ {
+ /* FIXME: The easy way to do this is to lock the destination, and copy the bits across. */
+ FIXME("Updating part of a compressed texture is not supported.\n");
}
-
-
- } else {
- glTexSubImage2D(glDescription->target, glDescription->level, destLeft, destTop,
+ if (destFormat != srcFormat)
+ {
+ FIXME("Updating mixed format compressed textures is not supported.\n");
+ }
+ else
+ {
+ GL_EXTCALL(glCompressedTexImage2DARB(dst_impl->texture_target, dst_impl->texture_level,
+ dst_format_desc->glInternal, srcWidth, srcHeight, 0, destSize, data));
+ }
+ }
+ else
+ {
+ glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, destTop,
srcWidth, srcHeight, dst_format_desc->glFormat, dst_format_desc->glType, data);
}
}
@@ -6361,7 +5881,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
IWineD3DSurface_ModifyLocation(pDestinationSurface, SFLAG_INTEXTURE, TRUE);
sampler = This->rev_tex_unit_map[0];
- if (sampler != -1) {
+ if (sampler != WINED3D_UNMAPPED_STAGE)
+ {
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SAMPLER(sampler));
}
@@ -6503,6 +6024,7 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
const WINED3DRECT *rect, const float color[4])
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
+ struct wined3d_context *context;
IWineD3DSwapChain *swapchain;
swapchain = get_swapchain(surface);
@@ -6511,21 +6033,20 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
TRACE("Surface %p is onscreen\n", surface);
- ActivateContext(This, surface, CTXUSAGE_RESOURCELOAD);
+ context = ActivateContext(This, surface, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL);
buffer = surface_get_gl_buffer(surface, swapchain);
glDrawBuffer(buffer);
checkGLcall("glDrawBuffer()");
} else {
TRACE("Surface %p is offscreen\n", surface);
- ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ context = ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
- context_bind_fbo(iface, GL_FRAMEBUFFER_EXT, &This->activeContext->dst_fbo);
- context_attach_surface_fbo(This, GL_FRAMEBUFFER_EXT, 0, surface);
- GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0));
- checkGLcall("glFramebufferRenderbufferEXT");
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &context->dst_fbo);
+ context_attach_surface_fbo(context, GL_FRAMEBUFFER_EXT, 0, surface);
+ context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER_EXT, NULL, FALSE);
}
if (rect) {
@@ -6553,13 +6074,6 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
glClear(GL_COLOR_BUFFER_BIT);
checkGLcall("glClear");
- if (This->activeContext->current_fbo) {
- context_bind_fbo(iface, GL_FRAMEBUFFER_EXT, &This->activeContext->current_fbo->id);
- } else {
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glBindFramebuffer()");
- }
-
if (swapchain && surface == ((IWineD3DSwapChainImpl *)swapchain)->frontBuffer
&& ((IWineD3DSwapChainImpl *)swapchain)->backBuffer) {
glDrawBuffer(GL_BACK);
@@ -6697,7 +6211,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ColorFill(IWineD3DDevice *iface, IWineD
BltFx.dwSize = sizeof(BltFx);
BltFx.u5.dwFillColor = argb_to_fmt(color, surface->resource.format_desc->format);
return IWineD3DSurface_Blt(pSurface, (const RECT *)pRect, NULL, NULL,
- WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_NONE);
+ WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT);
}
}
@@ -6735,16 +6249,16 @@ static void WINAPI IWineD3DDeviceImpl_ClearRendertargetView(IWineD3DDevice *ifac
WARN("Converting to WINED3DCOLOR, this might give incorrect results\n");
- c = ((DWORD)(color[2] * 255.0));
- c |= ((DWORD)(color[1] * 255.0)) << 8;
- c |= ((DWORD)(color[0] * 255.0)) << 16;
- c |= ((DWORD)(color[3] * 255.0)) << 24;
+ c = ((DWORD)(color[2] * 255.0f));
+ c |= ((DWORD)(color[1] * 255.0f)) << 8;
+ c |= ((DWORD)(color[0] * 255.0f)) << 16;
+ c |= ((DWORD)(color[3] * 255.0f)) << 24;
/* Just forward this to the DirectDraw blitting engine */
memset(&BltFx, 0, sizeof(BltFx));
BltFx.dwSize = sizeof(BltFx);
BltFx.u5.dwFillColor = argb_to_fmt(c, ((IWineD3DSurfaceImpl *)surface)->resource.format_desc->format);
- hr = IWineD3DSurface_Blt(surface, NULL, NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_NONE);
+ hr = IWineD3DSurface_Blt(surface, NULL, NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT);
if (FAILED(hr))
{
ERR("Blt failed, hr %#x\n", hr);
@@ -6829,6 +6343,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *ifa
/* What to do about the context here in the case of multithreading? Not sure.
* This function is called by IDirect3D7::CreateDevice so in theory its initialization code
*/
+ WARN("No active context?\n");
+
ENTER_GL();
if(!Swapchain->backBuffer[0]) {
/* GL was told to draw to the front buffer at creation,
@@ -6887,6 +6403,7 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
GLbitfield mask = GL_COLOR_BUFFER_BIT; /* TODO: Support blitting depth/stencil surfaces */
IWineD3DSwapChain *src_swapchain, *dst_swapchain;
+ struct wined3d_context *context;
GLenum gl_filter;
POINT offset = {0, 0};
@@ -6910,11 +6427,16 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
/* Attach src surface to src fbo */
src_swapchain = get_swapchain(src_surface);
+ dst_swapchain = get_swapchain(dst_surface);
+
+ if (src_swapchain) context = ActivateContext(This, src_surface, CTXUSAGE_RESOURCELOAD);
+ else if (dst_swapchain) context = ActivateContext(This, dst_surface, CTXUSAGE_RESOURCELOAD);
+ else context = ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
+
if (src_swapchain) {
GLenum buffer = surface_get_gl_buffer(src_surface, src_swapchain);
TRACE("Source surface %p is onscreen\n", src_surface);
- ActivateContext(This, src_surface, CTXUSAGE_RESOURCELOAD);
/* Make sure the drawable is up to date. In the offscreen case
* attach_surface_fbo() implicitly takes care of this. */
IWineD3DSurface_LoadLocation(src_surface, SFLAG_INDRAWABLE, NULL);
@@ -6934,28 +6456,25 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
}
ENTER_GL();
- GL_EXTCALL(glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0));
+ context_bind_fbo(context, GL_READ_FRAMEBUFFER_EXT, NULL);
glReadBuffer(buffer);
checkGLcall("glReadBuffer()");
} else {
TRACE("Source surface %p is offscreen\n", src_surface);
ENTER_GL();
- context_bind_fbo(iface, GL_READ_FRAMEBUFFER_EXT, &This->activeContext->src_fbo);
- context_attach_surface_fbo(This, GL_READ_FRAMEBUFFER_EXT, 0, src_surface);
+ context_bind_fbo(context, GL_READ_FRAMEBUFFER_EXT, &context->src_fbo);
+ context_attach_surface_fbo(context, GL_READ_FRAMEBUFFER_EXT, 0, src_surface);
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
checkGLcall("glReadBuffer()");
- GL_EXTCALL(glFramebufferRenderbufferEXT(GL_READ_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0));
- checkGLcall("glFramebufferRenderbufferEXT");
+ context_attach_depth_stencil_fbo(context, GL_READ_FRAMEBUFFER_EXT, NULL, FALSE);
}
LEAVE_GL();
/* Attach dst surface to dst fbo */
- dst_swapchain = get_swapchain(dst_surface);
if (dst_swapchain) {
GLenum buffer = surface_get_gl_buffer(dst_surface, dst_swapchain);
TRACE("Destination surface %p is onscreen\n", dst_surface);
- ActivateContext(This, dst_surface, CTXUSAGE_RESOURCELOAD);
/* Make sure the drawable is up to date. In the offscreen case
* attach_surface_fbo() implicitly takes care of this. */
IWineD3DSurface_LoadLocation(dst_surface, SFLAG_INDRAWABLE, NULL);
@@ -6976,24 +6495,18 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
}
ENTER_GL();
- GL_EXTCALL(glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0));
+ context_bind_fbo(context, GL_DRAW_FRAMEBUFFER_EXT, NULL);
glDrawBuffer(buffer);
checkGLcall("glDrawBuffer()");
} else {
TRACE("Destination surface %p is offscreen\n", dst_surface);
- /* No src or dst swapchain? Make sure some context is active(multithreading) */
- if(!src_swapchain) {
- ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
- }
-
ENTER_GL();
- context_bind_fbo(iface, GL_DRAW_FRAMEBUFFER_EXT, &This->activeContext->dst_fbo);
- context_attach_surface_fbo(This, GL_DRAW_FRAMEBUFFER_EXT, 0, dst_surface);
+ context_bind_fbo(context, GL_DRAW_FRAMEBUFFER_EXT, &context->dst_fbo);
+ context_attach_surface_fbo(context, GL_DRAW_FRAMEBUFFER_EXT, 0, dst_surface);
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
checkGLcall("glDrawBuffer()");
- GL_EXTCALL(glFramebufferRenderbufferEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0));
- checkGLcall("glFramebufferRenderbufferEXT");
+ context_attach_depth_stencil_fbo(context, GL_DRAW_FRAMEBUFFER_EXT, NULL, FALSE);
}
glDisable(GL_SCISSOR_TEST);
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE));
@@ -7010,13 +6523,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
IWineD3DSurface_ModifyLocation(dst_surface, SFLAG_INDRAWABLE, TRUE);
- if (This->activeContext->current_fbo) {
- context_bind_fbo(iface, GL_FRAMEBUFFER_EXT, &This->activeContext->current_fbo->id);
- } else {
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glBindFramebuffer()");
- }
-
/* If we switched from GL_BACK to GL_FRONT above, we need to switch back here */
if (dst_swapchain && dst_surface == ((IWineD3DSwapChainImpl *)dst_swapchain)->frontBuffer
&& ((IWineD3DSwapChainImpl *)dst_swapchain)->backBuffer) {
@@ -7070,10 +6576,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
viewport.MaxZ = 1.0f;
viewport.MinZ = 0.0f;
IWineD3DDeviceImpl_SetViewport(iface, &viewport);
- /* Make sure the viewport state is dirty, because the render_offscreen thing affects it.
- * SetViewport may catch NOP viewport changes, which would occur when switching between equally sized targets
- */
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VIEWPORT);
}
return WINED3D_OK;
}
@@ -7100,8 +6602,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilSurface(IWineD3DDevice *
|| ((IWineD3DSurfaceImpl *)This->stencilBufferTarget)->Flags & SFLAG_DISCARD) {
surface_modify_ds_location(This->stencilBufferTarget, SFLAG_DS_DISCARDED);
} else {
- ActivateContext(This, This->render_targets[0], CTXUSAGE_RESOURCELOAD);
- surface_load_ds_location(This->stencilBufferTarget, SFLAG_DS_OFFSCREEN);
+ struct wined3d_context *context = ActivateContext(This, This->render_targets[0], CTXUSAGE_RESOURCELOAD);
+ surface_load_ds_location(This->stencilBufferTarget, context, SFLAG_DS_OFFSCREEN);
surface_modify_ds_location(This->stencilBufferTarget, SFLAG_DS_OFFSCREEN);
}
}
@@ -7135,7 +6637,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i
/* some basic validation checks */
if(This->cursorTexture) {
- ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
glDeleteTextures(1, &This->cursorTexture);
LEAVE_GL();
@@ -7185,7 +6687,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i
INT height = This->cursorHeight;
INT width = This->cursorWidth;
INT bpp = glDesc->byte_count;
- INT i, sampler;
+ DWORD sampler;
+ INT i;
/* Reformat the texture memory (pitch and width can be
* different) */
@@ -7193,6 +6696,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i
for(i = 0; i < height; i++)
memcpy(&mem[width * bpp * i], &bits[rect.Pitch * i], width * bpp);
IWineD3DSurface_UnlockRect(pCursorBitmap);
+
+ ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
+
ENTER_GL();
if(GL_SUPPORT(APPLE_CLIENT_STORAGE)) {
@@ -7204,7 +6710,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));
checkGLcall("glActiveTextureARB");
sampler = This->rev_tex_unit_map[0];
- if (sampler != -1) {
+ if (sampler != WINED3D_UNMAPPED_STAGE)
+ {
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SAMPLER(sampler));
}
/* Create a new cursor texture */
@@ -7341,14 +6848,21 @@ static HRESULT WINAPI IWineD3DDeviceImpl_TestCooperativeLevel(IWineD3DDevice*
return WINED3DERR_DRIVERINTERNALERROR;
}
+static HRESULT WINAPI evict_managed_resource(IWineD3DResource *resource, void *data) {
+ TRACE("checking resource %p for eviction\n", resource);
+ if(((IWineD3DResourceImpl *) resource)->resource.pool == WINED3DPOOL_MANAGED) {
+ TRACE("Evicting %p\n", resource);
+ IWineD3DResource_UnLoad(resource);
+ }
+ IWineD3DResource_Release(resource);
+ return S_OK;
+}
static HRESULT WINAPI IWineD3DDeviceImpl_EvictManagedResources(IWineD3DDevice* iface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
- /** FIXME: Resource tracking needs to be done,
- * The closes we can do to this is set the priorities of all managed textures low
- * and then reset them.
- ***********************************************************/
- FIXME("(%p) : stub\n", This);
+ TRACE("(%p)\n", This);
+
+ IWineD3DDevice_EnumResources(iface, evict_managed_resource, NULL);
return WINED3D_OK;
}
@@ -7383,12 +6897,13 @@ static void updateSurfaceDesc(IWineD3DSurfaceImpl *surface, const WINED3DPRESENT
surface->glRect.right = surface->pow2Width;
surface->glRect.bottom = surface->pow2Height;
- if(surface->glDescription.textureName) {
- ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ if (surface->texture_name)
+ {
+ ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
- glDeleteTextures(1, &surface->glDescription.textureName);
+ glDeleteTextures(1, &surface->texture_name);
LEAVE_GL();
- surface->glDescription.textureName = 0;
+ surface->texture_name = 0;
surface->Flags &= ~SFLAG_CLIENT;
}
if(surface->pow2Width != pPresentationParameters->BackBufferWidth ||
@@ -7449,6 +6964,8 @@ void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain_
UINT i;
IWineD3DBaseShaderImpl *shader;
+ ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
+
IWineD3DDevice_EnumResources(iface, reset_unload_resources, NULL);
LIST_FOR_EACH_ENTRY(shader, &This->shaders, IWineD3DBaseShaderImpl, baseShader.shader_list_entry) {
This->shader_backend->shader_destroy((IWineD3DBaseShader *) shader);
@@ -7483,7 +7000,6 @@ void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain_
while(This->numContexts) {
DestroyContext(This, This->contexts[0]);
}
- This->activeContext = NULL;
HeapFree(GetProcessHeap(), 0, swapchain->context);
swapchain->context = NULL;
swapchain->num_contexts = 0;
@@ -7505,7 +7021,6 @@ HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *
swapchain->context[0] = CreateContext(This, target, swapchain->win_handle, FALSE,
&swapchain->presentParms);
swapchain->num_contexts = 1;
- This->activeContext = swapchain->context[0];
create_dummy_textures(This);
@@ -7775,69 +7290,36 @@ static void WINAPI IWineD3DDeviceImpl_GetGammaRamp(IWineD3DDevice *iface, UINT i
* any handles to other resource held by the caller must be closed
* (e.g. a texture should release all held surfaces because telling the device that it's been released.)
*****************************************************/
-static void IWineD3DDeviceImpl_AddResource(IWineD3DDevice *iface, IWineD3DResource *resource){
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource)
+{
+ TRACE("(%p) : Adding resource %p\n", This, resource);
- TRACE("(%p) : Adding Resource %p\n", This, resource);
list_add_head(&This->resources, &((IWineD3DResourceImpl *) resource)->resource.resource_list_entry);
}
-static void IWineD3DDeviceImpl_RemoveResource(IWineD3DDevice *iface, IWineD3DResource *resource){
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
-
+static void device_resource_remove(IWineD3DDeviceImpl *This, IWineD3DResource *resource)
+{
TRACE("(%p) : Removing resource %p\n", This, resource);
list_remove(&((IWineD3DResourceImpl *) resource)->resource.resource_list_entry);
}
-
-static void WINAPI IWineD3DDeviceImpl_ResourceReleased(IWineD3DDevice *iface, IWineD3DResource *resource){
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
+void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource)
+{
WINED3DRESOURCETYPE type = IWineD3DResource_GetType(resource);
int counter;
TRACE("(%p) : resource %p\n", This, resource);
- context_resource_released(iface, resource, type);
+ context_resource_released((IWineD3DDevice *)This, resource, type);
switch (type) {
/* TODO: check front and back buffers, rendertargets etc.. possibly swapchains? */
case WINED3DRTYPE_SURFACE: {
unsigned int i;
- /* Cleanup any FBO attachments if d3d is enabled */
- if(This->d3d_initialized) {
- if((IWineD3DSurface *)resource == This->lastActiveRenderTarget) {
- IWineD3DSwapChainImpl *swapchain = This->swapchains ? (IWineD3DSwapChainImpl *) This->swapchains[0] : NULL;
-
- TRACE("Last active render target destroyed\n");
- /* Find a replacement surface for the currently active back buffer. The context manager does not do NULL
- * checks, so switch to a valid target as long as the currently set surface is still valid. Use the
- * surface of the implicit swpchain. If that is the same as the destroyed surface the device is destroyed
- * and the lastActiveRenderTarget member shouldn't matter
- */
- if(swapchain) {
- if(swapchain->backBuffer && swapchain->backBuffer[0] != (IWineD3DSurface *)resource) {
- TRACE("Activating primary back buffer\n");
- ActivateContext(This, swapchain->backBuffer[0], CTXUSAGE_RESOURCELOAD);
- } else if(!swapchain->backBuffer && swapchain->frontBuffer != (IWineD3DSurface *)resource) {
- /* Single buffering environment */
- TRACE("Activating primary front buffer\n");
- ActivateContext(This, swapchain->frontBuffer, CTXUSAGE_RESOURCELOAD);
- } else {
- TRACE("Device is being destroyed, setting lastActiveRenderTarget = 0xdeadbabe\n");
- /* Implicit render target destroyed, that means the device is being destroyed
- * whatever we set here, it shouldn't matter
- */
- This->lastActiveRenderTarget = (IWineD3DSurface *) 0xdeadbabe;
- }
- } else {
- /* May happen during ddraw uninitialization */
- TRACE("Render target set, but swapchain does not exist!\n");
- This->lastActiveRenderTarget = (IWineD3DSurface *) 0xdeadcafe;
- }
- }
-
+ if (This->d3d_initialized)
+ {
for (i = 0; i < GL_LIMITS(buffers); ++i) {
if (This->render_targets[i] == (IWineD3DSurface *)resource) {
This->render_targets[i] = NULL;
@@ -7913,7 +7395,7 @@ static void WINAPI IWineD3DDeviceImpl_ResourceReleased(IWineD3DDevice *iface, IW
/* Remove the resource from the resourceStore */
- IWineD3DDeviceImpl_RemoveResource(iface, resource);
+ device_resource_remove(This, resource);
TRACE("Resource released\n");
@@ -8085,7 +7567,6 @@ const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl =
IWineD3DDeviceImpl_UpdateSurface,
IWineD3DDeviceImpl_GetFrontBufferData,
/*** object tracking ***/
- IWineD3DDeviceImpl_ResourceReleased,
IWineD3DDeviceImpl_EnumResources
};
@@ -8209,12 +7690,11 @@ const DWORD SavedVertexStates_S[NUM_SAVEDVERTEXSTATES_S] = {
void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state) {
DWORD rep = This->StateTable[state].representative;
+ struct wined3d_context *context;
DWORD idx;
BYTE shift;
UINT i;
- WineD3DContext *context;
- if(!rep) return;
for(i = 0; i < This->numContexts; i++) {
context = This->contexts[i];
if(isStateDirty(context, rep)) continue;
@@ -8226,28 +7706,29 @@ void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state) {
}
}
-void get_drawable_size_pbuffer(IWineD3DSurfaceImpl *This, UINT *width, UINT *height) {
- IWineD3DDeviceImpl *dev = This->resource.wineD3DDevice;
- /* The drawable size of a pbuffer render target is the current pbuffer size
- */
- *width = dev->pbufferWidth;
- *height = dev->pbufferHeight;
+void get_drawable_size_pbuffer(struct wined3d_context *context, UINT *width, UINT *height)
+{
+ IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->current_rt)->resource.wineD3DDevice;
+ /* The drawable size of a pbuffer render target is the current pbuffer size. */
+ *width = device->pbufferWidth;
+ *height = device->pbufferHeight;
}
-void get_drawable_size_fbo(IWineD3DSurfaceImpl *This, UINT *width, UINT *height) {
- /* The drawable size of a fbo target is the opengl texture size, which is the power of two size
- */
- *width = This->pow2Width;
- *height = This->pow2Height;
+void get_drawable_size_fbo(struct wined3d_context *context, UINT *width, UINT *height)
+{
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)context->current_rt;
+ /* The drawable size of a fbo target is the opengl texture size, which is the power of two size. */
+ *width = surface->pow2Width;
+ *height = surface->pow2Height;
}
-void get_drawable_size_backbuffer(IWineD3DSurfaceImpl *This, UINT *width, UINT *height) {
- IWineD3DDeviceImpl *dev = This->resource.wineD3DDevice;
+void get_drawable_size_backbuffer(struct wined3d_context *context, UINT *width, UINT *height)
+{
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)context->surface;
/* The drawable size of a backbuffer / aux buffer offscreen target is the size of the
* current context's drawable, which is the size of the back buffer of the swapchain
* the active context belongs to. The back buffer of the swapchain is stored as the
- * surface the context belongs to.
- */
- *width = ((IWineD3DSurfaceImpl *) dev->activeContext->surface)->currentDesc.Width;
- *height = ((IWineD3DSurfaceImpl *) dev->activeContext->surface)->currentDesc.Height;
+ * surface the context belongs to. */
+ *width = surface->currentDesc.Width;
+ *height = surface->currentDesc.Height;
}
diff --git a/reactos/dll/directx/wine/wined3d/directx.c b/reactos/dll/directx/wine/wined3d/directx.c
index 9a064bb996e..a7cb91eb3eb 100644
--- a/reactos/dll/directx/wine/wined3d/directx.c
+++ b/reactos/dll/directx/wine/wined3d/directx.c
@@ -22,15 +22,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-/* Compile time diagnostics: */
-
-#ifndef DEBUG_SINGLE_MODE
-/* Set to 1 to force only a single display mode to be exposed: */
-#define DEBUG_SINGLE_MODE 0
-#endif
-
#include "config.h"
-#include
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
@@ -63,6 +55,9 @@ static const struct {
/* ARB */
{"GL_ARB_color_buffer_float", ARB_COLOR_BUFFER_FLOAT, 0 },
+ {"GL_ARB_depth_buffer_float", ARB_DEPTH_BUFFER_FLOAT, 0 },
+ {"GL_ARB_depth_clamp", ARB_DEPTH_CLAMP, 0 },
+ {"GL_ARB_depth_texture", ARB_DEPTH_TEXTURE, 0 },
{"GL_ARB_draw_buffers", ARB_DRAW_BUFFERS, 0 },
{"GL_ARB_fragment_program", ARB_FRAGMENT_PROGRAM, 0 },
{"GL_ARB_fragment_shader", ARB_FRAGMENT_SHADER, 0 },
@@ -103,8 +98,10 @@ static const struct {
{"GL_EXT_framebuffer_blit", EXT_FRAMEBUFFER_BLIT, 0 },
{"GL_EXT_framebuffer_multisample", EXT_FRAMEBUFFER_MULTISAMPLE, 0 },
{"GL_EXT_framebuffer_object", EXT_FRAMEBUFFER_OBJECT, 0 },
+ {"GL_EXT_packed_depth_stencil", EXT_PACKED_DEPTH_STENCIL, 0 },
{"GL_EXT_paletted_texture", EXT_PALETTED_TEXTURE, 0 },
{"GL_EXT_point_parameters", EXT_POINT_PARAMETERS, 0 },
+ {"GL_EXT_provoking_vertex", EXT_PROVOKING_VERTEX, 0 },
{"GL_EXT_secondary_color", EXT_SECONDARY_COLOR, 0 },
{"GL_EXT_stencil_two_side", EXT_STENCIL_TWO_SIDE, 0 },
{"GL_EXT_stencil_wrap", EXT_STENCIL_WRAP, 0 },
@@ -140,7 +137,9 @@ static const struct {
{"GL_NV_vertex_program", NV_VERTEX_PROGRAM, 0 },
{"GL_NV_vertex_program1_1", NV_VERTEX_PROGRAM1_1, 0 },
{"GL_NV_vertex_program2", NV_VERTEX_PROGRAM2, 0 },
+ {"GL_NV_vertex_program2_option", NV_VERTEX_PROGRAM2_OPTION, 0 },
{"GL_NV_vertex_program3", NV_VERTEX_PROGRAM3, 0 },
+ {"GL_NV_fragment_program_option", NV_FRAGMENT_PROGRAM_OPTION, 0 },
{"GL_NV_depth_clamp", NV_DEPTH_CLAMP, 0 },
{"GL_NV_light_max_exponent", NV_LIGHT_MAX_EXPONENT, 0 },
@@ -171,19 +170,40 @@ const int maxLookup[MAX_LOOKUPS] =
DWORD *stateLookup[MAX_LOOKUPS];
-struct min_lookup minMipLookup[WINED3DTEXF_ANISOTROPIC + 1];
-const struct min_lookup minMipLookup_noFilter[WINED3DTEXF_ANISOTROPIC + 1] =
+const struct min_lookup minMipLookup[] =
{
- {{GL_NEAREST, GL_NEAREST, GL_NEAREST}},
- {{GL_NEAREST, GL_NEAREST, GL_NEAREST}},
- {{GL_NEAREST, GL_NEAREST, GL_NEAREST}},
- {{GL_NEAREST, GL_NEAREST, GL_NEAREST}},
+ /* NONE POINT LINEAR */
+ {{GL_NEAREST, GL_NEAREST, GL_NEAREST}}, /* NONE */
+ {{GL_NEAREST, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR}}, /* POINT*/
+ {{GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR}}, /* LINEAR */
};
-GLenum magLookup[WINED3DTEXF_ANISOTROPIC + 1];
-const GLenum magLookup_noFilter[WINED3DTEXF_ANISOTROPIC + 1] =
+const struct min_lookup minMipLookup_noFilter[] =
{
- GL_NEAREST, GL_NEAREST, GL_NEAREST, GL_NEAREST
+ /* NONE POINT LINEAR */
+ {{GL_NEAREST, GL_NEAREST, GL_NEAREST}}, /* NONE */
+ {{GL_NEAREST, GL_NEAREST, GL_NEAREST}}, /* POINT */
+ {{GL_NEAREST, GL_NEAREST, GL_NEAREST}}, /* LINEAR */
+};
+
+const struct min_lookup minMipLookup_noMip[] =
+{
+ /* NONE POINT LINEAR */
+ {{GL_NEAREST, GL_NEAREST, GL_NEAREST}}, /* NONE */
+ {{GL_NEAREST, GL_NEAREST, GL_NEAREST}}, /* POINT */
+ {{GL_LINEAR, GL_LINEAR, GL_LINEAR }}, /* LINEAR */
+};
+
+const GLenum magLookup[] =
+{
+ /* NONE POINT LINEAR */
+ GL_NEAREST, GL_NEAREST, GL_LINEAR,
+};
+
+const GLenum magLookup_noFilter[] =
+{
+ /* NONE POINT LINEAR */
+ GL_NEAREST, GL_NEAREST, GL_NEAREST,
};
/* drawStridedSlow attributes */
@@ -200,132 +220,104 @@ glMultiTexCoordFunc multi_texcoord_funcs[WINED3D_FFP_EMIT_COUNT];
* function query some info from GL.
*/
-static int wined3d_fake_gl_context_ref = 0;
-static BOOL wined3d_fake_gl_context_foreign;
-static BOOL wined3d_fake_gl_context_available = FALSE;
-static HDC wined3d_fake_gl_context_hdc = NULL;
-static HWND wined3d_fake_gl_context_hwnd = NULL;
-
-static CRITICAL_SECTION wined3d_fake_gl_context_cs;
-static CRITICAL_SECTION_DEBUG wined3d_fake_gl_context_cs_debug =
+struct wined3d_fake_gl_ctx
{
- 0, 0, &wined3d_fake_gl_context_cs,
- { &wined3d_fake_gl_context_cs_debug.ProcessLocksList,
- &wined3d_fake_gl_context_cs_debug.ProcessLocksList },
- 0, 0, { (DWORD_PTR)(__FILE__ ": wined3d_fake_gl_context_cs") }
+ HDC dc;
+ HWND wnd;
+ HGLRC gl_ctx;
};
-static CRITICAL_SECTION wined3d_fake_gl_context_cs = { &wined3d_fake_gl_context_cs_debug, -1, 0, 0, 0, 0 };
-static void WineD3D_ReleaseFakeGLContext(void) {
- HGLRC glCtx;
+static void WineD3D_ReleaseFakeGLContext(struct wined3d_fake_gl_ctx *ctx)
+{
+ TRACE_(d3d_caps)("Destroying fake GL context.\n");
- EnterCriticalSection(&wined3d_fake_gl_context_cs);
-
- if(!wined3d_fake_gl_context_available) {
- TRACE_(d3d_caps)("context not available\n");
- LeaveCriticalSection(&wined3d_fake_gl_context_cs);
- return;
+ if (!pwglMakeCurrent(NULL, NULL))
+ {
+ ERR_(d3d_caps)("Failed to disable fake GL context.\n");
}
-
- glCtx = pwglGetCurrentContext();
-
- TRACE_(d3d_caps)("decrementing ref from %i\n", wined3d_fake_gl_context_ref);
- if (0 == (--wined3d_fake_gl_context_ref) ) {
- if(!wined3d_fake_gl_context_foreign && glCtx) {
- TRACE_(d3d_caps)("destroying fake GL context\n");
- pwglMakeCurrent(NULL, NULL);
- //pwglDeleteContext(glCtx);
- }
- if(wined3d_fake_gl_context_hdc)
- ReleaseDC(wined3d_fake_gl_context_hwnd, wined3d_fake_gl_context_hdc);
- wined3d_fake_gl_context_hdc = NULL; /* Make sure we don't think that it is still around */
- if(wined3d_fake_gl_context_hwnd)
- DestroyWindow(wined3d_fake_gl_context_hwnd);
- wined3d_fake_gl_context_hwnd = NULL;
- wined3d_fake_gl_context_available = FALSE;
+#if 0
+ if (!pwglDeleteContext(ctx->gl_ctx))
+ {
+ DWORD err = GetLastError();
+ ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx->gl_ctx, err);
}
- assert(wined3d_fake_gl_context_ref >= 0);
-
- LeaveCriticalSection(&wined3d_fake_gl_context_cs);
+#endif
+ ReleaseDC(ctx->wnd, ctx->dc);
+ DestroyWindow(ctx->wnd);
}
-static BOOL WineD3D_CreateFakeGLContext(void) {
- HGLRC glCtx = NULL;
-
- EnterCriticalSection(&wined3d_fake_gl_context_cs);
+static BOOL WineD3D_CreateFakeGLContext(struct wined3d_fake_gl_ctx *ctx)
+{
+ PIXELFORMATDESCRIPTOR pfd;
+ int iPixelFormat;
TRACE("getting context...\n");
- if(wined3d_fake_gl_context_ref > 0) goto ret;
- assert(0 == wined3d_fake_gl_context_ref);
- wined3d_fake_gl_context_foreign = TRUE;
-
- glCtx = pwglGetCurrentContext();
- if (!glCtx) {
- PIXELFORMATDESCRIPTOR pfd;
- int iPixelFormat;
-
- wined3d_fake_gl_context_foreign = FALSE;
-
- /* We need a fake window as a hdc retrieved using GetDC(0) can't be used for much GL purposes */
- wined3d_fake_gl_context_hwnd = CreateWindowA("WineD3D_OpenGL", "WineD3D fake window", WS_OVERLAPPEDWINDOW, 10, 10, 10, 10, NULL, NULL, NULL, NULL);
- if(!wined3d_fake_gl_context_hwnd) {
- ERR("HWND creation failed!\n");
- goto fail;
- }
- wined3d_fake_gl_context_hdc = GetDC(wined3d_fake_gl_context_hwnd);
- if(!wined3d_fake_gl_context_hdc) {
- ERR("GetDC failed!\n");
- goto fail;
- }
-
- /* PixelFormat selection */
- ZeroMemory(&pfd, sizeof(pfd));
- pfd.nSize = sizeof(pfd);
- pfd.nVersion = 1;
- pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW;/*PFD_GENERIC_ACCELERATED*/
- pfd.iPixelType = PFD_TYPE_RGBA;
- pfd.cColorBits = 32;
- pfd.iLayerType = PFD_MAIN_PLANE;
-
- iPixelFormat = ChoosePixelFormat(wined3d_fake_gl_context_hdc, &pfd);
- if(!iPixelFormat) {
- /* If this happens something is very wrong as ChoosePixelFormat barely fails */
- ERR("Can't find a suitable iPixelFormat\n");
- goto fail;
- }
- DescribePixelFormat(wined3d_fake_gl_context_hdc, iPixelFormat, sizeof(pfd), &pfd);
- SetPixelFormat(wined3d_fake_gl_context_hdc, iPixelFormat, &pfd);
-
- /* Create a GL context */
- glCtx = pwglCreateContext(wined3d_fake_gl_context_hdc);
- if (!glCtx) {
- WARN_(d3d_caps)("Error creating default context for capabilities initialization\n");
- goto fail;
- }
-
- /* Make it the current GL context */
- if (!pwglMakeCurrent(wined3d_fake_gl_context_hdc, glCtx)) {
- WARN_(d3d_caps)("Error setting default context as current for capabilities initialization\n");
- goto fail;
- }
+ /* We need a fake window as a hdc retrieved using GetDC(0) can't be used for much GL purposes. */
+ ctx->wnd = CreateWindowA(WINED3D_OPENGL_WINDOW_CLASS_NAME, "WineD3D fake window",
+ WS_OVERLAPPEDWINDOW, 10, 10, 10, 10, NULL, NULL, NULL, NULL);
+ if (!ctx->wnd)
+ {
+ ERR_(d3d_caps)("Failed to create a window.\n");
+ goto fail;
+ }
+
+ ctx->dc = GetDC(ctx->wnd);
+ if (!ctx->dc)
+ {
+ ERR_(d3d_caps)("Failed to get a DC.\n");
+ goto fail;
+ }
+
+ /* PixelFormat selection */
+ ZeroMemory(&pfd, sizeof(pfd));
+ pfd.nSize = sizeof(pfd);
+ pfd.nVersion = 1;
+ pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW; /* PFD_GENERIC_ACCELERATED */
+ pfd.iPixelType = PFD_TYPE_RGBA;
+ pfd.cColorBits = 32;
+ pfd.iLayerType = PFD_MAIN_PLANE;
+
+ iPixelFormat = ChoosePixelFormat(ctx->dc, &pfd);
+ if (!iPixelFormat)
+ {
+ /* If this happens something is very wrong as ChoosePixelFormat barely fails. */
+ ERR_(d3d_caps)("Can't find a suitable iPixelFormat.\n");
+ goto fail;
+ }
+ DescribePixelFormat(ctx->dc, iPixelFormat, sizeof(pfd), &pfd);
+ SetPixelFormat(ctx->dc, iPixelFormat, &pfd);
+
+ /* Create a GL context. */
+ ctx->gl_ctx = pwglCreateContext(ctx->dc);
+ if (!ctx->gl_ctx)
+ {
+ WARN_(d3d_caps)("Error creating default context for capabilities initialization.\n");
+ goto fail;
+ }
+
+ /* Make it the current GL context. */
+ if (!context_set_current(NULL))
+ {
+ ERR_(d3d_caps)("Failed to clear current D3D context.\n");
+ }
+
+ if (!pwglMakeCurrent(ctx->dc, ctx->gl_ctx))
+ {
+ ERR_(d3d_caps)("Failed to make fake GL context current.\n");
+ goto fail;
}
- ret:
- TRACE("incrementing ref from %i\n", wined3d_fake_gl_context_ref);
- wined3d_fake_gl_context_ref++;
- wined3d_fake_gl_context_available = TRUE;
- LeaveCriticalSection(&wined3d_fake_gl_context_cs);
return TRUE;
- fail:
- if(wined3d_fake_gl_context_hdc)
- ReleaseDC(wined3d_fake_gl_context_hwnd, wined3d_fake_gl_context_hdc);
- wined3d_fake_gl_context_hdc = NULL;
- if(wined3d_fake_gl_context_hwnd)
- DestroyWindow(wined3d_fake_gl_context_hwnd);
- wined3d_fake_gl_context_hwnd = NULL;
- if(glCtx) pwglDeleteContext(glCtx);
- LeaveCriticalSection(&wined3d_fake_gl_context_cs);
+
+fail:
+ if (ctx->gl_ctx) pwglDeleteContext(ctx->gl_ctx);
+ ctx->gl_ctx = NULL;
+ if (ctx->dc) ReleaseDC(ctx->wnd, ctx->dc);
+ ctx->dc = NULL;
+ if (ctx->wnd) DestroyWindow(ctx->wnd);
+ ctx->wnd = NULL;
+
return FALSE;
}
@@ -387,7 +379,8 @@ static ULONG WINAPI IWineD3DImpl_Release(IWineD3D *iface) {
/* Set the shader type for this device, depending on the given capabilities,
* the device type, and the user preferences in wined3d_settings */
-static void select_shader_mode(const WineD3D_GL_Info *gl_info, WINED3DDEVTYPE DeviceType, int *ps_selected, int *vs_selected)
+static void select_shader_mode(const struct wined3d_gl_info *gl_info,
+ WINED3DDEVTYPE DeviceType, int *ps_selected, int *vs_selected)
{
if (wined3d_settings.vs_mode == VS_NONE) {
*vs_selected = SHADER_NONE;
@@ -395,7 +388,7 @@ static void select_shader_mode(const WineD3D_GL_Info *gl_info, WINED3DDEVTYPE De
/* Geforce4 cards support GLSL but for vertex shaders only. Further its reported GLSL caps are
* wrong. This combined with the fact that glsl won't offer more features or performance, use ARB
* shaders only on this card. */
- if(gl_info->vs_nv_version && gl_info->vs_nv_version < VS_VERSION_20)
+ if (gl_info->supported[NV_VERTEX_PROGRAM] && !gl_info->supported[NV_VERTEX_PROGRAM2])
*vs_selected = SHADER_ARB;
else
*vs_selected = SHADER_GLSL;
@@ -419,11 +412,8 @@ static void select_shader_mode(const WineD3D_GL_Info *gl_info, WINED3DDEVTYPE De
}
/** Select the number of report maximum shader constants based on the selected shader modes */
-static void select_shader_max_constants(
- int ps_selected_mode,
- int vs_selected_mode,
- WineD3D_GL_Info *gl_info) {
-
+static void select_shader_max_constants(int ps_selected_mode, int vs_selected_mode, struct wined3d_gl_info *gl_info)
+{
switch (vs_selected_mode) {
case SHADER_GLSL:
gl_info->max_vshader_constantsF = gl_info->vs_glsl_constantsF;
@@ -453,7 +443,8 @@ static void select_shader_max_constants(
* IWineD3D parts follows
**********************************************************/
-static inline BOOL test_arb_vs_offset_limit(const WineD3D_GL_Info *gl_info)
+/* GL locking is done by the caller */
+static inline BOOL test_arb_vs_offset_limit(const struct wined3d_gl_info *gl_info)
{
GLuint prog;
BOOL ret = FALSE;
@@ -482,7 +473,7 @@ static inline BOOL test_arb_vs_offset_limit(const WineD3D_GL_Info *gl_info)
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, 0));
GL_EXTCALL(glDeleteProgramsARB(1, &prog));
- checkGLcall("ARB vp offset limit test cleanup\n");
+ checkGLcall("ARB vp offset limit test cleanup");
return ret;
}
@@ -498,208 +489,1036 @@ static DWORD ver_for_ext(GL_SupportedExt ext)
return 0;
}
-static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) {
+static BOOL match_ati_r300_to_500(const struct wined3d_gl_info *gl_info, const char *gl_renderer)
+{
+ if (gl_info->gl_vendor != VENDOR_ATI) return FALSE;
+ if (gl_info->gl_card == CARD_ATI_RADEON_9500) return TRUE;
+ if (gl_info->gl_card == CARD_ATI_RADEON_X700) return TRUE;
+ if (gl_info->gl_card == CARD_ATI_RADEON_X1600) return TRUE;
+ return FALSE;
+}
+
+static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, const char *gl_renderer)
+{
+ if (gl_info->gl_vendor == VENDOR_NVIDIA)
+ {
+ if (gl_info->gl_card == CARD_NVIDIA_GEFORCEFX_5800 || gl_info->gl_card == CARD_NVIDIA_GEFORCEFX_5600)
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static BOOL match_apple(const struct wined3d_gl_info *gl_info, const char *gl_renderer)
+{
+ /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
+ * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
+ * detect the Apple OpenGL implementation to apply some extension fixups afterwards.
+ *
+ * Detecting this isn't really easy. The vendor string doesn't mention Apple. Compile-time checks
+ * aren't sufficient either because a Linux binary may display on a macos X server via remote X11.
+ * So try to detect the GL implementation by looking at certain Apple extensions. Some extensions
+ * like client storage might be supported on other implementations too, but GL_APPLE_flush_render
+ * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So
+ * the chance that other implementations support them is rather small since Win32 QuickTime uses
+ * DirectDraw, not OpenGL. */
+ if (gl_info->supported[APPLE_FENCE]
+ && gl_info->supported[APPLE_CLIENT_STORAGE]
+ && gl_info->supported[APPLE_FLUSH_RENDER]
+ && gl_info->supported[APPLE_YCBCR_422])
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+/* Context activation is done by the caller. */
+static void test_pbo_functionality(struct wined3d_gl_info *gl_info)
+{
+ /* Some OpenGL implementations, namely Apple's Geforce 8 driver, advertises PBOs,
+ * but glTexSubImage from a PBO fails miserably, with the first line repeated over
+ * all the texture. This function detects this bug by its symptom and disables PBOs
+ * if the test fails.
+ *
+ * The test uploads a 4x4 texture via the PBO in the "native" format GL_BGRA,
+ * GL_UNSIGNED_INT_8_8_8_8_REV. This format triggers the bug, and it is what we use
+ * for D3DFMT_A8R8G8B8. Then the texture is read back without any PBO and the data
+ * read back is compared to the original. If they are equal PBOs are assumed to work,
+ * otherwise the PBO extension is disabled. */
+ GLuint texture, pbo;
+ static const unsigned int pattern[] =
+ {
+ 0x00000000, 0x000000ff, 0x0000ff00, 0x40ff0000,
+ 0x80ffffff, 0x40ffff00, 0x00ff00ff, 0x0000ffff,
+ 0x00ffff00, 0x00ff00ff, 0x0000ffff, 0x000000ff,
+ 0x80ff00ff, 0x0000ffff, 0x00ff00ff, 0x40ff00ff
+ };
+ unsigned int check[sizeof(pattern) / sizeof(pattern[0])];
+
+ /* No PBO -> No point in testing them. */
+ if (!gl_info->supported[ARB_PIXEL_BUFFER_OBJECT]) return;
+
+ ENTER_GL();
+
+ while (glGetError());
+ glGenTextures(1, &texture);
+ glBindTexture(GL_TEXTURE_2D, texture);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
+ checkGLcall("Specifying the PBO test texture");
+
+ GL_EXTCALL(glGenBuffersARB(1, &pbo));
+ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo));
+ GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, sizeof(pattern), pattern, GL_STREAM_DRAW_ARB));
+ checkGLcall("Specifying the PBO test pbo");
+
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
+ checkGLcall("Loading the PBO test texture");
+
+ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
+ wglFinish(); /* just to be sure */
+
+ memset(check, 0, sizeof(check));
+ glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, check);
+ checkGLcall("Reading back the PBO test texture");
+
+ glDeleteTextures(1, &texture);
+ GL_EXTCALL(glDeleteBuffersARB(1, &pbo));
+ checkGLcall("PBO test cleanup");
+
+ LEAVE_GL();
+
+ if (memcmp(check, pattern, sizeof(check)))
+ {
+ WARN_(d3d_caps)("PBO test failed, read back data doesn't match original.\n");
+ WARN_(d3d_caps)("Disabling PBOs. This may result in slower performance.\n");
+ gl_info->supported[ARB_PIXEL_BUFFER_OBJECT] = FALSE;
+ }
+ else
+ {
+ TRACE_(d3d_caps)("PBO test successful.\n");
+ }
+}
+
+static BOOL match_apple_intel(const struct wined3d_gl_info *gl_info, const char *gl_renderer)
+{
+ return gl_info->gl_vendor == VENDOR_INTEL && match_apple(gl_info, gl_renderer);
+}
+
+static BOOL match_apple_nonr500ati(const struct wined3d_gl_info *gl_info, const char *gl_renderer)
+{
+ if (!match_apple(gl_info, gl_renderer)) return FALSE;
+ if (gl_info->gl_vendor != VENDOR_ATI) return FALSE;
+ if (gl_info->gl_card == CARD_ATI_RADEON_X1600) return FALSE;
+ return TRUE;
+}
+
+static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, const char *gl_renderer)
+{
+ if (gl_info->gl_vendor != VENDOR_ATI) return FALSE;
+ if (match_apple(gl_info, gl_renderer)) return FALSE;
+ if (strstr(gl_renderer, "DRI")) return FALSE; /* Filter out Mesa DRI drivers. */
+ return TRUE;
+}
+
+static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, const char *gl_renderer)
+{
+ /* DX9 cards support 40 single float varyings in hardware, most drivers report 32. ATI misreports
+ * 44 varyings. So assume that if we have more than 44 varyings we have a dx10 card.
+ * This detection is for the gl_ClipPos varying quirk. If a d3d9 card really supports more than 44
+ * varyings and we subtract one in dx9 shaders its not going to hurt us because the dx9 limit is
+ * hardcoded
+ *
+ * dx10 cards usually have 64 varyings */
+ return gl_info->max_glsl_varyings > 44;
+}
+
+/* A GL context is provided by the caller */
+static BOOL match_allows_spec_alpha(const struct wined3d_gl_info *gl_info, const char *gl_renderer)
+{
+ GLenum error;
+ DWORD data[16];
+
+ if(!GL_SUPPORT(EXT_SECONDARY_COLOR)) return FALSE;
+
+ ENTER_GL();
+ while(glGetError());
+ GL_EXTCALL(glSecondaryColorPointerEXT)(4, GL_UNSIGNED_BYTE, 4, data);
+ error = glGetError();
+ LEAVE_GL();
+
+ if(error == GL_NO_ERROR)
+ {
+ TRACE("GL Implementation accepts 4 component specular color pointers\n");
+ return TRUE;
+ }
+ else
+ {
+ TRACE("GL implementation does not accept 4 component specular colors, error %s\n",
+ debug_glerror(error));
+ return FALSE;
+ }
+}
+
+static void quirk_arb_constants(struct wined3d_gl_info *gl_info)
+{
+ TRACE_(d3d_caps)("Using ARB vs constant limit(=%u) for GLSL.\n", gl_info->vs_arb_constantsF);
+ gl_info->vs_glsl_constantsF = gl_info->vs_arb_constantsF;
+ TRACE_(d3d_caps)("Using ARB ps constant limit(=%u) for GLSL.\n", gl_info->ps_arb_constantsF);
+ gl_info->ps_glsl_constantsF = gl_info->ps_arb_constantsF;
+}
+
+static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info)
+{
+ quirk_arb_constants(gl_info);
+ /* MacOS needs uniforms for relative addressing offsets. This can accumulate to quite a few uniforms.
+ * Beyond that the general uniform isn't optimal, so reserve a number of uniforms. 12 vec4's should
+ * allow 48 different offsets or other helper immediate values. */
+ TRACE_(d3d_caps)("Reserving 12 GLSL constants for compiler private use.\n");
+ gl_info->reserved_glsl_constants = max(gl_info->reserved_glsl_constants, 12);
+}
+
+/* fglrx crashes with a very bad kernel panic if GL_POINT_SPRITE_ARB is set to GL_COORD_REPLACE_ARB
+ * on more than one texture unit. This means that the d3d9 visual point size test will cause a
+ * kernel panic on any machine running fglrx 9.3(latest that supports r300 to r500 cards). This
+ * quirk only enables point sprites on the first texture unit. This keeps point sprites working in
+ * most games, but avoids the crash
+ *
+ * A more sophisticated way would be to find all units that need texture coordinates and enable
+ * point sprites for one if only one is found, and software emulate point sprites in drawStridedSlow
+ * if more than one unit needs texture coordinates(This requires software ffp and vertex shaders though)
+ *
+ * Note that disabling the extension entirely does not gain predictability because there is no point
+ * sprite capability flag in d3d, so the potential rendering bugs are the same if we disable the extension. */
+static void quirk_one_point_sprite(struct wined3d_gl_info *gl_info)
+{
+ if (gl_info->supported[ARB_POINT_SPRITE])
+ {
+ TRACE("Limiting point sprites to one texture unit.\n");
+ gl_info->max_point_sprite_units = 1;
+ }
+}
+
+static void quirk_ati_dx9(struct wined3d_gl_info *gl_info)
+{
+ quirk_arb_constants(gl_info);
+
+ /* MacOS advertises GL_ARB_texture_non_power_of_two on ATI r500 and earlier cards, although
+ * these cards only support GL_ARB_texture_rectangle(D3DPTEXTURECAPS_NONPOW2CONDITIONAL).
+ * If real NP2 textures are used, the driver falls back to software. We could just remove the
+ * extension and use GL_ARB_texture_rectangle instead, but texture_rectangle is inconventient
+ * due to the non-normalized texture coordinates. Thus set an internal extension flag,
+ * GL_WINE_normalized_texrect, which signals the code that it can use non power of two textures
+ * as per GL_ARB_texture_non_power_of_two, but has to stick to the texture_rectangle limits.
+ *
+ * fglrx doesn't advertise GL_ARB_texture_non_power_of_two, but it advertises opengl 2.0 which
+ * has this extension promoted to core. The extension loading code sets this extension supported
+ * due to that, so this code works on fglrx as well. */
+ if(gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO])
+ {
+ TRACE("GL_ARB_texture_non_power_of_two advertised on R500 or earlier card, removing.\n");
+ gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] = FALSE;
+ gl_info->supported[WINE_NORMALIZED_TEXRECT] = TRUE;
+ }
+
+ /* fglrx has the same structural issues as the one described in quirk_apple_glsl_constants, although
+ * it is generally more efficient. Reserve just 8 constants. */
+ TRACE_(d3d_caps)("Reserving 8 GLSL constants for compiler private use.\n");
+ gl_info->reserved_glsl_constants = max(gl_info->reserved_glsl_constants, 8);
+}
+
+static void quirk_no_np2(struct wined3d_gl_info *gl_info)
+{
+ /* The nVidia GeForceFX series reports OpenGL 2.0 capabilities with the latest drivers versions, but
+ * doesn't explicitly advertise the ARB_tex_npot extension in the GL extension string.
+ * This usually means that ARB_tex_npot is supported in hardware as long as the application is staying
+ * within the limits enforced by the ARB_texture_rectangle extension. This however is not true for the
+ * FX series, which instantly falls back to a slower software path as soon as ARB_tex_npot is used.
+ * We therefore completely remove ARB_tex_npot from the list of supported extensions.
+ *
+ * Note that wine_normalized_texrect can't be used in this case because internally it uses ARB_tex_npot,
+ * triggering the software fallback. There is not much we can do here apart from disabling the
+ * software-emulated extension and reenable ARB_tex_rect (which was previously disabled
+ * in IWineD3DImpl_FillGLCaps).
+ * This fixup removes performance problems on both the FX 5900 and FX 5700 (e.g. for framebuffer
+ * post-processing effects in the game "Max Payne 2").
+ * The behaviour can be verified through a simple test app attached in bugreport #14724. */
+ TRACE("GL_ARB_texture_non_power_of_two advertised through OpenGL 2.0 on NV FX card, removing.\n");
+ gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] = FALSE;
+ gl_info->supported[ARB_TEXTURE_RECTANGLE] = TRUE;
+}
+
+static void quirk_texcoord_w(struct wined3d_gl_info *gl_info)
+{
+ /* The Intel GPUs on MacOS set the .w register of texcoords to 0.0 by default, which causes problems
+ * with fixed function fragment processing. Ideally this flag should be detected with a test shader
+ * and OpenGL feedback mode, but some GL implementations (MacOS ATI at least, probably all MacOS ones)
+ * do not like vertex shaders in feedback mode and return an error, even though it should be valid
+ * according to the spec.
+ *
+ * We don't want to enable this on all cards, as it adds an extra instruction per texcoord used. This
+ * makes the shader slower and eats instruction slots which should be available to the d3d app.
+ *
+ * ATI Radeon HD 2xxx cards on MacOS have the issue. Instead of checking for the buggy cards, blacklist
+ * all radeon cards on Macs and whitelist the good ones. That way we're prepared for the future. If
+ * this workaround is activated on cards that do not need it, it won't break things, just affect
+ * performance negatively. */
+ TRACE("Enabling vertex texture coord fixes in vertex shaders.\n");
+ gl_info->quirks |= WINED3D_QUIRK_SET_TEXCOORD_W;
+}
+
+static void quirk_clip_varying(struct wined3d_gl_info *gl_info)
+{
+ gl_info->quirks |= WINED3D_QUIRK_GLSL_CLIP_VARYING;
+}
+
+static void quirk_allows_specular_alpha(struct wined3d_gl_info *gl_info)
+{
+ gl_info->quirks |= WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA;
+}
+
+struct driver_quirk
+{
+ BOOL (*match)(const struct wined3d_gl_info *gl_info, const char *gl_renderer);
+ void (*apply)(struct wined3d_gl_info *gl_info);
+ const char *description;
+};
+
+struct driver_quirk quirk_table[] =
+{
+ {
+ match_ati_r300_to_500,
+ quirk_ati_dx9,
+ "ATI GLSL constant and normalized texrect quirk"
+ },
+ /* MacOS advertises more GLSL vertex shader uniforms than supported by the hardware, and if more are
+ * used it falls back to software. While the compiler can detect if the shader uses all declared
+ * uniforms, the optimization fails if the shader uses relative addressing. So any GLSL shader
+ * using relative addressing falls back to software.
+ *
+ * ARB vp gives the correct amount of uniforms, so use it instead of GLSL. */
+ {
+ match_apple,
+ quirk_apple_glsl_constants,
+ "Apple GLSL uniform override"
+ },
+ {
+ match_geforce5,
+ quirk_no_np2,
+ "Geforce 5 NP2 disable"
+ },
+ {
+ match_apple_intel,
+ quirk_texcoord_w,
+ "Init texcoord .w for Apple Intel GPU driver"
+ },
+ {
+ match_apple_nonr500ati,
+ quirk_texcoord_w,
+ "Init texcoord .w for Apple ATI >= r600 GPU driver"
+ },
+ {
+ match_fglrx,
+ quirk_one_point_sprite,
+ "Fglrx point sprite crash workaround"
+ },
+ {
+ match_dx10_capable,
+ quirk_clip_varying,
+ "Reserved varying for gl_ClipPos"
+ },
+ {
+ /* GL_EXT_secondary_color does not allow 4 component secondary colors, but most
+ * GL implementations accept it. The Mac GL is the only implementation known to
+ * reject it.
+ *
+ * If we can pass 4 component specular colors, do it, because (a) we don't have
+ * to screw around with the data, and (b) the D3D fixed function vertex pipeline
+ * passes specular alpha to the pixel shader if any is used. Otherwise the
+ * specular alpha is used to pass the fog coordinate, which we pass to opengl
+ * via GL_EXT_fog_coord.
+ */
+ match_allows_spec_alpha,
+ quirk_allows_specular_alpha,
+ "Allow specular alpha quirk"
+ }
+};
+
+/* Certain applications (Steam) complain if we report an outdated driver version. In general,
+ * reporting a driver version is moot because we are not the Windows driver, and we have different
+ * bugs, features, etc.
+ *
+ * If a card is not found in this table, the GL driver version is reported. */
+struct driver_version_information
+{
+ WORD vendor; /* reported PCI card vendor ID */
+ WORD card; /* reported PCI card device ID */
+ const char *description; /* Description of the card e.g. NVIDIA RIVA TNT */
+ WORD hipart_hi, hipart_lo; /* driver hiword to report */
+ WORD lopart_hi, lopart_lo; /* driver loword to report */
+};
+
+static const struct driver_version_information driver_version_table[] =
+{
+ /* Nvidia drivers. Geforce6 and newer cards are supported by the current driver (180.x)
+ * GeforceFX support is up to 173.x, - driver uses numbering x.y.11.7341 for 173.41 where x is the windows revision (6=2000/xp, 7=vista), y is unknown
+ * Geforce2MX/3/4 up to 96.x - driver uses numbering 9.6.8.9 for 96.89
+ * TNT/Geforce1/2 up to 71.x - driver uses numbering 7.1.8.6 for 71.86
+ *
+ * All version numbers used below are from the Linux nvidia drivers. */
+ {VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT, "NVIDIA RIVA TNT", 7, 1, 8, 6 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT2, "NVIDIA RIVA TNT2/TNT2 Pro", 7, 1, 8, 6 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE, "NVIDIA GeForce 256", 7, 1, 8, 6 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2_MX, "NVIDIA GeForce2 MX/MX 400", 9, 6, 4, 3 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2, "NVIDIA GeForce2 GTS/GeForce2 Pro", 7, 1, 8, 6 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE3, "NVIDIA GeForce3", 9, 6, 10, 9371 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_MX, "NVIDIA GeForce4 MX 460", 9, 6, 10, 9371 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_TI4200, "NVIDIA GeForce4 Ti 4200", 9, 6, 10, 9371 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5200, "NVIDIA GeForce FX 5200", 7, 15, 11, 7516 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5600, "NVIDIA GeForce FX 5600", 7, 15, 11, 7516 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5800, "NVIDIA GeForce FX 5800", 7, 15, 11, 7516 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6200, "NVIDIA GeForce 6200", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6600GT, "NVIDIA GeForce 6600 GT", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6800, "NVIDIA GeForce 6800", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7300, "NVIDIA GeForce Go 7300", 7, 15, 11, 8585 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7400, "NVIDIA GeForce Go 7400", 7, 15, 11, 8585 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7600, "NVIDIA GeForce 7600 GT", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7800GT, "NVIDIA GeForce 7800 GT", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8300GS, "NVIDIA GeForce 8300 GS", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600GT, "NVIDIA GeForce 8600 GT", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600MGT, "NVIDIA GeForce 8600M GT", 7, 15, 11, 8585 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8800GTS, "NVIDIA GeForce 8800 GTS", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9200, "NVIDIA GeForce 9200", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9400GT, "NVIDIA GeForce 9400 GT", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9500GT, "NVIDIA GeForce 9500 GT", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9600GT, "NVIDIA GeForce 9600 GT", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9800GT, "NVIDIA GeForce 9800 GT", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX260, "NVIDIA GeForce GTX 260", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX275, "NVIDIA GeForce GTX 275", 7, 15, 11, 8618 },
+ {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX280, "NVIDIA GeForce GTX 280", 7, 15, 11, 8618 },
+
+ /* ATI cards. The driver versions are somewhat similar, but not quite the same. Let's hardcode. */
+ {VENDOR_ATI, CARD_ATI_RADEON_9500, "ATI Radeon 9500", 6, 14, 10, 6764 },
+ {VENDOR_ATI, CARD_ATI_RADEON_X700, "ATI Radeon X700 SE", 6, 14, 10, 6764 },
+ {VENDOR_ATI, CARD_ATI_RADEON_X1600, "ATI Radeon X1600 Series", 6, 14, 10, 6764 },
+ {VENDOR_ATI, CARD_ATI_RADEON_HD2300, "ATI Mobility Radeon HD 2300", 6, 14, 10, 6764 },
+ {VENDOR_ATI, CARD_ATI_RADEON_HD2600, "ATI Mobility Radeon HD 2600", 6, 14, 10, 6764 },
+ {VENDOR_ATI, CARD_ATI_RADEON_HD2900, "ATI Radeon HD 2900 XT", 6, 14, 10, 6764 },
+ {VENDOR_ATI, CARD_ATI_RADEON_HD4350, "ATI Radeon HD 4350", 6, 14, 10, 6764 },
+ {VENDOR_ATI, CARD_ATI_RADEON_HD4600, "ATI Radeon HD 4600 Series", 6, 14, 10, 6764 },
+ {VENDOR_ATI, CARD_ATI_RADEON_HD4700, "ATI Radeon HD 4700 Series", 6, 14, 10, 6764 },
+ {VENDOR_ATI, CARD_ATI_RADEON_HD4800, "ATI Radeon HD 4800 Series", 6, 14, 10, 6764 },
+
+ /* TODO: Add information about legacy ATI hardware, Intel and other cards. */
+};
+
+/* Context activation is done by the caller. */
+static void fixup_extensions(struct wined3d_gl_info *gl_info, const char *gl_renderer)
+{
+ unsigned int i;
+
+ for (i = 0; i < (sizeof(quirk_table) / sizeof(*quirk_table)); ++i)
+ {
+ if (!quirk_table[i].match(gl_info, gl_renderer)) continue;
+ TRACE_(d3d_caps)("Applying driver quirk \"%s\".\n", quirk_table[i].description);
+ quirk_table[i].apply(gl_info);
+ }
+
+ /* Find out if PBOs work as they are supposed to. */
+ test_pbo_functionality(gl_info);
+
+ /* Fixup the driver version we'll report to the app. */
+ gl_info->driver_version = MAKEDWORD_VERSION(8, 6); /* Nvidia RIVA TNT, arbitrary */
+ gl_info->driver_version_hipart = MAKEDWORD_VERSION(7, 1);
+ for (i = 0; i < (sizeof(driver_version_table) / sizeof(driver_version_table[0])); ++i)
+ {
+ if (gl_info->gl_vendor == driver_version_table[i].vendor
+ && gl_info->gl_card == driver_version_table[i].card)
+ {
+ TRACE_(d3d_caps)("Found card 0x%04x, 0x%04x in driver version DB.\n",
+ gl_info->gl_vendor, gl_info->gl_card);
+
+ gl_info->driver_version = MAKEDWORD_VERSION(driver_version_table[i].lopart_hi,
+ driver_version_table[i].lopart_lo);
+ gl_info->driver_version_hipart = MAKEDWORD_VERSION(driver_version_table[i].hipart_hi,
+ driver_version_table[i].hipart_lo);
+ gl_info->driver_description = driver_version_table[i].description;
+ break;
+ }
+ }
+ TRACE_(d3d_caps)("Reporting (fake) driver version 0x%08X-0x%08X.\n",
+ gl_info->driver_version_hipart, gl_info->driver_version);
+}
+
+static DWORD wined3d_parse_gl_version(const char *gl_version)
+{
+ const char *ptr = gl_version;
+ int major, minor;
+
+ major = atoi(ptr);
+ if (major <= 0) ERR_(d3d_caps)("Invalid opengl major version: %d.\n", major);
+
+ while (isdigit(*ptr)) ++ptr;
+ if (*ptr++ != '.') ERR_(d3d_caps)("Invalid opengl version string: %s.\n", debugstr_a(gl_version));
+
+ minor = atoi(ptr);
+
+ TRACE_(d3d_caps)("Found OpenGL version: %d.%d.\n", major, minor);
+
+ return MAKEDWORD_VERSION(major, minor);
+}
+
+static GL_Vendors wined3d_guess_vendor(const char *gl_vendor, const char *gl_renderer)
+{
+ if (strstr(gl_vendor, "NVIDIA"))
+ return VENDOR_NVIDIA;
+
+ if (strstr(gl_vendor, "ATI"))
+ return VENDOR_ATI;
+
+ if (strstr(gl_vendor, "Intel(R)")
+ || strstr(gl_renderer, "Intel(R)")
+ || strstr(gl_vendor, "Intel Inc."))
+ return VENDOR_INTEL;
+
+ if (strstr(gl_vendor, "Mesa")
+ || strstr(gl_vendor, "Tungsten Graphics, Inc."))
+ return VENDOR_MESA;
+
+ FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning VENDOR_WINE.\n", debugstr_a(gl_vendor));
+
+ return VENDOR_WINE;
+}
+
+static GL_Cards wined3d_guess_card(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+ GL_Vendors *vendor, unsigned int *vidmem)
+{
+ /* Below is a list of Nvidia and ATI GPUs. Both vendors have dozens of
+ * different GPUs with roughly the same features. In most cases GPUs from a
+ * certain family differ in clockspeeds, the amount of video memory and the
+ * number of shader pipelines.
+ *
+ * A Direct3D device object contains the PCI id (vendor + device) of the
+ * videocard which is used for rendering. Various applications use this
+ * information to get a rough estimation of the features of the card and
+ * some might use it for enabling 3d effects only on certain types of
+ * videocards. In some cases games might even use it to work around bugs
+ * which happen on certain videocards/driver combinations. The problem is
+ * that OpenGL only exposes a rendering string containing the name of the
+ * videocard and not the PCI id.
+ *
+ * Various games depend on the PCI id, so somehow we need to provide one.
+ * A simple option is to parse the renderer string and translate this to
+ * the right PCI id. This is a lot of work because there are more than 200
+ * GPUs just for Nvidia. Various cards share the same renderer string, so
+ * the amount of code might be 'small' but there are quite a number of
+ * exceptions which would make this a pain to maintain. Another way would
+ * be to query the PCI id from the operating system (assuming this is the
+ * videocard which is used for rendering which is not always the case).
+ * This would work but it is not very portable. Second it would not work
+ * well in, let's say, a remote X situation in which the amount of 3d
+ * features which can be used is limited.
+ *
+ * As said most games only use the PCI id to get an indication of the
+ * capabilities of the card. It doesn't really matter if the given id is
+ * the correct one if we return the id of a card with similar 3d features.
+ *
+ * The code below checks the OpenGL capabilities of a videocard and matches
+ * that to a certain level of Direct3D functionality. Once a card passes
+ * the Direct3D9 check, we know that the card (in case of Nvidia) is at
+ * least a GeforceFX. To give a better estimate we do a basic check on the
+ * renderer string but if that won't pass we return a default card. This
+ * way is better than maintaining a full card database as even without a
+ * full database we can return a card with similar features. Second the
+ * size of the database can be made quite small because when you know what
+ * type of 3d functionality a card has, you know to which GPU family the
+ * GPU must belong. Because of this you only have to check a small part of
+ * the renderer string to distinguishes between different models from that
+ * family.
+ *
+ * The code also selects a default amount of video memory which we will
+ * use for an estimation of the amount of free texture memory. In case of
+ * real D3D the amount of texture memory includes video memory and system
+ * memory (to be specific AGP memory or in case of PCIE TurboCache /
+ * HyperMemory). We don't know how much system memory can be addressed by
+ * the system but we can make a reasonable estimation about the amount of
+ * video memory. If the value is slightly wrong it doesn't matter as we
+ * didn't include AGP-like memory which makes the amount of addressable
+ * memory higher and second OpenGL isn't that critical it moves to system
+ * memory behind our backs if really needed. Note that the amount of video
+ * memory can be overruled using a registry setting. */
+
+ switch (*vendor)
+ {
+ case VENDOR_NVIDIA:
+ /* Both the GeforceFX, 6xxx and 7xxx series support D3D9. The last two types have more
+ * shader capabilities, so we use the shader capabilities to distinguish between FX and 6xxx/7xxx.
+ */
+ if (WINE_D3D9_CAPABLE(gl_info) && gl_info->supported[NV_VERTEX_PROGRAM3])
+ {
+ /* Geforce 200 - highend */
+ if (strstr(gl_renderer, "GTX 280")
+ || strstr(gl_renderer, "GTX 285")
+ || strstr(gl_renderer, "GTX 295"))
+ {
+ *vidmem = 1024;
+ return CARD_NVIDIA_GEFORCE_GTX280;
+ }
+
+ /* Geforce 200 - midend high */
+ if (strstr(gl_renderer, "GTX 275"))
+ {
+ *vidmem = 896;
+ return CARD_NVIDIA_GEFORCE_GTX275;
+ }
+
+ /* Geforce 200 - midend */
+ if (strstr(gl_renderer, "GTX 260"))
+ {
+ *vidmem = 1024;
+ return CARD_NVIDIA_GEFORCE_GTX260;
+ }
+
+ /* Geforce9 - highend / Geforce 200 - midend (GTS 150/250 are based on the same core) */
+ if (strstr(gl_renderer, "9800")
+ || strstr(gl_renderer, "GTS 150")
+ || strstr(gl_renderer, "GTS 250"))
+ {
+ *vidmem = 512;
+ return CARD_NVIDIA_GEFORCE_9800GT;
+ }
+
+ /* Geforce9 - midend */
+ if (strstr(gl_renderer, "9600"))
+ {
+ *vidmem = 384; /* The 9600GSO has 384MB, the 9600GT has 512-1024MB */
+ return CARD_NVIDIA_GEFORCE_9600GT;
+ }
+
+ /* Geforce9 - midend low / Geforce 200 - low */
+ if (strstr(gl_renderer, "9500")
+ || strstr(gl_renderer, "GT 120")
+ || strstr(gl_renderer, "GT 130"))
+ {
+ *vidmem = 256; /* The 9500GT has 256-1024MB */
+ return CARD_NVIDIA_GEFORCE_9500GT;
+ }
+
+ /* Geforce9 - lowend */
+ if (strstr(gl_renderer, "9400"))
+ {
+ *vidmem = 256; /* The 9400GT has 256-1024MB */
+ return CARD_NVIDIA_GEFORCE_9400GT;
+ }
+
+ /* Geforce9 - lowend low */
+ if (strstr(gl_renderer, "9100")
+ || strstr(gl_renderer, "9200")
+ || strstr(gl_renderer, "9300")
+ || strstr(gl_renderer, "G 100"))
+ {
+ *vidmem = 256; /* The 9100-9300 cards have 256MB */
+ return CARD_NVIDIA_GEFORCE_9200;
+ }
+
+ /* Geforce8 - highend */
+ if (strstr(gl_renderer, "8800"))
+ {
+ *vidmem = 320; /* The 8800GTS uses 320MB, a 8800GTX can have 768MB */
+ return CARD_NVIDIA_GEFORCE_8800GTS;
+ }
+
+ /* Geforce8 - midend mobile */
+ if (strstr(gl_renderer, "8600 M"))
+ {
+ *vidmem = 512;
+ return CARD_NVIDIA_GEFORCE_8600MGT;
+ }
+
+ /* Geforce8 - midend */
+ if (strstr(gl_renderer, "8600")
+ || strstr(gl_renderer, "8700"))
+ {
+ *vidmem = 256;
+ return CARD_NVIDIA_GEFORCE_8600GT;
+ }
+
+ /* Geforce8 - lowend */
+ if (strstr(gl_renderer, "8300")
+ || strstr(gl_renderer, "8400")
+ || strstr(gl_renderer, "8500"))
+ {
+ *vidmem = 128; /* 128-256MB for a 8300, 256-512MB for a 8400 */
+ return CARD_NVIDIA_GEFORCE_8300GS;
+ }
+
+ /* Geforce7 - highend */
+ if (strstr(gl_renderer, "7800")
+ || strstr(gl_renderer, "7900")
+ || strstr(gl_renderer, "7950")
+ || strstr(gl_renderer, "Quadro FX 4")
+ || strstr(gl_renderer, "Quadro FX 5"))
+ {
+ *vidmem = 256; /* A 7800GT uses 256MB while highend 7900 cards can use 512MB */
+ return CARD_NVIDIA_GEFORCE_7800GT;
+ }
+
+ /* Geforce7 midend */
+ if (strstr(gl_renderer, "7600")
+ || strstr(gl_renderer, "7700"))
+ {
+ *vidmem = 256; /* The 7600 uses 256-512MB */
+ return CARD_NVIDIA_GEFORCE_7600;
+ }
+
+ /* Geforce7 lower medium */
+ if (strstr(gl_renderer, "7400"))
+ {
+ *vidmem = 256; /* The 7400 uses 256-512MB */
+ return CARD_NVIDIA_GEFORCE_7400;
+ }
+
+ /* Geforce7 lowend */
+ if (strstr(gl_renderer, "7300"))
+ {
+ *vidmem = 256; /* Mac Pros with this card have 256 MB */
+ return CARD_NVIDIA_GEFORCE_7300;
+ }
+
+ /* Geforce6 highend */
+ if (strstr(gl_renderer, "6800"))
+ {
+ *vidmem = 128; /* The 6800 uses 128-256MB, the 7600 uses 256-512MB */
+ return CARD_NVIDIA_GEFORCE_6800;
+ }
+
+ /* Geforce6 - midend */
+ if (strstr(gl_renderer, "6600")
+ || strstr(gl_renderer, "6610")
+ || strstr(gl_renderer, "6700"))
+ {
+ *vidmem = 128; /* A 6600GT has 128-256MB */
+ return CARD_NVIDIA_GEFORCE_6600GT;
+ }
+
+ /* Geforce6/7 lowend */
+ *vidmem = 64; /* */
+ return CARD_NVIDIA_GEFORCE_6200; /* Geforce 6100/6150/6200/7300/7400/7500 */
+ }
+
+ if (WINE_D3D9_CAPABLE(gl_info))
+ {
+ /* GeforceFX - highend */
+ if (strstr(gl_renderer, "5800")
+ || strstr(gl_renderer, "5900")
+ || strstr(gl_renderer, "5950")
+ || strstr(gl_renderer, "Quadro FX"))
+ {
+ *vidmem = 256; /* 5800-5900 cards use 256MB */
+ return CARD_NVIDIA_GEFORCEFX_5800;
+ }
+
+ /* GeforceFX - midend */
+ if (strstr(gl_renderer, "5600")
+ || strstr(gl_renderer, "5650")
+ || strstr(gl_renderer, "5700")
+ || strstr(gl_renderer, "5750"))
+ {
+ *vidmem = 128; /* A 5600 uses 128-256MB */
+ return CARD_NVIDIA_GEFORCEFX_5600;
+ }
+
+ /* GeforceFX - lowend */
+ *vidmem = 64; /* Normal FX5200 cards use 64-256MB; laptop (non-standard) can have less */
+ return CARD_NVIDIA_GEFORCEFX_5200; /* GeforceFX 5100/5200/5250/5300/5500 */
+ }
+
+ if (WINE_D3D8_CAPABLE(gl_info))
+ {
+ if (strstr(gl_renderer, "GeForce4 Ti") || strstr(gl_renderer, "Quadro4"))
+ {
+ *vidmem = 64; /* Geforce4 Ti cards have 64-128MB */
+ return CARD_NVIDIA_GEFORCE4_TI4200; /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800, Quadro4 */
+ }
+
+ *vidmem = 64; /* Geforce3 cards have 64-128MB */
+ return CARD_NVIDIA_GEFORCE3; /* Geforce3 standard/Ti200/Ti500, Quadro DCC */
+ }
+
+ if (WINE_D3D7_CAPABLE(gl_info))
+ {
+ if (strstr(gl_renderer, "GeForce4 MX"))
+ {
+ /* Most Geforce4MX GPUs have at least 64MB of memory, some
+ * early models had 32MB but most have 64MB or even 128MB. */
+ *vidmem = 64;
+ return CARD_NVIDIA_GEFORCE4_MX; /* MX420/MX440/MX460/MX4000 */
+ }
+
+ if (strstr(gl_renderer, "GeForce2 MX") || strstr(gl_renderer, "Quadro2 MXR"))
+ {
+ *vidmem = 32; /* Geforce2MX GPUs have 32-64MB of video memory */
+ return CARD_NVIDIA_GEFORCE2_MX; /* Geforce2 standard/MX100/MX200/MX400, Quadro2 MXR */
+ }
+
+ if (strstr(gl_renderer, "GeForce2") || strstr(gl_renderer, "Quadro2"))
+ {
+ *vidmem = 32; /* Geforce2 GPUs have 32-64MB of video memory */
+ return CARD_NVIDIA_GEFORCE2; /* Geforce2 GTS/Pro/Ti/Ultra, Quadro2 */
+ }
+
+ /* Most Geforce1 cards have 32MB, there are also some rare 16
+ * and 64MB (Dell) models. */
+ *vidmem = 32;
+ return CARD_NVIDIA_GEFORCE; /* Geforce 256/DDR, Quadro */
+ }
+
+ if (strstr(gl_renderer, "TNT2"))
+ {
+ *vidmem = 32; /* Most TNT2 boards have 32MB, though there are 16MB boards too */
+ return CARD_NVIDIA_RIVA_TNT2; /* Riva TNT2 standard/M64/Pro/Ultra */
+ }
+
+ *vidmem = 16; /* Most TNT boards have 16MB, some rare models have 8MB */
+ return CARD_NVIDIA_RIVA_TNT; /* Riva TNT, Vanta */
+
+ case VENDOR_ATI:
+ /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
+ *
+ * Beware: renderer string do not match exact card model,
+ * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
+ if (WINE_D3D9_CAPABLE(gl_info))
+ {
+ /* Radeon R7xx HD4800 - highend */
+ if (strstr(gl_renderer, "HD 4800") /* Radeon RV7xx HD48xx generic renderer string */
+ || strstr(gl_renderer, "HD 4830") /* Radeon RV770 */
+ || strstr(gl_renderer, "HD 4850") /* Radeon RV770 */
+ || strstr(gl_renderer, "HD 4870") /* Radeon RV770 */
+ || strstr(gl_renderer, "HD 4890")) /* Radeon RV790 */
+ {
+ *vidmem = 512; /* note: HD4890 cards use 1024MB */
+ return CARD_ATI_RADEON_HD4800;
+ }
+
+ /* Radeon R740 HD4700 - midend */
+ if (strstr(gl_renderer, "HD 4700") /* Radeon RV770 */
+ || strstr(gl_renderer, "HD 4770")) /* Radeon RV740 */
+ {
+ *vidmem = 512;
+ return CARD_ATI_RADEON_HD4700;
+ }
+
+ /* Radeon R730 HD4600 - midend */
+ if (strstr(gl_renderer, "HD 4600") /* Radeon RV730 */
+ || strstr(gl_renderer, "HD 4650") /* Radeon RV730 */
+ || strstr(gl_renderer, "HD 4670")) /* Radeon RV730 */
+ {
+ *vidmem = 512;
+ return CARD_ATI_RADEON_HD4600;
+ }
+
+ /* Radeon R710 HD4500/HD4350 - lowend */
+ if (strstr(gl_renderer, "HD 4350") /* Radeon RV710 */
+ || strstr(gl_renderer, "HD 4550")) /* Radeon RV710 */
+ {
+ *vidmem = 256;
+ return CARD_ATI_RADEON_HD4350;
+ }
+
+ /* Radeon R6xx HD2900/HD3800 - highend */
+ if (strstr(gl_renderer, "HD 2900")
+ || strstr(gl_renderer, "HD 3870")
+ || strstr(gl_renderer, "HD 3850"))
+ {
+ *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
+ return CARD_ATI_RADEON_HD2900;
+ }
+
+ /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
+ if (strstr(gl_renderer, "HD 2600")
+ || strstr(gl_renderer, "HD 3830")
+ || strstr(gl_renderer, "HD 3690")
+ || strstr(gl_renderer, "HD 3650"))
+ {
+ *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
+ return CARD_ATI_RADEON_HD2600;
+ }
+
+ /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
+ if (strstr(gl_renderer, "HD 2300")
+ || strstr(gl_renderer, "HD 2400")
+ || strstr(gl_renderer, "HD 3470")
+ || strstr(gl_renderer, "HD 3450")
+ || strstr(gl_renderer, "HD 3430")
+ || strstr(gl_renderer, "HD 3400"))
+ {
+ *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
+ return CARD_ATI_RADEON_HD2300;
+ }
+
+ /* Radeon R6xx/R7xx integrated */
+ if (strstr(gl_renderer, "HD 3100")
+ || strstr(gl_renderer, "HD 3200")
+ || strstr(gl_renderer, "HD 3300"))
+ {
+ *vidmem = 128; /* 128MB */
+ return CARD_ATI_RADEON_HD3200;
+ }
+
+ /* Radeon R5xx */
+ if (strstr(gl_renderer, "X1600")
+ || strstr(gl_renderer, "X1650")
+ || strstr(gl_renderer, "X1800")
+ || strstr(gl_renderer, "X1900")
+ || strstr(gl_renderer, "X1950"))
+ {
+ *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */
+ return CARD_ATI_RADEON_X1600;
+ }
+
+ /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
+ if (strstr(gl_renderer, "X700")
+ || strstr(gl_renderer, "X800")
+ || strstr(gl_renderer, "X850")
+ || strstr(gl_renderer, "X1300")
+ || strstr(gl_renderer, "X1400")
+ || strstr(gl_renderer, "X1450")
+ || strstr(gl_renderer, "X1550"))
+ {
+ *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
+ return CARD_ATI_RADEON_X700;
+ }
+
+ /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */
+ if (strstr(gl_renderer, "Radeon Xpress"))
+ {
+ *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */
+ return CARD_ATI_RADEON_XPRESS_200M;
+ }
+
+ /* Radeon R3xx */
+ *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */
+ return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */
+ }
+
+ if (WINE_D3D8_CAPABLE(gl_info))
+ {
+ *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */
+ return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */
+ }
+
+ if (WINE_D3D7_CAPABLE(gl_info))
+ {
+ *vidmem = 32; /* There are models with up to 64MB */
+ return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */
+ }
+
+ *vidmem = 16; /* There are 16-32MB models */
+ return CARD_ATI_RAGE_128PRO;
+
+ case VENDOR_INTEL:
+ if (strstr(gl_renderer, "X3100"))
+ {
+ /* MacOS calls the card GMA X3100, Google findings also suggest the name GM965 */
+ *vidmem = 128;
+ return CARD_INTEL_X3100;
+ }
+
+ if (strstr(gl_renderer, "GMA 950") || strstr(gl_renderer, "945GM"))
+ {
+ /* MacOS calls the card GMA 950, but everywhere else the PCI ID is named 945GM */
+ *vidmem = 64;
+ return CARD_INTEL_I945GM;
+ }
+
+ if (strstr(gl_renderer, "915GM")) return CARD_INTEL_I915GM;
+ if (strstr(gl_renderer, "915G")) return CARD_INTEL_I915G;
+ if (strstr(gl_renderer, "865G")) return CARD_INTEL_I865G;
+ if (strstr(gl_renderer, "855G")) return CARD_INTEL_I855G;
+ if (strstr(gl_renderer, "830G")) return CARD_INTEL_I830G;
+ return CARD_INTEL_I915G;
+
+ case VENDOR_MESA:
+ case VENDOR_WINE:
+ default:
+ /* Default to generic Nvidia hardware based on the supported OpenGL extensions. The choice
+ * for Nvidia was because the hardware and drivers they make are of good quality. This makes
+ * them a good generic choice. */
+ *vendor = VENDOR_NVIDIA;
+ if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
+ if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3;
+ if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE;
+ if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT;
+ return CARD_NVIDIA_RIVA_128;
+ }
+}
+
+/* Context activation is done by the caller. */
+static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_gl_info *gl_info)
+{
const char *GL_Extensions = NULL;
const char *WGL_Extensions = NULL;
const char *gl_string = NULL;
- const char *gl_string_cursor = NULL;
GLint gl_max;
GLfloat gl_floatv[2];
- int major = 1, minor = 0;
- BOOL return_value = TRUE;
unsigned i;
HDC hdc;
unsigned int vidmem=0;
+ char *gl_renderer;
+ DWORD gl_version;
+ size_t len;
TRACE_(d3d_caps)("(%p)\n", gl_info);
ENTER_GL();
- gl_string = (const char *) glGetString(GL_RENDERER);
- if (!gl_string) gl_string = "None";
- strcpy(gl_info->gl_renderer, gl_string);
-
- gl_string = (const char *) glGetString(GL_VENDOR);
- TRACE_(d3d_caps)("Filling vendor string %s\n", gl_string);
- if (gl_string != NULL) {
- /* Fill in the GL vendor */
- if (strstr(gl_string, "NVIDIA")) {
- gl_info->gl_vendor = VENDOR_NVIDIA;
- } else if (strstr(gl_string, "ATI")) {
- gl_info->gl_vendor = VENDOR_ATI;
- } else if (strstr(gl_string, "Intel(R)") ||
- strstr(gl_info->gl_renderer, "Intel(R)") ||
- strstr(gl_string, "Intel Inc.")) {
- gl_info->gl_vendor = VENDOR_INTEL;
- } else if (strstr(gl_string, "Mesa")) {
- gl_info->gl_vendor = VENDOR_MESA;
- } else {
- gl_info->gl_vendor = VENDOR_WINE;
- }
- } else {
- gl_info->gl_vendor = VENDOR_WINE;
+ gl_string = (const char *)glGetString(GL_RENDERER);
+ TRACE_(d3d_caps)("GL_RENDERER: %s.\n", debugstr_a(gl_string));
+ if (!gl_string)
+ {
+ LEAVE_GL();
+ ERR_(d3d_caps)("Received a NULL GL_RENDERER.\n");
+ return FALSE;
}
+ len = strlen(gl_string) + 1;
+ gl_renderer = HeapAlloc(GetProcessHeap(), 0, len);
+ if (!gl_renderer)
+ {
+ LEAVE_GL();
+ ERR_(d3d_caps)("Failed to allocate gl_renderer memory.\n");
+ return FALSE;
+ }
+ memcpy(gl_renderer, gl_string, len);
+ gl_string = (const char *)glGetString(GL_VENDOR);
+ TRACE_(d3d_caps)("GL_VENDOR: %s.\n", debugstr_a(gl_string));
+ if (!gl_string)
+ {
+ LEAVE_GL();
+ ERR_(d3d_caps)("Received a NULL GL_VENDOR.\n");
+ HeapFree(GetProcessHeap(), 0, gl_renderer);
+ return FALSE;
+ }
+ gl_info->gl_vendor = wined3d_guess_vendor(gl_string, gl_renderer);
TRACE_(d3d_caps)("found GL_VENDOR (%s)->(0x%04x)\n", debugstr_a(gl_string), gl_info->gl_vendor);
/* Parse the GL_VERSION field into major and minor information */
- gl_string = (const char *) glGetString(GL_VERSION);
- if (gl_string != NULL) {
-
- /* First, parse the generic opengl version. This is supposed not to be convoluted with
- * driver specific information
- */
- gl_string_cursor = gl_string;
- major = atoi(gl_string_cursor);
- if(major <= 0) {
- ERR("Invalid opengl major version: %d\n", major);
- }
- while (*gl_string_cursor <= '9' && *gl_string_cursor >= '0') {
- ++gl_string_cursor;
- }
- if (*gl_string_cursor++ != '.') {
- ERR_(d3d_caps)("Invalid opengl version string: %s\n", debugstr_a(gl_string));
- }
- minor = atoi(gl_string_cursor);
- TRACE_(d3d_caps)("Found OpenGL version: %d.%d\n", major, minor);
- gl_info->gl_version = MAKEDWORD_VERSION(major, minor);
-
- /* Now parse the driver specific string which we'll report to the app */
- switch (gl_info->gl_vendor) {
- case VENDOR_NVIDIA:
- gl_string_cursor = strstr(gl_string, "NVIDIA");
- if (!gl_string_cursor) {
- ERR_(d3d_caps)("Invalid nVidia version string: %s\n", debugstr_a(gl_string));
- break;
- }
-
- gl_string_cursor = strstr(gl_string_cursor, " ");
- if (!gl_string_cursor) {
- ERR_(d3d_caps)("Invalid nVidia version string: %s\n", debugstr_a(gl_string));
- break;
- }
-
- while (*gl_string_cursor == ' ') {
- ++gl_string_cursor;
- }
-
- if (!*gl_string_cursor) {
- ERR_(d3d_caps)("Invalid nVidia version string: %s\n", debugstr_a(gl_string));
- break;
- }
-
- major = atoi(gl_string_cursor);
- while (*gl_string_cursor <= '9' && *gl_string_cursor >= '0') {
- ++gl_string_cursor;
- }
-
- if (*gl_string_cursor++ != '.') {
- ERR_(d3d_caps)("Invalid nVidia version string: %s\n", debugstr_a(gl_string));
- break;
- }
-
- minor = atoi(gl_string_cursor);
- minor = major*100+minor;
- major = 10;
-
- break;
-
- case VENDOR_ATI:
- major = minor = 0;
- gl_string_cursor = strchr(gl_string, '-');
- if (gl_string_cursor) {
- int error = 0;
- gl_string_cursor++;
-
- /* Check if version number is of the form x.y.z */
- if (*gl_string_cursor > '9' && *gl_string_cursor < '0')
- error = 1;
- if (!error && *(gl_string_cursor+2) > '9' && *(gl_string_cursor+2) < '0')
- error = 1;
- if (!error && *(gl_string_cursor+4) > '9' && *(gl_string_cursor+4) < '0')
- error = 1;
- if (!error && *(gl_string_cursor+1) != '.' && *(gl_string_cursor+3) != '.')
- error = 1;
-
- /* Mark version number as malformed */
- if (error)
- gl_string_cursor = 0;
- }
-
- if (!gl_string_cursor)
- WARN_(d3d_caps)("malformed GL_VERSION (%s)\n", debugstr_a(gl_string));
- else {
- major = *gl_string_cursor - '0';
- minor = (*(gl_string_cursor+2) - '0') * 256 + (*(gl_string_cursor+4) - '0');
- }
- break;
-
- case VENDOR_INTEL:
- /* Apple and Mesa version strings look differently, but both provide intel drivers */
- if(strstr(gl_string, "APPLE")) {
- /* [0-9]+.[0-9]+ APPLE-[0-9]+.[0.9]+.[0.9]+
- * We only need the first part, and use the APPLE as identification
- * "1.2 APPLE-1.4.56"
- */
- gl_string_cursor = gl_string;
- major = atoi(gl_string_cursor);
- while (*gl_string_cursor <= '9' && *gl_string_cursor >= '0') {
- ++gl_string_cursor;
- }
-
- if (*gl_string_cursor++ != '.') {
- ERR_(d3d_caps)("Invalid MacOS-Intel version string: %s\n", debugstr_a(gl_string));
- break;
- }
-
- minor = atoi(gl_string_cursor);
- break;
- }
-
- case VENDOR_MESA:
- gl_string_cursor = strstr(gl_string, "Mesa");
- gl_string_cursor = strstr(gl_string_cursor, " ");
- while (*gl_string_cursor && ' ' == *gl_string_cursor) ++gl_string_cursor;
- if (*gl_string_cursor) {
- char tmp[16];
- int cursor = 0;
-
- while (*gl_string_cursor <= '9' && *gl_string_cursor >= '0') {
- tmp[cursor++] = *gl_string_cursor;
- ++gl_string_cursor;
- }
- tmp[cursor] = 0;
- major = atoi(tmp);
-
- if (*gl_string_cursor != '.') WARN_(d3d_caps)("malformed GL_VERSION (%s)\n", debugstr_a(gl_string));
- ++gl_string_cursor;
-
- cursor = 0;
- while (*gl_string_cursor <= '9' && *gl_string_cursor >= '0') {
- tmp[cursor++] = *gl_string_cursor;
- ++gl_string_cursor;
- }
- tmp[cursor] = 0;
- minor = atoi(tmp);
- }
- break;
-
- default:
- major = 0;
- minor = 9;
- }
- gl_info->driver_version = MAKEDWORD_VERSION(major, minor);
- TRACE_(d3d_caps)("found driver version (%s)->%i.%i->(0x%08x)\n", debugstr_a(gl_string), major, minor, gl_info->driver_version);
- /* Current Windows drivers have versions like 6.14.... (some older have an earlier version) */
- gl_info->driver_version_hipart = MAKEDWORD_VERSION(6, 14);
- } else {
- FIXME("OpenGL driver did not return version information\n");
- gl_info->driver_version = MAKEDWORD_VERSION(0, 0);
- gl_info->driver_version_hipart = MAKEDWORD_VERSION(6, 14);
+ gl_string = (const char *)glGetString(GL_VERSION);
+ TRACE_(d3d_caps)("GL_VERSION: %s.\n", debugstr_a(gl_string));
+ if (!gl_string)
+ {
+ LEAVE_GL();
+ ERR_(d3d_caps)("Received a NULL GL_VERSION.\n");
+ HeapFree(GetProcessHeap(), 0, gl_renderer);
+ return FALSE;
}
-
- TRACE_(d3d_caps)("found GL_RENDERER (%s)->(0x%04x)\n", debugstr_a(gl_info->gl_renderer), gl_info->gl_card);
+ gl_version = wined3d_parse_gl_version(gl_string);
/*
* Initialize openGL extension related variables
@@ -713,18 +1532,15 @@ static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) {
gl_info->max_vertex_samplers = 0;
gl_info->max_combined_samplers = gl_info->max_fragment_samplers + gl_info->max_vertex_samplers;
gl_info->max_sampler_stages = 1;
- gl_info->ps_arb_version = PS_VERSION_NOT_SUPPORTED;
gl_info->ps_arb_max_temps = 0;
gl_info->ps_arb_max_instructions = 0;
- gl_info->vs_arb_version = VS_VERSION_NOT_SUPPORTED;
gl_info->vs_arb_max_temps = 0;
gl_info->vs_arb_max_instructions = 0;
- gl_info->vs_nv_version = VS_VERSION_NOT_SUPPORTED;
- gl_info->vs_ati_version = VS_VERSION_NOT_SUPPORTED;
gl_info->vs_glsl_constantsF = 0;
gl_info->ps_glsl_constantsF = 0;
gl_info->vs_arb_constantsF = 0;
gl_info->ps_arb_constantsF = 0;
+ gl_info->ps_arb_max_local_constants = 0;
/* Retrieve opengl defaults */
glGetIntegerv(GL_MAX_CLIP_PLANES, &gl_max);
@@ -744,283 +1560,312 @@ static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) {
gl_info->max_pointsize = gl_floatv[1];
TRACE_(d3d_caps)("Maximum point size support - max point size=%f\n", gl_floatv[1]);
- /* Parse the gl supported features, in theory enabling parts of our code appropriately */
- GL_Extensions = (const char *) glGetString(GL_EXTENSIONS);
+ /* Parse the gl supported features, in theory enabling parts of our code appropriately. */
+ GL_Extensions = (const char *)glGetString(GL_EXTENSIONS);
+ if (!GL_Extensions)
+ {
+ LEAVE_GL();
+ ERR_(d3d_caps)("Received a NULL GL_EXTENSIONS.\n");
+ HeapFree(GetProcessHeap(), 0, gl_renderer);
+ return FALSE;
+ }
+
+ LEAVE_GL();
+
TRACE_(d3d_caps)("GL_Extensions reported:\n");
- if (NULL == GL_Extensions) {
- ERR(" GL_Extensions returns NULL\n");
- } else {
- while (*GL_Extensions != 0x00) {
- const char *Start;
- char ThisExtn[256];
- size_t len;
+ gl_info->supported[WINED3D_GL_EXT_NONE] = TRUE;
- while (isspace(*GL_Extensions)) GL_Extensions++;
- Start = GL_Extensions;
- while (!isspace(*GL_Extensions) && *GL_Extensions != 0x00) {
- GL_Extensions++;
- }
+ while (*GL_Extensions)
+ {
+ const char *start;
+ char current_ext[256];
- len = GL_Extensions - Start;
- if (len == 0 || len >= sizeof(ThisExtn))
- continue;
+ while (isspace(*GL_Extensions)) ++GL_Extensions;
+ start = GL_Extensions;
+ while (!isspace(*GL_Extensions) && *GL_Extensions) ++GL_Extensions;
- memcpy(ThisExtn, Start, len);
- ThisExtn[len] = '\0';
- TRACE_(d3d_caps)("- %s\n", ThisExtn);
+ len = GL_Extensions - start;
+ if (!len || len >= sizeof(current_ext)) continue;
- for (i = 0; i < (sizeof(EXTENSION_MAP) / sizeof(*EXTENSION_MAP)); ++i) {
- if (!strcmp(ThisExtn, EXTENSION_MAP[i].extension_string)) {
- TRACE_(d3d_caps)(" FOUND: %s support\n", EXTENSION_MAP[i].extension_string);
- gl_info->supported[EXTENSION_MAP[i].extension] = TRUE;
- break;
- }
- }
- }
+ memcpy(current_ext, start, len);
+ current_ext[len] = '\0';
+ TRACE_(d3d_caps)("- %s\n", debugstr_a(current_ext));
- LEAVE_GL();
-
- /* Now work out what GL support this card really has */
-#define USE_GL_FUNC(type, pfn, ext, replace) { \
- DWORD ver = ver_for_ext(ext); \
- if(gl_info->supported[ext]) gl_info->pfn = (type) pwglGetProcAddress(#pfn); \
- else if(ver && ver <= gl_info->gl_version) gl_info->pfn = (type) pwglGetProcAddress(#replace); \
- else gl_info->pfn = NULL; \
- }
- GL_EXT_FUNCS_GEN;
-#undef USE_GL_FUNC
-
-#define USE_GL_FUNC(type, pfn, ext, replace) gl_info->pfn = (type) pwglGetProcAddress(#pfn);
- WGL_EXT_FUNCS_GEN;
-#undef USE_GL_FUNC
-
- ENTER_GL();
- /* Now mark all the extensions supported which are included in the opengl core version. Do this *after*
- * loading the functions, otherwise the code above will load the extension entry points instead of the
- * core functions, which may not work
- */
- for (i = 0; i < (sizeof(EXTENSION_MAP) / sizeof(*EXTENSION_MAP)); ++i) {
- if (gl_info->supported[EXTENSION_MAP[i].extension] == FALSE &&
- EXTENSION_MAP[i].version <= gl_info->gl_version && EXTENSION_MAP[i].version) {
- TRACE_(d3d_caps)(" GL CORE: %s support\n", EXTENSION_MAP[i].extension_string);
+ for (i = 0; i < (sizeof(EXTENSION_MAP) / sizeof(*EXTENSION_MAP)); ++i)
+ {
+ if (!strcmp(current_ext, EXTENSION_MAP[i].extension_string))
+ {
+ TRACE_(d3d_caps)(" FOUND: %s support.\n", EXTENSION_MAP[i].extension_string);
gl_info->supported[EXTENSION_MAP[i].extension] = TRUE;
+ break;
}
}
-
- if (gl_info->supported[APPLE_FENCE]) {
- /* GL_NV_fence and GL_APPLE_fence provide the same functionality basically.
- * The apple extension interacts with some other apple exts. Disable the NV
- * extension if the apple one is support to prevent confusion in other parts
- * of the code
- */
- gl_info->supported[NV_FENCE] = FALSE;
- }
- if (gl_info->supported[APPLE_FLOAT_PIXELS]) {
- /* GL_APPLE_float_pixels == GL_ARB_texture_float + GL_ARB_half_float_pixel
- *
- * The enums are the same:
- * GL_RGBA16F_ARB = GL_RGBA_FLOAT16_APPLE = 0x881A
- * GL_RGB16F_ARB = GL_RGB_FLOAT16_APPLE = 0x881B
- * GL_RGBA32F_ARB = GL_RGBA_FLOAT32_APPLE = 0x8814
- * GL_RGB32F_ARB = GL_RGB_FLOAT32_APPLE = 0x8815
- * GL_HALF_FLOAT_ARB = GL_HALF_APPLE = 0x140B
- */
- if(!gl_info->supported[ARB_TEXTURE_FLOAT]) {
- TRACE_(d3d_caps)(" IMPLIED: GL_ARB_texture_float support(from GL_APPLE_float_pixels\n");
- gl_info->supported[ARB_TEXTURE_FLOAT] = TRUE;
- }
- if(!gl_info->supported[ARB_HALF_FLOAT_PIXEL]) {
- TRACE_(d3d_caps)(" IMPLIED: GL_ARB_half_float_pixel support(from GL_APPLE_float_pixels\n");
- gl_info->supported[ARB_HALF_FLOAT_PIXEL] = TRUE;
- }
- }
- if (gl_info->supported[ARB_TEXTURE_CUBE_MAP]) {
- TRACE_(d3d_caps)(" IMPLIED: NVIDIA (NV) Texture Gen Reflection support\n");
- gl_info->supported[NV_TEXGEN_REFLECTION] = TRUE;
- }
- if (gl_info->supported[NV_TEXTURE_SHADER2]) {
- if(gl_info->supported[NV_REGISTER_COMBINERS]) {
- /* Also disable ATI_FRAGMENT_SHADER if register combiners and texture_shader2
- * are supported. The nv extensions provide the same functionality as the
- * ATI one, and a bit more(signed pixelformats)
- */
- gl_info->supported[ATI_FRAGMENT_SHADER] = FALSE;
- }
- }
- if (gl_info->supported[ARB_DRAW_BUFFERS]) {
- glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max);
- gl_info->max_buffers = gl_max;
- TRACE_(d3d_caps)("Max draw buffers: %u\n", gl_max);
- }
- if (gl_info->supported[ARB_MULTITEXTURE]) {
- glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max);
- gl_info->max_textures = min(MAX_TEXTURES, gl_max);
- TRACE_(d3d_caps)("Max textures: %d\n", gl_info->max_textures);
-
- if (gl_info->supported[NV_REGISTER_COMBINERS]) {
- GLint tmp;
- glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &tmp);
- gl_info->max_texture_stages = min(MAX_TEXTURES, tmp);
- } else {
- gl_info->max_texture_stages = min(MAX_TEXTURES, gl_max);
- }
- TRACE_(d3d_caps)("Max texture stages: %d\n", gl_info->max_texture_stages);
-
- if (gl_info->supported[ARB_FRAGMENT_PROGRAM]) {
- GLint tmp;
- glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &tmp);
- gl_info->max_fragment_samplers = min(MAX_FRAGMENT_SAMPLERS, tmp);
- } else {
- gl_info->max_fragment_samplers = max(gl_info->max_fragment_samplers, gl_max);
- }
- TRACE_(d3d_caps)("Max fragment samplers: %d\n", gl_info->max_fragment_samplers);
-
- if (gl_info->supported[ARB_VERTEX_SHADER]) {
- GLint tmp;
- glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, &tmp);
- gl_info->max_vertex_samplers = tmp;
- glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, &tmp);
- gl_info->max_combined_samplers = tmp;
-
- /* Loading GLSL sampler uniforms is much simpler if we can assume that the sampler setup
- * is known at shader link time. In a vertex shader + pixel shader combination this isn't
- * an issue because then the sampler setup only depends on the two shaders. If a pixel
- * shader is used with fixed function vertex processing we're fine too because fixed function
- * vertex processing doesn't use any samplers. If fixed function fragment processing is
- * used we have to make sure that all vertex sampler setups are valid together with all
- * possible fixed function fragment processing setups. This is true if vsamplers + MAX_TEXTURES
- * <= max_samplers. This is true on all d3d9 cards that support vtf(gf 6 and gf7 cards).
- * dx9 radeon cards do not support vertex texture fetch. DX10 cards have 128 samplers, and
- * dx9 is limited to 8 fixed function texture stages and 4 vertex samplers. DX10 does not have
- * a fixed function pipeline anymore.
- *
- * So this is just a check to check that our assumption holds true. If not, write a warning
- * and reduce the number of vertex samplers or probably disable vertex texture fetch.
- */
- if(gl_info->max_vertex_samplers &&
- MAX_TEXTURES + gl_info->max_vertex_samplers > gl_info->max_combined_samplers) {
- FIXME("OpenGL implementation supports %u vertex samplers and %u total samplers\n",
- gl_info->max_vertex_samplers, gl_info->max_combined_samplers);
- FIXME("Expected vertex samplers + MAX_TEXTURES(=8) > combined_samplers\n");
- if( gl_info->max_combined_samplers > MAX_TEXTURES )
- gl_info->max_vertex_samplers =
- gl_info->max_combined_samplers - MAX_TEXTURES;
- else
- gl_info->max_vertex_samplers = 0;
- }
- } else {
- gl_info->max_combined_samplers = gl_info->max_fragment_samplers;
- }
- TRACE_(d3d_caps)("Max vertex samplers: %u\n", gl_info->max_vertex_samplers);
- TRACE_(d3d_caps)("Max combined samplers: %u\n", gl_info->max_combined_samplers);
- }
- if (gl_info->supported[ARB_VERTEX_BLEND]) {
- glGetIntegerv(GL_MAX_VERTEX_UNITS_ARB, &gl_max);
- gl_info->max_blends = gl_max;
- TRACE_(d3d_caps)("Max blends: %u\n", gl_info->max_blends);
- }
- if (gl_info->supported[EXT_TEXTURE3D]) {
- glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE_EXT, &gl_max);
- gl_info->max_texture3d_size = gl_max;
- TRACE_(d3d_caps)("Max texture3D size: %d\n", gl_info->max_texture3d_size);
- }
- if (gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC]) {
- glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_max);
- gl_info->max_anisotropy = gl_max;
- TRACE_(d3d_caps)("Max anisotropy: %d\n", gl_info->max_anisotropy);
- }
- if (gl_info->supported[ARB_FRAGMENT_PROGRAM]) {
- gl_info->ps_arb_version = PS_VERSION_11;
- GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max));
- gl_info->ps_arb_constantsF = gl_max;
- TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM float constants: %d\n", gl_info->ps_arb_constantsF);
- GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &gl_max));
- gl_info->ps_arb_max_temps = gl_max;
- TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM native temporaries: %d\n", gl_info->ps_arb_max_temps);
- GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &gl_max));
- gl_info->ps_arb_max_instructions = gl_max;
- TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM native instructions: %d\n", gl_info->ps_arb_max_instructions);
- }
- if (gl_info->supported[ARB_VERTEX_PROGRAM]) {
- gl_info->vs_arb_version = VS_VERSION_11;
- GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max));
- gl_info->vs_arb_constantsF = gl_max;
- TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM float constants: %d\n", gl_info->vs_arb_constantsF);
- GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &gl_max));
- gl_info->vs_arb_max_temps = gl_max;
- TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native temporaries: %d\n", gl_info->vs_arb_max_temps);
- GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &gl_max));
- gl_info->vs_arb_max_instructions = gl_max;
- TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native instructions: %d\n", gl_info->vs_arb_max_instructions);
-
- gl_info->arb_vs_offset_limit = test_arb_vs_offset_limit(gl_info);
- }
- if (gl_info->supported[ARB_VERTEX_SHADER]) {
- glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &gl_max);
- gl_info->vs_glsl_constantsF = gl_max / 4;
- TRACE_(d3d_caps)("Max ARB_VERTEX_SHADER float constants: %u\n", gl_info->vs_glsl_constantsF);
- }
- if (gl_info->supported[ARB_FRAGMENT_SHADER]) {
- glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, &gl_max);
- gl_info->ps_glsl_constantsF = gl_max / 4;
- TRACE_(d3d_caps)("Max ARB_FRAGMENT_SHADER float constants: %u\n", gl_info->ps_glsl_constantsF);
- glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &gl_max);
- gl_info->max_glsl_varyings = gl_max;
- TRACE_(d3d_caps)("Max GLSL varyings: %u (%u 4 component varyings)\n", gl_max, gl_max / 4);
- }
- if (gl_info->supported[EXT_VERTEX_SHADER]) {
- gl_info->vs_ati_version = VS_VERSION_11;
- }
- if (gl_info->supported[NV_VERTEX_PROGRAM3]) {
- gl_info->vs_nv_version = VS_VERSION_30;
- } else if (gl_info->supported[NV_VERTEX_PROGRAM2]) {
- gl_info->vs_nv_version = VS_VERSION_20;
- } else if (gl_info->supported[NV_VERTEX_PROGRAM1_1]) {
- gl_info->vs_nv_version = VS_VERSION_11;
- } else if (gl_info->supported[NV_VERTEX_PROGRAM]) {
- gl_info->vs_nv_version = VS_VERSION_10;
- }
- if (gl_info->supported[NV_FRAGMENT_PROGRAM2]) {
- gl_info->ps_nv_version = PS_VERSION_30;
- } else if (gl_info->supported[NV_FRAGMENT_PROGRAM]) {
- gl_info->ps_nv_version = PS_VERSION_20;
- }
- if (gl_info->supported[NV_LIGHT_MAX_EXPONENT]) {
- glGetFloatv(GL_MAX_SHININESS_NV, &gl_info->max_shininess);
- } else {
- gl_info->max_shininess = 128.0;
- }
- if (gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO]) {
- /* If we have full NP2 texture support, disable GL_ARB_texture_rectangle because we will never use it.
- * This saves a few redundant glDisable calls
- */
- gl_info->supported[ARB_TEXTURE_RECTANGLE] = FALSE;
- }
- if(gl_info->supported[ATI_FRAGMENT_SHADER]) {
- /* Disable NV_register_combiners and fragment shader if this is supported.
- * generally the NV extensions are preferred over the ATI ones, and this
- * extension is disabled if register_combiners and texture_shader2 are both
- * supported. So we reach this place only if we have incomplete NV dxlevel 8
- * fragment processing support
- */
- gl_info->supported[NV_REGISTER_COMBINERS] = FALSE;
- gl_info->supported[NV_REGISTER_COMBINERS2] = FALSE;
- gl_info->supported[NV_TEXTURE_SHADER] = FALSE;
- gl_info->supported[NV_TEXTURE_SHADER2] = FALSE;
- gl_info->supported[NV_TEXTURE_SHADER3] = FALSE;
- }
- if(gl_info->supported[NV_HALF_FLOAT]) {
- /* GL_ARB_half_float_vertex is a subset of GL_NV_half_float */
- gl_info->supported[ARB_HALF_FLOAT_VERTEX] = TRUE;
- }
- if(gl_info->supported[ARB_POINT_SPRITE]) {
- gl_info->max_point_sprite_units = gl_info->max_textures;
- } else {
- gl_info->max_point_sprite_units = 0;
- }
}
- checkGLcall("extension detection\n");
+
+ /* Now work out what GL support this card really has */
+#define USE_GL_FUNC(type, pfn, ext, replace) \
+{ \
+ DWORD ver = ver_for_ext(ext); \
+ if (gl_info->supported[ext]) gl_info->pfn = (type)pwglGetProcAddress(#pfn); \
+ else if (ver && ver <= gl_version) gl_info->pfn = (type)pwglGetProcAddress(#replace); \
+ else gl_info->pfn = NULL; \
+}
+ GL_EXT_FUNCS_GEN;
+#undef USE_GL_FUNC
+
+#define USE_GL_FUNC(type, pfn, ext, replace) gl_info->pfn = (type)pwglGetProcAddress(#pfn);
+ WGL_EXT_FUNCS_GEN;
+#undef USE_GL_FUNC
+
+ ENTER_GL();
+
+ /* Now mark all the extensions supported which are included in the opengl core version. Do this *after*
+ * loading the functions, otherwise the code above will load the extension entry points instead of the
+ * core functions, which may not work. */
+ for (i = 0; i < (sizeof(EXTENSION_MAP) / sizeof(*EXTENSION_MAP)); ++i)
+ {
+ if (!gl_info->supported[EXTENSION_MAP[i].extension]
+ && EXTENSION_MAP[i].version <= gl_version && EXTENSION_MAP[i].version)
+ {
+ TRACE_(d3d_caps)(" GL CORE: %s support.\n", EXTENSION_MAP[i].extension_string);
+ gl_info->supported[EXTENSION_MAP[i].extension] = TRUE;
+ }
+ }
+
+ if (gl_info->supported[APPLE_FENCE])
+ {
+ /* GL_NV_fence and GL_APPLE_fence provide the same functionality basically.
+ * The apple extension interacts with some other apple exts. Disable the NV
+ * extension if the apple one is support to prevent confusion in other parts
+ * of the code. */
+ gl_info->supported[NV_FENCE] = FALSE;
+ }
+ if (gl_info->supported[APPLE_FLOAT_PIXELS])
+ {
+ /* GL_APPLE_float_pixels == GL_ARB_texture_float + GL_ARB_half_float_pixel
+ *
+ * The enums are the same:
+ * GL_RGBA16F_ARB = GL_RGBA_FLOAT16_APPLE = 0x881A
+ * GL_RGB16F_ARB = GL_RGB_FLOAT16_APPLE = 0x881B
+ * GL_RGBA32F_ARB = GL_RGBA_FLOAT32_APPLE = 0x8814
+ * GL_RGB32F_ARB = GL_RGB_FLOAT32_APPLE = 0x8815
+ * GL_HALF_FLOAT_ARB = GL_HALF_APPLE = 0x140B
+ */
+ if (!gl_info->supported[ARB_TEXTURE_FLOAT])
+ {
+ TRACE_(d3d_caps)(" IMPLIED: GL_ARB_texture_float support(from GL_APPLE_float_pixels.\n");
+ gl_info->supported[ARB_TEXTURE_FLOAT] = TRUE;
+ }
+ if (!gl_info->supported[ARB_HALF_FLOAT_PIXEL])
+ {
+ TRACE_(d3d_caps)(" IMPLIED: GL_ARB_half_float_pixel support(from GL_APPLE_float_pixels.\n");
+ gl_info->supported[ARB_HALF_FLOAT_PIXEL] = TRUE;
+ }
+ }
+ if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
+ {
+ TRACE_(d3d_caps)(" IMPLIED: NVIDIA (NV) Texture Gen Reflection support.\n");
+ gl_info->supported[NV_TEXGEN_REFLECTION] = TRUE;
+ }
+ if (!gl_info->supported[ARB_DEPTH_CLAMP] && gl_info->supported[NV_DEPTH_CLAMP])
+ {
+ TRACE_(d3d_caps)(" IMPLIED: ARB_depth_clamp support (by NV_depth_clamp).\n");
+ gl_info->supported[ARB_DEPTH_CLAMP] = TRUE;
+ }
+ if (gl_info->supported[NV_TEXTURE_SHADER2])
+ {
+ if (gl_info->supported[NV_REGISTER_COMBINERS])
+ {
+ /* Also disable ATI_FRAGMENT_SHADER if register combiners and texture_shader2
+ * are supported. The nv extensions provide the same functionality as the
+ * ATI one, and a bit more(signed pixelformats). */
+ gl_info->supported[ATI_FRAGMENT_SHADER] = FALSE;
+ }
+ }
+ if (gl_info->supported[ARB_DRAW_BUFFERS])
+ {
+ glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max);
+ gl_info->max_buffers = gl_max;
+ TRACE_(d3d_caps)("Max draw buffers: %u.\n", gl_max);
+ }
+ if (gl_info->supported[ARB_MULTITEXTURE])
+ {
+ glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max);
+ gl_info->max_textures = min(MAX_TEXTURES, gl_max);
+ TRACE_(d3d_caps)("Max textures: %d.\n", gl_info->max_textures);
+
+ if (gl_info->supported[NV_REGISTER_COMBINERS])
+ {
+ GLint tmp;
+ glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &tmp);
+ gl_info->max_texture_stages = min(MAX_TEXTURES, tmp);
+ }
+ else
+ {
+ gl_info->max_texture_stages = min(MAX_TEXTURES, gl_max);
+ }
+ TRACE_(d3d_caps)("Max texture stages: %d.\n", gl_info->max_texture_stages);
+
+ if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
+ {
+ GLint tmp;
+ glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &tmp);
+ gl_info->max_fragment_samplers = min(MAX_FRAGMENT_SAMPLERS, tmp);
+ }
+ else
+ {
+ gl_info->max_fragment_samplers = max(gl_info->max_fragment_samplers, gl_max);
+ }
+ TRACE_(d3d_caps)("Max fragment samplers: %d.\n", gl_info->max_fragment_samplers);
+
+ if (gl_info->supported[ARB_VERTEX_SHADER])
+ {
+ GLint tmp;
+ glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, &tmp);
+ gl_info->max_vertex_samplers = tmp;
+ glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, &tmp);
+ gl_info->max_combined_samplers = tmp;
+
+ /* Loading GLSL sampler uniforms is much simpler if we can assume that the sampler setup
+ * is known at shader link time. In a vertex shader + pixel shader combination this isn't
+ * an issue because then the sampler setup only depends on the two shaders. If a pixel
+ * shader is used with fixed function vertex processing we're fine too because fixed function
+ * vertex processing doesn't use any samplers. If fixed function fragment processing is
+ * used we have to make sure that all vertex sampler setups are valid together with all
+ * possible fixed function fragment processing setups. This is true if vsamplers + MAX_TEXTURES
+ * <= max_samplers. This is true on all d3d9 cards that support vtf(gf 6 and gf7 cards).
+ * dx9 radeon cards do not support vertex texture fetch. DX10 cards have 128 samplers, and
+ * dx9 is limited to 8 fixed function texture stages and 4 vertex samplers. DX10 does not have
+ * a fixed function pipeline anymore.
+ *
+ * So this is just a check to check that our assumption holds true. If not, write a warning
+ * and reduce the number of vertex samplers or probably disable vertex texture fetch. */
+ if (gl_info->max_vertex_samplers && gl_info->max_combined_samplers < 12
+ && MAX_TEXTURES + gl_info->max_vertex_samplers > gl_info->max_combined_samplers)
+ {
+ FIXME("OpenGL implementation supports %u vertex samplers and %u total samplers.\n",
+ gl_info->max_vertex_samplers, gl_info->max_combined_samplers);
+ FIXME("Expected vertex samplers + MAX_TEXTURES(=8) > combined_samplers.\n");
+ if (gl_info->max_combined_samplers > MAX_TEXTURES)
+ gl_info->max_vertex_samplers = gl_info->max_combined_samplers - MAX_TEXTURES;
+ else
+ gl_info->max_vertex_samplers = 0;
+ }
+ }
+ else
+ {
+ gl_info->max_combined_samplers = gl_info->max_fragment_samplers;
+ }
+ TRACE_(d3d_caps)("Max vertex samplers: %u.\n", gl_info->max_vertex_samplers);
+ TRACE_(d3d_caps)("Max combined samplers: %u.\n", gl_info->max_combined_samplers);
+ }
+ if (gl_info->supported[ARB_VERTEX_BLEND])
+ {
+ glGetIntegerv(GL_MAX_VERTEX_UNITS_ARB, &gl_max);
+ gl_info->max_blends = gl_max;
+ TRACE_(d3d_caps)("Max blends: %u.\n", gl_info->max_blends);
+ }
+ if (gl_info->supported[EXT_TEXTURE3D])
+ {
+ glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE_EXT, &gl_max);
+ gl_info->max_texture3d_size = gl_max;
+ TRACE_(d3d_caps)("Max texture3D size: %d.\n", gl_info->max_texture3d_size);
+ }
+ if (gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC])
+ {
+ glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_max);
+ gl_info->max_anisotropy = gl_max;
+ TRACE_(d3d_caps)("Max anisotropy: %d.\n", gl_info->max_anisotropy);
+ }
+ if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
+ {
+ GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max));
+ gl_info->ps_arb_constantsF = gl_max;
+ TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM float constants: %d.\n", gl_info->ps_arb_constantsF);
+ GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &gl_max));
+ gl_info->ps_arb_max_temps = gl_max;
+ TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM native temporaries: %d.\n", gl_info->ps_arb_max_temps);
+ GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &gl_max));
+ gl_info->ps_arb_max_instructions = gl_max;
+ TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM native instructions: %d.\n", gl_info->ps_arb_max_instructions);
+ GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &gl_max));
+ gl_info->ps_arb_max_local_constants = gl_max;
+ TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM local parameters: %d.\n", gl_info->ps_arb_max_instructions);
+ }
+ if (gl_info->supported[ARB_VERTEX_PROGRAM])
+ {
+ GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max));
+ gl_info->vs_arb_constantsF = gl_max;
+ TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM float constants: %d.\n", gl_info->vs_arb_constantsF);
+ GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &gl_max));
+ gl_info->vs_arb_max_temps = gl_max;
+ TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native temporaries: %d.\n", gl_info->vs_arb_max_temps);
+ GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &gl_max));
+ gl_info->vs_arb_max_instructions = gl_max;
+ TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native instructions: %d.\n", gl_info->vs_arb_max_instructions);
+
+ if (test_arb_vs_offset_limit(gl_info)) gl_info->quirks |= WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT;
+ }
+ if (gl_info->supported[ARB_VERTEX_SHADER])
+ {
+ glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &gl_max);
+ gl_info->vs_glsl_constantsF = gl_max / 4;
+ TRACE_(d3d_caps)("Max ARB_VERTEX_SHADER float constants: %u.\n", gl_info->vs_glsl_constantsF);
+ }
+ if (gl_info->supported[ARB_FRAGMENT_SHADER])
+ {
+ glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, &gl_max);
+ gl_info->ps_glsl_constantsF = gl_max / 4;
+ TRACE_(d3d_caps)("Max ARB_FRAGMENT_SHADER float constants: %u.\n", gl_info->ps_glsl_constantsF);
+ glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &gl_max);
+ gl_info->max_glsl_varyings = gl_max;
+ TRACE_(d3d_caps)("Max GLSL varyings: %u (%u 4 component varyings).\n", gl_max, gl_max / 4);
+ }
+ if (gl_info->supported[NV_LIGHT_MAX_EXPONENT])
+ {
+ glGetFloatv(GL_MAX_SHININESS_NV, &gl_info->max_shininess);
+ }
+ else
+ {
+ gl_info->max_shininess = 128.0f;
+ }
+ if (gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO])
+ {
+ /* If we have full NP2 texture support, disable
+ * GL_ARB_texture_rectangle because we will never use it.
+ * This saves a few redundant glDisable calls. */
+ gl_info->supported[ARB_TEXTURE_RECTANGLE] = FALSE;
+ }
+ if (gl_info->supported[ATI_FRAGMENT_SHADER])
+ {
+ /* Disable NV_register_combiners and fragment shader if this is supported.
+ * generally the NV extensions are preferred over the ATI ones, and this
+ * extension is disabled if register_combiners and texture_shader2 are both
+ * supported. So we reach this place only if we have incomplete NV dxlevel 8
+ * fragment processing support. */
+ gl_info->supported[NV_REGISTER_COMBINERS] = FALSE;
+ gl_info->supported[NV_REGISTER_COMBINERS2] = FALSE;
+ gl_info->supported[NV_TEXTURE_SHADER] = FALSE;
+ gl_info->supported[NV_TEXTURE_SHADER2] = FALSE;
+ gl_info->supported[NV_TEXTURE_SHADER3] = FALSE;
+ }
+ if (gl_info->supported[NV_HALF_FLOAT])
+ {
+ /* GL_ARB_half_float_vertex is a subset of GL_NV_half_float. */
+ gl_info->supported[ARB_HALF_FLOAT_VERTEX] = TRUE;
+ }
+ if (gl_info->supported[ARB_POINT_SPRITE])
+ {
+ gl_info->max_point_sprite_units = gl_info->max_textures;
+ }
+ else
+ {
+ gl_info->max_point_sprite_units = 0;
+ }
+ checkGLcall("extension detection");
+
+ LEAVE_GL();
/* In some cases the number of texture stages can be larger than the number
* of samplers. The GF4 for example can use only 2 samplers (no fragment
@@ -1029,8 +1874,8 @@ static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) {
/* We can only use ORM_FBO when the hardware supports it. */
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO && !gl_info->supported[EXT_FRAMEBUFFER_OBJECT]) {
- WARN_(d3d_caps)("GL_EXT_framebuffer_object not supported, falling back to PBuffer offscreen rendering mode.\n");
- wined3d_settings.offscreen_rendering_mode = ORM_PBUFFER;
+ WARN_(d3d_caps)("GL_EXT_framebuffer_object not supported, falling back to backbuffer offscreen rendering mode.\n");
+ wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER;
}
/* MRTs are currently only supported when FBOs are used. */
@@ -1038,357 +1883,7 @@ static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) {
gl_info->max_buffers = 1;
}
- /* Below is a list of Nvidia and ATI GPUs. Both vendors have dozens of different GPUs with roughly the same
- * features. In most cases GPUs from a certain family differ in clockspeeds, the amount of video memory and
- * in case of the latest videocards in the number of pixel/vertex pipelines.
- *
- * A Direct3D device object contains the PCI id (vendor + device) of the videocard which is used for
- * rendering. Various games use this information to get a rough estimation of the features of the card
- * and some might use it for enabling 3d effects only on certain types of videocards. In some cases
- * games might even use it to work around bugs which happen on certain videocards/driver combinations.
- * The problem is that OpenGL only exposes a rendering string containing the name of the videocard and
- * not the PCI id.
- *
- * Various games depend on the PCI id, so somehow we need to provide one. A simple option is to parse
- * the renderer string and translate this to the right PCI id. This is a lot of work because there are more
- * than 200 GPUs just for Nvidia. Various cards share the same renderer string, so the amount of code might
- * be 'small' but there are quite a number of exceptions which would make this a pain to maintain.
- * Another way would be to query the PCI id from the operating system (assuming this is the videocard which
- * is used for rendering which is not always the case). This would work but it is not very portable. Second
- * it would not work well in, let's say, a remote X situation in which the amount of 3d features which can be used
- * is limited.
- *
- * As said most games only use the PCI id to get an indication of the capabilities of the card.
- * It doesn't really matter if the given id is the correct one if we return the id of a card with
- * similar 3d features.
- *
- * The code below checks the OpenGL capabilities of a videocard and matches that to a certain level of
- * Direct3D functionality. Once a card passes the Direct3D9 check, we know that the card (in case of Nvidia)
- * is at least a GeforceFX. To give a better estimate we do a basic check on the renderer string but if that
- * won't pass we return a default card. This way is better than maintaining a full card database as even
- * without a full database we can return a card with similar features. Second the size of the database
- * can be made quite small because when you know what type of 3d functionality a card has, you know to which
- * GPU family the GPU must belong. Because of this you only have to check a small part of the renderer string
- * to distinguishes between different models from that family.
- *
- * The code also selects a default amount of video memory which we will use for an estimation of the amount
- * of free texture memory. In case of real D3D the amount of texture memory includes video memory and system
- * memory (to be specific AGP memory or in case of PCIE TurboCache/HyperMemory). We don't know how much
- * system memory can be addressed by the system but we can make a reasonable estimation about the amount of
- * video memory. If the value is slightly wrong it doesn't matter as we didn't include AGP-like memory which
- * makes the amount of addressable memory higher and second OpenGL isn't that critical it moves to system
- * memory behind our backs if really needed.
- * Note that the amount of video memory can be overruled using a registry setting.
- */
- switch (gl_info->gl_vendor) {
- case VENDOR_NVIDIA:
- /* Both the GeforceFX, 6xxx and 7xxx series support D3D9. The last two types have more
- * shader capabilities, so we use the shader capabilities to distinguish between FX and 6xxx/7xxx.
- */
- if(WINE_D3D9_CAPABLE(gl_info) && (gl_info->vs_nv_version == VS_VERSION_30)) {
- /* Geforce 200 - highend */
- if(strstr(gl_info->gl_renderer, "GTX 280") ||
- strstr(gl_info->gl_renderer, "GTX 285") ||
- strstr(gl_info->gl_renderer, "GTX 295"))
- {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_GTX280;
- vidmem = 1024;
- }
- /* Geforce 200 - midend high */
- if(strstr(gl_info->gl_renderer, "GTX 275")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_GTX275;
- vidmem = 896;
- }
- /* Geforce 200 - midend */
- if(strstr(gl_info->gl_renderer, "GTX 260")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_GTX260;
- vidmem = 1024;
- }
- /* Geforce9 - highend / Geforce 200 - midend (GTS 150/250 are based on the same core) */
- else if(strstr(gl_info->gl_renderer, "9800") ||
- strstr(gl_info->gl_renderer, "GTS 150") ||
- strstr(gl_info->gl_renderer, "GTS 250"))
- {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_9800GT;
- vidmem = 512;
- }
- /* Geforce9 - midend */
- else if(strstr(gl_info->gl_renderer, "9600")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_9600GT;
- vidmem = 384; /* The 9600GSO has 384MB, the 9600GT has 512-1024MB */
- }
- /* Geforce9 - midend low / Geforce 200 - low*/
- else if(strstr(gl_info->gl_renderer, "9500") ||
- strstr(gl_info->gl_renderer, "GT 120") ||
- strstr(gl_info->gl_renderer, "GT 130"))
- {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_9500GT;
- vidmem = 256; /* The 9500GT has 256-1024MB */
- }
- /* Geforce9 - lowend */
- else if(strstr(gl_info->gl_renderer, "9400")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_9400GT;
- vidmem = 256; /* The 9400GT has 256-1024MB */
- }
- /* Geforce9 - lowend low */
- else if(strstr(gl_info->gl_renderer, "9100") ||
- strstr(gl_info->gl_renderer, "9200") ||
- strstr(gl_info->gl_renderer, "9300") ||
- strstr(gl_info->gl_renderer, "G 100"))
- {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_9200;
- vidmem = 256; /* The 9100-9300 cards have 256MB */
- }
- /* Geforce8 - highend */
- else if (strstr(gl_info->gl_renderer, "8800")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_8800GTS;
- vidmem = 320; /* The 8800GTS uses 320MB, a 8800GTX can have 768MB */
- }
- /* Geforce8 - midend mobile */
- else if(strstr(gl_info->gl_renderer, "8600 M")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_8600MGT;
- vidmem = 512;
- }
- /* Geforce8 - midend */
- else if(strstr(gl_info->gl_renderer, "8600") ||
- strstr(gl_info->gl_renderer, "8700"))
- {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_8600GT;
- vidmem = 256;
- }
- /* Geforce8 - lowend */
- else if(strstr(gl_info->gl_renderer, "8300") ||
- strstr(gl_info->gl_renderer, "8400") ||
- strstr(gl_info->gl_renderer, "8500"))
- {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_8300GS;
- vidmem = 128; /* 128-256MB for a 8300, 256-512MB for a 8400 */
- }
- /* Geforce7 - highend */
- else if(strstr(gl_info->gl_renderer, "7800") ||
- strstr(gl_info->gl_renderer, "7900") ||
- strstr(gl_info->gl_renderer, "7950") ||
- strstr(gl_info->gl_renderer, "Quadro FX 4") ||
- strstr(gl_info->gl_renderer, "Quadro FX 5"))
- {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_7800GT;
- vidmem = 256; /* A 7800GT uses 256MB while highend 7900 cards can use 512MB */
- }
- /* Geforce7 midend */
- else if(strstr(gl_info->gl_renderer, "7600") ||
- strstr(gl_info->gl_renderer, "7700")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_7600;
- vidmem = 256; /* The 7600 uses 256-512MB */
- /* Geforce7 lower medium */
- } else if(strstr(gl_info->gl_renderer, "7400")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_7400;
- vidmem = 256; /* The 7400 uses 256-512MB */
- }
- /* Geforce7 lowend */
- else if(strstr(gl_info->gl_renderer, "7300")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_7300;
- vidmem = 256; /* Mac Pros with this card have 256 MB */
- }
- /* Geforce6 highend */
- else if(strstr(gl_info->gl_renderer, "6800"))
- {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_6800;
- vidmem = 128; /* The 6800 uses 128-256MB, the 7600 uses 256-512MB */
- }
- /* Geforce6 - midend */
- else if(strstr(gl_info->gl_renderer, "6600") ||
- strstr(gl_info->gl_renderer, "6610") ||
- strstr(gl_info->gl_renderer, "6700"))
- {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_6600GT;
- vidmem = 128; /* A 6600GT has 128-256MB */
- }
- /* Geforce6/7 lowend */
- else {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE_6200; /* Geforce 6100/6150/6200/7300/7400/7500 */
- vidmem = 64; /* */
- }
- } else if(WINE_D3D9_CAPABLE(gl_info)) {
- /* GeforceFX - highend */
- if (strstr(gl_info->gl_renderer, "5800") ||
- strstr(gl_info->gl_renderer, "5900") ||
- strstr(gl_info->gl_renderer, "5950") ||
- strstr(gl_info->gl_renderer, "Quadro FX"))
- {
- gl_info->gl_card = CARD_NVIDIA_GEFORCEFX_5800;
- vidmem = 256; /* 5800-5900 cards use 256MB */
- }
- /* GeforceFX - midend */
- else if(strstr(gl_info->gl_renderer, "5600") ||
- strstr(gl_info->gl_renderer, "5650") ||
- strstr(gl_info->gl_renderer, "5700") ||
- strstr(gl_info->gl_renderer, "5750"))
- {
- gl_info->gl_card = CARD_NVIDIA_GEFORCEFX_5600;
- vidmem = 128; /* A 5600 uses 128-256MB */
- }
- /* GeforceFX - lowend */
- else {
- gl_info->gl_card = CARD_NVIDIA_GEFORCEFX_5200; /* GeforceFX 5100/5200/5250/5300/5500 */
- vidmem = 64; /* Normal FX5200 cards use 64-256MB; laptop (non-standard) can have less */
- }
- } else if(WINE_D3D8_CAPABLE(gl_info)) {
- if (strstr(gl_info->gl_renderer, "GeForce4 Ti") || strstr(gl_info->gl_renderer, "Quadro4")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE4_TI4200; /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800, Quadro4 */
- vidmem = 64; /* Geforce4 Ti cards have 64-128MB */
- }
- else {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE3; /* Geforce3 standard/Ti200/Ti500, Quadro DCC */
- vidmem = 64; /* Geforce3 cards have 64-128MB */
- }
- } else if(WINE_D3D7_CAPABLE(gl_info)) {
- if (strstr(gl_info->gl_renderer, "GeForce4 MX")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE4_MX; /* MX420/MX440/MX460/MX4000 */
- vidmem = 64; /* Most Geforce4MX GPUs have at least 64MB of memory, some early models had 32MB but most have 64MB or even 128MB */
- }
- else if(strstr(gl_info->gl_renderer, "GeForce2 MX") || strstr(gl_info->gl_renderer, "Quadro2 MXR")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE2_MX; /* Geforce2 standard/MX100/MX200/MX400, Quadro2 MXR */
- vidmem = 32; /* Geforce2MX GPUs have 32-64MB of video memory */
- }
- else if(strstr(gl_info->gl_renderer, "GeForce2") || strstr(gl_info->gl_renderer, "Quadro2")) {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE2; /* Geforce2 GTS/Pro/Ti/Ultra, Quadro2 */
- vidmem = 32; /* Geforce2 GPUs have 32-64MB of video memory */
- }
- else {
- gl_info->gl_card = CARD_NVIDIA_GEFORCE; /* Geforce 256/DDR, Quadro */
- vidmem = 32; /* Most Geforce1 cards have 32MB, there are also some rare 16 and 64MB (Dell) models */
- }
- } else {
- if (strstr(gl_info->gl_renderer, "TNT2")) {
- gl_info->gl_card = CARD_NVIDIA_RIVA_TNT2; /* Riva TNT2 standard/M64/Pro/Ultra */
- vidmem = 32; /* Most TNT2 boards have 32MB, though there are 16MB boards too */
- }
- else {
- gl_info->gl_card = CARD_NVIDIA_RIVA_TNT; /* Riva TNT, Vanta */
- vidmem = 16; /* Most TNT boards have 16MB, some rare models have 8MB */
- }
- }
- break;
- case VENDOR_ATI:
- if(WINE_D3D9_CAPABLE(gl_info)) {
- /* Radeon R6xx HD2900/HD3800 - highend */
- if (strstr(gl_info->gl_renderer, "HD 2900") ||
- strstr(gl_info->gl_renderer, "HD 3870") ||
- strstr(gl_info->gl_renderer, "HD 3850"))
- {
- gl_info->gl_card = CARD_ATI_RADEON_HD2900;
- vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
- }
- /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
- else if (strstr(gl_info->gl_renderer, "HD 2600") ||
- strstr(gl_info->gl_renderer, "HD 3830") ||
- strstr(gl_info->gl_renderer, "HD 3690") ||
- strstr(gl_info->gl_renderer, "HD 3650"))
- {
- gl_info->gl_card = CARD_ATI_RADEON_HD2600;
- vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
- }
- /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
- else if (strstr(gl_info->gl_renderer, "HD 2300") ||
- strstr(gl_info->gl_renderer, "HD 2400") ||
- strstr(gl_info->gl_renderer, "HD 3470") ||
- strstr(gl_info->gl_renderer, "HD 3450") ||
- strstr(gl_info->gl_renderer, "HD 3430"))
- {
- gl_info->gl_card = CARD_ATI_RADEON_HD2300;
- vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
- }
- /* Radeon R6xx/R7xx integrated */
- else if (strstr(gl_info->gl_renderer, "HD 3100") ||
- strstr(gl_info->gl_renderer, "HD 3200") ||
- strstr(gl_info->gl_renderer, "HD 3300"))
- {
- gl_info->gl_card = CARD_ATI_RADEON_HD3200;
- vidmem = 128; /* 128MB */
- }
- /* Radeon R5xx */
- else if (strstr(gl_info->gl_renderer, "X1600") ||
- strstr(gl_info->gl_renderer, "X1650") ||
- strstr(gl_info->gl_renderer, "X1800") ||
- strstr(gl_info->gl_renderer, "X1900") ||
- strstr(gl_info->gl_renderer, "X1950"))
- {
- gl_info->gl_card = CARD_ATI_RADEON_X1600;
- vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */
- }
- /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
- else if(strstr(gl_info->gl_renderer, "X700") ||
- strstr(gl_info->gl_renderer, "X800") ||
- strstr(gl_info->gl_renderer, "X850") ||
- strstr(gl_info->gl_renderer, "X1300") ||
- strstr(gl_info->gl_renderer, "X1400") ||
- strstr(gl_info->gl_renderer, "X1450") ||
- strstr(gl_info->gl_renderer, "X1550"))
- {
- gl_info->gl_card = CARD_ATI_RADEON_X700;
- vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
- }
- /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */
- else if(strstr(gl_info->gl_renderer, "Radeon Xpress"))
- {
- gl_info->gl_card = CARD_ATI_RADEON_XPRESS_200M;
- vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */
- }
- /* Radeon R3xx */
- else {
- gl_info->gl_card = CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */
- vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */
- }
- } else if(WINE_D3D8_CAPABLE(gl_info)) {
- gl_info->gl_card = CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */
- vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */
- } else if(WINE_D3D7_CAPABLE(gl_info)) {
- gl_info->gl_card = CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */
- vidmem = 32; /* There are models with up to 64MB */
- } else {
- gl_info->gl_card = CARD_ATI_RAGE_128PRO;
- vidmem = 16; /* There are 16-32MB models */
- }
- break;
- case VENDOR_INTEL:
- if (strstr(gl_info->gl_renderer, "GMA 950") ||
- strstr(gl_info->gl_renderer, "945GM")) {
- /* MacOS calls the card GMA 950, but everywhere else the PCI ID is named 945GM */
- gl_info->gl_card = CARD_INTEL_I945GM;
- vidmem = 64;
- } else if (strstr(gl_info->gl_renderer, "915GM")) {
- gl_info->gl_card = CARD_INTEL_I915GM;
- } else if (strstr(gl_info->gl_renderer, "915G")) {
- gl_info->gl_card = CARD_INTEL_I915G;
- } else if (strstr(gl_info->gl_renderer, "865G")) {
- gl_info->gl_card = CARD_INTEL_I865G;
- } else if (strstr(gl_info->gl_renderer, "855G")) {
- gl_info->gl_card = CARD_INTEL_I855G;
- } else if (strstr(gl_info->gl_renderer, "830G")) {
- gl_info->gl_card = CARD_INTEL_I830G;
- } else {
- gl_info->gl_card = CARD_INTEL_I915G;
- }
- break;
- case VENDOR_MESA:
- case VENDOR_WINE:
- default:
- /* Default to generic Nvidia hardware based on the supported OpenGL extensions. The choice
- * for Nvidia was because the hardware and drivers they make are of good quality. This makes
- * them a good generic choice.
- */
- gl_info->gl_vendor = VENDOR_NVIDIA;
- if(WINE_D3D9_CAPABLE(gl_info))
- gl_info->gl_card = CARD_NVIDIA_GEFORCEFX_5600;
- else if(WINE_D3D8_CAPABLE(gl_info))
- gl_info->gl_card = CARD_NVIDIA_GEFORCE3;
- else if(WINE_D3D7_CAPABLE(gl_info))
- gl_info->gl_card = CARD_NVIDIA_GEFORCE;
- else if(WINE_D3D6_CAPABLE(gl_info))
- gl_info->gl_card = CARD_NVIDIA_RIVA_TNT;
- else
- gl_info->gl_card = CARD_NVIDIA_RIVA_128;
- }
+ gl_info->gl_card = wined3d_guess_card(gl_info, gl_renderer, &gl_info->gl_vendor, &vidmem);
TRACE_(d3d_caps)("FOUND (fake) card: 0x%x (vendor id), 0x%x (device id)\n", gl_info->gl_vendor, gl_info->gl_card);
/* If we have an estimate use it, else default to 64MB; */
@@ -1413,31 +1908,6 @@ static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) {
stateLookup[WINELOOKUP_WARPPARAM][WINED3DTADDRESS_MIRRORONCE - minLookup[WINELOOKUP_WARPPARAM]] =
gl_info->supported[ATI_TEXTURE_MIRROR_ONCE] ? GL_MIRROR_CLAMP_TO_EDGE_ATI : GL_REPEAT;
- magLookup[WINED3DTEXF_NONE - WINED3DTEXF_NONE] = GL_NEAREST;
- magLookup[WINED3DTEXF_POINT - WINED3DTEXF_NONE] = GL_NEAREST;
- magLookup[WINED3DTEXF_LINEAR - WINED3DTEXF_NONE] = GL_LINEAR;
- magLookup[WINED3DTEXF_ANISOTROPIC - WINED3DTEXF_NONE] =
- gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC] ? GL_LINEAR : GL_NEAREST;
-
-
- minMipLookup[WINED3DTEXF_NONE].mip[WINED3DTEXF_NONE] = GL_LINEAR;
- minMipLookup[WINED3DTEXF_NONE].mip[WINED3DTEXF_POINT] = GL_LINEAR;
- minMipLookup[WINED3DTEXF_NONE].mip[WINED3DTEXF_LINEAR] = GL_LINEAR;
- minMipLookup[WINED3DTEXF_POINT].mip[WINED3DTEXF_NONE] = GL_NEAREST;
- minMipLookup[WINED3DTEXF_POINT].mip[WINED3DTEXF_POINT] = GL_NEAREST_MIPMAP_NEAREST;
- minMipLookup[WINED3DTEXF_POINT].mip[WINED3DTEXF_LINEAR] = GL_NEAREST_MIPMAP_LINEAR;
- minMipLookup[WINED3DTEXF_LINEAR].mip[WINED3DTEXF_NONE] = GL_LINEAR;
- minMipLookup[WINED3DTEXF_LINEAR].mip[WINED3DTEXF_POINT] = GL_LINEAR_MIPMAP_NEAREST;
- minMipLookup[WINED3DTEXF_LINEAR].mip[WINED3DTEXF_LINEAR] = GL_LINEAR_MIPMAP_LINEAR;
- minMipLookup[WINED3DTEXF_ANISOTROPIC].mip[WINED3DTEXF_NONE]
- = gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC] ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR;
- minMipLookup[WINED3DTEXF_ANISOTROPIC].mip[WINED3DTEXF_POINT]
- = gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC] ? GL_LINEAR_MIPMAP_NEAREST : GL_LINEAR;
- minMipLookup[WINED3DTEXF_ANISOTROPIC].mip[WINED3DTEXF_LINEAR]
- = gl_info->supported[EXT_TEXTURE_FILTER_ANISOTROPIC] ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR;
-
-/* TODO: config lookups */
-
/* Make sure there's an active HDC else the WGL extensions will fail */
hdc = pwglGetCurrentDC();
if (hdc) {
@@ -1452,7 +1922,6 @@ static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) {
while (*WGL_Extensions != 0x00) {
const char *Start;
char ThisExtn[256];
- size_t len;
while (isspace(*WGL_Extensions)) WGL_Extensions++;
Start = WGL_Extensions;
@@ -1466,7 +1935,7 @@ static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) {
memcpy(ThisExtn, Start, len);
ThisExtn[len] = '\0';
- TRACE_(d3d_caps)("- %s\n", ThisExtn);
+ TRACE_(d3d_caps)("- %s\n", debugstr_a(ThisExtn));
if (!strcmp(ThisExtn, "WGL_ARB_pbuffer")) {
gl_info->supported[WGL_ARB_PBUFFER] = TRUE;
@@ -1483,9 +1952,12 @@ static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) {
}
}
}
- LEAVE_GL();
- return return_value;
+ fixup_extensions(gl_info, gl_renderer);
+ add_gl_compat_wrappers(gl_info);
+
+ HeapFree(GetProcessHeap(), 0, gl_renderer);
+ return TRUE;
}
/**********************************************************
@@ -1532,40 +2004,39 @@ static UINT WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Ad
/* TODO: Store modes per adapter and read it from the adapter structure */
if (Adapter == 0) { /* Display */
- int i = 0;
- int j = 0;
+ unsigned int i = 0;
+ unsigned int j = 0;
+ DEVMODEW mode;
- if (!DEBUG_SINGLE_MODE) {
- DEVMODEW DevModeW;
+ memset(&mode, 0, sizeof(mode));
+ mode.dmSize = sizeof(mode);
- ZeroMemory(&DevModeW, sizeof(DevModeW));
- DevModeW.dmSize = sizeof(DevModeW);
- while (EnumDisplaySettingsExW(NULL, j, &DevModeW, 0)) {
- j++;
- switch (Format)
- {
- case WINED3DFMT_UNKNOWN:
- /* This is for D3D8, do not enumerate P8 here */
- if (DevModeW.dmBitsPerPel == 32 ||
- DevModeW.dmBitsPerPel == 16) i++;
- break;
- case WINED3DFMT_X8R8G8B8:
- if (DevModeW.dmBitsPerPel == 32) i++;
- break;
- case WINED3DFMT_R5G6B5:
- if (DevModeW.dmBitsPerPel == 16) i++;
- break;
- case WINED3DFMT_P8:
- if (DevModeW.dmBitsPerPel == 8) i++;
- break;
- default:
- /* Skip other modes as they do not match the requested format */
- break;
- }
+ while (EnumDisplaySettingsExW(NULL, j, &mode, 0))
+ {
+ ++j;
+ switch (Format)
+ {
+ case WINED3DFMT_UNKNOWN:
+ /* This is for D3D8, do not enumerate P8 here */
+ if (mode.dmBitsPerPel == 32 || mode.dmBitsPerPel == 16) ++i;
+ break;
+
+ case WINED3DFMT_X8R8G8B8:
+ if (mode.dmBitsPerPel == 32) ++i;
+ break;
+
+ case WINED3DFMT_R5G6B5:
+ if (mode.dmBitsPerPel == 16) ++i;
+ break;
+
+ case WINED3DFMT_P8:
+ if (mode.dmBitsPerPel == 8) ++i;
+ break;
+
+ default:
+ /* Skip other modes as they do not match the requested format */
+ break;
}
- } else {
- i = 1;
- j = 1;
}
TRACE_(d3d_caps)("(%p}->(Adapter: %d) => %d (out of %d)\n", This, Adapter, i, j);
@@ -1589,7 +2060,8 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte
}
/* TODO: Store modes per adapter and read it from the adapter structure */
- if (Adapter == 0 && !DEBUG_SINGLE_MODE) { /* Display */
+ if (Adapter == 0)
+ {
DEVMODEW DevModeW;
int ModeIdx = 0;
UINT i = 0;
@@ -1635,7 +2107,7 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte
if (EnumDisplaySettingsExW(NULL, ModeIdx, &DevModeW, 0)) {
pMode->Width = DevModeW.dmPelsWidth;
pMode->Height = DevModeW.dmPelsHeight;
- pMode->RefreshRate = WINED3DADAPTER_DEFAULT;
+ pMode->RefreshRate = DEFAULT_REFRESH_RATE;
if (DevModeW.dmFields & DM_DISPLAYFREQUENCY)
pMode->RefreshRate = DevModeW.dmDisplayFrequency;
@@ -1653,14 +2125,9 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte
pMode->RefreshRate, pMode->Format, debug_d3dformat(pMode->Format),
DevModeW.dmBitsPerPel);
- } else if (DEBUG_SINGLE_MODE) {
- /* Return one setting of the format requested */
- if (Mode > 0) return WINED3DERR_INVALIDCALL;
- pMode->Width = 800;
- pMode->Height = 600;
- pMode->RefreshRate = 60;
- pMode->Format = (Format == WINED3DFMT_UNKNOWN) ? WINED3DFMT_X8R8G8B8 : Format;
- } else {
+ }
+ else
+ {
FIXME_(d3d_caps)("Adapter not primary display\n");
}
@@ -1687,7 +2154,7 @@ static HRESULT WINAPI IWineD3DImpl_GetAdapterDisplayMode(IWineD3D *iface, UINT A
pMode->Width = DevModeW.dmPelsWidth;
pMode->Height = DevModeW.dmPelsHeight;
bpp = DevModeW.dmBitsPerPel;
- pMode->RefreshRate = WINED3DADAPTER_DEFAULT;
+ pMode->RefreshRate = DEFAULT_REFRESH_RATE;
if (DevModeW.dmFields&DM_DISPLAYFREQUENCY)
{
pMode->RefreshRate = DevModeW.dmDisplayFrequency;
@@ -1708,6 +2175,7 @@ static HRESULT WINAPI IWineD3DImpl_GetAdapterDisplayMode(IWineD3D *iface, UINT A
static HRESULT WINAPI IWineD3DImpl_GetAdapterIdentifier(IWineD3D *iface, UINT Adapter, DWORD Flags,
WINED3DADAPTER_IDENTIFIER* pIdentifier) {
IWineD3DImpl *This = (IWineD3DImpl *)iface;
+ size_t len;
TRACE_(d3d_caps)("(%p}->(Adapter: %d, Flags: %x, pId=%p)\n", This, Adapter, Flags, pIdentifier);
@@ -1717,44 +2185,70 @@ static HRESULT WINAPI IWineD3DImpl_GetAdapterIdentifier(IWineD3D *iface, UINT Ad
/* Return the information requested */
TRACE_(d3d_caps)("device/Vendor Name and Version detection using FillGLCaps\n");
- strcpy(pIdentifier->Driver, This->adapters[Adapter].driver);
- if(This->adapters[Adapter].gl_info.driver_description)
- strcpy(pIdentifier->Description, This->adapters[Adapter].gl_info.driver_description);
- else /* Copy default description "Direct3D HAL" */
- strcpy(pIdentifier->Description, This->adapters[Adapter].description);
- /* Note dx8 doesn't supply a DeviceName */
- if (NULL != pIdentifier->DeviceName) strcpy(pIdentifier->DeviceName, "\\\\.\\DISPLAY"); /* FIXME: May depend on desktop? */
- pIdentifier->DriverVersion->u.HighPart = This->adapters[Adapter].gl_info.driver_version_hipart;
- pIdentifier->DriverVersion->u.LowPart = This->adapters[Adapter].gl_info.driver_version;
- *(pIdentifier->VendorId) = This->adapters[Adapter].gl_info.gl_vendor;
- *(pIdentifier->DeviceId) = This->adapters[Adapter].gl_info.gl_card;
- *(pIdentifier->SubSysId) = 0;
- *(pIdentifier->Revision) = 0;
- *pIdentifier->DeviceIdentifier = IID_D3DDEVICE_D3DUID;
+ if (pIdentifier->driver_size)
+ {
+ len = min(strlen(This->adapters[Adapter].driver), pIdentifier->driver_size - 1);
+ memcpy(pIdentifier->driver, This->adapters[Adapter].driver, len);
+ pIdentifier->driver[len] = '\0';
+ }
+
+ if (pIdentifier->description_size)
+ {
+ const char *description;
+
+ if (This->adapters[Adapter].gl_info.driver_description)
+ description = This->adapters[Adapter].gl_info.driver_description;
+ else
+ description = This->adapters[Adapter].description;
+
+ len = min(strlen(description), pIdentifier->description_size - 1);
+ memcpy(pIdentifier->description, description, len);
+ pIdentifier->description[len] = '\0';
+ }
+
+ /* Note that d3d8 doesn't supply a device name. */
+ if (pIdentifier->device_name_size)
+ {
+ static const char *device_name = "\\\\.\\DISPLAY1"; /* FIXME: May depend on desktop? */
+
+ len = strlen(device_name);
+ if (len >= pIdentifier->device_name_size)
+ {
+ ERR("Device name size too small.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ memcpy(pIdentifier->device_name, device_name, len);
+ pIdentifier->device_name[len] = '\0';
+ }
+
+ pIdentifier->driver_version.u.HighPart = This->adapters[Adapter].gl_info.driver_version_hipart;
+ pIdentifier->driver_version.u.LowPart = This->adapters[Adapter].gl_info.driver_version;
+ pIdentifier->vendor_id = This->adapters[Adapter].gl_info.gl_vendor;
+ pIdentifier->device_id = This->adapters[Adapter].gl_info.gl_card;
+ pIdentifier->subsystem_id = 0;
+ pIdentifier->revision = 0;
+ memcpy(&pIdentifier->device_identifier, &IID_D3DDEVICE_D3DUID, sizeof(pIdentifier->device_identifier));
if(wined3d_settings.pci_device_id != PCI_DEVICE_NONE)
{
TRACE_(d3d_caps)("Overriding pci device id with: %x\n", wined3d_settings.pci_device_id);
- *(pIdentifier->DeviceId) = wined3d_settings.pci_device_id;
+ pIdentifier->device_id = wined3d_settings.pci_device_id;
}
if(wined3d_settings.pci_vendor_id != PCI_VENDOR_NONE)
{
TRACE_(d3d_caps)("Overriding pci vendor id with: %x\n", wined3d_settings.pci_vendor_id);
- *(pIdentifier->VendorId) = wined3d_settings.pci_vendor_id;
+ pIdentifier->vendor_id = wined3d_settings.pci_vendor_id;
}
- if (Flags & WINED3DENUM_NO_WHQL_LEVEL) {
- *(pIdentifier->WHQLLevel) = 0;
- } else {
- *(pIdentifier->WHQLLevel) = 1;
- }
+ pIdentifier->whql_level = (Flags & WINED3DENUM_NO_WHQL_LEVEL) ? 0 : 1;
return WINED3D_OK;
}
-static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const WineD3D_GL_Info *gl_info,
+static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const struct wined3d_gl_info *gl_info,
const WineD3D_PixelFormat *cfg, const struct GlPixelFormatDesc *format_desc)
{
short redSize, greenSize, blueSize, alphaSize, colorBits;
@@ -1803,7 +2297,7 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const WineD3D_GL_I
return FALSE;
}
-static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const WineD3D_GL_Info *gl_info,
+static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const struct wined3d_gl_info *gl_info,
const WineD3D_PixelFormat *cfg, const struct GlPixelFormatDesc *format_desc)
{
short depthSize, stencilSize;
@@ -1879,10 +2373,9 @@ static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, UINT
return WINED3DERR_NOTAVAILABLE;
}
-static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType,
- WINED3DFORMAT SurfaceFormat,
- BOOL Windowed, WINED3DMULTISAMPLE_TYPE MultiSampleType, DWORD* pQualityLevels) {
-
+static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType,
+ WINED3DFORMAT SurfaceFormat, BOOL Windowed, WINED3DMULTISAMPLE_TYPE MultiSampleType, DWORD *pQualityLevels)
+{
IWineD3DImpl *This = (IWineD3DImpl *)iface;
const struct GlPixelFormatDesc *glDesc;
const struct WineD3DAdapter *adapter;
@@ -1902,7 +2395,10 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U
/* TODO: handle Windowed, add more quality levels */
- if (WINED3DMULTISAMPLE_NONE == MultiSampleType) return WINED3D_OK;
+ if (WINED3DMULTISAMPLE_NONE == MultiSampleType) {
+ if(pQualityLevels) *pQualityLevels = 1;
+ return WINED3D_OK;
+ }
/* By default multisampling is disabled right now as it causes issues
* on some Nvidia driver versions and it doesn't work well in combination
@@ -2092,7 +2588,7 @@ static BOOL CheckDepthStencilCapability(struct WineD3DAdapter *adapter,
int it=0;
/* Only allow depth/stencil formats */
- if (!(ds_format_desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) return FALSE;
+ if (!(ds_format_desc->depth_size || ds_format_desc->stencil_size)) return FALSE;
/* Walk through all WGL pixel formats to find a match */
for (it = 0; it < adapter->nCfgs; ++it)
@@ -2179,7 +2675,7 @@ static BOOL CheckRenderTargetCapability(struct WineD3DAdapter *adapter,
static BOOL CheckSrgbReadCapability(struct WineD3DAdapter *adapter, const struct GlPixelFormatDesc *format_desc)
{
- const WineD3D_GL_Info *gl_info = &adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &adapter->gl_info;
/* Check for supported sRGB formats (Texture loading and framebuffer) */
if(!GL_SUPPORT(EXT_TEXTURE_SRGB)) {
@@ -2259,7 +2755,7 @@ static BOOL CheckWrapAndMipCapability(struct WineD3DAdapter *adapter, const stru
static BOOL CheckTextureCapability(struct WineD3DAdapter *adapter,
WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
{
- const WineD3D_GL_Info *gl_info = &adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &adapter->gl_info;
const shader_backend_t *shader_backend;
const struct fragment_pipeline *fp;
@@ -2539,7 +3035,7 @@ static BOOL CheckSurfaceCapability(struct WineD3DAdapter *adapter, const struct
static BOOL CheckVertexTextureCapability(struct WineD3DAdapter *adapter, const struct GlPixelFormatDesc *format_desc)
{
- const WineD3D_GL_Info *gl_info = &adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &adapter->gl_info;
if (!GL_LIMITS(vertex_samplers)) {
TRACE_(d3d_caps)("[FAILED]\n");
@@ -2563,12 +3059,13 @@ static BOOL CheckVertexTextureCapability(struct WineD3DAdapter *adapter, const s
return FALSE;
}
-static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType,
+static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType,
WINED3DFORMAT AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType, WINED3DFORMAT CheckFormat,
- WINED3DSURFTYPE SurfaceType) {
+ WINED3DSURFTYPE SurfaceType)
+{
IWineD3DImpl *This = (IWineD3DImpl *)iface;
struct WineD3DAdapter *adapter = &This->adapters[Adapter];
- const WineD3D_GL_Info *gl_info = &adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &adapter->gl_info;
const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(CheckFormat, gl_info);
const struct GlPixelFormatDesc *adapter_format_desc = getFormatDescEntry(AdapterFormat, gl_info);
DWORD UsageCaps = 0;
@@ -3047,18 +3544,6 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt
return WINED3DERR_NOTAVAILABLE;
}
- /* This format is nothing special and it is supported perfectly.
- * However, ati and nvidia driver on windows do not mark this format as
- * supported (tested with the dxCapsViewer) and pretending to
- * support this format uncovers a bug in Battlefield 1942 (fonts are missing)
- * So do the same as Windows drivers and pretend not to support it on dx8 and 9
- * Enable it on dx7. It will need additional checking on dx10 when we support it.
- */
- if(This->dxVersion > 7 && CheckFormat == WINED3DFMT_R8G8B8) {
- TRACE_(d3d_caps)("[FAILED]\n");
- return WINED3DERR_NOTAVAILABLE;
- }
-
/* When the UsageCaps exactly matches Usage return WINED3D_OK except for the situation in which
* WINED3DUSAGE_AUTOGENMIPMAP isn't around, then WINED3DOK_NOAUTOGEN is returned if all the other
* usage flags match. */
@@ -3105,7 +3590,7 @@ static const shader_backend_t *select_shader_backend(struct WineD3DAdapter *adap
static const struct fragment_pipeline *select_fragment_implementation(struct WineD3DAdapter *adapter,
WINED3DDEVTYPE DeviceType)
{
- const WineD3D_GL_Info *gl_info = &adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &adapter->gl_info;
int vs_selected_mode;
int ps_selected_mode;
@@ -3125,7 +3610,7 @@ static const struct fragment_pipeline *select_fragment_implementation(struct Win
static const struct blit_shader *select_blit_implementation(struct WineD3DAdapter *adapter, WINED3DDEVTYPE DeviceType)
{
- const WineD3D_GL_Info *gl_info = &adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &adapter->gl_info;
int vs_selected_mode;
int ps_selected_mode;
@@ -3144,7 +3629,7 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
IWineD3DImpl *This = (IWineD3DImpl *)iface;
struct WineD3DAdapter *adapter = &This->adapters[Adapter];
- const WineD3D_GL_Info *gl_info = &adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &adapter->gl_info;
int vs_selected_mode;
int ps_selected_mode;
struct shader_caps shader_caps;
@@ -3446,14 +3931,14 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
pCaps->MaxTextureRepeat = 32768;
pCaps->MaxTextureAspectRatio = GL_LIMITS(texture_size);
- pCaps->MaxVertexW = 1.0;
+ pCaps->MaxVertexW = 1.0f;
- pCaps->GuardBandLeft = 0;
- pCaps->GuardBandTop = 0;
- pCaps->GuardBandRight = 0;
- pCaps->GuardBandBottom = 0;
+ pCaps->GuardBandLeft = 0.0f;
+ pCaps->GuardBandTop = 0.0f;
+ pCaps->GuardBandRight = 0.0f;
+ pCaps->GuardBandBottom = 0.0f;
- pCaps->ExtentsAdjust = 0;
+ pCaps->ExtentsAdjust = 0.0f;
pCaps->StencilCaps = WINED3DSTENCILCAPS_DECRSAT |
WINED3DSTENCILCAPS_INCRSAT |
@@ -3465,9 +3950,7 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
pCaps->StencilCaps |= WINED3DSTENCILCAPS_DECR |
WINED3DSTENCILCAPS_INCR;
}
- if ( This->dxVersion > 8 &&
- ( GL_SUPPORT(EXT_STENCIL_TWO_SIDE) ||
- GL_SUPPORT(ATI_SEPARATE_STENCIL) ) ) {
+ if (GL_SUPPORT(EXT_STENCIL_TWO_SIDE) || GL_SUPPORT(ATI_SEPARATE_STENCIL)) {
pCaps->StencilCaps |= WINED3DSTENCILCAPS_TWOSIDED;
}
@@ -3483,14 +3966,13 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
pCaps->MaxPointSize = GL_LIMITS(pointsize);
+ /* FIXME: Add D3DVTXPCAPS_TWEENING, D3DVTXPCAPS_TEXGEN_SPHEREMAP */
pCaps->VertexProcessingCaps = WINED3DVTXPCAPS_DIRECTIONALLIGHTS |
WINED3DVTXPCAPS_MATERIALSOURCE7 |
WINED3DVTXPCAPS_POSITIONALLIGHTS |
WINED3DVTXPCAPS_LOCALVIEWER |
WINED3DVTXPCAPS_VERTEXFOG |
WINED3DVTXPCAPS_TEXGEN;
- /* FIXME: Add
- D3DVTXPCAPS_TWEENING, D3DVTXPCAPS_TEXGEN_SPHEREMAP */
pCaps->MaxPrimitiveCount = 0xFFFFF; /* For now set 2^20-1 which is used by most >=Geforce3/Radeon8500 cards */
pCaps->MaxVertexIndex = 0xFFFFF;
@@ -3539,7 +4021,7 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
if(ps_selected_mode == SHADER_NONE) {
TRACE_(d3d_caps)("Pixel shader disabled in config, reporting version 0.0\n");
pCaps->PixelShaderVersion = WINED3DPS_VERSION(0,0);
- pCaps->PixelShader1xMaxValue = 0.0;
+ pCaps->PixelShader1xMaxValue = 0.0f;
} else {
pCaps->PixelShaderVersion = shader_caps.PixelShaderVersion;
pCaps->PixelShader1xMaxValue = shader_caps.PixelShader1xMaxValue;
@@ -3762,7 +4244,7 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
} else {
object->surface_alignment = D3D8_PITCH_ALIGNMENT;
}
- object->posFixup[0] = 1.0; /* This is needed to get the x coord unmodified through a MAD */
+ object->posFixup[0] = 1.0f; /* This is needed to get the x coord unmodified through a MAD. */
/* Set the state up as invalid until the device is fully created */
object->state = WINED3DERR_DRIVERINTERNALERROR;
@@ -3788,6 +4270,7 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
object->shader_backend->shader_get_caps(DeviceType, &adapter->gl_info, &shader_caps);
object->d3d_vshader_constantF = shader_caps.MaxVertexShaderConst;
object->d3d_pshader_constantF = shader_caps.MaxPixelShaderConst;
+ object->vs_clipping = shader_caps.VSClipping;
memset(&ffp_caps, 0, sizeof(ffp_caps));
frag_pipeline = select_fragment_implementation(adapter, DeviceType);
@@ -3853,366 +4336,6 @@ ULONG WINAPI D3DCB_DefaultDestroyVolume(IWineD3DVolume *pVolume) {
return IUnknown_Release(volumeParent);
}
-static BOOL match_apple(const WineD3D_GL_Info *gl_info)
-{
- /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
- * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
- * detect the Apple OpenGL implementation to apply some extension fixups afterwards.
- *
- * Detecting this isn't really easy. The vendor string doesn't mention Apple. Compile-time checks
- * aren't sufficient either because a Linux binary may display on a macos X server via remote X11.
- * So try to detect the GL implementation by looking at certain Apple extensions. Some extensions
- * like client storage might be supported on other implementations too, but GL_APPLE_flush_render
- * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So
- * the chance that other implementations support them is rather small since Win32 QuickTime uses
- * DirectDraw, not OpenGL.
- */
- if(gl_info->supported[APPLE_FENCE] &&
- gl_info->supported[APPLE_CLIENT_STORAGE] &&
- gl_info->supported[APPLE_FLUSH_RENDER] &&
- gl_info->supported[APPLE_YCBCR_422]) {
- TRACE_(d3d_caps)("GL_APPLE_fence, GL_APPLE_client_storage, GL_APPLE_flush_render and GL_ycbcr_422 are supported\n");
- TRACE_(d3d_caps)("Activating MacOS fixups\n");
- return TRUE;
- } else {
- TRACE_(d3d_caps)("Apple extensions are not supported\n");
- TRACE_(d3d_caps)("Not activating MacOS fixups\n");
- return FALSE;
- }
-}
-
-static void test_pbo_functionality(WineD3D_GL_Info *gl_info) {
- /* Some OpenGL implementations, namely Apple's Geforce 8 driver, advertises PBOs,
- * but glTexSubImage from a PBO fails miserably, with the first line repeated over
- * all the texture. This function detects this bug by its symptom and disables PBOs
- * if the test fails.
- *
- * The test uploads a 4x4 texture via the PBO in the "native" format GL_BGRA,
- * GL_UNSIGNED_INT_8_8_8_8_REV. This format triggers the bug, and it is what we use
- * for D3DFMT_A8R8G8B8. Then the texture is read back without any PBO and the data
- * read back is compared to the original. If they are equal PBOs are assumed to work,
- * otherwise the PBO extension is disabled.
- */
- GLuint texture, pbo;
- static const unsigned int pattern[] = {
- 0x00000000, 0x000000ff, 0x0000ff00, 0x40ff0000,
- 0x80ffffff, 0x40ffff00, 0x00ff00ff, 0x0000ffff,
- 0x00ffff00, 0x00ff00ff, 0x0000ffff, 0x000000ff,
- 0x80ff00ff, 0x0000ffff, 0x00ff00ff, 0x40ff00ff
- };
- unsigned int check[sizeof(pattern) / sizeof(pattern[0])];
-
- if(!gl_info->supported[ARB_PIXEL_BUFFER_OBJECT]) {
- /* No PBO -> No point in testing them */
- return;
- }
-
- while(glGetError());
- glGenTextures(1, &texture);
- glBindTexture(GL_TEXTURE_2D, texture);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0);
- checkGLcall("Specifying the PBO test texture\n");
-
- GL_EXTCALL(glGenBuffersARB(1, &pbo));
- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo));
- GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, sizeof(pattern), pattern, GL_STREAM_DRAW_ARB));
- checkGLcall("Specifying the PBO test pbo\n");
-
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
- checkGLcall("Loading the PBO test texture\n");
-
- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
- glFinish(); /* just to be sure */
-
- memset(check, 0, sizeof(check));
- glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, check);
- checkGLcall("Reading back the PBO test texture\n");
-
- glDeleteTextures(1, &texture);
- GL_EXTCALL(glDeleteBuffersARB(1, &pbo));
- checkGLcall("PBO test cleanup\n");
-
- if(memcmp(check, pattern, sizeof(check)) != 0) {
- WARN_(d3d_caps)("PBO test failed, read back data doesn't match original\n");
- WARN_(d3d_caps)("Disabling PBOs. This may result in slower performance\n");
- gl_info->supported[ARB_PIXEL_BUFFER_OBJECT] = FALSE;
- } else {
- TRACE_(d3d_caps)("PBO test successful\n");
- }
-}
-
-/* Certain applications(Steam) complain if we report an outdated driver version. In general,
- * reporting a driver version is moot because we are not the Windows driver, and we have different
- * bugs, features, etc.
- *
- * If a card is not found in this table, the gl driver version is reported
- */
-struct driver_version_information {
- WORD vendor; /* reported PCI card vendor ID */
- WORD card; /* reported PCI card device ID */
- const char *description; /* Description of the card e.g. NVIDIA RIVA TNT */
- WORD hipart_hi, hipart_lo; /* driver hiword to report */
- WORD lopart_hi, lopart_lo; /* driver loword to report */
-};
-
-static const struct driver_version_information driver_version_table[] = {
- /* Nvidia drivers. Geforce6 and newer cards are supported by the current driver (180.x)
- * GeforceFX support is up to 173.x, - driver uses numbering x.y.11.7341 for 173.41 where x is the windows revision (6=2000/xp, 7=vista), y is unknown
- * Geforce2MX/3/4 up to 96.x - driver uses numbering 9.6.8.9 for 96.89
- * TNT/Geforce1/2 up to 71.x - driver uses numbering 7.1.8.6 for 71.86
- *
- * All version numbers used below are from the Linux nvidia drivers.
- */
- {VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT, "NVIDIA RIVA TNT", 7, 1, 8, 6 },
- {VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT2, "NVIDIA RIVA TNT2/TNT2 Pro", 7, 1, 8, 6 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE, "NVIDIA GeForce 256", 7, 1, 8, 6 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2_MX, "NVIDIA GeForce2 MX/MX 400", 9, 6, 4, 3 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2, "NVIDIA GeForce2 GTS/GeForce2 Pro", 7, 1, 8, 6 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE3, "NVIDIA GeForce3", 9, 6, 4, 3 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_MX, "NVIDIA GeForce4 MX 460", 9, 6, 4, 3 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_TI4200, "NVIDIA GeForce4 Ti 4200", 9, 6, 4, 3 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5200, "NVIDIA GeForce FX 5200", 7, 15, 11, 7341 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5600, "NVIDIA GeForce FX 5600", 7, 15, 11, 7341 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5800, "NVIDIA GeForce FX 5800", 7, 15, 11, 7341 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6200, "NVIDIA GeForce 6200", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6600GT, "NVIDIA GeForce 6600 GT", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6800, "NVIDIA GeForce 6800", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7300, "NVIDIA GeForce Go 7300", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7400, "NVIDIA GeForce Go 7400", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7600, "NVIDIA GeForce 7600 GT", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7800GT, "NVIDIA GeForce 7800 GT", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8300GS, "NVIDIA GeForce 8300 GS", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600GT, "NVIDIA GeForce 8600 GT", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600MGT, "NVIDIA GeForce 8600M GT", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8800GTS, "NVIDIA GeForce 8800 GTS", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9200, "NVIDIA GeForce 9200", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9400GT, "NVIDIA GeForce 9400 GT", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9500GT, "NVIDIA GeForce 9500 GT", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9600GT, "NVIDIA GeForce 9600 GT", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9800GT, "NVIDIA GeForce 9800 GT", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX260, "NVIDIA GeForce GTX 260", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX275, "NVIDIA GeForce GTX 275", 7, 15, 11, 8044 },
- {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX280, "NVIDIA GeForce GTX 280", 7, 15, 11, 8044 },
-
- /* ATI cards. The driver versions are somewhat similar, but not quite the same. Let's hardcode */
- {VENDOR_ATI, CARD_ATI_RADEON_9500, "ATI Radeon 9500", 6, 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_X700, "ATI Radeon X700 SE", 6, 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_X1600, "ATI Radeon X1600 Series", 6, 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD2300, "ATI Mobility Radeon HD 2300", 6, 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD2600, "ATI Mobility Radeon HD 2600", 6, 14, 10, 6764 },
- {VENDOR_ATI, CARD_ATI_RADEON_HD2900, "ATI Radeon HD 2900 XT", 6, 14, 10, 6764 },
-
- /* TODO: Add information about legacy ATI hardware, Intel and other cards */
-};
-
-static BOOL match_ati_r300_to_500(const WineD3D_GL_Info *gl_info) {
- if(gl_info->gl_vendor != VENDOR_ATI) return FALSE;
- if(gl_info->gl_card == CARD_ATI_RADEON_9500) return TRUE;
- if(gl_info->gl_card == CARD_ATI_RADEON_X700) return TRUE;
- if(gl_info->gl_card == CARD_ATI_RADEON_X1600) return TRUE;
- return FALSE;
-}
-
-static BOOL match_geforce5(const WineD3D_GL_Info *gl_info) {
- if(gl_info->gl_vendor == VENDOR_NVIDIA) {
- if(gl_info->gl_card == CARD_NVIDIA_GEFORCEFX_5800 || gl_info->gl_card == CARD_NVIDIA_GEFORCEFX_5600) {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static BOOL match_apple_intel(const WineD3D_GL_Info *gl_info) {
- return gl_info->gl_vendor == VENDOR_INTEL && match_apple(gl_info);
-}
-
-static BOOL match_apple_nonr500ati(const WineD3D_GL_Info *gl_info) {
- if(!match_apple(gl_info)) return FALSE;
- if(gl_info->gl_vendor != VENDOR_ATI) return FALSE;
- if(gl_info->gl_card == CARD_ATI_RADEON_X1600) return FALSE;
- return TRUE;
-}
-
-static BOOL match_fglrx(const WineD3D_GL_Info *gl_info) {
- if(gl_info->gl_vendor != VENDOR_ATI) return FALSE;
- if(match_apple(gl_info)) return FALSE;
- if(strstr(gl_info->gl_renderer, "DRI")) return FALSE; /* Filter out Mesa DRI drivers */
- return TRUE;
-}
-
-static void quirk_arb_constants(WineD3D_GL_Info *gl_info) {
- TRACE_(d3d_caps)("Using ARB vs constant limit(=%u) for GLSL\n", gl_info->vs_arb_constantsF);
- gl_info->vs_glsl_constantsF = gl_info->vs_arb_constantsF;
- TRACE_(d3d_caps)("Using ARB ps constant limit(=%u) for GLSL\n", gl_info->ps_arb_constantsF);
- gl_info->ps_glsl_constantsF = gl_info->ps_arb_constantsF;
-}
-
-static void quirk_apple_glsl_constants(WineD3D_GL_Info *gl_info) {
- quirk_arb_constants(gl_info);
- /* MacOS needs uniforms for relative addressing offsets. This can accumulate to quite a few uniforms.
- * Beyond that the general uniform isn't optimal, so reserve a number of uniforms. 12 vec4's should
- * allow 48 different offsets or other helper immediate values
- */
- TRACE_(d3d_caps)("Reserving 12 GLSL constants for compiler private use\n");
- gl_info->reserved_glsl_constants = max(gl_info->reserved_glsl_constants, 12);
-}
-
-/* fglrx crashes with a very bad kernel panic if GL_POINT_SPRITE_ARB is set to GL_COORD_REPLACE_ARB
- * on more than one texture unit. This means that the d3d9 visual point size test will cause a
- * kernel panic on any machine running fglrx 9.3(latest that supports r300 to r500 cards). This
- * quirk only enables point sprites on the first texture unit. This keeps point sprites working in
- * most games, but avoids the crash
- *
- * A more sophisticated way would be to find all units that need texture coordinates and enable
- * point sprites for one if only one is found, and software emulate point sprites in drawStridedSlow
- * if more than one unit needs texture coordinates(This requires software ffp and vertex shaders though)
- *
- * Note that disabling the extension entirely does not gain predictability because there is no point
- * sprite capability flag in d3d, so the potential rendering bugs are the same if we disable the extension.
- */
-static void quirk_one_point_sprite(WineD3D_GL_Info *gl_info) {
- if(gl_info->supported[ARB_POINT_SPRITE]) {
- TRACE("Limiting point sprites to one texture unit\n");
- gl_info->max_point_sprite_units = 1;
- }
-}
-
-static void quirk_ati_dx9(WineD3D_GL_Info *gl_info) {
- quirk_arb_constants(gl_info);
-
- /* MacOS advertises GL_ARB_texture_non_power_of_two on ATI r500 and earlier cards, although
- * these cards only support GL_ARB_texture_rectangle(D3DPTEXTURECAPS_NONPOW2CONDITIONAL).
- * If real NP2 textures are used, the driver falls back to software. We could just remove the
- * extension and use GL_ARB_texture_rectangle instead, but texture_rectangle is inconventient
- * due to the non-normalized texture coordinates. Thus set an internal extension flag,
- * GL_WINE_normalized_texrect, which signals the code that it can use non power of two textures
- * as per GL_ARB_texture_non_power_of_two, but has to stick to the texture_rectangle limits.
- *
- * fglrx doesn't advertise GL_ARB_texture_non_power_of_two, but it advertises opengl 2.0 which
- * has this extension promoted to core. The extension loading code sets this extension supported
- * due to that, so this code works on fglrx as well.
- */
- TRACE("GL_ARB_texture_non_power_of_two advertised on R500 or earlier card, removing\n");
- gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] = FALSE;
- gl_info->supported[WINE_NORMALIZED_TEXRECT] = TRUE;
-
- /* fglrx has the same structural issues as the one described in quirk_apple_glsl_constants, although
- * it is generally more efficient. Reserve just 8 constants
- */
- TRACE_(d3d_caps)("Reserving 8 GLSL constants for compiler private use\n");
- gl_info->reserved_glsl_constants = max(gl_info->reserved_glsl_constants, 8);
-}
-
-static void quirk_no_np2(WineD3D_GL_Info *gl_info) {
- /* The nVidia GeForceFX series reports OpenGL 2.0 capabilities with the latest drivers versions, but
- * doesn't explicitly advertise the ARB_tex_npot extension in the GL extension string.
- * This usually means that ARB_tex_npot is supported in hardware as long as the application is staying
- * within the limits enforced by the ARB_texture_rectangle extension. This however is not true for the
- * FX series, which instantly falls back to a slower software path as soon as ARB_tex_npot is used.
- * We therefore completely remove ARB_tex_npot from the list of supported extensions.
- *
- * Note that wine_normalized_texrect can't be used in this case because internally it uses ARB_tex_npot,
- * triggering the software fallback. There is not much we can do here apart from disabling the
- * software-emulated extension and reenable ARB_tex_rect (which was previously disabled
- * in IWineD3DImpl_FillGLCaps).
- * This fixup removes performance problems on both the FX 5900 and FX 5700 (e.g. for framebuffer
- * post-processing effects in the game "Max Payne 2").
- * The behaviour can be verified through a simple test app attached in bugreport #14724.
- */
- TRACE("GL_ARB_texture_non_power_of_two advertised through OpenGL 2.0 on NV FX card, removing\n");
- gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] = FALSE;
- gl_info->supported[ARB_TEXTURE_RECTANGLE] = TRUE;
-}
-
-static void quirk_texcoord_w(WineD3D_GL_Info *gl_info) {
- /* The Intel GPUs on MacOS set the .w register of texcoords to 0.0 by default, which causes problems
- * with fixed function fragment processing. Ideally this flag should be detected with a test shader
- * and OpenGL feedback mode, but some GL implementations (MacOS ATI at least, probably all MacOS ones)
- * do not like vertex shaders in feedback mode and return an error, even though it should be valid
- * according to the spec.
- *
- * We don't want to enable this on all cards, as it adds an extra instruction per texcoord used. This
- * makes the shader slower and eats instruction slots which should be available to the d3d app.
- *
- * ATI Radeon HD 2xxx cards on MacOS have the issue. Instead of checking for the buggy cards, blacklist
- * all radeon cards on Macs and whitelist the good ones. That way we're prepared for the future. If
- * this workaround is activated on cards that do not need it, it won't break things, just affect
- * performance negatively.
- */
- TRACE("Enabling vertex texture coord fixes in vertex shaders\n");
- gl_info->set_texcoord_w = TRUE;
-}
-
-struct driver_quirk quirk_table[] = {
- {
- match_ati_r300_to_500,
- quirk_ati_dx9,
- "ATI GLSL constant and normalized texrect quirk"
- },
- /* MacOS advertises more GLSL vertex shader uniforms than supported by the hardware, and if more are
- * used it falls back to software. While the compiler can detect if the shader uses all declared
- * uniforms, the optimization fails if the shader uses relative addressing. So any GLSL shader
- * using relative addressing falls back to software.
- *
- * ARB vp gives the correct amount of uniforms, so use it instead of GLSL
- */
- {
- match_apple,
- quirk_apple_glsl_constants,
- "Apple GLSL uniform override"
- },
- {
- match_geforce5,
- quirk_no_np2,
- "Geforce 5 NP2 disable"
- },
- {
- match_apple_intel,
- quirk_texcoord_w,
- "Init texcoord .w for Apple Intel GPU driver"
- },
- {
- match_apple_nonr500ati,
- quirk_texcoord_w,
- "Init texcoord .w for Apple ATI >= r600 GPU driver"
- },
- {
- match_fglrx,
- quirk_one_point_sprite,
- "Fglrx point sprite crash workaround"
- }
-};
-
-static void fixup_extensions(WineD3D_GL_Info *gl_info) {
- unsigned int i;
-
- for(i = 0; i < (sizeof(quirk_table) / sizeof(*quirk_table)); i++) {
- if(!quirk_table[i].match(gl_info)) continue;
- TRACE_(d3d_caps)("Applying driver quirk \"%s\"\n", quirk_table[i].description);
- quirk_table[i].apply(gl_info);
- }
-
- /* Find out if PBOs work as they are supposed to */
- test_pbo_functionality(gl_info);
-
- /* Fixup the driver version */
- for(i = 0; i < (sizeof(driver_version_table) / sizeof(driver_version_table[0])); i++) {
- if(gl_info->gl_vendor == driver_version_table[i].vendor &&
- gl_info->gl_card == driver_version_table[i].card) {
- TRACE_(d3d_caps)("Found card 0x%04x, 0x%04x in driver version DB\n", gl_info->gl_vendor, gl_info->gl_card);
-
- gl_info->driver_version = MAKEDWORD_VERSION(driver_version_table[i].lopart_hi,
- driver_version_table[i].lopart_lo);
- gl_info->driver_version_hipart = MAKEDWORD_VERSION(driver_version_table[i].hipart_hi,
- driver_version_table[i].hipart_lo);
- strcpy(gl_info->driver_description, driver_version_table[i].description);
- break;
- }
- }
-}
-
static void WINE_GLAPI invalid_func(const void *data)
{
ERR("Invalid vertex attribute function called\n");
@@ -4243,13 +4366,16 @@ static void WINE_GLAPI position_float4(const void *data)
{
const GLfloat *pos = data;
- if (pos[3] < eps && pos[3] > -eps)
- glVertex3fv(pos);
- else {
- float w = 1.0 / pos[3];
+ if (pos[3] != 0.0f && pos[3] != 1.0f)
+ {
+ float w = 1.0f / pos[3];
glVertex4f(pos[0] * w, pos[1] * w, pos[2] * w, w);
}
+ else
+ {
+ glVertex3fv(pos);
+ }
}
static void WINE_GLAPI diffuse_d3dcolor(const void *data)
@@ -4277,7 +4403,7 @@ static void WINE_GLAPI warn_no_specular_func(const void *data)
WARN("GL_EXT_secondary_color not supported\n");
}
-static void fillGLAttribFuncs(const WineD3D_GL_Info *gl_info)
+static void fillGLAttribFuncs(const struct wined3d_gl_info *gl_info)
{
position_funcs[WINED3D_FFP_EMIT_FLOAT1] = invalid_func;
position_funcs[WINED3D_FFP_EMIT_FLOAT2] = invalid_func;
@@ -4435,11 +4561,11 @@ BOOL InitAdapters(IWineD3DImpl *This)
* otherwise because we have to use winex11.drv's override
*/
#ifdef USE_WIN32_OPENGL
- glFinish = (void*)GetProcAddress(mod_gl, "glFinish");
- glFlush = (void*)GetProcAddress(mod_gl, "glFlush");
+ wglFinish = (void*)GetProcAddress(mod_gl, "glFinish");
+ wglFlush = (void*)GetProcAddress(mod_gl, "glFlush");
#else
- glFinish = (void*)pwglGetProcAddress("wglFinish");
- glFlush = (void*)pwglGetProcAddress("wglFlush");
+ wglFinish = (void*)pwglGetProcAddress("wglFinish");
+ wglFlush = (void*)pwglGetProcAddress("wglFlush");
#endif
glEnableWINE = glEnable;
@@ -4448,7 +4574,8 @@ BOOL InitAdapters(IWineD3DImpl *This)
/* For now only one default adapter */
{
struct WineD3DAdapter *adapter = &This->adapters[0];
- const WineD3D_GL_Info *gl_info = &adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &adapter->gl_info;
+ struct wined3d_fake_gl_ctx fake_gl_ctx = {0};
int iPixelFormat;
int res;
int i;
@@ -4461,31 +4588,26 @@ BOOL InitAdapters(IWineD3DImpl *This)
adapter->monitorPoint.x = -1;
adapter->monitorPoint.y = -1;
- if (!WineD3D_CreateFakeGLContext()) {
+ if (!WineD3D_CreateFakeGLContext(&fake_gl_ctx))
+ {
ERR("Failed to get a gl context for default adapter\n");
- WineD3D_ReleaseFakeGLContext();
goto nogl_adapter;
}
ret = IWineD3DImpl_FillGLCaps(&adapter->gl_info);
if(!ret) {
ERR("Failed to initialize gl caps for default adapter\n");
- WineD3D_ReleaseFakeGLContext();
+ WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
goto nogl_adapter;
}
ret = initPixelFormats(&adapter->gl_info);
if(!ret) {
ERR("Failed to init gl formats\n");
- WineD3D_ReleaseFakeGLContext();
+ WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
goto nogl_adapter;
}
- hdc = pwglGetCurrentDC();
- if(!hdc) {
- ERR("Failed to get gl HDC\n");
- WineD3D_ReleaseFakeGLContext();
- goto nogl_adapter;
- }
+ hdc = fake_gl_ctx.dc;
adapter->driver = "Display";
adapter->description = "Direct3D HAL";
@@ -4622,7 +4744,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
{
ERR("Disabling Direct3D because no hardware accelerated pixel formats have been found!\n");
- WineD3D_ReleaseFakeGLContext();
+ WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
HeapFree(GetProcessHeap(), 0, adapter->cfgs);
goto nogl_adapter;
}
@@ -4647,10 +4769,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
}
}
- fixup_extensions(&adapter->gl_info);
- add_gl_compat_wrappers(&adapter->gl_info);
-
- WineD3D_ReleaseFakeGLContext();
+ WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
select_shader_mode(&adapter->gl_info, WINED3DDEVTYPE_HAL, &ps_selected_mode, &vs_selected_mode);
select_shader_max_constants(ps_selected_mode, vs_selected_mode, &adapter->gl_info);
diff --git a/reactos/dll/directx/wine/wined3d/drawprim.c b/reactos/dll/directx/wine/wined3d/drawprim.c
index 68821b44db0..5a2c7e7aac4 100644
--- a/reactos/dll/directx/wine/wined3d/drawprim.c
+++ b/reactos/dll/directx/wine/wined3d/drawprim.c
@@ -32,6 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_draw);
#include
#include
+/* GL locking is done by the caller */
static void drawStridedFast(IWineD3DDevice *iface, GLenum primitive_type,
UINT min_vertex_idx, UINT max_vertex_idx, UINT count, UINT idx_size,
const void *idx_data, UINT start_idx)
@@ -68,8 +69,10 @@ static void drawStridedFast(IWineD3DDevice *iface, GLenum primitive_type,
* Slower GL version which extracts info about each vertex in turn
*/
-static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_stream_info *si, UINT NumVertexes,
- GLenum glPrimType, const void *idxData, UINT idxSize, UINT minIndex, UINT startIdx)
+/* GL locking is done by the caller */
+static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context *context,
+ const struct wined3d_stream_info *si, UINT NumVertexes, GLenum glPrimType,
+ const void *idxData, UINT idxSize, UINT minIndex, UINT startIdx)
{
unsigned int textureNo = 0;
const WORD *pIdxBufS = NULL;
@@ -84,6 +87,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_stream_i
const BYTE *texCoords[WINED3DDP_MAXTEXCOORD];
const BYTE *diffuse = NULL, *specular = NULL, *normal = NULL, *position = NULL;
const struct wined3d_stream_info_element *element;
+ UINT num_untracked_materials;
DWORD tex_mask = 0;
TRACE("Using slow vertex array code\n");
@@ -109,22 +113,38 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_stream_i
VTRACE(("glBegin(%x)\n", glPrimType));
glBegin(glPrimType);
- element = &si->elements[WINED3D_FFP_POSITION];
- if (element->data) position = element->data + streamOffset[element->stream_idx];
+ if (si->use_map & (1 << WINED3D_FFP_POSITION))
+ {
+ element = &si->elements[WINED3D_FFP_POSITION];
+ position = element->data + streamOffset[element->stream_idx];
+ }
- element = &si->elements[WINED3D_FFP_NORMAL];
- if (element->data) normal = element->data + streamOffset[element->stream_idx];
- else glNormal3f(0, 0, 0);
+ if (si->use_map & (1 << WINED3D_FFP_NORMAL))
+ {
+ element = &si->elements[WINED3D_FFP_NORMAL];
+ normal = element->data + streamOffset[element->stream_idx];
+ }
+ else
+ {
+ glNormal3f(0, 0, 0);
+ }
- element = &si->elements[WINED3D_FFP_DIFFUSE];
- if (element->data) diffuse = element->data + streamOffset[element->stream_idx];
- else glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- if (This->activeContext->num_untracked_materials && element->format_desc->format != WINED3DFMT_A8R8G8B8)
+ if (si->use_map & (1 << WINED3D_FFP_DIFFUSE))
+ {
+ element = &si->elements[WINED3D_FFP_DIFFUSE];
+ diffuse = element->data + streamOffset[element->stream_idx];
+ }
+ else
+ {
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ }
+ num_untracked_materials = context->num_untracked_materials;
+ if (num_untracked_materials && element->format_desc->format != WINED3DFMT_A8R8G8B8)
FIXME("Implement diffuse color tracking from %s\n", debug_d3dformat(element->format_desc->format));
- element = &si->elements[WINED3D_FFP_SPECULAR];
- if (element->data)
+ if (si->use_map & (1 << WINED3D_FFP_SPECULAR))
{
+ element = &si->elements[WINED3D_FFP_SPECULAR];
specular = element->data + streamOffset[element->stream_idx];
/* special case where the fog density is stored in the specular alpha channel */
@@ -159,7 +179,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_stream_i
for (textureNo = 0; textureNo < texture_stages; ++textureNo)
{
int coordIdx = This->stateBlock->textureState[textureNo][WINED3DTSS_TEXCOORDINDEX];
- int texture_idx = This->texUnitMap[textureNo];
+ DWORD texture_idx = This->texUnitMap[textureNo];
if (!GL_SUPPORT(ARB_MULTITEXTURE) && textureNo > 0)
{
@@ -169,7 +189,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_stream_i
if (!pixelShader && !This->stateBlock->textures[textureNo]) continue;
- if (texture_idx == -1) continue;
+ if (texture_idx == WINED3D_UNMAPPED_STAGE) continue;
if (coordIdx > 7)
{
@@ -182,9 +202,9 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_stream_i
continue;
}
- element = &si->elements[WINED3D_FFP_TEXCOORD0 + coordIdx];
- if (element->data)
+ if (si->use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx)))
{
+ element = &si->elements[WINED3D_FFP_TEXCOORD0 + coordIdx];
texCoords[coordIdx] = element->data + streamOffset[element->stream_idx];
tex_mask |= (1 << textureNo);
}
@@ -227,7 +247,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_stream_i
{
int coord_idx;
const void *ptr;
- int texture_idx;
+ DWORD texture_idx;
if (!(tmp_tex_mask & 1)) continue;
@@ -244,18 +264,20 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_stream_i
const void *ptrToCoords = diffuse + SkipnStrides * si->elements[WINED3D_FFP_DIFFUSE].stride;
diffuse_funcs[si->elements[WINED3D_FFP_DIFFUSE].format_desc->emit_idx](ptrToCoords);
- if(This->activeContext->num_untracked_materials) {
+ if (num_untracked_materials)
+ {
DWORD diffuseColor = ((const DWORD *)ptrToCoords)[0];
unsigned char i;
float color[4];
- color[0] = D3DCOLOR_B_R(diffuseColor) / 255.0;
- color[1] = D3DCOLOR_B_G(diffuseColor) / 255.0;
- color[2] = D3DCOLOR_B_B(diffuseColor) / 255.0;
- color[3] = D3DCOLOR_B_A(diffuseColor) / 255.0;
+ color[0] = D3DCOLOR_B_R(diffuseColor) / 255.0f;
+ color[1] = D3DCOLOR_B_G(diffuseColor) / 255.0f;
+ color[2] = D3DCOLOR_B_B(diffuseColor) / 255.0f;
+ color[3] = D3DCOLOR_B_A(diffuseColor) / 255.0f;
- for(i = 0; i < This->activeContext->num_untracked_materials; i++) {
- glMaterialfv(GL_FRONT_AND_BACK, This->activeContext->untracked_materials[i], color);
+ for (i = 0; i < num_untracked_materials; ++i)
+ {
+ glMaterialfv(GL_FRONT_AND_BACK, context->untracked_materials[i], color);
}
}
}
@@ -295,6 +317,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_stream_i
checkGLcall("glEnd and previous calls");
}
+/* GL locking is done by the caller */
static inline void send_attribute(IWineD3DDeviceImpl *This, WINED3DFORMAT format, const UINT index, const void *ptr)
{
switch(format)
@@ -397,6 +420,7 @@ static inline void send_attribute(IWineD3DDeviceImpl *This, WINED3DFORMAT format
}
}
+/* GL locking is done by the caller */
static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream_info *si, UINT numberOfVertices,
GLenum glPrimitiveType, const void *idxData, UINT idxSize, UINT minIndex, UINT startIdx)
{
@@ -442,8 +466,9 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream
}
}
- for(i = MAX_ATTRIBS - 1; i >= 0; i--) {
- if(!si->elements[i].data) continue;
+ for (i = MAX_ATTRIBS - 1; i >= 0; i--)
+ {
+ if (!(si->use_map & (1 << i))) continue;
ptr = si->elements[i].data +
si->elements[i].stride * SkipnStrides +
@@ -457,6 +482,7 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream
glEnd();
}
+/* GL locking is done by the caller */
static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wined3d_stream_info *si,
UINT numberOfVertices, GLenum glPrimitiveType, const void *idxData, UINT idxSize, UINT minIndex,
UINT startIdx)
@@ -496,6 +522,8 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wine
for (i = 0; i < sizeof(si->elements) / sizeof(*si->elements); ++i)
{
+ if (!(si->use_map & (1 << i))) continue;
+
if (stateblock->streamFlags[si->elements[i].stream_idx] & WINED3DSTREAMSOURCE_INSTANCEDATA)
{
instancedData[numInstancedAttribs] = i;
@@ -532,7 +560,11 @@ static inline void remove_vbos(IWineD3DDeviceImpl *This, struct wined3d_stream_i
for (i = 0; i < (sizeof(s->elements) / sizeof(*s->elements)); ++i)
{
- struct wined3d_stream_info_element *e = &s->elements[i];
+ struct wined3d_stream_info_element *e;
+
+ if (!(s->use_map & (1 << i))) continue;
+
+ e = &s->elements[i];
if (e->buffer_object)
{
struct wined3d_buffer *vb = (struct wined3d_buffer *)This->stateBlock->streamSource[e->stream_idx];
@@ -549,30 +581,42 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertice
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DSurfaceImpl *target;
+ struct wined3d_context *context;
unsigned int i;
if (!index_count) return;
- /* Invalidate the back buffer memory so LockRect will read it the next time */
- for(i = 0; i < GL_LIMITS(buffers); i++) {
- target = (IWineD3DSurfaceImpl *) This->render_targets[i];
- if (target) {
- IWineD3DSurface_LoadLocation((IWineD3DSurface *) target, SFLAG_INDRAWABLE, NULL);
- IWineD3DSurface_ModifyLocation((IWineD3DSurface *) target, SFLAG_INDRAWABLE, TRUE);
+ if (This->stateBlock->renderState[WINED3DRS_COLORWRITEENABLE])
+ {
+ /* Invalidate the back buffer memory so LockRect will read it the next time */
+ for (i = 0; i < GL_LIMITS(buffers); ++i)
+ {
+ target = (IWineD3DSurfaceImpl *)This->render_targets[i];
+ if (target)
+ {
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, NULL);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, TRUE);
+ }
}
}
/* Signals other modules that a drawing is in progress and the stateblock finalized */
This->isInDraw = TRUE;
- ActivateContext(This, This->render_targets[0], CTXUSAGE_DRAWPRIM);
+ context = ActivateContext(This, This->render_targets[0], CTXUSAGE_DRAWPRIM);
if (This->stencilBufferTarget) {
/* Note that this depends on the ActivateContext call above to set
- * This->render_offscreen properly */
- DWORD location = This->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
- surface_load_ds_location(This->stencilBufferTarget, location);
- surface_modify_ds_location(This->stencilBufferTarget, location);
+ * This->render_offscreen properly. We don't currently take the
+ * Z-compare function into account, but we could skip loading the
+ * depthstencil for D3DCMP_NEVER and D3DCMP_ALWAYS as well. Also note
+ * that we never copy the stencil data.*/
+ DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
+ if (This->stateBlock->renderState[WINED3DRS_ZWRITEENABLE]
+ || This->stateBlock->renderState[WINED3DRS_ZENABLE])
+ surface_load_ds_location(This->stencilBufferTarget, context, location);
+ if (This->stateBlock->renderState[WINED3DRS_ZWRITEENABLE])
+ surface_modify_ds_location(This->stencilBufferTarget, location);
}
/* Ok, we will be updating the screen from here onwards so grab the lock */
@@ -587,7 +631,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertice
if (!use_vs(This->stateBlock))
{
- if (!This->strided_streams.position_transformed && This->activeContext->num_untracked_materials
+ if (!This->strided_streams.position_transformed && context->num_untracked_materials
&& This->stateBlock->renderState[WINED3DRS_LIGHTING])
{
static BOOL warned;
@@ -599,7 +643,8 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertice
}
emulation = TRUE;
}
- else if(This->activeContext->fog_coord && This->stateBlock->renderState[WINED3DRS_FOGENABLE]) {
+ else if (context->fog_coord && This->stateBlock->renderState[WINED3DRS_FOGENABLE])
+ {
/* Either write a pipeline replacement shader or convert the specular alpha from unsigned byte
* to a float in the vertex buffer
*/
@@ -633,7 +678,8 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertice
}
drawStridedSlowVs(iface, stream_info, index_count, glPrimType, idxData, idxSize, minIndex, StartIdx);
} else {
- drawStridedSlow(iface, stream_info, index_count, glPrimType, idxData, idxSize, minIndex, StartIdx);
+ drawStridedSlow(iface, context, stream_info, index_count,
+ glPrimType, idxData, idxSize, minIndex, StartIdx);
}
} else if(This->instancedDraw) {
/* Instancing emulation with mixing immediate mode and arrays */
@@ -653,7 +699,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertice
#ifdef SHOW_FRAME_MAKEUP
{
static long int primCounter = 0;
- /* NOTE: set primCounter to the value reported by drawprim
+ /* NOTE: set primCounter to the value reported by drawprim
before you want to to write frame makeup to /tmp */
if (primCounter >= 0) {
WINED3DLOCKED_RECT r;
@@ -695,7 +741,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertice
static void normalize_normal(float *n) {
float length = n[0] * n[0] + n[1] * n[1] + n[2] * n[2];
- if(length == 0.0) return;
+ if (length == 0.0f) return;
length = sqrt(length);
n[0] = n[0] / length;
n[1] = n[1] / length;
@@ -727,7 +773,7 @@ static void normalize_normal(float *n) {
HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
struct WineD3DRectPatch *patch) {
unsigned int i, j, num_quads, out_vertex_size, buffer_size, d3d_out_vertex_size;
- float max_x = 0.0, max_y = 0.0, max_z = 0.0, neg_z = 0.0;
+ float max_x = 0.0f, max_y = 0.0f, max_z = 0.0f, neg_z = 0.0f;
struct wined3d_stream_info stream_info;
struct wined3d_stream_info_element *e;
const BYTE *data;
@@ -736,6 +782,11 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
GLenum feedback_type;
GLfloat *feedbuffer;
+ /* Simply activate the context for blitting. This disables all the things we don't want and
+ * takes care of dirtifying. Dirtifying is preferred over pushing / popping, since drawing the
+ * patch (as opposed to normal draws) will most likely need different changes anyway. */
+ ActivateContext(This, NULL, CTXUSAGE_BLIT);
+
/* First, locate the position data. This is provided in a vertex buffer in the stateblock.
* Beware of vbos
*/
@@ -786,19 +837,14 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
patch->has_normals = TRUE;
patch->has_texcoords = FALSE;
- /* Simply activate the context for blitting. This disables all the things we don't want and
- * takes care of dirtifying. Dirtifying is preferred over pushing / popping, since drawing the
- * patch (as opposed to normal draws) will most likely need different changes anyway
- */
- ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_BLIT);
ENTER_GL();
glMatrixMode(GL_PROJECTION);
checkGLcall("glMatrixMode(GL_PROJECTION)");
glLoadIdentity();
checkGLcall("glLoadIndentity()");
- glScalef(1 / (max_x) , 1 / (max_y), max_z == 0 ? 1 : 1 / ( 2 * max_z));
- glTranslatef(0, 0, 0.5);
+ glScalef(1.0f / (max_x), 1.0f / (max_y), max_z == 0.0f ? 1.0f : 1.0f / (2.0f * max_z));
+ glTranslatef(0.0f, 0.0f, 0.5f);
checkGLcall("glScalef");
glViewport(-max_x, -max_y, 2 * (max_x), 2 * (max_y));
checkGLcall("glViewport");
@@ -810,11 +856,11 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
checkGLcall("glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)");
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_FILLMODE));
if(patch->has_normals) {
- static const GLfloat black[] = {0, 0, 0, 0};
- static const GLfloat red[] = {1, 0, 0, 0};
- static const GLfloat green[] = {0, 1, 0, 0};
- static const GLfloat blue[] = {0, 0, 1, 0};
- static const GLfloat white[] = {1, 1, 1, 1};
+ static const GLfloat black[] = {0.0f, 0.0f, 0.0f, 0.0f};
+ static const GLfloat red[] = {1.0f, 0.0f, 0.0f, 0.0f};
+ static const GLfloat green[] = {0.0f, 1.0f, 0.0f, 0.0f};
+ static const GLfloat blue[] = {0.0f, 0.0f, 1.0f, 0.0f};
+ static const GLfloat white[] = {1.0f, 1.0f, 1.0f, 1.0f};
glEnable(GL_LIGHTING);
checkGLcall("glEnable(GL_LIGHTING)");
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, black);
@@ -833,21 +879,21 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
glLightfv(GL_LIGHT0, GL_AMBIENT, black);
glLightfv(GL_LIGHT0, GL_POSITION, red);
glEnable(GL_LIGHT0);
- checkGLcall("Setting up light 1\n");
+ checkGLcall("Setting up light 1");
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_ACTIVELIGHT(1));
glLightfv(GL_LIGHT1, GL_DIFFUSE, green);
glLightfv(GL_LIGHT1, GL_SPECULAR, black);
glLightfv(GL_LIGHT1, GL_AMBIENT, black);
glLightfv(GL_LIGHT1, GL_POSITION, green);
glEnable(GL_LIGHT1);
- checkGLcall("Setting up light 2\n");
+ checkGLcall("Setting up light 2");
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_ACTIVELIGHT(2));
glLightfv(GL_LIGHT2, GL_DIFFUSE, blue);
glLightfv(GL_LIGHT2, GL_SPECULAR, black);
glLightfv(GL_LIGHT2, GL_AMBIENT, black);
glLightfv(GL_LIGHT2, GL_POSITION, blue);
glEnable(GL_LIGHT2);
- checkGLcall("Setting up light 3\n");
+ checkGLcall("Setting up light 3");
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_MATERIAL);
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORVERTEX));
@@ -855,7 +901,7 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, black);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, black);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, white);
- checkGLcall("Setting up materials\n");
+ checkGLcall("Setting up materials");
}
/* Enable the needed maps.
@@ -895,18 +941,18 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
feedbuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buffer_size * sizeof(float) * 8);
glMap2f(GL_MAP2_VERTEX_3,
- 0, 1, vtxStride / sizeof(float), info->Width,
- 0, 1, info->Stride * vtxStride / sizeof(float), info->Height,
+ 0.0f, 1.0f, vtxStride / sizeof(float), info->Width,
+ 0.0f, 1.0f, info->Stride * vtxStride / sizeof(float), info->Height,
(const GLfloat *)data);
checkGLcall("glMap2f");
if(patch->has_texcoords) {
glMap2f(GL_MAP2_TEXTURE_COORD_4,
- 0, 1, vtxStride / sizeof(float), info->Width,
- 0, 1, info->Stride * vtxStride / sizeof(float), info->Height,
+ 0.0f, 1.0f, vtxStride / sizeof(float), info->Width,
+ 0.0f, 1.0f, info->Stride * vtxStride / sizeof(float), info->Height,
(const GLfloat *)data);
checkGLcall("glMap2f");
}
- glMapGrid2f(ceilf(patch->numSegs[0]), 0.0, 1.0, ceilf(patch->numSegs[1]), 0.0, 1.0);
+ glMapGrid2f(ceilf(patch->numSegs[0]), 0.0f, 1.0f, ceilf(patch->numSegs[1]), 0.0f, 1.0f);
checkGLcall("glMapGrid2f");
glFeedbackBuffer(buffer_size * 2, feedback_type, feedbuffer);
@@ -914,19 +960,17 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
glRenderMode(GL_FEEDBACK);
glEvalMesh2(GL_FILL, 0, ceilf(patch->numSegs[0]), 0, ceilf(patch->numSegs[1]));
- checkGLcall("glEvalMesh2\n");
+ checkGLcall("glEvalMesh2");
i = glRenderMode(GL_RENDER);
if(i == -1) {
LEAVE_GL();
ERR("Feedback failed. Expected %d elements back\n", buffer_size);
- Sleep(10000);
HeapFree(GetProcessHeap(), 0, feedbuffer);
return WINED3DERR_DRIVERINTERNALERROR;
} else if(i != buffer_size) {
LEAVE_GL();
ERR("Unexpected amount of elements returned. Expected %d, got %d\n", buffer_size, i);
- Sleep(10000);
HeapFree(GetProcessHeap(), 0, feedbuffer);
return WINED3DERR_DRIVERINTERNALERROR;
} else {
@@ -950,7 +994,7 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
*/
patch->mem[i + 0] = feedbuffer[j + out_vertex_size * 2 + 2]; /* x, triangle 2 */
patch->mem[i + 1] = feedbuffer[j + out_vertex_size * 2 + 3]; /* y, triangle 2 */
- patch->mem[i + 2] = (feedbuffer[j + out_vertex_size * 2 + 4] - 0.5) * 4 * max_z; /* z, triangle 3 */
+ patch->mem[i + 2] = (feedbuffer[j + out_vertex_size * 2 + 4] - 0.5f) * 4.0f * max_z; /* z, triangle 3 */
if(patch->has_normals) {
patch->mem[i + 3] = feedbuffer[j + out_vertex_size * 2 + 5];
patch->mem[i + 4] = feedbuffer[j + out_vertex_size * 2 + 6];
@@ -960,7 +1004,7 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
patch->mem[i + 0] = feedbuffer[j + out_vertex_size * 1 + 2]; /* x, triangle 2 */
patch->mem[i + 1] = feedbuffer[j + out_vertex_size * 1 + 3]; /* y, triangle 2 */
- patch->mem[i + 2] = (feedbuffer[j + out_vertex_size * 1 + 4] - 0.5) * 4 * max_z; /* z, triangle 2 */
+ patch->mem[i + 2] = (feedbuffer[j + out_vertex_size * 1 + 4] - 0.5f) * 4.0f * max_z; /* z, triangle 2 */
if(patch->has_normals) {
patch->mem[i + 3] = feedbuffer[j + out_vertex_size * 1 + 5];
patch->mem[i + 4] = feedbuffer[j + out_vertex_size * 1 + 6];
@@ -970,7 +1014,7 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
patch->mem[i + 0] = feedbuffer[j + out_vertex_size * 0 + 2]; /* x, triangle 1 */
patch->mem[i + 1] = feedbuffer[j + out_vertex_size * 0 + 3]; /* y, triangle 1 */
- patch->mem[i + 2] = (feedbuffer[j + out_vertex_size * 0 + 4] - 0.5) * 4 * max_z; /* z, triangle 1 */
+ patch->mem[i + 2] = (feedbuffer[j + out_vertex_size * 0 + 4] - 0.5f) * 4.0f * max_z; /* z, triangle 1 */
if(patch->has_normals) {
patch->mem[i + 3] = feedbuffer[j + out_vertex_size * 0 + 5];
patch->mem[i + 4] = feedbuffer[j + out_vertex_size * 0 + 6];
@@ -981,18 +1025,18 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
if(patch->has_normals) {
/* Now do the same with reverse light directions */
- static const GLfloat x[] = {-1, 0, 0, 0};
- static const GLfloat y[] = { 0, -1, 0, 0};
- static const GLfloat z[] = { 0, 0, -1, 0};
+ static const GLfloat x[] = {-1.0f, 0.0f, 0.0f, 0.0f};
+ static const GLfloat y[] = { 0.0f, -1.0f, 0.0f, 0.0f};
+ static const GLfloat z[] = { 0.0f, 0.0f, -1.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_POSITION, x);
glLightfv(GL_LIGHT1, GL_POSITION, y);
glLightfv(GL_LIGHT2, GL_POSITION, z);
- checkGLcall("Setting up reverse light directions\n");
+ checkGLcall("Setting up reverse light directions");
glRenderMode(GL_FEEDBACK);
checkGLcall("glRenderMode(GL_FEEDBACK)");
glEvalMesh2(GL_FILL, 0, ceilf(patch->numSegs[0]), 0, ceilf(patch->numSegs[1]));
- checkGLcall("glEvalMesh2\n");
+ checkGLcall("glEvalMesh2");
i = glRenderMode(GL_RENDER);
checkGLcall("glRenderMode(GL_RENDER)");
@@ -1006,29 +1050,29 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
ERR("Unexpected polygon: %f corners\n", feedbuffer[j + 1]);
continue;
}
- if(patch->mem[i + 3] == 0.0)
+ if(patch->mem[i + 3] == 0.0f)
patch->mem[i + 3] = -feedbuffer[j + out_vertex_size * 2 + 5];
- if(patch->mem[i + 4] == 0.0)
+ if(patch->mem[i + 4] == 0.0f)
patch->mem[i + 4] = -feedbuffer[j + out_vertex_size * 2 + 6];
- if(patch->mem[i + 5] == 0.0)
+ if(patch->mem[i + 5] == 0.0f)
patch->mem[i + 5] = -feedbuffer[j + out_vertex_size * 2 + 7];
normalize_normal(patch->mem + i + 3);
i += d3d_out_vertex_size;
- if(patch->mem[i + 3] == 0.0)
+ if(patch->mem[i + 3] == 0.0f)
patch->mem[i + 3] = -feedbuffer[j + out_vertex_size * 1 + 5];
- if(patch->mem[i + 4] == 0.0)
+ if(patch->mem[i + 4] == 0.0f)
patch->mem[i + 4] = -feedbuffer[j + out_vertex_size * 1 + 6];
- if(patch->mem[i + 5] == 0.0)
+ if(patch->mem[i + 5] == 0.0f)
patch->mem[i + 5] = -feedbuffer[j + out_vertex_size * 1 + 7];
normalize_normal(patch->mem + i + 3);
i += d3d_out_vertex_size;
- if(patch->mem[i + 3] == 0.0)
+ if(patch->mem[i + 3] == 0.0f)
patch->mem[i + 3] = -feedbuffer[j + out_vertex_size * 0 + 5];
- if(patch->mem[i + 4] == 0.0)
+ if(patch->mem[i + 4] == 0.0f)
patch->mem[i + 4] = -feedbuffer[j + out_vertex_size * 0 + 6];
- if(patch->mem[i + 5] == 0.0)
+ if(patch->mem[i + 5] == 0.0f)
patch->mem[i + 5] = -feedbuffer[j + out_vertex_size * 0 + 7];
normalize_normal(patch->mem + i + 3);
i += d3d_out_vertex_size;
diff --git a/reactos/dll/directx/wine/wined3d/gl_compat.c b/reactos/dll/directx/wine/wined3d/gl_compat.c
index 1fc48cc9204..9166041d7dc 100644
--- a/reactos/dll/directx/wine/wined3d/gl_compat.c
+++ b/reactos/dll/directx/wine/wined3d/gl_compat.c
@@ -133,7 +133,7 @@ static void WINE_GLAPI wine_glGetIntegerv(GLenum pname, GLint* params) {
static void (WINE_GLAPI *old_multitex_glGetFloatv) (GLenum pname, GLfloat* params) = NULL;
static void WINE_GLAPI wine_glGetFloatv(GLenum pname, GLfloat* params) {
- if(pname == GL_ACTIVE_TEXTURE) *params = 0.0;
+ if (pname == GL_ACTIVE_TEXTURE) *params = 0.0f;
else old_multitex_glGetFloatv(pname, params);
}
@@ -147,7 +147,7 @@ static void WINE_GLAPI wine_glGetDoublev(GLenum pname, GLdouble* params) {
static void (WINE_GLAPI *old_fogcoord_glEnable) (GLenum cap) = NULL;
static void WINE_GLAPI wine_glEnable(GLenum cap) {
if(cap == GL_FOG) {
- WineD3DContext *ctx = getActiveContext();
+ struct wined3d_context *ctx = context_get_current();
ctx->fog_enabled = 1;
if(ctx->gl_fog_source != GL_FRAGMENT_DEPTH_EXT) return;
}
@@ -157,7 +157,7 @@ static void WINE_GLAPI wine_glEnable(GLenum cap) {
static void (WINE_GLAPI *old_fogcoord_glDisable) (GLenum cap) = NULL;
static void WINE_GLAPI wine_glDisable(GLenum cap) {
if(cap == GL_FOG) {
- WineD3DContext *ctx = getActiveContext();
+ struct wined3d_context *ctx = context_get_current();
ctx->fog_enabled = 0;
if(ctx->gl_fog_source != GL_FRAGMENT_DEPTH_EXT) return;
}
@@ -166,8 +166,9 @@ static void WINE_GLAPI wine_glDisable(GLenum cap) {
static void (WINE_GLAPI *old_fogcoord_glFogi) (GLenum pname, GLint param) = NULL;
static void WINE_GLAPI wine_glFogi(GLenum pname, GLint param) {
+ struct wined3d_context *ctx = context_get_current();
+
if(pname == GL_FOG_COORDINATE_SOURCE_EXT) {
- WineD3DContext *ctx = getActiveContext();
ctx->gl_fog_source = param;
if(param == GL_FRAGMENT_DEPTH_EXT) {
if(ctx->fog_enabled) old_fogcoord_glEnable(GL_FOG);
@@ -177,9 +178,9 @@ static void WINE_GLAPI wine_glFogi(GLenum pname, GLint param) {
}
} else {
if(pname == GL_FOG_START) {
- getActiveContext()->fogstart = param;
+ ctx->fogstart = param;
} else if(pname == GL_FOG_END) {
- getActiveContext()->fogend = param;
+ ctx->fogend = param;
}
old_fogcoord_glFogi(pname, param);
}
@@ -187,8 +188,8 @@ static void WINE_GLAPI wine_glFogi(GLenum pname, GLint param) {
static void (WINE_GLAPI *old_fogcoord_glFogiv) (GLenum pname, const GLint *param) = NULL;
static void WINE_GLAPI wine_glFogiv(GLenum pname, const GLint *param) {
+ struct wined3d_context *ctx = context_get_current();
if(pname == GL_FOG_COORDINATE_SOURCE_EXT) {
- WineD3DContext *ctx = getActiveContext();
ctx->gl_fog_source = *param;
if(*param == GL_FRAGMENT_DEPTH_EXT) {
if(ctx->fog_enabled) old_fogcoord_glEnable(GL_FOG);
@@ -198,9 +199,9 @@ static void WINE_GLAPI wine_glFogiv(GLenum pname, const GLint *param) {
}
} else {
if(pname == GL_FOG_START) {
- getActiveContext()->fogstart = *param;
+ ctx->fogstart = *param;
} else if(pname == GL_FOG_END) {
- getActiveContext()->fogend = *param;
+ ctx->fogend = *param;
}
old_fogcoord_glFogiv(pname, param);
}
@@ -208,8 +209,8 @@ static void WINE_GLAPI wine_glFogiv(GLenum pname, const GLint *param) {
static void (WINE_GLAPI *old_fogcoord_glFogf) (GLenum pname, GLfloat param) = NULL;
static void WINE_GLAPI wine_glFogf(GLenum pname, GLfloat param) {
+ struct wined3d_context *ctx = context_get_current();
if(pname == GL_FOG_COORDINATE_SOURCE_EXT) {
- WineD3DContext *ctx = getActiveContext();
ctx->gl_fog_source = (GLint) param;
if(param == GL_FRAGMENT_DEPTH_EXT) {
if(ctx->fog_enabled) old_fogcoord_glEnable(GL_FOG);
@@ -219,9 +220,9 @@ static void WINE_GLAPI wine_glFogf(GLenum pname, GLfloat param) {
}
} else {
if(pname == GL_FOG_START) {
- getActiveContext()->fogstart = param;
+ ctx->fogstart = param;
} else if(pname == GL_FOG_END) {
- getActiveContext()->fogend = param;
+ ctx->fogend = param;
}
old_fogcoord_glFogf(pname, param);
}
@@ -229,8 +230,8 @@ static void WINE_GLAPI wine_glFogf(GLenum pname, GLfloat param) {
static void (WINE_GLAPI *old_fogcoord_glFogfv) (GLenum pname, const GLfloat *param) = NULL;
static void WINE_GLAPI wine_glFogfv(GLenum pname, const GLfloat *param) {
+ struct wined3d_context *ctx = context_get_current();
if(pname == GL_FOG_COORDINATE_SOURCE_EXT) {
- WineD3DContext *ctx = getActiveContext();
ctx->gl_fog_source = (GLint) *param;
if(*param == GL_FRAGMENT_DEPTH_EXT) {
if(ctx->fog_enabled) old_fogcoord_glEnable(GL_FOG);
@@ -240,15 +241,14 @@ static void WINE_GLAPI wine_glFogfv(GLenum pname, const GLfloat *param) {
}
} else {
if(pname == GL_FOG_COLOR) {
- WineD3DContext *ctx = getActiveContext();
ctx->fogcolor[0] = param[0];
ctx->fogcolor[1] = param[1];
ctx->fogcolor[2] = param[2];
ctx->fogcolor[3] = param[3];
} else if(pname == GL_FOG_START) {
- getActiveContext()->fogstart = *param;
+ ctx->fogstart = *param;
} else if(pname == GL_FOG_END) {
- getActiveContext()->fogend = *param;
+ ctx->fogend = *param;
}
old_fogcoord_glFogfv(pname, param);
}
@@ -269,15 +269,15 @@ static void (WINE_GLAPI *old_fogcoord_glFogCoordfvEXT) (const GLfloat *f) = NULL
static void (WINE_GLAPI *old_fogcoord_glFogCoorddvEXT) (const GLdouble *f) = NULL;
static void WINE_GLAPI wine_glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
- WineD3DContext *ctx = getActiveContext();
+ struct wined3d_context *ctx = context_get_current();
if(ctx->gl_fog_source == GL_FOG_COORDINATE_EXT && ctx->fog_enabled) {
GLfloat c[4] = {ctx->color[0], ctx->color[1], ctx->color[2], ctx->color[3]};
GLfloat i;
i = (ctx->fogend - ctx->fog_coord_value) / (ctx->fogend - ctx->fogstart);
- c[0] = i * c[0] + (1.0 - i) * ctx->fogcolor[0];
- c[1] = i * c[1] + (1.0 - i) * ctx->fogcolor[1];
- c[2] = i * c[2] + (1.0 - i) * ctx->fogcolor[2];
+ c[0] = i * c[0] + (1.0f - i) * ctx->fogcolor[0];
+ c[1] = i * c[1] + (1.0f - i) * ctx->fogcolor[1];
+ c[2] = i * c[2] + (1.0f - i) * ctx->fogcolor[2];
old_fogcoord_glColor4f(c[0], c[1], c[2], c[3]);
old_fogcoord_glVertex4f(x, y, z, w);
@@ -291,15 +291,15 @@ static void WINE_GLAPI wine_glVertex4fv(const GLfloat *pos) {
}
static void WINE_GLAPI wine_glVertex3f(GLfloat x, GLfloat y, GLfloat z) {
- wine_glVertex4f(x, y, z, 1.0);
+ wine_glVertex4f(x, y, z, 1.0f);
}
static void WINE_GLAPI wine_glVertex3fv(const GLfloat *pos) {
- wine_glVertex4f(pos[0], pos[1], pos[2], 1.0);
+ wine_glVertex4f(pos[0], pos[1], pos[2], 1.0f);
}
-static void wine_glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) {
- WineD3DContext *ctx = getActiveContext();
+static void WINE_GLAPI wine_glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) {
+ struct wined3d_context *ctx = context_get_current();
ctx->color[0] = r;
ctx->color[1] = g;
ctx->color[2] = b;
@@ -307,43 +307,44 @@ static void wine_glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) {
old_fogcoord_glColor4f(r, g, b, a);
}
-static void wine_glColor4fv(const GLfloat *c) {
+static void WINE_GLAPI wine_glColor4fv(const GLfloat *c) {
wine_glColor4f(c[0], c[1], c[2], c[3]);
}
-static void wine_glColor3f(GLfloat r, GLfloat g, GLfloat b) {
- wine_glColor4f(r, g, b, 1.0);
+static void WINE_GLAPI wine_glColor3f(GLfloat r, GLfloat g, GLfloat b) {
+ wine_glColor4f(r, g, b, 1.0f);
}
-static void wine_glColor3fv(const GLfloat *c) {
- wine_glColor4f(c[0], c[1], c[2], 1.0);
+static void WINE_GLAPI wine_glColor3fv(const GLfloat *c) {
+ wine_glColor4f(c[0], c[1], c[2], 1.0f);
}
-static void wine_glColor4ub(GLubyte r, GLubyte g, GLubyte b, GLubyte a) {
- wine_glColor4f(r / 255.0, g / 255.0, b / 255.0, a / 255.0);
+static void WINE_GLAPI wine_glColor4ub(GLubyte r, GLubyte g, GLubyte b, GLubyte a) {
+ wine_glColor4f(r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f);
}
/* In D3D the fog coord is a UBYTE, so there's no problem with using the single
* precision function
*/
-static void wine_glFogCoordfEXT(GLfloat f) {
- WineD3DContext *ctx = getActiveContext();
+static void WINE_GLAPI wine_glFogCoordfEXT(GLfloat f) {
+ struct wined3d_context *ctx = context_get_current();
ctx->fog_coord_value = f;
}
-static void wine_glFogCoorddEXT(GLdouble f) {
+static void WINE_GLAPI wine_glFogCoorddEXT(GLdouble f) {
wine_glFogCoordfEXT(f);
}
-static void wine_glFogCoordfvEXT(const GLfloat *f) {
+static void WINE_GLAPI wine_glFogCoordfvEXT(const GLfloat *f) {
wine_glFogCoordfEXT(*f);
}
-static void wine_glFogCoorddvEXT(const GLdouble *f) {
+static void WINE_GLAPI wine_glFogCoorddvEXT(const GLdouble *f) {
wine_glFogCoordfEXT(*f);
}
/* End GL_EXT_fog_coord emulation */
#define GLINFO_LOCATION (*gl_info)
-void add_gl_compat_wrappers(WineD3D_GL_Info *gl_info) {
+void add_gl_compat_wrappers(struct wined3d_gl_info *gl_info)
+{
if(!GL_SUPPORT(ARB_MULTITEXTURE)) {
TRACE("Applying GL_ARB_multitexture emulation hooks\n");
gl_info->glActiveTextureARB = wine_glActiveTextureARB;
diff --git a/reactos/dll/directx/wine/wined3d/glsl_shader.c b/reactos/dll/directx/wine/wined3d/glsl_shader.c
index ca503050646..b6fac0cb0ee 100644
--- a/reactos/dll/directx/wine/wined3d/glsl_shader.c
+++ b/reactos/dll/directx/wine/wined3d/glsl_shader.c
@@ -1,7 +1,7 @@
/*
* GLSL pixel and vertex shader implementation
*
- * Copyright 2006 Jason Green
+ * Copyright 2006 Jason Green
* Copyright 2006-2007 Henri Verbeet
* Copyright 2007-2008 Stefan Dösinger for CodeWeavers
* Copyright 2009 Henri Verbeet for CodeWeavers
@@ -83,7 +83,8 @@ struct constant_heap
/* GLSL shader private data */
struct shader_glsl_priv {
- struct hash_table_t *glsl_program_lookup;
+ struct wined3d_shader_buffer shader_buffer;
+ struct wine_rb_tree program_lookup;
struct glsl_shader_prog_link *glsl_program;
struct constant_heap vconst_heap;
struct constant_heap pconst_heap;
@@ -94,6 +95,7 @@ struct shader_glsl_priv {
/* Struct to maintain data about a linked GLSL program */
struct glsl_shader_prog_link {
+ struct wine_rb_entry program_lookup_entry;
struct list vshader_entry;
struct list pshader_entry;
GLhandleARB programId;
@@ -102,7 +104,7 @@ struct glsl_shader_prog_link {
GLint vuniformI_locations[MAX_CONST_I];
GLint puniformI_locations[MAX_CONST_I];
GLint posFixup_location;
- GLint np2Fixup_location[MAX_FRAGMENT_SAMPLERS];
+ GLint np2Fixup_location;
GLint bumpenvmat_location[MAX_TEXTURES];
GLint luminancescale_location[MAX_TEXTURES];
GLint luminanceoffset_location[MAX_TEXTURES];
@@ -113,6 +115,7 @@ struct glsl_shader_prog_link {
struct vs_compile_args vs_args;
struct ps_compile_args ps_args;
UINT constant_version;
+ const struct ps_np2fixup_info *np2Fixup_info;
};
typedef struct {
@@ -122,9 +125,59 @@ typedef struct {
struct vs_compile_args vs_args;
} glsl_program_key_t;
+struct shader_glsl_ctx_priv {
+ const struct vs_compile_args *cur_vs_args;
+ const struct ps_compile_args *cur_ps_args;
+ struct ps_np2fixup_info *cur_np2fixup_info;
+};
+
+struct glsl_ps_compiled_shader
+{
+ struct ps_compile_args args;
+ struct ps_np2fixup_info np2fixup;
+ GLhandleARB prgId;
+};
+
+struct glsl_pshader_private
+{
+ struct glsl_ps_compiled_shader *gl_shaders;
+ UINT num_gl_shaders, shader_array_size;
+};
+
+struct glsl_vs_compiled_shader
+{
+ struct vs_compile_args args;
+ GLhandleARB prgId;
+};
+
+struct glsl_vshader_private
+{
+ struct glsl_vs_compiled_shader *gl_shaders;
+ UINT num_gl_shaders, shader_array_size;
+};
+
+/* Extract a line from the info log.
+ * Note that this modifies the source string. */
+static char *get_info_log_line(char **ptr)
+{
+ char *p, *q;
+
+ p = *ptr;
+ if (!(q = strstr(p, "\n")))
+ {
+ if (!*p) return NULL;
+ *ptr += strlen(p);
+ return p;
+ }
+ *q = '\0';
+ *ptr = q + 1;
+
+ return p;
+}
/** Prints the GLSL info log which will contain error messages if they exist */
-static void print_glsl_info_log(const WineD3D_GL_Info *gl_info, GLhandleARB obj)
+/* GL locking is done by the caller */
+static void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLhandleARB obj)
{
int infologLength = 0;
char *infoLog;
@@ -140,10 +193,8 @@ static void print_glsl_info_log(const WineD3D_GL_Info *gl_info, GLhandleARB obj)
"Vertex shader(s) linked, no fragment shader(s) defined. \n ", /* fglrx, with \n */
"Vertex shader(s) linked, no fragment shader(s) defined.", /* fglrx, no \n */
"Fragment shader was successfully compiled to run on hardware.\n"
- "WARNING: 0:2: extension 'GL_ARB_draw_buffers' is not supported",
"Fragment shader(s) linked, no vertex shader(s) defined.", /* fglrx, no \n */
"Fragment shader(s) linked, no vertex shader(s) defined. \n ", /* fglrx, with \n */
- "WARNING: 0:2: extension 'GL_ARB_draw_buffers' is not supported\n" /* MacOS ati */
};
if (!TRACE_ON(d3d_shader) && !FIXME_ON(d3d_shader)) return;
@@ -156,6 +207,8 @@ static void print_glsl_info_log(const WineD3D_GL_Info *gl_info, GLhandleARB obj)
* that if there are errors. */
if (infologLength > 1)
{
+ char *ptr, *line;
+
/* Fglrx doesn't terminate the string properly, but it tells us the proper length.
* So use HEAP_ZERO_MEMORY to avoid uninitialized bytes
*/
@@ -169,10 +222,17 @@ static void print_glsl_info_log(const WineD3D_GL_Info *gl_info, GLhandleARB obj)
break;
}
}
- if(is_spam) {
- TRACE("Spam received from GLSL shader #%u: %s\n", obj, debugstr_a(infoLog));
- } else {
- FIXME("Error received from GLSL shader #%u: %s\n", obj, debugstr_a(infoLog));
+
+ ptr = infoLog;
+ if (is_spam)
+ {
+ TRACE("Spam received from GLSL shader #%u:\n", obj);
+ while ((line = get_info_log_line(&ptr))) TRACE(" %s\n", line);
+ }
+ else
+ {
+ FIXME("Error received from GLSL shader #%u:\n", obj);
+ while ((line = get_info_log_line(&ptr))) FIXME(" %s\n", line);
}
HeapFree(GetProcessHeap(), 0, infoLog);
}
@@ -181,7 +241,9 @@ static void print_glsl_info_log(const WineD3D_GL_Info *gl_info, GLhandleARB obj)
/**
* Loads (pixel shader) samplers
*/
-static void shader_glsl_load_psamplers(const WineD3D_GL_Info *gl_info, DWORD *tex_unit_map, GLhandleARB programId)
+/* GL locking is done by the caller */
+static void shader_glsl_load_psamplers(const struct wined3d_gl_info *gl_info,
+ DWORD *tex_unit_map, GLhandleARB programId)
{
GLint name_loc;
int i;
@@ -204,7 +266,9 @@ static void shader_glsl_load_psamplers(const WineD3D_GL_Info *gl_info, DWORD *te
}
}
-static void shader_glsl_load_vsamplers(const WineD3D_GL_Info *gl_info, DWORD *tex_unit_map, GLhandleARB programId)
+/* GL locking is done by the caller */
+static void shader_glsl_load_vsamplers(const struct wined3d_gl_info *gl_info,
+ DWORD *tex_unit_map, GLhandleARB programId)
{
GLint name_loc;
char sampler_name[20];
@@ -227,7 +291,8 @@ static void shader_glsl_load_vsamplers(const WineD3D_GL_Info *gl_info, DWORD *te
}
}
-static inline void walk_constant_heap(const WineD3D_GL_Info *gl_info, const float *constants,
+/* GL locking is done by the caller */
+static inline void walk_constant_heap(const struct wined3d_gl_info *gl_info, const float *constants,
const GLint *constant_locations, const struct constant_heap *heap, unsigned char *stack, DWORD version)
{
int stack_idx = 0;
@@ -288,21 +353,23 @@ static inline void walk_constant_heap(const WineD3D_GL_Info *gl_info, const floa
checkGLcall("walk_constant_heap()");
}
-static inline void apply_clamped_constant(const WineD3D_GL_Info *gl_info, GLint location, const GLfloat *data)
+/* GL locking is done by the caller */
+static inline void apply_clamped_constant(const struct wined3d_gl_info *gl_info, GLint location, const GLfloat *data)
{
GLfloat clamped_constant[4];
if (location == -1) return;
- clamped_constant[0] = data[0] < -1.0f ? -1.0f : data[0] > 1.0 ? 1.0 : data[0];
- clamped_constant[1] = data[1] < -1.0f ? -1.0f : data[1] > 1.0 ? 1.0 : data[1];
- clamped_constant[2] = data[2] < -1.0f ? -1.0f : data[2] > 1.0 ? 1.0 : data[2];
- clamped_constant[3] = data[3] < -1.0f ? -1.0f : data[3] > 1.0 ? 1.0 : data[3];
+ clamped_constant[0] = data[0] < -1.0f ? -1.0f : data[0] > 1.0f ? 1.0f : data[0];
+ clamped_constant[1] = data[1] < -1.0f ? -1.0f : data[1] > 1.0f ? 1.0f : data[1];
+ clamped_constant[2] = data[2] < -1.0f ? -1.0f : data[2] > 1.0f ? 1.0f : data[2];
+ clamped_constant[3] = data[3] < -1.0f ? -1.0f : data[3] > 1.0f ? 1.0f : data[3];
GL_EXTCALL(glUniform4fvARB(location, 1, clamped_constant));
}
-static inline void walk_constant_heap_clamped(const WineD3D_GL_Info *gl_info, const float *constants,
+/* GL locking is done by the caller */
+static inline void walk_constant_heap_clamped(const struct wined3d_gl_info *gl_info, const float *constants,
const GLint *constant_locations, const struct constant_heap *heap, unsigned char *stack, DWORD version)
{
int stack_idx = 0;
@@ -362,7 +429,8 @@ static inline void walk_constant_heap_clamped(const WineD3D_GL_Info *gl_info, co
}
/* Loads floating point constants (aka uniforms) into the currently set GLSL program. */
-static void shader_glsl_load_constantsF(IWineD3DBaseShaderImpl *This, const WineD3D_GL_Info *gl_info,
+/* GL locking is done by the caller */
+static void shader_glsl_load_constantsF(IWineD3DBaseShaderImpl *This, const struct wined3d_gl_info *gl_info,
const float *constants, const GLint *constant_locations, const struct constant_heap *heap,
unsigned char *stack, UINT version)
{
@@ -392,7 +460,8 @@ static void shader_glsl_load_constantsF(IWineD3DBaseShaderImpl *This, const Wine
}
/* Loads integer constants (aka uniforms) into the currently set GLSL program. */
-static void shader_glsl_load_constantsI(IWineD3DBaseShaderImpl *This, const WineD3D_GL_Info *gl_info,
+/* GL locking is done by the caller */
+static void shader_glsl_load_constantsI(IWineD3DBaseShaderImpl *This, const struct wined3d_gl_info *gl_info,
const GLint locations[MAX_CONST_I], const int *constants, WORD constants_set)
{
unsigned int i;
@@ -428,16 +497,37 @@ static void shader_glsl_load_constantsI(IWineD3DBaseShaderImpl *This, const Wine
}
/* Loads boolean constants (aka uniforms) into the currently set GLSL program. */
-static void shader_glsl_load_constantsB(IWineD3DBaseShaderImpl *This, const WineD3D_GL_Info *gl_info,
+/* GL locking is done by the caller */
+static void shader_glsl_load_constantsB(IWineD3DBaseShaderImpl *This, const struct wined3d_gl_info *gl_info,
GLhandleARB programId, const BOOL *constants, WORD constants_set)
{
GLint tmp_loc;
unsigned int i;
char tmp_name[8];
- char is_pshader = shader_is_pshader_version(This->baseShader.reg_maps.shader_version.type);
- const char* prefix = is_pshader? "PB":"VB";
+ const char *prefix;
struct list* ptr;
+ switch (This->baseShader.reg_maps.shader_version.type)
+ {
+ case WINED3D_SHADER_TYPE_VERTEX:
+ prefix = "VB";
+ break;
+
+ case WINED3D_SHADER_TYPE_GEOMETRY:
+ prefix = "GB";
+ break;
+
+ case WINED3D_SHADER_TYPE_PIXEL:
+ prefix = "PB";
+ break;
+
+ default:
+ FIXME("Unknown shader type %#x.\n",
+ This->baseShader.reg_maps.shader_version.type);
+ prefix = "UB";
+ break;
+ }
+
/* TODO: Benchmark and see if it would be beneficial to store the
* locations of the constants to avoid looking up each time */
for (i = 0; constants_set; constants_set >>= 1, ++i)
@@ -478,15 +568,15 @@ static void shader_glsl_load_constantsB(IWineD3DBaseShaderImpl *This, const Wine
}
}
-static void reset_program_constant_version(void *value, void *context)
+static void reset_program_constant_version(struct wine_rb_entry *entry, void *context)
{
- struct glsl_shader_prog_link *entry = value;
- entry->constant_version = 0;
+ WINE_RB_ENTRY_VALUE(entry, struct glsl_shader_prog_link, program_lookup_entry)->constant_version = 0;
}
/**
* Loads the texture dimensions for NP2 fixup into the currently set GLSL program.
*/
+/* GL locking is done by the caller (state handler) */
static void shader_glsl_load_np2fixup_constants(
IWineD3DDevice* device,
char usePixelShader,
@@ -505,39 +595,45 @@ static void shader_glsl_load_np2fixup_constants(
return;
}
- if (prog->ps_args.np2_fixup) {
+ if (prog->ps_args.np2_fixup && -1 != prog->np2Fixup_location) {
+ const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
+ const IWineD3DStateBlockImpl* stateBlock = (const IWineD3DStateBlockImpl*) deviceImpl->stateBlock;
UINT i;
UINT fixup = prog->ps_args.np2_fixup;
- const WineD3D_GL_Info* gl_info = &deviceImpl->adapter->gl_info;
- const IWineD3DStateBlockImpl* stateBlock = (const IWineD3DStateBlockImpl*) deviceImpl->stateBlock;
+ GLfloat np2fixup_constants[4 * MAX_FRAGMENT_SAMPLERS];
for (i = 0; fixup; fixup >>= 1, ++i) {
- if (-1 != prog->np2Fixup_location[i]) {
- const IWineD3DBaseTextureImpl* const tex = (const IWineD3DBaseTextureImpl*) stateBlock->textures[i];
- if (!tex) {
- FIXME("Nonexistent texture is flagged for NP2 texcoord fixup\n");
- continue;
- } else {
- const float tex_dim[2] = {tex->baseTexture.pow2Matrix[0], tex->baseTexture.pow2Matrix[5]};
- GL_EXTCALL(glUniform2fvARB(prog->np2Fixup_location[i], 1, tex_dim));
- }
+ const unsigned char idx = prog->np2Fixup_info->idx[i];
+ const IWineD3DBaseTextureImpl* const tex = (const IWineD3DBaseTextureImpl*) stateBlock->textures[i];
+ GLfloat* tex_dim = &np2fixup_constants[(idx >> 1) * 4];
+
+ if (!tex) {
+ FIXME("Nonexistent texture is flagged for NP2 texcoord fixup\n");
+ continue;
+ }
+
+ if (idx % 2) {
+ tex_dim[2] = tex->baseTexture.pow2Matrix[0]; tex_dim[3] = tex->baseTexture.pow2Matrix[5];
+ } else {
+ tex_dim[0] = tex->baseTexture.pow2Matrix[0]; tex_dim[1] = tex->baseTexture.pow2Matrix[5];
}
}
+
+ GL_EXTCALL(glUniform4fvARB(prog->np2Fixup_location, prog->np2Fixup_info->num_consts, np2fixup_constants));
}
}
/**
* Loads the app-supplied constants into the currently set GLSL program.
*/
-static void shader_glsl_load_constants(
- IWineD3DDevice* device,
- char usePixelShader,
- char useVertexShader) {
-
- IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) device;
- struct shader_glsl_priv *priv = deviceImpl->shader_priv;
- IWineD3DStateBlockImpl* stateBlock = deviceImpl->stateBlock;
- const WineD3D_GL_Info *gl_info = &deviceImpl->adapter->gl_info;
+/* GL locking is done by the caller (state handler) */
+static void shader_glsl_load_constants(const struct wined3d_context *context,
+ char usePixelShader, char useVertexShader)
+{
+ IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ IWineD3DStateBlockImpl* stateBlock = device->stateBlock;
+ struct shader_glsl_priv *priv = device->shader_priv;
GLhandleARB programId;
struct glsl_shader_prog_link *prog = priv->glsl_program;
@@ -567,7 +663,7 @@ static void shader_glsl_load_constants(
stateBlock->changed.vertexShaderConstantsB & vshader->baseShader.reg_maps.boolean_constants);
/* Upload the position fixup params */
- GL_EXTCALL(glUniform4fvARB(prog->posFixup_location, 1, &deviceImpl->posFixup[0]));
+ GL_EXTCALL(glUniform4fvARB(prog->posFixup_location, 1, &device->posFixup[0]));
checkGLcall("glUniform4fvARB");
}
@@ -590,20 +686,21 @@ static void shader_glsl_load_constants(
/* Upload the environment bump map matrix if needed. The needsbumpmat member specifies the texture stage to load the matrix from.
* It can't be 0 for a valid texbem instruction.
*/
- for(i = 0; i < ((IWineD3DPixelShaderImpl *) pshader)->numbumpenvmatconsts; i++) {
- IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) pshader;
- int stage = ps->luminanceconst[i].texunit;
+ for(i = 0; i < MAX_TEXTURES; i++) {
+ const float *data;
- const float *data = (const float *)&stateBlock->textureState[(int)ps->bumpenvmatconst[i].texunit][WINED3DTSS_BUMPENVMAT00];
+ if(prog->bumpenvmat_location[i] == -1) continue;
+
+ data = (const float *)&stateBlock->textureState[i][WINED3DTSS_BUMPENVMAT00];
GL_EXTCALL(glUniformMatrix2fvARB(prog->bumpenvmat_location[i], 1, 0, data));
checkGLcall("glUniformMatrix2fvARB");
/* texbeml needs the luminance scale and offset too. If texbeml is used, needsbumpmat
* is set too, so we can check that in the needsbumpmat check
*/
- if(ps->baseShader.reg_maps.luminanceparams[stage]) {
- const GLfloat *scale = (const GLfloat *)&stateBlock->textureState[stage][WINED3DTSS_BUMPENVLSCALE];
- const GLfloat *offset = (const GLfloat *)&stateBlock->textureState[stage][WINED3DTSS_BUMPENVLOFFSET];
+ if(prog->luminancescale_location[i] != -1) {
+ const GLfloat *scale = (const GLfloat *)&stateBlock->textureState[i][WINED3DTSS_BUMPENVLSCALE];
+ const GLfloat *offset = (const GLfloat *)&stateBlock->textureState[i][WINED3DTSS_BUMPENVLOFFSET];
GL_EXTCALL(glUniform1fvARB(prog->luminancescale_location[i], 1, scale));
checkGLcall("glUniform1fvARB");
@@ -614,13 +711,15 @@ static void shader_glsl_load_constants(
if(((IWineD3DPixelShaderImpl *) pshader)->vpos_uniform) {
float correction_params[4];
- if(deviceImpl->render_offscreen) {
- correction_params[0] = 0.0;
- correction_params[1] = 1.0;
+
+ if (context->render_offscreen)
+ {
+ correction_params[0] = 0.0f;
+ correction_params[1] = 1.0f;
} else {
/* position is window relative, not viewport relative */
- correction_params[0] = ((IWineD3DSurfaceImpl *) deviceImpl->render_targets[0])->currentDesc.Height;
- correction_params[1] = -1.0;
+ correction_params[0] = ((IWineD3DSurfaceImpl *)context->current_rt)->currentDesc.Height;
+ correction_params[1] = -1.0f;
}
GL_EXTCALL(glUniform4fvARB(prog->ycorrection_location, 1, correction_params));
}
@@ -629,7 +728,7 @@ static void shader_glsl_load_constants(
if (priv->next_constant_version == UINT_MAX)
{
TRACE("Max constant version reached, resetting to 0.\n");
- hash_table_for_each_entry(priv->glsl_program_lookup, reset_program_constant_version, NULL);
+ wine_rb_for_each_entry(&priv->program_lookup, reset_program_constant_version, NULL);
priv->next_constant_version = 1;
}
else
@@ -693,24 +792,38 @@ static void shader_glsl_update_float_pixel_constants(IWineD3DDevice *iface, UINT
}
}
+static unsigned int vec4_varyings(DWORD shader_major, const struct wined3d_gl_info *gl_info)
+{
+ unsigned int ret = GL_LIMITS(glsl_varyings) / 4;
+ /* 4.0 shaders do not write clip coords because d3d10 does not support user clipplanes */
+ if(shader_major > 3) return ret;
+
+ /* 3.0 shaders may need an extra varying for the clip coord on some cards(mostly dx10 ones) */
+ if (gl_info->quirks & WINED3D_QUIRK_GLSL_CLIP_VARYING) ret -= 1;
+ return ret;
+}
+
/** Generate the variable & register declarations for the GLSL output target */
-static void shader_generate_glsl_declarations(IWineD3DBaseShader *iface, const shader_reg_maps *reg_maps,
- SHADER_BUFFER *buffer, const WineD3D_GL_Info *gl_info,
- const struct ps_compile_args *ps_args)
+static void shader_generate_glsl_declarations(const struct wined3d_context *context,
+ struct wined3d_shader_buffer *buffer, IWineD3DBaseShader *iface,
+ const shader_reg_maps *reg_maps, struct shader_glsl_ctx_priv *ctx_priv)
{
IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface;
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device;
+ const struct ps_compile_args *ps_args = ctx_priv->cur_ps_args;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
unsigned int i, extra_constants_needed = 0;
const local_constant *lconst;
+ DWORD map;
/* There are some minor differences between pixel and vertex shaders */
char pshader = shader_is_pshader_version(reg_maps->shader_version.type);
char prefix = pshader ? 'P' : 'V';
/* Prototype the subroutines */
- for (i = 0; i < This->baseShader.limits.label; i++) {
- if (reg_maps->labels[i])
- shader_addline(buffer, "void subroutine%u();\n", i);
+ for (i = 0, map = reg_maps->labels; map; map >>= 1, ++i)
+ {
+ if (map & 1) shader_addline(buffer, "void subroutine%u();\n", i);
}
/* Declare the constants (aka uniforms) */
@@ -737,9 +850,11 @@ static void shader_generate_glsl_declarations(IWineD3DBaseShader *iface, const s
/* Subtract the other potential uniforms from the max available (bools, ints, and 1 row of projection matrix).
* Subtract another uniform for immediate values, which have to be loaded via uniform by the driver as well.
* The shader code only uses 0.5, 2.0, 1.0, 128 and -128 in vertex shader code, so one vec4 should be enough
- * (Unfortunately the Nvidia driver doesn't store 128 and -128 in one float
+ * (Unfortunately the Nvidia driver doesn't store 128 and -128 in one float).
+ *
+ * Writing gl_ClipPos requires one uniform for each clipplane as well.
*/
- max_constantsF = GL_LIMITS(vshader_constantsF) - 3;
+ max_constantsF = GL_LIMITS(vshader_constantsF) - 3 - GL_LIMITS(clipplanes);
max_constantsF -= count_bits(This->baseShader.reg_maps.integer_constants);
/* Strictly speaking a bool only uses one scalar, but the nvidia(Linux) compiler doesn't pack them properly,
* so each scalar requires a full vec4. We could work around this by packing the booleans ourselves, but
@@ -784,35 +899,28 @@ static void shader_generate_glsl_declarations(IWineD3DBaseShader *iface, const s
shader_addline(buffer, "void order_ps_input();\n");
}
} else {
- IWineD3DPixelShaderImpl *ps_impl = (IWineD3DPixelShaderImpl *) This;
+ for (i = 0, map = reg_maps->bumpmat; map; map >>= 1, ++i)
+ {
+ if (!(map & 1)) continue;
- ps_impl->numbumpenvmatconsts = 0;
- for(i = 0; i < (sizeof(reg_maps->bumpmat) / sizeof(reg_maps->bumpmat[0])); i++) {
- if(!reg_maps->bumpmat[i]) {
- continue;
- }
-
- ps_impl->bumpenvmatconst[(int) ps_impl->numbumpenvmatconsts].texunit = i;
shader_addline(buffer, "uniform mat2 bumpenvmat%d;\n", i);
- if(reg_maps->luminanceparams) {
- ps_impl->luminanceconst[(int) ps_impl->numbumpenvmatconsts].texunit = i;
+ if (reg_maps->luminanceparams & (1 << i))
+ {
shader_addline(buffer, "uniform float luminancescale%d;\n", i);
shader_addline(buffer, "uniform float luminanceoffset%d;\n", i);
extra_constants_needed++;
- } else {
- ps_impl->luminanceconst[(int) ps_impl->numbumpenvmatconsts].texunit = -1;
}
extra_constants_needed++;
- ps_impl->numbumpenvmatconsts++;
}
- if(ps_args->srgb_correction) {
- shader_addline(buffer, "const vec4 srgb_mul_low = vec4(%f, %f, %f, %f);\n",
- srgb_mul_low, srgb_mul_low, srgb_mul_low, srgb_mul_low);
- shader_addline(buffer, "const vec4 srgb_comparison = vec4(%f, %f, %f, %f);\n",
- srgb_cmp, srgb_cmp, srgb_cmp, srgb_cmp);
+ if (ps_args->srgb_correction)
+ {
+ shader_addline(buffer, "const vec4 srgb_const0 = vec4(%.8e, %.8e, %.8e, %.8e);\n",
+ srgb_pow, srgb_mul_high, srgb_sub_high, srgb_mul_low);
+ shader_addline(buffer, "const vec4 srgb_const1 = vec4(%.8e, 0.0, 0.0, 0.0);\n",
+ srgb_cmp);
}
if(reg_maps->vpos || reg_maps->usesdsy) {
if(This->baseShader.limits.constant_float + extra_constants_needed + 1 < GL_LIMITS(pshader_constantsF)) {
@@ -825,14 +933,14 @@ static void shader_generate_glsl_declarations(IWineD3DBaseShader *iface, const s
*/
FIXME("Cannot find a free uniform for vpos correction params\n");
shader_addline(buffer, "const vec4 ycorrection = vec4(%f, %f, 0.0, 0.0);\n",
- device->render_offscreen ? 0.0 : ((IWineD3DSurfaceImpl *) device->render_targets[0])->currentDesc.Height,
- device->render_offscreen ? 1.0 : -1.0);
+ context->render_offscreen ? 0.0f : ((IWineD3DSurfaceImpl *)device->render_targets[0])->currentDesc.Height,
+ context->render_offscreen ? 1.0f : -1.0f);
}
shader_addline(buffer, "vec4 vpos;\n");
}
}
- /* Declare texture samplers */
+ /* Declare texture samplers */
for (i = 0; i < This->baseShader.limits.sampler; i++) {
if (reg_maps->sampler_type[i])
{
@@ -848,15 +956,6 @@ static void shader_generate_glsl_declarations(IWineD3DBaseShader *iface, const s
} else {
shader_addline(buffer, "uniform sampler2D %csampler%u;\n", prefix, i);
}
-
- if (pshader && ps_args->np2_fixup & (1 << i))
- {
- /* NP2/RECT textures in OpenGL use texcoords in the range [0,width]x[0,height]
- * while D3D has them in the (normalized) [0,1]x[0,1] range.
- * samplerNP2Fixup stores texture dimensions and is updated through
- * shader_glsl_load_np2fixup_constants when the sampler changes. */
- shader_addline(buffer, "uniform vec2 %csamplerNP2Fixup%u;\n", prefix, i);
- }
break;
case WINED3DSTT_CUBE:
shader_addline(buffer, "uniform samplerCube %csampler%u;\n", prefix, i);
@@ -871,17 +970,48 @@ static void shader_generate_glsl_declarations(IWineD3DBaseShader *iface, const s
}
}
}
-
+
+ /* Declare uniforms for NP2 texcoord fixup:
+ * This is NOT done inside the loop that declares the texture samplers since the NP2 fixup code
+ * is currently only used for the GeforceFX series and when forcing the ARB_npot extension off.
+ * Modern cards just skip the code anyway, so put it inside a separate loop. */
+ if (pshader && ps_args->np2_fixup) {
+
+ struct ps_np2fixup_info* const fixup = ctx_priv->cur_np2fixup_info;
+ UINT cur = 0;
+
+ /* NP2/RECT textures in OpenGL use texcoords in the range [0,width]x[0,height]
+ * while D3D has them in the (normalized) [0,1]x[0,1] range.
+ * samplerNP2Fixup stores texture dimensions and is updated through
+ * shader_glsl_load_np2fixup_constants when the sampler changes. */
+
+ for (i = 0; i < This->baseShader.limits.sampler; ++i) {
+ if (reg_maps->sampler_type[i]) {
+ if (!(ps_args->np2_fixup & (1 << i))) continue;
+
+ if (WINED3DSTT_2D != reg_maps->sampler_type[i]) {
+ FIXME("Non-2D texture is flagged for NP2 texcoord fixup.\n");
+ continue;
+ }
+
+ fixup->idx[i] = cur++;
+ }
+ }
+
+ fixup->num_consts = (cur + 1) >> 1;
+ shader_addline(buffer, "uniform vec4 %csamplerNP2Fixup[%u];\n", prefix, fixup->num_consts);
+ }
+
/* Declare address variables */
- for (i = 0; i < This->baseShader.limits.address; i++) {
- if (reg_maps->address[i])
- shader_addline(buffer, "ivec4 A%d;\n", i);
+ for (i = 0, map = reg_maps->address; map; map >>= 1, ++i)
+ {
+ if (map & 1) shader_addline(buffer, "ivec4 A%u;\n", i);
}
/* Declare texture coordinate temporaries and initialize them */
- for (i = 0; i < This->baseShader.limits.texcoord; i++) {
- if (reg_maps->texcoord[i])
- shader_addline(buffer, "vec4 T%u = gl_TexCoord[%u];\n", i, i);
+ for (i = 0, map = reg_maps->texcoord; map; map >>= 1, ++i)
+ {
+ if (map & 1) shader_addline(buffer, "vec4 T%u = gl_TexCoord[%u];\n", i, i);
}
/* Declare input register varyings. Only pixel shader, vertex shaders have that declared in the
@@ -891,13 +1021,13 @@ static void shader_generate_glsl_declarations(IWineD3DBaseShader *iface, const s
{
if (use_vs(device->stateBlock))
{
- shader_addline(buffer, "varying vec4 IN[%u];\n", GL_LIMITS(glsl_varyings) / 4);
+ shader_addline(buffer, "varying vec4 IN[%u];\n", vec4_varyings(reg_maps->shader_version.major, gl_info));
} else {
/* TODO: Write a replacement shader for the fixed function vertex pipeline, so this isn't needed.
* For fixed function vertex processing + 3.0 pixel shader we need a separate function in the
* pixel shader that reads the fixed function color into the packed input registers.
*/
- shader_addline(buffer, "vec4 IN[%u];\n", GL_LIMITS(glsl_varyings) / 4);
+ shader_addline(buffer, "vec4 IN[%u];\n", vec4_varyings(reg_maps->shader_version.major, gl_info));
}
}
@@ -907,15 +1037,18 @@ static void shader_generate_glsl_declarations(IWineD3DBaseShader *iface, const s
}
/* Declare temporary variables */
- for(i = 0; i < This->baseShader.limits.temporary; i++) {
- if (reg_maps->temporary[i])
- shader_addline(buffer, "vec4 R%u;\n", i);
+ for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i)
+ {
+ if (map & 1) shader_addline(buffer, "vec4 R%u;\n", i);
}
/* Declare attributes */
- for (i = 0; i < This->baseShader.limits.attributes; i++) {
- if (reg_maps->attributes[i])
- shader_addline(buffer, "attribute vec4 attrib%i;\n", i);
+ if (reg_maps->shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
+ {
+ for (i = 0, map = reg_maps->input_registers; map; map >>= 1, ++i)
+ {
+ if (map & 1) shader_addline(buffer, "attribute vec4 attrib%i;\n", i);
+ }
}
/* Declare loop registers aLx */
@@ -971,22 +1104,22 @@ static void shader_glsl_add_src_param(const struct wined3d_shader_instruction *i
/** Used for opcode modifiers - They multiply the result by the specified amount */
static const char * const shift_glsl_tab[] = {
- "", /* 0 (none) */
- "2.0 * ", /* 1 (x2) */
- "4.0 * ", /* 2 (x4) */
- "8.0 * ", /* 3 (x8) */
- "16.0 * ", /* 4 (x16) */
- "32.0 * ", /* 5 (x32) */
- "", /* 6 (x64) */
- "", /* 7 (x128) */
- "", /* 8 (d256) */
- "", /* 9 (d128) */
- "", /* 10 (d64) */
- "", /* 11 (d32) */
- "0.0625 * ", /* 12 (d16) */
- "0.125 * ", /* 13 (d8) */
- "0.25 * ", /* 14 (d4) */
- "0.5 * " /* 15 (d2) */
+ "", /* 0 (none) */
+ "2.0 * ", /* 1 (x2) */
+ "4.0 * ", /* 2 (x4) */
+ "8.0 * ", /* 3 (x8) */
+ "16.0 * ", /* 4 (x16) */
+ "32.0 * ", /* 5 (x32) */
+ "", /* 6 (x64) */
+ "", /* 7 (x128) */
+ "", /* 8 (d256) */
+ "", /* 9 (d128) */
+ "", /* 10 (d64) */
+ "", /* 11 (d32) */
+ "0.0625 * ", /* 12 (d16) */
+ "0.125 * ", /* 13 (d8) */
+ "0.25 * ", /* 14 (d4) */
+ "0.5 * " /* 15 (d2) */
};
/* Generate a GLSL parameter that does the input modifier computation and return the input register/mask to use */
@@ -1050,7 +1183,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
- const WineD3D_GL_Info* gl_info = &deviceImpl->adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
char pshader = shader_is_pshader_version(This->baseShader.reg_maps.shader_version.type);
*is_color = FALSE;
@@ -1065,7 +1198,8 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
/* vertex shaders */
if (!pshader)
{
- if (((IWineD3DVertexShaderImpl *)This)->cur_args->swizzle_map & (1 << reg->idx)) *is_color = TRUE;
+ struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data;
+ if (priv->cur_vs_args->swizzle_map & (1 << reg->idx)) *is_color = TRUE;
sprintf(register_name, "attrib%u", reg->idx);
break;
}
@@ -1074,7 +1208,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
if (This->baseShader.reg_maps.shader_version.major >= 3)
{
DWORD idx = ((IWineD3DPixelShaderImpl *)This)->input_reg_map[reg->idx];
- DWORD in_count = GL_LIMITS(glsl_varyings) / 4;
+ unsigned int in_count = vec4_varyings(This->baseShader.reg_maps.shader_version.major, gl_info);
if (reg->rel_addr)
{
@@ -1175,11 +1309,9 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
case WINED3DSPR_COLOROUT:
if (reg->idx >= GL_LIMITS(buffers))
- WARN("Write to render target %u, only %d supported\n", reg->idx, 4);
+ WARN("Write to render target %u, only %d supported\n", reg->idx, GL_LIMITS(buffers));
- if (GL_SUPPORT(ARB_DRAW_BUFFERS)) sprintf(register_name, "gl_FragData[%u]", reg->idx);
- /* On older cards with GLSL support like the GeforceFX there's only one buffer. */
- else sprintf(register_name, "gl_FragColor");
+ sprintf(register_name, "gl_FragData[%u]", reg->idx);
break;
case WINED3DSPR_RASTOUT:
@@ -1224,13 +1356,13 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
switch (reg->immconst_type)
{
case WINED3D_IMMCONST_FLOAT:
- sprintf(register_name, "%.8e", *(float *)reg->immconst_data);
+ sprintf(register_name, "%.8e", *(const float *)reg->immconst_data);
break;
case WINED3D_IMMCONST_FLOAT4:
sprintf(register_name, "vec4(%.8e, %.8e, %.8e, %.8e)",
- *(float *)®->immconst_data[0], *(float *)®->immconst_data[1],
- *(float *)®->immconst_data[2], *(float *)®->immconst_data[3]);
+ *(const float *)®->immconst_data[0], *(const float *)®->immconst_data[1],
+ *(const float *)®->immconst_data[2], *(const float *)®->immconst_data[3]);
break;
default:
@@ -1344,7 +1476,7 @@ static DWORD shader_glsl_add_dst_param(const struct wined3d_shader_instruction *
}
/* Append the destination part of the instruction to the buffer, return the effective write mask */
-static DWORD shader_glsl_append_dst_ext(SHADER_BUFFER *buffer,
+static DWORD shader_glsl_append_dst_ext(struct wined3d_shader_buffer *buffer,
const struct wined3d_shader_instruction *ins, const struct wined3d_shader_dst_param *dst)
{
glsl_dst_param_t glsl_dst;
@@ -1357,7 +1489,7 @@ static DWORD shader_glsl_append_dst_ext(SHADER_BUFFER *buffer,
}
/* Append the destination part of the instruction to the buffer, return the effective write mask */
-static DWORD shader_glsl_append_dst(SHADER_BUFFER *buffer, const struct wined3d_shader_instruction *ins)
+static DWORD shader_glsl_append_dst(struct wined3d_shader_buffer *buffer, const struct wined3d_shader_instruction *ins)
{
return shader_glsl_append_dst_ext(buffer, ins, &ins->dst[0]);
}
@@ -1599,11 +1731,11 @@ static void PRINTF_ATTR(8, 9) shader_glsl_gen_sample_code(const struct wined3d_s
if (shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type))
{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
- fixup = This->cur_args->color_fixup[sampler];
+ const struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data;
+ fixup = priv->cur_ps_args->color_fixup[sampler];
sampler_base = "Psampler";
- if(This->cur_args->np2_fixup & (1 << sampler)) {
+ if(priv->cur_ps_args->np2_fixup & (1 << sampler)) {
if(bias) {
FIXME("Biased sampling from NP2 textures is unsupported\n");
} else {
@@ -1627,7 +1759,11 @@ static void PRINTF_ATTR(8, 9) shader_glsl_gen_sample_code(const struct wined3d_s
shader_addline(ins->ctx->buffer, ", %s)%s);\n", bias, dst_swizzle);
} else {
if (np2_fixup) {
- shader_addline(ins->ctx->buffer, " * PsamplerNP2Fixup%u)%s);\n", sampler, dst_swizzle);
+ const struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data;
+ const unsigned char idx = priv->cur_np2fixup_info->idx[sampler];
+
+ shader_addline(ins->ctx->buffer, " * PsamplerNP2Fixup[%u].%s)%s);\n", idx >> 1,
+ (idx % 2) ? "zw" : "xy", dst_swizzle);
} else if(dx && dy) {
shader_addline(ins->ctx->buffer, ", %s, %s)%s);\n", dx, dy, dst_swizzle);
} else {
@@ -1641,15 +1777,13 @@ static void PRINTF_ATTR(8, 9) shader_glsl_gen_sample_code(const struct wined3d_s
}
/*****************************************************************************
- *
* Begin processing individual instruction opcodes
- *
****************************************************************************/
/* Generate GLSL arithmetic functions (dst = src1 + src2) */
static void shader_glsl_arith(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src0_param;
glsl_src_param_t src1_param;
DWORD write_mask;
@@ -1676,7 +1810,7 @@ static void shader_glsl_arith(const struct wined3d_shader_instruction *ins)
/* Process the WINED3DSIO_MOV opcode using GLSL (dst = src) */
static void shader_glsl_mov(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src0_param;
DWORD write_mask;
@@ -1714,7 +1848,7 @@ static void shader_glsl_mov(const struct wined3d_shader_instruction *ins)
/* Process the dot product operators DP3 and DP4 in GLSL (dst = dot(src0, src1)) */
static void shader_glsl_dot(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src0_param;
glsl_src_param_t src1_param;
DWORD dst_write_mask, src_write_mask;
@@ -1762,7 +1896,7 @@ static void shader_glsl_cross(const struct wined3d_shader_instruction *ins)
* GLSL uses the value as-is. */
static void shader_glsl_pow(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src0_param;
glsl_src_param_t src1_param;
DWORD dst_write_mask;
@@ -1786,7 +1920,7 @@ static void shader_glsl_pow(const struct wined3d_shader_instruction *ins)
* GLSL uses the value as-is. */
static void shader_glsl_log(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src0_param;
DWORD dst_write_mask;
unsigned int dst_size;
@@ -1806,7 +1940,7 @@ static void shader_glsl_log(const struct wined3d_shader_instruction *ins)
/* Map the opcode 1-to-1 to the GL code (arg->dst = instruction(src0, src1, ...) */
static void shader_glsl_map2gl(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src_param;
const char *instruction;
DWORD write_mask;
@@ -1910,7 +2044,7 @@ static void shader_glsl_rcp(const struct wined3d_shader_instruction *ins)
static void shader_glsl_rsq(const struct wined3d_shader_instruction *ins)
{
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src_param;
DWORD write_mask;
unsigned int mask_size;
@@ -2128,8 +2262,8 @@ static void shader_glsl_mad(const struct wined3d_shader_instruction *ins)
src0_param.param_str, src1_param.param_str, src2_param.param_str);
}
-/** Handles transforming all WINED3DSIO_M?x? opcodes for
- Vertex shaders to GLSL codes */
+/* Handles transforming all WINED3DSIO_M?x? opcodes for
+ Vertex shaders to GLSL codes */
static void shader_glsl_mnxn(const struct wined3d_shader_instruction *ins)
{
int i;
@@ -2185,7 +2319,7 @@ static void shader_glsl_mnxn(const struct wined3d_shader_instruction *ins)
}
/**
- The LRP instruction performs a component-wise linear interpolation
+ The LRP instruction performs a component-wise linear interpolation
between the second and third operands using the first operand as the
blend factor. Equation: (dst = src2 + src0 * (src1 - src2))
This is equivalent to mix(src2, src1, src0);
@@ -2282,7 +2416,7 @@ static void shader_glsl_dst(const struct wined3d_shader_instruction *ins)
/** Process the WINED3DSIO_SINCOS instruction in GLSL:
* VS 2.0 requires that specific cosine and sine constants be passed to this instruction so the hardware
* can handle it. But, these functions are built-in for GLSL, so we can just ignore the last 2 params.
- *
+ *
* dst.x = cos(src0.?)
* dst.y = sin(src0.?)
* dst.z = dst.z
@@ -2346,22 +2480,33 @@ static void shader_glsl_loop(const struct wined3d_shader_instruction *ins)
}
}
- if(control_values) {
- if(control_values[2] > 0) {
- shader_addline(ins->ctx->buffer, "for (aL%u = %d; aL%u < (%d * %d + %d); aL%u += %d) {\n",
- shader->baseShader.cur_loop_depth, control_values[1],
- shader->baseShader.cur_loop_depth, control_values[0], control_values[2], control_values[1],
- shader->baseShader.cur_loop_depth, control_values[2]);
- } else if(control_values[2] == 0) {
- shader_addline(ins->ctx->buffer, "for (aL%u = %d, tmpInt%u = 0; tmpInt%u < %d; tmpInt%u++) {\n",
- shader->baseShader.cur_loop_depth, control_values[1], shader->baseShader.cur_loop_depth,
- shader->baseShader.cur_loop_depth, control_values[0],
+ if (control_values)
+ {
+ struct wined3d_shader_loop_control loop_control;
+ loop_control.count = control_values[0];
+ loop_control.start = control_values[1];
+ loop_control.step = (int)control_values[2];
+
+ if (loop_control.step > 0)
+ {
+ shader_addline(ins->ctx->buffer, "for (aL%u = %u; aL%u < (%u * %d + %u); aL%u += %d) {\n",
+ shader->baseShader.cur_loop_depth, loop_control.start,
+ shader->baseShader.cur_loop_depth, loop_control.count, loop_control.step, loop_control.start,
+ shader->baseShader.cur_loop_depth, loop_control.step);
+ }
+ else if (loop_control.step < 0)
+ {
+ shader_addline(ins->ctx->buffer, "for (aL%u = %u; aL%u > (%u * %d + %u); aL%u += %d) {\n",
+ shader->baseShader.cur_loop_depth, loop_control.start,
+ shader->baseShader.cur_loop_depth, loop_control.count, loop_control.step, loop_control.start,
+ shader->baseShader.cur_loop_depth, loop_control.step);
+ }
+ else
+ {
+ shader_addline(ins->ctx->buffer, "for (aL%u = %u, tmpInt%u = 0; tmpInt%u < %u; tmpInt%u++) {\n",
+ shader->baseShader.cur_loop_depth, loop_control.start, shader->baseShader.cur_loop_depth,
+ shader->baseShader.cur_loop_depth, loop_control.count,
shader->baseShader.cur_loop_depth);
- } else {
- shader_addline(ins->ctx->buffer, "for (aL%u = %d; aL%u > (%d * %d + %d); aL%u += %d) {\n",
- shader->baseShader.cur_loop_depth, control_values[1],
- shader->baseShader.cur_loop_depth, control_values[0], control_values[2], control_values[1],
- shader->baseShader.cur_loop_depth, control_values[2]);
}
} else {
shader_addline(ins->ctx->buffer,
@@ -2488,10 +2633,17 @@ static void shader_glsl_callnz(const struct wined3d_shader_instruction *ins)
shader_addline(ins->ctx->buffer, "if (%s) subroutine%u();\n", src1_param.param_str, ins->src[0].reg.idx);
}
+static void shader_glsl_ret(const struct wined3d_shader_instruction *ins)
+{
+ /* No-op. The closing } is written when a new function is started, and at the end of the shader. This
+ * function only suppresses the unhandled instruction warning
+ */
+}
+
/*********************************************
* Pixel Shader Specific Code begins here
********************************************/
-static void pshader_glsl_tex(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
{
IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
@@ -2584,7 +2736,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
{
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
- const WineD3D_GL_Info* gl_info = &deviceImpl->adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
glsl_sample_function_t sample_function;
glsl_src_param_t coord_param, dx_param, dy_param;
DWORD sample_flags = WINED3D_GLSL_SAMPLE_GRAD;
@@ -2594,7 +2746,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
if(!GL_SUPPORT(ARB_SHADER_TEXTURE_LOD)) {
FIXME("texldd used, but not supported by hardware. Falling back to regular tex\n");
- return pshader_glsl_tex(ins);
+ return shader_glsl_tex(ins);
}
sampler_idx = ins->src[1].reg.idx;
@@ -2617,6 +2769,7 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
{
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+ const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
glsl_sample_function_t sample_function;
glsl_src_param_t coord_param, lod_param;
DWORD sample_flags = WINED3D_GLSL_SAMPLE_LOD;
@@ -2635,7 +2788,8 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &lod_param);
- if (shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type))
+ if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD]
+ && shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type))
{
/* The GLSL spec claims the Lod sampling functions are only supported in vertex shaders.
* However, they seem to work just fine in fragment shaders as well. */
@@ -2645,10 +2799,10 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
"%s", coord_param.param_str);
}
-static void pshader_glsl_texcoord(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texcoord(const struct wined3d_shader_instruction *ins)
{
/* FIXME: Make this work for more than just 2D textures */
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
DWORD write_mask = shader_glsl_append_dst(ins->ctx->buffer, ins);
if (!(ins->ctx->reg_maps->shader_version.major == 1 && ins->ctx->reg_maps->shader_version.minor == 4))
@@ -2694,7 +2848,7 @@ static void pshader_glsl_texcoord(const struct wined3d_shader_instruction *ins)
/** Process the WINED3DSIO_TEXDP3TEX instruction in GLSL:
* Take a 3-component dot product of the TexCoord[dstreg] and src,
* then perform a 1D texture lookup from stage dstregnum, place into dst. */
-static void pshader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins)
{
glsl_src_param_t src0_param;
glsl_sample_function_t sample_function;
@@ -2738,7 +2892,7 @@ static void pshader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins)
/** Process the WINED3DSIO_TEXDP3 instruction in GLSL:
* Take a 3-component dot product of the TexCoord[dstreg] and src. */
-static void pshader_glsl_texdp3(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texdp3(const struct wined3d_shader_instruction *ins)
{
glsl_src_param_t src0_param;
DWORD dstreg = ins->dst[0].reg.idx;
@@ -2759,7 +2913,7 @@ static void pshader_glsl_texdp3(const struct wined3d_shader_instruction *ins)
/** Process the WINED3DSIO_TEXDEPTH instruction in GLSL:
* Calculate the depth as dst.x / dst.y */
-static void pshader_glsl_texdepth(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texdepth(const struct wined3d_shader_instruction *ins)
{
glsl_dst_param_t dst_param;
@@ -2780,7 +2934,7 @@ static void pshader_glsl_texdepth(const struct wined3d_shader_instruction *ins)
* Calculate tmp0.y = TexCoord[dstreg] . src.xyz; (tmp0.x has already been calculated)
* depth = (tmp0.y == 0.0) ? 1.0 : tmp0.x / tmp0.y
*/
-static void pshader_glsl_texm3x2depth(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texm3x2depth(const struct wined3d_shader_instruction *ins)
{
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
DWORD dstreg = ins->dst[0].reg.idx;
@@ -2794,11 +2948,11 @@ static void pshader_glsl_texm3x2depth(const struct wined3d_shader_instruction *i
/** Process the WINED3DSIO_TEXM3X2PAD instruction in GLSL
* Calculate the 1st of a 2-row matrix multiplication. */
-static void pshader_glsl_texm3x2pad(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texm3x2pad(const struct wined3d_shader_instruction *ins)
{
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
DWORD reg = ins->dst[0].reg.idx;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src0_param;
shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
@@ -2807,12 +2961,12 @@ static void pshader_glsl_texm3x2pad(const struct wined3d_shader_instruction *ins
/** Process the WINED3DSIO_TEXM3X3PAD instruction in GLSL
* Calculate the 1st or 2nd row of a 3-row matrix multiplication. */
-static void pshader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins)
{
IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
DWORD reg = ins->dst[0].reg.idx;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
SHADER_PARSE_STATE* current_state = &shader->baseShader.parse_state;
glsl_src_param_t src0_param;
@@ -2821,11 +2975,11 @@ static void pshader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins
current_state->texcoord_w[current_state->current_row++] = reg;
}
-static void pshader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins)
{
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
DWORD reg = ins->dst[0].reg.idx;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src0_param;
WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[reg];
glsl_sample_function_t sample_function;
@@ -2841,7 +2995,7 @@ static void pshader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins
/** Process the WINED3DSIO_TEXM3X3TEX instruction in GLSL
* Perform the 3rd row of a 3x3 matrix multiply, then sample the texture using the calculated coordinates */
-static void pshader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins)
{
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
glsl_src_param_t src0_param;
@@ -2865,7 +3019,7 @@ static void pshader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins
/** Process the WINED3DSIO_TEXM3X3 instruction in GLSL
* Perform the 3rd row of a 3x3 matrix multiply */
-static void pshader_glsl_texm3x3(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texm3x3(const struct wined3d_shader_instruction *ins)
{
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
glsl_src_param_t src0_param;
@@ -2883,15 +3037,15 @@ static void pshader_glsl_texm3x3(const struct wined3d_shader_instruction *ins)
current_state->current_row = 0;
}
-/** Process the WINED3DSIO_TEXM3X3SPEC instruction in GLSL
+/* Process the WINED3DSIO_TEXM3X3SPEC instruction in GLSL
* Perform the final texture lookup based on the previous 2 3x3 matrix multiplies */
-static void pshader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins)
{
IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
DWORD reg = ins->dst[0].reg.idx;
glsl_src_param_t src0_param;
glsl_src_param_t src1_param;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
SHADER_PARSE_STATE* current_state = &shader->baseShader.parse_state;
WINED3DSAMPLER_TEXTURE_TYPE stype = ins->ctx->reg_maps->sampler_type[reg];
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
@@ -2914,13 +3068,13 @@ static void pshader_glsl_texm3x3spec(const struct wined3d_shader_instruction *in
current_state->current_row = 0;
}
-/** Process the WINED3DSIO_TEXM3X3VSPEC instruction in GLSL
+/* Process the WINED3DSIO_TEXM3X3VSPEC instruction in GLSL
* Perform the final texture lookup based on the previous 2 3x3 matrix multiplies */
-static void pshader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *ins)
{
IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
DWORD reg = ins->dst[0].reg.idx;
- SHADER_BUFFER *buffer = ins->ctx->buffer;
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
SHADER_PARSE_STATE* current_state = &shader->baseShader.parse_state;
glsl_src_param_t src0_param;
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
@@ -2950,7 +3104,7 @@ static void pshader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *i
* Apply a fake bump map transform.
* texbem is pshader <= 1.3 only, this saves a few version checks
*/
-static void pshader_glsl_texbem(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
{
IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
@@ -3009,7 +3163,7 @@ static void pshader_glsl_texbem(const struct wined3d_shader_instruction *ins)
}
}
-static void pshader_glsl_bem(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_bem(const struct wined3d_shader_instruction *ins)
{
glsl_src_param_t src0_param, src1_param;
DWORD sampler_idx = ins->dst[0].reg.idx;
@@ -3024,7 +3178,7 @@ static void pshader_glsl_bem(const struct wined3d_shader_instruction *ins)
/** Process the WINED3DSIO_TEXREG2AR instruction in GLSL
* Sample 2D texture at dst using the alpha & red (wx) components of src as texture coordinates */
-static void pshader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
{
glsl_src_param_t src0_param;
DWORD sampler_idx = ins->dst[0].reg.idx;
@@ -3040,7 +3194,7 @@ static void pshader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
/** Process the WINED3DSIO_TEXREG2GB instruction in GLSL
* Sample 2D texture at dst using the green & blue (yz) components of src as texture coordinates */
-static void pshader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
{
glsl_src_param_t src0_param;
DWORD sampler_idx = ins->dst[0].reg.idx;
@@ -3056,7 +3210,7 @@ static void pshader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
/** Process the WINED3DSIO_TEXREG2RGB instruction in GLSL
* Sample texture at dst using the rgb (xyz) components of src as texture coordinates */
-static void pshader_glsl_texreg2rgb(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texreg2rgb(const struct wined3d_shader_instruction *ins)
{
glsl_src_param_t src0_param;
DWORD sampler_idx = ins->dst[0].reg.idx;
@@ -3073,7 +3227,7 @@ static void pshader_glsl_texreg2rgb(const struct wined3d_shader_instruction *ins
/** Process the WINED3DSIO_TEXKILL instruction in GLSL.
* If any of the first 3 components are < 0, discard this pixel */
-static void pshader_glsl_texkill(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_texkill(const struct wined3d_shader_instruction *ins)
{
glsl_dst_param_t dst_param;
@@ -3094,7 +3248,7 @@ static void pshader_glsl_texkill(const struct wined3d_shader_instruction *ins)
/** Process the WINED3DSIO_DP2ADD instruction in GLSL.
* dst = dot2(src0, src1) + src2 */
-static void pshader_glsl_dp2add(const struct wined3d_shader_instruction *ins)
+static void shader_glsl_dp2add(const struct wined3d_shader_instruction *ins)
{
glsl_src_param_t src0_param;
glsl_src_param_t src1_param;
@@ -3118,52 +3272,52 @@ static void pshader_glsl_dp2add(const struct wined3d_shader_instruction *ins)
}
}
-static void pshader_glsl_input_pack(IWineD3DPixelShader *iface, SHADER_BUFFER *buffer,
- const struct wined3d_shader_semantic *semantics_in, const struct shader_reg_maps *reg_maps,
+static void shader_glsl_input_pack(IWineD3DPixelShader *iface, struct wined3d_shader_buffer *buffer,
+ const struct wined3d_shader_signature_element *input_signature, const struct shader_reg_maps *reg_maps,
enum vertexprocessing_mode vertexprocessing)
{
unsigned int i;
IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface;
+ WORD map = reg_maps->input_registers;
- for (i = 0; i < MAX_REG_INPUT; ++i)
+ for (i = 0; map; map >>= 1, ++i)
{
- DWORD usage, usage_idx;
+ const char *semantic_name;
+ UINT semantic_idx;
char reg_mask[6];
/* Unused */
- if (!reg_maps->packed_input[i]) continue;
+ if (!(map & 1)) continue;
- usage = semantics_in[i].usage;
- usage_idx = semantics_in[i].usage_idx;
- shader_glsl_get_write_mask(&semantics_in[i].reg, reg_mask);
+ semantic_name = input_signature[i].semantic_name;
+ semantic_idx = input_signature[i].semantic_idx;
+ shader_glsl_write_mask_to_str(input_signature[i].mask, reg_mask);
- switch (usage)
+ if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_TEXCOORD))
{
- case WINED3DDECLUSAGE_TEXCOORD:
- if (usage_idx < 8 && vertexprocessing == pretransformed)
- shader_addline(buffer, "IN[%u]%s = gl_TexCoord[%u]%s;\n",
- This->input_reg_map[i], reg_mask, usage_idx, reg_mask);
- else
- shader_addline(buffer, "IN[%u]%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n",
- This->input_reg_map[i], reg_mask, reg_mask);
- break;
-
- case WINED3DDECLUSAGE_COLOR:
- if (usage_idx == 0)
- shader_addline(buffer, "IN[%u]%s = vec4(gl_Color)%s;\n",
- This->input_reg_map[i], reg_mask, reg_mask);
- else if (usage_idx == 1)
- shader_addline(buffer, "IN[%u]%s = vec4(gl_SecondaryColor)%s;\n",
- This->input_reg_map[i], reg_mask, reg_mask);
- else
- shader_addline(buffer, "IN[%u]%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n",
- This->input_reg_map[i], reg_mask, reg_mask);
- break;
-
- default:
+ if (semantic_idx < 8 && vertexprocessing == pretransformed)
+ shader_addline(buffer, "IN[%u]%s = gl_TexCoord[%u]%s;\n",
+ This->input_reg_map[i], reg_mask, semantic_idx, reg_mask);
+ else
shader_addline(buffer, "IN[%u]%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n",
This->input_reg_map[i], reg_mask, reg_mask);
- break;
+ }
+ else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_COLOR))
+ {
+ if (semantic_idx == 0)
+ shader_addline(buffer, "IN[%u]%s = vec4(gl_Color)%s;\n",
+ This->input_reg_map[i], reg_mask, reg_mask);
+ else if (semantic_idx == 1)
+ shader_addline(buffer, "IN[%u]%s = vec4(gl_SecondaryColor)%s;\n",
+ This->input_reg_map[i], reg_mask, reg_mask);
+ else
+ shader_addline(buffer, "IN[%u]%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n",
+ This->input_reg_map[i], reg_mask, reg_mask);
+ }
+ else
+ {
+ shader_addline(buffer, "IN[%u]%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n",
+ This->input_reg_map[i], reg_mask, reg_mask);
}
}
}
@@ -3173,20 +3327,23 @@ static void pshader_glsl_input_pack(IWineD3DPixelShader *iface, SHADER_BUFFER *b
********************************************/
static void add_glsl_program_entry(struct shader_glsl_priv *priv, struct glsl_shader_prog_link *entry) {
- glsl_program_key_t *key;
+ glsl_program_key_t key;
- key = HeapAlloc(GetProcessHeap(), 0, sizeof(glsl_program_key_t));
- key->vshader = entry->vshader;
- key->pshader = entry->pshader;
- key->vs_args = entry->vs_args;
- key->ps_args = entry->ps_args;
+ key.vshader = entry->vshader;
+ key.pshader = entry->pshader;
+ key.vs_args = entry->vs_args;
+ key.ps_args = entry->ps_args;
- hash_table_put(priv->glsl_program_lookup, key, entry);
+ if (wine_rb_put(&priv->program_lookup, &key, &entry->program_lookup_entry) == -1)
+ {
+ ERR("Failed to insert program entry.\n");
+ }
}
static struct glsl_shader_prog_link *get_glsl_program_entry(struct shader_glsl_priv *priv,
IWineD3DVertexShader *vshader, IWineD3DPixelShader *pshader, struct vs_compile_args *vs_args,
struct ps_compile_args *ps_args) {
+ struct wine_rb_entry *entry;
glsl_program_key_t key;
key.vshader = vshader;
@@ -3194,20 +3351,21 @@ static struct glsl_shader_prog_link *get_glsl_program_entry(struct shader_glsl_p
key.vs_args = *vs_args;
key.ps_args = *ps_args;
- return hash_table_get(priv->glsl_program_lookup, &key);
+ entry = wine_rb_get(&priv->program_lookup, &key);
+ return entry ? WINE_RB_ENTRY_VALUE(entry, struct glsl_shader_prog_link, program_lookup_entry) : NULL;
}
-static void delete_glsl_program_entry(struct shader_glsl_priv *priv, const WineD3D_GL_Info *gl_info,
+/* GL locking is done by the caller */
+static void delete_glsl_program_entry(struct shader_glsl_priv *priv, const struct wined3d_gl_info *gl_info,
struct glsl_shader_prog_link *entry)
{
- glsl_program_key_t *key;
+ glsl_program_key_t key;
- key = HeapAlloc(GetProcessHeap(), 0, sizeof(glsl_program_key_t));
- key->vshader = entry->vshader;
- key->pshader = entry->pshader;
- key->vs_args = entry->vs_args;
- key->ps_args = entry->ps_args;
- hash_table_remove(priv->glsl_program_lookup, key);
+ key.vshader = entry->vshader;
+ key.pshader = entry->pshader;
+ key.vs_args = entry->vs_args;
+ key.ps_args = entry->ps_args;
+ wine_rb_remove(&priv->program_lookup, &key);
GL_EXTCALL(glDeleteObjectARB(entry->programId));
if (entry->vshader) list_remove(&entry->vshader_entry);
@@ -3217,28 +3375,33 @@ static void delete_glsl_program_entry(struct shader_glsl_priv *priv, const WineD
HeapFree(GetProcessHeap(), 0, entry);
}
-static void handle_ps3_input(SHADER_BUFFER *buffer, const WineD3D_GL_Info *gl_info, const DWORD *map,
- const struct wined3d_shader_semantic *semantics_in, const struct shader_reg_maps *reg_maps_in,
- const struct wined3d_shader_semantic *semantics_out, const struct shader_reg_maps *reg_maps_out)
+static void handle_ps3_input(struct wined3d_shader_buffer *buffer, const struct wined3d_gl_info *gl_info, const DWORD *map,
+ const struct wined3d_shader_signature_element *input_signature, const struct shader_reg_maps *reg_maps_in,
+ const struct wined3d_shader_signature_element *output_signature, const struct shader_reg_maps *reg_maps_out)
{
unsigned int i, j;
- DWORD usage, usage_idx, usage_out, usage_idx_out;
+ const char *semantic_name_in, *semantic_name_out;
+ UINT semantic_idx_in, semantic_idx_out;
DWORD *set;
DWORD in_idx;
- DWORD in_count = GL_LIMITS(glsl_varyings) / 4;
+ unsigned int in_count = vec4_varyings(3, gl_info);
char reg_mask[6], reg_mask_out[6];
char destination[50];
+ WORD input_map, output_map;
set = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*set) * (in_count + 2));
- if (!semantics_out) {
+ if (!output_signature)
+ {
/* Save gl_FrontColor & gl_FrontSecondaryColor before overwriting them. */
shader_addline(buffer, "vec4 front_color = gl_FrontColor;\n");
shader_addline(buffer, "vec4 front_secondary_color = gl_FrontSecondaryColor;\n");
}
- for(i = 0; i < MAX_REG_INPUT; i++) {
- if (!reg_maps_in->packed_input[i]) continue;
+ input_map = reg_maps_in->input_registers;
+ for (i = 0; input_map; input_map >>= 1, ++i)
+ {
+ if (!(input_map & 1)) continue;
in_idx = map[i];
if (in_idx >= (in_count + 2)) {
@@ -3259,56 +3422,65 @@ static void handle_ps3_input(SHADER_BUFFER *buffer, const WineD3D_GL_Info *gl_in
sprintf(destination, "IN[%u]", in_idx);
}
- usage = semantics_in[i].usage;
- usage_idx = semantics_in[i].usage_idx;
- set[map[i]] = shader_glsl_get_write_mask(&semantics_in[i].reg, reg_mask);
+ semantic_name_in = input_signature[i].semantic_name;
+ semantic_idx_in = input_signature[i].semantic_idx;
+ set[map[i]] = input_signature[i].mask;
+ shader_glsl_write_mask_to_str(input_signature[i].mask, reg_mask);
- if(!semantics_out) {
- switch(usage) {
- case WINED3DDECLUSAGE_COLOR:
- if (usage_idx == 0)
- shader_addline(buffer, "%s%s = front_color%s;\n",
- destination, reg_mask, reg_mask);
- else if (usage_idx == 1)
- shader_addline(buffer, "%s%s = front_secondary_color%s;\n",
- destination, reg_mask, reg_mask);
- else
- shader_addline(buffer, "%s%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n",
- destination, reg_mask, reg_mask);
- break;
-
- case WINED3DDECLUSAGE_TEXCOORD:
- if (usage_idx < 8) {
- shader_addline(buffer, "%s%s = gl_TexCoord[%u]%s;\n",
- destination, reg_mask, usage_idx, reg_mask);
- } else {
- shader_addline(buffer, "%s%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n",
- destination, reg_mask, reg_mask);
- }
- break;
-
- case WINED3DDECLUSAGE_FOG:
- shader_addline(buffer, "%s%s = vec4(gl_FogFragCoord, 0.0, 0.0, 0.0)%s;\n",
- destination, reg_mask, reg_mask);
- break;
-
- default:
+ if (!output_signature)
+ {
+ if (shader_match_semantic(semantic_name_in, WINED3DDECLUSAGE_COLOR))
+ {
+ if (semantic_idx_in == 0)
+ shader_addline(buffer, "%s%s = front_color%s;\n",
+ destination, reg_mask, reg_mask);
+ else if (semantic_idx_in == 1)
+ shader_addline(buffer, "%s%s = front_secondary_color%s;\n",
+ destination, reg_mask, reg_mask);
+ else
shader_addline(buffer, "%s%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n",
- destination, reg_mask, reg_mask);
+ destination, reg_mask, reg_mask);
+ }
+ else if (shader_match_semantic(semantic_name_in, WINED3DDECLUSAGE_TEXCOORD))
+ {
+ if (semantic_idx_in < 8)
+ {
+ shader_addline(buffer, "%s%s = gl_TexCoord[%u]%s;\n",
+ destination, reg_mask, semantic_idx_in, reg_mask);
+ }
+ else
+ {
+ shader_addline(buffer, "%s%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n",
+ destination, reg_mask, reg_mask);
+ }
+ }
+ else if (shader_match_semantic(semantic_name_in, WINED3DDECLUSAGE_FOG))
+ {
+ shader_addline(buffer, "%s%s = vec4(gl_FogFragCoord, 0.0, 0.0, 0.0)%s;\n",
+ destination, reg_mask, reg_mask);
+ }
+ else
+ {
+ shader_addline(buffer, "%s%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n",
+ destination, reg_mask, reg_mask);
}
} else {
BOOL found = FALSE;
- for(j = 0; j < MAX_REG_OUTPUT; j++) {
- if (!reg_maps_out->packed_output[j]) continue;
- usage_out = semantics_out[j].usage;
- usage_idx_out = semantics_out[j].usage_idx;
- shader_glsl_get_write_mask(&semantics_out[j].reg, reg_mask_out);
+ output_map = reg_maps_out->output_registers;
+ for (j = 0; output_map; output_map >>= 1, ++j)
+ {
+ if (!(output_map & 1)) continue;
- if(usage == usage_out &&
- usage_idx == usage_idx_out) {
+ semantic_name_out = output_signature[j].semantic_name;
+ semantic_idx_out = output_signature[j].semantic_idx;
+ shader_glsl_write_mask_to_str(output_signature[j].mask, reg_mask_out);
+
+ if (semantic_idx_in == semantic_idx_out
+ && !strcmp(semantic_name_in, semantic_name_out))
+ {
shader_addline(buffer, "%s%s = OUT[%u]%s;\n",
- destination, reg_mask, j, reg_mask);
+ destination, reg_mask, j, reg_mask);
found = TRUE;
}
}
@@ -3324,7 +3496,8 @@ static void handle_ps3_input(SHADER_BUFFER *buffer, const WineD3D_GL_Info *gl_in
* input varyings are assigned above, if the optimizer works properly.
*/
for(i = 0; i < in_count + 2; i++) {
- if(set[i] != WINED3DSP_WRITEMASK_ALL) {
+ if (set[i] && set[i] != WINED3DSP_WRITEMASK_ALL)
+ {
unsigned int size = 0;
memset(reg_mask, 0, sizeof(reg_mask));
if(!(set[i] & WINED3DSP_WRITEMASK_0)) {
@@ -3363,8 +3536,9 @@ static void handle_ps3_input(SHADER_BUFFER *buffer, const WineD3D_GL_Info *gl_in
HeapFree(GetProcessHeap(), 0, set);
}
-static GLhandleARB generate_param_reorder_function(IWineD3DVertexShader *vertexshader,
- IWineD3DPixelShader *pixelshader, const WineD3D_GL_Info *gl_info)
+/* GL locking is done by the caller */
+static GLhandleARB generate_param_reorder_function(struct wined3d_shader_buffer *buffer,
+ IWineD3DVertexShader *vertexshader, IWineD3DPixelShader *pixelshader, const struct wined3d_gl_info *gl_info)
{
GLhandleARB ret = 0;
IWineD3DVertexShaderImpl *vs = (IWineD3DVertexShaderImpl *) vertexshader;
@@ -3373,142 +3547,145 @@ static GLhandleARB generate_param_reorder_function(IWineD3DVertexShader *vertexs
DWORD vs_major = vs->baseShader.reg_maps.shader_version.major;
DWORD ps_major = ps ? ps->baseShader.reg_maps.shader_version.major : 0;
unsigned int i;
- SHADER_BUFFER buffer;
- DWORD usage, usage_idx, writemask;
+ const char *semantic_name;
+ UINT semantic_idx;
char reg_mask[6];
- const struct wined3d_shader_semantic *semantics_out;
+ const struct wined3d_shader_signature_element *output_signature;
- shader_buffer_init(&buffer);
+ shader_buffer_clear(buffer);
- shader_addline(&buffer, "#version 120\n");
+ shader_addline(buffer, "#version 120\n");
if(vs_major < 3 && ps_major < 3) {
/* That one is easy: The vertex shader writes to the builtin varyings, the pixel shader reads from them.
* Take care about the texcoord .w fixup though if we're using the fixed function fragment pipeline
*/
device = (IWineD3DDeviceImpl *) vs->baseShader.device;
- if((GLINFO_LOCATION).set_texcoord_w && ps_major == 0 && vs_major > 0 &&
- !device->frag_pipe->ffp_proj_control) {
- shader_addline(&buffer, "void order_ps_input() {\n");
+ if (((GLINFO_LOCATION).quirks & WINED3D_QUIRK_SET_TEXCOORD_W)
+ && ps_major == 0 && vs_major > 0 && !device->frag_pipe->ffp_proj_control)
+ {
+ shader_addline(buffer, "void order_ps_input() {\n");
for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) {
if(vs->baseShader.reg_maps.texcoord_mask[i] != 0 &&
vs->baseShader.reg_maps.texcoord_mask[i] != WINED3DSP_WRITEMASK_ALL) {
- shader_addline(&buffer, "gl_TexCoord[%u].w = 1.0;\n", i);
+ shader_addline(buffer, "gl_TexCoord[%u].w = 1.0;\n", i);
}
}
- shader_addline(&buffer, "}\n");
+ shader_addline(buffer, "}\n");
} else {
- shader_addline(&buffer, "void order_ps_input() { /* do nothing */ }\n");
+ shader_addline(buffer, "void order_ps_input() { /* do nothing */ }\n");
}
} else if(ps_major < 3 && vs_major >= 3) {
+ WORD map = vs->baseShader.reg_maps.output_registers;
+
/* The vertex shader writes to its own varyings, the pixel shader needs them in the builtin ones */
- semantics_out = vs->semantics_out;
+ output_signature = vs->output_signature;
- shader_addline(&buffer, "void order_ps_input(in vec4 OUT[%u]) {\n", MAX_REG_OUTPUT);
- for(i = 0; i < MAX_REG_OUTPUT; i++) {
- if (!vs->baseShader.reg_maps.packed_output[i]) continue;
+ shader_addline(buffer, "void order_ps_input(in vec4 OUT[%u]) {\n", MAX_REG_OUTPUT);
+ for (i = 0; map; map >>= 1, ++i)
+ {
+ DWORD write_mask;
- usage = semantics_out[i].usage;
- usage_idx = semantics_out[i].usage_idx;
- writemask = shader_glsl_get_write_mask(&semantics_out[i].reg, reg_mask);
+ if (!(map & 1)) continue;
- switch(usage) {
- case WINED3DDECLUSAGE_COLOR:
- if (usage_idx == 0)
- shader_addline(&buffer, "gl_FrontColor%s = OUT[%u]%s;\n", reg_mask, i, reg_mask);
- else if (usage_idx == 1)
- shader_addline(&buffer, "gl_FrontSecondaryColor%s = OUT[%u]%s;\n", reg_mask, i, reg_mask);
- break;
+ semantic_name = output_signature[i].semantic_name;
+ semantic_idx = output_signature[i].semantic_idx;
+ write_mask = output_signature[i].mask;
+ shader_glsl_write_mask_to_str(write_mask, reg_mask);
- case WINED3DDECLUSAGE_POSITION:
- shader_addline(&buffer, "gl_Position%s = OUT[%u]%s;\n", reg_mask, i, reg_mask);
- break;
+ if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_COLOR))
+ {
+ if (semantic_idx == 0)
+ shader_addline(buffer, "gl_FrontColor%s = OUT[%u]%s;\n", reg_mask, i, reg_mask);
+ else if (semantic_idx == 1)
+ shader_addline(buffer, "gl_FrontSecondaryColor%s = OUT[%u]%s;\n", reg_mask, i, reg_mask);
+ }
+ else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_POSITION))
+ {
+ shader_addline(buffer, "gl_Position%s = OUT[%u]%s;\n", reg_mask, i, reg_mask);
+ }
+ else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_TEXCOORD))
+ {
+ if (semantic_idx < 8)
+ {
+ if (!((GLINFO_LOCATION).quirks & WINED3D_QUIRK_SET_TEXCOORD_W) || ps_major > 0)
+ write_mask |= WINED3DSP_WRITEMASK_3;
- case WINED3DDECLUSAGE_TEXCOORD:
- if (usage_idx < 8) {
- if(!(GLINFO_LOCATION).set_texcoord_w || ps_major > 0) writemask |= WINED3DSP_WRITEMASK_3;
-
- shader_addline(&buffer, "gl_TexCoord[%u]%s = OUT[%u]%s;\n",
- usage_idx, reg_mask, i, reg_mask);
- if(!(writemask & WINED3DSP_WRITEMASK_3)) {
- shader_addline(&buffer, "gl_TexCoord[%u].w = 1.0;\n", usage_idx);
- }
- }
- break;
-
- case WINED3DDECLUSAGE_PSIZE:
- shader_addline(&buffer, "gl_PointSize = OUT[%u].x;\n", i);
- break;
-
- case WINED3DDECLUSAGE_FOG:
- shader_addline(&buffer, "gl_FogFragCoord = OUT[%u].%c;\n", i, reg_mask[1]);
- break;
-
- default:
- break;
+ shader_addline(buffer, "gl_TexCoord[%u]%s = OUT[%u]%s;\n",
+ semantic_idx, reg_mask, i, reg_mask);
+ if (!(write_mask & WINED3DSP_WRITEMASK_3))
+ shader_addline(buffer, "gl_TexCoord[%u].w = 1.0;\n", semantic_idx);
+ }
+ }
+ else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_PSIZE))
+ {
+ shader_addline(buffer, "gl_PointSize = OUT[%u].x;\n", i);
+ }
+ else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_FOG))
+ {
+ shader_addline(buffer, "gl_FogFragCoord = OUT[%u].%c;\n", i, reg_mask[1]);
}
}
- shader_addline(&buffer, "}\n");
+ shader_addline(buffer, "}\n");
} else if(ps_major >= 3 && vs_major >= 3) {
- semantics_out = vs->semantics_out;
+ WORD map = vs->baseShader.reg_maps.output_registers;
+
+ output_signature = vs->output_signature;
/* This one is tricky: a 3.0 pixel shader reads from a 3.0 vertex shader */
- shader_addline(&buffer, "varying vec4 IN[%u];\n", GL_LIMITS(glsl_varyings) / 4);
- shader_addline(&buffer, "void order_ps_input(in vec4 OUT[%u]) {\n", MAX_REG_OUTPUT);
+ shader_addline(buffer, "varying vec4 IN[%u];\n", vec4_varyings(3, gl_info));
+ shader_addline(buffer, "void order_ps_input(in vec4 OUT[%u]) {\n", MAX_REG_OUTPUT);
/* First, sort out position and point size. Those are not passed to the pixel shader */
- for(i = 0; i < MAX_REG_OUTPUT; i++) {
- if (!vs->baseShader.reg_maps.packed_output[i]) continue;
+ for (i = 0; map; map >>= 1, ++i)
+ {
+ if (!(map & 1)) continue;
- usage = semantics_out[i].usage;
- usage_idx = semantics_out[i].usage_idx;
- shader_glsl_get_write_mask(&semantics_out[i].reg, reg_mask);
+ semantic_name = output_signature[i].semantic_name;
+ shader_glsl_write_mask_to_str(output_signature[i].mask, reg_mask);
- switch(usage) {
- case WINED3DDECLUSAGE_POSITION:
- shader_addline(&buffer, "gl_Position%s = OUT[%u]%s;\n", reg_mask, i, reg_mask);
- break;
-
- case WINED3DDECLUSAGE_PSIZE:
- shader_addline(&buffer, "gl_PointSize = OUT[%u].x;\n", i);
- break;
-
- default:
- break;
+ if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_POSITION))
+ {
+ shader_addline(buffer, "gl_Position%s = OUT[%u]%s;\n", reg_mask, i, reg_mask);
+ }
+ else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_PSIZE))
+ {
+ shader_addline(buffer, "gl_PointSize = OUT[%u].x;\n", i);
}
}
/* Then, fix the pixel shader input */
- handle_ps3_input(&buffer, gl_info, ps->input_reg_map,
- ps->semantics_in, &ps->baseShader.reg_maps, semantics_out, &vs->baseShader.reg_maps);
+ handle_ps3_input(buffer, gl_info, ps->input_reg_map, ps->input_signature,
+ &ps->baseShader.reg_maps, output_signature, &vs->baseShader.reg_maps);
- shader_addline(&buffer, "}\n");
+ shader_addline(buffer, "}\n");
} else if(ps_major >= 3 && vs_major < 3) {
- shader_addline(&buffer, "varying vec4 IN[%u];\n", GL_LIMITS(glsl_varyings) / 4);
- shader_addline(&buffer, "void order_ps_input() {\n");
+ shader_addline(buffer, "varying vec4 IN[%u];\n", vec4_varyings(3, gl_info));
+ shader_addline(buffer, "void order_ps_input() {\n");
/* The vertex shader wrote to the builtin varyings. There is no need to figure out position and
* point size, but we depend on the optimizers kindness to find out that the pixel shader doesn't
* read gl_TexCoord and gl_ColorX, otherwise we'll run out of varyings
*/
- handle_ps3_input(&buffer, gl_info, ps->input_reg_map, ps->semantics_in, &ps->baseShader.reg_maps, NULL, NULL);
- shader_addline(&buffer, "}\n");
+ handle_ps3_input(buffer, gl_info, ps->input_reg_map, ps->input_signature,
+ &ps->baseShader.reg_maps, NULL, NULL);
+ shader_addline(buffer, "}\n");
} else {
ERR("Unexpected vertex and pixel shader version condition: vs: %d, ps: %d\n", vs_major, ps_major);
}
ret = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB));
checkGLcall("glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)");
- GL_EXTCALL(glShaderSourceARB(ret, 1, (const char**)&buffer.buffer, NULL));
- checkGLcall("glShaderSourceARB(ret, 1, &buffer.buffer, NULL)");
+ GL_EXTCALL(glShaderSourceARB(ret, 1, (const char**)&buffer->buffer, NULL));
+ checkGLcall("glShaderSourceARB(ret, 1, &buffer->buffer, NULL)");
GL_EXTCALL(glCompileShaderARB(ret));
checkGLcall("glCompileShaderARB(ret)");
- shader_buffer_free(&buffer);
return ret;
}
-static void hardcode_local_constants(IWineD3DBaseShaderImpl *shader, const WineD3D_GL_Info *gl_info,
+/* GL locking is done by the caller */
+static void hardcode_local_constants(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info,
GLhandleARB programId, char prefix)
{
const local_constant *lconst;
@@ -3522,7 +3699,299 @@ static void hardcode_local_constants(IWineD3DBaseShaderImpl *shader, const WineD
tmp_loc = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
GL_EXTCALL(glUniform4fvARB(tmp_loc, 1, value));
}
- checkGLcall("Hardcoding local constants\n");
+ checkGLcall("Hardcoding local constants");
+}
+
+/* GL locking is done by the caller */
+static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context,
+ struct wined3d_shader_buffer *buffer, IWineD3DPixelShaderImpl *This,
+ const struct ps_compile_args *args, struct ps_np2fixup_info *np2fixup_info)
+{
+ const struct shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ CONST DWORD *function = This->baseShader.function;
+ struct shader_glsl_ctx_priv priv_ctx;
+
+ /* Create the hw GLSL shader object and assign it as the shader->prgId */
+ GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB));
+
+ memset(&priv_ctx, 0, sizeof(priv_ctx));
+ priv_ctx.cur_ps_args = args;
+ priv_ctx.cur_np2fixup_info = np2fixup_info;
+
+ shader_addline(buffer, "#version 120\n");
+
+ if(GL_SUPPORT(ARB_SHADER_TEXTURE_LOD) && reg_maps->usestexldd) {
+ shader_addline(buffer, "#extension GL_ARB_shader_texture_lod : enable\n");
+ }
+ if (GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {
+ /* The spec says that it doesn't have to be explicitly enabled, but the nvidia
+ * drivers write a warning if we don't do so
+ */
+ shader_addline(buffer, "#extension GL_ARB_texture_rectangle : enable\n");
+ }
+
+ /* Base Declarations */
+ shader_generate_glsl_declarations(context, buffer, (IWineD3DBaseShader *)This, reg_maps, &priv_ctx);
+
+ /* Pack 3.0 inputs */
+ if (reg_maps->shader_version.major >= 3 && args->vp_mode != vertexshader)
+ {
+ shader_glsl_input_pack((IWineD3DPixelShader *) This, buffer, This->input_signature, reg_maps, args->vp_mode);
+ }
+
+ /* Base Shader Body */
+ shader_generate_main((IWineD3DBaseShader *)This, buffer, reg_maps, function, &priv_ctx);
+
+ /* Pixel shaders < 2.0 place the resulting color in R0 implicitly */
+ if (reg_maps->shader_version.major < 2)
+ {
+ /* Some older cards like GeforceFX ones don't support multiple buffers, so also not gl_FragData */
+ shader_addline(buffer, "gl_FragData[0] = R0;\n");
+ }
+
+ if (args->srgb_correction)
+ {
+ shader_addline(buffer, "tmp0.xyz = pow(gl_FragData[0].xyz, vec3(srgb_const0.x));\n");
+ shader_addline(buffer, "tmp0.xyz = tmp0.xyz * vec3(srgb_const0.y) - vec3(srgb_const0.z);\n");
+ shader_addline(buffer, "tmp1.xyz = gl_FragData[0].xyz * vec3(srgb_const0.w);\n");
+ shader_addline(buffer, "bvec3 srgb_compare = lessThan(gl_FragData[0].xyz, vec3(srgb_const1.x));\n");
+ shader_addline(buffer, "gl_FragData[0].xyz = mix(tmp0.xyz, tmp1.xyz, vec3(srgb_compare));\n");
+ shader_addline(buffer, "gl_FragData[0] = clamp(gl_FragData[0], 0.0, 1.0);\n");
+ }
+ /* Pixel shader < 3.0 do not replace the fog stage.
+ * This implements linear fog computation and blending.
+ * TODO: non linear fog
+ * NOTE: gl_Fog.start and gl_Fog.end don't hold fog start s and end e but
+ * -1/(e-s) and e/(e-s) respectively.
+ */
+ if (reg_maps->shader_version.major < 3)
+ {
+ switch(args->fog) {
+ case FOG_OFF: break;
+ case FOG_LINEAR:
+ shader_addline(buffer, "float fogstart = -1.0 / (gl_Fog.end - gl_Fog.start);\n");
+ shader_addline(buffer, "float fogend = gl_Fog.end * -fogstart;\n");
+ shader_addline(buffer, "float Fog = clamp(gl_FogFragCoord * fogstart + fogend, 0.0, 1.0);\n");
+ shader_addline(buffer, "gl_FragData[0].xyz = mix(gl_Fog.color.xyz, gl_FragData[0].xyz, Fog);\n");
+ break;
+ case FOG_EXP:
+ /* Fog = e^(-gl_Fog.density * gl_FogFragCoord) */
+ shader_addline(buffer, "float Fog = exp(-gl_Fog.density * gl_FogFragCoord);\n");
+ shader_addline(buffer, "Fog = clamp(Fog, 0.0, 1.0);\n");
+ shader_addline(buffer, "gl_FragData[0].xyz = mix(gl_Fog.color.xyz, gl_FragData[0].xyz, Fog);\n");
+ break;
+ case FOG_EXP2:
+ /* Fog = e^(-(gl_Fog.density * gl_FogFragCoord)^2) */
+ shader_addline(buffer, "float Fog = exp(-gl_Fog.density * gl_Fog.density * gl_FogFragCoord * gl_FogFragCoord);\n");
+ shader_addline(buffer, "Fog = clamp(Fog, 0.0, 1.0);\n");
+ shader_addline(buffer, "gl_FragData[0].xyz = mix(gl_Fog.color.xyz, gl_FragData[0].xyz, Fog);\n");
+ break;
+ }
+ }
+
+ shader_addline(buffer, "}\n");
+
+ TRACE("Compiling shader object %u\n", shader_obj);
+ GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL));
+ GL_EXTCALL(glCompileShaderARB(shader_obj));
+ print_glsl_info_log(&GLINFO_LOCATION, shader_obj);
+
+ /* Store the shader object */
+ return shader_obj;
+}
+
+/* GL locking is done by the caller */
+static GLuint shader_glsl_generate_vshader(const struct wined3d_context *context,
+ struct wined3d_shader_buffer *buffer, IWineD3DVertexShaderImpl *This,
+ const struct vs_compile_args *args)
+{
+ const struct shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ CONST DWORD *function = This->baseShader.function;
+ struct shader_glsl_ctx_priv priv_ctx;
+
+ /* Create the hw GLSL shader program and assign it as the shader->prgId */
+ GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB));
+
+ shader_addline(buffer, "#version 120\n");
+
+ memset(&priv_ctx, 0, sizeof(priv_ctx));
+ priv_ctx.cur_vs_args = args;
+
+ /* Base Declarations */
+ shader_generate_glsl_declarations(context, buffer, (IWineD3DBaseShader *)This, reg_maps, &priv_ctx);
+
+ /* Base Shader Body */
+ shader_generate_main((IWineD3DBaseShader*)This, buffer, reg_maps, function, &priv_ctx);
+
+ /* Unpack 3.0 outputs */
+ if (reg_maps->shader_version.major >= 3) shader_addline(buffer, "order_ps_input(OUT);\n");
+ else shader_addline(buffer, "order_ps_input();\n");
+
+ /* The D3DRS_FOGTABLEMODE render state defines if the shader-generated fog coord is used
+ * or if the fragment depth is used. If the fragment depth is used(FOGTABLEMODE != NONE),
+ * the fog frag coord is thrown away. If the fog frag coord is used, but not written by
+ * the shader, it is set to 0.0(fully fogged, since start = 1.0, end = 0.0)
+ */
+ if(args->fog_src == VS_FOG_Z) {
+ shader_addline(buffer, "gl_FogFragCoord = gl_Position.z;\n");
+ } else if (!reg_maps->fog) {
+ shader_addline(buffer, "gl_FogFragCoord = 0.0;\n");
+ }
+
+ /* Write the final position.
+ *
+ * OpenGL coordinates specify the center of the pixel while d3d coords specify
+ * the corner. The offsets are stored in z and w in posFixup. posFixup.y contains
+ * 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x
+ * contains 1.0 to allow a mad.
+ */
+ shader_addline(buffer, "gl_Position.y = gl_Position.y * posFixup.y;\n");
+ shader_addline(buffer, "gl_Position.xy += posFixup.zw * gl_Position.ww;\n");
+ shader_addline(buffer, "gl_ClipVertex = gl_Position;\n");
+
+ /* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
+ *
+ * Basically we want (in homogeneous coordinates) z = z * 2 - 1. However, shaders are run
+ * before the homogeneous divide, so we have to take the w into account: z = ((z / w) * 2 - 1) * w,
+ * which is the same as z = z * 2 - w.
+ */
+ shader_addline(buffer, "gl_Position.z = gl_Position.z * 2.0 - gl_Position.w;\n");
+
+ shader_addline(buffer, "}\n");
+
+ TRACE("Compiling shader object %u\n", shader_obj);
+ GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL));
+ GL_EXTCALL(glCompileShaderARB(shader_obj));
+ print_glsl_info_log(&GLINFO_LOCATION, shader_obj);
+
+ return shader_obj;
+}
+
+static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
+ struct wined3d_shader_buffer *buffer, IWineD3DPixelShaderImpl *shader,
+ const struct ps_compile_args *args, const struct ps_np2fixup_info **np2fixup_info)
+{
+ UINT i;
+ DWORD new_size;
+ struct glsl_ps_compiled_shader *new_array;
+ struct glsl_pshader_private *shader_data;
+ struct ps_np2fixup_info *np2fixup = NULL;
+ GLhandleARB ret;
+
+ if(!shader->backend_priv) {
+ shader->backend_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data));
+ }
+ shader_data = shader->backend_priv;
+
+ /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
+ * so a linear search is more performant than a hashmap or a binary search
+ * (cache coherency etc)
+ */
+ for(i = 0; i < shader_data->num_gl_shaders; i++) {
+ if(memcmp(&shader_data->gl_shaders[i].args, args, sizeof(*args)) == 0) {
+ if(args->np2_fixup) *np2fixup_info = &shader_data->gl_shaders[i].np2fixup;
+ return shader_data->gl_shaders[i].prgId;
+ }
+ }
+
+ TRACE("No matching GL shader found for shader %p, compiling a new shader.\n", shader);
+ if(shader_data->shader_array_size == shader_data->num_gl_shaders) {
+ if (shader_data->num_gl_shaders)
+ {
+ new_size = shader_data->shader_array_size + max(1, shader_data->shader_array_size / 2);
+ new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders,
+ new_size * sizeof(*shader_data->gl_shaders));
+ } else {
+ new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*shader_data->gl_shaders));
+ new_size = 1;
+ }
+
+ if(!new_array) {
+ ERR("Out of memory\n");
+ return 0;
+ }
+ shader_data->gl_shaders = new_array;
+ shader_data->shader_array_size = new_size;
+ }
+
+ shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args;
+
+ memset(&shader_data->gl_shaders[shader_data->num_gl_shaders].np2fixup, 0, sizeof(struct ps_np2fixup_info));
+ if (args->np2_fixup) np2fixup = &shader_data->gl_shaders[shader_data->num_gl_shaders].np2fixup;
+
+ pixelshader_update_samplers(&shader->baseShader.reg_maps,
+ ((IWineD3DDeviceImpl *)shader->baseShader.device)->stateBlock->textures);
+
+ shader_buffer_clear(buffer);
+ ret = shader_glsl_generate_pshader(context, buffer, shader, args, np2fixup);
+ shader_data->gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
+ *np2fixup_info = np2fixup;
+
+ return ret;
+}
+
+static inline BOOL vs_args_equal(const struct vs_compile_args *stored, const struct vs_compile_args *new,
+ const DWORD use_map) {
+ if((stored->swizzle_map & use_map) != new->swizzle_map) return FALSE;
+ return stored->fog_src == new->fog_src;
+}
+
+static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
+ struct wined3d_shader_buffer *buffer, IWineD3DVertexShaderImpl *shader,
+ const struct vs_compile_args *args)
+{
+ UINT i;
+ DWORD new_size;
+ struct glsl_vs_compiled_shader *new_array;
+ DWORD use_map = ((IWineD3DDeviceImpl *)shader->baseShader.device)->strided_streams.use_map;
+ struct glsl_vshader_private *shader_data;
+ GLhandleARB ret;
+
+ if(!shader->backend_priv) {
+ shader->backend_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data));
+ }
+ shader_data = shader->backend_priv;
+
+ /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
+ * so a linear search is more performant than a hashmap or a binary search
+ * (cache coherency etc)
+ */
+ for(i = 0; i < shader_data->num_gl_shaders; i++) {
+ if(vs_args_equal(&shader_data->gl_shaders[i].args, args, use_map)) {
+ return shader_data->gl_shaders[i].prgId;
+ }
+ }
+
+ TRACE("No matching GL shader found for shader %p, compiling a new shader.\n", shader);
+
+ if(shader_data->shader_array_size == shader_data->num_gl_shaders) {
+ if (shader_data->num_gl_shaders)
+ {
+ new_size = shader_data->shader_array_size + max(1, shader_data->shader_array_size / 2);
+ new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders,
+ new_size * sizeof(*shader_data->gl_shaders));
+ } else {
+ new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*shader_data->gl_shaders));
+ new_size = 1;
+ }
+
+ if(!new_array) {
+ ERR("Out of memory\n");
+ return 0;
+ }
+ shader_data->gl_shaders = new_array;
+ shader_data->shader_array_size = new_size;
+ }
+
+ shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args;
+
+ shader_buffer_clear(buffer);
+ ret = shader_glsl_generate_vshader(context, buffer, shader, args);
+ shader_data->gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
+
+ return ret;
}
/** Sets the GLSL program ID for the given pixel and vertex shader combination.
@@ -3533,33 +4002,26 @@ static void hardcode_local_constants(IWineD3DBaseShaderImpl *shader, const WineD
* the program in the hash table. If it creates a program, it will link the
* given objects, too.
*/
-static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use_vs) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- struct shader_glsl_priv *priv = This->shader_priv;
- const WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
- IWineD3DPixelShader *pshader = This->stateBlock->pixelShader;
- IWineD3DVertexShader *vshader = This->stateBlock->vertexShader;
+
+/* GL locking is done by the caller */
+static void set_glsl_shader_program(const struct wined3d_context *context,
+ IWineD3DDeviceImpl *device, BOOL use_ps, BOOL use_vs)
+{
+ IWineD3DVertexShader *vshader = use_vs ? device->stateBlock->vertexShader : NULL;
+ IWineD3DPixelShader *pshader = use_ps ? device->stateBlock->pixelShader : NULL;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ struct shader_glsl_priv *priv = device->shader_priv;
struct glsl_shader_prog_link *entry = NULL;
GLhandleARB programId = 0;
GLhandleARB reorder_shader_id = 0;
unsigned int i;
char glsl_name[8];
- GLhandleARB vshader_id, pshader_id;
struct ps_compile_args ps_compile_args;
struct vs_compile_args vs_compile_args;
- if(use_vs) {
- find_vs_compile_args((IWineD3DVertexShaderImpl*)This->stateBlock->vertexShader, This->stateBlock, &vs_compile_args);
- } else {
- /* FIXME: Do we really have to spend CPU cycles to generate a few zeroed bytes? */
- memset(&vs_compile_args, 0, sizeof(vs_compile_args));
- }
- if(use_ps) {
- find_ps_compile_args((IWineD3DPixelShaderImpl*)This->stateBlock->pixelShader, This->stateBlock, &ps_compile_args);
- } else {
- /* FIXME: Do we really have to spend CPU cycles to generate a few zeroed bytes? */
- memset(&ps_compile_args, 0, sizeof(ps_compile_args));
- }
+ if (vshader) find_vs_compile_args((IWineD3DVertexShaderImpl *)vshader, device->stateBlock, &vs_compile_args);
+ if (pshader) find_ps_compile_args((IWineD3DPixelShaderImpl *)pshader, device->stateBlock, &ps_compile_args);
+
entry = get_glsl_program_entry(priv, vshader, pshader, &vs_compile_args, &ps_compile_args);
if (entry) {
priv->glsl_program = entry;
@@ -3578,24 +4040,22 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
entry->vs_args = vs_compile_args;
entry->ps_args = ps_compile_args;
entry->constant_version = 0;
+ entry->np2Fixup_info = NULL;
/* Add the hash table entry */
add_glsl_program_entry(priv, entry);
/* Set the current program */
priv->glsl_program = entry;
- if(use_vs) {
- vshader_id = find_gl_vshader((IWineD3DVertexShaderImpl *) vshader, &vs_compile_args);
- } else {
- vshader_id = 0;
- }
-
/* Attach GLSL vshader */
- if (vshader_id) {
- const unsigned int max_attribs = 16; /* TODO: Will this always be the case? It is at the moment... */
+ if (vshader)
+ {
+ GLhandleARB vshader_id = find_glsl_vshader(context, &priv->shader_buffer,
+ (IWineD3DVertexShaderImpl *)vshader, &vs_compile_args);
+ WORD map = ((IWineD3DBaseShaderImpl *)vshader)->baseShader.reg_maps.input_registers;
char tmp_name[10];
- reorder_shader_id = generate_param_reorder_function(vshader, pshader, gl_info);
+ reorder_shader_id = generate_param_reorder_function(&priv->shader_buffer, vshader, pshader, gl_info);
TRACE("Attaching GLSL shader object %u to program %u\n", reorder_shader_id, programId);
GL_EXTCALL(glAttachObjectARB(programId, reorder_shader_id));
checkGLcall("glAttachObjectARB");
@@ -3617,25 +4077,23 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
* We have to do this here because we need to know the Program ID
* in order to make the bindings work, and it has to be done prior
* to linking the GLSL program. */
- for (i = 0; i < max_attribs; ++i) {
- if (((IWineD3DBaseShaderImpl*)vshader)->baseShader.reg_maps.attributes[i]) {
- snprintf(tmp_name, sizeof(tmp_name), "attrib%i", i);
- GL_EXTCALL(glBindAttribLocationARB(programId, i, tmp_name));
- }
+ for (i = 0; map; map >>= 1, ++i)
+ {
+ if (!(map & 1)) continue;
+
+ snprintf(tmp_name, sizeof(tmp_name), "attrib%u", i);
+ GL_EXTCALL(glBindAttribLocationARB(programId, i, tmp_name));
}
checkGLcall("glBindAttribLocationARB");
list_add_head(&((IWineD3DBaseShaderImpl *)vshader)->baseShader.linked_programs, &entry->vshader_entry);
}
- if(use_ps) {
- pshader_id = find_gl_pshader((IWineD3DPixelShaderImpl *) pshader, &ps_compile_args);
- } else {
- pshader_id = 0;
- }
-
/* Attach GLSL pshader */
- if (pshader_id) {
+ if (pshader)
+ {
+ GLhandleARB pshader_id = find_glsl_pshader(context, &priv->shader_buffer,
+ (IWineD3DPixelShaderImpl *)pshader, &ps_compile_args, &entry->np2Fixup_info);
TRACE("Attaching GLSL shader object %u to program %u\n", pshader_id, programId);
GL_EXTCALL(glAttachObjectARB(programId, pshader_id));
checkGLcall("glAttachObjectARB");
@@ -3668,25 +4126,22 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
}
if(pshader) {
- for(i = 0; i < ((IWineD3DPixelShaderImpl*)pshader)->numbumpenvmatconsts; i++) {
- char name[32];
- sprintf(name, "bumpenvmat%d", ((IWineD3DPixelShaderImpl*)pshader)->bumpenvmatconst[i].texunit);
+ char name[32];
+
+ for(i = 0; i < MAX_TEXTURES; i++) {
+ sprintf(name, "bumpenvmat%u", i);
entry->bumpenvmat_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name));
- sprintf(name, "luminancescale%d", ((IWineD3DPixelShaderImpl*)pshader)->luminanceconst[i].texunit);
+ sprintf(name, "luminancescale%u", i);
entry->luminancescale_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name));
- sprintf(name, "luminanceoffset%d", ((IWineD3DPixelShaderImpl*)pshader)->luminanceconst[i].texunit);
+ sprintf(name, "luminanceoffset%u", i);
entry->luminanceoffset_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name));
}
- }
- if (use_ps && ps_compile_args.np2_fixup) {
- char name[32];
- for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) {
- if (ps_compile_args.np2_fixup & (1 << i)) {
- sprintf(name, "PsamplerNP2Fixup%u", i);
- entry->np2Fixup_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name));
+ if (ps_compile_args.np2_fixup) {
+ if (entry->np2Fixup_info) {
+ entry->np2Fixup_location = GL_EXTCALL(glGetUniformLocationARB(programId, "PsamplerNP2Fixup"));
} else {
- entry->np2Fixup_location[i] = -1;
+ FIXME("NP2 texcoord fixup needed for this pixelshader, but no fixup uniform found.\n");
}
}
}
@@ -3697,7 +4152,7 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
if (pshader
&& ((IWineD3DPixelShaderImpl *)pshader)->baseShader.reg_maps.shader_version.major >= 3
- && ((IWineD3DPixelShaderImpl *)pshader)->declared_in_count > GL_LIMITS(glsl_varyings) / 4)
+ && ((IWineD3DPixelShaderImpl *)pshader)->declared_in_count > vec4_varyings(3, gl_info))
{
TRACE("Shader %d needs vertex color clamping disabled\n", programId);
entry->vertex_color_clamp = GL_FALSE;
@@ -3717,14 +4172,8 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
* fixed function fragment processing setups. So once the program is linked these samplers
* won't change.
*/
- if(vshader_id) {
- /* Load vertex shader samplers */
- shader_glsl_load_vsamplers(gl_info, This->texUnitMap, programId);
- }
- if(pshader_id) {
- /* Load pixel shader samplers */
- shader_glsl_load_psamplers(gl_info, This->texUnitMap, programId);
- }
+ if (vshader) shader_glsl_load_vsamplers(gl_info, device->texUnitMap, programId);
+ if (pshader) shader_glsl_load_psamplers(gl_info, device->texUnitMap, programId);
/* If the local constants do not have to be loaded with the environment constants,
* load them now to have them hardcoded in the GLSL program. This saves some CPU cycles
@@ -3738,7 +4187,8 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
}
}
-static GLhandleARB create_glsl_blt_shader(const WineD3D_GL_Info *gl_info, enum tex_types tex_type)
+/* GL locking is done by the caller */
+static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, enum tex_types tex_type)
{
GLhandleARB program_id;
GLhandleARB vshader_id, pshader_id;
@@ -3812,16 +4262,18 @@ static GLhandleARB create_glsl_blt_shader(const WineD3D_GL_Info *gl_info, enum t
return program_id;
}
-static void shader_glsl_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- struct shader_glsl_priv *priv = This->shader_priv;
- const WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
+/* GL locking is done by the caller */
+static void shader_glsl_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS)
+{
+ IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ struct shader_glsl_priv *priv = device->shader_priv;
GLhandleARB program_id = 0;
GLenum old_vertex_color_clamp, current_vertex_color_clamp;
old_vertex_color_clamp = priv->glsl_program ? priv->glsl_program->vertex_color_clamp : GL_FIXED_ONLY_ARB;
- if (useVS || usePS) set_glsl_shader_program(iface, usePS, useVS);
+ if (useVS || usePS) set_glsl_shader_program(context, device, usePS, useVS);
else priv->glsl_program = NULL;
current_vertex_color_clamp = priv->glsl_program ? priv->glsl_program->vertex_color_clamp : GL_FIXED_ONLY_ARB;
@@ -3839,11 +4291,20 @@ static void shader_glsl_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) {
if (program_id) TRACE("Using GLSL program %u\n", program_id);
GL_EXTCALL(glUseProgramObjectARB(program_id));
checkGLcall("glUseProgramObjectARB");
+
+ /* In case that NP2 texcoord fixup data is found for the selected program, trigger a reload of the
+ * constants. This has to be done because it can't be guaranteed that sampler() (from state.c) is
+ * called between selecting the shader and using it, which results in wrong fixup for some frames. */
+ if (priv->glsl_program && priv->glsl_program->np2Fixup_info)
+ {
+ shader_glsl_load_np2fixup_constants((IWineD3DDevice *)device, usePS, useVS);
+ }
}
+/* GL locking is done by the caller */
static void shader_glsl_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- const WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
struct shader_glsl_priv *priv = This->shader_priv;
GLhandleARB *blt_program = &priv->depth_blt_program[tex_type];
@@ -3858,9 +4319,10 @@ static void shader_glsl_select_depth_blt(IWineD3DDevice *iface, enum tex_types t
}
}
+/* GL locking is done by the caller */
static void shader_glsl_deselect_depth_blt(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- const WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
struct shader_glsl_priv *priv = This->shader_priv;
GLhandleARB program_id;
@@ -3876,7 +4338,8 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *) iface;
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device;
struct shader_glsl_priv *priv = device->shader_priv;
- const WineD3D_GL_Info *gl_info = &device->adapter->gl_info;
+ const struct wined3d_context *context;
+ const struct wined3d_gl_info *gl_info;
IWineD3DPixelShaderImpl *ps = NULL;
IWineD3DVertexShaderImpl *vs = NULL;
@@ -3886,15 +4349,45 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
char pshader = shader_is_pshader_version(This->baseShader.reg_maps.shader_version.type);
if(pshader) {
+ struct glsl_pshader_private *shader_data;
ps = (IWineD3DPixelShaderImpl *) This;
- if(ps->num_gl_shaders == 0) return;
+ shader_data = ps->backend_priv;
+ if(!shader_data || shader_data->num_gl_shaders == 0)
+ {
+ HeapFree(GetProcessHeap(), 0, shader_data);
+ ps->backend_priv = NULL;
+ return;
+ }
+
+ context = ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
+ gl_info = context->gl_info;
+
if (priv->glsl_program && (IWineD3DBaseShader *)priv->glsl_program->pshader == iface)
- shader_glsl_select(This->baseShader.device, FALSE, FALSE);
+ {
+ ENTER_GL();
+ shader_glsl_select(context, FALSE, FALSE);
+ LEAVE_GL();
+ }
} else {
+ struct glsl_vshader_private *shader_data;
vs = (IWineD3DVertexShaderImpl *) This;
- if(vs->num_gl_shaders == 0) return;
+ shader_data = vs->backend_priv;
+ if(!shader_data || shader_data->num_gl_shaders == 0)
+ {
+ HeapFree(GetProcessHeap(), 0, shader_data);
+ vs->backend_priv = NULL;
+ return;
+ }
+
+ context = ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
+ gl_info = context->gl_info;
+
if (priv->glsl_program && (IWineD3DBaseShader *)priv->glsl_program->vshader == iface)
- shader_glsl_select(This->baseShader.device, FALSE, FALSE);
+ {
+ ENTER_GL();
+ shader_glsl_select(context, FALSE, FALSE);
+ LEAVE_GL();
+ }
}
linked_programs = &This->baseShader.linked_programs;
@@ -3903,6 +4396,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
if (linked_programs->next) {
struct glsl_shader_prog_link *entry, *entry2;
+ ENTER_GL();
if(pshader) {
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, linked_programs, struct glsl_shader_prog_link, pshader_entry) {
delete_glsl_program_entry(priv, gl_info, entry);
@@ -3912,62 +4406,57 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
delete_glsl_program_entry(priv, gl_info, entry);
}
}
+ LEAVE_GL();
}
if(pshader) {
UINT i;
+ struct glsl_pshader_private *shader_data = ps->backend_priv;
ENTER_GL();
- for(i = 0; i < ps->num_gl_shaders; i++) {
- TRACE("deleting pshader %u\n", ps->gl_shaders[i].prgId);
- GL_EXTCALL(glDeleteObjectARB(ps->gl_shaders[i].prgId));
+ for(i = 0; i < shader_data->num_gl_shaders; i++) {
+ TRACE("deleting pshader %u\n", shader_data->gl_shaders[i].prgId);
+ GL_EXTCALL(glDeleteObjectARB(shader_data->gl_shaders[i].prgId));
checkGLcall("glDeleteObjectARB");
}
LEAVE_GL();
- HeapFree(GetProcessHeap(), 0, ps->gl_shaders);
- ps->gl_shaders = NULL;
- ps->num_gl_shaders = 0;
- ps->shader_array_size = 0;
+ HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
+ HeapFree(GetProcessHeap(), 0, shader_data);
+ ps->backend_priv = NULL;
} else {
UINT i;
+ struct glsl_vshader_private *shader_data = vs->backend_priv;
ENTER_GL();
- for(i = 0; i < vs->num_gl_shaders; i++) {
- TRACE("deleting vshader %u\n", vs->gl_shaders[i].prgId);
- GL_EXTCALL(glDeleteObjectARB(vs->gl_shaders[i].prgId));
+ for(i = 0; i < shader_data->num_gl_shaders; i++) {
+ TRACE("deleting vshader %u\n", shader_data->gl_shaders[i].prgId);
+ GL_EXTCALL(glDeleteObjectARB(shader_data->gl_shaders[i].prgId));
checkGLcall("glDeleteObjectARB");
}
LEAVE_GL();
- HeapFree(GetProcessHeap(), 0, vs->gl_shaders);
- vs->gl_shaders = NULL;
- vs->num_gl_shaders = 0;
- vs->shader_array_size = 0;
+ HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
+ HeapFree(GetProcessHeap(), 0, shader_data);
+ vs->backend_priv = NULL;
}
}
-static unsigned int glsl_program_key_hash(const void *key)
+static int glsl_program_key_compare(const void *key, const struct wine_rb_entry *entry)
{
const glsl_program_key_t *k = key;
+ const struct glsl_shader_prog_link *prog = WINE_RB_ENTRY_VALUE(entry,
+ const struct glsl_shader_prog_link, program_lookup_entry);
+ int cmp;
- unsigned int hash = ((DWORD_PTR) k->vshader) | ((DWORD_PTR) k->pshader) << 16;
- hash += ~(hash << 15);
- hash ^= (hash >> 10);
- hash += (hash << 3);
- hash ^= (hash >> 6);
- hash += ~(hash << 11);
- hash ^= (hash >> 16);
+ if (k->vshader > prog->vshader) return 1;
+ else if (k->vshader < prog->vshader) return -1;
- return hash;
-}
+ if (k->pshader > prog->pshader) return 1;
+ else if (k->pshader < prog->pshader) return -1;
-static BOOL glsl_program_key_compare(const void *keya, const void *keyb)
-{
- const glsl_program_key_t *ka = keya;
- const glsl_program_key_t *kb = keyb;
+ if (k->vshader && (cmp = memcmp(&k->vs_args, &prog->vs_args, sizeof(prog->vs_args)))) return cmp;
+ if (k->pshader && (cmp = memcmp(&k->ps_args, &prog->ps_args, sizeof(prog->ps_args)))) return cmp;
- return ka->vshader == kb->vshader && ka->pshader == kb->pshader &&
- (memcmp(&ka->ps_args, &kb->ps_args, sizeof(kb->ps_args)) == 0) &&
- (memcmp(&ka->vs_args, &kb->vs_args, sizeof(kb->vs_args)) == 0);
+ return 0;
}
static BOOL constant_heap_init(struct constant_heap *heap, unsigned int constant_count)
@@ -3994,50 +4483,73 @@ static void constant_heap_free(struct constant_heap *heap)
HeapFree(GetProcessHeap(), 0, heap->entries);
}
+static const struct wine_rb_functions wined3d_glsl_program_rb_functions =
+{
+ wined3d_rb_alloc,
+ wined3d_rb_realloc,
+ wined3d_rb_free,
+ glsl_program_key_compare,
+};
+
static HRESULT shader_glsl_alloc(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- const WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
struct shader_glsl_priv *priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct shader_glsl_priv));
SIZE_T stack_size = wined3d_log2i(max(GL_LIMITS(vshader_constantsF), GL_LIMITS(pshader_constantsF))) + 1;
+ if (!shader_buffer_init(&priv->shader_buffer))
+ {
+ ERR("Failed to initialize shader buffer.\n");
+ goto fail;
+ }
+
priv->stack = HeapAlloc(GetProcessHeap(), 0, stack_size * sizeof(*priv->stack));
if (!priv->stack)
{
ERR("Failed to allocate memory.\n");
- HeapFree(GetProcessHeap(), 0, priv);
- return E_OUTOFMEMORY;
+ goto fail;
}
if (!constant_heap_init(&priv->vconst_heap, GL_LIMITS(vshader_constantsF)))
{
ERR("Failed to initialize vertex shader constant heap\n");
- HeapFree(GetProcessHeap(), 0, priv->stack);
- HeapFree(GetProcessHeap(), 0, priv);
- return E_OUTOFMEMORY;
+ goto fail;
}
if (!constant_heap_init(&priv->pconst_heap, GL_LIMITS(pshader_constantsF)))
{
ERR("Failed to initialize pixel shader constant heap\n");
- constant_heap_free(&priv->vconst_heap);
- HeapFree(GetProcessHeap(), 0, priv->stack);
- HeapFree(GetProcessHeap(), 0, priv);
- return E_OUTOFMEMORY;
+ goto fail;
+ }
+
+ if (wine_rb_init(&priv->program_lookup, &wined3d_glsl_program_rb_functions) == -1)
+ {
+ ERR("Failed to initialize rbtree.\n");
+ goto fail;
}
- priv->glsl_program_lookup = hash_table_create(glsl_program_key_hash, glsl_program_key_compare);
priv->next_constant_version = 1;
This->shader_priv = priv;
return WINED3D_OK;
+
+fail:
+ constant_heap_free(&priv->pconst_heap);
+ constant_heap_free(&priv->vconst_heap);
+ HeapFree(GetProcessHeap(), 0, priv->stack);
+ shader_buffer_free(&priv->shader_buffer);
+ HeapFree(GetProcessHeap(), 0, priv);
+ return E_OUTOFMEMORY;
}
+/* Context activation is done by the caller. */
static void shader_glsl_free(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- const WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
struct shader_glsl_priv *priv = This->shader_priv;
int i;
+ ENTER_GL();
for (i = 0; i < tex_type_count; ++i)
{
if (priv->depth_blt_program[i])
@@ -4045,10 +4557,12 @@ static void shader_glsl_free(IWineD3DDevice *iface) {
GL_EXTCALL(glDeleteObjectARB(priv->depth_blt_program[i]));
}
}
+ LEAVE_GL();
- hash_table_destroy(priv->glsl_program_lookup, NULL, NULL);
+ wine_rb_destroy(&priv->program_lookup, NULL, NULL);
constant_heap_free(&priv->pconst_heap);
constant_heap_free(&priv->vconst_heap);
+ HeapFree(GetProcessHeap(), 0, priv->stack);
HeapFree(GetProcessHeap(), 0, This->shader_priv);
This->shader_priv = NULL;
@@ -4059,185 +4573,19 @@ static BOOL shader_glsl_dirty_const(IWineD3DDevice *iface) {
return FALSE;
}
-static GLuint shader_glsl_generate_pshader(IWineD3DPixelShader *iface,
- SHADER_BUFFER *buffer, const struct ps_compile_args *args)
-{
- IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface;
- const struct shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
- CONST DWORD *function = This->baseShader.function;
- const char *fragcolor;
- const WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info;
-
- /* Create the hw GLSL shader object and assign it as the shader->prgId */
- GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB));
-
- shader_addline(buffer, "#version 120\n");
-
- if (GL_SUPPORT(ARB_DRAW_BUFFERS)) {
- shader_addline(buffer, "#extension GL_ARB_draw_buffers : enable\n");
- }
- if(GL_SUPPORT(ARB_SHADER_TEXTURE_LOD) && reg_maps->usestexldd) {
- shader_addline(buffer, "#extension GL_ARB_shader_texture_lod : enable\n");
- }
- if (GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {
- /* The spec says that it doesn't have to be explicitly enabled, but the nvidia
- * drivers write a warning if we don't do so
- */
- shader_addline(buffer, "#extension GL_ARB_texture_rectangle : enable\n");
- }
-
- /* Base Declarations */
- shader_generate_glsl_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION, args);
-
- /* Pack 3.0 inputs */
- if (reg_maps->shader_version.major >= 3 && args->vp_mode != vertexshader)
- {
- pshader_glsl_input_pack(iface, buffer, This->semantics_in, reg_maps, args->vp_mode);
- }
-
- /* Base Shader Body */
- shader_generate_main((IWineD3DBaseShader *)This, buffer, reg_maps, function);
-
- /* Pixel shaders < 2.0 place the resulting color in R0 implicitly */
- if (reg_maps->shader_version.major < 2)
- {
- /* Some older cards like GeforceFX ones don't support multiple buffers, so also not gl_FragData */
- if(GL_SUPPORT(ARB_DRAW_BUFFERS))
- shader_addline(buffer, "gl_FragData[0] = R0;\n");
- else
- shader_addline(buffer, "gl_FragColor = R0;\n");
- }
-
- if(GL_SUPPORT(ARB_DRAW_BUFFERS)) {
- fragcolor = "gl_FragData[0]";
- } else {
- fragcolor = "gl_FragColor";
- }
- if(args->srgb_correction) {
- shader_addline(buffer, "tmp0.xyz = pow(%s.xyz, vec3(%f, %f, %f)) * vec3(%f, %f, %f) - vec3(%f, %f, %f);\n",
- fragcolor, srgb_pow, srgb_pow, srgb_pow, srgb_mul_high, srgb_mul_high, srgb_mul_high,
- srgb_sub_high, srgb_sub_high, srgb_sub_high);
- shader_addline(buffer, "tmp1.xyz = %s.xyz * srgb_mul_low.xyz;\n", fragcolor);
- shader_addline(buffer, "%s.x = %s.x < srgb_comparison.x ? tmp1.x : tmp0.x;\n", fragcolor, fragcolor);
- shader_addline(buffer, "%s.y = %s.y < srgb_comparison.y ? tmp1.y : tmp0.y;\n", fragcolor, fragcolor);
- shader_addline(buffer, "%s.z = %s.z < srgb_comparison.z ? tmp1.z : tmp0.z;\n", fragcolor, fragcolor);
- shader_addline(buffer, "%s = clamp(%s, 0.0, 1.0);\n", fragcolor, fragcolor);
- }
- /* Pixel shader < 3.0 do not replace the fog stage.
- * This implements linear fog computation and blending.
- * TODO: non linear fog
- * NOTE: gl_Fog.start and gl_Fog.end don't hold fog start s and end e but
- * -1/(e-s) and e/(e-s) respectively.
- */
- if (reg_maps->shader_version.major < 3)
- {
- switch(args->fog) {
- case FOG_OFF: break;
- case FOG_LINEAR:
- shader_addline(buffer, "float fogstart = -1.0 / (gl_Fog.end - gl_Fog.start);\n");
- shader_addline(buffer, "float fogend = gl_Fog.end * -fogstart;\n");
- shader_addline(buffer, "float Fog = clamp(gl_FogFragCoord * fogstart + fogend, 0.0, 1.0);\n");
- shader_addline(buffer, "%s.xyz = mix(gl_Fog.color.xyz, %s.xyz, Fog);\n", fragcolor, fragcolor);
- break;
- case FOG_EXP:
- /* Fog = e^(-gl_Fog.density * gl_FogFragCoord) */
- shader_addline(buffer, "float Fog = exp(-gl_Fog.density * gl_FogFragCoord);\n");
- shader_addline(buffer, "Fog = clamp(Fog, 0.0, 1.0);\n");
- shader_addline(buffer, "%s.xyz = mix(gl_Fog.color.xyz, %s.xyz, Fog);\n", fragcolor, fragcolor);
- break;
- case FOG_EXP2:
- /* Fog = e^(-(gl_Fog.density * gl_FogFragCoord)^2) */
- shader_addline(buffer, "float Fog = exp(-gl_Fog.density * gl_Fog.density * gl_FogFragCoord * gl_FogFragCoord);\n");
- shader_addline(buffer, "Fog = clamp(Fog, 0.0, 1.0);\n");
- shader_addline(buffer, "%s.xyz = mix(gl_Fog.color.xyz, %s.xyz, Fog);\n", fragcolor, fragcolor);
- break;
- }
- }
-
- shader_addline(buffer, "}\n");
-
- TRACE("Compiling shader object %u\n", shader_obj);
- GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL));
- GL_EXTCALL(glCompileShaderARB(shader_obj));
- print_glsl_info_log(&GLINFO_LOCATION, shader_obj);
-
- /* Store the shader object */
- return shader_obj;
-}
-
-static GLuint shader_glsl_generate_vshader(IWineD3DVertexShader *iface,
- SHADER_BUFFER *buffer, const struct vs_compile_args *args)
-{
- IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface;
- const struct shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
- CONST DWORD *function = This->baseShader.function;
- const WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info;
-
- /* Create the hw GLSL shader program and assign it as the shader->prgId */
- GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB));
-
- shader_addline(buffer, "#version 120\n");
-
- /* Base Declarations */
- shader_generate_glsl_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION, NULL);
-
- /* Base Shader Body */
- shader_generate_main((IWineD3DBaseShader*)This, buffer, reg_maps, function);
-
- /* Unpack 3.0 outputs */
- if (reg_maps->shader_version.major >= 3) shader_addline(buffer, "order_ps_input(OUT);\n");
- else shader_addline(buffer, "order_ps_input();\n");
-
- /* The D3DRS_FOGTABLEMODE render state defines if the shader-generated fog coord is used
- * or if the fragment depth is used. If the fragment depth is used(FOGTABLEMODE != NONE),
- * the fog frag coord is thrown away. If the fog frag coord is used, but not written by
- * the shader, it is set to 0.0(fully fogged, since start = 1.0, end = 0.0)
- */
- if(args->fog_src == VS_FOG_Z) {
- shader_addline(buffer, "gl_FogFragCoord = gl_Position.z;\n");
- } else if (!reg_maps->fog) {
- shader_addline(buffer, "gl_FogFragCoord = 0.0;\n");
- }
-
- /* Write the final position.
- *
- * OpenGL coordinates specify the center of the pixel while d3d coords specify
- * the corner. The offsets are stored in z and w in posFixup. posFixup.y contains
- * 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x
- * contains 1.0 to allow a mad.
- */
- shader_addline(buffer, "gl_Position.y = gl_Position.y * posFixup.y;\n");
- shader_addline(buffer, "gl_Position.xy += posFixup.zw * gl_Position.ww;\n");
-
- /* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
- *
- * Basically we want (in homogeneous coordinates) z = z * 2 - 1. However, shaders are run
- * before the homogeneous divide, so we have to take the w into account: z = ((z / w) * 2 - 1) * w,
- * which is the same as z = z * 2 - w.
- */
- shader_addline(buffer, "gl_Position.z = gl_Position.z * 2.0 - gl_Position.w;\n");
-
- shader_addline(buffer, "}\n");
-
- TRACE("Compiling shader object %u\n", shader_obj);
- GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL));
- GL_EXTCALL(glCompileShaderARB(shader_obj));
- print_glsl_info_log(&GLINFO_LOCATION, shader_obj);
-
- return shader_obj;
-}
-
-static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_info, struct shader_caps *pCaps)
+static void shader_glsl_get_caps(WINED3DDEVTYPE devtype,
+ const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
{
/* Nvidia Geforce6/7 or Ati R4xx/R5xx cards with GLSL support, support VS 3.0 but older Nvidia/Ati
- * models with GLSL support only support 2.0. In case of nvidia we can detect VS 2.0 support using
- * vs_nv_version which is based on NV_vertex_program.
+ * models with GLSL support only support 2.0. In case of nvidia we can detect VS 2.0 support based
+ * on the version of NV_vertex_program.
* For Ati cards there's no way using glsl (it abstracts the lowlevel info away) and also not
* using ARB_vertex_program. It is safe to assume that when a card supports pixel shader 2.0 it
* supports vertex shader 2.0 too and the way around. We can detect ps2.0 using the maximum number
* of native instructions, so use that here. For more info see the pixel shader versioning code below.
*/
- if((GLINFO_LOCATION.vs_nv_version == VS_VERSION_20) || (GLINFO_LOCATION.ps_arb_max_instructions <= 512))
+ if ((gl_info->supported[NV_VERTEX_PROGRAM2] && !gl_info->supported[NV_VERTEX_PROGRAM3])
+ || gl_info->ps_arb_max_instructions <= 512)
pCaps->VertexShaderVersion = WINED3DVS_VERSION(2,0);
else
pCaps->VertexShaderVersion = WINED3DVS_VERSION(3,0);
@@ -4255,7 +4603,8 @@ static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *
* of instructions is 512 or less we have to do with ps2.0 hardware.
* NOTE: ps3.0 hardware requires 512 or more instructions but ati and nvidia offer 'enough' (1024 vs 4096) on their most basic ps3.0 hardware.
*/
- if((GLINFO_LOCATION.ps_nv_version == PS_VERSION_20) || (GLINFO_LOCATION.ps_arb_max_instructions <= 512))
+ if ((gl_info->supported[NV_FRAGMENT_PROGRAM] && !gl_info->supported[NV_FRAGMENT_PROGRAM2])
+ || (gl_info->ps_arb_max_instructions <= 512))
pCaps->PixelShaderVersion = WINED3DPS_VERSION(2,0);
else
pCaps->PixelShaderVersion = WINED3DPS_VERSION(3,0);
@@ -4276,6 +4625,8 @@ static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *
*/
pCaps->PixelShader1xMaxValue = 8.0;
TRACE_(d3d_caps)("Hardware pixel shader version %d.%d enabled (GLSL)\n", (pCaps->PixelShaderVersion >> 8) & 0xff, pCaps->PixelShaderVersion & 0xff);
+
+ pCaps->VSClipping = TRUE;
}
static BOOL shader_glsl_color_fixup_supported(struct color_fixup_desc fixup)
@@ -4301,7 +4652,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
{
/* WINED3DSIH_ABS */ shader_glsl_map2gl,
/* WINED3DSIH_ADD */ shader_glsl_arith,
- /* WINED3DSIH_BEM */ pshader_glsl_bem,
+ /* WINED3DSIH_BEM */ shader_glsl_bem,
/* WINED3DSIH_BREAK */ shader_glsl_break,
/* WINED3DSIH_BREAKC */ shader_glsl_breakc,
/* WINED3DSIH_BREAKP */ NULL,
@@ -4314,7 +4665,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
/* WINED3DSIH_DEF */ NULL,
/* WINED3DSIH_DEFB */ NULL,
/* WINED3DSIH_DEFI */ NULL,
- /* WINED3DSIH_DP2ADD */ pshader_glsl_dp2add,
+ /* WINED3DSIH_DP2ADD */ shader_glsl_dp2add,
/* WINED3DSIH_DP3 */ shader_glsl_dot,
/* WINED3DSIH_DP4 */ shader_glsl_dot,
/* WINED3DSIH_DST */ shader_glsl_dst,
@@ -4352,7 +4703,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
/* WINED3DSIH_POW */ shader_glsl_pow,
/* WINED3DSIH_RCP */ shader_glsl_rcp,
/* WINED3DSIH_REP */ shader_glsl_rep,
- /* WINED3DSIH_RET */ NULL,
+ /* WINED3DSIH_RET */ shader_glsl_ret,
/* WINED3DSIH_RSQ */ shader_glsl_rsq,
/* WINED3DSIH_SETP */ NULL,
/* WINED3DSIH_SGE */ shader_glsl_compare,
@@ -4360,32 +4711,49 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
/* WINED3DSIH_SINCOS */ shader_glsl_sincos,
/* WINED3DSIH_SLT */ shader_glsl_compare,
/* WINED3DSIH_SUB */ shader_glsl_arith,
- /* WINED3DSIH_TEX */ pshader_glsl_tex,
- /* WINED3DSIH_TEXBEM */ pshader_glsl_texbem,
- /* WINED3DSIH_TEXBEML */ pshader_glsl_texbem,
- /* WINED3DSIH_TEXCOORD */ pshader_glsl_texcoord,
- /* WINED3DSIH_TEXDEPTH */ pshader_glsl_texdepth,
- /* WINED3DSIH_TEXDP3 */ pshader_glsl_texdp3,
- /* WINED3DSIH_TEXDP3TEX */ pshader_glsl_texdp3tex,
- /* WINED3DSIH_TEXKILL */ pshader_glsl_texkill,
+ /* WINED3DSIH_TEX */ shader_glsl_tex,
+ /* WINED3DSIH_TEXBEM */ shader_glsl_texbem,
+ /* WINED3DSIH_TEXBEML */ shader_glsl_texbem,
+ /* WINED3DSIH_TEXCOORD */ shader_glsl_texcoord,
+ /* WINED3DSIH_TEXDEPTH */ shader_glsl_texdepth,
+ /* WINED3DSIH_TEXDP3 */ shader_glsl_texdp3,
+ /* WINED3DSIH_TEXDP3TEX */ shader_glsl_texdp3tex,
+ /* WINED3DSIH_TEXKILL */ shader_glsl_texkill,
/* WINED3DSIH_TEXLDD */ shader_glsl_texldd,
/* WINED3DSIH_TEXLDL */ shader_glsl_texldl,
- /* WINED3DSIH_TEXM3x2DEPTH */ pshader_glsl_texm3x2depth,
- /* WINED3DSIH_TEXM3x2PAD */ pshader_glsl_texm3x2pad,
- /* WINED3DSIH_TEXM3x2TEX */ pshader_glsl_texm3x2tex,
- /* WINED3DSIH_TEXM3x3 */ pshader_glsl_texm3x3,
+ /* WINED3DSIH_TEXM3x2DEPTH */ shader_glsl_texm3x2depth,
+ /* WINED3DSIH_TEXM3x2PAD */ shader_glsl_texm3x2pad,
+ /* WINED3DSIH_TEXM3x2TEX */ shader_glsl_texm3x2tex,
+ /* WINED3DSIH_TEXM3x3 */ shader_glsl_texm3x3,
/* WINED3DSIH_TEXM3x3DIFF */ NULL,
- /* WINED3DSIH_TEXM3x3PAD */ pshader_glsl_texm3x3pad,
- /* WINED3DSIH_TEXM3x3SPEC */ pshader_glsl_texm3x3spec,
- /* WINED3DSIH_TEXM3x3TEX */ pshader_glsl_texm3x3tex,
- /* WINED3DSIH_TEXM3x3VSPEC */ pshader_glsl_texm3x3vspec,
- /* WINED3DSIH_TEXREG2AR */ pshader_glsl_texreg2ar,
- /* WINED3DSIH_TEXREG2GB */ pshader_glsl_texreg2gb,
- /* WINED3DSIH_TEXREG2RGB */ pshader_glsl_texreg2rgb,
+ /* WINED3DSIH_TEXM3x3PAD */ shader_glsl_texm3x3pad,
+ /* WINED3DSIH_TEXM3x3SPEC */ shader_glsl_texm3x3spec,
+ /* WINED3DSIH_TEXM3x3TEX */ shader_glsl_texm3x3tex,
+ /* WINED3DSIH_TEXM3x3VSPEC */ shader_glsl_texm3x3vspec,
+ /* WINED3DSIH_TEXREG2AR */ shader_glsl_texreg2ar,
+ /* WINED3DSIH_TEXREG2GB */ shader_glsl_texreg2gb,
+ /* WINED3DSIH_TEXREG2RGB */ shader_glsl_texreg2rgb,
};
+static void shader_glsl_handle_instruction(const struct wined3d_shader_instruction *ins) {
+ SHADER_HANDLER hw_fct;
+
+ /* Select handler */
+ hw_fct = shader_glsl_instruction_handler_table[ins->handler_idx];
+
+ /* Unhandled opcode */
+ if (!hw_fct)
+ {
+ FIXME("Backend can't handle opcode %#x\n", ins->handler_idx);
+ return;
+ }
+ hw_fct(ins);
+
+ shader_glsl_add_instruction_modifiers(ins);
+}
+
const shader_backend_t glsl_shader_backend = {
- shader_glsl_instruction_handler_table,
+ shader_glsl_handle_instruction,
shader_glsl_select,
shader_glsl_select_depth_blt,
shader_glsl_deselect_depth_blt,
@@ -4397,9 +4765,6 @@ const shader_backend_t glsl_shader_backend = {
shader_glsl_alloc,
shader_glsl_free,
shader_glsl_dirty_const,
- shader_glsl_generate_pshader,
- shader_glsl_generate_vshader,
shader_glsl_get_caps,
shader_glsl_color_fixup_supported,
- shader_glsl_add_instruction_modifiers,
};
diff --git a/reactos/dll/directx/wine/wined3d/nvidia_texture_shader.c b/reactos/dll/directx/wine/wined3d/nvidia_texture_shader.c
index f7e331de3d4..a0a576be184 100644
--- a/reactos/dll/directx/wine/wined3d/nvidia_texture_shader.c
+++ b/reactos/dll/directx/wine/wined3d/nvidia_texture_shader.c
@@ -29,7 +29,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info
-static void nvts_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+
+/* GL locking for state handlers is done by the caller. */
+
+static void nvts_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
BOOL bumpmap = FALSE;
if(stage > 0 && (stateblock->textureState[stage - 1][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAPLUMINANCE ||
@@ -445,12 +449,12 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX
stage, is_alpha, debug_d3dtop(op), op, arg1, arg2, arg3, texture_idx);
}
- checkGLcall("set_tex_op_nvrc()\n");
-
+ checkGLcall("set_tex_op_nvrc()");
}
-static void nvrc_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void nvrc_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[stage];
BOOL tex_used = stateblock->wineD3DDevice->fixed_function_usage_map & (1 << stage);
@@ -542,7 +546,8 @@ static void nvrc_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3
}
}
-static void nvts_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void nvts_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD sampler = state - STATE_SAMPLER(0);
DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[sampler];
@@ -557,7 +562,8 @@ static void nvts_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
nvts_activate_dimensions(sampler, stateblock, context);
}
-static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[stage + 1];
float mat[2][2];
@@ -584,7 +590,8 @@ static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, Win
}
}
-static void nvrc_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void nvrc_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
float col[4];
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col);
GL_EXTCALL(glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, &col[0]));
@@ -592,9 +599,12 @@ static void nvrc_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
#undef GLINFO_LOCATION
#define GLINFO_LOCATION (*gl_info)
+/* Context activation is done by the caller. */
static void nvrc_enable(IWineD3DDevice *iface, BOOL enable) { }
+/* Context activation is done by the caller. */
static void nvts_enable(IWineD3DDevice *iface, BOOL enable) {
+ ENTER_GL();
if(enable) {
glEnable(GL_TEXTURE_SHADER_NV);
checkGLcall("glEnable(GL_TEXTURE_SHADER_NV)");
@@ -602,9 +612,11 @@ static void nvts_enable(IWineD3DDevice *iface, BOOL enable) {
glDisable(GL_TEXTURE_SHADER_NV);
checkGLcall("glDisable(GL_TEXTURE_SHADER_NV)");
}
+ LEAVE_GL();
}
-static void nvrc_fragment_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_info, struct fragment_caps *pCaps)
+static void nvrc_fragment_get_caps(WINED3DDEVTYPE devtype,
+ const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
{
pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD |
WINED3DTEXOPCAPS_ADDSIGNED |
@@ -659,6 +671,7 @@ static void nvrc_fragment_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info
}
static HRESULT nvrc_fragment_alloc(IWineD3DDevice *iface) { return WINED3D_OK; }
+/* Context activation is done by the caller. */
static void nvrc_fragment_free(IWineD3DDevice *iface) {}
/* Two fixed function pipeline implementations using GL_NV_register_combiners and
@@ -687,137 +700,137 @@ static BOOL nvts_color_fixup_supported(struct color_fixup_desc fixup)
}
static const struct StateEntryTemplate nvrc_fragmentstate_template[] = {
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, 0 },
- { STATE_PIXELSHADER, { STATE_PIXELSHADER, apply_pixelshader }, 0 },
- { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, apply_pixelshader }, 0 },
- { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), nvrc_texfactor }, 0 },
- { STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, 0 },
- { STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, 0 },
- { STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 0 },
- { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 0 },
- { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 0 },
- { STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, 0 },
- { STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, 0 },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_PIXELSHADER, { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), nvrc_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), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 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), state_fogstartend }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), nvts_texdim }, NV_TEXTURE_SHADER2 },
- { STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, 0 },
+ { STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), nvts_texdim }, NV_TEXTURE_SHADER2 },
- { STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, 0 },
+ { STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(2), { STATE_SAMPLER(2), nvts_texdim }, NV_TEXTURE_SHADER2 },
- { STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, 0 },
+ { STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(3), { STATE_SAMPLER(3), nvts_texdim }, NV_TEXTURE_SHADER2 },
- { STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler_texdim }, 0 },
+ { STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(4), { STATE_SAMPLER(4), nvts_texdim }, NV_TEXTURE_SHADER2 },
- { STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler_texdim }, 0 },
+ { STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(5), { STATE_SAMPLER(5), nvts_texdim }, NV_TEXTURE_SHADER2 },
- { STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texdim }, 0 },
+ { STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(6), { STATE_SAMPLER(6), nvts_texdim }, NV_TEXTURE_SHADER2 },
- { STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texdim }, 0 },
+ { STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(7), { STATE_SAMPLER(7), nvts_texdim }, NV_TEXTURE_SHADER2 },
- { STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, 0 },
- {0 /* Terminate */, { 0, 0 }, 0 },
+ { STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, WINED3D_GL_EXT_NONE },
+ {0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE },
};
const struct fragment_pipeline nvts_fragment_pipeline = {
diff --git a/reactos/dll/directx/wine/wined3d/palette.c b/reactos/dll/directx/wine/wined3d/palette.c
index 338e66e0906..a5447d07335 100644
--- a/reactos/dll/directx/wine/wined3d/palette.c
+++ b/reactos/dll/directx/wine/wined3d/palette.c
@@ -22,7 +22,6 @@
#include "winerror.h"
#include "wine/debug.h"
-#include
#include
#include "wined3d_private.h"
@@ -78,7 +77,9 @@ DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags) {
case WINEDDPCAPS_2BIT: return 4;
case WINEDDPCAPS_4BIT: return 16;
case WINEDDPCAPS_8BIT: return 256;
- default: assert(0); return 256;
+ default:
+ FIXME("Unhandled size bits %#x.\n", dwFlags & SIZE_BITS);
+ return 256;
}
}
diff --git a/reactos/dll/directx/wine/wined3d/pixelshader.c b/reactos/dll/directx/wine/wined3d/pixelshader.c
index 33148c8b9b3..6ac145c1ae2 100644
--- a/reactos/dll/directx/wine/wined3d/pixelshader.c
+++ b/reactos/dll/directx/wine/wined3d/pixelshader.c
@@ -178,6 +178,10 @@ static void pshader_set_limits(IWineD3DPixelShaderImpl *This)
This->baseShader.limits.label = 16;
break;
+ case WINED3D_SHADER_VERSION(4,0):
+ FIXME("Using 3.0 limits for 4.0 shader\n");
+ /* Fall through */
+
case WINED3D_SHADER_VERSION(3,0):
This->baseShader.limits.temporary = 32;
This->baseShader.limits.constant_float = 224;
@@ -238,8 +242,9 @@ static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *i
list_init(&This->baseShader.constantsI);
/* Second pass: figure out which registers are used, what the semantics are, etc.. */
- hr = shader_get_registers_used((IWineD3DBaseShader *)This, fe, reg_maps, This->semantics_in, NULL, pFunction,
- GL_LIMITS(pshader_constantsF));
+ hr = shader_get_registers_used((IWineD3DBaseShader *)This, fe,
+ reg_maps, NULL, This->input_signature, NULL,
+ pFunction, GL_LIMITS(pshader_constantsF));
if (FAILED(hr)) return hr;
pshader_set_limits(This);
@@ -294,7 +299,7 @@ static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *i
return WINED3D_OK;
}
-static void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, IWineD3DBaseTexture * const *textures)
+void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, IWineD3DBaseTexture * const *textures)
{
WINED3DSAMPLER_TEXTURE_TYPE *sampler_type = reg_maps->sampler_type;
unsigned int i;
@@ -338,29 +343,6 @@ static void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, IWineD
}
}
-static GLuint pixelshader_compile(IWineD3DPixelShaderImpl *This, const struct ps_compile_args *args)
-{
- CONST DWORD *function = This->baseShader.function;
- GLuint retval;
- SHADER_BUFFER buffer;
- IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device;
-
- TRACE("(%p) : function %p\n", This, function);
-
- pixelshader_update_samplers(&This->baseShader.reg_maps,
- ((IWineD3DDeviceImpl *)This->baseShader.device)->stateBlock->textures);
-
- /* Generate the HW shader */
- TRACE("(%p) : Generating hardware program\n", This);
- This->cur_args = args;
- shader_buffer_init(&buffer);
- retval = device->shader_backend->shader_generate_pshader((IWineD3DPixelShader *)This, &buffer, args);
- shader_buffer_free(&buffer);
- This->cur_args = NULL;
-
- return retval;
-}
-
const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl =
{
/*** IUnknown methods ***/
@@ -439,44 +421,3 @@ void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImp
}
}
}
-
-GLuint find_gl_pshader(IWineD3DPixelShaderImpl *shader, const struct ps_compile_args *args)
-{
- UINT i;
- DWORD new_size;
- struct ps_compiled_shader *new_array;
-
- /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
- * so a linear search is more performant than a hashmap or a binary search
- * (cache coherency etc)
- */
- for(i = 0; i < shader->num_gl_shaders; i++) {
- if(memcmp(&shader->gl_shaders[i].args, args, sizeof(*args)) == 0) {
- return shader->gl_shaders[i].prgId;
- }
- }
-
- TRACE("No matching GL shader found, compiling a new shader\n");
- if(shader->shader_array_size == shader->num_gl_shaders) {
- if (shader->num_gl_shaders)
- {
- new_size = shader->shader_array_size + max(1, shader->shader_array_size / 2);
- new_array = HeapReAlloc(GetProcessHeap(), 0, shader->gl_shaders,
- new_size * sizeof(*shader->gl_shaders));
- } else {
- new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*shader->gl_shaders));
- new_size = 1;
- }
-
- if(!new_array) {
- ERR("Out of memory\n");
- return 0;
- }
- shader->gl_shaders = new_array;
- shader->shader_array_size = new_size;
- }
-
- shader->gl_shaders[shader->num_gl_shaders].args = *args;
- shader->gl_shaders[shader->num_gl_shaders].prgId = pixelshader_compile(shader, args);
- return shader->gl_shaders[shader->num_gl_shaders++].prgId;
-}
diff --git a/reactos/dll/directx/wine/wined3d/query.c b/reactos/dll/directx/wine/wined3d/query.c
index 481177f4e72..2a2c1b1ecb6 100644
--- a/reactos/dll/directx/wine/wined3d/query.c
+++ b/reactos/dll/directx/wine/wined3d/query.c
@@ -62,38 +62,22 @@ static ULONG WINAPI IWineD3DQueryImpl_Release(IWineD3DQuery *iface) {
TRACE("(%p) : Releasing from %d\n", This, This->ref);
ref = InterlockedDecrement(&This->ref);
if (ref == 0) {
- ENTER_GL();
/* Queries are specific to the GL context that created them. Not
* deleting the query will obviously leak it, but that's still better
* than potentially deleting a different query with the same id in this
* context, and (still) leaking the actual query. */
- if(This->type == WINED3DQUERYTYPE_EVENT) {
- if (((WineQueryEventData *)This->extendedData)->ctx != This->wineD3DDevice->activeContext
- || This->wineD3DDevice->activeContext->tid != GetCurrentThreadId())
- {
- FIXME("Query was created in a different context, skipping deletion\n");
- }
- else if(GL_SUPPORT(APPLE_FENCE))
- {
- GL_EXTCALL(glDeleteFencesAPPLE(1, &((WineQueryEventData *)(This->extendedData))->fenceId));
- checkGLcall("glDeleteFencesAPPLE");
- } else if(GL_SUPPORT(NV_FENCE)) {
- GL_EXTCALL(glDeleteFencesNV(1, &((WineQueryEventData *)(This->extendedData))->fenceId));
- checkGLcall("glDeleteFencesNV");
- }
- } else if(This->type == WINED3DQUERYTYPE_OCCLUSION && GL_SUPPORT(ARB_OCCLUSION_QUERY)) {
- if (((WineQueryOcclusionData *)This->extendedData)->ctx != This->wineD3DDevice->activeContext
- || This->wineD3DDevice->activeContext->tid != GetCurrentThreadId())
- {
- FIXME("Query was created in a different context, skipping deletion\n");
- }
- else
- {
- GL_EXTCALL(glDeleteQueriesARB(1, &((WineQueryOcclusionData *)(This->extendedData))->queryId));
- checkGLcall("glDeleteQueriesARB");
- }
+ if (This->type == WINED3DQUERYTYPE_EVENT)
+ {
+ struct wined3d_event_query *query = This->extendedData;
+
+ if (query->context) context_free_event_query(query);
+ }
+ else if (This->type == WINED3DQUERYTYPE_OCCLUSION)
+ {
+ struct wined3d_occlusion_query *query = This->extendedData;
+
+ if (query->context) context_free_occlusion_query(query);
}
- LEAVE_GL();
HeapFree(GetProcessHeap(), 0, This->extendedData);
HeapFree(GetProcessHeap(), 0, This);
@@ -286,7 +270,7 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pDa
static HRESULT WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags) {
IWineD3DQueryImpl *This = (IWineD3DQueryImpl *) iface;
- GLuint queryId = ((WineQueryOcclusionData *)This->extendedData)->queryId;
+ struct wined3d_occlusion_query *query = This->extendedData;
DWORD* data = pData;
GLuint available;
GLuint samples;
@@ -294,6 +278,8 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface,
TRACE("(%p) : type D3DQUERY_OCCLUSION, pData %p, dwSize %#x, dwGetDataFlags %#x\n", This, pData, dwSize, dwGetDataFlags);
+ if (!query->context) This->state = QUERY_CREATED;
+
if (This->state == QUERY_CREATED)
{
/* D3D allows GetData on a new query, OpenGL doesn't. So just invent the data ourselves */
@@ -316,26 +302,27 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface,
return S_OK;
}
- if (((WineQueryOcclusionData *)This->extendedData)->ctx != This->wineD3DDevice->activeContext
- || This->wineD3DDevice->activeContext->tid != GetCurrentThreadId())
+ if (query->context->tid != GetCurrentThreadId())
{
- FIXME("%p Wrong context, returning 1.\n", This);
+ FIXME("%p Wrong thread, returning 1.\n", This);
*data = 1;
return S_OK;
}
+ ActivateContext(This->wineD3DDevice, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+
ENTER_GL();
- GL_EXTCALL(glGetQueryObjectuivARB(queryId, GL_QUERY_RESULT_AVAILABLE_ARB, &available));
- checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT_AVAILABLE)\n");
+ GL_EXTCALL(glGetQueryObjectuivARB(query->id, GL_QUERY_RESULT_AVAILABLE_ARB, &available));
+ checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT_AVAILABLE)");
TRACE("(%p) : available %d.\n", This, available);
if (available)
{
if (data)
{
- GL_EXTCALL(glGetQueryObjectuivARB(queryId, GL_QUERY_RESULT_ARB, &samples));
- checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)\n");
+ GL_EXTCALL(glGetQueryObjectuivARB(query->id, GL_QUERY_RESULT_ARB, &samples));
+ checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)");
TRACE("(%p) : Returning %d samples.\n", This, samples);
*data = samples;
}
@@ -353,32 +340,52 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface,
static HRESULT WINAPI IWineD3DEventQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags) {
IWineD3DQueryImpl *This = (IWineD3DQueryImpl *) iface;
+ struct wined3d_event_query *query = This->extendedData;
BOOL* data = pData;
- WineD3DContext *ctx;
+
TRACE("(%p) : type D3DQUERY_EVENT, pData %p, dwSize %#x, dwGetDataFlags %#x\n", This, pData, dwSize, dwGetDataFlags);
- ctx = ((WineQueryEventData *)This->extendedData)->ctx;
- if(pData == NULL || dwSize == 0) {
- return S_OK;
- } if(ctx != This->wineD3DDevice->activeContext || ctx->tid != GetCurrentThreadId()) {
- /* See comment in IWineD3DQuery::Issue, event query codeblock */
- FIXME("Query context not active, reporting GPU idle\n");
+ if (!pData || !dwSize) return S_OK;
+
+ if (!query->context)
+ {
+ ERR("Query not started, returning TRUE.\n");
*data = TRUE;
- } else if(GL_SUPPORT(APPLE_FENCE)) {
- ENTER_GL();
- *data = GL_EXTCALL(glTestFenceAPPLE(((WineQueryEventData *)This->extendedData)->fenceId));
+
+ return S_OK;
+ }
+
+ if (query->context->tid != GetCurrentThreadId())
+ {
+ /* See comment in IWineD3DQuery::Issue, event query codeblock */
+ FIXME("Wrong thread, reporting GPU idle.\n");
+ *data = TRUE;
+
+ return S_OK;
+ }
+
+ ActivateContext(This->wineD3DDevice, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+
+ ENTER_GL();
+
+ if (GL_SUPPORT(APPLE_FENCE))
+ {
+ *data = GL_EXTCALL(glTestFenceAPPLE(query->id));
checkGLcall("glTestFenceAPPLE");
- LEAVE_GL();
- } else if(GL_SUPPORT(NV_FENCE)) {
- ENTER_GL();
- *data = GL_EXTCALL(glTestFenceNV(((WineQueryEventData *)This->extendedData)->fenceId));
+ }
+ else if (GL_SUPPORT(NV_FENCE))
+ {
+ *data = GL_EXTCALL(glTestFenceNV(query->id));
checkGLcall("glTestFenceNV");
- LEAVE_GL();
- } else {
+ }
+ else
+ {
WARN("(%p): reporting GPU idle\n", This);
*data = TRUE;
}
+ LEAVE_GL();
+
return S_OK;
}
@@ -455,29 +462,47 @@ static HRESULT WINAPI IWineD3DEventQueryImpl_Issue(IWineD3DQuery* iface, DWORD
IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
TRACE("(%p) : dwIssueFlags %#x, type D3DQUERY_EVENT\n", This, dwIssueFlags);
- if (dwIssueFlags & WINED3DISSUE_END) {
- WineD3DContext *ctx = ((WineQueryEventData *)This->extendedData)->ctx;
- if(ctx != This->wineD3DDevice->activeContext || ctx->tid != GetCurrentThreadId()) {
- /* GL fences can be used only from the context that created them,
- * so if a different context is active, don't bother setting the query. The penalty
- * of a context switch is most likely higher than the gain of a correct query result
- *
- * If the query is used from a different thread, don't bother creating a multithread
- * context - there's no point in doing that as the query would be unusable anyway
- */
- WARN("Query context not active\n");
- } else if(GL_SUPPORT(APPLE_FENCE)) {
- ENTER_GL();
- GL_EXTCALL(glSetFenceAPPLE(((WineQueryEventData *)This->extendedData)->fenceId));
- checkGLcall("glSetFenceAPPLE");
- LEAVE_GL();
- } else if (GL_SUPPORT(NV_FENCE)) {
- ENTER_GL();
- GL_EXTCALL(glSetFenceNV(((WineQueryEventData *)This->extendedData)->fenceId, GL_ALL_COMPLETED_NV));
- checkGLcall("glSetFenceNV");
- LEAVE_GL();
+ if (dwIssueFlags & WINED3DISSUE_END)
+ {
+ struct wined3d_event_query *query = This->extendedData;
+ struct wined3d_context *context;
+
+ if (query->context)
+ {
+ if (query->context->tid != GetCurrentThreadId())
+ {
+ context_free_event_query(query);
+ context = ActivateContext(This->wineD3DDevice, NULL, CTXUSAGE_RESOURCELOAD);
+ context_alloc_event_query(context, query);
+ }
+ else
+ {
+ ActivateContext(This->wineD3DDevice, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ }
}
- } else if(dwIssueFlags & WINED3DISSUE_BEGIN) {
+ else
+ {
+ context = ActivateContext(This->wineD3DDevice, NULL, CTXUSAGE_RESOURCELOAD);
+ context_alloc_event_query(context, query);
+ }
+
+ ENTER_GL();
+
+ if (GL_SUPPORT(APPLE_FENCE))
+ {
+ GL_EXTCALL(glSetFenceAPPLE(query->id));
+ checkGLcall("glSetFenceAPPLE");
+ }
+ else if (GL_SUPPORT(NV_FENCE))
+ {
+ GL_EXTCALL(glSetFenceNV(query->id, GL_ALL_COMPLETED_NV));
+ checkGLcall("glSetFenceNV");
+ }
+
+ LEAVE_GL();
+ }
+ else if(dwIssueFlags & WINED3DISSUE_BEGIN)
+ {
/* Started implicitly at device creation */
ERR("Event query issued with START flag - what to do?\n");
}
@@ -494,35 +519,68 @@ static HRESULT WINAPI IWineD3DEventQueryImpl_Issue(IWineD3DQuery* iface, DWORD
static HRESULT WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface, DWORD dwIssueFlags) {
IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
- if (GL_SUPPORT(ARB_OCCLUSION_QUERY)) {
- WineD3DContext *ctx = ((WineQueryOcclusionData *)This->extendedData)->ctx;
+ if (GL_SUPPORT(ARB_OCCLUSION_QUERY))
+ {
+ struct wined3d_occlusion_query *query = This->extendedData;
+ struct wined3d_context *context;
+
+ /* This is allowed according to msdn and our tests. Reset the query and restart */
+ if (dwIssueFlags & WINED3DISSUE_BEGIN)
+ {
+ if (This->state == QUERY_BUILDING)
+ {
+ if (query->context->tid != GetCurrentThreadId())
+ {
+ FIXME("Wrong thread, can't restart query.\n");
+
+ context_free_occlusion_query(query);
+ context = ActivateContext(This->wineD3DDevice, NULL, CTXUSAGE_RESOURCELOAD);
+ context_alloc_occlusion_query(context, query);
+ }
+ else
+ {
+ ActivateContext(This->wineD3DDevice, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+
+ ENTER_GL();
+ GL_EXTCALL(glEndQueryARB(GL_SAMPLES_PASSED_ARB));
+ checkGLcall("glEndQuery()");
+ LEAVE_GL();
+ }
+ }
+ else
+ {
+ if (query->context) context_free_occlusion_query(query);
+ context = ActivateContext(This->wineD3DDevice, NULL, CTXUSAGE_RESOURCELOAD);
+ context_alloc_occlusion_query(context, query);
+ }
- if(ctx != This->wineD3DDevice->activeContext || ctx->tid != GetCurrentThreadId()) {
- FIXME("Not the owning context, can't start query\n");
- } else {
ENTER_GL();
- /* This is allowed according to msdn and our tests. Reset the query and restart */
- if (dwIssueFlags & WINED3DISSUE_BEGIN) {
- if(This->state == QUERY_BUILDING) {
- GL_EXTCALL(glEndQueryARB(GL_SAMPLES_PASSED_ARB));
- checkGLcall("glEndQuery()");
- }
-
- GL_EXTCALL(glBeginQueryARB(GL_SAMPLES_PASSED_ARB, ((WineQueryOcclusionData *)This->extendedData)->queryId));
- checkGLcall("glBeginQuery()");
- }
- if (dwIssueFlags & WINED3DISSUE_END) {
- /* Msdn says _END on a non-building occlusion query returns an error, but
- * our tests show that it returns OK. But OpenGL doesn't like it, so avoid
- * generating an error
- */
- if(This->state == QUERY_BUILDING) {
- GL_EXTCALL(glEndQueryARB(GL_SAMPLES_PASSED_ARB));
- checkGLcall("glEndQuery()");
- }
- }
+ GL_EXTCALL(glBeginQueryARB(GL_SAMPLES_PASSED_ARB, query->id));
+ checkGLcall("glBeginQuery()");
LEAVE_GL();
}
+ if (dwIssueFlags & WINED3DISSUE_END) {
+ /* Msdn says _END on a non-building occlusion query returns an error, but
+ * our tests show that it returns OK. But OpenGL doesn't like it, so avoid
+ * generating an error
+ */
+ if (This->state == QUERY_BUILDING)
+ {
+ if (query->context->tid != GetCurrentThreadId())
+ {
+ FIXME("Wrong thread, can't end query.\n");
+ }
+ else
+ {
+ ActivateContext(This->wineD3DDevice, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+
+ ENTER_GL();
+ GL_EXTCALL(glEndQueryARB(GL_SAMPLES_PASSED_ARB));
+ checkGLcall("glEndQuery()");
+ LEAVE_GL();
+ }
+ }
+ }
} else {
FIXME("(%p) : Occlusion queries not supported\n", This);
}
diff --git a/reactos/dll/directx/wine/wined3d/resource.c b/reactos/dll/directx/wine/wined3d/resource.c
index 807240bb333..89ea7f3794d 100644
--- a/reactos/dll/directx/wine/wined3d/resource.c
+++ b/reactos/dll/directx/wine/wined3d/resource.c
@@ -26,10 +26,12 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-HRESULT resource_init(struct IWineD3DResourceClass *resource, WINED3DRESOURCETYPE resource_type,
+HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type,
IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
WINED3DPOOL pool, IUnknown *parent)
{
+ struct IWineD3DResourceClass *resource = &((IWineD3DResourceImpl *)iface)->resource;
+
resource->wineD3DDevice = device;
resource->parent = parent;
resource->resourceType = resource_type;
@@ -68,6 +70,8 @@ HRESULT resource_init(struct IWineD3DResourceClass *resource, WINED3DRESOURCETYP
WineD3DAdapterChangeGLRam(device, size);
}
+ device_resource_add(device, iface);
+
return WINED3D_OK;
}
@@ -96,10 +100,7 @@ void resource_cleanup(IWineD3DResource *iface)
This->resource.allocatedMemory = 0;
This->resource.heapMemory = 0;
- if (This->resource.wineD3DDevice != NULL) {
- IWineD3DDevice_ResourceReleased((IWineD3DDevice *)This->resource.wineD3DDevice, iface);
- }/* NOTE: this is not really an error for system memory resources */
- return;
+ if (This->resource.wineD3DDevice) device_resource_released(This->resource.wineD3DDevice, iface);
}
HRESULT resource_get_device(IWineD3DResource *iface, IWineD3DDevice** ppDevice)
diff --git a/reactos/dll/directx/wine/wined3d/shader_sm1.c b/reactos/dll/directx/wine/wined3d/shader_sm1.c
index a626d52a763..ead2769e34c 100644
--- a/reactos/dll/directx/wine/wined3d/shader_sm1.c
+++ b/reactos/dll/directx/wine/wined3d/shader_sm1.c
@@ -349,6 +349,7 @@ static void shader_parse_src_param(DWORD param, const struct wined3d_shader_src_
src->reg.type = ((param & WINED3DSP_REGTYPE_MASK) >> WINED3DSP_REGTYPE_SHIFT)
| ((param & WINED3DSP_REGTYPE_MASK2) >> WINED3DSP_REGTYPE_SHIFT2);
src->reg.idx = param & WINED3DSP_REGNUM_MASK;
+ src->reg.array_idx = ~0U;
src->swizzle = (param & WINED3DSP_SWIZZLE_MASK) >> WINED3DSP_SWIZZLE_SHIFT;
src->modifiers = (param & WINED3DSP_SRCMOD_MASK) >> WINED3DSP_SRCMOD_SHIFT;
src->reg.rel_addr = rel_addr;
@@ -360,6 +361,7 @@ static void shader_parse_dst_param(DWORD param, const struct wined3d_shader_src_
dst->reg.type = ((param & WINED3DSP_REGTYPE_MASK) >> WINED3DSP_REGTYPE_SHIFT)
| ((param & WINED3DSP_REGTYPE_MASK2) >> WINED3DSP_REGTYPE_SHIFT2);
dst->reg.idx = param & WINED3DSP_REGNUM_MASK;
+ dst->reg.array_idx = ~0U;
dst->write_mask = (param & WINED3D_SM1_WRITEMASK_MASK) >> WINED3D_SM1_WRITEMASK_SHIFT;
dst->modifiers = (param & WINED3DSP_DSTMOD_MASK) >> WINED3DSP_DSTMOD_SHIFT;
dst->shift = (param & WINED3DSP_DSTSHIFT_MASK) >> WINED3DSP_DSTSHIFT_SHIFT;
diff --git a/reactos/dll/directx/wine/wined3d/shader_sm4.c b/reactos/dll/directx/wine/wined3d/shader_sm4.c
index 5cc445db69a..91aa882c888 100644
--- a/reactos/dll/directx/wine/wined3d/shader_sm4.c
+++ b/reactos/dll/directx/wine/wined3d/shader_sm4.c
@@ -28,6 +28,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
#define WINED3D_SM4_OPCODE_MASK 0xff
+#define WINED3D_SM4_REGISTER_ORDER_SHIFT 20
+#define WINED3D_SM4_REGISTER_ORDER_MASK (0x3 << WINED3D_SM4_REGISTER_ORDER_SHIFT)
+
#define WINED3D_SM4_REGISTER_TYPE_SHIFT 12
#define WINED3D_SM4_REGISTER_TYPE_MASK (0xf << WINED3D_SM4_REGISTER_TYPE_SHIFT)
@@ -46,19 +49,26 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
enum wined3d_sm4_opcode
{
WINED3D_SM4_OP_ADD = 0x00,
+ WINED3D_SM4_OP_DP3 = 0x10,
+ WINED3D_SM4_OP_DP4 = 0x11,
WINED3D_SM4_OP_EXP = 0x19,
+ WINED3D_SM4_OP_LOG = 0x2f,
+ WINED3D_SM4_OP_MIN = 0x33,
+ WINED3D_SM4_OP_MAX = 0x34,
WINED3D_SM4_OP_MOV = 0x36,
WINED3D_SM4_OP_MUL = 0x38,
WINED3D_SM4_OP_RET = 0x3e,
+ WINED3D_SM4_OP_RSQ = 0x44,
WINED3D_SM4_OP_SINCOS = 0x4d,
};
enum wined3d_sm4_register_type
{
- WINED3D_SM4_RT_TEMP = 0x0,
- WINED3D_SM4_RT_INPUT = 0x1,
- WINED3D_SM4_RT_OUTPUT = 0x2,
- WINED3D_SM4_RT_IMMCONST = 0x4,
+ WINED3D_SM4_RT_TEMP = 0x0,
+ WINED3D_SM4_RT_INPUT = 0x1,
+ WINED3D_SM4_RT_OUTPUT = 0x2,
+ WINED3D_SM4_RT_IMMCONST = 0x4,
+ WINED3D_SM4_RT_CONSTBUFFER = 0x8,
};
enum wined3d_sm4_immconst_type
@@ -92,20 +102,30 @@ struct sysval_map
static const struct wined3d_sm4_opcode_info opcode_table[] =
{
{WINED3D_SM4_OP_ADD, WINED3DSIH_ADD, 1, 2},
+ {WINED3D_SM4_OP_DP3, WINED3DSIH_DP3, 1, 2},
+ {WINED3D_SM4_OP_DP4, WINED3DSIH_DP4, 1, 2},
{WINED3D_SM4_OP_EXP, WINED3DSIH_EXP, 1, 1},
+ {WINED3D_SM4_OP_LOG, WINED3DSIH_LOG, 1, 1},
+ {WINED3D_SM4_OP_MIN, WINED3DSIH_MIN, 1, 2},
+ {WINED3D_SM4_OP_MAX, WINED3DSIH_MAX, 1, 2},
{WINED3D_SM4_OP_MOV, WINED3DSIH_MOV, 1, 1},
{WINED3D_SM4_OP_MUL, WINED3DSIH_MUL, 1, 2},
{WINED3D_SM4_OP_RET, WINED3DSIH_RET, 0, 0},
+ {WINED3D_SM4_OP_RSQ, WINED3DSIH_RSQ, 1, 1},
{WINED3D_SM4_OP_SINCOS, WINED3DSIH_SINCOS, 1, 2},
};
static const WINED3DSHADER_PARAM_REGISTER_TYPE register_type_table[] =
{
- /* WINED3D_SM4_RT_TEMP */ WINED3DSPR_TEMP,
- /* WINED3D_SM4_RT_INPUT */ WINED3DSPR_INPUT,
- /* WINED3D_SM4_RT_OUTPUT */ WINED3DSPR_OUTPUT,
- /* UNKNOWN */ 0,
- /* WINED3D_SM4_RT_IMMCONST */ WINED3DSPR_IMMCONST,
+ /* WINED3D_SM4_RT_TEMP */ WINED3DSPR_TEMP,
+ /* WINED3D_SM4_RT_INPUT */ WINED3DSPR_INPUT,
+ /* WINED3D_SM4_RT_OUTPUT */ WINED3DSPR_OUTPUT,
+ /* UNKNOWN */ 0,
+ /* WINED3D_SM4_RT_IMMCONST */ WINED3DSPR_IMMCONST,
+ /* UNKNOWN */ 0,
+ /* UNKNOWN */ 0,
+ /* UNKNOWN */ 0,
+ /* WINED3D_SM4_RT_CONSTBUFFER */ WINED3DSPR_CONSTBUFFER,
};
static const struct sysval_map sysval_map[] =
@@ -265,6 +285,7 @@ static void shader_sm4_read_src_param(void *data, const DWORD **ptr, struct wine
struct wined3d_sm4_data *priv = data;
DWORD token = *(*ptr)++;
enum wined3d_sm4_register_type register_type;
+ DWORD order;
register_type = (token & WINED3D_SM4_REGISTER_TYPE_MASK) >> WINED3D_SM4_REGISTER_TYPE_SHIFT;
if (register_type >= sizeof(register_type_table) / sizeof(*register_type_table))
@@ -277,6 +298,16 @@ static void shader_sm4_read_src_param(void *data, const DWORD **ptr, struct wine
src_param->reg.type = register_type_table[register_type];
}
+ order = (token & WINED3D_SM4_REGISTER_ORDER_MASK) >> WINED3D_SM4_REGISTER_ORDER_SHIFT;
+
+ if (order < 1) src_param->reg.idx = ~0U;
+ else src_param->reg.idx = *(*ptr)++;
+
+ if (order < 2) src_param->reg.array_idx = ~0U;
+ else src_param->reg.array_idx = *(*ptr)++;
+
+ if (order > 2) FIXME("Unhandled order %u.\n", order);
+
if (register_type == WINED3D_SM4_RT_IMMCONST)
{
enum wined3d_sm4_immconst_type immconst_type =
@@ -304,7 +335,6 @@ static void shader_sm4_read_src_param(void *data, const DWORD **ptr, struct wine
}
else
{
- src_param->reg.idx = *(*ptr)++;
src_param->swizzle = (token & WINED3D_SM4_SWIZZLE_MASK) >> WINED3D_SM4_SWIZZLE_SHIFT;
}
@@ -319,8 +349,8 @@ static void shader_sm4_read_dst_param(void *data, const DWORD **ptr, struct wine
{
struct wined3d_sm4_data *priv = data;
DWORD token = *(*ptr)++;
- UINT register_idx = *(*ptr)++;
enum wined3d_sm4_register_type register_type;
+ DWORD order;
register_type = (token & WINED3D_SM4_REGISTER_TYPE_MASK) >> WINED3D_SM4_REGISTER_TYPE_SHIFT;
if (register_type >= sizeof(register_type_table) / sizeof(*register_type_table))
@@ -333,7 +363,16 @@ static void shader_sm4_read_dst_param(void *data, const DWORD **ptr, struct wine
dst_param->reg.type = register_type_table[register_type];
}
- dst_param->reg.idx = register_idx;
+ order = (token & WINED3D_SM4_REGISTER_ORDER_MASK) >> WINED3D_SM4_REGISTER_ORDER_SHIFT;
+
+ if (order < 1) dst_param->reg.idx = ~0U;
+ else dst_param->reg.idx = *(*ptr)++;
+
+ if (order < 2) dst_param->reg.array_idx = ~0U;
+ else dst_param->reg.array_idx = *(*ptr)++;
+
+ if (order > 2) FIXME("Unhandled order %u.\n", order);
+
dst_param->write_mask = (token & WINED3D_SM4_WRITEMASK_MASK) >> WINED3D_SM4_WRITEMASK_SHIFT;
dst_param->modifiers = 0;
dst_param->shift = 0;
diff --git a/reactos/dll/directx/wine/wined3d/state.c b/reactos/dll/directx/wine/wined3d/state.c
index ad1593c7196..2df21addfcf 100644
--- a/reactos/dll/directx/wine/wined3d/state.c
+++ b/reactos/dll/directx/wine/wined3d/state.c
@@ -34,11 +34,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
WINE_DECLARE_DEBUG_CHANNEL(d3d_shader);
-#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info
+#define GLINFO_LOCATION (*context->gl_info)
-static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context);
+/* GL locking for state handlers is done by the caller. */
-static void state_nogl(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context);
+
+static void state_nogl(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
/* Used for states which are not mapped to a gl state as-is, but used somehow different,
* e.g as a parameter for drawing, or which are unimplemented in windows d3d
*/
@@ -51,15 +54,13 @@ static void state_nogl(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DC
}
}
-static void state_undefined(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
- /* Print a WARN, this allows the stateblock code to loop over all states to generate a display
- * list without causing confusing terminal output. Deliberately no special debug name here
- * because its undefined.
- */
- WARN("undefined state %d\n", state);
+static void state_undefined(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ ERR("Undefined state.\n");
}
-static void state_fillmode(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_fillmode(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
WINED3DFILLMODE Value = stateblock->renderState[WINED3DRS_FILLMODE];
switch(Value) {
@@ -80,7 +81,8 @@ static void state_fillmode(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
}
}
-static void state_lighting(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_lighting(DWORD state, IWineD3DStateBlockImpl *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
@@ -102,7 +104,8 @@ static void state_lighting(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
}
}
-static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
/* No z test without depth stencil buffers */
if(stateblock->wineD3DDevice->stencilBufferTarget == NULL) {
TRACE("No Z buffer - disabling depth test\n");
@@ -130,7 +133,8 @@ static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD
}
}
-static void state_cullmode(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_cullmode(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
/* glFrontFace() is set in context.c at context init and on an offscreen / onscreen rendering
* switch
*/
@@ -156,7 +160,8 @@ static void state_cullmode(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
}
}
-static void state_shademode(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_shademode(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
switch ((WINED3DSHADEMODE) stateblock->renderState[WINED3DRS_SHADEMODE]) {
case WINED3DSHADE_FLAT:
glShadeModel(GL_FLAT);
@@ -174,7 +179,8 @@ static void state_shademode(DWORD state, IWineD3DStateBlockImpl *stateblock, Win
}
}
-static void state_ditherenable(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_ditherenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if (stateblock->renderState[WINED3DRS_DITHERENABLE]) {
glEnable(GL_DITHER);
checkGLcall("glEnable GL_DITHER");
@@ -184,7 +190,8 @@ static void state_ditherenable(DWORD state, IWineD3DStateBlockImpl *stateblock,
}
}
-static void state_zwritenable(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_zwritenable(DWORD state, IWineD3DStateBlockImpl *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
*/
@@ -197,7 +204,8 @@ static void state_zwritenable(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void state_zfunc(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_zfunc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
int glParm = CompareFunc(stateblock->renderState[WINED3DRS_ZFUNC]);
if(glParm) {
@@ -220,7 +228,8 @@ static void state_zfunc(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
}
}
-static void state_ambient(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_ambient(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
float col[4];
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_AMBIENT], col);
@@ -229,7 +238,8 @@ static void state_ambient(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD
checkGLcall("glLightModel for MODEL_AMBIENT");
}
-static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
int srcBlend = GL_ZERO;
int dstBlend = GL_ZERO;
IWineD3DSurfaceImpl *target = (IWineD3DSurfaceImpl *) stateblock->wineD3DDevice->render_targets[0];
@@ -441,11 +451,13 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
}
}
-static void state_blendfactor_w(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_blendfactor_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
WARN("Unsupported in local OpenGL implementation: glBlendColorEXT\n");
}
-static void state_blendfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_blendfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
float col[4];
TRACE("Setting BlendFactor to %d\n", stateblock->renderState[WINED3DRS_BLENDFACTOR]);
@@ -454,7 +466,8 @@ static void state_blendfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, W
checkGLcall("glBlendColor");
}
-static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
int glParm = 0;
float ref;
BOOL enable_ckey = FALSE;
@@ -508,7 +521,7 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
if(stateblock->renderState[WINED3DRS_COLORKEYENABLE] && enable_ckey) {
glParm = GL_NOTEQUAL;
- ref = 0.0;
+ ref = 0.0f;
} else {
ref = ((float) stateblock->renderState[WINED3DRS_ALPHAREF]) / 255.0f;
glParm = CompareFunc(stateblock->renderState[WINED3DRS_ALPHAFUNC]);
@@ -519,11 +532,12 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
}
}
-static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD enable = 0xFFFFFFFF;
DWORD disable = 0x00000000;
- if (use_vs(stateblock))
+ if (!stateblock->wineD3DDevice->vs_clipping && use_vs(stateblock))
{
/* 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
@@ -550,16 +564,18 @@ static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
if (stateblock->renderState[WINED3DRS_CLIPPING]) {
enable = stateblock->renderState[WINED3DRS_CLIPPLANEENABLE];
disable = ~stateblock->renderState[WINED3DRS_CLIPPLANEENABLE];
- if(GL_SUPPORT(NV_DEPTH_CLAMP)) {
- glDisable(GL_DEPTH_CLAMP_NV);
- checkGLcall("glDisable(GL_DEPTH_CLAMP_NV)");
+ if (GL_SUPPORT(ARB_DEPTH_CLAMP))
+ {
+ glDisable(GL_DEPTH_CLAMP);
+ checkGLcall("glDisable(GL_DEPTH_CLAMP)");
}
} else {
disable = 0xffffffff;
enable = 0x00;
- if(GL_SUPPORT(NV_DEPTH_CLAMP)) {
- glEnable(GL_DEPTH_CLAMP_NV);
- checkGLcall("glEnable(GL_DEPTH_CLAMP_NV)");
+ if (GL_SUPPORT(ARB_DEPTH_CLAMP))
+ {
+ glEnable(GL_DEPTH_CLAMP);
+ checkGLcall("glEnable(GL_DEPTH_CLAMP)");
}
}
@@ -587,11 +603,13 @@ static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
}
}
-static void state_blendop_w(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_blendop_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
WARN("Unsupported in local OpenGL implementation: glBlendEquation\n");
}
-static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
int blendEquation = GL_FUNC_ADD;
int blendEquationAlpha = GL_FUNC_ADD;
@@ -632,8 +650,8 @@ static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD
}
}
-static void
-state_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
/* 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:
@@ -732,7 +750,8 @@ state_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCon
checkGLcall("glMaterialfv(GL_EMISSION)");
}
-static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
unsigned int i;
/* Note the texture color applies to all textures whereas
@@ -754,8 +773,9 @@ static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, Win
}
}
-static void
-renderstate_stencil_twosided(IWineD3DStateBlockImpl *stateblock, GLint face, GLint func, GLint ref, GLuint mask, GLint stencilFail, GLint depthFail, GLint stencilPass ) {
+static void renderstate_stencil_twosided(struct wined3d_context *context, GLint face,
+ GLint func, GLint ref, GLuint mask, GLint stencilFail, GLint depthFail, GLint stencilPass)
+{
glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);
checkGLcall("glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT)");
GL_EXTCALL(glActiveStencilFaceEXT(face));
@@ -766,8 +786,8 @@ renderstate_stencil_twosided(IWineD3DStateBlockImpl *stateblock, GLint face, GLi
checkGLcall("glStencilOp(...)");
}
-static void
-state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD onesided_enable = FALSE;
DWORD twosided_enable = FALSE;
GLint func = GL_ALWAYS;
@@ -821,10 +841,10 @@ state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *c
* and other stencil functions which do not use two sided stencil do not have
* to set it back
*/
- renderstate_stencil_twosided(stateblock, GL_BACK, func_ccw, ref, mask,
- stencilFail_ccw, depthFail_ccw, stencilPass_ccw);
- renderstate_stencil_twosided(stateblock, GL_FRONT, func, ref, mask,
- stencilFail, depthFail, stencilPass);
+ 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_SUPPORT(ATI_SEPARATE_STENCIL)) {
GL_EXTCALL(glStencilFuncSeparateATI(func, func_ccw, ref, mask));
checkGLcall("glStencilFuncSeparateATI(...)");
@@ -856,7 +876,8 @@ state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *c
}
}
-static void state_stencilwrite2s(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_stencilwrite2s(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD mask;
if(stateblock->wineD3DDevice->stencilBufferTarget) {
@@ -874,7 +895,8 @@ static void state_stencilwrite2s(DWORD state, IWineD3DStateBlockImpl *stateblock
glStencilMask(mask);
}
-static void state_stencilwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_stencilwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD mask;
if(stateblock->wineD3DDevice->stencilBufferTarget) {
@@ -887,7 +909,8 @@ static void state_stencilwrite(DWORD state, IWineD3DStateBlockImpl *stateblock,
checkGLcall("glStencilMask");
}
-static void state_fog_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_fog_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context);
@@ -924,7 +947,8 @@ static void state_fog_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock
}
}
-void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
float fogstart, fogend;
union {
DWORD d;
@@ -933,13 +957,13 @@ void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DC
switch(context->fog_source) {
case FOGSOURCE_VS:
- fogstart = 1.0;
- fogend = 0.0;
+ fogstart = 1.0f;
+ fogend = 0.0f;
break;
case FOGSOURCE_COORD:
- fogstart = 255.0;
- fogend = 0.0;
+ fogstart = 255.0f;
+ fogend = 0.0f;
break;
case FOGSOURCE_FFP:
@@ -949,8 +973,8 @@ void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DC
fogend = tmpvalue.f;
/* In GL, fogstart == fogend disables fog, in D3D everything's fogged.*/
if(fogstart == fogend) {
- fogstart = -1.0 / 0.0;
- fogend = 0.0;
+ fogstart = -1.0f / 0.0f;
+ fogend = 0.0f;
}
break;
@@ -959,8 +983,8 @@ void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DC
* Still this is needed to make the compiler happy
*/
ERR("Unexpected fog coordinate source\n");
- fogstart = 0.0;
- fogend = 0.0;
+ fogstart = 0.0f;
+ fogend = 0.0f;
}
glFogf(GL_FOG_START, fogstart);
@@ -972,7 +996,8 @@ void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DC
TRACE("Fog End == %f\n", fogend);
}
-void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
enum fogsource new_source;
TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context);
@@ -1113,13 +1138,15 @@ void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
}
}
-static void state_rangefog_w(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_rangefog_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_RANGEFOGENABLE]) {
WARN("Range fog enabled, but not supported by this opengl implementation\n");
}
}
-static void state_rangefog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_rangefog(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_RANGEFOGENABLE]) {
glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_RADIAL_NV);
checkGLcall("glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_RADIAL_NV)");
@@ -1129,14 +1156,16 @@ static void state_rangefog(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
}
}
-void state_fogcolor(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+void state_fogcolor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
float col[4];
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_FOGCOLOR], col);
glFogfv(GL_FOG_COLOR, &col[0]);
checkGLcall("glFog GL_FOG_COLOR");
}
-void state_fogdensity(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+void state_fogdensity(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
union {
DWORD d;
float f;
@@ -1146,11 +1175,10 @@ void state_fogdensity(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
checkGLcall("glFogf(GL_FOG_DENSITY, (float) Value)");
}
-static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
GLenum Parm = 0;
- const struct wined3d_stream_info_element *diffuse = &device->strided_streams.elements[WINED3D_FFP_DIFFUSE];
- BOOL isDiffuseSupplied;
/* 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.
@@ -1160,10 +1188,10 @@ static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
return;
}
- isDiffuseSupplied = diffuse->data || diffuse->buffer_object;
-
context->num_untracked_materials = 0;
- if (isDiffuseSupplied && stateblock->renderState[WINED3DRS_COLORVERTEX]) {
+ if ((device->strided_streams.use_map & (1 << WINED3D_FFP_DIFFUSE))
+ && stateblock->renderState[WINED3DRS_COLORVERTEX])
+ {
TRACE("diff %d, amb %d, emis %d, spec %d\n",
stateblock->renderState[WINED3DRS_DIFFUSEMATERIALSOURCE],
stateblock->renderState[WINED3DRS_AMBIENTMATERIALSOURCE],
@@ -1258,7 +1286,8 @@ static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
context->tracking_parm = Parm;
}
-static void state_linepattern(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_linepattern(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
union {
DWORD d;
WINED3DLINEPATTERN lp;
@@ -1278,7 +1307,8 @@ static void state_linepattern(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void state_zbias(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_zbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
union {
DWORD d;
float f;
@@ -1306,7 +1336,8 @@ static void state_zbias(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
}
-static void state_normalize(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_normalize(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(isStateDirty(context, STATE_VDECL)) {
return;
}
@@ -1315,8 +1346,7 @@ static void state_normalize(DWORD state, IWineD3DStateBlockImpl *stateblock, Win
* by zero and is not properly defined in opengl, so avoid it
*/
if (stateblock->renderState[WINED3DRS_NORMALIZENORMALS]
- && (stateblock->wineD3DDevice->strided_streams.elements[WINED3D_FFP_NORMAL].data
- || stateblock->wineD3DDevice->strided_streams.elements[WINED3D_FFP_NORMAL].buffer_object))
+ && (stateblock->wineD3DDevice->strided_streams.use_map & (1 << WINED3D_FFP_NORMAL)))
{
glEnable(GL_NORMALIZE);
checkGLcall("glEnable(GL_NORMALIZE);");
@@ -1326,24 +1356,28 @@ static void state_normalize(DWORD state, IWineD3DStateBlockImpl *stateblock, Win
}
}
-static void state_psizemin_w(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_psizemin_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
union {
DWORD d;
float f;
} tmpvalue;
tmpvalue.d = stateblock->renderState[WINED3DRS_POINTSIZE_MIN];
- if(tmpvalue.f != 1.0) {
+ if (tmpvalue.f != 1.0f)
+ {
FIXME("WINED3DRS_POINTSIZE_MIN not supported on this opengl, value is %f\n", tmpvalue.f);
}
tmpvalue.d = stateblock->renderState[WINED3DRS_POINTSIZE_MAX];
- if(tmpvalue.f != 64.0) {
+ 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, WineD3DContext *context) {
+static void state_psizemin_ext(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
union {
DWORD d;
float f;
@@ -1363,7 +1397,8 @@ static void state_psizemin_ext(DWORD state, IWineD3DStateBlockImpl *stateblock,
checkGLcall("glPointParameterfEXT(...)");
}
-static void state_psizemin_arb(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_psizemin_arb(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
union {
DWORD d;
float f;
@@ -1383,7 +1418,8 @@ static void state_psizemin_arb(DWORD state, IWineD3DStateBlockImpl *stateblock,
checkGLcall("glPointParameterfARB(...)");
}
-static void state_pscale(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_pscale(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
/* TODO: Group this with the viewport */
/*
* POINTSCALEENABLE controls how point size value is treated. If set to
@@ -1453,7 +1489,13 @@ static void state_pscale(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3
checkGLcall("glPointSize(...);");
}
-static void state_colorwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_debug_monitor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ WARN("token: %#x\n", stateblock->renderState[WINED3DRS_DEBUGMONITORTOKEN]);
+}
+
+static void state_colorwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD Value = stateblock->renderState[WINED3DRS_COLORWRITEENABLE];
TRACE("Color mask: r(%d) g(%d) b(%d) a(%d)\n",
@@ -1478,7 +1520,8 @@ static void state_colorwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, Wi
}
}
-static void state_localviewer(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_localviewer(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_LOCALVIEWER]) {
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
checkGLcall("glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1)");
@@ -1488,7 +1531,8 @@ static void state_localviewer(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void state_lastpixel(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_lastpixel(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_LASTPIXEL]) {
TRACE("Last Pixel Drawing Enabled\n");
} else {
@@ -1502,7 +1546,8 @@ static void state_lastpixel(DWORD state, IWineD3DStateBlockImpl *stateblock, Win
}
}
-static void state_pointsprite_w(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_pointsprite_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
BOOL warned = FALSE;
/* TODO: NV_POINT_SPRITE */
if (!warned && stateblock->renderState[WINED3DRS_POINTSPRITEENABLE]) {
@@ -1512,7 +1557,8 @@ static void state_pointsprite_w(DWORD state, IWineD3DStateBlockImpl *stateblock,
}
}
-static void state_pointsprite(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_pointsprite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if (stateblock->renderState[WINED3DRS_POINTSPRITEENABLE]) {
BOOL warned = FALSE;
if(GL_LIMITS(point_sprite_units) < GL_LIMITS(textures) && !warned) {
@@ -1530,7 +1576,8 @@ static void state_pointsprite(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void state_wrap(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_wrap(DWORD state, IWineD3DStateBlockImpl *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
@@ -1560,13 +1607,15 @@ static void state_wrap(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DC
}
}
-static void state_msaa_w(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_msaa_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_MULTISAMPLEANTIALIAS]) {
WARN("Multisample antialiasing not supported by gl\n");
}
}
-static void state_msaa(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_msaa(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_MULTISAMPLEANTIALIAS]) {
glEnable(GL_MULTISAMPLE_ARB);
checkGLcall("glEnable(GL_MULTISAMPLE_ARB)");
@@ -1576,7 +1625,8 @@ static void state_msaa(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DC
}
}
-static void state_scissor(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_scissor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_SCISSORTESTENABLE]) {
glEnable(GL_SCISSOR_TEST);
checkGLcall("glEnable(GL_SCISSOR_TEST)");
@@ -1586,7 +1636,8 @@ static void state_scissor(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD
}
}
-static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
union {
DWORD d;
float f;
@@ -1605,7 +1656,8 @@ static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock, Win
}
}
-static void state_perspective(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_perspective(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if (stateblock->renderState[WINED3DRS_TEXTUREPERSPECTIVE]) {
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
checkGLcall("glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)");
@@ -1615,31 +1667,36 @@ static void state_perspective(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void state_stippledalpha(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_stippledalpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
TRACE("Stub\n");
if (stateblock->renderState[WINED3DRS_STIPPLEDALPHA])
FIXME(" Stippled Alpha not supported yet.\n");
}
-static void state_antialias(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_antialias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
TRACE("Stub\n");
if (stateblock->renderState[WINED3DRS_ANTIALIAS])
FIXME(" Antialias not supported yet.\n");
}
-static void state_multisampmask(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_multisampmask(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
TRACE("Stub\n");
if (stateblock->renderState[WINED3DRS_MULTISAMPLEMASK] != 0xFFFFFFFF)
FIXME("(WINED3DRS_MULTISAMPLEMASK,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_MULTISAMPLEMASK]);
}
-static void state_patchedgestyle(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_patchedgestyle(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
TRACE("Stub\n");
if (stateblock->renderState[WINED3DRS_PATCHEDGESTYLE] != WINED3DPATCHEDGE_DISCRETE)
FIXME("(WINED3DRS_PATCHEDGESTYLE,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_PATCHEDGESTYLE]);
}
-static void state_patchsegments(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_patchsegments(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
union {
DWORD d;
float f;
@@ -1659,109 +1716,127 @@ static void state_patchsegments(DWORD state, IWineD3DStateBlockImpl *stateblock,
}
}
-static void state_positiondegree(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_positiondegree(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
TRACE("Stub\n");
if (stateblock->renderState[WINED3DRS_POSITIONDEGREE] != WINED3DDEGREE_CUBIC)
FIXME("(WINED3DRS_POSITIONDEGREE,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_POSITIONDEGREE]);
}
-static void state_normaldegree(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_normaldegree(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
TRACE("Stub\n");
if (stateblock->renderState[WINED3DRS_NORMALDEGREE] != WINED3DDEGREE_LINEAR)
FIXME("(WINED3DRS_NORMALDEGREE,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_NORMALDEGREE]);
}
-static void state_tessellation(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_tessellation(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
TRACE("Stub\n");
if(stateblock->renderState[WINED3DRS_ENABLEADAPTIVETESSELLATION])
FIXME("(WINED3DRS_ENABLEADAPTIVETESSELLATION,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_ENABLEADAPTIVETESSELLATION]);
}
-static void state_wrapu(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_wrapu(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_WRAPU]) {
FIXME("Render state WINED3DRS_WRAPU not implemented yet\n");
}
}
-static void state_wrapv(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_wrapv(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_WRAPV]) {
FIXME("Render state WINED3DRS_WRAPV not implemented yet\n");
}
}
-static void state_monoenable(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_monoenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_MONOENABLE]) {
FIXME("Render state WINED3DRS_MONOENABLE not implemented yet\n");
}
}
-static void state_rop2(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_rop2(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_ROP2]) {
FIXME("Render state WINED3DRS_ROP2 not implemented yet\n");
}
}
-static void state_planemask(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_planemask(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_PLANEMASK]) {
FIXME("Render state WINED3DRS_PLANEMASK not implemented yet\n");
}
}
-static void state_subpixel(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_subpixel(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_SUBPIXEL]) {
FIXME("Render state WINED3DRS_SUBPIXEL not implemented yet\n");
}
}
-static void state_subpixelx(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_subpixelx(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_SUBPIXELX]) {
FIXME("Render state WINED3DRS_SUBPIXELX not implemented yet\n");
}
}
-static void state_stippleenable(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_stippleenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_STIPPLEENABLE]) {
FIXME("Render state WINED3DRS_STIPPLEENABLE not implemented yet\n");
}
}
-static void state_bordercolor(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_bordercolor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_BORDERCOLOR]) {
FIXME("Render state WINED3DRS_BORDERCOLOR not implemented yet\n");
}
}
-static void state_mipmaplodbias(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_mipmaplodbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_MIPMAPLODBIAS]) {
FIXME("Render state WINED3DRS_MIPMAPLODBIAS not implemented yet\n");
}
}
-static void state_anisotropy(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_anisotropy(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_ANISOTROPY]) {
FIXME("Render state WINED3DRS_ANISOTROPY not implemented yet\n");
}
}
-static void state_flushbatch(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_flushbatch(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_FLUSHBATCH]) {
FIXME("Render state WINED3DRS_FLUSHBATCH not implemented yet\n");
}
}
-static void state_translucentsi(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_translucentsi(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_TRANSLUCENTSORTINDEPENDENT]) {
FIXME("Render state WINED3DRS_TRANSLUCENTSORTINDEPENDENT not implemented yet\n");
}
}
-static void state_extents(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_extents(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_EXTENTS]) {
FIXME("Render state WINED3DRS_EXTENTS not implemented yet\n");
}
}
-static void state_ckeyblend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_ckeyblend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->renderState[WINED3DRS_COLORKEYBLENDENABLE]) {
FIXME("Render state WINED3DRS_COLORKEYBLENDENABLE not implemented yet\n");
}
@@ -1815,7 +1890,8 @@ static void get_src_and_opr(DWORD arg, BOOL is_alpha, GLenum* source, GLenum* op
}
/* Setup the texture operations texture stage states */
-static void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
+static void set_tex_op(const struct wined3d_context *context, IWineD3DDevice *iface,
+ BOOL isAlpha, int Stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
{
GLenum src1, src2, src3;
GLenum opr1, opr2, opr3;
@@ -1826,7 +1902,6 @@ static void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, WINED3DTE
GLenum opr=0, invopr, src3_target, opr3_target;
BOOL Handled = FALSE;
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- IWineD3DStateBlockImpl *stateblock = This->stateBlock; /* for GLINFO_LOCATION */
TRACE("Alpha?(%d), Stage:%d Op(%s), a1(%d), a2(%d), a3(%d)\n", isAlpha, Stage, debug_d3dtop(op), arg1, arg2, arg3);
@@ -2840,7 +2915,8 @@ static void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, WINED3DTE
}
-static void tex_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void tex_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[stage];
BOOL tex_used = stateblock->wineD3DDevice->fixed_function_usage_map & (1 << stage);
@@ -2891,14 +2967,15 @@ static void tex_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
if (tex_used) texture_activate_dimensions(stage, stateblock, context);
}
- set_tex_op((IWineD3DDevice *)stateblock->wineD3DDevice, FALSE, stage,
+ set_tex_op(context, (IWineD3DDevice *)stateblock->wineD3DDevice, FALSE, stage,
stateblock->textureState[stage][WINED3DTSS_COLOROP],
stateblock->textureState[stage][WINED3DTSS_COLORARG1],
stateblock->textureState[stage][WINED3DTSS_COLORARG2],
stateblock->textureState[stage][WINED3DTSS_COLORARG0]);
}
-void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[stage];
BOOL tex_used = stateblock->wineD3DDevice->fixed_function_usage_map & (1 << stage);
@@ -2992,12 +3069,13 @@ void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext
mapped_stage,
stateblock->textureState[stage][WINED3DTSS_RESULTARG]);
} else {
- set_tex_op((IWineD3DDevice *)stateblock->wineD3DDevice, TRUE, stage,
+ set_tex_op(context, (IWineD3DDevice *)stateblock->wineD3DDevice, TRUE, stage,
op, arg1, arg2, arg0);
}
}
-static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD texUnit = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[texUnit];
BOOL generated;
@@ -3022,7 +3100,7 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, W
set_texture_matrix(&stateblock->transforms[WINED3DTS_TEXTURE0 + texUnit].u.m[0][0],
stateblock->textureState[texUnit][WINED3DTSS_TEXTURETRANSFORMFLAGS], generated, context->last_was_rhw,
- stateblock->wineD3DDevice->strided_streams.elements[WINED3D_FFP_TEXCOORD0 + coordIdx].stride
+ stateblock->wineD3DDevice->strided_streams.use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx))
? stateblock->wineD3DDevice->strided_streams.elements[WINED3D_FFP_TEXCOORD0 + coordIdx].format_desc->format
: WINED3DFMT_UNKNOWN,
stateblock->wineD3DDevice->frag_pipe->ffp_proj_control);
@@ -3033,8 +3111,8 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, W
if(generated) {
FIXME("Non-power2 texture being used with generated texture coords\n");
}
- /* NP2 texcoord fixup is implemented for pixelshaders (currently only in GLSL backend) so
- only enable the fixed-function-pipeline fixup via pow2Matrix when no PS is used. */
+ /* 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(stateblock)) {
TRACE("Non power two matrix multiply fixup\n");
glMultMatrixf(((IWineD3DTextureImpl *) stateblock->textures[texUnit])->baseTexture.pow2Matrix);
@@ -3042,7 +3120,8 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void unloadTexCoords(IWineD3DStateBlockImpl *stateblock) {
+static void unloadTexCoords(const struct wined3d_context *context)
+{
unsigned int texture_idx;
for (texture_idx = 0; texture_idx < GL_LIMITS(texture_stages); ++texture_idx) {
@@ -3051,7 +3130,8 @@ static void unloadTexCoords(IWineD3DStateBlockImpl *stateblock) {
}
}
-static void loadTexCoords(IWineD3DStateBlockImpl *stateblock, const struct wined3d_stream_info *si, GLuint *curVBO)
+static void loadTexCoords(const struct wined3d_context *context, IWineD3DStateBlockImpl *stateblock,
+ const struct wined3d_stream_info *si, GLuint *curVBO)
{
const UINT *offset = stateblock->streamOffset;
unsigned int mapped_stage = 0;
@@ -3059,14 +3139,14 @@ static void loadTexCoords(IWineD3DStateBlockImpl *stateblock, const struct wined
for (textureNo = 0; textureNo < GL_LIMITS(texture_stages); ++textureNo) {
int coordIdx = stateblock->textureState[textureNo][WINED3DTSS_TEXCOORDINDEX];
- const struct wined3d_stream_info_element *e;
mapped_stage = stateblock->wineD3DDevice->texUnitMap[textureNo];
if (mapped_stage == WINED3D_UNMAPPED_STAGE) continue;
- e = &si->elements[WINED3D_FFP_TEXCOORD0 + coordIdx];
- if (coordIdx < MAX_TEXTURES && (e->data || e->buffer_object))
+ 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];
+
TRACE("Setting up texture %u, idx %d, cordindx %u, data %p\n",
textureNo, mapped_stage, coordIdx, e->data);
@@ -3098,13 +3178,14 @@ static void loadTexCoords(IWineD3DStateBlockImpl *stateblock, const struct wined
checkGLcall("loadTexCoords");
}
-static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[stage];
- static const GLfloat s_plane[] = { 1.0, 0.0, 0.0, 0.0 };
- static const GLfloat t_plane[] = { 0.0, 1.0, 0.0, 0.0 };
- static const GLfloat r_plane[] = { 0.0, 0.0, 1.0, 0.0 };
- static const GLfloat q_plane[] = { 0.0, 0.0, 0.0, 1.0 };
+ 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 };
if (mapped_stage == WINED3D_UNMAPPED_STAGE)
{
@@ -3266,12 +3347,13 @@ static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
*/
GLuint curVBO = GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT) ? ~0U : 0;
- unloadTexCoords(stateblock);
- loadTexCoords(stateblock, &stateblock->wineD3DDevice->strided_streams, &curVBO);
+ unloadTexCoords(context);
+ loadTexCoords(context, stateblock, &stateblock->wineD3DDevice->strided_streams, &curVBO);
}
}
-static void shaderconstant(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void shaderconstant(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
/* Vertex and pixel shader states will call a shader upload, don't do anything as long one of them
@@ -3282,14 +3364,16 @@ static void shaderconstant(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
return;
}
- device->shader_backend->shader_load_constants((IWineD3DDevice *)device, use_ps(stateblock), use_vs(stateblock));
+ device->shader_backend->shader_load_constants(context, use_ps(stateblock), use_vs(stateblock));
}
-static void tex_bumpenvlscale(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void tex_bumpenvlscale(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
- if(stateblock->pixelShader && stage != 0 &&
- ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.luminanceparams[stage]) {
+ if (stateblock->pixelShader && stage != 0
+ && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.luminanceparams & (1 << stage)))
+ {
/* The pixel shader has to know the luminance scale. Do a constants update if it
* isn't scheduled anyway
*/
@@ -3300,7 +3384,8 @@ static void tex_bumpenvlscale(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
const DWORD sampler = state - STATE_SAMPLER(0);
IWineD3DBaseTexture *texture = stateblock->textures[sampler];
@@ -3308,7 +3393,7 @@ static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, W
if(!texture) return;
/* The fixed function np2 texture emulation uses the texture matrix to fix up the coordinates
- * IWineD3DBaseTexture::ApplyStateChanges multiplies the set matrix with a fixup matrix. Before the
+ * basetexture_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
@@ -3326,7 +3411,8 @@ static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD sampler = state - STATE_SAMPLER(0);
DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[sampler];
union {
@@ -3356,7 +3442,8 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCont
IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *) stateblock->textures[sampler];
tex_impl->baseTexture.internal_preload(stateblock->textures[sampler], srgb ? SRGB_SRGB : SRGB_RGB);
IWineD3DBaseTexture_BindTexture(stateblock->textures[sampler], srgb);
- IWineD3DBaseTexture_ApplyStateChanges(stateblock->textures[sampler], stateblock->textureState[sampler], stateblock->samplerState[sampler]);
+ basetexture_apply_state_changes(stateblock->textures[sampler],
+ stateblock->textureState[sampler], stateblock->samplerState[sampler]);
if (GL_SUPPORT(EXT_TEXTURE_LOD_BIAS)) {
tmpvalue.d = stateblock->samplerState[sampler][WINED3DSAMP_MIPMAPLODBIAS];
@@ -3376,8 +3463,7 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCont
}
}
- /* Trigger shader constant reloading (for NP2 texcoord fixup)
- * Only do this if pshaders are used (note: fixup is currently only implemented in GLSL). */
+ /* Trigger shader constant reloading (for NP2 texcoord fixup) */
if (!tex_impl->baseTexture.pow2Matrix_identity) {
IWineD3DDeviceImpl* d3ddevice = stateblock->wineD3DDevice;
d3ddevice->shader_backend->shader_load_np2fixup_constants(
@@ -3398,7 +3484,8 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCont
}
}
-void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
BOOL use_pshader = use_ps(stateblock);
BOOL use_vshader = use_vs(stateblock);
@@ -3435,7 +3522,7 @@ void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DC
}
if(!isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) {
- device->shader_backend->shader_select((IWineD3DDevice *)stateblock->wineD3DDevice, use_pshader, use_vshader);
+ device->shader_backend->shader_select(context, use_pshader, use_vshader);
if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vshader || use_pshader)) {
shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock, context);
@@ -3443,10 +3530,12 @@ void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DC
}
}
-static void shader_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void shader_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
- if(stateblock->pixelShader && stage != 0 &&
- ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.bumpmat[stage]) {
+ if (stateblock->pixelShader && stage != 0
+ && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.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
*/
@@ -3457,7 +3546,8 @@ static void shader_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void transform_world(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void transform_world(DWORD state, IWineD3DStateBlockImpl *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
@@ -3485,7 +3575,8 @@ static void transform_world(DWORD state, IWineD3DStateBlockImpl *stateblock, Win
}
}
-static void clipplane(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void clipplane(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
UINT index = state - STATE_CLIPPLANE(0);
if(isStateDirty(context, STATE_TRANSFORM(WINED3DTS_VIEW)) || index >= GL_LIMITS(clipplanes)) {
@@ -3493,9 +3584,20 @@ static void clipplane(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
}
/* Clip Plane settings are affected by the model view in OpenGL, the View transform in direct3d */
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadMatrixf(&stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]);
+ if(!use_vs(stateblock)) {
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadMatrixf(&stateblock->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 [%f,%f,%f,%f]\n",
stateblock->clipplane[index][0],
@@ -3508,7 +3610,8 @@ static void clipplane(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
glPopMatrix();
}
-static void transform_worldex(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void transform_worldex(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
UINT matrix = state - STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0));
GLenum glMat;
TRACE("Setting world matrix %d\n", matrix);
@@ -3547,7 +3650,8 @@ static void transform_worldex(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void state_vertexblend_w(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_vertexblend_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
static BOOL once = FALSE;
switch(stateblock->renderState[WINED3DRS_VERTEXBLEND]) {
@@ -3566,7 +3670,8 @@ static void state_vertexblend_w(DWORD state, IWineD3DStateBlockImpl *stateblock,
}
}
-static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
WINED3DVERTEXBLENDFLAGS val = stateblock->renderState[WINED3DRS_VERTEXBLEND];
switch(val) {
@@ -3608,7 +3713,8 @@ static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
unsigned int k;
/* If we are changing the View matrix, reset the light and clipping planes to the new view
@@ -3665,7 +3771,8 @@ static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
}
}
-static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
glMatrixMode(GL_PROJECTION);
checkGLcall("glMatrixMode(GL_PROJECTION)");
glLoadIdentity();
@@ -3704,7 +3811,8 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
* problem either.
*/
TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
- if(stateblock->wineD3DDevice->render_offscreen) {
+ if (context->render_offscreen)
+ {
glOrtho(X, X + width, -Y, -Y - height, -minZ, -maxZ);
} else {
glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
@@ -3718,7 +3826,8 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
* replacement shader.
*/
TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, 1.0, -1.0);
- if(stateblock->wineD3DDevice->render_offscreen) {
+ if (context->render_offscreen)
+ {
glOrtho(X, X + width, -Y, -Y - height, 0.0, -1.0);
} else {
glOrtho(X, X + width, Y + height, Y, 0.0, -1.0);
@@ -3727,12 +3836,14 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
checkGLcall("glOrtho");
/* Window Coord 0 is the middle of the first pixel, so translate by 1/2 pixels */
- glTranslatef(0.5, 0.5, 0);
- checkGLcall("glTranslatef(0.5, 0.5, 0)");
+ glTranslatef(63.0f / 128.0f, 63.0f / 128.0f, 0.0f);
+ checkGLcall("glTranslatef(63.0f / 128.0f, 63.0f / 128.0f, 0.0f)");
+
/* D3D texture coordinates are flipped compared to OpenGL ones, so
* render everything upside down when rendering offscreen. */
- if (stateblock->wineD3DDevice->render_offscreen) {
- glScalef(1.0, -1.0, 1.0);
+ if (context->render_offscreen)
+ {
+ glScalef(1.0f, -1.0f, 1.0f);
checkGLcall("glScalef");
}
} else {
@@ -3773,16 +3884,24 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
* glScalef(1.0, flip, 2.0);
*/
- if (stateblock->wineD3DDevice->render_offscreen) {
+ /* 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->viewport.Width;
+ GLfloat yoffset = -(63.0f / 64.0f) / stateblock->viewport.Height;
+
+ if (context->render_offscreen)
+ {
/* D3D texture coordinates are flipped compared to OpenGL ones, so
* render everything upside down when rendering offscreen. */
- glTranslatef(1.0 / stateblock->viewport.Width, 1.0 / stateblock->viewport.Height, -1.0);
- checkGLcall("glTranslatef(1.0 / width, 1.0 / height, -1.0)");
- glScalef(1.0, -1.0, 2.0);
+ glTranslatef(xoffset, -yoffset, -1.0f);
+ checkGLcall("glTranslatef(xoffset, -yoffset, -1.0f)");
+ glScalef(1.0f, -1.0f, 2.0f);
} else {
- glTranslatef(1.0 / stateblock->viewport.Width, -1.0 / stateblock->viewport.Height, -1.0);
- checkGLcall("glTranslatef(1.0 / width, -1.0 / height, -1.0)");
- glScalef(1.0, 1.0, 2.0);
+ glTranslatef(xoffset, yoffset, -1.0f);
+ checkGLcall("glTranslatef(xoffset, yoffset, -1.0f)");
+ glScalef(1.0f, 1.0f, 2.0f);
}
checkGLcall("glScalef");
@@ -3795,7 +3914,8 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
* stateblock impl is required for GL_SUPPORT
* TODO: Only load / unload arrays if we have to.
*/
-static inline void unloadVertexData(IWineD3DStateBlockImpl *stateblock) {
+static inline void unloadVertexData(const struct wined3d_context *context)
+{
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
@@ -3805,21 +3925,13 @@ static inline void unloadVertexData(IWineD3DStateBlockImpl *stateblock) {
if (GL_SUPPORT(ARB_VERTEX_BLEND)) {
glDisableClientState(GL_WEIGHT_ARRAY_ARB);
}
- unloadTexCoords(stateblock);
+ unloadTexCoords(context);
}
-static inline void unload_numbered_array(IWineD3DStateBlockImpl *stateblock, WineD3DContext *context, int i)
+static inline void unload_numbered_array(IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context, int i)
{
GL_EXTCALL(glDisableVertexAttribArrayARB(i));
checkGLcall("glDisableVertexAttribArrayARB(reg)");
- /* Some Windows drivers(NV GF 7) use the latest value that was used when drawing with the now
- * deactivated stream disabled, some other drivers(ATI, NV GF 8) set the undefined values to 0x00.
- * Let's set them to 0x00 to avoid hitting some undefined aspects of OpenGL. All that is really
- * important here is the glDisableVertexAttribArrayARB call above. The test shows that the refrast
- * keeps dereferencing the pointers, which would cause crashes in some games like Half Life 2: Episode Two.
- */
- GL_EXTCALL(glVertexAttrib4NubARB(i, 0, 0, 0, 0));
- checkGLcall("glVertexAttrib4NubARB(i, 0, 0, 0, 0)");
context->numbered_array_mask &= ~(1 << i);
}
@@ -3827,7 +3939,7 @@ static inline void unload_numbered_array(IWineD3DStateBlockImpl *stateblock, Win
/* This should match any arrays loaded in loadNumberedArrays
* TODO: Only load / unload arrays if we have to.
*/
-static inline void unloadNumberedArrays(IWineD3DStateBlockImpl *stateblock, WineD3DContext *context)
+static inline void unloadNumberedArrays(IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
/* disable any attribs (this is the same for both GLSL and ARB modes) */
GLint maxAttribs = 16;
@@ -3844,7 +3956,7 @@ static inline void unloadNumberedArrays(IWineD3DStateBlockImpl *stateblock, Wine
}
static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock,
- const struct wined3d_stream_info *stream_info, WineD3DContext *context)
+ const struct wined3d_stream_info *stream_info, struct wined3d_context *context)
{
GLuint curVBO = GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT) ? ~0U : 0;
int i;
@@ -4018,7 +4130,8 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock,
}
/* Used from 2 different functions, and too big to justify making it inlined */
-static void loadVertexData(IWineD3DStateBlockImpl *stateblock, const struct wined3d_stream_info *si)
+static void loadVertexData(const struct wined3d_context *context, IWineD3DStateBlockImpl *stateblock,
+ const struct wined3d_stream_info *si)
{
const UINT *offset = stateblock->streamOffset;
GLuint curVBO = GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT) ? ~0U : 0;
@@ -4030,11 +4143,11 @@ static void loadVertexData(IWineD3DStateBlockImpl *stateblock, const struct wine
stateblock->wineD3DDevice->instancedDraw = FALSE;
/* Blend Data ---------------------------------------------- */
- e = &si->elements[WINED3D_FFP_BLENDWEIGHT];
- if (e->data || e->buffer_object
- || si->elements[WINED3D_FFP_BLENDINDICES].data
- || si->elements[WINED3D_FFP_BLENDINDICES].buffer_object)
+ if ((si->use_map & (1 << WINED3D_FFP_BLENDWEIGHT))
+ || si->use_map & (1 << WINED3D_FFP_BLENDINDICES))
{
+ e = &si->elements[WINED3D_FFP_BLENDWEIGHT];
+
if (GL_SUPPORT(ARB_VERTEX_BLEND)) {
TRACE("Blend %d %p %d\n", e->format_desc->component_count,
e->data + stateblock->loadBaseVertexIndex * e->stride, e->stride + offset[e->stream_idx]);
@@ -4061,8 +4174,7 @@ static void loadVertexData(IWineD3DStateBlockImpl *stateblock, const struct wine
checkGLcall("glWeightPointerARB");
- if (si->elements[WINED3D_FFP_BLENDINDICES].data
- || (si->elements[WINED3D_FFP_BLENDINDICES].buffer_object))
+ if (si->use_map & (1 << WINED3D_FFP_BLENDINDICES))
{
static BOOL warned;
if (!warned)
@@ -4086,8 +4198,7 @@ static void loadVertexData(IWineD3DStateBlockImpl *stateblock, const struct wine
}
/* Point Size ----------------------------------------------*/
- e = &si->elements[WINED3D_FFP_PSIZE];
- if (e->data || e->buffer_object)
+ 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");
@@ -4095,11 +4206,11 @@ static void loadVertexData(IWineD3DStateBlockImpl *stateblock, const struct wine
}
/* Vertex Pointers -----------------------------------------*/
- e = &si->elements[WINED3D_FFP_POSITION];
- if (e->data || e->buffer_object)
+ if (si->use_map & (1 << WINED3D_FFP_POSITION))
{
VTRACE(("glVertexPointer(%d, GL_FLOAT, %d, %p)\n", e->stride, e->size, e->data));
+ e = &si->elements[WINED3D_FFP_POSITION];
if (curVBO != e->buffer_object)
{
GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object));
@@ -4129,10 +4240,11 @@ static void loadVertexData(IWineD3DStateBlockImpl *stateblock, const struct wine
}
/* Normals -------------------------------------------------*/
- e = &si->elements[WINED3D_FFP_NORMAL];
- if (e->data || e->buffer_object)
+ if (si->use_map & (1 << WINED3D_FFP_NORMAL))
{
VTRACE(("glNormalPointer(GL_FLOAT, %d, %p)\n", e->stride, e->data));
+
+ e = &si->elements[WINED3D_FFP_NORMAL];
if (curVBO != e->buffer_object)
{
GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object));
@@ -4159,11 +4271,11 @@ static void loadVertexData(IWineD3DStateBlockImpl *stateblock, const struct wine
/* NOTE: Unless we write a vertex shader to swizzle the colour*/
/* , or the user doesn't care and wants the speed advantage */
- e = &si->elements[WINED3D_FFP_DIFFUSE];
- if (e->data || e->buffer_object)
+ if (si->use_map & (1 << WINED3D_FFP_DIFFUSE))
{
VTRACE(("glColorPointer(4, GL_UNSIGNED_BYTE, %d, %p)\n", e->stride, e->data));
+ e = &si->elements[WINED3D_FFP_DIFFUSE];
if (curVBO != e->buffer_object)
{
GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object));
@@ -4183,22 +4295,52 @@ static void loadVertexData(IWineD3DStateBlockImpl *stateblock, const struct wine
}
/* Specular Colour ------------------------------------------*/
- e = &si->elements[WINED3D_FFP_SPECULAR];
- if (e->data || e->buffer_object)
+ if (si->use_map & (1 << WINED3D_FFP_SPECULAR))
{
TRACE("setting specular colour\n");
VTRACE(("glSecondaryColorPointer(4, GL_UNSIGNED_BYTE, %d, %p)\n", e->stride, e->data));
+ e = &si->elements[WINED3D_FFP_SPECULAR];
if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
+ GLenum type = e->format_desc->gl_vtx_type;
+ GLint format = e->format_desc->gl_vtx_format;
+
if (curVBO != e->buffer_object)
{
GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object));
checkGLcall("glBindBufferARB");
curVBO = e->buffer_object;
}
- GL_EXTCALL(glSecondaryColorPointerEXT)(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type,
- e->stride, e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
- checkGLcall("glSecondaryColorPointerEXT(4, GL_UNSIGNED_BYTE, ...)");
+
+ if(format != 4 || (GLINFO_LOCATION.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
+ */
+ GL_EXTCALL(glSecondaryColorPointerEXT)(format, type,
+ e->stride, e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ checkGLcall("glSecondaryColorPointerEXT(format, type, ...)");
+ }
+ else
+ {
+ switch(type)
+ {
+ case GL_UNSIGNED_BYTE:
+ GL_EXTCALL(glSecondaryColorPointerEXT)(3, GL_UNSIGNED_BYTE,
+ e->stride, e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ 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 */
+ GL_EXTCALL(glSecondaryColorPointerEXT)(3, type,
+ e->stride, e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ checkGLcall("glSecondaryColorPointerEXT(3, type, ...)");
+ }
+ }
glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT);
checkGLcall("glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT)");
} else {
@@ -4219,7 +4361,7 @@ static void loadVertexData(IWineD3DStateBlockImpl *stateblock, const struct wine
}
/* Texture coords -------------------------------------------*/
- loadTexCoords(stateblock, si, &curVBO);
+ loadTexCoords(context, stateblock, si, &curVBO);
}
static inline void drawPrimitiveTraceDataLocations(const struct wined3d_stream_info *dataLocations)
@@ -4245,7 +4387,8 @@ static inline void drawPrimitiveTraceDataLocations(const struct wined3d_stream_i
return;
}
-static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
BOOL fixup = FALSE;
struct wined3d_stream_info *dataLocations = &device->strided_streams;
@@ -4284,18 +4427,23 @@ static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
device->useDrawStridedSlow = FALSE;
}
}
- else if (fixup || (!dataLocations->elements[WINED3D_FFP_PSIZE].data
- && !dataLocations->position_transformed
- && (GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA)
- || (!dataLocations->elements[WINED3D_FFP_DIFFUSE].data
- && !dataLocations->elements[WINED3D_FFP_SPECULAR].data))))
+ else
{
- /* Load the vertex data using named arrays */
- load_named = TRUE;
- device->useDrawStridedSlow = FALSE;
- } else {
- TRACE("Not loading vertex data\n");
- device->useDrawStridedSlow = TRUE;
+ WORD slow_mask = (1 << WINED3D_FFP_PSIZE);
+ slow_mask |= -!GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA) & ((1 << WINED3D_FFP_DIFFUSE) | (1 << WINED3D_FFP_SPECULAR));
+
+ if (fixup || (!dataLocations->position_transformed
+ && !(dataLocations->use_map & slow_mask)))
+ {
+ /* Load the vertex data using named arrays */
+ load_named = TRUE;
+ device->useDrawStridedSlow = FALSE;
+ }
+ else
+ {
+ TRACE("Not loading vertex data\n");
+ device->useDrawStridedSlow = TRUE;
+ }
}
if (context->numberedArraysLoaded && !load_numbered)
@@ -4306,7 +4454,7 @@ static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
}
else if (context->namedArraysLoaded)
{
- unloadVertexData(stateblock);
+ unloadVertexData(context);
context->namedArraysLoaded = FALSE;
}
@@ -4319,12 +4467,13 @@ static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
else if (load_named)
{
TRACE("Loading vertex data\n");
- loadVertexData(stateblock, dataLocations);
+ loadVertexData(context, stateblock, dataLocations);
context->namedArraysLoaded = TRUE;
}
}
-static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
BOOL updateFog = FALSE;
BOOL useVertexShaderFunction = use_vs(stateblock);
BOOL usePixelShaderFunction = use_ps(stateblock);
@@ -4332,6 +4481,7 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, W
/* Some stuff is in the device until we have per context tracking */
IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
BOOL wasrhw = context->last_was_rhw;
+ unsigned int i;
transformed = device->strided_streams.position_transformed;
if(transformed != context->last_was_rhw && !useVertexShaderFunction) {
@@ -4359,9 +4509,11 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, W
/* This sets the shader output position correction constants.
* TODO: Move to the viewport state
*/
- if (useVertexShaderFunction) {
- device->posFixup[1] = device->render_offscreen ? -1.0 : 1.0;
- device->posFixup[3] = -device->posFixup[1] / stateblock->viewport.Height;
+ if (useVertexShaderFunction)
+ {
+ GLfloat yoffset = -(63.0f / 64.0f) / stateblock->viewport.Height;
+ device->posFixup[1] = context->render_offscreen ? -1.0f : 1.0f;
+ device->posFixup[3] = device->posFixup[1] * yoffset;
}
}
@@ -4400,28 +4552,32 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, W
if(context->last_was_vshader) {
updateFog = TRUE;
- if(!isStateDirty(context, STATE_RENDER(WINED3DRS_CLIPPLANEENABLE))) {
+ if(!device->vs_clipping && !isStateDirty(context, STATE_RENDER(WINED3DRS_CLIPPLANEENABLE))) {
state_clipping(STATE_RENDER(WINED3DRS_CLIPPLANEENABLE), stateblock, context);
}
+ for(i = 0; i < GL_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) {
- unsigned int i;
static BOOL warned = FALSE;
- /* Disable all clip planes to get defined results on all drivers. See comment in the
- * state_clipping state handler
- */
- for(i = 0; i < GL_LIMITS(clipplanes); i++) {
- glDisable(GL_CLIP_PLANE0 + i);
- checkGLcall("glDisable(GL_CLIP_PLANE0 + i)");
- }
+ 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_LIMITS(clipplanes); i++) {
+ glDisable(GL_CLIP_PLANE0 + i);
+ checkGLcall("glDisable(GL_CLIP_PLANE0 + i)");
+ }
- if(!warned && stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]) {
- FIXME("Clipping not supported with vertex shaders\n");
- warned = TRUE;
+ if(!warned && stateblock->renderState[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
@@ -4437,6 +4593,14 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
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_LIMITS(clipplanes); i++) {
+ clipplane(STATE_CLIPPLANE(i), stateblock, context);
+ }
}
}
@@ -4444,7 +4608,7 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, W
* application
*/
if (!isStateDirty(context, STATE_PIXELSHADER)) {
- device->shader_backend->shader_select((IWineD3DDevice *)device, usePixelShaderFunction, useVertexShaderFunction);
+ device->shader_backend->shader_select(context, usePixelShaderFunction, useVertexShaderFunction);
if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (useVertexShaderFunction || usePixelShaderFunction)) {
shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock, context);
@@ -4466,7 +4630,8 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, W
}
}
-static void viewport_miscpart(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void viewport_miscpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
UINT width, height;
IWineD3DSurfaceImpl *target;
@@ -4474,13 +4639,14 @@ static void viewport_miscpart(DWORD state, IWineD3DStateBlockImpl *stateblock, W
checkGLcall("glDepthRange");
/* Note: GL requires lower left, DirectX supplies upper left. This is reversed when using offscreen rendering
*/
- if(stateblock->wineD3DDevice->render_offscreen) {
+ if (context->render_offscreen)
+ {
glViewport(stateblock->viewport.X,
stateblock->viewport.Y,
stateblock->viewport.Width, stateblock->viewport.Height);
} else {
target = (IWineD3DSurfaceImpl *) stateblock->wineD3DDevice->render_targets[0];
- target->get_drawable_size(target, &width, &height);
+ target->get_drawable_size(context, &width, &height);
glViewport(stateblock->viewport.X,
(height - (stateblock->viewport.Y + stateblock->viewport.Height)),
@@ -4490,9 +4656,13 @@ static void viewport_miscpart(DWORD state, IWineD3DStateBlockImpl *stateblock, W
checkGLcall("glViewport");
}
-static void viewport_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
- stateblock->wineD3DDevice->posFixup[2] = 1.0 / stateblock->viewport.Width;
- stateblock->wineD3DDevice->posFixup[3] = -stateblock->wineD3DDevice->posFixup[1] / stateblock->viewport.Height;
+static void viewport_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ GLfloat yoffset = -(63.0f / 64.0f) / stateblock->viewport.Height;
+
+ stateblock->wineD3DDevice->posFixup[2] = (63.0f / 64.0f) / stateblock->viewport.Width;
+ stateblock->wineD3DDevice->posFixup[3] = stateblock->wineD3DDevice->posFixup[1] * yoffset;
+
if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION))) {
transform_projection(STATE_TRANSFORM(WINED3DTS_PROJECTION), stateblock, context);
}
@@ -4501,7 +4671,8 @@ static void viewport_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock,
}
}
-static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
UINT Index = state - STATE_ACTIVELIGHT(0);
const PLIGHTINFOEL *lightInfo = stateblock->activeLights[Index];
@@ -4510,7 +4681,7 @@ static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContex
checkGLcall("glDisable(GL_LIGHT0 + Index)");
} else {
float quad_att;
- float colRGBA[] = {0.0, 0.0, 0.0, 0.0};
+ 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);
@@ -4542,9 +4713,9 @@ static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContex
checkGLcall("glLightfv");
if ((lightInfo->OriginalParms.Range *lightInfo->OriginalParms.Range) >= FLT_MIN) {
- quad_att = 1.4/(lightInfo->OriginalParms.Range *lightInfo->OriginalParms.Range);
+ quad_att = 1.4f/(lightInfo->OriginalParms.Range *lightInfo->OriginalParms.Range);
} else {
- quad_att = 0; /* 0 or MAX? (0 seems to be ok) */
+ 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,
@@ -4616,20 +4787,22 @@ static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContex
return;
}
-static void scissorrect(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void scissorrect(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
RECT *pRect = &stateblock->scissorRect;
UINT height;
UINT width;
IWineD3DSurfaceImpl *target = (IWineD3DSurfaceImpl *) stateblock->wineD3DDevice->render_targets[0];
- target->get_drawable_size(target, &width, &height);
+ 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->wineD3DDevice, pRect->left, pRect->bottom - height,
pRect->right - pRect->left, pRect->bottom - pRect->top);
- if (stateblock->wineD3DDevice->render_offscreen) {
+ 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);
@@ -4637,7 +4810,8 @@ static void scissorrect(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
checkGLcall("glScissor");
}
-static void indexbuffer(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void indexbuffer(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->streamIsUP || stateblock->pIndexData == NULL ) {
GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0));
} else {
@@ -4646,8 +4820,10 @@ static void indexbuffer(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
}
}
-static void frontface(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
- if(stateblock->wineD3DDevice->render_offscreen) {
+static void frontface(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ if (context->render_offscreen)
+ {
glFrontFace(GL_CCW);
checkGLcall("glFrontFace(GL_CCW)");
} else {
@@ -4657,689 +4833,692 @@ static void frontface(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
}
const struct StateEntryTemplate misc_state_template[] = {
- { STATE_RENDER(WINED3DRS_SRCBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, 0 },
- { STATE_RENDER(WINED3DRS_DESTBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, 0 },
- { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, 0 },
- { STATE_RENDER(WINED3DRS_EDGEANTIALIAS), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, 0 },
- { STATE_RENDER(WINED3DRS_ANTIALIASEDLINEENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, 0 },
- { STATE_RENDER(WINED3DRS_SEPARATEALPHABLENDENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, 0 },
- { STATE_RENDER(WINED3DRS_SRCBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, 0 },
- { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, 0 },
- { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, 0 },
- { STATE_RENDER(WINED3DRS_BLENDOPALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, 0 },
- { STATE_STREAMSRC, { STATE_VDECL, streamsrc }, 0 },
- { STATE_VDECL, { STATE_VDECL, streamsrc }, 0 },
- { STATE_FRONTFACE, { STATE_FRONTFACE, frontface }, 0 },
- { STATE_SCISSORRECT, { STATE_SCISSORRECT, scissorrect }, 0 },
+ { STATE_RENDER(WINED3DRS_SRCBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_DESTBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, 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), state_blend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ANTIALIASEDLINEENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SEPARATEALPHABLENDENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SRCBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_BLENDOPALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
+ { STATE_STREAMSRC, { STATE_VDECL, streamsrc }, 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 },
/* 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 }, 0 },
- { STATE_PIXELSHADERCONSTANT, { STATE_VERTEXSHADERCONSTANT, shaderconstant }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, 0 },
+ { STATE_VERTEXSHADERCONSTANT, { STATE_VERTEXSHADERCONSTANT, shaderconstant }, WINED3D_GL_EXT_NONE },
+ { STATE_PIXELSHADERCONSTANT, { STATE_VERTEXSHADERCONSTANT, shaderconstant }, 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), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 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), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 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), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 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), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 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), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 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), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 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), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 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), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, 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), tex_bumpenvlscale }, 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), tex_bumpenvlscale }, 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), tex_bumpenvlscale }, 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), tex_bumpenvlscale }, 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), tex_bumpenvlscale }, 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), tex_bumpenvlscale }, 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), tex_bumpenvlscale }, 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), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_VIEWPORT, { STATE_VIEWPORT, viewport_miscpart }, 0 },
+ { STATE_VIEWPORT, { STATE_VIEWPORT, viewport_miscpart }, WINED3D_GL_EXT_NONE },
{ STATE_INDEXBUFFER, { STATE_INDEXBUFFER, indexbuffer }, ARB_VERTEX_BUFFER_OBJECT },
- { STATE_RENDER(WINED3DRS_ANTIALIAS), { STATE_RENDER(WINED3DRS_ANTIALIAS), state_antialias }, 0 },
- { STATE_RENDER(WINED3DRS_TEXTUREPERSPECTIVE), { STATE_RENDER(WINED3DRS_TEXTUREPERSPECTIVE), state_perspective }, 0 },
- { STATE_RENDER(WINED3DRS_ZENABLE), { STATE_RENDER(WINED3DRS_ZENABLE), state_zenable }, 0 },
- { STATE_RENDER(WINED3DRS_WRAPU), { STATE_RENDER(WINED3DRS_WRAPU), state_wrapu }, 0 },
- { STATE_RENDER(WINED3DRS_WRAPV), { STATE_RENDER(WINED3DRS_WRAPV), state_wrapv }, 0 },
- { STATE_RENDER(WINED3DRS_FILLMODE), { STATE_RENDER(WINED3DRS_FILLMODE), state_fillmode }, 0 },
- { STATE_RENDER(WINED3DRS_SHADEMODE), { STATE_RENDER(WINED3DRS_SHADEMODE), state_shademode }, 0 },
- { STATE_RENDER(WINED3DRS_LINEPATTERN), { STATE_RENDER(WINED3DRS_LINEPATTERN), state_linepattern }, 0 },
- { STATE_RENDER(WINED3DRS_MONOENABLE), { STATE_RENDER(WINED3DRS_MONOENABLE), state_monoenable }, 0 },
- { STATE_RENDER(WINED3DRS_ROP2), { STATE_RENDER(WINED3DRS_ROP2), state_rop2 }, 0 },
- { STATE_RENDER(WINED3DRS_PLANEMASK), { STATE_RENDER(WINED3DRS_PLANEMASK), state_planemask }, 0 },
- { STATE_RENDER(WINED3DRS_ZWRITEENABLE), { STATE_RENDER(WINED3DRS_ZWRITEENABLE), state_zwritenable }, 0 },
- { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, 0 },
- { STATE_RENDER(WINED3DRS_ALPHAREF), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, 0 },
- { STATE_RENDER(WINED3DRS_ALPHAFUNC), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, 0 },
- { STATE_RENDER(WINED3DRS_COLORKEYENABLE), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, 0 },
- { STATE_RENDER(WINED3DRS_LASTPIXEL), { STATE_RENDER(WINED3DRS_LASTPIXEL), state_lastpixel }, 0 },
- { STATE_RENDER(WINED3DRS_CULLMODE), { STATE_RENDER(WINED3DRS_CULLMODE), state_cullmode }, 0 },
- { STATE_RENDER(WINED3DRS_ZFUNC), { STATE_RENDER(WINED3DRS_ZFUNC), state_zfunc }, 0 },
- { STATE_RENDER(WINED3DRS_DITHERENABLE), { STATE_RENDER(WINED3DRS_DITHERENABLE), state_ditherenable }, 0 },
- { STATE_RENDER(WINED3DRS_SUBPIXEL), { STATE_RENDER(WINED3DRS_SUBPIXEL), state_subpixel }, 0 },
- { STATE_RENDER(WINED3DRS_SUBPIXELX), { STATE_RENDER(WINED3DRS_SUBPIXELX), state_subpixelx }, 0 },
- { STATE_RENDER(WINED3DRS_STIPPLEDALPHA), { STATE_RENDER(WINED3DRS_STIPPLEDALPHA), state_stippledalpha }, 0 },
- { STATE_RENDER(WINED3DRS_ZBIAS), { STATE_RENDER(WINED3DRS_ZBIAS), state_zbias }, 0 },
- { STATE_RENDER(WINED3DRS_STIPPLEENABLE), { STATE_RENDER(WINED3DRS_STIPPLEENABLE), state_stippleenable }, 0 },
- { STATE_RENDER(WINED3DRS_MIPMAPLODBIAS), { STATE_RENDER(WINED3DRS_MIPMAPLODBIAS), state_mipmaplodbias }, 0 },
- { STATE_RENDER(WINED3DRS_ANISOTROPY), { STATE_RENDER(WINED3DRS_ANISOTROPY), state_anisotropy }, 0 },
- { STATE_RENDER(WINED3DRS_FLUSHBATCH), { STATE_RENDER(WINED3DRS_FLUSHBATCH), state_flushbatch }, 0 },
- { STATE_RENDER(WINED3DRS_TRANSLUCENTSORTINDEPENDENT), { STATE_RENDER(WINED3DRS_TRANSLUCENTSORTINDEPENDENT), state_translucentsi }, 0 },
- { STATE_RENDER(WINED3DRS_STENCILENABLE), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
- { STATE_RENDER(WINED3DRS_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
- { STATE_RENDER(WINED3DRS_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
- { STATE_RENDER(WINED3DRS_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
- { STATE_RENDER(WINED3DRS_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
- { STATE_RENDER(WINED3DRS_STENCILREF), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
- { STATE_RENDER(WINED3DRS_STENCILMASK), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
+ { 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), state_alpha }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ALPHAFUNC), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORKEYENABLE), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, 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), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILREF), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILMASK), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 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 }, 0 },
- { STATE_RENDER(WINED3DRS_TWOSIDEDSTENCILMODE), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
- { STATE_RENDER(WINED3DRS_CCW_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
- { STATE_RENDER(WINED3DRS_CCW_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
- { STATE_RENDER(WINED3DRS_CCW_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
- { STATE_RENDER(WINED3DRS_CCW_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP0), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP1), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP2), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP3), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP4), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP5), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP6), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP7), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP8), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP9), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP10), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP11), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP12), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP13), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP14), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_WRAP15), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 0 },
- { STATE_RENDER(WINED3DRS_EXTENTS), { STATE_RENDER(WINED3DRS_EXTENTS), state_extents }, 0 },
- { STATE_RENDER(WINED3DRS_COLORKEYBLENDENABLE), { STATE_RENDER(WINED3DRS_COLORKEYBLENDENABLE), state_ckeyblend }, 0 },
- { STATE_RENDER(WINED3DRS_PATCHEDGESTYLE), { STATE_RENDER(WINED3DRS_PATCHEDGESTYLE), state_patchedgestyle}, 0 },
- { STATE_RENDER(WINED3DRS_PATCHSEGMENTS), { STATE_RENDER(WINED3DRS_PATCHSEGMENTS), state_patchsegments }, 0 },
- { STATE_RENDER(WINED3DRS_POSITIONDEGREE), { STATE_RENDER(WINED3DRS_POSITIONDEGREE), state_positiondegree}, 0 },
- { STATE_RENDER(WINED3DRS_NORMALDEGREE), { STATE_RENDER(WINED3DRS_NORMALDEGREE), state_normaldegree }, 0 },
- { STATE_RENDER(WINED3DRS_MINTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, 0 },
- { STATE_RENDER(WINED3DRS_MAXTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, 0 },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_X), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, 0 },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Y), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, 0 },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Z), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, 0 },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_W), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, 0 },
- { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, 0 },
+ { STATE_RENDER(WINED3DRS_STENCILWRITEMASK), { STATE_RENDER(WINED3DRS_STENCILWRITEMASK), state_stencilwrite }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_TWOSIDEDSTENCILMODE), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, 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), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP2), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP3), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP4), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP5), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP6), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP7), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP8), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP9), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP10), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP11), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP12), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP13), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP14), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP15), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, 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_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), state_tessellation }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_MAXTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_X), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Y), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Z), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_W), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
+ { 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 }, 0 },
- { STATE_RENDER(WINED3DRS_MULTISAMPLEMASK), { STATE_RENDER(WINED3DRS_MULTISAMPLEMASK), state_multisampmask }, 0 },
- { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, 0 },
+ { 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_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 }, 0 },
- { STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), { STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), state_scissor }, 0 },
- { STATE_RENDER(WINED3DRS_SLOPESCALEDEPTHBIAS), { STATE_RENDER(WINED3DRS_DEPTHBIAS), state_depthbias }, 0 },
- { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, 0 },
- { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, 0 },
- { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, 0 },
+ { 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), state_depthbias }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, 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 }, 0 },
- { STATE_RENDER(WINED3DRS_DEPTHBIAS), { STATE_RENDER(WINED3DRS_DEPTHBIAS), state_depthbias }, 0 },
+ { 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 },
/* Samplers */
- { STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler }, 0 },
- { STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler }, 0 },
- { STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler }, 0 },
- { STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler }, 0 },
- { STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler }, 0 },
- { STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler }, 0 },
- { STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler }, 0 },
- { STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler }, 0 },
- { STATE_SAMPLER(8), { STATE_SAMPLER(8), sampler }, 0 },
- { STATE_SAMPLER(9), { STATE_SAMPLER(9), sampler }, 0 },
- { STATE_SAMPLER(10), { STATE_SAMPLER(10), sampler }, 0 },
- { STATE_SAMPLER(11), { STATE_SAMPLER(11), sampler }, 0 },
- { STATE_SAMPLER(12), { STATE_SAMPLER(12), sampler }, 0 },
- { STATE_SAMPLER(13), { STATE_SAMPLER(13), sampler }, 0 },
- { STATE_SAMPLER(14), { STATE_SAMPLER(14), sampler }, 0 },
- { STATE_SAMPLER(15), { STATE_SAMPLER(15), sampler }, 0 },
- { STATE_SAMPLER(16), /* Vertex sampler 0 */ { STATE_SAMPLER(16), sampler }, 0 },
- { STATE_SAMPLER(17), /* Vertex sampler 1 */ { STATE_SAMPLER(17), sampler }, 0 },
- { STATE_SAMPLER(18), /* Vertex sampler 2 */ { STATE_SAMPLER(18), sampler }, 0 },
- { STATE_SAMPLER(19), /* Vertex sampler 3 */ { STATE_SAMPLER(19), sampler }, 0 },
- {0 /* Terminate */, { 0, 0 }, 0 },
+ { 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 }, 0 },
- { STATE_VSHADER, { STATE_VDECL, vertexdeclaration }, 0 },
- { STATE_MATERIAL, { STATE_RENDER(WINED3DRS_SPECULARENABLE), state_specularenable}, 0 },
- { STATE_RENDER(WINED3DRS_SPECULARENABLE), { STATE_RENDER(WINED3DRS_SPECULARENABLE), state_specularenable}, 0 },
+ { STATE_VDECL, { STATE_VDECL, vertexdeclaration }, WINED3D_GL_EXT_NONE },
+ { STATE_VSHADER, { STATE_VDECL, vertexdeclaration }, WINED3D_GL_EXT_NONE },
+ { STATE_MATERIAL, { STATE_RENDER(WINED3DRS_SPECULARENABLE), state_specularenable}, 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 }, 0 },
- { STATE_CLIPPLANE(1), { STATE_CLIPPLANE(1), clipplane }, 0 },
- { STATE_CLIPPLANE(2), { STATE_CLIPPLANE(2), clipplane }, 0 },
- { STATE_CLIPPLANE(3), { STATE_CLIPPLANE(3), clipplane }, 0 },
- { STATE_CLIPPLANE(4), { STATE_CLIPPLANE(4), clipplane }, 0 },
- { STATE_CLIPPLANE(5), { STATE_CLIPPLANE(5), clipplane }, 0 },
- { STATE_CLIPPLANE(6), { STATE_CLIPPLANE(6), clipplane }, 0 },
- { STATE_CLIPPLANE(7), { STATE_CLIPPLANE(7), clipplane }, 0 },
- { STATE_CLIPPLANE(8), { STATE_CLIPPLANE(8), clipplane }, 0 },
- { STATE_CLIPPLANE(9), { STATE_CLIPPLANE(9), clipplane }, 0 },
- { STATE_CLIPPLANE(10), { STATE_CLIPPLANE(10), clipplane }, 0 },
- { STATE_CLIPPLANE(11), { STATE_CLIPPLANE(11), clipplane }, 0 },
- { STATE_CLIPPLANE(12), { STATE_CLIPPLANE(12), clipplane }, 0 },
- { STATE_CLIPPLANE(13), { STATE_CLIPPLANE(13), clipplane }, 0 },
- { STATE_CLIPPLANE(14), { STATE_CLIPPLANE(14), clipplane }, 0 },
- { STATE_CLIPPLANE(15), { STATE_CLIPPLANE(15), clipplane }, 0 },
- { STATE_CLIPPLANE(16), { STATE_CLIPPLANE(16), clipplane }, 0 },
- { STATE_CLIPPLANE(17), { STATE_CLIPPLANE(17), clipplane }, 0 },
- { STATE_CLIPPLANE(18), { STATE_CLIPPLANE(18), clipplane }, 0 },
- { STATE_CLIPPLANE(19), { STATE_CLIPPLANE(19), clipplane }, 0 },
- { STATE_CLIPPLANE(20), { STATE_CLIPPLANE(20), clipplane }, 0 },
- { STATE_CLIPPLANE(21), { STATE_CLIPPLANE(21), clipplane }, 0 },
- { STATE_CLIPPLANE(22), { STATE_CLIPPLANE(22), clipplane }, 0 },
- { STATE_CLIPPLANE(23), { STATE_CLIPPLANE(23), clipplane }, 0 },
- { STATE_CLIPPLANE(24), { STATE_CLIPPLANE(24), clipplane }, 0 },
- { STATE_CLIPPLANE(25), { STATE_CLIPPLANE(25), clipplane }, 0 },
- { STATE_CLIPPLANE(26), { STATE_CLIPPLANE(26), clipplane }, 0 },
- { STATE_CLIPPLANE(27), { STATE_CLIPPLANE(27), clipplane }, 0 },
- { STATE_CLIPPLANE(28), { STATE_CLIPPLANE(28), clipplane }, 0 },
- { STATE_CLIPPLANE(29), { STATE_CLIPPLANE(29), clipplane }, 0 },
- { STATE_CLIPPLANE(30), { STATE_CLIPPLANE(30), clipplane }, 0 },
- { STATE_CLIPPLANE(31), { STATE_CLIPPLANE(31), clipplane }, 0 },
+ { 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 }, 0 },
- { STATE_ACTIVELIGHT(1), { STATE_ACTIVELIGHT(1), light }, 0 },
- { STATE_ACTIVELIGHT(2), { STATE_ACTIVELIGHT(2), light }, 0 },
- { STATE_ACTIVELIGHT(3), { STATE_ACTIVELIGHT(3), light }, 0 },
- { STATE_ACTIVELIGHT(4), { STATE_ACTIVELIGHT(4), light }, 0 },
- { STATE_ACTIVELIGHT(5), { STATE_ACTIVELIGHT(5), light }, 0 },
- { STATE_ACTIVELIGHT(6), { STATE_ACTIVELIGHT(6), light }, 0 },
- { STATE_ACTIVELIGHT(7), { STATE_ACTIVELIGHT(7), light }, 0 },
+ { 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 }, 0 },
+ { STATE_VIEWPORT, { STATE_VIEWPORT, viewport_vertexpart }, WINED3D_GL_EXT_NONE },
/* Transform states follow */
- { STATE_TRANSFORM(WINED3DTS_VIEW), { STATE_TRANSFORM(WINED3DTS_VIEW), transform_view }, 0 },
- { STATE_TRANSFORM(WINED3DTS_PROJECTION), { STATE_TRANSFORM(WINED3DTS_PROJECTION), transform_projection}, 0 },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE0), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE1), { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE2), { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE3), { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE4), { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE5), { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE6), { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE7), { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), transform_world }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 3)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 3)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 4)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 4)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 5)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 5)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 6)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 6)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 7)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 7)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 8)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 8)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 9)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 9)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 10)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 10)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 11)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 11)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 12)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 12)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 13)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 13)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 14)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 14)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 15)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 15)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 16)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 16)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 17)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 17)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 18)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 18)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 19)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 19)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 20)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 20)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 21)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 21)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 22)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 22)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 23)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 23)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 24)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 24)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 25)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 25)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 26)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 26)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 27)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 27)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 28)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 28)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 29)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 29)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 30)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 30)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 31)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 31)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 32)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 32)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 33)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 33)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 34)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 34)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 35)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 35)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 36)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 36)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 37)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 37)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 38)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 38)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 39)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 39)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 40)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 40)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 41)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 41)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 42)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 42)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 43)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 43)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 44)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 44)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 45)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 45)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 46)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 46)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 47)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 47)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 48)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 48)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 49)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 49)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 50)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 50)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 51)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 51)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 52)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 52)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 53)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 53)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 54)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 54)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 55)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 55)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 56)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 56)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 57)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 57)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 58)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 58)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 59)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 59)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 60)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 60)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 61)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 61)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 62)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 62)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 63)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 63)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 64)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 64)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 65)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 65)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 66)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 66)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 67)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 67)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 68)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 68)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 69)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 69)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 70)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 70)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 71)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 71)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 72)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 72)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 73)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 73)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 74)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 74)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 75)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 75)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 76)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 76)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 77)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 77)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 78)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 78)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 79)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 79)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 80)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 80)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 81)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 81)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 82)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 82)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 83)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 83)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 84)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 84)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 85)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 85)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 86)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 86)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 87)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 87)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 88)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 88)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 89)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 89)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 90)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 90)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 91)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 91)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 92)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 92)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 93)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 93)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 94)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 94)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 95)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 95)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 96)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 96)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 97)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 97)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 98)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 98)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 99)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 99)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(100)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(100)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(101)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(101)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(102)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(102)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(103)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(103)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(104)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(104)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(105)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(105)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(106)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(106)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(107)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(107)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(108)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(108)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(109)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(109)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(110)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(110)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(111)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(111)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(112)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(112)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(113)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(113)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(114)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(114)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(115)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(115)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(116)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(116)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(117)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(117)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(118)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(118)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(119)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(119)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(120)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(120)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(121)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(121)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(122)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(122)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(123)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(123)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(124)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(124)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(125)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(125)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(126)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(126)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(127)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(127)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(128)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(128)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(129)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(129)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(130)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(130)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(131)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(131)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(132)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(132)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(133)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(133)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(134)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(134)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(135)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(135)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(136)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(136)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(137)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(137)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(138)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(138)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(139)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(139)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(140)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(140)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(141)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(141)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(142)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(142)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(143)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(143)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(144)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(144)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(145)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(145)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(146)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(146)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(147)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(147)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(148)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(148)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(149)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(149)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(150)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(150)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(151)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(151)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(152)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(152)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(153)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(153)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(154)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(154)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(155)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(155)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(156)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(156)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(157)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(157)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(158)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(158)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(159)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(159)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(160)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(160)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(161)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(161)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(162)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(162)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(163)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(163)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(164)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(164)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(165)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(165)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(166)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(166)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(167)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(167)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(168)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(168)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(169)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(169)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(170)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(170)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(171)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(171)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(172)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(172)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(173)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(173)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(174)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(174)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(175)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(175)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(176)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(176)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(177)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(177)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(178)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(178)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(179)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(179)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(180)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(180)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(181)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(181)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(182)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(182)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(183)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(183)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(184)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(184)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(185)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(185)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(186)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(186)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(187)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(187)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(188)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(188)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(189)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(189)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(190)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(190)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(191)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(191)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(192)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(192)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(193)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(193)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(194)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(194)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(195)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(195)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(196)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(196)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(197)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(197)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(198)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(198)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(199)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(199)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(200)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(200)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(201)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(201)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(202)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(202)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(203)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(203)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(204)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(204)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(205)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(205)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(206)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(206)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(207)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(207)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(208)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(208)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(209)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(209)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(210)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(210)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(211)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(211)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(212)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(212)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(213)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(213)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(214)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(214)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(215)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(215)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(216)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(216)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(217)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(217)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(218)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(218)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(219)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(219)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(220)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(220)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(221)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(221)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(222)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(222)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(223)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(223)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(224)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(224)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(225)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(225)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(226)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(226)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(227)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(227)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(228)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(228)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(229)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(229)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(230)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(230)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(231)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(231)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(232)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(232)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(233)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(233)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(234)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(234)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(235)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(235)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(236)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(236)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(237)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(237)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(238)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(238)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(239)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(239)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(240)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(240)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(241)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(241)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(242)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(242)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(243)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(243)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(244)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(244)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(245)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(245)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(246)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(246)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(247)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(247)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(248)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(248)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(249)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(249)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(250)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(250)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(251)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(251)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(252)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(252)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(253)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(253)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(254)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(254)), transform_worldex }, 0 },
- { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)), transform_worldex }, 0 },
- { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 },
- { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 },
- { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 },
- { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 },
- { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 },
- { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 },
- { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 },
- { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(0, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(1, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(2, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(3, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(4, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(5, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(6, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(7, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, 0 },
+ { 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), transform_texture }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE1), { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE2), { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE3), { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE4), { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE5), { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE6), { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE7), { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 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}, 0 },
- { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, 0 },
- { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, 0 },
+ { STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, 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 }, 0 },
- { STATE_RENDER(WINED3DRS_CLIPPING), { STATE_RENDER(WINED3DRS_CLIPPING), state_clipping }, 0 },
- { STATE_RENDER(WINED3DRS_CLIPPLANEENABLE), { STATE_RENDER(WINED3DRS_CLIPPING), state_clipping }, 0 },
- { STATE_RENDER(WINED3DRS_LIGHTING), { STATE_RENDER(WINED3DRS_LIGHTING), state_lighting }, 0 },
- { STATE_RENDER(WINED3DRS_AMBIENT), { STATE_RENDER(WINED3DRS_AMBIENT), state_ambient }, 0 },
- { STATE_RENDER(WINED3DRS_COLORVERTEX), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, 0 },
- { STATE_RENDER(WINED3DRS_LOCALVIEWER), { STATE_RENDER(WINED3DRS_LOCALVIEWER), state_localviewer }, 0 },
- { STATE_RENDER(WINED3DRS_NORMALIZENORMALS), { STATE_RENDER(WINED3DRS_NORMALIZENORMALS), state_normalize }, 0 },
- { STATE_RENDER(WINED3DRS_DIFFUSEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, 0 },
- { STATE_RENDER(WINED3DRS_SPECULARMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, 0 },
- { STATE_RENDER(WINED3DRS_AMBIENTMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, 0 },
- { STATE_RENDER(WINED3DRS_EMISSIVEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, 0 },
+ { 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), state_clipping }, 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), state_colormat }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SPECULARMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_AMBIENTMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_EMISSIVEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, 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 }, 0 },
- { STATE_RENDER(WINED3DRS_POINTSIZE), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, 0 },
+ { STATE_RENDER(WINED3DRS_VERTEXBLEND), { STATE_RENDER(WINED3DRS_VERTEXBLEND), state_vertexblend_w }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSIZE), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, 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 }, 0 },
+ { 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 }, 0 },
- { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, 0 },
- { STATE_RENDER(WINED3DRS_POINTSCALE_A), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, 0 },
- { STATE_RENDER(WINED3DRS_POINTSCALE_B), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, 0 },
- { STATE_RENDER(WINED3DRS_POINTSCALE_C), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, 0 },
+ { 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), state_pscale }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSCALE_B), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSCALE_C), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_arb }, ARB_POINT_PARAMETERS },
{ STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_ext }, EXT_POINT_PARAMETERS },
- { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_w }, 0 },
+ { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_w }, 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 }, WINE_NORMALIZED_TEXRECT },
- { STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texmatrix }, 0 },
+ { 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 }, WINE_NORMALIZED_TEXRECT },
- { STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texmatrix }, 0 },
+ { 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 }, WINE_NORMALIZED_TEXRECT },
- { STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texmatrix }, 0 },
+ { 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 }, WINE_NORMALIZED_TEXRECT },
- { STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler_texmatrix }, 0 },
+ { 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 }, WINE_NORMALIZED_TEXRECT },
- { STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler_texmatrix }, 0 },
+ { 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 }, WINE_NORMALIZED_TEXRECT },
- { STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texmatrix }, 0 },
+ { 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 }, WINE_NORMALIZED_TEXRECT },
- { STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texmatrix }, 0 },
+ { 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 }, WINE_NORMALIZED_TEXRECT },
- { STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texmatrix }, 0 },
- {0 /* Terminate */, { 0, 0 }, 0 },
+ { 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 }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, 0 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 0 },
- { STATE_PIXELSHADER, { STATE_PIXELSHADER, apply_pixelshader }, 0 },
- { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, apply_pixelshader }, 0 },
- { STATE_RENDER(WINED3DRS_BORDERCOLOR), { STATE_RENDER(WINED3DRS_BORDERCOLOR), state_bordercolor }, 0 },
- { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor }, 0 },
- { STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, 0 },
- { STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, 0 },
- { STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 0 },
- { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 0 },
- { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 0 },
- { STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, 0 },
- { STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, 0 },
- { STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, 0 },
- { STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, 0 },
- { STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, 0 },
- { STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler_texdim }, 0 },
- { STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler_texdim }, 0 },
- { STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texdim }, 0 },
- { STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texdim }, 0 },
- { STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, 0 },
- {0 /* Terminate */, { 0, 0 }, 0 },
+ { 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), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 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), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 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), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 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), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 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), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 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), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 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), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, 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), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, 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), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_PIXELSHADER, { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_BORDERCOLOR), { STATE_RENDER(WINED3DRS_BORDERCOLOR), state_bordercolor }, 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), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, 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), state_fogstartend }, 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 },
};
#undef GLINFO_LOCATION
#define GLINFO_LOCATION (*gl_info)
+/* Context activation is done by the caller. */
static void ffp_enable(IWineD3DDevice *iface, BOOL enable) { }
-static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_info, struct fragment_caps *pCaps)
+static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype,
+ const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
{
pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD |
WINED3DTEXOPCAPS_ADDSIGNED |
@@ -5414,19 +5593,21 @@ static unsigned int num_handlers(const APPLYSTATEFUNC *funcs)
return i;
}
-static void multistate_apply_2(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void multistate_apply_2(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
stateblock->wineD3DDevice->multistate_funcs[state][0](state, stateblock, context);
stateblock->wineD3DDevice->multistate_funcs[state][1](state, stateblock, context);
}
-static void multistate_apply_3(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+static void multistate_apply_3(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
stateblock->wineD3DDevice->multistate_funcs[state][0](state, stateblock, context);
stateblock->wineD3DDevice->multistate_funcs[state][1](state, stateblock, context);
stateblock->wineD3DDevice->multistate_funcs[state][2](state, stateblock, context);
}
HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_multistate_funcs,
- const WineD3D_GL_Info *gl_info, const struct StateEntryTemplate *vertex,
+ 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;
@@ -5468,7 +5649,7 @@ HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_
*/
if(set[cur[i].state]) continue;
/* Skip state lines depending on unsupported extensions */
- if(cur[i].extension && !GL_SUPPORT(cur[i].extension)) continue;
+ if (!GL_SUPPORT(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
diff --git a/reactos/dll/directx/wine/wined3d/stateblock.c b/reactos/dll/directx/wine/wined3d/stateblock.c
index 1c9b5a8db9f..239b777cef6 100644
--- a/reactos/dll/directx/wine/wined3d/stateblock.c
+++ b/reactos/dll/directx/wine/wined3d/stateblock.c
@@ -31,11 +31,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
* Stateblock helper functions follow
**************************************/
-/** Allocates the correct amount of space for pixel and vertex shader constants,
+/* Allocates the correct amount of space for pixel and vertex shader constants,
* along with their set/changed flags on the given stateblock object
*/
-HRESULT allocate_shader_constants(IWineD3DStateBlockImpl* object) {
-
+HRESULT allocate_shader_constants(IWineD3DStateBlockImpl* object)
+{
IWineD3DStateBlockImpl *This = object;
/* Allocate space for floating point constants */
@@ -113,11 +113,8 @@ static inline void stateblock_set_bits(DWORD *map, UINT map_size)
}
/** Set all members of a stateblock savedstate to the given value */
-void stateblock_savedstates_set(
- IWineD3DStateBlock* iface,
- SAVEDSTATES* states,
- BOOL value) {
-
+void stateblock_savedstates_set(IWineD3DStateBlock *iface, SAVEDSTATES *states, BOOL value)
+{
IWineD3DStateBlockImpl *This = (IWineD3DStateBlockImpl *)iface;
unsigned bsize = sizeof(BOOL);
@@ -228,7 +225,7 @@ void stateblock_copy(
memcpy(Dest->vertexShaderConstantI, This->vertexShaderConstantI, sizeof(INT) * MAX_CONST_I * 4);
memcpy(Dest->pixelShaderConstantB, This->pixelShaderConstantB, sizeof(BOOL) * MAX_CONST_B);
memcpy(Dest->pixelShaderConstantI, This->pixelShaderConstantI, sizeof(INT) * MAX_CONST_I * 4);
-
+
memcpy(Dest->streamStride, This->streamStride, sizeof(UINT) * MAX_STREAMS);
memcpy(Dest->streamOffset, This->streamOffset, sizeof(UINT) * MAX_STREAMS);
memcpy(Dest->streamSource, This->streamSource, sizeof(IWineD3DBuffer *) * MAX_STREAMS);
@@ -357,7 +354,7 @@ static inline void record_lights(IWineD3DStateBlockImpl *This, IWineD3DStateBloc
LIST_FOR_EACH(e, &This->lightMap[i]) {
BOOL updated = FALSE;
PLIGHTINFOEL *src = LIST_ENTRY(e, PLIGHTINFOEL, entry), *realLight;
- if(!src->changed || !src->enabledChanged) continue;
+ if (!src->changed && !src->enabledChanged) continue;
/* Look up the light in the destination */
LIST_FOR_EACH(f, &targetStateBlock->lightMap[i]) {
@@ -1087,9 +1084,6 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
unsigned int i;
IWineD3DSwapChain *swapchain;
IWineD3DSurface *backbuffer;
- WINED3DSURFACE_DESC desc = {0};
- UINT width, height;
- RECT scissorrect;
HRESULT hr;
/* Note this may have a large overhead but it should only be executed
@@ -1292,28 +1286,27 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
This->textures[i] = NULL;
}
- /* Set the default scissor rect values */
- desc.Width = &width;
- desc.Height = &height;
-
/* check the return values, because the GetBackBuffer call isn't valid for ddraw */
hr = IWineD3DDevice_GetSwapChain(device, 0, &swapchain);
if( hr == WINED3D_OK && swapchain != NULL) {
WINED3DVIEWPORT vp;
hr = IWineD3DSwapChain_GetBackBuffer(swapchain, 0, WINED3DBACKBUFFER_TYPE_MONO, &backbuffer);
- if( hr == WINED3D_OK && backbuffer != NULL) {
+ if (SUCCEEDED(hr) && backbuffer)
+ {
+ WINED3DSURFACE_DESC desc;
+ RECT scissorrect;
+
IWineD3DSurface_GetDesc(backbuffer, &desc);
IWineD3DSurface_Release(backbuffer);
+ /* Set the default scissor rect values */
scissorrect.left = 0;
- scissorrect.right = width;
+ scissorrect.right = desc.width;
scissorrect.top = 0;
- scissorrect.bottom = height;
+ scissorrect.bottom = desc.height;
hr = IWineD3DDevice_SetScissorRect(device, &scissorrect);
- if( hr != WINED3D_OK ) {
- ERR("This should never happen, expect rendering issues!\n");
- }
+ if (FAILED(hr)) ERR("This should never happen, expect rendering issues!\n");
}
/* Set the default viewport */
diff --git a/reactos/dll/directx/wine/wined3d/surface.c b/reactos/dll/directx/wine/wined3d/surface.c
index 9e9d55c5b33..cce613c6657 100644
--- a/reactos/dll/directx/wine/wined3d/surface.c
+++ b/reactos/dll/directx/wine/wined3d/surface.c
@@ -32,13 +32,214 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
WINE_DECLARE_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
-static void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4], BOOL colorkey);
-static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES convert);
-static void surface_remove_pbo(IWineD3DSurfaceImpl *This);
+#define GLINFO_LOCATION (*gl_info)
-void surface_force_reload(IWineD3DSurface *iface)
+static void surface_cleanup(IWineD3DSurfaceImpl *This)
+{
+ IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ renderbuffer_entry_t *entry, *entry2;
+
+ TRACE("(%p) : Cleaning up.\n", This);
+
+ /* Need a context to destroy the texture. Use the currently active render
+ * target, but only if the primary render target exists. Otherwise
+ * lastActiveRenderTarget is garbage. When destroying the primary render
+ * target, Uninit3D() will activate a context before doing anything. */
+ if (device->render_targets && device->render_targets[0])
+ {
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
+ }
+
+ ENTER_GL();
+
+ if (This->texture_name)
+ {
+ /* Release the OpenGL texture. */
+ TRACE("Deleting texture %u.\n", This->texture_name);
+ glDeleteTextures(1, &This->texture_name);
+ }
+
+ if (This->Flags & SFLAG_PBO)
+ {
+ /* Delete the PBO. */
+ GL_EXTCALL(glDeleteBuffersARB(1, &This->pbo));
+ }
+
+ LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &This->renderbuffers, renderbuffer_entry_t, entry)
+ {
+ GL_EXTCALL(glDeleteRenderbuffersEXT(1, &entry->id));
+ HeapFree(GetProcessHeap(), 0, entry);
+ }
+
+ LEAVE_GL();
+
+ if (This->Flags & SFLAG_DIBSECTION)
+ {
+ /* Release the DC. */
+ SelectObject(This->hDC, This->dib.holdbitmap);
+ DeleteDC(This->hDC);
+ /* Release the DIB section. */
+ DeleteObject(This->dib.DIBsection);
+ This->dib.bitmap_data = NULL;
+ This->resource.allocatedMemory = NULL;
+ }
+
+ if (This->Flags & SFLAG_USERPTR) IWineD3DSurface_SetMem((IWineD3DSurface *)This, NULL);
+ if (This->overlay_dest) list_remove(&This->overlay_entry);
+
+ HeapFree(GetProcessHeap(), 0, This->palette9);
+
+ resource_cleanup((IWineD3DResource *)This);
+}
+
+UINT surface_calculate_size(const struct GlPixelFormatDesc *format_desc, UINT alignment, UINT width, UINT height)
+{
+ UINT size;
+
+ if (format_desc->format == WINED3DFMT_UNKNOWN)
+ {
+ size = 0;
+ }
+ else if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
+ {
+ UINT row_block_count = (width + format_desc->block_width - 1) / format_desc->block_width;
+ UINT row_count = (height + format_desc->block_height - 1) / format_desc->block_height;
+ size = row_count * row_block_count * format_desc->block_byte_count;
+ }
+ else
+ {
+ /* The pitch is a multiple of 4 bytes. */
+ size = height * (((width * format_desc->byte_count) + alignment - 1) & ~(alignment - 1));
+ }
+
+ if (format_desc->heightscale != 0.0f) size *= format_desc->heightscale;
+
+ return size;
+}
+
+HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment,
+ UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type,
+ UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format,
+ WINED3DPOOL pool, IUnknown *parent)
+{
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, &GLINFO_LOCATION);
+ void (*cleanup)(IWineD3DSurfaceImpl *This);
+ unsigned int resource_size;
+ HRESULT hr;
+
+ if (multisample_quality > 0)
+ {
+ FIXME("multisample_quality set to %u, substituting 0\n", multisample_quality);
+ multisample_quality = 0;
+ }
+
+ /* FIXME: Check that the format is supported by the device. */
+
+ resource_size = surface_calculate_size(format_desc, alignment, width, height);
+
+ /* Look at the implementation and set the correct Vtable. */
+ switch (surface_type)
+ {
+ case SURFACE_OPENGL:
+ surface->lpVtbl = &IWineD3DSurface_Vtbl;
+ cleanup = surface_cleanup;
+ break;
+
+ case SURFACE_GDI:
+ surface->lpVtbl = &IWineGDISurface_Vtbl;
+ cleanup = surface_gdi_cleanup;
+ break;
+
+ default:
+ ERR("Requested unknown surface implementation %#x.\n", surface_type);
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ hr = resource_init((IWineD3DResource *)surface, WINED3DRTYPE_SURFACE,
+ device, resource_size, usage, format_desc, pool, parent);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize resource, returning %#x.\n", hr);
+ return hr;
+ }
+
+ /* "Standalone" surface. */
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL);
+
+ surface->currentDesc.Width = width;
+ surface->currentDesc.Height = height;
+ surface->currentDesc.MultiSampleType = multisample_type;
+ surface->currentDesc.MultiSampleQuality = multisample_quality;
+ surface->texture_level = level;
+ list_init(&surface->overlays);
+
+ /* Flags */
+ surface->Flags = SFLAG_NORMCOORD; /* Default to normalized coords. */
+ if (discard) surface->Flags |= SFLAG_DISCARD;
+ if (lockable || format == WINED3DFMT_D16_LOCKABLE) surface->Flags |= SFLAG_LOCKABLE;
+
+ /* Quick lockable sanity check.
+ * TODO: remove this after surfaces, usage and lockability have been debugged properly
+ * this function is too deep to need to care about things like this.
+ * Levels need to be checked too, since they all affect what can be done. */
+ switch (pool)
+ {
+ case WINED3DPOOL_SCRATCH:
+ if(!lockable)
+ {
+ FIXME("Called with a pool of SCRATCH and a lockable of FALSE "
+ "which are mutually exclusive, setting lockable to TRUE.\n");
+ lockable = TRUE;
+ }
+ break;
+
+ case WINED3DPOOL_SYSTEMMEM:
+ if (!lockable)
+ FIXME("Called with a pool of SYSTEMMEM and a lockable of FALSE, this is acceptable but unexpected.\n");
+ break;
+
+ case WINED3DPOOL_MANAGED:
+ if (usage & WINED3DUSAGE_DYNAMIC)
+ FIXME("Called with a pool of MANAGED and a usage of DYNAMIC which are mutually exclusive.\n");
+ break;
+
+ case WINED3DPOOL_DEFAULT:
+ if (lockable && !(usage & (WINED3DUSAGE_DYNAMIC | WINED3DUSAGE_RENDERTARGET | WINED3DUSAGE_DEPTHSTENCIL)))
+ WARN("Creating a lockable surface with a POOL of DEFAULT, that doesn't specify DYNAMIC usage.\n");
+ break;
+
+ default:
+ FIXME("Unknown pool %#x.\n", pool);
+ break;
+ };
+
+ if (usage & WINED3DUSAGE_RENDERTARGET && pool != WINED3DPOOL_DEFAULT)
+ {
+ FIXME("Trying to create a render target that isn't in the default pool.\n");
+ }
+
+ /* Mark the texture as dirty so that it gets loaded first time around. */
+ surface_add_dirty_rect((IWineD3DSurface *)surface, NULL);
+ list_init(&surface->renderbuffers);
+
+ TRACE("surface %p, memory %p, size %u\n", surface, surface->resource.allocatedMemory, surface->resource.size);
+
+ /* Call the private setup routine */
+ hr = IWineD3DSurface_PrivateSetup((IWineD3DSurface *)surface);
+ if (FAILED(hr))
+ {
+ ERR("Private setup failed, returning %#x\n", hr);
+ cleanup(surface);
+ return hr;
+ }
+
+ return hr;
+}
+
+static void surface_force_reload(IWineD3DSurface *iface)
{
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
@@ -53,12 +254,12 @@ void surface_set_texture_name(IWineD3DSurface *iface, GLuint new_name, BOOL srgb
if(srgb)
{
- name = &This->glDescription.srgbTextureName;
+ name = &This->texture_name_srgb;
flag = SFLAG_INSRGBTEX;
}
else
{
- name = &This->glDescription.textureName;
+ name = &This->texture_name;
flag = SFLAG_INTEXTURE;
}
@@ -83,23 +284,24 @@ void surface_set_texture_target(IWineD3DSurface *iface, GLenum target)
TRACE("(%p) : setting target %#x\n", This, target);
- if (This->glDescription.target != target)
+ if (This->texture_target != target)
{
if (target == GL_TEXTURE_RECTANGLE_ARB)
{
This->Flags &= ~SFLAG_NORMCOORD;
}
- else if (This->glDescription.target == GL_TEXTURE_RECTANGLE_ARB)
+ else if (This->texture_target == GL_TEXTURE_RECTANGLE_ARB)
{
This->Flags |= SFLAG_NORMCOORD;
}
}
- This->glDescription.target = target;
+ This->texture_target = target;
surface_force_reload(iface);
}
+/* Context activation is done by the caller. */
static void surface_bind_and_dirtify(IWineD3DSurfaceImpl *This, BOOL srgb) {
- int active_sampler;
+ DWORD active_sampler;
/* We don't need a specific texture unit, but after binding the texture the current unit is dirty.
* Read the unit back instead of switching to 0, this avoids messing around with the state manager's
@@ -118,7 +320,8 @@ static void surface_bind_and_dirtify(IWineD3DSurfaceImpl *This, BOOL srgb) {
LEAVE_GL();
active_sampler = This->resource.wineD3DDevice->rev_tex_unit_map[active_texture - GL_TEXTURE0_ARB];
- if (active_sampler != -1) {
+ if (active_sampler != WINED3D_UNMAPPED_STAGE)
+ {
IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_SAMPLER(active_sampler));
}
IWineD3DSurface_BindTexture((IWineD3DSurface *)This, srgb);
@@ -136,8 +339,13 @@ static BOOL primary_render_target_is_p8(IWineD3DDeviceImpl *device)
return FALSE;
}
-/* This call just downloads data, the caller is responsible for activating the
- * right context and binding the correct texture. */
+#undef GLINFO_LOCATION
+
+#define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
+
+/* This call just downloads data, the caller is responsible for binding the
+ * correct texture. */
+/* Context activation is done by the caller. */
static void surface_download_data(IWineD3DSurfaceImpl *This) {
const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
@@ -150,29 +358,28 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) {
ENTER_GL();
- if (format_desc->format == WINED3DFMT_DXT1 || format_desc->format == WINED3DFMT_DXT2
- || format_desc->format == WINED3DFMT_DXT3 || format_desc->format == WINED3DFMT_DXT4
- || format_desc->format == WINED3DFMT_DXT5 || format_desc->format == WINED3DFMT_ATI2N)
+ if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
{
- if (!GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { /* We can assume this as the texture would not have been created otherwise */
- FIXME("(%p) : Attempting to lock a compressed texture when texture compression isn't supported by opengl\n", This);
- } else {
- TRACE("(%p) : Calling glGetCompressedTexImageARB level %d, format %#x, type %#x, data %p\n",
- This, This->glDescription.level, format_desc->glFormat, format_desc->glType,
- This->resource.allocatedMemory);
+ TRACE("(%p) : Calling glGetCompressedTexImageARB level %d, format %#x, type %#x, data %p.\n",
+ This, This->texture_level, format_desc->glFormat, format_desc->glType,
+ This->resource.allocatedMemory);
- if(This->Flags & SFLAG_PBO) {
- GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, This->pbo));
- checkGLcall("glBindBufferARB");
- GL_EXTCALL(glGetCompressedTexImageARB(This->glDescription.target, This->glDescription.level, NULL));
- checkGLcall("glGetCompressedTexImageARB()");
- GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0));
- checkGLcall("glBindBufferARB");
- } else {
- GL_EXTCALL(glGetCompressedTexImageARB(This->glDescription.target, This->glDescription.level, This->resource.allocatedMemory));
- checkGLcall("glGetCompressedTexImageARB()");
- }
+ if (This->Flags & SFLAG_PBO)
+ {
+ GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, This->pbo));
+ checkGLcall("glBindBufferARB");
+ GL_EXTCALL(glGetCompressedTexImageARB(This->texture_target, This->texture_level, NULL));
+ checkGLcall("glGetCompressedTexImageARB");
+ GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0));
+ checkGLcall("glBindBufferARB");
}
+ else
+ {
+ GL_EXTCALL(glGetCompressedTexImageARB(This->texture_target,
+ This->texture_level, This->resource.allocatedMemory));
+ checkGLcall("glGetCompressedTexImageARB");
+ }
+
LEAVE_GL();
} else {
void *mem;
@@ -198,23 +405,21 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) {
mem = This->resource.allocatedMemory;
}
- TRACE("(%p) : Calling glGetTexImage level %d, format %#x, type %#x, data %p\n", This, This->glDescription.level,
- format, type, mem);
+ TRACE("(%p) : Calling glGetTexImage level %d, format %#x, type %#x, data %p\n",
+ This, This->texture_level, format, type, mem);
if(This->Flags & SFLAG_PBO) {
GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, This->pbo));
checkGLcall("glBindBufferARB");
- glGetTexImage(This->glDescription.target, This->glDescription.level, format,
- type, NULL);
- checkGLcall("glGetTexImage()");
+ glGetTexImage(This->texture_target, This->texture_level, format, type, NULL);
+ checkGLcall("glGetTexImage");
GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0));
checkGLcall("glBindBufferARB");
} else {
- glGetTexImage(This->glDescription.target, This->glDescription.level, format,
- type, mem);
- checkGLcall("glGetTexImage()");
+ glGetTexImage(This->texture_target, This->texture_level, format, type, mem);
+ checkGLcall("glGetTexImage");
}
LEAVE_GL();
@@ -290,105 +495,70 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) {
This->Flags |= SFLAG_INSYSMEM;
}
-/* This call just uploads data, the caller is responsible for activating the
- * right context and binding the correct texture. */
+/* This call just uploads data, the caller is responsible for binding the
+ * correct texture. */
+/* Context activation is done by the caller. */
static void surface_upload_data(IWineD3DSurfaceImpl *This, GLenum internal, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *data) {
const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
- if (format_desc->heightscale != 1.0 && format_desc->heightscale != 0.0) height *= format_desc->heightscale;
+ TRACE("This %p, internal %#x, width %d, height %d, format %#x, type %#x, data %p.\n",
+ This, internal, width, height, format, type, data);
+ TRACE("target %#x, level %u, resource size %u.\n",
+ This->texture_target, This->texture_level, This->resource.size);
- if (format_desc->format == WINED3DFMT_DXT1 || format_desc->format == WINED3DFMT_DXT2
- || format_desc->format == WINED3DFMT_DXT3 || format_desc->format == WINED3DFMT_DXT4
- || format_desc->format == WINED3DFMT_DXT5 || format_desc->format == WINED3DFMT_ATI2N)
+ if (format_desc->heightscale != 1.0f && format_desc->heightscale != 0.0f) height *= format_desc->heightscale;
+
+ ENTER_GL();
+
+ if (This->Flags & SFLAG_PBO)
{
- if (!GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
- FIXME("Using DXT1/3/5 without advertized support\n");
- } else {
- /* glCompressedTexSubImage2D for uploading and glTexImage2D for allocating does not work well on some drivers(r200 dri, MacOS ATI driver)
- * glCompressedTexImage2D does not accept NULL pointers. So for compressed textures surface_allocate_surface does nothing, and this
- * function uses glCompressedTexImage2D instead of the SubImage call
- */
- TRACE("(%p) : Calling glCompressedTexSubImage2D w %d, h %d, data %p\n", This, width, height, data);
- ENTER_GL();
+ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo));
+ checkGLcall("glBindBufferARB");
- if(This->Flags & SFLAG_PBO) {
- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo));
- checkGLcall("glBindBufferARB");
- TRACE("(%p) pbo: %#x, data: %p\n", This, This->pbo, data);
-
- GL_EXTCALL(glCompressedTexImage2DARB(This->glDescription.target, This->glDescription.level, internal,
- width, height, 0 /* border */, This->resource.size, NULL));
- checkGLcall("glCompressedTexSubImage2D");
-
- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
- checkGLcall("glBindBufferARB");
- } else {
- GL_EXTCALL(glCompressedTexImage2DARB(This->glDescription.target, This->glDescription.level, internal,
- width, height, 0 /* border */, This->resource.size, data));
- checkGLcall("glCompressedTexSubImage2D");
- }
- LEAVE_GL();
- }
- } else {
- TRACE("(%p) : Calling glTexSubImage2D w %d, h %d, data, %p\n", This, width, height, data);
- ENTER_GL();
-
- if(This->Flags & SFLAG_PBO) {
- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo));
- checkGLcall("glBindBufferARB");
- TRACE("(%p) pbo: %#x, data: %p\n", This, This->pbo, data);
-
- glTexSubImage2D(This->glDescription.target, This->glDescription.level, 0, 0, width, height, format, type, NULL);
- checkGLcall("glTexSubImage2D");
-
- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
- checkGLcall("glBindBufferARB");
- }
- else {
- glTexSubImage2D(This->glDescription.target, This->glDescription.level, 0, 0, width, height, format, type, data);
- checkGLcall("glTexSubImage2D");
- }
-
- LEAVE_GL();
+ TRACE("(%p) pbo: %#x, data: %p.\n", This, This->pbo, data);
+ data = NULL;
}
+
+ if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
+ {
+ TRACE("Calling glCompressedTexSubImage2DARB.\n");
+
+ GL_EXTCALL(glCompressedTexSubImage2DARB(This->texture_target, This->texture_level,
+ 0, 0, width, height, internal, This->resource.size, data));
+ checkGLcall("glCompressedTexSubImage2DARB");
+ }
+ else
+ {
+ TRACE("Calling glTexSubImage2D.\n");
+
+ glTexSubImage2D(This->texture_target, This->texture_level,
+ 0, 0, width, height, format, type, data);
+ checkGLcall("glTexSubImage2D");
+ }
+
+ if (This->Flags & SFLAG_PBO)
+ {
+ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
+ checkGLcall("glBindBufferARB");
+ }
+
+ LEAVE_GL();
}
-/* This call just allocates the texture, the caller is responsible for
- * activating the right context and binding the correct texture. */
+/* This call just allocates the texture, the caller is responsible for binding
+ * the correct texture. */
+/* Context activation is done by the caller. */
static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal, GLsizei width, GLsizei height, GLenum format, GLenum type) {
const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
BOOL enable_client_storage = FALSE;
const BYTE *mem = NULL;
- if (format_desc->heightscale != 1.0 && format_desc->heightscale != 0.0) height *= format_desc->heightscale;
+ if (format_desc->heightscale != 1.0f && format_desc->heightscale != 0.0f) height *= format_desc->heightscale;
TRACE("(%p) : Creating surface (target %#x) level %d, d3d format %s, internal format %#x, width %d, height %d, gl format %#x, gl type=%#x\n",
- This, This->glDescription.target, This->glDescription.level, debug_d3dformat(format_desc->format),
+ This, This->texture_target, This->texture_level, debug_d3dformat(format_desc->format),
internal, width, height, format, type);
- if (format_desc->format == WINED3DFMT_DXT1 || format_desc->format == WINED3DFMT_DXT2
- || format_desc->format == WINED3DFMT_DXT3 || format_desc->format == WINED3DFMT_DXT4
- || format_desc->format == WINED3DFMT_DXT5 || format_desc->format == WINED3DFMT_ATI2N)
- {
- /* glCompressedTexImage2D does not accept NULL pointers, so we cannot allocate a compressed texture without uploading data */
- TRACE("Not allocating compressed surfaces, surface_upload_data will specify them\n");
-
- /* We have to point GL to the client storage memory here, because upload_data might use a PBO. This means a double upload
- * once, unfortunately
- */
- if(GL_SUPPORT(APPLE_CLIENT_STORAGE)) {
- /* Neither NONPOW2, DIBSECTION nor OVERSIZE flags can be set on compressed textures */
- This->Flags |= SFLAG_CLIENT;
- mem = (BYTE *)(((ULONG_PTR) This->resource.heapMemory + (RESOURCE_ALIGNMENT - 1)) & ~(RESOURCE_ALIGNMENT - 1));
- ENTER_GL();
- GL_EXTCALL(glCompressedTexImage2DARB(This->glDescription.target, This->glDescription.level, internal,
- width, height, 0 /* border */, This->resource.size, mem));
- LEAVE_GL();
- }
-
- return;
- }
-
ENTER_GL();
if(GL_SUPPORT(APPLE_CLIENT_STORAGE)) {
@@ -413,8 +583,18 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal,
mem = (BYTE *)(((ULONG_PTR) This->resource.heapMemory + (RESOURCE_ALIGNMENT - 1)) & ~(RESOURCE_ALIGNMENT - 1));
}
}
- glTexImage2D(This->glDescription.target, This->glDescription.level, internal, width, height, 0, format, type, mem);
- checkGLcall("glTexImage2D");
+
+ if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED && mem)
+ {
+ GL_EXTCALL(glCompressedTexImage2DARB(This->texture_target, This->texture_level,
+ internal, width, height, 0, This->resource.size, mem));
+ }
+ else
+ {
+ glTexImage2D(This->texture_target, This->texture_level,
+ internal, width, height, 0, format, type, mem);
+ checkGLcall("glTexImage2D");
+ }
if(enable_client_storage) {
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
@@ -426,6 +606,7 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal,
/* In D3D the depth stencil dimensions have to be greater than or equal to the
* render target dimensions. With FBOs, the dimensions have to be an exact match. */
/* TODO: We should synchronize the renderbuffer's content with the texture's content. */
+/* GL locking is done by the caller */
void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int width, unsigned int height) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
renderbuffer_entry_t *entry;
@@ -526,64 +707,31 @@ void surface_add_dirty_rect(IWineD3DSurface *iface, const RECT *dirty_rect)
}
}
+static inline BOOL surface_can_stretch_rect(IWineD3DSurfaceImpl *src, IWineD3DSurfaceImpl *dst)
+{
+ return ((src->resource.format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE)
+ || (src->resource.usage & WINED3DUSAGE_RENDERTARGET))
+ && ((dst->resource.format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE)
+ || (dst->resource.usage & WINED3DUSAGE_RENDERTARGET))
+ && (src->resource.format_desc->format == dst->resource.format_desc->format
+ || (is_identity_fixup(src->resource.format_desc->color_fixup)
+ && is_identity_fixup(dst->resource.format_desc->color_fixup)));
+}
+
static ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface)
{
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
ULONG ref = InterlockedDecrement(&This->resource.ref);
TRACE("(%p) : Releasing from %d\n", This, ref + 1);
- if (ref == 0) {
- IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
- renderbuffer_entry_t *entry, *entry2;
- TRACE("(%p) : cleaning up\n", This);
- /* Need a context to destroy the texture. Use the currently active render target, but only if
- * the primary render target exists. Otherwise lastActiveRenderTarget is garbage, see above.
- * When destroying the primary rt, Uninit3D will activate a context before doing anything
- */
- if(device->render_targets && device->render_targets[0]) {
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
- }
+ if (!ref)
+ {
+ surface_cleanup(This);
- ENTER_GL();
- if (This->glDescription.textureName != 0) { /* release the openGL texture.. */
- TRACE("Deleting texture %d\n", This->glDescription.textureName);
- glDeleteTextures(1, &This->glDescription.textureName);
- }
-
- if(This->Flags & SFLAG_PBO) {
- /* Delete the PBO */
- GL_EXTCALL(glDeleteBuffersARB(1, &This->pbo));
- }
-
- LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &This->renderbuffers, renderbuffer_entry_t, entry) {
- GL_EXTCALL(glDeleteRenderbuffersEXT(1, &entry->id));
- HeapFree(GetProcessHeap(), 0, entry);
- }
- LEAVE_GL();
-
- if(This->Flags & SFLAG_DIBSECTION) {
- /* Release the DC */
- SelectObject(This->hDC, This->dib.holdbitmap);
- DeleteDC(This->hDC);
- /* Release the DIB section */
- DeleteObject(This->dib.DIBsection);
- This->dib.bitmap_data = NULL;
- This->resource.allocatedMemory = NULL;
- }
- if(This->Flags & SFLAG_USERPTR) IWineD3DSurface_SetMem(iface, NULL);
-
- HeapFree(GetProcessHeap(), 0, This->palette9);
-
- resource_cleanup((IWineD3DResource *)iface);
-
- if(This->overlay_dest) {
- list_remove(&This->overlay_entry);
- }
-
- TRACE("(%p) Released\n", This);
+ TRACE("(%p) Released.\n", This);
HeapFree(GetProcessHeap(), 0, This);
-
}
+
return ref;
}
@@ -602,13 +750,13 @@ void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb)
if (IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&baseTexture) == WINED3D_OK) {
IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *) baseTexture;
TRACE("Passing to container\n");
- tex_impl->baseTexture.internal_preload(baseTexture, SRGB_RGB);
+ tex_impl->baseTexture.internal_preload(baseTexture, srgb);
IWineD3DBaseTexture_Release(baseTexture);
} else {
TRACE("(%p) : About to load surface\n", This);
if(!device->isInDraw) {
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
}
if (This->resource.format_desc->format == WINED3DFMT_P8
@@ -630,7 +778,7 @@ void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb)
GLclampf tmp;
tmp = 0.9f;
ENTER_GL();
- glPrioritizeTextures(1, &This->glDescription.textureName, &tmp);
+ glPrioritizeTextures(1, &This->texture_name, &tmp);
LEAVE_GL();
}
}
@@ -641,6 +789,7 @@ static void WINAPI IWineD3DSurfaceImpl_PreLoad(IWineD3DSurface *iface) {
surface_internal_preload(iface, SRGB_ANY);
}
+/* Context activation is done by the caller. */
static void surface_remove_pbo(IWineD3DSurfaceImpl *This) {
This->resource.heapMemory = HeapAlloc(GetProcessHeap() ,0 , This->resource.size + RESOURCE_ALIGNMENT);
This->resource.allocatedMemory =
@@ -648,11 +797,11 @@ static void surface_remove_pbo(IWineD3DSurfaceImpl *This) {
ENTER_GL();
GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo));
- checkGLcall("glBindBuffer(GL_PIXEL_UNPACK_BUFFER, This->pbo)");
+ checkGLcall("glBindBufferARB(GL_PIXEL_UNPACK_BUFFER, This->pbo)");
GL_EXTCALL(glGetBufferSubDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0, This->resource.size, This->resource.allocatedMemory));
- checkGLcall("glGetBufferSubData");
+ checkGLcall("glGetBufferSubDataARB");
GL_EXTCALL(glDeleteBuffersARB(1, &This->pbo));
- checkGLcall("glDeleteBuffers");
+ checkGLcall("glDeleteBuffersARB");
LEAVE_GL();
This->pbo = 0;
@@ -662,6 +811,7 @@ static void surface_remove_pbo(IWineD3DSurfaceImpl *This) {
static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) {
IWineD3DBaseTexture *texture = NULL;
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
+ IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
renderbuffer_entry_t *entry, *entry2;
TRACE("(%p)\n", iface);
@@ -689,8 +839,11 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) {
IWineD3DSurface_ModifyLocation(iface, SFLAG_INDRAWABLE, FALSE);
}
IWineD3DSurface_ModifyLocation(iface, SFLAG_INTEXTURE, FALSE);
+ IWineD3DSurface_ModifyLocation(iface, SFLAG_INSRGBTEX, FALSE);
This->Flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED);
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
+
/* Destroy PBOs, but load them into real sysmem before */
if(This->Flags & SFLAG_PBO) {
surface_remove_pbo(This);
@@ -716,8 +869,10 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) {
IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **) &texture);
if(!texture) {
ENTER_GL();
- glDeleteTextures(1, &This->glDescription.textureName);
- This->glDescription.textureName = 0;
+ glDeleteTextures(1, &This->texture_name);
+ This->texture_name = 0;
+ glDeleteTextures(1, &This->texture_name_srgb);
+ This->texture_name_srgb = 0;
LEAVE_GL();
} else {
IWineD3DBaseTexture_Release(texture);
@@ -729,13 +884,6 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) {
IWineD3DSurface IWineD3DSurface parts follow
****************************************************** */
-static void WINAPI IWineD3DSurfaceImpl_GetGlDesc(IWineD3DSurface *iface, glDescriptor **glDescription)
-{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- TRACE("(%p) : returning %p\n", This, &This->glDescription);
- *glDescription = &This->glDescription;
-}
-
/* Read the framebuffer back into the surface */
static void read_from_framebuffer(IWineD3DSurfaceImpl *This, CONST RECT *rect, void *dest, UINT pitch) {
IWineD3DSwapChainImpl *swapchain;
@@ -854,11 +1002,11 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, CONST RECT *rect, v
/* Save old pixel store pack state */
glGetIntegerv(GL_PACK_ROW_LENGTH, &rowLen);
- checkGLcall("glIntegerv");
+ checkGLcall("glGetIntegerv");
glGetIntegerv(GL_PACK_SKIP_PIXELS, &skipPix);
- checkGLcall("glIntegerv");
+ checkGLcall("glGetIntegerv");
glGetIntegerv(GL_PACK_SKIP_ROWS, &skipRow);
- checkGLcall("glIntegerv");
+ checkGLcall("glGetIntegerv");
/* Setup pixel store pack state -- to glReadPixels into the correct place */
glPixelStorei(GL_PACK_ROW_LENGTH, This->currentDesc.Width);
@@ -1039,18 +1187,15 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
* this code from getting called in such cases or perhaps
* we can use FBOs */
- glCopyTexSubImage2D(This->glDescription.target,
- This->glDescription.level,
- 0, 0, 0, 0,
- This->currentDesc.Width,
- This->currentDesc.Height);
+ glCopyTexSubImage2D(This->texture_target, This->texture_level,
+ 0, 0, 0, 0, This->currentDesc.Width, This->currentDesc.Height);
checkGLcall("glCopyTexSubImage2D");
glReadBuffer(prevRead);
checkGLcall("glReadBuffer");
LEAVE_GL();
- TRACE("Updated target %d\n", This->glDescription.target);
+ TRACE("Updated target %d\n", This->texture_target);
}
static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This) {
@@ -1074,7 +1219,7 @@ static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This) {
GLenum error;
IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
GL_EXTCALL(glGenBuffersARB(1, &This->pbo));
@@ -1120,6 +1265,7 @@ static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This) {
static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
IWineD3DDeviceImpl *myDevice = This->resource.wineD3DDevice;
+ const RECT *pass_rect = pRect;
TRACE("(%p) : rect@%p flags(%08x), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->resource.allocatedMemory);
@@ -1152,77 +1298,24 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED
goto lock_end;
}
- /* Now download the surface content from opengl
- * Use the render target readback if the surface is on a swapchain(=onscreen render target) or the current primary target
- * Offscreen targets which are not active at the moment or are higher targets(FBOs) can be locked with the texture path
- */
- if ((This->Flags & SFLAG_SWAPCHAIN) || iface == myDevice->render_targets[0])
+ /* IWineD3DSurface_LoadLocation() does not check if the rectangle specifies
+ * the full surface. Most callers don't need that, so do it here. */
+ if (pRect && pRect->top == 0 && pRect->left == 0
+ && pRect->right == This->currentDesc.Width
+ && pRect->bottom == This->currentDesc.Height)
{
- const RECT *pass_rect = pRect;
+ pass_rect = NULL;
+ }
- /* IWineD3DSurface_LoadLocation does not check if the rectangle specifies the full surfaces
- * because most caller functions do not need that. So do that here
- */
- if(pRect &&
- pRect->top == 0 &&
- pRect->left == 0 &&
- pRect->right == This->currentDesc.Width &&
- pRect->bottom == This->currentDesc.Height) {
- pass_rect = NULL;
- }
-
- switch(wined3d_settings.rendertargetlock_mode) {
- case RTL_TEXDRAW:
- case RTL_TEXTEX:
- FIXME("Reading from render target with a texture isn't implemented yet, falling back to framebuffer reading\n");
-#if 0
- /* Disabled for now. LoadLocation prefers the texture over the drawable as the source. So if we copy to the
- * texture first, then to sysmem, we'll avoid glReadPixels and use glCopyTexImage and glGetTexImage2D instead.
- * This may be faster on some cards
- */
- IWineD3DSurface_LoadLocation(iface, SFLAG_INTEXTURE, NULL /* No partial texture copy yet */);
-#endif
- /* drop through */
-
- case RTL_AUTO:
- case RTL_READDRAW:
- case RTL_READTEX:
- IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, pass_rect);
- break;
-
- case RTL_DISABLE:
- break;
- }
- } else if(iface == myDevice->stencilBufferTarget) {
- /** the depth stencil in openGL has a format of GL_FLOAT
- * which should be good for WINED3DFMT_D16_LOCKABLE
- * and WINED3DFMT_D16
- * it is unclear what format the stencil buffer is in except.
- * 'Each index is converted to fixed point...
- * If GL_MAP_STENCIL is GL_TRUE, indices are replaced by their
- * mappings in the table GL_PIXEL_MAP_S_TO_S.
- * glReadPixels(This->lockedRect.left,
- * This->lockedRect.bottom - j - 1,
- * This->lockedRect.right - This->lockedRect.left,
- * 1,
- * GL_DEPTH_COMPONENT,
- * type,
- * (char *)pLockedRect->pBits + (pLockedRect->Pitch * (j-This->lockedRect.top)));
- *
- * Depth Stencil surfaces which are not the current depth stencil target should have their data in a
- * gl texture(next path), or in local memory(early return because of set SFLAG_INSYSMEM above). If
- * none of that is the case the problem is not in this function :-)
- ********************************************/
- FIXME("Depth stencil locking not supported yet\n");
- } else {
- /* This path is for normal surfaces, offscreen render targets and everything else that is in a gl texture */
- TRACE("locking an ordinary surface\n");
- IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL /* no partial locking for textures yet */);
+ if (!(wined3d_settings.rendertargetlock_mode == RTL_DISABLE
+ && ((This->Flags & SFLAG_SWAPCHAIN) || iface == myDevice->render_targets[0])))
+ {
+ IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, pass_rect);
}
lock_end:
if(This->Flags & SFLAG_PBO) {
- ActivateContext(myDevice, myDevice->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(myDevice, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo));
checkGLcall("glBindBufferARB");
@@ -1292,10 +1385,10 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm
}
glGetIntegerv(GL_PACK_SWAP_BYTES, &prev_store);
- checkGLcall("glIntegerv");
+ checkGLcall("glGetIntegerv");
glGetIntegerv(GL_CURRENT_RASTER_POSITION, &prev_rasterpos[0]);
- checkGLcall("glIntegerv");
- glPixelZoom(1.0, -1.0);
+ checkGLcall("glGetIntegerv");
+ glPixelZoom(1.0f, -1.0f);
checkGLcall("glPixelZoom");
/* If not fullscreen, we need to skip a number of bytes to find the next row of data */
@@ -1303,7 +1396,7 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm
glPixelStorei(GL_UNPACK_ROW_LENGTH, This->currentDesc.Width);
glRasterPos3i(This->lockedRect.left, This->lockedRect.top, 1);
- checkGLcall("glRasterPos2f");
+ checkGLcall("glRasterPos3i");
/* Some drivers(radeon dri, others?) don't like exceptions during
* glDrawPixels. If the surface is a DIB section, it might be in GDIMode
@@ -1345,7 +1438,7 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm
checkGLcall("glBindBufferARB");
}
- glPixelZoom(1.0,1.0);
+ glPixelZoom(1.0f, 1.0f);
checkGLcall("glPixelZoom");
glRasterPos3iv(&prev_rasterpos[0]);
@@ -1353,7 +1446,7 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm
/* Reset to previous pack row length */
glPixelStorei(GL_UNPACK_ROW_LENGTH, skipBytes);
- checkGLcall("glPixelStorei GL_UNPACK_ROW_LENGTH");
+ checkGLcall("glPixelStorei(GL_UNPACK_ROW_LENGTH)");
if(!swapchain) {
glDrawBuffer(myDevice->offscreenBuffer);
@@ -1382,7 +1475,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
if (This->Flags & SFLAG_PBO) {
TRACE("Freeing PBO memory\n");
- ActivateContext(myDevice, myDevice->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(myDevice, NULL, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo));
GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB));
@@ -1423,14 +1516,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
switch(wined3d_settings.rendertargetlock_mode) {
case RTL_READTEX:
- case RTL_TEXTEX:
- ActivateContext(myDevice, iface, CTXUSAGE_BLIT);
IWineD3DSurface_LoadLocation(iface, SFLAG_INTEXTURE, NULL /* partial texture loading not supported yet */);
/* drop through */
- case RTL_AUTO:
case RTL_READDRAW:
- case RTL_TEXDRAW:
IWineD3DSurface_LoadLocation(iface, SFLAG_INDRAWABLE, fullsurface ? NULL : &This->dirtyRect);
break;
}
@@ -1662,7 +1751,6 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
}
else if(!GL_SUPPORT(EXT_PALETTED_TEXTURE) && GL_SUPPORT(ARB_FRAGMENT_PROGRAM)) {
*format = GL_ALPHA;
- *internal = GL_RGBA;
*type = GL_UNSIGNED_BYTE;
*target_bpp = 1;
}
@@ -1684,7 +1772,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
if (colorkey_active) {
*convert = CONVERT_CK_565;
*format = GL_RGBA;
- *internal = GL_RGBA;
+ *internal = GL_RGB5_A1;
*type = GL_UNSIGNED_SHORT_5_5_5_1;
}
break;
@@ -1693,7 +1781,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
if (colorkey_active) {
*convert = CONVERT_CK_5551;
*format = GL_BGRA;
- *internal = GL_RGBA;
+ *internal = GL_RGB5_A1;
*type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
}
break;
@@ -1702,7 +1790,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
if (colorkey_active) {
*convert = CONVERT_CK_RGB24;
*format = GL_RGBA;
- *internal = GL_RGBA;
+ *internal = GL_RGBA8;
*type = GL_UNSIGNED_INT_8_8_8_8;
*target_bpp = 4;
}
@@ -1712,16 +1800,15 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
if (colorkey_active) {
*convert = CONVERT_RGB32_888;
*format = GL_RGBA;
- *internal = GL_RGBA;
+ *internal = GL_RGBA8;
*type = GL_UNSIGNED_INT_8_8_8_8;
}
break;
case WINED3DFMT_R8G8_SNORM:
- if(GL_SUPPORT(NV_TEXTURE_SHADER3)) break;
+ if (GL_SUPPORT(NV_TEXTURE_SHADER)) break;
*convert = CONVERT_V8U8;
*format = GL_BGR;
- *internal = GL_RGB8;
*type = GL_UNSIGNED_BYTE;
*target_bpp = 3;
break;
@@ -1735,7 +1822,6 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
/* Load it into unsigned R5G6B5, swap L and V channels, and revert that in the shader */
*target_bpp = 2;
*format = GL_RGB;
- *internal = GL_RGB5;
*type = GL_UNSIGNED_SHORT_5_6_5;
}
break;
@@ -1752,25 +1838,22 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
*/
} else {
*format = GL_BGRA;
- *internal = GL_RGB8;
*type = GL_UNSIGNED_INT_8_8_8_8_REV;
}
break;
case WINED3DFMT_R8G8B8A8_SNORM:
- if(GL_SUPPORT(NV_TEXTURE_SHADER3)) break;
+ if (GL_SUPPORT(NV_TEXTURE_SHADER)) break;
*convert = CONVERT_Q8W8V8U8;
*format = GL_BGRA;
- *internal = GL_RGBA8;
*type = GL_UNSIGNED_BYTE;
*target_bpp = 4;
break;
case WINED3DFMT_R16G16_SNORM:
- if(GL_SUPPORT(NV_TEXTURE_SHADER3)) break;
+ if (GL_SUPPORT(NV_TEXTURE_SHADER)) break;
*convert = CONVERT_V16U16;
*format = GL_BGR;
- *internal = GL_RGB16_EXT;
*type = GL_UNSIGNED_SHORT;
*target_bpp = 6;
break;
@@ -1782,7 +1865,6 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
*/
*convert = CONVERT_A4L4;
*format = GL_LUMINANCE_ALPHA;
- *internal = GL_LUMINANCE4_ALPHA4;
*type = GL_UNSIGNED_BYTE;
*target_bpp = 2;
break;
@@ -1790,7 +1872,6 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
case WINED3DFMT_R16G16_UNORM:
*convert = CONVERT_G16R16;
*format = GL_RGB;
- *internal = GL_RGB16_EXT;
*type = GL_UNSIGNED_SHORT;
*target_bpp = 6;
break;
@@ -1798,7 +1879,6 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
case WINED3DFMT_R16G16_FLOAT:
*convert = CONVERT_R16G16F;
*format = GL_RGB;
- *internal = GL_RGB16F_ARB;
*type = GL_HALF_FLOAT_ARB;
*target_bpp = 6;
break;
@@ -1806,11 +1886,33 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
case WINED3DFMT_R32G32_FLOAT:
*convert = CONVERT_R32G32F;
*format = GL_RGB;
- *internal = GL_RGB32F_ARB;
*type = GL_FLOAT;
*target_bpp = 12;
break;
+ case WINED3DFMT_D15S1:
+ if (GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL))
+ {
+ *convert = CONVERT_D15S1;
+ *target_bpp = 4;
+ }
+ break;
+
+ case WINED3DFMT_D24X4S4:
+ if (GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL))
+ {
+ *convert = CONVERT_D24X4S4;
+ }
+ break;
+
+ case WINED3DFMT_D24FS8:
+ if (GL_SUPPORT(ARB_DEPTH_BUFFER_FLOAT))
+ {
+ *convert = CONVERT_D24FS8;
+ *target_bpp = 8;
+ }
+ break;
+
default:
break;
}
@@ -1818,6 +1920,86 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
return WINED3D_OK;
}
+static void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4], BOOL colorkey)
+{
+ IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+ IWineD3DPaletteImpl *pal = This->palette;
+ BOOL index_in_alpha = FALSE;
+ unsigned int i;
+
+ /* Old games like StarCraft, C&C, Red Alert and others use P8 render targets.
+ * Reading back the RGB output each lockrect (each frame as they lock the whole screen)
+ * is slow. Further RGB->P8 conversion is not possible because palettes can have
+ * duplicate entries. Store the color key in the unused alpha component to speed the
+ * download up and to make conversion unneeded. */
+ index_in_alpha = primary_render_target_is_p8(device);
+
+ if (!pal)
+ {
+ UINT dxVersion = ((IWineD3DImpl *)device->wineD3D)->dxVersion;
+
+ /* In DirectDraw the palette is a property of the surface, there are no such things as device palettes. */
+ if (dxVersion <= 7)
+ {
+ ERR("This code should never get entered for DirectDraw!, expect problems\n");
+ if (index_in_alpha)
+ {
+ /* Guarantees that memory representation remains correct after sysmem<->texture transfers even if
+ * there's no palette at this time. */
+ for (i = 0; i < 256; i++) table[i][3] = i;
+ }
+ }
+ else
+ {
+ /* Direct3D >= 8 palette usage style: P8 textures use device palettes, palette entry format is A8R8G8B8,
+ * alpha is stored in peFlags and may be used by the app if D3DPTEXTURECAPS_ALPHAPALETTE device
+ * capability flag is present (wine does advertise this capability) */
+ for (i = 0; i < 256; ++i)
+ {
+ table[i][0] = device->palettes[device->currentPalette][i].peRed;
+ table[i][1] = device->palettes[device->currentPalette][i].peGreen;
+ table[i][2] = device->palettes[device->currentPalette][i].peBlue;
+ table[i][3] = device->palettes[device->currentPalette][i].peFlags;
+ }
+ }
+ }
+ else
+ {
+ TRACE("Using surface palette %p\n", pal);
+ /* Get the surface's palette */
+ for (i = 0; i < 256; ++i)
+ {
+ table[i][0] = pal->palents[i].peRed;
+ table[i][1] = pal->palents[i].peGreen;
+ table[i][2] = pal->palents[i].peBlue;
+
+ /* When index_in_alpha is set the palette index is stored in the
+ * alpha component. In case of a readback we can then read
+ * GL_ALPHA. Color keying is handled in BltOverride using a
+ * GL_ALPHA_TEST using GL_NOT_EQUAL. In case of index_in_alpha the
+ * color key itself is passed to glAlphaFunc in other cases the
+ * alpha component of pixels that should be masked away is set to 0. */
+ if (index_in_alpha)
+ {
+ table[i][3] = i;
+ }
+ else if (colorkey && (i >= This->SrcBltCKey.dwColorSpaceLowValue)
+ && (i <= This->SrcBltCKey.dwColorSpaceHighValue))
+ {
+ table[i][3] = 0x00;
+ }
+ else if(pal->Flags & WINEDDPCAPS_ALPHA)
+ {
+ table[i][3] = pal->palents[i].peFlags;
+ }
+ else
+ {
+ table[i][3] = 0xFF;
+ }
+ }
+ }
+}
+
static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UINT width,
UINT height, UINT outpitch, CONVERT_TYPES convert, IWineD3DSurfaceImpl *This)
{
@@ -2176,82 +2358,83 @@ static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UI
float red = (*Source++);
Dest[0] = green;
Dest[1] = red;
- Dest[2] = 1.0;
+ Dest[2] = 1.0f;
Dest += 3;
}
}
break;
}
+ case CONVERT_D15S1:
+ {
+ unsigned int x, y;
+
+ for (y = 0; y < height; ++y)
+ {
+ const WORD *source = (const WORD *)(src + y * pitch);
+ DWORD *dest = (DWORD *)(dst + y * outpitch);
+
+ for (x = 0; x < width; ++x)
+ {
+ /* The depth data is normalized, so needs to be scaled,
+ * the stencil data isn't. Scale depth data by
+ * (2^24-1)/(2^15-1) ~~ (2^9 + 2^-6). */
+ WORD d15 = source[x] >> 1;
+ DWORD d24 = (d15 << 9) + (d15 >> 6);
+ dest[x] = (d24 << 8) | (source[x] & 0x1);
+ }
+ }
+ break;
+ }
+
+ case CONVERT_D24X4S4:
+ {
+ unsigned int x, y;
+
+ for (y = 0; y < height; ++y)
+ {
+ const DWORD *source = (const DWORD *)(src + y * pitch);
+ DWORD *dest = (DWORD *)(dst + y * outpitch);
+
+ for (x = 0; x < width; ++x)
+ {
+ /* Just need to clear out the X4 part. */
+ dest[x] = source[x] & ~0xf0;
+ }
+ }
+ break;
+ }
+
+ case CONVERT_D24FS8:
+ {
+ unsigned int x, y;
+
+ for (y = 0; y < height; ++y)
+ {
+ const DWORD *source = (const DWORD *)(src + y * pitch);
+ float *dest_f = (float *)(dst + y * outpitch);
+ DWORD *dest_s = (DWORD *)(dst + y * outpitch);
+
+ for (x = 0; x < width; ++x)
+ {
+ dest_f[x * 2] = float_24_to_32((source[x] & 0xffffff00) >> 8);
+ dest_s[x * 2 + 1] = source[x] & 0xff;
+ }
+ }
+ break;
+ }
+
default:
- ERR("Unsupported conversation type %d\n", convert);
+ ERR("Unsupported conversion type %#x.\n", convert);
}
return WINED3D_OK;
}
-static void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4], BOOL colorkey) {
- IWineD3DPaletteImpl* pal = This->palette;
- IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
- BOOL index_in_alpha = FALSE;
- int dxVersion = ( (IWineD3DImpl *) device->wineD3D)->dxVersion;
- unsigned int i;
-
- /* Old games like StarCraft, C&C, Red Alert and others use P8 render targets.
- * Reading back the RGB output each lockrect (each frame as they lock the whole screen)
- * is slow. Further RGB->P8 conversion is not possible because palettes can have
- * duplicate entries. Store the color key in the unused alpha component to speed the
- * download up and to make conversion unneeded. */
- index_in_alpha = primary_render_target_is_p8(device);
-
- if (pal == NULL) {
- /* In DirectDraw the palette is a property of the surface, there are no such things as device palettes. */
- if(dxVersion <= 7) {
- ERR("This code should never get entered for DirectDraw!, expect problems\n");
- if(index_in_alpha) {
- /* Guarantees that memory representation remains correct after sysmem<->texture transfers even if
- there's no palette at this time. */
- for (i = 0; i < 256; i++) table[i][3] = i;
- }
- } else {
- /* Direct3D >= 8 palette usage style: P8 textures use device palettes, palette entry format is A8R8G8B8,
- alpha is stored in peFlags and may be used by the app if D3DPTEXTURECAPS_ALPHAPALETTE device
- capability flag is present (wine does advertise this capability) */
- for (i = 0; i < 256; i++) {
- table[i][0] = device->palettes[device->currentPalette][i].peRed;
- table[i][1] = device->palettes[device->currentPalette][i].peGreen;
- table[i][2] = device->palettes[device->currentPalette][i].peBlue;
- table[i][3] = device->palettes[device->currentPalette][i].peFlags;
- }
- }
- } else {
- TRACE("Using surface palette %p\n", pal);
- /* Get the surface's palette */
- for (i = 0; i < 256; i++) {
- table[i][0] = pal->palents[i].peRed;
- table[i][1] = pal->palents[i].peGreen;
- table[i][2] = pal->palents[i].peBlue;
-
- /* When index_in_alpha is the palette index is stored in the alpha component. In case of a readback
- we can then read GL_ALPHA. Color keying is handled in BltOverride using a GL_ALPHA_TEST using GL_NOT_EQUAL.
- In case of index_in_alpha the color key itself is passed to glAlphaFunc in other cases the alpha component
- of pixels that should be masked away is set to 0. */
- if(index_in_alpha) {
- table[i][3] = i;
- } else if(colorkey && (i >= This->SrcBltCKey.dwColorSpaceLowValue) && (i <= This->SrcBltCKey.dwColorSpaceHighValue)) {
- table[i][3] = 0x00;
- } else if(pal->Flags & WINEDDPCAPS_ALPHA) {
- table[i][3] = pal->palents[i].peFlags;
- } else {
- table[i][3] = 0xFF;
- }
- }
- }
-}
-
/* This function is used in case of 8bit paletted textures to upload the palette.
It supports GL_EXT_paletted_texture and GL_ARB_fragment_program, support for other
extensions like ATI_fragment_shaders is possible.
*/
+/* Context activation is done by the caller. */
static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES convert) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
BYTE table[256][4];
@@ -2263,7 +2446,9 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve
if(GL_SUPPORT(EXT_PALETTED_TEXTURE))
{
TRACE("Using GL_EXT_PALETTED_TEXTURE for 8-bit paletted texture support\n");
- GL_EXTCALL(glColorTableEXT(This->glDescription.target,GL_RGBA,256,GL_RGBA,GL_UNSIGNED_BYTE, table));
+ ENTER_GL();
+ GL_EXTCALL(glColorTableEXT(This->texture_target, GL_RGBA, 256, GL_RGBA, GL_UNSIGNED_BYTE, table));
+ LEAVE_GL();
}
else
{
@@ -2271,6 +2456,8 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve
* The 8bit pixel data will be used as an index in this palette texture to retrieve the final color. */
TRACE("Using fragment shaders for emulating 8-bit paletted texture support\n");
+ ENTER_GL();
+
/* Create the fragment program if we don't have it */
if(!device->paletteConversionShader)
{
@@ -2309,7 +2496,9 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0));
/* Rebind the texture because it isn't bound anymore */
- glBindTexture(This->glDescription.target, This->glDescription.textureName);
+ glBindTexture(This->texture_target, This->texture_name);
+
+ LEAVE_GL();
}
}
@@ -2383,7 +2572,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface, BO
char buffer[4096];
++gen;
if ((gen % 10) == 0) {
- snprintf(buffer, sizeof(buffer), "/tmp/surface%p_type%u_level%u_%u.ppm", This, This->glDescription.target, This->glDescription.level, gen);
+ snprintf(buffer, sizeof(buffer), "/tmp/surface%p_type%u_level%u_%u.ppm",
+ This, This->texture_target, This->texture_level, gen);
IWineD3DSurfaceImpl_SaveSnapshot(iface, buffer);
}
/*
@@ -2406,6 +2596,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface, BO
return WINED3D_OK;
}
+/* Context activation is done by the caller. */
static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) {
/* TODO: check for locks */
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
@@ -2421,30 +2612,31 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL
GLuint *name;
TRACE("(%p) : Binding surface\n", This);
- name = srgb ? &This->glDescription.srgbTextureName : &This->glDescription.textureName;
+ name = srgb ? &This->texture_name_srgb : &This->texture_name;
if(!device->isInDraw) {
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
}
ENTER_GL();
- if (!This->glDescription.level) {
+ if (!This->texture_level)
+ {
if (!*name) {
glGenTextures(1, name);
checkGLcall("glGenTextures");
TRACE("Surface %p given name %d\n", This, *name);
- glBindTexture(This->glDescription.target, *name);
+ glBindTexture(This->texture_target, *name);
checkGLcall("glBindTexture");
- glTexParameteri(This->glDescription.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(This->texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
checkGLcall("glTexParameteri(dimension, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)");
- glTexParameteri(This->glDescription.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(This->texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
checkGLcall("glTexParameteri(dimension, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)");
- glTexParameteri(This->glDescription.target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
+ glTexParameteri(This->texture_target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
checkGLcall("glTexParameteri(dimension, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE)");
- glTexParameteri(This->glDescription.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(This->texture_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
checkGLcall("glTexParameteri(dimension, GL_TEXTURE_MIN_FILTER, GL_NEAREST)");
- glTexParameteri(This->glDescription.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(This->texture_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
checkGLcall("glTexParameteri(dimension, GL_TEXTURE_MAG_FILTER, GL_NEAREST)");
}
/* This is where we should be reducing the amount of GLMemoryUsed */
@@ -2453,7 +2645,7 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL
ERR("Mipmap surface has a glTexture bound to it!\n");
}
- glBindTexture(This->glDescription.target, This->glDescription.textureName);
+ glBindTexture(This->texture_target, *name);
checkGLcall("glBindTexture");
LEAVE_GL();
@@ -2536,13 +2728,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SaveSnapshot(IWineD3DSurface *iface, c
}
allocatedMemory = HeapAlloc(GetProcessHeap(), 0, width * height * 4);
ENTER_GL();
- FIXME("Saving texture level %d width %d height %d\n", This->glDescription.level, width, height);
- glGetTexImage(GL_TEXTURE_2D,
- This->glDescription.level,
- GL_RGBA,
- GL_UNSIGNED_INT_8_8_8_8_REV,
- allocatedMemory);
- checkGLcall("glTexImage2D");
+ FIXME("Saving texture level %d width %d height %d\n", This->texture_level, width, height);
+ glGetTexImage(GL_TEXTURE_2D, This->texture_level, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, allocatedMemory);
+ checkGLcall("glGetTexImage");
if (tmpTexture) {
glBindTexture(GL_TEXTURE_2D, 0);
glDeleteTextures(1, &tmpTexture);
@@ -2743,9 +2931,15 @@ void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) {
/* Flip the opengl texture */
{
- glDescriptor tmp_desc = back->glDescription;
- back->glDescription = front->glDescription;
- front->glDescription = tmp_desc;
+ GLuint tmp;
+
+ tmp = back->texture_name;
+ back->texture_name = front->texture_name;
+ front->texture_name = tmp;
+
+ tmp = back->texture_name_srgb;
+ back->texture_name_srgb = front->texture_name_srgb;
+ front->texture_name_srgb = tmp;
}
{
@@ -2779,7 +2973,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DS
}
if(override) {
- /* DDraw sets this for the X11 surfaces, so don't confuse the user
+ /* DDraw sets this for the X11 surfaces, so don't confuse the user
* FIXME("(%p) Target override is not supported by now\n", This);
* Additionally, it isn't really possible to support triple-buffering
* properly on opengl at all
@@ -2832,7 +3026,7 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D
ENTER_GL();
/* Bind the target texture */
- glBindTexture(This->glDescription.target, This->glDescription.textureName);
+ glBindTexture(This->texture_target, This->texture_name);
checkGLcall("glBindTexture");
if(!swapchain) {
TRACE("Reading from an offscreen target\n");
@@ -2847,26 +3041,30 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D
xrel = (float) (srect->x2 - srect->x1) / (float) (drect->x2 - drect->x1);
yrel = (float) (srect->y2 - srect->y1) / (float) (drect->y2 - drect->y1);
- if( (xrel - 1.0 < -eps) || (xrel - 1.0 > eps)) {
+ if ((xrel - 1.0f < -eps) || (xrel - 1.0f > eps))
+ {
FIXME("Doing a pixel by pixel copy from the framebuffer to a texture, expect major performance issues\n");
if(Filter != WINED3DTEXF_NONE && Filter != WINED3DTEXF_POINT) {
ERR("Texture filtering not supported in direct blit\n");
}
- } else if((Filter != WINED3DTEXF_NONE && Filter != WINED3DTEXF_POINT) && ((yrel - 1.0 < -eps) || (yrel - 1.0 > eps))) {
+ }
+ else if ((Filter != WINED3DTEXF_NONE && Filter != WINED3DTEXF_POINT)
+ && ((yrel - 1.0f < -eps) || (yrel - 1.0f > eps)))
+ {
ERR("Texture filtering not supported in direct blit\n");
}
- if(upsidedown &&
- !((xrel - 1.0 < -eps) || (xrel - 1.0 > eps)) &&
- !((yrel - 1.0 < -eps) || (yrel - 1.0 > eps))) {
+ if (upsidedown
+ && !((xrel - 1.0f < -eps) || (xrel - 1.0f > eps))
+ && !((yrel - 1.0f < -eps) || (yrel - 1.0f > eps)))
+ {
/* Upside down copy without stretching is nice, one glCopyTexSubImage call will do */
- glCopyTexSubImage2D(This->glDescription.target,
- This->glDescription.level,
- drect->x1, drect->y1, /* xoffset, yoffset */
- srect->x1, Src->currentDesc.Height - srect->y2,
- drect->x2 - drect->x1, drect->y2 - drect->y1);
+ glCopyTexSubImage2D(This->texture_target, This->texture_level,
+ drect->x1 /*xoffset */, drect->y1 /* y offset */,
+ srect->x1, Src->currentDesc.Height - srect->y2,
+ drect->x2 - drect->x1, drect->y2 - drect->y1);
} else {
UINT yoffset = Src->currentDesc.Height - srect->y1 + drect->y1 - 1;
/* I have to process this row by row to swap the image,
@@ -2876,25 +3074,22 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D
* However, stretching in x direction can be avoided if not necessary
*/
for(row = drect->y1; row < drect->y2; row++) {
- if( (xrel - 1.0 < -eps) || (xrel - 1.0 > eps)) {
+ if ((xrel - 1.0f < -eps) || (xrel - 1.0f > eps))
+ {
/* Well, that stuff works, but it's very slow.
* find a better way instead
*/
UINT col;
for(col = drect->x1; col < drect->x2; col++) {
- glCopyTexSubImage2D(This->glDescription.target,
- This->glDescription.level,
- drect->x1 + col, row, /* xoffset, yoffset */
- srect->x1 + col * xrel, yoffset - (int) (row * yrel),
- 1, 1);
+ glCopyTexSubImage2D(This->texture_target, This->texture_level,
+ drect->x1 + col /* x offset */, row /* y offset */,
+ srect->x1 + col * xrel, yoffset - (int) (row * yrel), 1, 1);
}
} else {
- glCopyTexSubImage2D(This->glDescription.target,
- This->glDescription.level,
- drect->x1, row, /* xoffset, yoffset */
- srect->x1, yoffset - (int) (row * yrel),
- drect->x2-drect->x1, 1);
+ glCopyTexSubImage2D(This->texture_target, This->texture_level,
+ drect->x1 /* x offset */, row /* y offset */,
+ srect->x1, yoffset - (int) (row * yrel), drect->x2-drect->x1, 1);
}
}
}
@@ -2914,17 +3109,19 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
float left, right, top, bottom; /* Texture coordinates */
UINT fbwidth = Src->currentDesc.Width;
UINT fbheight = Src->currentDesc.Height;
+ struct wined3d_context *context;
GLenum drawBuffer = GL_BACK;
GLenum texture_target;
BOOL noBackBufferBackup;
TRACE("Using hwstretch blit\n");
/* Activate the Proper context for reading from the source surface, set it up for blitting */
- ActivateContext(myDevice, SrcSurface, CTXUSAGE_BLIT);
+ context = ActivateContext(myDevice, SrcSurface, CTXUSAGE_BLIT);
surface_internal_preload((IWineD3DSurface *) This, SRGB_RGB);
noBackBufferBackup = !swapchain && wined3d_settings.offscreen_rendering_mode == ORM_FBO;
- if(!noBackBufferBackup && Src->glDescription.textureName == 0) {
+ if (!noBackBufferBackup && !Src->texture_name)
+ {
/* Get it a description */
surface_internal_preload(SrcSurface, SRGB_RGB);
}
@@ -2933,27 +3130,30 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
/* Try to use an aux buffer for drawing the rectangle. This way it doesn't need restoring.
* This way we don't have to wait for the 2nd readback to finish to leave this function.
*/
- if(myDevice->activeContext->aux_buffers >= 2) {
+ if (context->aux_buffers >= 2)
+ {
/* Got more than one aux buffer? Use the 2nd aux buffer */
drawBuffer = GL_AUX1;
- } else if((swapchain || myDevice->offscreenBuffer == GL_BACK) && myDevice->activeContext->aux_buffers >= 1) {
+ }
+ else if ((swapchain || myDevice->offscreenBuffer == GL_BACK) && context->aux_buffers >= 1)
+ {
/* Only one aux buffer, but it isn't used (Onscreen rendering, or non-aux orm)? Use it! */
drawBuffer = GL_AUX0;
}
if(noBackBufferBackup) {
glGenTextures(1, &backup);
- checkGLcall("glGenTextures\n");
+ checkGLcall("glGenTextures");
glBindTexture(GL_TEXTURE_2D, backup);
- checkGLcall("glBindTexture(Src->glDescription.target, Src->glDescription.textureName)");
+ checkGLcall("glBindTexture(GL_TEXTURE_2D, backup)");
texture_target = GL_TEXTURE_2D;
} else {
/* Backup the back buffer and copy the source buffer into a texture to draw an upside down stretched quad. If
* we are reading from the back buffer, the backup can be used as source texture
*/
- texture_target = Src->glDescription.target;
- glBindTexture(texture_target, Src->glDescription.textureName);
- checkGLcall("glBindTexture(texture_target, Src->glDescription.textureName)");
+ texture_target = Src->texture_target;
+ glBindTexture(texture_target, Src->texture_name);
+ checkGLcall("glBindTexture(texture_target, Src->texture_name)");
glEnable(texture_target);
checkGLcall("glEnable(texture_target)");
@@ -2980,14 +3180,14 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
/* No issue with overriding these - the sampler is dirty due to blit usage */
glTexParameteri(texture_target, GL_TEXTURE_MAG_FILTER,
- magLookup[Filter - WINED3DTEXF_NONE]);
+ wined3d_gl_mag_filter(magLookup, Filter));
checkGLcall("glTexParameteri");
glTexParameteri(texture_target, GL_TEXTURE_MIN_FILTER,
- minMipLookup[Filter].mip[WINED3DTEXF_NONE]);
+ wined3d_gl_min_mip_filter(minMipLookup, Filter, WINED3DTEXF_NONE));
checkGLcall("glTexParameteri");
if(!swapchain || (IWineD3DSurface *) Src == swapchain->backBuffer[0]) {
- src = backup ? backup : Src->glDescription.textureName;
+ src = backup ? backup : Src->texture_name;
} else {
glReadBuffer(GL_FRONT);
checkGLcall("glReadBuffer(GL_FRONT)");
@@ -3069,14 +3269,15 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
glEnd();
checkGLcall("glEnd and previous");
- if(texture_target != This->glDescription.target) {
+ if (texture_target != This->texture_target)
+ {
glDisable(texture_target);
- glEnable(This->glDescription.target);
- texture_target = This->glDescription.target;
+ glEnable(This->texture_target);
+ texture_target = This->texture_target;
}
/* Now read the stretched and upside down image into the destination texture */
- glBindTexture(texture_target, This->glDescription.textureName);
+ glBindTexture(texture_target, This->texture_name);
checkGLcall("glBindTexture");
glCopyTexSubImage2D(texture_target,
0,
@@ -3096,26 +3297,27 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
glBindTexture(GL_TEXTURE_2D, backup);
checkGLcall("glBindTexture(GL_TEXTURE_2D, backup)");
} else {
- if(texture_target != Src->glDescription.target) {
+ if (texture_target != Src->texture_target)
+ {
glDisable(texture_target);
- glEnable(Src->glDescription.target);
- texture_target = Src->glDescription.target;
+ glEnable(Src->texture_target);
+ texture_target = Src->texture_target;
}
- glBindTexture(Src->glDescription.target, Src->glDescription.textureName);
- checkGLcall("glBindTexture(Src->glDescription.target, Src->glDescription.textureName)");
+ glBindTexture(Src->texture_target, Src->texture_name);
+ checkGLcall("glBindTexture(Src->texture_target, Src->texture_name)");
}
glBegin(GL_QUADS);
/* top left */
- glTexCoord2f(0.0, (float) fbheight / (float) Src->pow2Height);
+ glTexCoord2f(0.0f, (float)fbheight / (float)Src->pow2Height);
glVertex2i(0, 0);
/* bottom left */
- glTexCoord2f(0.0, 0.0);
+ glTexCoord2f(0.0f, 0.0f);
glVertex2i(0, fbheight);
/* bottom right */
- glTexCoord2f((float) fbwidth / (float) Src->pow2Width, 0.0);
+ glTexCoord2f((float)fbwidth / (float)Src->pow2Width, 0.0f);
glVertex2i(fbwidth, Src->currentDesc.Height);
/* top right */
@@ -3130,7 +3332,8 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
checkGLcall("glDisable(texture_target)");
/* Cleanup */
- if(src != Src->glDescription.textureName && src != backup) {
+ if (src != Src->texture_name && src != backup)
+ {
glDeleteTextures(1, &src);
checkGLcall("glDeleteTextures(1, &src)");
}
@@ -3384,7 +3587,9 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
* FBO support, so it doesn't really make sense to try and make it work with different offscreen rendering
* backends.
*/
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO && GL_SUPPORT(EXT_FRAMEBUFFER_BLIT)) {
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO && GL_SUPPORT(EXT_FRAMEBUFFER_BLIT)
+ && surface_can_stretch_rect(Src, This))
+ {
stretch_rect_fbo((IWineD3DDevice *)myDevice, SrcSurface, &srect,
(IWineD3DSurface *)This, &rect, Filter, upsideDown);
} else if((!stretchx) || rect.x2 - rect.x1 > Src->currentDesc.Width ||
@@ -3446,8 +3651,10 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
Src->palette = This->palette;
}
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO && GL_SUPPORT(EXT_FRAMEBUFFER_BLIT) &&
- (Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE)) == 0) {
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO && GL_SUPPORT(EXT_FRAMEBUFFER_BLIT)
+ && !(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE))
+ && surface_can_stretch_rect(Src, This))
+ {
TRACE("Using stretch_rect_fbo\n");
/* The source is always a texture, but never the currently active render target, and the texture
* contents are never upside down
@@ -3511,67 +3718,76 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
rect.y1 += This->currentDesc.Height - h; rect.y2 += This->currentDesc.Height - h;
}
+ if (!is_identity_fixup(This->resource.format_desc->color_fixup))
+ {
+ FIXME("Destination format %s has a fixup, this is not supported.\n",
+ debug_d3dformat(This->resource.format_desc->format));
+ dump_color_fixup_desc(This->resource.format_desc->color_fixup);
+ }
+
+ if (!myDevice->blitter->color_fixup_supported(Src->resource.format_desc->color_fixup))
+ {
+ FIXME("Source format %s has an unsupported fixup:\n",
+ debug_d3dformat(Src->resource.format_desc->format));
+ dump_color_fixup_desc(Src->resource.format_desc->color_fixup);
+ }
+
myDevice->blitter->set_shader((IWineD3DDevice *) myDevice, Src->resource.format_desc,
- Src->glDescription.target, Src->pow2Width, Src->pow2Height);
+ Src->texture_target, Src->pow2Width, Src->pow2Height);
ENTER_GL();
/* Bind the texture */
- glBindTexture(Src->glDescription.target, Src->glDescription.textureName);
+ glBindTexture(Src->texture_target, Src->texture_name);
checkGLcall("glBindTexture");
/* Filtering for StretchRect */
- glTexParameteri(Src->glDescription.target, GL_TEXTURE_MAG_FILTER,
- magLookup[Filter - WINED3DTEXF_NONE]);
+ glTexParameteri(Src->texture_target, GL_TEXTURE_MAG_FILTER,
+ wined3d_gl_mag_filter(magLookup, Filter));
checkGLcall("glTexParameteri");
- glTexParameteri(Src->glDescription.target, GL_TEXTURE_MIN_FILTER,
- minMipLookup[Filter].mip[WINED3DTEXF_NONE]);
+ glTexParameteri(Src->texture_target, GL_TEXTURE_MIN_FILTER,
+ wined3d_gl_min_mip_filter(minMipLookup, Filter, WINED3DTEXF_NONE));
checkGLcall("glTexParameteri");
- glTexParameteri(Src->glDescription.target, GL_TEXTURE_WRAP_S, GL_CLAMP);
- glTexParameteri(Src->glDescription.target, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexParameteri(Src->texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(Src->texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
checkGLcall("glTexEnvi");
/* This is for color keying */
if(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE)) {
glEnable(GL_ALPHA_TEST);
- checkGLcall("glEnable GL_ALPHA_TEST");
+ checkGLcall("glEnable(GL_ALPHA_TEST)");
/* When the primary render target uses P8, the alpha component contains the palette index.
* Which means that the colorkey is one of the palette entries. In other cases pixels that
* should be masked away have alpha set to 0. */
if(primary_render_target_is_p8(myDevice))
- glAlphaFunc(GL_NOTEQUAL, (float)Src->SrcBltCKey.dwColorSpaceLowValue / 256.0);
+ glAlphaFunc(GL_NOTEQUAL, (float)Src->SrcBltCKey.dwColorSpaceLowValue / 256.0f);
else
- glAlphaFunc(GL_NOTEQUAL, 0.0);
- checkGLcall("glAlphaFunc\n");
+ glAlphaFunc(GL_NOTEQUAL, 0.0f);
+ checkGLcall("glAlphaFunc");
} else {
glDisable(GL_ALPHA_TEST);
- checkGLcall("glDisable GL_ALPHA_TEST");
+ checkGLcall("glDisable(GL_ALPHA_TEST)");
}
/* Draw a textured quad
*/
glBegin(GL_QUADS);
- glColor3d(1.0f, 1.0f, 1.0f);
+ glColor3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(glTexCoord[0], glTexCoord[2]);
- glVertex3f(rect.x1,
- rect.y1,
- 0.0);
+ glVertex3f(rect.x1, rect.y1, 0.0f);
glTexCoord2f(glTexCoord[0], glTexCoord[3]);
- glVertex3f(rect.x1, rect.y2, 0.0);
+ glVertex3f(rect.x1, rect.y2, 0.0f);
glTexCoord2f(glTexCoord[1], glTexCoord[3]);
- glVertex3f(rect.x2,
- rect.y2,
- 0.0);
+ glVertex3f(rect.x2, rect.y2, 0.0f);
glTexCoord2f(glTexCoord[1], glTexCoord[2]);
- glVertex3f(rect.x2,
- rect.y1,
- 0.0);
+ glVertex3f(rect.x2, rect.y1, 0.0f);
+
glEnd();
checkGLcall("glEnd");
@@ -3580,8 +3796,8 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
checkGLcall("glDisable(GL_ALPHA_TEST)");
}
- glBindTexture(Src->glDescription.target, 0);
- checkGLcall("glBindTexture(Src->glDescription.target, 0)");
+ glBindTexture(Src->texture_target, 0);
+ checkGLcall("glBindTexture(Src->texture_target, 0)");
/* Restore the color key parameters */
Src->CKeyFlags = oldCKeyFlags;
@@ -3598,7 +3814,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* Flush in case the drawable is used by multiple GL contexts */
if(dstSwapchain && (This == (IWineD3DSurfaceImpl *) dstSwapchain->frontBuffer || dstSwapchain->num_contexts >= 2))
- glFlush();
+ wglFlush();
/* TODO: If the surface is locked often, perform the Blt in software on the memory instead */
/* The surface is now in the drawable. On onscreen surfaces or without fbos the texture
@@ -3669,11 +3885,8 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
}
TRACE("(%p) executing Render Target override, color = %x\n", This, color);
- IWineD3DDeviceImpl_ClearSurface(myDevice, This,
- 1, /* Number of rectangles */
- &rect, WINED3DCLEAR_TARGET, color,
- 0.0 /* Z */,
- 0 /* Stencil */);
+ IWineD3DDeviceImpl_ClearSurface(myDevice, This, 1 /* Number of rectangles */,
+ &rect, WINED3DCLEAR_TARGET, color, 0.0f /* Z */, 0 /* Stencil */);
return WINED3D_OK;
}
}
@@ -3706,7 +3919,7 @@ static HRESULT IWineD3DSurfaceImpl_BltZ(IWineD3DSurfaceImpl *This, const RECT *D
depth = (float) DDBltFx->u5.dwFillDepth / (float) 0xffffffff;
break;
default:
- depth = 0.0;
+ depth = 0.0f;
ERR("Unexpected format for depth fill: %s\n", debug_d3dformat(This->resource.format_desc->format));
}
@@ -3843,13 +4056,15 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface)
CONVERT_TYPES convert;
/* Check if we are using a RTL mode which uses texturing for uploads */
- BOOL use_texture = (wined3d_settings.rendertargetlock_mode == RTL_READTEX || wined3d_settings.rendertargetlock_mode == RTL_TEXTEX);
+ BOOL use_texture = (wined3d_settings.rendertargetlock_mode == RTL_READTEX);
/* Check if we have hardware palette conversion if we have convert is set to NO_CONVERSION */
d3dfmt_get_conv(This, TRUE, use_texture, &format, &internal, &type, &convert, &bpp, FALSE);
if((This->resource.usage & WINED3DUSAGE_RENDERTARGET) && (convert == NO_CONVERSION))
{
+ IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+
/* Make sure the texture is up to date. This call doesn't do anything if the texture is already up to date. */
IWineD3DSurface_LoadLocation(iface, SFLAG_INTEXTURE, NULL);
@@ -3857,6 +4072,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface)
IWineD3DSurface_ModifyLocation(iface, SFLAG_INDRAWABLE, FALSE);
/* Re-upload the palette */
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
d3dfmt_p8_upload_palette(iface, convert);
} else {
if(!(This->Flags & SFLAG_INSYSMEM)) {
@@ -3891,8 +4107,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
unsigned int pow2Width, pow2Height;
- This->glDescription.textureName = 0;
- This->glDescription.target = GL_TEXTURE_2D;
+ This->texture_name = 0;
+ This->texture_target = GL_TEXTURE_2D;
/* Non-power2 support */
if (GL_SUPPORT(ARB_TEXTURE_NON_POWER_OF_TWO) || GL_SUPPORT(WINE_NORMALIZED_TEXRECT)) {
@@ -3908,11 +4124,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
This->pow2Height = pow2Height;
if (pow2Width > This->currentDesc.Width || pow2Height > This->currentDesc.Height) {
- WINED3DFORMAT Format = This->resource.format_desc->format;
/** TODO: add support for non power two compressed textures **/
- if (Format == WINED3DFMT_DXT1 || Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3
- || Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5
- || Format == WINED3DFMT_ATI2N)
+ if (This->resource.format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
{
FIXME("(%p) Compressed non-power-two textures are not supported w(%d) h(%d)\n",
This, This->currentDesc.Width, This->currentDesc.Height);
@@ -3950,10 +4163,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
*/
if(This->Flags & SFLAG_NONPOW2 && GL_SUPPORT(ARB_TEXTURE_RECTANGLE)
&& !((This->resource.format_desc->format == WINED3DFMT_P8) && GL_SUPPORT(EXT_PALETTED_TEXTURE)
- && (wined3d_settings.rendertargetlock_mode == RTL_READTEX
- || wined3d_settings.rendertargetlock_mode == RTL_TEXTEX)))
+ && (wined3d_settings.rendertargetlock_mode == RTL_READTEX)))
{
- This->glDescription.target = GL_TEXTURE_RECTANGLE_ARB;
+ This->texture_target = GL_TEXTURE_RECTANGLE_ARB;
This->pow2Width = This->currentDesc.Width;
This->pow2Height = This->currentDesc.Height;
This->Flags &= ~(SFLAG_NONPOW2 | SFLAG_NORMCOORD);
@@ -4073,6 +4285,7 @@ static void surface_get_depth_blt_info(GLenum target, GLsizei w, GLsizei h, stru
}
}
+/* GL locking is done by the caller */
static void surface_depth_blt(IWineD3DSurfaceImpl *This, GLuint texture, GLsizei w, GLsizei h, GLenum target)
{
IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
@@ -4082,14 +4295,14 @@ static void surface_depth_blt(IWineD3DSurfaceImpl *This, GLuint texture, GLsizei
glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_VIEWPORT_BIT);
glDisable(GL_CULL_FACE);
- glEnable(GL_BLEND);
+ glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
glDisable(GL_SCISSOR_TEST);
glDisable(GL_STENCIL_TEST);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_ALWAYS);
glDepthMask(GL_TRUE);
- glBlendFunc(GL_ZERO, GL_ONE);
+ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glViewport(0, 0, w, h);
surface_get_depth_blt_info(target, w, h, &info);
@@ -4130,7 +4343,9 @@ void surface_modify_ds_location(IWineD3DSurface *iface, DWORD location) {
This->Flags |= location;
}
-void surface_load_ds_location(IWineD3DSurface *iface, DWORD location) {
+/* Context activation is done by the caller. */
+void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *context, DWORD location)
+{
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
@@ -4164,8 +4379,9 @@ void surface_load_ds_location(IWineD3DSurface *iface, DWORD location) {
/* Note that we use depth_blt here as well, rather than glCopyTexImage2D
* directly on the FBO texture. That's because we need to flip. */
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- if (This->glDescription.target == GL_TEXTURE_RECTANGLE_ARB) {
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL);
+ if (This->texture_target == GL_TEXTURE_RECTANGLE_ARB)
+ {
glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
bind_target = GL_TEXTURE_RECTANGLE_ARB;
} else {
@@ -4173,16 +4389,13 @@ void surface_load_ds_location(IWineD3DSurface *iface, DWORD location) {
bind_target = GL_TEXTURE_2D;
}
glBindTexture(bind_target, device->depth_blt_texture);
- glCopyTexImage2D(bind_target,
- This->glDescription.level,
- This->resource.format_desc->glInternal,
- 0,
- 0,
- This->currentDesc.Width,
- This->currentDesc.Height,
- 0);
+ glCopyTexImage2D(bind_target, This->texture_level, This->resource.format_desc->glInternal,
+ 0, 0, This->currentDesc.Width, This->currentDesc.Height, 0);
glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(bind_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(bind_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(bind_target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(bind_target, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);
glBindTexture(bind_target, old_binding);
@@ -4201,21 +4414,17 @@ void surface_load_ds_location(IWineD3DSurface *iface, DWORD location) {
device->depth_blt_rb_h = This->currentDesc.Height;
}
- context_bind_fbo((IWineD3DDevice *)device, GL_FRAMEBUFFER_EXT, &device->activeContext->dst_fbo);
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &context->dst_fbo);
GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, device->depth_blt_rb));
checkGLcall("glFramebufferRenderbufferEXT");
- context_attach_depth_stencil_fbo(device, GL_FRAMEBUFFER_EXT, iface, FALSE);
+ context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER_EXT, iface, FALSE);
/* Do the actual blit */
surface_depth_blt(This, device->depth_blt_texture, This->currentDesc.Width, This->currentDesc.Height, bind_target);
checkGLcall("depth_blt");
- if (device->activeContext->current_fbo) {
- context_bind_fbo((IWineD3DDevice *)device, GL_FRAMEBUFFER_EXT, &device->activeContext->current_fbo->id);
- } else {
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glBindFramebuffer()");
- }
+ if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &context->current_fbo->id);
+ else context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL);
LEAVE_GL();
} else {
@@ -4227,15 +4436,12 @@ void surface_load_ds_location(IWineD3DSurface *iface, DWORD location) {
ENTER_GL();
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glBindFramebuffer()");
- surface_depth_blt(This, This->glDescription.textureName, This->currentDesc.Width, This->currentDesc.Height, This->glDescription.target);
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL);
+ surface_depth_blt(This, This->texture_name, This->currentDesc.Width,
+ This->currentDesc.Height, This->texture_target);
checkGLcall("depth_blt");
- if (device->activeContext->current_fbo) {
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, device->activeContext->current_fbo->id));
- checkGLcall("glBindFramebuffer()");
- }
+ if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &context->current_fbo->id);
LEAVE_GL();
} else {
@@ -4320,7 +4526,9 @@ static inline void cube_coords_float(const RECT *r, UINT w, UINT h, struct float
f->b = ((r->bottom * 2.0f) / h) - 1.0f;
}
-static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT *rect_in) {
+static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT *rect_in)
+{
+ const struct wined3d_context *context;
struct coords coords[4];
RECT rect;
IWineD3DSwapChain *swapchain;
@@ -4338,7 +4546,7 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT
rect.bottom = This->currentDesc.Height;
}
- switch(This->glDescription.target)
+ switch (This->texture_target)
{
case GL_TEXTURE_2D:
bind_target = GL_TEXTURE_2D;
@@ -4423,23 +4631,24 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT
break;
default:
- ERR("Unexpected texture target %#x\n", This->glDescription.target);
+ ERR("Unexpected texture target %#x\n", This->texture_target);
return;
}
- ActivateContext(device, (IWineD3DSurface*)This, CTXUSAGE_BLIT);
+ context = ActivateContext(device, (IWineD3DSurface*)This, CTXUSAGE_BLIT);
+
ENTER_GL();
glEnable(bind_target);
checkGLcall("glEnable(bind_target)");
- glBindTexture(bind_target, This->glDescription.textureName);
- checkGLcall("bind_target, This->glDescription.textureName)");
+ glBindTexture(bind_target, This->texture_name);
+ checkGLcall("glBindTexture(bind_target, This->texture_name)");
glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
checkGLcall("glTexParameteri");
glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
checkGLcall("glTexParameteri");
- if (device->render_offscreen)
+ if (context->render_offscreen)
{
LONG tmp = rect.top;
rect.top = rect.bottom;
@@ -4471,7 +4680,7 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT
/* Make sure to flush the buffers. This is needed in apps like Red Alert II and Tiberian SUN that use multiple WGL contexts. */
if(((IWineD3DSwapChainImpl*)swapchain)->frontBuffer == (IWineD3DSurface*)This ||
((IWineD3DSwapChainImpl*)swapchain)->num_contexts >= 2)
- glFlush();
+ wglFlush();
IWineD3DSwapChain_Release(swapchain);
} else {
@@ -4552,11 +4761,12 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
/* Download the surface to system memory */
if(This->Flags & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX)) {
- if(!device->isInDraw) ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ if (!device->isInDraw) ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
surface_bind_and_dirtify(This, !(This->Flags & SFLAG_INTEXTURE));
surface_download_data(This);
} else {
+ /* Note: It might be faster to download into a texture first. */
read_from_framebuffer(This, rect,
This->resource.allocatedMemory,
IWineD3DSurface_GetPitch(iface));
@@ -4583,6 +4793,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
* but it isn't set (yet) in all cases it is getting called. */
if((convert != NO_CONVERSION) && (This->Flags & SFLAG_PBO)) {
TRACE("Removing the pbo attached to surface %p\n", This);
+ if (!device->isInDraw) ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
surface_remove_pbo(This);
}
@@ -4634,7 +4845,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
}
}
- if(!device->isInDraw) ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ if (!device->isInDraw) ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
surface_bind_and_dirtify(This, srgb);
if(This->CKeyFlags & WINEDDSD_CKSRCBLT) {
@@ -4829,7 +5040,6 @@ const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl =
IWineD3DSurfaceImpl_BindTexture,
IWineD3DSurfaceImpl_SaveSnapshot,
IWineD3DSurfaceImpl_SetContainer,
- IWineD3DSurfaceImpl_GetGlDesc,
IWineD3DBaseSurfaceImpl_GetData,
IWineD3DSurfaceImpl_SetFormat,
IWineD3DSurfaceImpl_PrivateSetup,
@@ -4842,18 +5052,24 @@ const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl =
#define GLINFO_LOCATION device->adapter->gl_info
static HRESULT ffp_blit_alloc(IWineD3DDevice *iface) { return WINED3D_OK; }
+/* Context activation is done by the caller. */
static void ffp_blit_free(IWineD3DDevice *iface) { }
+/* Context activation is done by the caller. */
static HRESULT ffp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatDesc *format_desc,
GLenum textype, UINT width, UINT height)
{
+ ENTER_GL();
glEnable(textype);
checkGLcall("glEnable(textype)");
+ LEAVE_GL();
return WINED3D_OK;
}
+/* Context activation is done by the caller. */
static void ffp_blit_unset(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
+ ENTER_GL();
glDisable(GL_TEXTURE_2D);
checkGLcall("glDisable(GL_TEXTURE_2D)");
if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {
@@ -4864,6 +5080,7 @@ static void ffp_blit_unset(IWineD3DDevice *iface) {
glDisable(GL_TEXTURE_RECTANGLE_ARB);
checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");
}
+ LEAVE_GL();
}
static BOOL ffp_blit_color_fixup_supported(struct color_fixup_desc fixup)
diff --git a/reactos/dll/directx/wine/wined3d/surface_base.c b/reactos/dll/directx/wine/wined3d/surface_base.c
index d487f80e10a..5c00b2b8c3e 100644
--- a/reactos/dll/directx/wine/wined3d/surface_base.c
+++ b/reactos/dll/directx/wine/wined3d/surface_base.c
@@ -30,8 +30,6 @@
#include "wine/port.h"
#include "wined3d_private.h"
-#include
-
WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
/* See also float_16_to_32() in wined3d_private.h */
@@ -43,26 +41,26 @@ static inline unsigned short float_32_to_16(const float *in)
unsigned short ret;
/* Deal with special numbers */
- if(*in == 0.0) return 0x0000;
+ if (*in == 0.0f) return 0x0000;
if(isnan(*in)) return 0x7C01;
- if(isinf(*in)) return (*in < 0.0 ? 0xFC00 : 0x7c00);
+ if (isinf(*in)) return (*in < 0.0f ? 0xFC00 : 0x7c00);
if(tmp < pow(2, 10)) {
do
{
- tmp = tmp * 2.0;
+ tmp = tmp * 2.0f;
exp--;
}while(tmp < pow(2, 10));
} else if(tmp >= pow(2, 11)) {
do
{
- tmp /= 2.0;
+ tmp /= 2.0f;
exp++;
}while(tmp >= pow(2, 11));
}
mantissa = (unsigned int) tmp;
- if(tmp - mantissa >= 0.5) mantissa++; /* round to nearest, away from zero */
+ if(tmp - mantissa >= 0.5f) mantissa++; /* round to nearest, away from zero */
exp += 10; /* Normalize the mantissa */
exp += 15; /* Exponent is encoded with excess 15 */
@@ -80,7 +78,7 @@ static inline unsigned short float_32_to_16(const float *in)
ret = (exp << 10) | (mantissa & 0x3ff);
}
- ret |= ((*in < 0.0 ? 1 : 0) << 15); /* Add the sign */
+ ret |= ((*in < 0.0f ? 1 : 0) << 15); /* Add the sign */
return ret;
}
@@ -181,15 +179,17 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetDesc(IWineD3DSurface *iface, WINED3DSU
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
TRACE("(%p) : copying into %p\n", This, pDesc);
- if(pDesc->Format != NULL) *(pDesc->Format) = This->resource.format_desc->format;
- if(pDesc->Type != NULL) *(pDesc->Type) = This->resource.resourceType;
- if(pDesc->Usage != NULL) *(pDesc->Usage) = This->resource.usage;
- if(pDesc->Pool != NULL) *(pDesc->Pool) = This->resource.pool;
- if(pDesc->Size != NULL) *(pDesc->Size) = This->resource.size; /* dx8 only */
- if(pDesc->MultiSampleType != NULL) *(pDesc->MultiSampleType) = This->currentDesc.MultiSampleType;
- if(pDesc->MultiSampleQuality != NULL) *(pDesc->MultiSampleQuality) = This->currentDesc.MultiSampleQuality;
- if(pDesc->Width != NULL) *(pDesc->Width) = This->currentDesc.Width;
- if(pDesc->Height != NULL) *(pDesc->Height) = This->currentDesc.Height;
+
+ pDesc->format = This->resource.format_desc->format;
+ pDesc->resource_type = This->resource.resourceType;
+ pDesc->usage = This->resource.usage;
+ pDesc->pool = This->resource.pool;
+ pDesc->size = This->resource.size; /* dx8 only */
+ pDesc->multisample_type = This->currentDesc.MultiSampleType;
+ pDesc->multisample_quality = This->currentDesc.MultiSampleQuality;
+ pDesc->width = This->currentDesc.Width;
+ pDesc->height = This->currentDesc.Height;
+
return WINED3D_OK;
}
@@ -332,19 +332,19 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPalette(IWineD3DSurface *iface, IWineD
DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
- WINED3DFORMAT format = This->resource.format_desc->format;
+ const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
DWORD ret;
TRACE("(%p)\n", This);
- /* DXTn formats don't have exact pitches as they are to the new row of blocks,
- where each block is 4x4 pixels, 8 bytes (dxt1) and 16 bytes (dxt2/3/4/5)
- ie pitch = (width/4) * bytes per block */
- if (format == WINED3DFMT_DXT1) /* DXT1 is 8 bytes per block */
- ret = ((This->currentDesc.Width + 3) >> 2) << 3;
- else if (format == WINED3DFMT_DXT2 || format == WINED3DFMT_DXT3 ||
- format == WINED3DFMT_DXT4 || format == WINED3DFMT_DXT5) /* DXT2/3/4/5 is 16 bytes per block */
- ret = ((This->currentDesc.Width + 3) >> 2) << 4;
- else {
+ if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
+ {
+ /* Since compressed formats are block based, pitch means the amount of
+ * bytes to the next row of block rather than the next row of pixels. */
+ UINT row_block_count = (This->currentDesc.Width + format_desc->block_width - 1) / format_desc->block_width;
+ ret = row_block_count * format_desc->block_byte_count;
+ }
+ else
+ {
unsigned char alignment = This->resource.wineD3DDevice->surface_alignment;
ret = This->resource.format_desc->byte_count * This->currentDesc.Width; /* Bytes / row */
ret = (ret + alignment - 1) & ~(alignment - 1);
@@ -519,20 +519,9 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3D
}
TRACE("(%p) : Setting texture format to (%d,%s)\n", This, format, debug_d3dformat(format));
- if (format == WINED3DFMT_UNKNOWN) {
- This->resource.size = 0;
- } else if (format == WINED3DFMT_DXT1) {
- /* DXT1 is half byte per pixel */
- This->resource.size = ((max(This->pow2Width, 4) * format_desc->byte_count) * max(This->pow2Height, 4)) >> 1;
- } else if (format == WINED3DFMT_DXT2 || format == WINED3DFMT_DXT3 ||
- format == WINED3DFMT_DXT4 || format == WINED3DFMT_DXT5) {
- This->resource.size = ((max(This->pow2Width, 4) * format_desc->byte_count) * max(This->pow2Height, 4));
- } else {
- unsigned char alignment = This->resource.wineD3DDevice->surface_alignment;
- This->resource.size = ((This->pow2Width * format_desc->byte_count) + alignment - 1) & ~(alignment - 1);
- This->resource.size *= This->pow2Height;
- }
+ This->resource.size = surface_calculate_size(format_desc, This->resource.wineD3DDevice->surface_alignment,
+ This->pow2Width, This->pow2Height);
This->Flags |= (WINED3DFMT_D16_LOCKABLE == format) ? SFLAG_LOCKABLE : 0;
@@ -735,6 +724,25 @@ static void convert_r5g6b5_x8r8g8b8(const BYTE *src, BYTE *dst,
}
}
+static void convert_a8r8g8b8_x8r8g8b8(const BYTE *src, BYTE *dst,
+ DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h)
+{
+ unsigned int x, y;
+
+ TRACE("Converting %ux%u pixels, pitches %u %u\n", w, h, pitch_in, pitch_out);
+
+ for (y = 0; y < h; ++y)
+ {
+ const DWORD *src_line = (const DWORD *)(src + y * pitch_in);
+ DWORD *dst_line = (DWORD *)(dst + y * pitch_out);
+
+ for (x = 0; x < w; ++x)
+ {
+ dst_line[x] = 0xff000000 | (src_line[x] & 0xffffff);
+ }
+ }
+}
+
struct d3dfmt_convertor_desc {
WINED3DFORMAT from, to;
void (*convert)(const BYTE *src, BYTE *dst, DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h);
@@ -744,6 +752,7 @@ static const struct d3dfmt_convertor_desc convertors[] =
{
{WINED3DFMT_R32_FLOAT, WINED3DFMT_R16_FLOAT, convert_r32_float_r16_float},
{WINED3DFMT_R5G6B5, WINED3DFMT_X8R8G8B8, convert_r5g6b5_x8r8g8b8},
+ {WINED3DFMT_A8R8G8B8, WINED3DFMT_X8R8G8B8, convert_a8r8g8b8_x8r8g8b8},
};
static inline const struct d3dfmt_convertor_desc *find_convertor(WINED3DFORMAT from, WINED3DFORMAT to)
@@ -781,10 +790,9 @@ static IWineD3DSurfaceImpl *surface_convert_format(IWineD3DSurfaceImpl *source,
return NULL;
}
- IWineD3DDevice_CreateSurface((IWineD3DDevice *)source->resource.wineD3DDevice,
- source->currentDesc.Width, source->currentDesc.Height, to_fmt, TRUE /* lockable */,
- TRUE /* discard */, 0 /* level */, &ret, WINED3DRTYPE_SURFACE, 0 /* usage */,
- WINED3DPOOL_SCRATCH, WINED3DMULTISAMPLE_NONE /* TODO: Multisampled conversion */,
+ IWineD3DDevice_CreateSurface((IWineD3DDevice *)source->resource.wineD3DDevice, source->currentDesc.Width,
+ source->currentDesc.Height, to_fmt, TRUE /* lockable */, TRUE /* discard */, 0 /* level */, &ret,
+ 0 /* usage */, WINED3DPOOL_SCRATCH, WINED3DMULTISAMPLE_NONE /* TODO: Multisampled conversion */,
0 /* MultiSampleQuality */, IWineD3DSurface_GetImplType((IWineD3DSurface *) source), NULL /* parent */);
if(!ret) {
ERR("Failed to create a destination surface for conversion\n");
@@ -1127,8 +1135,6 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D
dstwidth = xdst.right - xdst.left;
width = (xdst.right - xdst.left) * bpp;
- assert(width <= dlock.Pitch);
-
if (DestRect && Src != This)
dbuf = dlock.pBits;
else
@@ -1629,7 +1635,6 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst
slock.Pitch = dlock.Pitch;
/* Since slock was originally copied from this surface's description, we can just reuse it */
- assert(This->resource.allocatedMemory != NULL);
sbuf = This->resource.allocatedMemory + lock_src.top * pitch + lock_src.left * bpp;
dbuf = This->resource.allocatedMemory + lock_dst.top * pitch + lock_dst.left * bpp;
sEntry = Src->resource.format_desc;
@@ -1650,63 +1655,39 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst
dEntry = This->resource.format_desc;
}
- /* Handle first the FOURCC surfaces... */
- if (sEntry->Flags & dEntry->Flags & WINED3DFMT_FLAG_FOURCC)
+ /* Handle compressed surfaces first... */
+ if (sEntry->Flags & dEntry->Flags & WINED3DFMT_FLAG_COMPRESSED)
{
- UINT block_width;
- UINT block_height;
- UINT block_byte_size;
+ UINT row_block_count;
- TRACE("Fourcc -> Fourcc copy\n");
+ TRACE("compressed -> compressed copy\n");
if (trans)
- FIXME("trans arg not supported when a FOURCC surface is involved\n");
+ FIXME("trans arg not supported when a compressed surface is involved\n");
if (dstx || dsty)
FIXME("offset for destination surface is not supported\n");
if (Src->resource.format_desc->format != This->resource.format_desc->format)
{
- FIXME("FOURCC->FOURCC copy only supported for the same type of surface\n");
+ FIXME("compressed -> compressed copy only supported for the same type of surface\n");
ret = WINED3DERR_WRONGTEXTUREFORMAT;
goto error;
}
- if (This->resource.format_desc->format == WINED3DFMT_DXT1)
+ row_block_count = (w + dEntry->block_width - 1) / dEntry->block_width;
+ for (y = 0; y < h; y += dEntry->block_height)
{
- block_width = 4;
- block_height = 4;
- block_byte_size = 8;
- }
- else if (This->resource.format_desc->format == WINED3DFMT_DXT2
- || This->resource.format_desc->format == WINED3DFMT_DXT3
- || This->resource.format_desc->format == WINED3DFMT_DXT4
- || This->resource.format_desc->format == WINED3DFMT_DXT5)
- {
- block_width = 4;
- block_height = 4;
- block_byte_size = 16;
- }
- else
- {
- FIXME("Unsupported FourCC format %s.\n", debug_d3dformat(This->resource.format_desc->format));
- block_width = 1;
- block_height = 1;
- block_byte_size = This->resource.format_desc->byte_count;
- }
-
- for (y = 0; y < h; y += block_height)
- {
- memcpy(dbuf, sbuf, (w / block_width) * block_byte_size);
+ memcpy(dbuf, sbuf, row_block_count * dEntry->block_byte_count);
dbuf += dlock.Pitch;
sbuf += slock.Pitch;
}
goto error;
}
- if ((sEntry->Flags & WINED3DFMT_FLAG_FOURCC) && !(dEntry->Flags & WINED3DFMT_FLAG_FOURCC))
+ if ((sEntry->Flags & WINED3DFMT_FLAG_COMPRESSED) && !(dEntry->Flags & WINED3DFMT_FLAG_COMPRESSED))
{
/* TODO: Use the libtxc_dxtn.so shared library to do
* software decompression
*/
- ERR("DXTC decompression not supported by now\n");
+ ERR("Software decompression not supported.\n");
goto error;
}
@@ -1844,32 +1825,24 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DL
}
else
{
+ const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+
TRACE("Lock Rect (%p) = l %d, t %d, r %d, b %d\n",
pRect, pRect->left, pRect->top, pRect->right, pRect->bottom);
- /* DXTn textures are based on compressed blocks of 4x4 pixels, each
- * 16 bytes large (8 bytes in case of DXT1). Because of that Pitch has
- * slightly different meaning compared to regular textures. For DXTn
- * textures Pitch is the size of a row of blocks, 4 high and "width"
- * long. The x offset is calculated differently as well, since moving 4
- * pixels to the right actually moves an entire 4x4 block to right, ie
- * 16 bytes (8 in case of DXT1). */
- if (This->resource.format_desc->format == WINED3DFMT_DXT1)
+ if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
{
- pLockedRect->pBits = This->resource.allocatedMemory + (pLockedRect->Pitch * pRect->top / 4) + (pRect->left * 2);
- }
- else if (This->resource.format_desc->format == WINED3DFMT_DXT2
- || This->resource.format_desc->format == WINED3DFMT_DXT3
- || This->resource.format_desc->format == WINED3DFMT_DXT4
- || This->resource.format_desc->format == WINED3DFMT_DXT5)
- {
- pLockedRect->pBits = This->resource.allocatedMemory + (pLockedRect->Pitch * pRect->top / 4) + (pRect->left * 4);
+ /* Compressed textures are block based, so calculate the offset of
+ * the block that contains the top-left pixel of the locked rectangle. */
+ pLockedRect->pBits = This->resource.allocatedMemory
+ + ((pRect->top / format_desc->block_height) * pLockedRect->Pitch)
+ + ((pRect->left / format_desc->block_width) * format_desc->block_byte_count);
}
else
{
pLockedRect->pBits = This->resource.allocatedMemory +
(pLockedRect->Pitch * pRect->top) +
- (pRect->left * This->resource.format_desc->byte_count);
+ (pRect->left * format_desc->byte_count);
}
This->lockedRect.left = pRect->left;
This->lockedRect.top = pRect->top;
diff --git a/reactos/dll/directx/wine/wined3d/surface_gdi.c b/reactos/dll/directx/wine/wined3d/surface_gdi.c
index 0ad65e01a98..02467829e83 100644
--- a/reactos/dll/directx/wine/wined3d/surface_gdi.c
+++ b/reactos/dll/directx/wine/wined3d/surface_gdi.c
@@ -29,12 +29,34 @@
#include "wine/port.h"
#include "wined3d_private.h"
-#include
#include
/* Use the d3d_surface debug channel to have one channel for all surfaces */
WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
+void surface_gdi_cleanup(IWineD3DSurfaceImpl *This)
+{
+ TRACE("(%p) : Cleaning up.\n", This);
+
+ if (This->Flags & SFLAG_DIBSECTION)
+ {
+ /* Release the DC. */
+ SelectObject(This->hDC, This->dib.holdbitmap);
+ DeleteDC(This->hDC);
+ /* Release the DIB section. */
+ DeleteObject(This->dib.DIBsection);
+ This->dib.bitmap_data = NULL;
+ This->resource.allocatedMemory = NULL;
+ }
+
+ if (This->Flags & SFLAG_USERPTR) IWineD3DSurface_SetMem((IWineD3DSurface *)This, NULL);
+ if (This->overlay_dest) list_remove(&This->overlay_entry);
+
+ HeapFree(GetProcessHeap(), 0, This->palette9);
+
+ resource_cleanup((IWineD3DResource *)This);
+}
+
/*****************************************************************************
* IWineD3DSurface::Release, GDI version
*
@@ -46,32 +68,15 @@ static ULONG WINAPI IWineGDISurfaceImpl_Release(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
ULONG ref = InterlockedDecrement(&This->resource.ref);
TRACE("(%p) : Releasing from %d\n", This, ref + 1);
- if (ref == 0) {
- TRACE("(%p) : cleaning up\n", This);
- if(This->Flags & SFLAG_DIBSECTION) {
- /* Release the DC */
- SelectObject(This->hDC, This->dib.holdbitmap);
- DeleteDC(This->hDC);
- /* Release the DIB section */
- DeleteObject(This->dib.DIBsection);
- This->dib.bitmap_data = NULL;
- This->resource.allocatedMemory = NULL;
- }
- if(This->Flags & SFLAG_USERPTR) IWineD3DSurface_SetMem(iface, NULL);
+ if (!ref)
+ {
+ surface_gdi_cleanup(This);
- HeapFree(GetProcessHeap(), 0, This->palette9);
-
- resource_cleanup((IWineD3DResource *)iface);
-
- if(This->overlay_dest) {
- list_remove(&This->overlay_entry);
- }
-
- TRACE("(%p) Released\n", This);
+ TRACE("(%p) Released.\n", This);
HeapFree(GetProcessHeap(), 0, This);
-
}
+
return ref;
}
@@ -178,7 +183,8 @@ IWineGDISurfaceImpl_UnlockRect(IWineD3DSurface *iface)
char buffer[4096];
++gen;
if ((gen % 10) == 0) {
- snprintf(buffer, sizeof(buffer), "/tmp/surface%p_type%u_level%u_%u.ppm", This, This->glDescription.target, This->glDescription.level, gen);
+ snprintf(buffer, sizeof(buffer), "/tmp/surface%p_type%u_level%u_%u.ppm",
+ This, This->texture_target, This->texture_level, gen);
IWineD3DSurfaceImpl_SaveSnapshot(iface, buffer);
}
/*
@@ -194,7 +200,10 @@ IWineGDISurfaceImpl_UnlockRect(IWineD3DSurface *iface)
/* Tell the swapchain to update the screen */
if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain)))
{
- x11_copy_to_screen(swapchain, &This->lockedRect);
+ if(iface == swapchain->frontBuffer)
+ {
+ x11_copy_to_screen(swapchain, &This->lockedRect);
+ }
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
}
@@ -485,7 +494,10 @@ static HRESULT WINAPI IWineGDISurfaceImpl_RealizePalette(IWineD3DSurface *iface)
/* Tell the swapchain to update the screen */
if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain)))
{
- x11_copy_to_screen(swapchain, NULL);
+ if(iface == swapchain->frontBuffer)
+ {
+ x11_copy_to_screen(swapchain, NULL);
+ }
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
}
@@ -536,12 +548,6 @@ IWineGDISurfaceImpl_PrivateSetup(IWineD3DSurface *iface)
return WINED3D_OK;
}
-static void WINAPI IWineGDISurfaceImpl_GetGlDesc(IWineD3DSurface *iface, glDescriptor **glDescription) {
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- FIXME("(%p) : Should not be called on a GDI surface\n", This);
- *glDescription = NULL;
-}
-
static HRESULT WINAPI IWineGDISurfaceImpl_SetMem(IWineD3DSurface *iface, void *Mem) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
@@ -671,7 +677,6 @@ const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl =
IWineD3DBaseSurfaceImpl_BindTexture,
IWineGDISurfaceImpl_SaveSnapshot,
IWineD3DBaseSurfaceImpl_SetContainer,
- IWineGDISurfaceImpl_GetGlDesc,
IWineD3DBaseSurfaceImpl_GetData,
IWineD3DBaseSurfaceImpl_SetFormat,
IWineGDISurfaceImpl_PrivateSetup,
diff --git a/reactos/dll/directx/wine/wined3d/swapchain.c b/reactos/dll/directx/wine/wined3d/swapchain.c
index 12f812eb316..d8d3733f56d 100644
--- a/reactos/dll/directx/wine/wined3d/swapchain.c
+++ b/reactos/dll/directx/wine/wined3d/swapchain.c
@@ -45,26 +45,36 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface, D3DCB
IWineD3DSwapChain_SetGammaRamp(iface, 0, &This->orig_gamma);
- /* release the ref to the front and back buffer parents */
- if(This->frontBuffer) {
+ /* Release the swapchain's draw buffers. Make sure This->backBuffer[0] is
+ * the last buffer to be destroyed, FindContext() depends on that. */
+ if (This->frontBuffer)
+ {
IWineD3DSurface_SetContainer(This->frontBuffer, 0);
- if(D3DCB_DestroyRenderTarget(This->frontBuffer) > 0) {
- FIXME("(%p) Something's still holding the front buffer\n",This);
+ if (D3DCB_DestroyRenderTarget(This->frontBuffer))
+ {
+ FIXME("(%p) Something's still holding the front buffer (%p).\n",
+ This, This->frontBuffer);
}
+ This->frontBuffer = NULL;
}
- if(This->backBuffer) {
- UINT i;
- for(i = 0; i < This->presentParms.BackBufferCount; i++) {
+ if (This->backBuffer)
+ {
+ UINT i = This->presentParms.BackBufferCount;
+
+ while (i--)
+ {
IWineD3DSurface_SetContainer(This->backBuffer[i], 0);
- if(D3DCB_DestroyRenderTarget(This->backBuffer[i]) > 0) {
- FIXME("(%p) Something's still holding the back buffer\n",This);
- }
+ if (D3DCB_DestroyRenderTarget(This->backBuffer[i]))
+ FIXME("(%p) Something's still holding back buffer %u (%p).\n",
+ This, i, This->backBuffer[i]);
}
HeapFree(GetProcessHeap(), 0, This->backBuffer);
+ This->backBuffer = NULL;
}
- for(i = 0; i < This->num_contexts; i++) {
+ for (i = 0; i < This->num_contexts; ++i)
+ {
DestroyContext(This->wineD3DDevice, This->context[i]);
}
/* Restore the screen resolution if we rendered in fullscreen
@@ -111,9 +121,9 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
cursor.resource.pool = WINED3DPOOL_SCRATCH;
cursor.resource.format_desc = getFormatDescEntry(WINED3DFMT_A8R8G8B8, &This->wineD3DDevice->adapter->gl_info);
cursor.resource.resourceType = WINED3DRTYPE_SURFACE;
- cursor.glDescription.textureName = This->wineD3DDevice->cursorTexture;
- cursor.glDescription.target = GL_TEXTURE_2D;
- cursor.glDescription.level = 0;
+ cursor.texture_name = This->wineD3DDevice->cursorTexture;
+ cursor.texture_target = GL_TEXTURE_2D;
+ cursor.texture_level = 0;
cursor.currentDesc.Width = This->wineD3DDevice->cursorWidth;
cursor.currentDesc.Height = This->wineD3DDevice->cursorHeight;
cursor.glRect.left = 0;
@@ -131,7 +141,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
if (This->presentParms.Windowed) {
MapWindowPoints(NULL, This->win_handle, (LPPOINT)&destRect, 2);
}
- IWineD3DSurface_Blt(This->backBuffer[0], &destRect, (IWineD3DSurface *) &cursor, NULL, WINEDDBLT_KEYSRC, NULL, WINED3DTEXF_NONE);
+ IWineD3DSurface_Blt(This->backBuffer[0], &destRect, (IWineD3DSurface *)&cursor,
+ NULL, WINEDDBLT_KEYSRC, NULL, WINED3DTEXF_POINT);
}
if(This->wineD3DDevice->logo_surface) {
/* Blit the logo into the upper left corner of the drawable */
@@ -223,7 +234,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
TRACE("Clearing the color buffer with cyan color\n");
IWineD3DDevice_Clear((IWineD3DDevice*)This->wineD3DDevice, 0, NULL,
- WINED3DCLEAR_TARGET, 0xff00ffff, 1.0, 0);
+ WINED3DCLEAR_TARGET, 0xff00ffff, 1.0f, 0);
}
if(((IWineD3DSurfaceImpl *) This->frontBuffer)->Flags & SFLAG_INSYSMEM ||
@@ -371,10 +382,11 @@ const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl =
IWineD3DBaseSwapChainImpl_GetGammaRamp
};
-WineD3DContext *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface) {
- WineD3DContext *ctx;
+struct wined3d_context *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface)
+{
IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *) iface;
- WineD3DContext **newArray;
+ struct wined3d_context **newArray;
+ struct wined3d_context *ctx;
TRACE("Creating a new context for swapchain %p, thread %d\n", This, GetCurrentThreadId());
@@ -401,10 +413,11 @@ WineD3DContext *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *
return ctx;
}
-void get_drawable_size_swapchain(IWineD3DSurfaceImpl *This, UINT *width, UINT *height) {
+void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height)
+{
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)context->current_rt;
/* The drawable size of an onscreen drawable is the surface size.
- * (Actually: The window size, but the surface is created in window size)
- */
- *width = This->currentDesc.Width;
- *height = This->currentDesc.Height;
+ * (Actually: The window size, but the surface is created in window size) */
+ *width = surface->currentDesc.Width;
+ *height = surface->currentDesc.Height;
}
diff --git a/reactos/dll/directx/wine/wined3d/texture.c b/reactos/dll/directx/wine/wined3d/texture.c
index dda43537cfc..dd8f32ed7dc 100644
--- a/reactos/dll/directx/wine/wined3d/texture.c
+++ b/reactos/dll/directx/wine/wined3d/texture.c
@@ -25,11 +25,271 @@
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
-#define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
+
+#define GLINFO_LOCATION (*gl_info)
+
+static void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb)
+{
+ /* Override the IWineD3DResource PreLoad method. */
+ IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
+ IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+ unsigned int i;
+ BOOL srgb_mode;
+ BOOL *dirty;
+
+ TRACE("(%p) : About to load texture.\n", This);
+
+ switch (srgb)
+ {
+ case SRGB_RGB:
+ srgb_mode = FALSE;
+ break;
+
+ case SRGB_BOTH:
+ texture_internal_preload(iface, SRGB_RGB);
+ /* Fallthrough */
+
+ case SRGB_SRGB:
+ srgb_mode = TRUE;
+ break;
+
+ default:
+ srgb_mode = This->baseTexture.is_srgb;
+ break;
+ }
+ dirty = srgb_mode ? &This->baseTexture.srgbDirty : &This->baseTexture.dirty;
+
+ if (!device->isInDraw)
+ {
+ /* ActivateContext sets isInDraw to TRUE when loading a pbuffer into a texture,
+ * thus no danger of recursive calls. */
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
+ }
+
+ if (This->resource.format_desc->format == WINED3DFMT_P8
+ || This->resource.format_desc->format == WINED3DFMT_A8P8)
+ {
+ for (i = 0; i < This->baseTexture.levels; ++i)
+ {
+ if (palette9_changed((IWineD3DSurfaceImpl *)This->surfaces[i]))
+ {
+ TRACE("Reloading surface because the d3d8/9 palette was changed.\n");
+ /* TODO: This is not necessarily needed with hw palettized texture support. */
+ IWineD3DSurface_LoadLocation(This->surfaces[i], SFLAG_INSYSMEM, NULL);
+ /* Make sure the texture is reloaded because of the palette change, this kills performance though :( */
+ IWineD3DSurface_ModifyLocation(This->surfaces[i], SFLAG_INTEXTURE, FALSE);
+ }
+ }
+ }
+
+ /* If the texture is marked dirty or the srgb sampler setting has changed
+ * since the last load then reload the surfaces. */
+ if (*dirty)
+ {
+ for (i = 0; i < This->baseTexture.levels; ++i)
+ {
+ IWineD3DSurface_LoadTexture(This->surfaces[i], srgb_mode);
+ }
+ }
+ else
+ {
+ TRACE("(%p) Texture not dirty, nothing to do.\n", iface);
+ }
+
+ /* No longer dirty. */
+ *dirty = FALSE;
+}
+
+static void texture_cleanup(IWineD3DTextureImpl *This, D3DCB_DESTROYSURFACEFN surface_destroy_cb)
+{
+ unsigned int i;
+
+ TRACE("(%p) : Cleaning up\n", This);
+
+ for (i = 0; i < This->baseTexture.levels; ++i)
+ {
+ if (This->surfaces[i])
+ {
+ /* Clean out the texture name we gave to the surface so that the
+ * surface doesn't try and release it */
+ surface_set_texture_name(This->surfaces[i], 0, TRUE);
+ surface_set_texture_name(This->surfaces[i], 0, FALSE);
+ surface_set_texture_target(This->surfaces[i], 0);
+ IWineD3DSurface_SetContainer(This->surfaces[i], 0);
+ surface_destroy_cb(This->surfaces[i]);
+ }
+ }
+
+ TRACE("(%p) : Cleaning up base texture\n", This);
+ basetexture_cleanup((IWineD3DBaseTexture *)This);
+}
+
+HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT levels,
+ IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent)
+{
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ UINT pow2_width, pow2_height;
+ UINT tmp_w, tmp_h;
+ unsigned int i;
+ HRESULT hr;
+
+ /* TODO: It should only be possible to create textures for formats
+ * that are reported as supported. */
+ if (WINED3DFMT_UNKNOWN >= format)
+ {
+ WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture);
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ /* Non-power2 support. */
+ if (GL_SUPPORT(ARB_TEXTURE_NON_POWER_OF_TWO))
+ {
+ pow2_width = width;
+ pow2_height = height;
+ }
+ else
+ {
+ /* Find the nearest pow2 match. */
+ pow2_width = pow2_height = 1;
+ while (pow2_width < width) pow2_width <<= 1;
+ while (pow2_height < height) pow2_height <<= 1;
+
+ if (pow2_width != width || pow2_height != height)
+ {
+ if (levels > 1)
+ {
+ WARN("Attempted to create a mipmapped np2 texture without unconditional np2 support.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+ levels = 1;
+ }
+ }
+
+ /* Calculate levels for mip mapping. */
+ if (usage & WINED3DUSAGE_AUTOGENMIPMAP)
+ {
+ if (!GL_SUPPORT(SGIS_GENERATE_MIPMAP))
+ {
+ WARN("No mipmap generation support, returning WINED3DERR_INVALIDCALL.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ if (levels > 1)
+ {
+ WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning WINED3DERR_INVALIDCALL.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ levels = 1;
+ }
+ else if (!levels)
+ {
+ levels = wined3d_log2i(max(width, height)) + 1;
+ TRACE("Calculated levels = %u.\n", levels);
+ }
+
+ hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels,
+ WINED3DRTYPE_TEXTURE, device, 0, usage, format_desc, pool, parent);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize basetexture, returning %#x.\n", hr);
+ return hr;
+ }
+
+ /* Precalculated scaling for 'faked' non power of two texture coords.
+ * Second also don't use ARB_TEXTURE_RECTANGLE in case the surface format is P8 and EXT_PALETTED_TEXTURE
+ * is used in combination with texture uploads (RTL_READTEX). The reason is that EXT_PALETTED_TEXTURE
+ * doesn't work in combination with ARB_TEXTURE_RECTANGLE. */
+ if (GL_SUPPORT(WINE_NORMALIZED_TEXRECT) && (width != pow2_width || height != pow2_height))
+ {
+ texture->baseTexture.pow2Matrix[0] = 1.0f;
+ texture->baseTexture.pow2Matrix[5] = 1.0f;
+ texture->baseTexture.pow2Matrix[10] = 1.0f;
+ texture->baseTexture.pow2Matrix[15] = 1.0f;
+ texture->target = GL_TEXTURE_2D;
+ texture->cond_np2 = TRUE;
+ texture->baseTexture.minMipLookup = minMipLookup_noFilter;
+ }
+ else if (GL_SUPPORT(ARB_TEXTURE_RECTANGLE) && (width != pow2_width || height != pow2_height)
+ && !((format_desc->format == WINED3DFMT_P8) && GL_SUPPORT(EXT_PALETTED_TEXTURE)
+ && (wined3d_settings.rendertargetlock_mode == RTL_READTEX)))
+ {
+ if ((width != 1) || (height != 1)) texture->baseTexture.pow2Matrix_identity = FALSE;
+
+ texture->baseTexture.pow2Matrix[0] = (float)width;
+ texture->baseTexture.pow2Matrix[5] = (float)height;
+ texture->baseTexture.pow2Matrix[10] = 1.0f;
+ texture->baseTexture.pow2Matrix[15] = 1.0f;
+ texture->target = GL_TEXTURE_RECTANGLE_ARB;
+ texture->cond_np2 = TRUE;
+
+ if(texture->resource.format_desc->Flags & WINED3DFMT_FLAG_FILTERING)
+ {
+ texture->baseTexture.minMipLookup = minMipLookup_noMip;
+ }
+ else
+ {
+ texture->baseTexture.minMipLookup = minMipLookup_noFilter;
+ }
+ }
+ else
+ {
+ if ((width != pow2_width) || (height != pow2_height))
+ {
+ texture->baseTexture.pow2Matrix_identity = FALSE;
+ texture->baseTexture.pow2Matrix[0] = (((float)width) / ((float)pow2_width));
+ texture->baseTexture.pow2Matrix[5] = (((float)height) / ((float)pow2_height));
+ }
+ else
+ {
+ texture->baseTexture.pow2Matrix[0] = 1.0f;
+ texture->baseTexture.pow2Matrix[5] = 1.0f;
+ }
+
+ texture->baseTexture.pow2Matrix[10] = 1.0f;
+ texture->baseTexture.pow2Matrix[15] = 1.0f;
+ texture->target = GL_TEXTURE_2D;
+ texture->cond_np2 = FALSE;
+ }
+ TRACE("xf(%f) yf(%f)\n", texture->baseTexture.pow2Matrix[0], texture->baseTexture.pow2Matrix[5]);
+
+ /* Generate all the surfaces. */
+ tmp_w = width;
+ tmp_h = height;
+ for (i = 0; i < texture->baseTexture.levels; ++i)
+ {
+ /* Use the callback to create the texture surface. */
+ hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_h, format_desc->format,
+ usage, pool, i, WINED3DCUBEMAP_FACE_POSITIVE_X, &texture->surfaces[i]);
+ if (FAILED(hr) || ((IWineD3DSurfaceImpl *)texture->surfaces[i])->Flags & SFLAG_OVERSIZE)
+ {
+ FIXME("Failed to create surface %p, hr %#x\n", texture, hr);
+ texture->surfaces[i] = NULL;
+ texture_cleanup(texture, D3DCB_DefaultDestroySurface);
+ return hr;
+ }
+
+ IWineD3DSurface_SetContainer(texture->surfaces[i], (IWineD3DBase *)texture);
+ TRACE("Created surface level %u @ %p.\n", i, texture->surfaces[i]);
+ surface_set_texture_target(texture->surfaces[i], texture->target);
+ /* Calculate the next mipmap level. */
+ tmp_w = max(1, tmp_w >> 1);
+ tmp_h = max(1, tmp_h >> 1);
+ }
+ texture->baseTexture.internal_preload = texture_internal_preload;
+
+ return WINED3D_OK;
+}
+
+#undef GLINFO_LOCATION
/* *******************************************
IWineD3DTexture IUnknown parts follow
******************************************* */
+
+#define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
+
static HRESULT WINAPI IWineD3DTextureImpl_QueryInterface(IWineD3DTexture *iface, REFIID riid, LPVOID *ppobj)
{
IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
@@ -92,61 +352,6 @@ static DWORD WINAPI IWineD3DTextureImpl_GetPriority(IWineD3DTexture *iface) {
return resource_get_priority((IWineD3DResource *)iface);
}
-void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb) {
-
- /* Override the IWineD3DResource PreLoad method */
- unsigned int i;
- IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
- IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
- BOOL srgb_mode;
- BOOL *dirty;
-
- TRACE("(%p) : About to load texture\n", This);
-
- switch(srgb) {
- case SRGB_RGB: srgb_mode = FALSE; break;
- case SRGB_BOTH: texture_internal_preload(iface, SRGB_RGB);
- case SRGB_SRGB: srgb_mode = TRUE; break;
- /* DONTKNOW, and shut up the compiler */
- default: srgb_mode = This->baseTexture.is_srgb; break;
- }
- dirty = srgb_mode ? &This->baseTexture.srgbDirty : &This->baseTexture.dirty;
-
- if(!device->isInDraw) {
- /* ActivateContext sets isInDraw to TRUE when loading a pbuffer into a texture, thus no danger of
- * recursive calls
- */
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
- }
-
- if (This->resource.format_desc->format == WINED3DFMT_P8
- || This->resource.format_desc->format == WINED3DFMT_A8P8)
- {
- for (i = 0; i < This->baseTexture.levels; i++) {
- if(palette9_changed((IWineD3DSurfaceImpl *)This->surfaces[i])) {
- TRACE("Reloading surface because the d3d8/9 palette was changed\n");
- /* TODO: This is not necessarily needed with hw palettized texture support */
- IWineD3DSurface_LoadLocation(This->surfaces[i], SFLAG_INSYSMEM, NULL);
- /* Make sure the texture is reloaded because of the palette change, this kills performance though :( */
- IWineD3DSurface_ModifyLocation(This->surfaces[i], SFLAG_INTEXTURE, FALSE);
- }
- }
- }
- /* If the texture is marked dirty or the srgb sampler setting has changed since the last load then reload the surfaces */
- if (*dirty) {
- for (i = 0; i < This->baseTexture.levels; i++) {
- IWineD3DSurface_LoadTexture(This->surfaces[i], srgb_mode);
- }
- } else {
- TRACE("(%p) Texture not dirty, nothing to do\n" , iface);
- }
-
- /* No longer dirty */
- *dirty = FALSE;
-
- return ;
-}
-
static void WINAPI IWineD3DTextureImpl_PreLoad(IWineD3DTexture *iface) {
texture_internal_preload((IWineD3DBaseTexture *) iface, SRGB_ANY);
}
@@ -213,6 +418,7 @@ static BOOL WINAPI IWineD3DTextureImpl_GetDirty(IWineD3DTexture *iface) {
return basetexture_get_dirty((IWineD3DBaseTexture *)iface);
}
+/* Context activation is done by the caller. */
static HRESULT WINAPI IWineD3DTextureImpl_BindTexture(IWineD3DTexture *iface, BOOL srgb) {
IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
BOOL set_gl_texture_desc;
@@ -271,33 +477,13 @@ static BOOL WINAPI IWineD3DTextureImpl_IsCondNP2(IWineD3DTexture *iface) {
return This->cond_np2;
}
-static void WINAPI IWineD3DTextureImpl_ApplyStateChanges(IWineD3DTexture *iface,
- const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1],
- const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]) {
- TRACE("(%p) : relay to BaseTexture\n", iface);
- basetexture_apply_state_changes((IWineD3DBaseTexture *)iface, textureStates, samplerStates);
-}
-
/* *******************************************
IWineD3DTexture IWineD3DTexture parts follow
******************************************* */
static void WINAPI IWineD3DTextureImpl_Destroy(IWineD3DTexture *iface, D3DCB_DESTROYSURFACEFN D3DCB_DestroySurface) {
IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
- unsigned int i;
- TRACE("(%p) : Cleaning up\n",This);
- for (i = 0; i < This->baseTexture.levels; i++) {
- if (This->surfaces[i] != NULL) {
- /* Clean out the texture name we gave to the surface so that the surface doesn't try and release it */
- surface_set_texture_name(This->surfaces[i], 0, TRUE);
- surface_set_texture_name(This->surfaces[i], 0, FALSE);
- surface_set_texture_target(This->surfaces[i], 0);
- IWineD3DSurface_SetContainer(This->surfaces[i], 0);
- D3DCB_DestroySurface(This->surfaces[i]);
- }
- }
- TRACE("(%p) : cleaning up base texture\n", This);
- basetexture_cleanup((IWineD3DBaseTexture *)iface);
+ texture_cleanup(This, D3DCB_DestroySurface);
/* free the object */
HeapFree(GetProcessHeap(), 0, This);
}
@@ -401,7 +587,6 @@ const IWineD3DTextureVtbl IWineD3DTexture_Vtbl =
IWineD3DTextureImpl_BindTexture,
IWineD3DTextureImpl_GetTextureDimensions,
IWineD3DTextureImpl_IsCondNP2,
- IWineD3DTextureImpl_ApplyStateChanges,
/* IWineD3DTexture */
IWineD3DTextureImpl_Destroy,
IWineD3DTextureImpl_GetLevelDesc,
diff --git a/reactos/dll/directx/wine/wined3d/utils.c b/reactos/dll/directx/wine/wined3d/utils.c
index d6973725748..3c25ebeb3e0 100644
--- a/reactos/dll/directx/wine/wined3d/utils.c
+++ b/reactos/dll/directx/wine/wined3d/utils.c
@@ -91,14 +91,14 @@ static const struct StaticPixelFormatDesc formats[] =
{WINED3DFMT_A8_UNORM, 0x000000ff, 0x0, 0x0, 0x0, 1, 0, 0, FALSE},
{WINED3DFMT_A8R3G3B2, 0x0000ff00, 0x000000e0, 0x0000001c, 0x00000003, 2, 0, 0, FALSE},
{WINED3DFMT_X4R4G4B4, 0x0, 0x00000f00, 0x000000f0, 0x0000000f, 2, 0, 0, FALSE},
- {WINED3DFMT_R10G10B10A2_UNORM, 0xb0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE},
- {WINED3DFMT_R10G10B10A2_UINT, 0xb0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE},
- {WINED3DFMT_R10G10B10A2_SNORM, 0xb0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE},
+ {WINED3DFMT_R10G10B10A2_UNORM, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE},
+ {WINED3DFMT_R10G10B10A2_UINT, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE},
+ {WINED3DFMT_R10G10B10A2_SNORM, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE},
{WINED3DFMT_R8G8B8A8_UNORM, 0xff000000, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE},
{WINED3DFMT_R8G8B8A8_UINT, 0xff000000, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE},
{WINED3DFMT_X8B8G8R8, 0x0, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE},
{WINED3DFMT_R16G16_UNORM, 0x0, 0x0000ffff, 0xffff0000, 0x0, 4, 0, 0, FALSE},
- {WINED3DFMT_A2R10G10B10, 0xb0000000, 0x3ff00000, 0x000ffc00, 0x000003ff, 4, 0, 0, FALSE},
+ {WINED3DFMT_A2R10G10B10, 0xc0000000, 0x3ff00000, 0x000ffc00, 0x000003ff, 4, 0, 0, FALSE},
{WINED3DFMT_R16G16B16A16_UNORM, 0x1, 0x0000ffff, 0xffff0000, 0x0, 8, 0, 0, FALSE},
/* Luminance */
{WINED3DFMT_L8, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, FALSE},
@@ -134,6 +134,24 @@ static const struct StaticPixelFormatDesc formats[] =
{WINED3DFMT_NVHS, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, TRUE },
};
+struct wined3d_format_compression_info
+{
+ WINED3DFORMAT format;
+ UINT block_width;
+ UINT block_height;
+ UINT block_byte_count;
+};
+
+static const struct wined3d_format_compression_info format_compression_info[] =
+{
+ {WINED3DFMT_DXT1, 4, 4, 8},
+ {WINED3DFMT_DXT2, 4, 4, 16},
+ {WINED3DFMT_DXT3, 4, 4, 16},
+ {WINED3DFMT_DXT4, 4, 4, 16},
+ {WINED3DFMT_DXT5, 4, 4, 16},
+ {WINED3DFMT_ATI2N, 4, 4, 16},
+};
+
struct wined3d_format_vertex_info
{
WINED3DFORMAT format;
@@ -170,6 +188,7 @@ typedef struct {
WINED3DFORMAT fmt;
GLint glInternal, glGammaInternal, rtInternal, glFormat, glType;
unsigned int Flags;
+ GL_SupportedExt extension;
} GlPixelFormatDescTemplate;
/*****************************************************************************
@@ -181,10 +200,8 @@ typedef struct {
static const GlPixelFormatDescTemplate gl_formats_template[] = {
/* WINED3DFORMAT internal srgbInternal rtInternal
format type
- flags */
- {WINED3DFMT_UNKNOWN, 0, 0, 0,
- 0, 0,
- 0},
+ flags
+ extension */
/* FourCC formats */
/* GL_APPLE_ycbcr_422 claims that its '2YUV' format, which is supported via the UNSIGNED_SHORT_8_8_REV_APPLE type
* is equivalent to 'UYVY' format on Windows, and the 'YUVS' via UNSIGNED_SHORT_8_8_APPLE equates to 'YUY2'. The
@@ -192,208 +209,278 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
* Macs, so probably the endianess differs. This could be tested as soon as we have a Windows and MacOS on a big
* endian machine
*/
+ {WINED3DFMT_UYVY, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_UYVY, GL_RGB, GL_RGB, 0,
GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_APPLE,
- WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_FILTERING,
+ APPLE_YCBCR_422},
+ {WINED3DFMT_YUY2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_YUY2, GL_RGB, GL_RGB, 0,
GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_REV_APPLE,
- WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_FILTERING,
+ APPLE_YCBCR_422},
{WINED3DFMT_YV12, GL_ALPHA, GL_ALPHA, 0,
GL_ALPHA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_DXT1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0,
GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ EXT_TEXTURE_COMPRESSION_S3TC},
{WINED3DFMT_DXT2, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0,
GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ EXT_TEXTURE_COMPRESSION_S3TC},
{WINED3DFMT_DXT3, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0,
GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ EXT_TEXTURE_COMPRESSION_S3TC},
{WINED3DFMT_DXT4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0,
GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ EXT_TEXTURE_COMPRESSION_S3TC},
{WINED3DFMT_DXT5, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0,
GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
- {WINED3DFMT_MULTI2_ARGB8, 0, 0, 0,
- 0, 0,
- 0},
- {WINED3DFMT_G8R8_G8B8, 0, 0, 0,
- 0, 0,
- 0},
- {WINED3DFMT_R8G8_B8G8, 0, 0, 0,
- 0, 0,
- 0},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ EXT_TEXTURE_COMPRESSION_S3TC},
/* IEEE formats */
{WINED3DFMT_R32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0,
GL_RED, GL_FLOAT,
- WINED3DFMT_FLAG_RENDERTARGET},
+ WINED3DFMT_FLAG_RENDERTARGET,
+ ARB_TEXTURE_FLOAT},
+ {WINED3DFMT_R32_FLOAT, GL_R32F, GL_R32F, 0,
+ GL_RED, GL_FLOAT,
+ WINED3DFMT_FLAG_RENDERTARGET,
+ ARB_TEXTURE_RG},
+ {WINED3DFMT_R32G32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0,
+ GL_RGB, GL_FLOAT,
+ WINED3DFMT_FLAG_RENDERTARGET,
+ ARB_TEXTURE_FLOAT},
{WINED3DFMT_R32G32_FLOAT, GL_RG32F, GL_RG32F, 0,
GL_RG, GL_FLOAT,
- WINED3DFMT_FLAG_RENDERTARGET},
+ WINED3DFMT_FLAG_RENDERTARGET,
+ ARB_TEXTURE_RG},
{WINED3DFMT_R32G32B32A32_FLOAT, GL_RGBA32F_ARB, GL_RGBA32F_ARB, 0,
GL_RGBA, GL_FLOAT,
- WINED3DFMT_FLAG_RENDERTARGET},
- /* Hmm? */
- {WINED3DFMT_CxV8U8, 0, 0, 0,
- 0, 0,
- 0},
+ WINED3DFMT_FLAG_RENDERTARGET,
+ ARB_TEXTURE_FLOAT},
/* Float */
{WINED3DFMT_R16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0,
- GL_RED, GL_HALF_FLOAT_ARB,
- WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET},
+ GL_RED, GL_HALF_FLOAT_ARB,
+ WINED3DFMT_FLAG_RENDERTARGET,
+ ARB_TEXTURE_FLOAT},
+ {WINED3DFMT_R16_FLOAT, GL_R16F, GL_R16F, 0,
+ GL_RED, GL_HALF_FLOAT_ARB,
+ WINED3DFMT_FLAG_RENDERTARGET,
+ ARB_TEXTURE_RG},
+ {WINED3DFMT_R16G16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0,
+ GL_RGB, GL_HALF_FLOAT_ARB,
+ WINED3DFMT_FLAG_RENDERTARGET,
+ ARB_TEXTURE_FLOAT},
{WINED3DFMT_R16G16_FLOAT, GL_RG16F, GL_RG16F, 0,
- GL_RG, GL_HALF_FLOAT_ARB,
- WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET},
+ GL_RG, GL_HALF_FLOAT_ARB,
+ WINED3DFMT_FLAG_RENDERTARGET,
+ ARB_TEXTURE_RG},
{WINED3DFMT_R16G16B16A16_FLOAT, GL_RGBA16F_ARB, GL_RGBA16F_ARB, 0,
- GL_RGBA, GL_HALF_FLOAT_ARB,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET},
+ GL_RGBA, GL_HALF_FLOAT_ARB,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_RENDERTARGET,
+ ARB_TEXTURE_FLOAT},
/* Palettized formats */
- {WINED3DFMT_A8P8, 0, 0, 0,
- 0, 0,
- 0},
+ {WINED3DFMT_P8, GL_RGBA, GL_RGBA, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE,
+ 0,
+ ARB_FRAGMENT_PROGRAM},
{WINED3DFMT_P8, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX8_EXT, 0,
GL_COLOR_INDEX, GL_UNSIGNED_BYTE,
- 0},
+ 0,
+ EXT_PALETTED_TEXTURE},
/* Standard ARGB formats */
{WINED3DFMT_R8G8B8, GL_RGB8, GL_RGB8, 0,
GL_BGR, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_A8R8G8B8, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0,
GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_X8R8G8B8, GL_RGB8, GL_SRGB8_EXT, 0,
GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_R5G6B5, GL_RGB5, GL_RGB5, GL_RGB8,
GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_X1R5G5B5, GL_RGB5, GL_RGB5_A1, 0,
GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_A1R5G5B5, GL_RGB5_A1, GL_RGB5_A1, 0,
GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_A4R4G4B4, GL_RGBA4, GL_SRGB8_ALPHA8_EXT, 0,
GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_R3G3B2, GL_R3_G3_B2, GL_R3_G3_B2, 0,
GL_RGB, GL_UNSIGNED_BYTE_3_3_2,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_A8_UNORM, GL_ALPHA8, GL_ALPHA8, 0,
GL_ALPHA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING},
- {WINED3DFMT_A8R3G3B2, 0, 0, 0,
- 0, 0,
- 0},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_X4R4G4B4, GL_RGB4, GL_RGB4, 0,
GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0,
GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_R8G8B8A8_UNORM, GL_RGBA8, GL_RGBA8, 0,
GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_X8B8G8R8, GL_RGB8, GL_RGB8, 0,
GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
- {WINED3DFMT_R16G16_UNORM, GL_RGB16_EXT, GL_RGB16_EXT, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_R16G16_UNORM, GL_RGB16_EXT, GL_RGB16_EXT, GL_RGBA16_EXT,
GL_RGB, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_A2R10G10B10, GL_RGB10_A2, GL_RGB10_A2, 0,
GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16_EXT, GL_RGBA16_EXT, 0,
GL_RGBA, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
+ WINED3D_GL_EXT_NONE},
/* Luminance */
{WINED3DFMT_L8, GL_LUMINANCE8, GL_SLUMINANCE8_EXT, 0,
GL_LUMINANCE, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_A8L8, GL_LUMINANCE8_ALPHA8, GL_SLUMINANCE8_ALPHA8_EXT, 0,
GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_A4L4, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE4_ALPHA4, 0,
GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
- 0},
+ 0,
+ WINED3D_GL_EXT_NONE},
/* Bump mapping stuff */
+ {WINED3DFMT_R8G8_SNORM, GL_RGB8, GL_RGB8, 0,
+ GL_BGR, GL_UNSIGNED_BYTE,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_R8G8_SNORM, GL_DSDT8_NV, GL_DSDT8_NV, 0,
GL_DSDT_NV, GL_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ NV_TEXTURE_SHADER},
+ {WINED3DFMT_L6V5U5, GL_RGB5, GL_RGB5, 0,
+ GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_L6V5U5, GL_DSDT8_MAG8_NV, GL_DSDT8_MAG8_NV, 0,
GL_DSDT_MAG_NV, GL_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ NV_TEXTURE_SHADER},
+ {WINED3DFMT_X8L8V8U8, GL_RGB8, GL_RGB8, 0,
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_X8L8V8U8, GL_DSDT8_MAG8_INTENSITY8_NV, GL_DSDT8_MAG8_INTENSITY8_NV, 0,
GL_DSDT_MAG_VIB_NV, GL_UNSIGNED_INT_8_8_S8_S8_REV_NV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ NV_TEXTURE_SHADER},
+ {WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8, GL_RGBA8, 0,
+ GL_BGRA, GL_UNSIGNED_BYTE,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_R8G8B8A8_SNORM, GL_SIGNED_RGBA8_NV, GL_SIGNED_RGBA8_NV, 0,
GL_RGBA, GL_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ NV_TEXTURE_SHADER},
+ {WINED3DFMT_R16G16_SNORM, GL_RGB16_EXT, GL_RGB16_EXT, 0,
+ GL_BGR, GL_UNSIGNED_SHORT,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
{WINED3DFMT_R16G16_SNORM, GL_SIGNED_HILO16_NV, GL_SIGNED_HILO16_NV, 0,
GL_HILO_NV, GL_SHORT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
- {WINED3DFMT_W11V11U10, 0, 0, 0,
- 0, 0,
- 0},
- {WINED3DFMT_A2W10V10U10, 0, 0, 0,
- 0, 0,
- 0},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ NV_TEXTURE_SHADER},
/* Depth stencil formats */
{WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_DEPTH},
+ WINED3DFMT_FLAG_DEPTH,
+ ARB_DEPTH_TEXTURE},
{WINED3DFMT_D32, GL_DEPTH_COMPONENT32_ARB, GL_DEPTH_COMPONENT32_ARB, 0,
GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_DEPTH},
+ WINED3DFMT_FLAG_DEPTH,
+ ARB_DEPTH_TEXTURE},
{WINED3DFMT_D15S1, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL},
+ WINED3DFMT_FLAG_DEPTH,
+ ARB_DEPTH_TEXTURE},
+ {WINED3DFMT_D15S1, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
+ GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
+ EXT_PACKED_DEPTH_STENCIL},
{WINED3DFMT_D24S8, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
+ ARB_DEPTH_TEXTURE},
+ {WINED3DFMT_D24S8, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
+ GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
+ EXT_PACKED_DEPTH_STENCIL},
{WINED3DFMT_D24X8, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
+ ARB_DEPTH_TEXTURE},
{WINED3DFMT_D24X4S4, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL},
+ WINED3DFMT_FLAG_DEPTH,
+ ARB_DEPTH_TEXTURE},
+ {WINED3DFMT_D24X4S4, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
+ GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
+ EXT_PACKED_DEPTH_STENCIL},
{WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH},
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
+ ARB_DEPTH_TEXTURE},
{WINED3DFMT_L16, GL_LUMINANCE16_EXT, GL_LUMINANCE16_EXT, 0,
GL_LUMINANCE, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING},
- {WINED3DFMT_D32F_LOCKABLE, GL_DEPTH_COMPONENT32_ARB, GL_DEPTH_COMPONENT32_ARB, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+ WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_D32F_LOCKABLE, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, 0,
GL_DEPTH_COMPONENT, GL_FLOAT,
- WINED3DFMT_FLAG_DEPTH},
- {WINED3DFMT_D24FS8, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_FLOAT,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL},
- /* Is this a vertex buffer? */
- {WINED3DFMT_VERTEXDATA, 0, 0, 0,
- 0, 0,
- 0},
- {WINED3DFMT_R16_UINT, 0, 0, 0,
- 0, 0,
- 0},
- {WINED3DFMT_R32_UINT, 0, 0, 0,
- 0, 0,
- 0},
- {WINED3DFMT_R16G16B16A16_SNORM, GL_COLOR_INDEX, GL_COLOR_INDEX, 0,
- GL_COLOR_INDEX, GL_UNSIGNED_SHORT,
- 0},
+ WINED3DFMT_FLAG_DEPTH,
+ ARB_DEPTH_BUFFER_FLOAT},
+ {WINED3DFMT_D24FS8, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0,
+ GL_DEPTH_STENCIL_EXT, GL_FLOAT_32_UNSIGNED_INT_24_8_REV,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
+ ARB_DEPTH_BUFFER_FLOAT},
/* Vendor-specific formats */
- {WINED3DFMT_ATI2N, 0, 0, 0,
+ {WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0,
GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
- 0},
- {WINED3DFMT_NVHU, 0, 0, 0,
+ 0,
+ ATI_TEXTURE_COMPRESSION_3DC},
+ {WINED3DFMT_ATI2N, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, 0,
GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
- 0},
- {WINED3DFMT_NVHS, 0, 0, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
- 0}
+ 0,
+ EXT_TEXTURE_COMPRESSION_RGTC},
};
static inline int getFmtIdx(WINED3DFORMAT fmt) {
@@ -413,7 +500,7 @@ static inline int getFmtIdx(WINED3DFORMAT fmt) {
return -1;
}
-static BOOL init_format_base_info(WineD3D_GL_Info *gl_info)
+static BOOL init_format_base_info(struct wined3d_gl_info *gl_info)
{
UINT format_count = sizeof(formats) / sizeof(*formats);
UINT i;
@@ -442,32 +529,216 @@ static BOOL init_format_base_info(WineD3D_GL_Info *gl_info)
return TRUE;
}
+static BOOL init_format_compression_info(struct wined3d_gl_info *gl_info)
+{
+ unsigned int i;
+
+ for (i = 0; i < (sizeof(format_compression_info) / sizeof(*format_compression_info)); ++i)
+ {
+ struct GlPixelFormatDesc *format_desc;
+ int fmt_idx = getFmtIdx(format_compression_info[i].format);
+
+ if (fmt_idx == -1)
+ {
+ ERR("Format %s (%#x) not found.\n",
+ debug_d3dformat(format_compression_info[i].format), format_compression_info[i].format);
+ return FALSE;
+ }
+
+ format_desc = &gl_info->gl_formats[fmt_idx];
+ format_desc->block_width = format_compression_info[i].block_width;
+ format_desc->block_height = format_compression_info[i].block_height;
+ format_desc->block_byte_count = format_compression_info[i].block_byte_count;
+ format_desc->Flags |= WINED3DFMT_FLAG_COMPRESSED;
+ }
+
+ return TRUE;
+}
+
#define GLINFO_LOCATION (*gl_info)
-static BOOL check_fbo_compat(const WineD3D_GL_Info *gl_info, GLint internal_format)
+/* Context activation is done by the caller. */
+static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct GlPixelFormatDesc *format_desc)
{
- GLuint tex, fb;
+ /* Check if the default internal format is supported as a frame buffer
+ * target, otherwise fall back to the render target internal.
+ *
+ * Try to stick to the standard format if possible, this limits precision differences. */
GLenum status;
+ GLuint tex;
+
+ ENTER_GL();
while(glGetError());
+ glDisable(GL_BLEND);
+
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
- glTexImage2D(GL_TEXTURE_2D, 0, internal_format, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- GL_EXTCALL(glGenFramebuffersEXT(1, &fb));
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb));
+ glTexImage2D(GL_TEXTURE_2D, 0, format_desc->glInternal, 16, 16, 0,
+ format_desc->glFormat, format_desc->glType, NULL);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0));
status = GL_EXTCALL(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT));
- GL_EXTCALL(glDeleteFramebuffersEXT(1, &fb));
- glDeleteTextures(1, &tex);
-
checkGLcall("Framebuffer format check");
- return status == GL_FRAMEBUFFER_COMPLETE_EXT;
+ if (status == GL_FRAMEBUFFER_COMPLETE_EXT)
+ {
+ TRACE("Format %s is supported as FBO color attachment\n", debug_d3dformat(format_desc->format));
+ format_desc->Flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE;
+ format_desc->rtInternal = format_desc->glInternal;
+ }
+ else
+ {
+ if (!format_desc->rtInternal)
+ {
+ if (format_desc->Flags & WINED3DFMT_FLAG_RENDERTARGET)
+ {
+ FIXME("Format %s with rendertarget flag is not supported as FBO color attachment,"
+ " and no fallback specified.\n", debug_d3dformat(format_desc->format));
+ format_desc->Flags &= ~WINED3DFMT_FLAG_RENDERTARGET;
+ }
+ else
+ {
+ TRACE("Format %s is not supported as FBO color attachment.\n", debug_d3dformat(format_desc->format));
+ }
+ format_desc->rtInternal = format_desc->glInternal;
+ }
+ else
+ {
+ TRACE("Format %s is not supported as FBO color attachment, trying rtInternal format as fallback.\n",
+ debug_d3dformat(format_desc->format));
+
+ while(glGetError());
+
+ GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, 0, 0));
+
+ glTexImage2D(GL_TEXTURE_2D, 0, format_desc->rtInternal, 16, 16, 0,
+ format_desc->glFormat, format_desc->glType, NULL);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0));
+
+ status = GL_EXTCALL(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT));
+ checkGLcall("Framebuffer format check");
+
+ if (status == GL_FRAMEBUFFER_COMPLETE_EXT)
+ {
+ TRACE("Format %s rtInternal format is supported as FBO color attachment\n",
+ debug_d3dformat(format_desc->format));
+ }
+ else
+ {
+ FIXME("Format %s rtInternal format is not supported as FBO color attachment.\n",
+ debug_d3dformat(format_desc->format));
+ format_desc->Flags &= ~WINED3DFMT_FLAG_RENDERTARGET;
+ }
+ }
+ }
+
+ if (status == GL_FRAMEBUFFER_COMPLETE_EXT && format_desc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING)
+ {
+ GLuint rb;
+
+ if (GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL))
+ {
+ GL_EXTCALL(glGenRenderbuffersEXT(1, &rb));
+ GL_EXTCALL(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rb));
+ GL_EXTCALL(glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, 16, 16));
+ GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, rb));
+ GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, rb));
+ checkGLcall("RB attachment");
+ }
+
+ glEnable(GL_BLEND);
+ glClear(GL_COLOR_BUFFER_BIT);
+ if (glGetError() == GL_INVALID_FRAMEBUFFER_OPERATION_EXT)
+ {
+ while(glGetError());
+ TRACE("Format doesn't support post-pixelshader blending.\n");
+ format_desc->Flags &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
+ }
+
+ if (GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL))
+ {
+ GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, 0));
+ GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, 0));
+ GL_EXTCALL(glDeleteRenderbuffersEXT(1, &rb));
+ checkGLcall("RB cleanup");
+ }
+ }
+
+ glDeleteTextures(1, &tex);
+
+ LEAVE_GL();
}
-static BOOL init_format_texture_info(WineD3D_GL_Info *gl_info)
+/* Context activation is done by the caller. */
+static void init_format_fbo_compat_info(struct wined3d_gl_info *gl_info)
+{
+ unsigned int i;
+ GLuint fbo;
+
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ ENTER_GL();
+
+ GL_EXTCALL(glGenFramebuffersEXT(1, &fbo));
+ GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo));
+
+ LEAVE_GL();
+ }
+
+ for (i = 0; i < sizeof(formats) / sizeof(*formats); ++i)
+ {
+ struct GlPixelFormatDesc *desc = &gl_info->gl_formats[i];
+
+ if (!desc->glInternal) continue;
+
+ if (desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
+ {
+ TRACE("Skipping format %s because it's a depth/stencil format.\n",
+ debug_d3dformat(desc->format));
+ continue;
+ }
+
+ if (desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
+ {
+ TRACE("Skipping format %s because it's a compressed format.\n",
+ debug_d3dformat(desc->format));
+ continue;
+ }
+
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ TRACE("Checking if format %s is supported as FBO color attachment...\n", debug_d3dformat(desc->format));
+ check_fbo_compat(gl_info, desc);
+ }
+ else
+ {
+ desc->rtInternal = desc->glInternal;
+ }
+ }
+
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ ENTER_GL();
+
+ GL_EXTCALL(glDeleteFramebuffersEXT(1, &fbo));
+
+ LEAVE_GL();
+ }
+}
+
+static BOOL init_format_texture_info(struct wined3d_gl_info *gl_info)
{
unsigned int i;
@@ -483,65 +754,203 @@ static BOOL init_format_texture_info(WineD3D_GL_Info *gl_info)
return FALSE;
}
+ if (!GL_SUPPORT(gl_formats_template[i].extension)) continue;
+
desc = &gl_info->gl_formats[fmt_idx];
desc->glInternal = gl_formats_template[i].glInternal;
desc->glGammaInternal = gl_formats_template[i].glGammaInternal;
+ desc->rtInternal = gl_formats_template[i].rtInternal;
desc->glFormat = gl_formats_template[i].glFormat;
desc->glType = gl_formats_template[i].glType;
desc->color_fixup = COLOR_FIXUP_IDENTITY;
desc->Flags |= gl_formats_template[i].Flags;
- desc->heightscale = 1.0;
-
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO && gl_formats_template[i].rtInternal)
- {
- /* Check if the default internal format is supported as a frame buffer target, otherwise
- * fall back to the render target internal.
- *
- * Try to stick to the standard format if possible, this limits precision differences */
- if (!check_fbo_compat(gl_info, gl_formats_template[i].glInternal))
- {
- TRACE("Internal format of %s not supported as FBO target, using render target internal instead\n",
- debug_d3dformat(gl_formats_template[i].fmt));
- desc->rtInternal = gl_formats_template[i].rtInternal;
- }
- else
- {
- TRACE("Format %s is supported as fbo target\n", debug_d3dformat(gl_formats_template[i].fmt));
- desc->rtInternal = gl_formats_template[i].glInternal;
- }
- }
- else
- {
- desc->rtInternal = gl_formats_template[i].glInternal;
- }
+ desc->heightscale = 1.0f;
}
return TRUE;
}
-static void apply_format_fixups(WineD3D_GL_Info *gl_info)
+static BOOL color_match(DWORD c1, DWORD c2, BYTE max_diff)
+{
+ if (abs((c1 & 0xff) - (c2 & 0xff)) > max_diff) return FALSE;
+ c1 >>= 8; c2 >>= 8;
+ if (abs((c1 & 0xff) - (c2 & 0xff)) > max_diff) return FALSE;
+ c1 >>= 8; c2 >>= 8;
+ if (abs((c1 & 0xff) - (c2 & 0xff)) > max_diff) return FALSE;
+ c1 >>= 8; c2 >>= 8;
+ if (abs((c1 & 0xff) - (c2 & 0xff)) > max_diff) return FALSE;
+ return TRUE;
+}
+
+/* A context is provided by the caller */
+static BOOL check_filter(const struct wined3d_gl_info *gl_info, GLenum internal)
+{
+ GLuint tex, fbo, buffer;
+ const DWORD data[] = {0x00000000, 0xffffffff};
+ DWORD readback[16 * 1];
+ BOOL ret = FALSE;
+
+ /* Render a filtered texture and see what happens. This is intended to detect the lack of
+ * float16 filtering on ATI X1000 class cards. The drivers disable filtering instead of
+ * falling back to software. If this changes in the future this code will get fooled and
+ * apps might hit the software path due to incorrectly advertised caps.
+ *
+ * Its unlikely that this changes however. GL Games like Mass Effect depend on the filter
+ * disable fallback, if Apple or ATI ever change the driver behavior they will break more
+ * than Wine. The Linux binary <= r500 driver is not maintained any more anyway
+ */
+
+ ENTER_GL();
+ while(glGetError());
+
+ glGenTextures(1, &buffer);
+ glBindTexture(GL_TEXTURE_2D, buffer);
+ memset(readback, 0x7e, sizeof(readback));
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 16, 1, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, readback);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
+
+ glGenTextures(1, &tex);
+ glBindTexture(GL_TEXTURE_2D, tex);
+ glTexImage2D(GL_TEXTURE_2D, 0, internal, 2, 1, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
+ glEnable(GL_TEXTURE_2D);
+
+ GL_EXTCALL(glGenFramebuffersEXT(1, &fbo));
+ GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo));
+ GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, buffer, 0));
+ glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
+
+ glViewport(0, 0, 16, 1);
+ glDisable(GL_LIGHTING);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ glClearColor(0, 1, 0, 0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glBegin(GL_TRIANGLE_STRIP);
+ glTexCoord2f(0.0, 0.0);
+ glVertex2f(-1.0f, -1.0f);
+ glTexCoord2f(1.0, 0.0);
+ glVertex2f(1.0f, -1.0f);
+ glTexCoord2f(0.0, 1.0);
+ glVertex2f(-1.0f, 1.0f);
+ glTexCoord2f(1.0, 1.0);
+ glVertex2f(1.0f, 1.0f);
+ glEnd();
+
+ glBindTexture(GL_TEXTURE_2D, buffer);
+ memset(readback, 0x7f, sizeof(readback));
+ glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, readback);
+ if(color_match(readback[6], 0xffffffff, 5) || color_match(readback[6], 0x00000000, 5) ||
+ color_match(readback[9], 0xffffffff, 5) || color_match(readback[9], 0x00000000, 5))
+ {
+ TRACE("Read back colors 0x%08x and 0x%08x close to unfiltered color, asuming no filtering\n",
+ readback[6], readback[9]);
+ ret = FALSE;
+ }
+ else
+ {
+ TRACE("Read back colors are 0x%08x and 0x%08x, assuming texture is filtered\n",
+ readback[6], readback[9]);
+ ret = TRUE;
+ }
+
+ GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
+ GL_EXTCALL(glDeleteFramebuffersEXT(1, &fbo));
+ glDeleteTextures(1, &tex);
+ glDeleteTextures(1, &buffer);
+
+ if(glGetError())
+ {
+ FIXME("Error during filtering test for format %x, returning no filtering\n", internal);
+ ret = FALSE;
+ }
+ LEAVE_GL();
+ return ret;
+}
+
+static void init_format_filter_info(struct wined3d_gl_info *gl_info)
+{
+ unsigned int fmt_idx, i;
+ WINED3DFORMAT fmts16[] = {
+ WINED3DFMT_R16_FLOAT,
+ WINED3DFMT_R16G16_FLOAT,
+ WINED3DFMT_R16G16B16A16_FLOAT,
+ };
+ BOOL filtered;
+ struct GlPixelFormatDesc *desc;
+
+ if(wined3d_settings.offscreen_rendering_mode != ORM_FBO)
+ {
+ WARN("No FBO support, or no FBO ORM, guessing filter info from GL caps\n");
+ if(gl_info->gl_vendor == VENDOR_NVIDIA && GL_SUPPORT(ARB_TEXTURE_FLOAT))
+ {
+ TRACE("Nvidia card with texture_float support: Assuming float16 blending\n");
+ filtered = TRUE;
+ }
+ else if(GL_LIMITS(glsl_varyings > 44))
+ {
+ TRACE("More than 44 GLSL varyings - assuming d3d10 card with float16 blending\n");
+ filtered = TRUE;
+ }
+ else
+ {
+ TRACE("Assuming no float16 blending\n");
+ filtered = FALSE;
+ }
+
+ if(filtered)
+ {
+ for(i = 0; i < (sizeof(fmts16) / sizeof(*fmts16)); i++)
+ {
+ fmt_idx = getFmtIdx(fmts16[i]);
+ gl_info->gl_formats[fmt_idx].Flags |= WINED3DFMT_FLAG_FILTERING;
+ }
+ }
+ return;
+ }
+
+ for(i = 0; i < (sizeof(fmts16) / sizeof(*fmts16)); i++)
+ {
+ fmt_idx = getFmtIdx(fmts16[i]);
+ desc = &gl_info->gl_formats[fmt_idx];
+ if(!desc->glInternal) continue; /* Not supported by GL */
+
+ filtered = check_filter(gl_info, gl_info->gl_formats[fmt_idx].glInternal);
+ if(filtered)
+ {
+ TRACE("Format %s supports filtering\n", debug_d3dformat(fmts16[i]));
+ desc->Flags |= WINED3DFMT_FLAG_FILTERING;
+ }
+ else
+ {
+ TRACE("Format %s does not support filtering\n", debug_d3dformat(fmts16[i]));
+ }
+ }
+}
+
+static void apply_format_fixups(struct wined3d_gl_info *gl_info)
{
int idx;
idx = getFmtIdx(WINED3DFMT_R16_FLOAT);
gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
- /* When ARB_texture_rg is supported we only require 16-bit for R16F instead of 64-bit RGBA16F */
- if (GL_SUPPORT(ARB_TEXTURE_RG))
- {
- gl_info->gl_formats[idx].glInternal = GL_R16F;
- gl_info->gl_formats[idx].glGammaInternal = GL_R16F;
- }
idx = getFmtIdx(WINED3DFMT_R32_FLOAT);
gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
- /* When ARB_texture_rg is supported we only require 32-bit for R32F instead of 128-bit RGBA32F */
- if (GL_SUPPORT(ARB_TEXTURE_RG))
- {
- gl_info->gl_formats[idx].glInternal = GL_R32F;
- gl_info->gl_formats[idx].glGammaInternal = GL_R32F;
- }
idx = getFmtIdx(WINED3DFMT_R16G16_UNORM);
gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc(
@@ -610,16 +1019,12 @@ static void apply_format_fixups(WineD3D_GL_Info *gl_info)
if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_RGTC))
{
idx = getFmtIdx(WINED3DFMT_ATI2N);
- gl_info->gl_formats[idx].glInternal = GL_COMPRESSED_RED_GREEN_RGTC2_EXT;
- gl_info->gl_formats[idx].glGammaInternal = GL_COMPRESSED_RED_GREEN_RGTC2_EXT;
gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
}
else if (GL_SUPPORT(ATI_TEXTURE_COMPRESSION_3DC))
{
idx = getFmtIdx(WINED3DFMT_ATI2N);
- gl_info->gl_formats[idx].glInternal = GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI;
- gl_info->gl_formats[idx].glGammaInternal = GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI;
gl_info->gl_formats[idx].color_fixup= create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_W, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
}
@@ -627,22 +1032,14 @@ static void apply_format_fixups(WineD3D_GL_Info *gl_info)
if (!GL_SUPPORT(APPLE_YCBCR_422))
{
idx = getFmtIdx(WINED3DFMT_YUY2);
- gl_info->gl_formats[idx].glInternal = GL_LUMINANCE_ALPHA;
- gl_info->gl_formats[idx].glGammaInternal = GL_LUMINANCE_ALPHA; /* not srgb */
- gl_info->gl_formats[idx].glFormat = GL_LUMINANCE_ALPHA;
- gl_info->gl_formats[idx].glType = GL_UNSIGNED_BYTE;
gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_YUY2);
idx = getFmtIdx(WINED3DFMT_UYVY);
- gl_info->gl_formats[idx].glInternal = GL_LUMINANCE_ALPHA;
- gl_info->gl_formats[idx].glGammaInternal = GL_LUMINANCE_ALPHA; /* not srgb */
- gl_info->gl_formats[idx].glFormat = GL_LUMINANCE_ALPHA;
- gl_info->gl_formats[idx].glType = GL_UNSIGNED_BYTE;
gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_UYVY);
}
idx = getFmtIdx(WINED3DFMT_YV12);
- gl_info->gl_formats[idx].heightscale = 1.5;
+ gl_info->gl_formats[idx].heightscale = 1.5f;
gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_YV12);
if (GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA))
@@ -663,7 +1060,7 @@ static void apply_format_fixups(WineD3D_GL_Info *gl_info)
}
}
-static BOOL init_format_vertex_info(WineD3D_GL_Info *gl_info)
+static BOOL init_format_vertex_info(struct wined3d_gl_info *gl_info)
{
unsigned int i;
@@ -691,37 +1088,44 @@ static BOOL init_format_vertex_info(WineD3D_GL_Info *gl_info)
return TRUE;
}
-BOOL initPixelFormatsNoGL(WineD3D_GL_Info *gl_info)
-{
- return init_format_base_info(gl_info);
-}
-
-BOOL initPixelFormats(WineD3D_GL_Info *gl_info)
+BOOL initPixelFormatsNoGL(struct wined3d_gl_info *gl_info)
{
if (!init_format_base_info(gl_info)) return FALSE;
- if (!init_format_texture_info(gl_info))
+ if (!init_format_compression_info(gl_info))
{
HeapFree(GetProcessHeap(), 0, gl_info->gl_formats);
return FALSE;
}
- if (!init_format_vertex_info(gl_info))
- {
- HeapFree(GetProcessHeap(), 0, gl_info->gl_formats);
- return FALSE;
- }
-
- apply_format_fixups(gl_info);
-
return TRUE;
}
+/* Context activation is done by the caller. */
+BOOL initPixelFormats(struct wined3d_gl_info *gl_info)
+{
+ if (!init_format_base_info(gl_info)) return FALSE;
+
+ if (!init_format_compression_info(gl_info)) goto fail;
+ if (!init_format_texture_info(gl_info)) goto fail;
+ if (!init_format_vertex_info(gl_info)) goto fail;
+
+ apply_format_fixups(gl_info);
+ init_format_fbo_compat_info(gl_info);
+ init_format_filter_info(gl_info);
+
+ return TRUE;
+
+fail:
+ HeapFree(GetProcessHeap(), 0, gl_info->gl_formats);
+ return FALSE;
+}
+
#undef GLINFO_LOCATION
#define GLINFO_LOCATION This->adapter->gl_info
-const struct GlPixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt, const WineD3D_GL_Info *gl_info)
+const struct GlPixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt, const struct wined3d_gl_info *gl_info)
{
int idx = getFmtIdx(fmt);
@@ -907,9 +1311,12 @@ const char* debug_d3ddevicetype(WINED3DDEVTYPE devtype) {
}
}
-const char* debug_d3dusage(DWORD usage) {
- switch (usage & WINED3DUSAGE_MASK) {
-#define WINED3DUSAGE_TO_STR(u) case u: return #u
+const char *debug_d3dusage(DWORD usage)
+{
+ char buf[284];
+
+ buf[0] = '\0';
+#define WINED3DUSAGE_TO_STR(u) if (usage & u) { strcat(buf, " | "#u); usage &= ~u; }
WINED3DUSAGE_TO_STR(WINED3DUSAGE_RENDERTARGET);
WINED3DUSAGE_TO_STR(WINED3DUSAGE_DEPTHSTENCIL);
WINED3DUSAGE_TO_STR(WINED3DUSAGE_WRITEONLY);
@@ -922,16 +1329,17 @@ const char* debug_d3dusage(DWORD usage) {
WINED3DUSAGE_TO_STR(WINED3DUSAGE_AUTOGENMIPMAP);
WINED3DUSAGE_TO_STR(WINED3DUSAGE_DMAP);
#undef WINED3DUSAGE_TO_STR
- case 0: return "none";
- default:
- FIXME("Unrecognized %u Usage!\n", usage);
- return "unrecognized";
- }
+ if (usage) FIXME("Unrecognized usage flag(s) %#x\n", usage);
+
+ return buf[0] ? wine_dbg_sprintf("%s", &buf[3]) : "0";
}
-const char* debug_d3dusagequery(DWORD usagequery) {
- switch (usagequery & WINED3DUSAGE_QUERY_MASK) {
-#define WINED3DUSAGEQUERY_TO_STR(u) case u: return #u
+const char *debug_d3dusagequery(DWORD usagequery)
+{
+ char buf[238];
+
+ buf[0] = '\0';
+#define WINED3DUSAGEQUERY_TO_STR(u) if (usagequery & u) { strcat(buf, " | "#u); usagequery &= ~u; }
WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_FILTER);
WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_LEGACYBUMPMAP);
WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING);
@@ -940,11 +1348,9 @@ const char* debug_d3dusagequery(DWORD usagequery) {
WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_VERTEXTEXTURE);
WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_WRAPANDMIP);
#undef WINED3DUSAGEQUERY_TO_STR
- case 0: return "none";
- default:
- FIXME("Unrecognized %u Usage Query!\n", usagequery);
- return "unrecognized";
- }
+ if (usagequery) FIXME("Unrecognized usage query flag(s) %#x\n", usagequery);
+
+ return buf[0] ? wine_dbg_sprintf("%s", &buf[3]) : "0";
}
const char* debug_d3ddeclmethod(WINED3DDECLMETHOD method) {
@@ -1512,6 +1918,7 @@ BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP op, DWO
}
/* Setup this textures matrix according to the texture flags*/
+/* GL locking is done by the caller (state handler) */
void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, BOOL transformed,
WINED3DFORMAT vtx_fmt, BOOL ffp_proj_control)
{
@@ -1793,7 +2200,8 @@ BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4]
/* No oversized texture? This is easy */
if(!(This->Flags & SFLAG_OVERSIZE)) {
/* Which rect from the texture do I need? */
- if(This->glDescription.target == GL_TEXTURE_RECTANGLE_ARB) {
+ if (This->texture_target == GL_TEXTURE_RECTANGLE_ARB)
+ {
glTexCoord[0] = (float) Rect->left;
glTexCoord[2] = (float) Rect->top;
glTexCoord[1] = (float) Rect->right;
@@ -1894,238 +2302,6 @@ BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4]
}
#undef GLINFO_LOCATION
-/* Hash table functions */
-
-struct hash_table_t *hash_table_create(hash_function_t *hash_function, compare_function_t *compare_function)
-{
- struct hash_table_t *table;
- unsigned int initial_size = 8;
-
- table = HeapAlloc(GetProcessHeap(), 0, sizeof(struct hash_table_t) + (initial_size * sizeof(struct list)));
- if (!table)
- {
- ERR("Failed to allocate table, returning NULL.\n");
- return NULL;
- }
-
- table->hash_function = hash_function;
- table->compare_function = compare_function;
-
- table->grow_size = initial_size - (initial_size >> 2);
- table->shrink_size = 0;
-
- table->buckets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, initial_size * sizeof(struct list));
- if (!table->buckets)
- {
- ERR("Failed to allocate table buckets, returning NULL.\n");
- HeapFree(GetProcessHeap(), 0, table);
- return NULL;
- }
- table->bucket_count = initial_size;
-
- table->entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, table->grow_size * sizeof(struct hash_table_entry_t));
- if (!table->entries)
- {
- ERR("Failed to allocate table entries, returning NULL.\n");
- HeapFree(GetProcessHeap(), 0, table->buckets);
- HeapFree(GetProcessHeap(), 0, table);
- return NULL;
- }
- table->entry_count = 0;
-
- list_init(&table->free_entries);
- table->count = 0;
-
- return table;
-}
-
-void hash_table_destroy(struct hash_table_t *table, void (*free_value)(void *value, void *cb), void *cb)
-{
- unsigned int i = 0;
-
- for (i = 0; i < table->entry_count; ++i)
- {
- if(free_value) {
- free_value(table->entries[i].value, cb);
- }
- HeapFree(GetProcessHeap(), 0, table->entries[i].key);
- }
-
- HeapFree(GetProcessHeap(), 0, table->entries);
- HeapFree(GetProcessHeap(), 0, table->buckets);
- HeapFree(GetProcessHeap(), 0, table);
-}
-
-void hash_table_for_each_entry(struct hash_table_t *table, void (*callback)(void *value, void *context), void *context)
-{
- unsigned int i = 0;
-
- for (i = 0; i < table->entry_count; ++i)
- {
- callback(table->entries[i].value, context);
- }
-}
-
-static inline struct hash_table_entry_t *hash_table_get_by_idx(const struct hash_table_t *table, const void *key,
- unsigned int idx)
-{
- struct hash_table_entry_t *entry;
-
- if (table->buckets[idx].next)
- LIST_FOR_EACH_ENTRY(entry, &(table->buckets[idx]), struct hash_table_entry_t, entry)
- if (table->compare_function(entry->key, key)) return entry;
-
- return NULL;
-}
-
-static BOOL hash_table_resize(struct hash_table_t *table, unsigned int new_bucket_count)
-{
- unsigned int new_entry_count = 0;
- struct hash_table_entry_t *new_entries;
- struct list *new_buckets;
- unsigned int grow_size = new_bucket_count - (new_bucket_count >> 2);
- unsigned int i;
-
- new_buckets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, new_bucket_count * sizeof(struct list));
- if (!new_buckets)
- {
- ERR("Failed to allocate new buckets, returning FALSE.\n");
- return FALSE;
- }
-
- new_entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, grow_size * sizeof(struct hash_table_entry_t));
- if (!new_entries)
- {
- ERR("Failed to allocate new entries, returning FALSE.\n");
- HeapFree(GetProcessHeap(), 0, new_buckets);
- return FALSE;
- }
-
- for (i = 0; i < table->bucket_count; ++i)
- {
- if (table->buckets[i].next)
- {
- struct hash_table_entry_t *entry, *entry2;
-
- LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &table->buckets[i], struct hash_table_entry_t, entry)
- {
- int j;
- struct hash_table_entry_t *new_entry = new_entries + (new_entry_count++);
- *new_entry = *entry;
-
- j = new_entry->hash & (new_bucket_count - 1);
-
- if (!new_buckets[j].next) list_init(&new_buckets[j]);
- list_add_head(&new_buckets[j], &new_entry->entry);
- }
- }
- }
-
- HeapFree(GetProcessHeap(), 0, table->buckets);
- table->buckets = new_buckets;
-
- HeapFree(GetProcessHeap(), 0, table->entries);
- table->entries = new_entries;
-
- table->entry_count = new_entry_count;
- list_init(&table->free_entries);
-
- table->bucket_count = new_bucket_count;
- table->grow_size = grow_size;
- table->shrink_size = new_bucket_count > 8 ? new_bucket_count >> 2 : 0;
-
- return TRUE;
-}
-
-void hash_table_put(struct hash_table_t *table, void *key, void *value)
-{
- unsigned int idx;
- unsigned int hash;
- struct hash_table_entry_t *entry;
-
- hash = table->hash_function(key);
- idx = hash & (table->bucket_count - 1);
- entry = hash_table_get_by_idx(table, key, idx);
-
- if (entry)
- {
- HeapFree(GetProcessHeap(), 0, key);
- entry->value = value;
-
- if (!value)
- {
- HeapFree(GetProcessHeap(), 0, entry->key);
- entry->key = NULL;
-
- /* Remove the entry */
- list_remove(&entry->entry);
- list_add_head(&table->free_entries, &entry->entry);
-
- --table->count;
-
- /* Shrink if necessary */
- if (table->count < table->shrink_size) {
- if (!hash_table_resize(table, table->bucket_count >> 1))
- {
- ERR("Failed to shrink the table...\n");
- }
- }
- }
-
- return;
- }
-
- if (!value) return;
-
- /* Grow if necessary */
- if (table->count >= table->grow_size)
- {
- if (!hash_table_resize(table, table->bucket_count << 1))
- {
- ERR("Failed to grow the table, returning.\n");
- return;
- }
-
- idx = hash & (table->bucket_count - 1);
- }
-
- /* Find an entry to insert */
- if (!list_empty(&table->free_entries))
- {
- struct list *elem = list_head(&table->free_entries);
-
- list_remove(elem);
- entry = LIST_ENTRY(elem, struct hash_table_entry_t, entry);
- } else {
- entry = table->entries + (table->entry_count++);
- }
-
- /* Insert the entry */
- entry->key = key;
- entry->value = value;
- entry->hash = hash;
- if (!table->buckets[idx].next) list_init(&table->buckets[idx]);
- list_add_head(&table->buckets[idx], &entry->entry);
-
- ++table->count;
-}
-
-void hash_table_remove(struct hash_table_t *table, void *key)
-{
- hash_table_put(table, key, NULL);
-}
-
-void *hash_table_get(const struct hash_table_t *table, const void *key)
-{
- unsigned int idx;
- struct hash_table_entry_t *entry;
-
- idx = table->hash_function(key) & (table->bucket_count - 1);
- entry = hash_table_get_by_idx(table, key, idx);
-
- return entry ? entry->value : NULL;
-}
-
#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info
void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_settings *settings, BOOL ignore_textype) {
#define ARG1 0x01
@@ -2163,6 +2339,7 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting
unsigned int i;
DWORD ttff;
DWORD cop, aop, carg0, carg1, carg2, aarg0, aarg1, aarg2;
+ IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
for(i = 0; i < GL_LIMITS(texture_stages); i++) {
IWineD3DBaseTextureImpl *texture;
@@ -2216,8 +2393,7 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting
carg2 = (args[cop] & ARG2) ? stateblock->textureState[i][WINED3DTSS_COLORARG2] : ARG_UNUSED;
carg0 = (args[cop] & ARG0) ? stateblock->textureState[i][WINED3DTSS_COLORARG0] : ARG_UNUSED;
- if(is_invalid_op(stateblock->wineD3DDevice, i, cop,
- carg1, carg2, carg0)) {
+ if(is_invalid_op(device, i, cop, carg1, carg2, carg0)) {
carg0 = ARG_UNUSED;
carg2 = ARG_UNUSED;
carg1 = WINED3DTA_CURRENT;
@@ -2276,8 +2452,7 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting
}
}
- if(is_invalid_op(stateblock->wineD3DDevice, i, aop,
- aarg1, aarg2, aarg0)) {
+ if(is_invalid_op(device, i, aop, aarg1, aarg2, aarg0)) {
aarg0 = ARG_UNUSED;
aarg2 = ARG_UNUSED;
aarg1 = WINED3DTA_CURRENT;
@@ -2356,23 +2531,32 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting
} else {
settings->sRGB_write = 0;
}
+ if(device->vs_clipping || !use_vs(stateblock)) {
+ /* No need to emulate clipplanes if GL supports native vertex shader clipping or if
+ * the fixed function vertex pipeline is used(which always supports clipplanes)
+ */
+ settings->emul_clipplanes = 0;
+ } else {
+ settings->emul_clipplanes = 1;
+ }
}
#undef GLINFO_LOCATION
-const struct ffp_frag_desc *find_ffp_frag_shader(const struct hash_table_t *fragment_shaders,
+const struct ffp_frag_desc *find_ffp_frag_shader(const struct wine_rb_tree *fragment_shaders,
const struct ffp_frag_settings *settings)
{
- return hash_table_get(fragment_shaders, settings);
+ struct wine_rb_entry *entry = wine_rb_get(fragment_shaders, settings);
+ return entry ? WINE_RB_ENTRY_VALUE(entry, struct ffp_frag_desc, entry) : NULL;
}
-void add_ffp_frag_shader(struct hash_table_t *shaders, struct ffp_frag_desc *desc) {
- struct ffp_frag_settings *key = HeapAlloc(GetProcessHeap(), 0, sizeof(*key));
+void add_ffp_frag_shader(struct wine_rb_tree *shaders, struct ffp_frag_desc *desc)
+{
/* Note that the key is the implementation independent part of the ffp_frag_desc structure,
- * whereas desc points to an extended structure with implementation specific parts.
- * Make a copy of the key because hash_table_put takes ownership of it
- */
- *key = desc->settings;
- hash_table_put(shaders, key, desc);
+ * whereas desc points to an extended structure with implementation specific parts. */
+ if (wine_rb_put(shaders, &desc->settings, &desc->entry) == -1)
+ {
+ ERR("Failed to insert ffp frag shader.\n");
+ }
}
/* Activates the texture dimension according to the bound D3D texture.
@@ -2380,7 +2564,9 @@ void add_ffp_frag_shader(struct hash_table_t *shaders, struct ffp_frag_desc *des
* Requires the caller to activate the correct unit before
*/
#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info
-void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+/* GL locking is done by the caller (state handler) */
+void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
if(stateblock->textures[stage]) {
switch (IWineD3DBaseTexture_GetTextureDimensions(stateblock->textures[stage])) {
case GL_TEXTURE_2D:
@@ -2453,7 +2639,9 @@ void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock
}
}
-void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
+/* GL locking is done by the caller (state handler) */
+void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
DWORD sampler = state - STATE_SAMPLER(0);
DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[sampler];
@@ -2469,61 +2657,57 @@ void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCont
}
#undef GLINFO_LOCATION
-unsigned int ffp_frag_program_key_hash(const void *key)
+void *wined3d_rb_alloc(size_t size)
{
- const struct ffp_frag_settings *k = key;
- unsigned int hash = 0, i;
- const DWORD *blob;
-
- /* This takes the texture op settings of stage 0 and 1 into account.
- * how exactly depends on the memory laybout of the compiler, but it
- * should not matter too much. Stages > 1 are used rarely, so there's
- * no need to process them. Even if they're used it is likely that
- * the ffp setup has distinct stage 0 and 1 settings.
- */
- for(i = 0; i < 2; i++) {
- blob = (const DWORD *)&k->op[i];
- hash ^= blob[0] ^ blob[1];
- }
-
- hash += ~(hash << 15);
- hash ^= (hash >> 10);
- hash += (hash << 3);
- hash ^= (hash >> 6);
- hash += ~(hash << 11);
- hash ^= (hash >> 16);
-
- return hash;
+ return HeapAlloc(GetProcessHeap(), 0, size);
}
-BOOL ffp_frag_program_key_compare(const void *keya, const void *keyb)
+void *wined3d_rb_realloc(void *ptr, size_t size)
{
- const struct ffp_frag_settings *ka = keya;
- const struct ffp_frag_settings *kb = keyb;
-
- return memcmp(ka, kb, sizeof(*ka)) == 0;
+ return HeapReAlloc(GetProcessHeap(), 0, ptr, size);
}
+void wined3d_rb_free(void *ptr)
+{
+ HeapFree(GetProcessHeap(), 0, ptr);
+}
+
+static int ffp_frag_program_key_compare(const void *key, const struct wine_rb_entry *entry)
+{
+ const struct ffp_frag_settings *ka = key;
+ const struct ffp_frag_settings *kb = &WINE_RB_ENTRY_VALUE(entry, const struct ffp_frag_desc, entry)->settings;
+
+ return memcmp(ka, kb, sizeof(*ka));
+}
+
+const struct wine_rb_functions wined3d_ffp_frag_program_rb_functions =
+{
+ wined3d_rb_alloc,
+ wined3d_rb_realloc,
+ wined3d_rb_free,
+ ffp_frag_program_key_compare,
+};
+
UINT wined3d_log2i(UINT32 x)
{
- static const BYTE l[] =
+ static const UINT l[] =
{
- 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ ~0U, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
};
UINT32 i;
diff --git a/reactos/dll/directx/wine/wined3d/vertexshader.c b/reactos/dll/directx/wine/wined3d/vertexshader.c
index 7dba4e37aaf..d24ecd6364a 100644
--- a/reactos/dll/directx/wine/wined3d/vertexshader.c
+++ b/reactos/dll/directx/wine/wined3d/vertexshader.c
@@ -71,6 +71,10 @@ static void vshader_set_limits(IWineD3DVertexShaderImpl *This)
This->baseShader.limits.constant_float = min(256, GL_LIMITS(vshader_constantsF));
break;
+ case WINED3D_SHADER_VERSION(4,0):
+ FIXME("Using 3.0 limits for 4.0 shader\n");
+ /* Fall through */
+
case WINED3D_SHADER_VERSION(3,0):
This->baseShader.limits.temporary = 32;
This->baseShader.limits.constant_bool = 32;
@@ -101,26 +105,6 @@ static void vshader_set_limits(IWineD3DVertexShaderImpl *This)
}
}
-/* This is an internal function,
- * used to create fake semantics for shaders
- * that don't have them - d3d8 shaders where the declaration
- * stores the register for each input
- */
-static void vshader_set_input(
- IWineD3DVertexShaderImpl* This,
- unsigned int regnum,
- BYTE usage, BYTE usage_idx) {
-
- This->semantics_in[regnum].usage = usage;
- This->semantics_in[regnum].usage_idx = usage_idx;
- This->semantics_in[regnum].reg.reg.type = WINED3DSPR_INPUT;
- This->semantics_in[regnum].reg.reg.idx = regnum;
- This->semantics_in[regnum].reg.write_mask = WINED3DSP_WRITEMASK_ALL;
- This->semantics_in[regnum].reg.modifiers = 0;
- This->semantics_in[regnum].reg.shift = 0;
- This->semantics_in[regnum].reg.reg.rel_addr = NULL;
-}
-
static BOOL match_usage(BYTE usage1, BYTE usage_idx1, BYTE usage2, BYTE usage_idx2) {
if (usage_idx1 != usage_idx2) return FALSE;
if (usage1 == usage2) return TRUE;
@@ -130,19 +114,18 @@ static BOOL match_usage(BYTE usage1, BYTE usage_idx1, BYTE usage2, BYTE usage_id
return FALSE;
}
-BOOL vshader_get_input(
- IWineD3DVertexShader* iface,
- BYTE usage_req, BYTE usage_idx_req,
- unsigned int* regnum) {
+BOOL vshader_get_input(IWineD3DVertexShader* iface, BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum)
+{
+ IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface;
+ WORD map = This->baseShader.reg_maps.input_registers;
+ unsigned int i;
- IWineD3DVertexShaderImpl* This = (IWineD3DVertexShaderImpl*) iface;
- int i;
+ for (i = 0; map; map >>= 1, ++i)
+ {
+ if (!(map & 1)) continue;
- for (i = 0; i < MAX_ATTRIBS; i++) {
- if (!This->baseShader.reg_maps.attributes[i]) continue;
-
- if (match_usage(This->semantics_in[i].usage,
- This->semantics_in[i].usage_idx, usage_req, usage_idx_req))
+ if (match_usage(This->attributes[i].usage,
+ This->attributes[i].usage_idx, usage_req, usage_idx_req))
{
*regnum = i;
return TRUE;
@@ -203,7 +186,7 @@ static ULONG WINAPI IWineD3DVertexShaderImpl_Release(IWineD3DVertexShader *iface
static HRESULT WINAPI IWineD3DVertexShaderImpl_GetParent(IWineD3DVertexShader *iface, IUnknown** parent){
IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface;
-
+
*parent = This->parent;
IUnknown_AddRef(*parent);
TRACE("(%p) : returning %p\n", This, *parent);
@@ -249,6 +232,7 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader
IWineD3DVertexShaderImpl *This =(IWineD3DVertexShaderImpl *)iface;
IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *) This->baseShader.device;
const struct wined3d_shader_frontend *fe;
+ unsigned int i;
HRESULT hr;
shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
@@ -280,16 +264,26 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader
This->min_rel_offset = GL_LIMITS(vshader_constantsF);
This->max_rel_offset = 0;
hr = shader_get_registers_used((IWineD3DBaseShader*) This, fe,
- reg_maps, This->semantics_in, This->semantics_out, pFunction,
- GL_LIMITS(vshader_constantsF));
+ reg_maps, This->attributes, NULL, This->output_signature,
+ pFunction, GL_LIMITS(vshader_constantsF));
if (hr != WINED3D_OK) return hr;
+ if (output_signature)
+ {
+ for (i = 0; i < output_signature->element_count; ++i)
+ {
+ struct wined3d_shader_signature_element *e = &output_signature->elements[i];
+ reg_maps->output_registers |= 1 << e->register_idx;
+ This->output_signature[e->register_idx] = *e;
+ }
+ }
+
vshader_set_limits(This);
- if(deviceImpl->vs_selected_mode == SHADER_ARB &&
- (GLINFO_LOCATION).arb_vs_offset_limit &&
- This->min_rel_offset <= This->max_rel_offset) {
-
+ if (deviceImpl->vs_selected_mode == SHADER_ARB
+ && ((GLINFO_LOCATION).quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT)
+ && This->min_rel_offset <= This->max_rel_offset)
+ {
if(This->max_rel_offset - This->min_rel_offset > 127) {
FIXME("The difference between the minimum and maximum relative offset is > 127\n");
FIXME("Which this OpenGL implementation does not support. Try using GLSL\n");
@@ -312,19 +306,6 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader
return WINED3D_OK;
}
-/* Preload semantics for d3d8 shaders */
-static void WINAPI IWineD3DVertexShaderImpl_FakeSemantics(IWineD3DVertexShader *iface, IWineD3DVertexDeclaration *vertex_declaration) {
- IWineD3DVertexShaderImpl *This =(IWineD3DVertexShaderImpl *)iface;
- IWineD3DVertexDeclarationImpl* vdecl = (IWineD3DVertexDeclarationImpl*)vertex_declaration;
-
- unsigned int i;
- for (i = 0; i < vdecl->element_count; ++i)
- {
- const struct wined3d_vertex_declaration_element *e = &vdecl->elements[i];
- vshader_set_input(This, e->output_slot, e->usage, e->usage_idx);
- }
-}
-
/* Set local constants for d3d8 shaders */
static HRESULT WINAPI IWIneD3DVertexShaderImpl_SetLocalConstantsF(IWineD3DVertexShader *iface,
UINT start_idx, const float *src_data, UINT count) {
@@ -351,22 +332,6 @@ static HRESULT WINAPI IWIneD3DVertexShaderImpl_SetLocalConstantsF(IWineD3DVertex
return WINED3D_OK;
}
-static GLuint vertexshader_compile(IWineD3DVertexShaderImpl *This, const struct vs_compile_args *args) {
- IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *) This->baseShader.device;
- SHADER_BUFFER buffer;
- GLuint ret;
-
- /* Generate the HW shader */
- TRACE("(%p) : Generating hardware program\n", This);
- shader_buffer_init(&buffer);
- This->cur_args = args;
- ret = deviceImpl->shader_backend->shader_generate_vshader((IWineD3DVertexShader *)This, &buffer, args);
- This->cur_args = NULL;
- shader_buffer_free(&buffer);
-
- return ret;
-}
-
const IWineD3DVertexShaderVtbl IWineD3DVertexShader_Vtbl =
{
/*** IUnknown methods ***/
@@ -380,7 +345,6 @@ const IWineD3DVertexShaderVtbl IWineD3DVertexShader_Vtbl =
/*** IWineD3DVertexShader methods ***/
IWineD3DVertexShaderImpl_GetDevice,
IWineD3DVertexShaderImpl_GetFunction,
- IWineD3DVertexShaderImpl_FakeSemantics,
IWIneD3DVertexShaderImpl_SetLocalConstantsF
};
@@ -388,52 +352,3 @@ void find_vs_compile_args(IWineD3DVertexShaderImpl *shader, IWineD3DStateBlockIm
args->fog_src = stateblock->renderState[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE ? VS_FOG_COORD : VS_FOG_Z;
args->swizzle_map = ((IWineD3DDeviceImpl *)shader->baseShader.device)->strided_streams.swizzle_map;
}
-
-static inline BOOL vs_args_equal(const struct vs_compile_args *stored, const struct vs_compile_args *new,
- const DWORD use_map) {
- if((stored->swizzle_map & use_map) != new->swizzle_map) return FALSE;
- return stored->fog_src == new->fog_src;
-}
-
-GLuint find_gl_vshader(IWineD3DVertexShaderImpl *shader, const struct vs_compile_args *args)
-{
- UINT i;
- DWORD new_size = shader->shader_array_size;
- struct vs_compiled_shader *new_array;
- DWORD use_map = ((IWineD3DDeviceImpl *)shader->baseShader.device)->strided_streams.use_map;
-
- /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
- * so a linear search is more performant than a hashmap or a binary search
- * (cache coherency etc)
- */
- for(i = 0; i < shader->num_gl_shaders; i++) {
- if(vs_args_equal(&shader->gl_shaders[i].args, args, use_map)) {
- return shader->gl_shaders[i].prgId;
- }
- }
-
- TRACE("No matching GL shader found, compiling a new shader\n");
-
- if(shader->shader_array_size == shader->num_gl_shaders) {
- if (shader->num_gl_shaders)
- {
- new_size = shader->shader_array_size + max(1, shader->shader_array_size / 2);
- new_array = HeapReAlloc(GetProcessHeap(), 0, shader->gl_shaders,
- new_size * sizeof(*shader->gl_shaders));
- } else {
- new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*shader->gl_shaders));
- new_size = 1;
- }
-
- if(!new_array) {
- ERR("Out of memory\n");
- return 0;
- }
- shader->gl_shaders = new_array;
- shader->shader_array_size = new_size;
- }
-
- shader->gl_shaders[shader->num_gl_shaders].args = *args;
- shader->gl_shaders[shader->num_gl_shaders].prgId = vertexshader_compile(shader, args);
- return shader->gl_shaders[shader->num_gl_shaders++].prgId;
-}
diff --git a/reactos/dll/directx/wine/wined3d/volume.c b/reactos/dll/directx/wine/wined3d/volume.c
index 64d871b83ec..85e8f3ab831 100644
--- a/reactos/dll/directx/wine/wined3d/volume.c
+++ b/reactos/dll/directx/wine/wined3d/volume.c
@@ -26,10 +26,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
#define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
+/* Context activation is done by the caller. */
static void volume_bind_and_dirtify(IWineD3DVolume *iface) {
IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface;
IWineD3DVolumeTexture *texture;
- int active_sampler;
+ DWORD active_sampler;
/* We don't need a specific texture unit, but after binding the texture the current unit is dirty.
* Read the unit back instead of switching to 0, this avoids messing around with the state manager's
@@ -52,7 +53,8 @@ static void volume_bind_and_dirtify(IWineD3DVolume *iface) {
active_sampler = 0;
}
- if (active_sampler != -1) {
+ if (active_sampler != WINED3D_UNMAPPED_STAGE)
+ {
IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_SAMPLER(active_sampler));
}
@@ -196,14 +198,15 @@ static HRESULT WINAPI IWineD3DVolumeImpl_GetDesc(IWineD3DVolume *iface, WINED3DV
IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface;
TRACE("(%p) : copying into %p\n", This, pDesc);
- *(pDesc->Format) = This->resource.format_desc->format;
- *(pDesc->Type) = This->resource.resourceType;
- *(pDesc->Usage) = This->resource.usage;
- *(pDesc->Pool) = This->resource.pool;
- *(pDesc->Size) = This->resource.size; /* dx8 only */
- *(pDesc->Width) = This->currentDesc.Width;
- *(pDesc->Height) = This->currentDesc.Height;
- *(pDesc->Depth) = This->currentDesc.Depth;
+ pDesc->Format = This->resource.format_desc->format;
+ pDesc->Type = This->resource.resourceType;
+ pDesc->Usage = This->resource.usage;
+ pDesc->Pool = This->resource.pool;
+ pDesc->Size = This->resource.size; /* dx8 only */
+ pDesc->Width = This->currentDesc.Width;
+ pDesc->Height = This->currentDesc.Height;
+ pDesc->Depth = This->currentDesc.Depth;
+
return WINED3D_OK;
}
@@ -300,6 +303,7 @@ static HRESULT WINAPI IWineD3DVolumeImpl_SetContainer(IWineD3DVolume *iface, IWi
return WINED3D_OK;
}
+/* Context activation is done by the caller. */
static HRESULT WINAPI IWineD3DVolumeImpl_LoadTexture(IWineD3DVolume *iface, int gl_level, BOOL srgb_mode) {
IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface;
const struct GlPixelFormatDesc *glDesc = This->resource.format_desc;
diff --git a/reactos/dll/directx/wine/wined3d/volumetexture.c b/reactos/dll/directx/wine/wined3d/volumetexture.c
index 41a1160b1a0..134ff74398c 100644
--- a/reactos/dll/directx/wine/wined3d/volumetexture.c
+++ b/reactos/dll/directx/wine/wined3d/volumetexture.c
@@ -24,11 +24,177 @@
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
-#define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
+
+#define GLINFO_LOCATION (*gl_info)
+
+static void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb)
+{
+ /* Override the IWineD3DResource Preload method. */
+ IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
+ IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ BOOL srgb_mode = This->baseTexture.is_srgb;
+ BOOL srgb_was_toggled = FALSE;
+ unsigned int i;
+
+ TRACE("(%p) : About to load texture.\n", This);
+
+ if (!device->isInDraw)
+ {
+ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD);
+ }
+ else if (GL_SUPPORT(EXT_TEXTURE_SRGB) && This->baseTexture.bindCount > 0)
+ {
+ srgb_mode = device->stateBlock->samplerState[This->baseTexture.sampler][WINED3DSAMP_SRGBTEXTURE];
+ srgb_was_toggled = This->baseTexture.is_srgb != srgb_mode;
+ This->baseTexture.is_srgb = srgb_mode;
+ }
+
+ /* If the texture is marked dirty or the srgb sampler setting has changed
+ * since the last load then reload the volumes. */
+ if (This->baseTexture.dirty)
+ {
+ for (i = 0; i < This->baseTexture.levels; ++i)
+ {
+ IWineD3DVolume_LoadTexture(This->volumes[i], i, srgb_mode);
+ }
+ }
+ else if (srgb_was_toggled)
+ {
+ for (i = 0; i < This->baseTexture.levels; ++i)
+ {
+ volume_add_dirty_box(This->volumes[i], NULL);
+ IWineD3DVolume_LoadTexture(This->volumes[i], i, srgb_mode);
+ }
+ }
+ else
+ {
+ TRACE("(%p) Texture not dirty, nothing to do.\n", iface);
+ }
+
+ /* No longer dirty */
+ This->baseTexture.dirty = FALSE;
+}
+
+static void volumetexture_cleanup(IWineD3DVolumeTextureImpl *This, D3DCB_DESTROYVOLUMEFN volume_destroy_cb)
+{
+ unsigned int i;
+
+ TRACE("(%p) : Cleaning up.\n", This);
+
+ for (i = 0; i < This->baseTexture.levels; ++i)
+ {
+ IWineD3DVolume *volume = This->volumes[i];
+
+ if (volume)
+ {
+ /* Cleanup the container. */
+ IWineD3DVolume_SetContainer(volume, NULL);
+ volume_destroy_cb(volume);
+ }
+ }
+ basetexture_cleanup((IWineD3DBaseTexture *)This);
+}
+
+HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT height, UINT depth, UINT levels,
+ IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent)
+{
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ UINT tmp_w, tmp_h, tmp_d;
+ unsigned int i;
+ HRESULT hr;
+
+ /* TODO: It should only be possible to create textures for formats
+ * that are reported as supported. */
+ if (WINED3DFMT_UNKNOWN >= format)
+ {
+ WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture);
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ if (!GL_SUPPORT(EXT_TEXTURE3D))
+ {
+ WARN("(%p) : Texture cannot be created - no volume texture support.\n", texture);
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ /* Calculate levels for mip mapping. */
+ if (usage & WINED3DUSAGE_AUTOGENMIPMAP)
+ {
+ if (!GL_SUPPORT(SGIS_GENERATE_MIPMAP))
+ {
+ WARN("No mipmap generation support, returning D3DERR_INVALIDCALL.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ if (levels > 1)
+ {
+ WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ levels = 1;
+ }
+ else if (!levels)
+ {
+ levels = wined3d_log2i(max(max(width, height), depth)) + 1;
+ TRACE("Calculated levels = %u.\n", levels);
+ }
+
+ hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels,
+ WINED3DRTYPE_VOLUMETEXTURE, device, 0, usage, format_desc, pool, parent);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize basetexture, returning %#x.\n", hr);
+ return hr;
+ }
+
+ /* Is NP2 support for volumes needed? */
+ texture->baseTexture.pow2Matrix[0] = 1.0f;
+ texture->baseTexture.pow2Matrix[5] = 1.0f;
+ texture->baseTexture.pow2Matrix[10] = 1.0f;
+ texture->baseTexture.pow2Matrix[15] = 1.0f;
+
+ /* Generate all the surfaces. */
+ tmp_w = width;
+ tmp_h = height;
+ tmp_d = depth;
+
+ for (i = 0; i < texture->baseTexture.levels; ++i)
+ {
+ /* Create the volume. */
+ hr = IWineD3DDeviceParent_CreateVolume(device->device_parent, parent,
+ tmp_w, tmp_h, tmp_d, format, pool, usage, &texture->volumes[i]);
+ if (FAILED(hr))
+ {
+ ERR("Creating a volume for the volume texture failed, hr %#x.\n", hr);
+ texture->volumes[i] = NULL;
+ volumetexture_cleanup(texture, D3DCB_DefaultDestroyVolume);
+ return hr;
+ }
+
+ /* Set its container to this texture. */
+ IWineD3DVolume_SetContainer(texture->volumes[i], (IWineD3DBase *)texture);
+
+ /* Calculate the next mipmap level. */
+ tmp_w = max(1, tmp_w >> 1);
+ tmp_h = max(1, tmp_h >> 1);
+ tmp_d = max(1, tmp_d >> 1);
+ }
+ texture->baseTexture.internal_preload = volumetexture_internal_preload;
+
+ return WINED3D_OK;
+}
+
+#undef GLINFO_LOCATION
/* *******************************************
IWineD3DTexture IUnknown parts follow
******************************************* */
+
+#define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
+
static HRESULT WINAPI IWineD3DVolumeTextureImpl_QueryInterface(IWineD3DVolumeTexture *iface, REFIID riid, LPVOID *ppobj)
{
IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
@@ -90,43 +256,6 @@ static DWORD WINAPI IWineD3DVolumeTextureImpl_GetPriority(IWineD3DVolumeTexture
return resource_get_priority((IWineD3DResource *)iface);
}
-void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb) {
- /* Overrider the IWineD3DResource Preload method */
- unsigned int i;
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
- IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
- BOOL srgb_mode = This->baseTexture.is_srgb;
- BOOL srgb_was_toggled = FALSE;
-
- TRACE("(%p) : About to load texture\n", This);
-
- if(!device->isInDraw) {
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
- } else if (GL_SUPPORT(EXT_TEXTURE_SRGB) && This->baseTexture.bindCount > 0) {
- srgb_mode = device->stateBlock->samplerState[This->baseTexture.sampler][WINED3DSAMP_SRGBTEXTURE];
- srgb_was_toggled = This->baseTexture.is_srgb != srgb_mode;
- This->baseTexture.is_srgb = srgb_mode;
- }
-
- /* If the texture is marked dirty or the srgb sampler setting has changed since the last load then reload the surfaces */
- if (This->baseTexture.dirty) {
- for (i = 0; i < This->baseTexture.levels; i++)
- IWineD3DVolume_LoadTexture(This->volumes[i], i, srgb_mode);
- } else if (srgb_was_toggled) {
- for (i = 0; i < This->baseTexture.levels; i++) {
- volume_add_dirty_box(This->volumes[i], NULL);
- IWineD3DVolume_LoadTexture(This->volumes[i], i, srgb_mode);
- }
- } else {
- TRACE("(%p) Texture not dirty, nothing to do\n" , iface);
- }
-
- /* No longer dirty */
- This->baseTexture.dirty = FALSE;
-
- return ;
-}
-
static void WINAPI IWineD3DVolumeTextureImpl_PreLoad(IWineD3DVolumeTexture *iface) {
volumetexture_internal_preload((IWineD3DBaseTexture *) iface, SRGB_ANY);
}
@@ -191,6 +320,7 @@ static BOOL WINAPI IWineD3DVolumeTextureImpl_GetDirty(IWineD3DVolumeTexture *ifa
return basetexture_get_dirty((IWineD3DBaseTexture *)iface);
}
+/* Context activation is done by the caller. */
static HRESULT WINAPI IWineD3DVolumeTextureImpl_BindTexture(IWineD3DVolumeTexture *iface, BOOL srgb) {
IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
BOOL dummy;
@@ -211,30 +341,14 @@ static BOOL WINAPI IWineD3DVolumeTextureImpl_IsCondNP2(IWineD3DVolumeTexture *if
return FALSE;
}
-static void WINAPI IWineD3DVolumeTextureImpl_ApplyStateChanges(IWineD3DVolumeTexture *iface,
- const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1],
- const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]) {
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
- TRACE("(%p) : nothing to do, passing to base texture\n", This);
- basetexture_apply_state_changes((IWineD3DBaseTexture *)iface, textureStates, samplerStates);
-}
-
-
/* *******************************************
IWineD3DVolumeTexture IWineD3DVolumeTexture parts follow
******************************************* */
static void WINAPI IWineD3DVolumeTextureImpl_Destroy(IWineD3DVolumeTexture *iface, D3DCB_DESTROYVOLUMEFN D3DCB_DestroyVolume) {
IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
- unsigned int i;
- TRACE("(%p) : Cleaning up\n",This);
- for (i = 0; i < This->baseTexture.levels; i++) {
- if (This->volumes[i] != NULL) {
- /* Cleanup the container */
- IWineD3DVolume_SetContainer(This->volumes[i], 0);
- D3DCB_DestroyVolume(This->volumes[i]);
- }
- }
- basetexture_cleanup((IWineD3DBaseTexture *)iface);
+
+ volumetexture_cleanup(This, D3DCB_DestroyVolume);
+
HeapFree(GetProcessHeap(), 0, This);
}
@@ -330,7 +444,6 @@ const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl =
IWineD3DVolumeTextureImpl_BindTexture,
IWineD3DVolumeTextureImpl_GetTextureDimensions,
IWineD3DVolumeTextureImpl_IsCondNP2,
- IWineD3DVolumeTextureImpl_ApplyStateChanges,
/* volume texture */
IWineD3DVolumeTextureImpl_Destroy,
IWineD3DVolumeTextureImpl_GetLevelDesc,
diff --git a/reactos/dll/directx/wine/wined3d/wined3d.spec b/reactos/dll/directx/wine/wined3d/wined3d.spec
index 2f2677c1ce6..f65ee314dfa 100644
--- a/reactos/dll/directx/wine/wined3d/wined3d.spec
+++ b/reactos/dll/directx/wine/wined3d/wined3d.spec
@@ -1,2 +1,4 @@
@ stdcall WineDirect3DCreate(long ptr)
@ stdcall WineDirect3DCreateClipper(ptr)
+@ stdcall wined3d_mutex_lock()
+@ stdcall wined3d_mutex_unlock()
diff --git a/reactos/dll/directx/wine/wined3d/wined3d_gl.h b/reactos/dll/directx/wine/wined3d/wined3d_gl.h
index 1a9c9251899..9c85d576029 100644
--- a/reactos/dll/directx/wine/wined3d/wined3d_gl.h
+++ b/reactos/dll/directx/wine/wined3d/wined3d_gl.h
@@ -1141,10 +1141,13 @@ void (WINE_GLAPI *glViewport) (GLint x, GLint y, GLsizei width, GLsizei height);
void (WINE_GLAPI *glPointParameterfv) (GLenum pname, const GLfloat *params);
/* glFinish and glFlush are always loaded from opengl32.dll, thus they always have
- * __stdcall calling convention
+ * __stdcall calling convention.
+ *
+ * They are wgl functions and must not be called inside the gl lock, give them a
+ * name that makes this clear
*/
-void (__stdcall *glFinish) ();
-void (__stdcall *glFlush) ();
+void (__stdcall *wglFinish) ();
+void (__stdcall *wglFlush) ();
/* WGL functions */
HGLRC (WINAPI *pwglCreateContext)(HDC);
@@ -1517,6 +1520,20 @@ BOOL (WINAPI *pwglShareLists)(HGLRC,HGLRC);
#endif
typedef void (WINE_GLAPI *PGLFNCLAMPCOLORARBPROC) (GLenum target, GLenum clamp);
+/* GL_ARB_depth_buffer_float */
+#ifndef GL_ARB_depth_buffer_float
+#define GL_ARB_depth_buffer_float 1
+#define GL_DEPTH_COMPONENT32F 0x8cac
+#define GL_DEPTH32F_STENCIL8 0x8cad
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8dad
+#endif
+
+/* GL_ARB_depth_clamp */
+#ifndef GL_ARB_depth_clamp
+#define GL_ARB_depth_clamp 1
+#define GL_DEPTH_CLAMP 0x864f
+#endif
+
/* GL_ARB_depth_texture */
#ifndef GL_ARB_depth_texture
#define GL_ARB_depth_texture 1
@@ -1897,6 +1914,15 @@ typedef void (WINE_GLAPI * PGLFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint sr
#endif
typedef void (WINE_GLAPI * PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+/* GL_EXT_packed_depth_stencil */
+#ifndef GL_EXT_packed_depth_stencil
+#define GL_EXT_packed_depth_stencil 1
+#define GL_DEPTH_STENCIL_EXT 0x84f9
+#define GL_UNSIGNED_INT_24_8_EXT 0x84fa
+#define GL_DEPTH24_STENCIL8_EXT 0x88f0
+#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88f1
+#endif
+
/* GL_EXT_secondary_color */
#ifndef GL_EXT_secondary_color
#define GL_EXT_secondary_color 1
@@ -1935,6 +1961,17 @@ typedef void (WINE_GLAPI * PGLFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum inte
#endif
typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params);
+
+/* GL_EXT_provoking_vertex */
+#ifndef GL_EXT_provoking_vertex
+#define GL_EXT_provoking_vertex 1
+#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8e4d
+#define GL_LAST_VERTEX_CONVENTION_EXT 0x8e4e
+#define GL_PROVOKING_VERTEX_EXT 0x8e4f
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTIONS_EXT 0x8e4c
+#endif
+typedef void (WINE_GLAPI * PGLFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode);
+
/* GL_EXT_texture3D */
#ifndef GL_EXT_texture3D
#define GL_EXT_texture3D 1
@@ -3080,6 +3117,13 @@ typedef void (WINE_GLAPI *PGLFNSETFRAGMENTSHADERCONSTANTATI) (GLuint dst, const
#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE
#endif
+/* GL_NV_vertex_program2_option */
+#ifndef GL_NV_vertex_program2_option
+#define GL_NV_vertex_program2_option
+#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4
+#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5
+#endif
+
/* GL_VERSION_2_0 */
#ifndef GL_VERSION_2_0
#define GL_VERSION_2_0 1
@@ -3302,6 +3346,18 @@ typedef enum _GL_Cards {
CARD_ATI_RADEON_HD2600 = 0x9581,
CARD_ATI_RADEON_HD2900 = 0x9400,
CARD_ATI_RADEON_HD3200 = 0x9620,
+ CARD_ATI_RADEON_HD4350 = 0x954f,
+ CARD_ATI_RADEON_HD4550 = 0x9540,
+ CARD_ATI_RADEON_HD4600 = 0x9495,
+ CARD_ATI_RADEON_HD4650 = 0x9498,
+ CARD_ATI_RADEON_HD4670 = 0x9490,
+ CARD_ATI_RADEON_HD4700 = 0x944e,
+ CARD_ATI_RADEON_HD4770 = 0x94b3,
+ CARD_ATI_RADEON_HD4800 = 0x944c, /* picked one value between 9440,944c,9442,9460 */
+ CARD_ATI_RADEON_HD4830 = 0x944c,
+ CARD_ATI_RADEON_HD4850 = 0x9442,
+ CARD_ATI_RADEON_HD4870 = 0x9440,
+ CARD_ATI_RADEON_HD4890 = 0x9460,
CARD_NVIDIA_RIVA_128 = 0x0018,
CARD_NVIDIA_RIVA_TNT = 0x0020,
@@ -3342,39 +3398,21 @@ typedef enum _GL_Cards {
CARD_INTEL_I915G = 0x2582,
CARD_INTEL_I915GM = 0x2592,
CARD_INTEL_I945GM = 0x27a2, /* Same as GMA 950?? */
+ CARD_INTEL_X3100 = 0x2a02, /* found in macs. Same as GMA 965? */
} GL_Cards;
#define WINE_DEFAULT_VIDMEM 64*1024*1024
-typedef enum _GL_VSVersion {
- VS_VERSION_NOT_SUPPORTED = 0x0,
- VS_VERSION_10 = 0x10,
- VS_VERSION_11 = 0x11,
- VS_VERSION_20 = 0x20,
- VS_VERSION_30 = 0x30,
- /*Force 32-bits*/
- VS_VERSION_FORCE_DWORD = 0x7FFFFFFF
-} GL_VSVersion;
-
-typedef enum _GL_PSVersion {
- PS_VERSION_NOT_SUPPORTED = 0x0,
- PS_VERSION_10 = 0x10,
- PS_VERSION_11 = 0x11,
- PS_VERSION_12 = 0x12,
- PS_VERSION_13 = 0x13,
- PS_VERSION_14 = 0x14,
- PS_VERSION_20 = 0x20,
- PS_VERSION_30 = 0x30,
- /*Force 32-bits*/
- PS_VERSION_FORCE_DWORD = 0x7FFFFFFF
-} GL_PSVersion;
-
#define MAKEDWORD_VERSION(maj, min) ((maj & 0x0000FFFF) << 16) | (min & 0x0000FFFF)
/* OpenGL Supported Extensions (ARB and EXT) */
typedef enum _GL_SupportedExt {
+ WINED3D_GL_EXT_NONE,
/* ARB */
ARB_COLOR_BUFFER_FLOAT,
+ ARB_DEPTH_BUFFER_FLOAT,
+ ARB_DEPTH_CLAMP,
+ ARB_DEPTH_TEXTURE,
ARB_DRAW_BUFFERS,
ARB_FRAGMENT_PROGRAM,
ARB_FRAGMENT_SHADER,
@@ -3414,9 +3452,11 @@ typedef enum _GL_SupportedExt {
EXT_FRAMEBUFFER_OBJECT,
EXT_FRAMEBUFFER_BLIT,
EXT_FRAMEBUFFER_MULTISAMPLE,
+ EXT_PACKED_DEPTH_STENCIL,
EXT_PALETTED_TEXTURE,
EXT_PIXEL_BUFFER_OBJECT,
EXT_POINT_PARAMETERS,
+ EXT_PROVOKING_VERTEX,
EXT_SECONDARY_COLOR,
EXT_STENCIL_TWO_SIDE,
EXT_STENCIL_WRAP,
@@ -3449,7 +3489,9 @@ typedef enum _GL_SupportedExt {
NV_VERTEX_PROGRAM,
NV_VERTEX_PROGRAM1_1,
NV_VERTEX_PROGRAM2,
+ NV_VERTEX_PROGRAM2_OPTION,
NV_VERTEX_PROGRAM3,
+ NV_FRAGMENT_PROGRAM_OPTION,
NV_FENCE,
NV_DEPTH_CLAMP,
NV_LIGHT_MAX_EXPONENT,
@@ -3478,7 +3520,7 @@ typedef enum _GL_SupportedExt {
WGL_ARB_PIXEL_FORMAT,
WGL_WINE_PIXEL_FORMAT_PASSTHROUGH,
- OPENGL_SUPPORTED_EXT_END
+ WINED3D_GL_EXT_COUNT,
} GL_SupportedExt;
@@ -3591,6 +3633,8 @@ typedef enum _GL_SupportedExt {
/* GL_EXT_point_parameters */ \
USE_GL_FUNC(PGLFNGLPOINTPARAMETERFEXTPROC, glPointParameterfEXT, EXT_POINT_PARAMETERS, NULL )\
USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVEXTPROC, glPointParameterfvEXT, EXT_POINT_PARAMETERS, NULL )\
+ /* GL_EXT_provoking_vertex */ \
+ USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXEXTPROC, glProvokingVertexEXT, EXT_PROVOKING_VERTEX, NULL)\
/* GL_EXT_secondary_color */ \
USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBEXTPROC, glSecondaryColor3ubEXT, EXT_SECONDARY_COLOR, NULL )\
USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBVEXTPROC, glSecondaryColor3ubvEXT, EXT_SECONDARY_COLOR, NULL )\
@@ -3906,77 +3950,61 @@ typedef BOOL (WINAPI * WINED3D_PFNWGLSETPIXELFORMATWINE) (HDC hdc, int iPixelFor
****************************************************/
#define USE_GL_FUNC(type, pfn, ext, replace) type pfn;
-typedef struct _WineD3D_GL_Info {
- DWORD glx_version;
- DWORD gl_version;
+struct wined3d_gl_info
+{
+ GL_Vendors gl_vendor;
+ GL_Cards gl_card;
+ UINT vidmem;
+ DWORD driver_version;
+ DWORD driver_version_hipart;
+ const char *driver_description;
- GL_Vendors gl_vendor;
- GL_Cards gl_card;
- UINT vidmem;
- DWORD driver_version;
- DWORD driver_version_hipart;
- CHAR driver_description[255];
- CHAR gl_renderer[255];
- /**
- * CAPS Constants
- */
- UINT max_buffers;
- UINT max_lights;
- UINT max_textures;
- UINT max_texture_stages;
- UINT max_fragment_samplers;
- UINT max_vertex_samplers;
- UINT max_combined_samplers;
- UINT max_sampler_stages;
- UINT max_clipplanes;
- UINT max_texture_size;
- UINT max_texture3d_size;
- float max_pointsize, max_pointsizemin;
- UINT max_point_sprite_units;
- UINT max_blends;
- UINT max_anisotropy;
- UINT max_glsl_varyings;
- float max_shininess;
+ UINT max_buffers;
+ UINT max_lights;
+ UINT max_textures;
+ UINT max_texture_stages;
+ UINT max_fragment_samplers;
+ UINT max_vertex_samplers;
+ UINT max_combined_samplers;
+ UINT max_sampler_stages;
+ UINT max_clipplanes;
+ UINT max_texture_size;
+ UINT max_texture3d_size;
+ float max_pointsize, max_pointsizemin;
+ UINT max_point_sprite_units;
+ UINT max_blends;
+ UINT max_anisotropy;
+ UINT max_glsl_varyings;
+ float max_shininess;
- unsigned max_vshader_constantsF;
- unsigned max_pshader_constantsF;
+ unsigned int max_vshader_constantsF;
+ unsigned int max_pshader_constantsF;
- unsigned vs_arb_constantsF;
- unsigned vs_arb_max_instructions;
- unsigned vs_arb_max_temps;
- unsigned ps_arb_constantsF;
- unsigned ps_arb_max_instructions;
- unsigned ps_arb_max_temps;
- unsigned vs_glsl_constantsF;
- unsigned ps_glsl_constantsF;
+ unsigned int vs_arb_constantsF;
+ unsigned int vs_arb_max_instructions;
+ unsigned int vs_arb_max_temps;
+ unsigned int ps_arb_constantsF;
+ unsigned int ps_arb_max_local_constants;
+ unsigned int ps_arb_max_instructions;
+ unsigned int ps_arb_max_temps;
+ unsigned int vs_glsl_constantsF;
+ unsigned int ps_glsl_constantsF;
- GL_PSVersion ps_arb_version;
- GL_PSVersion ps_nv_version;
+ DWORD reserved_glsl_constants;
- GL_VSVersion vs_arb_version;
- GL_VSVersion vs_nv_version;
- GL_VSVersion vs_ati_version;
+ DWORD quirks;
- BOOL arb_vs_offset_limit;
- BOOL set_texcoord_w;
- DWORD reserved_glsl_constants;
+ BOOL supported[WINED3D_GL_EXT_COUNT];
- BOOL supported[OPENGL_SUPPORTED_EXT_END + 1];
+ /* GL function pointers */
+ GL_EXT_FUNCS_GEN
+ /* WGL function pointers */
+ WGL_EXT_FUNCS_GEN
- /** OpenGL EXT and ARB functions ptr */
- GL_EXT_FUNCS_GEN
- /** OpenGL WGL functions ptr */
- WGL_EXT_FUNCS_GEN
-
- struct GlPixelFormatDesc *gl_formats;
-} WineD3D_GL_Info;
-#undef USE_GL_FUNC
-
-struct driver_quirk {
- BOOL (*match)(const WineD3D_GL_Info *gl_info);
- void (*apply)(WineD3D_GL_Info *gl_info);
- const char *description;
+ struct GlPixelFormatDesc *gl_formats;
};
+#undef USE_GL_FUNC
+
#endif /* __WINE_WINED3D_GL */
diff --git a/reactos/dll/directx/wine/wined3d/wined3d_main.c b/reactos/dll/directx/wine/wined3d/wined3d_main.c
index 687fe893c05..bdb544a200f 100644
--- a/reactos/dll/directx/wine/wined3d/wined3d_main.c
+++ b/reactos/dll/directx/wine/wined3d/wined3d_main.c
@@ -32,17 +32,25 @@ int num_lock = 0;
void (*CDECL wine_tsx11_lock_ptr)(void) = NULL;
void (*CDECL wine_tsx11_unlock_ptr)(void) = NULL;
+CRITICAL_SECTION wined3d_cs;
+static CRITICAL_SECTION_DEBUG wined3d_cs_debug =
+{
+ 0, 0, &wined3d_cs,
+ {&wined3d_cs_debug.ProcessLocksList,
+ &wined3d_cs_debug.ProcessLocksList},
+ 0, 0, {(DWORD_PTR)(__FILE__ ": wined3d_cs")}
+};
+CRITICAL_SECTION wined3d_cs = {&wined3d_cs_debug, -1, 0, 0, 0, 0};
/* When updating default value here, make sure to update winecfg as well,
* where appropriate. */
-wined3d_settings_t wined3d_settings =
+wined3d_settings_t wined3d_settings =
{
VS_HW, /* Hardware by default */
PS_HW, /* Hardware by default */
- VBO_HW, /* Hardware by default */
TRUE, /* Use of GLSL enabled by default */
- ORM_BACKBUFFER, /* Use the backbuffer to do offscreen rendering */
- RTL_AUTO, /* Automatically determine best locking method */
+ ORM_FBO, /* Use FBOs to do offscreen rendering */
+ RTL_READTEX, /* Default render target locking method */
PCI_VENDOR_NONE,/* PCI Vendor ID */
PCI_DEVICE_NONE,/* PCI Device ID */
0, /* The default of memory is set in FillGLCaps */
@@ -97,6 +105,7 @@ static void CDECL wined3d_do_nothing(void)
static BOOL wined3d_init(HINSTANCE hInstDLL)
{
+ DWORD wined3d_context_tls_idx;
HMODULE mod;
char buffer[MAX_PATH+10];
DWORD size = sizeof(buffer);
@@ -105,6 +114,15 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
DWORD len, tmpvalue;
WNDCLASSA wc;
+ wined3d_context_tls_idx = TlsAlloc();
+ if (wined3d_context_tls_idx == TLS_OUT_OF_INDEXES)
+ {
+ DWORD err = GetLastError();
+ ERR("Failed to allocate context TLS index, err %#x.\n", err);
+ return FALSE;
+ }
+ context_set_tls_idx(wined3d_context_tls_idx);
+
/* We need our own window class for a fake window which we use to retrieve GL capabilities */
/* We might need CS_OWNDC in the future if we notice strange things on Windows.
* Various articles/posts about OpenGL problems on Windows recommend this. */
@@ -117,11 +135,16 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
wc.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
- wc.lpszClassName = "WineD3D_OpenGL";
+ wc.lpszClassName = WINED3D_OPENGL_WINDOW_CLASS_NAME;
- if (!RegisterClassA(&wc) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS)
+ if (!RegisterClassA(&wc))
{
ERR("Failed to register window class 'WineD3D_OpenGL'!\n");
+ if (!TlsFree(wined3d_context_tls_idx))
+ {
+ DWORD err = GetLastError();
+ ERR("Failed to free context TLS index, err %#x.\n", err);
+ }
return FALSE;
}
@@ -181,19 +204,6 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
wined3d_settings.ps_mode = PS_NONE;
}
}
- if ( !get_config_key( hkey, appkey, "VertexBufferMode", buffer, size) )
- {
- if (!strcmp(buffer,"none"))
- {
- TRACE("Disable Vertex Buffer Hardware support\n");
- wined3d_settings.vbo_mode = VBO_NONE;
- }
- else if (!strcmp(buffer,"hardware"))
- {
- TRACE("Allow Vertex Buffer Hardware support\n");
- wined3d_settings.vbo_mode = VBO_HW;
- }
- }
if ( !get_config_key( hkey, appkey, "UseGLSL", buffer, size) )
{
if (!strcmp(buffer,"disabled"))
@@ -237,16 +247,6 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
TRACE("Using glReadPixels for render target reading and textures for writing\n");
wined3d_settings.rendertargetlock_mode = RTL_READTEX;
}
- else if (!strcmp(buffer,"texdraw"))
- {
- TRACE("Using textures for render target reading and glDrawPixels for writing\n");
- wined3d_settings.rendertargetlock_mode = RTL_TEXDRAW;
- }
- else if (!strcmp(buffer,"textex"))
- {
- TRACE("Reading render targets via textures and writing via textures\n");
- wined3d_settings.rendertargetlock_mode = RTL_TEXTEX;
- }
}
if ( !get_config_key_dword( hkey, appkey, "VideoPciDeviceID", &tmpvalue) )
{
@@ -309,8 +309,6 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
TRACE("Allow HW vertex shaders\n");
if (wined3d_settings.ps_mode == PS_NONE)
TRACE("Disable pixel shaders\n");
- if (wined3d_settings.vbo_mode == VBO_NONE)
- TRACE("Disable Vertex Buffer Hardware support\n");
if (wined3d_settings.glslRequested)
TRACE("If supported by your system, GL Shading Language will be used\n");
@@ -320,13 +318,32 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
return TRUE;
}
-static BOOL wined3d_destroy(void)
+static BOOL wined3d_destroy(HINSTANCE hInstDLL)
{
+ DWORD wined3d_context_tls_idx = context_get_tls_idx();
+
+ if (!TlsFree(wined3d_context_tls_idx))
+ {
+ DWORD err = GetLastError();
+ ERR("Failed to free context TLS index, err %#x.\n", err);
+ }
+
HeapFree(GetProcessHeap(), 0, wined3d_settings.logo);
+ UnregisterClassA(WINED3D_OPENGL_WINDOW_CLASS_NAME, hInstDLL);
return TRUE;
}
+void WINAPI wined3d_mutex_lock(void)
+{
+ EnterCriticalSection(&wined3d_cs);
+}
+
+void WINAPI wined3d_mutex_unlock(void)
+{
+ LeaveCriticalSection(&wined3d_cs);
+}
+
/* At process attach */
BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
{
@@ -338,7 +355,16 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
return wined3d_init(hInstDLL);
case DLL_PROCESS_DETACH:
- return wined3d_destroy();
+ return wined3d_destroy(hInstDLL);
+
+ case DLL_THREAD_DETACH:
+ {
+ if (!context_set_current(NULL))
+ {
+ ERR("Failed to clear current context.\n");
+ }
+ return TRUE;
+ }
default:
return TRUE;
diff --git a/reactos/dll/directx/wine/wined3d/wined3d_private.h b/reactos/dll/directx/wine/wined3d/wined3d_private.h
index 303fb7031f3..fefc54019c1 100644
--- a/reactos/dll/directx/wine/wined3d/wined3d_private.h
+++ b/reactos/dll/directx/wine/wined3d/wined3d_private.h
@@ -41,6 +41,13 @@
#include "wine/wined3d.h"
#include "wined3d_gl.h"
#include "wine/list.h"
+#include "wine/rbtree.h"
+
+/* Driver quirks */
+#define WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT 0x00000001
+#define WINED3D_QUIRK_SET_TEXCOORD_W 0x00000002
+#define WINED3D_QUIRK_GLSL_CLIP_VARYING 0x00000004
+#define WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA 0x00000008
/* Texture format fixups */
@@ -126,38 +133,9 @@ static inline enum yuv_fixup get_yuv_fixup(struct color_fixup_desc fixup)
return yuv_fixup;
}
-/* Hash table functions */
-typedef unsigned int (hash_function_t)(const void *key);
-typedef BOOL (compare_function_t)(const void *keya, const void *keyb);
-
-#define ceilf(x) (float)ceil((double)x)
-
-struct hash_table_entry_t {
- void *key;
- void *value;
- unsigned int hash;
- struct list entry;
-};
-
-struct hash_table_t {
- hash_function_t *hash_function;
- compare_function_t *compare_function;
- struct list *buckets;
- unsigned int bucket_count;
- struct hash_table_entry_t *entries;
- unsigned int entry_count;
- struct list free_entries;
- unsigned int count;
- unsigned int grow_size;
- unsigned int shrink_size;
-};
-
-struct hash_table_t *hash_table_create(hash_function_t *hash_function, compare_function_t *compare_function);
-void hash_table_destroy(struct hash_table_t *table, void (*free_value)(void *value, void *cb), void *cb);
-void hash_table_for_each_entry(struct hash_table_t *table, void (*callback)(void *value, void *context), void *context);
-void *hash_table_get(const struct hash_table_t *table, const void *key);
-void hash_table_put(struct hash_table_t *table, void *key, void *value);
-void hash_table_remove(struct hash_table_t *table, void *key);
+void *wined3d_rb_alloc(size_t size);
+void *wined3d_rb_realloc(void *ptr, size_t size);
+void wined3d_rb_free(void *ptr);
/* Device caps */
#define MAX_PALETTES 65536
@@ -198,13 +176,22 @@ struct min_lookup
GLenum mip[WINED3DTEXF_LINEAR + 1];
};
-struct min_lookup minMipLookup[WINED3DTEXF_ANISOTROPIC + 1];
-const struct min_lookup minMipLookup_noFilter[WINED3DTEXF_ANISOTROPIC + 1];
-GLenum magLookup[WINED3DTEXF_ANISOTROPIC + 1];
-const GLenum magLookup_noFilter[WINED3DTEXF_ANISOTROPIC + 1];
+const struct min_lookup minMipLookup[WINED3DTEXF_LINEAR + 1];
+const struct min_lookup minMipLookup_noFilter[WINED3DTEXF_LINEAR + 1];
+const struct min_lookup minMipLookup_noMip[WINED3DTEXF_LINEAR + 1];
+const GLenum magLookup[WINED3DTEXF_LINEAR + 1];
+const GLenum magLookup_noFilter[WINED3DTEXF_LINEAR + 1];
-extern const struct filter_lookup filter_lookup_nofilter;
-extern struct filter_lookup filter_lookup;
+static inline GLenum wined3d_gl_mag_filter(const GLenum mag_lookup[], WINED3DTEXTUREFILTERTYPE mag_filter)
+{
+ return mag_lookup[mag_filter];
+}
+
+static inline GLenum wined3d_gl_min_mip_filter(const struct min_lookup min_mip_lookup[],
+ WINED3DTEXTUREFILTERTYPE min_filter, WINED3DTEXTUREFILTERTYPE mip_filter)
+{
+ return min_mip_lookup[min_filter].mip[mip_filter];
+}
/* float_16_to_32() and float_32_to_16() (see implementation in
* surface_base.c) convert 16 bit floats in the FLOAT16 data type
@@ -220,21 +207,43 @@ static inline float float_16_to_32(const unsigned short *in) {
const unsigned short s = ((*in) & 0x8000);
const unsigned short e = ((*in) & 0x7C00) >> 10;
const unsigned short m = (*in) & 0x3FF;
- const float sgn = (s ? -1.0 : 1.0);
+ const float sgn = (s ? -1.0f : 1.0f);
if(e == 0) {
- if(m == 0) return sgn * 0.0; /* +0.0 or -0.0 */
- else return sgn * pow(2, -14.0) * ( (float) m / 1024.0);
+ if(m == 0) return sgn * 0.0f; /* +0.0 or -0.0 */
+ else return sgn * pow(2, -14.0f) * ((float)m / 1024.0f);
} else if(e < 31) {
- return sgn * pow(2, (float) e-15.0) * (1.0 + ((float) m / 1024.0));
+ return sgn * pow(2, (float)e - 15.0f) * (1.0f + ((float)m / 1024.0f));
} else {
- if(m == 0) return sgn / 0.0; /* +INF / -INF */
- else return 0.0 / 0.0; /* NAN */
+ if(m == 0) return sgn / 0.0f; /* +INF / -INF */
+ else return 0.0f / 0.0f; /* NAN */
+ }
+}
+
+static inline float float_24_to_32(DWORD in)
+{
+ const float sgn = in & 0x800000 ? -1.0f : 1.0f;
+ const unsigned short e = (in & 0x780000) >> 19;
+ const unsigned short m = in & 0x7ffff;
+
+ if (e == 0)
+ {
+ if (m == 0) return sgn * 0.0f; /* +0.0 or -0.0 */
+ else return sgn * pow(2, -6.0f) * ((float)m / 524288.0f);
+ }
+ else if (e < 15)
+ {
+ return sgn * pow(2, (float)e - 7.0f) * (1.0f + ((float)m / 524288.0f));
+ }
+ else
+ {
+ if (m == 0) return sgn / 0.0f; /* +INF / -INF */
+ else return 0.0f / 0.0f; /* NAN */
}
}
/**
- * Settings
+ * Settings
*/
#define VS_NONE 0
#define VS_HW 1
@@ -259,11 +268,8 @@ static inline float float_16_to_32(const unsigned short *in) {
#define SHADER_NONE 4
#define RTL_DISABLE -1
-#define RTL_AUTO 0
#define RTL_READDRAW 1
#define RTL_READTEX 2
-#define RTL_TEXDRAW 3
-#define RTL_TEXTEX 4
#define PCI_VENDOR_NONE 0xffff /* e.g. 0x8086 for Intel and 0x10de for Nvidia */
#define PCI_DEVICE_NONE 0xffff /* e.g. 0x14f for a Geforce6200 */
@@ -274,7 +280,6 @@ typedef struct wined3d_settings_s {
/* vertex and pixel shader modes */
int vs_mode;
int ps_mode;
- int vbo_mode;
/* Ideally, we don't want the user to have to request GLSL. If the hardware supports GLSL,
we should use it. However, until it's fully implemented, we'll leave it as a registry
setting for developers. */
@@ -325,6 +330,7 @@ typedef enum _WINED3DSHADER_PARAM_REGISTER_TYPE
WINED3DSPR_LABEL = 18,
WINED3DSPR_PREDICATE = 19,
WINED3DSPR_IMMCONST,
+ WINED3DSPR_CONSTBUFFER,
} WINED3DSHADER_PARAM_REGISTER_TYPE;
enum wined3d_immconst_type
@@ -506,12 +512,14 @@ typedef enum COMPARISON_TYPE
#define MAX_LABELS 16
#define SHADER_PGMSIZE 65535
-typedef struct SHADER_BUFFER {
- char* buffer;
+
+struct wined3d_shader_buffer
+{
+ char *buffer;
unsigned int bsize;
unsigned int lineNo;
BOOL newline;
-} SHADER_BUFFER;
+};
enum WINED3D_SHADER_INSTRUCTION_HANDLER
{
@@ -620,28 +628,40 @@ struct wined3d_shader_version
typedef struct shader_reg_maps
{
struct wined3d_shader_version shader_version;
- char texcoord[MAX_REG_TEXCRD]; /* pixel < 3.0 */
- char temporary[MAX_REG_TEMP]; /* pixel, vertex */
- char address[MAX_REG_ADDR]; /* vertex */
- char packed_input[MAX_REG_INPUT]; /* pshader >= 3.0 */
- char packed_output[MAX_REG_OUTPUT]; /* vertex >= 3.0 */
- char attributes[MAX_ATTRIBS]; /* vertex */
- char labels[MAX_LABELS]; /* pixel, vertex */
+ BYTE texcoord; /* MAX_REG_TEXCRD, 8 */
+ BYTE address; /* MAX_REG_ADDR, 1 */
+ WORD labels; /* MAX_LABELS, 16 */
+ DWORD temporary; /* MAX_REG_TEMP, 32 */
DWORD *constf; /* pixel, vertex */
DWORD texcoord_mask[MAX_REG_TEXCRD]; /* vertex < 3.0 */
+ WORD input_registers; /* max(MAX_REG_INPUT, MAX_ATTRIBS), 16 */
+ WORD output_registers; /* MAX_REG_OUTPUT, 12 */
WORD integer_constants; /* MAX_CONST_I, 16 */
WORD boolean_constants; /* MAX_CONST_B, 16 */
+ WORD local_int_consts; /* MAX_CONST_I, 16 */
+ WORD local_bool_consts; /* MAX_CONST_B, 16 */
WINED3DSAMPLER_TEXTURE_TYPE sampler_type[max(MAX_FRAGMENT_SAMPLERS, MAX_VERTEX_SAMPLERS)];
- BOOL bumpmat[MAX_TEXTURES], luminanceparams[MAX_TEXTURES];
- char usesnrm, vpos, usesdsy, usestexldd;
- char usesrelconstF;
+ BYTE bumpmat; /* MAX_TEXTURES, 8 */
+ BYTE luminanceparams; /* MAX_TEXTURES, 8 */
+
+ WORD usesnrm : 1;
+ WORD vpos : 1;
+ WORD usesdsx : 1;
+ WORD usesdsy : 1;
+ WORD usestexldd : 1;
+ WORD usesmova : 1;
+ WORD usesfacing : 1;
+ WORD usesrelconstF : 1;
+ WORD fog : 1;
+ WORD usestexldl : 1;
+ WORD usesifc : 1;
+ WORD usescall : 1;
+ WORD padding : 4;
/* Whether or not loops are used in this shader, and nesting depth */
unsigned loop_depth;
-
- /* Whether or not this shader uses fog */
- char fog;
+ unsigned highest_render_target;
} shader_reg_maps;
@@ -649,13 +669,15 @@ struct wined3d_shader_context
{
IWineD3DBaseShader *shader;
const struct shader_reg_maps *reg_maps;
- SHADER_BUFFER *buffer;
+ struct wined3d_shader_buffer *buffer;
+ void *backend_data;
};
struct wined3d_shader_register
{
WINED3DSHADER_PARAM_REGISTER_TYPE type;
UINT idx;
+ UINT array_idx;
const struct wined3d_shader_src_param *rel_addr;
enum wined3d_immconst_type immconst_type;
DWORD immconst_data[4];
@@ -697,6 +719,19 @@ struct wined3d_shader_semantic
struct wined3d_shader_dst_param reg;
};
+struct wined3d_shader_attribute
+{
+ WINED3DDECLUSAGE usage;
+ UINT usage_idx;
+};
+
+struct wined3d_shader_loop_control
+{
+ unsigned int count;
+ unsigned int start;
+ int step;
+};
+
struct wined3d_shader_frontend
{
void *(*shader_init)(const DWORD *ptr, const struct wined3d_shader_signature *output_signature);
@@ -732,6 +767,8 @@ struct shader_caps {
DWORD MaxPShaderInstructionsExecuted;
DWORD MaxVertexShader30InstructionSlots;
DWORD MaxPixelShader30InstructionSlots;
+
+ BOOL VSClipping;
};
enum tex_types
@@ -752,11 +789,6 @@ enum vertexprocessing_mode {
#define WINED3D_CONST_NUM_UNUSED ~0U
-struct stb_const_desc {
- unsigned char texunit;
- UINT const_num;
-};
-
enum fogmode {
FOG_OFF,
FOG_LINEAR,
@@ -790,24 +822,22 @@ struct vs_compile_args {
WORD swizzle_map; /* MAX_ATTRIBS, 16 */
};
+struct wined3d_context;
+
typedef struct {
- const SHADER_HANDLER *shader_instruction_handler_table;
- void (*shader_select)(IWineD3DDevice *iface, BOOL usePS, BOOL useVS);
+ void (*shader_handle_instruction)(const struct wined3d_shader_instruction *);
+ void (*shader_select)(const struct wined3d_context *context, BOOL usePS, BOOL useVS);
void (*shader_select_depth_blt)(IWineD3DDevice *iface, enum tex_types tex_type);
void (*shader_deselect_depth_blt)(IWineD3DDevice *iface);
void (*shader_update_float_vertex_constants)(IWineD3DDevice *iface, UINT start, UINT count);
void (*shader_update_float_pixel_constants)(IWineD3DDevice *iface, UINT start, UINT count);
- void (*shader_load_constants)(IWineD3DDevice *iface, char usePS, char useVS);
+ void (*shader_load_constants)(const struct wined3d_context *context, char usePS, char useVS);
void (*shader_load_np2fixup_constants)(IWineD3DDevice *iface, char usePS, char useVS);
void (*shader_destroy)(IWineD3DBaseShader *iface);
HRESULT (*shader_alloc_private)(IWineD3DDevice *iface);
void (*shader_free_private)(IWineD3DDevice *iface);
BOOL (*shader_dirtifyable_constants)(IWineD3DDevice *iface);
- GLuint (*shader_generate_pshader)(IWineD3DPixelShader *iface,
- SHADER_BUFFER *buffer, const struct ps_compile_args *args);
- GLuint (*shader_generate_vshader)(IWineD3DVertexShader *iface,
- SHADER_BUFFER *buffer, const struct vs_compile_args *args);
- void (*shader_get_caps)(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_info, struct shader_caps *caps);
+ void (*shader_get_caps)(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct shader_caps *caps);
BOOL (*shader_color_fixup_supported)(struct color_fixup_desc fixup);
void (*shader_add_instruction_modifiers)(const struct wined3d_shader_instruction *ins);
} shader_backend_t;
@@ -870,17 +900,19 @@ extern int num_lock;
/* Checking of API calls */
/* --------------------- */
#ifndef WINE_NO_DEBUG_MSGS
-#define checkGLcall(A) \
-do { \
- GLint err = glGetError(); \
- if (err == GL_NO_ERROR) { \
- TRACE("%s call ok %s / %d\n", A, __FILE__, __LINE__); \
- \
- } else do { \
- FIXME(">>>>>>>>>>>>>>>>> %s (%#x) from %s @ %s / %d\n", \
- debug_glerror(err), err, A, __FILE__, __LINE__); \
- err = glGetError(); \
- } while (err != GL_NO_ERROR); \
+#define checkGLcall(A) \
+do { \
+ GLint err; \
+ if(!__WINE_IS_DEBUG_ON(_FIXME, __wine_dbch___default)) break; \
+ err = glGetError(); \
+ if (err == GL_NO_ERROR) { \
+ TRACE("%s call ok %s / %d\n", A, __FILE__, __LINE__); \
+ \
+ } else do { \
+ FIXME(">>>>>>>>>>>>>>>>> %s (%#x) from %s @ %s / %d\n", \
+ debug_glerror(err), err, A, __FILE__, __LINE__); \
+ err = glGetError(); \
+ } while (err != GL_NO_ERROR); \
} while(0)
#else
#define checkGLcall(A) do {} while(0)
@@ -910,10 +942,11 @@ do { \
} while(0)
/* Trace vector and strided data information */
-#define TRACE_VECTOR(name) TRACE( #name "=(%f, %f, %f, %f)\n", name.x, name.y, name.z, name.w);
-#define TRACE_STRIDED(si, name) TRACE( #name "=(data:%p, stride:%d, format:%#x, vbo %d, stream %u)\n", \
+#define TRACE_VECTOR(name) TRACE( #name "=(%f, %f, %f, %f)\n", name.x, name.y, name.z, name.w)
+#define TRACE_STRIDED(si, name) do { if (si->use_map & (1 << name)) \
+ TRACE( #name "=(data:%p, stride:%d, format:%#x, vbo %d, stream %u)\n", \
si->elements[name].data, si->elements[name].stride, si->elements[name].format_desc->format, \
- si->elements[name].buffer_object, si->elements[name].stream_idx);
+ si->elements[name].buffer_object, si->elements[name].stream_idx); } while(0)
/* Defines used for optimizations */
@@ -937,8 +970,8 @@ extern const float identity[16];
/* Trace information per-vertex: (extremely high amount of trace) */
#if 0 /* NOTE: Must be 0 in cvs */
# define VTRACE(A) TRACE A
-#else
-# define VTRACE(A)
+#else
+# define VTRACE(A)
#endif
/* TODO: Confirm each of these works when wined3d move completed */
@@ -951,21 +984,21 @@ extern const float identity[16];
the file is deleted */
# if 1 /* NOTE: Must be 1 in cvs, as this is mostly more useful than a trace from program start */
# define SINGLE_FRAME_DEBUGGING
-# endif
+# endif
/* The following, when enabled, lets you see the makeup of the frame, by drawprimitive calls.
- It can only be enabled when FRAME_DEBUGGING is also enabled
- The contents of the back buffer are written into /tmp/backbuffer_* after each primitive
+ It can only be enabled when FRAME_DEBUGGING is also enabled
+ The contents of the back buffer are written into /tmp/backbuffer_* after each primitive
array is drawn. */
-# if 0 /* NOTE: Must be 0 in cvs, as this give a lot of ppm files when compiled in */
+# if 0 /* NOTE: Must be 0 in cvs, as this give a lot of ppm files when compiled in */
# define SHOW_FRAME_MAKEUP 1
-# endif
+# endif
/* The following, when enabled, lets you see the makeup of the all the textures used during each
of the drawprimitive calls. It can only be enabled when SHOW_FRAME_MAKEUP is also enabled.
- The contents of the textures assigned to each stage are written into
+ The contents of the textures assigned to each stage are written into
/tmp/texture_*_.ppm after each primitive array is drawn. */
# if 0 /* NOTE: Must be 0 in cvs, as this give a lot of ppm files when compiled in */
# define SHOW_TEXTURE_MAKEUP 0
-# endif
+# endif
extern BOOL isOn;
extern BOOL isDumpingFrames;
extern LONG primCounter;
@@ -1053,8 +1086,6 @@ extern glMultiTexCoordFunc multi_texcoord_funcs[WINED3D_FFP_EMIT_COUNT];
(((((d3dvtVertexType) >> (16 + (2 * (tex_num)))) + 1) & 0x03) + 1)
/* Routines and structures related to state management */
-typedef struct WineD3DContext WineD3DContext;
-typedef void (*APPLYSTATEFUNC)(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *ctx);
#define STATE_RENDER(a) (a)
#define STATE_IS_RENDER(a) ((a) >= STATE_RENDER(1) && (a) <= STATE_RENDER(WINEHIGHEST_RENDER_STATE))
@@ -1106,71 +1137,31 @@ typedef void (*APPLYSTATEFUNC)(DWORD state, IWineD3DStateBlockImpl *stateblock,
#define STATE_HIGHEST (STATE_FRONTFACE)
-struct StateEntry
-{
- DWORD representative;
- APPLYSTATEFUNC apply;
-};
-
-struct StateEntryTemplate
-{
- DWORD state;
- struct StateEntry content;
- GL_SupportedExt extension;
-};
-
-struct fragment_caps {
- DWORD PrimitiveMiscCaps;
-
- DWORD TextureOpCaps;
- DWORD MaxTextureBlendStages;
- DWORD MaxSimultaneousTextures;
-};
-
-struct fragment_pipeline {
- void (*enable_extension)(IWineD3DDevice *iface, BOOL enable);
- void (*get_caps)(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_info, struct fragment_caps *caps);
- HRESULT (*alloc_private)(IWineD3DDevice *iface);
- void (*free_private)(IWineD3DDevice *iface);
- BOOL (*color_fixup_supported)(struct color_fixup_desc fixup);
- const struct StateEntryTemplate *states;
- BOOL ffp_proj_control;
-};
-
-extern const struct StateEntryTemplate misc_state_template[];
-extern const struct StateEntryTemplate ffp_vertexstate_template[];
-extern const struct fragment_pipeline ffp_fragment_pipeline;
-extern const struct fragment_pipeline atifs_fragment_pipeline;
-extern const struct fragment_pipeline arbfp_fragment_pipeline;
-extern const struct fragment_pipeline nvts_fragment_pipeline;
-extern const struct fragment_pipeline nvrc_fragment_pipeline;
-
-/* "Base" state table */
-HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_multistate_funcs,
- const WineD3D_GL_Info *gl_info, const struct StateEntryTemplate *vertex,
- const struct fragment_pipeline *fragment, const struct StateEntryTemplate *misc);
-
-/* Shaders for color conversions in blits */
-struct blit_shader {
- HRESULT (*alloc_private)(IWineD3DDevice *iface);
- void (*free_private)(IWineD3DDevice *iface);
- HRESULT (*set_shader)(IWineD3DDevice *iface, const struct GlPixelFormatDesc *format_desc,
- GLenum textype, UINT width, UINT height);
- void (*unset_shader)(IWineD3DDevice *iface);
- BOOL (*color_fixup_supported)(struct color_fixup_desc fixup);
-};
-
-extern const struct blit_shader ffp_blit;
-extern const struct blit_shader arbfp_blit;
-
enum fogsource {
FOGSOURCE_FFP,
FOGSOURCE_VS,
FOGSOURCE_COORD,
};
-/* The new context manager that should deal with onscreen and offscreen rendering */
-struct WineD3DContext {
+#define WINED3D_MAX_FBO_ENTRIES 64
+
+struct wined3d_occlusion_query
+{
+ struct list entry;
+ GLuint id;
+ struct wined3d_context *context;
+};
+
+struct wined3d_event_query
+{
+ struct list entry;
+ GLuint id;
+ struct wined3d_context *context;
+};
+
+struct wined3d_context
+{
+ const struct wined3d_gl_info *gl_info;
/* State dirtification
* dirtyArray is an array that contains markers for dirty states. numDirtyEntries states are dirty, their numbers are in indices
* 0...numDirtyEntries - 1. isStateDirty is a redundant copy of the dirtyArray. Technically only one of them would be needed,
@@ -1182,9 +1173,11 @@ struct WineD3DContext {
DWORD isStateDirty[STATE_HIGHEST/32 + 1]; /* Bitmap to find out quickly if a state is dirty */
IWineD3DSurface *surface;
+ IWineD3DSurface *current_rt;
DWORD tid; /* Thread ID which owns this context at the moment */
/* Stores some information about the context state for optimization */
+ WORD render_offscreen : 1;
WORD draw_buffer_dirty : 1;
WORD last_was_rhw : 1; /* true iff last draw_primitive was in xyzrhw mode */
WORD last_was_pshader : 1;
@@ -1197,7 +1190,8 @@ struct WineD3DContext {
WORD isPBuffer : 1;
WORD fog_enabled : 1;
WORD num_untracked_materials : 2; /* Max value 2 */
- WORD padding : 3;
+ WORD current : 1;
+ WORD destroyed : 1;
BYTE texShaderBumpMap; /* MAX_TEXTURES, 8 */
BYTE lastWasPow2Texture; /* MAX_TEXTURES, 8 */
DWORD numbered_array_mask;
@@ -1216,17 +1210,93 @@ struct WineD3DContext {
GLint aux_buffers;
/* FBOs */
+ UINT fbo_entry_count;
struct list fbo_list;
struct fbo_entry *current_fbo;
GLuint src_fbo;
GLuint dst_fbo;
+ GLuint fbo_read_binding;
+ GLuint fbo_draw_binding;
+
+ /* Queries */
+ GLuint *free_occlusion_queries;
+ UINT free_occlusion_query_size;
+ UINT free_occlusion_query_count;
+ struct list occlusion_queries;
+
+ GLuint *free_event_queries;
+ UINT free_event_query_size;
+ UINT free_event_query_count;
+ struct list event_queries;
/* Extension emulation */
GLint gl_fog_source;
GLfloat fog_coord_value;
GLfloat color[4], fogstart, fogend, fogcolor[4];
+ GLuint dummy_arbfp_prog;
};
+typedef void (*APPLYSTATEFUNC)(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *ctx);
+
+struct StateEntry
+{
+ DWORD representative;
+ APPLYSTATEFUNC apply;
+};
+
+struct StateEntryTemplate
+{
+ DWORD state;
+ struct StateEntry content;
+ GL_SupportedExt extension;
+};
+
+struct fragment_caps
+{
+ DWORD PrimitiveMiscCaps;
+ DWORD TextureOpCaps;
+ DWORD MaxTextureBlendStages;
+ DWORD MaxSimultaneousTextures;
+};
+
+struct fragment_pipeline
+{
+ void (*enable_extension)(IWineD3DDevice *iface, BOOL enable);
+ void (*get_caps)(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps);
+ HRESULT (*alloc_private)(IWineD3DDevice *iface);
+ void (*free_private)(IWineD3DDevice *iface);
+ BOOL (*color_fixup_supported)(struct color_fixup_desc fixup);
+ const struct StateEntryTemplate *states;
+ BOOL ffp_proj_control;
+};
+
+extern const struct StateEntryTemplate misc_state_template[];
+extern const struct StateEntryTemplate ffp_vertexstate_template[];
+extern const struct fragment_pipeline ffp_fragment_pipeline;
+extern const struct fragment_pipeline atifs_fragment_pipeline;
+extern const struct fragment_pipeline arbfp_fragment_pipeline;
+extern const struct fragment_pipeline nvts_fragment_pipeline;
+extern const struct fragment_pipeline nvrc_fragment_pipeline;
+
+/* "Base" state table */
+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);
+
+/* Shaders for color conversions in blits */
+struct blit_shader
+{
+ HRESULT (*alloc_private)(IWineD3DDevice *iface);
+ void (*free_private)(IWineD3DDevice *iface);
+ HRESULT (*set_shader)(IWineD3DDevice *iface, const struct GlPixelFormatDesc *format_desc,
+ GLenum textype, UINT width, UINT height);
+ void (*unset_shader)(IWineD3DDevice *iface);
+ BOOL (*color_fixup_supported)(struct color_fixup_desc fixup);
+};
+
+extern const struct blit_shader ffp_blit;
+extern const struct blit_shader arbfp_blit;
+
typedef enum ContextUsage {
CTXUSAGE_RESOURCELOAD = 1, /* Only loads textures: No State is applied */
CTXUSAGE_DRAWPRIM = 2, /* OpenGL states are set up for blitting DirectDraw surfaces */
@@ -1234,14 +1304,24 @@ typedef enum ContextUsage {
CTXUSAGE_CLEAR = 4, /* Drawable and states are set up for clearing */
} ContextUsage;
-void ActivateContext(IWineD3DDeviceImpl *device, IWineD3DSurface *target, ContextUsage usage);
-WineD3DContext *getActiveContext(void);
-WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win, BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms);
-void DestroyContext(IWineD3DDeviceImpl *This, WineD3DContext *context);
+struct wined3d_context *ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, enum ContextUsage usage);
+struct wined3d_context *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win,
+ BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms);
+void DestroyContext(IWineD3DDeviceImpl *This, struct wined3d_context *context);
+void context_alloc_event_query(struct wined3d_context *context, struct wined3d_event_query *query);
+void context_alloc_occlusion_query(struct wined3d_context *context, struct wined3d_occlusion_query *query);
void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource, WINED3DRESOURCETYPE type);
-void context_bind_fbo(IWineD3DDevice *iface, GLenum target, GLuint *fbo);
-void context_attach_depth_stencil_fbo(IWineD3DDeviceImpl *This, GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer);
-void context_attach_surface_fbo(IWineD3DDeviceImpl *This, GLenum fbo_target, DWORD idx, IWineD3DSurface *surface);
+void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fbo);
+void context_attach_depth_stencil_fbo(struct wined3d_context *context,
+ GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer);
+void context_attach_surface_fbo(const struct wined3d_context *context,
+ GLenum fbo_target, DWORD idx, IWineD3DSurface *surface);
+void context_free_event_query(struct wined3d_event_query *query);
+void context_free_occlusion_query(struct wined3d_occlusion_query *query);
+struct wined3d_context *context_get_current(void);
+DWORD context_get_tls_idx(void);
+BOOL context_set_current(struct wined3d_context *ctx);
+void context_set_tls_idx(DWORD idx);
void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain);
HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain);
@@ -1300,7 +1380,7 @@ struct WineD3DAdapter
UINT num;
BOOL opengl;
POINT monitorPoint;
- WineD3D_GL_Info gl_info;
+ struct wined3d_gl_info gl_info;
const char *driver;
const char *description;
WCHAR DeviceName[CCHDEVICENAME]; /* DeviceName for use with e.g. ChangeDisplaySettings */
@@ -1311,10 +1391,10 @@ struct WineD3DAdapter
unsigned int UsedTextureRam;
};
-extern BOOL initPixelFormats(WineD3D_GL_Info *gl_info);
-BOOL initPixelFormatsNoGL(WineD3D_GL_Info *gl_info);
+extern BOOL initPixelFormats(struct wined3d_gl_info *gl_info);
+BOOL initPixelFormatsNoGL(struct wined3d_gl_info *gl_info);
extern long WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, long glram);
-extern void add_gl_compat_wrappers(WineD3D_GL_Info *gl_info);
+extern void add_gl_compat_wrappers(struct wined3d_gl_info *gl_info);
/*****************************************************************************
* High order patch management
@@ -1371,21 +1451,23 @@ struct texture_stage_op
struct ffp_frag_settings {
struct texture_stage_op op[MAX_TEXTURES];
enum fogmode fog;
- /* Use an int instead of a char to get dword alignment */
- unsigned int sRGB_write;
+ /* Use shorts instead of chars to get dword alignment */
+ unsigned short sRGB_write;
+ unsigned short emul_clipplanes;
};
struct ffp_frag_desc
{
+ struct wine_rb_entry entry;
struct ffp_frag_settings settings;
};
+extern const struct wine_rb_functions wined3d_ffp_frag_program_rb_functions;
+
void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_settings *settings, BOOL ignore_textype);
-const struct ffp_frag_desc *find_ffp_frag_shader(const struct hash_table_t *fragment_shaders,
+const struct ffp_frag_desc *find_ffp_frag_shader(const struct wine_rb_tree *fragment_shaders,
const struct ffp_frag_settings *settings);
-void add_ffp_frag_shader(struct hash_table_t *shaders, struct ffp_frag_desc *desc);
-BOOL ffp_frag_program_key_compare(const void *keya, const void *keyb);
-unsigned int ffp_frag_program_key_hash(const void *key);
+void add_ffp_frag_shader(struct wine_rb_tree *shaders, struct ffp_frag_desc *desc);
/*****************************************************************************
* IWineD3D implementation structure
@@ -1408,12 +1490,6 @@ extern const IWineD3DVtbl IWineD3D_Vtbl;
BOOL InitAdapters(IWineD3DImpl *This);
-/* TODO: setup some flags in the registry to enable, disable pbuffer support
-(since it will break quite a few things until contexts are managed properly!) */
-extern BOOL pbuffer_support;
-/* allocate one pbuffer per surface */
-extern BOOL pbuffer_per_surface;
-
/* A helper function that dumps a resource list */
void dumpResources(struct list *list);
@@ -1460,13 +1536,13 @@ struct IWineD3DDeviceImpl
unsigned int max_ffp_textures, max_ffp_texture_stages;
DWORD d3d_vshader_constantF, d3d_pshader_constantF; /* Advertised d3d caps, not GL ones */
+ DWORD vs_clipping;
WORD view_ident : 1; /* true iff view matrix is identity */
WORD untransformed : 1;
WORD vertexBlendUsed : 1; /* To avoid needless setting of the blend matrices */
WORD isRecordingState : 1;
WORD isInDraw : 1;
- WORD render_offscreen : 1;
WORD bCursorVisible : 1;
WORD haveHardwareCursor : 1;
WORD d3d_initialized : 1;
@@ -1474,7 +1550,7 @@ struct IWineD3DDeviceImpl
WORD softwareVertexProcessing : 1; /* process vertex shaders using software or hardware */
WORD useDrawStridedSlow : 1;
WORD instancedDraw : 1;
- WORD padding : 3;
+ WORD padding : 4;
BYTE fixed_function_usage_map; /* MAX_TEXTURES, 8 */
@@ -1503,10 +1579,6 @@ struct IWineD3DDeviceImpl
IWineD3DSurface *auto_depth_stencil_buffer;
IWineD3DSurface *stencilBufferTarget;
- /* Caches to avoid unneeded context changes */
- IWineD3DSurface *lastActiveRenderTarget;
- IWineD3DSwapChain *lastActiveSwapChain;
-
/* palettes texture management */
UINT NumberOfPalettes;
PALETTEENTRY **palettes;
@@ -1554,11 +1626,9 @@ struct IWineD3DDeviceImpl
const WineDirect3DVertexStridedData *up_strided;
/* Context management */
- WineD3DContext **contexts; /* Dynamic array containing pointers to context structures */
- WineD3DContext *activeContext;
- DWORD lastThread;
+ struct wined3d_context **contexts;
UINT numContexts;
- WineD3DContext *pbufferContext; /* The context that has a pbuffer as drawable */
+ struct wined3d_context *pbufferContext; /* The context that has a pbuffer as drawable */
DWORD pbufferWidth, pbufferHeight; /* Size of the buffer drawable */
/* High level patch management */
@@ -1570,6 +1640,8 @@ struct IWineD3DDeviceImpl
extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl;
+void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource);
+void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource);
void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup);
void device_stream_info_from_strided(IWineD3DDeviceImpl *This,
@@ -1579,7 +1651,8 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
float Z, DWORD Stencil);
void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This);
void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state);
-static inline BOOL isStateDirty(WineD3DContext *context, DWORD state) {
+static inline BOOL isStateDirty(struct wined3d_context *context, DWORD state)
+{
DWORD idx = state >> 5;
BYTE shift = state & 0x1f;
return context->isStateDirty[idx] & (1 << shift);
@@ -1640,7 +1713,7 @@ HRESULT resource_get_parent(IWineD3DResource *iface, IUnknown **parent);
DWORD resource_get_priority(IWineD3DResource *iface);
HRESULT resource_get_private_data(IWineD3DResource *iface, REFGUID guid,
void *data, DWORD *data_size);
-HRESULT resource_init(struct IWineD3DResourceClass *resource, WINED3DRESOURCETYPE resource_type,
+HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type,
IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
WINED3DPOOL pool, IUnknown *parent);
WINED3DRESOURCETYPE resource_get_type(IWineD3DResource *iface);
@@ -1654,8 +1727,6 @@ HRESULT resource_set_private_data(IWineD3DResource *iface, REFGUID guid,
/*****************************************************************************
* IWineD3DBaseTexture D3D- > openGL state map lookups
*/
-#define WINED3DFUNC_NOTSUPPORTED -2
-#define WINED3DFUNC_UNIMPLEMENTED -1
typedef enum winetexturestates {
WINED3DTEXSTA_ADDRESSU = 0,
@@ -1704,9 +1775,6 @@ typedef struct IWineD3DBaseTextureClass
void (*internal_preload)(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb);
} IWineD3DBaseTextureClass;
-void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb);
-void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb);
-void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb);
void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb);
typedef struct IWineD3DBaseTextureImpl
@@ -1728,15 +1796,13 @@ WINED3DTEXTUREFILTERTYPE basetexture_get_autogen_filter_type(IWineD3DBaseTexture
BOOL basetexture_get_dirty(IWineD3DBaseTexture *iface);
DWORD basetexture_get_level_count(IWineD3DBaseTexture *iface);
DWORD basetexture_get_lod(IWineD3DBaseTexture *iface);
-void basetexture_init(struct IWineD3DBaseTextureClass *texture, UINT levels, DWORD usage);
+HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DRESOURCETYPE resource_type,
+ IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
+ WINED3DPOOL pool, IUnknown *parent);
HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DTEXTUREFILTERTYPE filter_type);
BOOL basetexture_set_dirty(IWineD3DBaseTexture *iface, BOOL dirty);
DWORD basetexture_set_lod(IWineD3DBaseTexture *iface, DWORD new_lod);
void basetexture_unload(IWineD3DBaseTexture *iface);
-static inline void basetexture_setsrgbcache(IWineD3DBaseTexture *iface, BOOL srgb) {
- IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface;
- This->baseTexture.is_srgb = srgb;
-}
/*****************************************************************************
* IWineD3DTexture implementation structure (extends IWineD3DBaseTextureImpl)
@@ -1757,6 +1823,9 @@ typedef struct IWineD3DTextureImpl
extern const IWineD3DTextureVtbl IWineD3DTexture_Vtbl;
+HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT levels,
+ IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent);
+
/*****************************************************************************
* IWineD3DCubeTexture implementation structure (extends IWineD3DBaseTextureImpl)
*/
@@ -1773,6 +1842,9 @@ typedef struct IWineD3DCubeTextureImpl
extern const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl;
+HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UINT levels,
+ IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent);
+
typedef struct _WINED3DVOLUMET_DESC
{
UINT Width;
@@ -1819,6 +1891,9 @@ typedef struct IWineD3DVolumeTextureImpl
extern const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl;
+HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT height, UINT depth, UINT levels,
+ IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent);
+
typedef struct _WINED3DSURFACET_DESC
{
WINED3DMULTISAMPLE_TYPE MultiSampleType;
@@ -1889,21 +1964,23 @@ struct IWineD3DSurfaceImpl
UINT pow2Height;
/* A method to retrieve the drawable size. Not in the Vtable to make it changeable */
- void (*get_drawable_size)(IWineD3DSurfaceImpl *This, UINT *width, UINT *height);
+ void (*get_drawable_size)(struct wined3d_context *context, UINT *width, UINT *height);
/* Oversized texture */
RECT glRect;
/* PBO */
GLuint pbo;
+ GLuint texture_name;
+ GLuint texture_name_srgb;
+ GLint texture_level;
+ GLenum texture_target;
RECT lockedRect;
RECT dirtyRect;
int lockCount;
#define MAXLOCKCOUNT 50 /* After this amount of locks do not free the sysmem copy */
- glDescriptor glDescription;
-
/* For GetDC */
wineD3DSurface_DIB dib;
HDC hDC;
@@ -1934,6 +2011,13 @@ struct IWineD3DSurfaceImpl
extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl;
extern const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl;
+UINT surface_calculate_size(const struct GlPixelFormatDesc *format_desc, UINT alignment, UINT width, UINT height);
+void surface_gdi_cleanup(IWineD3DSurfaceImpl *This);
+HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment,
+ UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type,
+ UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format,
+ WINED3DPOOL pool, IUnknown *parent);
+
/* Predeclare the shared Surface functions */
HRESULT WINAPI IWineD3DBaseSurfaceImpl_QueryInterface(IWineD3DSurface *iface, REFIID riid, LPVOID *ppobj);
ULONG WINAPI IWineD3DBaseSurfaceImpl_AddRef(IWineD3DSurface *iface);
@@ -1974,10 +2058,10 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DL
void WINAPI IWineD3DBaseSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb);
const void *WINAPI IWineD3DBaseSurfaceImpl_GetData(IWineD3DSurface *iface);
-void get_drawable_size_swapchain(IWineD3DSurfaceImpl *This, UINT *width, UINT *height);
-void get_drawable_size_backbuffer(IWineD3DSurfaceImpl *This, UINT *width, UINT *height);
-void get_drawable_size_pbuffer(IWineD3DSurfaceImpl *This, UINT *width, UINT *height);
-void get_drawable_size_fbo(IWineD3DSurfaceImpl *This, UINT *width, UINT *height);
+void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height);
+void get_drawable_size_backbuffer(struct wined3d_context *context, UINT *width, UINT *height);
+void get_drawable_size_pbuffer(struct wined3d_context *context, UINT *width, UINT *height);
+void get_drawable_size_fbo(struct wined3d_context *context, UINT *width, UINT *height);
void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back);
@@ -2060,6 +2144,9 @@ typedef enum {
CONVERT_G16R16,
CONVERT_R16G16F,
CONVERT_R32G32F,
+ CONVERT_D15S1,
+ CONVERT_D24X4S4,
+ CONVERT_D24FS8,
} CONVERT_TYPES;
HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, GLenum *format, GLenum *internal, GLenum *type, CONVERT_TYPES *convert, int *target_bpp, BOOL srgb_mode);
@@ -2276,7 +2363,7 @@ typedef struct IWineD3DQueryImpl
{
const IWineD3DQueryVtbl *lpVtbl;
LONG ref; /* Note: Ref counting not required */
-
+
IUnknown *parent;
/*TODO: replace with iface usage */
#if 0
@@ -2290,25 +2377,12 @@ typedef struct IWineD3DQueryImpl
WINED3DQUERYTYPE type;
/* TODO: Think about using a IUnknown instead of a void* */
void *extendedData;
-
-
} IWineD3DQueryImpl;
extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl;
extern const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl;
extern const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl;
-/* Datastructures for IWineD3DQueryImpl.extendedData */
-typedef struct WineQueryOcclusionData {
- GLuint queryId;
- WineD3DContext *ctx;
-} WineQueryOcclusionData;
-
-typedef struct WineQueryEventData {
- GLuint fenceId;
- WineD3DContext *ctx;
-} WineQueryEventData;
-
/* IWineD3DBuffer */
/* TODO: Add tests and support for FLOAT16_4 POSITIONT, D3DCOLOR position, other
@@ -2357,7 +2431,7 @@ struct wined3d_buffer
extern const IWineD3DBufferVtbl wined3d_buffer_vtbl;
const BYTE *buffer_get_memory(IWineD3DBuffer *iface, UINT offset, GLuint *buffer_object);
-const BYTE *buffer_get_sysmem(struct wined3d_buffer *This);
+BYTE *buffer_get_sysmem(struct wined3d_buffer *This);
/* IWineD3DRendertargetView */
struct wined3d_rendertarget_view
@@ -2395,7 +2469,7 @@ typedef struct IWineD3DSwapChainImpl
long prev_time, frames; /* Performance tracking */
unsigned int vSyncCounter;
- WineD3DContext **context; /* Later a array for multithreading */
+ struct wined3d_context **context;
unsigned int num_contexts;
HWND win_handle;
@@ -2418,10 +2492,12 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetPresentParameters(IWineD3DSwapChain
HRESULT WINAPI IWineD3DBaseSwapChainImpl_SetGammaRamp(IWineD3DSwapChain *iface, DWORD Flags, CONST WINED3DGAMMARAMP *pRamp);
HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetGammaRamp(IWineD3DSwapChain *iface, WINED3DGAMMARAMP *pRamp);
-WineD3DContext *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface);
+struct wined3d_context *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface);
+
+#define DEFAULT_REFRESH_RATE 0
/*****************************************************************************
- * Utility function prototypes
+ * Utility function prototypes
*/
/* Trace routines */
@@ -2453,19 +2529,18 @@ GLenum CompareFunc(DWORD func);
BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3);
void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst);
void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, BOOL transformed, DWORD coordtype, BOOL ffp_can_disable_proj);
-void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context);
-void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context);
-void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context);
-void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context);
-void state_fogcolor(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context);
-void state_fogdensity(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context);
-void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context);
-void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context);
+void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context);
+void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context);
+void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context);
+void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context);
+void state_fogcolor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context);
+void state_fogdensity(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context);
+void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context);
+void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context);
void surface_add_dirty_rect(IWineD3DSurface *iface, const RECT *dirty_rect);
-void surface_force_reload(IWineD3DSurface *iface);
GLenum surface_get_gl_buffer(IWineD3DSurface *iface, IWineD3DSwapChain *swapchain);
-void surface_load_ds_location(IWineD3DSurface *iface, DWORD location);
+void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *context, DWORD location);
void surface_modify_ds_location(IWineD3DSurface *iface, DWORD location);
void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int width, unsigned int height);
void surface_set_texture_name(IWineD3DSurface *iface, GLuint name, BOOL srgb_name);
@@ -2500,8 +2575,8 @@ typedef struct SHADER_LIMITS {
unsigned int label;
} SHADER_LIMITS;
-/** Keeps track of details for TEX_M#x# shader opcodes which need to
- maintain state information between multiple codes */
+/* Keeps track of details for TEX_M#x# shader opcodes which need to
+ * maintain state information between multiple codes */
typedef struct SHADER_PARSE_STATE {
unsigned int current_row;
DWORD texcoord_w[2];
@@ -2513,12 +2588,9 @@ typedef struct SHADER_PARSE_STATE {
#define PRINTF_ATTR(fmt,args)
#endif
-/* Base Shader utility functions.
- * (may move callers into the same file in the future) */
-extern int shader_addline(
- SHADER_BUFFER* buffer,
- const char* fmt, ...) PRINTF_ATTR(2,3);
-int shader_vaddline(SHADER_BUFFER *buffer, const char *fmt, va_list args);
+/* Base Shader utility functions. */
+int shader_addline(struct wined3d_shader_buffer *buffer, const char *fmt, ...) PRINTF_ATTR(2,3);
+int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *fmt, va_list args);
/* Vertex shader utility functions */
extern BOOL vshader_get_input(
@@ -2566,19 +2638,23 @@ typedef struct IWineD3DBaseShaderImpl {
IWineD3DBaseShaderClass baseShader;
} IWineD3DBaseShaderImpl;
-void shader_buffer_init(struct SHADER_BUFFER *buffer);
-void shader_buffer_free(struct SHADER_BUFFER *buffer);
+void shader_buffer_clear(struct wined3d_shader_buffer *buffer);
+BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer);
+void shader_buffer_free(struct wined3d_shader_buffer *buffer);
void shader_cleanup(IWineD3DBaseShader *iface);
void shader_dump_src_param(const struct wined3d_shader_src_param *param,
const struct wined3d_shader_version *shader_version);
void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
const struct wined3d_shader_version *shader_version);
-void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER *buffer,
- const shader_reg_maps *reg_maps, const DWORD *pFunction);
+unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max);
+void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer,
+ const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx);
HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe,
- struct shader_reg_maps *reg_maps, struct wined3d_shader_semantic *semantics_in,
- struct wined3d_shader_semantic *semantics_out, const DWORD *byte_code, DWORD constf_size);
+ struct shader_reg_maps *reg_maps, struct wined3d_shader_attribute *attributes,
+ struct wined3d_shader_signature_element *input_signature,
+ struct wined3d_shader_signature_element *output_signature, const DWORD *byte_code, DWORD constf_size);
void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDevice *device);
+BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage);
const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token);
void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *pFunction);
@@ -2647,14 +2723,8 @@ static inline BOOL shader_constant_is_local(IWineD3DBaseShaderImpl* This, DWORD
/*****************************************************************************
* IDirect3DVertexShader implementation structures
*/
-
-struct vs_compiled_shader {
- struct vs_compile_args args;
- GLuint prgId;
-};
-
typedef struct IWineD3DVertexShaderImpl {
- /* IUnknown parts*/
+ /* IUnknown parts */
const IWineD3DVertexShaderVtbl *lpVtbl;
/* IWineD3DBaseShader */
@@ -2666,31 +2736,40 @@ typedef struct IWineD3DVertexShaderImpl {
DWORD usage;
/* The GL shader */
- struct vs_compiled_shader *gl_shaders;
- UINT num_gl_shaders, shader_array_size;
+ void *backend_priv;
/* Vertex shader input and output semantics */
- struct wined3d_shader_semantic semantics_in[MAX_ATTRIBS];
- struct wined3d_shader_semantic semantics_out[MAX_REG_OUTPUT];
+ struct wined3d_shader_attribute attributes[MAX_ATTRIBS];
+ struct wined3d_shader_signature_element output_signature[MAX_REG_OUTPUT];
UINT min_rel_offset, max_rel_offset;
UINT rel_offset;
UINT recompile_count;
-
- const struct vs_compile_args *cur_args;
} IWineD3DVertexShaderImpl;
extern const IWineD3DVertexShaderVtbl IWineD3DVertexShader_Vtbl;
void find_vs_compile_args(IWineD3DVertexShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, struct vs_compile_args *args);
-GLuint find_gl_vshader(IWineD3DVertexShaderImpl *shader, const struct vs_compile_args *args);
/*****************************************************************************
* IDirect3DPixelShader implementation structure
*/
-struct ps_compiled_shader {
- struct ps_compile_args args;
- GLuint prgId;
+
+/* Using additional shader constants (uniforms in GLSL / program environment
+ * or local parameters in ARB) is costly:
+ * ARB only knows float4 parameters and GLSL compiler are not really smart
+ * when it comes to efficiently pack float2 uniforms, so no space is wasted
+ * (in fact most compilers map a float2 to a full float4 uniform).
+ *
+ * For NP2 texcoord fixup we only need 2 floats (width and height) for each
+ * 2D texture used in the shader. We therefore pack fixup info for 2 textures
+ * into a single shader constant (uniform / program parameter).
+ *
+ * This structure is shared between the GLSL and the ARB backend.*/
+struct ps_np2fixup_info {
+ unsigned char idx[MAX_FRAGMENT_SAMPLERS]; /* indices to the real constant */
+ WORD active; /* bitfield indicating if we can apply the fixup */
+ WORD num_consts;
};
typedef struct IWineD3DPixelShaderImpl {
@@ -2704,34 +2783,32 @@ typedef struct IWineD3DPixelShaderImpl {
IUnknown *parent;
/* Pixel shader input semantics */
- struct wined3d_shader_semantic semantics_in[MAX_REG_INPUT];
+ struct wined3d_shader_signature_element input_signature[MAX_REG_INPUT];
DWORD input_reg_map[MAX_REG_INPUT];
BOOL input_reg_used[MAX_REG_INPUT];
- int declared_in_count;
+ unsigned int declared_in_count;
/* The GL shader */
- struct ps_compiled_shader *gl_shaders;
- UINT num_gl_shaders, shader_array_size;
+ void *backend_priv;
/* Some information about the shader behavior */
- struct stb_const_desc bumpenvmatconst[MAX_TEXTURES];
- unsigned char numbumpenvmatconsts;
- struct stb_const_desc luminanceconst[MAX_TEXTURES];
char vpos_uniform;
- const struct ps_compile_args *cur_args;
+ BOOL color0_mov;
+ DWORD color0_reg;
+
} IWineD3DPixelShaderImpl;
extern const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl;
-GLuint find_gl_pshader(IWineD3DPixelShaderImpl *shader, const struct ps_compile_args *args);
+void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, IWineD3DBaseTexture * const *textures);
void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, struct ps_compile_args *args);
/* sRGB correction constants */
-static const float srgb_cmp = 0.0031308;
-static const float srgb_mul_low = 12.92;
-static const float srgb_pow = 0.41666;
-static const float srgb_mul_high = 1.055;
-static const float srgb_sub_high = 0.055;
+static const float srgb_cmp = 0.0031308f;
+static const float srgb_mul_low = 12.92f;
+static const float srgb_pow = 0.41666f;
+static const float srgb_mul_high = 1.055f;
+static const float srgb_sub_high = 0.055f;
/*****************************************************************************
* IWineD3DPalette implementation structure
@@ -2771,6 +2848,8 @@ extern WINED3DFORMAT pixelformat_for_depth(DWORD depth);
#define WINED3DFMT_FLAG_STENCIL 0x8
#define WINED3DFMT_FLAG_RENDERTARGET 0x10
#define WINED3DFMT_FLAG_FOURCC 0x20
+#define WINED3DFMT_FLAG_FBO_ATTACHABLE 0x40
+#define WINED3DFMT_FLAG_COMPRESSED 0x80
struct GlPixelFormatDesc
{
@@ -2783,6 +2862,10 @@ struct GlPixelFormatDesc
WORD depth_size;
WORD stencil_size;
+ UINT block_width;
+ UINT block_height;
+ UINT block_byte_count;
+
enum wined3d_ffp_emit_idx emit_idx;
GLint component_count;
GLenum gl_vtx_type;
@@ -2800,12 +2883,16 @@ struct GlPixelFormatDesc
struct color_fixup_desc color_fixup;
};
-const struct GlPixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt, const WineD3D_GL_Info *gl_info);
+const struct GlPixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt, const struct wined3d_gl_info *gl_info);
static inline BOOL use_vs(IWineD3DStateBlockImpl *stateblock)
{
+ /* Check stateblock->vertexDecl to allow this to be used from
+ * IWineD3DDeviceImpl_FindTexUnitMap(). This is safe because
+ * stateblock->vertexShader implies a vertex declaration instead of ddraw
+ * style strided data. */
return (stateblock->vertexShader
- && !stateblock->wineD3DDevice->strided_streams.position_transformed
+ && !((IWineD3DVertexDeclarationImpl *)stateblock->vertexDecl)->position_transformed
&& stateblock->wineD3DDevice->vs_selected_mode != SHADER_NONE);
}
@@ -2817,4 +2904,8 @@ static inline BOOL use_ps(IWineD3DStateBlockImpl *stateblock)
void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED3DRECT *src_rect,
IWineD3DSurface *dst_surface, WINED3DRECT *dst_rect, const WINED3DTEXTUREFILTERTYPE filter, BOOL flip);
+
+/* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */
+#define WINED3D_OPENGL_WINDOW_CLASS_NAME "WineD3D_OpenGL"
+
#endif
diff --git a/reactos/dll/ntdll/def/ntdll_arm.def b/reactos/dll/ntdll/def/ntdll_arm.def
index 82d770cf5e7..ba07f9a5885 100644
--- a/reactos/dll/ntdll/def/ntdll_arm.def
+++ b/reactos/dll/ntdll/def/ntdll_arm.def
@@ -622,7 +622,7 @@ RtlQueueWorkItem
RtlRaiseException
RtlRaiseStatus
RtlRandom
-RtlRandomEx=RtlRandom
+RtlRandomEx
RtlReAllocateHeap
RtlRealPredecessor
RtlRealSuccessor
diff --git a/reactos/dll/ntdll/def/ntdll_i386.def b/reactos/dll/ntdll/def/ntdll_i386.def
index 974dac61d05..9e3bc7ec3df 100644
--- a/reactos/dll/ntdll/def/ntdll_i386.def
+++ b/reactos/dll/ntdll/def/ntdll_i386.def
@@ -827,7 +827,7 @@ RtlQueueWorkItem@12
RtlRaiseException@4
RtlRaiseStatus@4
RtlRandom@4
-RtlRandomEx=RtlRandom@4
+RtlRandomEx@4
RtlReAllocateHeap@16
;RtlReadMemoryStream
;RtlReadOutOfProcessMemoryStream
diff --git a/reactos/dll/win32/aclui/guid.c b/reactos/dll/win32/aclui/guid.c
index 791f78ed154..6bc4a38ecd9 100644
--- a/reactos/dll/win32/aclui/guid.c
+++ b/reactos/dll/win32/aclui/guid.c
@@ -24,8 +24,4 @@
#include
#include
-#ifdef _MSC_VER
-#include
-#endif
-
/* NO CODE HERE, THIS IS JUST REQUIRED FOR THE GUID DEFINITIONS */
diff --git a/reactos/dll/win32/advapi32/advapi32.h b/reactos/dll/win32/advapi32/advapi32.h
index 93e491fc674..97a7858ed98 100644
--- a/reactos/dll/win32/advapi32/advapi32.h
+++ b/reactos/dll/win32/advapi32/advapi32.h
@@ -11,6 +11,7 @@
/* INCLUDES ******************************************************************/
/* C Headers */
+#include
#include
/* PSDK/NDK Headers */
diff --git a/reactos/dll/win32/advapi32/advapi32.spec b/reactos/dll/win32/advapi32/advapi32.spec
index a3a9e1ef83a..624cf664152 100644
--- a/reactos/dll/win32/advapi32/advapi32.spec
+++ b/reactos/dll/win32/advapi32/advapi32.spec
@@ -101,8 +101,8 @@
@ stub CreateProcessWithLogonW #(wstr wstr wstr long wstr wstr long ptr wstr ptr ptr)
@ stdcall CreateProcessWithTokenW(ptr long wstr wstr long ptr wstr ptr ptr)
@ stdcall CreateRestrictedToken(long long long ptr long ptr long ptr ptr)
-@ stdcall CreateServiceA(long ptr ptr long long long long ptr ptr ptr ptr ptr ptr)
-@ stdcall CreateServiceW(long ptr ptr long long long long ptr ptr ptr ptr ptr ptr)
+@ stdcall CreateServiceA(long str str long long long long str str ptr str str str)
+@ stdcall CreateServiceW(long wstr wstr long long long long wstr wstr ptr wstr wstr wstr)
@ stub CreateTraceInstanceId
@ stdcall CreateWellKnownSid(long ptr ptr ptr)
@ stdcall CredDeleteA(str long long)
diff --git a/reactos/dll/win32/advapi32/crypt/crypt.c b/reactos/dll/win32/advapi32/crypt/crypt.c
index d3e3cd578ba..19b85b7c5d8 100644
--- a/reactos/dll/win32/advapi32/crypt/crypt.c
+++ b/reactos/dll/win32/advapi32/crypt/crypt.c
@@ -1192,9 +1192,6 @@ BOOL WINAPI CryptEnumProvidersA (DWORD dwIndex, DWORD *pdwReserved,
TRACE("(%ld, %p, %08ld, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
pdwProvType, pszProvName, pcbProvName);
- if (*pcbProvName > INT_MAX)
- *pcbProvName = INT_MAX;
-
if(!CryptEnumProvidersW(dwIndex, pdwReserved, dwFlags, pdwProvType, NULL, &bufsize))
return FALSE;
if ( pszProvName && !(str = CRYPT_Alloc(bufsize)) )
@@ -1317,9 +1314,6 @@ BOOL WINAPI CryptEnumProviderTypesA (DWORD dwIndex, DWORD *pdwReserved,
TRACE("(%ld, %p, %08ld, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
pdwProvType, pszTypeName, pcbTypeName);
- if (*pcbTypeName > INT_MAX)
- *pcbTypeName = INT_MAX;
-
if(!CryptEnumProviderTypesW(dwIndex, pdwReserved, dwFlags, pdwProvType, NULL, &bufsize))
return FALSE;
if ( pszTypeName && !(str = CRYPT_Alloc(bufsize)) )
@@ -1519,9 +1513,6 @@ BOOL WINAPI CryptGetDefaultProviderA (DWORD dwProvType, DWORD *pdwReserved,
TRACE("(%d, %p, %08x, %p, %p)\n", dwProvType, pdwReserved, dwFlags, pszProvName, pcbProvName);
- if (*pcbProvName > INT_MAX)
- *pcbProvName = INT_MAX;
-
CryptGetDefaultProviderW(dwProvType, pdwReserved, dwFlags, NULL, &bufsize);
if ( pszProvName && !(str = CRYPT_Alloc(bufsize)) )
{
diff --git a/reactos/dll/win32/advapi32/reg/reg.c b/reactos/dll/win32/advapi32/reg/reg.c
index 71ff1dc0806..a090cbf5838 100644
--- a/reactos/dll/win32/advapi32/reg/reg.c
+++ b/reactos/dll/win32/advapi32/reg/reg.c
@@ -4104,7 +4104,7 @@ RegQueryValueExW(HKEY hkeyorg,
static const int info_size = offsetof( KEY_VALUE_PARTIAL_INFORMATION, Data );
TRACE("(%p,%s,%p,%p,%p,%p=%d)\n",
- hkey, debugstr_w(name), reserved, type, data, count,
+ hkeyorg, debugstr_w(name), reserved, type, data, count,
(count && data) ? *count : 0 );
if ((data && !count) || reserved) return ERROR_INVALID_PARAMETER;
@@ -4885,7 +4885,7 @@ RegSetValueA(HKEY hKeyOriginal,
DWORD ret;
NTSTATUS Status;
- TRACE("(%p,%s,%d,%s,%d)\n", hKey, debugstr_a(lpSubKey), dwType, debugstr_a(lpData), cbData );
+ TRACE("(%p,%s,%d,%s,%d)\n", hKeyOriginal, debugstr_a(lpSubKey), dwType, debugstr_a(lpData), cbData );
if (dwType != REG_SZ || !lpData) return ERROR_INVALID_PARAMETER;
diff --git a/reactos/dll/win32/advapi32/service/rpc.c b/reactos/dll/win32/advapi32/service/rpc.c
index 8f73560028e..2ee75ab508e 100644
--- a/reactos/dll/win32/advapi32/service/rpc.c
+++ b/reactos/dll/win32/advapi32/service/rpc.c
@@ -12,7 +12,7 @@
void __RPC_FAR * __RPC_USER
-midl_user_allocate(size_t len)
+midl_user_allocate(SIZE_T len)
{
return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
}
diff --git a/reactos/dll/win32/avifil32/avifile_Lt.rc b/reactos/dll/win32/avifil32/avifile_Lt.rc
new file mode 100644
index 00000000000..ca93ba6ad2d
--- /dev/null
+++ b/reactos/dll/win32/avifil32/avifile_Lt.rc
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "avifile_private.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Glaudinimo parametrai"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Pasirinkite srautą:",-1,2,5,154,10
+ COMBOBOX IDC_STREAM,2,18,154,61,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ PUSHBUTTON "&Parinktys...",IDC_OPTIONS,170,17,50,14
+ AUTOCHECKBOX "&Įtarpuoti kas",IDC_INTERLEAVE,3,42,85,11,WS_TABSTOP
+ EDITTEXT IDC_INTERLEAVEEVERY,91,41,32,12,ES_AUTOHSCROLL
+ LTEXT "kadrų",-1,129,43,36,9
+ LTEXT "Dabartinis formatas:",-1,3,56,73,9
+ LTEXT "Ši vieta išnuomojama",IDC_FORMATTEXT,75,56,90,26
+ DEFPUSHBUTTON "Gerai",IDOK,170,42,50,14
+ PUSHBUTTON "Atsisakyti",IDCANCEL,170,61,50,14
+END
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_WAVESTREAMFORMAT "Bangos forma: %s"
+ IDS_WAVEFILETYPE "Bangos forma"
+ IDS_ALLMULTIMEDIA "Visi multimedijos failai"
+ IDS_ALLFILES "Visi failai (*.*)@*.*"
+ IDS_VIDEO "vaizdas"
+ IDS_AUDIO "garsas"
+ IDS_AVISTREAMFORMAT "%s %s #%d"
+ IDS_AVIFILETYPE "Wine numatyta-AVI-doroklė"
+ IDS_UNCOMPRESSED "neglaudintas"
+}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/avifil32/avifile_Ro.rc b/reactos/dll/win32/avifil32/avifile_Ro.rc
new file mode 100644
index 00000000000..1e5d710b8c8
--- /dev/null
+++ b/reactos/dll/win32/avifil32/avifile_Ro.rc
@@ -0,0 +1,58 @@
+/*
+ * avifil32.dll (Romanian resources)
+ *
+ * Copyright 2009 Paul Chitescu
+ *
+ * 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 "avifile_private.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+
+IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Opțiuni de compresie"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Alegeți un flux:",-1,2,5,154,10
+ COMBOBOX IDC_STREAM,2,18,154,61,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ PUSHBUTTON "&Opțiuni...",IDC_OPTIONS,170,17,50,14
+ AUTOCHECKBOX "Ȋ&ntrețese fiecare",IDC_INTERLEAVE,3,42,85,11,WS_TABSTOP
+ EDITTEXT IDC_INTERLEAVEEVERY,91,41,32,12,ES_AUTOHSCROLL
+ LTEXT "cadre",-1,129,43,36,9
+ LTEXT "Formatul curent:",-1,3,56,73,9
+ LTEXT "This space for rent",IDC_FORMATTEXT,75,56,90,26
+ DEFPUSHBUTTON "OK",IDOK,170,42,50,14
+ PUSHBUTTON "Renunță",IDCANCEL,170,61,50,14
+END
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_WAVESTREAMFORMAT "Forma de undă: %s"
+ IDS_WAVEFILETYPE "Formă de undă"
+ IDS_ALLMULTIMEDIA "Toate fișierele multimedia"
+ IDS_ALLFILES "Toate fișierele (*.*)@*.*"
+ IDS_VIDEO "video"
+ IDS_AUDIO "audio"
+ IDS_AVISTREAMFORMAT "%s %s #%d"
+ IDS_AVIFILETYPE "Tratare implicită Wine pentru AVI"
+ IDS_UNCOMPRESSED "necomprimat"
+}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/avifil32/avifile_private.h b/reactos/dll/win32/avifil32/avifile_private.h
index db31bd497cf..0cff6ad56b9 100644
--- a/reactos/dll/win32/avifil32/avifile_private.h
+++ b/reactos/dll/win32/avifil32/avifile_private.h
@@ -19,6 +19,9 @@
#ifndef __AVIFILE_PRIVATE_H
#define __AVIFILE_PRIVATE_H
+#include
+#include
+
#ifndef MAX_AVISTREAMS
#define MAX_AVISTREAMS 8
#endif
diff --git a/reactos/dll/win32/avifil32/rsrc.rc b/reactos/dll/win32/avifil32/rsrc.rc
index 68fbab3e5bc..e4363a7d7cb 100644
--- a/reactos/dll/win32/avifil32/rsrc.rc
+++ b/reactos/dll/win32/avifil32/rsrc.rc
@@ -48,10 +48,12 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#include "avifile_It.rc"
#include "avifile_Ja.rc"
#include "avifile_Ko.rc"
+#include "avifile_Lt.rc"
#include "avifile_Nl.rc"
#include "avifile_No.rc"
#include "avifile_Pl.rc"
#include "avifile_Pt.rc"
+#include "avifile_Ro.rc"
#include "avifile_Ru.rc"
#include "avifile_Si.rc"
#include "avifile_Sv.rc"
diff --git a/reactos/dll/win32/bcrypt/bcrypt.rbuild b/reactos/dll/win32/bcrypt/bcrypt.rbuild
new file mode 100644
index 00000000000..5d497336e75
--- /dev/null
+++ b/reactos/dll/win32/bcrypt/bcrypt.rbuild
@@ -0,0 +1,10 @@
+
+
+ .
+ include/reactos/wine
+
+ wine
+ kernel32
+ bcrypt_main.c
+ version.rc
+
diff --git a/reactos/dll/win32/bcrypt/bcrypt.spec b/reactos/dll/win32/bcrypt/bcrypt.spec
new file mode 100644
index 00000000000..7d85e124e08
--- /dev/null
+++ b/reactos/dll/win32/bcrypt/bcrypt.spec
@@ -0,0 +1,58 @@
+@ stub BCryptAddContextFunction
+@ stub BCryptAddContextFunctionProvider
+@ stub BCryptCloseAlgorithmProvider
+@ stub BCryptConfigureContext
+@ stub BCryptConfigureContextFunction
+@ stub BCryptCreateContext
+@ stub BCryptCreateHash
+@ stub BCryptDecrypt
+@ stub BCryptDeleteContext
+@ stub BCryptDeriveKey
+@ stub BCryptDestroyHash
+@ stub BCryptDestroyKey
+@ stub BCryptDestroySecret
+@ stub BCryptDuplicateHash
+@ stub BCryptDuplicateKey
+@ stub BCryptEncrypt
+@ stub BCryptEnumAlgorithms
+@ stub BCryptEnumContextFunctionProviders
+@ stub BCryptEnumContextFunctions
+@ stub BCryptEnumContexts
+@ stub BCryptEnumProviders
+@ stub BCryptEnumRegisteredProviders
+@ stub BCryptExportKey
+@ stub BCryptFinalizeKeyPair
+@ stub BCryptFinishHash
+@ stub BCryptFreeBuffer
+@ stub BCryptGenRandom
+@ stub BCryptGenerateKeyPair
+@ stub BCryptGenerateSymmetricKey
+@ stub BCryptGetFipsAlgorithmMode
+@ stub BCryptGetProperty
+@ stub BCryptHashData
+@ stub BCryptImportKey
+@ stub BCryptImportKeyPair
+@ stub BCryptOpenAlgorithmProvider
+@ stub BCryptQueryContextConfiguration
+@ stub BCryptQueryContextFunctionConfiguration
+@ stub BCryptQueryContextFunctionProperty
+@ stub BCryptQueryProviderRegistration
+@ stub BCryptRegisterConfigChangeNotify
+@ stub BCryptRegisterProvider
+@ stub BCryptRemoveContextFunction
+@ stub BCryptRemoveContextFunctionProvider
+@ stub BCryptResolveProviders
+@ stub BCryptSecretAgreement
+@ stub BCryptSetAuditingInterface
+@ stub BCryptSetContextFunctionProperty
+@ stub BCryptSetProperty
+@ stub BCryptSignHash
+@ stub BCryptUnregisterConfigChangeNotify
+@ stub BCryptUnregisterProvider
+@ stub BCryptVerifySignature
+@ stub GetAsymmetricEncryptionInterface
+@ stub GetCipherInterface
+@ stub GetHashInterface
+@ stub GetRngInterface
+@ stub GetSecretAgreementInterface
+@ stub GetSignatureInterface
diff --git a/reactos/base/applications/write/lang/sl-SI.rc b/reactos/dll/win32/bcrypt/bcrypt_main.c
similarity index 63%
rename from reactos/base/applications/write/lang/sl-SI.rc
rename to reactos/dll/win32/bcrypt/bcrypt_main.c
index d7e2226a0ca..abe97503045 100644
--- a/reactos/base/applications/write/lang/sl-SI.rc
+++ b/reactos/dll/win32/bcrypt/bcrypt_main.c
@@ -1,7 +1,5 @@
/*
- * Slovenian language support
- *
- * Copyright (C) 2008 Rok Mandeljc
+ * Copyright 2009 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
@@ -16,15 +14,27 @@
* 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
+ *
*/
-LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
+#include "config.h"
+#include "wine/port.h"
+#include "wine/debug.h"
-#pragma code_page(65001)
+#include "winbase.h"
-STRINGTABLE
+WINE_DEFAULT_DEBUG_CHANNEL(bcrypt);
+
+BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
{
- IDS_FAILED, "Zagon programa Wordpad ni uspel"
-}
+ TRACE("fdwReason %u\n", fdwReason);
-#pragma code_page(default)
+ switch(fdwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(hInstDLL);
+ break;
+ }
+
+ return TRUE;
+}
diff --git a/reactos/dll/win32/bcrypt/version.rc b/reactos/dll/win32/bcrypt/version.rc
new file mode 100644
index 00000000000..54253a92bca
--- /dev/null
+++ b/reactos/dll/win32/bcrypt/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2009 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine Crypto Library"
+#define WINE_FILENAME_STR "bcrypt.dll"
+#define WINE_FILEVERSION 6,0,6000,16386
+#define WINE_FILEVERSION_STR "6.0.6000.16386"
+#define WINE_PRODUCTVERSION 6,0,6000,16386
+#define WINE_PRODUCTVERSION_STR "6.0.6000.16386"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/win32/beepmidi/beepmidi.c b/reactos/dll/win32/beepmidi/beepmidi.c
index 9b986b88596..57facf365c4 100644
--- a/reactos/dll/win32/beepmidi/beepmidi.c
+++ b/reactos/dll/win32/beepmidi/beepmidi.c
@@ -142,11 +142,13 @@ ProcessPlayingNotes(
while ( ( node != NULL ) && ( arp_notes <= POLYPHONY ) )
{
- DPRINT("playing..\n");
BEEP_SET_PARAMETERS beep_data;
DWORD actually_playing = 0;
double frequency = node->note;
+
+ DPRINT("playing..\n");
+
frequency = frequency / 12;
frequency = pow(2, frequency);
frequency = 8.1758 * frequency;
@@ -481,10 +483,10 @@ PlayNote(
{
HANDLE heap = GetProcessHeap();
- DPRINT("PlayNote\n");
-
NoteNode* node;
+ DPRINT("PlayNote\n");
+
if ( velocity == 0 )
{
DPRINT("Zero velocity\n");
@@ -757,8 +759,8 @@ ProcessLongMidiMessage(
Exported function that receives messages from WINMM (the MME API.)
*/
-FAR PASCAL
MMRESULT
+FAR PASCAL
modMessage(
UINT device_id,
UINT message,
@@ -839,7 +841,8 @@ modMessage(
Driver entrypoint.
*/
-FAR PASCAL LONG
+LONG
+FAR PASCAL
DriverProc(
DWORD driver_id,
HDRVR driver_handle,
diff --git a/reactos/dll/win32/comctl32/comboex.c b/reactos/dll/win32/comctl32/comboex.c
index 04464fd94a8..1484ba87f1d 100644
--- a/reactos/dll/win32/comctl32/comboex.c
+++ b/reactos/dll/win32/comctl32/comboex.c
@@ -174,7 +174,7 @@ static void COMBOEX_DumpInput (COMBOBOXEXITEMW const *input)
}
-static inline CBE_ITEMDATA *get_item_data(COMBOEX_INFO *infoPtr, INT index)
+static inline CBE_ITEMDATA *get_item_data(const COMBOEX_INFO *infoPtr, INT index)
{
return (CBE_ITEMDATA *)SendMessageW (infoPtr->hwndCombo, CB_GETITEMDATA,
(WPARAM)index, 0);
@@ -185,7 +185,7 @@ static inline cmp_func_t get_cmp_func(COMBOEX_INFO const *infoPtr)
return infoPtr->dwExtStyle & CBES_EX_CASESENSITIVE ? lstrcmpW : lstrcmpiW;
}
-static INT COMBOEX_Notify (COMBOEX_INFO *infoPtr, INT code, NMHDR *hdr)
+static INT COMBOEX_Notify (const COMBOEX_INFO *infoPtr, INT code, NMHDR *hdr)
{
hdr->idFrom = GetDlgCtrlID (infoPtr->hwndSelf);
hdr->hwndFrom = infoPtr->hwndSelf;
@@ -198,7 +198,7 @@ static INT COMBOEX_Notify (COMBOEX_INFO *infoPtr, INT code, NMHDR *hdr)
static INT
-COMBOEX_NotifyItem (COMBOEX_INFO *infoPtr, UINT code, NMCOMBOBOXEXW *hdr)
+COMBOEX_NotifyItem (const COMBOEX_INFO *infoPtr, UINT code, NMCOMBOBOXEXW *hdr)
{
/* Change the Text item from Unicode to ANSI if necessary for NOTIFY */
if (infoPtr->NtfUnicode)
@@ -234,7 +234,7 @@ COMBOEX_NotifyItem (COMBOEX_INFO *infoPtr, UINT code, NMCOMBOBOXEXW *hdr)
}
-static INT COMBOEX_NotifyEndEdit (COMBOEX_INFO *infoPtr, NMCBEENDEDITW *neew, LPCWSTR wstr)
+static INT COMBOEX_NotifyEndEdit (const COMBOEX_INFO *infoPtr, NMCBEENDEDITW *neew, LPCWSTR wstr)
{
/* Change the Text item from Unicode to ANSI if necessary for NOTIFY */
if (infoPtr->NtfUnicode) {
@@ -254,7 +254,7 @@ static INT COMBOEX_NotifyEndEdit (COMBOEX_INFO *infoPtr, NMCBEENDEDITW *neew, LP
}
-static void COMBOEX_NotifyDragBegin(COMBOEX_INFO *infoPtr, LPCWSTR wstr)
+static void COMBOEX_NotifyDragBegin(const COMBOEX_INFO *infoPtr, LPCWSTR wstr)
{
/* Change the Text item from Unicode to ANSI if necessary for NOTIFY */
if (infoPtr->NtfUnicode) {
@@ -303,7 +303,7 @@ static INT COMBOEX_GetIndex(COMBOEX_INFO const *infoPtr, CBE_ITEMDATA const *ite
}
-static LPCWSTR COMBOEX_GetText(COMBOEX_INFO *infoPtr, CBE_ITEMDATA *item)
+static LPCWSTR COMBOEX_GetText(const COMBOEX_INFO *infoPtr, CBE_ITEMDATA *item)
{
NMCOMBOBOXEXW nmce;
LPWSTR text, buf;
@@ -340,7 +340,7 @@ static LPCWSTR COMBOEX_GetText(COMBOEX_INFO *infoPtr, CBE_ITEMDATA *item)
}
-static void COMBOEX_GetComboFontSize (COMBOEX_INFO *infoPtr, SIZE *size)
+static void COMBOEX_GetComboFontSize (const COMBOEX_INFO *infoPtr, SIZE *size)
{
static const WCHAR strA[] = { 'A', 0 };
HFONT nfont, ofont;
@@ -356,7 +356,7 @@ static void COMBOEX_GetComboFontSize (COMBOEX_INFO *infoPtr, SIZE *size)
}
-static void COMBOEX_CopyItem (CBE_ITEMDATA *item, COMBOBOXEXITEMW *cit)
+static void COMBOEX_CopyItem (const CBE_ITEMDATA *item, COMBOBOXEXITEMW *cit)
{
if (cit->mask & CBEIF_TEXT) {
/*
@@ -385,7 +385,7 @@ static void COMBOEX_CopyItem (CBE_ITEMDATA *item, COMBOBOXEXITEMW *cit)
}
-static void COMBOEX_AdjustEditPos (COMBOEX_INFO *infoPtr)
+static void COMBOEX_AdjustEditPos (const COMBOEX_INFO *infoPtr)
{
SIZE mysize;
INT x, y, w, h, xioff;
@@ -419,7 +419,7 @@ static void COMBOEX_AdjustEditPos (COMBOEX_INFO *infoPtr)
}
-static void COMBOEX_ReSize (COMBOEX_INFO *infoPtr)
+static void COMBOEX_ReSize (const COMBOEX_INFO *infoPtr)
{
SIZE mysize;
LONG cy;
@@ -452,7 +452,7 @@ static void COMBOEX_ReSize (COMBOEX_INFO *infoPtr)
}
-static void COMBOEX_SetEditText (COMBOEX_INFO *infoPtr, CBE_ITEMDATA *item)
+static void COMBOEX_SetEditText (const COMBOEX_INFO *infoPtr, CBE_ITEMDATA *item)
{
if (!infoPtr->hwndEdit) return;
/* native issues the following messages to the {Edit} control */
@@ -467,7 +467,7 @@ static void COMBOEX_SetEditText (COMBOEX_INFO *infoPtr, CBE_ITEMDATA *item)
}
-static CBE_ITEMDATA * COMBOEX_FindItem(COMBOEX_INFO *infoPtr, INT_PTR index)
+static CBE_ITEMDATA * COMBOEX_FindItem(const COMBOEX_INFO *infoPtr, INT_PTR index)
{
CBE_ITEMDATA *item;
INT i;
@@ -500,7 +500,7 @@ static inline BOOL COMBOEX_HasEdit(COMBOEX_INFO const *infoPtr)
/* *** CBEM_xxx message support *** */
-static UINT COMBOEX_GetListboxText(COMBOEX_INFO *infoPtr, INT_PTR n, LPWSTR buf)
+static UINT COMBOEX_GetListboxText(const COMBOEX_INFO *infoPtr, INT_PTR n, LPWSTR buf)
{
CBE_ITEMDATA *item;
LPCWSTR str;
@@ -527,7 +527,7 @@ static UINT COMBOEX_GetListboxText(COMBOEX_INFO *infoPtr, INT_PTR n, LPWSTR buf)
}
-static INT COMBOEX_DeleteItem (COMBOEX_INFO *infoPtr, INT_PTR index)
+static INT COMBOEX_DeleteItem (const COMBOEX_INFO *infoPtr, INT_PTR index)
{
TRACE("(index=%ld)\n", index);
@@ -542,7 +542,7 @@ static INT COMBOEX_DeleteItem (COMBOEX_INFO *infoPtr, INT_PTR index)
}
-static BOOL COMBOEX_GetItemW (COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
+static BOOL COMBOEX_GetItemW (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
{
INT_PTR index = cit->iItem;
CBE_ITEMDATA *item;
@@ -563,7 +563,7 @@ static BOOL COMBOEX_GetItemW (COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
}
-static BOOL COMBOEX_GetItemA (COMBOEX_INFO *infoPtr, COMBOBOXEXITEMA *cit)
+static BOOL COMBOEX_GetItemA (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMA *cit)
{
COMBOBOXEXITEMW tmpcit;
@@ -763,7 +763,7 @@ static HIMAGELIST COMBOEX_SetImageList (COMBOEX_INFO *infoPtr, HIMAGELIST himl)
return himlTemp;
}
-static BOOL COMBOEX_SetItemW (COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
+static BOOL COMBOEX_SetItemW (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
{
INT_PTR index = cit->iItem;
CBE_ITEMDATA *item;
@@ -814,7 +814,7 @@ static BOOL COMBOEX_SetItemW (COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
return TRUE;
}
-static BOOL COMBOEX_SetItemA (COMBOEX_INFO *infoPtr, COMBOBOXEXITEMA const *cit)
+static BOOL COMBOEX_SetItemA (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMA const *cit)
{
COMBOBOXEXITEMW citW;
LPWSTR wstr = NULL;
@@ -851,7 +851,7 @@ static BOOL COMBOEX_SetUnicodeFormat (COMBOEX_INFO *infoPtr, BOOL value)
/* *** CB_xxx message support *** */
static INT
-COMBOEX_FindStringExact (COMBOEX_INFO *infoPtr, INT start, LPCWSTR str)
+COMBOEX_FindStringExact (const COMBOEX_INFO *infoPtr, INT start, LPCWSTR str)
{
INT i;
cmp_func_t cmptext = get_cmp_func(infoPtr);
@@ -860,17 +860,19 @@ COMBOEX_FindStringExact (COMBOEX_INFO *infoPtr, INT start, LPCWSTR str)
/* now search from after starting loc and wrapping back to start */
for(i=start+1; ihwndSelf, WM_SETREDRAW, wParam, lParam );
if (wParam) RedrawWindow( infoPtr->hwndSelf, NULL, 0, RDW_INVALIDATE|RDW_ERASE|RDW_ALLCHILDREN );
@@ -1677,7 +1679,7 @@ static LRESULT COMBOEX_SetRedraw(COMBOEX_INFO *infoPtr, WPARAM wParam, LPARAM lP
}
-static LRESULT COMBOEX_WindowPosChanging (COMBOEX_INFO *infoPtr, WINDOWPOS *wp)
+static LRESULT COMBOEX_WindowPosChanging (const COMBOEX_INFO *infoPtr, WINDOWPOS *wp)
{
RECT cbx_wrect, cbx_crect, cb_wrect;
INT width, height;
diff --git a/reactos/dll/win32/comctl32/comctl32.h b/reactos/dll/win32/comctl32/comctl32.h
index 872638dc873..1f2f63eb9fc 100644
--- a/reactos/dll/win32/comctl32/comctl32.h
+++ b/reactos/dll/win32/comctl32/comctl32.h
@@ -183,15 +183,15 @@ DWORD WINAPI GetSize (LPVOID);
INT WINAPI Str_GetPtrA (LPCSTR, LPSTR, INT);
INT WINAPI Str_GetPtrW (LPCWSTR, LPWSTR, INT);
-INT WINAPI DPA_GetPtrIndex (const HDPA, LPVOID);
-BOOL WINAPI DPA_Grow (const HDPA, INT);
+INT WINAPI DPA_GetPtrIndex (HDPA, LPCVOID);
+BOOL WINAPI DPA_Grow (HDPA, INT);
#define DPAM_NOSORT 0x0001
#define DPAM_INSERT 0x0004
#define DPAM_DELETE 0x0008
typedef PVOID (CALLBACK *PFNDPAMERGE)(DWORD,PVOID,PVOID,LPARAM);
-BOOL WINAPI DPA_Merge (const HDPA, const HDPA, DWORD, PFNDPACOMPARE, PFNDPAMERGE, LPARAM);
+BOOL WINAPI DPA_Merge (HDPA, HDPA, DWORD, PFNDPACOMPARE, PFNDPAMERGE, LPARAM);
#define DPA_GetPtrCount(hdpa) (*(INT*)(hdpa))
diff --git a/reactos/dll/win32/comctl32/comctl32.rbuild b/reactos/dll/win32/comctl32/comctl32.rbuild
index 1d7fac64883..80ba0573147 100644
--- a/reactos/dll/win32/comctl32/comctl32.rbuild
+++ b/reactos/dll/win32/comctl32/comctl32.rbuild
@@ -7,6 +7,7 @@
.
include/reactos/wine
+
animate.c
comboex.c
comctl32undoc.c
diff --git a/reactos/dll/win32/comctl32/comctl32.spec b/reactos/dll/win32/comctl32/comctl32.spec
index 6b8f6625010..e8529169fd8 100644
--- a/reactos/dll/win32/comctl32/comctl32.spec
+++ b/reactos/dll/win32/comctl32/comctl32.spec
@@ -139,10 +139,12 @@
@ stdcall FlatSB_SetScrollRange (long long long long long)
@ stdcall FlatSB_ShowScrollBar (long long long)
@ stdcall GetMUILanguage()
+@ stdcall HIMAGELIST_QueryInterface(ptr ptr ptr)
@ stdcall ImageList_Add(ptr long long)
@ stdcall ImageList_AddIcon(ptr long)
@ stdcall ImageList_AddMasked(ptr long long)
@ stdcall ImageList_BeginDrag(ptr long long long)
+@ stdcall ImageList_CoCreateInstance(ptr ptr ptr ptr)
@ stdcall ImageList_Copy(ptr long ptr long long)
@ stdcall ImageList_Create(long long long long long)
@ stdcall ImageList_Destroy(ptr)
diff --git a/reactos/dll/win32/comctl32/comctl32undoc.c b/reactos/dll/win32/comctl32/comctl32undoc.c
index 789906822f6..194efe5e4f8 100644
--- a/reactos/dll/win32/comctl32/comctl32undoc.c
+++ b/reactos/dll/win32/comctl32/comctl32undoc.c
@@ -385,7 +385,7 @@ INT WINAPI FindMRUData (HANDLE hList, LPCVOID lpData, DWORD cbData,
UINT i;
LPSTR dataA = NULL;
- if (!mp->extview.lpfnCompare)
+ if (!mp || !mp->extview.lpfnCompare)
return -1;
if(!(mp->extview.dwFlags & MRUF_BINARY_LIST) && !mp->isUnicode) {
@@ -834,6 +834,7 @@ INT WINAPI EnumMRUListW (HANDLE hList, INT nItemPos, LPVOID lpBuffer,
const WINEMRUITEM *witem;
INT desired, datasize;
+ if (!mp) return -1;
if ((nItemPos < 0) || !lpBuffer) return mp->cursize;
if (nItemPos >= mp->cursize) return -1;
desired = mp->realMRU[nItemPos];
@@ -860,6 +861,7 @@ INT WINAPI EnumMRUListA (HANDLE hList, INT nItemPos, LPVOID lpBuffer,
INT desired, datasize;
DWORD lenA;
+ if (!mp) return -1;
if ((nItemPos < 0) || !lpBuffer) return mp->cursize;
if (nItemPos >= mp->cursize) return -1;
desired = mp->realMRU[nItemPos];
diff --git a/reactos/dll/win32/comctl32/dpa.c b/reactos/dll/win32/comctl32/dpa.c
index a14c53079e8..43f2a3adf61 100644
--- a/reactos/dll/win32/comctl32/dpa.c
+++ b/reactos/dll/win32/comctl32/dpa.c
@@ -217,7 +217,7 @@ HRESULT WINAPI DPA_SaveStream (const HDPA hDpa, DPALOADPROC loadProc,
* NOTES
* No more information available yet!
*/
-BOOL WINAPI DPA_Merge (const HDPA hdpa1, const HDPA hdpa2, DWORD dwFlags,
+BOOL WINAPI DPA_Merge (HDPA hdpa1, HDPA hdpa2, DWORD dwFlags,
PFNDPACOMPARE pfnCompare, PFNDPAMERGE pfnMerge,
LPARAM lParam)
{
@@ -381,7 +381,7 @@ BOOL WINAPI DPA_Destroy (const HDPA hdpa)
* Success: TRUE
* Failure: FALSE
*/
-BOOL WINAPI DPA_Grow (const HDPA hdpa, INT nGrow)
+BOOL WINAPI DPA_Grow (HDPA hdpa, INT nGrow)
{
TRACE("(%p %d)\n", hdpa, nGrow);
@@ -504,7 +504,7 @@ LPVOID WINAPI DPA_GetPtr (const HDPA hdpa, INT nIndex)
* Success: index of the specified pointer
* Failure: -1
*/
-INT WINAPI DPA_GetPtrIndex (const HDPA hdpa, LPVOID p)
+INT WINAPI DPA_GetPtrIndex (HDPA hdpa, LPCVOID p)
{
INT i;
@@ -802,7 +802,8 @@ INT WINAPI DPA_Search (const HDPA hdpa, LPVOID pFind, INT nStart,
INT l, r, x, n;
LPVOID *lpPtr;
- l = (nStart == -1) ? 0 : nStart;
+ /* for binary search ignore start index */
+ l = 0;
r = hdpa->nItemCount - 1;
lpPtr = hdpa->ptrs;
while (r >= l) {
diff --git a/reactos/dll/win32/comctl32/header.c b/reactos/dll/win32/comctl32/header.c
index 40718c78340..7c8f161a17e 100644
--- a/reactos/dll/win32/comctl32/header.c
+++ b/reactos/dll/win32/comctl32/header.c
@@ -247,8 +247,7 @@ HEADER_SetItemBounds (HEADER_INFO *infoPtr)
static LRESULT
HEADER_Size (HEADER_INFO *infoPtr)
{
- infoPtr->bRectsValid = FALSE;
-
+ HEADER_SetItemBounds(infoPtr);
return 0;
}
@@ -329,18 +328,21 @@ HEADER_DrawItem (HEADER_INFO *infoPtr, HDC hdc, INT iItem, BOOL bHotTrack, LRESU
}
else {
HBRUSH hbr;
-
- if (infoPtr->dwStyle & HDS_BUTTONS) {
- if (phdi->bDown) {
- DrawEdge (hdc, &r, BDR_RAISEDOUTER,
- BF_RECT | BF_FLAT | BF_MIDDLE | BF_ADJUST);
+
+ if (!(infoPtr->dwStyle & HDS_FLAT))
+ {
+ if (infoPtr->dwStyle & HDS_BUTTONS) {
+ if (phdi->bDown) {
+ DrawEdge (hdc, &r, BDR_RAISEDOUTER,
+ BF_RECT | BF_FLAT | BF_MIDDLE | BF_ADJUST);
+ }
+ else
+ DrawEdge (hdc, &r, EDGE_RAISED,
+ BF_RECT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
}
else
- DrawEdge (hdc, &r, EDGE_RAISED,
- BF_RECT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
+ DrawEdge (hdc, &r, EDGE_ETCHED, BF_BOTTOM | BF_RIGHT | BF_ADJUST);
}
- else
- DrawEdge (hdc, &r, EDGE_ETCHED, BF_BOTTOM | BF_RIGHT | BF_ADJUST);
hbr = CreateSolidBrush(GetBkColor(hdc));
FillRect(hdc, &r, hbr);
@@ -547,14 +549,19 @@ HEADER_Refresh (HEADER_INFO *infoPtr, HDC hdc)
if (theme != NULL) {
DrawThemeBackground(theme, hdc, HP_HEADERITEM, HIS_NORMAL, &rcRest, NULL);
}
- else {
+ else if (infoPtr->dwStyle & HDS_FLAT) {
+ hbrBk = GetSysColorBrush(COLOR_3DFACE);
+ FillRect(hdc, &rcRest, hbrBk);
+ }
+ else
+ {
if (infoPtr->dwStyle & HDS_BUTTONS)
DrawEdge (hdc, &rcRest, EDGE_RAISED, BF_TOP|BF_LEFT|BF_BOTTOM|BF_SOFT|BF_MIDDLE);
else
DrawEdge (hdc, &rcRest, EDGE_ETCHED, BF_BOTTOM|BF_MIDDLE);
}
}
-
+
if (infoPtr->iHotDivider != -1)
HEADER_DrawHotDivider(infoPtr, hdc);
@@ -1189,7 +1196,7 @@ HEADER_GetOrderArray(const HEADER_INFO *infoPtr, INT size, LPINT order)
}
static LRESULT
-HEADER_SetOrderArray(HEADER_INFO *infoPtr, INT size, LPINT order)
+HEADER_SetOrderArray(HEADER_INFO *infoPtr, INT size, const INT *order)
{
INT i;
HEADER_ITEM *lpItem;
@@ -1202,7 +1209,7 @@ HEADER_SetOrderArray(HEADER_INFO *infoPtr, INT size, LPINT order)
lpItem = &infoPtr->items[*order++];
lpItem->iOrder=i;
}
- infoPtr->bRectsValid=0;
+ HEADER_SetItemBounds(infoPtr);
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
return TRUE;
}
@@ -1217,10 +1224,12 @@ HEADER_GetUnicodeFormat (const HEADER_INFO *infoPtr)
static LRESULT
HEADER_HitTest (const HEADER_INFO *infoPtr, LPHDHITTESTINFO phti)
{
+ UINT outside = HHT_NOWHERE | HHT_ABOVE | HHT_BELOW | HHT_TOLEFT | HHT_TORIGHT;
+
HEADER_InternalHitTest (infoPtr, &phti->pt, &phti->flags, &phti->iItem);
- if (phti->flags == HHT_NOWHERE)
- return -1;
+ if (phti->flags & outside)
+ return phti->iItem = -1;
else
return phti->iItem;
}
@@ -1400,7 +1409,7 @@ HEADER_SetUnicodeFormat (HEADER_INFO *infoPtr, WPARAM wParam)
static LRESULT
-HEADER_Create (HWND hwnd, LPCREATESTRUCTW lpcs)
+HEADER_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
{
HEADER_INFO *infoPtr;
TEXTMETRICW tm;
@@ -1496,7 +1505,7 @@ HEADER_IsDragDistance(const HEADER_INFO *infoPtr, const POINT *pt)
}
static LRESULT
-HEADER_LButtonDblClk (HEADER_INFO *infoPtr, INT x, INT y)
+HEADER_LButtonDblClk (const HEADER_INFO *infoPtr, INT x, INT y)
{
POINT pt;
UINT flags;
@@ -1582,6 +1591,9 @@ HEADER_LButtonUp (HEADER_INFO *infoPtr, INT x, INT y)
HEADER_InternalHitTest (infoPtr, &pt, &flags, &nItem);
if (infoPtr->bPressed) {
+
+ infoPtr->items[infoPtr->iMoveItem].bDown = FALSE;
+
if (infoPtr->bDragging)
{
HEADER_ITEM *lpItem = &infoPtr->items[infoPtr->iMoveItem];
@@ -1589,8 +1601,7 @@ HEADER_LButtonUp (HEADER_INFO *infoPtr, INT x, INT y)
ImageList_DragShowNolock(FALSE);
ImageList_EndDrag();
- lpItem->bDown=FALSE;
-
+
if (infoPtr->iHotDivider == -1)
iNewOrder = -1;
else if (infoPtr->iHotDivider == infoPtr->uNumItem)
@@ -1615,14 +1626,14 @@ HEADER_LButtonUp (HEADER_INFO *infoPtr, INT x, INT y)
infoPtr->bDragging = FALSE;
HEADER_SetHotDivider(infoPtr, FALSE, -1);
}
- else if (!(infoPtr->dwStyle & HDS_DRAGDROP) || !HEADER_IsDragDistance(infoPtr, &pt))
+ else
{
- infoPtr->items[infoPtr->iMoveItem].bDown = FALSE;
hdc = GetDC (infoPtr->hwndSelf);
HEADER_RefreshItem (infoPtr, infoPtr->iMoveItem);
ReleaseDC (infoPtr->hwndSelf, hdc);
- HEADER_SendNotifyWithHDItemT(infoPtr, HDN_ITEMCLICKW, infoPtr->iMoveItem, NULL);
+ if (!(infoPtr->dwStyle & HDS_DRAGDROP) || !HEADER_IsDragDistance(infoPtr, &pt))
+ HEADER_SendNotifyWithHDItemT(infoPtr, HDN_ITEMCLICKW, infoPtr->iMoveItem, NULL);
}
TRACE("Released item %d!\n", infoPtr->iMoveItem);
@@ -1923,7 +1934,7 @@ static LRESULT HEADER_SetRedraw(HEADER_INFO *infoPtr, WPARAM wParam, LPARAM lPar
}
static INT HEADER_StyleChanged(HEADER_INFO *infoPtr, WPARAM wStyleType,
- const LPSTYLESTRUCT lpss)
+ const STYLESTRUCT *lpss)
{
TRACE("(styletype=%lx, styleOld=0x%08x, styleNew=0x%08x)\n",
wStyleType, lpss->styleOld, lpss->styleNew);
diff --git a/reactos/dll/win32/comctl32/hotkey.c b/reactos/dll/win32/comctl32/hotkey.c
index 165d95dad7b..a72b48752ec 100644
--- a/reactos/dll/win32/comctl32/hotkey.c
+++ b/reactos/dll/win32/comctl32/hotkey.c
@@ -239,10 +239,9 @@ HOTKEY_Create (HOTKEY_INFO *infoPtr, const CREATESTRUCTW *lpcs)
static LRESULT
HOTKEY_Destroy (HOTKEY_INFO *infoPtr)
{
- HWND hwnd = infoPtr->hwndSelf;
/* free hotkey info data */
+ SetWindowLongPtrW (infoPtr->hwndSelf, 0, 0);
Free (infoPtr);
- SetWindowLongPtrW (hwnd, 0, 0);
return 0;
}
diff --git a/reactos/dll/win32/comctl32/imagelist.c b/reactos/dll/win32/comctl32/imagelist.c
index 72e7608e8a3..d3f0b364288 100644
--- a/reactos/dll/win32/comctl32/imagelist.c
+++ b/reactos/dll/win32/comctl32/imagelist.c
@@ -6,6 +6,7 @@
* Copyright 2001, 2004 Michael Stefaniuc
* Copyright 2001 Charles Loep for CodeWeavers
* Copyright 2002 Dimitrie O. Paun
+ * Copyright 2009 Owen Rudge for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -155,7 +156,7 @@ static inline void imagelist_copy_images( HIMAGELIST himl, HDC hdcSrc, HDC hdcDe
* This function CANNOT be used to reduce the number of images.
*/
static void
-IMAGELIST_InternalExpandBitmaps (HIMAGELIST himl, INT nImageCount, INT cy)
+IMAGELIST_InternalExpandBitmaps (HIMAGELIST himl, INT nImageCount, INT cx, INT cy)
{
HDC hdcBitmap;
HBITMAP hbmNewBitmap, hbmNull;
@@ -166,14 +167,15 @@ IMAGELIST_InternalExpandBitmaps (HIMAGELIST himl, INT nImageCount, INT cy)
&& (himl->cy >= cy))
return;
+ if (cx == 0) cx = himl->cx;
nNewCount = himl->cCurImage + nImageCount + himl->cGrow;
- imagelist_get_bitmap_size(himl, nNewCount, himl->cx, &sz);
+ imagelist_get_bitmap_size(himl, nNewCount, cx, &sz);
TRACE("Create expanded bitmaps : himl=%p x=%d y=%d count=%d\n", himl, sz.cx, cy, nNewCount);
hdcBitmap = CreateCompatibleDC (0);
- hbmNewBitmap = ImageList_CreateImage(hdcBitmap, himl, nNewCount, himl->cx);
+ hbmNewBitmap = ImageList_CreateImage(hdcBitmap, himl, nNewCount, cx);
if (hbmNewBitmap == 0)
ERR("creating new image bitmap (x=%d y=%d)!\n", sz.cx, cy);
@@ -247,7 +249,7 @@ ImageList_Add (HIMAGELIST himl, HBITMAP hbmImage, HBITMAP hbmMask)
nImageCount = bmp.bmWidth / himl->cx;
- IMAGELIST_InternalExpandBitmaps (himl, nImageCount, bmp.bmHeight);
+ IMAGELIST_InternalExpandBitmaps (himl, nImageCount, bmp.bmWidth, bmp.bmHeight);
hdcBitmap = CreateCompatibleDC(0);
@@ -349,7 +351,7 @@ ImageList_AddMasked (HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask)
else
nImageCount = 0;
- IMAGELIST_InternalExpandBitmaps (himl, nImageCount, bmp.bmHeight);
+ IMAGELIST_InternalExpandBitmaps (himl, nImageCount, bmp.bmWidth, bmp.bmHeight);
nIndex = himl->cCurImage;
himl->cCurImage += nImageCount;
@@ -2303,7 +2305,7 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
if (nIndex == -1) {
if (himl->cCurImage + 1 > himl->cMaxImage)
- IMAGELIST_InternalExpandBitmaps (himl, 1, 0);
+ IMAGELIST_InternalExpandBitmaps (himl, 1, 0, 0);
nIndex = himl->cCurImage;
himl->cCurImage++;
@@ -2905,3 +2907,47 @@ ImageList_SetColorTable (HIMAGELIST himl, UINT uStartIndex, UINT cEntries, CONST
{
return SetDIBColorTable(himl->hdcImage, uStartIndex, cEntries, prgb);
}
+
+/*************************************************************************
+ * ImageList_CoCreateInstance [COMCTL32.@]
+ *
+ * Creates a new imagelist instance and returns an interface pointer to it.
+ *
+ * PARAMS
+ * rclsid [I] A reference to the CLSID (CLSID_ImageList).
+ * punkOuter [I] Pointer to IUnknown interface for aggregation, if desired
+ * riid [I] Identifier of the requested interface.
+ * ppv [O] Returns the address of the pointer requested, or NULL.
+ *
+ * RETURNS
+ * Success: S_OK.
+ * Failure: Error value.
+ */
+HRESULT WINAPI
+ImageList_CoCreateInstance (REFCLSID rclsid, const IUnknown *punkOuter, REFIID riid, void **ppv)
+{
+ FIXME("STUB: %s %p %s %p\n", debugstr_guid(rclsid), punkOuter, debugstr_guid(riid), ppv);
+ return E_NOINTERFACE;
+}
+
+/*************************************************************************
+ * HIMAGELIST_QueryInterface [COMCTL32.@]
+ *
+ * Returns a pointer to an IImageList or IImageList2 object for the given
+ * HIMAGELIST.
+ *
+ * PARAMS
+ * himl [I] Image list handle.
+ * riid [I] Identifier of the requested interface.
+ * ppv [O] Returns the address of the pointer requested, or NULL.
+ *
+ * RETURNS
+ * Success: S_OK.
+ * Failure: Error value.
+ */
+HRESULT WINAPI
+HIMAGELIST_QueryInterface (HIMAGELIST himl, REFIID riid, void **ppv)
+{
+ FIXME("STUB: %p %s %p\n", himl, debugstr_guid(riid), ppv);
+ return E_NOINTERFACE;
+}
diff --git a/reactos/dll/win32/comctl32/listview.c b/reactos/dll/win32/comctl32/listview.c
index 66b45b47461..afe71167f04 100644
--- a/reactos/dll/win32/comctl32/listview.c
+++ b/reactos/dll/win32/comctl32/listview.c
@@ -6,6 +6,7 @@
* Copyright 2000 Jason Mawdsley
* Copyright 2001 CodeWeavers Inc.
* Copyright 2002 Dimitrie O. Paun
+ * Copyright 2009 Nikolay Sivov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -33,11 +34,8 @@
* TODO:
*
* Default Message Processing
- * -- EN_KILLFOCUS should be handled in WM_COMMAND
* -- WM_CREATE: create the icon and small icon image lists at this point only if
* the LVS_SHAREIMAGELISTS style is not specified.
- * -- WM_ERASEBKGND: forward this message to the parent window if the bkgnd
- * color is CLR_NONE.
* -- WM_WINDOWPOSCHANGED: arrange the list items if the current view is icon
* or small icon and the LVS_AUTOARRANGE style is specified.
* -- WM_TIMER
@@ -54,18 +52,17 @@
* -- Support CustomDraw options for _WIN32_IE >= 0x560 (see NMLVCUSTOMDRAW docs).
* -- LVA_SNAPTOGRID not implemented
* -- LISTVIEW_ApproximateViewRect partially implemented
- * -- LISTVIEW_[GS]etColumnOrderArray stubs
* -- LISTVIEW_SetColumnWidth ignores header images & bitmap
* -- LISTVIEW_SetIconSpacing is incomplete
- * -- LISTVIEW_SortItems is broken
* -- LISTVIEW_StyleChanged doesn't handle some changes too well
*
* Speedups
* -- LISTVIEW_GetNextItem needs to be rewritten. It is currently
* linear in the number of items in the list, and this is
* unacceptable for large lists.
- * -- in sorted mode, LISTVIEW_InsertItemT sorts the array,
- * instead of inserting in the right spot
+ * -- if list is sorted by item text LISTVIEW_InsertItemT could use
+ * binary search to calculate item index (e.g. DPA_Search()).
+ * This requires sorted state to be reliably tracked in item modifiers.
* -- we should keep an ordered array of coordinates in iconic mode
* this would allow to frame items (iterator_frameditems),
* and find nearest item (LVFI_NEARESTXY) a lot more efficiently
@@ -73,7 +70,6 @@
* Flags
* -- LVIF_COLUMNS
* -- LVIF_GROUPID
- * -- LVIF_NORECOMPUTE
*
* States
* -- LVIS_ACTIVATING (not currently supported by comctl32.dll version 6.0)
@@ -84,14 +80,11 @@
* Styles
* -- LVS_NOLABELWRAP
* -- LVS_NOSCROLL (see Q137520)
- * -- LVS_SORTASCENDING, LVS_SORTDESCENDING
* -- LVS_ALIGNTOP
- * -- LVS_TYPESTYLEMASK
*
* Extended Styles
* -- LVS_EX_BORDERSELECT
* -- LVS_EX_FLATSB
- * -- LVS_EX_HEADERDRAGDROP
* -- LVS_EX_INFOTIP
* -- LVS_EX_LABELTIP
* -- LVS_EX_MULTIWORKAREAS
@@ -111,7 +104,6 @@
* -- LVN_BEGINRDRAG
*
* Messages:
- * -- LVM_CANCELEDITLABEL
* -- LVM_ENABLEGROUPVIEW
* -- LVM_GETBKIMAGE, LVM_SETBKIMAGE
* -- LVM_GETGROUPINFO, LVM_SETGROUPINFO
@@ -125,31 +117,22 @@
* -- LVM_GETISEARCHSTRINGW, LVM_GETISEARCHSTRINGA
* -- LVM_GETTILEINFO, LVM_SETTILEINFO
* -- LVM_GETTILEVIEWINFO, LVM_SETTILEVIEWINFO
- * -- LVM_GETUNICODEFORMAT, LVM_SETUNICODEFORMAT
- * -- LVM_GETVIEW, LVM_SETVIEW
* -- LVM_GETWORKAREAS, LVM_SETWORKAREAS
* -- LVM_HASGROUP, LVM_INSERTGROUP, LVM_REMOVEGROUP, LVM_REMOVEALLGROUPS
* -- LVM_INSERTGROUPSORTED
* -- LVM_INSERTMARKHITTEST
* -- LVM_ISGROUPVIEWENABLED
- * -- LVM_MAPIDTOINDEX, LVM_MAPINDEXTOID
* -- LVM_MOVEGROUP
* -- LVM_MOVEITEMTOGROUP
* -- LVM_SETINFOTIP
* -- LVM_SETTILEWIDTH
* -- LVM_SORTGROUPS
- * -- LVM_SORTITEMSEX
*
* Macros:
- * -- ListView_GetCheckSate, ListView_SetCheckState
* -- ListView_GetHoverTime, ListView_SetHoverTime
* -- ListView_GetISearchString
* -- ListView_GetNumberOfWorkAreas
- * -- ListView_GetOrigin
- * -- ListView_GetTextBkColor
- * -- ListView_GetUnicodeFormat, ListView_SetUnicodeFormat
* -- ListView_GetWorkAreas, ListView_SetWorkAreas
- * -- ListView_SortItemsEx
*
* Functions:
* -- LVGroupComparE
@@ -208,14 +191,23 @@ typedef struct tagSUBITEM_INFO
INT iSubItem;
} SUBITEM_INFO;
+typedef struct tagITEM_ID ITEM_ID;
+
typedef struct tagITEM_INFO
{
ITEMHDR hdr;
UINT state;
LPARAM lParam;
INT iIndent;
+ ITEM_ID *id;
} ITEM_INFO;
+struct tagITEM_ID
+{
+ UINT id; /* item id */
+ HDPA item; /* link to item data */
+};
+
typedef struct tagRANGE
{
INT lower;
@@ -289,17 +281,21 @@ typedef struct tagLISTVIEW_INFO
RECT rcFocus;
DWORD dwStyle; /* the cached window GWL_STYLE */
DWORD dwLvExStyle; /* extended listview style */
+ DWORD uView; /* current view available through LVM_[G,S]ETVIEW */
INT nItemCount; /* the number of items in the list */
HDPA hdpaItems; /* array ITEM_INFO pointers */
+ HDPA hdpaItemIds; /* array of ITEM_ID pointers */
HDPA hdpaPosX; /* maintains the (X, Y) coordinates of the */
HDPA hdpaPosY; /* items in LVS_ICON, and LVS_SMALLICON modes */
HDPA hdpaColumns; /* array of COLUMN_INFO pointers */
+ BOOL colRectsDirty; /* trigger column rectangles requery from header */
POINT currIconPos; /* this is the position next icon will be placed */
PFNLVCOMPARE pfnCompare;
LPARAM lParamSort;
HWND hwndEdit;
WNDPROC EditWndProc;
INT nEditLabelItem;
+ INT nLButtonDownItem; /* tracks item to reset multiselection on WM_LBUTTONUP */
DWORD dwHoverTime;
HWND hwndToolTip;
@@ -313,6 +309,8 @@ typedef struct tagLISTVIEW_INFO
INT nMeasureItemHeight;
INT xTrackLine; /* The x coefficient of the track line or -1 if none */
DELAYED_ITEM_EDIT itemEdit; /* Pointer to this structure will be the timer ID */
+
+ DWORD iVersion; /* CCM_[G,S]ETVERSION */
} LISTVIEW_INFO;
/*
@@ -320,7 +318,7 @@ typedef struct tagLISTVIEW_INFO
*/
/* How many we debug buffer to allocate */
#define DEBUG_BUFFERS 20
-/* The size of a single debug bbuffer */
+/* The size of a single debug buffer */
#define DEBUG_BUFFER_SIZE 256
/* Internal interface to LISTVIEW_HScroll and LISTVIEW_VScroll */
@@ -361,6 +359,8 @@ typedef struct tagLISTVIEW_INFO
/* default label width for items in list and small icon display modes */
#define DEFAULT_LABEL_WIDTH 40
+/* maximum select rectangle width for empty text item in LV_VIEW_DETAILS */
+#define MAX_EMPTYTEXT_SELECT_WIDTH 80
/* default column width for items in list display mode */
#define DEFAULT_COLUMN_WIDTH 128
@@ -416,25 +416,19 @@ static BOOL LISTVIEW_GetItemRect(const LISTVIEW_INFO *, INT, LPRECT);
static INT LISTVIEW_GetLabelWidth(const LISTVIEW_INFO *, INT);
static void LISTVIEW_GetOrigin(const LISTVIEW_INFO *, LPPOINT);
static BOOL LISTVIEW_GetViewRect(const LISTVIEW_INFO *, LPRECT);
-static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO *, INT);
-static BOOL LISTVIEW_SetItemT(LISTVIEW_INFO *, LVITEMW *, BOOL);
-static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *);
-static void LISTVIEW_SetSelection(LISTVIEW_INFO *, INT);
static void LISTVIEW_UpdateSize(LISTVIEW_INFO *);
-static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *, INT, BOOL);
-static LRESULT LISTVIEW_Command(const LISTVIEW_INFO *, WPARAM, LPARAM);
-static BOOL LISTVIEW_SortItems(LISTVIEW_INFO *, PFNLVCOMPARE, LPARAM);
+static LRESULT LISTVIEW_Command(LISTVIEW_INFO *, WPARAM, LPARAM);
static INT LISTVIEW_GetStringWidthT(const LISTVIEW_INFO *, LPCWSTR, BOOL);
-static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *, INT);
+static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *, INT, BOOL);
static UINT LISTVIEW_GetItemState(const LISTVIEW_INFO *, INT, UINT);
static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *, INT, const LVITEMW *);
static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *, INT, INT, HWND);
static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *, INT, INT, HWND);
-static INT LISTVIEW_GetTopIndex(const LISTVIEW_INFO *);
static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *, INT, BOOL);
-static HWND CreateEditLabelT(LISTVIEW_INFO *, LPCWSTR, DWORD, INT, INT, INT, INT, BOOL);
+static HWND CreateEditLabelT(LISTVIEW_INFO *, LPCWSTR, DWORD, BOOL);
static HIMAGELIST LISTVIEW_SetImageList(LISTVIEW_INFO *, INT, HIMAGELIST);
static INT LISTVIEW_HitTest(const LISTVIEW_INFO *, LPLVHITTESTINFO, BOOL, BOOL);
+static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *, BOOL, BOOL);
/******** Text handling functions *************************************/
@@ -523,7 +517,7 @@ static inline int textcmpWT(LPCWSTR aw, LPCWSTR bt, BOOL isW)
if (!aw) return bt ? -1 : 0;
if (!bt) return aw ? 1 : 0;
if (aw == LPSTR_TEXTCALLBACKW)
- return bt == LPSTR_TEXTCALLBACKW ? 0 : -1;
+ return bt == LPSTR_TEXTCALLBACKW ? 1 : -1;
if (bt != LPSTR_TEXTCALLBACKW)
{
LPWSTR bw = textdupTtoW(bt, isW);
@@ -715,12 +709,82 @@ static inline LPCSTR debugscrollcode(int nScrollCode)
}
-/******** Notification functions i************************************/
+/******** Notification functions ************************************/
+static int get_ansi_notification(UINT unicodeNotificationCode)
+{
+ switch (unicodeNotificationCode)
+ {
+ case LVN_BEGINLABELEDITW: return LVN_BEGINLABELEDITA;
+ case LVN_ENDLABELEDITW: return LVN_ENDLABELEDITA;
+ case LVN_GETDISPINFOW: return LVN_GETDISPINFOA;
+ case LVN_SETDISPINFOW: return LVN_SETDISPINFOA;
+ case LVN_ODFINDITEMW: return LVN_ODFINDITEMA;
+ case LVN_GETINFOTIPW: return LVN_GETINFOTIPA;
+ /* header forwards */
+ case HDN_TRACKW: return HDN_TRACKA;
+ case HDN_ENDTRACKW: return HDN_ENDTRACKA;
+ case HDN_BEGINDRAG: return HDN_BEGINDRAG;
+ case HDN_ENDDRAG: return HDN_ENDDRAG;
+ case HDN_ITEMCHANGINGW: return HDN_ITEMCHANGINGA;
+ case HDN_ITEMCHANGEDW: return HDN_ITEMCHANGEDA;
+ case HDN_ITEMCLICKW: return HDN_ITEMCLICKA;
+ case HDN_DIVIDERDBLCLICKW: return HDN_DIVIDERDBLCLICKA;
+ }
+ ERR("unknown notification %x\n", unicodeNotificationCode);
+ assert(FALSE);
+ return 0;
+}
+
+/* forwards header notifications to listview parent */
static LRESULT notify_forward_header(const LISTVIEW_INFO *infoPtr, const NMHEADERW *lpnmh)
{
- return SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,
- (WPARAM)lpnmh->hdr.idFrom, (LPARAM)lpnmh);
+ NMHEADERA nmhA;
+ HDITEMA hditema;
+ HD_TEXTFILTERA textfilter;
+ LPSTR text = NULL, filter = NULL;
+ LRESULT ret;
+
+ /* on unicode format exit earlier */
+ if (infoPtr->notifyFormat == NFR_UNICODE)
+ return SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,
+ (WPARAM)lpnmh->hdr.idFrom, (LPARAM)lpnmh);
+
+ /* header always supplies unicode notifications,
+ all we have to do is to convert strings to ANSI */
+ nmhA = *(NMHEADERA*)lpnmh;
+ if (lpnmh->pitem)
+ {
+ hditema = *(HDITEMA*)lpnmh->pitem;
+ nmhA.pitem = &hditema;
+ /* convert item text */
+ if (lpnmh->pitem->mask & HDI_TEXT)
+ {
+ hditema.pszText = NULL;
+ Str_SetPtrWtoA(&hditema.pszText, lpnmh->pitem->pszText);
+ text = hditema.pszText;
+ }
+ /* convert filter text */
+ if ((lpnmh->pitem->mask & HDI_FILTER) && (lpnmh->pitem->type == HDFT_ISSTRING) &&
+ lpnmh->pitem->pvFilter)
+ {
+ hditema.pvFilter = &textfilter;
+ textfilter = *(HD_TEXTFILTERA*)(lpnmh->pitem->pvFilter);
+ textfilter.pszText = NULL;
+ Str_SetPtrWtoA(&textfilter.pszText, ((HD_TEXTFILTERW*)lpnmh->pitem->pvFilter)->pszText);
+ filter = textfilter.pszText;
+ }
+ }
+ nmhA.hdr.code = get_ansi_notification(lpnmh->hdr.code);
+
+ ret = SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,
+ (WPARAM)nmhA.hdr.idFrom, (LPARAM)&nmhA);
+
+ /* cleanup */
+ Free(text);
+ Free(filter);
+
+ return ret;
}
static LRESULT notify_hdr(const LISTVIEW_INFO *infoPtr, INT code, LPNMHDR pnmh)
@@ -787,20 +851,20 @@ static inline LRESULT notify_listview(const LISTVIEW_INFO *infoPtr, INT code, LP
static BOOL notify_click(const LISTVIEW_INFO *infoPtr, INT code, const LVHITTESTINFO *lvht)
{
- NMLISTVIEW nmlv;
+ NMITEMACTIVATE nmia;
LVITEMW item;
HWND hwnd = infoPtr->hwndSelf;
TRACE("code=%d, lvht=%s\n", code, debuglvhittestinfo(lvht));
- ZeroMemory(&nmlv, sizeof(nmlv));
- nmlv.iItem = lvht->iItem;
- nmlv.iSubItem = lvht->iSubItem;
- nmlv.ptAction = lvht->pt;
+ ZeroMemory(&nmia, sizeof(nmia));
+ nmia.iItem = lvht->iItem;
+ nmia.iSubItem = lvht->iSubItem;
+ nmia.ptAction = lvht->pt;
item.mask = LVIF_PARAM;
item.iItem = lvht->iItem;
item.iSubItem = 0;
- if (LISTVIEW_GetItemT(infoPtr, &item, TRUE)) nmlv.lParam = item.lParam;
- notify_listview(infoPtr, code, &nmlv);
+ if (LISTVIEW_GetItemT(infoPtr, &item, TRUE)) nmia.lParam = item.lParam;
+ notify_hdr(infoPtr, code, (LPNMHDR)&nmia);
return IsWindow(hwnd);
}
@@ -820,22 +884,6 @@ static BOOL notify_deleteitem(const LISTVIEW_INFO *infoPtr, INT nItem)
return IsWindow(hwnd);
}
-static int get_ansi_notification(UINT unicodeNotificationCode)
-{
- switch (unicodeNotificationCode)
- {
- case LVN_BEGINLABELEDITW: return LVN_BEGINLABELEDITA;
- case LVN_ENDLABELEDITW: return LVN_ENDLABELEDITA;
- case LVN_GETDISPINFOW: return LVN_GETDISPINFOA;
- case LVN_SETDISPINFOW: return LVN_SETDISPINFOA;
- case LVN_ODFINDITEMW: return LVN_ODFINDITEMA;
- case LVN_GETINFOTIPW: return LVN_GETINFOTIPA;
- }
- ERR("unknown notification %x\n", unicodeNotificationCode);
- assert(FALSE);
- return 0;
-}
-
/*
Send notification. depends on dispinfoW having same
structure as dispinfoA.
@@ -982,6 +1030,25 @@ static inline DWORD notify_postpaint (const LISTVIEW_INFO *infoPtr, NMLVCUSTOMDR
return notify_customdraw(infoPtr, CDDS_POSTPAINT, lpnmlvcd);
}
+/* returns TRUE when repaint needed, FALSE otherwise */
+static BOOL notify_measureitem(LISTVIEW_INFO *infoPtr)
+{
+ MEASUREITEMSTRUCT mis;
+ mis.CtlType = ODT_LISTVIEW;
+ mis.CtlID = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
+ mis.itemID = -1;
+ mis.itemWidth = 0;
+ mis.itemData = 0;
+ mis.itemHeight= infoPtr->nItemHeight;
+ SendMessageW(infoPtr->hwndNotify, WM_MEASUREITEM, mis.CtlID, (LPARAM)&mis);
+ if (infoPtr->nItemHeight != max(mis.itemHeight, 1))
+ {
+ infoPtr->nMeasureItemHeight = infoPtr->nItemHeight = max(mis.itemHeight, 1);
+ return TRUE;
+ }
+ return FALSE;
+}
+
/******** Item iterator functions **********************************/
static RANGES ranges_create(int count);
@@ -1202,7 +1269,6 @@ static inline BOOL iterator_rangesitems(ITERATOR* i, RANGES ranges)
*/
static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, const RECT *lprc)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
RECT frame = *lprc, rcItem, rcTemp;
POINT Origin;
@@ -1214,11 +1280,11 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
TRACE("(lprc=%s)\n", wine_dbgstr_rect(lprc));
OffsetRect(&frame, -Origin.x, -Origin.y);
- if (uView == LVS_ICON || uView == LVS_SMALLICON)
+ if (infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON)
{
INT nItem;
- if (uView == LVS_ICON && infoPtr->nFocusedItem != -1)
+ if (infoPtr->uView == LV_VIEW_ICON && infoPtr->nFocusedItem != -1)
{
LISTVIEW_GetItemBox(infoPtr, infoPtr->nFocusedItem, &rcItem);
if (IntersectRect(&rcTemp, &rcItem, lprc))
@@ -1238,7 +1304,7 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
}
return TRUE;
}
- else if (uView == LVS_REPORT)
+ else if (infoPtr->uView == LV_VIEW_DETAILS)
{
RANGE range;
@@ -1256,12 +1322,25 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
INT nPerCol = max((infoPtr->rcList.bottom - infoPtr->rcList.top) / infoPtr->nItemHeight, 1);
INT nFirstRow = max(frame.top / infoPtr->nItemHeight, 0);
INT nLastRow = min((frame.bottom - 1) / infoPtr->nItemHeight, nPerCol - 1);
- INT nFirstCol = max(frame.left / infoPtr->nItemWidth, 0);
- INT nLastCol = min((frame.right - 1) / infoPtr->nItemWidth, (infoPtr->nItemCount + nPerCol - 1) / nPerCol);
- INT lower = nFirstCol * nPerCol + nFirstRow;
+ INT nFirstCol;
+ INT nLastCol;
+ INT lower;
RANGE item_range;
INT nCol;
+ if (infoPtr->nItemWidth)
+ {
+ nFirstCol = max(frame.left / infoPtr->nItemWidth, 0);
+ nLastCol = min((frame.right - 1) / infoPtr->nItemWidth, (infoPtr->nItemCount + nPerCol - 1) / nPerCol);
+ }
+ else
+ {
+ nFirstCol = max(frame.left, 0);
+ nLastCol = min(frame.right - 1, (infoPtr->nItemCount + nPerCol - 1) / nPerCol);
+ }
+
+ lower = nFirstCol * nPerCol + nFirstRow;
+
TRACE("nPerCol=%d, nFirstRow=%d, nLastRow=%d, nFirstCol=%d, nLastCol=%d, lower=%d\n",
nPerCol, nFirstRow, nLastRow, nFirstCol, nLastCol, lower);
@@ -1321,7 +1400,7 @@ static BOOL iterator_visibleitems(ITERATOR *i, const LISTVIEW_INFO *infoPtr, HDC
while(iterator_next(i))
{
LISTVIEW_GetItemOrigin(infoPtr, i->nItem, &Position);
- rcItem.left = Position.x + Origin.x;
+ rcItem.left = (infoPtr->uView == LV_VIEW_DETAILS) ? Origin.x : Position.x + Origin.x;
rcItem.top = Position.y + Origin.y;
rcItem.right = rcItem.left + infoPtr->nItemWidth;
rcItem.bottom = rcItem.top + infoPtr->nItemHeight;
@@ -1345,10 +1424,8 @@ static inline LRESULT CallWindowProcT(WNDPROC proc, HWND hwnd, UINT uMsg,
static inline BOOL is_autoarrange(const LISTVIEW_INFO *infoPtr)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
-
return ((infoPtr->dwStyle & LVS_AUTOARRANGE) || infoPtr->bAutoarrange) &&
- (uView == LVS_ICON || uView == LVS_SMALLICON);
+ (infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON);
}
static void toggle_checkbox_state(LISTVIEW_INFO *infoPtr, INT nItem)
@@ -1364,6 +1441,39 @@ static void toggle_checkbox_state(LISTVIEW_INFO *infoPtr, INT nItem)
}
}
+/* this should be called after window style got updated,
+ it used to reset view state to match current window style */
+static inline void map_style_view(LISTVIEW_INFO *infoPtr)
+{
+ switch (infoPtr->dwStyle & LVS_TYPEMASK)
+ {
+ case LVS_ICON:
+ infoPtr->uView = LV_VIEW_ICON;
+ break;
+ case LVS_REPORT:
+ infoPtr->uView = LV_VIEW_DETAILS;
+ break;
+ case LVS_SMALLICON:
+ infoPtr->uView = LV_VIEW_SMALLICON;
+ break;
+ case LVS_LIST:
+ infoPtr->uView = LV_VIEW_LIST;
+ }
+}
+
+/* computes next item id value */
+static DWORD get_next_itemid(const LISTVIEW_INFO *infoPtr)
+{
+ INT count = DPA_GetPtrCount(infoPtr->hdpaItemIds);
+
+ if (count > 0)
+ {
+ ITEM_ID *lpID = DPA_GetPtr(infoPtr->hdpaItemIds, count - 1);
+ return lpID->id + 1;
+ }
+ return 0;
+}
+
/******** Internal API functions ************************************/
static inline COLUMN_INFO * LISTVIEW_GetColumnInfo(const LISTVIEW_INFO *infoPtr, INT nSubItem)
@@ -1372,9 +1482,55 @@ static inline COLUMN_INFO * LISTVIEW_GetColumnInfo(const LISTVIEW_INFO *infoPtr,
if (nSubItem == 0 && DPA_GetPtrCount(infoPtr->hdpaColumns) == 0) return &mainItem;
assert (nSubItem >= 0 && nSubItem < DPA_GetPtrCount(infoPtr->hdpaColumns));
+
+ /* update cached column rectangles */
+ if (infoPtr->colRectsDirty)
+ {
+ COLUMN_INFO *info;
+ LISTVIEW_INFO *Ptr = (LISTVIEW_INFO*)infoPtr;
+ INT i;
+
+ for (i = 0; i < DPA_GetPtrCount(infoPtr->hdpaColumns); i++) {
+ info = DPA_GetPtr(infoPtr->hdpaColumns, i);
+ SendMessageW(infoPtr->hwndHeader, HDM_GETITEMRECT, i, (LPARAM)&info->rcHeader);
+ }
+ Ptr->colRectsDirty = FALSE;
+ }
+
return DPA_GetPtr(infoPtr->hdpaColumns, nSubItem);
}
-
+
+static INT LISTVIEW_CreateHeader(LISTVIEW_INFO *infoPtr)
+{
+ DWORD dFlags = WS_CHILD | HDS_HORZ | HDS_FULLDRAG | HDS_DRAGDROP;
+ HINSTANCE hInst;
+
+ if (infoPtr->hwndHeader) return 0;
+
+ TRACE("Creating header for list %p\n", infoPtr->hwndSelf);
+
+ /* setup creation flags */
+ dFlags |= (LVS_NOSORTHEADER & infoPtr->dwStyle) ? 0 : HDS_BUTTONS;
+ dFlags |= (LVS_NOCOLUMNHEADER & infoPtr->dwStyle) ? HDS_HIDDEN : 0;
+
+ hInst = (HINSTANCE)GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_HINSTANCE);
+
+ /* create header */
+ infoPtr->hwndHeader = CreateWindowW(WC_HEADERW, NULL, dFlags,
+ 0, 0, 0, 0, infoPtr->hwndSelf, NULL, hInst, NULL);
+ if (!infoPtr->hwndHeader) return -1;
+
+ /* set header unicode format */
+ SendMessageW(infoPtr->hwndHeader, HDM_SETUNICODEFORMAT, TRUE, 0);
+
+ /* set header font */
+ SendMessageW(infoPtr->hwndHeader, WM_SETFONT, (WPARAM)infoPtr->hFont, (LPARAM)TRUE);
+
+ LISTVIEW_UpdateSize(infoPtr);
+
+ return 0;
+}
+
static inline void LISTVIEW_GetHeaderRect(const LISTVIEW_INFO *infoPtr, INT nSubItem, LPRECT lprc)
{
*lprc = LISTVIEW_GetColumnInfo(infoPtr, nSubItem)->rcHeader;
@@ -1385,6 +1541,13 @@ static inline BOOL LISTVIEW_GetItemW(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpL
return LISTVIEW_GetItemT(infoPtr, lpLVItem, TRUE);
}
+/* used to handle collapse main item column case */
+static inline BOOL LISTVIEW_DrawFocusRect(const LISTVIEW_INFO *infoPtr, HDC hdc)
+{
+ return (infoPtr->rcFocus.left < infoPtr->rcFocus.right) ?
+ DrawFocusRect(hdc, &infoPtr->rcFocus) : FALSE;
+}
+
/* Listview invalidation functions: use _only_ these functions to invalidate */
static inline BOOL is_redrawing(const LISTVIEW_INFO *infoPtr)
@@ -1414,7 +1577,7 @@ static inline void LISTVIEW_InvalidateSubItem(const LISTVIEW_INFO *infoPtr, INT
RECT rcBox;
if(!is_redrawing(infoPtr)) return;
- assert ((infoPtr->dwStyle & LVS_TYPEMASK) == LVS_REPORT);
+ assert (infoPtr->uView == LV_VIEW_DETAILS);
LISTVIEW_GetOrigin(infoPtr, &Origin);
LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position);
LISTVIEW_GetHeaderRect(infoPtr, nSubItem, &rcBox);
@@ -1454,7 +1617,7 @@ static inline INT LISTVIEW_GetCountPerRow(const LISTVIEW_INFO *infoPtr)
{
INT nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
- return max(nListWidth/infoPtr->nItemWidth, 1);
+ return max(nListWidth/(infoPtr->nItemWidth ? infoPtr->nItemWidth : 1), 1);
}
/***
@@ -1547,7 +1710,7 @@ static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, L
/* update the search parameters */
infoPtr->lastKeyPressTimestamp = GetTickCount();
if (infoPtr->lastKeyPressTimestamp - lastKeyPressTimestamp < KEY_DELAY) {
- if (infoPtr->nSearchParamLength < MAX_PATH)
+ if (infoPtr->nSearchParamLength < MAX_PATH-1)
infoPtr->szSearchParam[infoPtr->nSearchParamLength++]=charCode;
if (infoPtr->charCode != charCode)
infoPtr->charCode = charCode = 0;
@@ -1590,7 +1753,7 @@ static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, L
nItem = notify_hdr(infoPtr, LVN_ODFINDITEMW, (LPNMHDR)&nmlv.hdr);
if (nItem != -1)
- LISTVIEW_KeySelection(infoPtr, nItem);
+ LISTVIEW_KeySelection(infoPtr, nItem, FALSE);
return 0;
}
@@ -1623,7 +1786,7 @@ static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, L
} while (idx != endidx);
if (nItem != -1)
- LISTVIEW_KeySelection(infoPtr, nItem);
+ LISTVIEW_KeySelection(infoPtr, nItem, FALSE);
return 0;
}
@@ -1647,6 +1810,8 @@ static void LISTVIEW_UpdateHeaderSize(const LISTVIEW_INFO *infoPtr, INT nNewScro
TRACE("nNewScrollPos=%d\n", nNewScrollPos);
+ if (!infoPtr->hwndHeader) return;
+
GetWindowRect(infoPtr->hwndHeader, &winRect);
point[0].x = winRect.left;
point[0].y = winRect.top;
@@ -1676,7 +1841,6 @@ static void LISTVIEW_UpdateHeaderSize(const LISTVIEW_INFO *infoPtr, INT nNewScro
*/
static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
SCROLLINFO horzInfo, vertInfo;
INT dx, dy;
@@ -1687,7 +1851,7 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
horzInfo.nPage = infoPtr->rcList.right - infoPtr->rcList.left;
/* for now, we'll set info.nMax to the _count_, and adjust it later */
- if (uView == LVS_LIST)
+ if (infoPtr->uView == LV_VIEW_LIST)
{
INT nPerCol = LISTVIEW_GetCountPerColumn(infoPtr);
horzInfo.nMax = (infoPtr->nItemCount + nPerCol - 1) / nPerCol;
@@ -1696,13 +1860,14 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
if(horzInfo.nPage < infoPtr->nItemWidth)
horzInfo.nPage = infoPtr->nItemWidth;
- horzInfo.nPage /= infoPtr->nItemWidth;
+ if (infoPtr->nItemWidth)
+ horzInfo.nPage /= infoPtr->nItemWidth;
}
- else if (uView == LVS_REPORT)
+ else if (infoPtr->uView == LV_VIEW_DETAILS)
{
horzInfo.nMax = infoPtr->nItemWidth;
}
- else /* LVS_ICON, or LVS_SMALLICON */
+ else /* LV_VIEW_ICON, or LV_VIEW_SMALLICON */
{
RECT rcView;
@@ -1724,7 +1889,7 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
vertInfo.cbSize = sizeof(SCROLLINFO);
vertInfo.nPage = infoPtr->rcList.bottom - infoPtr->rcList.top;
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
{
vertInfo.nMax = infoPtr->nItemCount;
@@ -1735,7 +1900,7 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
if (infoPtr->nItemHeight > 0)
vertInfo.nPage /= infoPtr->nItemHeight;
}
- else if (uView != LVS_LIST) /* LVS_ICON, or LVS_SMALLICON */
+ else if (infoPtr->uView != LV_VIEW_LIST) /* LV_VIEW_ICON, or LV_VIEW_SMALLICON */
{
RECT rcView;
@@ -1758,7 +1923,7 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
}
/* Update the Header Control */
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
{
horzInfo.fMask = SIF_POS;
GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo);
@@ -1780,7 +1945,6 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
*/
static void LISTVIEW_ShowFocusRect(const LISTVIEW_INFO *infoPtr, BOOL fShow)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
HDC hdc;
TRACE("fShow=%d, nItem=%d\n", fShow, infoPtr->nFocusedItem);
@@ -1788,7 +1952,7 @@ static void LISTVIEW_ShowFocusRect(const LISTVIEW_INFO *infoPtr, BOOL fShow)
if (infoPtr->nFocusedItem < 0) return;
/* we need some gymnastics in ICON mode to handle large items */
- if ( (infoPtr->dwStyle & LVS_TYPEMASK) == LVS_ICON )
+ if (infoPtr->uView == LV_VIEW_ICON)
{
RECT rcBox;
@@ -1803,7 +1967,7 @@ static void LISTVIEW_ShowFocusRect(const LISTVIEW_INFO *infoPtr, BOOL fShow)
if (!(hdc = GetDC(infoPtr->hwndSelf))) return;
/* for some reason, owner draw should work only in report mode */
- if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (uView == LVS_REPORT))
+ if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (infoPtr->uView == LV_VIEW_DETAILS))
{
DRAWITEMSTRUCT dis;
LVITEMW item;
@@ -1833,7 +1997,7 @@ static void LISTVIEW_ShowFocusRect(const LISTVIEW_INFO *infoPtr, BOOL fShow)
}
else
{
- DrawFocusRect(hdc, &infoPtr->rcFocus);
+ LISTVIEW_DrawFocusRect(infoPtr, hdc);
}
done:
ReleaseDC(infoPtr->hwndSelf, hdc);
@@ -1875,24 +2039,25 @@ static void LISTVIEW_InvalidateSelectedItems(const LISTVIEW_INFO *infoPtr)
*/
static void LISTVIEW_GetItemOrigin(const LISTVIEW_INFO *infoPtr, INT nItem, LPPOINT lpptPosition)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
-
assert(nItem >= 0 && nItem < infoPtr->nItemCount);
- if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
+ if ((infoPtr->uView == LV_VIEW_SMALLICON) || (infoPtr->uView == LV_VIEW_ICON))
{
lpptPosition->x = (LONG_PTR)DPA_GetPtr(infoPtr->hdpaPosX, nItem);
lpptPosition->y = (LONG_PTR)DPA_GetPtr(infoPtr->hdpaPosY, nItem);
}
- else if (uView == LVS_LIST)
+ else if (infoPtr->uView == LV_VIEW_LIST)
{
INT nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
lpptPosition->x = nItem / nCountPerColumn * infoPtr->nItemWidth;
lpptPosition->y = nItem % nCountPerColumn * infoPtr->nItemHeight;
}
- else /* LVS_REPORT */
+ else /* LV_VIEW_DETAILS */
{
- lpptPosition->x = 0;
+ lpptPosition->x = REPORT_MARGINX;
+ /* item is always at zero indexed column */
+ if (DPA_GetPtrCount(infoPtr->hdpaColumns) > 0)
+ lpptPosition->x += LISTVIEW_GetColumnInfo(infoPtr, 0)->rcHeader.left;
lpptPosition->y = nItem * infoPtr->nItemHeight;
}
}
@@ -1943,7 +2108,6 @@ static void LISTVIEW_GetItemMetrics(const LISTVIEW_INFO *infoPtr, const LVITEMW
LPRECT lprcBox, LPRECT lprcSelectBox,
LPRECT lprcIcon, LPRECT lprcStateIcon, LPRECT lprcLabel)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
BOOL doSelectBox = FALSE, doIcon = FALSE, doLabel = FALSE, oversizedBox = FALSE;
RECT Box, SelectBox, Icon, Label;
COLUMN_INFO *lpColumnInfo = NULL;
@@ -1952,8 +2116,8 @@ static void LISTVIEW_GetItemMetrics(const LISTVIEW_INFO *infoPtr, const LVITEMW
TRACE("(lpLVItem=%s)\n", debuglvitem_t(lpLVItem, TRUE));
/* Be smart and try to figure out the minimum we have to do */
- if (lpLVItem->iSubItem) assert(uView == LVS_REPORT);
- if (uView == LVS_ICON && (lprcBox || lprcLabel))
+ if (lpLVItem->iSubItem) assert(infoPtr->uView == LV_VIEW_DETAILS);
+ if (infoPtr->uView == LV_VIEW_ICON && (lprcBox || lprcLabel))
{
assert((lpLVItem->mask & LVIF_STATE) && (lpLVItem->stateMask & LVIS_FOCUSED));
if (lpLVItem->state & LVIS_FOCUSED) oversizedBox = doLabel = TRUE;
@@ -1970,7 +2134,7 @@ static void LISTVIEW_GetItemMetrics(const LISTVIEW_INFO *infoPtr, const LVITEMW
/************************************************************/
/* compute the box rectangle (it should be cheap to do) */
/************************************************************/
- if (lpLVItem->iSubItem || uView == LVS_REPORT)
+ if (lpLVItem->iSubItem || infoPtr->uView == LV_VIEW_DETAILS)
lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, lpLVItem->iSubItem);
if (lpLVItem->iSubItem)
@@ -1995,7 +2159,7 @@ static void LISTVIEW_GetItemMetrics(const LISTVIEW_INFO *infoPtr, const LVITEMW
if (infoPtr->himlState && lpLVItem->iSubItem == 0)
state_width = infoPtr->iconStateSize.cx;
- if (uView == LVS_ICON)
+ if (infoPtr->uView == LV_VIEW_ICON)
{
Icon.left = Box.left + state_width;
if (infoPtr->himlNormal)
@@ -2009,12 +2173,16 @@ static void LISTVIEW_GetItemMetrics(const LISTVIEW_INFO *infoPtr, const LVITEMW
Icon.bottom += infoPtr->iconSize.cy;
}
}
- else /* LVS_SMALLICON, LVS_LIST or LVS_REPORT */
+ else /* LV_VIEW_SMALLICON, LV_VIEW_LIST or LV_VIEW_DETAILS */
{
Icon.left = Box.left + state_width;
- if (uView == LVS_REPORT)
- Icon.left += REPORT_MARGINX;
+ if (infoPtr->uView == LV_VIEW_DETAILS && lpLVItem->iSubItem == 0)
+ {
+ /* we need the indent in report mode */
+ assert(lpLVItem->mask & LVIF_INDENT);
+ Icon.left += infoPtr->iconSize.cx * lpLVItem->iIndent + REPORT_MARGINX;
+ }
Icon.top = Box.top;
Icon.right = Icon.left;
@@ -2046,12 +2214,17 @@ static void LISTVIEW_GetItemMetrics(const LISTVIEW_INFO *infoPtr, const LVITEMW
{
/* calculate how far to the right can the label stretch */
Label.right = Box.right;
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
{
- if (lpLVItem->iSubItem == 0) Label = lpColumnInfo->rcHeader;
+ if (lpLVItem->iSubItem == 0)
+ {
+ /* we need a zero based rect here */
+ Label = lpColumnInfo->rcHeader;
+ OffsetRect(&Label, -Label.left, 0);
+ }
}
- if (lpLVItem->iSubItem || ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && uView == LVS_REPORT))
+ if (lpLVItem->iSubItem || ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && infoPtr->uView == LV_VIEW_DETAILS))
{
labelSize.cx = infoPtr->nItemWidth;
labelSize.cy = infoPtr->nItemHeight;
@@ -2072,18 +2245,20 @@ static void LISTVIEW_GetItemMetrics(const LISTVIEW_INFO *infoPtr, const LVITEMW
SetRectEmpty(&rcText);
rcText.right = infoPtr->nItemWidth - TRAILING_LABEL_PADDING;
rcText.bottom = infoPtr->nItemHeight;
- if (uView == LVS_ICON)
+ if (infoPtr->uView == LV_VIEW_ICON)
rcText.bottom -= ICON_TOP_PADDING + infoPtr->iconSize.cy + ICON_BOTTOM_PADDING;
/* now figure out the flags */
- if (uView == LVS_ICON)
+ if (infoPtr->uView == LV_VIEW_ICON)
uFormat = oversizedBox ? LV_FL_DT_FLAGS : LV_ML_DT_FLAGS;
else
uFormat = LV_SL_DT_FLAGS;
DrawTextW (hdc, lpLVItem->pszText, -1, &rcText, uFormat | DT_CALCRECT);
- labelSize.cx = min(rcText.right - rcText.left + TRAILING_LABEL_PADDING, infoPtr->nItemWidth);
+ if (rcText.right != rcText.left)
+ labelSize.cx = min(rcText.right - rcText.left + TRAILING_LABEL_PADDING, infoPtr->nItemWidth);
+
labelSize.cy = rcText.bottom - rcText.top;
SelectObject(hdc, hOldFont);
@@ -2091,7 +2266,7 @@ static void LISTVIEW_GetItemMetrics(const LISTVIEW_INFO *infoPtr, const LVITEMW
}
calc_label:
- if (uView == LVS_ICON)
+ if (infoPtr->uView == LV_VIEW_ICON)
{
Label.left = Box.left + (infoPtr->nItemWidth - labelSize.cx) / 2;
Label.top = Box.top + ICON_TOP_PADDING_HITABLE +
@@ -2107,14 +2282,15 @@ calc_label:
}
Label.bottom = Label.top + labelSize.cy + HEIGHT_PADDING;
}
- else if (uView == LVS_REPORT)
+ else if (infoPtr->uView == LV_VIEW_DETAILS)
{
Label.left = Icon.right;
Label.top = Box.top;
- Label.right = lpColumnInfo->rcHeader.right;
+ Label.right = lpLVItem->iSubItem ? lpColumnInfo->rcHeader.right :
+ lpColumnInfo->rcHeader.right - lpColumnInfo->rcHeader.left;
Label.bottom = Label.top + infoPtr->nItemHeight;
}
- else /* LVS_SMALLICON, LVS_LIST or LVS_REPORT */
+ else /* LV_VIEW_SMALLICON or LV_VIEW_LIST */
{
Label.left = Icon.right;
Label.top = Box.top;
@@ -2127,22 +2303,20 @@ calc_label:
}
/************************************************************/
- /* compute STATEICON bounding box */
+ /* compute SELECT bounding box */
/************************************************************/
if (doSelectBox)
{
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
{
- SelectBox.left = Icon.right; /* FIXME: should be Icon.left */
+ SelectBox.left = Icon.left;
SelectBox.top = Box.top;
SelectBox.bottom = Box.bottom;
- if (lpLVItem->iSubItem == 0)
- {
- /* we need the indent in report mode */
- assert(lpLVItem->mask & LVIF_INDENT);
- SelectBox.left += infoPtr->iconSize.cx * lpLVItem->iIndent;
- }
- SelectBox.right = min(SelectBox.left + labelSize.cx, Label.right);
+
+ if (labelSize.cx)
+ SelectBox.right = min(Label.left + labelSize.cx, Label.right);
+ else
+ SelectBox.right = min(Label.left + MAX_EMPTYTEXT_SELECT_WIDTH, Label.right);
}
else
{
@@ -2174,7 +2348,6 @@ calc_label:
*/
static void LISTVIEW_GetItemBox(const LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lprcBox)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
POINT Position, Origin;
LVITEMW lvItem;
@@ -2184,14 +2357,14 @@ static void LISTVIEW_GetItemBox(const LISTVIEW_INFO *infoPtr, INT nItem, LPRECT
/* Be smart and try to figure out the minimum we have to do */
lvItem.mask = 0;
- if (uView == LVS_ICON && infoPtr->bFocus && LISTVIEW_GetItemState(infoPtr, nItem, LVIS_FOCUSED))
+ if (infoPtr->uView == LV_VIEW_ICON && infoPtr->bFocus && LISTVIEW_GetItemState(infoPtr, nItem, LVIS_FOCUSED))
lvItem.mask |= LVIF_TEXT;
lvItem.iItem = nItem;
lvItem.iSubItem = 0;
lvItem.pszText = szDispText;
lvItem.cchTextMax = DISP_TEXT_SIZE;
if (lvItem.mask) LISTVIEW_GetItemW(infoPtr, &lvItem);
- if (uView == LVS_ICON)
+ if (infoPtr->uView == LV_VIEW_ICON)
{
lvItem.mask |= LVIF_STATE;
lvItem.stateMask = LVIS_FOCUSED;
@@ -2199,9 +2372,85 @@ static void LISTVIEW_GetItemBox(const LISTVIEW_INFO *infoPtr, INT nItem, LPRECT
}
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, lprcBox, 0, 0, 0, 0);
- OffsetRect(lprcBox, Position.x + Origin.x, Position.y + Origin.y);
+ if (infoPtr->uView == LV_VIEW_DETAILS && infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT &&
+ SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX, 0, 0))
+ {
+ OffsetRect(lprcBox, Origin.x, Position.y + Origin.y);
+ }
+ else
+ OffsetRect(lprcBox, Position.x + Origin.x, Position.y + Origin.y);
}
+/* LISTVIEW_MapIdToIndex helper */
+static INT CALLBACK MapIdSearchCompare(LPVOID p1, LPVOID p2, LPARAM lParam)
+{
+ ITEM_ID *id1 = (ITEM_ID*)p1;
+ ITEM_ID *id2 = (ITEM_ID*)p2;
+
+ if (id1->id == id2->id) return 0;
+
+ return (id1->id < id2->id) ? -1 : 1;
+}
+
+/***
+ * DESCRIPTION:
+ * Returns the item index for id specified.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ * [I] iID : item id to get index for
+ *
+ * RETURN:
+ * Item index, or -1 on failure.
+ */
+static INT LISTVIEW_MapIdToIndex(const LISTVIEW_INFO *infoPtr, UINT iID)
+{
+ ITEM_ID ID;
+ INT index;
+
+ TRACE("iID=%d\n", iID);
+
+ if (infoPtr->dwStyle & LVS_OWNERDATA) return -1;
+ if (infoPtr->nItemCount == 0) return -1;
+
+ ID.id = iID;
+ index = DPA_Search(infoPtr->hdpaItemIds, &ID, -1, &MapIdSearchCompare, 0, DPAS_SORTED);
+
+ if (index != -1)
+ {
+ ITEM_ID *lpID = DPA_GetPtr(infoPtr->hdpaItemIds, index);
+ return DPA_GetPtrIndex(infoPtr->hdpaItems, lpID->item);
+ }
+
+ return -1;
+}
+
+/***
+ * DESCRIPTION:
+ * Returns the item id for index given.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ * [I] iItem : item index to get id for
+ *
+ * RETURN:
+ * Item id.
+ */
+static DWORD LISTVIEW_MapIndexToId(const LISTVIEW_INFO *infoPtr, INT iItem)
+{
+ ITEM_INFO *lpItem;
+ HDPA hdpaSubItems;
+
+ TRACE("iItem=%d\n", iItem);
+
+ if (infoPtr->dwStyle & LVS_OWNERDATA) return -1;
+ if (iItem < 0 || iItem >= infoPtr->nItemCount) return -1;
+
+ hdpaSubItems = DPA_GetPtr(infoPtr->hdpaItems, iItem);
+ lpItem = DPA_GetPtr(hdpaSubItems, 0);
+
+ return lpItem->id->id;
+}
/***
* DESCRIPTION:
@@ -2307,12 +2556,11 @@ static BOOL LISTVIEW_MoveIconTo(const LISTVIEW_INFO *infoPtr, INT nItem, const P
*/
static BOOL LISTVIEW_Arrange(LISTVIEW_INFO *infoPtr, INT nAlignCode)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
void (*next_pos)(LISTVIEW_INFO *, LPPOINT);
POINT pos;
INT i;
- if (uView != LVS_ICON && uView != LVS_SMALLICON) return FALSE;
+ if (infoPtr->uView != LV_VIEW_ICON && infoPtr->uView != LV_VIEW_SMALLICON) return FALSE;
TRACE("nAlignCode=%d\n", nAlignCode);
@@ -2344,6 +2592,7 @@ static BOOL LISTVIEW_Arrange(LISTVIEW_INFO *infoPtr, INT nAlignCode)
/***
* DESCRIPTION:
* Retrieves the bounding rectangle of all the items, not offset by Origin.
+ * For LVS_REPORT always returns empty rectangle.
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
@@ -2359,10 +2608,10 @@ static void LISTVIEW_GetAreaRect(const LISTVIEW_INFO *infoPtr, LPRECT lprcView)
SetRectEmpty(lprcView);
- switch (infoPtr->dwStyle & LVS_TYPEMASK)
+ switch (infoPtr->uView)
{
- case LVS_ICON:
- case LVS_SMALLICON:
+ case LV_VIEW_ICON:
+ case LV_VIEW_SMALLICON:
for (i = 0; i < infoPtr->nItemCount; i++)
{
x = (LONG_PTR)DPA_GetPtr(infoPtr->hdpaPosX, i);
@@ -2377,18 +2626,13 @@ static void LISTVIEW_GetAreaRect(const LISTVIEW_INFO *infoPtr, LPRECT lprcView)
}
break;
- case LVS_LIST:
+ case LV_VIEW_LIST:
y = LISTVIEW_GetCountPerColumn(infoPtr);
x = infoPtr->nItemCount / y;
if (infoPtr->nItemCount % y) x++;
lprcView->right = x * infoPtr->nItemWidth;
lprcView->bottom = y * infoPtr->nItemHeight;
break;
-
- case LVS_REPORT:
- lprcView->right = infoPtr->nItemWidth;
- lprcView->bottom = infoPtr->nItemCount * infoPtr->nItemHeight;
- break;
}
}
@@ -2411,10 +2655,14 @@ static BOOL LISTVIEW_GetViewRect(const LISTVIEW_INFO *infoPtr, LPRECT lprcView)
TRACE("(lprcView=%p)\n", lprcView);
if (!lprcView) return FALSE;
-
- LISTVIEW_GetOrigin(infoPtr, &ptOrigin);
- LISTVIEW_GetAreaRect(infoPtr, lprcView);
- OffsetRect(lprcView, ptOrigin.x, ptOrigin.y);
+
+ LISTVIEW_GetAreaRect(infoPtr, lprcView);
+
+ if (infoPtr->uView != LV_VIEW_DETAILS)
+ {
+ LISTVIEW_GetOrigin(infoPtr, &ptOrigin);
+ OffsetRect(lprcView, ptOrigin.x, ptOrigin.y);
+ }
TRACE("lprcView=%s\n", wine_dbgstr_rect(lprcView));
@@ -2462,24 +2710,27 @@ static SUBITEM_INFO* LISTVIEW_GetSubItemPtr(HDPA hdpaSubItems, INT nSubItem)
*/
static INT LISTVIEW_CalculateItemWidth(const LISTVIEW_INFO *infoPtr)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT nItemWidth = 0;
- TRACE("uView=%d\n", uView);
+ TRACE("uView=%d\n", infoPtr->uView);
- if (uView == LVS_ICON)
+ if (infoPtr->uView == LV_VIEW_ICON)
nItemWidth = infoPtr->iconSpacing.cx;
- else if (uView == LVS_REPORT)
+ else if (infoPtr->uView == LV_VIEW_DETAILS)
{
- RECT rcHeader;
-
if (DPA_GetPtrCount(infoPtr->hdpaColumns) > 0)
{
- LISTVIEW_GetHeaderRect(infoPtr, DPA_GetPtrCount(infoPtr->hdpaColumns) - 1, &rcHeader);
+ RECT rcHeader;
+ INT index;
+
+ index = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX,
+ DPA_GetPtrCount(infoPtr->hdpaColumns) - 1, 0);
+
+ LISTVIEW_GetHeaderRect(infoPtr, index, &rcHeader);
nItemWidth = rcHeader.right;
}
}
- else /* LVS_SMALLICON, or LVS_LIST */
+ else /* LV_VIEW_SMALLICON, or LV_VIEW_LIST */
{
INT i;
@@ -2492,7 +2743,7 @@ static INT LISTVIEW_CalculateItemWidth(const LISTVIEW_INFO *infoPtr)
nItemWidth = max(DEFAULT_COLUMN_WIDTH, nItemWidth + WIDTH_PADDING);
}
- return max(nItemWidth, 1);
+ return nItemWidth;
}
/***
@@ -2507,17 +2758,16 @@ static INT LISTVIEW_CalculateItemWidth(const LISTVIEW_INFO *infoPtr)
*/
static INT LISTVIEW_CalculateItemHeight(const LISTVIEW_INFO *infoPtr)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT nItemHeight;
- TRACE("uView=%d\n", uView);
+ TRACE("uView=%d\n", infoPtr->uView);
- if (uView == LVS_ICON)
+ if (infoPtr->uView == LV_VIEW_ICON)
nItemHeight = infoPtr->iconSpacing.cy;
else
{
nItemHeight = infoPtr->ntmHeight;
- if (uView == LVS_REPORT && infoPtr->dwLvExStyle & LVS_EX_GRIDLINES)
+ if (infoPtr->uView == LV_VIEW_DETAILS && infoPtr->dwLvExStyle & LVS_EX_GRIDLINES)
nItemHeight++;
if (infoPtr->himlState)
nItemHeight = max(nItemHeight, infoPtr->iconStateSize.cy);
@@ -2626,15 +2876,17 @@ static void ranges_assert(RANGES ranges, LPCSTR desc, const char *func, int line
assert (ranges);
assert (DPA_GetPtrCount(ranges->hdpa) >= 0);
ranges_dump(ranges);
- prev = DPA_GetPtr(ranges->hdpa, 0);
if (DPA_GetPtrCount(ranges->hdpa) > 0)
- assert (prev->lower >= 0 && prev->lower < prev->upper);
- for (i = 1; i < DPA_GetPtrCount(ranges->hdpa); i++)
{
- curr = DPA_GetPtr(ranges->hdpa, i);
- assert (prev->upper <= curr->lower);
- assert (curr->lower < curr->upper);
- prev = curr;
+ prev = DPA_GetPtr(ranges->hdpa, 0);
+ assert (prev->lower >= 0 && prev->lower < prev->upper);
+ for (i = 1; i < DPA_GetPtrCount(ranges->hdpa); i++)
+ {
+ curr = DPA_GetPtr(ranges->hdpa, i);
+ assert (prev->upper <= curr->lower);
+ assert (curr->lower < curr->upper);
+ prev = curr;
+ }
}
TRACE("--- Done checking---\n");
}
@@ -2913,7 +3165,7 @@ fail:
*
* RETURNS:
* SUCCESS : TRUE
-* FAILURE : TRUE
+* FAILURE : FALSE
*/
static BOOL LISTVIEW_DeselectAllSkipItems(LISTVIEW_INFO *infoPtr, RANGES toSkip)
{
@@ -3124,7 +3376,6 @@ static BOOL LISTVIEW_AddGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem)
*/
static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
RANGES selection;
LVITEMW item;
ITERATOR i;
@@ -3135,7 +3386,7 @@ static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem)
item.state = LVIS_SELECTED;
item.stateMask = LVIS_SELECTED;
- if ((uView == LVS_LIST) || (uView == LVS_REPORT))
+ if ((infoPtr->uView == LV_VIEW_LIST) || (infoPtr->uView == LV_VIEW_DETAILS))
{
if (infoPtr->nSelectionMark == -1)
{
@@ -3170,8 +3421,10 @@ static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem)
iterator_destroy(&i);
}
+ /* disable per item notifications on LVS_OWNERDATA style
+ FIXME: single LVN_ODSTATECHANGED should be used */
bOldChange = infoPtr->bDoChangeNotify;
- infoPtr->bDoChangeNotify = FALSE;
+ if (infoPtr->dwStyle & LVS_OWNERDATA) infoPtr->bDoChangeNotify = FALSE;
LISTVIEW_DeselectAllSkipItems(infoPtr, selection);
@@ -3220,12 +3473,13 @@ static void LISTVIEW_SetSelection(LISTVIEW_INFO *infoPtr, INT nItem)
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
* [I] nItem : item index
+ * [I] space : VK_SPACE code sent
*
* RETURN:
* SUCCESS : TRUE (needs to be repainted)
* FAILURE : FALSE (nothing has changed)
*/
-static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *infoPtr, INT nItem)
+static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *infoPtr, INT nItem, BOOL space)
{
/* FIXME: pass in the state */
WORD wShift = HIWORD(GetKeyState(VK_SHIFT));
@@ -3235,35 +3489,27 @@ static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *infoPtr, INT nItem)
TRACE("nItem=%d, wShift=%d, wCtrl=%d\n", nItem, wShift, wCtrl);
if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
{
- if (infoPtr->dwStyle & LVS_SINGLESEL)
- {
- bResult = TRUE;
+ bResult = TRUE;
+
+ if (infoPtr->dwStyle & LVS_SINGLESEL || (wShift == 0 && wCtrl == 0))
LISTVIEW_SetSelection(infoPtr, nItem);
- }
else
{
if (wShift)
- {
- bResult = TRUE;
LISTVIEW_SetGroupSelection(infoPtr, nItem);
- }
else if (wCtrl)
{
LVITEMW lvItem;
lvItem.state = ~LISTVIEW_GetItemState(infoPtr, nItem, LVIS_SELECTED);
lvItem.stateMask = LVIS_SELECTED;
- LISTVIEW_SetItemState(infoPtr, nItem, &lvItem);
-
- if (lvItem.state & LVIS_SELECTED)
- infoPtr->nSelectionMark = nItem;
-
+ if (space)
+ {
+ LISTVIEW_SetItemState(infoPtr, nItem, &lvItem);
+ if (lvItem.state & LVIS_SELECTED)
+ infoPtr->nSelectionMark = nItem;
+ }
bResult = LISTVIEW_SetItemFocus(infoPtr, nItem);
}
- else
- {
- bResult = TRUE;
- LISTVIEW_SetSelection(infoPtr, nItem);
- }
}
LISTVIEW_EnsureVisible(infoPtr, nItem, FALSE);
}
@@ -3354,6 +3600,7 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, IN
{
POINT tmp;
RECT rect;
+ LVHITTESTINFO lvHitTestInfo;
WORD wDragWidth = GetSystemMetrics(SM_CXDRAG);
WORD wDragHeight= GetSystemMetrics(SM_CYDRAG);
@@ -3365,20 +3612,42 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, IN
tmp.x = x;
tmp.y = y;
+ lvHitTestInfo.pt = tmp;
+ LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, TRUE);
+
+ /* reset item marker */
+ if (infoPtr->nLButtonDownItem != lvHitTestInfo.iItem)
+ infoPtr->nLButtonDownItem = -1;
+
if (!PtInRect(&rect, tmp))
{
- LVHITTESTINFO lvHitTestInfo;
- NMLISTVIEW nmlv;
+ /* this path covers the following:
+ 1. WM_LBUTTONDOWN over selected item (sets focus on it)
+ 2. change focus with keys
+ 3. move mouse over item from step 1 selects it and moves focus on it */
+ if (infoPtr->nLButtonDownItem != -1 &&
+ !LISTVIEW_GetItemState(infoPtr, infoPtr->nLButtonDownItem, LVIS_SELECTED))
+ {
+ LVITEMW lvItem;
- lvHitTestInfo.pt = infoPtr->ptClickPos;
- LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, TRUE);
+ lvItem.state = LVIS_FOCUSED | LVIS_SELECTED;
+ lvItem.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
- ZeroMemory(&nmlv, sizeof(nmlv));
- nmlv.iItem = lvHitTestInfo.iItem;
- nmlv.ptAction = infoPtr->ptClickPos;
+ LISTVIEW_SetItemState(infoPtr, infoPtr->nLButtonDownItem, &lvItem);
+ infoPtr->nLButtonDownItem = -1;
+ }
if (!infoPtr->bDragging)
{
+ NMLISTVIEW nmlv;
+
+ lvHitTestInfo.pt = infoPtr->ptClickPos;
+ LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, TRUE);
+
+ ZeroMemory(&nmlv, sizeof(nmlv));
+ nmlv.iItem = lvHitTestInfo.iItem;
+ nmlv.ptAction = infoPtr->ptClickPos;
+
notify_listview(infoPtr, LVN_BEGINDRAG, &nmlv);
infoPtr->bDragging = TRUE;
}
@@ -3386,8 +3655,6 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, IN
return 0;
}
}
- else
- infoPtr->bLButtonDown = FALSE;
/* see if we are supposed to be tracking mouse hovering */
if (LISTVIEW_isHotTracking(infoPtr)) {
@@ -3442,11 +3709,12 @@ static inline BOOL is_assignable_item(const LVITEMW *lpLVItem, LONG lStyle)
*/
static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL isNew, BOOL isW, BOOL *bChanged)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
ITEM_INFO *lpItem;
NMLISTVIEW nmlv;
UINT uChanged = 0;
LVITEMW item;
+ /* stateMask is ignored for LVM_INSERTITEM */
+ UINT stateMask = isNew ? ~0 : lpLVItem->stateMask;
TRACE("()\n");
@@ -3472,14 +3740,15 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL
item.iItem = lpLVItem->iItem;
item.iSubItem = lpLVItem->iSubItem;
item.mask = LVIF_STATE | LVIF_PARAM;
- item.stateMask = ~0;
+ item.stateMask = (infoPtr->dwStyle & LVS_OWNERDATA) ? LVIS_FOCUSED | LVIS_SELECTED : ~0;
+
item.state = 0;
item.lParam = 0;
if (!isNew && !LISTVIEW_GetItemW(infoPtr, &item)) return FALSE;
TRACE("oldState=%x, newState=%x\n", item.state, lpLVItem->state);
/* determine what fields will change */
- if ((lpLVItem->mask & LVIF_STATE) && ((item.state ^ lpLVItem->state) & lpLVItem->stateMask & ~infoPtr->uCallbackMask))
+ if ((lpLVItem->mask & LVIF_STATE) && ((item.state ^ lpLVItem->state) & stateMask & ~infoPtr->uCallbackMask))
uChanged |= LVIF_STATE;
if ((lpLVItem->mask & LVIF_IMAGE) && (lpItem->hdr.iImage != lpLVItem->iImage))
@@ -3500,7 +3769,7 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL
ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
nmlv.iItem = lpLVItem->iItem;
- nmlv.uNewState = (item.state & ~lpLVItem->stateMask) | (lpLVItem->state & lpLVItem->stateMask);
+ nmlv.uNewState = (item.state & ~stateMask) | (lpLVItem->state & stateMask);
nmlv.uOldState = item.state;
nmlv.uChanged = uChanged;
nmlv.lParam = item.lParam;
@@ -3533,30 +3802,43 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL
if (uChanged & LVIF_STATE)
{
- if (lpItem && (lpLVItem->stateMask & ~infoPtr->uCallbackMask & ~(LVIS_FOCUSED | LVIS_SELECTED)))
+ if (lpItem && (stateMask & ~infoPtr->uCallbackMask))
{
- lpItem->state &= ~lpLVItem->stateMask;
- lpItem->state |= (lpLVItem->state & lpLVItem->stateMask);
+ lpItem->state &= ~stateMask;
+ lpItem->state |= (lpLVItem->state & stateMask);
}
- if (lpLVItem->state & lpLVItem->stateMask & ~infoPtr->uCallbackMask & LVIS_SELECTED)
+ if (lpLVItem->state & stateMask & ~infoPtr->uCallbackMask & LVIS_SELECTED)
{
if (infoPtr->dwStyle & LVS_SINGLESEL) LISTVIEW_DeselectAllSkipItem(infoPtr, lpLVItem->iItem);
ranges_additem(infoPtr->selectionRanges, lpLVItem->iItem);
}
- else if (lpLVItem->stateMask & LVIS_SELECTED)
+ else if (stateMask & LVIS_SELECTED)
+ {
ranges_delitem(infoPtr->selectionRanges, lpLVItem->iItem);
-
+ }
/* if we are asked to change focus, and we manage it, do it */
- if (lpLVItem->stateMask & ~infoPtr->uCallbackMask & LVIS_FOCUSED)
+ if (stateMask & ~infoPtr->uCallbackMask & LVIS_FOCUSED)
{
if (lpLVItem->state & LVIS_FOCUSED)
{
- LISTVIEW_SetItemFocus(infoPtr, -1);
+ if (infoPtr->nFocusedItem != -1)
+ {
+ /* remove current focus */
+ item.mask = LVIF_STATE;
+ item.state = 0;
+ item.stateMask = LVIS_FOCUSED;
+
+ /* recurse with redrawing an item */
+ LISTVIEW_SetItemState(infoPtr, infoPtr->nFocusedItem, &item);
+ }
+
infoPtr->nFocusedItem = lpLVItem->iItem;
- LISTVIEW_EnsureVisible(infoPtr, lpLVItem->iItem, uView == LVS_LIST);
+ LISTVIEW_EnsureVisible(infoPtr, lpLVItem->iItem, infoPtr->uView == LV_VIEW_LIST);
}
else if (infoPtr->nFocusedItem == lpLVItem->iItem)
- infoPtr->nFocusedItem = -1;
+ {
+ infoPtr->nFocusedItem = -1;
+ }
}
}
@@ -3638,12 +3920,11 @@ static BOOL set_sub_item(const LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
*bChanged = TRUE;
}
- if (lpLVItem->mask & LVIF_TEXT)
- if (lpSubItem->hdr.pszText != lpLVItem->pszText)
- {
- textsetptrT(&lpSubItem->hdr.pszText, lpLVItem->pszText, isW);
- *bChanged = TRUE;
- }
+ if ((lpLVItem->mask & LVIF_TEXT) && textcmpWT(lpSubItem->hdr.pszText, lpLVItem->pszText, isW))
+ {
+ textsetptrT(&lpSubItem->hdr.pszText, lpLVItem->pszText, isW);
+ *bChanged = TRUE;
+ }
return TRUE;
}
@@ -3663,7 +3944,6 @@ static BOOL set_sub_item(const LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
*/
static BOOL LISTVIEW_SetItemT(LISTVIEW_INFO *infoPtr, LVITEMW *lpLVItem, BOOL isW)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
HWND hwndSelf = infoPtr->hwndSelf;
LPWSTR pszText = NULL;
BOOL bResult, bChanged = FALSE;
@@ -3694,7 +3974,7 @@ static BOOL LISTVIEW_SetItemT(LISTVIEW_INFO *infoPtr, LVITEMW *lpLVItem, BOOL is
if (bChanged && !infoPtr->bIsDrawing)
{
/* this little optimization eliminates some nasty flicker */
- if ( uView == LVS_REPORT && !(infoPtr->dwStyle & LVS_OWNERDRAWFIXED) &&
+ if ( infoPtr->uView == LV_VIEW_DETAILS && !(infoPtr->dwStyle & LVS_OWNERDRAWFIXED) &&
!(infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT) &&
lpLVItem->iSubItem > 0 && lpLVItem->iSubItem <= DPA_GetPtrCount(infoPtr->hdpaColumns) )
LISTVIEW_InvalidateSubItem(infoPtr, lpLVItem->iItem, lpLVItem->iSubItem);
@@ -3723,19 +4003,18 @@ static BOOL LISTVIEW_SetItemT(LISTVIEW_INFO *infoPtr, LVITEMW *lpLVItem, BOOL is
*/
static INT LISTVIEW_GetTopIndex(const LISTVIEW_INFO *infoPtr)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT nItem = 0;
SCROLLINFO scrollInfo;
scrollInfo.cbSize = sizeof(SCROLLINFO);
scrollInfo.fMask = SIF_POS;
- if (uView == LVS_LIST)
+ if (infoPtr->uView == LV_VIEW_LIST)
{
if (GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo))
nItem = scrollInfo.nPos * LISTVIEW_GetCountPerColumn(infoPtr);
}
- else if (uView == LVS_REPORT)
+ else if (infoPtr->uView == LV_VIEW_DETAILS)
{
if (GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo))
nItem = scrollInfo.nPos;
@@ -3792,7 +4071,7 @@ static inline BOOL LISTVIEW_FillBkgnd(const LISTVIEW_INFO *infoPtr, HDC hdc, con
*/
static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nSubItem, POINT pos, DWORD cdmode)
{
- UINT uFormat, uView = infoPtr->dwStyle & LVS_TYPEMASK;
+ UINT uFormat;
WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
static WCHAR szCallback[] = { '(', 'c', 'a', 'l', 'l', 'b', 'a', 'c', 'k', ')', 0 };
DWORD cdsubitemmode = CDRF_DODEFAULT;
@@ -3808,7 +4087,7 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
/* get information needed for drawing the item */
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
if (nSubItem == 0) lvItem.mask |= LVIF_STATE;
- if (uView == LVS_REPORT) lvItem.mask |= LVIF_INDENT;
+ if (infoPtr->uView == LV_VIEW_DETAILS) lvItem.mask |= LVIF_INDENT;
lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED | LVIS_STATEIMAGEMASK;
lvItem.iItem = nItem;
lvItem.iSubItem = nSubItem;
@@ -3858,9 +4137,48 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
prepaint_setup(infoPtr, hdc, &nmlvcd, TRUE);
/* in full row select, subitems, will just use main item's colors */
- if (nSubItem && uView == LVS_REPORT && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
+ if (nSubItem && infoPtr->uView == LV_VIEW_DETAILS && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
nmlvcd.clrTextBk = CLR_NONE;
+ /* FIXME: temporary hack */
+ rcSelect.left = rcLabel.left;
+
+ /* draw the selection background, if we're drawing the main item */
+ if (nSubItem == 0)
+ {
+ /* in icon mode, the label rect is really what we want to draw the
+ * background for */
+ if (infoPtr->uView == LV_VIEW_ICON)
+ rcSelect = rcLabel;
+
+ if (infoPtr->uView == LV_VIEW_DETAILS && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
+ {
+ /* we have to update left focus bound too if item isn't in leftmost column
+ and reduce right box bound */
+ if (DPA_GetPtrCount(infoPtr->hdpaColumns) > 0)
+ {
+ INT leftmost;
+
+ if ((leftmost = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX, 0, 0)))
+ {
+ INT Originx = pos.x - LISTVIEW_GetColumnInfo(infoPtr, 0)->rcHeader.left;
+ INT index = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX,
+ DPA_GetPtrCount(infoPtr->hdpaColumns) - 1, 0);
+
+ rcBox.right = LISTVIEW_GetColumnInfo(infoPtr, index)->rcHeader.right + Originx;
+ rcSelect.left = LISTVIEW_GetColumnInfo(infoPtr, leftmost)->rcHeader.left + Originx;
+ }
+ }
+
+ rcSelect.right = rcBox.right;
+ }
+
+ if (nmlvcd.clrTextBk != CLR_NONE)
+ ExtTextOutW(hdc, rcSelect.left, rcSelect.top, ETO_OPAQUE, &rcSelect, NULL, 0, NULL);
+ /* store new focus rectangle */
+ if (infoPtr->nFocusedItem == nItem) infoPtr->rcFocus = rcSelect;
+ }
+
/* state icons */
if (infoPtr->himlState && STATEIMAGEINDEX(lvItem.state) && (nSubItem == 0))
{
@@ -3874,7 +4192,7 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
}
/* small icons */
- himl = (uView == LVS_ICON ? infoPtr->himlNormal : infoPtr->himlSmall);
+ himl = (infoPtr->uView == LV_VIEW_ICON ? infoPtr->himlNormal : infoPtr->himlSmall);
if (himl && lvItem.iImage >= 0 && !IsRectEmpty(&rcIcon))
{
TRACE("iImage=%d\n", lvItem.iImage);
@@ -3885,29 +4203,10 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
/* Don't bother painting item being edited */
if (infoPtr->hwndEdit && nItem == infoPtr->nEditLabelItem && nSubItem == 0) goto postpaint;
-
- /* FIXME: temporary hack */
- rcSelect.left = rcLabel.left;
-
- /* draw the selection background, if we're drawing the main item */
- if (nSubItem == 0)
- {
- /* in icon mode, the label rect is really what we want to draw the
- * background for */
- if (uView == LVS_ICON)
- rcSelect = rcLabel;
-
- if (uView == LVS_REPORT && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))
- rcSelect.right = rcBox.right;
-
- if (nmlvcd.clrTextBk != CLR_NONE)
- ExtTextOutW(hdc, rcSelect.left, rcSelect.top, ETO_OPAQUE, &rcSelect, 0, 0, 0);
- if(lprcFocus) *lprcFocus = rcSelect;
- }
/* figure out the text drawing flags */
- uFormat = (uView == LVS_ICON ? (lprcFocus ? LV_FL_DT_FLAGS : LV_ML_DT_FLAGS) : LV_SL_DT_FLAGS);
- if (uView == LVS_ICON)
+ uFormat = (infoPtr->uView == LV_VIEW_ICON ? (lprcFocus ? LV_FL_DT_FLAGS : LV_ML_DT_FLAGS) : LV_SL_DT_FLAGS);
+ if (infoPtr->uView == LV_VIEW_ICON)
uFormat = (lprcFocus ? LV_FL_DT_FLAGS : LV_ML_DT_FLAGS);
else if (nSubItem)
{
@@ -3926,7 +4225,7 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
else if (uFormat & DT_RIGHT) rcLabel.right -= LABEL_HOR_PADDING;
/* for GRIDLINES reduce the bottom so the text formats correctly */
- if (uView == LVS_REPORT && infoPtr->dwLvExStyle & LVS_EX_GRIDLINES)
+ if (infoPtr->uView == LV_VIEW_DETAILS && infoPtr->dwLvExStyle & LVS_EX_GRIDLINES)
rcLabel.bottom--;
DrawTextW(hdc, lvItem.pszText, -1, &rcLabel, uFormat);
@@ -4029,7 +4328,8 @@ static void LISTVIEW_RefreshReport(LISTVIEW_INFO *infoPtr, ITERATOR *i, HDC hdc,
INT rgntype;
RECT rcClip, rcItem;
POINT Origin, Position;
- RANGE colRange;
+ RANGES colRanges;
+ INT col, index;
ITERATOR j;
TRACE("()\n");
@@ -4040,19 +4340,19 @@ static void LISTVIEW_RefreshReport(LISTVIEW_INFO *infoPtr, ITERATOR *i, HDC hdc,
/* Get scroll info once before loop */
LISTVIEW_GetOrigin(infoPtr, &Origin);
-
+
+ colRanges = ranges_create(DPA_GetPtrCount(infoPtr->hdpaColumns));
+
/* narrow down the columns we need to paint */
- for(colRange.lower = 0; colRange.lower < DPA_GetPtrCount(infoPtr->hdpaColumns); colRange.lower++)
+ for(col = 0; col < DPA_GetPtrCount(infoPtr->hdpaColumns); col++)
{
- LISTVIEW_GetHeaderRect(infoPtr, colRange.lower, &rcItem);
- if (rcItem.right + Origin.x >= rcClip.left) break;
+ index = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX, col, 0);
+
+ LISTVIEW_GetHeaderRect(infoPtr, index, &rcItem);
+ if ((rcItem.right + Origin.x >= rcClip.left) && (rcItem.left + Origin.x < rcClip.right))
+ ranges_additem(colRanges, index);
}
- for(colRange.upper = DPA_GetPtrCount(infoPtr->hdpaColumns); colRange.upper > 0; colRange.upper--)
- {
- LISTVIEW_GetHeaderRect(infoPtr, colRange.upper - 1, &rcItem);
- if (rcItem.left + Origin.x < rcClip.right) break;
- }
- iterator_rangeitems(&j, colRange);
+ iterator_rangesitems(&j, colRanges);
/* in full row select, we _have_ to draw the main item */
if (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT)
@@ -4061,19 +4361,20 @@ static void LISTVIEW_RefreshReport(LISTVIEW_INFO *infoPtr, ITERATOR *i, HDC hdc,
/* iterate through the invalidated rows */
while(iterator_next(i))
{
+ LISTVIEW_GetItemOrigin(infoPtr, i->nItem, &Position);
+ Position.y += Origin.y;
+
/* iterate through the invalidated columns */
while(iterator_next(&j))
{
- LISTVIEW_GetItemOrigin(infoPtr, i->nItem, &Position);
- Position.x += Origin.x;
- Position.y += Origin.y;
+ LISTVIEW_GetHeaderRect(infoPtr, j.nItem, &rcItem);
+ Position.x = (j.nItem == 0) ? rcItem.left + Origin.x : Origin.x;
if (rgntype == COMPLEXREGION && !((infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT) && j.nItem == 0))
{
- LISTVIEW_GetHeaderRect(infoPtr, j.nItem, &rcItem);
rcItem.top = 0;
rcItem.bottom = infoPtr->nItemHeight;
- OffsetRect(&rcItem, Position.x, Position.y);
+ OffsetRect(&rcItem, Origin.x, Position.y);
if (!RectVisible(hdc, &rcItem)) continue;
}
@@ -4098,11 +4399,13 @@ static void LISTVIEW_RefreshReportGrid(LISTVIEW_INFO *infoPtr, HDC hdc)
{
INT rgntype;
INT y, itemheight;
+ INT col, index;
HPEN hPen, hOldPen;
- RECT rcClip, rcItem;
+ RECT rcClip, rcItem = {0};
POINT Origin;
- RANGE colRange;
+ RANGES colRanges;
ITERATOR j;
+ BOOL rmost = FALSE;
TRACE("()\n");
@@ -4113,29 +4416,36 @@ static void LISTVIEW_RefreshReportGrid(LISTVIEW_INFO *infoPtr, HDC hdc)
/* Get scroll info once before loop */
LISTVIEW_GetOrigin(infoPtr, &Origin);
+ colRanges = ranges_create(DPA_GetPtrCount(infoPtr->hdpaColumns));
+
/* narrow down the columns we need to paint */
- for(colRange.lower = 0; colRange.lower < DPA_GetPtrCount(infoPtr->hdpaColumns); colRange.lower++)
+ for(col = 0; col < DPA_GetPtrCount(infoPtr->hdpaColumns); col++)
{
- LISTVIEW_GetHeaderRect(infoPtr, colRange.lower, &rcItem);
- if (rcItem.right + Origin.x >= rcClip.left) break;
+ index = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX, col, 0);
+
+ LISTVIEW_GetHeaderRect(infoPtr, index, &rcItem);
+ if ((rcItem.right + Origin.x >= rcClip.left) && (rcItem.left + Origin.x < rcClip.right))
+ ranges_additem(colRanges, index);
}
- for(colRange.upper = DPA_GetPtrCount(infoPtr->hdpaColumns); colRange.upper > 0; colRange.upper--)
+
+ /* is right most vertical line visible? */
+ if (DPA_GetPtrCount(infoPtr->hdpaColumns) > 0)
{
- LISTVIEW_GetHeaderRect(infoPtr, colRange.upper - 1, &rcItem);
- if (rcItem.left + Origin.x < rcClip.right) break;
+ index = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX, DPA_GetPtrCount(infoPtr->hdpaColumns) - 1, 0);
+ LISTVIEW_GetHeaderRect(infoPtr, index, &rcItem);
+ rmost = (rcItem.right + Origin.x < rcClip.right);
}
- iterator_rangeitems(&j, colRange);
if ((hPen = CreatePen( PS_SOLID, 1, comctl32_color.clr3dFace )))
{
hOldPen = SelectObject ( hdc, hPen );
/* draw the vertical lines for the columns */
- iterator_rangeitems(&j, colRange);
+ iterator_rangesitems(&j, colRanges);
while(iterator_next(&j))
{
LISTVIEW_GetHeaderRect(infoPtr, j.nItem, &rcItem);
- if (rcItem.left == 0) continue; /* skip first column */
+ if (rcItem.left == 0) continue; /* skip leftmost column */
rcItem.left += Origin.x;
rcItem.right += Origin.x;
rcItem.top = infoPtr->rcList.top;
@@ -4145,11 +4455,23 @@ static void LISTVIEW_RefreshReportGrid(LISTVIEW_INFO *infoPtr, HDC hdc)
LineTo (hdc, rcItem.left, rcItem.bottom);
}
iterator_destroy(&j);
+ /* draw rightmost grid line if visible */
+ if (rmost)
+ {
+ index = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX,
+ DPA_GetPtrCount(infoPtr->hdpaColumns) - 1, 0);
+ LISTVIEW_GetHeaderRect(infoPtr, index, &rcItem);
+
+ rcItem.right += Origin.x;
+
+ MoveToEx (hdc, rcItem.right, infoPtr->rcList.top, NULL);
+ LineTo (hdc, rcItem.right, infoPtr->rcList.bottom);
+ }
/* draw the horizontial lines for the rows */
itemheight = LISTVIEW_CalculateItemHeight(infoPtr);
- rcItem.left = infoPtr->rcList.left + Origin.x;
- rcItem.right = infoPtr->rcList.right + Origin.x;
+ rcItem.left = infoPtr->rcList.left;
+ rcItem.right = infoPtr->rcList.right;
rcItem.bottom = rcItem.top = Origin.y - 1;
MoveToEx(hdc, rcItem.left, rcItem.top, NULL);
LineTo(hdc, rcItem.right, rcItem.top);
@@ -4210,7 +4532,6 @@ static void LISTVIEW_RefreshList(LISTVIEW_INFO *infoPtr, ITERATOR *i, HDC hdc, D
*/
static void LISTVIEW_Refresh(LISTVIEW_INFO *infoPtr, HDC hdc, const RECT *prcErase)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
COLORREF oldTextColor = 0, oldBkColor = 0, oldClrTextBk, oldClrText;
NMLVCUSTOMDRAW nmlvcd;
HFONT hOldFont = 0;
@@ -4220,6 +4541,7 @@ static void LISTVIEW_Refresh(LISTVIEW_INFO *infoPtr, HDC hdc, const RECT *prcEra
ITERATOR i;
HDC hdcOrig = hdc;
HBITMAP hbmp = NULL;
+ RANGE range;
LISTVIEW_DUMP(infoPtr);
@@ -4285,11 +4607,11 @@ static void LISTVIEW_Refresh(LISTVIEW_INFO *infoPtr, HDC hdc, const RECT *prcEra
/* figure out what we need to draw */
iterator_visibleitems(&i, infoPtr, hdc);
-
+ range = iterator_range(&i);
+
/* send cache hint notification */
if (infoPtr->dwStyle & LVS_OWNERDATA)
{
- RANGE range = iterator_range(&i);
NMLVCACHEHINT nmlv;
ZeroMemory(&nmlv, sizeof(NMLVCACHEHINT));
@@ -4298,26 +4620,26 @@ static void LISTVIEW_Refresh(LISTVIEW_INFO *infoPtr, HDC hdc, const RECT *prcEra
notify_hdr(infoPtr, LVN_ODCACHEHINT, &nmlv.hdr);
}
- if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (uView == LVS_REPORT))
+ if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (infoPtr->uView == LV_VIEW_DETAILS))
LISTVIEW_RefreshOwnerDraw(infoPtr, &i, hdc, cdmode);
else
{
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
LISTVIEW_RefreshReport(infoPtr, &i, hdc, cdmode);
- else /* LVS_LIST, LVS_ICON or LVS_SMALLICON */
+ else /* LV_VIEW_LIST, LV_VIEW_ICON or LV_VIEW_SMALLICON */
LISTVIEW_RefreshList(infoPtr, &i, hdc, cdmode);
- /* if we have a focus rect, draw it */
- if (infoPtr->bFocus)
- DrawFocusRect(hdc, &infoPtr->rcFocus);
+ /* if we have a focus rect and it's visible, draw it */
+ if (infoPtr->bFocus && range.lower <= infoPtr->nFocusedItem &&
+ (range.upper - 1) >= infoPtr->nFocusedItem)
+ LISTVIEW_DrawFocusRect(infoPtr, hdc);
}
iterator_destroy(&i);
enddraw:
/* For LVS_EX_GRIDLINES go and draw lines */
/* This includes the case where there were *no* items */
- if ((infoPtr->dwStyle & LVS_TYPEMASK) == LVS_REPORT &&
- infoPtr->dwLvExStyle & LVS_EX_GRIDLINES)
+ if ((infoPtr->uView == LV_VIEW_DETAILS) && infoPtr->dwLvExStyle & LVS_EX_GRIDLINES)
LISTVIEW_RefreshReportGrid(infoPtr, hdc);
if (cdmode & CDRF_NOTIFYPOSTPAINT)
@@ -4361,7 +4683,6 @@ enddraw:
static DWORD LISTVIEW_ApproximateViewRect(const LISTVIEW_INFO *infoPtr, INT nItemCount,
WORD wWidth, WORD wHeight)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT nItemCountPerColumn = 1;
INT nColumnCount = 0;
DWORD dwViewRect = 0;
@@ -4369,7 +4690,7 @@ static DWORD LISTVIEW_ApproximateViewRect(const LISTVIEW_INFO *infoPtr, INT nIte
if (nItemCount == -1)
nItemCount = infoPtr->nItemCount;
- if (uView == LVS_LIST)
+ if (infoPtr->uView == LV_VIEW_LIST)
{
if (wHeight == 0xFFFF)
{
@@ -4401,7 +4722,7 @@ static DWORD LISTVIEW_ApproximateViewRect(const LISTVIEW_INFO *infoPtr, INT nIte
dwViewRect = MAKELONG(wWidth, wHeight);
}
- else if (uView == LVS_REPORT)
+ else if (infoPtr->uView == LV_VIEW_DETAILS)
{
RECT rcBox;
@@ -4422,14 +4743,34 @@ static DWORD LISTVIEW_ApproximateViewRect(const LISTVIEW_INFO *infoPtr, INT nIte
dwViewRect = MAKELONG(wWidth, wHeight);
}
- else if (uView == LVS_SMALLICON)
- FIXME("uView == LVS_SMALLICON: not implemented\n");
- else if (uView == LVS_ICON)
- FIXME("uView == LVS_ICON: not implemented\n");
+ else if (infoPtr->uView == LV_VIEW_SMALLICON)
+ FIXME("uView == LV_VIEW_SMALLICON: not implemented\n");
+ else if (infoPtr->uView == LV_VIEW_ICON)
+ FIXME("uView == LV_VIEW_ICON: not implemented\n");
return dwViewRect;
}
+/***
+ * DESCRIPTION:
+ * Cancel edit label with saving item text.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ *
+ * RETURN:
+ * Always returns TRUE.
+ */
+static LRESULT LISTVIEW_CancelEditLabel(LISTVIEW_INFO *infoPtr)
+{
+ /* handle value will be lost after LISTVIEW_EndEditLabelT */
+ HWND edit = infoPtr->hwndEdit;
+
+ LISTVIEW_EndEditLabelT(infoPtr, TRUE, IsWindowUnicode(infoPtr->hwndEdit));
+ SendMessageW(edit, WM_CLOSE, 0, 0);
+
+ return TRUE;
+}
/***
* DESCRIPTION:
@@ -4438,7 +4779,7 @@ static DWORD LISTVIEW_ApproximateViewRect(const LISTVIEW_INFO *infoPtr, INT nIte
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
* [I] iItem : index of item
- * [O] lppt : Upperr-left corner of the image
+ * [O] lppt : Upper-left corner of the image
*
* RETURN:
* Returns a handle to the image list if successful, NULL otherwise.
@@ -4580,26 +4921,33 @@ static void LISTVIEW_ScrollColumns(LISTVIEW_INFO *infoPtr, INT nColumn, INT dx)
RECT rcOld, rcCol;
POINT ptOrigin;
INT nCol;
-
+ HDITEMW hdi;
+
if (nColumn < 0 || DPA_GetPtrCount(infoPtr->hdpaColumns) < 1) return;
lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, min(nColumn, DPA_GetPtrCount(infoPtr->hdpaColumns) - 1));
rcCol = lpColumnInfo->rcHeader;
if (nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns))
rcCol.left = rcCol.right;
-
+
/* adjust the other columns */
- for (nCol = nColumn; nCol < DPA_GetPtrCount(infoPtr->hdpaColumns); nCol++)
+ hdi.mask = HDI_ORDER;
+ if (SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, nColumn, (LPARAM)&hdi))
{
- lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nCol);
- lpColumnInfo->rcHeader.left += dx;
- lpColumnInfo->rcHeader.right += dx;
+ INT nOrder = hdi.iOrder;
+ for (nCol = 0; nCol < DPA_GetPtrCount(infoPtr->hdpaColumns); nCol++)
+ {
+ hdi.mask = HDI_ORDER;
+ SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, nCol, (LPARAM)&hdi);
+ if (hdi.iOrder >= nOrder) {
+ lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nCol);
+ lpColumnInfo->rcHeader.left += dx;
+ lpColumnInfo->rcHeader.right += dx;
+ }
+ }
}
/* do not update screen if not in report mode */
- if (!is_redrawing(infoPtr) || (infoPtr->dwStyle & LVS_TYPEMASK) != LVS_REPORT) return;
-
- /* if we have a focus, we must first erase the focus rect */
- if (infoPtr->bFocus) LISTVIEW_ShowFocusRect(infoPtr, FALSE);
+ if (!is_redrawing(infoPtr) || infoPtr->uView != LV_VIEW_DETAILS) return;
/* Need to reset the item width when inserting a new column */
infoPtr->nItemWidth += dx;
@@ -4611,9 +4959,6 @@ static void LISTVIEW_ScrollColumns(LISTVIEW_INFO *infoPtr, INT nColumn, INT dx)
rcOld = infoPtr->rcList;
rcOld.left = ptOrigin.x + rcCol.left + dx;
ScrollWindowEx(infoPtr->hwndSelf, dx, 0, &rcOld, &rcOld, 0, 0, SW_ERASE | SW_INVALIDATE);
-
- /* we can restore focus now */
- if (infoPtr->bFocus) LISTVIEW_ShowFocusRect(infoPtr, TRUE);
}
/***
@@ -4644,7 +4989,7 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn)
LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcCol);
- if (!Header_DeleteItem(infoPtr->hwndHeader, nColumn))
+ if (!SendMessageW(infoPtr->hwndHeader, HDM_DELETEITEM, nColumn, 0))
return FALSE;
Free(DPA_GetPtr(infoPtr->hdpaColumns, nColumn));
@@ -4715,7 +5060,6 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn)
*/
static void LISTVIEW_ScrollOnInsert(LISTVIEW_INFO *infoPtr, INT nItem, INT dir)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT nPerCol, nItemCol, nItemRow;
RECT rcScroll;
POINT Origin;
@@ -4738,11 +5082,11 @@ static void LISTVIEW_ScrollOnInsert(LISTVIEW_INFO *infoPtr, INT nItem, INT dir)
LISTVIEW_UpdateScroll(infoPtr);
/* figure out the item's position */
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
nPerCol = infoPtr->nItemCount + 1;
- else if (uView == LVS_LIST)
+ else if (infoPtr->uView == LV_VIEW_LIST)
nPerCol = LISTVIEW_GetCountPerColumn(infoPtr);
- else /* LVS_ICON, or LVS_SMALLICON */
+ else /* LV_VIEW_ICON, or LV_VIEW_SMALLICON */
return;
nItemCol = nItem / nPerCol;
@@ -4764,7 +5108,7 @@ static void LISTVIEW_ScrollOnInsert(LISTVIEW_INFO *infoPtr, INT nItem, INT dir)
}
/* report has only that column, so we're done */
- if (uView == LVS_REPORT) return;
+ if (infoPtr->uView == LV_VIEW_DETAILS) return;
/* now for LISTs, we have to deal with the columns to the right */
rcScroll.left = (nItemCol + 1) * infoPtr->nItemWidth;
@@ -4792,8 +5136,7 @@ static void LISTVIEW_ScrollOnInsert(LISTVIEW_INFO *infoPtr, INT nItem, INT dir)
static BOOL LISTVIEW_DeleteItem(LISTVIEW_INFO *infoPtr, INT nItem)
{
LVITEMW item;
- const UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
- const BOOL is_icon = (uView == LVS_SMALLICON || uView == LVS_ICON);
+ const BOOL is_icon = (infoPtr->uView == LV_VIEW_SMALLICON || infoPtr->uView == LV_VIEW_ICON);
TRACE("(nItem=%d)\n", nItem);
@@ -4815,9 +5158,18 @@ static BOOL LISTVIEW_DeleteItem(LISTVIEW_INFO *infoPtr, INT nItem)
{
HDPA hdpaSubItems;
ITEMHDR *hdrItem;
+ ITEM_INFO *lpItem;
+ ITEM_ID *lpID;
INT i;
hdpaSubItems = DPA_DeletePtr(infoPtr->hdpaItems, nItem);
+ lpItem = DPA_GetPtr(hdpaSubItems, 0);
+
+ /* free id struct */
+ i = DPA_GetPtrIndex(infoPtr->hdpaItemIds, lpItem->id);
+ lpID = DPA_GetPtr(infoPtr->hdpaItemIds, i);
+ DPA_DeletePtr(infoPtr->hdpaItemIds, i);
+ Free(lpID);
for (i = 0; i < DPA_GetPtrCount(hdpaSubItems); i++)
{
hdrItem = DPA_GetPtr(hdpaSubItems, i);
@@ -4849,30 +5201,51 @@ static BOOL LISTVIEW_DeleteItem(LISTVIEW_INFO *infoPtr, INT nItem)
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
- * [I] pszText : modified text
+ * [I] storeText : store edit box text as item text
* [I] isW : TRUE if psxText is Unicode, FALSE if it's ANSI
*
* RETURN:
* SUCCESS : TRUE
* FAILURE : FALSE
*/
-static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, LPWSTR pszText, BOOL isW)
+static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, BOOL storeText, BOOL isW)
{
HWND hwndSelf = infoPtr->hwndSelf;
NMLVDISPINFOW dispInfo;
INT editedItem = infoPtr->nEditLabelItem;
BOOL bSame;
+ WCHAR *pszText = NULL;
+ BOOL res;
+
+ if (storeText)
+ {
+ DWORD len = isW ? GetWindowTextLengthW(infoPtr->hwndEdit) : GetWindowTextLengthA(infoPtr->hwndEdit);
+
+ if (len)
+ {
+ if ((pszText = Alloc((len+1) * (isW ? sizeof(WCHAR) : sizeof(CHAR)))))
+ {
+ if (isW) GetWindowTextW(infoPtr->hwndEdit, pszText, len+1);
+ else GetWindowTextA(infoPtr->hwndEdit, (CHAR*)pszText, len+1);
+ }
+ }
+ }
TRACE("(pszText=%s, isW=%d)\n", debugtext_t(pszText, isW), isW);
infoPtr->nEditLabelItem = -1;
+ infoPtr->hwndEdit = 0;
ZeroMemory(&dispInfo, sizeof(dispInfo));
dispInfo.item.mask = LVIF_PARAM | LVIF_STATE | LVIF_TEXT;
dispInfo.item.iItem = editedItem;
dispInfo.item.iSubItem = 0;
dispInfo.item.stateMask = ~0;
- if (!LISTVIEW_GetItemW(infoPtr, &dispInfo.item)) return FALSE;
+ if (!LISTVIEW_GetItemW(infoPtr, &dispInfo.item))
+ {
+ res = FALSE;
+ goto cleanup;
+ }
if (isW)
bSame = (lstrcmpW(dispInfo.item.pszText, pszText) == 0);
@@ -4882,7 +5255,11 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, LPWSTR pszText, BOOL
bSame = (lstrcmpW(dispInfo.item.pszText, tmp) == 0);
textfreeT(tmp, FALSE);
}
- if (bSame) return TRUE;
+ if (bSame)
+ {
+ res = TRUE;
+ goto cleanup;
+ }
/* add the text from the edit in */
dispInfo.item.mask |= LVIF_TEXT;
@@ -4890,9 +5267,16 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, LPWSTR pszText, BOOL
dispInfo.item.cchTextMax = textlenT(pszText, isW);
/* Do we need to update the Item Text */
- if (!notify_dispinfoT(infoPtr, LVN_ENDLABELEDITW, &dispInfo, isW)) return FALSE;
+ if (!notify_dispinfoT(infoPtr, LVN_ENDLABELEDITW, &dispInfo, isW))
+ {
+ res = FALSE;
+ goto cleanup;
+ }
if (!IsWindow(hwndSelf))
- return FALSE;
+ {
+ res = FALSE;
+ goto cleanup;
+ }
if (!pszText) return TRUE;
if (!(infoPtr->dwStyle & LVS_OWNERDATA))
@@ -4902,7 +5286,8 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, LPWSTR pszText, BOOL
if (lpItem && lpItem->hdr.pszText == LPSTR_TEXTCALLBACKW)
{
LISTVIEW_InvalidateItem(infoPtr, editedItem);
- return TRUE;
+ res = TRUE;
+ goto cleanup;
}
}
@@ -4912,7 +5297,12 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, LPWSTR pszText, BOOL
dispInfo.item.iSubItem = 0;
dispInfo.item.pszText = pszText;
dispInfo.item.cchTextMax = textlenT(pszText, isW);
- return LISTVIEW_SetItemT(infoPtr, &dispInfo.item, isW);
+ res = LISTVIEW_SetItemT(infoPtr, &dispInfo.item, isW);
+
+cleanup:
+ Free(pszText);
+
+ return res;
}
/***
@@ -4933,14 +5323,15 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW)
WCHAR szDispText[DISP_TEXT_SIZE] = { 0 };
NMLVDISPINFOW dispInfo;
RECT rect;
+ SIZE sz;
HWND hwndSelf = infoPtr->hwndSelf;
+ HDC hdc;
+ HFONT hOldFont = NULL;
+ TEXTMETRICW textMetric;
TRACE("(nItem=%d, isW=%d)\n", nItem, isW);
if (~infoPtr->dwStyle & LVS_EDITLABELS) return 0;
- if (nItem < 0 || nItem >= infoPtr->nItemCount) return 0;
-
- infoPtr->nEditLabelItem = nItem;
/* Is the EditBox still there, if so remove it */
if(infoPtr->hwndEdit != 0)
@@ -4949,6 +5340,10 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW)
infoPtr->hwndEdit = 0;
}
+ if (nItem < 0 || nItem >= infoPtr->nItemCount) return 0;
+
+ infoPtr->nEditLabelItem = nItem;
+
LISTVIEW_SetSelection(infoPtr, nItem);
LISTVIEW_SetItemFocus(infoPtr, nItem);
LISTVIEW_InvalidateItem(infoPtr, nItem);
@@ -4965,8 +5360,7 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW)
dispInfo.item.cchTextMax = DISP_TEXT_SIZE;
if (!LISTVIEW_GetItemT(infoPtr, &dispInfo.item, isW)) return 0;
- infoPtr->hwndEdit = CreateEditLabelT(infoPtr, dispInfo.item.pszText, WS_VISIBLE,
- rect.left-2, rect.top-1, 0, rect.bottom - rect.top+2, isW);
+ infoPtr->hwndEdit = CreateEditLabelT(infoPtr, dispInfo.item.pszText, WS_VISIBLE, isW);
if (!infoPtr->hwndEdit) return 0;
if (notify_dispinfoT(infoPtr, LVN_BEGINLABELEDITW, &dispInfo, isW))
@@ -4978,6 +5372,27 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW)
return 0;
}
+ /* Now position and display edit box */
+ hdc = GetDC(infoPtr->hwndSelf);
+
+ /* Select the font to get appropriate metric dimensions */
+ if(infoPtr->hFont != 0)
+ hOldFont = SelectObject(hdc, infoPtr->hFont);
+
+ /* Get String Length in pixels */
+ GetTextExtentPoint32W(hdc, dispInfo.item.pszText, lstrlenW(dispInfo.item.pszText), &sz);
+
+ /* Add Extra spacing for the next character */
+ GetTextMetricsW(hdc, &textMetric);
+ sz.cx += (textMetric.tmMaxCharWidth * 2);
+
+ if(infoPtr->hFont != 0)
+ SelectObject(hdc, hOldFont);
+
+ ReleaseDC(infoPtr->hwndSelf, hdc);
+
+ MoveWindow(infoPtr->hwndEdit, rect.left - 2, rect.top - 1, sz.cx,
+ rect.bottom - rect.top + 2, FALSE);
ShowWindow(infoPtr->hwndEdit, SW_NORMAL);
SetFocus(infoPtr->hwndEdit);
SendMessageW(infoPtr->hwndEdit, EM_SETSEL, 0, -1);
@@ -5000,7 +5415,6 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW)
*/
static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *infoPtr, INT nItem, BOOL bPartial)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT nScrollPosHeight = 0;
INT nScrollPosWidth = 0;
INT nHorzAdjust = 0;
@@ -5016,41 +5430,41 @@ static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *infoPtr, INT nItem, BOOL bPart
if (rcItem.left < infoPtr->rcList.left || rcItem.right > infoPtr->rcList.right)
{
- /* scroll left/right, but in LVS_REPORT mode */
- if (uView == LVS_LIST)
+ /* scroll left/right, but in LV_VIEW_DETAILS mode */
+ if (infoPtr->uView == LV_VIEW_LIST)
nScrollPosWidth = infoPtr->nItemWidth;
- else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
+ else if ((infoPtr->uView == LV_VIEW_SMALLICON) || (infoPtr->uView == LV_VIEW_ICON))
nScrollPosWidth = 1;
if (rcItem.left < infoPtr->rcList.left)
{
nHorzAdjust = -1;
- if (uView != LVS_REPORT) nHorzDiff = rcItem.left - infoPtr->rcList.left;
+ if (infoPtr->uView != LV_VIEW_DETAILS) nHorzDiff = rcItem.left - infoPtr->rcList.left;
}
else
{
nHorzAdjust = 1;
- if (uView != LVS_REPORT) nHorzDiff = rcItem.right - infoPtr->rcList.right;
+ if (infoPtr->uView != LV_VIEW_DETAILS) nHorzDiff = rcItem.right - infoPtr->rcList.right;
}
}
if (rcItem.top < infoPtr->rcList.top || rcItem.bottom > infoPtr->rcList.bottom)
{
/* scroll up/down, but not in LVS_LIST mode */
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
nScrollPosHeight = infoPtr->nItemHeight;
- else if ((uView == LVS_ICON) || (uView == LVS_SMALLICON))
+ else if ((infoPtr->uView == LV_VIEW_ICON) || (infoPtr->uView == LV_VIEW_SMALLICON))
nScrollPosHeight = 1;
if (rcItem.top < infoPtr->rcList.top)
{
nVertAdjust = -1;
- if (uView != LVS_LIST) nVertDiff = rcItem.top - infoPtr->rcList.top;
+ if (infoPtr->uView != LV_VIEW_LIST) nVertDiff = rcItem.top - infoPtr->rcList.top;
}
else
{
nVertAdjust = 1;
- if (uView != LVS_LIST) nVertDiff = rcItem.bottom - infoPtr->rcList.bottom;
+ if (infoPtr->uView != LV_VIEW_LIST) nVertDiff = rcItem.bottom - infoPtr->rcList.bottom;
}
}
@@ -5089,7 +5503,6 @@ static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *infoPtr, INT nItem, BOOL bPart
static INT LISTVIEW_FindItemW(const LISTVIEW_INFO *infoPtr, INT nStart,
const LVFINDINFOW *lpFindInfo)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
BOOL bWrap = FALSE, bNearest = FALSE;
INT nItem = nStart + 1, nLast = infoPtr->nItemCount, nNearestItem = -1;
@@ -5122,7 +5535,7 @@ static INT LISTVIEW_FindItemW(const LISTVIEW_INFO *infoPtr, INT nStart,
bWrap = TRUE;
if ((lpFindInfo->flags & LVFI_NEARESTXY) &&
- (uView == LVS_ICON || uView ==LVS_SMALLICON))
+ (infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON))
{
POINT Origin;
RECT rcArea;
@@ -5326,16 +5739,12 @@ static BOOL LISTVIEW_GetColumnT(const LISTVIEW_INFO *infoPtr, INT nColumn, LPLVC
static BOOL LISTVIEW_GetColumnOrderArray(const LISTVIEW_INFO *infoPtr, INT iCount, LPINT lpiArray)
{
- INT i;
+ TRACE("iCount=%d, lpiArray=%p\n", iCount, lpiArray);
if (!lpiArray)
return FALSE;
- /* FIXME: little hack */
- for (i = 0; i < iCount; i++)
- lpiArray[i] = i;
-
- return TRUE;
+ return SendMessageW(infoPtr->hwndHeader, HDM_GETORDERARRAY, iCount, (LPARAM)lpiArray);
}
/***
@@ -5358,15 +5767,15 @@ static INT LISTVIEW_GetColumnWidth(const LISTVIEW_INFO *infoPtr, INT nColumn)
TRACE("nColumn=%d\n", nColumn);
/* we have a 'column' in LIST and REPORT mode only */
- switch(infoPtr->dwStyle & LVS_TYPEMASK)
+ switch(infoPtr->uView)
{
- case LVS_LIST:
+ case LV_VIEW_LIST:
nColumnWidth = infoPtr->nItemWidth;
break;
- case LVS_REPORT:
- /* We are not using LISTVIEW_GetHeaderRect as this data is updated only after a HDM_ITEMCHANGED.
+ case LV_VIEW_DETAILS:
+ /* We are not using LISTVIEW_GetHeaderRect as this data is updated only after a HDN_ITEMCHANGED.
* There is an application that subclasses the listview, calls LVM_GETCOLUMNWIDTH in the
- * HDM_ITEMCHANGED handler and goes into infinite recursion if it receives old data.
+ * HDN_ITEMCHANGED handler and goes into infinite recursion if it receives old data.
*
* TODO: should we do the same in LVM_GETCOLUMN?
*/
@@ -5398,14 +5807,14 @@ static INT LISTVIEW_GetColumnWidth(const LISTVIEW_INFO *infoPtr, INT nColumn)
*/
static INT LISTVIEW_GetCountPerPage(const LISTVIEW_INFO *infoPtr)
{
- switch (infoPtr->dwStyle & LVS_TYPEMASK)
+ switch (infoPtr->uView)
{
- case LVS_ICON:
- case LVS_SMALLICON:
+ case LV_VIEW_ICON:
+ case LV_VIEW_SMALLICON:
return infoPtr->nItemCount;
- case LVS_REPORT:
+ case LV_VIEW_DETAILS:
return LISTVIEW_GetCountPerColumn(infoPtr);
- case LVS_LIST:
+ case LV_VIEW_LIST:
return LISTVIEW_GetCountPerRow(infoPtr) * LISTVIEW_GetCountPerColumn(infoPtr);
}
assert(FALSE);
@@ -5503,8 +5912,11 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
dispInfo.item.state = 0;
/* apparently, we should not callback for lParam in LVS_OWNERDATA */
- if ((lpLVItem->mask & ~(LVIF_STATE | LVIF_PARAM)) || infoPtr->uCallbackMask)
+ if ((lpLVItem->mask & ~(LVIF_STATE | LVIF_PARAM)) ||
+ ((lpLVItem->mask & LVIF_STATE) && (infoPtr->uCallbackMask & lpLVItem->stateMask)))
{
+ UINT mask = lpLVItem->mask;
+
/* NOTE: copy only fields which we _know_ are initialized, some apps
* depend on the uninitialized fields being 0 */
dispInfo.item.mask = lpLVItem->mask & ~LVIF_PARAM;
@@ -5512,34 +5924,49 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
dispInfo.item.iSubItem = isubitem;
if (lpLVItem->mask & LVIF_TEXT)
{
- dispInfo.item.pszText = lpLVItem->pszText;
- dispInfo.item.cchTextMax = lpLVItem->cchTextMax;
+ if (lpLVItem->mask & LVIF_NORECOMPUTE)
+ /* reset mask */
+ dispInfo.item.mask &= ~(LVIF_TEXT | LVIF_NORECOMPUTE);
+ else
+ {
+ dispInfo.item.pszText = lpLVItem->pszText;
+ dispInfo.item.cchTextMax = lpLVItem->cchTextMax;
+ }
}
if (lpLVItem->mask & LVIF_STATE)
dispInfo.item.stateMask = lpLVItem->stateMask & infoPtr->uCallbackMask;
- notify_dispinfoT(infoPtr, LVN_GETDISPINFOW, &dispInfo, isW);
- dispInfo.item.stateMask = lpLVItem->stateMask;
- if (lpLVItem->mask & (LVIF_GROUPID|LVIF_COLUMNS))
+ /* could be zeroed on LVIF_NORECOMPUTE case */
+ if (dispInfo.item.mask != 0)
{
- /* full size structure expected - _WIN32IE >= 0x560 */
- *lpLVItem = dispInfo.item;
+ notify_dispinfoT(infoPtr, LVN_GETDISPINFOW, &dispInfo, isW);
+ dispInfo.item.stateMask = lpLVItem->stateMask;
+ if (lpLVItem->mask & (LVIF_GROUPID|LVIF_COLUMNS))
+ {
+ /* full size structure expected - _WIN32IE >= 0x560 */
+ *lpLVItem = dispInfo.item;
+ }
+ else if (lpLVItem->mask & LVIF_INDENT)
+ {
+ /* indent member expected - _WIN32IE >= 0x300 */
+ memcpy(lpLVItem, &dispInfo.item, offsetof( LVITEMW, iGroupId ));
+ }
+ else
+ {
+ /* minimal structure expected */
+ memcpy(lpLVItem, &dispInfo.item, offsetof( LVITEMW, iIndent ));
+ }
+ lpLVItem->mask = mask;
+ TRACE(" getdispinfo(1):lpLVItem=%s\n", debuglvitem_t(lpLVItem, isW));
}
- else if (lpLVItem->mask & LVIF_INDENT)
- {
- /* indent member expected - _WIN32IE >= 0x300 */
- memcpy(lpLVItem, &dispInfo.item, offsetof( LVITEMW, iGroupId ));
- }
- else
- {
- /* minimal structure expected */
- memcpy(lpLVItem, &dispInfo.item, offsetof( LVITEMW, iIndent ));
- }
- TRACE(" getdispinfo(1):lpLVItem=%s\n", debuglvitem_t(lpLVItem, isW));
}
/* make sure lParam is zeroed out */
if (lpLVItem->mask & LVIF_PARAM) lpLVItem->lParam = 0;
-
+
+ /* callback marked pointer required here */
+ if ((lpLVItem->mask & LVIF_TEXT) && (lpLVItem->mask & LVIF_NORECOMPUTE))
+ lpLVItem->pszText = LPSTR_TEXTCALLBACKW;
+
/* we store only a little state, so if we're not asked, we're done */
if (!(lpLVItem->mask & LVIF_STATE) || isubitem) return TRUE;
@@ -5595,8 +6022,17 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
dispInfo.item.iImage = I_IMAGECALLBACK;
}
+ /* Only items support indentation */
+ if ((lpLVItem->mask & LVIF_INDENT) && lpItem->iIndent == I_INDENTCALLBACK &&
+ (isubitem == 0))
+ {
+ dispInfo.item.mask |= LVIF_INDENT;
+ dispInfo.item.iIndent = I_INDENTCALLBACK;
+ }
+
/* Apps depend on calling back for text if it is NULL or LPSTR_TEXTCALLBACKW */
- if ((lpLVItem->mask & LVIF_TEXT) && !is_textW(pItemHdr->pszText))
+ if ((lpLVItem->mask & LVIF_TEXT) && !(lpLVItem->mask & LVIF_NORECOMPUTE) &&
+ !is_textW(pItemHdr->pszText))
{
dispInfo.item.mask |= LVIF_TEXT;
dispInfo.item.pszText = lpLVItem->pszText;
@@ -5643,7 +6079,8 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
}
else if (lpLVItem->mask & LVIF_TEXT)
{
- if (isW) lpLVItem->pszText = pItemHdr->pszText;
+ /* if LVN_GETDISPINFO's disabled with LVIF_NORECOMPUTE return callback placeholder */
+ if (isW || !is_textW(pItemHdr->pszText)) lpLVItem->pszText = pItemHdr->pszText;
else textcpynT(lpLVItem->pszText, isW, pItemHdr->pszText, TRUE, lpLVItem->cchTextMax);
}
@@ -5684,8 +6121,16 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
}
/* and last, but not least, the indent field */
- if (lpLVItem->mask & LVIF_INDENT)
- lpLVItem->iIndent = lpItem->iIndent;
+ if (dispInfo.item.mask & LVIF_INDENT)
+ {
+ lpLVItem->iIndent = dispInfo.item.iIndent;
+ if ((dispInfo.item.mask & LVIF_DI_SETITEM) && lpItem->iIndent == I_INDENTCALLBACK)
+ lpItem->iIndent = dispInfo.item.iIndent;
+ }
+ else if (lpLVItem->mask & LVIF_INDENT)
+ {
+ lpLVItem->iIndent = lpItem->iIndent;
+ }
return TRUE;
}
@@ -5719,7 +6164,12 @@ static BOOL LISTVIEW_GetItemExtT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVIte
pszText = lpLVItem->pszText;
bResult = LISTVIEW_GetItemT(infoPtr, lpLVItem, isW);
if (bResult && lpLVItem->pszText != pszText)
- textcpynT(pszText, isW, lpLVItem->pszText, isW, lpLVItem->cchTextMax);
+ {
+ if (lpLVItem->pszText != LPSTR_TEXTCALLBACKW)
+ textcpynT(pszText, isW, lpLVItem->pszText, isW, lpLVItem->cchTextMax);
+ else
+ pszText = LPSTR_TEXTCALLBACKW;
+ }
lpLVItem->pszText = pszText;
return bResult;
@@ -5743,7 +6193,6 @@ static BOOL LISTVIEW_GetItemExtT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVIte
*/
static BOOL LISTVIEW_GetItemPosition(const LISTVIEW_INFO *infoPtr, INT nItem, LPPOINT lpptPosition)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
POINT Origin;
TRACE("(nItem=%d, lpptPosition=%p)\n", nItem, lpptPosition);
@@ -5753,7 +6202,7 @@ static BOOL LISTVIEW_GetItemPosition(const LISTVIEW_INFO *infoPtr, INT nItem, LP
LISTVIEW_GetOrigin(infoPtr, &Origin);
LISTVIEW_GetItemOrigin(infoPtr, nItem, lpptPosition);
- if (uView == LVS_ICON)
+ if (infoPtr->uView == LV_VIEW_ICON)
{
lpptPosition->x += (infoPtr->nItemWidth - infoPtr->iconSize.cx) / 2;
lpptPosition->y += ICON_TOP_PADDING;
@@ -5829,11 +6278,11 @@ static BOOL LISTVIEW_GetItemPosition(const LISTVIEW_INFO *infoPtr, INT nItem, LP
*/
static BOOL LISTVIEW_GetItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lprc)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
BOOL doLabel = TRUE, oversizedBox = FALSE;
POINT Position, Origin;
LVITEMW lvItem;
+ LONG mode;
TRACE("(hwnd=%p, nItem=%d, lprc=%p)\n", infoPtr->hwndSelf, nItem, lprc);
@@ -5844,8 +6293,8 @@ static BOOL LISTVIEW_GetItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPRECT
/* Be smart and try to figure out the minimum we have to do */
if (lprc->left == LVIR_ICON) doLabel = FALSE;
- if (uView == LVS_REPORT && lprc->left == LVIR_BOUNDS) doLabel = FALSE;
- if (uView == LVS_ICON && lprc->left != LVIR_ICON &&
+ if (infoPtr->uView == LV_VIEW_DETAILS && lprc->left == LVIR_BOUNDS) doLabel = FALSE;
+ if (infoPtr->uView == LV_VIEW_ICON && lprc->left != LVIR_ICON &&
infoPtr->bFocus && LISTVIEW_GetItemState(infoPtr, nItem, LVIS_FOCUSED))
oversizedBox = TRUE;
@@ -5853,7 +6302,7 @@ static BOOL LISTVIEW_GetItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPRECT
* only one request. This can speed up things, if data
* is stored on the app side */
lvItem.mask = 0;
- if (uView == LVS_REPORT) lvItem.mask |= LVIF_INDENT;
+ if (infoPtr->uView == LV_VIEW_DETAILS) lvItem.mask |= LVIF_INDENT;
if (doLabel) lvItem.mask |= LVIF_TEXT;
lvItem.iItem = nItem;
lvItem.iSubItem = 0;
@@ -5861,15 +6310,17 @@ static BOOL LISTVIEW_GetItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPRECT
lvItem.cchTextMax = DISP_TEXT_SIZE;
if (lvItem.mask && !LISTVIEW_GetItemW(infoPtr, &lvItem)) return FALSE;
/* we got the state already up, simulate it here, to avoid a reget */
- if (uView == LVS_ICON && (lprc->left != LVIR_ICON))
+ if (infoPtr->uView == LV_VIEW_ICON && (lprc->left != LVIR_ICON))
{
lvItem.mask |= LVIF_STATE;
lvItem.stateMask = LVIS_FOCUSED;
lvItem.state = (oversizedBox ? LVIS_FOCUSED : 0);
}
- if (uView == LVS_REPORT && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT) && lprc->left == LVIR_SELECTBOUNDS)
+ if (infoPtr->uView == LV_VIEW_DETAILS && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT) && lprc->left == LVIR_SELECTBOUNDS)
lprc->left = LVIR_BOUNDS;
+
+ mode = lprc->left;
switch(lprc->left)
{
case LVIR_ICON:
@@ -5893,7 +6344,16 @@ static BOOL LISTVIEW_GetItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPRECT
return FALSE;
}
- OffsetRect(lprc, Position.x + Origin.x, Position.y + Origin.y);
+ if (infoPtr->uView == LV_VIEW_DETAILS)
+ {
+ if (mode != LVIR_BOUNDS)
+ OffsetRect(lprc, Origin.x + LISTVIEW_GetColumnInfo(infoPtr, 0)->rcHeader.left,
+ Position.y + Origin.y);
+ else
+ OffsetRect(lprc, Origin.x, Position.y + Origin.y);
+ }
+ else
+ OffsetRect(lprc, Position.x + Origin.x, Position.y + Origin.y);
TRACE(" rect=%s\n", wine_dbgstr_rect(lprc));
@@ -5933,7 +6393,25 @@ static BOOL LISTVIEW_GetSubItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPR
if (lprc->top == 0)
return LISTVIEW_GetItemRect(infoPtr, nItem, lprc);
- if ((infoPtr->dwStyle & LVS_TYPEMASK) != LVS_REPORT) return FALSE;
+ if (infoPtr->uView != LV_VIEW_DETAILS) return FALSE;
+
+ /* special case for header items */
+ if (nItem == -1)
+ {
+ if (lprc->left != LVIR_BOUNDS)
+ {
+ FIXME("Only LVIR_BOUNDS is implemented for header, got %d\n", lprc->left);
+ return FALSE;
+ }
+
+ if (infoPtr->hwndHeader)
+ return SendMessageW(infoPtr->hwndHeader, HDM_GETITEMRECT, lprc->top, (LPARAM)lprc);
+ else
+ {
+ memset(lprc, 0, sizeof(RECT));
+ return TRUE;
+ }
+ }
if (!LISTVIEW_GetItemPosition(infoPtr, nItem, &Position)) return FALSE;
@@ -5960,7 +6438,7 @@ static BOOL LISTVIEW_GetSubItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPR
return FALSE;
}
- OffsetRect(lprc, Position.x, Position.y);
+ OffsetRect(lprc, 0, Position.y);
return TRUE;
}
@@ -6014,7 +6492,7 @@ static LONG LISTVIEW_GetItemSpacing(const LISTVIEW_INFO *infoPtr, BOOL bSmall)
}
else
{
- if ((infoPtr->dwStyle & LVS_TYPEMASK) == LVS_ICON)
+ if (infoPtr->uView == LV_VIEW_ICON)
lResult = MAKELONG(DEFAULT_COLUMN_WIDTH, GetSystemMetrics(SM_CXSMICON)+HEIGHT_PADDING);
else
lResult = MAKELONG(infoPtr->nItemWidth, infoPtr->nItemHeight);
@@ -6089,7 +6567,6 @@ static INT LISTVIEW_GetItemTextT(const LISTVIEW_INFO *infoPtr, INT nItem, LPLVIT
*/
static INT LISTVIEW_GetNextItem(const LISTVIEW_INFO *infoPtr, INT nItem, UINT uFlags)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
UINT uMask = 0;
LVFINDINFOW lvFindInfo;
INT nCountPerColumn;
@@ -6123,12 +6600,12 @@ static INT LISTVIEW_GetNextItem(const LISTVIEW_INFO *infoPtr, INT nItem, UINT uF
if (uFlags & LVNI_ABOVE)
{
- if ((uView == LVS_LIST) || (uView == LVS_REPORT))
+ if ((infoPtr->uView == LV_VIEW_LIST) || (infoPtr->uView == LV_VIEW_DETAILS))
{
while (nItem >= 0)
{
nItem--;
- if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
+ if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
return nItem;
}
}
@@ -6148,17 +6625,17 @@ static INT LISTVIEW_GetNextItem(const LISTVIEW_INFO *infoPtr, INT nItem, UINT uF
}
lvFindInfo.flags = LVFI_NEARESTXY;
lvFindInfo.vkDirection = VK_UP;
- SendMessageW( infoPtr->hwndSelf, LVM_GETITEMPOSITION, nItem, (LPARAM)&lvFindInfo.pt );
- while ((nItem = ListView_FindItemW(infoPtr->hwndSelf, nItem, &lvFindInfo)) != -1)
+ LISTVIEW_GetItemPosition(infoPtr, nItem, &lvFindInfo.pt);
+ while ((nItem = LISTVIEW_FindItemW(infoPtr, nItem, &lvFindInfo)) != -1)
{
- if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
+ if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
return nItem;
}
}
}
else if (uFlags & LVNI_BELOW)
{
- if ((uView == LVS_LIST) || (uView == LVS_REPORT))
+ if ((infoPtr->uView == LV_VIEW_LIST) || (infoPtr->uView == LV_VIEW_DETAILS))
{
while (nItem < infoPtr->nItemCount)
{
@@ -6183,8 +6660,8 @@ static INT LISTVIEW_GetNextItem(const LISTVIEW_INFO *infoPtr, INT nItem, UINT uF
}
lvFindInfo.flags = LVFI_NEARESTXY;
lvFindInfo.vkDirection = VK_DOWN;
- SendMessageW( infoPtr->hwndSelf, LVM_GETITEMPOSITION, nItem, (LPARAM)&lvFindInfo.pt );
- while ((nItem = ListView_FindItemW(infoPtr->hwndSelf, nItem, &lvFindInfo)) != -1)
+ LISTVIEW_GetItemPosition(infoPtr, nItem, &lvFindInfo.pt);
+ while ((nItem = LISTVIEW_FindItemW(infoPtr, nItem, &lvFindInfo)) != -1)
{
if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
return nItem;
@@ -6193,7 +6670,7 @@ static INT LISTVIEW_GetNextItem(const LISTVIEW_INFO *infoPtr, INT nItem, UINT uF
}
else if (uFlags & LVNI_TOLEFT)
{
- if (uView == LVS_LIST)
+ if (infoPtr->uView == LV_VIEW_LIST)
{
nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
while (nItem - nCountPerColumn >= 0)
@@ -6203,9 +6680,9 @@ static INT LISTVIEW_GetNextItem(const LISTVIEW_INFO *infoPtr, INT nItem, UINT uF
return nItem;
}
}
- else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
+ else if ((infoPtr->uView == LV_VIEW_SMALLICON) || (infoPtr->uView == LV_VIEW_ICON))
{
- /* Special case for autoarrange - move 'ti the beginning of a row */
+ /* Special case for autoarrange - move 'til the beginning of a row */
if (is_autoarrange(infoPtr))
{
nCountPerRow = LISTVIEW_GetCountPerRow(infoPtr);
@@ -6219,27 +6696,27 @@ static INT LISTVIEW_GetNextItem(const LISTVIEW_INFO *infoPtr, INT nItem, UINT uF
}
lvFindInfo.flags = LVFI_NEARESTXY;
lvFindInfo.vkDirection = VK_LEFT;
- SendMessageW( infoPtr->hwndSelf, LVM_GETITEMPOSITION, nItem, (LPARAM)&lvFindInfo.pt );
- while ((nItem = ListView_FindItemW(infoPtr->hwndSelf, nItem, &lvFindInfo)) != -1)
+ LISTVIEW_GetItemPosition(infoPtr, nItem, &lvFindInfo.pt);
+ while ((nItem = LISTVIEW_FindItemW(infoPtr, nItem, &lvFindInfo)) != -1)
{
- if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
+ if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
return nItem;
}
}
}
else if (uFlags & LVNI_TORIGHT)
{
- if (uView == LVS_LIST)
+ if (infoPtr->uView == LV_VIEW_LIST)
{
nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
while (nItem + nCountPerColumn < infoPtr->nItemCount)
{
nItem += nCountPerColumn;
- if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
+ if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
return nItem;
}
}
- else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
+ else if ((infoPtr->uView == LV_VIEW_SMALLICON) || (infoPtr->uView == LV_VIEW_ICON))
{
/* Special case for autoarrange - move 'til the end of a row */
if (is_autoarrange(infoPtr))
@@ -6255,8 +6732,8 @@ static INT LISTVIEW_GetNextItem(const LISTVIEW_INFO *infoPtr, INT nItem, UINT uF
}
lvFindInfo.flags = LVFI_NEARESTXY;
lvFindInfo.vkDirection = VK_RIGHT;
- SendMessageW( infoPtr->hwndSelf, LVM_GETITEMPOSITION, nItem, (LPARAM)&lvFindInfo.pt );
- while ((nItem = ListView_FindItemW(infoPtr->hwndSelf, nItem, &lvFindInfo)) != -1)
+ LISTVIEW_GetItemPosition(infoPtr, nItem, &lvFindInfo.pt);
+ while ((nItem = LISTVIEW_FindItemW(infoPtr, nItem, &lvFindInfo)) != -1)
{
if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
return nItem;
@@ -6293,7 +6770,6 @@ static INT LISTVIEW_GetNextItem(const LISTVIEW_INFO *infoPtr, INT nItem, UINT uF
*/
static void LISTVIEW_GetOrigin(const LISTVIEW_INFO *infoPtr, LPPOINT lpptOrigin)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT nHorzPos = 0, nVertPos = 0;
SCROLLINFO scrollInfo;
@@ -6309,9 +6785,9 @@ static void LISTVIEW_GetOrigin(const LISTVIEW_INFO *infoPtr, LPPOINT lpptOrigin)
lpptOrigin->x = infoPtr->rcList.left;
lpptOrigin->y = infoPtr->rcList.top;
- if (uView == LVS_LIST)
+ if (infoPtr->uView == LV_VIEW_LIST)
nHorzPos *= infoPtr->nItemWidth;
- else if (uView == LVS_REPORT)
+ else if (infoPtr->uView == LV_VIEW_DETAILS)
nVertPos *= infoPtr->nItemHeight;
lpptOrigin->x -= nHorzPos;
@@ -6376,7 +6852,6 @@ static INT LISTVIEW_GetStringWidthT(const LISTVIEW_INFO *infoPtr, LPCWSTR lpszTe
static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BOOL subitem, BOOL select)
{
WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
RECT rcBox, rcBounds, rcState, rcIcon, rcLabel, rcSearch;
POINT Origin, Position, opt;
LVITEMW lvItem;
@@ -6389,43 +6864,83 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
lpht->iItem = -1;
if (subitem) lpht->iSubItem = 0;
- if (infoPtr->rcList.left > lpht->pt.x)
- lpht->flags |= LVHT_TOLEFT;
- else if (infoPtr->rcList.right < lpht->pt.x)
- lpht->flags |= LVHT_TORIGHT;
-
- if (infoPtr->rcList.top > lpht->pt.y)
- lpht->flags |= LVHT_ABOVE;
- else if (infoPtr->rcList.bottom < lpht->pt.y)
- lpht->flags |= LVHT_BELOW;
+ LISTVIEW_GetOrigin(infoPtr, &Origin);
+
+ /* set whole list relation flags */
+ if (subitem && infoPtr->uView == LV_VIEW_DETAILS)
+ {
+ /* LVM_SUBITEMHITTEST checks left bound of possible client area */
+ if (infoPtr->rcList.left > lpht->pt.x && Origin.x < lpht->pt.x)
+ lpht->flags |= LVHT_TOLEFT;
+
+ if (lpht->pt.y < infoPtr->rcList.top && lpht->pt.y >= 0)
+ opt.y = lpht->pt.y + infoPtr->rcList.top;
+ else
+ opt.y = lpht->pt.y;
+
+ if (infoPtr->rcList.bottom < opt.y)
+ lpht->flags |= LVHT_BELOW;
+ }
+ else
+ {
+ if (infoPtr->rcList.left > lpht->pt.x)
+ lpht->flags |= LVHT_TOLEFT;
+ else if (infoPtr->rcList.right < lpht->pt.x)
+ lpht->flags |= LVHT_TORIGHT;
+
+ if (infoPtr->rcList.top > lpht->pt.y)
+ lpht->flags |= LVHT_ABOVE;
+ else if (infoPtr->rcList.bottom < lpht->pt.y)
+ lpht->flags |= LVHT_BELOW;
+ }
+
+ /* even if item is invalid try to find subitem */
+ if (infoPtr->uView == LV_VIEW_DETAILS && subitem)
+ {
+ RECT *pRect;
+ INT j;
+
+ opt.x = lpht->pt.x - Origin.x;
+
+ lpht->iSubItem = -1;
+ for (j = 0; j < DPA_GetPtrCount(infoPtr->hdpaColumns); j++)
+ {
+ pRect = &LISTVIEW_GetColumnInfo(infoPtr, j)->rcHeader;
+
+ if ((opt.x >= pRect->left) && (opt.x < pRect->right))
+ {
+ lpht->iSubItem = j;
+ break;
+ }
+ }
+ TRACE("lpht->iSubItem=%d\n", lpht->iSubItem);
+ }
TRACE("lpht->flags=0x%x\n", lpht->flags);
if (lpht->flags) return -1;
lpht->flags |= LVHT_NOWHERE;
- LISTVIEW_GetOrigin(infoPtr, &Origin);
-
/* first deal with the large items */
rcSearch.left = lpht->pt.x;
rcSearch.top = lpht->pt.y;
rcSearch.right = rcSearch.left + 1;
rcSearch.bottom = rcSearch.top + 1;
-
+
iterator_frameditems(&i, infoPtr, &rcSearch);
iterator_next(&i); /* go to first item in the sequence */
iItem = i.nItem;
iterator_destroy(&i);
-
- TRACE("lpht->iItem=%d\n", iItem);
+
+ TRACE("lpht->iItem=%d\n", iItem);
if (iItem == -1) return -1;
lvItem.mask = LVIF_STATE | LVIF_TEXT;
- if (uView == LVS_REPORT) lvItem.mask |= LVIF_INDENT;
+ if (infoPtr->uView == LV_VIEW_DETAILS) lvItem.mask |= LVIF_INDENT;
lvItem.stateMask = LVIS_STATEIMAGEMASK;
- if (uView == LVS_ICON) lvItem.stateMask |= LVIS_FOCUSED;
+ if (infoPtr->uView == LV_VIEW_ICON) lvItem.stateMask |= LVIS_FOCUSED;
lvItem.iItem = iItem;
- lvItem.iSubItem = 0;
+ lvItem.iSubItem = subitem ? lpht->iSubItem : 0;
lvItem.pszText = szDispText;
lvItem.cchTextMax = DISP_TEXT_SIZE;
if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) return -1;
@@ -6434,10 +6949,18 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, NULL, &rcIcon, &rcState, &rcLabel);
LISTVIEW_GetItemOrigin(infoPtr, iItem, &Position);
opt.x = lpht->pt.x - Position.x - Origin.x;
- opt.y = lpht->pt.y - Position.y - Origin.y;
-
- if (uView == LVS_REPORT)
+
+ if (lpht->pt.y < infoPtr->rcList.top && lpht->pt.y >= 0)
+ opt.y = lpht->pt.y - Position.y - Origin.y + infoPtr->rcList.top;
+ else
+ opt.y = lpht->pt.y - Position.y - Origin.y;
+
+ if (infoPtr->uView == LV_VIEW_DETAILS)
+ {
rcBounds = rcBox;
+ if (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT)
+ opt.x = lpht->pt.x - Origin.x;
+ }
else
{
UnionRect(&rcBounds, &rcIcon, &rcLabel);
@@ -6450,35 +6973,27 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
lpht->flags |= LVHT_ONITEMICON;
else if (PtInRect(&rcLabel, opt))
lpht->flags |= LVHT_ONITEMLABEL;
- else if (infoPtr->himlState && STATEIMAGEINDEX(lvItem.state) && PtInRect(&rcState, opt))
+ else if (infoPtr->himlState && PtInRect(&rcState, opt))
lpht->flags |= LVHT_ONITEMSTATEICON;
+ /* special case for LVS_EX_FULLROWSELECT */
+ if (infoPtr->uView == LV_VIEW_DETAILS && infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT &&
+ !(lpht->flags & LVHT_ONITEM))
+ {
+ lpht->flags = LVHT_ONITEM | LVHT_ABOVE;
+ }
if (lpht->flags & LVHT_ONITEM)
lpht->flags &= ~LVHT_NOWHERE;
-
TRACE("lpht->flags=0x%x\n", lpht->flags);
- if (uView == LVS_REPORT && subitem)
- {
- INT j;
- rcBounds.right = rcBounds.left;
- for (j = 0; j < DPA_GetPtrCount(infoPtr->hdpaColumns); j++)
- {
- rcBounds.left = rcBounds.right;
- rcBounds.right += LISTVIEW_GetColumnWidth(infoPtr, j);
- if (PtInRect(&rcBounds, opt))
- {
- lpht->iSubItem = j;
- break;
- }
- }
- }
-
- if (select && !(uView == LVS_REPORT &&
+ if (select && !(infoPtr->uView == LV_VIEW_DETAILS &&
((infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT) ||
(infoPtr->dwStyle & LVS_OWNERDRAWFIXED))))
{
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
{
+ /* get main item bounds */
+ lvItem.iSubItem = 0;
+ LISTVIEW_GetItemMetrics(infoPtr, &lvItem, &rcBox, NULL, &rcIcon, &rcState, &rcLabel);
UnionRect(&rcBounds, &rcIcon, &rcLabel);
UnionRect(&rcBounds, &rcBounds, &rcState);
}
@@ -6487,33 +7002,6 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
return lpht->iItem = iItem;
}
-
-/* LISTVIEW_InsertCompare: callback routine for comparing pszText members of the LV_ITEMS
- in a LISTVIEW on insert. Passed to DPA_Sort in LISTVIEW_InsertItem.
- This function should only be used for inserting items into a sorted list (LVM_INSERTITEM)
- and not during the processing of a LVM_SORTITEMS message. Applications should provide
- their own sort proc. when sending LVM_SORTITEMS.
-*/
-/* Platform SDK:
- (remarks on LVITEM: LVM_INSERTITEM will insert the new item in the proper sort postion...
- if:
- LVS_SORTXXX must be specified,
- LVS_OWNERDRAW is not set,
- - .pszText is not LPSTR_TEXTCALLBACK.
-
- (LVS_SORT* flags): "For the LVS_SORTASCENDING... styles, item indices
- are sorted based on item text..."
-*/
-static INT WINAPI LISTVIEW_InsertCompare( LPVOID first, LPVOID second, LPARAM lParam)
-{
- ITEM_INFO* lv_first = DPA_GetPtr( first, 0 );
- ITEM_INFO* lv_second = DPA_GetPtr( second, 0 );
- INT cmpv = textcmpWT(lv_first->hdr.pszText, lv_second->hdr.pszText, TRUE);
-
- /* if we're sorting descending, negate the return value */
- return (((const LISTVIEW_INFO *)lParam)->dwStyle & LVS_SORTDESCENDING) ? -cmpv : cmpv;
-}
-
/***
* DESCRIPTION:
* Inserts a new item in the listview control.
@@ -6529,11 +7017,11 @@ static INT WINAPI LISTVIEW_InsertCompare( LPVOID first, LPVOID second, LPARAM
*/
static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL isW)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT nItem;
HDPA hdpaSubItems;
NMLISTVIEW nmlv;
ITEM_INFO *lpItem;
+ ITEM_ID *lpID;
BOOL is_sorted, has_changed;
LVITEMW item;
HWND hwndSelf = infoPtr->hwndSelf;
@@ -6553,12 +7041,41 @@ static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
if ( !(hdpaSubItems = DPA_Create(8)) ) goto fail;
if ( !DPA_SetPtr(hdpaSubItems, 0, lpItem) ) assert (FALSE);
+ /* link with id struct */
+ if (!(lpID = Alloc(sizeof(ITEM_ID)))) goto fail;
+ lpItem->id = lpID;
+ lpID->item = hdpaSubItems;
+ lpID->id = get_next_itemid(infoPtr);
+ if ( DPA_InsertPtr(infoPtr->hdpaItemIds, infoPtr->nItemCount, lpID) == -1) goto fail;
+
is_sorted = (infoPtr->dwStyle & (LVS_SORTASCENDING | LVS_SORTDESCENDING)) &&
!(infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (LPSTR_TEXTCALLBACKW != lpLVItem->pszText);
if (lpLVItem->iItem < 0 && !is_sorted) return -1;
- nItem = is_sorted ? infoPtr->nItemCount : min(lpLVItem->iItem, infoPtr->nItemCount);
+ /* calculate new item index */
+ if (is_sorted)
+ {
+ HDPA hItem;
+ ITEM_INFO *item_s;
+ INT i = 0, cmpv;
+
+ while (i < infoPtr->nItemCount)
+ {
+ hItem = DPA_GetPtr( infoPtr->hdpaItems, i);
+ item_s = (ITEM_INFO*)DPA_GetPtr(hItem, 0);
+
+ cmpv = textcmpWT(item_s->hdr.pszText, lpLVItem->pszText, TRUE);
+ if (infoPtr->dwStyle & LVS_SORTDESCENDING) cmpv *= -1;
+
+ if (cmpv >= 0) break;
+ i++;
+ }
+ nItem = i;
+ }
+ else
+ nItem = min(lpLVItem->iItem, infoPtr->nItemCount);
+
TRACE(" inserting at %d, sorted=%d, count=%d, iItem=%d\n", nItem, is_sorted, infoPtr->nItemCount, lpLVItem->iItem);
nItem = DPA_InsertPtr( infoPtr->hdpaItems, nItem, hdpaSubItems );
if (nItem == -1) goto fail;
@@ -6593,16 +7110,8 @@ static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
}
if (!set_main_item(infoPtr, &item, TRUE, isW, &has_changed)) goto undo;
- /* if we're sorted, sort the list, and update the index */
- if (is_sorted)
- {
- DPA_Sort( infoPtr->hdpaItems, LISTVIEW_InsertCompare, (LPARAM)infoPtr );
- nItem = DPA_GetPtrIndex( infoPtr->hdpaItems, hdpaSubItems );
- assert(nItem != -1);
- }
-
/* make room for the position, if we are in the right mode */
- if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
+ if ((infoPtr->uView == LV_VIEW_SMALLICON) || (infoPtr->uView == LV_VIEW_ICON))
{
if (DPA_InsertPtr(infoPtr->hdpaPosX, nItem, 0) == -1)
goto undo;
@@ -6622,7 +7131,7 @@ static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
return -1;
/* align items (set position of each item) */
- if ((uView == LVS_SMALLICON || uView == LVS_ICON))
+ if (infoPtr->uView == LV_VIEW_SMALLICON || infoPtr->uView == LV_VIEW_ICON)
{
POINT pt;
@@ -6649,6 +7158,44 @@ fail:
return -1;
}
+/***
+ * DESCRIPTION:
+ * Checks item visibility.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ * [I] nFirst : item index to check for
+ *
+ * RETURN:
+ * Item visible : TRUE
+ * Item invisible or failure : FALSE
+ */
+static BOOL LISTVIEW_IsItemVisible(const LISTVIEW_INFO *infoPtr, INT nItem)
+{
+ POINT Origin, Position;
+ RECT rcItem;
+ HDC hdc;
+ BOOL ret;
+
+ TRACE("nItem=%d\n", nItem);
+
+ if (nItem < 0 || nItem >= DPA_GetPtrCount(infoPtr->hdpaItems)) return FALSE;
+
+ LISTVIEW_GetOrigin(infoPtr, &Origin);
+ LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position);
+ rcItem.left = Position.x + Origin.x;
+ rcItem.top = Position.y + Origin.y;
+ rcItem.right = rcItem.left + infoPtr->nItemWidth;
+ rcItem.bottom = rcItem.top + infoPtr->nItemHeight;
+
+ hdc = GetDC(infoPtr->hwndSelf);
+ if (!hdc) return FALSE;
+ ret = RectVisible(hdc, &rcItem);
+ ReleaseDC(infoPtr->hwndSelf, hdc);
+
+ return ret;
+}
+
/***
* DESCRIPTION:
* Redraws a range of items.
@@ -6690,33 +7237,33 @@ static BOOL LISTVIEW_RedrawItems(const LISTVIEW_INFO *infoPtr, INT nFirst, INT n
* FAILURE : FALSE
*
* COMMENTS:
- * If the control is in report mode (LVS_REPORT) the control can
+ * If the control is in report view (LV_VIEW_DETAILS) the control can
* be scrolled only in line increments. "dy" will be rounded to the
* nearest number of pixels that are a whole line. Ex: if line height
* is 16 and an 8 is passed, the list will be scrolled by 16. If a 7
* is passed, then the scroll will be 0. (per MSDN 7/2002)
*
* For: (per experimentation with native control and CSpy ListView)
- * LVS_ICON dy=1 = 1 pixel (vertical only)
- * dx ignored
- * LVS_SMALLICON dy=1 = 1 pixel (vertical only)
- * dx ignored
- * LVS_LIST dx=1 = 1 column (horizontal only)
+ * LV_VIEW_ICON dy=1 = 1 pixel (vertical only)
+ * dx ignored
+ * LV_VIEW_SMALLICON dy=1 = 1 pixel (vertical only)
+ * dx ignored
+ * LV_VIEW_LIST dx=1 = 1 column (horizontal only)
* but will only scroll 1 column per message
* no matter what the value.
- * dy must be 0 or FALSE returned.
- * LVS_REPORT dx=1 = 1 pixel
- * dy= see above
+ * dy must be 0 or FALSE returned.
+ * LV_VIEW_DETAILS dx=1 = 1 pixel
+ * dy= see above
*
*/
static BOOL LISTVIEW_Scroll(LISTVIEW_INFO *infoPtr, INT dx, INT dy)
{
- switch(infoPtr->dwStyle & LVS_TYPEMASK) {
- case LVS_REPORT:
+ switch(infoPtr->uView) {
+ case LV_VIEW_DETAILS:
dy += (dy < 0 ? -1 : 1) * infoPtr->nItemHeight/2;
dy /= infoPtr->nItemHeight;
break;
- case LVS_LIST:
+ case LV_VIEW_LIST:
if (dy != 0) return FALSE;
break;
default: /* icon */
@@ -6883,6 +7430,14 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
hdi.lParam = lpColumn->iSubItem;
}
+ /* create header if not present */
+ LISTVIEW_CreateHeader(infoPtr);
+ if (!(LVS_NOCOLUMNHEADER & infoPtr->dwStyle) &&
+ (infoPtr->uView == LV_VIEW_DETAILS) && (WS_VISIBLE & infoPtr->dwStyle))
+ {
+ ShowWindow(infoPtr->hwndHeader, SW_SHOWNORMAL);
+ }
+
/* insert item in header control */
nNewColumn = SendMessageW(infoPtr->hwndHeader,
isW ? HDM_INSERTITEMW : HDM_INSERTITEMA,
@@ -6895,7 +7450,8 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
if (DPA_InsertPtr(infoPtr->hdpaColumns, nNewColumn, lpColumnInfo) == -1) goto fail;
if (lpColumn->mask & LVCF_FMT) lpColumnInfo->fmt = lpColumn->fmt;
- if (!Header_GetItemRect(infoPtr->hwndHeader, nNewColumn, &lpColumnInfo->rcHeader)) goto fail;
+ if (!SendMessageW(infoPtr->hwndHeader, HDM_GETITEMRECT, nNewColumn, (LPARAM)&lpColumnInfo->rcHeader))
+ goto fail;
/* now we have to actually adjust the data */
if (!(infoPtr->dwStyle & LVS_OWNERDATA) && infoPtr->nItemCount > 0)
@@ -6961,7 +7517,7 @@ static BOOL LISTVIEW_SetColumnT(const LISTVIEW_INFO *infoPtr, INT nColumn,
{
hdi.mask |= HDI_FORMAT;
hdiget.mask = HDI_FORMAT;
- if (Header_GetItemW(infoPtr->hwndHeader, nColumn, &hdiget))
+ if (SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, nColumn, (LPARAM)&hdiget))
hdi.fmt = hdiget.fmt & HDF_STRING;
}
column_fill_hditem(infoPtr, &hdi, nColumn, lpColumn, isW);
@@ -6978,8 +7534,7 @@ static BOOL LISTVIEW_SetColumnT(const LISTVIEW_INFO *infoPtr, INT nColumn,
lpColumnInfo->fmt = lpColumn->fmt;
if ((oldFmt ^ lpColumn->fmt) & (LVCFMT_JUSTIFYMASK | LVCFMT_IMAGE))
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
- if (uView == LVS_REPORT) LISTVIEW_InvalidateColumn(infoPtr, nColumn);
+ if (infoPtr->uView == LV_VIEW_DETAILS) LISTVIEW_InvalidateColumn(infoPtr, nColumn);
}
}
@@ -6999,17 +7554,17 @@ static BOOL LISTVIEW_SetColumnT(const LISTVIEW_INFO *infoPtr, INT nColumn,
* SUCCESS : TRUE
* FAILURE : FALSE
*/
-static BOOL LISTVIEW_SetColumnOrderArray(const LISTVIEW_INFO *infoPtr, INT iCount, const INT *lpiArray)
+static BOOL LISTVIEW_SetColumnOrderArray(LISTVIEW_INFO *infoPtr, INT iCount, const INT *lpiArray)
{
- FIXME("iCount %d lpiArray %p\n", iCount, lpiArray);
+ TRACE("iCount %d lpiArray %p\n", iCount, lpiArray);
- if (!lpiArray)
- return FALSE;
+ if (!lpiArray || !IsWindow(infoPtr->hwndHeader)) return FALSE;
- return TRUE;
+ infoPtr->colRectsDirty = TRUE;
+
+ return SendMessageW(infoPtr->hwndHeader, HDM_SETORDERARRAY, iCount, (LPARAM)lpiArray);
}
-
/***
* DESCRIPTION:
* Sets the width of a column
@@ -7025,7 +7580,6 @@ static BOOL LISTVIEW_SetColumnOrderArray(const LISTVIEW_INFO *infoPtr, INT iCoun
*/
static BOOL LISTVIEW_SetColumnWidth(LISTVIEW_INFO *infoPtr, INT nColumn, INT cx)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
WCHAR szDispText[DISP_TEXT_SIZE] = { 0 };
INT max_cx = 0;
HDITEMW hdi;
@@ -7033,14 +7587,14 @@ static BOOL LISTVIEW_SetColumnWidth(LISTVIEW_INFO *infoPtr, INT nColumn, INT cx)
TRACE("(nColumn=%d, cx=%d\n", nColumn, cx);
/* set column width only if in report or list mode */
- if (uView != LVS_REPORT && uView != LVS_LIST) return FALSE;
+ if (infoPtr->uView != LV_VIEW_DETAILS && infoPtr->uView != LV_VIEW_LIST) return FALSE;
/* take care of invalid cx values */
- if(uView == LVS_REPORT && cx < -2) cx = LVSCW_AUTOSIZE;
- else if (uView == LVS_LIST && cx < 1) return FALSE;
+ if(infoPtr->uView == LV_VIEW_DETAILS && cx < -2) cx = LVSCW_AUTOSIZE;
+ else if (infoPtr->uView == LV_VIEW_LIST && cx < 1) return FALSE;
- /* resize all columns if in LVS_LIST mode */
- if(uView == LVS_LIST)
+ /* resize all columns if in LV_VIEW_LIST mode */
+ if(infoPtr->uView == LV_VIEW_LIST)
{
infoPtr->nItemWidth = cx;
LISTVIEW_InvalidateList(infoPtr);
@@ -7099,7 +7653,7 @@ static BOOL LISTVIEW_SetColumnWidth(LISTVIEW_INFO *infoPtr, INT nColumn, INT cx)
hdi.mask = HDI_TEXT;
hdi.cchTextMax = DISP_TEXT_SIZE;
hdi.pszText = szDispText;
- if (Header_GetItemW(infoPtr->hwndHeader, nColumn, &hdi))
+ if (SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, nColumn, (LPARAM)&hdi))
{
HDC hdc = GetDC(infoPtr->hwndSelf);
HFONT old_font = SelectObject(hdc, (HFONT)SendMessageW(infoPtr->hwndHeader, WM_GETFONT, 0, 0));
@@ -7121,7 +7675,7 @@ static BOOL LISTVIEW_SetColumnWidth(LISTVIEW_INFO *infoPtr, INT nColumn, INT cx)
hdi.mask = HDI_WIDTH;
hdi.cxy = cx;
TRACE("hdi.cxy=%d\n", hdi.cxy);
- return Header_SetItemW(infoPtr->hwndHeader, nColumn, &hdi);
+ return SendMessageW(infoPtr->hwndHeader, HDM_SETITEMW, nColumn, (LPARAM)&hdi);
}
/***
@@ -7151,7 +7705,7 @@ static HIMAGELIST LISTVIEW_CreateCheckBoxIL(const LISTVIEW_INFO *infoPtr)
hbm_orig = SelectObject(hdc, hbm_mask);
FillRect(hdc, &rc, hbr_white);
- InflateRect(&rc, -3, -3);
+ InflateRect(&rc, -2, -2);
FillRect(hdc, &rc, hbr_black);
SelectObject(hdc, hbm_im);
@@ -7212,7 +7766,12 @@ static DWORD LISTVIEW_SetExtendedListViewStyle(LISTVIEW_INFO *infoPtr, DWORD dwM
if((infoPtr->dwLvExStyle ^ dwOldExStyle) & LVS_EX_HEADERDRAGDROP)
{
- DWORD dwStyle = GetWindowLongW(infoPtr->hwndHeader, GWL_STYLE);
+ DWORD dwStyle;
+
+ /* if not already created */
+ LISTVIEW_CreateHeader(infoPtr);
+
+ dwStyle = GetWindowLongW(infoPtr->hwndHeader, GWL_STYLE);
if (infoPtr->dwLvExStyle & LVS_EX_HEADERDRAGDROP)
dwStyle |= HDS_DRAGDROP;
else
@@ -7309,12 +7868,11 @@ static DWORD LISTVIEW_SetHoverTime(LISTVIEW_INFO *infoPtr, DWORD dwHoverTime)
static DWORD LISTVIEW_SetIconSpacing(LISTVIEW_INFO *infoPtr, INT cx, INT cy)
{
DWORD oldspacing = MAKELONG(infoPtr->iconSpacing.cx, infoPtr->iconSpacing.cy);
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
TRACE("requested=(%d,%d)\n", cx, cy);
/* this is supported only for LVS_ICON style */
- if (uView != LVS_ICON) return oldspacing;
+ if (infoPtr->uView != LV_VIEW_ICON) return oldspacing;
/* set to defaults, if instructed to */
if (cx == -1) cx = GetSystemMetrics(SM_CXICONSPACING);
@@ -7377,7 +7935,6 @@ static inline void set_icon_size(SIZE *size, HIMAGELIST himl, BOOL small)
*/
static HIMAGELIST LISTVIEW_SetImageList(LISTVIEW_INFO *infoPtr, INT nType, HIMAGELIST himl)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT oldHeight = infoPtr->nItemHeight;
HIMAGELIST himlOld = 0;
@@ -7388,14 +7945,14 @@ static HIMAGELIST LISTVIEW_SetImageList(LISTVIEW_INFO *infoPtr, INT nType, HIMAG
case LVSIL_NORMAL:
himlOld = infoPtr->himlNormal;
infoPtr->himlNormal = himl;
- if (uView == LVS_ICON) set_icon_size(&infoPtr->iconSize, himl, FALSE);
+ if (infoPtr->uView == LV_VIEW_ICON) set_icon_size(&infoPtr->iconSize, himl, FALSE);
LISTVIEW_SetIconSpacing(infoPtr, 0, 0);
break;
case LVSIL_SMALL:
himlOld = infoPtr->himlSmall;
infoPtr->himlSmall = himl;
- if (uView != LVS_ICON) set_icon_size(&infoPtr->iconSize, himl, TRUE);
+ if (infoPtr->uView != LV_VIEW_ICON) set_icon_size(&infoPtr->iconSize, himl, TRUE);
break;
case LVSIL_STATE:
@@ -7436,7 +7993,6 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFl
if (infoPtr->dwStyle & LVS_OWNERDATA)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT nOldCount = infoPtr->nItemCount;
if (nItems < nOldCount)
@@ -7445,7 +8001,7 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFl
ranges_del(infoPtr->selectionRanges, range);
if (infoPtr->nFocusedItem >= nItems)
{
- infoPtr->nFocusedItem = -1;
+ LISTVIEW_SetItemFocus(infoPtr, -1);
SetRectEmpty(&infoPtr->rcFocus);
}
}
@@ -7454,7 +8010,7 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFl
LISTVIEW_UpdateScroll(infoPtr);
/* the flags are valid only in ownerdata report and list modes */
- if (uView == LVS_ICON || uView == LVS_SMALLICON) dwFlags = 0;
+ if (infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON) dwFlags = 0;
if (!(dwFlags & LVSICF_NOSCROLL) && infoPtr->nFocusedItem != -1)
LISTVIEW_EnsureVisible(infoPtr, infoPtr->nFocusedItem, FALSE);
@@ -7471,7 +8027,7 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFl
nFrom = min(nOldCount, nItems);
nTo = max(nOldCount, nItems);
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
{
rcErase.left = 0;
rcErase.top = nFrom * infoPtr->nItemHeight;
@@ -7481,7 +8037,7 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFl
if (IntersectRect(&rcErase, &rcErase, &infoPtr->rcList))
LISTVIEW_InvalidateRect(infoPtr, &rcErase);
}
- else /* LVS_LIST */
+ else /* LV_VIEW_LIST */
{
INT nPerCol = LISTVIEW_GetCountPerColumn(infoPtr);
@@ -7532,13 +8088,12 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFl
*/
static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, POINT pt)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
POINT Origin;
TRACE("(nItem=%d, &pt=%s\n", nItem, wine_dbgstr_point(&pt));
if (nItem < 0 || nItem >= infoPtr->nItemCount ||
- !(uView == LVS_ICON || uView == LVS_SMALLICON)) return FALSE;
+ !(infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON)) return FALSE;
LISTVIEW_GetOrigin(infoPtr, &Origin);
@@ -7548,7 +8103,7 @@ static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, POINT pt
if ((pt.x == -1) && (pt.y == -1))
pt = Origin;
- if (uView == LVS_ICON)
+ if (infoPtr->uView == LV_VIEW_ICON)
{
pt.x -= (infoPtr->nItemWidth - infoPtr->iconSize.cx) / 2;
pt.y -= ICON_TOP_PADDING;
@@ -7588,6 +8143,13 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, const LVITE
if (nItem == -1)
{
+ /* select all isn't allowed in LVS_SINGLESEL */
+ if ((lvItem.state & lvItem.stateMask & LVIS_SELECTED) && (infoPtr->dwStyle & LVS_SINGLESEL))
+ return FALSE;
+
+ /* focus all isn't allowed */
+ if (lvItem.state & lvItem.stateMask & LVIS_FOCUSED) return FALSE;
+
/* apply to all items */
for (lvItem.iItem = 0; lvItem.iItem < infoPtr->nItemCount; lvItem.iItem++)
if (!LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE)) bResult = FALSE;
@@ -7595,39 +8157,6 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, const LVITE
else
bResult = LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE);
- /*
- * Update selection mark
- *
- * Investigation on windows 2k showed that selection mark was updated
- * whenever a new selection was made, but if the selected item was
- * unselected it was not updated.
- *
- * we are probably still not 100% accurate, but this at least sets the
- * proper selection mark when it is needed
- */
-
- if (bResult && (lvItem.state & lvItem.stateMask & LVIS_SELECTED) &&
- (infoPtr->nSelectionMark == -1))
- {
- int i;
- for (i = 0; i < infoPtr->nItemCount; i++)
- {
- if (infoPtr->uCallbackMask & LVIS_SELECTED)
- {
- if (LISTVIEW_GetItemState(infoPtr, i, LVIS_SELECTED))
- {
- infoPtr->nSelectionMark = i;
- break;
- }
- }
- else if (ranges_contain(infoPtr->selectionRanges, i))
- {
- infoPtr->nSelectionMark = i;
- break;
- }
- }
- }
-
return bResult;
}
@@ -7736,7 +8265,7 @@ static BOOL LISTVIEW_SetTextColor (LISTVIEW_INFO *infoPtr, COLORREF clrText)
/***
* DESCRIPTION:
- * Determines which listview item is located at the specified position.
+ * Sets new ToolTip window to ListView control.
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
@@ -7764,16 +8293,94 @@ static HWND LISTVIEW_SetToolTips( LISTVIEW_INFO *infoPtr, HWND hwndNewToolTip)
*/
static BOOL LISTVIEW_SetUnicodeFormat( LISTVIEW_INFO *infoPtr, BOOL fUnicode)
{
- BOOL rc = infoPtr->notifyFormat;
- infoPtr->notifyFormat = (fUnicode)?NFR_UNICODE:NFR_ANSI;
- return rc;
+ SHORT rc = infoPtr->notifyFormat;
+ infoPtr->notifyFormat = (fUnicode) ? NFR_UNICODE : NFR_ANSI;
+ return rc == NFR_UNICODE;
+}
+
+/*
+ * DESCRIPTION:
+ * sets the control view mode
+ * PARAMETER(S):
+ * [I] infoPtr :valid pointer to the listview structure
+ * [I] nView :new view mode value
+ *
+ * RETURN:
+ * SUCCESS: 1
+ * FAILURE: -1
+ */
+static INT LISTVIEW_SetView(LISTVIEW_INFO *infoPtr, DWORD nView)
+{
+ SIZE oldIconSize = infoPtr->iconSize;
+ HIMAGELIST himl;
+
+ if (infoPtr->uView == nView) return 1;
+
+ if ((INT)nView < 0 || nView > LV_VIEW_MAX) return -1;
+ if (nView == LV_VIEW_TILE)
+ {
+ FIXME("View LV_VIEW_TILE unimplemented\n");
+ return -1;
+ }
+
+ infoPtr->uView = nView;
+
+ SendMessageW(infoPtr->hwndEdit, WM_KILLFOCUS, 0, 0);
+ ShowWindow(infoPtr->hwndHeader, SW_HIDE);
+
+ ShowScrollBar(infoPtr->hwndSelf, SB_BOTH, FALSE);
+ SetRectEmpty(&infoPtr->rcFocus);
+
+ himl = (nView == LV_VIEW_ICON ? infoPtr->himlNormal : infoPtr->himlSmall);
+ set_icon_size(&infoPtr->iconSize, himl, nView != LV_VIEW_ICON);
+
+ switch (nView)
+ {
+ case LV_VIEW_ICON:
+ if ((infoPtr->iconSize.cx != oldIconSize.cx) || (infoPtr->iconSize.cy != oldIconSize.cy))
+ {
+ TRACE("icon old size=(%d,%d), new size=(%d,%d)\n",
+ oldIconSize.cx, oldIconSize.cy, infoPtr->iconSize.cx, infoPtr->iconSize.cy);
+ LISTVIEW_SetIconSpacing(infoPtr, 0, 0);
+ }
+ LISTVIEW_Arrange(infoPtr, LVA_DEFAULT);
+ break;
+ case LV_VIEW_SMALLICON:
+ LISTVIEW_Arrange(infoPtr, LVA_DEFAULT);
+ break;
+ case LV_VIEW_DETAILS:
+ {
+ HDLAYOUT hl;
+ WINDOWPOS wp;
+
+ LISTVIEW_CreateHeader( infoPtr );
+
+ hl.prc = &infoPtr->rcList;
+ hl.pwpos = ℘
+ SendMessageW(infoPtr->hwndHeader, HDM_LAYOUT, 0, (LPARAM)&hl);
+ SetWindowPos(infoPtr->hwndHeader, infoPtr->hwndSelf, wp.x, wp.y, wp.cx, wp.cy,
+ wp.flags | ((infoPtr->dwStyle & LVS_NOCOLUMNHEADER) ? SWP_HIDEWINDOW : SWP_SHOWWINDOW));
+ break;
+ }
+ case LV_VIEW_LIST:
+ break;
+ }
+
+ LISTVIEW_UpdateItemSize(infoPtr);
+ LISTVIEW_UpdateSize(infoPtr);
+ LISTVIEW_UpdateScroll(infoPtr);
+ LISTVIEW_InvalidateList(infoPtr);
+
+ TRACE("nView=%d\n", nView);
+
+ return 1;
}
/* LISTVIEW_SetWorkAreas */
/***
* DESCRIPTION:
- * Callback internally used by LISTVIEW_SortItems()
+ * Callback internally used by LISTVIEW_SortItems() in response of LVM_SORTITEMS
*
* PARAMETER(S):
* [I] first : pointer to first ITEM_INFO to compare
@@ -7795,6 +8402,30 @@ static INT WINAPI LISTVIEW_CallBackCompare(LPVOID first, LPVOID second, LPARAM l
return (infoPtr->pfnCompare)( lv_first->lParam , lv_second->lParam, infoPtr->lParamSort );
}
+/***
+ * DESCRIPTION:
+ * Callback internally used by LISTVIEW_SortItems() in response of LVM_SORTITEMSEX
+ *
+ * PARAMETER(S):
+ * [I] first : pointer to first ITEM_INFO to compare
+ * [I] second : pointer to second ITEM_INFO to compare
+ * [I] lParam : HWND of control
+ *
+ * RETURN:
+ * if first comes before second : negative
+ * if first comes after second : positive
+ * if first and second are equivalent : zero
+ */
+static INT WINAPI LISTVIEW_CallBackCompareEx(LPVOID first, LPVOID second, LPARAM lParam)
+{
+ LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)lParam;
+ INT first_idx = DPA_GetPtrIndex( infoPtr->hdpaItems, first );
+ INT second_idx = DPA_GetPtrIndex( infoPtr->hdpaItems, second );
+
+ /* Forward the call to the client defined callback */
+ return (infoPtr->pfnCompare)( first_idx, second_idx, infoPtr->lParamSort );
+}
+
/***
* DESCRIPTION:
* Sorts the listview items.
@@ -7803,18 +8434,19 @@ static INT WINAPI LISTVIEW_CallBackCompare(LPVOID first, LPVOID second, LPARAM l
* [I] infoPtr : valid pointer to the listview structure
* [I] pfnCompare : application-defined value
* [I] lParamSort : pointer to comparison callback
+ * [I] IsEx : TRUE when LVM_SORTITEMSEX used
*
* RETURN:
* SUCCESS : TRUE
* FAILURE : FALSE
*/
-static BOOL LISTVIEW_SortItems(LISTVIEW_INFO *infoPtr, PFNLVCOMPARE pfnCompare, LPARAM lParamSort)
+static BOOL LISTVIEW_SortItems(LISTVIEW_INFO *infoPtr, PFNLVCOMPARE pfnCompare,
+ LPARAM lParamSort, BOOL IsEx)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
HDPA hdpaSubItems;
ITEM_INFO *lpItem;
- LPVOID selectionMarkItem;
- LVITEMW item;
+ LPVOID selectionMarkItem = NULL;
+ LPVOID focusedItem = NULL;
int i;
TRACE("(pfnCompare=%p, lParamSort=%lx)\n", pfnCompare, lParamSort);
@@ -7827,49 +8459,39 @@ static BOOL LISTVIEW_SortItems(LISTVIEW_INFO *infoPtr, PFNLVCOMPARE pfnCompare,
/* if there are 0 or 1 items, there is no need to sort */
if (infoPtr->nItemCount < 2) return TRUE;
+ /* clear selection */
+ ranges_clear(infoPtr->selectionRanges);
+
+ /* save selection mark and focused item */
+ if (infoPtr->nSelectionMark >= 0)
+ selectionMarkItem = DPA_GetPtr(infoPtr->hdpaItems, infoPtr->nSelectionMark);
if (infoPtr->nFocusedItem >= 0)
- {
- hdpaSubItems = DPA_GetPtr(infoPtr->hdpaItems, infoPtr->nFocusedItem);
- lpItem = DPA_GetPtr(hdpaSubItems, 0);
- if (lpItem) lpItem->state |= LVIS_FOCUSED;
- }
- /* FIXME: go thorugh selected items and mark them so in lpItem->state */
- /* clear the lpItem->state for non-selected ones */
- /* remove the selection ranges */
-
+ focusedItem = DPA_GetPtr(infoPtr->hdpaItems, infoPtr->nFocusedItem);
+
infoPtr->pfnCompare = pfnCompare;
infoPtr->lParamSort = lParamSort;
- DPA_Sort(infoPtr->hdpaItems, LISTVIEW_CallBackCompare, (LPARAM)infoPtr);
+ if (IsEx)
+ DPA_Sort(infoPtr->hdpaItems, LISTVIEW_CallBackCompareEx, (LPARAM)infoPtr);
+ else
+ DPA_Sort(infoPtr->hdpaItems, LISTVIEW_CallBackCompare, (LPARAM)infoPtr);
- /* Adjust selections and indices so that they are the way they should
- * be after the sort (otherwise, the list items move around, but
- * whatever is at the item's previous original position will be
- * selected instead)
- */
- selectionMarkItem=(infoPtr->nSelectionMark>=0)?DPA_GetPtr(infoPtr->hdpaItems, infoPtr->nSelectionMark):NULL;
+ /* restore selection ranges */
for (i=0; i < infoPtr->nItemCount; i++)
{
hdpaSubItems = DPA_GetPtr(infoPtr->hdpaItems, i);
lpItem = DPA_GetPtr(hdpaSubItems, 0);
if (lpItem->state & LVIS_SELECTED)
- {
- item.state = LVIS_SELECTED;
- item.stateMask = LVIS_SELECTED;
- LISTVIEW_SetItemState(infoPtr, i, &item);
- }
- if (lpItem->state & LVIS_FOCUSED)
- {
- infoPtr->nFocusedItem = i;
- lpItem->state &= ~LVIS_FOCUSED;
- }
+ ranges_additem(infoPtr->selectionRanges, i);
}
- if (selectionMarkItem != NULL)
- infoPtr->nSelectionMark = DPA_GetPtrIndex(infoPtr->hdpaItems, selectionMarkItem);
+ /* restore selection mark and focused item */
+ infoPtr->nSelectionMark = DPA_GetPtrIndex(infoPtr->hdpaItems, selectionMarkItem);
+ infoPtr->nFocusedItem = DPA_GetPtrIndex(infoPtr->hdpaItems, focusedItem);
+
/* I believe nHotItem should be left alone, see LISTVIEW_ShiftIndices */
/* refresh the display */
- if (uView != LVS_ICON && uView != LVS_SMALLICON)
+ if (infoPtr->uView != LV_VIEW_ICON && infoPtr->uView != LV_VIEW_SMALLICON)
LISTVIEW_InvalidateList(infoPtr);
return TRUE;
@@ -8008,6 +8630,7 @@ static LRESULT LISTVIEW_NCCreate(HWND hwnd, const CREATESTRUCTW *lpcs)
infoPtr->hwndSelf = hwnd;
infoPtr->dwStyle = lpcs->style; /* Note: may be changed in WM_CREATE */
+ map_style_view(infoPtr);
/* determine the type of structures to use */
infoPtr->hwndNotify = lpcs->hwndParent;
/* infoPtr->notifyFormat will be filled in WM_CREATE */
@@ -8028,10 +8651,13 @@ static LRESULT LISTVIEW_NCCreate(HWND hwnd, const CREATESTRUCTW *lpcs)
infoPtr->iconSpacing.cx = GetSystemMetrics(SM_CXICONSPACING);
infoPtr->iconSpacing.cy = GetSystemMetrics(SM_CYICONSPACING);
infoPtr->nEditLabelItem = -1;
+ infoPtr->nLButtonDownItem = -1;
infoPtr->dwHoverTime = -1; /* default system hover time */
infoPtr->nMeasureItemHeight = 0;
infoPtr->xTrackLine = -1; /* no track line */
infoPtr->itemEdit.fEnabled = FALSE;
+ infoPtr->iVersion = COMCTL32_VERSION;
+ infoPtr->colRectsDirty = FALSE;
/* get default font (icon title) */
SystemParametersInfoW(SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
@@ -8042,6 +8668,7 @@ static LRESULT LISTVIEW_NCCreate(HWND hwnd, const CREATESTRUCTW *lpcs)
/* allocate memory for the data structure */
if (!(infoPtr->selectionRanges = ranges_create(10))) goto fail;
if (!(infoPtr->hdpaItems = DPA_Create(10))) goto fail;
+ if (!(infoPtr->hdpaItemIds = DPA_Create(10))) goto fail;
if (!(infoPtr->hdpaPosX = DPA_Create(10))) goto fail;
if (!(infoPtr->hdpaPosY = DPA_Create(10))) goto fail;
if (!(infoPtr->hdpaColumns = DPA_Create(10))) goto fail;
@@ -8051,6 +8678,7 @@ fail:
DestroyWindow(infoPtr->hwndHeader);
ranges_destroy(infoPtr->selectionRanges);
DPA_Destroy(infoPtr->hdpaItems);
+ DPA_Destroy(infoPtr->hdpaItemIds);
DPA_Destroy(infoPtr->hdpaPosX);
DPA_Destroy(infoPtr->hdpaPosY);
DPA_Destroy(infoPtr->hdpaColumns);
@@ -8074,48 +8702,42 @@ fail:
static LRESULT LISTVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
{
LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(hwnd, 0);
- UINT uView = lpcs->style & LVS_TYPEMASK;
- DWORD dFlags = WS_CHILD | HDS_HORZ | HDS_FULLDRAG | HDS_DRAGDROP;
TRACE("(lpcs=%p)\n", lpcs);
infoPtr->dwStyle = lpcs->style;
+ map_style_view(infoPtr);
+
infoPtr->notifyFormat = SendMessageW(infoPtr->hwndNotify, WM_NOTIFYFORMAT,
(WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
+ /* on error defaulting to ANSI notifications */
+ if (infoPtr->notifyFormat == 0) infoPtr->notifyFormat = NFR_ANSI;
- /* setup creation flags */
- dFlags |= (LVS_NOSORTHEADER & lpcs->style) ? 0 : HDS_BUTTONS;
- dFlags |= (LVS_NOCOLUMNHEADER & lpcs->style) ? HDS_HIDDEN : 0;
-
- /* create header */
- infoPtr->hwndHeader = CreateWindowW(WC_HEADERW, NULL, dFlags,
- 0, 0, 0, 0, hwnd, NULL,
- lpcs->hInstance, NULL);
- if (!infoPtr->hwndHeader) return -1;
-
- /* set header unicode format */
- SendMessageW(infoPtr->hwndHeader, HDM_SETUNICODEFORMAT, TRUE, 0);
-
- /* set header font */
- SendMessageW(infoPtr->hwndHeader, WM_SETFONT, (WPARAM)infoPtr->hFont, (LPARAM)TRUE);
+ if ((infoPtr->uView == LV_VIEW_DETAILS) && (lpcs->style & WS_VISIBLE))
+ {
+ if (LISTVIEW_CreateHeader(infoPtr) < 0) return -1;
+ }
+ else
+ infoPtr->hwndHeader = 0;
/* init item size to avoid division by 0 */
LISTVIEW_UpdateItemSize (infoPtr);
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
{
- if (!(LVS_NOCOLUMNHEADER & lpcs->style))
+ if (!(LVS_NOCOLUMNHEADER & lpcs->style) && (WS_VISIBLE & lpcs->style))
{
ShowWindow(infoPtr->hwndHeader, SW_SHOWNORMAL);
}
- LISTVIEW_UpdateSize(infoPtr);
LISTVIEW_UpdateScroll(infoPtr);
+ /* send WM_MEASUREITEM notification */
+ if (infoPtr->dwStyle & LVS_OWNERDRAWFIXED) notify_measureitem(infoPtr);
}
OpenThemeData(hwnd, themeClass);
/* initialize the icon sizes */
- set_icon_size(&infoPtr->iconSize, infoPtr->himlNormal, uView != LVS_ICON);
+ set_icon_size(&infoPtr->iconSize, infoPtr->himlNormal, infoPtr->uView != LV_VIEW_ICON);
set_icon_size(&infoPtr->iconStateSize, infoPtr->himlState, TRUE);
return 0;
}
@@ -8177,6 +8799,9 @@ static inline BOOL LISTVIEW_EraseBkgnd(const LISTVIEW_INFO *infoPtr, HDC hdc)
if (!GetClipBox(hdc, &rc)) return FALSE;
+ if (infoPtr->clrBk == CLR_NONE)
+ return SendMessageW(infoPtr->hwndNotify, WM_ERASEBKGND, (WPARAM)hdc, 0);
+
/* for double buffered controls we need to do this during refresh */
if (infoPtr->dwLvExStyle & LVS_EX_DOUBLEBUFFER) return FALSE;
@@ -8227,7 +8852,6 @@ static void scroll_list(LISTVIEW_INFO *infoPtr, INT dx, INT dy)
static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode,
INT nScrollDiff, HWND hScrollWnd)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT nOldScrollPos, nNewScrollPos;
SCROLLINFO scrollInfo;
BOOL is_an_icon;
@@ -8240,7 +8864,7 @@ static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode,
scrollInfo.cbSize = sizeof(SCROLLINFO);
scrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
- is_an_icon = ((uView == LVS_ICON) || (uView == LVS_SMALLICON));
+ is_an_icon = ((infoPtr->uView == LV_VIEW_ICON) || (infoPtr->uView == LV_VIEW_SMALLICON));
if (!GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo)) return 1;
@@ -8300,7 +8924,7 @@ static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode,
/* now adjust to client coordinates */
nScrollDiff = nOldScrollPos - nNewScrollPos;
- if (uView == LVS_REPORT) nScrollDiff *= infoPtr->nItemHeight;
+ if (infoPtr->uView == LV_VIEW_DETAILS) nScrollDiff *= infoPtr->nItemHeight;
/* and scroll the window */
scroll_list(infoPtr, 0, nScrollDiff);
@@ -8332,7 +8956,6 @@ static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode,
static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode,
INT nScrollDiff, HWND hScrollWnd)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT nOldScrollPos, nNewScrollPos;
SCROLLINFO scrollInfo;
@@ -8401,12 +9024,12 @@ static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode,
/* carry on only if it really changed */
if (nNewScrollPos == nOldScrollPos) return 0;
- if(uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
LISTVIEW_UpdateHeaderSize(infoPtr, nNewScrollPos);
/* now adjust to client coordinates */
nScrollDiff = nOldScrollPos - nNewScrollPos;
- if (uView == LVS_LIST) nScrollDiff *= infoPtr->nItemWidth;
+ if (infoPtr->uView == LV_VIEW_LIST) nScrollDiff *= infoPtr->nItemWidth;
/* and scroll the window */
scroll_list(infoPtr, nScrollDiff, 0);
@@ -8416,7 +9039,6 @@ static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode,
static LRESULT LISTVIEW_MouseWheel(LISTVIEW_INFO *infoPtr, INT wheelDelta)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
INT gcWheelDelta = 0;
INT pulScrollLines = 3;
SCROLLINFO scrollInfo;
@@ -8429,10 +9051,10 @@ static LRESULT LISTVIEW_MouseWheel(LISTVIEW_INFO *infoPtr, INT wheelDelta)
scrollInfo.cbSize = sizeof(SCROLLINFO);
scrollInfo.fMask = SIF_POS;
- switch(uView)
+ switch(infoPtr->uView)
{
- case LVS_ICON:
- case LVS_SMALLICON:
+ case LV_VIEW_ICON:
+ case LV_VIEW_SMALLICON:
/*
* listview should be scrolled by a multiple of 37 dependently on its dimension or its visible item number
* should be fixed in the future.
@@ -8441,7 +9063,7 @@ static LRESULT LISTVIEW_MouseWheel(LISTVIEW_INFO *infoPtr, INT wheelDelta)
-LISTVIEW_SCROLL_ICON_LINE_SIZE : LISTVIEW_SCROLL_ICON_LINE_SIZE, 0);
break;
- case LVS_REPORT:
+ case LV_VIEW_DETAILS:
if (abs(gcWheelDelta) >= WHEEL_DELTA && pulScrollLines)
{
int cLineScroll = min(LISTVIEW_GetCountPerColumn(infoPtr), pulScrollLines);
@@ -8450,7 +9072,7 @@ static LRESULT LISTVIEW_MouseWheel(LISTVIEW_INFO *infoPtr, INT wheelDelta)
}
break;
- case LVS_LIST:
+ case LV_VIEW_LIST:
LISTVIEW_HScroll(infoPtr, (gcWheelDelta < 0) ? SB_LINELEFT : SB_LINERIGHT, 0, 0);
break;
}
@@ -8471,7 +9093,6 @@ static LRESULT LISTVIEW_MouseWheel(LISTVIEW_INFO *infoPtr, INT wheelDelta)
*/
static LRESULT LISTVIEW_KeyDown(LISTVIEW_INFO *infoPtr, INT nVirtualKey, LONG lKeyData)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
HWND hwndSelf = infoPtr->hwndSelf;
INT nItem = -1;
NMLVKEYDOWN nmKeyDown;
@@ -8512,23 +9133,23 @@ static LRESULT LISTVIEW_KeyDown(LISTVIEW_INFO *infoPtr, INT nVirtualKey, LONG lK
break;
case VK_LEFT:
- nItem = ListView_GetNextItem(infoPtr->hwndSelf, infoPtr->nFocusedItem, LVNI_TOLEFT);
+ nItem = LISTVIEW_GetNextItem(infoPtr, infoPtr->nFocusedItem, LVNI_TOLEFT);
break;
case VK_UP:
- nItem = ListView_GetNextItem(infoPtr->hwndSelf, infoPtr->nFocusedItem, LVNI_ABOVE);
+ nItem = LISTVIEW_GetNextItem(infoPtr, infoPtr->nFocusedItem, LVNI_ABOVE);
break;
case VK_RIGHT:
- nItem = ListView_GetNextItem(infoPtr->hwndSelf, infoPtr->nFocusedItem, LVNI_TORIGHT);
+ nItem = LISTVIEW_GetNextItem(infoPtr, infoPtr->nFocusedItem, LVNI_TORIGHT);
break;
case VK_DOWN:
- nItem = ListView_GetNextItem(infoPtr->hwndSelf, infoPtr->nFocusedItem, LVNI_BELOW);
+ nItem = LISTVIEW_GetNextItem(infoPtr, infoPtr->nFocusedItem, LVNI_BELOW);
break;
case VK_PRIOR:
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
{
INT topidx = LISTVIEW_GetTopIndex(infoPtr);
if (infoPtr->nFocusedItem == topidx)
@@ -8543,7 +9164,7 @@ static LRESULT LISTVIEW_KeyDown(LISTVIEW_INFO *infoPtr, INT nVirtualKey, LONG lK
break;
case VK_NEXT:
- if (uView == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
{
INT topidx = LISTVIEW_GetTopIndex(infoPtr);
INT cnt = LISTVIEW_GetCountPerColumn(infoPtr);
@@ -8560,7 +9181,7 @@ static LRESULT LISTVIEW_KeyDown(LISTVIEW_INFO *infoPtr, INT nVirtualKey, LONG lK
}
if ((nItem != -1) && (nItem != infoPtr->nFocusedItem || nVirtualKey == VK_SPACE))
- LISTVIEW_KeySelection(infoPtr, nItem);
+ LISTVIEW_KeySelection(infoPtr, nItem, nVirtualKey == VK_SPACE);
return 0;
}
@@ -8585,7 +9206,7 @@ static LRESULT LISTVIEW_KillFocus(LISTVIEW_INFO *infoPtr)
/* send NM_KILLFOCUS notification */
if (!notify(infoPtr, NM_KILLFOCUS)) return 0;
- /* if we have a focus rectagle, get rid of it */
+ /* if we have a focus rectangle, get rid of it */
LISTVIEW_ShowFocusRect(infoPtr, FALSE);
/* set window focus flag */
@@ -8726,10 +9347,15 @@ static LRESULT LISTVIEW_LButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, IN
else
{
if (LISTVIEW_GetItemState(infoPtr, nItem, LVIS_SELECTED))
+ {
infoPtr->nEditLabelItem = nItem;
+ infoPtr->nLButtonDownItem = nItem;
- /* set selection (clears other pre-existing selections) */
- LISTVIEW_SetSelection(infoPtr, nItem);
+ LISTVIEW_SetItemFocus(infoPtr, nItem);
+ }
+ else
+ /* set selection (clears other pre-existing selections) */
+ LISTVIEW_SetSelection(infoPtr, nItem);
}
}
@@ -8739,7 +9365,8 @@ static LRESULT LISTVIEW_LButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, IN
else
{
/* remove all selections */
- LISTVIEW_DeselectAll(infoPtr);
+ if (!(wKey & MK_CONTROL) && !(wKey & MK_SHIFT))
+ LISTVIEW_DeselectAll(infoPtr);
ReleaseCapture();
}
@@ -8776,6 +9403,11 @@ static LRESULT LISTVIEW_LButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, INT
/* set left button flag */
infoPtr->bLButtonDown = FALSE;
+ /* set a single selection, reset others */
+ if(lvHitTestInfo.iItem == infoPtr->nLButtonDownItem && lvHitTestInfo.iItem != -1)
+ LISTVIEW_SetSelection(infoPtr, infoPtr->nLButtonDownItem);
+ infoPtr->nLButtonDownItem = -1;
+
if (infoPtr->bDragging)
{
infoPtr->bDragging = FALSE;
@@ -8821,6 +9453,7 @@ static LRESULT LISTVIEW_NCDestroy(LISTVIEW_INFO *infoPtr)
/* destroy data structure */
DPA_Destroy(infoPtr->hdpaItems);
+ DPA_Destroy(infoPtr->hdpaItemIds);
DPA_Destroy(infoPtr->hdpaPosX);
DPA_Destroy(infoPtr->hdpaPosY);
DPA_Destroy(infoPtr->hdpaColumns);
@@ -8864,7 +9497,6 @@ static LRESULT LISTVIEW_NCDestroy(LISTVIEW_INFO *infoPtr)
*/
static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADERW *lpnmh)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
HWND hwndSelf = infoPtr->hwndSelf;
TRACE("(lpnmh=%p)\n", lpnmh);
@@ -8901,11 +9533,17 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
LISTVIEW_DrawTrackLine(infoPtr);
infoPtr->xTrackLine = -1;
break;
-
+
+ case HDN_BEGINDRAG:
+ notify_forward_header(infoPtr, lpnmh);
+ return (infoPtr->dwLvExStyle & LVS_EX_HEADERDRAGDROP) == 0;
+
case HDN_ENDDRAG:
- FIXME("Changing column order not implemented\n");
- return TRUE;
-
+ infoPtr->colRectsDirty = TRUE;
+ LISTVIEW_InvalidateList(infoPtr);
+ notify_forward_header(infoPtr, lpnmh);
+ return FALSE;
+
case HDN_ITEMCHANGINGW:
case HDN_ITEMCHANGINGA:
return notify_forward_header(infoPtr, lpnmh);
@@ -8914,6 +9552,7 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
case HDN_ITEMCHANGEDA:
{
COLUMN_INFO *lpColumnInfo;
+ HDITEMW hdi;
INT dx, cxy;
notify_forward_header(infoPtr, lpnmh);
@@ -8922,10 +9561,8 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
if (!lpnmh->pitem || !(lpnmh->pitem->mask & HDI_WIDTH))
{
- HDITEMW hdi;
-
hdi.mask = HDI_WIDTH;
- if (!Header_GetItemW(infoPtr->hwndHeader, lpnmh->iItem, &hdi)) return 0;
+ if (!SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, lpnmh->iItem, (LPARAM)&hdi)) return 0;
cxy = hdi.cxy;
}
else
@@ -8937,8 +9574,17 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
if (dx != 0)
{
lpColumnInfo->rcHeader.right += dx;
- if (lpnmh->iItem + 1 < DPA_GetPtrCount(infoPtr->hdpaColumns))
- LISTVIEW_ScrollColumns(infoPtr, lpnmh->iItem + 1, dx);
+
+ hdi.mask = HDI_ORDER;
+ SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, lpnmh->iItem, (LPARAM)&hdi);
+
+ /* not the rightmost one */
+ if (hdi.iOrder + 1 < DPA_GetPtrCount(infoPtr->hdpaColumns))
+ {
+ INT nIndex = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX,
+ hdi.iOrder + 1, 0);
+ LISTVIEW_ScrollColumns(infoPtr, nIndex, dx);
+ }
else
{
/* only needs to update the scrolls */
@@ -8946,7 +9592,7 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
LISTVIEW_UpdateScroll(infoPtr);
}
LISTVIEW_UpdateItemSize(infoPtr);
- if (uView == LVS_REPORT && is_redrawing(infoPtr))
+ if (infoPtr->uView == LV_VIEW_DETAILS && is_redrawing(infoPtr))
{
POINT ptOrigin;
RECT rcCol = lpColumnInfo->rcHeader;
@@ -8967,9 +9613,21 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
}
/* when shrinking the last column clear the now unused field */
- if (lpnmh->iItem == DPA_GetPtrCount(infoPtr->hdpaColumns) - 1 && dx < 0)
+ if (hdi.iOrder == DPA_GetPtrCount(infoPtr->hdpaColumns) - 1)
+ {
+ RECT right;
+
rcCol.right -= dx;
+ /* deal with right from rightmost column area */
+ right.left = rcCol.right;
+ right.top = rcCol.top;
+ right.bottom = rcCol.bottom;
+ right.right = infoPtr->rcList.right;
+
+ LISTVIEW_InvalidateRect(infoPtr, &right);
+ }
+
LISTVIEW_InvalidateRect(infoPtr, &rcCol);
}
}
@@ -8993,6 +9651,7 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
case HDN_DIVIDERDBLCLICKW:
case HDN_DIVIDERDBLCLICKA:
LISTVIEW_SetColumnWidth(infoPtr, lpnmh->iItem, LVSCW_AUTOSIZE);
+ notify_forward_header(infoPtr, lpnmh);
break;
}
@@ -9061,14 +9720,14 @@ static LRESULT LISTVIEW_NotifyFormat(LISTVIEW_INFO *infoPtr, HWND hwndFrom, INT
TRACE("(hwndFrom=%p, nCommand=%d)\n", hwndFrom, nCommand);
if (nCommand == NF_REQUERY)
- infoPtr->notifyFormat = SendMessageW(hwndFrom, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY);
+ infoPtr->notifyFormat = SendMessageW(infoPtr->hwndNotify, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY);
return infoPtr->notifyFormat;
}
/***
* DESCRIPTION:
- * Paints/Repaints the listview control.
+ * Paints/Repaints the listview control. Internal use.
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
@@ -9083,16 +9742,14 @@ static LRESULT LISTVIEW_Paint(LISTVIEW_INFO *infoPtr, HDC hdc)
if (infoPtr->bNoItemMetrics && infoPtr->nItemCount)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
-
infoPtr->bNoItemMetrics = FALSE;
LISTVIEW_UpdateItemSize(infoPtr);
- if (uView == LVS_ICON || uView == LVS_SMALLICON)
+ if (infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON)
LISTVIEW_Arrange(infoPtr, LVA_DEFAULT);
LISTVIEW_UpdateScroll(infoPtr);
}
- UpdateWindow(infoPtr->hwndHeader);
+ if (infoPtr->hwndHeader) UpdateWindow(infoPtr->hwndHeader);
if (hdc)
LISTVIEW_Refresh(infoPtr, hdc, NULL);
@@ -9109,6 +9766,26 @@ static LRESULT LISTVIEW_Paint(LISTVIEW_INFO *infoPtr, HDC hdc)
return 0;
}
+/***
+ * DESCRIPTION:
+ * Paints/Repaints the listview control, WM_PAINT handler.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ * [I] hdc : device context handle
+ *
+ * RETURN:
+ * Zero
+ */
+static inline LRESULT LISTVIEW_WMPaint(LISTVIEW_INFO *infoPtr, HDC hdc)
+{
+ TRACE("(hdc=%p)\n", hdc);
+
+ if (!is_redrawing(infoPtr))
+ return DefWindowProcW (infoPtr->hwndSelf, WM_PAINT, (WPARAM)hdc, 0);
+
+ return LISTVIEW_Paint(infoPtr, hdc);
+}
/***
* DESCRIPTION:
@@ -9241,7 +9918,7 @@ static LRESULT LISTVIEW_RButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, INT
/* set button flag */
infoPtr->bRButtonDown = FALSE;
- /* Send NM_RClICK notification */
+ /* Send NM_RCLICK notification */
lvHitTestInfo.pt.x = x;
lvHitTestInfo.pt.y = y;
LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, FALSE);
@@ -9345,7 +10022,7 @@ static LRESULT LISTVIEW_SetFont(LISTVIEW_INFO *infoPtr, HFONT hFont, WORD fRedra
LISTVIEW_SaveTextMetrics(infoPtr);
- if ((infoPtr->dwStyle & LVS_TYPEMASK) == LVS_REPORT)
+ if (infoPtr->uView == LV_VIEW_DETAILS)
{
SendMessageW(infoPtr->hwndHeader, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(fRedraw, 0));
LISTVIEW_UpdateSize(infoPtr);
@@ -9422,7 +10099,7 @@ static LRESULT LISTVIEW_Size(LISTVIEW_INFO *infoPtr, int Width, int Height)
LISTVIEW_UpdateScroll(infoPtr);
/* refresh all only for lists whose height changed significantly */
- if ((infoPtr->dwStyle & LVS_TYPEMASK) == LVS_LIST &&
+ if ((infoPtr->uView == LV_VIEW_LIST) &&
(rcOld.bottom - rcOld.top) / infoPtr->nItemHeight !=
(infoPtr->rcList.bottom - infoPtr->rcList.top) / infoPtr->nItemHeight)
LISTVIEW_InvalidateList(infoPtr);
@@ -9442,13 +10119,11 @@ static LRESULT LISTVIEW_Size(LISTVIEW_INFO *infoPtr, int Width, int Height)
*/
static void LISTVIEW_UpdateSize(LISTVIEW_INFO *infoPtr)
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
-
- TRACE("uView=%d, rcList(old)=%s\n", uView, wine_dbgstr_rect(&infoPtr->rcList));
+ TRACE("uView=%d, rcList(old)=%s\n", infoPtr->uView, wine_dbgstr_rect(&infoPtr->rcList));
GetClientRect(infoPtr->hwndSelf, &infoPtr->rcList);
- if (uView == LVS_LIST)
+ if (infoPtr->uView == LV_VIEW_LIST)
{
/* Apparently the "LIST" style is supposed to have the same
* number of items in a column even if there is no scroll bar.
@@ -9457,11 +10132,11 @@ static void LISTVIEW_UpdateSize(LISTVIEW_INFO *infoPtr)
* The "2" is there to mimic the native control. I think it may be
* related to either padding or edges. (GLA 7/2002)
*/
- if (!(GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & WS_HSCROLL))
+ if (!(infoPtr->dwStyle & WS_HSCROLL))
infoPtr->rcList.bottom -= GetSystemMetrics(SM_CYHSCROLL);
infoPtr->rcList.bottom = max (infoPtr->rcList.bottom - 2, 0);
}
- else if (uView == LVS_REPORT)
+ else if (infoPtr->uView == LV_VIEW_DETAILS)
{
HDLAYOUT hl;
WINDOWPOS wp;
@@ -9505,13 +10180,9 @@ static INT LISTVIEW_StyleChanged(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
wStyleType, lpss->styleOld, lpss->styleNew);
if (wStyleType != GWL_STYLE) return 0;
-
- /* FIXME: if LVS_NOSORTHEADER changed, update header */
- /* what if LVS_OWNERDATA changed? */
- /* or LVS_SINGLESEL */
- /* or LVS_SORT{AS,DES}CENDING */
infoPtr->dwStyle = lpss->styleNew;
+ map_style_view(infoPtr);
if (((lpss->styleOld & WS_HSCROLL) != 0)&&
((lpss->styleNew & WS_HSCROLL) == 0))
@@ -9549,6 +10220,8 @@ static INT LISTVIEW_StyleChanged(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
HDLAYOUT hl;
WINDOWPOS wp;
+ LISTVIEW_CreateHeader( infoPtr );
+
hl.prc = &infoPtr->rcList;
hl.pwpos = ℘
SendMessageW( infoPtr->hwndHeader, HDM_LAYOUT, 0, (LPARAM)&hl );
@@ -9597,6 +10270,103 @@ static INT LISTVIEW_StyleChanged(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
return 0;
}
+/***
+ * DESCRIPTION:
+ * Processes WM_STYLECHANGING messages.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ * [I] wStyleType : window style type (normal or extended)
+ * [I0] lpss : window style information
+ *
+ * RETURN:
+ * Zero
+ */
+static INT LISTVIEW_StyleChanging(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
+ STYLESTRUCT *lpss)
+{
+ TRACE("(styletype=%lx, styleOld=0x%08x, styleNew=0x%08x)\n",
+ wStyleType, lpss->styleOld, lpss->styleNew);
+
+ /* don't forward LVS_OWNERDATA only if not already set to */
+ if ((lpss->styleNew ^ lpss->styleOld) & LVS_OWNERDATA)
+ {
+ if (lpss->styleOld & LVS_OWNERDATA)
+ lpss->styleNew |= LVS_OWNERDATA;
+ else
+ lpss->styleNew &= ~LVS_OWNERDATA;
+ }
+
+ return 0;
+}
+
+/***
+ * DESCRIPTION:
+ * Processes WM_SHOWWINDOW messages.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ * [I] bShown : window is being shown (FALSE when hidden)
+ * [I] iStatus : window show status
+ *
+ * RETURN:
+ * Zero
+ */
+static LRESULT LISTVIEW_ShowWindow(LISTVIEW_INFO *infoPtr, BOOL bShown, INT iStatus)
+{
+ /* header delayed creation */
+ if ((infoPtr->uView == LV_VIEW_DETAILS) && bShown)
+ {
+ LISTVIEW_CreateHeader(infoPtr);
+
+ if (!(LVS_NOCOLUMNHEADER & infoPtr->dwStyle))
+ ShowWindow(infoPtr->hwndHeader, SW_SHOWNORMAL);
+ }
+
+ return 0;
+}
+
+/***
+ * DESCRIPTION:
+ * Processes CCM_GETVERSION messages.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ *
+ * RETURN:
+ * Current version
+ */
+static inline LRESULT LISTVIEW_GetVersion(const LISTVIEW_INFO *infoPtr)
+{
+ return infoPtr->iVersion;
+}
+
+/***
+ * DESCRIPTION:
+ * Processes CCM_SETVERSION messages.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ * [I] iVersion : version to be set
+ *
+ * RETURN:
+ * -1 when requested version is greater than DLL version;
+ * previous version otherwise
+ */
+static LRESULT LISTVIEW_SetVersion(LISTVIEW_INFO *infoPtr, DWORD iVersion)
+{
+ INT iOldVersion = infoPtr->iVersion;
+
+ if (iVersion > COMCTL32_VERSION)
+ return -1;
+
+ infoPtr->iVersion = iVersion;
+
+ TRACE("new version %d\n", iVersion);
+
+ return iOldVersion;
+}
+
/***
* DESCRIPTION:
* Window procedure of the listview control.
@@ -9620,7 +10390,8 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case LVM_ARRANGE:
return LISTVIEW_Arrange(infoPtr, (INT)wParam);
-/* case LVM_CANCELEDITLABEL: */
+ case LVM_CANCELEDITLABEL:
+ return LISTVIEW_CancelEditLabel(infoPtr);
case LVM_CREATEDRAGIMAGE:
return (LRESULT)LISTVIEW_CreateDragImage(infoPtr, (INT)wParam, (LPPOINT)lParam);
@@ -9746,8 +10517,8 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case LVM_GETORIGIN:
if (!lParam) return FALSE;
- if ((infoPtr->dwStyle & LVS_TYPEMASK) == LVS_REPORT ||
- (infoPtr->dwStyle & LVS_TYPEMASK) == LVS_LIST) return FALSE;
+ if (infoPtr->uView == LV_VIEW_DETAILS ||
+ infoPtr->uView == LV_VIEW_LIST) return FALSE;
LISTVIEW_GetOrigin(infoPtr, (LPPOINT)lParam);
return TRUE;
@@ -9791,7 +10562,8 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case LVM_GETUNICODEFORMAT:
return (infoPtr->notifyFormat == NFR_UNICODE);
- /* case LVM_GETVIEW: */
+ case LVM_GETVIEW:
+ return infoPtr->uView;
case LVM_GETVIEWRECT:
return LISTVIEW_GetViewRect(infoPtr, (LPRECT)lParam);
@@ -9803,7 +10575,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* case LVM_HASGROUP: */
case LVM_HITTEST:
- return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam, FALSE, FALSE);
+ return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam, FALSE, TRUE);
case LVM_INSERTCOLUMNA:
return LISTVIEW_InsertColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
@@ -9825,9 +10597,14 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* case LVM_ISGROUPVIEWENABLED: */
- /* case LVM_MAPIDTOINDEX: */
+ case LVM_ISITEMVISIBLE:
+ return LISTVIEW_IsItemVisible(infoPtr, (INT)wParam);
- /* case LVM_MAPINDEXTOID: */
+ case LVM_MAPIDTOINDEX:
+ return LISTVIEW_MapIdToIndex(infoPtr, (UINT)wParam);
+
+ case LVM_MAPINDEXTOID:
+ return LISTVIEW_MapIndexToId(infoPtr, (INT)wParam);
/* case LVM_MOVEGROUP: */
@@ -9893,10 +10670,11 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* case LVM_SETINSERTMARKCOLOR: */
case LVM_SETITEMA:
- return LISTVIEW_SetItemT(infoPtr, (LPLVITEMW)lParam, FALSE);
-
case LVM_SETITEMW:
- return LISTVIEW_SetItemT(infoPtr, (LPLVITEMW)lParam, TRUE);
+ {
+ if (infoPtr->dwStyle & LVS_OWNERDATA) return FALSE;
+ return LISTVIEW_SetItemT(infoPtr, (LPLVITEMW)lParam, (uMsg == LVM_SETITEMW));
+ }
case LVM_SETITEMCOUNT:
return LISTVIEW_SetItemCount(infoPtr, (INT)wParam, (DWORD)lParam);
@@ -9914,6 +10692,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, *((POINT*)lParam));
case LVM_SETITEMSTATE:
+ if (lParam == 0) return FALSE;
return LISTVIEW_SetItemState(infoPtr, (INT)wParam, (LPLVITEMW)lParam);
case LVM_SETITEMTEXTA:
@@ -9947,16 +10726,18 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case LVM_SETUNICODEFORMAT:
return LISTVIEW_SetUnicodeFormat(infoPtr, wParam);
- /* case LVM_SETVIEW: */
+ case LVM_SETVIEW:
+ return LISTVIEW_SetView(infoPtr, wParam);
/* case LVM_SETWORKAREAS: */
/* case LVM_SORTGROUPS: */
case LVM_SORTITEMS:
- return LISTVIEW_SortItems(infoPtr, (PFNLVCOMPARE)lParam, (LPARAM)wParam);
+ return LISTVIEW_SortItems(infoPtr, (PFNLVCOMPARE)lParam, (LPARAM)wParam, FALSE);
- /* LVM_SORTITEMSEX: */
+ case LVM_SORTITEMSEX:
+ return LISTVIEW_SortItems(infoPtr, (PFNLVCOMPARE)lParam, (LPARAM)wParam, TRUE);
case LVM_SUBITEMHITTEST:
return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam, TRUE, FALSE);
@@ -9964,6 +10745,12 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case LVM_UPDATE:
return LISTVIEW_Update(infoPtr, (INT)wParam);
+ case CCM_GETVERSION:
+ return LISTVIEW_GetVersion(infoPtr);
+
+ case CCM_SETVERSION:
+ return LISTVIEW_SetVersion(infoPtr, wParam);
+
case WM_CHAR:
return LISTVIEW_ProcessLetterKeys( infoPtr, wParam, lParam );
@@ -10035,7 +10822,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_PrintClient(infoPtr, (HDC)wParam, (DWORD)lParam);
case WM_PAINT:
- return LISTVIEW_Paint(infoPtr, (HDC)wParam);
+ return LISTVIEW_WMPaint(infoPtr, (HDC)wParam);
case WM_RBUTTONDBLCLK:
return LISTVIEW_RButtonDblClk(infoPtr, (WORD)wParam, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
@@ -10060,12 +10847,19 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_SETREDRAW:
return LISTVIEW_SetRedraw(infoPtr, (BOOL)wParam);
+ case WM_SHOWWINDOW:
+ LISTVIEW_ShowWindow(infoPtr, (BOOL)wParam, (INT)lParam);
+ return DefWindowProcW(hwnd, uMsg, wParam, lParam);
+
case WM_SIZE:
return LISTVIEW_Size(infoPtr, (short)LOWORD(lParam), (short)HIWORD(lParam));
case WM_STYLECHANGED:
return LISTVIEW_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
+ case WM_STYLECHANGING:
+ return LISTVIEW_StyleChanging(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
+
case WM_SYSCOLORCHANGE:
COMCTL32_RefreshSysColors();
return 0;
@@ -10085,22 +10879,12 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_WINDOWPOSCHANGED:
if (!(((WINDOWPOS *)lParam)->flags & SWP_NOSIZE))
{
- UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
- SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE |
- SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
+ SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE |
+ SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
- if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (uView == LVS_REPORT))
+ if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (infoPtr->uView == LV_VIEW_DETAILS))
{
- MEASUREITEMSTRUCT mis;
- mis.CtlType = ODT_LISTVIEW;
- mis.CtlID = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
- mis.itemID = -1;
- mis.itemWidth = 0;
- mis.itemData = 0;
- mis.itemHeight= infoPtr->nItemHeight;
- SendMessageW(infoPtr->hwndNotify, WM_MEASUREITEM, mis.CtlID, (LPARAM)&mis);
- if (infoPtr->nItemHeight != max(mis.itemHeight, 1))
- infoPtr->nMeasureItemHeight = infoPtr->nItemHeight = max(mis.itemHeight, 1);
+ if (notify_measureitem(infoPtr)) LISTVIEW_InvalidateList(infoPtr);
}
LISTVIEW_UpdateSize(infoPtr);
@@ -10173,7 +10957,7 @@ void LISTVIEW_Unregister(void)
* RETURN:
* Zero.
*/
-static LRESULT LISTVIEW_Command(const LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
switch (HIWORD(wParam))
{
@@ -10223,6 +11007,10 @@ static LRESULT LISTVIEW_Command(const LISTVIEW_INFO *infoPtr, WPARAM wParam, LPA
break;
}
+ case EN_KILLFOCUS:
+ {
+ LISTVIEW_CancelEditLabel(infoPtr);
+ }
default:
return SendMessageW (infoPtr->hwndNotify, WM_COMMAND, wParam, lParam);
@@ -10249,7 +11037,7 @@ static LRESULT LISTVIEW_Command(const LISTVIEW_INFO *infoPtr, WPARAM wParam, LPA
static LRESULT EditLblWndProcT(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL isW)
{
LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(GetParent(hwnd), 0);
- BOOL cancel = FALSE;
+ BOOL save = TRUE;
TRACE("(hwnd=%p, uMsg=%x, wParam=%lx, lParam=%lx, isW=%d)\n",
hwnd, uMsg, wParam, lParam, isW);
@@ -10259,9 +11047,6 @@ static LRESULT EditLblWndProcT(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPara
case WM_GETDLGCODE:
return DLGC_WANTARROWS | DLGC_WANTALLKEYS;
- case WM_KILLFOCUS:
- break;
-
case WM_DESTROY:
{
WNDPROC editProc = infoPtr->EditWndProc;
@@ -10273,7 +11058,7 @@ static LRESULT EditLblWndProcT(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPara
case WM_KEYDOWN:
if (VK_ESCAPE == (INT)wParam)
{
- cancel = TRUE;
+ save = FALSE;
break;
}
else if (VK_RETURN == (INT)wParam)
@@ -10285,27 +11070,7 @@ static LRESULT EditLblWndProcT(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPara
/* kill the edit */
if (infoPtr->hwndEdit)
- {
- LPWSTR buffer = NULL;
-
- infoPtr->hwndEdit = 0;
- if (!cancel)
- {
- DWORD len = isW ? GetWindowTextLengthW(hwnd) : GetWindowTextLengthA(hwnd);
-
- if (len)
- {
- if ( (buffer = Alloc((len+1) * (isW ? sizeof(WCHAR) : sizeof(CHAR)))) )
- {
- if (isW) GetWindowTextW(hwnd, buffer, len+1);
- else GetWindowTextA(hwnd, (CHAR*)buffer, len+1);
- }
- }
- }
- LISTVIEW_EndEditLabelT(infoPtr, buffer, isW);
-
- Free(buffer);
- }
+ LISTVIEW_EndEditLabelT(infoPtr, save, isW);
SendMessageW(hwnd, WM_CLOSE, 0, 0);
return 0;
@@ -10357,41 +11122,21 @@ static LRESULT CALLBACK EditLblWndProcA(HWND hwnd, UINT uMsg, WPARAM wParam, LPA
*
* RETURN:
*/
-static HWND CreateEditLabelT(LISTVIEW_INFO *infoPtr, LPCWSTR text, DWORD style,
- INT x, INT y, INT width, INT height, BOOL isW)
+static HWND CreateEditLabelT(LISTVIEW_INFO *infoPtr, LPCWSTR text, DWORD style, BOOL isW)
{
WCHAR editName[5] = { 'E', 'd', 'i', 't', '\0' };
HWND hedit;
- SIZE sz;
- HDC hdc;
- HDC hOldFont=0;
- TEXTMETRICW textMetric;
HINSTANCE hinst = (HINSTANCE)GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_HINSTANCE);
TRACE("(text=%s, ..., isW=%d)\n", debugtext_t(text, isW), isW);
style |= WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|ES_AUTOHSCROLL|WS_BORDER;
- hdc = GetDC(infoPtr->hwndSelf);
- /* Select the font to get appropriate metric dimensions */
- if(infoPtr->hFont != 0)
- hOldFont = SelectObject(hdc, infoPtr->hFont);
-
- /*Get String Length in pixels */
- GetTextExtentPoint32W(hdc, text, lstrlenW(text), &sz);
-
- /*Add Extra spacing for the next character */
- GetTextMetricsW(hdc, &textMetric);
- sz.cx += (textMetric.tmMaxCharWidth * 2);
-
- if(infoPtr->hFont != 0)
- SelectObject(hdc, hOldFont);
-
- ReleaseDC(infoPtr->hwndSelf, hdc);
+ /* Window will be resized and positioned after LVN_BEGINLABELEDIT */
if (isW)
- hedit = CreateWindowW(editName, text, style, x, y, sz.cx, height, infoPtr->hwndSelf, 0, hinst, 0);
+ hedit = CreateWindowW(editName, text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0);
else
- hedit = CreateWindowA("Edit", (LPCSTR)text, style, x, y, sz.cx, height, infoPtr->hwndSelf, 0, hinst, 0);
+ hedit = CreateWindowA("Edit", (LPCSTR)text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0);
if (!hedit) return 0;
diff --git a/reactos/dll/win32/comctl32/progress.c b/reactos/dll/win32/comctl32/progress.c
index 776345ffda1..c44b816a2b8 100644
--- a/reactos/dll/win32/comctl32/progress.c
+++ b/reactos/dll/win32/comctl32/progress.c
@@ -27,6 +27,16 @@
* the specification mentioned above.
* If you discover missing features, or bugs, please note them below.
*
+ * TODO:
+ *
+ * Messages:
+ * -- PBM_GETSTEP
+ * -- PBM_SETSTATE
+ * -- PBM_GETSTATE
+ *
+ * Styles:
+ * -- PBS_SMOOTHREVERSE
+ *
*/
#include
@@ -253,38 +263,22 @@ static const ProgressDrawProc drawProcClassic[8] = {
static void draw_theme_bar_H (const ProgressDrawInfo* di, int start, int end)
{
RECT r;
- int right = di->rect.left + end;
r.left = di->rect.left + start;
r.top = di->rect.top;
r.bottom = di->rect.bottom;
- while (r.left < right)
- {
- r.right = min (r.left + di->ledW, right);
- DrawThemeBackground (di->theme, di->hdc, PP_CHUNK, 0, &r, NULL);
- r.left = r.right;
- r.right = min (r.left + di->ledGap, right);
- DrawThemeBackground (di->theme, di->hdc, PP_BAR, 0, &di->bgRect, &r);
- r.left = r.right;
- }
+ r.right = di->rect.left + end;
+ DrawThemeBackground (di->theme, di->hdc, PP_CHUNK, 0, &r, NULL);
}
-/* draw themed horizontal bar from 'start' to 'end' */
+/* draw themed vertical bar from 'start' to 'end' */
static void draw_theme_bar_V (const ProgressDrawInfo* di, int start, int end)
{
RECT r;
- int top = di->rect.bottom - end;
r.left = di->rect.left;
r.right = di->rect.right;
r.bottom = di->rect.bottom - start;
- while (r.bottom > top)
- {
- r.top = max (r.bottom - di->ledW, top);
- DrawThemeBackground (di->theme, di->hdc, PP_CHUNKVERT, 0, &r, NULL);
- r.bottom = r.top;
- r.top = max (r.bottom - di->ledGap, top);
- DrawThemeBackground (di->theme, di->hdc, PP_BARVERT, 0, &di->bgRect, &r);
- r.bottom = r.top;
- }
+ r.top = di->rect.bottom - end;
+ DrawThemeBackground (di->theme, di->hdc, PP_CHUNKVERT, 0, &r, NULL);
}
/* draw themed horizontal background from 'start' to 'end' */
@@ -703,11 +697,17 @@ static LRESULT WINAPI ProgressWindowProc(HWND hwnd, UINT message,
InvalidateRect(hwnd, NULL, TRUE);
return 0;
+ case PBM_GETBARCOLOR:
+ return infoPtr->ColorBar;
+
case PBM_SETBKCOLOR:
infoPtr->ColorBk = (COLORREF)lParam;
InvalidateRect(hwnd, NULL, TRUE);
return 0;
+ case PBM_GETBKCOLOR:
+ return infoPtr->ColorBk;
+
case PBM_SETMARQUEE:
if(wParam != 0)
{
diff --git a/reactos/dll/win32/comctl32/propsheet.c b/reactos/dll/win32/comctl32/propsheet.c
index ef653406b60..6264923e8ec 100644
--- a/reactos/dll/win32/comctl32/propsheet.c
+++ b/reactos/dll/win32/comctl32/propsheet.c
@@ -904,7 +904,7 @@ static BOOL PROPSHEET_AdjustButtons(HWND hwndParent, const PropSheetInfo* psInfo
*/
hwndButton = GetDlgItem(hwndParent, IDCANCEL);
- x = rcSheet.right - ((padding.x + buttonWidth) * (num_buttons - 1));
+ x += padding.x + buttonWidth;
SetWindowPos(hwndButton, 0, x, y, 0, 0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
@@ -914,34 +914,25 @@ static BOOL PROPSHEET_AdjustButtons(HWND hwndParent, const PropSheetInfo* psInfo
*/
hwndButton = GetDlgItem(hwndParent, IDC_APPLY_BUTTON);
- if (psInfo->hasApply)
- {
- if (psInfo->hasHelp)
- x = rcSheet.right - ((padding.x + buttonWidth) * 2);
- else
- x = rcSheet.right - (padding.x + buttonWidth);
-
- SetWindowPos(hwndButton, 0, x, y, 0, 0,
- SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
-
- EnableWindow(hwndButton, FALSE);
- }
+ if(psInfo->hasApply)
+ x += padding.x + buttonWidth;
else
ShowWindow(hwndButton, SW_HIDE);
+ SetWindowPos(hwndButton, 0, x, y, 0, 0,
+ SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
+ EnableWindow(hwndButton, FALSE);
+
/*
* Position Help button.
*/
hwndButton = GetDlgItem(hwndParent, IDHELP);
- if (psInfo->hasHelp)
- {
- x = rcSheet.right - (padding.x + buttonWidth);
+ x += padding.x + buttonWidth;
+ SetWindowPos(hwndButton, 0, x, y, 0, 0,
+ SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
- SetWindowPos(hwndButton, 0, x, y, 0, 0,
- SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
- }
- else
+ if(!psInfo->hasHelp)
ShowWindow(hwndButton, SW_HIDE);
return TRUE;
@@ -1549,6 +1540,7 @@ static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo)
{
HWND hwndTabCtrl;
HWND hwndLineHeader;
+ HWND control;
LPCPROPSHEETPAGEW ppshpage;
TRACE("active_page %d, index %d\n", psInfo->active_page, index);
@@ -1569,6 +1561,10 @@ static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo)
{
PROPSHEET_SetTitleW(hwndDlg, psInfo->ppshheader.dwFlags,
psInfo->proppage[index].pszText);
+
+ control = GetNextDlgTabItem(psInfo->proppage[index].hwndPage, NULL, FALSE);
+ if(control != NULL)
+ SetFocus(control);
}
if (psInfo->active_page != -1)
@@ -1631,7 +1627,11 @@ static BOOL PROPSHEET_Back(HWND hwndDlg)
if (idx >= 0 && idx < psInfo->nPages)
{
if (PROPSHEET_CanSetCurSel(hwndDlg))
+ {
+ SetFocus(GetDlgItem(hwndDlg, IDC_BACK_BUTTON));
+ SendMessageW(hwndDlg, DM_SETDEFID, IDC_BACK_BUTTON, 0);
PROPSHEET_SetCurSel(hwndDlg, idx, -1, 0);
+ }
}
return TRUE;
}
@@ -1669,7 +1669,11 @@ static BOOL PROPSHEET_Next(HWND hwndDlg)
if (idx < psInfo->nPages )
{
if (PROPSHEET_CanSetCurSel(hwndDlg) != FALSE)
+ {
+ SetFocus(GetDlgItem(hwndDlg, IDC_NEXT_BUTTON));
+ SendMessageW(hwndDlg, DM_SETDEFID, IDC_NEXT_BUTTON, 0);
PROPSHEET_SetCurSel(hwndDlg, idx, 1, 0);
+ }
}
return TRUE;
@@ -3444,6 +3448,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* set up the Next and Back buttons by default */
PROPSHEET_SetWizButtons(hwnd, PSWIZB_BACK|PSWIZB_NEXT);
+ SetFocus(GetDlgItem(hwnd, IDC_NEXT_BUTTON));
/* Set up fonts */
SystemParametersInfoW (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
@@ -3528,7 +3533,11 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
* from which to switch to the next page */
SendMessageW(hwndTabCtrl, TCM_SETCURSEL, psInfo->active_page, 0);
- PROPSHEET_UnChanged(hwnd, (HWND)wParam);
+ PROPSHEET_UnChanged(hwnd, NULL);
+
+ /* wizards set their focus during init */
+ if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD)
+ return FALSE;
return TRUE;
}
diff --git a/reactos/dll/win32/comctl32/rebar.c b/reactos/dll/win32/comctl32/rebar.c
index 982c8445daf..e11d974e208 100644
--- a/reactos/dll/win32/comctl32/rebar.c
+++ b/reactos/dll/win32/comctl32/rebar.c
@@ -452,7 +452,7 @@ static int get_rect_cy(const REBAR_INFO *infoPtr, const RECT *lpRect)
return lpRect->bottom - lpRect->top;
}
-static int round_child_height(REBAR_BAND *lpBand, int cyHeight)
+static int round_child_height(const REBAR_BAND *lpBand, int cyHeight)
{
int cy = 0;
if (lpBand->cyIntegral == 0)
@@ -1699,11 +1699,11 @@ REBAR_CommonSetupBand(HWND hwnd, const REBARBANDINFOW *lprbbi, REBAR_BAND *lpBan
if( (lprbbi->fMask & RBBIM_CHILDSIZE) &&
( (lpBand->cxMinChild != lprbbi->cxMinChild) ||
(lpBand->cyMinChild != lprbbi->cyMinChild ) ||
- ( (lprbbi->cbSize >= sizeof (REBARBANDINFOA) && (lpBand->fStyle & RBBS_VARIABLEHEIGHT)) &&
+ ( (lprbbi->cbSize >= REBARBANDINFOA_V6_SIZE && (lpBand->fStyle & RBBS_VARIABLEHEIGHT)) &&
( (lpBand->cyChild != lprbbi->cyChild ) ||
(lpBand->cyMaxChild != lprbbi->cyMaxChild ) ||
(lpBand->cyIntegral != lprbbi->cyIntegral ) ) ) ||
- ( (lprbbi->cbSize < sizeof (REBARBANDINFOA)) &&
+ ( (lprbbi->cbSize < REBARBANDINFOA_V6_SIZE) &&
( (lpBand->cyChild ||
lpBand->cyMaxChild ||
lpBand->cyIntegral ) ) ) ) )
@@ -1711,7 +1711,7 @@ REBAR_CommonSetupBand(HWND hwnd, const REBARBANDINFOW *lprbbi, REBAR_BAND *lpBan
lpBand->cxMinChild = lprbbi->cxMinChild;
lpBand->cyMinChild = lprbbi->cyMinChild;
/* These fields where added in WIN32_IE == 0x400 and are set only for RBBS_VARIABLEHEIGHT bands */
- if (lprbbi->cbSize >= sizeof (REBARBANDINFOA) && (lpBand->fStyle & RBBS_VARIABLEHEIGHT)) {
+ if (lprbbi->cbSize >= REBARBANDINFOA_V6_SIZE && (lpBand->fStyle & RBBS_VARIABLEHEIGHT)) {
lpBand->cyMaxChild = lprbbi->cyMaxChild;
lpBand->cyIntegral = lprbbi->cyIntegral;
@@ -1747,7 +1747,7 @@ REBAR_CommonSetupBand(HWND hwnd, const REBARBANDINFOW *lprbbi, REBAR_BAND *lpBan
}
/* check for additional data */
- if (lprbbi->cbSize >= sizeof (REBARBANDINFOA)) {
+ if (lprbbi->cbSize >= REBARBANDINFOA_V6_SIZE) {
if( (lprbbi->fMask & RBBIM_IDEALSIZE) &&
( lpBand->cxIdeal != lprbbi->cxIdeal ) )
{
@@ -2167,7 +2167,7 @@ REBAR_GetBandInfoT(const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL
lprbbi->cyMinChild = lpBand->cyMinChild;
/* to make tests pass we follow Windows behaviour and allow to read these fields only
* for RBBS_VARIABLEHEIGHTS bands */
- if (lprbbi->cbSize >= sizeof (REBARBANDINFOA) && (lpBand->fStyle & RBBS_VARIABLEHEIGHT)) {
+ if (lprbbi->cbSize >= REBARBANDINFOW_V6_SIZE && (lpBand->fStyle & RBBS_VARIABLEHEIGHT)) {
lprbbi->cyChild = lpBand->cyChild;
lprbbi->cyMaxChild = lpBand->cyMaxChild;
lprbbi->cyIntegral = lpBand->cyIntegral;
@@ -2184,7 +2184,7 @@ REBAR_GetBandInfoT(const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL
lprbbi->wID = lpBand->wID;
/* check for additional data */
- if (lprbbi->cbSize >= sizeof (REBARBANDINFOA)) {
+ if (lprbbi->cbSize >= REBARBANDINFOW_V6_SIZE) {
if (lprbbi->fMask & RBBIM_IDEALSIZE)
lprbbi->cxIdeal = lpBand->cxIdeal;
@@ -2424,7 +2424,7 @@ REBAR_InsertBandT(REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnico
REBAR_CommonSetupBand(infoPtr->hwndSelf, lprbbi, lpBand);
/* Make sure the defaults for these are correct */
- if (lprbbi->cbSize < sizeof (REBARBANDINFOA) || !(lpBand->fStyle & RBBS_VARIABLEHEIGHT)) {
+ if (lprbbi->cbSize < REBARBANDINFOA_V6_SIZE || !(lpBand->fStyle & RBBS_VARIABLEHEIGHT)) {
lpBand->cyChild = lpBand->cyMinChild;
lpBand->cyMaxChild = 0x7fffffff;
lpBand->cyIntegral = 0;
diff --git a/reactos/dll/win32/comctl32/status.c b/reactos/dll/win32/comctl32/status.c
index f7d203b0065..d6b627a9790 100644
--- a/reactos/dll/win32/comctl32/status.c
+++ b/reactos/dll/win32/comctl32/status.c
@@ -333,7 +333,7 @@ STATUSBAR_Refresh (STATUS_INFO *infoPtr, HDC hdc)
static int
-STATUSBAR_InternalHitTest(const STATUS_INFO *infoPtr, const LPPOINT pt)
+STATUSBAR_InternalHitTest(const STATUS_INFO *infoPtr, const POINT *pt)
{
int i;
if (infoPtr->simple)
@@ -1016,12 +1016,17 @@ STATUSBAR_WMGetText (const STATUS_INFO *infoPtr, INT size, LPWSTR buf)
len = strlenW (infoPtr->parts[0].text);
- if (size > len) {
+ if (!size)
+ return len;
+ else if (size > len) {
strcpyW (buf, infoPtr->parts[0].text);
return len;
}
-
- return -1;
+ else {
+ memcpy (buf, infoPtr->parts[0].text, (size - 1) * sizeof(WCHAR));
+ buf[size - 1] = 0;
+ return size - 1;
+ }
}
diff --git a/reactos/dll/win32/comctl32/syslink.c b/reactos/dll/win32/comctl32/syslink.c
index 1b89bc714aa..f36177913c6 100644
--- a/reactos/dll/win32/comctl32/syslink.c
+++ b/reactos/dll/win32/comctl32/syslink.c
@@ -1329,10 +1329,8 @@ static LRESULT SYSLINK_SetFocus (SYSLINK_INFO *infoPtr)
if(Focus != NULL)
{
SYSLINK_SetFocusLink(infoPtr, Focus);
+ SYSLINK_RepaintLink(infoPtr, Focus);
}
-
- SYSLINK_RepaintLink(infoPtr, Focus);
-
return 0;
}
@@ -1476,7 +1474,7 @@ static BOOL SYSKEY_SelectNextPrevLink (const SYSLINK_INFO *infoPtr, BOOL Prev)
{
OldFocus = SYSLINK_SetFocusLink(infoPtr, NewFocus);
- if(OldFocus != NewFocus)
+ if(OldFocus && OldFocus != NewFocus)
{
SYSLINK_RepaintLink(infoPtr, OldFocus);
}
diff --git a/reactos/dll/win32/comctl32/tab.c b/reactos/dll/win32/comctl32/tab.c
index b8846979c71..94da29e37b7 100644
--- a/reactos/dll/win32/comctl32/tab.c
+++ b/reactos/dll/win32/comctl32/tab.c
@@ -1445,7 +1445,7 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
static void
-TAB_EraseTabInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect)
+TAB_EraseTabInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, const RECT *drawRect)
{
LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
HBRUSH hbr = CreateSolidBrush (comctl32_color.clrBtnFace);
@@ -2810,8 +2810,16 @@ TAB_GetItemT (TAB_INFO *infoPtr, INT iItem, LPTCITEMW tabItem, BOOL bUnicode)
TRACE("(%p,%d,%p,%s)\n", infoPtr, iItem, tabItem, bUnicode ? "true" : "false");
+ if (!tabItem) return FALSE;
+
if (iItem < 0 || iItem >= infoPtr->uNumItem)
+ {
+ /* init requested fields */
+ if (tabItem->mask & TCIF_IMAGE) tabItem->iImage = 0;
+ if (tabItem->mask & TCIF_PARAM) tabItem->lParam = 0;
+ if (tabItem->mask & TCIF_STATE) tabItem->dwState = 0;
return FALSE;
+ }
wineItem = TAB_GetItem(infoPtr, iItem);
@@ -3223,7 +3231,7 @@ TAB_SetExtendedStyle (TAB_INFO *infoPtr, DWORD exMask, DWORD exStyle)
}
static inline LRESULT
-TAB_GetExtendedStyle (TAB_INFO *infoPtr)
+TAB_GetExtendedStyle (const TAB_INFO *infoPtr)
{
return infoPtr->exStyle;
}
diff --git a/reactos/dll/win32/comctl32/toolbar.c b/reactos/dll/win32/comctl32/toolbar.c
index 06bf2399fc6..d95dc7d9a97 100644
--- a/reactos/dll/win32/comctl32/toolbar.c
+++ b/reactos/dll/win32/comctl32/toolbar.c
@@ -240,7 +240,7 @@ typedef enum
static const WCHAR themeClass[] = { 'T','o','o','l','b','a','r',0 };
static BOOL TOOLBAR_GetButtonInfo(const TOOLBAR_INFO *infoPtr, NMTOOLBARW *nmtb);
-static BOOL TOOLBAR_IsButtonRemovable(const TOOLBAR_INFO *infoPtr, int iItem, PCUSTOMBUTTON btnInfo);
+static BOOL TOOLBAR_IsButtonRemovable(const TOOLBAR_INFO *infoPtr, int iItem, const CUSTOMBUTTON *btnInfo);
static HIMAGELIST TOOLBAR_GetImageList(const PIMLENTRY *pies, INT cies, INT id);
static PIMLENTRY TOOLBAR_GetImageListEntry(const PIMLENTRY *pies, INT cies, INT id);
static VOID TOOLBAR_DeleteImageList(PIMLENTRY **pies, INT *cies);
@@ -1770,7 +1770,7 @@ TOOLBAR_LayoutToolbar(TOOLBAR_INFO *infoPtr)
static INT
-TOOLBAR_InternalHitTest (TOOLBAR_INFO *infoPtr, const POINT *lpPt)
+TOOLBAR_InternalHitTest (const TOOLBAR_INFO *infoPtr, const POINT *lpPt)
{
TBUTTON_INFO *btnPtr;
INT i;
@@ -1801,7 +1801,7 @@ TOOLBAR_InternalHitTest (TOOLBAR_INFO *infoPtr, const POINT *lpPt)
/* worker for TB_ADDBUTTONS and TB_INSERTBUTTON */
static BOOL
-TOOLBAR_InternalInsertButtonsT(TOOLBAR_INFO *infoPtr, INT iIndex, UINT nAddButtons, TBBUTTON *lpTbb, BOOL fUnicode)
+TOOLBAR_InternalInsertButtonsT(TOOLBAR_INFO *infoPtr, INT iIndex, UINT nAddButtons, const TBBUTTON *lpTbb, BOOL fUnicode)
{
INT nOldButtons, nNewButtons, iButton;
BOOL fHasString = FALSE;
@@ -2767,14 +2767,13 @@ TOOLBAR_CheckImageListIconSize(TOOLBAR_INFO *infoPtr)
*
*/
static LRESULT
-TOOLBAR_AddBitmap (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_AddBitmap (TOOLBAR_INFO *infoPtr, INT count, const TBADDBITMAP *lpAddBmp)
{
- LPTBADDBITMAP lpAddBmp = (LPTBADDBITMAP)lParam;
TBITMAP_INFO info;
INT iSumButtons, i;
HIMAGELIST himlDef;
- TRACE("hwnd=%p wParam=%lx lParam=%lx\n", infoPtr->hwndSelf, wParam, lParam);
+ TRACE("hwnd=%p count=%d lpAddBmp=%p\n", infoPtr->hwndSelf, count, lpAddBmp);
if (!lpAddBmp)
return -1;
@@ -2829,7 +2828,7 @@ TOOLBAR_AddBitmap (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
}
else
{
- info.nButtons = (INT)wParam;
+ info.nButtons = count;
info.hInst = lpAddBmp->hInst;
info.nID = lpAddBmp->nID;
TRACE("adding %d bitmaps!\n", info.nButtons);
@@ -2878,25 +2877,22 @@ TOOLBAR_AddBitmap (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_AddButtonsT(TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL fUnicode)
+TOOLBAR_AddButtonsT(TOOLBAR_INFO *infoPtr, INT nAddButtons, const TBBUTTON* lpTbb, BOOL fUnicode)
{
- LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
- INT nAddButtons = (UINT)wParam;
-
- TRACE("adding %ld buttons (unicode=%d)!\n", wParam, fUnicode);
+ TRACE("adding %d buttons (unicode=%d)!\n", nAddButtons, fUnicode);
return TOOLBAR_InternalInsertButtonsT(infoPtr, -1, nAddButtons, lpTbb, fUnicode);
}
static LRESULT
-TOOLBAR_AddStringW (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_AddStringW (TOOLBAR_INFO *infoPtr, HINSTANCE hInstance, LPARAM lParam)
{
#define MAX_RESOURCE_STRING_LENGTH 512
BOOL fFirstString = (infoPtr->nNumStrings == 0);
INT nIndex = infoPtr->nNumStrings;
- if ((wParam) && (HIWORD(lParam) == 0)) {
+ if (hInstance && (HIWORD(lParam) == 0)) {
WCHAR szString[MAX_RESOURCE_STRING_LENGTH];
WCHAR delimiter;
WCHAR *next_delim;
@@ -2904,7 +2900,7 @@ TOOLBAR_AddStringW (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
INT len;
TRACE("adding string from resource!\n");
- len = LoadStringW ((HINSTANCE)wParam, (UINT)lParam,
+ len = LoadStringW (hInstance, (UINT)lParam,
szString, MAX_RESOURCE_STRING_LENGTH);
TRACE("len=%d %s\n", len, debugstr_w(szString));
@@ -2957,15 +2953,15 @@ TOOLBAR_AddStringW (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_AddStringA (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_AddStringA (TOOLBAR_INFO *infoPtr, HINSTANCE hInstance, LPARAM lParam)
{
BOOL fFirstString = (infoPtr->nNumStrings == 0);
LPSTR p;
INT nIndex;
INT len;
- if ((wParam) && (HIWORD(lParam) == 0)) /* load from resources */
- return TOOLBAR_AddStringW(infoPtr, wParam, lParam);
+ if (hInstance && (HIWORD(lParam) == 0)) /* load from resources */
+ return TOOLBAR_AddStringW(infoPtr, hInstance, lParam);
p = (LPSTR)lParam;
if (p == NULL)
@@ -3058,36 +3054,36 @@ TOOLBAR_AutoSize (TOOLBAR_INFO *infoPtr)
}
-static LRESULT
+static inline LRESULT
TOOLBAR_ButtonCount (const TOOLBAR_INFO *infoPtr)
{
return infoPtr->nNumButtons;
}
-static LRESULT
-TOOLBAR_ButtonStructSize (TOOLBAR_INFO *infoPtr, WPARAM wParam)
+static inline LRESULT
+TOOLBAR_ButtonStructSize (TOOLBAR_INFO *infoPtr, DWORD Size)
{
- infoPtr->dwStructSize = (DWORD)wParam;
+ infoPtr->dwStructSize = Size;
return 0;
}
static LRESULT
-TOOLBAR_ChangeBitmap (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_ChangeBitmap (TOOLBAR_INFO *infoPtr, INT Id, INT Index)
{
TBUTTON_INFO *btnPtr;
INT nIndex;
- TRACE("button %ld, iBitmap now %d\n", wParam, LOWORD(lParam));
+ TRACE("button %d, iBitmap now %d\n", Id, Index);
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return FALSE;
btnPtr = &infoPtr->buttons[nIndex];
- btnPtr->iBitmap = LOWORD(lParam);
+ btnPtr->iBitmap = Index;
/* we HAVE to erase the background, the new bitmap could be */
/* transparent */
@@ -3098,14 +3094,14 @@ TOOLBAR_ChangeBitmap (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_CheckButton (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_CheckButton (TOOLBAR_INFO *infoPtr, INT Id, LPARAM lParam)
{
TBUTTON_INFO *btnPtr;
INT nIndex;
INT nOldIndex = -1;
BOOL bChecked = FALSE;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
TRACE("hwnd=%p, btn index=%d, lParam=0x%08lx\n", infoPtr->hwndSelf, nIndex, lParam);
@@ -3144,9 +3140,9 @@ TOOLBAR_CheckButton (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_CommandToIndex (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_CommandToIndex (const TOOLBAR_INFO *infoPtr, INT Id)
{
- return TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ return TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
}
@@ -3185,9 +3181,8 @@ TOOLBAR_Customize (TOOLBAR_INFO *infoPtr)
static LRESULT
-TOOLBAR_DeleteButton (TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_DeleteButton (TOOLBAR_INFO *infoPtr, INT nIndex)
{
- INT nIndex = (INT)wParam;
NMTOOLBARW nmtb;
TBUTTON_INFO *btnPtr = &infoPtr->buttons[nIndex];
@@ -3240,15 +3235,15 @@ TOOLBAR_DeleteButton (TOOLBAR_INFO *infoPtr, WPARAM wParam)
static LRESULT
-TOOLBAR_EnableButton (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_EnableButton (TOOLBAR_INFO *infoPtr, INT Id, LPARAM lParam)
{
TBUTTON_INFO *btnPtr;
INT nIndex;
DWORD bState;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
- TRACE("hwnd=%p, btn index=%ld, lParam=0x%08lx\n", infoPtr->hwndSelf, wParam, lParam);
+ TRACE("hwnd=%p, btn id=%d, lParam=0x%08lx\n", infoPtr->hwndSelf, Id, lParam);
if (nIndex == -1)
return FALSE;
@@ -3280,11 +3275,11 @@ TOOLBAR_GetAnchorHighlight (const TOOLBAR_INFO *infoPtr)
static LRESULT
-TOOLBAR_GetBitmap (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_GetBitmap (const TOOLBAR_INFO *infoPtr, INT Id)
{
INT nIndex;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return -1;
@@ -3300,10 +3295,8 @@ TOOLBAR_GetBitmapFlags (void)
static LRESULT
-TOOLBAR_GetButton (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_GetButton (const TOOLBAR_INFO *infoPtr, INT nIndex, TBBUTTON *lpTbb)
{
- LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
- INT nIndex = (INT)wParam;
TBUTTON_INFO *btnPtr;
if (lpTbb == NULL)
@@ -3327,10 +3320,9 @@ TOOLBAR_GetButton (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_GetButtonInfoT(const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnicode)
+TOOLBAR_GetButtonInfoT(const TOOLBAR_INFO *infoPtr, INT Id, LPTBBUTTONINFOW lpTbInfo, BOOL bUnicode)
{
/* TBBUTTONINFOW and TBBUTTONINFOA have the same layout*/
- LPTBBUTTONINFOW lpTbInfo = (LPTBBUTTONINFOW)lParam;
TBUTTON_INFO *btnPtr;
INT nIndex;
@@ -3347,8 +3339,7 @@ TOOLBAR_GetButtonInfoT(const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam
return -1;
}
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam,
- lpTbInfo->dwMask & 0x80000000);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, lpTbInfo->dwMask & TBIF_BYINDEX);
if (nIndex == -1)
return -1;
@@ -3386,7 +3377,7 @@ TOOLBAR_GetButtonInfoT(const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam
}
-static LRESULT
+static inline LRESULT
TOOLBAR_GetButtonSize (const TOOLBAR_INFO *infoPtr)
{
return MAKELONG((WORD)infoPtr->nButtonWidth,
@@ -3395,30 +3386,30 @@ TOOLBAR_GetButtonSize (const TOOLBAR_INFO *infoPtr)
static LRESULT
-TOOLBAR_GetButtonTextA (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_GetButtonTextA (const TOOLBAR_INFO *infoPtr, INT Id, LPSTR lpText)
{
INT nIndex;
- LPWSTR lpText;
+ LPWSTR lpTextW;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return -1;
- lpText = TOOLBAR_GetText(infoPtr,&infoPtr->buttons[nIndex]);
+ lpTextW = TOOLBAR_GetText(infoPtr,&infoPtr->buttons[nIndex]);
- return WideCharToMultiByte( CP_ACP, 0, lpText, -1,
- (LPSTR)lParam, lParam ? 0x7fffffff : 0, NULL, NULL ) - 1;
+ return WideCharToMultiByte( CP_ACP, 0, lpTextW, -1,
+ lpText, lpText ? 0x7fffffff : 0, NULL, NULL ) - 1;
}
static LRESULT
-TOOLBAR_GetButtonTextW (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_GetButtonTextW (const TOOLBAR_INFO *infoPtr, INT Id, LPWSTR lpStr)
{
INT nIndex;
LPWSTR lpText;
LRESULT ret = 0;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return -1;
@@ -3428,8 +3419,8 @@ TOOLBAR_GetButtonTextW (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lPara
{
ret = strlenW (lpText);
- if (lParam)
- strcpyW ((LPWSTR)lParam, lpText);
+ if (lpStr)
+ strcpyW (lpStr, lpText);
}
return ret;
@@ -3437,9 +3428,9 @@ TOOLBAR_GetButtonTextW (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lPara
static LRESULT
-TOOLBAR_GetDisabledImageList (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_GetDisabledImageList (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
{
- TRACE("hwnd=%p, wParam=%ld, lParam=0x%lx\n", infoPtr->hwndSelf, wParam, lParam);
+ TRACE("hwnd=%p, wParam=%ld\n", infoPtr->hwndSelf, wParam);
/* UNDOCUMENTED: wParam is actually the ID of the image list to return */
return (LRESULT)GETDISIMAGELIST(infoPtr, wParam);
}
@@ -3455,9 +3446,9 @@ TOOLBAR_GetExtendedStyle (const TOOLBAR_INFO *infoPtr)
static LRESULT
-TOOLBAR_GetHotImageList (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_GetHotImageList (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
{
- TRACE("hwnd=%p, wParam=%ld, lParam=0x%lx\n", infoPtr->hwndSelf, wParam, lParam);
+ TRACE("hwnd=%p, wParam=%ld\n", infoPtr->hwndSelf, wParam);
/* UNDOCUMENTED: wParam is actually the ID of the image list to return */
return (LRESULT)GETHOTIMAGELIST(infoPtr, wParam);
}
@@ -3477,19 +3468,17 @@ TOOLBAR_GetHotItem (const TOOLBAR_INFO *infoPtr)
static LRESULT
-TOOLBAR_GetDefImageList (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_GetDefImageList (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
{
- TRACE("hwnd=%p, wParam=%ld, lParam=0x%lx\n", infoPtr->hwndSelf, wParam, lParam);
+ TRACE("hwnd=%p, wParam=%ld\n", infoPtr->hwndSelf, wParam);
/* UNDOCUMENTED: wParam is actually the ID of the image list to return */
return (LRESULT) GETDEFIMAGELIST(infoPtr, wParam);
}
static LRESULT
-TOOLBAR_GetInsertMark (const TOOLBAR_INFO *infoPtr, LPARAM lParam)
+TOOLBAR_GetInsertMark (const TOOLBAR_INFO *infoPtr, TBINSERTMARK *lptbim)
{
- TBINSERTMARK *lptbim = (TBINSERTMARK*)lParam;
-
TRACE("hwnd = %p, lptbim = %p\n", infoPtr->hwndSelf, lptbim);
*lptbim = infoPtr->tbim;
@@ -3498,7 +3487,7 @@ TOOLBAR_GetInsertMark (const TOOLBAR_INFO *infoPtr, LPARAM lParam)
}
-static LRESULT
+static inline LRESULT
TOOLBAR_GetInsertMarkColor (const TOOLBAR_INFO *infoPtr)
{
TRACE("hwnd = %p\n", infoPtr->hwndSelf);
@@ -3508,17 +3497,14 @@ TOOLBAR_GetInsertMarkColor (const TOOLBAR_INFO *infoPtr)
static LRESULT
-TOOLBAR_GetItemRect (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_GetItemRect (const TOOLBAR_INFO *infoPtr, INT nIndex, LPRECT lpRect)
{
TBUTTON_INFO *btnPtr;
- LPRECT lpRect;
- INT nIndex;
- nIndex = (INT)wParam;
btnPtr = &infoPtr->buttons[nIndex];
if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
return FALSE;
- lpRect = (LPRECT)lParam;
+
if (lpRect == NULL)
return FALSE;
if (btnPtr->fsState & TBSTATE_HIDDEN)
@@ -3534,10 +3520,8 @@ TOOLBAR_GetItemRect (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_GetMaxSize (const TOOLBAR_INFO *infoPtr, LPARAM lParam)
+TOOLBAR_GetMaxSize (const TOOLBAR_INFO *infoPtr, LPSIZE lpSize)
{
- LPSIZE lpSize = (LPSIZE)lParam;
-
if (lpSize == NULL)
return FALSE;
@@ -3555,28 +3539,24 @@ TOOLBAR_GetMaxSize (const TOOLBAR_INFO *infoPtr, LPARAM lParam)
/* << TOOLBAR_GetObject >> */
-static LRESULT
+static inline LRESULT
TOOLBAR_GetPadding (const TOOLBAR_INFO *infoPtr)
{
- DWORD oldPad;
-
- oldPad = MAKELONG(infoPtr->szPadding.cx, infoPtr->szPadding.cy);
- return (LRESULT) oldPad;
+ return MAKELONG(infoPtr->szPadding.cx, infoPtr->szPadding.cy);
}
static LRESULT
-TOOLBAR_GetRect (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_GetRect (const TOOLBAR_INFO *infoPtr, INT Id, LPRECT lpRect)
{
TBUTTON_INFO *btnPtr;
- LPRECT lpRect;
INT nIndex;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
btnPtr = &infoPtr->buttons[nIndex];
if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
return FALSE;
- lpRect = (LPRECT)lParam;
+
if (lpRect == NULL)
return FALSE;
@@ -3589,7 +3569,7 @@ TOOLBAR_GetRect (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
}
-static LRESULT
+static inline LRESULT
TOOLBAR_GetRows (const TOOLBAR_INFO *infoPtr)
{
return infoPtr->nRows;
@@ -3597,11 +3577,11 @@ TOOLBAR_GetRows (const TOOLBAR_INFO *infoPtr)
static LRESULT
-TOOLBAR_GetState (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_GetState (const TOOLBAR_INFO *infoPtr, INT Id)
{
INT nIndex;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return -1;
@@ -3609,14 +3589,14 @@ TOOLBAR_GetState (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
}
-static LRESULT
+static inline LRESULT
TOOLBAR_GetStyle (const TOOLBAR_INFO *infoPtr)
{
return infoPtr->dwStyle;
}
-static LRESULT
+static inline LRESULT
TOOLBAR_GetTextRows (const TOOLBAR_INFO *infoPtr)
{
return infoPtr->nMaxTextRows;
@@ -3650,55 +3630,60 @@ TOOLBAR_GetVersion (const TOOLBAR_INFO *infoPtr)
static LRESULT
-TOOLBAR_HideButton (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_HideButton (TOOLBAR_INFO *infoPtr, INT Id, BOOL fHide)
{
TBUTTON_INFO *btnPtr;
+ BYTE oldState;
INT nIndex;
TRACE("\n");
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return FALSE;
btnPtr = &infoPtr->buttons[nIndex];
- if (LOWORD(lParam) == FALSE)
- btnPtr->fsState &= ~TBSTATE_HIDDEN;
- else
+ oldState = btnPtr->fsState;
+
+ if (fHide)
btnPtr->fsState |= TBSTATE_HIDDEN;
+ else
+ btnPtr->fsState &= ~TBSTATE_HIDDEN;
- TOOLBAR_LayoutToolbar (infoPtr);
-
- InvalidateRect (infoPtr->hwndSelf, NULL, TRUE);
+ if (oldState != btnPtr->fsState) {
+ TOOLBAR_LayoutToolbar (infoPtr);
+ InvalidateRect (infoPtr->hwndSelf, NULL, TRUE);
+ }
return TRUE;
}
static inline LRESULT
-TOOLBAR_HitTest (TOOLBAR_INFO *infoPtr, LPARAM lParam)
+TOOLBAR_HitTest (const TOOLBAR_INFO *infoPtr, const POINT* lpPt)
{
- return TOOLBAR_InternalHitTest (infoPtr, (LPPOINT)lParam);
+ return TOOLBAR_InternalHitTest (infoPtr, lpPt);
}
static LRESULT
-TOOLBAR_Indeterminate (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_Indeterminate (const TOOLBAR_INFO *infoPtr, INT Id, BOOL fIndeterminate)
{
TBUTTON_INFO *btnPtr;
INT nIndex;
DWORD oldState;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return FALSE;
btnPtr = &infoPtr->buttons[nIndex];
oldState = btnPtr->fsState;
- if (LOWORD(lParam) == FALSE)
- btnPtr->fsState &= ~TBSTATE_INDETERMINATE;
- else
+
+ if (fIndeterminate)
btnPtr->fsState |= TBSTATE_INDETERMINATE;
+ else
+ btnPtr->fsState &= ~TBSTATE_INDETERMINATE;
if(oldState != btnPtr->fsState)
InvalidateRect(infoPtr->hwndSelf, &btnPtr->rect, TRUE);
@@ -3708,11 +3693,8 @@ TOOLBAR_Indeterminate (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam
static LRESULT
-TOOLBAR_InsertButtonT(TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL fUnicode)
+TOOLBAR_InsertButtonT(TOOLBAR_INFO *infoPtr, INT nIndex, const TBBUTTON *lpTbb, BOOL fUnicode)
{
- LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
- INT nIndex = (INT)wParam;
-
if (lpTbb == NULL)
return FALSE;
@@ -3741,11 +3723,11 @@ TOOLBAR_InsertButtonT(TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL
static LRESULT
-TOOLBAR_IsButtonChecked (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_IsButtonChecked (const TOOLBAR_INFO *infoPtr, INT Id)
{
INT nIndex;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return -1;
@@ -3754,11 +3736,11 @@ TOOLBAR_IsButtonChecked (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
static LRESULT
-TOOLBAR_IsButtonEnabled (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_IsButtonEnabled (const TOOLBAR_INFO *infoPtr, INT Id)
{
INT nIndex;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return -1;
@@ -3767,11 +3749,11 @@ TOOLBAR_IsButtonEnabled (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
static LRESULT
-TOOLBAR_IsButtonHidden (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_IsButtonHidden (const TOOLBAR_INFO *infoPtr, INT Id)
{
INT nIndex;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return -1;
@@ -3780,11 +3762,11 @@ TOOLBAR_IsButtonHidden (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
static LRESULT
-TOOLBAR_IsButtonHighlighted (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_IsButtonHighlighted (const TOOLBAR_INFO *infoPtr, INT Id)
{
INT nIndex;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return -1;
@@ -3793,11 +3775,11 @@ TOOLBAR_IsButtonHighlighted (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
static LRESULT
-TOOLBAR_IsButtonIndeterminate (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_IsButtonIndeterminate (const TOOLBAR_INFO *infoPtr, INT Id)
{
INT nIndex;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return -1;
@@ -3806,11 +3788,11 @@ TOOLBAR_IsButtonIndeterminate (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
static LRESULT
-TOOLBAR_IsButtonPressed (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_IsButtonPressed (const TOOLBAR_INFO *infoPtr, INT Id)
{
INT nIndex;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return -1;
@@ -3819,23 +3801,21 @@ TOOLBAR_IsButtonPressed (const TOOLBAR_INFO *infoPtr, WPARAM wParam)
static LRESULT
-TOOLBAR_LoadImages (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_LoadImages (TOOLBAR_INFO *infoPtr, WPARAM wParam, HINSTANCE hInstance)
{
TBADDBITMAP tbab;
- tbab.hInst = (HINSTANCE)lParam;
+ tbab.hInst = hInstance;
tbab.nID = wParam;
TRACE("hwnd = %p, hInst = %p, nID = %lu\n", infoPtr->hwndSelf, tbab.hInst, tbab.nID);
- return TOOLBAR_AddBitmap(infoPtr, 0, (LPARAM)&tbab);
+ return TOOLBAR_AddBitmap(infoPtr, 0, &tbab);
}
static LRESULT
-TOOLBAR_MapAccelerator (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_MapAccelerator (const TOOLBAR_INFO *infoPtr, WCHAR wAccel, UINT *pIDButton)
{
- WCHAR wAccel = (WCHAR)wParam;
- UINT* pIDButton = (UINT*)lParam;
WCHAR wszAccel[] = {'&',wAccel,0};
int i;
@@ -3875,22 +3855,22 @@ TOOLBAR_MapAccelerator (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lPara
static LRESULT
-TOOLBAR_MarkButton (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_MarkButton (const TOOLBAR_INFO *infoPtr, INT Id, BOOL fMark)
{
INT nIndex;
DWORD oldState;
TBUTTON_INFO *btnPtr;
- TRACE("hwnd = %p, wParam = %ld, lParam = 0x%08lx\n", infoPtr->hwndSelf, wParam, lParam);
+ TRACE("hwnd = %p, Id = %d, fMark = 0%d\n", infoPtr->hwndSelf, Id, fMark);
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return FALSE;
btnPtr = &infoPtr->buttons[nIndex];
oldState = btnPtr->fsState;
- if (LOWORD(lParam))
+ if (fMark)
btnPtr->fsState |= TBSTATE_MARKED;
else
btnPtr->fsState &= ~TBSTATE_MARKED;
@@ -3923,16 +3903,15 @@ static inline void TOOLBAR_MoveFixupIndex(INT* pIndex, INT nIndex, INT nMoveInde
static LRESULT
-TOOLBAR_MoveButton (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_MoveButton (TOOLBAR_INFO *infoPtr, INT Id, INT nMoveIndex)
{
INT nIndex;
INT nCount;
- INT nMoveIndex = (INT)lParam;
TBUTTON_INFO button;
- TRACE("hwnd=%p, wParam=%ld, lParam=%ld\n", infoPtr->hwndSelf, wParam, lParam);
+ TRACE("hwnd=%p, Id=%d, nMoveIndex=%d\n", infoPtr->hwndSelf, Id, nMoveIndex);
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, TRUE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, TRUE);
if ((nIndex == -1) || (nMoveIndex < 0))
return FALSE;
@@ -3974,22 +3953,23 @@ TOOLBAR_MoveButton (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_PressButton (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_PressButton (const TOOLBAR_INFO *infoPtr, INT Id, BOOL fPress)
{
TBUTTON_INFO *btnPtr;
INT nIndex;
DWORD oldState;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return FALSE;
btnPtr = &infoPtr->buttons[nIndex];
oldState = btnPtr->fsState;
- if (LOWORD(lParam) == FALSE)
- btnPtr->fsState &= ~TBSTATE_PRESSED;
- else
+
+ if (fPress)
btnPtr->fsState |= TBSTATE_PRESSED;
+ else
+ btnPtr->fsState &= ~TBSTATE_PRESSED;
if(oldState != btnPtr->fsState)
InvalidateRect(infoPtr->hwndSelf, &btnPtr->rect, TRUE);
@@ -4000,9 +3980,8 @@ TOOLBAR_PressButton (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
/* FIXME: there might still be some confusion her between number of buttons
* and number of bitmaps */
static LRESULT
-TOOLBAR_ReplaceBitmap (TOOLBAR_INFO *infoPtr, LPARAM lParam)
+TOOLBAR_ReplaceBitmap (TOOLBAR_INFO *infoPtr, const TBREPLACEBITMAP *lpReplace)
{
- LPTBREPLACEBITMAP lpReplace = (LPTBREPLACEBITMAP) lParam;
HBITMAP hBitmap;
int i = 0, nOldButtons = 0, pos = 0;
int nOldBitmaps, nNewBitmaps = 0;
@@ -4182,7 +4161,7 @@ TOOLBAR_Restore(TOOLBAR_INFO *infoPtr, const TBSAVEPARAMSW *lpSave)
if (HIWORD(nmtbr.tbButton.iString))
nmtbr.tbButton.iString = 0;
- TOOLBAR_InsertButtonT(infoPtr, -1, (LPARAM)&nmtbr.tbButton, TRUE);
+ TOOLBAR_InsertButtonT(infoPtr, -1, &nmtbr.tbButton, TRUE);
}
/* do legacy notifications */
@@ -4257,13 +4236,13 @@ exit:
static LRESULT
-TOOLBAR_SetAnchorHighlight (TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_SetAnchorHighlight (TOOLBAR_INFO *infoPtr, BOOL bAnchor)
{
BOOL bOldAnchor = infoPtr->bAnchor;
- TRACE("hwnd=%p, bAnchor = %s\n", infoPtr->hwndSelf, wParam ? "TRUE" : "FALSE");
+ TRACE("hwnd=%p, bAnchor = %s\n", infoPtr->hwndSelf, bAnchor ? "TRUE" : "FALSE");
- infoPtr->bAnchor = (BOOL)wParam;
+ infoPtr->bAnchor = bAnchor;
/* Native does not remove the hot effect from an already hot button */
@@ -4322,9 +4301,8 @@ TOOLBAR_SetBitmapSize (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_SetButtonInfoA (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_SetButtonInfoA (TOOLBAR_INFO *infoPtr, INT Id, const TBBUTTONINFOA *lptbbi)
{
- LPTBBUTTONINFOA lptbbi = (LPTBBUTTONINFOA)lParam;
TBUTTON_INFO *btnPtr;
INT nIndex;
RECT oldBtnRect;
@@ -4334,8 +4312,7 @@ TOOLBAR_SetButtonInfoA (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
if (lptbbi->cbSize < sizeof(TBBUTTONINFOA))
return FALSE;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam,
- lptbbi->dwMask & 0x80000000);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, lptbbi->dwMask & TBIF_BYINDEX);
if (nIndex == -1)
return FALSE;
@@ -4375,9 +4352,8 @@ TOOLBAR_SetButtonInfoA (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_SetButtonInfoW (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_SetButtonInfoW (TOOLBAR_INFO *infoPtr, INT Id, const TBBUTTONINFOW *lptbbi)
{
- LPTBBUTTONINFOW lptbbi = (LPTBBUTTONINFOW)lParam;
TBUTTON_INFO *btnPtr;
INT nIndex;
RECT oldBtnRect;
@@ -4387,8 +4363,7 @@ TOOLBAR_SetButtonInfoW (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
if (lptbbi->cbSize < sizeof(TBBUTTONINFOW))
return FALSE;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam,
- lptbbi->dwMask & 0x80000000);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, lptbbi->dwMask & TBIF_BYINDEX);
if (nIndex == -1)
return FALSE;
@@ -4495,14 +4470,12 @@ TOOLBAR_SetButtonWidth (TOOLBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-TOOLBAR_SetCmdId (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_SetCmdId (TOOLBAR_INFO *infoPtr, INT nIndex, INT nId)
{
- INT nIndex = (INT)wParam;
-
if ((nIndex < 0) || (nIndex >= infoPtr->nNumButtons))
return FALSE;
- infoPtr->buttons[nIndex].idCommand = (INT)lParam;
+ infoPtr->buttons[nIndex].idCommand = nId;
if (infoPtr->hwndToolTip) {
@@ -4515,9 +4488,8 @@ TOOLBAR_SetCmdId (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_SetDisabledImageList (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_SetDisabledImageList (TOOLBAR_INFO *infoPtr, WPARAM wParam, HIMAGELIST himl)
{
- HIMAGELIST himl = (HIMAGELIST)lParam;
HIMAGELIST himlTemp;
INT id = 0;
@@ -4580,10 +4552,9 @@ TOOLBAR_SetExtendedStyle (TOOLBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-TOOLBAR_SetHotImageList (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_SetHotImageList (TOOLBAR_INFO *infoPtr, WPARAM wParam, HIMAGELIST himl)
{
HIMAGELIST himlTemp;
- HIMAGELIST himl = (HIMAGELIST)lParam;
INT id = 0;
if (infoPtr->iVersion >= 5)
@@ -4658,22 +4629,22 @@ TOOLBAR_SetHotItemEx (TOOLBAR_INFO *infoPtr, INT nHit, DWORD dwReason)
}
static LRESULT
-TOOLBAR_SetHotItem (TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_SetHotItem (TOOLBAR_INFO *infoPtr, INT nHotItem)
{
INT nOldHotItem = infoPtr->nHotItem;
- TRACE("hwnd = %p, nHit = %d\n", infoPtr->hwndSelf, (INT)wParam);
+ TRACE("hwnd = %p, nHotItem = %d\n", infoPtr->hwndSelf, nHotItem);
- if ((INT)wParam >= infoPtr->nNumButtons)
+ if (nHotItem >= infoPtr->nNumButtons)
return infoPtr->nHotItem;
- if ((INT)wParam < 0)
- wParam = -1;
+ if (nHotItem < 0)
+ nHotItem = -1;
/* NOTE: an application can still remove the hot item even if anchor
* highlighting is enabled */
- TOOLBAR_SetHotItemEx(infoPtr, wParam, HICF_OTHER);
+ TOOLBAR_SetHotItemEx(infoPtr, nHotItem, HICF_OTHER);
if (nOldHotItem < 0)
return -1;
@@ -4683,10 +4654,9 @@ TOOLBAR_SetHotItem (TOOLBAR_INFO *infoPtr, WPARAM wParam)
static LRESULT
-TOOLBAR_SetImageList (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_SetImageList (TOOLBAR_INFO *infoPtr, WPARAM wParam, HIMAGELIST himl)
{
HIMAGELIST himlTemp;
- HIMAGELIST himl = (HIMAGELIST)lParam;
INT oldButtonWidth = infoPtr->nButtonWidth;
INT oldBitmapWidth = infoPtr->nBitmapWidth;
INT oldBitmapHeight = infoPtr->nBitmapHeight;
@@ -4726,16 +4696,16 @@ TOOLBAR_SetImageList (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_SetIndent (TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_SetIndent (TOOLBAR_INFO *infoPtr, INT nIndent)
{
- infoPtr->nIndent = (INT)wParam;
+ infoPtr->nIndent = nIndent;
TRACE("\n");
/* process only on indent changing */
- if(infoPtr->nIndent != (INT)wParam)
+ if(infoPtr->nIndent != nIndent)
{
- infoPtr->nIndent = (INT)wParam;
+ infoPtr->nIndent = nIndent;
TOOLBAR_CalcToolbar (infoPtr);
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
}
@@ -4745,10 +4715,8 @@ TOOLBAR_SetIndent (TOOLBAR_INFO *infoPtr, WPARAM wParam)
static LRESULT
-TOOLBAR_SetInsertMark (TOOLBAR_INFO *infoPtr, LPARAM lParam)
+TOOLBAR_SetInsertMark (TOOLBAR_INFO *infoPtr, const TBINSERTMARK *lptbim)
{
- TBINSERTMARK *lptbim = (TBINSERTMARK*)lParam;
-
TRACE("hwnd = %p, lptbim = { %d, 0x%08x}\n", infoPtr->hwndSelf, lptbim->iButton, lptbim->dwFlags);
if ((lptbim->dwFlags & ~TBIMHT_AFTER) != 0)
@@ -4773,9 +4741,9 @@ TOOLBAR_SetInsertMark (TOOLBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-TOOLBAR_SetInsertMarkColor (TOOLBAR_INFO *infoPtr, LPARAM lParam)
+TOOLBAR_SetInsertMarkColor (TOOLBAR_INFO *infoPtr, COLORREF clr)
{
- infoPtr->clrInsertMark = (COLORREF)lParam;
+ infoPtr->clrInsertMark = clr;
/* FIXME: don't need to update entire toolbar */
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
@@ -4785,9 +4753,9 @@ TOOLBAR_SetInsertMarkColor (TOOLBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-TOOLBAR_SetMaxTextRows (TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_SetMaxTextRows (TOOLBAR_INFO *infoPtr, INT nMaxRows)
{
- infoPtr->nMaxTextRows = (INT)wParam;
+ infoPtr->nMaxTextRows = nMaxRows;
TOOLBAR_CalcToolbar(infoPtr);
return TRUE;
@@ -4820,23 +4788,22 @@ TOOLBAR_SetPadding (TOOLBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-TOOLBAR_SetParent (TOOLBAR_INFO *infoPtr, WPARAM wParam)
+TOOLBAR_SetParent (TOOLBAR_INFO *infoPtr, HWND hParent)
{
HWND hwndOldNotify;
TRACE("\n");
hwndOldNotify = infoPtr->hwndNotify;
- infoPtr->hwndNotify = (HWND)wParam;
+ infoPtr->hwndNotify = hParent;
return (LRESULT)hwndOldNotify;
}
static LRESULT
-TOOLBAR_SetRows (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_SetRows (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPRECT lprc)
{
- LPRECT lprc = (LPRECT)lParam;
int rows = LOWORD(wParam);
BOOL bLarger = HIWORD(wParam);
@@ -4882,7 +4849,7 @@ TOOLBAR_SetRows (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
if (seps) FIXME("Separators unhandled\n");
/* Round up so more per line, i.e., less rows */
- idealWrap = (infoPtr->nNumButtons - hidden + (rows-1)) / rows;
+ idealWrap = (infoPtr->nNumButtons - hidden + (rows-1)) / (rows ? rows : 1);
/* Calculate ideal wrap point if we are allowed to grow, but cannot
achieve the requested number of rows. */
@@ -4955,12 +4922,12 @@ TOOLBAR_SetRows (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_SetState (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_SetState (TOOLBAR_INFO *infoPtr, INT Id, LPARAM lParam)
{
TBUTTON_INFO *btnPtr;
INT nIndex;
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+ nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
if (nIndex == -1)
return FALSE;
@@ -4995,11 +4962,11 @@ TOOLBAR_SetStyle (TOOLBAR_INFO *infoPtr, LPARAM lParam)
static inline LRESULT
-TOOLBAR_SetToolTips (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_SetToolTips (TOOLBAR_INFO *infoPtr, HWND hwndTooltip)
{
- TRACE("hwnd=%p, hwndTooltip=%p, lParam=0x%lx\n", infoPtr->hwndSelf, (HWND)wParam, lParam);
+ TRACE("hwnd=%p, hwndTooltip=%p\n", infoPtr->hwndSelf, hwndTooltip);
- infoPtr->hwndToolTip = (HWND)wParam;
+ infoPtr->hwndToolTip = hwndTooltip;
return 0;
}
@@ -5060,11 +5027,10 @@ TOOLBAR_SetVersion (TOOLBAR_INFO *infoPtr, INT iVersion)
static LRESULT
-TOOLBAR_GetStringA (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_GetStringA (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPSTR str)
{
WORD iString = HIWORD(wParam);
WORD buffersize = LOWORD(wParam);
- LPSTR str = (LPSTR)lParam;
LRESULT ret = -1;
TRACE("hwnd=%p, iString=%d, buffersize=%d, string=%p\n", infoPtr->hwndSelf, iString, buffersize, str);
@@ -5084,11 +5050,10 @@ TOOLBAR_GetStringA (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_GetStringW (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_GetStringW (const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPWSTR str)
{
WORD iString = HIWORD(wParam);
WORD len = LOWORD(wParam)/sizeof(WCHAR) - 1;
- LPWSTR str = (LPWSTR)lParam;
LRESULT ret = -1;
TRACE("hwnd=%p, iString=%d, buffersize=%d, string=%p\n", infoPtr->hwndSelf, iString, LOWORD(wParam), str);
@@ -5126,20 +5091,20 @@ static LRESULT TOOLBAR_Unkwn45D(HWND hwnd, WPARAM wParam, LPARAM lParam)
* caller to specify a reason why the hot item changed (rather than just the
* HICF_OTHER that TB_SETHOTITEM sends). */
static LRESULT
-TOOLBAR_SetHotItem2 (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_SetHotItem2 (TOOLBAR_INFO *infoPtr, INT nHotItem, LPARAM lParam)
{
INT nOldHotItem = infoPtr->nHotItem;
TRACE("old item=%d, new item=%d, flags=%08x\n",
- nOldHotItem, infoPtr->nHotItem, (DWORD)lParam);
+ nOldHotItem, nHotItem, (DWORD)lParam);
- if ((INT) wParam < 0 || (INT)wParam > infoPtr->nNumButtons)
- wParam = -1;
+ if (nHotItem < 0 || nHotItem > infoPtr->nNumButtons)
+ nHotItem = -1;
/* NOTE: an application can still remove the hot item even if anchor
* highlighting is enabled */
- TOOLBAR_SetHotItemEx(infoPtr, wParam, lParam);
+ TOOLBAR_SetHotItemEx(infoPtr, nHotItem, lParam);
GetFocus();
@@ -5149,11 +5114,11 @@ TOOLBAR_SetHotItem2 (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
/* Sets the toolbar global iListGap parameter which controls the amount of
* spacing between the image and the text of buttons for TBSTYLE_LIST
* toolbars. */
-static LRESULT TOOLBAR_SetListGap(TOOLBAR_INFO *infoPtr, WPARAM wParam)
+static LRESULT TOOLBAR_SetListGap(TOOLBAR_INFO *infoPtr, INT iListGap)
{
- TRACE("hwnd=%p iListGap=%ld\n", infoPtr->hwndSelf, wParam);
+ TRACE("hwnd=%p iListGap=%d\n", infoPtr->hwndSelf, iListGap);
- infoPtr->iListGap = (INT)wParam;
+ infoPtr->iListGap = iListGap;
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
@@ -5162,9 +5127,9 @@ static LRESULT TOOLBAR_SetListGap(TOOLBAR_INFO *infoPtr, WPARAM wParam)
/* Returns the number of maximum number of image lists associated with the
* various states. */
-static LRESULT TOOLBAR_GetImageListCount(const TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+static LRESULT TOOLBAR_GetImageListCount(const TOOLBAR_INFO *infoPtr)
{
- TRACE("hwnd=%p wParam %08lx lParam %08lx\n", infoPtr->hwndSelf, wParam, lParam);
+ TRACE("hwnd=%p\n", infoPtr->hwndSelf);
return max(infoPtr->cimlDef, max(infoPtr->cimlHot, infoPtr->cimlDis));
}
@@ -5229,7 +5194,7 @@ static LRESULT TOOLBAR_Unkwn464(HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_Create (HWND hwnd, LPARAM lParam)
+TOOLBAR_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
{
TOOLBAR_INFO *infoPtr = (TOOLBAR_INFO *)GetWindowLongPtrW(hwnd, 0);
DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE);
@@ -5237,38 +5202,7 @@ TOOLBAR_Create (HWND hwnd, LPARAM lParam)
TRACE("hwnd = %p\n", hwnd);
- /* initialize info structure */
- infoPtr->nButtonWidth = 23;
- infoPtr->nButtonHeight = 22;
- infoPtr->nBitmapHeight = 16;
- infoPtr->nBitmapWidth = 16;
-
- infoPtr->nMaxTextRows = 1;
- infoPtr->cxMin = -1;
- infoPtr->cxMax = -1;
- infoPtr->nNumBitmaps = 0;
- infoPtr->nNumStrings = 0;
-
- infoPtr->bCaptured = FALSE;
- infoPtr->nButtonDown = -1;
- infoPtr->nButtonDrag = -1;
- infoPtr->nOldHit = -1;
- infoPtr->nHotItem = -1;
- infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent;
- infoPtr->dwDTFlags = (dwStyle & TBSTYLE_LIST) ? DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS: DT_CENTER | DT_END_ELLIPSIS;
- infoPtr->bAnchor = FALSE; /* no anchor highlighting */
- infoPtr->bDragOutSent = FALSE;
- infoPtr->iVersion = 0;
- infoPtr->hwndSelf = hwnd;
- infoPtr->bDoRedraw = TRUE;
- infoPtr->clrBtnHighlight = CLR_DEFAULT;
- infoPtr->clrBtnShadow = CLR_DEFAULT;
- infoPtr->szPadding.cx = DEFPAD_CX;
- infoPtr->szPadding.cy = DEFPAD_CY;
- infoPtr->iListGap = DEFLISTGAP;
- infoPtr->iTopMargin = default_top_margin(infoPtr);
infoPtr->dwStyle = dwStyle;
- infoPtr->tbim.iButton = -1;
GetClientRect(hwnd, &infoPtr->client_rect);
infoPtr->bUnicode = infoPtr->hwndNotify &&
(NFR_UNICODE == SendMessageW(hwnd, WM_NOTIFYFORMAT, (WPARAM)hwnd, (LPARAM)NF_REQUERY));
@@ -5322,8 +5256,8 @@ TOOLBAR_Destroy (TOOLBAR_INFO *infoPtr)
CloseThemeData (GetWindowTheme (infoPtr->hwndSelf));
/* free toolbar info data */
- Free (infoPtr);
SetWindowLongPtrW (infoPtr->hwndSelf, 0, 0);
+ Free (infoPtr);
return 0;
}
@@ -5402,7 +5336,7 @@ TOOLBAR_EraseBackground (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
}
-static LRESULT
+static inline LRESULT
TOOLBAR_GetFont (const TOOLBAR_INFO *infoPtr)
{
return (LRESULT)infoPtr->hFont;
@@ -5695,7 +5629,7 @@ TOOLBAR_LButtonUp (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
memset(&tbb, 0, sizeof(tbb));
tbb.fsStyle = BTNS_SEP;
tbb.iString = -1;
- TOOLBAR_InsertButtonT(infoPtr, nButton, (LPARAM)&tbb, TRUE);
+ TOOLBAR_InsertButtonT(infoPtr, nButton, &tbb, TRUE);
}
}
else
@@ -5999,10 +5933,9 @@ TOOLBAR_NCCalcSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, const CREATESTRUCTW *lpcs)
{
TOOLBAR_INFO *infoPtr;
- LPCREATESTRUCTA cs = (LPCREATESTRUCTA)lParam;
DWORD styleadd = 0;
/* allocate memory for info structure */
@@ -6014,6 +5947,39 @@ TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
infoPtr->nRows = 1;
infoPtr->nWidth = 0;
+ /* initialize info structure */
+ infoPtr->nButtonWidth = 23;
+ infoPtr->nButtonHeight = 22;
+ infoPtr->nBitmapHeight = 16;
+ infoPtr->nBitmapWidth = 16;
+
+ infoPtr->nMaxTextRows = 1;
+ infoPtr->cxMin = -1;
+ infoPtr->cxMax = -1;
+ infoPtr->nNumBitmaps = 0;
+ infoPtr->nNumStrings = 0;
+
+ infoPtr->bCaptured = FALSE;
+ infoPtr->nButtonDown = -1;
+ infoPtr->nButtonDrag = -1;
+ infoPtr->nOldHit = -1;
+ infoPtr->nHotItem = -1;
+ infoPtr->hwndNotify = lpcs->hwndParent;
+ infoPtr->dwDTFlags = (lpcs->style & TBSTYLE_LIST) ? DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS: DT_CENTER | DT_END_ELLIPSIS;
+ infoPtr->bAnchor = FALSE; /* no anchor highlighting */
+ infoPtr->bDragOutSent = FALSE;
+ infoPtr->iVersion = 0;
+ infoPtr->hwndSelf = hwnd;
+ infoPtr->bDoRedraw = TRUE;
+ infoPtr->clrBtnHighlight = CLR_DEFAULT;
+ infoPtr->clrBtnShadow = CLR_DEFAULT;
+ infoPtr->szPadding.cx = DEFPAD_CX;
+ infoPtr->szPadding.cy = DEFPAD_CY;
+ infoPtr->iListGap = DEFLISTGAP;
+ infoPtr->iTopMargin = default_top_margin(infoPtr);
+ infoPtr->dwStyle = lpcs->style;
+ infoPtr->tbim.iButton = -1;
+
/* fix instance handle, if the toolbar was created by CreateToolbarEx() */
if (!GetWindowLongPtrW (hwnd, GWLP_HINSTANCE)) {
HINSTANCE hInst = (HINSTANCE)GetWindowLongPtrW (GetParent (hwnd), GWLP_HINSTANCE);
@@ -6066,14 +6032,14 @@ TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
*
*/
if (((infoPtr->dwStyle & TBSTYLE_FLAT) || GetWindowTheme (infoPtr->hwndSelf))
- && !(cs->style & TBSTYLE_TRANSPARENT))
+ && !(lpcs->style & TBSTYLE_TRANSPARENT))
styleadd |= TBSTYLE_TRANSPARENT;
- if (!(cs->style & (CCS_TOP | CCS_NOMOVEY))) {
+ if (!(lpcs->style & (CCS_TOP | CCS_NOMOVEY))) {
styleadd |= CCS_TOP; /* default to top */
- SetWindowLongW (hwnd, GWL_STYLE, cs->style | styleadd);
+ SetWindowLongW (hwnd, GWL_STYLE, lpcs->style | styleadd);
}
- return DefWindowProcW (hwnd, WM_NCCREATE, wParam, lParam);
+ return DefWindowProcW (hwnd, WM_NCCREATE, wParam, (LPARAM)lpcs);
}
@@ -6237,15 +6203,13 @@ static LRESULT TOOLBAR_TTGetDispInfo (TOOLBAR_INFO *infoPtr, NMTTDISPINFOW *lpnm
static inline LRESULT
-TOOLBAR_Notify (TOOLBAR_INFO *infoPtr, LPARAM lParam)
+TOOLBAR_Notify (TOOLBAR_INFO *infoPtr, LPNMHDR lpnmh)
{
- LPNMHDR lpnmh = (LPNMHDR)lParam;
-
switch (lpnmh->code)
{
case PGN_CALCSIZE:
{
- LPNMPGCALCSIZE lppgc = (LPNMPGCALCSIZE)lParam;
+ LPNMPGCALCSIZE lppgc = (LPNMPGCALCSIZE)lpnmh;
if (lppgc->dwFlag == PGF_CALCWIDTH) {
lppgc->iWidth = infoPtr->rcBound.right - infoPtr->rcBound.left;
@@ -6262,7 +6226,7 @@ TOOLBAR_Notify (TOOLBAR_INFO *infoPtr, LPARAM lParam)
case PGN_SCROLL:
{
- LPNMPGSCROLL lppgs = (LPNMPGSCROLL)lParam;
+ LPNMPGSCROLL lppgs = (LPNMPGSCROLL)lpnmh;
lppgs->iScroll = (lppgs->iDir & (PGF_SCROLLLEFT | PGF_SCROLLRIGHT)) ?
infoPtr->nButtonWidth : infoPtr->nButtonHeight;
@@ -6272,7 +6236,7 @@ TOOLBAR_Notify (TOOLBAR_INFO *infoPtr, LPARAM lParam)
}
case TTN_GETDISPINFOW:
- return TOOLBAR_TTGetDispInfo(infoPtr, (LPNMTTDISPINFOW)lParam);
+ return TOOLBAR_TTGetDispInfo(infoPtr, (LPNMTTDISPINFOW)lpnmh);
case TTN_GETDISPINFOA:
FIXME("TTN_GETDISPINFOA - should not be received; please report\n");
@@ -6341,18 +6305,18 @@ TOOLBAR_SetFocus (TOOLBAR_INFO *infoPtr)
}
static LRESULT
-TOOLBAR_SetFont(TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TOOLBAR_SetFont(TOOLBAR_INFO *infoPtr, HFONT hFont, WORD Redraw)
{
- TRACE("font=%p redraw=%ld\n", (HFONT)wParam, lParam);
+ TRACE("font=%p redraw=%d\n", hFont, Redraw);
- if (wParam == 0)
+ if (hFont == 0)
infoPtr->hFont = infoPtr->hDefaultFont;
else
- infoPtr->hFont = (HFONT)wParam;
+ infoPtr->hFont = hFont;
TOOLBAR_CalcToolbar(infoPtr);
- if (lParam)
+ if (Redraw)
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
return 1;
}
@@ -6502,19 +6466,19 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
switch (uMsg)
{
case TB_ADDBITMAP:
- return TOOLBAR_AddBitmap (infoPtr, wParam, lParam);
+ return TOOLBAR_AddBitmap (infoPtr, (INT)wParam, (TBADDBITMAP*)lParam);
case TB_ADDBUTTONSA:
- return TOOLBAR_AddButtonsT(infoPtr, wParam, lParam, FALSE);
+ return TOOLBAR_AddButtonsT(infoPtr, wParam, (LPTBBUTTON)lParam, FALSE);
case TB_ADDBUTTONSW:
- return TOOLBAR_AddButtonsT(infoPtr, wParam, lParam, TRUE);
+ return TOOLBAR_AddButtonsT(infoPtr, wParam, (LPTBBUTTON)lParam, TRUE);
case TB_ADDSTRINGA:
- return TOOLBAR_AddStringA (infoPtr, wParam, lParam);
+ return TOOLBAR_AddStringA (infoPtr, (HINSTANCE)wParam, lParam);
case TB_ADDSTRINGW:
- return TOOLBAR_AddStringW (infoPtr, wParam, lParam);
+ return TOOLBAR_AddStringW (infoPtr, (HINSTANCE)wParam, lParam);
case TB_AUTOSIZE:
return TOOLBAR_AutoSize (infoPtr);
@@ -6526,7 +6490,7 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_ButtonStructSize (infoPtr, wParam);
case TB_CHANGEBITMAP:
- return TOOLBAR_ChangeBitmap (infoPtr, wParam, lParam);
+ return TOOLBAR_ChangeBitmap (infoPtr, wParam, LOWORD(lParam));
case TB_CHECKBUTTON:
return TOOLBAR_CheckButton (infoPtr, wParam, lParam);
@@ -6553,49 +6517,49 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_GetBitmapFlags ();
case TB_GETBUTTON:
- return TOOLBAR_GetButton (infoPtr, wParam, lParam);
+ return TOOLBAR_GetButton (infoPtr, wParam, (TBBUTTON*)lParam);
case TB_GETBUTTONINFOA:
- return TOOLBAR_GetButtonInfoT(infoPtr, wParam, lParam, FALSE);
+ return TOOLBAR_GetButtonInfoT(infoPtr, wParam, (LPTBBUTTONINFOW)lParam, FALSE);
case TB_GETBUTTONINFOW:
- return TOOLBAR_GetButtonInfoT(infoPtr, wParam, lParam, TRUE);
+ return TOOLBAR_GetButtonInfoT(infoPtr, wParam, (LPTBBUTTONINFOW)lParam, TRUE);
case TB_GETBUTTONSIZE:
return TOOLBAR_GetButtonSize (infoPtr);
case TB_GETBUTTONTEXTA:
- return TOOLBAR_GetButtonTextA (infoPtr, wParam, lParam);
+ return TOOLBAR_GetButtonTextA (infoPtr, wParam, (LPSTR)lParam);
case TB_GETBUTTONTEXTW:
- return TOOLBAR_GetButtonTextW (infoPtr, wParam, lParam);
+ return TOOLBAR_GetButtonTextW (infoPtr, wParam, (LPWSTR)lParam);
case TB_GETDISABLEDIMAGELIST:
- return TOOLBAR_GetDisabledImageList (infoPtr, wParam, lParam);
+ return TOOLBAR_GetDisabledImageList (infoPtr, wParam);
case TB_GETEXTENDEDSTYLE:
return TOOLBAR_GetExtendedStyle (infoPtr);
case TB_GETHOTIMAGELIST:
- return TOOLBAR_GetHotImageList (infoPtr, wParam, lParam);
+ return TOOLBAR_GetHotImageList (infoPtr, wParam);
case TB_GETHOTITEM:
return TOOLBAR_GetHotItem (infoPtr);
case TB_GETIMAGELIST:
- return TOOLBAR_GetDefImageList (infoPtr, wParam, lParam);
+ return TOOLBAR_GetDefImageList (infoPtr, wParam);
case TB_GETINSERTMARK:
- return TOOLBAR_GetInsertMark (infoPtr, lParam);
+ return TOOLBAR_GetInsertMark (infoPtr, (TBINSERTMARK*)lParam);
case TB_GETINSERTMARKCOLOR:
return TOOLBAR_GetInsertMarkColor (infoPtr);
case TB_GETITEMRECT:
- return TOOLBAR_GetItemRect (infoPtr, wParam, lParam);
+ return TOOLBAR_GetItemRect (infoPtr, wParam, (LPRECT)lParam);
case TB_GETMAXSIZE:
- return TOOLBAR_GetMaxSize (infoPtr, lParam);
+ return TOOLBAR_GetMaxSize (infoPtr, (LPSIZE)lParam);
/* case TB_GETOBJECT: */ /* 4.71 */
@@ -6603,7 +6567,7 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_GetPadding (infoPtr);
case TB_GETRECT:
- return TOOLBAR_GetRect (infoPtr, wParam, lParam);
+ return TOOLBAR_GetRect (infoPtr, wParam, (LPRECT)lParam);
case TB_GETROWS:
return TOOLBAR_GetRows (infoPtr);
@@ -6612,10 +6576,10 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_GetState (infoPtr, wParam);
case TB_GETSTRINGA:
- return TOOLBAR_GetStringA (infoPtr, wParam, lParam);
+ return TOOLBAR_GetStringA (infoPtr, wParam, (LPSTR)lParam);
case TB_GETSTRINGW:
- return TOOLBAR_GetStringW (infoPtr, wParam, lParam);
+ return TOOLBAR_GetStringW (infoPtr, wParam, (LPWSTR)lParam);
case TB_GETSTYLE:
return TOOLBAR_GetStyle (infoPtr);
@@ -6630,19 +6594,19 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_GetUnicodeFormat (infoPtr);
case TB_HIDEBUTTON:
- return TOOLBAR_HideButton (infoPtr, wParam, lParam);
+ return TOOLBAR_HideButton (infoPtr, wParam, LOWORD(lParam));
case TB_HITTEST:
- return TOOLBAR_HitTest (infoPtr, lParam);
+ return TOOLBAR_HitTest (infoPtr, (LPPOINT)lParam);
case TB_INDETERMINATE:
- return TOOLBAR_Indeterminate (infoPtr, wParam, lParam);
+ return TOOLBAR_Indeterminate (infoPtr, wParam, LOWORD(lParam));
case TB_INSERTBUTTONA:
- return TOOLBAR_InsertButtonT(infoPtr, wParam, lParam, FALSE);
+ return TOOLBAR_InsertButtonT(infoPtr, wParam, (TBBUTTON*)lParam, FALSE);
case TB_INSERTBUTTONW:
- return TOOLBAR_InsertButtonT(infoPtr, wParam, lParam, TRUE);
+ return TOOLBAR_InsertButtonT(infoPtr, wParam, (TBBUTTON*)lParam, TRUE);
/* case TB_INSERTMARKHITTEST: */ /* 4.71 */
@@ -6665,23 +6629,23 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_IsButtonPressed (infoPtr, wParam);
case TB_LOADIMAGES:
- return TOOLBAR_LoadImages (infoPtr, wParam, lParam);
+ return TOOLBAR_LoadImages (infoPtr, wParam, (HINSTANCE)lParam);
case TB_MAPACCELERATORA:
case TB_MAPACCELERATORW:
- return TOOLBAR_MapAccelerator (infoPtr, wParam, lParam);
+ return TOOLBAR_MapAccelerator (infoPtr, wParam, (UINT*)lParam);
case TB_MARKBUTTON:
- return TOOLBAR_MarkButton (infoPtr, wParam, lParam);
+ return TOOLBAR_MarkButton (infoPtr, wParam, LOWORD(lParam));
case TB_MOVEBUTTON:
return TOOLBAR_MoveButton (infoPtr, wParam, lParam);
case TB_PRESSBUTTON:
- return TOOLBAR_PressButton (infoPtr, wParam, lParam);
+ return TOOLBAR_PressButton (infoPtr, wParam, LOWORD(lParam));
case TB_REPLACEBITMAP:
- return TOOLBAR_ReplaceBitmap (infoPtr, lParam);
+ return TOOLBAR_ReplaceBitmap (infoPtr, (LPTBREPLACEBITMAP)lParam);
case TB_SAVERESTOREA:
return TOOLBAR_SaveRestoreA (infoPtr, wParam, (LPTBSAVEPARAMSA)lParam);
@@ -6690,16 +6654,16 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_SaveRestoreW (infoPtr, wParam, (LPTBSAVEPARAMSW)lParam);
case TB_SETANCHORHIGHLIGHT:
- return TOOLBAR_SetAnchorHighlight (infoPtr, wParam);
+ return TOOLBAR_SetAnchorHighlight (infoPtr, (BOOL)wParam);
case TB_SETBITMAPSIZE:
return TOOLBAR_SetBitmapSize (infoPtr, wParam, lParam);
case TB_SETBUTTONINFOA:
- return TOOLBAR_SetButtonInfoA (infoPtr, wParam, lParam);
+ return TOOLBAR_SetButtonInfoA (infoPtr, wParam, (LPTBBUTTONINFOA)lParam);
case TB_SETBUTTONINFOW:
- return TOOLBAR_SetButtonInfoW (infoPtr, wParam, lParam);
+ return TOOLBAR_SetButtonInfoW (infoPtr, wParam, (LPTBBUTTONINFOW)lParam);
case TB_SETBUTTONSIZE:
return TOOLBAR_SetButtonSize (infoPtr, lParam);
@@ -6711,7 +6675,7 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_SetCmdId (infoPtr, wParam, lParam);
case TB_SETDISABLEDIMAGELIST:
- return TOOLBAR_SetDisabledImageList (infoPtr, wParam, lParam);
+ return TOOLBAR_SetDisabledImageList (infoPtr, wParam, (HIMAGELIST)lParam);
case TB_SETDRAWTEXTFLAGS:
return TOOLBAR_SetDrawTextFlags (infoPtr, wParam, lParam);
@@ -6720,19 +6684,19 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_SetExtendedStyle (infoPtr, lParam);
case TB_SETHOTIMAGELIST:
- return TOOLBAR_SetHotImageList (infoPtr, wParam, lParam);
+ return TOOLBAR_SetHotImageList (infoPtr, wParam, (HIMAGELIST)lParam);
case TB_SETHOTITEM:
return TOOLBAR_SetHotItem (infoPtr, wParam);
case TB_SETIMAGELIST:
- return TOOLBAR_SetImageList (infoPtr, wParam, lParam);
+ return TOOLBAR_SetImageList (infoPtr, wParam, (HIMAGELIST)lParam);
case TB_SETINDENT:
return TOOLBAR_SetIndent (infoPtr, wParam);
case TB_SETINSERTMARK:
- return TOOLBAR_SetInsertMark (infoPtr, lParam);
+ return TOOLBAR_SetInsertMark (infoPtr, (TBINSERTMARK*)lParam);
case TB_SETINSERTMARKCOLOR:
return TOOLBAR_SetInsertMarkColor (infoPtr, lParam);
@@ -6744,10 +6708,10 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_SetPadding (infoPtr, lParam);
case TB_SETPARENT:
- return TOOLBAR_SetParent (infoPtr, wParam);
+ return TOOLBAR_SetParent (infoPtr, (HWND)wParam);
case TB_SETROWS:
- return TOOLBAR_SetRows (infoPtr, wParam, lParam);
+ return TOOLBAR_SetRows (infoPtr, wParam, (LPRECT)lParam);
case TB_SETSTATE:
return TOOLBAR_SetState (infoPtr, wParam, lParam);
@@ -6756,7 +6720,7 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_SetStyle (infoPtr, lParam);
case TB_SETTOOLTIPS:
- return TOOLBAR_SetToolTips (infoPtr, wParam, lParam);
+ return TOOLBAR_SetToolTips (infoPtr, (HWND)wParam);
case TB_SETUNICODEFORMAT:
return TOOLBAR_SetUnicodeFormat (infoPtr, wParam);
@@ -6771,7 +6735,7 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_SetListGap(infoPtr, wParam);
case TB_GETIMAGELISTCOUNT:
- return TOOLBAR_GetImageListCount(infoPtr, wParam, lParam);
+ return TOOLBAR_GetImageListCount(infoPtr);
case TB_GETIDEALSIZE:
return TOOLBAR_GetIdealSize (infoPtr, wParam, lParam);
@@ -6799,7 +6763,7 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* case WM_CHAR: */
case WM_CREATE:
- return TOOLBAR_Create (hwnd, lParam);
+ return TOOLBAR_Create (hwnd, (CREATESTRUCTW*)lParam);
case WM_DESTROY:
return TOOLBAR_Destroy (infoPtr);
@@ -6846,13 +6810,13 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_NCCalcSize (hwnd, wParam, lParam);
case WM_NCCREATE:
- return TOOLBAR_NCCreate (hwnd, wParam, lParam);
+ return TOOLBAR_NCCreate (hwnd, wParam, (CREATESTRUCTW*)lParam);
case WM_NCPAINT:
return TOOLBAR_NCPaint (hwnd, wParam, lParam);
case WM_NOTIFY:
- return TOOLBAR_Notify (infoPtr, lParam);
+ return TOOLBAR_Notify (infoPtr, (LPNMHDR)lParam);
case WM_NOTIFYFORMAT:
return TOOLBAR_NotifyFormat (infoPtr, wParam, lParam);
@@ -6865,7 +6829,7 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_SetFocus (infoPtr);
case WM_SETFONT:
- return TOOLBAR_SetFont(infoPtr, wParam, lParam);
+ return TOOLBAR_SetFont(infoPtr, (HFONT)wParam, (WORD)lParam);
case WM_SETREDRAW:
return TOOLBAR_SetRedraw (infoPtr, wParam);
@@ -7039,7 +7003,7 @@ static BOOL TOOLBAR_GetButtonInfo(const TOOLBAR_INFO *infoPtr, NMTOOLBARW *nmtb)
}
-static BOOL TOOLBAR_IsButtonRemovable(const TOOLBAR_INFO *infoPtr, int iItem, PCUSTOMBUTTON btnInfo)
+static BOOL TOOLBAR_IsButtonRemovable(const TOOLBAR_INFO *infoPtr, int iItem, const CUSTOMBUTTON *btnInfo)
{
NMTOOLBARW nmtb;
diff --git a/reactos/dll/win32/comctl32/tooltips.c b/reactos/dll/win32/comctl32/tooltips.c
index fe640848ed0..7419e2694c9 100644
--- a/reactos/dll/win32/comctl32/tooltips.c
+++ b/reactos/dll/win32/comctl32/tooltips.c
@@ -123,6 +123,7 @@ typedef struct
typedef struct
{
+ HWND hwndSelf;
WCHAR szTipText[INFOTIPSIZE];
BOOL bActive;
BOOL bTrackActive;
@@ -241,24 +242,23 @@ TOOLTIPS_notify_customdraw (DWORD dwDrawStage, NMTTCUSTOMDRAW *lpnmttcd)
}
static void
-TOOLTIPS_Refresh (HWND hwnd, HDC hdc)
+TOOLTIPS_Refresh (const TOOLTIPS_INFO *infoPtr, HDC hdc)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(hwnd);
RECT rc;
INT oldBkMode;
HFONT hOldFont;
HBRUSH hBrush;
UINT uFlags = DT_EXTERNALLEADING;
HRGN hRgn = NULL;
- DWORD dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
+ DWORD dwStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
NMTTCUSTOMDRAW nmttcd;
DWORD cdmode;
if (infoPtr->nMaxTipWidth > -1)
uFlags |= DT_WORDBREAK;
- if (GetWindowLongW (hwnd, GWL_STYLE) & TTS_NOPREFIX)
+ if (GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TTS_NOPREFIX)
uFlags |= DT_NOPREFIX;
- GetClientRect (hwnd, &rc);
+ GetClientRect (infoPtr->hwndSelf, &rc);
hBrush = CreateSolidBrush(infoPtr->clrBk);
@@ -268,7 +268,7 @@ TOOLTIPS_Refresh (HWND hwnd, HDC hdc)
/* Custom draw - Call PrePaint once initial properties set up */
/* Note: Contrary to MSDN, CDRF_SKIPDEFAULT still draws a tooltip */
- TOOLTIPS_customdraw_fill(&nmttcd, hwnd, hdc, &rc, uFlags);
+ TOOLTIPS_customdraw_fill(&nmttcd, infoPtr->hwndSelf, hdc, &rc, uFlags);
cdmode = TOOLTIPS_notify_customdraw(CDDS_PREPAINT, &nmttcd);
uFlags = nmttcd.uDrawFlags;
@@ -277,7 +277,7 @@ TOOLTIPS_Refresh (HWND hwnd, HDC hdc)
/* create a region to store result into */
hRgn = CreateRectRgn(0, 0, 0, 0);
- GetWindowRgn(hwnd, hRgn);
+ GetWindowRgn(infoPtr->hwndSelf, hRgn);
/* fill the background */
FillRgn(hdc, hRgn, hBrush);
@@ -359,13 +359,13 @@ TOOLTIPS_Refresh (HWND hwnd, HDC hdc)
DeleteObject(hRgn);
}
-static void TOOLTIPS_GetDispInfoA(HWND hwnd, TOOLTIPS_INFO *infoPtr, TTTOOL_INFO *toolPtr)
+static void TOOLTIPS_GetDispInfoA(const TOOLTIPS_INFO *infoPtr, TTTOOL_INFO *toolPtr, WCHAR *buffer)
{
NMTTDISPINFOA ttnmdi;
/* fill NMHDR struct */
ZeroMemory (&ttnmdi, sizeof(NMTTDISPINFOA));
- ttnmdi.hdr.hwndFrom = hwnd;
+ ttnmdi.hdr.hwndFrom = infoPtr->hwndSelf;
ttnmdi.hdr.idFrom = toolPtr->uId;
ttnmdi.hdr.code = TTN_GETDISPINFOA; /* == TTN_NEEDTEXTA */
ttnmdi.lpszText = ttnmdi.szText;
@@ -377,51 +377,51 @@ static void TOOLTIPS_GetDispInfoA(HWND hwnd, TOOLTIPS_INFO *infoPtr, TTTOOL_INFO
if (IS_INTRESOURCE(ttnmdi.lpszText)) {
LoadStringW(ttnmdi.hinst, LOWORD(ttnmdi.lpszText),
- infoPtr->szTipText, INFOTIPSIZE);
+ buffer, INFOTIPSIZE);
if (ttnmdi.uFlags & TTF_DI_SETITEM) {
toolPtr->hinst = ttnmdi.hinst;
toolPtr->lpszText = (LPWSTR)ttnmdi.lpszText;
}
}
else if (ttnmdi.lpszText == 0) {
- infoPtr->szTipText[0] = '\0';
+ buffer[0] = '\0';
}
else if (ttnmdi.lpszText != LPSTR_TEXTCALLBACKA) {
- Str_GetPtrAtoW(ttnmdi.lpszText, infoPtr->szTipText, INFOTIPSIZE);
+ Str_GetPtrAtoW(ttnmdi.lpszText, buffer, INFOTIPSIZE);
if (ttnmdi.uFlags & TTF_DI_SETITEM) {
toolPtr->hinst = 0;
toolPtr->lpszText = NULL;
- Str_SetPtrW(&toolPtr->lpszText, infoPtr->szTipText);
+ Str_SetPtrW(&toolPtr->lpszText, buffer);
}
}
else {
ERR("recursive text callback!\n");
- infoPtr->szTipText[0] = '\0';
+ buffer[0] = '\0';
}
/* no text available - try calling parent instead as per native */
/* FIXME: Unsure if SETITEM should save the value or not */
- if (infoPtr->szTipText[0] == 0x00) {
+ if (buffer[0] == 0x00) {
SendMessageW(GetParent(toolPtr->hwnd), WM_NOTIFY, toolPtr->uId, (LPARAM)&ttnmdi);
if (IS_INTRESOURCE(ttnmdi.lpszText)) {
LoadStringW(ttnmdi.hinst, LOWORD(ttnmdi.lpszText),
- infoPtr->szTipText, INFOTIPSIZE);
+ buffer, INFOTIPSIZE);
} else if (ttnmdi.lpszText &&
ttnmdi.lpszText != LPSTR_TEXTCALLBACKA) {
- Str_GetPtrAtoW(ttnmdi.lpszText, infoPtr->szTipText, INFOTIPSIZE);
+ Str_GetPtrAtoW(ttnmdi.lpszText, buffer, INFOTIPSIZE);
}
}
}
-static void TOOLTIPS_GetDispInfoW(HWND hwnd, TOOLTIPS_INFO *infoPtr, TTTOOL_INFO *toolPtr)
+static void TOOLTIPS_GetDispInfoW(const TOOLTIPS_INFO *infoPtr, TTTOOL_INFO *toolPtr, WCHAR *buffer)
{
NMTTDISPINFOW ttnmdi;
/* fill NMHDR struct */
ZeroMemory (&ttnmdi, sizeof(NMTTDISPINFOW));
- ttnmdi.hdr.hwndFrom = hwnd;
+ ttnmdi.hdr.hwndFrom = infoPtr->hwndSelf;
ttnmdi.hdr.idFrom = toolPtr->uId;
ttnmdi.hdr.code = TTN_GETDISPINFOW; /* == TTN_NEEDTEXTW */
ttnmdi.lpszText = ttnmdi.szText;
@@ -433,47 +433,47 @@ static void TOOLTIPS_GetDispInfoW(HWND hwnd, TOOLTIPS_INFO *infoPtr, TTTOOL_INFO
if (IS_INTRESOURCE(ttnmdi.lpszText)) {
LoadStringW(ttnmdi.hinst, LOWORD(ttnmdi.lpszText),
- infoPtr->szTipText, INFOTIPSIZE);
+ buffer, INFOTIPSIZE);
if (ttnmdi.uFlags & TTF_DI_SETITEM) {
toolPtr->hinst = ttnmdi.hinst;
toolPtr->lpszText = ttnmdi.lpszText;
}
}
else if (ttnmdi.lpszText == 0) {
- infoPtr->szTipText[0] = '\0';
+ buffer[0] = '\0';
}
else if (ttnmdi.lpszText != LPSTR_TEXTCALLBACKW) {
- Str_GetPtrW(ttnmdi.lpszText, infoPtr->szTipText, INFOTIPSIZE);
+ Str_GetPtrW(ttnmdi.lpszText, buffer, INFOTIPSIZE);
if (ttnmdi.uFlags & TTF_DI_SETITEM) {
toolPtr->hinst = 0;
toolPtr->lpszText = NULL;
- Str_SetPtrW(&toolPtr->lpszText, infoPtr->szTipText);
+ Str_SetPtrW(&toolPtr->lpszText, buffer);
}
}
else {
ERR("recursive text callback!\n");
- infoPtr->szTipText[0] = '\0';
+ buffer[0] = '\0';
}
/* no text available - try calling parent instead as per native */
/* FIXME: Unsure if SETITEM should save the value or not */
- if (infoPtr->szTipText[0] == 0x00) {
+ if (buffer[0] == 0x00) {
SendMessageW(GetParent(toolPtr->hwnd), WM_NOTIFY, toolPtr->uId, (LPARAM)&ttnmdi);
if (IS_INTRESOURCE(ttnmdi.lpszText)) {
LoadStringW(ttnmdi.hinst, LOWORD(ttnmdi.lpszText),
- infoPtr->szTipText, INFOTIPSIZE);
+ buffer, INFOTIPSIZE);
} else if (ttnmdi.lpszText &&
ttnmdi.lpszText != LPSTR_TEXTCALLBACKW) {
- Str_GetPtrW(ttnmdi.lpszText, infoPtr->szTipText, INFOTIPSIZE);
+ Str_GetPtrW(ttnmdi.lpszText, buffer, INFOTIPSIZE);
}
}
}
static void
-TOOLTIPS_GetTipText (HWND hwnd, TOOLTIPS_INFO *infoPtr, INT nTool)
+TOOLTIPS_GetTipText (const TOOLTIPS_INFO *infoPtr, INT nTool, WCHAR *buffer)
{
TTTOOL_INFO *toolPtr = &infoPtr->tools[nTool];
@@ -482,35 +482,35 @@ TOOLTIPS_GetTipText (HWND hwnd, TOOLTIPS_INFO *infoPtr, INT nTool)
TRACE("load res string %p %x\n",
toolPtr->hinst, LOWORD(toolPtr->lpszText));
LoadStringW (toolPtr->hinst, LOWORD(toolPtr->lpszText),
- infoPtr->szTipText, INFOTIPSIZE);
+ buffer, INFOTIPSIZE);
}
else if (toolPtr->lpszText) {
if (toolPtr->lpszText == LPSTR_TEXTCALLBACKW) {
if (toolPtr->bNotifyUnicode)
- TOOLTIPS_GetDispInfoW(hwnd, infoPtr, toolPtr);
+ TOOLTIPS_GetDispInfoW(infoPtr, toolPtr, buffer);
else
- TOOLTIPS_GetDispInfoA(hwnd, infoPtr, toolPtr);
+ TOOLTIPS_GetDispInfoA(infoPtr, toolPtr, buffer);
}
else {
/* the item is a usual (unicode) text */
- lstrcpynW (infoPtr->szTipText, toolPtr->lpszText, INFOTIPSIZE);
+ lstrcpynW (buffer, toolPtr->lpszText, INFOTIPSIZE);
}
}
else {
/* no text available */
- infoPtr->szTipText[0] = '\0';
+ buffer[0] = '\0';
}
- TRACE("%s\n", debugstr_w(infoPtr->szTipText));
+ TRACE("%s\n", debugstr_w(buffer));
}
static void
-TOOLTIPS_CalcTipSize (HWND hwnd, const TOOLTIPS_INFO *infoPtr, LPSIZE lpSize)
+TOOLTIPS_CalcTipSize (const TOOLTIPS_INFO *infoPtr, LPSIZE lpSize)
{
HDC hdc;
HFONT hOldFont;
- DWORD style = GetWindowLongW(hwnd, GWL_STYLE);
+ DWORD style = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
UINT uFlags = DT_EXTERNALLEADING | DT_CALCRECT;
RECT rc = {0, 0, 0, 0};
SIZE title = {0, 0};
@@ -523,7 +523,7 @@ TOOLTIPS_CalcTipSize (HWND hwnd, const TOOLTIPS_INFO *infoPtr, LPSIZE lpSize)
uFlags |= DT_NOPREFIX;
TRACE("%s\n", debugstr_w(infoPtr->szTipText));
- hdc = GetDC (hwnd);
+ hdc = GetDC (infoPtr->hwndSelf);
if (infoPtr->pszTitle)
{
RECT rcTitle = {0, 0, 0, 0};
@@ -543,7 +543,7 @@ TOOLTIPS_CalcTipSize (HWND hwnd, const TOOLTIPS_INFO *infoPtr, LPSIZE lpSize)
hOldFont = SelectObject (hdc, infoPtr->hFont);
DrawTextW (hdc, infoPtr->szTipText, -1, &rc, uFlags);
SelectObject (hdc, hOldFont);
- ReleaseDC (hwnd, hdc);
+ ReleaseDC (infoPtr->hwndSelf, hdc);
if ((style & TTS_BALLOON) || infoPtr->pszTitle)
{
@@ -564,7 +564,7 @@ TOOLTIPS_CalcTipSize (HWND hwnd, const TOOLTIPS_INFO *infoPtr, LPSIZE lpSize)
static void
-TOOLTIPS_Show (HWND hwnd, TOOLTIPS_INFO *infoPtr, BOOL track_activate)
+TOOLTIPS_Show (TOOLTIPS_INFO *infoPtr, BOOL track_activate)
{
TTTOOL_INFO *toolPtr;
HMONITOR monitor;
@@ -573,7 +573,7 @@ TOOLTIPS_Show (HWND hwnd, TOOLTIPS_INFO *infoPtr, BOOL track_activate)
SIZE size;
NMHDR hdr;
int ptfx = 0;
- DWORD style = GetWindowLongW(hwnd, GWL_STYLE);
+ DWORD style = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
INT nTool;
if (track_activate)
@@ -595,9 +595,9 @@ TOOLTIPS_Show (HWND hwnd, TOOLTIPS_INFO *infoPtr, BOOL track_activate)
nTool = infoPtr->nTool;
}
- TRACE("Show tooltip pre %d! (%p)\n", nTool, hwnd);
+ TRACE("Show tooltip pre %d! (%p)\n", nTool, infoPtr->hwndSelf);
- TOOLTIPS_GetTipText (hwnd, infoPtr, nTool);
+ TOOLTIPS_GetTipText (infoPtr, nTool, infoPtr->szTipText);
if (infoPtr->szTipText[0] == '\0')
return;
@@ -609,14 +609,14 @@ TOOLTIPS_Show (HWND hwnd, TOOLTIPS_INFO *infoPtr, BOOL track_activate)
TRACE("Show tooltip %d!\n", nTool);
- hdr.hwndFrom = hwnd;
+ hdr.hwndFrom = infoPtr->hwndSelf;
hdr.idFrom = toolPtr->uId;
hdr.code = TTN_SHOW;
SendMessageW (toolPtr->hwnd, WM_NOTIFY, toolPtr->uId, (LPARAM)&hdr);
TRACE("%s\n", debugstr_w(infoPtr->szTipText));
- TOOLTIPS_CalcTipSize (hwnd, infoPtr, &size);
+ TOOLTIPS_CalcTipSize (infoPtr, &size);
TRACE("size %d x %d\n", size.cx, size.cy);
if (track_activate)
@@ -749,8 +749,8 @@ TOOLTIPS_Show (HWND hwnd, TOOLTIPS_INFO *infoPtr, BOOL track_activate)
rect.top = rect.bottom - size.cy;
}
- AdjustWindowRectEx (&rect, GetWindowLongW (hwnd, GWL_STYLE),
- FALSE, GetWindowLongW (hwnd, GWL_EXSTYLE));
+ AdjustWindowRectEx (&rect, GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE),
+ FALSE, GetWindowLongW (infoPtr->hwndSelf, GWL_EXSTYLE));
if (style & TTS_BALLOON)
{
@@ -800,64 +800,64 @@ TOOLTIPS_Show (HWND hwnd, TOOLTIPS_INFO *infoPtr, BOOL track_activate)
CombineRgn(hRgn, hRgn, hrStem, RGN_OR);
DeleteObject(hrStem);
- SetWindowRgn(hwnd, hRgn, FALSE);
+ SetWindowRgn(infoPtr->hwndSelf, hRgn, FALSE);
/* we don't free the region handle as the system deletes it when
* it is no longer needed */
}
- SetWindowPos (hwnd, HWND_TOPMOST, rect.left, rect.top,
+ SetWindowPos (infoPtr->hwndSelf, HWND_TOPMOST, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
SWP_SHOWWINDOW | SWP_NOACTIVATE);
/* repaint the tooltip */
- InvalidateRect(hwnd, NULL, TRUE);
- UpdateWindow(hwnd);
+ InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
+ UpdateWindow(infoPtr->hwndSelf);
if (!track_activate)
{
- SetTimer (hwnd, ID_TIMERPOP, infoPtr->nAutoPopTime, 0);
+ SetTimer (infoPtr->hwndSelf, ID_TIMERPOP, infoPtr->nAutoPopTime, 0);
TRACE("timer 2 started!\n");
- SetTimer (hwnd, ID_TIMERLEAVE, infoPtr->nReshowTime, 0);
+ SetTimer (infoPtr->hwndSelf, ID_TIMERLEAVE, infoPtr->nReshowTime, 0);
TRACE("timer 3 started!\n");
}
}
static void
-TOOLTIPS_Hide (HWND hwnd, TOOLTIPS_INFO *infoPtr)
+TOOLTIPS_Hide (TOOLTIPS_INFO *infoPtr)
{
TTTOOL_INFO *toolPtr;
NMHDR hdr;
- TRACE("Hide tooltip %d! (%p)\n", infoPtr->nCurrentTool, hwnd);
+ TRACE("Hide tooltip %d! (%p)\n", infoPtr->nCurrentTool, infoPtr->hwndSelf);
if (infoPtr->nCurrentTool == -1)
return;
toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
- KillTimer (hwnd, ID_TIMERPOP);
+ KillTimer (infoPtr->hwndSelf, ID_TIMERPOP);
- hdr.hwndFrom = hwnd;
+ hdr.hwndFrom = infoPtr->hwndSelf;
hdr.idFrom = toolPtr->uId;
hdr.code = TTN_POP;
SendMessageW (toolPtr->hwnd, WM_NOTIFY, toolPtr->uId, (LPARAM)&hdr);
infoPtr->nCurrentTool = -1;
- SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0,
+ SetWindowPos (infoPtr->hwndSelf, HWND_TOP, 0, 0, 0, 0,
SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE);
}
static void
-TOOLTIPS_TrackShow (HWND hwnd, TOOLTIPS_INFO *infoPtr)
+TOOLTIPS_TrackShow (TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_Show(hwnd, infoPtr, TRUE);
+ TOOLTIPS_Show(infoPtr, TRUE);
}
static void
-TOOLTIPS_TrackHide (HWND hwnd, const TOOLTIPS_INFO *infoPtr)
+TOOLTIPS_TrackHide (const TOOLTIPS_INFO *infoPtr)
{
TTTOOL_INFO *toolPtr;
NMHDR hdr;
@@ -869,12 +869,12 @@ TOOLTIPS_TrackHide (HWND hwnd, const TOOLTIPS_INFO *infoPtr)
toolPtr = &infoPtr->tools[infoPtr->nTrackTool];
- hdr.hwndFrom = hwnd;
+ hdr.hwndFrom = infoPtr->hwndSelf;
hdr.idFrom = toolPtr->uId;
hdr.code = TTN_POP;
SendMessageW (toolPtr->hwnd, WM_NOTIFY, toolPtr->uId, (LPARAM)&hdr);
- SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0,
+ SetWindowPos (infoPtr->hwndSelf, HWND_TOP, 0, 0, 0, 0,
SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE);
}
@@ -977,15 +977,14 @@ TOOLTIPS_IsWindowActive (HWND hwnd)
static INT
-TOOLTIPS_CheckTool (HWND hwnd, BOOL bShowTest)
+TOOLTIPS_CheckTool (const TOOLTIPS_INFO *infoPtr, BOOL bShowTest)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
POINT pt;
HWND hwndTool;
INT nTool;
GetCursorPos (&pt);
- hwndTool = (HWND)SendMessageW (hwnd, TTM_WINDOWFROMPOINT, 0, (LPARAM)&pt);
+ hwndTool = (HWND)SendMessageW (infoPtr->hwndSelf, TTM_WINDOWFROMPOINT, 0, (LPARAM)&pt);
if (hwndTool == 0)
return -1;
@@ -994,8 +993,8 @@ TOOLTIPS_CheckTool (HWND hwnd, BOOL bShowTest)
if (nTool == -1)
return -1;
- if (!(GetWindowLongW (hwnd, GWL_STYLE) & TTS_ALWAYSTIP) && bShowTest) {
- if (!TOOLTIPS_IsWindowActive (GetWindow (hwnd, GW_OWNER)))
+ if (!(GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TTS_ALWAYSTIP) && bShowTest) {
+ if (!TOOLTIPS_IsWindowActive (GetWindow (infoPtr->hwndSelf, GW_OWNER)))
return -1;
}
@@ -1006,27 +1005,23 @@ TOOLTIPS_CheckTool (HWND hwnd, BOOL bShowTest)
static LRESULT
-TOOLTIPS_Activate (HWND hwnd, WPARAM wParam)
+TOOLTIPS_Activate (TOOLTIPS_INFO *infoPtr, BOOL activate)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-
- infoPtr->bActive = (BOOL)wParam;
+ infoPtr->bActive = activate;
if (infoPtr->bActive)
TRACE("activate!\n");
if (!(infoPtr->bActive) && (infoPtr->nCurrentTool != -1))
- TOOLTIPS_Hide (hwnd, infoPtr);
+ TOOLTIPS_Hide (infoPtr);
return 0;
}
static LRESULT
-TOOLTIPS_AddToolA (HWND hwnd, LPARAM lParam)
+TOOLTIPS_AddToolA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
TTTOOL_INFO *toolPtr;
INT nResult;
@@ -1036,7 +1031,7 @@ TOOLTIPS_AddToolA (HWND hwnd, LPARAM lParam)
return FALSE;
TRACE("add tool (%p) %p %ld%s!\n",
- hwnd, lpToolInfo->hwnd, lpToolInfo->uId,
+ infoPtr->hwndSelf, lpToolInfo->hwnd, lpToolInfo->uId,
(lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
if (infoPtr->uNumTools == 0) {
@@ -1088,17 +1083,17 @@ TOOLTIPS_AddToolA (HWND hwnd, LPARAM lParam)
if (toolPtr->uFlags & TTF_SUBCLASS) {
if (toolPtr->uFlags & TTF_IDISHWND) {
SetWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1,
- (DWORD_PTR)hwnd);
+ (DWORD_PTR)infoPtr->hwndSelf);
}
else {
SetWindowSubclass(toolPtr->hwnd, TOOLTIPS_SubclassProc, 1,
- (DWORD_PTR)hwnd);
+ (DWORD_PTR)infoPtr->hwndSelf);
}
TRACE("subclassing installed!\n");
}
nResult = (INT) SendMessageW (toolPtr->hwnd, WM_NOTIFYFORMAT,
- (WPARAM)hwnd, (LPARAM)NF_QUERY);
+ (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
if (nResult == NFR_ANSI) {
toolPtr->bNotifyUnicode = FALSE;
TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n");
@@ -1114,10 +1109,8 @@ TOOLTIPS_AddToolA (HWND hwnd, LPARAM lParam)
static LRESULT
-TOOLTIPS_AddToolW (HWND hwnd, LPARAM lParam)
+TOOLTIPS_AddToolW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam;
TTTOOL_INFO *toolPtr;
INT nResult;
@@ -1127,7 +1120,7 @@ TOOLTIPS_AddToolW (HWND hwnd, LPARAM lParam)
return FALSE;
TRACE("add tool (%p) %p %ld%s!\n",
- hwnd, lpToolInfo->hwnd, lpToolInfo->uId,
+ infoPtr->hwndSelf, lpToolInfo->hwnd, lpToolInfo->uId,
(lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
if (infoPtr->uNumTools == 0) {
@@ -1178,17 +1171,17 @@ TOOLTIPS_AddToolW (HWND hwnd, LPARAM lParam)
if (toolPtr->uFlags & TTF_SUBCLASS) {
if (toolPtr->uFlags & TTF_IDISHWND) {
SetWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1,
- (DWORD_PTR)hwnd);
+ (DWORD_PTR)infoPtr->hwndSelf);
}
else {
SetWindowSubclass(toolPtr->hwnd, TOOLTIPS_SubclassProc, 1,
- (DWORD_PTR)hwnd);
+ (DWORD_PTR)infoPtr->hwndSelf);
}
TRACE("subclassing installed!\n");
}
nResult = (INT) SendMessageW (toolPtr->hwnd, WM_NOTIFYFORMAT,
- (WPARAM)hwnd, (LPARAM)NF_QUERY);
+ (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
if (nResult == NFR_ANSI) {
toolPtr->bNotifyUnicode = FALSE;
TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n");
@@ -1204,7 +1197,7 @@ TOOLTIPS_AddToolW (HWND hwnd, LPARAM lParam)
static void
-TOOLTIPS_DelToolCommon (HWND hwnd, TOOLTIPS_INFO *infoPtr, INT nTool)
+TOOLTIPS_DelToolCommon (TOOLTIPS_INFO *infoPtr, INT nTool)
{
TTTOOL_INFO *toolPtr;
@@ -1214,7 +1207,7 @@ TOOLTIPS_DelToolCommon (HWND hwnd, TOOLTIPS_INFO *infoPtr, INT nTool)
return;
/* make sure the tooltip has disappeared before deleting it */
- TOOLTIPS_Hide(hwnd, infoPtr);
+ TOOLTIPS_Hide(infoPtr);
/* delete text string */
toolPtr = &infoPtr->tools[nTool];
@@ -1280,10 +1273,8 @@ TOOLTIPS_DelToolCommon (HWND hwnd, TOOLTIPS_INFO *infoPtr, INT nTool)
}
static LRESULT
-TOOLTIPS_DelToolA (HWND hwnd, LPARAM lParam)
+TOOLTIPS_DelToolA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
INT nTool;
if (lpToolInfo == NULL)
@@ -1295,17 +1286,15 @@ TOOLTIPS_DelToolA (HWND hwnd, LPARAM lParam)
nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
- TOOLTIPS_DelToolCommon (hwnd, infoPtr, nTool);
+ TOOLTIPS_DelToolCommon (infoPtr, nTool);
return 0;
}
static LRESULT
-TOOLTIPS_DelToolW (HWND hwnd, LPARAM lParam)
+TOOLTIPS_DelToolW (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam;
INT nTool;
if (lpToolInfo == NULL)
@@ -1317,18 +1306,15 @@ TOOLTIPS_DelToolW (HWND hwnd, LPARAM lParam)
nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
- TOOLTIPS_DelToolCommon (hwnd, infoPtr, nTool);
+ TOOLTIPS_DelToolCommon (infoPtr, nTool);
return 0;
}
static LRESULT
-TOOLTIPS_EnumToolsA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_EnumToolsA (const TOOLTIPS_INFO *infoPtr, UINT uIndex, LPTTTOOLINFOA lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- UINT uIndex = (UINT)wParam;
- LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
TTTOOL_INFO *toolPtr;
if (lpToolInfo == NULL)
@@ -1359,11 +1345,8 @@ TOOLTIPS_EnumToolsA (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_EnumToolsW (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_EnumToolsW (const TOOLTIPS_INFO *infoPtr, UINT uIndex, LPTTTOOLINFOW lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- UINT uIndex = (UINT)wParam;
- LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam;
TTTOOL_INFO *toolPtr;
if (lpToolInfo == NULL)
@@ -1393,10 +1376,8 @@ TOOLTIPS_EnumToolsW (HWND hwnd, WPARAM wParam, LPARAM lParam)
}
static LRESULT
-TOOLTIPS_GetBubbleSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_GetBubbleSize (const TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam;
INT nTool;
SIZE size;
@@ -1410,17 +1391,15 @@ TOOLTIPS_GetBubbleSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
TRACE("tool %d\n", nTool);
- TOOLTIPS_CalcTipSize (hwnd, infoPtr, &size);
+ TOOLTIPS_CalcTipSize (infoPtr, &size);
TRACE("size %d x %d\n", size.cx, size.cy);
return MAKELRESULT(size.cx, size.cy);
}
static LRESULT
-TOOLTIPS_GetCurrentToolA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_GetCurrentToolA (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
TTTOOL_INFO *toolPtr;
if (lpToolInfo) {
@@ -1451,10 +1430,8 @@ TOOLTIPS_GetCurrentToolA (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_GetCurrentToolW (HWND hwnd, LPARAM lParam)
+TOOLTIPS_GetCurrentToolW (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam;
TTTOOL_INFO *toolPtr;
if (lpToolInfo) {
@@ -1485,11 +1462,9 @@ TOOLTIPS_GetCurrentToolW (HWND hwnd, LPARAM lParam)
static LRESULT
-TOOLTIPS_GetDelayTime (HWND hwnd, WPARAM wParam)
+TOOLTIPS_GetDelayTime (const TOOLTIPS_INFO *infoPtr, DWORD duration)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-
- switch (wParam) {
+ switch (duration) {
case TTDT_RESHOW:
return infoPtr->nReshowTime;
@@ -1501,7 +1476,7 @@ TOOLTIPS_GetDelayTime (HWND hwnd, WPARAM wParam)
return infoPtr->nInitialTime;
default:
- WARN("Invalid wParam %lx\n", wParam);
+ WARN("Invalid duration flag %x\n", duration);
break;
}
@@ -1510,11 +1485,8 @@ TOOLTIPS_GetDelayTime (HWND hwnd, WPARAM wParam)
static LRESULT
-TOOLTIPS_GetMargin (HWND hwnd, LPARAM lParam)
+TOOLTIPS_GetMargin (const TOOLTIPS_INFO *infoPtr, LPRECT lpRect)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPRECT lpRect = (LPRECT)lParam;
-
lpRect->left = infoPtr->rcMargin.left;
lpRect->right = infoPtr->rcMargin.right;
lpRect->bottom = infoPtr->rcMargin.bottom;
@@ -1525,19 +1497,16 @@ TOOLTIPS_GetMargin (HWND hwnd, LPARAM lParam)
static inline LRESULT
-TOOLTIPS_GetMaxTipWidth (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_GetMaxTipWidth (const TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-
return infoPtr->nMaxTipWidth;
}
static LRESULT
-TOOLTIPS_GetTextA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_GetTextA (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
+ WCHAR buffer[INFOTIPSIZE];
INT nTool;
if (lpToolInfo == NULL)
@@ -1552,18 +1521,18 @@ TOOLTIPS_GetTextA (HWND hwnd, WPARAM wParam, LPARAM lParam)
what size buffer it requires nor a way to specify how long the
one it supplies is. We'll assume it's up to INFOTIPSIZE */
- WideCharToMultiByte(CP_ACP, 0, infoPtr->tools[nTool].lpszText, -1,
- lpToolInfo->lpszText, INFOTIPSIZE, NULL, NULL);
+ buffer[0] = '\0';
+ TOOLTIPS_GetTipText(infoPtr, nTool, buffer);
+ WideCharToMultiByte(CP_ACP, 0, buffer, -1, lpToolInfo->lpszText,
+ INFOTIPSIZE, NULL, NULL);
return 0;
}
static LRESULT
-TOOLTIPS_GetTextW (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_GetTextW (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam;
INT nTool;
if (lpToolInfo == NULL)
@@ -1577,41 +1546,37 @@ TOOLTIPS_GetTextW (HWND hwnd, WPARAM wParam, LPARAM lParam)
if (infoPtr->tools[nTool].lpszText == NULL)
return 0;
- strcpyW (lpToolInfo->lpszText, infoPtr->tools[nTool].lpszText);
+ lpToolInfo->lpszText[0] = '\0';
+ TOOLTIPS_GetTipText(infoPtr, nTool, lpToolInfo->lpszText);
return 0;
}
static inline LRESULT
-TOOLTIPS_GetTipBkColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_GetTipBkColor (const TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
return infoPtr->clrBk;
}
static inline LRESULT
-TOOLTIPS_GetTipTextColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_GetTipTextColor (const TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
return infoPtr->clrText;
}
static inline LRESULT
-TOOLTIPS_GetToolCount (HWND hwnd)
+TOOLTIPS_GetToolCount (const TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
return infoPtr->uNumTools;
}
static LRESULT
-TOOLTIPS_GetToolInfoA (HWND hwnd, LPARAM lParam)
+TOOLTIPS_GetToolInfoA (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
@@ -1645,10 +1610,8 @@ TOOLTIPS_GetToolInfoA (HWND hwnd, LPARAM lParam)
static LRESULT
-TOOLTIPS_GetToolInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_GetToolInfoW (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
@@ -1682,10 +1645,8 @@ TOOLTIPS_GetToolInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_HitTestA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_HitTestA (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOA lptthit)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTHITTESTINFOA lptthit = (LPTTHITTESTINFOA)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
@@ -1717,10 +1678,8 @@ TOOLTIPS_HitTestA (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_HitTestW (HWND hwnd, LPARAM lParam)
+TOOLTIPS_HitTestW (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOW lptthit)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTHITTESTINFOW lptthit = (LPTTHITTESTINFOW)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
@@ -1752,10 +1711,8 @@ TOOLTIPS_HitTestW (HWND hwnd, LPARAM lParam)
static LRESULT
-TOOLTIPS_NewToolRectA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_NewToolRectA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpti)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOA lpti = (LPTTTOOLINFOA)lParam;
INT nTool;
if (lpti == NULL)
@@ -1776,10 +1733,8 @@ TOOLTIPS_NewToolRectA (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_NewToolRectW (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_NewToolRectW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpti)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOW lpti = (LPTTTOOLINFOW)lParam;
INT nTool;
if (lpti == NULL)
@@ -1800,24 +1755,21 @@ TOOLTIPS_NewToolRectW (HWND hwnd, WPARAM wParam, LPARAM lParam)
static inline LRESULT
-TOOLTIPS_Pop (HWND hwnd)
+TOOLTIPS_Pop (TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- TOOLTIPS_Hide (hwnd, infoPtr);
+ TOOLTIPS_Hide (infoPtr);
return 0;
}
static LRESULT
-TOOLTIPS_RelayEvent (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_RelayEvent (TOOLTIPS_INFO *infoPtr, LPMSG lpMsg)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPMSG lpMsg = (LPMSG)lParam;
POINT pt;
INT nOldTool;
- if (lParam == 0) {
+ if (!lpMsg) {
ERR("lpMsg == NULL!\n");
return 0;
}
@@ -1829,7 +1781,7 @@ TOOLTIPS_RelayEvent (HWND hwnd, WPARAM wParam, LPARAM lParam)
case WM_MBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
- TOOLTIPS_Hide (hwnd, infoPtr);
+ TOOLTIPS_Hide (infoPtr);
break;
case WM_MOUSEMOVE:
@@ -1838,34 +1790,34 @@ TOOLTIPS_RelayEvent (HWND hwnd, WPARAM wParam, LPARAM lParam)
nOldTool = infoPtr->nTool;
infoPtr->nTool = TOOLTIPS_GetToolFromPoint(infoPtr, lpMsg->hwnd,
&pt);
- TRACE("tool (%p) %d %d %d\n", hwnd, nOldTool,
+ TRACE("tool (%p) %d %d %d\n", infoPtr->hwndSelf, nOldTool,
infoPtr->nTool, infoPtr->nCurrentTool);
- TRACE("WM_MOUSEMOVE (%p %d %d)\n", hwnd, pt.x, pt.y);
+ TRACE("WM_MOUSEMOVE (%p %d %d)\n", infoPtr->hwndSelf, pt.x, pt.y);
if (infoPtr->nTool != nOldTool) {
if(infoPtr->nTool == -1) { /* Moved out of all tools */
- TOOLTIPS_Hide(hwnd, infoPtr);
- KillTimer(hwnd, ID_TIMERLEAVE);
+ TOOLTIPS_Hide(infoPtr);
+ KillTimer(infoPtr->hwndSelf, ID_TIMERLEAVE);
} else if (nOldTool == -1) { /* Moved from outside */
if(infoPtr->bActive) {
- SetTimer(hwnd, ID_TIMERSHOW, infoPtr->nInitialTime, 0);
+ SetTimer(infoPtr->hwndSelf, ID_TIMERSHOW, infoPtr->nInitialTime, 0);
TRACE("timer 1 started!\n");
}
} else { /* Moved from one to another */
- TOOLTIPS_Hide (hwnd, infoPtr);
- KillTimer(hwnd, ID_TIMERLEAVE);
+ TOOLTIPS_Hide (infoPtr);
+ KillTimer(infoPtr->hwndSelf, ID_TIMERLEAVE);
if(infoPtr->bActive) {
- SetTimer (hwnd, ID_TIMERSHOW, infoPtr->nReshowTime, 0);
+ SetTimer (infoPtr->hwndSelf, ID_TIMERSHOW, infoPtr->nReshowTime, 0);
TRACE("timer 1 started!\n");
}
}
} else if(infoPtr->nCurrentTool != -1) { /* restart autopop */
- KillTimer(hwnd, ID_TIMERPOP);
- SetTimer(hwnd, ID_TIMERPOP, infoPtr->nAutoPopTime, 0);
+ KillTimer(infoPtr->hwndSelf, ID_TIMERPOP);
+ SetTimer(infoPtr->hwndSelf, ID_TIMERPOP, infoPtr->nAutoPopTime, 0);
TRACE("timer 2 restarted\n");
} else if(infoPtr->nTool != -1 && infoPtr->bActive) {
/* previous show attempt didn't result in tooltip so try again */
- SetTimer(hwnd, ID_TIMERSHOW, infoPtr->nInitialTime, 0);
+ SetTimer(infoPtr->hwndSelf, ID_TIMERSHOW, infoPtr->nInitialTime, 0);
TRACE("timer 1 started!\n");
}
break;
@@ -1876,12 +1828,9 @@ TOOLTIPS_RelayEvent (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_SetDelayTime (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_SetDelayTime (TOOLTIPS_INFO *infoPtr, DWORD duration, INT nTime)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- INT nTime = (INT)LOWORD(lParam);
-
- switch (wParam) {
+ switch (duration) {
case TTDT_AUTOMATIC:
if (nTime <= 0)
nTime = GetDoubleClickTime();
@@ -1909,7 +1858,7 @@ TOOLTIPS_SetDelayTime (HWND hwnd, WPARAM wParam, LPARAM lParam)
break;
default:
- WARN("Invalid wParam %lx\n", wParam);
+ WARN("Invalid duration flag %x\n", duration);
break;
}
@@ -1918,11 +1867,8 @@ TOOLTIPS_SetDelayTime (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_SetMargin (HWND hwnd, LPARAM lParam)
+TOOLTIPS_SetMargin (TOOLTIPS_INFO *infoPtr, const RECT *lpRect)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPRECT lpRect = (LPRECT)lParam;
-
infoPtr->rcMargin.left = lpRect->left;
infoPtr->rcMargin.right = lpRect->right;
infoPtr->rcMargin.bottom = lpRect->bottom;
@@ -1933,48 +1879,40 @@ TOOLTIPS_SetMargin (HWND hwnd, LPARAM lParam)
static inline LRESULT
-TOOLTIPS_SetMaxTipWidth (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_SetMaxTipWidth (TOOLTIPS_INFO *infoPtr, INT MaxWidth)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
INT nTemp = infoPtr->nMaxTipWidth;
- infoPtr->nMaxTipWidth = (INT)lParam;
+ infoPtr->nMaxTipWidth = MaxWidth;
return nTemp;
}
static inline LRESULT
-TOOLTIPS_SetTipBkColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_SetTipBkColor (TOOLTIPS_INFO *infoPtr, COLORREF clrBk)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-
- infoPtr->clrBk = (COLORREF)wParam;
+ infoPtr->clrBk = clrBk;
return 0;
}
static inline LRESULT
-TOOLTIPS_SetTipTextColor (HWND hwnd, WPARAM wParam)
+TOOLTIPS_SetTipTextColor (TOOLTIPS_INFO *infoPtr, COLORREF clrText)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-
- infoPtr->clrText = (COLORREF)wParam;
+ infoPtr->clrText = clrText;
return 0;
}
static LRESULT
-TOOLTIPS_SetTitleA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_SetTitleA (TOOLTIPS_INFO *infoPtr, UINT_PTR uTitleIcon, LPCSTR pszTitle)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPCSTR pszTitle = (LPCSTR)lParam;
- UINT_PTR uTitleIcon = wParam;
UINT size;
- TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, debugstr_a(pszTitle),
+ TRACE("hwnd = %p, title = %s, icon = %p\n", infoPtr->hwndSelf, debugstr_a(pszTitle),
(void*)uTitleIcon);
Free(infoPtr->pszTitle);
@@ -1993,21 +1931,18 @@ TOOLTIPS_SetTitleA (HWND hwnd, WPARAM wParam, LPARAM lParam)
if (uTitleIcon <= TTI_ERROR)
infoPtr->hTitleIcon = hTooltipIcons[uTitleIcon];
else
- infoPtr->hTitleIcon = CopyIcon((HICON)wParam);
+ infoPtr->hTitleIcon = CopyIcon((HICON)uTitleIcon);
return TRUE;
}
static LRESULT
-TOOLTIPS_SetTitleW (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_SetTitleW (TOOLTIPS_INFO *infoPtr, UINT_PTR uTitleIcon, LPCWSTR pszTitle)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPCWSTR pszTitle = (LPCWSTR)lParam;
- UINT_PTR uTitleIcon = wParam;
UINT size;
- TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, debugstr_w(pszTitle),
+ TRACE("hwnd = %p, title = %s, icon = %p\n", infoPtr->hwndSelf, debugstr_w(pszTitle),
(void*)uTitleIcon);
Free(infoPtr->pszTitle);
@@ -2026,7 +1961,7 @@ TOOLTIPS_SetTitleW (HWND hwnd, WPARAM wParam, LPARAM lParam)
if (uTitleIcon <= TTI_ERROR)
infoPtr->hTitleIcon = hTooltipIcons[uTitleIcon];
else
- infoPtr->hTitleIcon = CopyIcon((HICON)wParam);
+ infoPtr->hTitleIcon = CopyIcon((HICON)uTitleIcon);
TRACE("icon = %p\n", infoPtr->hTitleIcon);
@@ -2035,10 +1970,8 @@ TOOLTIPS_SetTitleW (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_SetToolInfoA (HWND hwnd, LPARAM lParam)
+TOOLTIPS_SetToolInfoA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
@@ -2093,10 +2026,8 @@ TOOLTIPS_SetToolInfoA (HWND hwnd, LPARAM lParam)
static LRESULT
-TOOLTIPS_SetToolInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_SetToolInfoW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
@@ -2146,12 +2077,12 @@ TOOLTIPS_SetToolInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam)
if (infoPtr->nCurrentTool == nTool)
{
- TOOLTIPS_GetTipText (hwnd, infoPtr, infoPtr->nCurrentTool);
+ TOOLTIPS_GetTipText (infoPtr, infoPtr->nCurrentTool, infoPtr->szTipText);
if (infoPtr->szTipText[0] == 0)
- TOOLTIPS_Hide(hwnd, infoPtr);
+ TOOLTIPS_Hide(infoPtr);
else
- TOOLTIPS_Show (hwnd, infoPtr, FALSE);
+ TOOLTIPS_Show (infoPtr, FALSE);
}
return 0;
@@ -2159,12 +2090,9 @@ TOOLTIPS_SetToolInfoW (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_TrackActivate (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_TrackActivate (TOOLTIPS_INFO *infoPtr, BOOL track_activate, const TTTOOLINFOA *lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-
- if ((BOOL)wParam) {
- LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
+ if (track_activate) {
if (lpToolInfo == NULL)
return 0;
@@ -2176,12 +2104,12 @@ TOOLTIPS_TrackActivate (HWND hwnd, WPARAM wParam, LPARAM lParam)
if (infoPtr->nTrackTool != -1) {
TRACE("activated!\n");
infoPtr->bTrackActive = TRUE;
- TOOLTIPS_TrackShow (hwnd, infoPtr);
+ TOOLTIPS_TrackShow (infoPtr);
}
}
else {
/* deactivate */
- TOOLTIPS_TrackHide (hwnd, infoPtr);
+ TOOLTIPS_TrackHide (infoPtr);
infoPtr->bTrackActive = FALSE;
infoPtr->nTrackTool = -1;
@@ -2194,18 +2122,16 @@ TOOLTIPS_TrackActivate (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_TrackPosition (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_TrackPosition (TOOLTIPS_INFO *infoPtr, LPARAM coord)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-
- infoPtr->xTrackPos = (INT)LOWORD(lParam);
- infoPtr->yTrackPos = (INT)HIWORD(lParam);
+ infoPtr->xTrackPos = (INT)LOWORD(coord);
+ infoPtr->yTrackPos = (INT)HIWORD(coord);
if (infoPtr->bTrackActive) {
TRACE("[%d %d]\n",
infoPtr->xTrackPos, infoPtr->yTrackPos);
- TOOLTIPS_TrackShow (hwnd, infoPtr);
+ TOOLTIPS_TrackShow (infoPtr);
}
return 0;
@@ -2213,22 +2139,18 @@ TOOLTIPS_TrackPosition (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_Update (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_Update (TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-
if (infoPtr->nCurrentTool != -1)
- UpdateWindow (hwnd);
+ UpdateWindow (infoPtr->hwndSelf);
return 0;
}
static LRESULT
-TOOLTIPS_UpdateTipTextA (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_UpdateTipTextA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
@@ -2273,19 +2195,17 @@ TOOLTIPS_UpdateTipTextA (HWND hwnd, WPARAM wParam, LPARAM lParam)
if(infoPtr->nCurrentTool == -1) return 0;
/* force repaint */
if (infoPtr->bActive)
- TOOLTIPS_Show (hwnd, infoPtr, FALSE);
+ TOOLTIPS_Show (infoPtr, FALSE);
else if (infoPtr->bTrackActive)
- TOOLTIPS_TrackShow (hwnd, infoPtr);
+ TOOLTIPS_TrackShow (infoPtr);
return 0;
}
static LRESULT
-TOOLTIPS_UpdateTipTextW (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_UpdateTipTextW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
- LPTTTOOLINFOW lpToolInfo = (LPTTTOOLINFOW)lParam;
TTTOOL_INFO *toolPtr;
INT nTool;
@@ -2329,9 +2249,9 @@ TOOLTIPS_UpdateTipTextW (HWND hwnd, WPARAM wParam, LPARAM lParam)
if(infoPtr->nCurrentTool == -1) return 0;
/* force repaint */
if (infoPtr->bActive)
- TOOLTIPS_Show (hwnd, infoPtr, FALSE);
+ TOOLTIPS_Show (infoPtr, FALSE);
else if (infoPtr->bTrackActive)
- TOOLTIPS_Show (hwnd, infoPtr, TRUE);
+ TOOLTIPS_Show (infoPtr, TRUE);
return 0;
}
@@ -2362,11 +2282,12 @@ TOOLTIPS_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
infoPtr->nTool = -1;
infoPtr->nCurrentTool = -1;
infoPtr->nTrackTool = -1;
+ infoPtr->hwndSelf = hwnd;
/* initialize colours and fonts */
TOOLTIPS_InitSystemSettings(infoPtr);
- TOOLTIPS_SetDelayTime(hwnd, TTDT_AUTOMATIC, 0L);
+ TOOLTIPS_SetDelayTime(infoPtr, TTDT_AUTOMATIC, 0);
SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE);
@@ -2375,9 +2296,8 @@ TOOLTIPS_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
static LRESULT
-TOOLTIPS_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_Destroy (TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
TTTOOL_INFO *toolPtr;
UINT i;
@@ -2418,34 +2338,31 @@ TOOLTIPS_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
DeleteObject (infoPtr->hTitleFont);
/* free tool tips info data */
+ SetWindowLongPtrW(infoPtr->hwndSelf, 0, 0);
Free (infoPtr);
- SetWindowLongPtrW(hwnd, 0, 0);
+
return 0;
}
-static LRESULT
-TOOLTIPS_GetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
+static inline LRESULT
+TOOLTIPS_GetFont (const TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-
return (LRESULT)infoPtr->hFont;
}
static LRESULT
-TOOLTIPS_MouseMessage (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_MouseMessage (TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-
- TOOLTIPS_Hide (hwnd, infoPtr);
+ TOOLTIPS_Hide (infoPtr);
return 0;
}
static LRESULT
-TOOLTIPS_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_NCCreate (HWND hwnd, const CREATESTRUCTW *lpcs)
{
DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE);
DWORD dwExStyle = GetWindowLongW (hwnd, GWL_EXSTYLE);
@@ -2467,9 +2384,8 @@ TOOLTIPS_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_NCHitTest (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_NCHitTest (const TOOLTIPS_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
INT nTool = (infoPtr->bTrackActive) ? infoPtr->nTrackTool : infoPtr->nTool;
TRACE(" nTool=%d\n", nTool);
@@ -2481,7 +2397,7 @@ TOOLTIPS_NCHitTest (HWND hwnd, WPARAM wParam, LPARAM lParam)
}
}
- return DefWindowProcW (hwnd, WM_NCHITTEST, wParam, lParam);
+ return DefWindowProcW (infoPtr->hwndSelf, WM_NCHITTEST, wParam, lParam);
}
@@ -2520,26 +2436,25 @@ TOOLTIPS_NotifyFormat (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_Paint (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_Paint (const TOOLTIPS_INFO *infoPtr, HDC hDC)
{
HDC hdc;
PAINTSTRUCT ps;
- hdc = (wParam == 0) ? BeginPaint (hwnd, &ps) : (HDC)wParam;
- TOOLTIPS_Refresh (hwnd, hdc);
- if (!wParam)
- EndPaint (hwnd, &ps);
+ hdc = (hDC == NULL) ? BeginPaint (infoPtr->hwndSelf, &ps) : hDC;
+ TOOLTIPS_Refresh (infoPtr, hdc);
+ if (!hDC)
+ EndPaint (infoPtr->hwndSelf, &ps);
return 0;
}
static LRESULT
-TOOLTIPS_SetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_SetFont (TOOLTIPS_INFO *infoPtr, HFONT hFont, BOOL redraw)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
LOGFONTW lf;
- if(!GetObjectW((HFONT)wParam, sizeof(lf), &lf))
+ if(!GetObjectW(hFont, sizeof(lf), &lf))
return 0;
DeleteObject (infoPtr->hFont);
@@ -2549,7 +2464,7 @@ TOOLTIPS_SetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
lf.lfWeight = FW_BOLD;
infoPtr->hTitleFont = CreateFontIndirectW(&lf);
- if ((LOWORD(lParam)) & (infoPtr->nCurrentTool != -1)) {
+ if (redraw & (infoPtr->nCurrentTool != -1)) {
FIXME("full redraw needed!\n");
}
@@ -2561,15 +2476,12 @@ TOOLTIPS_SetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
*
* This function is called when the tooltip receive a
* WM_GETTEXTLENGTH message.
- * wParam : not used
- * lParam : not used
*
* returns the length, in characters, of the tip text
*/
-static LRESULT
-TOOLTIPS_GetTextLength(HWND hwnd, WPARAM wParam, LPARAM lParam)
+static inline LRESULT
+TOOLTIPS_GetTextLength(const TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
return strlenW(infoPtr->szTipText);
}
@@ -2585,57 +2497,54 @@ TOOLTIPS_GetTextLength(HWND hwnd, WPARAM wParam, LPARAM lParam)
* returns the number of characters copied
*/
static LRESULT
-TOOLTIPS_OnWMGetText (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_OnWMGetText (const TOOLTIPS_INFO *infoPtr, WPARAM size, LPWSTR pszText)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
LRESULT res;
- LPWSTR pszText = (LPWSTR)lParam;
- if(!infoPtr->szTipText || !wParam)
+ if(!infoPtr->szTipText || !size)
return 0;
- res = min(strlenW(infoPtr->szTipText)+1, wParam);
+ res = min(strlenW(infoPtr->szTipText)+1, size);
memcpy(pszText, infoPtr->szTipText, res*sizeof(WCHAR));
pszText[res-1] = '\0';
return res-1;
}
static LRESULT
-TOOLTIPS_Timer (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_Timer (TOOLTIPS_INFO *infoPtr, INT iTimer)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
INT nOldTool;
- TRACE("timer %ld (%p) expired!\n", wParam, hwnd);
+ TRACE("timer %d (%p) expired!\n", iTimer, infoPtr->hwndSelf);
- switch (wParam) {
+ switch (iTimer) {
case ID_TIMERSHOW:
- KillTimer (hwnd, ID_TIMERSHOW);
+ KillTimer (infoPtr->hwndSelf, ID_TIMERSHOW);
nOldTool = infoPtr->nTool;
- if ((infoPtr->nTool = TOOLTIPS_CheckTool (hwnd, TRUE)) == nOldTool)
- TOOLTIPS_Show (hwnd, infoPtr, FALSE);
+ if ((infoPtr->nTool = TOOLTIPS_CheckTool (infoPtr, TRUE)) == nOldTool)
+ TOOLTIPS_Show (infoPtr, FALSE);
break;
case ID_TIMERPOP:
- TOOLTIPS_Hide (hwnd, infoPtr);
+ TOOLTIPS_Hide (infoPtr);
break;
case ID_TIMERLEAVE:
nOldTool = infoPtr->nTool;
- infoPtr->nTool = TOOLTIPS_CheckTool (hwnd, FALSE);
- TRACE("tool (%p) %d %d %d\n", hwnd, nOldTool,
+ infoPtr->nTool = TOOLTIPS_CheckTool (infoPtr, FALSE);
+ TRACE("tool (%p) %d %d %d\n", infoPtr->hwndSelf, nOldTool,
infoPtr->nTool, infoPtr->nCurrentTool);
if (infoPtr->nTool != nOldTool) {
if(infoPtr->nTool == -1) { /* Moved out of all tools */
- TOOLTIPS_Hide(hwnd, infoPtr);
- KillTimer(hwnd, ID_TIMERLEAVE);
+ TOOLTIPS_Hide(infoPtr);
+ KillTimer(infoPtr->hwndSelf, ID_TIMERLEAVE);
} else if (nOldTool == -1) { /* Moved from outside */
ERR("How did this happen?\n");
} else { /* Moved from one to another */
- TOOLTIPS_Hide (hwnd, infoPtr);
- KillTimer(hwnd, ID_TIMERLEAVE);
+ TOOLTIPS_Hide (infoPtr);
+ KillTimer(infoPtr->hwndSelf, ID_TIMERLEAVE);
if(infoPtr->bActive) {
- SetTimer (hwnd, ID_TIMERSHOW, infoPtr->nReshowTime, 0);
+ SetTimer (infoPtr->hwndSelf, ID_TIMERSHOW, infoPtr->nReshowTime, 0);
TRACE("timer 1 started!\n");
}
}
@@ -2643,7 +2552,7 @@ TOOLTIPS_Timer (HWND hwnd, WPARAM wParam, LPARAM lParam)
break;
default:
- ERR("Unknown timer id %ld\n", wParam);
+ ERR("Unknown timer id %d\n", iTimer);
break;
}
return 0;
@@ -2651,10 +2560,8 @@ TOOLTIPS_Timer (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLTIPS_WinIniChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_WinIniChange (TOOLTIPS_INFO *infoPtr)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
-
TOOLTIPS_InitSystemSettings (infoPtr);
return 0;
@@ -2664,6 +2571,7 @@ TOOLTIPS_WinIniChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
static LRESULT CALLBACK
TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uID, DWORD_PTR dwRef)
{
+ TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr ((HWND)dwRef);
MSG msg;
switch(uMsg) {
@@ -2678,7 +2586,7 @@ TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_
msg.message = uMsg;
msg.wParam = wParam;
msg.lParam = lParam;
- TOOLTIPS_RelayEvent((HWND)dwRef, 0, (LPARAM)&msg);
+ TOOLTIPS_RelayEvent(infoPtr, &msg);
break;
default:
@@ -2691,130 +2599,132 @@ TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_
static LRESULT CALLBACK
TOOLTIPS_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
+ TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
+
TRACE("hwnd=%p msg=%x wparam=%lx lParam=%lx\n", hwnd, uMsg, wParam, lParam);
- if (!TOOLTIPS_GetInfoPtr(hwnd) && (uMsg != WM_CREATE) && (uMsg != WM_NCCREATE))
+ if (!infoPtr && (uMsg != WM_CREATE) && (uMsg != WM_NCCREATE))
return DefWindowProcW (hwnd, uMsg, wParam, lParam);
switch (uMsg)
{
case TTM_ACTIVATE:
- return TOOLTIPS_Activate (hwnd, wParam);
+ return TOOLTIPS_Activate (infoPtr, (BOOL)wParam);
case TTM_ADDTOOLA:
- return TOOLTIPS_AddToolA (hwnd, lParam);
+ return TOOLTIPS_AddToolA (infoPtr, (LPTTTOOLINFOA)lParam);
case TTM_ADDTOOLW:
- return TOOLTIPS_AddToolW (hwnd, lParam);
+ return TOOLTIPS_AddToolW (infoPtr, (LPTTTOOLINFOW)lParam);
case TTM_DELTOOLA:
- return TOOLTIPS_DelToolA (hwnd, lParam);
+ return TOOLTIPS_DelToolA (infoPtr, (LPTOOLINFOA)lParam);
case TTM_DELTOOLW:
- return TOOLTIPS_DelToolW (hwnd, lParam);
+ return TOOLTIPS_DelToolW (infoPtr, (LPTOOLINFOW)lParam);
case TTM_ENUMTOOLSA:
- return TOOLTIPS_EnumToolsA (hwnd, wParam, lParam);
+ return TOOLTIPS_EnumToolsA (infoPtr, (UINT)wParam, (LPTTTOOLINFOA)lParam);
case TTM_ENUMTOOLSW:
- return TOOLTIPS_EnumToolsW (hwnd, wParam, lParam);
+ return TOOLTIPS_EnumToolsW (infoPtr, (UINT)wParam, (LPTTTOOLINFOW)lParam);
case TTM_GETBUBBLESIZE:
- return TOOLTIPS_GetBubbleSize (hwnd, wParam, lParam);
+ return TOOLTIPS_GetBubbleSize (infoPtr, (LPTTTOOLINFOW)lParam);
case TTM_GETCURRENTTOOLA:
- return TOOLTIPS_GetCurrentToolA (hwnd, wParam, lParam);
+ return TOOLTIPS_GetCurrentToolA (infoPtr, (LPTTTOOLINFOA)lParam);
case TTM_GETCURRENTTOOLW:
- return TOOLTIPS_GetCurrentToolW (hwnd, lParam);
+ return TOOLTIPS_GetCurrentToolW (infoPtr, (LPTTTOOLINFOW)lParam);
case TTM_GETDELAYTIME:
- return TOOLTIPS_GetDelayTime (hwnd, wParam);
+ return TOOLTIPS_GetDelayTime (infoPtr, (DWORD)wParam);
case TTM_GETMARGIN:
- return TOOLTIPS_GetMargin (hwnd, lParam);
+ return TOOLTIPS_GetMargin (infoPtr, (LPRECT)lParam);
case TTM_GETMAXTIPWIDTH:
- return TOOLTIPS_GetMaxTipWidth (hwnd, wParam, lParam);
+ return TOOLTIPS_GetMaxTipWidth (infoPtr);
case TTM_GETTEXTA:
- return TOOLTIPS_GetTextA (hwnd, wParam, lParam);
+ return TOOLTIPS_GetTextA (infoPtr, (LPTTTOOLINFOA)lParam);
case TTM_GETTEXTW:
- return TOOLTIPS_GetTextW (hwnd, wParam, lParam);
+ return TOOLTIPS_GetTextW (infoPtr, (LPTTTOOLINFOW)lParam);
case TTM_GETTIPBKCOLOR:
- return TOOLTIPS_GetTipBkColor (hwnd, wParam, lParam);
+ return TOOLTIPS_GetTipBkColor (infoPtr);
case TTM_GETTIPTEXTCOLOR:
- return TOOLTIPS_GetTipTextColor (hwnd, wParam, lParam);
+ return TOOLTIPS_GetTipTextColor (infoPtr);
case TTM_GETTOOLCOUNT:
- return TOOLTIPS_GetToolCount (hwnd);
+ return TOOLTIPS_GetToolCount (infoPtr);
case TTM_GETTOOLINFOA:
- return TOOLTIPS_GetToolInfoA (hwnd, lParam);
+ return TOOLTIPS_GetToolInfoA (infoPtr, (LPTTTOOLINFOA)lParam);
case TTM_GETTOOLINFOW:
- return TOOLTIPS_GetToolInfoW (hwnd, wParam, lParam);
+ return TOOLTIPS_GetToolInfoW (infoPtr, (LPTTTOOLINFOW)lParam);
case TTM_HITTESTA:
- return TOOLTIPS_HitTestA (hwnd, wParam, lParam);
+ return TOOLTIPS_HitTestA (infoPtr, (LPTTHITTESTINFOA)lParam);
case TTM_HITTESTW:
- return TOOLTIPS_HitTestW (hwnd, lParam);
+ return TOOLTIPS_HitTestW (infoPtr, (LPTTHITTESTINFOW)lParam);
case TTM_NEWTOOLRECTA:
- return TOOLTIPS_NewToolRectA (hwnd, wParam, lParam);
+ return TOOLTIPS_NewToolRectA (infoPtr, (LPTTTOOLINFOA)lParam);
case TTM_NEWTOOLRECTW:
- return TOOLTIPS_NewToolRectW (hwnd, wParam, lParam);
+ return TOOLTIPS_NewToolRectW (infoPtr, (LPTTTOOLINFOW)lParam);
case TTM_POP:
- return TOOLTIPS_Pop (hwnd);
+ return TOOLTIPS_Pop (infoPtr);
case TTM_RELAYEVENT:
- return TOOLTIPS_RelayEvent (hwnd, wParam, lParam);
+ return TOOLTIPS_RelayEvent (infoPtr, (LPMSG)lParam);
case TTM_SETDELAYTIME:
- return TOOLTIPS_SetDelayTime (hwnd, wParam, lParam);
+ return TOOLTIPS_SetDelayTime (infoPtr, (DWORD)wParam, (INT)LOWORD(lParam));
case TTM_SETMARGIN:
- return TOOLTIPS_SetMargin (hwnd, lParam);
+ return TOOLTIPS_SetMargin (infoPtr, (LPRECT)lParam);
case TTM_SETMAXTIPWIDTH:
- return TOOLTIPS_SetMaxTipWidth (hwnd, wParam, lParam);
+ return TOOLTIPS_SetMaxTipWidth (infoPtr, (INT)lParam);
case TTM_SETTIPBKCOLOR:
- return TOOLTIPS_SetTipBkColor (hwnd, wParam, lParam);
+ return TOOLTIPS_SetTipBkColor (infoPtr, (COLORREF)wParam);
case TTM_SETTIPTEXTCOLOR:
- return TOOLTIPS_SetTipTextColor (hwnd, wParam);
+ return TOOLTIPS_SetTipTextColor (infoPtr, (COLORREF)wParam);
case TTM_SETTITLEA:
- return TOOLTIPS_SetTitleA (hwnd, wParam, lParam);
+ return TOOLTIPS_SetTitleA (infoPtr, (UINT_PTR)wParam, (LPCSTR)lParam);
case TTM_SETTITLEW:
- return TOOLTIPS_SetTitleW (hwnd, wParam, lParam);
+ return TOOLTIPS_SetTitleW (infoPtr, (UINT_PTR)wParam, (LPCWSTR)lParam);
case TTM_SETTOOLINFOA:
- return TOOLTIPS_SetToolInfoA (hwnd, lParam);
+ return TOOLTIPS_SetToolInfoA (infoPtr, (LPTTTOOLINFOA)lParam);
case TTM_SETTOOLINFOW:
- return TOOLTIPS_SetToolInfoW (hwnd, wParam, lParam);
+ return TOOLTIPS_SetToolInfoW (infoPtr, (LPTTTOOLINFOW)lParam);
case TTM_TRACKACTIVATE:
- return TOOLTIPS_TrackActivate (hwnd, wParam, lParam);
+ return TOOLTIPS_TrackActivate (infoPtr, (BOOL)wParam, (LPTTTOOLINFOA)lParam);
case TTM_TRACKPOSITION:
- return TOOLTIPS_TrackPosition (hwnd, wParam, lParam);
+ return TOOLTIPS_TrackPosition (infoPtr, lParam);
case TTM_UPDATE:
- return TOOLTIPS_Update (hwnd, wParam, lParam);
+ return TOOLTIPS_Update (infoPtr);
case TTM_UPDATETIPTEXTA:
- return TOOLTIPS_UpdateTipTextA (hwnd, wParam, lParam);
+ return TOOLTIPS_UpdateTipTextA (infoPtr, (LPTTTOOLINFOA)lParam);
case TTM_UPDATETIPTEXTW:
- return TOOLTIPS_UpdateTipTextW (hwnd, wParam, lParam);
+ return TOOLTIPS_UpdateTipTextW (infoPtr, (LPTTTOOLINFOW)lParam);
case TTM_WINDOWFROMPOINT:
return TOOLTIPS_WindowFromPoint (hwnd, wParam, lParam);
@@ -2824,20 +2734,20 @@ TOOLTIPS_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLTIPS_Create (hwnd, (LPCREATESTRUCTW)lParam);
case WM_DESTROY:
- return TOOLTIPS_Destroy (hwnd, wParam, lParam);
+ return TOOLTIPS_Destroy (infoPtr);
case WM_ERASEBKGND:
/* we draw the background in WM_PAINT */
return 0;
case WM_GETFONT:
- return TOOLTIPS_GetFont (hwnd, wParam, lParam);
+ return TOOLTIPS_GetFont (infoPtr);
case WM_GETTEXT:
- return TOOLTIPS_OnWMGetText (hwnd, wParam, lParam);
+ return TOOLTIPS_OnWMGetText (infoPtr, wParam, (LPWSTR)lParam);
case WM_GETTEXTLENGTH:
- return TOOLTIPS_GetTextLength (hwnd, wParam, lParam);
+ return TOOLTIPS_GetTextLength (infoPtr);
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
@@ -2846,33 +2756,33 @@ TOOLTIPS_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_MOUSEMOVE:
- return TOOLTIPS_MouseMessage (hwnd, uMsg, wParam, lParam);
+ return TOOLTIPS_MouseMessage (infoPtr);
case WM_NCCREATE:
- return TOOLTIPS_NCCreate (hwnd, wParam, lParam);
+ return TOOLTIPS_NCCreate (hwnd, (LPCREATESTRUCTW)lParam);
case WM_NCHITTEST:
- return TOOLTIPS_NCHitTest (hwnd, wParam, lParam);
+ return TOOLTIPS_NCHitTest (infoPtr, wParam, lParam);
case WM_NOTIFYFORMAT:
- return TOOLTIPS_NotifyFormat (hwnd, wParam, lParam);
+ return TOOLTIPS_NotifyFormat (infoPtr, wParam, lParam);
case WM_PRINTCLIENT:
case WM_PAINT:
- return TOOLTIPS_Paint (hwnd, wParam, lParam);
+ return TOOLTIPS_Paint (infoPtr, (HDC)wParam);
case WM_SETFONT:
- return TOOLTIPS_SetFont (hwnd, wParam, lParam);
+ return TOOLTIPS_SetFont (infoPtr, (HFONT)wParam, LOWORD(lParam));
case WM_SYSCOLORCHANGE:
COMCTL32_RefreshSysColors();
return 0;
case WM_TIMER:
- return TOOLTIPS_Timer (hwnd, wParam, lParam);
+ return TOOLTIPS_Timer (infoPtr, (INT)wParam);
case WM_WININICHANGE:
- return TOOLTIPS_WinIniChange (hwnd, wParam, lParam);
+ return TOOLTIPS_WinIniChange (infoPtr);
default:
if ((uMsg >= WM_USER) && (uMsg < WM_APP) && !COMCTL32_IsReflectedMessage(uMsg))
diff --git a/reactos/dll/win32/comctl32/trackbar.c b/reactos/dll/win32/comctl32/trackbar.c
index 849ebcd627d..979be113b23 100644
--- a/reactos/dll/win32/comctl32/trackbar.c
+++ b/reactos/dll/win32/comctl32/trackbar.c
@@ -52,6 +52,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(trackbar);
typedef struct
{
HWND hwndSelf;
+ DWORD dwStyle;
LONG lRangeMin;
LONG lRangeMax;
LONG lLineSize;
@@ -137,7 +138,7 @@ static inline int notify (const TRACKBAR_INFO *infoPtr, INT code)
static BOOL
notify_with_scroll (const TRACKBAR_INFO *infoPtr, UINT code)
{
- BOOL bVert = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TBS_VERT;
+ BOOL bVert = infoPtr->dwStyle & TBS_VERT;
TRACE("%x\n", code);
@@ -151,8 +152,12 @@ static void TRACKBAR_RecalculateTics (TRACKBAR_INFO *infoPtr)
int tic;
unsigned nrTics, i;
- if (infoPtr->uTicFreq && infoPtr->lRangeMax >= infoPtr->lRangeMin)
- nrTics=(infoPtr->lRangeMax - infoPtr->lRangeMin)/infoPtr->uTicFreq;
+ if (infoPtr->uTicFreq && infoPtr->lRangeMax >= infoPtr->lRangeMin) {
+ nrTics=(infoPtr->lRangeMax - infoPtr->lRangeMin)/infoPtr->uTicFreq;
+ /* don't add extra tic if there's no remainder */
+ if ((infoPtr->lRangeMax - infoPtr->lRangeMin) % infoPtr->uTicFreq == 0)
+ nrTics--;
+ }
else {
Free (infoPtr->tics);
infoPtr->tics = NULL;
@@ -180,12 +185,12 @@ static void TRACKBAR_RecalculateTics (TRACKBAR_INFO *infoPtr)
(in range of trackbar) */
static inline LONG
-TRACKBAR_ConvertPlaceToPosition (const TRACKBAR_INFO *infoPtr, int place, int vertical)
+TRACKBAR_ConvertPlaceToPosition (const TRACKBAR_INFO *infoPtr, int place)
{
double range, width, pos, offsetthumb;
range = infoPtr->lRangeMax - infoPtr->lRangeMin;
- if (vertical) {
+ if (infoPtr->dwStyle & TBS_VERT) {
offsetthumb = (infoPtr->rcThumb.bottom - infoPtr->rcThumb.top)/2;
width = infoPtr->rcChannel.bottom - infoPtr->rcChannel.top - (offsetthumb * 2) - 1;
pos = (range*(place - infoPtr->rcChannel.top - offsetthumb)) / width;
@@ -209,10 +214,9 @@ TRACKBAR_ConvertPlaceToPosition (const TRACKBAR_INFO *infoPtr, int place, int ve
static LONG
TRACKBAR_GetAutoPageDirection (const TRACKBAR_INFO *infoPtr, POINT clickPoint)
{
- DWORD dwStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE);
RECT pageRect;
- if (dwStyle & TBS_VERT) {
+ if (infoPtr->dwStyle & TBS_VERT) {
pageRect.top = infoPtr->rcChannel.top;
pageRect.bottom = infoPtr->rcChannel.bottom;
pageRect.left = infoPtr->rcThumb.left;
@@ -227,10 +231,10 @@ TRACKBAR_GetAutoPageDirection (const TRACKBAR_INFO *infoPtr, POINT clickPoint)
if (PtInRect(&pageRect, clickPoint))
{
- int clickPlace = (dwStyle & TBS_VERT) ? clickPoint.y : clickPoint.x;
+ int clickPlace = (infoPtr->dwStyle & TBS_VERT) ? clickPoint.y : clickPoint.x;
+
+ LONG clickPos = TRACKBAR_ConvertPlaceToPosition(infoPtr, clickPlace);
- LONG clickPos = TRACKBAR_ConvertPlaceToPosition(infoPtr, clickPlace,
- dwStyle & TBS_VERT);
return clickPos - infoPtr->lPos;
}
@@ -281,7 +285,6 @@ static inline void TRACKBAR_LineDown(TRACKBAR_INFO *infoPtr)
static void
TRACKBAR_CalcChannel (TRACKBAR_INFO *infoPtr)
{
- DWORD dwStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE);
INT cyChannel, offsetthumb, offsetedge;
RECT lpRect, *channel = & infoPtr->rcChannel;
@@ -289,22 +292,22 @@ TRACKBAR_CalcChannel (TRACKBAR_INFO *infoPtr)
offsetthumb = infoPtr->uThumbLen / 4;
offsetedge = offsetthumb + 3;
- cyChannel = (dwStyle & TBS_ENABLESELRANGE) ? offsetthumb*3 : 4;
- if (dwStyle & TBS_VERT) {
+ cyChannel = (infoPtr->dwStyle & TBS_ENABLESELRANGE) ? offsetthumb*3 : 4;
+ if (infoPtr->dwStyle & TBS_VERT) {
channel->top = lpRect.top + offsetedge;
channel->bottom = lpRect.bottom - offsetedge;
- if (dwStyle & TBS_ENABLESELRANGE)
+ if (infoPtr->dwStyle & TBS_ENABLESELRANGE)
channel->left = lpRect.left + ((infoPtr->uThumbLen - cyChannel + 2) / 2);
else
channel->left = lpRect.left + (infoPtr->uThumbLen / 2) - 1;
- if (dwStyle & TBS_BOTH) {
- if (dwStyle & TBS_NOTICKS)
+ if (infoPtr->dwStyle & TBS_BOTH) {
+ if (infoPtr->dwStyle & TBS_NOTICKS)
channel->left += 1;
else
channel->left += 9;
}
- else if (dwStyle & TBS_TOP) {
- if (dwStyle & TBS_NOTICKS)
+ else if (infoPtr->dwStyle & TBS_TOP) {
+ if (infoPtr->dwStyle & TBS_NOTICKS)
channel->left += 2;
else
channel->left += 10;
@@ -313,18 +316,18 @@ TRACKBAR_CalcChannel (TRACKBAR_INFO *infoPtr)
} else {
channel->left = lpRect.left + offsetedge;
channel->right = lpRect.right - offsetedge;
- if (dwStyle & TBS_ENABLESELRANGE)
+ if (infoPtr->dwStyle & TBS_ENABLESELRANGE)
channel->top = lpRect.top + ((infoPtr->uThumbLen - cyChannel + 2) / 2);
else
channel->top = lpRect.top + (infoPtr->uThumbLen / 2) - 1;
- if (dwStyle & TBS_BOTH) {
- if (dwStyle & TBS_NOTICKS)
+ if (infoPtr->dwStyle & TBS_BOTH) {
+ if (infoPtr->dwStyle & TBS_NOTICKS)
channel->top += 1;
else
channel->top += 9;
}
- else if (dwStyle & TBS_TOP) {
- if (dwStyle & TBS_NOTICKS)
+ else if (infoPtr->dwStyle & TBS_TOP) {
+ if (infoPtr->dwStyle & TBS_NOTICKS)
channel->top += 2;
else
channel->top += 10;
@@ -337,7 +340,6 @@ static void
TRACKBAR_CalcThumb (const TRACKBAR_INFO *infoPtr, LONG lPos, RECT *thumb)
{
int range, width, height, thumbwidth;
- DWORD dwStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE);
RECT lpRect;
range = infoPtr->lRangeMax - infoPtr->lRangeMin;
@@ -346,11 +348,11 @@ TRACKBAR_CalcThumb (const TRACKBAR_INFO *infoPtr, LONG lPos, RECT *thumb)
if (!range) range = 1;
GetClientRect(infoPtr->hwndSelf, &lpRect);
- if (dwStyle & TBS_VERT)
+ if (infoPtr->dwStyle & TBS_VERT)
{
height = infoPtr->rcChannel.bottom - infoPtr->rcChannel.top - thumbwidth;
- if ((dwStyle & (TBS_BOTH | TBS_LEFT)) && !(dwStyle & TBS_NOTICKS))
+ if ((infoPtr->dwStyle & (TBS_BOTH | TBS_LEFT)) && !(infoPtr->dwStyle & TBS_NOTICKS))
thumb->left = 10;
else
thumb->left = 2;
@@ -366,7 +368,7 @@ TRACKBAR_CalcThumb (const TRACKBAR_INFO *infoPtr, LONG lPos, RECT *thumb)
thumb->left = infoPtr->rcChannel.left +
(width*(lPos - infoPtr->lRangeMin))/range;
thumb->right = thumb->left + thumbwidth;
- if ((dwStyle & (TBS_BOTH | TBS_TOP)) && !(dwStyle & TBS_NOTICKS))
+ if ((infoPtr->dwStyle & (TBS_BOTH | TBS_TOP)) && !(infoPtr->dwStyle & TBS_NOTICKS))
thumb->top = 10;
else
thumb->top = 2;
@@ -420,7 +422,7 @@ TRACKBAR_CalcSelection (TRACKBAR_INFO *infoPtr)
if (range <= 0) {
SetRectEmpty (selection);
} else {
- if (GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TBS_VERT) {
+ if (infoPtr->dwStyle & TBS_VERT) {
offsetthumb = (infoPtr->rcThumb.bottom - infoPtr->rcThumb.top)/2;
height = infoPtr->rcChannel.bottom - infoPtr->rcChannel.top - offsetthumb*2;
selection->top = infoPtr->rcChannel.top + offsetthumb +
@@ -467,7 +469,7 @@ TRACKBAR_AutoPage (TRACKBAR_INFO *infoPtr, POINT clickPoint)
/* Trackbar drawing code. I like my spaghetti done milanese. */
static void
-TRACKBAR_DrawChannel (const TRACKBAR_INFO *infoPtr, HDC hdc, DWORD dwStyle)
+TRACKBAR_DrawChannel (const TRACKBAR_INFO *infoPtr, HDC hdc)
{
RECT rcChannel = infoPtr->rcChannel;
HTHEME theme = GetWindowTheme (infoPtr->hwndSelf);
@@ -475,13 +477,13 @@ TRACKBAR_DrawChannel (const TRACKBAR_INFO *infoPtr, HDC hdc, DWORD dwStyle)
if (theme)
{
DrawThemeBackground (theme, hdc,
- (GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TBS_VERT) ?
+ (infoPtr->dwStyle & TBS_VERT) ?
TKP_TRACKVERT : TKP_TRACK, TKS_NORMAL, &rcChannel, 0);
}
else
{
DrawEdge (hdc, &rcChannel, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
- if (dwStyle & TBS_ENABLESELRANGE) { /* fill the channel */
+ if (infoPtr->dwStyle & TBS_ENABLESELRANGE) { /* fill the channel */
FillRect (hdc, &rcChannel, GetStockObject(WHITE_BRUSH));
if (TRACKBAR_HasSelection(infoPtr))
FillRect (hdc, &infoPtr->rcSelection, GetSysColorBrush(COLOR_HIGHLIGHT));
@@ -575,17 +577,17 @@ TRACKBAR_DrawTic (const TRACKBAR_INFO *infoPtr, HDC hdc, LONG ticPos, int flags)
}
static void
-TRACKBAR_DrawTics (const TRACKBAR_INFO *infoPtr, HDC hdc, DWORD dwStyle)
+TRACKBAR_DrawTics (const TRACKBAR_INFO *infoPtr, HDC hdc)
{
unsigned int i;
- int ticFlags = dwStyle & 0x0f;
+ int ticFlags = infoPtr->dwStyle & 0x0f;
LOGPEN ticPen = { PS_SOLID, {1, 0}, GetSysColor (COLOR_3DDKSHADOW) };
HPEN hOldPen, hTicPen;
HTHEME theme = GetWindowTheme (infoPtr->hwndSelf);
if (theme)
{
- int part = (dwStyle & TBS_VERT) ? TKP_TICSVERT : TKP_TICS;
+ int part = (infoPtr->dwStyle & TBS_VERT) ? TKP_TICSVERT : TKP_TICS;
GetThemeColor (theme, part, TSS_NORMAL, TMT_COLOR, &ticPen.lopnColor);
}
/* create the pen to draw the tics with */
@@ -599,7 +601,7 @@ TRACKBAR_DrawTics (const TRACKBAR_INFO *infoPtr, HDC hdc, DWORD dwStyle)
TRACKBAR_DrawTic (infoPtr, hdc, infoPtr->lRangeMin, ticFlags | TIC_EDGE);
TRACKBAR_DrawTic (infoPtr, hdc, infoPtr->lRangeMax, ticFlags | TIC_EDGE);
- if ((dwStyle & TBS_ENABLESELRANGE) && TRACKBAR_HasSelection(infoPtr)) {
+ if ((infoPtr->dwStyle & TBS_ENABLESELRANGE) && TRACKBAR_HasSelection(infoPtr)) {
TRACKBAR_DrawTic (infoPtr, hdc, infoPtr->lSelMin,
ticFlags | TIC_SELECTIONMARKMIN);
TRACKBAR_DrawTic (infoPtr, hdc, infoPtr->lSelMax,
@@ -614,7 +616,7 @@ TRACKBAR_DrawTics (const TRACKBAR_INFO *infoPtr, HDC hdc, DWORD dwStyle)
}
static void
-TRACKBAR_DrawThumb (const TRACKBAR_INFO *infoPtr, HDC hdc, DWORD dwStyle)
+TRACKBAR_DrawThumb (const TRACKBAR_INFO *infoPtr, HDC hdc)
{
HBRUSH oldbr;
HPEN oldpen;
@@ -630,14 +632,14 @@ TRACKBAR_DrawThumb (const TRACKBAR_INFO *infoPtr, HDC hdc, DWORD dwStyle)
{
int partId;
int stateId;
- if (dwStyle & TBS_BOTH)
- partId = (dwStyle & TBS_VERT) ? TKP_THUMBVERT : TKP_THUMB;
- else if (dwStyle & TBS_LEFT)
- partId = (dwStyle & TBS_VERT) ? TKP_THUMBLEFT : TKP_THUMBTOP;
+ if (infoPtr->dwStyle & TBS_BOTH)
+ partId = (infoPtr->dwStyle & TBS_VERT) ? TKP_THUMBVERT : TKP_THUMB;
+ else if (infoPtr->dwStyle & TBS_LEFT)
+ partId = (infoPtr->dwStyle & TBS_VERT) ? TKP_THUMBLEFT : TKP_THUMBTOP;
else
- partId = (dwStyle & TBS_VERT) ? TKP_THUMBRIGHT : TKP_THUMBBOTTOM;
+ partId = (infoPtr->dwStyle & TBS_VERT) ? TKP_THUMBRIGHT : TKP_THUMBBOTTOM;
- if (dwStyle & WS_DISABLED)
+ if (infoPtr->dwStyle & WS_DISABLED)
stateId = TUS_DISABLED;
else if (infoPtr->flags & TB_DRAG_MODE)
stateId = TUS_PRESSED;
@@ -655,7 +657,7 @@ TRACKBAR_DrawThumb (const TRACKBAR_INFO *infoPtr, HDC hdc, DWORD dwStyle)
oldbr = SelectObject (hdc, GetSysColorBrush(fillClr));
SetPolyFillMode (hdc, WINDING);
- if (dwStyle & TBS_BOTH)
+ if (infoPtr->dwStyle & TBS_BOTH)
{
points[0].x=thumb.right;
points[0].y=thumb.top;
@@ -672,10 +674,10 @@ TRACKBAR_DrawThumb (const TRACKBAR_INFO *infoPtr, HDC hdc, DWORD dwStyle)
}
else
{
- if (dwStyle & TBS_VERT)
+ if (infoPtr->dwStyle & TBS_VERT)
{
PointDepth = (thumb.bottom - thumb.top) / 2;
- if (dwStyle & TBS_LEFT)
+ if (infoPtr->dwStyle & TBS_LEFT)
{
points[0].x=thumb.right;
points[0].y=thumb.top;
@@ -710,7 +712,7 @@ TRACKBAR_DrawThumb (const TRACKBAR_INFO *infoPtr, HDC hdc, DWORD dwStyle)
else
{
PointDepth = (thumb.right - thumb.left) / 2;
- if (dwStyle & TBS_TOP)
+ if (infoPtr->dwStyle & TBS_TOP)
{
points[0].x=(thumb.right - thumb.left) / 2 + thumb.left + 1;
points[0].y=thumb.top;
@@ -774,7 +776,6 @@ TRACKBAR_ActivateToolTip (const TRACKBAR_INFO *infoPtr, BOOL fShow)
static void
TRACKBAR_UpdateToolTip (const TRACKBAR_INFO *infoPtr)
{
- DWORD dwStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE);
WCHAR buf[80];
static const WCHAR fmt[] = { '%', 'l', 'd', 0 };
TTTOOLINFOW ti;
@@ -795,7 +796,7 @@ TRACKBAR_UpdateToolTip (const TRACKBAR_INFO *infoPtr)
GetClientRect (infoPtr->hwndSelf, &rcClient);
size = SendMessageW (infoPtr->hwndToolTip, TTM_GETBUBBLESIZE, 0, (LPARAM)&ti);
- if (dwStyle & TBS_VERT) {
+ if (infoPtr->dwStyle & TBS_VERT) {
if (infoPtr->fLocation == TBTS_LEFT)
pt.x = 0 - LOWORD(size) - TOOLTIP_OFFSET;
else
@@ -818,7 +819,6 @@ TRACKBAR_UpdateToolTip (const TRACKBAR_INFO *infoPtr)
static void
TRACKBAR_Refresh (TRACKBAR_INFO *infoPtr, HDC hdcDst)
{
- DWORD dwStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE);
RECT rcClient;
HDC hdc;
HBITMAP hOldBmp = 0, hOffScreenBmp = 0;
@@ -885,14 +885,14 @@ TRACKBAR_Refresh (TRACKBAR_INFO *infoPtr, HDC hdcDst)
icdrf = notify_customdraw(infoPtr, &nmcd, CDDS_ITEMPREPAINT);
} else icdrf = CDRF_DODEFAULT;
if ( !(icdrf & CDRF_SKIPDEFAULT) ) {
- TRACKBAR_DrawChannel (infoPtr, hdc, dwStyle);
+ TRACKBAR_DrawChannel (infoPtr, hdc);
if (icdrf & CDRF_NOTIFYPOSTPAINT)
notify_customdraw(infoPtr, &nmcd, CDDS_ITEMPOSTPAINT);
}
/* draw tics */
- if (!(dwStyle & TBS_NOTICKS)) {
+ if (!(infoPtr->dwStyle & TBS_NOTICKS)) {
if (gcdrf & CDRF_NOTIFYITEMDRAW) {
nmcd.dwItemSpec = TBCD_TICS;
nmcd.uItemState = CDIS_DEFAULT;
@@ -900,14 +900,14 @@ TRACKBAR_Refresh (TRACKBAR_INFO *infoPtr, HDC hdcDst)
icdrf = notify_customdraw(infoPtr, &nmcd, CDDS_ITEMPREPAINT);
} else icdrf = CDRF_DODEFAULT;
if ( !(icdrf & CDRF_SKIPDEFAULT) ) {
- TRACKBAR_DrawTics (infoPtr, hdc, dwStyle);
+ TRACKBAR_DrawTics (infoPtr, hdc);
if (icdrf & CDRF_NOTIFYPOSTPAINT)
notify_customdraw(infoPtr, &nmcd, CDDS_ITEMPOSTPAINT);
}
}
/* draw thumb */
- if (!(dwStyle & TBS_NOTHUMB)) {
+ if (!(infoPtr->dwStyle & TBS_NOTHUMB)) {
if (gcdrf & CDRF_NOTIFYITEMDRAW) {
nmcd.dwItemSpec = TBCD_THUMB;
nmcd.uItemState = infoPtr->flags & TB_DRAG_MODE ? CDIS_HOT : CDIS_DEFAULT;
@@ -915,7 +915,7 @@ TRACKBAR_Refresh (TRACKBAR_INFO *infoPtr, HDC hdcDst)
icdrf = notify_customdraw(infoPtr, &nmcd, CDDS_ITEMPREPAINT);
} else icdrf = CDRF_DODEFAULT;
if ( !(icdrf & CDRF_SKIPDEFAULT) ) {
- TRACKBAR_DrawThumb(infoPtr, hdc, dwStyle);
+ TRACKBAR_DrawThumb(infoPtr, hdc);
if (icdrf & CDRF_NOTIFYPOSTPAINT)
notify_customdraw(infoPtr, &nmcd, CDDS_ITEMPOSTPAINT);
}
@@ -944,7 +944,6 @@ cleanup:
static void
TRACKBAR_AlignBuddies (const TRACKBAR_INFO *infoPtr)
{
- DWORD dwStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE);
HWND hwndParent = GetParent (infoPtr->hwndSelf);
RECT rcSelf, rcBuddy;
INT x, y;
@@ -957,7 +956,7 @@ TRACKBAR_AlignBuddies (const TRACKBAR_INFO *infoPtr)
GetWindowRect (infoPtr->hwndBuddyLA, &rcBuddy);
MapWindowPoints (HWND_DESKTOP, hwndParent, (LPPOINT)&rcBuddy, 2);
- if (dwStyle & TBS_VERT) {
+ if (infoPtr->dwStyle & TBS_VERT) {
x = (infoPtr->rcChannel.right + infoPtr->rcChannel.left) / 2 -
(rcBuddy.right - rcBuddy.left) / 2 + rcSelf.left;
y = rcSelf.top - (rcBuddy.bottom - rcBuddy.top);
@@ -978,7 +977,7 @@ TRACKBAR_AlignBuddies (const TRACKBAR_INFO *infoPtr)
GetWindowRect (infoPtr->hwndBuddyRB, &rcBuddy);
MapWindowPoints (HWND_DESKTOP, hwndParent, (LPPOINT)&rcBuddy, 2);
- if (dwStyle & TBS_VERT) {
+ if (infoPtr->dwStyle & TBS_VERT) {
x = (infoPtr->rcChannel.right + infoPtr->rcChannel.left) / 2 -
(rcBuddy.right - rcBuddy.left) / 2 + rcSelf.left;
y = rcSelf.bottom;
@@ -1039,13 +1038,9 @@ TRACKBAR_GetChannelRect (const TRACKBAR_INFO *infoPtr, LPRECT lprc)
static inline LONG
TRACKBAR_GetNumTics (const TRACKBAR_INFO *infoPtr)
{
- if (GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TBS_NOTICKS)
- return 0;
+ if (infoPtr->dwStyle & TBS_NOTICKS) return 0;
- if(infoPtr->uNumTics == 0)
- return 2;
- else
- return infoPtr->uNumTics + 1;
+ return infoPtr->uNumTics + 2;
}
@@ -1222,7 +1217,7 @@ TRACKBAR_SetRangeMin (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lMin)
static inline LRESULT
TRACKBAR_SetSel (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lSel)
{
- if (!(GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TBS_ENABLESELRANGE)){
+ if (!(infoPtr->dwStyle & TBS_ENABLESELRANGE)){
infoPtr->lSelMin = 0;
infoPtr->lSelMax = 0;
return 0;
@@ -1246,7 +1241,7 @@ TRACKBAR_SetSel (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lSel)
static inline LRESULT
TRACKBAR_SetSelEnd (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lEnd)
{
- if (!(GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TBS_ENABLESELRANGE)){
+ if (!(infoPtr->dwStyle & TBS_ENABLESELRANGE)){
infoPtr->lSelMax = 0;
return 0;
}
@@ -1266,7 +1261,7 @@ TRACKBAR_SetSelEnd (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lEnd)
static inline LRESULT
TRACKBAR_SetSelStart (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lStart)
{
- if (!(GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TBS_ENABLESELRANGE)){
+ if (!(infoPtr->dwStyle & TBS_ENABLESELRANGE)){
infoPtr->lSelMin = 0;
return 0;
}
@@ -1286,7 +1281,7 @@ TRACKBAR_SetSelStart (TRACKBAR_INFO *infoPtr, BOOL fRedraw, LONG lStart)
static inline LRESULT
TRACKBAR_SetThumbLength (TRACKBAR_INFO *infoPtr, UINT iLength)
{
- if (GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TBS_FIXEDLENGTH) {
+ if (infoPtr->dwStyle & TBS_FIXEDLENGTH) {
infoPtr->uThumbLen = iLength;
infoPtr->flags |= TB_THUMBSIZECHANGED;
InvalidateRect (infoPtr->hwndSelf, &infoPtr->rcThumb, FALSE);
@@ -1299,7 +1294,7 @@ TRACKBAR_SetThumbLength (TRACKBAR_INFO *infoPtr, UINT iLength)
static inline LRESULT
TRACKBAR_SetTic (TRACKBAR_INFO *infoPtr, LONG lPos)
{
- if (GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TBS_AUTOTICKS)
+ if (infoPtr->dwStyle & TBS_AUTOTICKS)
return FALSE;
if ((lPos < infoPtr->lRangeMin) || (lPos> infoPtr->lRangeMax))
@@ -1326,7 +1321,7 @@ TRACKBAR_SetTic (TRACKBAR_INFO *infoPtr, LONG lPos)
static inline LRESULT
TRACKBAR_SetTicFreq (TRACKBAR_INFO *infoPtr, WORD wFreq)
{
- if (GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE) & TBS_AUTOTICKS) {
+ if (infoPtr->dwStyle & TBS_AUTOTICKS) {
infoPtr->uTicFreq = wFreq;
TRACKBAR_RecalculateTics (infoPtr);
TRACKBAR_InvalidateAll(infoPtr);
@@ -1370,14 +1365,13 @@ TRACKBAR_SetUnicodeFormat (TRACKBAR_INFO *infoPtr, BOOL fUnicode)
static LRESULT
TRACKBAR_InitializeThumb (TRACKBAR_INFO *infoPtr)
{
- DWORD dwStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE);
RECT rect;
int clientWidth, clientMetric;
/* initial thumb length */
- clientMetric = (dwStyle & TBS_ENABLESELRANGE) ? 23 : 21;
+ clientMetric = (infoPtr->dwStyle & TBS_ENABLESELRANGE) ? 23 : 21;
GetClientRect(infoPtr->hwndSelf,&rect);
- if (dwStyle & TBS_VERT) {
+ if (infoPtr->dwStyle & TBS_VERT) {
clientWidth = rect.right - rect.left;
} else {
clientWidth = rect.bottom - rect.top;
@@ -1399,7 +1393,6 @@ static LRESULT
TRACKBAR_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
{
TRACKBAR_INFO *infoPtr;
- DWORD dwStyle;
infoPtr = Alloc (sizeof(TRACKBAR_INFO));
if (!infoPtr) return -1;
@@ -1407,6 +1400,7 @@ TRACKBAR_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
/* set default values */
infoPtr->hwndSelf = hwnd;
+ infoPtr->dwStyle = lpcs->style;
infoPtr->lRangeMin = 0;
infoPtr->lRangeMax = 100;
infoPtr->lLineSize = 1;
@@ -1422,10 +1416,8 @@ TRACKBAR_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
TRACKBAR_InitializeThumb (infoPtr);
- dwStyle = GetWindowLongW (hwnd, GWL_STYLE);
-
/* Create tooltip control */
- if (dwStyle & TBS_TOOLTIPS) {
+ if (infoPtr->dwStyle & TBS_TOOLTIPS) {
infoPtr->hwndToolTip =
CreateWindowExW (0, TOOLTIPS_CLASSW, NULL, WS_POPUP,
@@ -1575,6 +1567,16 @@ TRACKBAR_Size (TRACKBAR_INFO *infoPtr)
return 0;
}
+static LRESULT
+TRACKBAR_StyleChanged (TRACKBAR_INFO *infoPtr, WPARAM wStyleType,
+ const STYLESTRUCT *lpss)
+{
+ if (wStyleType != GWL_STYLE) return 0;
+
+ infoPtr->dwStyle = lpss->styleNew;
+
+ return 0;
+}
static LRESULT
TRACKBAR_Timer (TRACKBAR_INFO *infoPtr)
@@ -1602,8 +1604,7 @@ static LRESULT theme_changed (const TRACKBAR_INFO* infoPtr)
static LRESULT
TRACKBAR_MouseMove (TRACKBAR_INFO *infoPtr, INT x, INT y)
{
- DWORD dwStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE);
- INT clickPlace = (dwStyle & TBS_VERT) ? y : x;
+ INT clickPlace = (infoPtr->dwStyle & TBS_VERT) ? y : x;
LONG dragPos, oldPos = infoPtr->lPos;
TRACE("(x=%d. y=%d)\n", x, y);
@@ -1647,8 +1648,8 @@ TRACKBAR_MouseMove (TRACKBAR_INFO *infoPtr, INT x, INT y)
return TRUE;
}
- dragPos = TRACKBAR_ConvertPlaceToPosition (infoPtr, clickPlace,
- dwStyle & TBS_VERT);
+ dragPos = TRACKBAR_ConvertPlaceToPosition (infoPtr, clickPlace);
+
if (dragPos == oldPos) return TRUE;
infoPtr->lPos = dragPos;
@@ -1666,9 +1667,8 @@ TRACKBAR_MouseMove (TRACKBAR_INFO *infoPtr, INT x, INT y)
static BOOL
TRACKBAR_KeyDown (TRACKBAR_INFO *infoPtr, INT nVirtKey)
{
- DWORD style = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE);
- BOOL downIsLeft = style & TBS_DOWNISLEFT;
- BOOL vert = style & TBS_VERT;
+ BOOL downIsLeft = infoPtr->dwStyle & TBS_DOWNISLEFT;
+ BOOL vert = infoPtr->dwStyle & TBS_VERT;
LONG pos = infoPtr->lPos;
TRACE("%x\n", nVirtKey);
@@ -1905,6 +1905,9 @@ TRACKBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_SIZE:
return TRACKBAR_Size (infoPtr);
+ case WM_STYLECHANGED:
+ return TRACKBAR_StyleChanged (infoPtr, wParam, (LPSTYLESTRUCT)lParam);
+
case WM_THEMECHANGED:
return theme_changed (infoPtr);
diff --git a/reactos/dll/win32/comctl32/treeview.c b/reactos/dll/win32/comctl32/treeview.c
index cfd25242a1d..f7b1afabcbc 100644
--- a/reactos/dll/win32/comctl32/treeview.c
+++ b/reactos/dll/win32/comctl32/treeview.c
@@ -119,6 +119,7 @@ typedef struct tagTREEVIEW_INFO
HTREEITEM selectedItem; /* handle to selected item or 0 if none */
HTREEITEM hotItem; /* handle currently under cursor, 0 if none */
HTREEITEM focusedItem; /* item that was under the cursor when WM_LBUTTONDOWN was received */
+ HTREEITEM editItem; /* item being edited with builtin edit box */
HTREEITEM firstVisible; /* handle to first visible item */
LONG maxVisibleOrder;
@@ -710,7 +711,7 @@ static void
TREEVIEW_UpdateDispInfo(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
UINT mask)
{
- NMTVDISPINFOW callback;
+ NMTVDISPINFOEXW callback;
HWND hwnd = infoPtr->hwnd;
TRACE("mask %x callbackMask %x\n", mask, wineItem->callbackMask);
@@ -1255,6 +1256,7 @@ TREEVIEW_InsertItemT(TREEVIEW_INFO *infoPtr, const TVINSERTSTRUCTW *ptdi, BOOL i
newItem->parent = parentItem;
newItem->iIntegral = 1;
+ newItem->visibleOrder = -1;
if (!TREEVIEW_DoSetItemT(infoPtr, newItem, tvItem, isW))
return 0;
@@ -1367,6 +1369,8 @@ TREEVIEW_InsertItemT(TREEVIEW_INFO *infoPtr, const TVINSERTSTRUCTW *ptdi, BOOL i
TREEVIEW_VerifyTree(infoPtr);
+ if (!infoPtr->bRedraw) return (LRESULT)newItem;
+
if (parentItem == infoPtr->root ||
(ISVISIBLE(parentItem) && parentItem->state & TVIS_EXPANDED))
{
@@ -1392,8 +1396,6 @@ TREEVIEW_InsertItemT(TREEVIEW_INFO *infoPtr, const TVINSERTSTRUCTW *ptdi, BOOL i
}
else
{
- newItem->visibleOrder = -1;
-
/* refresh treeview if newItem is the first item inserted under parentItem */
if (ISVISIBLE(parentItem) && newItem->prevSibling == newItem->nextSibling)
{
@@ -1564,6 +1566,7 @@ TREEVIEW_DeleteItem(TREEVIEW_INFO *infoPtr, HTREEITEM wineItem)
TREEVIEW_VerifyTree(infoPtr);
+ if (!infoPtr->bRedraw) return TRUE;
if (visible)
{
@@ -1586,12 +1589,16 @@ TREEVIEW_DeleteItem(TREEVIEW_INFO *infoPtr, HTREEITEM wineItem)
static LRESULT
TREEVIEW_SetRedraw(TREEVIEW_INFO* infoPtr, WPARAM wParam)
{
- if(wParam)
- infoPtr->bRedraw = TRUE;
- else
- infoPtr->bRedraw = FALSE;
+ infoPtr->bRedraw = wParam ? TRUE : FALSE;
- return 0;
+ if (infoPtr->bRedraw)
+ {
+ TREEVIEW_UpdateSubTree(infoPtr, infoPtr->root);
+ TREEVIEW_RecalculateVisibleOrder(infoPtr, NULL);
+ TREEVIEW_UpdateScrollBars(infoPtr);
+ TREEVIEW_Invalidate(infoPtr, NULL);
+ }
+ return 0;
}
static LRESULT
@@ -3545,6 +3552,14 @@ TREEVIEW_Edit_SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TRUE;
break;
+ case WM_DESTROY:
+ {
+ WNDPROC editProc = infoPtr->wpEditOrig;
+ infoPtr->wpEditOrig = 0;
+ SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (DWORD_PTR)editProc);
+ return CallWindowProcW(editProc, hwnd, uMsg, wParam, lParam);
+ }
+
case WM_GETDLGCODE:
return DLGC_WANTARROWS | DLGC_WANTALLKEYS;
@@ -3580,7 +3595,7 @@ TREEVIEW_Edit_SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
static LRESULT
TREEVIEW_Command(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
- TRACE("%lx %ld\n", wParam, lParam);
+ TRACE("code=%x, id=%x, handle=%lx\n", HIWORD(wParam), LOWORD(wParam), lParam);
switch (HIWORD(wParam))
{
@@ -3590,11 +3605,15 @@ TREEVIEW_Command(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
* Adjust the edit window size
*/
WCHAR buffer[1024];
- TREEVIEW_ITEM *editItem = infoPtr->selectedItem;
+ TREEVIEW_ITEM *editItem = infoPtr->editItem;
HDC hdc = GetDC(infoPtr->hwndEdit);
SIZE sz;
HFONT hFont, hOldFont = 0;
+ TRACE("edit=%p\n", infoPtr->hwndEdit);
+
+ if (!IsWindow(infoPtr->hwndEdit) || !hdc) return FALSE;
+
infoPtr->bLabelChanged = TRUE;
GetWindowTextW(infoPtr->hwndEdit, buffer, sizeof(buffer)/sizeof(buffer[0]));
@@ -3636,6 +3655,12 @@ TREEVIEW_Command(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
ReleaseDC(infoPtr->hwnd, hdc);
break;
}
+ case EN_KILLFOCUS:
+ /* apparently we should respect passed handle value */
+ if (infoPtr->hwndEdit != (HWND)lParam) return FALSE;
+
+ TREEVIEW_EndEditLabelNow(infoPtr, FALSE);
+ break;
default:
return SendMessageW(infoPtr->hwndNotify, WM_COMMAND, wParam, lParam);
@@ -3650,7 +3675,6 @@ TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
HWND hwnd = infoPtr->hwnd;
HWND hwndEdit;
SIZE sz;
- TREEVIEW_ITEM *editItem = hItem;
HINSTANCE hinst = (HINSTANCE)GetWindowLongPtrW(hwnd, GWLP_HINSTANCE);
HDC hdc;
HFONT hOldFont=0;
@@ -3658,7 +3682,7 @@ TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
static const WCHAR EditW[] = {'E','d','i','t',0};
TRACE("%p %p\n", hwnd, hItem);
- if (!TREEVIEW_ValidItem(infoPtr, editItem))
+ if (!TREEVIEW_ValidItem(infoPtr, hItem))
return NULL;
if (infoPtr->hwndEdit)
@@ -3666,11 +3690,10 @@ TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
infoPtr->bLabelChanged = FALSE;
- /* Make sure that edit item is selected */
- TREEVIEW_DoSelectItem(infoPtr, TVGN_CARET, hItem, TVC_UNKNOWN);
+ /* make edit item visible */
TREEVIEW_EnsureVisible(infoPtr, hItem, TRUE);
- TREEVIEW_UpdateDispInfo(infoPtr, editItem, TVIF_TEXT);
+ TREEVIEW_UpdateDispInfo(infoPtr, hItem, TVIF_TEXT);
hdc = GetDC(hwnd);
/* Select the font to get appropriate metric dimensions */
@@ -3680,8 +3703,8 @@ TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
}
/* Get string length in pixels */
- if (editItem->pszText)
- GetTextExtentPoint32W(hdc, editItem->pszText, strlenW(editItem->pszText),
+ if (hItem->pszText)
+ GetTextExtentPoint32W(hdc, hItem->pszText, strlenW(hItem->pszText),
&sz);
else
GetTextExtentPoint32A(hdc, "", 0, &sz);
@@ -3691,7 +3714,7 @@ TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
sz.cx += (textMetric.tmMaxCharWidth * 2);
sz.cx = max(sz.cx, textMetric.tmMaxCharWidth * 3);
- sz.cx = min(sz.cx, infoPtr->clientWidth - editItem->textOffset + 2);
+ sz.cx = min(sz.cx, infoPtr->clientWidth - hItem->textOffset + 2);
if (infoPtr->hFont != 0)
{
@@ -3699,15 +3722,18 @@ TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
}
ReleaseDC(hwnd, hdc);
+
+ infoPtr->editItem = hItem;
+
hwndEdit = CreateWindowExW(WS_EX_LEFT,
EditW,
0,
WS_CHILD | WS_BORDER | ES_AUTOHSCROLL |
WS_CLIPSIBLINGS | ES_WANTRETURN |
- ES_LEFT, editItem->textOffset - 2,
- editItem->rect.top - 1, sz.cx + 3,
- editItem->rect.bottom -
- editItem->rect.top + 3, hwnd, 0, hinst, 0);
+ ES_LEFT, hItem->textOffset - 2,
+ hItem->rect.top - 1, sz.cx + 3,
+ hItem->rect.bottom -
+ hItem->rect.top + 3, hwnd, 0, hinst, 0);
/* FIXME: (HMENU)IDTVEDIT,pcs->hInstance,0); */
infoPtr->hwndEdit = hwndEdit;
@@ -3719,23 +3745,22 @@ TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
GetWindowLongW(hwndEdit, GWL_STYLE) | WS_BORDER);
SendMessageW(hwndEdit, WM_SETFONT,
- (WPARAM)TREEVIEW_FontForItem(infoPtr, editItem), FALSE);
+ (WPARAM)TREEVIEW_FontForItem(infoPtr, hItem), FALSE);
infoPtr->wpEditOrig = (WNDPROC)SetWindowLongPtrW(hwndEdit, GWLP_WNDPROC,
(DWORD_PTR)
TREEVIEW_Edit_SubclassProc);
- if (TREEVIEW_BeginLabelEditNotify(infoPtr, editItem))
+ if (TREEVIEW_BeginLabelEditNotify(infoPtr, hItem))
{
DestroyWindow(hwndEdit);
infoPtr->hwndEdit = 0;
+ infoPtr->editItem = NULL;
return NULL;
}
- infoPtr->selectedItem = hItem;
-
- if (editItem->pszText)
- SetWindowTextW(hwndEdit, editItem->pszText);
+ if (hItem->pszText)
+ SetWindowTextW(hwndEdit, hItem->pszText);
SetFocus(hwndEdit);
SendMessageW(hwndEdit, EM_SETSEL, 0, -1);
@@ -3749,15 +3774,14 @@ static LRESULT
TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel)
{
HWND hwnd = infoPtr->hwnd;
- TREEVIEW_ITEM *editedItem = infoPtr->selectedItem;
+ TREEVIEW_ITEM *editedItem = infoPtr->editItem;
NMTVDISPINFOW tvdi;
BOOL bCommit;
WCHAR tmpText[1024] = { '\0' };
WCHAR *newText = tmpText;
int iLength = 0;
- if (!infoPtr->hwndEdit)
- return FALSE;
+ if (!IsWindow(infoPtr->hwndEdit)) return FALSE;
tvdi.hdr.hwndFrom = hwnd;
tvdi.hdr.idFrom = GetWindowLongPtrW(hwnd, GWLP_ID);
@@ -3810,6 +3834,7 @@ TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel)
if(newText != tmpText) Free(newText);
DestroyWindow(infoPtr->hwndEdit);
infoPtr->hwndEdit = 0;
+ infoPtr->editItem = NULL;
return FALSE;
}
else
@@ -3826,6 +3851,7 @@ TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel)
ShowWindow(infoPtr->hwndEdit, SW_HIDE);
DestroyWindow(infoPtr->hwndEdit);
infoPtr->hwndEdit = 0;
+ infoPtr->editItem = NULL;
return TRUE;
}
@@ -4939,13 +4965,14 @@ TREEVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
infoPtr->treeHeight = 0;
infoPtr->uIndent = MINIMUM_INDENT;
- infoPtr->selectedItem = 0;
- infoPtr->focusedItem = 0;
- infoPtr->hotItem = 0;
- infoPtr->firstVisible = 0;
+ infoPtr->selectedItem = NULL;
+ infoPtr->focusedItem = NULL;
+ infoPtr->hotItem = NULL;
+ infoPtr->editItem = NULL;
+ infoPtr->firstVisible = NULL;
infoPtr->maxVisibleOrder = 0;
- infoPtr->dropItem = 0;
- infoPtr->insertMarkItem = 0;
+ infoPtr->dropItem = NULL;
+ infoPtr->insertMarkItem = NULL;
infoPtr->insertBeforeorAfter = 0;
/* dragList */
@@ -4958,7 +4985,7 @@ TREEVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
/* hwndToolTip */
- infoPtr->hwndEdit = 0;
+ infoPtr->hwndEdit = NULL;
infoPtr->wpEditOrig = NULL;
infoPtr->bIgnoreEditKillFocus = FALSE;
infoPtr->bLabelChanged = FALSE;
diff --git a/reactos/dll/win32/comdlg32/comdlg32.rbuild b/reactos/dll/win32/comdlg32/comdlg32.rbuild
index 1d2285fe728..769fb17331b 100644
--- a/reactos/dll/win32/comdlg32/comdlg32.rbuild
+++ b/reactos/dll/win32/comdlg32/comdlg32.rbuild
@@ -6,6 +6,7 @@
.
include/reactos/wine
+
cdlg32.c
colordlg.c
filedlg.c
diff --git a/reactos/dll/win32/comdlg32/filedlg.c b/reactos/dll/win32/comdlg32/filedlg.c
index 10fccc2cea3..4986122a8e4 100644
--- a/reactos/dll/win32/comdlg32/filedlg.c
+++ b/reactos/dll/win32/comdlg32/filedlg.c
@@ -172,6 +172,7 @@ typedef struct tagFD32_PRIVATE
const char FileOpenDlgInfosStr[] = "FileOpenDlgInfos"; /* windows property description string */
static const char LookInInfosStr[] = "LookInInfos"; /* LOOKIN combo box property */
+static SIZE MemDialogSize = { 0, 0}; /* keep size of the (resizable) dialog */
/***********************************************************************
* Prototypes
@@ -276,6 +277,9 @@ static BOOL GetFileName95(FileOpenDlgInfos *fodInfos)
fodInfos->sizedlg.cx = fodInfos->sizedlg.cy = 0;
fodInfos->initial_size.x = fodInfos->initial_size.y = 0;
}
+ else
+ ((LPDLGTEMPLATEW)template)->style &= ~WS_SIZEBOX;
+
/* old style hook messages */
if (IsHooked(fodInfos))
@@ -553,13 +557,14 @@ static BOOL COMDLG32_GetDisplayNameOf(LPCITEMIDLIST pidl, LPWSTR pwszPath) {
/***********************************************************************
* ArrangeCtrlPositions [internal]
*
- * NOTE: Do not change anything here without a lot of testing.
+ * NOTE: Make sure to add testcases for any changes made here.
*/
static void ArrangeCtrlPositions(HWND hwndChildDlg, HWND hwndParentDlg, BOOL hide_help)
{
HWND hwndChild, hwndStc32;
RECT rectParent, rectChild, rectStc32;
- INT help_fixup = 0, child_height_fixup = 0, child_width_fixup = 0;
+ INT help_fixup = 0;
+ int chgx, chgy;
/* Take into account if open as read only checkbox and help button
* are hidden
@@ -622,24 +627,16 @@ static void ArrangeCtrlPositions(HWND hwndChildDlg, HWND hwndParentDlg, BOOL hid
/* move only if stc32 exist */
if (hwndStc32 && rectChild.left > rectStc32.right)
{
- LONG old_left = rectChild.left;
-
/* move to the right of visible controls of the parent dialog */
rectChild.left += rectParent.right;
rectChild.left -= rectStc32.right;
-
- child_width_fixup = rectChild.left - old_left;
}
/* move even if stc32 doesn't exist */
if (rectChild.top >= rectStc32.bottom)
{
- LONG old_top = rectChild.top;
-
/* move below visible controls of the parent dialog */
rectChild.top += rectParent.bottom;
rectChild.top -= rectStc32.bottom - rectStc32.top;
-
- child_height_fixup = rectChild.top - old_top;
}
SetWindowPos(hwndChild, 0, rectChild.left, rectChild.top,
@@ -674,50 +671,36 @@ static void ArrangeCtrlPositions(HWND hwndChildDlg, HWND hwndParentDlg, BOOL hid
/* here we have to use original parent size */
GetClientRect(hwndParentDlg, &rectParent);
GetClientRect(hwndChildDlg, &rectChild);
+ TRACE( "parent %s child %s stc32 %s\n", wine_dbgstr_rect( &rectParent),
+ wine_dbgstr_rect( &rectChild), wine_dbgstr_rect( &rectStc32));
if (hwndStc32)
{
- rectChild.right += child_width_fixup;
- rectChild.bottom += child_height_fixup;
-
- if (rectParent.right > rectChild.right)
- {
- rectParent.right += rectChild.right;
- rectParent.right -= rectStc32.right - rectStc32.left;
- }
+ /* width */
+ if (rectParent.right > rectStc32.right - rectStc32.left)
+ chgx = rectChild.right - ( rectStc32.right - rectStc32.left);
else
- {
- rectParent.right = rectChild.right;
- }
-
- if (rectParent.bottom > rectChild.bottom)
- {
- rectParent.bottom += rectChild.bottom;
- rectParent.bottom -= rectStc32.bottom - rectStc32.top;
- }
+ chgx = rectChild.right - rectParent.right;
+ /* height */
+ if (rectParent.bottom > rectStc32.bottom - rectStc32.top)
+ chgy = rectChild.bottom - ( rectStc32.bottom - rectStc32.top) - help_fixup;
else
- {
- /* child dialog is higher, unconditionally set new dialog
- * height to its size (help_fixup will be subtracted below)
+ /* Unconditionally set new dialog
+ * height to that of the child
*/
- rectParent.bottom = rectChild.bottom + help_fixup;
- }
+ chgy = rectChild.bottom - rectParent.bottom;
}
else
{
- rectParent.bottom += rectChild.bottom;
+ chgx = 0;
+ chgy = rectChild.bottom - help_fixup;
}
-
- /* finally use fixed parent size */
- rectParent.bottom -= help_fixup;
-
/* set the size of the parent dialog */
- AdjustWindowRectEx(&rectParent, GetWindowLongW(hwndParentDlg, GWL_STYLE),
- FALSE, GetWindowLongW(hwndParentDlg, GWL_EXSTYLE));
+ GetWindowRect(hwndParentDlg, &rectParent);
SetWindowPos(hwndParentDlg, 0,
0, 0,
- rectParent.right - rectParent.left,
- rectParent.bottom - rectParent.top,
+ rectParent.right - rectParent.left + chgx,
+ rectParent.bottom - rectParent.top + chgy,
SWP_NOMOVE | SWP_NOZORDER);
}
@@ -789,11 +772,7 @@ static HWND CreateTemplateDialog(FileOpenDlgInfos *fodInfos, HWND hwnd)
hChildDlg = CreateDialogIndirectParamA(hinst, template, hwnd,
IsHooked(fodInfos) ? (DLGPROC)fodInfos->ofnInfos->lpfnHook : FileOpenDlgProcUserTemplate,
(LPARAM)fodInfos->ofnInfos);
- if(hChildDlg)
- {
- ShowWindow(hChildDlg,SW_SHOW);
- return hChildDlg;
- }
+ return hChildDlg;
}
else if( IsHooked(fodInfos))
{
@@ -1023,6 +1002,8 @@ static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
if( !(fodInfos->ofnInfos->Flags & OFN_ENABLESIZING)) return FALSE;
/* get the new dialog rectangle */
GetWindowRect( hwnd, &rc);
+ TRACE("Size from %d,%d to %d,%d\n", fodInfos->sizedlg.cx, fodInfos->sizedlg.cy,
+ rc.right -rc.left, rc.bottom -rc.top);
/* not initialized yet */
if( (fodInfos->sizedlg.cx == 0 && fodInfos->sizedlg.cy == 0) ||
((fodInfos->sizedlg.cx == rc.right -rc.left) && /* no change */
@@ -1043,6 +1024,7 @@ static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
/* change position and sizes of the controls */
for( ctrl = GetWindow( hwnd, GW_CHILD); ctrl ; ctrl = GetWindow( ctrl, GW_HWNDNEXT))
{
+ int ctrlid = GetDlgCtrlID( ctrl);
GetWindowRect( ctrl, &rc);
MapWindowPoints( NULL, hwnd, (LPPOINT) &rc, 2);
if( ctrl == fodInfos->DlgInfos.hwndGrip)
@@ -1055,25 +1037,69 @@ static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
/* if it was below the shell view
* move to bottom */
- DeferWindowPos( hdwp, ctrl, NULL, rc.left, rc.top + chgy,
- rc.right - rc.left, rc.bottom - rc.top,
- SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
+ switch( ctrlid)
+ {
+ /* file name box and file types combo change also width */
+ case edt1:
+ case cmb1:
+ DeferWindowPos( hdwp, ctrl, NULL, rc.left, rc.top + chgy,
+ rc.right - rc.left + chgx, rc.bottom - rc.top,
+ SWP_NOACTIVATE | SWP_NOZORDER);
+ break;
+ /* then these buttons must move out of the way */
+ case IDOK:
+ case IDCANCEL:
+ case pshHelp:
+ DeferWindowPos( hdwp, ctrl, NULL, rc.left + chgx, rc.top + chgy,
+ 0, 0,
+ SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
+ break;
+ default:
+ DeferWindowPos( hdwp, ctrl, NULL, rc.left, rc.top + chgy,
+ 0, 0,
+ SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
+ }
}
else if( rc.left > rcview.right)
{
/* if it was to the right of the shell view
* move to right */
DeferWindowPos( hdwp, ctrl, NULL, rc.left + chgx, rc.top,
- rc.right - rc.left, rc.bottom - rc.top,
+ 0, 0,
SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
}
+ else
+ /* special cases */
+ {
+ switch( ctrlid)
+ {
+#if 0 /* this is Win2k, Win XP. Vista and Higher don't move/size these controls */
+ case IDC_LOOKIN:
+ DeferWindowPos( hdwp, ctrl, NULL, 0, 0,
+ rc.right - rc.left + chgx, rc.bottom - rc.top,
+ SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
+ break;
+ case IDC_TOOLBARSTATIC:
+ case IDC_TOOLBAR:
+ DeferWindowPos( hdwp, ctrl, NULL, rc.left + chgx, rc.top,
+ 0, 0,
+ SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
+ break;
+#endif
+ /* not resized in windows. Since wine uses this invisible control
+ * to size the browser view it needs to be resized */
+ case IDC_SHELLSTATIC:
+ DeferWindowPos( hdwp, ctrl, NULL, 0, 0,
+ rc.right - rc.left + chgx,
+ rc.bottom - rc.top + chgy,
+ SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
+ break;
+ }
+ }
}
if(fodInfos->DlgInfos.hwndCustomDlg &&
(fodInfos->ofnInfos->Flags & (OFN_ENABLETEMPLATE | OFN_ENABLETEMPLATEHANDLE)))
{
- GetClientRect(hwnd, &rc);
- DeferWindowPos( hdwp,fodInfos->DlgInfos.hwndCustomDlg, NULL,
- 0, 0, rc.right, rc.bottom, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
for( ctrl = GetWindow( fodInfos->DlgInfos.hwndCustomDlg, GW_CHILD);
ctrl ; ctrl = GetWindow( ctrl, GW_HWNDNEXT))
{
@@ -1096,6 +1122,11 @@ static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
}
}
+ /* size the custom dialog at the end: some applications do some
+ * control re-arranging at this point */
+ GetClientRect(hwnd, &rc);
+ DeferWindowPos( hdwp,fodInfos->DlgInfos.hwndCustomDlg, NULL,
+ 0, 0, rc.right, rc.bottom, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}
EndDeferWindowPos( hdwp);
/* should not be needed */
@@ -1111,7 +1142,7 @@ static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
#if 0
- TRACE("0x%04x 0x%04x\n", hwnd, uMsg);
+ TRACE("%p 0x%04x\n", hwnd, uMsg);
#endif
switch(uMsg)
@@ -1119,7 +1150,7 @@ INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l
case WM_INITDIALOG:
{
FileOpenDlgInfos * fodInfos = (FileOpenDlgInfos *)lParam;
- RECT rc;
+ RECT rc, rcstc;
int gripx = GetSystemMetrics( SM_CYHSCROLL);
int gripy = GetSystemMetrics( SM_CYVSCROLL);
@@ -1146,10 +1177,29 @@ INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l
FILEDLG95_ResizeControls(hwnd, wParam, lParam);
FILEDLG95_FillControls(hwnd, wParam, lParam);
+ if( fodInfos->DlgInfos.hwndCustomDlg)
+ ShowWindow( fodInfos->DlgInfos.hwndCustomDlg, SW_SHOW);
+
+ if(fodInfos->ofnInfos->Flags & OFN_EXPLORER) {
+ SendCustomDlgNotificationMessage(hwnd,CDN_INITDONE);
+ SendCustomDlgNotificationMessage(hwnd,CDN_FOLDERCHANGE);
+ }
+
+ /* if the app has changed the position of the invisible listbox,
+ * change that of the listview (browser) as well */
+ GetWindowRect( fodInfos->ShellInfos.hwndView, &rc);
+ GetWindowRect( GetDlgItem( hwnd, IDC_SHELLSTATIC ), &rcstc);
+ if( !EqualRect( &rc, &rcstc))
+ {
+ MapWindowPoints( NULL, hwnd, (LPPOINT) &rcstc, 2);
+ SetWindowPos( fodInfos->ShellInfos.hwndView, NULL,
+ rcstc.left, rcstc.top, rcstc.right - rcstc.left, rcstc.bottom - rcstc.top,
+ SWP_NOACTIVATE | SWP_NOZORDER);
+ }
+
if (fodInfos->ofnInfos->Flags & OFN_ENABLESIZING)
{
GetWindowRect( hwnd, &rc);
- /* FIXME: should remember sizes of last invocation */
fodInfos->sizedlg.cx = rc.right - rc.left;
fodInfos->sizedlg.cy = rc.bottom - rc.top;
fodInfos->initial_size.x = fodInfos->sizedlg.cx;
@@ -1158,14 +1208,16 @@ INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l
SetWindowPos( fodInfos->DlgInfos.hwndGrip, NULL,
rc.right - gripx, rc.bottom - gripy,
0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
+ /* resize the dialog to the previous invocation */
+ if( MemDialogSize.cx && MemDialogSize.cy)
+ SetWindowPos( hwnd, NULL,
+ 0, 0, MemDialogSize.cx, MemDialogSize.cy,
+ SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}
if(fodInfos->ofnInfos->Flags & OFN_EXPLORER)
- {
- SendCustomDlgNotificationMessage(hwnd,CDN_INITDONE);
- SendCustomDlgNotificationMessage(hwnd,CDN_FOLDERCHANGE);
SendCustomDlgNotificationMessage(hwnd,CDN_SELCHANGE);
- }
+
return 0;
}
case WM_SIZE:
@@ -1189,9 +1241,13 @@ INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l
return FILEDLG95_OnWMGetIShellBrowser(hwnd);
case WM_DESTROY:
- RemovePropA(hwnd, FileOpenDlgInfosStr);
- return FALSE;
-
+ {
+ FileOpenDlgInfos * fodInfos = GetPropA(hwnd,FileOpenDlgInfosStr);
+ if (fodInfos && fodInfos->ofnInfos->Flags & OFN_ENABLESIZING)
+ MemDialogSize = fodInfos->sizedlg;
+ RemovePropA(hwnd, FileOpenDlgInfosStr);
+ return FALSE;
+ }
case WM_NOTIFY:
{
LPNMHDR lpnmh = (LPNMHDR)lParam;
@@ -1321,6 +1377,7 @@ static LRESULT FILEDLG95_InitControls(HWND hwnd)
/* FIXME: use TB_LOADIMAGES when implemented */
/* SendMessageW(fodInfos->DlgInfos.hwndTB, TB_LOADIMAGES, IDB_VIEW_SMALL_COLOR, HINST_COMMCTRL);*/
+ SendMessageW(fodInfos->DlgInfos.hwndTB, TB_SETMAXTEXTROWS, 0, 0);
SendMessageW(fodInfos->DlgInfos.hwndTB, TB_ADDBITMAP, 12, (LPARAM) &tba[0]);
SendMessageW(fodInfos->DlgInfos.hwndTB, TB_ADDBITMAP, 1, (LPARAM) &tba[1]);
@@ -1758,19 +1815,19 @@ static BOOL FILEDLG95_SendFileOK( HWND hwnd, FileOpenDlgInfos *fodInfos )
/* First send CDN_FILEOK as MSDN doc says */
if(fodInfos->ofnInfos->Flags & OFN_EXPLORER)
retval = SendCustomDlgNotificationMessage(hwnd,CDN_FILEOK);
- if (GetWindowLongPtrW(fodInfos->DlgInfos.hwndCustomDlg, DWLP_MSGRESULT))
+ if( retval)
{
TRACE("canceled\n");
- return (retval == 0);
+ return FALSE;
}
/* fodInfos->ofnInfos points to an ASCII or UNICODE structure as appropriate */
retval = SendMessageW(fodInfos->DlgInfos.hwndCustomDlg,
fodInfos->HookMsg.fileokstring, 0, (LPARAM)fodInfos->ofnInfos);
- if (GetWindowLongPtrW(fodInfos->DlgInfos.hwndCustomDlg, DWLP_MSGRESULT))
+ if( retval)
{
TRACE("canceled\n");
- return (retval == 0);
+ return FALSE;
}
}
return TRUE;
@@ -3297,7 +3354,7 @@ void FILEDLG95_FILENAME_FillFromSelection (HWND hwnd)
* Although shell32 is already linked the behaviour of exported StrRetToStrN
* is dependent on whether emulated OS is unicode or not.
*/
-static HRESULT COMDLG32_StrRetToStrNW (LPWSTR dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
+static HRESULT COMDLG32_StrRetToStrNW (LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl)
{
switch (src->uType)
{
diff --git a/reactos/dll/win32/comdlg32/printdlg.c b/reactos/dll/win32/comdlg32/printdlg.c
index 6c6109daef6..5a4816dcacd 100644
--- a/reactos/dll/win32/comdlg32/printdlg.c
+++ b/reactos/dll/win32/comdlg32/printdlg.c
@@ -2366,7 +2366,7 @@ static inline BOOL is_metric(const pagesetup_data *data)
return pagesetup_get_flags(data) & PSD_INHUNDREDTHSOFMILLIMETERS;
}
-static inline LONG tenths_mm_to_size(pagesetup_data *data, LONG size)
+static inline LONG tenths_mm_to_size(const pagesetup_data *data, LONG size)
{
if (is_metric(data))
return 10 * size;
@@ -2374,7 +2374,7 @@ static inline LONG tenths_mm_to_size(pagesetup_data *data, LONG size)
return 10 * size * 100 / 254;
}
-static inline LONG thousandths_inch_to_size(pagesetup_data *data, LONG size)
+static inline LONG thousandths_inch_to_size(const pagesetup_data *data, LONG size)
{
if (is_metric(data))
return size * 254 / 100;
@@ -2539,7 +2539,7 @@ typedef enum
} devnames_name;
-static inline WORD get_devname_offset(DEVNAMES *dn, devnames_name which)
+static inline WORD get_devname_offset(const DEVNAMES *dn, devnames_name which)
{
switch(which)
{
@@ -3012,7 +3012,7 @@ static void update_margin_edits(HWND hDlg, const pagesetup_data *data, WORD id)
}
}
-static void margin_edit_notification(HWND hDlg, pagesetup_data *data, WORD msg, WORD id)
+static void margin_edit_notification(HWND hDlg, const pagesetup_data *data, WORD msg, WORD id)
{
switch (msg)
{
diff --git a/reactos/dll/win32/credui/credui_Da.rc b/reactos/dll/win32/credui/credui_Da.rc
index d5e7608e874..26ef9914c5d 100644
--- a/reactos/dll/win32/credui/credui_Da.rc
+++ b/reactos/dll/win32/credui/credui_Da.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
diff --git a/reactos/dll/win32/credui/credui_De.rc b/reactos/dll/win32/credui/credui_De.rc
index 7c197d6790f..9cbedd2dd60 100644
--- a/reactos/dll/win32/credui/credui_De.rc
+++ b/reactos/dll/win32/credui/credui_De.rc
@@ -18,6 +18,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
+#pragma code_page(65001)
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
@@ -44,7 +48,7 @@ STRINGTABLE DISCARDABLE
IDS_TITLEFORMAT "Mit %s verbinden"
IDS_MESSAGEFORMAT "Verbindung mit %s wird hergestellt"
IDS_INCORRECTPASSWORDTITLE "Anmeldung fehlgeschlagen"
- IDS_INCORRECTPASSWORD "Bitte berprfen Sie Ihren Benutzernamen\nund geben Sie das Kennwort neu ein."
+ IDS_INCORRECTPASSWORD "Bitte überprüfen Sie Ihren Benutzernamen\nund geben Sie das Kennwort neu ein."
IDS_CAPSLOCKONTITLE "Die Feststelltaste ist aktiviert"
- IDS_CAPSLOCKON "Mit aktivierter Feststelltaste knnte das Kennwort falsch eingeben werden.\n\nVor der Eingabe des Kennworts sollten Sie die Feststelltaste deaktivieren."
+ IDS_CAPSLOCKON "Mit aktivierter Feststelltaste könnte das Kennwort falsch eingeben werden.\n\nVor der Eingabe des Kennworts sollten Sie die Feststelltaste deaktivieren."
}
diff --git a/reactos/dll/win32/credui/credui_En.rc b/reactos/dll/win32/credui/credui_En.rc
index 8e475bb60ac..feb4afc4b02 100644
--- a/reactos/dll/win32/credui/credui_En.rc
+++ b/reactos/dll/win32/credui/credui_En.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
diff --git a/reactos/dll/win32/credui/credui_Es.rc b/reactos/dll/win32/credui/credui_Es.rc
index 0a48b3ff963..8f71d5ff4c5 100644
--- a/reactos/dll/win32/credui/credui_Es.rc
+++ b/reactos/dll/win32/credui/credui_Es.rc
@@ -18,6 +18,9 @@
* 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 "credui_resources.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
@@ -50,5 +53,3 @@ STRINGTABLE DISCARDABLE
IDS_CAPSLOCKONTITLE "Bloq Mayus está activado"
IDS_CAPSLOCKON "El Bloq Mayus activado puede hacer que entre su contraseña incorrectamente.\n\nPulse la tecla Bloq Mayus de su teclado para desactivar Bloq Mayus antes\n de introducir su contraseña."
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/credui/credui_Fr.rc b/reactos/dll/win32/credui/credui_Fr.rc
index fb7cd126fbe..d2e63be4140 100644
--- a/reactos/dll/win32/credui/credui_Fr.rc
+++ b/reactos/dll/win32/credui/credui_Fr.rc
@@ -17,6 +17,9 @@
* 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 "credui_resources.h"
+
#pragma code_page(65001)
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
@@ -49,5 +52,4 @@ STRINGTABLE DISCARDABLE
IDS_CAPSLOCKONTITLE "VERR.MAJ est activé"
IDS_CAPSLOCKON "Le verrouillage majuscule étant activé, cela pourrait provoquer une erreur lors de la saisie de votre mot de passe.\n\nAppuyez sur la touche VERR.MAJ de votre clavier afin de désactiver le verrouilage majuscule avant\nde saisir votre mot de passe."
}
-
#pragma code_page(default)
diff --git a/reactos/dll/win32/credui/credui_Ko.rc b/reactos/dll/win32/credui/credui_Ko.rc
index 62bd1355d30..ab1f1ec853f 100644
--- a/reactos/dll/win32/credui/credui_Ko.rc
+++ b/reactos/dll/win32/credui/credui_Ko.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
diff --git a/reactos/dll/win32/credui/credui_Lt.rc b/reactos/dll/win32/credui/credui_Lt.rc
index 9ad3e4bc4ba..c98a861cc8a 100644
--- a/reactos/dll/win32/credui/credui_Lt.rc
+++ b/reactos/dll/win32/credui/credui_Lt.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
/* UTF-8 */
#pragma code_page(65001)
@@ -51,5 +53,4 @@ STRINGTABLE DISCARDABLE
IDS_CAPSLOCKONTITLE "Didžiųjų raidžių būsena įjungta"
IDS_CAPSLOCKON "Kai įjungta didžiųjų raidžių būsena, savo slaptažodį galite įvesti neteisingai.\n\nPaspauskite didžiųjų raidžių klaviatūros klavišą didžiųjų raidžių būsenai išjungti\nprieš rinkdami savo slaptažodį."
}
-
#pragma code_page(default)
diff --git a/reactos/dll/win32/credui/credui_Nl.rc b/reactos/dll/win32/credui/credui_Nl.rc
index ed5c41e4b72..575496ccf33 100644
--- a/reactos/dll/win32/credui/credui_Nl.rc
+++ b/reactos/dll/win32/credui/credui_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
diff --git a/reactos/dll/win32/credui/credui_No.rc b/reactos/dll/win32/credui/credui_No.rc
index cc09cd8351d..c47fec1bf74 100644
--- a/reactos/dll/win32/credui/credui_No.rc
+++ b/reactos/dll/win32/credui/credui_No.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
diff --git a/reactos/dll/win32/credui/credui_Pl.rc b/reactos/dll/win32/credui/credui_Pl.rc
index 902ced6a4d4..e2fab5ce42e 100644
--- a/reactos/dll/win32/credui/credui_Pl.rc
+++ b/reactos/dll/win32/credui/credui_Pl.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
diff --git a/reactos/dll/win32/credui/credui_Pt.rc b/reactos/dll/win32/credui/credui_Pt.rc
index 930fb4336a7..2283e43bfda 100644
--- a/reactos/dll/win32/credui/credui_Pt.rc
+++ b/reactos/dll/win32/credui/credui_Pt.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
diff --git a/reactos/dll/win32/credui/credui_Ro.rc b/reactos/dll/win32/credui/credui_Ro.rc
index 3d3367e7473..29e98991983 100644
--- a/reactos/dll/win32/credui/credui_Ro.rc
+++ b/reactos/dll/win32/credui/credui_Ro.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -49,5 +51,3 @@ STRINGTABLE DISCARDABLE
IDS_CAPSLOCKONTITLE "Tasta Caps Lock este activată"
IDS_CAPSLOCKON "Cu tasta Caps Lock activată este foarte probabil că veți introduce parola greșit.\n\nInainte de a introduce parola apăsați tasta Caps Lock pentru a dezactiva scrierea cu majuscule."
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/credui/credui_Ru.rc b/reactos/dll/win32/credui/credui_Ru.rc
index fce2c5f055b..9e0a2d2bbed 100644
--- a/reactos/dll/win32/credui/credui_Ru.rc
+++ b/reactos/dll/win32/credui/credui_Ru.rc
@@ -18,6 +18,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
@@ -28,23 +33,23 @@ BEGIN
CONTROL IDB_BANNER,-1,"Static",SS_BITMAP | SS_CENTERIMAGE,0,
0,213,37
LTEXT "IDS_MESSAGEFORMAT",IDC_MESSAGE,8,48,199,8,NOT WS_GROUP
- LTEXT "&:",-1,8,62,72,12,SS_CENTERIMAGE
+ LTEXT "По&льзователь:",-1,8,62,72,12,SS_CENTERIMAGE
CONTROL "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN |
CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87
- LTEXT "&:",-1,8,80,72,12,SS_CENTERIMAGE
+ LTEXT "&Пароль:",-1,8,80,72,12,SS_CENTERIMAGE
EDITTEXT IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL
- CONTROL "& ",IDC_SAVE,"Button",
+ CONTROL "Со&хранить пароль",IDC_SAVE,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12
- DEFPUSHBUTTON "",IDOK,97,128,50,14
- PUSHBUTTON "",IDCANCEL,156,128,50,14
+ DEFPUSHBUTTON "ОК",IDOK,97,128,50,14
+ PUSHBUTTON "Отмена",IDCANCEL,156,128,50,14
END
STRINGTABLE DISCARDABLE
{
- IDS_TITLEFORMAT " %s"
- IDS_MESSAGEFORMAT " %s"
- IDS_INCORRECTPASSWORDTITLE " "
- IDS_INCORRECTPASSWORD ", \n ."
- IDS_CAPSLOCKONTITLE "Caps Lock "
- IDS_CAPSLOCKON " - Caps Lock.\n\n Caps Lock , ."
+ IDS_TITLEFORMAT "Подключение к %s"
+ IDS_MESSAGEFORMAT "Подключение к %s"
+ IDS_INCORRECTPASSWORDTITLE "Вход не был произведён"
+ IDS_INCORRECTPASSWORD "Убедитесь, что имя пользователя\nи пароль верны."
+ IDS_CAPSLOCKONTITLE "Caps Lock включен"
+ IDS_CAPSLOCKON "Пароль может быть введён неправильно из-за нажатой клавиши Caps Lock.\n\nОтключите Caps Lock перед тем, как вводить пароль."
}
diff --git a/reactos/dll/win32/credui/credui_Si.rc b/reactos/dll/win32/credui/credui_Si.rc
index d2152adf1cf..068ec970338 100644
--- a/reactos/dll/win32/credui/credui_Si.rc
+++ b/reactos/dll/win32/credui/credui_Si.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
diff --git a/reactos/dll/win32/credui/credui_Sv.rc b/reactos/dll/win32/credui/credui_Sv.rc
index 453b7a38934..a43c216b227 100644
--- a/reactos/dll/win32/credui/credui_Sv.rc
+++ b/reactos/dll/win32/credui/credui_Sv.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149
diff --git a/reactos/dll/win32/credui/credui_Zh.rc b/reactos/dll/win32/credui/credui_Zh.rc
index 99294c71a95..041aecdaaa0 100644
--- a/reactos/dll/win32/credui/credui_Zh.rc
+++ b/reactos/dll/win32/credui/credui_Zh.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "credui_resources.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -82,5 +84,3 @@ STRINGTABLE DISCARDABLE
IDS_CAPSLOCKONTITLE "大寫鎖定開著"
IDS_CAPSLOCKON "開著大寫鎖定可能導致你輸入錯誤的密碼."
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/credui/credui_resources.h b/reactos/dll/win32/credui/credui_resources.h
index e5bd8ee9335..0a6ab72b092 100644
--- a/reactos/dll/win32/credui/credui_resources.h
+++ b/reactos/dll/win32/credui/credui_resources.h
@@ -16,6 +16,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include
+#include
+
#define IDD_CREDDIALOG 100
#define IDC_USERNAME 101
#define IDC_PASSWORD 102
diff --git a/reactos/dll/win32/crypt32/crypt32.rbuild b/reactos/dll/win32/crypt32/crypt32.rbuild
index 3642bac03a3..6b91352df3d 100644
--- a/reactos/dll/win32/crypt32/crypt32.rbuild
+++ b/reactos/dll/win32/crypt32/crypt32.rbuild
@@ -35,15 +35,7 @@
str.c
ctl.c
message.c
- crypt32_De.rc
- crypt32_En.rc
- crypt32_Fr.rc
- crypt32_Ko.rc
- crypt32_Nl.rc
- crypt32_No.rc
- crypt32_Pt.rc
- crypt32_Ro.rc
- crypt32_Sv.rc
+ crypt32.rc
version.rc
-fno-unit-at-a-time
diff --git a/reactos/dll/win32/crypt32/crypt32.rc b/reactos/dll/win32/crypt32/crypt32.rc
new file mode 100644
index 00000000000..1afa8a75296
--- /dev/null
+++ b/reactos/dll/win32/crypt32/crypt32.rc
@@ -0,0 +1,34 @@
+/*
+ * crypt32 dll resources
+ *
+ * Copyright (C) 2006 Juan Lang
+ *
+ * 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 "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "cryptres.h"
+
+#include "version.rc"
+
+#include "crypt32_De.rc"
+#include "crypt32_En.rc"
+#include "crypt32_Fr.rc"
+#include "crypt32_Ko.rc"
+#include "crypt32_Nl.rc"
+#include "crypt32_No.rc"
+#include "crypt32_Pt.rc"
+#include "crypt32_Sv.rc"
diff --git a/reactos/dll/win32/crypt32/crypt32_De.rc b/reactos/dll/win32/crypt32/crypt32_De.rc
index 0a8bd3871e4..aa3a4562c70 100644
--- a/reactos/dll/win32/crypt32/crypt32_De.rc
+++ b/reactos/dll/win32/crypt32/crypt32_De.rc
@@ -177,6 +177,7 @@ STRINGTABLE DISCARDABLE
IDS_LOCALIZEDNAME_CA "Zwischenzertifizierungsstellen"
IDS_LOCALIZEDNAME_ADDRESSBOOK "Andere Personen"
IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Vertrauenswürdige Herausgeber"
+ IDS_LOCALIZEDNAME_DISALLOWED "Nicht Vertrauenswürdige Zertifikate"
}
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/crypt32/crypt32_En.rc b/reactos/dll/win32/crypt32/crypt32_En.rc
index 4670029f310..be068451813 100644
--- a/reactos/dll/win32/crypt32/crypt32_En.rc
+++ b/reactos/dll/win32/crypt32/crypt32_En.rc
@@ -174,6 +174,7 @@ STRINGTABLE DISCARDABLE
IDS_LOCALIZEDNAME_CA "Intermediate Certification Authorities"
IDS_LOCALIZEDNAME_ADDRESSBOOK "Other People"
IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Trusted Publishers"
+ IDS_LOCALIZEDNAME_DISALLOWED "Untrusted Certificates"
}
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/crypt32/crypt32_Fr.rc b/reactos/dll/win32/crypt32/crypt32_Fr.rc
index 030a3a98500..3438f2e4109 100644
--- a/reactos/dll/win32/crypt32/crypt32_Fr.rc
+++ b/reactos/dll/win32/crypt32/crypt32_Fr.rc
@@ -177,6 +177,7 @@ STRINGTABLE DISCARDABLE
IDS_LOCALIZEDNAME_CA "Autorités intermédiaires"
IDS_LOCALIZEDNAME_ADDRESSBOOK "Autres personnes"
IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Éditeurs de confiance"
+ IDS_LOCALIZEDNAME_DISALLOWED "Certificats non autorisés"
}
STRINGTABLE DISCARDABLE
@@ -241,3 +242,4 @@ STRINGTABLE DISCARDABLE
IDS_NETSCAPE_SMIME_CA "AC S/MIME"
IDS_NETSCAPE_SIGN_CA "Signature CA"
}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/crypt32/crypt32_Ko.rc b/reactos/dll/win32/crypt32/crypt32_Ko.rc
index 1a0535300a5..0d83815c3ff 100644
--- a/reactos/dll/win32/crypt32/crypt32_Ko.rc
+++ b/reactos/dll/win32/crypt32/crypt32_Ko.rc
@@ -175,6 +175,7 @@ STRINGTABLE DISCARDABLE
IDS_LOCALIZEDNAME_CA "߰ "
IDS_LOCALIZEDNAME_ADDRESSBOOK "ٸ "
IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "ŷ ִ "
+ IDS_LOCALIZEDNAME_DISALLOWED "ŷ "
}
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/crypt32/crypt32_Lt.rc b/reactos/dll/win32/crypt32/crypt32_Lt.rc
new file mode 100644
index 00000000000..9ed21510372
--- /dev/null
+++ b/reactos/dll/win32/crypt32/crypt32_Lt.rc
@@ -0,0 +1,244 @@
+/*
+ * crypt32 dll resources
+ *
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "cryptres.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_AUTHORITY_KEY_ID "Įstaigos rakto identifikatorius"
+ IDS_KEY_ATTRIBUTES "Rakto atributai"
+ IDS_KEY_USAGE_RESTRICTION "Rakto naudojimo ribojimai"
+ IDS_SUBJECT_ALT_NAME "Subjekto alternatyvus vardas"
+ IDS_ISSUER_ALT_NAME "Išdavėjo alternatyvus vardas"
+ IDS_BASIC_CONSTRAINTS "Pagrindiniai ribojimai"
+ IDS_KEY_USAGE "Rakto naudojimas"
+ IDS_CERT_POLICIES "Liudijimo politika"
+ IDS_SUBJECT_KEY_IDENTIFIER "Subjekto rakto identifikatorius"
+ IDS_CRL_REASON_CODE "ALS priežasties kodas" /* Atšauktų Liudijimų Sąrašas */
+ IDS_CRL_DIST_POINTS "ALS platinimo vietos"
+ IDS_ENHANCED_KEY_USAGE "Išplėstas rakto naudojimas"
+ IDS_AUTHORITY_INFO_ACCESS "Išdavėjo informacijos prieiga"
+ IDS_CERT_EXTENSIONS "Liudijimo plėtiniai"
+ IDS_NEXT_UPDATE_LOCATION "Kito atnaujinimo vieta"
+ IDS_YES_OR_NO_TRUST "Yra ar nėra patikėjimas"
+ IDS_EMAIL_ADDRESS "Elektroninio pašto adresas"
+ IDS_UNSTRUCTURED_NAME "Nestruktūrinis vardas"
+ IDS_CONTENT_TYPE "Turinio tipas"
+ IDS_MESSAGE_DIGEST "Pranešimo maišos reikšmė"
+ IDS_SIGNING_TIME "Pasirašymo laikas"
+ IDS_COUNTER_SIGN "Paliudijantis parašas"
+ IDS_CHALLENGE_PASSWORD "Iššūkio slaptažodis"
+ IDS_UNSTRUCTURED_ADDRESS "Nestruktūrinis adresas"
+ IDS_SMIME_CAPABILITIES "SMIME gebėjimai"
+ IDS_PREFER_SIGNED_DATA "Teikti pirmenybę pasirašytiems duomenims"
+ IDS_CPS "Sertifikavimo Veiklos Nuostatos (CPS)"
+ IDS_USER_NOTICE "Naudotojo pastaba"
+ IDS_OCSP "Būsenos paliudijimo tinklu protokolas (OCSP)"
+ IDS_CA_ISSUER "Liudijimo įstaigos steigėjai"
+ IDS_CERT_TEMPLATE_NAME "Liudijimo šablono pavadinimas"
+ IDS_CERT_TYPE "Liudijimo tipas"
+ IDS_CERT_MANIFOLD "Liudijimo kopija"
+ IDS_NETSCAPE_CERT_TYPE "Netscape liudijimo tipas"
+ IDS_NETSCAPE_BASE_URL "Netscape bazės URL"
+ IDS_NETSCAPE_REVOCATION_URL "Netscape atšaukimų URL"
+ IDS_NETSCAPE_CA_REVOCATION_URL "Netscape LĮ atšaukimų URL"
+ IDS_NETSCAPE_CERT_RENEWAL_URL "Netscape liudijimų atnaujinimo URL"
+ IDS_NETSCAPE_CA_POLICY_URL "Netscape LĮ politikos URL"
+ IDS_NETSCAPE_SSL_SERVER_NAME "Netscape SSL serverio vardas"
+ IDS_NETSCAPE_COMMENT "Netscape komentaras"
+ IDS_SPC_SP_AGENCY_INFO "SpcSpAgencyInfo"
+ IDS_SPC_FINANCIAL_CRITERIA "SpcFinancialCriteria"
+ IDS_SPC_MINIMAL_CRITERIA "SpcMinimalCriteria"
+ IDS_COUNTRY "Valstybė/regionas"
+ IDS_ORGANIZATION "Įstaiga"
+ IDS_ORGANIZATIONAL_UNIT "Įstaigos padalinys"
+ IDS_COMMON_NAME "Vardas, pavardė"
+ IDS_LOCALITY "Vietovė"
+ IDS_STATE_OR_PROVINCE "Valstija, sritis, gubernija"
+ IDS_TITLE "Titulas"
+ IDS_GIVEN_NAME "Vardas"
+ IDS_INITIALS "Inicialai"
+ IDS_SUR_NAME "Pavardė"
+ IDS_DOMAIN_COMPONENT "Srities komponentas"
+ IDS_STREET_ADDRESS "Adresas"
+ IDS_SERIAL_NUMBER "Numeris"
+ IDS_CA_VERSION "LĮ versija"
+ IDS_CROSS_CA_VERSION "Kryžminės LĮ versija"
+ IDS_SERIALIZED_SIG_SERIAL_NUMBER "Išdėstyto serijomis parašo numeris"
+ IDS_PRINCIPAL_NAME "Pagrindinis pavadinimas"
+ IDS_WINDOWS_PRODUCT_UPDATE "Windows produktų naujinimas"
+ IDS_ENROLLMENT_NAME_VALUE_PAIR "Registravimo vardo reikšmių pora"
+ IDS_OS_VERSION "OS versija"
+ IDS_ENROLLMENT_CSP "Registravimo CSP"
+ IDS_CRL_NUMBER "ALS numeris"
+ IDS_DELTA_CRL_INDICATOR "ALS pokyčių indikatorius"
+ IDS_ISSUING_DIST_POINT "Išdavimo platinimo vieta"
+ IDS_FRESHEST_CRL "Naujausias ALS"
+ IDS_NAME_CONSTRAINTS "Vardo ribojimai"
+ IDS_POLICY_MAPPINGS "Politikos atvaizdavimas"
+ IDS_POLICY_CONSTRAINTS "Politikos ribojimai"
+ IDS_CROSS_CERT_DIST_POINTS "Kryžminio liudijimo platinimo vietos"
+ IDS_APPLICATION_POLICIES "Programos politika"
+ IDS_APPLICATION_POLICY_MAPPINGS "Programos politikos atvaizdavimas"
+ IDS_APPLICATION_POLICY_CONSTRAINTS "Programos politikos ribojimai"
+ IDS_CMC_DATA "CMC duomenys"
+ IDS_CMC_RESPONSE "CMC atsakymas"
+ IDS_UNSIGNED_CMC_REQUEST "Nepasirašyta CMC užklausa"
+ IDS_CMC_STATUS_INFO "CMC būsenos informacija"
+ IDS_CMC_EXTENSIONS "CMC plėtiniai"
+ IDS_CMC_ATTRIBUTES "CMC atributai"
+ IDS_PKCS_7_DATA "PKCS 7 duomenys"
+ IDS_PKCS_7_SIGNED "PKCS 7 pasirašytas"
+ IDS_PKCS_7_ENVELOPED "PKCS 7 voke"
+ IDS_PKCS_7_SIGNED_ENVELOPED "PKCS 7 pasirašytas, voke"
+ IDS_PKCS_7_DIGESTED "PKCS 7 apskaičiuota maišos reikšmė"
+ IDS_PKCS_7_ENCRYPTED "PKCS 7 užšifruotas"
+ IDS_PREVIOUS_CA_CERT_HASH "Ankstesnė LĮ liudijimo maišos reikšmė"
+ IDS_CRL_VIRTUAL_BASE "Virtualus bazinis ALS numeris"
+ IDS_CRL_NEXT_PUBLISH "Kitas ALS publikavimas"
+ IDS_CA_EXCHANGE "LĮ užšifravimo liudijimas"
+ IDS_KEY_RECOVERY_AGENT "Rakto atkūrimo priemonė"
+ IDS_CERTIFICATE_TEMPLATE "Liudijimo šablono informacija"
+ IDS_ENTERPRISE_ROOT_OID "Organizacijos pagrindinis objekto identifikatorius"
+ IDS_RDN_DUMMY_SIGNER "Fiktyvus pasirašytojas"
+ IDS_ARCHIVED_KEY_ATTR "Užšifruotas privatusis raktas"
+ IDS_CRL_SELF_CDP "Publikuotos ALS vietos"
+ IDS_REQUIRE_CERT_CHAIN_POLICY "Priverstinai vykdyti liudijimų grandinės politiką"
+ IDS_TRANSACTION_ID "Operacijos identifikatorius"
+ IDS_SENDER_NONCE "Siuntėjas tam kartui"
+ IDS_RECIPIENT_NONCE "Gavėjas tam kartui"
+ IDS_REG_INFO "Registracijos informacija"
+ IDS_GET_CERTIFICATE "Gauti liudijimą"
+ IDS_GET_CRL "Gauti ALS"
+ IDS_REVOKE_REQUEST "Atšaukti užklausą"
+ IDS_QUERY_PENDING "Laukia užklausa"
+ IDS_SORTED_CTL "Patikintų liudijimų sąrašas"
+ IDS_ARCHIVED_KEY_CERT_HASH "Atsarginės rakto kopijos liudijimo maišos reikšmė"
+ IDS_PRIVATE_KEY_USAGE_PERIOD "Privačiojo rakto naudojimo periodas"
+ IDS_CLIENT_INFORMATION "Kliento informacija"
+ IDS_SERVER_AUTHENTICATION "Serverio tapatumo nustatymas"
+ IDS_CLIENT_AUTHENTICATION "Kliento tapatumo nustatymas"
+ IDS_CODE_SIGNING "Programos kodo pasirašymas"
+ IDS_SECURE_EMAIL "Saugus elektroninis paštas"
+ IDS_TIME_STAMPING "Laiko žymos įterpimas"
+ IDS_MICROSOFT_TRUST_LIST_SIGNING "Microsoft patikintų liudijimų sąrašo pasirašymas"
+ IDS_MICROSOFT_TIME_STAMPING "Microsoft laiko žymos įterpimas"
+ IDS_IPSEC_END_SYSTEM "IP saugumo galinė sistema"
+ IDS_IPSEC_TUNNEL "IP saugumo tunelio baigimas"
+ IDS_IPSEC_USER "IP saugumo naudotojas"
+ IDS_EFS "Failų šifravimo sistema"
+ IDS_WHQL_CRYPTO "Windows tvarkyklių patikra"
+ IDS_NT5_CRYPTO "Windows sistemos komponentų patikra"
+ IDS_OEM_WHQL_CRYPTO "OEM Windows sistemos komponentų patikra"
+ IDS_EMBEDDED_NT_CRYPTO "Įtaisytų Windows sistemos komponentų patikra"
+ IDS_KEY_PACK_LICENSES "Kodų pako licencijos"
+ IDS_LICENSE_SERVER "Licencijų serverio patikra"
+ IDS_SMART_CARD_LOGON "Lustinių kortelių įvedimas"
+ IDS_DIGITAL_RIGHTS "Skaitmeninės teisės"
+ IDS_QUALIFIED_SUBORDINATION "Patikslintoji hierarchija"
+ IDS_KEY_RECOVERY "Rakto atkūrimas"
+ IDS_DOCUMENT_SIGNING "Dokumentų pasirašymas"
+ IDS_IPSEC_IKE_INTERMEDIATE "IP saugumo IKE tarpininkas"
+ IDS_FILE_RECOVERY "Failo atkūrimas"
+ IDS_ROOT_LIST_SIGNER "Pagrindinio sąrašo pasirašytojas"
+ IDS_ANY_APPLICATION_POLICIES "Visos programų politikos"
+ IDS_DS_EMAIL_REPLICATION "Katalogų serverio el. pašto dauginimas"
+ IDS_ENROLLMENT_AGENT "Liudijimo užklausos priemonė"
+ IDS_LIFETIME_SIGNING "Gyvavimo ciklo pasirašymas"
+ IDS_ANY_CERT_POLICY "Visos išdavimo politikos"
+}
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_LOCALIZEDNAME_ROOT "Patikimos vyriausiosios liudijimų įstaigos"
+ IDS_LOCALIZEDNAME_MY "Asmeniniai"
+ IDS_LOCALIZEDNAME_CA "Tarpinės liudijimų įstaigos"
+ IDS_LOCALIZEDNAME_ADDRESSBOOK "Kiti žmonės"
+ IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Patikimi publikuotojai"
+ IDS_LOCALIZEDNAME_DISALLOWED "Nepatikimi liudijimai"
+}
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_KEY_ID "Rakto identifikatorius="
+ IDS_CERT_ISSUER "Liudijimo išdavėjas"
+ IDS_CERT_SERIAL_NUMBER "Liudijimo numeris="
+ IDS_ALT_NAME_OTHER_NAME "Kitas vardas="
+ IDS_ALT_NAME_RFC822_NAME "Elektroninio pašto adresas="
+ IDS_ALT_NAME_DNS_NAME "DNS vardas="
+ IDS_ALT_NAME_DIRECTORY_NAME "Katalogo adresas"
+ IDS_ALT_NAME_URL "URL="
+ IDS_ALT_NAME_IP_ADDRESS "IP adresas="
+ IDS_ALT_NAME_MASK "Kaukė="
+ IDS_ALT_NAME_REGISTERED_ID "Registracijos identifikatorius="
+ IDS_USAGE_UNKNOWN "Nežinomas rakto naudojimas"
+ IDS_SUBJECT_TYPE "Subjekto tipas="
+ IDS_SUBJECT_TYPE_CA "LĮ" /* Liudijimo įstaiga */
+ IDS_SUBJECT_TYPE_END_CERT "Esybės pabaiga"
+ IDS_PATH_LENGTH "Kelio ilgio ribojimas="
+ IDS_PATH_LENGTH_NONE "Nėra"
+ IDS_INFO_NOT_AVAILABLE "Informacija neprieinama"
+ IDS_AIA "Įstaigos informacijos prieiga"
+ IDS_ACCESS_METHOD "Prieigos metodas="
+ IDS_ACCESS_METHOD_OCSP "OCSP"
+ IDS_ACCESS_METHOD_CA_ISSUERS "LĮ išdavėjai"
+ IDS_ACCESS_METHOD_UNKNOWN "Nežinomas prieigos metodas"
+ IDS_ACCESS_LOCATION "Alternatyvus vardas"
+ IDS_CRL_DIST_POINT "ALS platinimo vieta"
+ IDS_CRL_DIST_POINT_NAME "Platinimo vietos pavadinimas"
+ IDS_CRL_DIST_POINT_FULL_NAME "Asmenvardis"
+ IDS_CRL_DIST_POINT_RDN_NAME "RDN vardas"
+ IDS_CRL_DIST_POINT_REASON "ALS priežastis="
+ IDS_CRL_DIST_POINT_ISSUER "ALS išdavėjas"
+ IDS_REASON_KEY_COMPROMISE "Pasitikėjimo raktu praradimas"
+ IDS_REASON_CA_COMPROMISE "Pasitikėjimo LĮ praradimas"
+ IDS_REASON_AFFILIATION_CHANGED "Priklausomybės pasikeitimas"
+ IDS_REASON_SUPERSEDED "Išstūmimas"
+ IDS_REASON_CESSATION_OF_OPERATION "Operacijos nutraukimas"
+ IDS_REASON_CERTIFICATE_HOLD "Liudijimo įšaldymas"
+ IDS_FINANCIAL_CRITERIA "Finansinė informacija="
+ IDS_FINANCIAL_CRITERIA_AVAILABLE "Prieinama"
+ IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE "Neprieinama"
+ IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Atitinka kriterijus="
+ IDS_YES "Taip"
+ IDS_NO "Ne"
+ IDS_DIGITAL_SIGNATURE "Skaitmeninis parašas"
+ IDS_NON_REPUDIATION "Negalėjimas išsižadėti"
+ IDS_KEY_ENCIPHERMENT "Rakto užšifravimas"
+ IDS_DATA_ENCIPHERMENT "Duomenų užšifravimas"
+ IDS_KEY_AGREEMENT "Rakto susitarimas"
+ IDS_CERT_SIGN "Liudijimo pasirašymas"
+ IDS_OFFLINE_CRL_SIGN "ALS pasirašymas atsijungus"
+ IDS_CRL_SIGN "ALS pasirašymas"
+ IDS_ENCIPHER_ONLY "Tik užšifravimas"
+ IDS_DECIPHER_ONLY "Tik dešifravimas"
+ IDS_NETSCAPE_SSL_CLIENT "SSL kliento tapatumo nustatymas"
+ IDS_NETSCAPE_SSL_SERVER "SSL serverio tapatumo nustatymas"
+ IDS_NETSCAPE_SMIME "S/MIME"
+ IDS_NETSCAPE_SIGN "Parašas"
+ IDS_NETSCAPE_SSL_CA "SSL LĮ"
+ IDS_NETSCAPE_SMIME_CA "S/MIME LĮ"
+ IDS_NETSCAPE_SIGN_CA "Parašo LĮ"
+}
diff --git a/reactos/dll/win32/crypt32/crypt32_Nl.rc b/reactos/dll/win32/crypt32/crypt32_Nl.rc
index e12d25d775f..bc5cda87c50 100644
--- a/reactos/dll/win32/crypt32/crypt32_Nl.rc
+++ b/reactos/dll/win32/crypt32/crypt32_Nl.rc
@@ -20,6 +20,8 @@
#include "cryptres.h"
+#pragma code_page(65001)
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
@@ -174,6 +176,7 @@ STRINGTABLE DISCARDABLE
IDS_LOCALIZEDNAME_CA "Certificatie Tussen-Autoriteiten"
IDS_LOCALIZEDNAME_ADDRESSBOOK "Overige Personen"
IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Vertrouwde uitgevers"
+ IDS_LOCALIZEDNAME_DISALLOWED "Niet-vertrouwde certificaten"
}
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/crypt32/crypt32_No.rc b/reactos/dll/win32/crypt32/crypt32_No.rc
index 26652860105..b9edbff2837 100644
--- a/reactos/dll/win32/crypt32/crypt32_No.rc
+++ b/reactos/dll/win32/crypt32/crypt32_No.rc
@@ -1,7 +1,7 @@
/*
* crypt32 dll resources
*
- * Copyright (C) 2006 Alexander N. Srnes
+ * Copyright (C) 2006-2009 Alexander N. Sørnes
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,22 +20,24 @@
#include "cryptres.h"
+#pragma code_page(65001)
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
STRINGTABLE DISCARDABLE
{
- IDS_AUTHORITY_KEY_ID "Identifiserer for autentiseringsnkkel"
- IDS_KEY_ATTRIBUTES "Nkkelegenskaper"
- IDS_KEY_USAGE_RESTRICTION "Begrensning av nkkelbruk"
+ IDS_AUTHORITY_KEY_ID "Identifiserer for autentiseringsnøkkel"
+ IDS_KEY_ATTRIBUTES "Nøkkelegenskaper"
+ IDS_KEY_USAGE_RESTRICTION "Begrensning av nøkkelbruk"
IDS_SUBJECT_ALT_NAME "Alternativt navn for emne"
IDS_ISSUER_ALT_NAME "Alternativt navn for utsteder"
IDS_BASIC_CONSTRAINTS "Basisbegrensninger"
- IDS_KEY_USAGE "Nkkelbruk"
+ IDS_KEY_USAGE "Nøkkelbruk"
IDS_CERT_POLICIES "Sertifikatholdninger"
- IDS_SUBJECT_KEY_IDENTIFIER "Identifiserer for emnenkkel"
+ IDS_SUBJECT_KEY_IDENTIFIER "Identifiserer for emnenøkkel"
IDS_CRL_REASON_CODE "CRL-grunnkode"
IDS_CRL_DIST_POINTS "CRL-distribusjonspunkter"
- IDS_ENHANCED_KEY_USAGE "Forbedret nkkelbruk"
+ IDS_ENHANCED_KEY_USAGE "Forbedret nøkkelbruk"
IDS_AUTHORITY_INFO_ACCESS "Myndighet-informasjonstilgang"
IDS_CERT_EXTENSIONS "Sertifikatutvidelser"
IDS_NEXT_UPDATE_LOCATION "Neste oppdateringsplassering"
@@ -54,7 +56,7 @@ STRINGTABLE DISCARDABLE
IDS_USER_NOTICE "Brukervarsel"
IDS_OCSP "On-line Certificate Status Protocol"
IDS_CA_ISSUER "Utsteder for sertifiseringsautoritet"
- IDS_CERT_TEMPLATE_NAME "Navn p sertifiseringsmal"
+ IDS_CERT_TEMPLATE_NAME "Navn på sertifiseringsmal"
IDS_CERT_TYPE "Sertifikattype"
IDS_CERT_MANIFOLD "Sertifikatmangfold"
IDS_NETSCAPE_CERT_TYPE "Netscape-sertifikattype"
@@ -94,15 +96,15 @@ STRINGTABLE DISCARDABLE
IDS_ISSUING_DIST_POINT "Utsteder distribusjonspunkt"
IDS_FRESHEST_CRL "Nyeste CRL"
IDS_NAME_CONSTRAINTS "Navnebegrensninger"
- IDS_POLICY_MAPPINGS "Framgangsmtekartlegginger"
- IDS_POLICY_CONSTRAINTS "Framgangsmtebegresninger"
+ IDS_POLICY_MAPPINGS "Framgangsmåtekartlegginger"
+ IDS_POLICY_CONSTRAINTS "Framgangsmåtebegresninger"
IDS_CROSS_CERT_DIST_POINTS "Distribusjonspunkter for kryss-sertifikat"
- IDS_APPLICATION_POLICIES "Framgangsmter for programmers"
- IDS_APPLICATION_POLICY_MAPPINGS "Framgangsmtekartlegginger for programmer"
- IDS_APPLICATION_POLICY_CONSTRAINTS "Framgangsmtebegrensninger for programmer"
+ IDS_APPLICATION_POLICIES "Framgangsmåter for programmers"
+ IDS_APPLICATION_POLICY_MAPPINGS "Framgangsmåtekartlegginger for programmer"
+ IDS_APPLICATION_POLICY_CONSTRAINTS "Framgangsmåtebegrensninger for programmer"
IDS_CMC_DATA "CMC-data"
IDS_CMC_RESPONSE "CMS-svar"
- IDS_UNSIGNED_CMC_REQUEST "Usignert CMC-foresprsel"
+ IDS_UNSIGNED_CMC_REQUEST "Usignert CMC-forespørsel"
IDS_CMC_STATUS_INFO "CMC-statusinformasjon"
IDS_CMC_EXTENSIONS "CMC-utvidelser"
IDS_CMC_ATTRIBUTES "CMC-egenskaper"
@@ -110,30 +112,30 @@ STRINGTABLE DISCARDABLE
IDS_PKCS_7_SIGNED "PKCS 7 Signert"
IDS_PKCS_7_ENVELOPED "PKCS 7 Innpakket"
IDS_PKCS_7_SIGNED_ENVELOPED "PKCS 7 Signert Innpakket"
- IDS_PKCS_7_DIGESTED "PKCS 7 Fordyet"
+ IDS_PKCS_7_DIGESTED "PKCS 7 Fordøyet"
IDS_PKCS_7_ENCRYPTED "PKCS 7 Kryptert"
IDS_PREVIOUS_CA_CERT_HASH "Forrige CA-sertifikatlappskaus"
IDS_CRL_VIRTUAL_BASE "Virtuelt basis-CRL-nummer"
IDS_CRL_NEXT_PUBLISH "Neste CRL-utgiving"
IDS_CA_EXCHANGE "CA-krypteringssertifikat"
- IDS_KEY_RECOVERY_AGENT "Agent for nkkelgjenoppretting"
+ IDS_KEY_RECOVERY_AGENT "Agent for nøkkelgjenoppretting"
IDS_CERTIFICATE_TEMPLATE "Informasjon om sertifikatmal"
IDS_ENTERPRISE_ROOT_OID "Storselskap-rot-OID"
IDS_RDN_DUMMY_SIGNER "Tullesignerer"
- IDS_ARCHIVED_KEY_ATTR "Kryptert privat nkkel"
+ IDS_ARCHIVED_KEY_ATTR "Kryptert privat nøkkel"
IDS_CRL_SELF_CDP "Publisert CRL-plasseringer"
- IDS_REQUIRE_CERT_CHAIN_POLICY "Hndhev sertifikatlenkepolitikk"
+ IDS_REQUIRE_CERT_CHAIN_POLICY "Håndhev sertifikatlenkepolitikk"
IDS_TRANSACTION_ID "Transaksjons-id"
IDS_SENDER_NONCE "Gjeldende sender"
IDS_RECIPIENT_NONCE "Gjeldende mottaker"
IDS_REG_INFO "Reg info"
IDS_GET_CERTIFICATE "Hent sertifikat"
IDS_GET_CRL "Hent CRL"
- IDS_REVOKE_REQUEST "Gjenoppliv foresprsel"
- IDS_QUERY_PENDING "Sprring venter"
+ IDS_REVOKE_REQUEST "Gjenoppliv forespørsel"
+ IDS_QUERY_PENDING "Spørring venter"
IDS_SORTED_CTL "Tillitsliste for sertifikater"
- IDS_ARCHIVED_KEY_CERT_HASH "Arkivert nkkelsertifikatlappskaus"
- IDS_PRIVATE_KEY_USAGE_PERIOD "Privat nkkelbrukperiode"
+ IDS_ARCHIVED_KEY_CERT_HASH "Arkivert nøkkelsertifikatlappskaus"
+ IDS_PRIVATE_KEY_USAGE_PERIOD "Privat nøkkelbrukperiode"
IDS_CLIENT_INFORMATION "Klientinformasjon"
IDS_SERVER_AUTHENTICATION "Tjenerautentisering"
IDS_CLIENT_AUTHENTICATION "Klientautentisering"
@@ -150,21 +152,21 @@ STRINGTABLE DISCARDABLE
IDS_NT5_CRYPTO "Windows sytemkomponent-godkjenning"
IDS_OEM_WHQL_CRYPTO "OEM Windows systemkomponent-godkjenning"
IDS_EMBEDDED_NT_CRYPTO "Innebygget Windows systemkomponent-godkjenning"
- IDS_KEY_PACK_LICENSES "Nkkelpakkelisenser"
+ IDS_KEY_PACK_LICENSES "Nøkkelpakkelisenser"
IDS_LICENSE_SERVER "Lisenstjener-verifisering"
- IDS_SMART_CARD_LOGON "Smart Card-plogging"
+ IDS_SMART_CARD_LOGON "Smart Card-pålogging"
IDS_DIGITAL_RIGHTS "Digitale rettigheter"
IDS_QUALIFIED_SUBORDINATION "Kvalifisert underordinering"
- IDS_KEY_RECOVERY "Nkkelgjenoppretting"
+ IDS_KEY_RECOVERY "Nøkkelgjenoppretting"
IDS_DOCUMENT_SIGNING "Dokumentsignering"
IDS_IPSEC_IKE_INTERMEDIATE "IP-sikkerhet IKE viderekommen"
IDS_FILE_RECOVERY "Filgjenoppretting"
IDS_ROOT_LIST_SIGNER "Rotlistesignerer"
- IDS_ANY_APPLICATION_POLICIES "Alle framgangsmter for programmer"
+ IDS_ANY_APPLICATION_POLICIES "Alle framgangsmåter for programmer"
IDS_DS_EMAIL_REPLICATION "Katalogtjeneste e-postreplikering"
- IDS_ENROLLMENT_AGENT "Agent for sertifikatforesprsler"
+ IDS_ENROLLMENT_AGENT "Agent for sertifikatforespørsler"
IDS_LIFETIME_SIGNING "Livstidsignering"
- IDS_ANY_CERT_POLICY "Alle framgangsmter for utsteding"
+ IDS_ANY_CERT_POLICY "Alle framgangsmåter for utsteding"
}
STRINGTABLE DISCARDABLE
@@ -173,4 +175,69 @@ STRINGTABLE DISCARDABLE
IDS_LOCALIZEDNAME_MY "Personlig"
IDS_LOCALIZEDNAME_CA "Mellomliggende sertifiseringsinstanser"
IDS_LOCALIZEDNAME_ADDRESSBOOK "Andre personer"
+ IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Betrodde utgivere"
+ IDS_LOCALIZEDNAME_DISALLOWED "Mistrodde sertifikater"
+}
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_KEY_ID "NøkkelID="
+ IDS_CERT_ISSUER "Utsteder"
+ IDS_CERT_SERIAL_NUMBER "Serienummer="
+ IDS_ALT_NAME_OTHER_NAME "Annet navn="
+ IDS_ALT_NAME_RFC822_NAME "E-postadresse="
+ IDS_ALT_NAME_DNS_NAME "DNS-navn="
+ IDS_ALT_NAME_DIRECTORY_NAME "Katalogadresse"
+ IDS_ALT_NAME_URL "URL="
+ IDS_ALT_NAME_IP_ADDRESS "IP-adresse="
+ IDS_ALT_NAME_MASK "Mask="
+ IDS_ALT_NAME_REGISTERED_ID "Registrert ID="
+ IDS_USAGE_UNKNOWN "Ukjent nøkkelbruk"
+ IDS_SUBJECT_TYPE "Emnetype="
+ IDS_SUBJECT_TYPE_CA "CA"
+ IDS_SUBJECT_TYPE_END_CERT "Sluttenhet"
+ IDS_PATH_LENGTH "Begrensning på stilengde="
+ IDS_PATH_LENGTH_NONE "Ingen"
+ IDS_INFO_NOT_AVAILABLE "Informasjonen er utilgjengelig"
+ IDS_AIA "Tilgang til autoritetsinfo"
+ IDS_ACCESS_METHOD "Tilgangsmetode="
+ IDS_ACCESS_METHOD_OCSP "OCSP"
+ IDS_ACCESS_METHOD_CA_ISSUERS "CA-utstedere"
+ IDS_ACCESS_METHOD_UNKNOWN "Ukjent tilgangsmetode"
+ IDS_ACCESS_LOCATION "Alternativt navn"
+ IDS_CRL_DIST_POINT "Distribusjonspunkt for CRL"
+ IDS_CRL_DIST_POINT_NAME "Navn på distribusjonspunkt"
+ IDS_CRL_DIST_POINT_FULL_NAME "Fult navn"
+ IDS_CRL_DIST_POINT_RDN_NAME "RDN-navn"
+ IDS_CRL_DIST_POINT_REASON "CRL-årsak="
+ IDS_CRL_DIST_POINT_ISSUER "CRL-utsteder"
+ IDS_REASON_KEY_COMPROMISE "Nøkellkompromiss"
+ IDS_REASON_CA_COMPROMISE "CA-kompromiss"
+ IDS_REASON_AFFILIATION_CHANGED "Tilslutning endret"
+ IDS_REASON_SUPERSEDED "Erstattet"
+ IDS_REASON_CESSATION_OF_OPERATION "Operasjonen opphørte"
+ IDS_REASON_CERTIFICATE_HOLD "Sertifikatet er holdt tilbake"
+ IDS_FINANCIAL_CRITERIA "Finansiell informasjon="
+ IDS_FINANCIAL_CRITERIA_AVAILABLE "Tilgjengelig"
+ IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE "Ikke tilgjengelig"
+ IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Møter kriterier="
+ IDS_YES "Ja"
+ IDS_NO "Nei"
+ IDS_DIGITAL_SIGNATURE "Digital signatur"
+ IDS_NON_REPUDIATION "Kan ikke tilbakekalles"
+ IDS_KEY_ENCIPHERMENT "Nøkkelkryptering"
+ IDS_DATA_ENCIPHERMENT "Datakryptering"
+ IDS_KEY_AGREEMENT "Nøkkel-avtale"
+ IDS_CERT_SIGN "Sertifikatsignering"
+ IDS_OFFLINE_CRL_SIGN "Lokal CRL-signering"
+ IDS_CRL_SIGN "CRL-signering"
+ IDS_ENCIPHER_ONLY "Kun kryptering"
+ IDS_DECIPHER_ONLY "Kun dekryptering"
+ IDS_NETSCAPE_SSL_CLIENT "Autentisering av SSL-klient"
+ IDS_NETSCAPE_SSL_SERVER "Autentisering av SSL-tjener"
+ IDS_NETSCAPE_SMIME "S/MIME"
+ IDS_NETSCAPE_SIGN "Signatur"
+ IDS_NETSCAPE_SSL_CA "SSL CA"
+ IDS_NETSCAPE_SMIME_CA "S/MIME CA"
+ IDS_NETSCAPE_SIGN_CA "Signatur CA"
}
diff --git a/reactos/dll/win32/crypt32/crypt32_Pt.rc b/reactos/dll/win32/crypt32/crypt32_Pt.rc
index 5c5d3b701fb..dcce8097a01 100644
--- a/reactos/dll/win32/crypt32/crypt32_Pt.rc
+++ b/reactos/dll/win32/crypt32/crypt32_Pt.rc
@@ -20,7 +20,9 @@
#include "cryptres.h"
-LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
+LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
STRINGTABLE DISCARDABLE
{
@@ -108,11 +110,11 @@ STRINGTABLE DISCARDABLE
IDS_CMC_ATTRIBUTES "Atributos CMC"
IDS_PKCS_7_DATA "Dados PKCS 7"
IDS_PKCS_7_SIGNED "Assinado PKCS 7"
- IDS_PKCS_7_ENVELOPED "PKCS 7 Enveloped"
- IDS_PKCS_7_SIGNED_ENVELOPED "PKCS 7 Signed Enveloped"
+ IDS_PKCS_7_ENVELOPED "PKCS 7 Envolvido"
+ IDS_PKCS_7_SIGNED_ENVELOPED "PKCS 7 Assinado Envolvido"
IDS_PKCS_7_DIGESTED "PKCS 7 Resumido"
IDS_PKCS_7_ENCRYPTED "PKCS 7 Cifrado"
- IDS_PREVIOUS_CA_CERT_HASH "Hash Certificado CA prévio"
+ IDS_PREVIOUS_CA_CERT_HASH "Hash anterior de Certificado CA"
IDS_CRL_VIRTUAL_BASE "Número CRL de Base Virtual"
IDS_CRL_NEXT_PUBLISH "Próxima Publicação CRL"
IDS_CA_EXCHANGE "Certificado de Cifra CA"
@@ -173,6 +175,8 @@ STRINGTABLE DISCARDABLE
IDS_LOCALIZEDNAME_MY "Pessoal"
IDS_LOCALIZEDNAME_CA "Autoridades de Certificação Intermédias"
IDS_LOCALIZEDNAME_ADDRESSBOOK "Outras pessoas"
+ IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Publicadores Confiáveis"
+ IDS_LOCALIZEDNAME_DISALLOWED "Certificados Desconfiáveis"
}
STRINGTABLE DISCARDABLE
@@ -219,4 +223,21 @@ STRINGTABLE DISCARDABLE
IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Conforme os Critérios="
IDS_YES "Sim"
IDS_NO "Não"
+ IDS_DIGITAL_SIGNATURE "Assinatura Digital"
+ IDS_NON_REPUDIATION "Não-Repudiação"
+ IDS_KEY_ENCIPHERMENT "Ciframento de Chaves"
+ IDS_DATA_ENCIPHERMENT "Ciframento de Dados"
+ IDS_KEY_AGREEMENT "Acordo de Chaves"
+ IDS_CERT_SIGN "Assinatura de Certificados"
+ IDS_OFFLINE_CRL_SIGN "Assinatura CRL Off-line"
+ IDS_CRL_SIGN "Assinatura CRL"
+ IDS_ENCIPHER_ONLY "Cifrar apenas"
+ IDS_DECIPHER_ONLY "Decifrar apenas"
+ IDS_NETSCAPE_SSL_CLIENT "Autenticação de Cliente SSL"
+ IDS_NETSCAPE_SSL_SERVER "Autenticação de Servidor SSL"
+ IDS_NETSCAPE_SMIME "S/MIME"
+ IDS_NETSCAPE_SIGN "Assinatura"
+ IDS_NETSCAPE_SSL_CA "SSL CA"
+ IDS_NETSCAPE_SMIME_CA "S/MIME CA"
+ IDS_NETSCAPE_SIGN_CA "CA de Assinatura"
}
diff --git a/reactos/dll/win32/crypt32/crypt32_Ro.rc b/reactos/dll/win32/crypt32/crypt32_Ro.rc
index 65d1c1eb91b..10e33ea4794 100644
--- a/reactos/dll/win32/crypt32/crypt32_Ro.rc
+++ b/reactos/dll/win32/crypt32/crypt32_Ro.rc
@@ -177,6 +177,7 @@ STRINGTABLE DISCARDABLE
IDS_LOCALIZEDNAME_CA "Autorități intermediare de certificare"
IDS_LOCALIZEDNAME_ADDRESSBOOK "Alte persoane"
IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Editor de încredere"
+ IDS_LOCALIZEDNAME_DISALLOWED "Lipsite de încredere"
}
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/crypt32/cryptres.h b/reactos/dll/win32/crypt32/cryptres.h
index f9845be25ab..0bbffcc58f1 100644
--- a/reactos/dll/win32/crypt32/cryptres.h
+++ b/reactos/dll/win32/crypt32/cryptres.h
@@ -167,6 +167,7 @@
#define IDS_LOCALIZEDNAME_CA 1143
#define IDS_LOCALIZEDNAME_ADDRESSBOOK 1144
#define IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER 1145
+#define IDS_LOCALIZEDNAME_DISALLOWED 1146
#define IDS_KEY_ID 1200
#define IDS_CERT_ISSUER 1201
diff --git a/reactos/dll/win32/crypt32/oid.c b/reactos/dll/win32/crypt32/oid.c
index f0ea8ea8767..ddc6efc7655 100644
--- a/reactos/dll/win32/crypt32/oid.c
+++ b/reactos/dll/win32/crypt32/oid.c
@@ -82,7 +82,8 @@ static const WCHAR MY[] = {'M','Y',0};
static const WCHAR CA[] = {'C','A',0};
static const WCHAR ADDRESSBOOK[] = {'A','D','D','R','E','S','S','B','O','O','K',0};
static const WCHAR TRUSTEDPUBLISHER[] = {'T','r','u','s','t','e','d','P','u','b','l','i','s','h','e','r',0};
-static const LPCWSTR LocalizedKeys[] = {ROOT,MY,CA,ADDRESSBOOK,TRUSTEDPUBLISHER};
+static const WCHAR DISALLOWED[] = {'D','i','s','a','l','l','o','w','e','d',0};
+static const LPCWSTR LocalizedKeys[] = {ROOT,MY,CA,ADDRESSBOOK,TRUSTEDPUBLISHER,DISALLOWED};
static WCHAR LocalizedNames[sizeof(LocalizedKeys)/sizeof(LocalizedKeys[0])][256];
static void free_function_sets(void)
diff --git a/reactos/dll/win32/crypt32/rootstore.c b/reactos/dll/win32/crypt32/rootstore.c
index a2ed6e55542..bd6dfac450a 100644
--- a/reactos/dll/win32/crypt32/rootstore.c
+++ b/reactos/dll/win32/crypt32/rootstore.c
@@ -339,9 +339,9 @@ static BOOL import_certs_from_dir(LPCSTR path, HCERTSTORE store)
ret = TRUE;
}
}
- closedir(dir);
CryptMemFree(filebuf);
}
+ closedir(dir);
}
return ret;
#else
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg.rbuild b/reactos/dll/win32/cryptdlg/cryptdlg.rbuild
index 6a56a7a294e..cc86691a7fd 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg.rbuild
+++ b/reactos/dll/win32/cryptdlg/cryptdlg.rbuild
@@ -15,11 +15,5 @@
wintrust
ntdll
main.c
- cryptdlg_De.rc
- cryptdlg_En.rc
- cryptdlg_Fr.rc
- cryptdlg_Ko.rc
- cryptdlg_Lt.rc
- cryptdlg_Nl.rc
- cryptdlg_Ro.rc
+ cryptdlg.rc
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg.rc b/reactos/dll/win32/cryptdlg/cryptdlg.rc
new file mode 100644
index 00000000000..dd9f97f4fde
--- /dev/null
+++ b/reactos/dll/win32/cryptdlg/cryptdlg.rc
@@ -0,0 +1,32 @@
+/*
+ * cryptdlg dll resources
+ *
+ * Copyright 2008 Juan Lang
+ *
+ * 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 "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "cryptres.h"
+
+#include "cryptdlg_De.rc"
+#include "cryptdlg_En.rc"
+#include "cryptdlg_Fr.rc"
+#include "cryptdlg_Ko.rc"
+#include "cryptdlg_Lt.rc"
+#include "cryptdlg_Nl.rc"
+#include "cryptdlg_Pt.rc"
+#include "cryptdlg_Ro.rc"
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_De.rc b/reactos/dll/win32/cryptdlg/cryptdlg_De.rc
index d3181ef51b0..cd3fa96c013 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg_De.rc
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_De.rc
@@ -20,6 +20,8 @@
#include "cryptres.h"
+#pragma code_page(65001)
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_En.rc b/reactos/dll/win32/cryptdlg/cryptdlg_En.rc
index 3ab5f94cbbd..72ceecddc9f 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg_En.rc
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_En.rc
@@ -28,7 +28,7 @@ STRINGTABLE DISCARDABLE
IDS_POLICY_ID "Policy Identifier: "
IDS_POLICY_QUALIFIER_INFO "Policy Qualifier Info"
IDS_POLICY_QUALIFIER_ID "Policy Qualifier Id="
- IDS_CPS "CPS"
+ IDS_CPS "CPS" /* Certification Practice Statement */
IDS_USER_NOTICE "User Notice"
IDS_QUALIFIER "Qualifier"
IDS_NOTICE_REF "Notice Reference"
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc
index f71be3ae0fd..1deeaa31587 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc
@@ -1,7 +1,8 @@
/*
* cryptdlg dll French resources
*
- * Copyright 2008 Jonathan Ernst
+ * Copyright 2008 Jonathan Ernst
+ * Copyright 2009 Frédéric Delanoy
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,19 +21,23 @@
#include "cryptres.h"
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
IDS_CERT_POLICY "Politique de certificat"
IDS_POLICY_ID "Identifiant de politique : "
- IDS_POLICY_QUALIFIER_INFO "Policy Qualifier Info"
- IDS_POLICY_QUALIFIER_ID "Policy Qualifier Id="
- IDS_CPS "CPS"
- IDS_USER_NOTICE "User Notice"
- IDS_QUALIFIER "Qualifier"
- IDS_NOTICE_REF "Notice Reference"
- IDS_ORGANIZATION "Organisation="
- IDS_NOTICE_NUM "Notice Number="
- IDS_NOTICE_TEXT "Notice Text="
+ IDS_POLICY_QUALIFIER_INFO "Informations sur le qualificateur de politique"
+ IDS_POLICY_QUALIFIER_ID "Id de qualificateur de politique ="
+ IDS_CPS "Énoncé des pratiques de certification (CPS)"
+ IDS_USER_NOTICE "Avis utilisateur"
+ IDS_QUALIFIER "Qualificateur"
+ IDS_NOTICE_REF "Référence à l'avis"
+ IDS_ORGANIZATION "Organisation ="
+ IDS_NOTICE_NUM "Numéro de l'avis ="
+ IDS_NOTICE_TEXT "Texte de l'avis ="
}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc
index 548a74d7939..e9a6d9d8e97 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc
@@ -29,7 +29,7 @@ STRINGTABLE DISCARDABLE
IDS_POLICY_ID "å ĺ: "
IDS_POLICY_QUALIFIER_INFO "å "
IDS_POLICY_QUALIFIER_ID "å ̵="
- IDS_CPS "CPS"
+ IDS_CPS "CPS"/* */
IDS_USER_NOTICE " "
IDS_QUALIFIER ""
IDS_NOTICE_REF " "
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc
index a9674946ba5..74ef2937baf 100644
--- a/reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc
@@ -31,7 +31,7 @@ STRINGTABLE DISCARDABLE
IDS_POLICY_ID "Politikos identifikatorius: "
IDS_POLICY_QUALIFIER_INFO "Politikos kvalifikatoriaus informacija"
IDS_POLICY_QUALIFIER_ID "Politikos kvalifikatoriaus identifikatorius="
- IDS_CPS "CPS"
+ IDS_CPS "Sertifikavimo Veiklos Nuostatos (CPS)"
IDS_USER_NOTICE "Naudotojo pranešimas"
IDS_QUALIFIER "Kvalifikatorius"
IDS_NOTICE_REF "Pranešimo nuoroda"
diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Pt.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Pt.rc
new file mode 100644
index 00000000000..92d179cd5cd
--- /dev/null
+++ b/reactos/dll/win32/cryptdlg/cryptdlg_Pt.rc
@@ -0,0 +1,40 @@
+/*
+ * cryptdlg dll Portuguese resources
+ *
+ * Copyright 2008 Ricardo Filipe
+ *
+ * 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 "cryptres.h"
+
+#pragma code_page(65001)
+
+LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_CERT_POLICY "Política de Certificados"
+ IDS_POLICY_ID "Identificador da Política: "
+ IDS_POLICY_QUALIFIER_INFO "Informação do Qualificador da Política"
+ IDS_POLICY_QUALIFIER_ID "ID do Qualificador da Política="
+ IDS_CPS "CPS" /* Certification Practice Statement */
+ IDS_USER_NOTICE "Aviso ao Utilizador"
+ IDS_QUALIFIER "Qualificador"
+ IDS_NOTICE_REF "Referência do Aviso"
+ IDS_ORGANIZATION "Organização="
+ IDS_NOTICE_NUM "Número do Aviso="
+ IDS_NOTICE_TEXT "Texto do Aviso="
+}
diff --git a/reactos/dll/win32/cryptnet/cryptnet_main.c b/reactos/dll/win32/cryptnet/cryptnet_main.c
index 83346a0bbd2..9301a56733b 100644
--- a/reactos/dll/win32/cryptnet/cryptnet_main.c
+++ b/reactos/dll/win32/cryptnet/cryptnet_main.c
@@ -608,7 +608,7 @@ static BOOL CRYPT_DownloadObject(DWORD dwRetrievalFlags, HINTERNET hHttp,
* creates a new cache entry for the object and writes the object to it.
* Sets the expiration time of the cache entry to expires.
*/
-static void CRYPT_CacheURL(LPCWSTR pszURL, PCRYPT_BLOB_ARRAY pObject,
+static void CRYPT_CacheURL(LPCWSTR pszURL, const CRYPT_BLOB_ARRAY *pObject,
DWORD dwRetrievalFlags, FILETIME expires)
{
WCHAR cacheFileName[MAX_PATH];
@@ -692,7 +692,7 @@ static void CALLBACK CRYPT_InetStatusCallback(HINTERNET hInt,
}
}
-static BOOL CRYPT_Connect(URL_COMPONENTSW *components,
+static BOOL CRYPT_Connect(const URL_COMPONENTSW *components,
struct InetContext *context, PCRYPT_CREDENTIALS pCredentials,
HINTERNET *phInt, HINTERNET *phHost)
{
@@ -1049,7 +1049,7 @@ static BOOL CRYPT_GetRetrieveFunction(LPCWSTR pszURL,
}
static BOOL WINAPI CRYPT_CreateBlob(LPCSTR pszObjectOid,
- DWORD dwRetrievalFlags, PCRYPT_BLOB_ARRAY pObject, void **ppvContext)
+ DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
{
DWORD size, i;
CRYPT_BLOB_ARRAY *context;
@@ -1086,7 +1086,7 @@ static BOOL WINAPI CRYPT_CreateBlob(LPCSTR pszObjectOid,
typedef BOOL (WINAPI *AddContextToStore)(HCERTSTORE hCertStore,
const void *pContext, DWORD dwAddDisposition, const void **ppStoreContext);
-static BOOL CRYPT_CreateContext(PCRYPT_BLOB_ARRAY pObject,
+static BOOL CRYPT_CreateContext(const CRYPT_BLOB_ARRAY *pObject,
DWORD dwExpectedContentTypeFlags, AddContextToStore addFunc, void **ppvContext)
{
BOOL ret = TRUE;
@@ -1142,28 +1142,28 @@ static BOOL CRYPT_CreateContext(PCRYPT_BLOB_ARRAY pObject,
}
static BOOL WINAPI CRYPT_CreateCert(LPCSTR pszObjectOid,
- DWORD dwRetrievalFlags, PCRYPT_BLOB_ARRAY pObject, void **ppvContext)
+ DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
{
return CRYPT_CreateContext(pObject, CERT_QUERY_CONTENT_FLAG_CERT,
(AddContextToStore)CertAddCertificateContextToStore, ppvContext);
}
static BOOL WINAPI CRYPT_CreateCRL(LPCSTR pszObjectOid,
- DWORD dwRetrievalFlags, PCRYPT_BLOB_ARRAY pObject, void **ppvContext)
+ DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
{
return CRYPT_CreateContext(pObject, CERT_QUERY_CONTENT_FLAG_CRL,
(AddContextToStore)CertAddCRLContextToStore, ppvContext);
}
static BOOL WINAPI CRYPT_CreateCTL(LPCSTR pszObjectOid,
- DWORD dwRetrievalFlags, PCRYPT_BLOB_ARRAY pObject, void **ppvContext)
+ DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
{
return CRYPT_CreateContext(pObject, CERT_QUERY_CONTENT_FLAG_CTL,
(AddContextToStore)CertAddCTLContextToStore, ppvContext);
}
static BOOL WINAPI CRYPT_CreatePKCS7(LPCSTR pszObjectOid,
- DWORD dwRetrievalFlags, PCRYPT_BLOB_ARRAY pObject, void **ppvContext)
+ DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
{
BOOL ret;
@@ -1187,7 +1187,7 @@ static BOOL WINAPI CRYPT_CreatePKCS7(LPCSTR pszObjectOid,
}
static BOOL WINAPI CRYPT_CreateAny(LPCSTR pszObjectOid,
- DWORD dwRetrievalFlags, PCRYPT_BLOB_ARRAY pObject, void **ppvContext)
+ DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext)
{
BOOL ret;
@@ -1273,7 +1273,7 @@ static BOOL WINAPI CRYPT_CreateAny(LPCSTR pszObjectOid,
}
typedef BOOL (WINAPI *ContextDllCreateObjectContext)(LPCSTR pszObjectOid,
- DWORD dwRetrievalFlags, PCRYPT_BLOB_ARRAY pObject, void **ppvContext);
+ DWORD dwRetrievalFlags, const CRYPT_BLOB_ARRAY *pObject, void **ppvContext);
static BOOL CRYPT_GetCreateFunction(LPCSTR pszObjectOid,
ContextDllCreateObjectContext *pFunc, HCRYPTOIDFUNCADDR *phFunc)
@@ -1322,10 +1322,10 @@ static BOOL CRYPT_GetCreateFunction(LPCSTR pszObjectOid,
return ret;
}
-typedef BOOL (*get_object_expiration_func)(void *pvContext,
+typedef BOOL (*get_object_expiration_func)(const void *pvContext,
FILETIME *expiration);
-static BOOL CRYPT_GetExpirationFromCert(void *pvObject, FILETIME *expiration)
+static BOOL CRYPT_GetExpirationFromCert(const void *pvObject, FILETIME *expiration)
{
PCCERT_CONTEXT cert = pvObject;
@@ -1333,7 +1333,7 @@ static BOOL CRYPT_GetExpirationFromCert(void *pvObject, FILETIME *expiration)
return TRUE;
}
-static BOOL CRYPT_GetExpirationFromCRL(void *pvObject, FILETIME *expiration)
+static BOOL CRYPT_GetExpirationFromCRL(const void *pvObject, FILETIME *expiration)
{
PCCRL_CONTEXT cert = pvObject;
@@ -1341,7 +1341,7 @@ static BOOL CRYPT_GetExpirationFromCRL(void *pvObject, FILETIME *expiration)
return TRUE;
}
-static BOOL CRYPT_GetExpirationFromCTL(void *pvObject, FILETIME *expiration)
+static BOOL CRYPT_GetExpirationFromCTL(const void *pvObject, FILETIME *expiration)
{
PCCTL_CONTEXT cert = pvObject;
diff --git a/reactos/dll/win32/cryptui/cryptui.rbuild b/reactos/dll/win32/cryptui/cryptui.rbuild
index b8cffc0a9a1..fde45de40de 100644
--- a/reactos/dll/win32/cryptui/cryptui.rbuild
+++ b/reactos/dll/win32/cryptui/cryptui.rbuild
@@ -7,13 +7,9 @@
.
include/reactos/wine
+
main.c
cryptui.rc
- cryptui_De.rc
- cryptui_En.rc
- cryptui_Fr.rc
- cryptui_Ko.rc
- cryptui_Nl.rc
wine
kernel32
user32
diff --git a/reactos/dll/win32/cryptui/cryptui.rc b/reactos/dll/win32/cryptui/cryptui.rc
index 00d490273ef..5460ca2dec7 100644
--- a/reactos/dll/win32/cryptui/cryptui.rc
+++ b/reactos/dll/win32/cryptui/cryptui.rc
@@ -17,6 +17,11 @@
* 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 "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "commctrl.h"
+#include "dlgs.h"
#include "cryptuires.h"
@@ -40,3 +45,11 @@ IDB_CERT_WATERMARK BITMAP LOADONCALL DISCARDABLE certwatermark.bmp
/* @makedep: certheader.bmp */
IDB_CERT_HEADER BITMAP LOADONCALL DISCARDABLE certheader.bmp
+
+#include "cryptui_De.rc"
+#include "cryptui_En.rc"
+#include "cryptui_Fr.rc"
+#include "cryptui_Ko.rc"
+#include "cryptui_Lt.rc"
+#include "cryptui_Nl.rc"
+#include "cryptui_Pt.rc"
diff --git a/reactos/dll/win32/cryptui/cryptui_En.rc b/reactos/dll/win32/cryptui/cryptui_En.rc
index 1335f0ebe3b..5aee197a5f0 100644
--- a/reactos/dll/win32/cryptui/cryptui_En.rc
+++ b/reactos/dll/win32/cryptui/cryptui_En.rc
@@ -285,16 +285,16 @@ CAPTION "Certificate Import Wizard"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Welcome to the Certificate Import Wizard", IDC_IMPORT_TITLE,
- 115,1,195,40
+ 115,7,195,12
LTEXT "This wizard helps you import certificates, certificate revocation lists, and certificate trust lists from a file to a certificate store.",
- -1, 115,33,195,16
+ -1, 115,26,195,25
LTEXT "A certificate can be used to identify you or the computer with which you are communicating. It can also be used for authentication, and to sign messages. Certificate stores are collections of certificates, certificate revocation lists, and certificate trust lists.",
-1, 115,56,195,40
LTEXT "To continue, click Next.",
-1, 115,103,195,8
END
-IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,143
+IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,178
CAPTION "Certificate Import Wizard"
FONT 8, "MS Shell Dlg"
BEGIN
@@ -325,7 +325,7 @@ BEGIN
PUSHBUTTON "B&rowse...", IDC_IMPORT_BROWSE_STORE, 236,49,60,14
END
-IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
+IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,178
CAPTION "Certificate Import Wizard"
FONT 8, "MS Shell Dlg"
BEGIN
@@ -381,9 +381,9 @@ CAPTION "Certificate Export Wizard"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Welcome to the Certificate Export Wizard", IDC_EXPORT_TITLE,
- 115,1,195,40
+ 115,7,195,12
LTEXT "This wizard helps you export certificates, certificate revocation lists, and certificate trust lists from a certificate store to a file.",
- -1, 115,33,195,16
+ -1, 115,26,195,25
LTEXT "A certificate can be used to identify you or the computer with which you are communicating. It can also be used for authentication, and to sign messages. Certificate stores are collections of certificates, certificate revocation lists, and certificate trust lists.",
-1, 115,56,195,40
LTEXT "To continue, click Next.",
@@ -394,8 +394,8 @@ IDD_EXPORT_PRIVATE_KEY DIALOG DISCARDABLE 0,0,317,143
CAPTION "Certificate Export Wizard"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "If you choose to export the private key, you will be prompted for a password to protect the private key on a later page.", -1, 21,1,195,23
- LTEXT "Do you wish to export the private key?", -1, 21,24,195,15
+ LTEXT "If you choose to export the private key, you will be prompted for a password to protect the private key on a later page.", -1, 21,1,195,25
+ LTEXT "Do you wish to export the private key?", -1, 21,27,195,10
AUTORADIOBUTTON "&Yes, export the private key",
IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
AUTORADIOBUTTON "N&o, do not export the private key",
@@ -419,22 +419,22 @@ FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Select the format you want to use:", -1, 21,1,195,10
AUTORADIOBUTTON "&DER-encoded X.509 (.cer)",
- IDC_EXPORT_FORMAT_DER, 31,18,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ IDC_EXPORT_FORMAT_DER, 31,18,240,12, BS_AUTORADIOBUTTON|WS_TABSTOP
AUTORADIOBUTTON "Ba&se64-encoded X.509 (.cer):",
- IDC_EXPORT_FORMAT_BASE64, 31,30,200,12, BS_AUTORADIOBUTTON
+ IDC_EXPORT_FORMAT_BASE64, 31,30,240,12, BS_AUTORADIOBUTTON
AUTORADIOBUTTON "&Cryptographic Message Syntax Standard/PKCS #7 Message (.p7b)",
- IDC_EXPORT_FORMAT_CMS, 31,42,200,12, BS_AUTORADIOBUTTON
+ IDC_EXPORT_FORMAT_CMS, 31,42,240,12, BS_AUTORADIOBUTTON
CHECKBOX "&Include all certificates in the certification path if possible",
- IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,240,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
AUTORADIOBUTTON "&Personal Information Exchange/PKCS #12 (.pfx)",
- IDC_EXPORT_FORMAT_PFX, 31,72,200,12, BS_AUTORADIOBUTTON|WS_DISABLED
+ IDC_EXPORT_FORMAT_PFX, 31,72,240,12, BS_AUTORADIOBUTTON|WS_DISABLED
CHECKBOX "Incl&ude all certificates in the certification path if possible",
- IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,240,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
CHECKBOX "&Enable strong encryption",
- IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,200,8,
+ IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,240,8,
BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
CHECKBOX "Delete the private &key if the export is successful",
- IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,200,8,
+ IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,240,8,
BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
END
@@ -447,7 +447,7 @@ BEGIN
PUSHBUTTON "B&rowse...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14
END
-IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
+IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,178
CAPTION "Certificate Export Wizard"
FONT 8, "MS Shell Dlg"
BEGIN
diff --git a/reactos/dll/win32/cryptui/cryptui_Fr.rc b/reactos/dll/win32/cryptui/cryptui_Fr.rc
index 22fceda0cda..16b847fc6e7 100644
--- a/reactos/dll/win32/cryptui/cryptui_Fr.rc
+++ b/reactos/dll/win32/cryptui/cryptui_Fr.rc
@@ -74,12 +74,12 @@ STRINGTABLE DISCARDABLE
IDS_IMPORT_FILE_SUBTITLE "Spécifiez le fichier à importer."
IDS_IMPORT_STORE_TITLE "Magasin de certificats"
IDS_IMPORT_STORE_SUBTITLE "Les magasins de certificats sont des collections de certificats, de listes de révocation de certificats et de listes de certificats de confiance."
- IDS_IMPORT_FILTER_CERT "Certificat X.509 (*.cer; *.crt)"
- IDS_IMPORT_FILTER_PFX "Échange d'informations personnelles (*.pfx; *.p12)"
+ IDS_IMPORT_FILTER_CERT "Certificat X.509 (*.cer ; *.crt)"
+ IDS_IMPORT_FILTER_PFX "Échange d'informations personnelles (*.pfx ; *.p12)"
IDS_IMPORT_FILTER_CRL "Liste de révocation de certificats (*.crl)"
IDS_IMPORT_FILTER_CTL "Liste de certificats de confiance (*.stl)"
IDS_IMPORT_FILTER_SERIALIZED_STORE "Magasin de certificats sérialisés Microsoft (*.sst)"
- IDS_IMPORT_FILTER_CMS "Messages CMS/PKCS #7 (*.spc; *.p7b)"
+ IDS_IMPORT_FILTER_CMS "Messages CMS/PKCS #7 (*.spc ; *.p7b)"
IDS_IMPORT_FILTER_ALL "Tous les fichiers (*.*)"
IDS_IMPORT_EMPTY_FILE "Sélectionnez un fichier."
IDS_IMPORT_BAD_FORMAT "Le format du fichier n'est pas reconnu. Sélectionnez un autre fichier."
@@ -146,7 +146,7 @@ STRINGTABLE DISCARDABLE
IDS_PURPOSE_CA_EXCHANGE "Archivage de clé privée"
IDS_PURPOSE_KEY_RECOVERY_AGENT "Agent de recouvrement de clé"
IDS_PURPOSE_DS_EMAIL_REPLICATION "Réplication de courriers électroniques du service d'annuaire"
- IDS_EXPORT_WIZARD "Assistant Exportation de certificat"
+ IDS_EXPORT_WIZARD "Assistant Exportation de certificats"
IDS_EXPORT_FORMAT_TITLE "Format d'export"
IDS_EXPORT_FORMAT_SUBTITLE "Choisissez le format dans lequel le contenu sera sauvé."
IDS_EXPORT_FILE_TITLE "Nom du fichier à exporter"
@@ -191,8 +191,8 @@ BEGIN
CONTROL "", -1, "Static", SS_BLACKFRAME, 16,116,222,1
CONTROL "", IDC_CERTIFICATE_NAMES,"RichEdit20W",
ES_READONLY|ES_MULTILINE|WS_DISABLED,8,118,238,90
- PUSHBUTTON "&Installer un certificat...", IDC_ADDTOSTORE,103,216,70,14
- PUSHBUTTON "&Déclaration de l'émetteur", IDC_ISSUERSTATEMENT,177,216,70,14
+ PUSHBUTTON "&Installer un certificat...", IDC_ADDTOSTORE,73,216,86,14
+ PUSHBUTTON "&Déclaration de l'émetteur", IDC_ISSUERSTATEMENT,161,216,86,14
END
IDD_DETAIL DIALOG DISCARDABLE 0, 0, 255, 236
@@ -200,16 +200,16 @@ CAPTION "Détails"
STYLE WS_VISIBLE
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "&Afficher :", -1, 6,12,40,14
- COMBOBOX IDC_DETAIL_SELECT, 28,10,100,14,
+ LTEXT "&Afficher :", -1, 6,11,33,14
+ COMBOBOX IDC_DETAIL_SELECT, 39,10,100,14,
CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP
CONTROL "", IDC_DETAIL_LIST, "SysListView32",
LVS_REPORT|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
6,28,241,100
CONTROL "", IDC_DETAIL_VALUE, "RichEdit20W",
ES_READONLY|ES_MULTILINE|WS_TABSTOP, 6,136,241,70
- PUSHBUTTON "É&diter les propriétés...", IDC_EDITPROPERTIES,103,216,70,14
- PUSHBUTTON "&Copier dans le fichier...", IDC_EXPORT,177,216,70,14
+ PUSHBUTTON "É&diter les propriétés...", IDC_EDITPROPERTIES,83,216,80,14
+ PUSHBUTTON "&Copier dans le fichier...", IDC_EXPORT,167,216,80,14
END
IDD_HIERARCHY DIALOG DISCARDABLE 0, 0, 255, 236
@@ -221,7 +221,7 @@ BEGIN
CONTROL "",IDC_CERTPATH, "SysTreeView32", TVS_HASLINES|WS_BORDER,
13,22,231,130
PUSHBUTTON "&Voir le certificat", IDC_VIEWCERTIFICATE,175,156,70,14
- LTEXT "É&tant du certificat :", IDC_CERTIFICATESTATUS,6,183,70,14
+ LTEXT "É&tat du certificat :", IDC_CERTIFICATESTATUS,6,183,70,14
CONTROL "", IDC_CERTIFICATESTATUSTEXT,"RichEdit20W",
WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,195,245,36
END
@@ -233,8 +233,8 @@ FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "", IDC_USERNOTICE,"RichEdit20W",
WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,10,241,200
- PUSHBUTTON "Fermer", IDOK,103,216,70,14
- PUSHBUTTON "&Informations complémentaires", IDC_CPS,177,216,70,14
+ PUSHBUTTON "Fermer", IDOK,77,216,83,14
+ PUSHBUTTON "&Infos complémentaires", IDC_CPS,164,216,83,14
END
IDD_CERT_PROPERTIES_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236
@@ -244,7 +244,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "&Nom convivial :", -1, 6,14,60,14
EDITTEXT IDC_FRIENDLY_NAME, 60,12,191,14, ES_AUTOHSCROLL|WS_TABSTOP
- LTEXT "&Description:", -1, 6,32,60,14
+ LTEXT "&Description :", -1, 6,32,60,14
EDITTEXT IDC_DESCRIPTION, 60,30,191,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL
GROUPBOX "Rôles du certificat", -1,6,48,245,165, BS_GROUPBOX
AUTORADIOBUTTON "Activer &tous les rôles prévus pour ce certificat",
@@ -256,7 +256,7 @@ BEGIN
CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32",
LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
24,100,220,90
- PUSHBUTTON "&Ajouter un rôle...", IDC_ADD_PURPOSE,184,194,60,14
+ PUSHBUTTON "&Ajouter un rôle...", IDC_ADD_PURPOSE,180,194,64,14
END
IDD_ADD_CERT_PURPOSE DIALOG DISCARDABLE 0,0,200,68
@@ -277,7 +277,7 @@ BEGIN
LTEXT "Sélectionnez le magasin de certificats à utiliser :", IDC_STORE_TEXT, 6,6,190,28
CONTROL "",IDC_STORE_LIST, "SysTreeView32", TVS_HASLINES|WS_BORDER|WS_TABSTOP,
6,28,188,70
- CHECKBOX "&Montrer les magasins (emplacements de stockage) physiques", IDC_SHOW_PHYSICAL_STORES, 6,102,90,14,
+ CHECKBOX "&Montrer les magasins physiques", IDC_SHOW_PHYSICAL_STORES, 6,102,117,14,
BS_AUTOCHECKBOX|WS_TABSTOP
PUSHBUTTON "OK", IDOK, 90,118,50,14, BS_DEFPUSHBUTTON
PUSHBUTTON "Annuler", IDCANCEL, 144,118,50,14
@@ -288,13 +288,13 @@ CAPTION "Assistant d'importation de certificats"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Bienvenue dans l'assistant d'importation de certificats", IDC_IMPORT_TITLE,
- 115,1,195,40
+ 115,6,195,12
LTEXT "Cet assistant vous aide à importer des certificats, des listes de révocation de certificats et des listes de certificats de confiance dans un magasin de certificats à partir d'un fichier.",
- -1, 115,33,195,16
+ -1, 115,22,195,25
LTEXT "Un certificat peut être utilisé pour vous identifier, ou pour identifier l'ordinateur avec lequel vous communiquez. Il peut également être utilisé à des fins d'authentification ou de signature de messages. Les magasins de certificats sont des collections de certificats, de listes de révocation de certificats et de listes de certificats de confiance.",
- -1, 115,56,195,40
- LTEXT "Pour continuer, cliquez Suivant.",
- -1, 115,103,195,8
+ -1, 115,56,195,49
+ LTEXT "Pour continuer, cliquez sur Suivant.",
+ -1, 115,114,195,8
END
IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,143
@@ -319,23 +319,23 @@ CAPTION "Assistant Importation de certificats"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Wine peut sélectionner automatiquement un magasin de certificats, ou vous pouvez spécifier l'emplacement des certificats.",
- -1, 21,1,195,20
+ -1, 21,1,212,18
AUTORADIOBUTTON "Sélectionner &automatiquement un magasin de certificats",
- IDC_IMPORT_AUTO_STORE, 31,18,180,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ IDC_IMPORT_AUTO_STORE, 31,18,194,12, BS_AUTORADIOBUTTON|WS_TABSTOP
AUTORADIOBUTTON "Placer tous les certificats dans le &magasin suivant :",
- IDC_IMPORT_SPECIFY_STORE, 31,30,180,12, BS_AUTORADIOBUTTON
+ IDC_IMPORT_SPECIFY_STORE, 31,30,194,12, BS_AUTORADIOBUTTON
EDITTEXT IDC_IMPORT_STORE, 44,49,185,14, ES_READONLY
PUSHBUTTON "&Parcourir...", IDC_IMPORT_BROWSE_STORE, 236,49,60,14
END
-IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
-CAPTION "Assistant Importation de certificat"
+IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,179
+CAPTION "Assistant Importation de certificats"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Clôturer l'assistant d'importation de certificat", IDC_IMPORT_TITLE,
- 115,1,195,40
- LTEXT "Vous avez terminé avec succès l'assistant d'importation de certificat.",
- -1, 115,33,195,24
+ LTEXT "Clôture de l'assistant d'importation de certificats", IDC_IMPORT_TITLE,
+ 115,10,195,12
+ LTEXT "Vous avez terminé avec succès l'assistant d'importation de certificats.",
+ -1, 115,31,195,18
LTEXT "Vous avez spécifié les paramètres suivants :",
-1, 115,57,195,12
CONTROL "", IDC_IMPORT_SETTINGS, "SysListView32",
@@ -369,7 +369,7 @@ CAPTION "Options avancées"
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Rôle du certificat", -1, 7,7,234,141, BS_GROUPBOX
- LTEXT "Sélectionnez un ou plusieurs rôles à lister quand les options avancées sont sélectionnées.",
+ LTEXT "Sélectionnez un ou plusieurs rôles à afficher quand les options avancées sont sélectionnées.",
-1, 14,18,220,16
LTEXT "&Rôles du certificat :", -1, 14,41,90,12, WS_TABSTOP
CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32",
@@ -384,21 +384,21 @@ CAPTION "Assistant d'exportation de certificats"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Bienvenue dans l'assistant d'exportation de certificats", IDC_EXPORT_TITLE,
- 115,1,195,40
+ 115,6,195,12
LTEXT "Cet assistant vous aide à exporter des certificats, des listes de révocation de certificats et des listes de certificats de confiance dans un fichier à partir d'un magasin de certificats.",
- -1, 115,33,195,16
+ -1, 115,22,195,25
LTEXT "Un certificat peut être utilisé pour vous identifier, ou pour identifier l'ordinateur avec lequel vous communiquez. Il peut également être utilisé à des fins d'authentification ou de signature de messages. Les magasins de certificats sont des collections de certificats, de listes de révocation de certificats et de listes de certificats de confiance.",
- -1, 115,56,195,40
- LTEXT "Pour continuer, cliquez Suivant.",
- -1, 115,103,195,8
+ -1, 115,56,195,49
+ LTEXT "Pour continuer, cliquez sur Suivant.",
+ -1, 115,114,195,8
END
IDD_EXPORT_PRIVATE_KEY DIALOG DISCARDABLE 0,0,317,143
-CAPTION "Assistant Exportation de certificat"
+CAPTION "Assistant Exportation de certificats"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Si vous choisissez d'exporter la clé privée, on vous demandera un mot de passe pour protéger la clé privée dans une page ultérieure.", -1, 21,1,195,23
- LTEXT "Voulez-vous exporter la clé privée ?", -1, 21,24,195,15
+ LTEXT "Si vous choisissez d'exporter la clé privée, on vous demandera un mot de passe pour protéger la clé privée dans une page ultérieure.", -1, 21,1,195,25
+ LTEXT "Voulez-vous exporter la clé privée ?", -1, 21,27,195,10
AUTORADIOBUTTON "&Oui, exporter la clé privée",
IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
AUTORADIOBUTTON "&Non, ne pas exporter la clé privée",
@@ -407,32 +407,32 @@ BEGIN
END
IDD_EXPORT_PASSWORD DIALOG DISCARDABLE 0,0,317,143
-CAPTION "Assistant Exportation de certificat"
+CAPTION "Assistant Exportation de certificats"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "&Mot de passe :", -1, 21,1,195,10
EDITTEXT IDC_EXPORT_PASSWORD, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
- LTEXT "&Confirmez le mot de passe:", -1, 21,35,195,10
+ LTEXT "&Confirmez le mot de passe :", -1, 21,35,195,10
EDITTEXT IDC_EXPORT_PASSWORD_CONFIRM, 21,45,208,14, ES_AUTOHSCROLL|WS_TABSTOP
END
IDD_EXPORT_FORMAT DIALOG DISCARDABLE 0,0,317,143
-CAPTION "Assistant Exportation de certificat"
+CAPTION "Assistant Exportation de certificats"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Sélectionnez le format à utiliser :", -1, 21,1,195,10
AUTORADIOBUTTON "Binaire codé &DER X.509 (*.cer)",
IDC_EXPORT_FORMAT_DER, 31,18,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
- AUTORADIOBUTTON "Binaire codé Ba&se64 X.509 (.cer):",
+ AUTORADIOBUTTON "Binaire codé Ba&se64 X.509 (.cer) :",
IDC_EXPORT_FORMAT_BASE64, 31,30,200,12, BS_AUTORADIOBUTTON
AUTORADIOBUTTON "Standard de syntaxe de message cryptographique - Messages PKCS #7 (.p7b)",
IDC_EXPORT_FORMAT_CMS, 31,42,200,12, BS_AUTORADIOBUTTON
CHECKBOX "&Inclure tous les certificats dans le chemin de certification si possible"
- IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,230,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
AUTORADIOBUTTON "Échange d'informations &Personnelles - PKCS #12 (.pfx)",
IDC_EXPORT_FORMAT_PFX, 31,72,200,12, BS_AUTORADIOBUTTON|WS_DISABLED
CHECKBOX "Inclure &tous les certificats dans le chemin de certification si possible",
- IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,230,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
CHECKBOX "&Activer le chiffrement fort",
IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,200,8,
BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
@@ -442,7 +442,7 @@ BEGIN
END
IDD_EXPORT_FILE DIALOG DISCARDABLE 0,0,317,143
-CAPTION "Assistant Exportation de certificat"
+CAPTION "Assistant Exportation de certificats"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "&Nom du fichier :", -1, 21,1,195,10
@@ -450,17 +450,18 @@ BEGIN
PUSHBUTTON "Parco&urir...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14
END
-IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
-CAPTION "Assistant Exportation de certificat"
+IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,179
+CAPTION "Assistant Exportation de certificats"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "Clôturer l'assistant d'exportation de certificat", IDC_EXPORT_TITLE,
- 115,1,195,40
- LTEXT "Vous avez terminé avec succès l'assistant d'importation de certificat.",
- -1, 115,33,195,24
+ LTEXT "Clôture de l'assistant d'exportation de certificats", IDC_EXPORT_TITLE,
+ 115,10,195,12
+ LTEXT "Vous avez terminé avec succès l'assistant d'exportation de certificats.",
+ -1, 115,31,195,18
LTEXT "Vous avez spécifié les paramètres suivants :",
-1, 115,57,195,12
CONTROL "", IDC_EXPORT_SETTINGS, "SysListView32",
LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
115,67,174,100
END
+#pragma code_page(default)
diff --git a/reactos/dll/win32/cryptui/cryptui_Ko.rc b/reactos/dll/win32/cryptui/cryptui_Ko.rc
index 6cbf6fee8b1..66064114d7f 100644
--- a/reactos/dll/win32/cryptui/cryptui_Ko.rc
+++ b/reactos/dll/win32/cryptui/cryptui_Ko.rc
@@ -282,13 +282,13 @@ IDD_IMPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143
CAPTION " "
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT " 翡 ȯմϴ", IDC_IMPORT_TITLE,115,1,195,40
- LTEXT " Ϸκ , ı , ŷ ҿ ݴϴ.",-1, 115,33,195,16
+ LTEXT " 翡 ȯմϴ", IDC_IMPORT_TITLE,115,7,195,12
+ LTEXT " Ϸκ , ı , ŷ ҿ ݴϴ.",-1, 115,26,195,25
LTEXT " ̳ ſ ϴ ǻ ſϴ ˴ϴ. ϰ ϴ ˴ϴ. Ҵ , ı , ŷ Դϴ.",-1, 115,56,195,40
LTEXT "Ϸ, ŬϽʽÿ.",-1, 115,103,195,8
END
-IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,143
+IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,178
CAPTION " "
FONT 8, "MS Shell Dlg"
BEGIN
@@ -312,7 +312,7 @@ BEGIN
PUSHBUTTON "ã(&R)...", IDC_IMPORT_BROWSE_STORE, 236,49,60,14
END
-IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
+IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,178
CAPTION " "
FONT 8, "MS Shell Dlg"
BEGIN
@@ -366,9 +366,9 @@ CAPTION "
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT " 翡 ȯմϴ", IDC_EXPORT_TITLE,
- 115,1,195,40
+ 115,7,195,12
LTEXT " , , ŷ ҷκ Ϸ ̴ٰϴ.",
- -1, 115,33,195,16
+ -1, 115,26,195,25
LTEXT " ̳ ſ ϴ ǻ ſϴ ˴ϴ. ϰ ϴ ˴ϴ. Ҵ , ı , ŷ Դϴ..",
-1, 115,56,195,40
LTEXT " ϽǷ, <> ŬϽʽÿ.",
@@ -379,8 +379,8 @@ IDD_EXPORT_PRIVATE_KEY DIALOG DISCARDABLE 0,0,317,143
CAPTION " "
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT " Ű ⸦ ϸ, Ű ȣ ȣ Էϰ Դϴ.", -1, 21,1,195,23
- LTEXT " Ű ⸦ մϱ?", -1, 21,24,195,15
+ LTEXT " Ű ⸦ ϸ, Ű ȣ ȣ Էϰ Դϴ.", -1, 21,1,195,25
+ LTEXT " Ű ⸦ մϱ?", -1, 21,27,195,10
AUTORADIOBUTTON "(&Y), Ű ",
IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
AUTORADIOBUTTON "ƴϿ(&O), Ű ",
@@ -404,22 +404,22 @@ FONT 8, "MS Shell Dlg"
BEGIN
LTEXT " :", -1, 21,1,195,10
AUTORADIOBUTTON "&DER-ȣȭ X.509 (.cer)",
- IDC_EXPORT_FORMAT_DER, 31,18,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ IDC_EXPORT_FORMAT_DER, 31,18,240,12, BS_AUTORADIOBUTTON|WS_TABSTOP
AUTORADIOBUTTON "Ba&se64-ȣȭ X.509 (.cer):",
- IDC_EXPORT_FORMAT_BASE64, 31,30,200,12, BS_AUTORADIOBUTTON
+ IDC_EXPORT_FORMAT_BASE64, 31,30,240,12, BS_AUTORADIOBUTTON
AUTORADIOBUTTON "ȣ ǥ/PKCS #7 (&C) (.p7b)",
- IDC_EXPORT_FORMAT_CMS, 31,42,200,12, BS_AUTORADIOBUTTON
+ IDC_EXPORT_FORMAT_CMS, 31,42,240,12, BS_AUTORADIOBUTTON
CHECKBOX " ο ִ (&I)",
- IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,240,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
AUTORADIOBUTTON " ȯ(&P)/PKCS #12 (.pfx)",
- IDC_EXPORT_FORMAT_PFX, 31,72,200,12, BS_AUTORADIOBUTTON|WS_DISABLED
+ IDC_EXPORT_FORMAT_PFX, 31,72,240,12, BS_AUTORADIOBUTTON|WS_DISABLED
CHECKBOX " ο ִ (&U)",
- IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,240,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
CHECKBOX " ȣȭ (&E)",
- IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,200,8,
+ IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,240,8,
BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
CHECKBOX "Ⱑ ϸ Ű (&K)",
- IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,200,8,
+ IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,240,8,
BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
END
@@ -432,7 +432,7 @@ BEGIN
PUSHBUTTON "ã(&R)...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14
END
-IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
+IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,178
CAPTION " "
FONT 8, "MS Shell Dlg"
BEGIN
diff --git a/reactos/dll/win32/cryptui/cryptui_Lt.rc b/reactos/dll/win32/cryptui/cryptui_Lt.rc
new file mode 100644
index 00000000000..d4ba0eb2608
--- /dev/null
+++ b/reactos/dll/win32/cryptui/cryptui_Lt.rc
@@ -0,0 +1,466 @@
+/*
+ * cryptui dll resources
+ *
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "cryptuires.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_CERTIFICATE "Liudijimas"
+ IDS_CERTIFICATEINFORMATION "Liudijimo informacija"
+ IDS_CERT_INFO_BAD_SIG "Šis liudijimas turi neteisingą parašą. Liudijimas galėjo būti pakeistas ar pažeistas."
+ IDS_CERT_INFO_UNTRUSTED_CA "Šis vyriausiasis liudijimas yra nepatikimas. Norėdami juo pasitikėti įtraukite jį į sistemos patikimų vyriausiųjų liudijimų saugyklą."
+ IDS_CERT_INFO_UNTRUSTED_ROOT "Nepavyko patvirtinti šio liudijimo pagal patikimą vyriausiąjį liudijimą."
+ IDS_CERT_INFO_PARTIAL_CHAIN "Nepavyko rasti liudijimo išdavėjo."
+ IDS_CERT_INFO_BAD_PURPOSES "Nepavyko patikrinti visų šio liudijimo paskirties tikslų."
+ IDS_CERT_INFO_PURPOSES "Šis liudijimas yra skirtas šiems tikslams:"
+ IDS_SUBJECT_HEADING "Kam išduota: "
+ IDS_ISSUER_HEADING "Išdavė: "
+ IDS_VALID_FROM "Galioja nuo "
+ IDS_VALID_TO " iki "
+ IDS_CERTIFICATE_BAD_SIGNATURE "Šis liudijimas turi neteisingą parašą."
+ IDS_CERTIFICATE_BAD_TIME "Šis liudijimas jau nebegalioja arba dar negalioja."
+ IDS_CERTIFICATE_BAD_TIMENEST "Šio liudijimo galiojimo periodas yra didesnis už išdavėjo."
+ IDS_CERTIFICATE_REVOKED "Šis liudijimas buvo panaikintas išdavėjo."
+ IDS_CERTIFICATE_VALID "Šis liudijimas yra geras."
+ IDS_FIELD "Laukas"
+ IDS_VALUE "Reikšmė"
+ IDS_FIELDS_ALL ""
+ IDS_FIELDS_V1 "Tik pirmos versijos laukai"
+ IDS_FIELDS_EXTENSIONS "Tik plėtiniai"
+ IDS_FIELDS_CRITICAL_EXTENSIONS "Tik būtini plėtiniai"
+ IDS_FIELDS_PROPERTIES "Tik savybės"
+ IDS_FIELD_VERSION "Versija"
+ IDS_FIELD_SERIAL_NUMBER "Numeris"
+ IDS_FIELD_ISSUER "Išdavėjas"
+ IDS_FIELD_VALID_FROM "Galioja nuo"
+ IDS_FIELD_VALID_TO "Galioja iki"
+ IDS_FIELD_SUBJECT "Subjektas"
+ IDS_FIELD_PUBLIC_KEY "Viešasis raktas"
+ IDS_FIELD_PUBLIC_KEY_FORMAT "%s (%d bitai)"
+ IDS_PROP_HASH "maiša SHA1"
+ IDS_PROP_ENHKEY_USAGE "Ypatingas rakto naudojimas (savybė)"
+ IDS_PROP_FRIENDLY_NAME "Draugiškas vardas"
+ IDS_PROP_DESCRIPTION "Aprašas"
+ IDS_CERTIFICATE_PROPERTIES "Liudijimo savybės"
+ IDS_CERTIFICATE_PURPOSE_ERROR "Prašau įveskite organizacijos identifikatorių tokia forma: 1.2.3.4"
+ IDS_CERTIFICATE_PURPOSE_EXISTS "Įvestas organizacijos identifikatorius jau egzistuoja."
+ IDS_SELECT_STORE_TITLE "Išrinkite liudijimų saugyklą"
+ IDS_SELECT_STORE "Prašau išrinkite liudijimų saugyklą."
+ IDS_IMPORT_WIZARD "Liudijimo importo vediklis"
+ IDS_IMPORT_TYPE_MISMATCH "Faile yra objektų, kurie neatitinka nustatytų kriterijų. Prašau išrinkite kitą failą."
+ IDS_IMPORT_FILE_TITLE "Importo failas"
+ IDS_IMPORT_FILE_SUBTITLE "Nurodykite failą importui."
+ IDS_IMPORT_STORE_TITLE "Liudijimų saugykla"
+ IDS_IMPORT_STORE_SUBTITLE "Liudijimų saugyklos yra liudijimų rinkiniai, atšauktų liudijimų sąrašai ir patikintų liudijimų sąrašai."
+ IDS_IMPORT_FILTER_CERT "X.509 liudijimas (*.cer; *.crt)"
+ IDS_IMPORT_FILTER_PFX "Asmeninės informacijos mainai (*.pfx; *.p12)"
+ IDS_IMPORT_FILTER_CRL "Atšauktų liudijimų sąrašas (*.crl)"
+ IDS_IMPORT_FILTER_CTL "Patikintų liudijimų sąrašas (*.stl)"
+ IDS_IMPORT_FILTER_SERIALIZED_STORE "Išdėstyta serijomis liudijimų saugykla (*.sst)"
+ IDS_IMPORT_FILTER_CMS "CMS/PKCS #7 pranešimai (*.spc; *.p7b)"
+ IDS_IMPORT_FILTER_ALL "Visi failai (*.*)"
+ IDS_IMPORT_EMPTY_FILE "Prašau išrinkite failą."
+ IDS_IMPORT_BAD_FORMAT "Neatpažintas failo formatas. Prašau išrinkite kitą failą."
+ IDS_IMPORT_OPEN_FAILED "Nepavyko atverti "
+ IDS_IMPORT_DEST_DETERMINED "Nustatyta programos"
+ IDS_IMPORT_SELECT_STORE "Prašau išrinkite saugyklą"
+ IDS_IMPORT_STORE_SELECTION "Išrinkta liudijimų saugykla"
+ IDS_IMPORT_DEST_AUTOMATIC "Automatiškai nustatyta programos"
+ IDS_IMPORT_FILE "Failas"
+ IDS_IMPORT_CONTENT "Turinys"
+ IDS_IMPORT_CONTENT_CERT "Liudijimas"
+ IDS_IMPORT_CONTENT_CRL "Atšauktų liudijimų sąrašas"
+ IDS_IMPORT_CONTENT_CTL "Patikintų liudijimų sąrašas"
+ IDS_IMPORT_CONTENT_CMS "CMS/PKCS #7 pranešimas"
+ IDS_IMPORT_CONTENT_PFX "Asmeninės informacijos mainai"
+ IDS_IMPORT_CONTENT_STORE "Liudijimų saugykla"
+ IDS_IMPORT_SUCCEEDED "Importas sėkmingas."
+ IDS_IMPORT_FAILED "Importas nepavyko."
+ IDS_WIZARD_TITLE_FONT "Arial"
+ IDS_PURPOSE_ALL ""
+ IDS_PURPOSE_ADVANCED ""
+ IDS_SUBJECT_COLUMN "Kam išduotas"
+ IDS_ISSUER_COLUMN "Išdavė"
+ IDS_EXPIRATION_COLUMN "Galiojimo data"
+ IDS_FRIENDLY_NAME_COLUMN "Draugiškas vardas"
+ IDS_ALLOWED_PURPOSE_ALL ""
+ IDS_ALLOWED_PURPOSE_NONE ""
+ IDS_WARN_REMOVE_MY "Su šiuo liudijimu jūs daugiau nebegalėsite iššifruoti pranešimų ar pasirašyti pranešimų.\nAr tikrai norite pašalinti šį liudijimą?"
+ IDS_WARN_REMOVE_PLURAL_MY "Su šiuo liudijimu jūs daugiau nebegalėsite iššifruoti pranešimų ar pasirašyti pranešimų.\nAr tikrai norite pašalinti šiuos liudijimus?"
+ IDS_WARN_REMOVE_ADDRESSBOOK "Su šiuo liudijimu jūs daugiau nebegalėsite iššifruoti pranešimų ar patikrinti pasirašytų pranešimų.\nAr tikrai norite pašalinti šį liudijimą?"
+ IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "Su šiuo liudijimu jūs daugiau nebegalėsite iššifruoti pranešimų ar patikrinti pasirašytų pranešimų.\nAr tikrai norite pašalinti šiuos liudijimus?"
+ IDS_WARN_REMOVE_CA "Liudijimais, išduotais šios liudijimo įstaigos, nebebus pasitikima.\nAr tikrai norite pašalinti šį liudijimą?"
+ IDS_WARN_REMOVE_PLURAL_CA "Liudijimais, išduotais šių liudijimo įstaigų, nebebus pasitikima.\nAr tikrai norite pašalinti šiuos liudijimus?"
+ IDS_WARN_REMOVE_ROOT "Liudijimais, išduotais šios vyriausiosios liudijimo įstaigos, ar bet kurios jos išduotos liudijimų įstaigos liudijimais, nebebus pasitikima.\nAr tikrai norite pašalinti šį patikimą vyriausiąjį liudijimą?"
+ IDS_WARN_REMOVE_PLURAL_ROOT "Liudijimais, išduotais šių vyriausiųjų liudijimo įstaigų, ar bet kurių jų išduotų liudijimų įstaigų liudijimais, nebebus pasitikima.\nAr tikrai norite pašalinti šiuos patikimus vyriausiuosius liudijimus?"
+ IDS_WARN_REMOVE_TRUSTEDPUBLISHER "Nebebus pasitikima programine įranga pasirašyta šio leidėjo.\nAr tikrai norite pašalinti šį liudijimą?"
+ IDS_WARN_REMOVE_PLURAL_TRUSTEDPUBLISHER "Nebebus pasitikima programine įranga pasirašyta šių leidėjų.\nAr tikrai norite pašalinti šiuos liudijimus?"
+ IDS_WARN_REMOVE_DEFAULT "Ar tikrai norite pašalinti šį liudijimą?"
+ IDS_WARN_REMOVE_PLURAL_DEFAULT "Ar tikrai norite pašalinti šiuos liudijimus?"
+ IDS_CERT_MGR "Liudijimai"
+ IDS_PURPOSE_SERVER_AUTH "Garantuoja nutolusio kompiuterio tapatumą"
+ IDS_PURPOSE_CLIENT_AUTH "Įrodo jūsų tapatumą nutolusiam kompiuteriui"
+ IDS_PURPOSE_CODE_SIGNING "Garantuoja, kad programinė įranga yra iš šio leidėjo\nApsaugo programinę įrangą nuo pakeitimų po išleidimo"
+ IDS_PURPOSE_EMAIL_PROTECTION "Apsaugo el. pašto pranešimus"
+ IDS_PURPOSE_IPSEC "Leidžia saugu ryšį internete"
+ IDS_PURPOSE_TIMESTAMP_SIGNING "Leidžia pasirašyti duomenis dabartiniu laiku"
+ IDS_PURPOSE_CTL_USAGE_SIGNING "Leidžia skaitmeniškai pasirašyti patikintų liudijimų sąrašą"
+ IDS_PURPOSE_EFS "Leidžia užšifruoti duomenis diske"
+ IDS_PURPOSE_EFS_RECOVERY "Failų atkūrimas"
+ IDS_PURPOSE_WHQL "Windows tvarkyklių patikra"
+ IDS_PURPOSE_NT5 "Windows sistemos komponentų patikra"
+ IDS_PURPOSE_OEM_WHQL "OEM Windows sistemos komponentų patikra"
+ IDS_PURPOSE_EMBEDDED_NT "Įtaisytų Windows sistemos komponentų patikra"
+ IDS_PURPOSE_ROOT_LIST_SIGNER "Pagrindinio sąrašo pasirašytojas"
+ IDS_PURPOSE_QUALIFIED_SUBORDINATION "Patikslintoji hierarchija"
+ IDS_PURPOSE_KEY_RECOVERY "Rakto atkūrimas"
+ IDS_PURPOSE_DOCUMENT_SIGNING "Dokumentų pasirašymas"
+ IDS_PURPOSE_LIFETIME_SIGNING "Gyvavimo ciklo pasirašymas"
+ IDS_PURPOSE_DRM "Skaitmeninės teisės"
+ IDS_PURPOSE_LICENSES "Kodų pako licencijos"
+ IDS_PURPOSE_LICENSE_SERVER "Licencijų serverio patikra"
+ IDS_PURPOSE_ENROLLMENT_AGENT "Liudijimo užklausos priemonė"
+ IDS_PURPOSE_SMARTCARD_LOGON "Lustinių kortelių įvedimas"
+ IDS_PURPOSE_CA_EXCHANGE "Privačiojo rakto archyvavimas"
+ IDS_PURPOSE_KEY_RECOVERY_AGENT "Rakto atkūrimo priemonė"
+ IDS_PURPOSE_DS_EMAIL_REPLICATION "Katalogų serverio el. pašto dauginimas"
+ IDS_EXPORT_WIZARD "Liudijimo eksporto vediklis"
+ IDS_EXPORT_FORMAT_TITLE "Eksporto formatas"
+ IDS_EXPORT_FORMAT_SUBTITLE "Išsirinkite formatą duomenims išsaugoti."
+ IDS_EXPORT_FILE_TITLE "Eksporto failas"
+ IDS_EXPORT_FILE_SUBTITLE "Nurodykite failą, kuriame bus išsaugoti duomenys."
+ IDS_EXPORT_FILE_EXISTS "Nurodytas failas egzistuoja. Ar norite jį perrašyti?"
+ IDS_EXPORT_FILTER_CERT "DER-užkoduotas dvejetainis X.509 (*.cer)"
+ IDS_EXPORT_FILTER_BASE64_CERT "Base64-užkoduotas X.509 (*.cer)"
+ IDS_EXPORT_FILTER_CRL "Atšauktų liudijimų sąrašas (*.crl)"
+ IDS_EXPORT_FILTER_CTL "Patikintų liudijimų sąrašas (*.stl)"
+ IDS_EXPORT_FILTER_CMS "CMS/PKCS #7 pranešimai (*.p7b)"
+ IDS_EXPORT_FILTER_PFX "Asmeninės informacijos mainai (*.pfx)"
+ IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "Išdėstyta serijomis liudijimų saugykla (*.sst)"
+ IDS_EXPORT_FORMAT "Failo formatas"
+ IDS_EXPORT_INCLUDE_CHAIN "Apimti visus liudijimus liudijimų kelyje"
+ IDS_EXPORT_KEYS "Eksportuoti raktus"
+ IDS_YES "Taip"
+ IDS_NO "Ne"
+ IDS_EXPORT_SUCCEEDED "Eksportas sėkmingas."
+ IDS_EXPORT_FAILED "Eksportas nepavyko."
+ IDS_EXPORT_PRIVATE_KEY_TITLE "Eksportuoti privatųjį raktą"
+ IDS_EXPORT_PRIVATE_KEY_SUBTITLE "Liudijimas turi privatųjį raktą, kuris gali būti išeksportuotas kartu su liudijimu."
+ IDS_EXPORT_PASSWORD_TITLE "Įveskite slaptažodį"
+ IDS_EXPORT_PASSWORD_SUBTITLE "Jūs galite apsaugoti privatųjį raktą slaptažodžiu."
+ IDS_EXPORT_PASSWORD_MISMATCH "Slaptažodžiai nesutampa."
+ IDS_EXPORT_PRIVATE_KEY_UNAVAILABLE "Pastaba: nepavyko atverti privačiojo rakto šiam liudijimui."
+ IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE "Pastaba: šio liudijimo privatusis raktas neišeksportuojamas."
+}
+
+IDD_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Bendras"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", -1, "Static", WS_BORDER|SS_WHITERECT, 6,10,241,200
+ CONTROL "", IDC_CERTIFICATE_ICON,"RichEdit20W",
+ ES_READONLY|WS_DISABLED,8,11,26,26
+ CONTROL "", IDC_CERTIFICATE_INFO,"RichEdit20W",
+ ES_READONLY|WS_DISABLED,34,11,212,26
+ CONTROL "", -1, "Static", SS_BLACKFRAME, 16,37,222,1
+ CONTROL "", IDC_CERTIFICATE_STATUS,"RichEdit20W",
+ ES_READONLY|ES_MULTILINE,8,38,238,78
+ CONTROL "", -1, "Static", SS_BLACKFRAME, 16,116,222,1
+ CONTROL "", IDC_CERTIFICATE_NAMES,"RichEdit20W",
+ ES_READONLY|ES_MULTILINE|WS_DISABLED,8,118,238,90
+ PUSHBUTTON "&Įdiegti liudijimą...", IDC_ADDTOSTORE,103,216,70,14
+ PUSHBUTTON "Išdavėjo &teiginys", IDC_ISSUERSTATEMENT,177,216,70,14
+END
+
+IDD_DETAIL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Išsamiau"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Rodyti:", -1, 6,12,40,14
+ COMBOBOX IDC_DETAIL_SELECT, 33,10,100,14,
+ CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP
+ CONTROL "", IDC_DETAIL_LIST, "SysListView32",
+ LVS_REPORT|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 6,28,241,100
+ CONTROL "", IDC_DETAIL_VALUE, "RichEdit20W",
+ ES_READONLY|ES_MULTILINE|WS_TABSTOP, 6,136,241,70
+ PUSHBUTTON "Redaguoti &savybes...", IDC_EDITPROPERTIES,83,216,80,14
+ PUSHBUTTON "&Kopijuoti į failą...", IDC_EXPORT,167,216,80,14
+END
+
+IDD_HIERARCHY DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Liudijimo kelias"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Liudijimo &kelias", -1,6,10,245,165, BS_GROUPBOX
+ CONTROL "",IDC_CERTPATH, "SysTreeView32", TVS_HASLINES|WS_BORDER,
+ 13,22,231,130
+ PUSHBUTTON "&Peržiūrėti liudijimą", IDC_VIEWCERTIFICATE,175,156,70,14
+ LTEXT "Liudijimo &būsena:", IDC_CERTIFICATESTATUS,6,183,70,14
+ CONTROL "", IDC_CERTIFICATESTATUSTEXT,"RichEdit20W",
+ WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,195,245,36
+END
+
+IDD_USERNOTICE DIALOG DISCARDABLE 0, 0, 255, 256
+CAPTION "Garantijų nedavimas"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", IDC_USERNOTICE,"RichEdit20W",
+ WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,10,241,200
+ PUSHBUTTON "Užverti", IDOK,93,216,75,14
+ PUSHBUTTON "Daugiau &informacijos", IDC_CPS,172,216,75,14
+END
+
+IDD_CERT_PROPERTIES_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Bendras"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Draugiškas vardas:", -1, 6,14,70,14
+ EDITTEXT IDC_FRIENDLY_NAME, 70,12,181,14, ES_AUTOHSCROLL|WS_TABSTOP
+ LTEXT "&Aprašas:", -1, 6,32,70,14
+ EDITTEXT IDC_DESCRIPTION, 70,30,181,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL
+ GROUPBOX "Liudijimo paskirtys", -1,6,48,245,165, BS_GROUPBOX
+ AUTORADIOBUTTON "&Įjungti visas šio liudijimo paskirtis",
+ IDC_ENABLE_ALL_PURPOSES, 12,58,180,14, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "Išj&ungti visas šio liudijimo paskirtis",
+ IDC_DISABLE_ALL_PURPOSES, 12,70,180,14, BS_AUTORADIOBUTTON
+ AUTORADIOBUTTON "Įjungti &tik šias šio liudijimo paskirtis:",
+ IDC_ENABLE_SELECTED_PURPOSES, 12,82,180,14, BS_AUTORADIOBUTTON
+ CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 24,100,220,90
+ PUSHBUTTON "Pridėti &paskirtį...", IDC_ADD_PURPOSE,184,194,60,14
+END
+
+IDD_ADD_CERT_PURPOSE DIALOG DISCARDABLE 0,0,200,68
+CAPTION "Pridėti paskirtį"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Pridėkite objekto identifikatorių (OID) liudijimo paskirčiai, kurią norite pridėti:",
+ -1, 6,6,190,28
+ EDITTEXT IDC_NEW_PURPOSE, 6,28,190,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL
+ PUSHBUTTON "Gerai", IDOK, 33,48,60,14
+ PUSHBUTTON "Atsisakyti", IDCANCEL, 100,48,60,14
+END
+
+IDD_SELECT_STORE DIALOG DISCARDABLE 0,0,200,136
+CAPTION "Išrinkite liudijimų saugyklą"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Išrinkite liudijimų saugyklą, kurią norite naudoti:", IDC_STORE_TEXT, 6,6,190,28
+ CONTROL "",IDC_STORE_LIST, "SysTreeView32", TVS_HASLINES|WS_BORDER|WS_TABSTOP,
+ 6,28,188,70
+ CHECKBOX "&Rodyti fizines saugyklas", IDC_SHOW_PHYSICAL_STORES, 6,102,90,14,
+ BS_AUTOCHECKBOX|WS_TABSTOP
+ PUSHBUTTON "Gerai", IDOK, 90,118,50,14, BS_DEFPUSHBUTTON
+ PUSHBUTTON "Atsisakyti", IDCANCEL, 144,118,50,14
+END
+
+IDD_IMPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Liudijimo importo vediklis"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Sveiki atvėrę liudijimo importo vediklį", IDC_IMPORT_TITLE,
+ 115,1,195,32
+ LTEXT "Šis vediklis padės jums importuoti liudijimus, atšauktų liudijimų sąrašus ir patikintų liudijimų sąrašus iš failo į liudijimų saugyklą.",
+ -1, 115,25,195,24
+ LTEXT "Liudijimas gali būti naudojamas nustatyti jūsų ar kompiuterio su kuriuo esate užmezgę ryšį tapatumą. Jis taip pat gali būti naudojamas pranešimų pasirašymui. Liudijimų saugyklos yra liudijimų rinkiniai, atšauktų liudijimų sąrašai ir patikintų liudijimų sąrašai.",
+ -1, 115,56,195,40
+ LTEXT "Norėdami tęsti, spauskite „Toliau“.",
+ -1, 115,103,195,8
+END
+
+IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Liudijimo importo vediklis"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Failas:", -1, 21,1,195,10
+ EDITTEXT IDC_IMPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ PUSHBUTTON "&Parinkti...", IDC_IMPORT_BROWSE_FILE, 236,11,60,14
+ LTEXT "Pastaba: Šie failų formatai gali turėti daugiau negu vieną liudijimą, atšauktų liudijimų sąrašą ar patikintų liudijimų sąrašą:",
+ -1, 21,26,265,16
+ LTEXT "Kriptografinio pranešimo sintaksės standarto/PKCS #7 pranešimai (.p7b)",
+ -1, 31,49,265,10
+ LTEXT "Asmeninės informacijos mainai/PKCS #12 (.pfx, .p12)",
+ -1, 31,64,265,10
+ LTEXT "Microsoft išdėstyta serijomis liudijimų saugykla (.sst)",
+ -1, 31,79,265,10
+END
+
+IDD_IMPORT_STORE DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Liudijimo importo vediklis"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Wine gali automatiškai parinkti liudijimų saugyklą arba jūs galite nurodyti vietą liudijimams.",
+ -1, 21,1,195,20
+ AUTORADIOBUTTON "Automatiškai pa&rinkti liudijimų saugyklą",
+ IDC_IMPORT_AUTO_STORE, 31,18,180,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "Patalpinti &visus liudijimus į šią saugyklą:",
+ IDC_IMPORT_SPECIFY_STORE, 31,30,180,12, BS_AUTORADIOBUTTON
+ EDITTEXT IDC_IMPORT_STORE, 44,49,185,14, ES_READONLY
+ PUSHBUTTON "&Parinkti...", IDC_IMPORT_BROWSE_STORE, 236,49,60,14
+END
+
+IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Liudijimo importo vediklis"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Liudijimo importo vediklio pabaiga", IDC_IMPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Jūs sėkmingai baigėte liudijimo importo vediklį.",
+ -1, 115,33,195,24
+ LTEXT "Jūs nurodėte šias nuostatas:",
+ -1, 115,57,195,12
+ CONTROL "", IDC_IMPORT_SETTINGS, "SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 115,67,174,100
+END
+
+IDD_CERT_MGR DIALOG DISCARDABLE 0,0,335,270
+CAPTION "Liudijimai"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Numatytos paskirtys:", -1, 7,9,100,12
+ COMBOBOX IDC_MGR_PURPOSE_SELECTION, 83,7,245,14,
+ CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP
+ CONTROL "", IDC_MGR_STORES, "SysTabControl32",
+ WS_CLIPSIBLINGS|WS_TABSTOP, 7,25,321,140
+ CONTROL "", IDC_MGR_CERTS, "SysListView32",
+ LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, 15,46,305,111
+ PUSHBUTTON "&Importuoti...", IDC_MGR_IMPORT, 7,172,51,14
+ PUSHBUTTON "&Eksportuoti...", IDC_MGR_EXPORT, 62,172,51,14, WS_DISABLED
+ PUSHBUTTON "&Šalinti", IDC_MGR_REMOVE, 117,172,51,14, WS_DISABLED
+ PUSHBUTTON "Išs&amiau...", IDC_MGR_ADVANCED, 277,172,51,14
+ GROUPBOX "Liudijimo numatytos paskirtys", -1,7,194,321,47, BS_GROUPBOX
+ LTEXT "", IDC_MGR_PURPOSES, 13,204,252,32
+ PUSHBUTTON "&Peržiūrėti...", IDC_MGR_VIEW, 269,218,51,14, WS_DISABLED
+ PUSHBUTTON "&Užverti", IDCANCEL, 277,249,51,14, BS_DEFPUSHBUTTON
+END
+
+IDD_CERT_MGR_ADVANCED DIALOG DISCARDABLE 0,0,248,176
+CAPTION "Išsamios parinktys"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Liudijimo paskirtis", -1, 7,7,234,141, BS_GROUPBOX
+ LTEXT "Išrinkite vieną ar daugiau paskirčių rodymui, kai yra pasirinkta „papildomos paskirtys“.",
+ -1, 14,18,220,16
+ LTEXT "&Liudijimo paskirtys:", -1, 14,41,90,12, WS_TABSTOP
+ CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 14,51,220,90
+ PUSHBUTTON "Gerai", IDOK, 132,155,51,14, BS_DEFPUSHBUTTON
+ PUSHBUTTON "Atsisakyti", IDCANCEL, 190,155,51,14
+END
+
+IDD_EXPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Liudijimo eksporto vediklis"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Sveiki atvėrę liudijimo eksporto vediklį", IDC_EXPORT_TITLE,
+ 115,1,195,32
+ LTEXT "Šis valdiklis padės jums eksportuoti liudijimus, atšauktų liudijimų sąrašus ir patikintų liudijimų sąrašus iš liudijimų saugyklos į failą.",
+ -1, 115,25,195,24
+ LTEXT "Liudijimas gali būti naudojamas nustatyti jūsų ar kompiuterio su kuriuo esate užmezgę ryšį tapatumą. Jis taip pat gali būti naudojamas pranešimų pasirašymui. Liudijimų saugyklos yra liudijimų rinkiniai, atšauktų liudijimų sąrašai ir patikintų liudijimų sąrašai.",
+ -1, 115,56,195,40
+ LTEXT "Norėdami tęsti, spauskite „Toliau“.",
+ -1, 115,103,195,8
+END
+
+IDD_EXPORT_PRIVATE_KEY DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Liudijimo eksporto vediklis"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Jei pasirinksite eksportuoti privatųjį raktą, kitame lape būsite paklausti įvesti slaptažodį raktui apsaugoti.", -1, 21,1,195,23
+ LTEXT "Ar norite eksportuoti privatųjį raktą?", -1, 21,24,195,15
+ AUTORADIOBUTTON "&Taip, eksportuoti privatųjį raktą",
+ IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "&Ne, neeksportuoti privačiojo rakto",
+ IDC_EXPORT_PRIVATE_KEY_NO, 31,48,200,12, BS_AUTORADIOBUTTON
+ LTEXT "", IDC_EXPORT_PRIVATE_KEY_UNAVAILABLE, 21,60,200,24
+END
+
+IDD_EXPORT_PASSWORD DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Liudijimo eksporto vediklis"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Slaptažodis:", -1, 21,1,195,10
+ EDITTEXT IDC_EXPORT_PASSWORD, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ LTEXT "&Patvirtinti slaptažodį:", -1, 21,35,195,10
+ EDITTEXT IDC_EXPORT_PASSWORD_CONFIRM, 21,45,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+END
+
+IDD_EXPORT_FORMAT DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Liudijimo eksporto vediklis"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Išrinkite formatą, kurį norite naudoti:", -1, 21,1,195,10
+ AUTORADIOBUTTON "&DER-užkoduotas X.509 (.cer)",
+ IDC_EXPORT_FORMAT_DER, 31,18,260,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "Ba&se64-užkoduotas X.509 (.cer)",
+ IDC_EXPORT_FORMAT_BASE64, 31,30,260,12, BS_AUTORADIOBUTTON
+ AUTORADIOBUTTON "&Kriptografinio pranešimo sintaksės standarto/PKCS #7 pranešimas (.p7b):",
+ IDC_EXPORT_FORMAT_CMS, 31,42,260,12, BS_AUTORADIOBUTTON
+ CHECKBOX "&Jei įmanoma, apimti visus liudijimus liudijimų kelyje",
+ IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ AUTORADIOBUTTON "&Asmeninės informacijos mainai/PKCS #12 (.pfx)",
+ IDC_EXPORT_FORMAT_PFX, 31,72,260,12, BS_AUTORADIOBUTTON|WS_DISABLED
+ CHECKBOX "A&pimti visus liudijimus liudijimų kelyje",
+ IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ CHECKBOX "Įjungti stiprų &šifravimą",
+ IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,200,8,
+ BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ CHECKBOX "Iš&trinti privatųjį raktą, kai eksportas sėkmingas",
+ IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,200,8,
+ BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+END
+
+IDD_EXPORT_FILE DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Liudijimo eksporto vediklis"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Failas:", -1, 21,1,195,10
+ EDITTEXT IDC_EXPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ PUSHBUTTON "&Parinkti...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14
+END
+
+IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Liudijimo eksporto vediklis"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Liudijimo eksporto vediklio pabaiga", IDC_EXPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Jūs sėkmingai baigėte liudijimo eksporto vediklį.",
+ -1, 115,33,195,24
+ LTEXT "Jūs nurodėte šias nuostatas:",
+ -1, 115,57,195,12
+ CONTROL "", IDC_EXPORT_SETTINGS, "SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 115,67,174,100
+END
diff --git a/reactos/dll/win32/cryptui/cryptui_Nl.rc b/reactos/dll/win32/cryptui/cryptui_Nl.rc
index a346083f29d..faa32108eeb 100644
--- a/reactos/dll/win32/cryptui/cryptui_Nl.rc
+++ b/reactos/dll/win32/cryptui/cryptui_Nl.rc
@@ -20,6 +20,8 @@
#include "cryptuires.h"
+#pragma code_page(65001)
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
@@ -75,7 +77,7 @@ STRINGTABLE DISCARDABLE
IDS_IMPORT_FILTER_PFX "Persoonlijke informatie uitwisseling (*.pfx; *.p12)"
IDS_IMPORT_FILTER_CRL "Certificaat terugroeplijst (*.crl)"
IDS_IMPORT_FILTER_CTL "Certificaat vertrouwenslijst (*.stl)"
- IDS_IMPORT_FILTER_SERIALIZED_STORE "Microsoft serile certificatenopslag (*.sst)"
+ IDS_IMPORT_FILTER_SERIALIZED_STORE "Microsoft seriële certificatenopslag (*.sst)"
IDS_IMPORT_FILTER_CMS "CMS/PKCS #7 berichten (*.spc; *.p7b)"
IDS_IMPORT_FILTER_ALL "Alle bestanden (*.*)"
IDS_IMPORT_EMPTY_FILE "Selecteer een bestand."
@@ -97,7 +99,7 @@ STRINGTABLE DISCARDABLE
IDS_IMPORT_FAILED "Het importeren is mislukt."
IDS_WIZARD_TITLE_FONT "Arial"
IDS_PURPOSE_ALL ""
- IDS_PURPOSE_ADVANCED ""
+ IDS_PURPOSE_ADVANCED ""
IDS_SUBJECT_COLUMN "Verstrekt aan"
IDS_ISSUER_COLUMN "Uitgegeven door"
IDS_EXPIRATION_COLUMN "Verloop datum"
@@ -106,8 +108,8 @@ STRINGTABLE DISCARDABLE
IDS_ALLOWED_PURPOSE_NONE ""
IDS_WARN_REMOVE_MY "U kunt niet langer berichten ontcijferen of ondertekenen met dit certificaat.\nWeet u zeker dat u dit certificaat wilt verwijderen?"
IDS_WARN_REMOVE_PLURAL_MY "U kunt niet langer berichten ontcijferen of ondertekenen met deze certificaten.\nWeet u zeker dat u deze certificaten wilt verwijderen?"
- IDS_WARN_REMOVE_ADDRESSBOOK "U kunt niet langer berichten coderen of verifiren met dit certificaat.\nWeet u zeker dat u dit certificaat wilt verwijderen?"
- IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "U kunt niet langer berichten coderen of verifiren met deze certificaten.\nWeet u zeker dat u deze certificaten wilt verwijderen?"
+ IDS_WARN_REMOVE_ADDRESSBOOK "U kunt niet langer berichten coderen of verifiëren met dit certificaat.\nWeet u zeker dat u dit certificaat wilt verwijderen?"
+ IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "U kunt niet langer berichten coderen of verifiëren met deze certificaten.\nWeet u zeker dat u deze certificaten wilt verwijderen?"
IDS_WARN_REMOVE_CA "Certificaten uitgegeven door deze certificaten autoriteit zullen niet meer vertrouwd worden.\nWeet u zeker dat u dit certificaat wilt verwijderen?"
IDS_WARN_REMOVE_PLURAL_CA "Certificaten uitgegeven door deze certificaten autoriteiten zullen niet meer vertrouwd worden.\nWeet u zeker dat u deze certificaten wilt verwijderen?"
IDS_WARN_REMOVE_ROOT "Certificaten uitgegeven door deze basic certificaten autoriteit, alsmede enige certificatie autoriteit die hij verstrekt, zullen niet meer vertrouwd worden.\nWeet u zeker dat u dit vertrouwde basic certificaat wilt verwijderen?"
@@ -150,12 +152,12 @@ STRINGTABLE DISCARDABLE
IDS_EXPORT_FILE_SUBTITLE "Geef de naam van het bestand waarin de inhoud zal worden opgeslagen."
IDS_EXPORT_FILE_EXISTS "Het gekozen bestand bestaat reeds. Wilt u het overschrijven?"
IDS_EXPORT_FILTER_CERT "DER-Encoded Binary X.509 (*.cer)"
- IDS_EXPORT_FILTER_BASE64_CERT "Base64-gencodeerd X.509 (*.cer)"
+ IDS_EXPORT_FILTER_BASE64_CERT "Base64-geëncodeerd X.509 (*.cer)"
IDS_EXPORT_FILTER_CRL "Certificaat terugroeplijst (*.crl)"
IDS_EXPORT_FILTER_CTL "Certificaat vertrouwenslijst (*.stl)"
IDS_EXPORT_FILTER_CMS "CMS/PKCS #7 berichten (*.p7b)"
IDS_EXPORT_FILTER_PFX "Persoonlijke informatie uitwisseling (*.pfx)"
- IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "Serile certificatenopslag (*.sst)"
+ IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "Seriële certificatenopslag (*.sst)"
IDS_EXPORT_FORMAT "Bestandsformaat"
IDS_EXPORT_INCLUDE_CHAIN "Neem alle certificaten in het certificatiepad op"
IDS_EXPORT_KEYS "Exporteer sleutels"
@@ -164,12 +166,12 @@ STRINGTABLE DISCARDABLE
IDS_EXPORT_SUCCEEDED "Het exporteren is gelukt."
IDS_EXPORT_FAILED "Het exporteren is mislukt."
IDS_EXPORT_PRIVATE_KEY_TITLE "Exporteer persoonlijke sleutel"
- IDS_EXPORT_PRIVATE_KEY_SUBTITLE "Het certificaat bevat een persoonlijke sleutel die mee kan worden gexporteerd met het certificaat."
+ IDS_EXPORT_PRIVATE_KEY_SUBTITLE "Het certificaat bevat een persoonlijke sleutel die mee kan worden geëxporteerd met het certificaat."
IDS_EXPORT_PASSWORD_TITLE "Voer wachtwoord in"
IDS_EXPORT_PASSWORD_SUBTITLE "U kunt een persoonlijke sleutel beveiligen met een wachtwoord."
IDS_EXPORT_PASSWORD_MISMATCH "De wachtwoorden zijn niet gelijk."
IDS_EXPORT_PRIVATE_KEY_UNAVAILABLE "NB: De persoonlijke sleutel voor dit certificaat kon niet geopend worden."
- IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE "Note: De persoonlijke sleutel voor dit certificaat kan niet gexporteerd worden."
+ IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE "Note: De persoonlijke sleutel voor dit certificaat kan niet geëxporteerd worden."
}
IDD_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236
@@ -286,12 +288,12 @@ FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Welkom bij de certificaat importeerhulp", IDC_IMPORT_TITLE,
115,1,195,40
- LTEXT "Deze hulp helps u met het importeren van certificaten, certificaat terugroeplijsten en certificaat vertrouwenslijsten uit een bestand naar een certificatenopslag.",
- -1, 115,33,195,16
+ LTEXT "Deze hulp assisteert u met het importeren van certificaten, certificaat terugroeplijsten en certificaat vertrouwenslijsten uit een bestand naar een certificatenopslag.",
+ -1, 115,33,195,24
LTEXT "Een certificaat kan gebruikt worden om u of de computer waarmee u werkt te identificeren. Het kan ook gebruikt worden voor authenticatie en om berichten te ondertekenen. Certificatenopslagen zijn verzamelingen van certificaten, certificaat terugroeplijsten en certificaat vertrouwenslijsten.",
- -1, 115,56,195,40
- LTEXT "Om verder te gaan, click op Volgende.",
- -1, 115,103,195,8
+ -1, 115,64,195,48
+ LTEXT "Klik op Volgende om verder te gaan.",
+ -1, 115,119,195,8
END
IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,143
@@ -301,13 +303,13 @@ BEGIN
LTEXT "Bestands&naam:", -1, 21,1,195,10
EDITTEXT IDC_IMPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
PUSHBUTTON "B&laderen...", IDC_IMPORT_BROWSE_FILE, 236,11,60,14
- LTEXT "NB: De volgende bestandsformaten kunnen meer dan n certificaat, certificaat terugroeplijst of certificaat vertrouwenslijst bevatten:",
+ LTEXT "NB: De volgende bestandsformaten kunnen meer dan één certificaat, certificaat terugroeplijst of certificaat vertrouwenslijst bevatten:",
-1, 21,26,265,16
LTEXT "Cryptographisch berichtsyntaxis standaard/PKCS #7 berichten (.p7b)",
-1, 31,49,265,10
LTEXT "Persoonlijke informatie uitwisseling/PKCS #12 (.pfx, .p12)",
-1, 31,64,265,10
- LTEXT "Microsoft serile certificatenopslag (.sst)",
+ LTEXT "Microsoft seriële certificatenopslag (.sst)",
-1, 31,79,265,10
END
@@ -354,7 +356,7 @@ BEGIN
PUSHBUTTON "&Importeer...", IDC_MGR_IMPORT, 7,172,51,14
PUSHBUTTON "&Exporteer...", IDC_MGR_EXPORT, 62,172,51,14, WS_DISABLED
PUSHBUTTON "&Verwijder", IDC_MGR_REMOVE, 117,172,51,14, WS_DISABLED
- PUSHBUTTON "Ge&avanceerd...", IDC_MGR_ADVANCED, 277,172,51,14
+ PUSHBUTTON "Ge&avanceerd...", IDC_MGR_ADVANCED, 271,172,57,14
GROUPBOX "Certificaat doeleinden", -1,7,194,321,47, BS_GROUPBOX
LTEXT "", IDC_MGR_PURPOSES, 13,208,252,30
PUSHBUTTON "&Bekijken...", IDC_MGR_VIEW, 269,218,51,14, WS_DISABLED
@@ -382,12 +384,12 @@ FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Welkom bij de Certificaat exporteerhulp", IDC_EXPORT_TITLE,
115,1,195,40
- LTEXT "Deze hulp assisteerd u bij het exporteren van certificaten, certificaat terugroeplijsten en certificaat vertrouwenslijsten vanuit een certificatenopslag naar een bestand.",
- -1, 115,33,195,16
+ LTEXT "Deze hulp assisteert u bij het exporteren van certificaten, certificaat terugroeplijsten en certificaat vertrouwenslijsten vanuit een certificatenopslag naar een bestand.",
+ -1, 115,33,195,24
LTEXT "Een certificaat kan gebruikt worden om u of de computer waarmee u werkt te identificeren. Het kan ook gebruikt worden voor authenticatie en om berichten te ondertekenen. Certificatenopslagen zijn verzamelingen van certificaten, certificaat terugroeplijsten en certificaat vertrouwenslijsten.",
- -1, 115,56,195,40
- LTEXT "Om verder te gaan, click op Volgende.",
- -1, 115,103,195,8
+ -1, 115,64,195,48
+ LTEXT "Klik op Volgende om verder te gaan.",
+ -1, 115,119,195,8
END
IDD_EXPORT_PRIVATE_KEY DIALOG DISCARDABLE 0,0,317,143
@@ -419,22 +421,22 @@ FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Selecteer het formaat dat u wilt gebruiken:", -1, 21,1,195,10
AUTORADIOBUTTON "&DER-encoded X.509 (.cer)",
- IDC_EXPORT_FORMAT_DER, 31,18,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
- AUTORADIOBUTTON "Ba&se64-encoded X.509 (.cer):",
- IDC_EXPORT_FORMAT_BASE64, 31,30,200,12, BS_AUTORADIOBUTTON
+ IDC_EXPORT_FORMAT_DER, 31,18,240,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "Ba&se64-encoded X.509 (.cer)",
+ IDC_EXPORT_FORMAT_BASE64, 31,30,240,12, BS_AUTORADIOBUTTON
AUTORADIOBUTTON "&Cryptographisch berichtsyntaxis standaard/PKCS #7 berichten (.p7b)",
- IDC_EXPORT_FORMAT_CMS, 31,42,200,12, BS_AUTORADIOBUTTON
+ IDC_EXPORT_FORMAT_CMS, 31,42,240,12, BS_AUTORADIOBUTTON
CHECKBOX "Neem &alle certificaten in het certificatiepad op indien mogelijk",
- IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,240,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
AUTORADIOBUTTON "&Persoonlijke informatie uitwisseling/PKCS #12 (.pfx)",
- IDC_EXPORT_FORMAT_PFX, 31,72,200,12, BS_AUTORADIOBUTTON|WS_DISABLED
+ IDC_EXPORT_FORMAT_PFX, 31,72,240,12, BS_AUTORADIOBUTTON|WS_DISABLED
CHECKBOX "Nee&m alle certificaten in het certificatiepad op indien mogelijk",
- IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,240,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
CHECKBOX "&Gebruikt sterke encryptie",
- IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,200,8,
+ IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,240,8,
BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
CHECKBOX "Verwijder de persoonlijke s&leutel als de export succesvol is",
- IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,200,8,
+ IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,240,8,
BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
END
diff --git a/reactos/dll/win32/cryptui/cryptui_Pt.rc b/reactos/dll/win32/cryptui/cryptui_Pt.rc
new file mode 100644
index 00000000000..f8795293d9f
--- /dev/null
+++ b/reactos/dll/win32/cryptui/cryptui_Pt.rc
@@ -0,0 +1,465 @@
+/*
+ * cryptui dll Portuguese resources
+ *
+ * Copyright 2009 Ricardo Filipe
+ *
+ * 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 "cryptuires.h"
+
+#pragma code_page(65001)
+
+LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_CERTIFICATE "Certificado"
+ IDS_CERTIFICATEINFORMATION "Informação do Certificado"
+ IDS_CERT_INFO_BAD_SIG "Este certificado tem uma assinatura inválida. O certificado pode ter sido alterado ou corrompido."
+ IDS_CERT_INFO_UNTRUSTED_CA "Este certificado raíz não é confiável. Para ficar confiável, adicione-o ao conjunto de certificados raíz confiáveis do seu sistema."
+ IDS_CERT_INFO_UNTRUSTED_ROOT "Este certificado não foi validado num certificado raíz confiável."
+ IDS_CERT_INFO_PARTIAL_CHAIN "O emissor deste certificado não foi encontrado."
+ IDS_CERT_INFO_BAD_PURPOSES "Todos os propósitos deste certificado não foram verificados."
+ IDS_CERT_INFO_PURPOSES "Este certificado é intencionado com os seguintes propósitos::"
+ IDS_SUBJECT_HEADING "Emitido a: "
+ IDS_ISSUER_HEADING "Emitido por: "
+ IDS_VALID_FROM "Válido de "
+ IDS_VALID_TO " para "
+ IDS_CERTIFICATE_BAD_SIGNATURE "Este certificado tem uma assinatura inválida."
+ IDS_CERTIFICATE_BAD_TIME "Este certificado expirou ou ainda não é válido."
+ IDS_CERTIFICATE_BAD_TIMENEST "O período de validade deste certificado excede o do seu emissor."
+ IDS_CERTIFICATE_REVOKED "Este certificado foi revogado pelo seu emissor."
+ IDS_CERTIFICATE_VALID "Este certificado está OK."
+ IDS_FIELD "Campo"
+ IDS_VALUE "Valor"
+ IDS_FIELDS_ALL ""
+ IDS_FIELDS_V1 "Campos da Versão 1 Apenas"
+ IDS_FIELDS_EXTENSIONS "Extensões Apenas"
+ IDS_FIELDS_CRITICAL_EXTENSIONS "Extensões Críticas Apenas"
+ IDS_FIELDS_PROPERTIES "Propriedades Apenas"
+ IDS_FIELD_VERSION "Versão"
+ IDS_FIELD_SERIAL_NUMBER "Número de Série"
+ IDS_FIELD_ISSUER "Emissor"
+ IDS_FIELD_VALID_FROM "Válido desde"
+ IDS_FIELD_VALID_TO "Válido até"
+ IDS_FIELD_SUBJECT "Sujeito"
+ IDS_FIELD_PUBLIC_KEY "Chave Pública"
+ IDS_FIELD_PUBLIC_KEY_FORMAT "%s (%d bits)"
+ IDS_PROP_HASH "SHA1 hash"
+ IDS_PROP_ENHKEY_USAGE "Uso de chave avançado (propriedade)"
+ IDS_PROP_FRIENDLY_NAME "Nome amigável"
+ IDS_PROP_DESCRIPTION "Descrição"
+ IDS_CERTIFICATE_PROPERTIES "Propriedades do Certificado"
+ IDS_CERTIFICATE_PURPOSE_ERROR "Por favor insira um OID na forma 1.2.3.4"
+ IDS_CERTIFICATE_PURPOSE_EXISTS "O OID inserido já existe."
+ IDS_SELECT_STORE_TITLE "Seleccione o Conjunto de Certificados"
+ IDS_SELECT_STORE "Por favor seleccione um conjunto de certificados."
+ IDS_IMPORT_WIZARD "Assistente de Importação de Certificados"
+ IDS_IMPORT_TYPE_MISMATCH "O ficheiro contém objectos que não correspondem ao critério dado. Por favor seleccione outro ficheiro."
+ IDS_IMPORT_FILE_TITLE "Ficheiro a Importar"
+ IDS_IMPORT_FILE_SUBTITLE "Especifique o ficheiro que deseja Importar."
+ IDS_IMPORT_STORE_TITLE "Conjunto de Certificados"
+ IDS_IMPORT_STORE_SUBTITLE "Os Conjuntos de Certificados são coleccões de certificados, listas de revogação de certificados e listas de certificados confiáveis."
+ IDS_IMPORT_FILTER_CERT "Certificado X.509 (*.cer; *.crt)"
+ IDS_IMPORT_FILTER_PFX "Troca de Informações Pessoais (*.pfx; *.p12)"
+ IDS_IMPORT_FILTER_CRL "Lista de Revogação de Certificados (*.crl)"
+ IDS_IMPORT_FILTER_CTL "Lista de Certificados Confiáveis (*.stl)"
+ IDS_IMPORT_FILTER_SERIALIZED_STORE "Conjunto de Certificados Serializados da Microsoft (*.sst)"
+ IDS_IMPORT_FILTER_CMS "Mensagens CMS/PKCS #7 (*.spc; *.p7b)"
+ IDS_IMPORT_FILTER_ALL "Todos os Ficheiros (*.*)"
+ IDS_IMPORT_EMPTY_FILE "Por favor seleccione um ficheiro."
+ IDS_IMPORT_BAD_FORMAT "O formato do ficheiro não é reconhecido. Por favor seleccione outro ficheiro."
+ IDS_IMPORT_OPEN_FAILED "Não consegui abrir "
+ IDS_IMPORT_DEST_DETERMINED "Determinado pelo programa"
+ IDS_IMPORT_SELECT_STORE "Por favor seleccione um conjunto"
+ IDS_IMPORT_STORE_SELECTION "Conjunto de certificados seleccionado"
+ IDS_IMPORT_DEST_AUTOMATIC "Determinado automaticamente pelo programa"
+ IDS_IMPORT_FILE "Ficheiro"
+ IDS_IMPORT_CONTENT "Conteúdo"
+ IDS_IMPORT_CONTENT_CERT "Certificado"
+ IDS_IMPORT_CONTENT_CRL "Lista de Revogação de Certificados"
+ IDS_IMPORT_CONTENT_CTL "Lista de Certificados Confiáveis"
+ IDS_IMPORT_CONTENT_CMS "Mensagem CMS/PKCS #7"
+ IDS_IMPORT_CONTENT_PFX "Troca de Informações Pessoais"
+ IDS_IMPORT_CONTENT_STORE "Conjunto de Certificados"
+ IDS_IMPORT_SUCCEEDED "A importação foi bem sucedida."
+ IDS_IMPORT_FAILED "A importação falhou."
+ IDS_WIZARD_TITLE_FONT "Arial"
+ IDS_PURPOSE_ALL ""
+ IDS_PURPOSE_ADVANCED ""
+ IDS_SUBJECT_COLUMN "Emitido para"
+ IDS_ISSUER_COLUMN "Emitido por"
+ IDS_EXPIRATION_COLUMN "Data de Expiração"
+ IDS_FRIENDLY_NAME_COLUMN "Nome Amigável"
+ IDS_ALLOWED_PURPOSE_ALL ""
+ IDS_ALLOWED_PURPOSE_NONE ""
+ IDS_WARN_REMOVE_MY "Não vai poder continuar a decifrar ou assinar mensagens com este certificado.\nTem a certeza que deseja remover este certificado?"
+ IDS_WARN_REMOVE_PLURAL_MY "Não vai poder continuar a decifrar ou assinar mensagens com estes certificados.\nTem a certeza que deseja remover estes certificados?"
+ IDS_WARN_REMOVE_ADDRESSBOOK "Não vai poder continuar a cifrar ou verificar mensagens com este certificado.\nTem a certeza que deseja remover este certificado?"
+ IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "Não vai poder continuar a cifrar ou verificar mensagens com estes certificados.\nTem a certeza que deseja remover estes certificados?"
+ IDS_WARN_REMOVE_CA "Os certificados emitidos por esta autoridade de certificação não continuarão a ser confiáveis.\nTem a certeza que deseja remover este certificado?"
+ IDS_WARN_REMOVE_PLURAL_CA "Os certificados emitidos por estas autoridades de certificação não continuarão a ser confiáveis.\nTem a certeza que deseja remover estes certificados?"
+ IDS_WARN_REMOVE_ROOT "Os certificados emitidos por esta autoridade de certificação raíz ou quaisquer autoridades de certificação por ela emitidas não continuarão a ser confiáveis.\nTem a certeza que deseja remover este certificado raíz confiável?"
+ IDS_WARN_REMOVE_PLURAL_ROOT "Os certificados emitidos por estas autoridades de certificação raíz ou quaisquer autoridades de certificação por elas emitidas não continuarão a ser confiáveis.\nTem a certeza que deseja remover estes certificados raíz confiáveis?"
+ IDS_WARN_REMOVE_TRUSTEDPUBLISHER "Software assinado por este editor não continuará a ser confiável.\nTem a certeza que deseja remover este certificado?"
+ IDS_WARN_REMOVE_PLURAL_TRUSTEDPUBLISHER "Software assinado por estes editores não continuará a ser confiável.\nTem a certeza que deseja remover estes certificados?"
+ IDS_WARN_REMOVE_DEFAULT "Tem a certeza que deseja remover este certificado?"
+ IDS_WARN_REMOVE_PLURAL_DEFAULT "Tem a certeza que deseja remover estes certificados?"
+ IDS_CERT_MGR "Certificados"
+ IDS_PURPOSE_SERVER_AUTH "Assegura a identidade de um computador remoto"
+ IDS_PURPOSE_CLIENT_AUTH "Prova a sua identidade a um computador remoto"
+ IDS_PURPOSE_CODE_SIGNING "Assegura que o software veio de uma editora de software\nProtege o software de alterações após publicação"
+ IDS_PURPOSE_EMAIL_PROTECTION "Protege mensagens de e-mail"
+ IDS_PURPOSE_IPSEC "Permite comunicação segura pela Internet"
+ IDS_PURPOSE_TIMESTAMP_SIGNING "Permite que os dados sejam assinados com o tempo actual"
+ IDS_PURPOSE_CTL_USAGE_SIGNING "Permite que assine digitalmente uma lista de certificados confiáveis"
+ IDS_PURPOSE_EFS "Permite que os dados em disco sejam cifrados"
+ IDS_PURPOSE_EFS_RECOVERY "Recuperação de Ficheiros"
+ IDS_PURPOSE_WHQL "Windows Hardware Driver Verification"
+ IDS_PURPOSE_NT5 "Windows System Component Verification"
+ IDS_PURPOSE_OEM_WHQL "OEM Windows System Component Verification"
+ IDS_PURPOSE_EMBEDDED_NT "Embedded Windows System Component Verification"
+ IDS_PURPOSE_ROOT_LIST_SIGNER "Root List Signer"
+ IDS_PURPOSE_QUALIFIED_SUBORDINATION "Qualified Subordination"
+ IDS_PURPOSE_KEY_RECOVERY "Key Recovery"
+ IDS_PURPOSE_DOCUMENT_SIGNING "Document Signing"
+ IDS_PURPOSE_LIFETIME_SIGNING "Lifetime Signing"
+ IDS_PURPOSE_DRM "Digital Rights"
+ IDS_PURPOSE_LICENSES "Key Pack Licenses"
+ IDS_PURPOSE_LICENSE_SERVER "License Server Verification"
+ IDS_PURPOSE_ENROLLMENT_AGENT "Certificate Request Agent"
+ IDS_PURPOSE_SMARTCARD_LOGON "Smart Card Logon"
+ IDS_PURPOSE_CA_EXCHANGE "Private Key Archival"
+ IDS_PURPOSE_KEY_RECOVERY_AGENT "Key Recovery Agent"
+ IDS_PURPOSE_DS_EMAIL_REPLICATION "Directory Service Email Replication"
+ IDS_EXPORT_WIZARD "Assistente de Exportação de Certificados"
+ IDS_EXPORT_FORMAT_TITLE "Formato de Exportação"
+ IDS_EXPORT_FORMAT_SUBTITLE "Escolha o formato em que o conteúdo será guardado."
+ IDS_EXPORT_FILE_TITLE "Exportar Ficheiro"
+ IDS_EXPORT_FILE_SUBTITLE "Especifique o nome do ficheiro em que o conteúdo será guardado."
+ IDS_EXPORT_FILE_EXISTS "O ficheiro especificado já existe. Deseja substituí-lo?"
+ IDS_EXPORT_FILTER_CERT "DER-Encoded Binary X.509 (*.cer)"
+ IDS_EXPORT_FILTER_BASE64_CERT "Base64-Encoded X.509 (*.cer)"
+ IDS_EXPORT_FILTER_CRL "Certificate Revocation List (*.crl)"
+ IDS_EXPORT_FILTER_CTL "Certificate Trust List (*.stl)"
+ IDS_EXPORT_FILTER_CMS "CMS/PKCS #7 Messages (*.p7b)"
+ IDS_EXPORT_FILTER_PFX "Personal Information Exchange (*.pfx)"
+ IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "Serialized Certificate Store (*.sst)"
+ IDS_EXPORT_FORMAT "Formato do Ficheiro"
+ IDS_EXPORT_INCLUDE_CHAIN "Incluir todos os certificados no caminho do certificado"
+ IDS_EXPORT_KEYS "Exportar Chaves"
+ IDS_YES "Sim"
+ IDS_NO "Não"
+ IDS_EXPORT_SUCCEEDED "A exportação foi bem sucedida."
+ IDS_EXPORT_FAILED "A exportação falhou."
+ IDS_EXPORT_PRIVATE_KEY_TITLE "Exportar Chave Privada"
+ IDS_EXPORT_PRIVATE_KEY_SUBTITLE "O certificado contém uma chave privada que pode ser exportada em conjunto com o certificado."
+ IDS_EXPORT_PASSWORD_TITLE "Digite Palavra Chave"
+ IDS_EXPORT_PASSWORD_SUBTITLE "Pode proteger uma chave privada com uma palavra chave."
+ IDS_EXPORT_PASSWORD_MISMATCH "As palavras chave não coincidem."
+ IDS_EXPORT_PRIVATE_KEY_UNAVAILABLE "Nota: A chave privada para este certificado não conseguiu ser aberta."
+ IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE "Nota: A chave privada para este certificado não é exportável."
+}
+
+IDD_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Geral"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", -1, "Static", WS_BORDER|SS_WHITERECT, 6,10,241,200
+ CONTROL "", IDC_CERTIFICATE_ICON,"RichEdit20W",
+ ES_READONLY|WS_DISABLED,8,11,26,26
+ CONTROL "", IDC_CERTIFICATE_INFO,"RichEdit20W",
+ ES_READONLY|WS_DISABLED,34,11,212,26
+ CONTROL "", -1, "Static", SS_BLACKFRAME, 16,37,222,1
+ CONTROL "", IDC_CERTIFICATE_STATUS,"RichEdit20W",
+ ES_READONLY|ES_MULTILINE,8,38,238,78
+ CONTROL "", -1, "Static", SS_BLACKFRAME, 16,116,222,1
+ CONTROL "", IDC_CERTIFICATE_NAMES,"RichEdit20W",
+ ES_READONLY|ES_MULTILINE|WS_DISABLED,8,118,238,90
+ PUSHBUTTON "&Instalar Certificado...", IDC_ADDTOSTORE,103,216,70,14
+ PUSHBUTTON "&Declaração do Emissor", IDC_ISSUERSTATEMENT,177,216,70,14
+END
+
+IDD_DETAIL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Detalhes"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Mostrar:", -1, 6,12,40,14
+ COMBOBOX IDC_DETAIL_SELECT, 28,10,100,14,
+ CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP
+ CONTROL "", IDC_DETAIL_LIST, "SysListView32",
+ LVS_REPORT|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 6,28,241,100
+ CONTROL "", IDC_DETAIL_VALUE, "RichEdit20W",
+ ES_READONLY|ES_MULTILINE|WS_TABSTOP, 6,136,241,70
+ PUSHBUTTON "&Editar Propriedades...", IDC_EDITPROPERTIES,103,216,70,14
+ PUSHBUTTON "&Copiar para Ficheiro...", IDC_EXPORT,177,216,70,14
+END
+
+IDD_HIERARCHY DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Caminho de Certificação"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "&Caminho de Certificação", -1,6,10,245,165, BS_GROUPBOX
+ CONTROL "",IDC_CERTPATH, "SysTreeView32", TVS_HASLINES|WS_BORDER,
+ 13,22,231,130
+ PUSHBUTTON "&Ver Certificado", IDC_VIEWCERTIFICATE,175,156,70,14
+ LTEXT "&Estado do Certificado:", IDC_CERTIFICATESTATUS,6,183,70,14
+ CONTROL "", IDC_CERTIFICATESTATUSTEXT,"RichEdit20W",
+ WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,195,245,36
+END
+
+IDD_USERNOTICE DIALOG DISCARDABLE 0, 0, 255, 256
+CAPTION "Declaração"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "", IDC_USERNOTICE,"RichEdit20W",
+ WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,10,241,200
+ PUSHBUTTON "&Fechar", IDOK,103,216,70,14
+ PUSHBUTTON "&Mais Informação", IDC_CPS,177,216,70,14
+END
+
+IDD_CERT_PROPERTIES_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236
+CAPTION "Geral"
+STYLE WS_VISIBLE
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Nome amigável:", -1, 6,14,60,14
+ EDITTEXT IDC_FRIENDLY_NAME, 60,12,191,14, ES_AUTOHSCROLL|WS_TABSTOP
+ LTEXT "&Descrição:", -1, 6,32,60,14
+ EDITTEXT IDC_DESCRIPTION, 60,30,191,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL
+ GROUPBOX "Propósitos do Certificado", -1,6,48,245,165, BS_GROUPBOX
+ AUTORADIOBUTTON "&Activar todos os propósitos para este certificado",
+ IDC_ENABLE_ALL_PURPOSES, 12,58,180,14, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "D&esactivar todos os propósitos para este certificado",
+ IDC_DISABLE_ALL_PURPOSES, 12,70,180,14, BS_AUTORADIOBUTTON
+ AUTORADIOBUTTON "A&ctivar apenas os seguintes propósitos para este certificado:",
+ IDC_ENABLE_SELECTED_PURPOSES, 12,82,180,14, BS_AUTORADIOBUTTON
+ CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 24,100,220,90
+ PUSHBUTTON "Adicionar &Propósito...", IDC_ADD_PURPOSE,184,194,60,14
+END
+
+IDD_ADD_CERT_PURPOSE DIALOG DISCARDABLE 0,0,200,68
+CAPTION "Adicionar Propósito"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Adicione o identificador de objecto (OID) para o propósito que deseja adicionar:",
+ -1, 6,6,190,28
+ EDITTEXT IDC_NEW_PURPOSE, 6,28,190,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL
+ PUSHBUTTON "OK", IDOK, 33,48,60,14
+ PUSHBUTTON "Cancelar", IDCANCEL, 100,48,60,14
+END
+
+IDD_SELECT_STORE DIALOG DISCARDABLE 0,0,200,136
+CAPTION "Seleccione Conjunto de Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Seleccione o conjunto de certificados que deseja usar:", IDC_STORE_TEXT, 6,6,190,28
+ CONTROL "",IDC_STORE_LIST, "SysTreeView32", TVS_HASLINES|WS_BORDER|WS_TABSTOP,
+ 6,28,188,70
+ CHECKBOX "&Mostrar conjuntos físicos", IDC_SHOW_PHYSICAL_STORES, 6,102,90,14,
+ BS_AUTOCHECKBOX|WS_TABSTOP
+ PUSHBUTTON "OK", IDOK, 90,118,50,14, BS_DEFPUSHBUTTON
+ PUSHBUTTON "Cancelar", IDCANCEL, 144,118,50,14
+END
+
+IDD_IMPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistente de Importação de Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Benvindo ao Assistente de Importação de Certificados", IDC_IMPORT_TITLE,
+ 115,7,195,12
+ LTEXT "Este assistente vai ajudá-lo a importar certificados, listas de revogação de certificados e listas de certificados confiáveis a partir de um ficheiro para um conjunto de certificados.",
+ -1, 115,26,195,25
+ LTEXT "Um certificado pode ser usado para identificá-lo ou ao computador do qual está a comunicar. Também pode ser usado para autenticação e para assinar mensagens. Conjuntos de certificados são colecções de certificados, listas de revogação de certificados e listas de certificados confiáveis.",
+ -1, 115,56,195,40
+ LTEXT "Para continuar clique em Seguinte.",
+ -1, 115,103,195,8
+END
+
+IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,178
+CAPTION "Assistente de Importação de Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Nome do ficheiro:", -1, 21,1,195,10
+ EDITTEXT IDC_IMPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ PUSHBUTTON "&Procurar...", IDC_IMPORT_BROWSE_FILE, 236,11,60,14
+ LTEXT "Nota: os seguintes formatos de ficheiro podem conter mais que um certificado, lista de revogação de certificados ou lista de certificados confiáveis:",
+ -1, 21,26,265,16
+ LTEXT "Cryptographic Message Syntax Standard/PKCS #7 Messages (.p7b)",
+ -1, 31,49,265,10
+ LTEXT "Personal Information Exchange/PKCS #12 (.pfx, .p12)",
+ -1, 31,64,265,10
+ LTEXT "Microsoft Serialized Certificate Store (.sst)",
+ -1, 31,79,265,10
+END
+
+IDD_IMPORT_STORE DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistente de Importação de Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "O Wine pode automaticamente seleccionar o conjunto de certificados ou você pode especificar a localização para os certificados.",
+ -1, 21,1,195,20
+ AUTORADIOBUTTON "&Seleccionar conjunto de certificados automaticamente",
+ IDC_IMPORT_AUTO_STORE, 31,18,180,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "&Colocar todos os certificados no seguinte conjunto:",
+ IDC_IMPORT_SPECIFY_STORE, 31,30,180,12, BS_AUTORADIOBUTTON
+ EDITTEXT IDC_IMPORT_STORE, 44,49,185,14, ES_READONLY
+ PUSHBUTTON "&Procurar...", IDC_IMPORT_BROWSE_STORE, 236,49,60,14
+END
+
+IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,178
+CAPTION "Assistente de Importação de Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "A completar o Assistente de Importação de Certificados", IDC_IMPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Completou com sucesso o Assistente de Importação de Certificados.",
+ -1, 115,33,195,24
+ LTEXT "Especificou as seguintes configurações:",
+ -1, 115,57,195,12
+ CONTROL "", IDC_IMPORT_SETTINGS, "SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 115,67,174,100
+END
+
+IDD_CERT_MGR DIALOG DISCARDABLE 0,0,335,270
+CAPTION "Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Com o propósito:", -1, 7,9,100,12
+ COMBOBOX IDC_MGR_PURPOSE_SELECTION, 83,7,245,14,
+ CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP
+ CONTROL "", IDC_MGR_STORES, "SysTabControl32",
+ WS_CLIPSIBLINGS|WS_TABSTOP, 7,25,321,140
+ CONTROL "", IDC_MGR_CERTS, "SysListView32",
+ LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, 15,46,305,111
+ PUSHBUTTON "&Importar...", IDC_MGR_IMPORT, 7,172,51,14
+ PUSHBUTTON "&Exportar...", IDC_MGR_EXPORT, 62,172,51,14, WS_DISABLED
+ PUSHBUTTON "&Remover", IDC_MGR_REMOVE, 117,172,51,14, WS_DISABLED
+ PUSHBUTTON "&Avançadas...", IDC_MGR_ADVANCED, 277,172,51,14
+ GROUPBOX "Propósitos do Certificado", -1,7,194,321,47, BS_GROUPBOX
+ LTEXT "", IDC_MGR_PURPOSES, 13,208,252,30
+ PUSHBUTTON "&Ver...", IDC_MGR_VIEW, 269,218,51,14, WS_DISABLED
+ PUSHBUTTON "&Fechar", IDCANCEL, 277,249,51,14, BS_DEFPUSHBUTTON
+END
+
+IDD_CERT_MGR_ADVANCED DIALOG DISCARDABLE 0,0,248,176
+CAPTION "Opções Avançadas"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ GROUPBOX "Propósito do certificado", -1, 7,7,234,141, BS_GROUPBOX
+ LTEXT "Seleccione um ou mais propósitos a serem listados quando Propósitos Avançados estiver seleccionado.",
+ -1, 14,18,220,16
+ LTEXT "&Propósitos de Certificados:", -1, 14,41,90,12, WS_TABSTOP
+ CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 14,51,220,90
+ PUSHBUTTON "OK", IDOK, 132,155,51,14, BS_DEFPUSHBUTTON
+ PUSHBUTTON "Cancelar", IDCANCEL, 190,155,51,14
+END
+
+IDD_EXPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistente de Exportação de Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Benvindo ao Assistente de Exportação de Certificados", IDC_EXPORT_TITLE,
+ 115,7,195,12
+ LTEXT "Este assostente vai ajudá-lo a exportar certificados, listas de revogação de certificados e listas de certificados confiáveis a partir de um conjunto de certificados para um ficheiro.",
+ -1, 115,26,195,25
+ LTEXT "Um certificado pode ser usado para identificá-lo ou ao computador de onde está a comunicar. Pode também ser usado para autenticação e para assinar mensagens. Conjuntos de certificados são colecções de certificados, listas de revogação de certificados e listas de certificados confiáveis.",
+ -1, 115,56,195,40
+ LTEXT "Para continuar clique em Seguinte.",
+ -1, 115,103,195,8
+END
+
+IDD_EXPORT_PRIVATE_KEY DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistente de Exportação de Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Se escolher exportar a chave privada será pedida uma palavra-passe para proteger a chave privada mais à frente.", -1, 21,1,195,25
+ LTEXT "Deseja exportar a chave privada?", -1, 21,27,195,10
+ AUTORADIOBUTTON "&Sim, exportar a chave privada",
+ IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "&Não exportar a chave privada",
+ IDC_EXPORT_PRIVATE_KEY_NO, 31,48,200,12, BS_AUTORADIOBUTTON
+ LTEXT "", IDC_EXPORT_PRIVATE_KEY_UNAVAILABLE, 21,60,200,24
+END
+
+IDD_EXPORT_PASSWORD DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistente de Exportação de Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Palavra-passe:", -1, 21,1,195,10
+ EDITTEXT IDC_EXPORT_PASSWORD, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ LTEXT "&Confirmar palavra-passe:", -1, 21,35,195,10
+ EDITTEXT IDC_EXPORT_PASSWORD_CONFIRM, 21,45,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+END
+
+IDD_EXPORT_FORMAT DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistente de Exportação de Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Seleccione o formato que deseja utilizar:", -1, 21,1,195,10
+ AUTORADIOBUTTON "&DER-encoded X.509 (.cer)",
+ IDC_EXPORT_FORMAT_DER, 31,18,240,12, BS_AUTORADIOBUTTON|WS_TABSTOP
+ AUTORADIOBUTTON "Ba&se64-encoded X.509 (.cer):",
+ IDC_EXPORT_FORMAT_BASE64, 31,30,240,12, BS_AUTORADIOBUTTON
+ AUTORADIOBUTTON "&Cryptographic Message Syntax Standard/PKCS #7 Message (.p7b)",
+ IDC_EXPORT_FORMAT_CMS, 31,42,240,12, BS_AUTORADIOBUTTON
+ CHECKBOX "&Include all certificates in the certification path if possible",
+ IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,240,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ AUTORADIOBUTTON "&Personal Information Exchange/PKCS #12 (.pfx)",
+ IDC_EXPORT_FORMAT_PFX, 31,72,240,12, BS_AUTORADIOBUTTON|WS_DISABLED
+ CHECKBOX "&Incluir todos os certificados no caminho de certificação se possível",
+ IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,240,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ CHECKBOX "&Activar cifra forte",
+ IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,240,8,
+ BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+ CHECKBOX "&Apagar a chave privada se a exportação for bem sucedida",
+ IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,240,8,
+ BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED
+END
+
+IDD_EXPORT_FILE DIALOG DISCARDABLE 0,0,317,143
+CAPTION "Assistente de Exportação de Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "&Nome do ficheiro:", -1, 21,1,195,10
+ EDITTEXT IDC_EXPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP
+ PUSHBUTTON "&Procurar...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14
+END
+
+IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,178
+CAPTION "Assistente de Exportação de Certificados"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "A completar o Assistente de Exportação de Certificados", IDC_EXPORT_TITLE,
+ 115,1,195,40
+ LTEXT "Completou com sucesso o Assistente de Exportação de Certificados.",
+ -1, 115,33,195,24
+ LTEXT "Especificou as seguintes configurações:",
+ -1, 115,57,195,12
+ CONTROL "", IDC_EXPORT_SETTINGS, "SysListView32",
+ LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,
+ 115,67,174,100
+END
diff --git a/reactos/dll/win32/cryptui/main.c b/reactos/dll/win32/cryptui/main.c
index c11868aa456..980706434a1 100644
--- a/reactos/dll/win32/cryptui/main.c
+++ b/reactos/dll/win32/cryptui/main.c
@@ -5171,6 +5171,7 @@ static LRESULT CALLBACK import_store_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
selectInfo.parent = hwnd;
selectInfo.dwFlags = CRYPTUI_ENABLE_SHOW_PHYSICAL_STORE;
selectInfo.pwszTitle = NULL;
+ selectInfo.pwszText = NULL;
selectInfo.pEnumData = &enumData;
selectInfo.pfnSelectedStoreCallback = NULL;
if ((store = CryptUIDlgSelectStoreW(&selectInfo)))
diff --git a/reactos/dll/win32/dbghelp/dbghelp.rbuild b/reactos/dll/win32/dbghelp/dbghelp.rbuild
index a0611d66fe8..0aeff9efd0d 100644
--- a/reactos/dll/win32/dbghelp/dbghelp.rbuild
+++ b/reactos/dll/win32/dbghelp/dbghelp.rbuild
@@ -6,6 +6,7 @@
.
include/reactos/wine
+
coff.c
dbghelp.c
diff --git a/reactos/dll/win32/gdi32/gdi32.rbuild b/reactos/dll/win32/gdi32/gdi32.rbuild
index 4ea4a797fc1..70cb3577f28 100644
--- a/reactos/dll/win32/gdi32/gdi32.rbuild
+++ b/reactos/dll/win32/gdi32/gdi32.rbuild
@@ -1,4 +1,4 @@
-
+
include
diff --git a/reactos/dll/win32/gdi32/include/gdi32p.h b/reactos/dll/win32/gdi32/include/gdi32p.h
index 9b14a355cc4..e82c9693fc7 100644
--- a/reactos/dll/win32/gdi32/include/gdi32p.h
+++ b/reactos/dll/win32/gdi32/include/gdi32p.h
@@ -42,32 +42,42 @@ typedef INT
/* TYPES *********************************************************************/
// Based on wmfapi.h and Wine.
-typedef struct tagMETAFILEDC {
- PVOID pvMetaBuffer;
- HANDLE hFile;
- DWORD Size;
- METAHEADER mh;
- UINT handles_size, cur_handles;
- HGDIOBJ *handles;
-
- // more DC object stuff.
- HGDIOBJ Pen;
- HGDIOBJ Brush;
- HGDIOBJ Palette;
- HGDIOBJ Font;
-
- WCHAR Filename[MAX_PATH+2];
- // Add more later.
+typedef struct tagMETAFILEDC
+{
+ PVOID pvMetaBuffer;
+ HANDLE hFile;
+ DWORD Size;
+ DWORD dwWritten;
+ METAHEADER mh;
+ WORD reserved;
+ HLOCAL MFObjList;
+ HPEN hPen;
+ HBRUSH hBrush;
+ HDC hDc;
+ HGDIOBJ hMetaDc;
+ HPALETTE hPalette;
+ HFONT hFont;
+ HBITMAP hBitmap;
+ HRGN hRegion;
+ HGDIOBJ hMetafile;
+ HGDIOBJ hMemDc;
+ HPEN hExtPen;
+ HGDIOBJ hEnhMetaDc;
+ HGDIOBJ hEnhMetaFile;
+ HCOLORSPACE hColorSpace;
+ WCHAR Filename[MAX_PATH+2];
} METAFILEDC,*PMETAFILEDC;
// Metafile Entry handle
-typedef struct tagMF_ENTRY {
+typedef struct tagMF_ENTRY
+{
LIST_ENTRY List;
HGDIOBJ hmDC; // Handle return from NtGdiCreateClientObj.
PMETAFILEDC pmfDC;
} MF_ENTRY, *PMF_ENTRY;
-typedef struct tagENHMETAFILE {
+typedef struct tagENHMETAFILE
+{
PVOID pvMetaBuffer;
HANDLE hFile; /* Handle for disk based MetaFile */
DWORD Size;
@@ -162,21 +172,21 @@ HEAP_strdupA2W(
VOID
HEAP_free(LPVOID memory);
-BOOL
+VOID
FASTCALL
-TextMetricW2A(
- TEXTMETRICA *tma,
- TEXTMETRICW *tmw
+FONT_TextMetricWToA(
+ const TEXTMETRICW *ptmW,
+ LPTEXTMETRICA ptmA
);
-BOOL
+VOID
FASTCALL
NewTextMetricW2A(
NEWTEXTMETRICA *tma,
NEWTEXTMETRICW *tmw
);
-BOOL
+VOID
FASTCALL
NewTextMetricExW2A(
NEWTEXTMETRICEXA *tma,
diff --git a/reactos/dll/win32/gdi32/misc/gdientry.c b/reactos/dll/win32/gdi32/misc/gdientry.c
index cca6582fbb3..eb510654ecc 100644
--- a/reactos/dll/win32/gdi32/misc/gdientry.c
+++ b/reactos/dll/win32/gdi32/misc/gdientry.c
@@ -302,15 +302,15 @@ DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface)
ULONG i;
LPDDSURFACEDESC pSurfaceDesc = NULL;
- /* TODO : Speed optimze, most games/dx apps/program does not want 1 surface, they want lest 2
- * so we need incress the stack so it can contain 2 surface instead of one, this will incress
- * the speed of the apps when it trying alloc buffer. How to incress the surface stack space
- * we need create a own struct for DD_SURFACE_LOCAL DdSurfaceLocal, DD_SURFACE_MORE DdSurfaceMore
- * DD_SURFACE_GLOBAL DdSurfaceGlobal. HANDLE hPrevSurface, hSurface. like
+ /* TODO: Optimize speed. Most games/dx apps/programs do not want one surface, they want at least two.
+ * So we need increase the stack to contain two surfaces instead of one. This will increase
+ * the speed of the apps when allocating buffers. How to increase the surface stack space:
+ * we need to create a struct for DD_SURFACE_LOCAL DdSurfaceLocal, DD_SURFACE_MORE DdSurfaceMore
+ * DD_SURFACE_GLOBAL DdSurfaceGlobal, HANDLE hPrevSurface, hSurface like
* struct { DD_SURFACE_LOCAL DdSurfaceLocal1, DD_SURFACE_LOCAL DdSurfaceLocal2 }
- * lest so it contain two surface. maybe 4. we need watch what is most common here before
- * we create the size activate this IF when you start doing the optimze and please also
- * take report from user which value they got here
+ * in a way that it may contain two surfaces, maybe even four. We need to watch what is most common before
+ * we create the size. Activate this IF when you start doing the optimze and please also
+ * take reports from users which value they got here.
*/
#if 1
{
@@ -323,14 +323,14 @@ DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface)
/* Check how many surfaces there are */
if (SurfaceCount != 1)
{
- /* We got more that one surface so we need alloc memory for them */
+ /* We got more than one surface, so we need to allocate memory for them */
pDdSurfaceLocal = (PDD_SURFACE_LOCAL) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_LOCAL) * SurfaceCount ));
pDdSurfaceMore = (PDD_SURFACE_MORE) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_MORE) * SurfaceCount ));
pDdSurfaceGlobal = (PDD_SURFACE_GLOBAL) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_GLOBAL) * SurfaceCount ));
phSurface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(HANDLE) * SurfaceCount ));
puhSurface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(HANDLE) * SurfaceCount ));
- /* check if we sueese alloc all memory we need */
+ /* Check if we successfully allocated all memory we need */
if ((pDdSurfaceLocal == NULL) || (pDdSurfaceMore == NULL) || (pDdSurfaceGlobal == NULL) || (phSurface == NULL) || (puhSurface == NULL))
{
pCreateSurface->ddRVal = DDERR_OUTOFMEMORY;
@@ -345,6 +345,11 @@ DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface)
HeapFree(GetProcessHeap(), 0, pDdSurfaceMore);
}
+ if ( pDdSurfaceGlobal != NULL )
+ {
+ HeapFree(GetProcessHeap(), 0, pDdSurfaceGlobal);
+ }
+
if ( phSurface != NULL )
{
HeapFree(GetProcessHeap(), 0, phSurface);
@@ -519,6 +524,11 @@ DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface)
HeapFree(GetProcessHeap(), 0, pDdSurfaceMore);
}
+ if ( pDdSurfaceGlobal != NULL )
+ {
+ HeapFree(GetProcessHeap(), 0, pDdSurfaceGlobal);
+ }
+
if ( phSurface != NULL )
{
HeapFree(GetProcessHeap(), 0, phSurface);
@@ -2037,15 +2047,18 @@ DdGetDxHandle(LPDDRAWI_DIRECTDRAW_LCL pDDraw,
BOOL bRelease)
{
HANDLE hDD = NULL;
- HANDLE hSurface = (HANDLE)pSurface->hDDSurface;
+ HANDLE hSurface = NULL;
/* Check if we already have a surface */
if (!pSurface)
{
/* We don't have one, use the DirectDraw Object handle instead */
- hSurface = NULL;
hDD = GetDdHandle(pDDraw->lpGbl->hDD);
- }
+ }
+ else
+ {
+ hSurface = (HANDLE)pSurface->hDDSurface;
+ }
/* Call the API */
return (HANDLE)NtGdiDdGetDxHandle(hDD, hSurface, bRelease);
diff --git a/reactos/dll/win32/gdi32/misc/stubs.c b/reactos/dll/win32/gdi32/misc/stubs.c
index 1333b317f0f..adfcf680f39 100644
--- a/reactos/dll/win32/gdi32/misc/stubs.c
+++ b/reactos/dll/win32/gdi32/misc/stubs.c
@@ -138,7 +138,7 @@ DrawEscape(HDC hDC,
/*
- * @unimplemented
+ * @implemented
*/
int
WINAPI
@@ -147,10 +147,20 @@ EnumObjects(HDC hdc,
GOBJENUMPROC lpObjectFunc,
LPARAM lParam)
{
+ ULONG ObjectsCount;
+ ULONG Size;
+ PVOID Buffer = NULL;
+ DWORD_PTR EndOfBuffer;
+ int Result = 0;
+
switch (nObjectType)
{
case OBJ_BRUSH:
+ Size = sizeof(LOGBRUSH);
+ break;
+
case OBJ_PEN:
+ Size = sizeof(LOGPEN);
break;
default:
@@ -158,9 +168,32 @@ EnumObjects(HDC hdc,
return 0;
}
- UNIMPLEMENTED;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ ObjectsCount = NtGdiEnumObjects(hdc, nObjectType, 0, NULL);
+ if (!ObjectsCount) return 0;
+
+ Buffer = HeapAlloc(GetProcessHeap(), 0, ObjectsCount * Size);
+ if (!Buffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
+
+ if (!NtGdiEnumObjects(hdc, nObjectType, ObjectsCount * Size, Buffer))
+ {
+ HeapFree(GetProcessHeap(), 0, Buffer);
+ return 0;
+ }
+
+ EndOfBuffer = (DWORD_PTR)Buffer + (ObjectsCount * Size);
+ while ((DWORD_PTR)Buffer < EndOfBuffer)
+ {
+ Result = lpObjectFunc(Buffer, lParam);
+ if (!Result) break;
+ Buffer = (PVOID)((DWORD_PTR)Buffer + Size);
+ }
+
+ HeapFree(GetProcessHeap(), 0, Buffer);
+ return Result;
}
diff --git a/reactos/dll/win32/gdi32/misc/stubsa.c b/reactos/dll/win32/gdi32/misc/stubsa.c
index 8a1e2b661e6..7a9ac901a3a 100644
--- a/reactos/dll/win32/gdi32/misc/stubsa.c
+++ b/reactos/dll/win32/gdi32/misc/stubsa.c
@@ -13,42 +13,17 @@
#define UNIMPLEMENTED DbgPrint("GDI32: %s is unimplemented, please try again later.\n", __FUNCTION__);
-
-
-
-/*
- * @unimplemented
- */
-DWORD
-WINAPI
-GetCharacterPlacementA(
- HDC hDc,
- LPCSTR a1,
- int a2,
- int a3,
- LPGCP_RESULTSA a4,
- DWORD a5
- )
-{
- UNIMPLEMENTED;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
/*
* @unimplemented
*/
BOOL
WINAPI
-PolyTextOutA(
- HDC hdc,
- CONST POLYTEXTA *a1,
- int a2
- )
+PolyTextOutA( HDC hdc, const POLYTEXTA *pptxt, INT cStrings )
{
- UNIMPLEMENTED;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ for (; cStrings>0; cStrings--, pptxt++)
+ if (!ExtTextOutA( hdc, pptxt->x, pptxt->y, pptxt->uiFlags, &pptxt->rcl, pptxt->lpstr, pptxt->n, pptxt->pdx ))
+ return FALSE;
+ return TRUE;
}
/*
@@ -79,9 +54,25 @@ GetICMProfileA(
LPSTR pszFilename
)
{
- UNIMPLEMENTED;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ WCHAR filenameW[MAX_PATH];
+ DWORD buflen = MAX_PATH;
+ BOOL ret = FALSE;
+
+ if (!hdc || !pBufSize || !pszFilename) return FALSE;
+
+ if (GetICMProfileW(hdc, &buflen, filenameW))
+ {
+ int len = WideCharToMultiByte(CP_ACP, 0, filenameW, -1, NULL, 0, NULL, NULL);
+ if (*pBufSize >= len)
+ {
+ WideCharToMultiByte(CP_ACP, 0, filenameW, -1, pszFilename, *pBufSize, NULL, NULL);
+ ret = TRUE;
+ }
+ else SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ *pBufSize = len;
+ }
+
+ return ret;
}
diff --git a/reactos/dll/win32/gdi32/misc/stubsw.c b/reactos/dll/win32/gdi32/misc/stubsw.c
index 28c5ab891f3..08ed2ad8976 100644
--- a/reactos/dll/win32/gdi32/misc/stubsw.c
+++ b/reactos/dll/win32/gdi32/misc/stubsw.c
@@ -21,15 +21,12 @@
*/
BOOL
WINAPI
-PolyTextOutW(
- HDC hdc,
- CONST POLYTEXTW *a1,
- int a2
- )
+PolyTextOutW( HDC hdc, const POLYTEXTW *pptxt, INT cStrings )
{
- UNIMPLEMENTED;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ for (; cStrings>0; cStrings--, pptxt++)
+ if (!ExtTextOutW( hdc, pptxt->x, pptxt->y, pptxt->uiFlags, &pptxt->rcl, pptxt->lpstr, pptxt->n, pptxt->pdx ))
+ return FALSE;
+ return TRUE;
}
/*
@@ -55,11 +52,13 @@ GetLogColorSpaceW(
BOOL
WINAPI
GetICMProfileW(
- HDC a0,
- LPDWORD a1,
- LPWSTR a2
+ HDC hdc,
+ LPDWORD size,
+ LPWSTR filename
)
{
+ if (!hdc || !size || !filename) return FALSE;
+
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
@@ -288,9 +287,22 @@ CreateScalableFontResourceW(
LPCWSTR lpszCurrentPath
)
{
- UNIMPLEMENTED;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ HANDLE f;
+
+ UNIMPLEMENTED;
+
+ /* fHidden=1 - only visible for the calling app, read-only, not
+ * enumerated with EnumFonts/EnumFontFamilies
+ * lpszCurrentPath can be NULL
+ */
+
+ /* If the output file already exists, return the ERROR_FILE_EXISTS error as specified in MSDN */
+ if ((f = CreateFileW(lpszFontRes, 0, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)) != INVALID_HANDLE_VALUE) {
+ CloseHandle(f);
+ SetLastError(ERROR_FILE_EXISTS);
+ return FALSE;
+ }
+ return FALSE; /* create failed */
}
diff --git a/reactos/dll/win32/gdi32/misc/wingl.c b/reactos/dll/win32/gdi32/misc/wingl.c
index 7e587776a77..2ba34f3bdf3 100644
--- a/reactos/dll/win32/gdi32/misc/wingl.c
+++ b/reactos/dll/win32/gdi32/misc/wingl.c
@@ -28,11 +28,11 @@
-typedef int WINAPI (*CHOOSEPIXELFMT) (HDC, CONST PIXELFORMATDESCRIPTOR *);
-typedef BOOL WINAPI (*SETPIXELFMT) (HDC, int, CONST PIXELFORMATDESCRIPTOR *);
-typedef BOOL WINAPI (*SWAPBUFFERS) (HDC hdc);
-typedef int WINAPI (*DESCRIBEPIXELFMT) (HDC, int, UINT, LPPIXELFORMATDESCRIPTOR);
-typedef int WINAPI (*GETPIXELFMT) (HDC);
+typedef int (WINAPI *CHOOSEPIXELFMT) (HDC, CONST PIXELFORMATDESCRIPTOR *);
+typedef BOOL (WINAPI *SETPIXELFMT) (HDC, int, CONST PIXELFORMATDESCRIPTOR *);
+typedef BOOL (WINAPI *SWAPBUFFERS) (HDC hdc);
+typedef int (WINAPI *DESCRIBEPIXELFMT) (HDC, int, UINT, LPPIXELFORMATDESCRIPTOR);
+typedef int (WINAPI *GETPIXELFMT) (HDC);
static CHOOSEPIXELFMT glChoosePixelFormat = NULL;
diff --git a/reactos/dll/win32/gdi32/objects/bitmap.c b/reactos/dll/win32/gdi32/objects/bitmap.c
index 44b1662a0ea..f94c31a24f2 100644
--- a/reactos/dll/win32/gdi32/objects/bitmap.c
+++ b/reactos/dll/win32/gdi32/objects/bitmap.c
@@ -501,11 +501,18 @@ CreateDIBitmap( HDC hDC,
hBmp = GetStockObject(DEFAULT_BITMAP);
else
{
- if ( Bits )
+ if ( Bits && Init == CBM_INIT )
{
pvSafeBits = RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize);
- if ( pvSafeBits )
+ if (pvSafeBits == NULL)
+ {
+ hBmp = NULL;
+ goto Exit;
+ }
+ else
+ {
RtlCopyMemory( pvSafeBits, Bits, cjBmpScanSize);
+ }
}
hBmp = NtGdiCreateDIBitmapInternal(hDC,
@@ -520,7 +527,7 @@ CreateDIBitmap( HDC hDC,
0,
0);
- if ( Bits )
+ if ( Bits && Init == CBM_INIT )
RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits);
}
Exit:
diff --git a/reactos/dll/win32/gdi32/objects/coord.c b/reactos/dll/win32/gdi32/objects/coord.c
index c56791c3932..93381e79ece 100644
--- a/reactos/dll/win32/gdi32/objects/coord.c
+++ b/reactos/dll/win32/gdi32/objects/coord.c
@@ -14,8 +14,8 @@
__asm__ __volatile__ ("fistpl %0" : "=m" (out) : "t" (in) : "st");
#else
#define FLOAT_TO_INT(in,out) \
- __asm fld in \
- __asm fistp out
+ __asm fld in; \
+ __asm fistp out;
#endif
LONG
diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c
index 20f63471b5e..f6b0f90331f 100644
--- a/reactos/dll/win32/gdi32/objects/dc.c
+++ b/reactos/dll/win32/gdi32/objects/dc.c
@@ -1539,6 +1539,7 @@ SelectObject(HDC hDC,
{
PDC_ATTR pDc_Attr;
HGDIOBJ hOldObj = NULL;
+ UINT uType;
// PTEB pTeb;
if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
@@ -1553,7 +1554,7 @@ SelectObject(HDC hDC,
return NULL;
}
- UINT uType = GDI_HANDLE_GET_TYPE(hGdiObj);
+ uType = GDI_HANDLE_GET_TYPE(hGdiObj);
switch (uType)
{
diff --git a/reactos/dll/win32/gdi32/objects/eng.c b/reactos/dll/win32/gdi32/objects/eng.c
index ce8a8c3f106..d29adf08a08 100644
--- a/reactos/dll/win32/gdi32/objects/eng.c
+++ b/reactos/dll/win32/gdi32/objects/eng.c
@@ -38,7 +38,11 @@ copy_my_glyphset( FD_GLYPHSET *dst_glyphset , FD_GLYPHSET * src_glyphset, ULONG
return retValue;
}
-FD_GLYPHSET* WINAPI
+/*
+ * @implemented
+ */
+FD_GLYPHSET*
+WINAPI
EngComputeGlyphSet(INT nCodePage,INT nFirstChar,INT cChars)
{
FD_GLYPHSET * ntfd_glyphset;
@@ -46,13 +50,12 @@ EngComputeGlyphSet(INT nCodePage,INT nFirstChar,INT cChars)
ntfd_glyphset = NtGdiEngComputeGlyphSet(nCodePage,nFirstChar,cChars);
- if (!ntfd_glyphset)
+ if (ntfd_glyphset)
{
if (ntfd_glyphset->cjThis)
{
myfd_glyphset = GlobalAlloc(0,ntfd_glyphset->cjThis);
-
- if (!myfd_glyphset)
+ if (myfd_glyphset)
{
if (copy_my_glyphset(myfd_glyphset,ntfd_glyphset,ntfd_glyphset->cjThis) == FALSE)
{
diff --git a/reactos/dll/win32/gdi32/objects/font.c b/reactos/dll/win32/gdi32/objects/font.c
index 7450294fae5..2cb6f2c0f38 100644
--- a/reactos/dll/win32/gdi32/objects/font.c
+++ b/reactos/dll/win32/gdi32/objects/font.c
@@ -1,5 +1,4 @@
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/gdi32/object/font.c
@@ -62,7 +61,9 @@ static const CHARSETINFO FONT_tci[MAXTCIINDEX] = {
/***********************************************************************
* TEXTMETRIC conversion functions.
*/
-static void FONT_TextMetricWToA(const TEXTMETRICW *ptmW, LPTEXTMETRICA ptmA )
+VOID
+FASTCALL
+FONT_TextMetricWToA(const TEXTMETRICW *ptmW, LPTEXTMETRICA ptmA )
{
ptmA->tmHeight = ptmW->tmHeight;
ptmA->tmAscent = ptmW->tmAscent;
@@ -75,10 +76,19 @@ static void FONT_TextMetricWToA(const TEXTMETRICW *ptmW, LPTEXTMETRICA ptmA )
ptmA->tmOverhang = ptmW->tmOverhang;
ptmA->tmDigitizedAspectX = ptmW->tmDigitizedAspectX;
ptmA->tmDigitizedAspectY = ptmW->tmDigitizedAspectY;
- ptmA->tmFirstChar = ptmW->tmFirstChar > 255 ? 255 : ptmW->tmFirstChar;
- ptmA->tmLastChar = ptmW->tmLastChar > 255 ? 255 : ptmW->tmLastChar;
- ptmA->tmDefaultChar = ptmW->tmDefaultChar > 255 ? 255 : ptmW->tmDefaultChar;
- ptmA->tmBreakChar = ptmW->tmBreakChar > 255 ? 255 : ptmW->tmBreakChar;
+ ptmA->tmFirstChar = min(ptmW->tmFirstChar, 255);
+ if (ptmW->tmCharSet == SYMBOL_CHARSET)
+ {
+ ptmA->tmFirstChar = 0x1e;
+ ptmA->tmLastChar = 0xff; /* win9x behaviour - we need the OS2 table data to calculate correctly */
+ }
+ else
+ {
+ ptmA->tmFirstChar = ptmW->tmDefaultChar - 1;
+ ptmA->tmLastChar = min(ptmW->tmLastChar, 0xff);
+ }
+ ptmA->tmDefaultChar = ptmW->tmDefaultChar;
+ ptmA->tmBreakChar = ptmW->tmBreakChar;
ptmA->tmItalic = ptmW->tmItalic;
ptmA->tmUnderlined = ptmW->tmUnderlined;
ptmA->tmStruckOut = ptmW->tmStruckOut;
@@ -107,6 +117,8 @@ static LPWSTR FONT_mbtowc(HDC hdc, LPCSTR str, INT count, INT *plenW, UINT *pCP)
if(count == -1) count = strlen(str);
lenW = MultiByteToWideChar(cp, 0, str, count, NULL, 0);
strW = HeapAlloc(GetProcessHeap(), 0, lenW*sizeof(WCHAR));
+ if (!strW)
+ return NULL;
MultiByteToWideChar(cp, 0, str, count, strW, lenW);
DPRINT("mapped %s -> %S\n", str, strW);
if(plenW) *plenW = lenW;
@@ -114,168 +126,21 @@ static LPWSTR FONT_mbtowc(HDC hdc, LPCSTR str, INT count, INT *plenW, UINT *pCP)
return strW;
}
-
-static BOOL FASTCALL
-MetricsCharConvert(WCHAR w, UCHAR *b)
- {
- UNICODE_STRING WString;
- WCHAR WBuf[2];
- ANSI_STRING AString;
- CHAR ABuf[2];
- NTSTATUS Status;
-
- if (L'\0' == w)
- {
- *b = '\0';
- }
- else
- {
- WBuf[0] = w;
- WBuf[1] = L'\0';
- RtlInitUnicodeString(&WString, WBuf);
- ABuf[0] = '*';
- ABuf[1] = L'\0';
- RtlInitAnsiString(&AString, ABuf);
-
- Status = RtlUnicodeStringToAnsiString(&AString, &WString, FALSE);
- if (! NT_SUCCESS(Status))
- {
- SetLastError(RtlNtStatusToDosError(Status));
- return FALSE;
- }
- *b = ABuf[0];
- }
-
- return TRUE;
-}
-
-BOOL FASTCALL
-TextMetricW2A(TEXTMETRICA *tma, TEXTMETRICW *tmw)
-{
- UNICODE_STRING WString;
- WCHAR WBuf[256];
- ANSI_STRING AString;
- CHAR ABuf[256];
- UINT Letter;
- NTSTATUS Status;
-
- tma->tmHeight = tmw->tmHeight;
- tma->tmAscent = tmw->tmAscent;
- tma->tmDescent = tmw->tmDescent;
- tma->tmInternalLeading = tmw->tmInternalLeading;
- tma->tmExternalLeading = tmw->tmExternalLeading;
- tma->tmAveCharWidth = tmw->tmAveCharWidth;
- tma->tmMaxCharWidth = tmw->tmMaxCharWidth;
- tma->tmWeight = tmw->tmWeight;
- tma->tmOverhang = tmw->tmOverhang;
- tma->tmDigitizedAspectX = tmw->tmDigitizedAspectX;
- tma->tmDigitizedAspectY = tmw->tmDigitizedAspectY;
-
- /* The Unicode FirstChar/LastChar need not correspond to the ANSI
- FirstChar/LastChar. For example, if the font contains glyphs for
- letters A-Z and an accented version of the letter e, the Unicode
- FirstChar would be A and the Unicode LastChar would be the accented
- e. If you just translate those to ANSI, the range would become
- letters A-E instead of A-Z.
- We translate all possible ANSI chars to Unicode and find the first
- and last translated character which fall into the Unicode FirstChar/
- LastChar range and return the corresponding ANSI char. */
-
- /* Setup an Ansi string containing all possible letters (note: skip '\0' at
- the beginning since that would be interpreted as end-of-string, handle
- '\0' special later */
- for (Letter = 1; Letter < 256; Letter++)
- {
- ABuf[Letter - 1] = (CHAR) Letter;
- WBuf[Letter - 1] = L' ';
- }
- ABuf[255] = '\0';
- WBuf[255] = L'\0';
- RtlInitAnsiString(&AString, ABuf);
- RtlInitUnicodeString(&WString, WBuf);
-
- /* Find the corresponding Unicode characters */
- Status = RtlAnsiStringToUnicodeString(&WString, &AString, FALSE);
- if (! NT_SUCCESS(Status))
- {
- SetLastError(RtlNtStatusToDosError(Status));
- return FALSE;
- }
-
- /* Scan for the first ANSI character which maps to an Unicode character
- in the range */
- tma->tmFirstChar = '\0';
- if (L'\0' != tmw->tmFirstChar)
- {
- for (Letter = 1; Letter < 256; Letter++)
- {
- if (tmw->tmFirstChar <= WBuf[Letter - 1] &&
- WBuf[Letter - 1] <= tmw->tmLastChar)
- {
- tma->tmFirstChar = (CHAR) Letter;
- break;
- }
- }
- }
-
- /* Scan for the last ANSI character which maps to an Unicode character
- in the range */
- tma->tmLastChar = '\0';
- if (L'\0' != tmw->tmLastChar)
- {
- for (Letter = 255; 0 < Letter; Letter--)
- {
- if (tmw->tmFirstChar <= WBuf[Letter - 1] &&
- WBuf[Letter - 1] <= tmw->tmLastChar)
- {
- tma->tmLastChar = (CHAR) Letter;
- break;
- }
- }
- }
-
- if (! MetricsCharConvert(tmw->tmDefaultChar, &tma->tmDefaultChar) ||
- ! MetricsCharConvert(tmw->tmBreakChar, &tma->tmBreakChar))
- {
- return FALSE;
- }
-
- tma->tmItalic = tmw->tmItalic;
- tma->tmUnderlined = tmw->tmUnderlined;
- tma->tmStruckOut = tmw->tmStruckOut;
- tma->tmPitchAndFamily = tmw->tmPitchAndFamily;
- tma->tmCharSet = tmw->tmCharSet;
-
- return TRUE;
-}
-
-BOOL FASTCALL
+VOID FASTCALL
NewTextMetricW2A(NEWTEXTMETRICA *tma, NEWTEXTMETRICW *tmw)
{
- if (! TextMetricW2A((TEXTMETRICA *) tma, (TEXTMETRICW *) tmw))
- {
- return FALSE;
- }
-
+ FONT_TextMetricWToA((TEXTMETRICW *) tmw, (TEXTMETRICA *) tma);
tma->ntmFlags = tmw->ntmFlags;
tma->ntmSizeEM = tmw->ntmSizeEM;
tma->ntmCellHeight = tmw->ntmCellHeight;
tma->ntmAvgWidth = tmw->ntmAvgWidth;
-
- return TRUE;
}
-BOOL FASTCALL
+VOID FASTCALL
NewTextMetricExW2A(NEWTEXTMETRICEXA *tma, NEWTEXTMETRICEXW *tmw)
{
- if (! NewTextMetricW2A(&tma->ntmTm, &tmw->ntmTm))
- {
- return FALSE;
- }
-
+ NewTextMetricW2A(&tma->ntmTm, &tmw->ntmTm);
tma->ntmFontSig = tmw->ntmFontSig;
-
- return TRUE;
}
static int FASTCALL
@@ -425,6 +290,69 @@ EnumFontFamiliesA(HDC hdc, LPCSTR lpszFamily, FONTENUMPROCA lpEnumFontFamProc,
return IntEnumFontFamilies(hdc, &LogFont, lpEnumFontFamProc, lParam, FALSE);
}
+
+/*
+ * @implemented
+ */
+DWORD
+WINAPI
+GetCharacterPlacementA(
+ HDC hdc,
+ LPCSTR lpString,
+ INT uCount,
+ INT nMaxExtent,
+ GCP_RESULTSA *lpResults,
+ DWORD dwFlags)
+{
+ WCHAR *lpStringW;
+ INT uCountW;
+ GCP_RESULTSW resultsW;
+ DWORD ret;
+ UINT font_cp;
+
+ if ( !lpString || uCount <= 0 || (nMaxExtent < 0 && nMaxExtent != -1 ) )
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+/* TRACE("%s, %d, %d, 0x%08x\n",
+ debugstr_an(lpString, uCount), uCount, nMaxExtent, dwFlags);
+*/
+ /* both structs are equal in size */
+ memcpy(&resultsW, lpResults, sizeof(resultsW));
+
+ lpStringW = FONT_mbtowc(hdc, lpString, uCount, &uCountW, &font_cp);
+ if (lpStringW == NULL)
+ {
+ return 0;
+ }
+ if(lpResults->lpOutString)
+ {
+ resultsW.lpOutString = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*uCountW);
+ if (resultsW.lpOutString == NULL)
+ {
+ HeapFree(GetProcessHeap(), 0, lpStringW);
+ return 0;
+ }
+ }
+
+ ret = GetCharacterPlacementW(hdc, lpStringW, uCountW, nMaxExtent, &resultsW, dwFlags);
+
+ lpResults->nGlyphs = resultsW.nGlyphs;
+ lpResults->nMaxFit = resultsW.nMaxFit;
+
+ if(lpResults->lpOutString) {
+ WideCharToMultiByte(font_cp, 0, resultsW.lpOutString, uCountW,
+ lpResults->lpOutString, uCount, NULL, NULL );
+ }
+
+ HeapFree(GetProcessHeap(), 0, lpStringW);
+ HeapFree(GetProcessHeap(), 0, resultsW.lpOutString);
+
+ return ret;
+}
+
+
/*
* @implemented
*/
@@ -507,6 +435,47 @@ GetCharacterPlacementW(
return ret;
}
+DWORD
+WINAPI
+NewGetCharacterPlacementW(
+ HDC hdc,
+ LPCWSTR lpString,
+ INT uCount,
+ INT nMaxExtent,
+ GCP_RESULTSW *lpResults,
+ DWORD dwFlags
+ )
+{
+ INT nSet;
+ SIZE Size = {0,0};
+
+ if ( !lpString || uCount <= 0 || (nMaxExtent < 0 && nMaxExtent != -1 ) )
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+
+ if ( !lpResults )
+ {
+ if ( GetTextExtentPointW(hdc, lpString, uCount, &Size) )
+ {
+ return MAKELONG(Size.cx, Size.cy);
+ }
+ return 0;
+ }
+
+ nSet = uCount;
+ if ( nSet > lpResults->nGlyphs )
+ nSet = lpResults->nGlyphs;
+
+ return NtGdiGetCharacterPlacementW( hdc,
+ (LPWSTR)lpString,
+ nSet,
+ nMaxExtent,
+ lpResults,
+ dwFlags);
+}
+
/*
* @implemented
*
@@ -972,6 +941,7 @@ GetGlyphOutlineA(
DWORD ret;
UINT c;
DPRINT("GetGlyphOutlineA uChar %x\n", uChar);
+ if (!lpgm || !lpmat2) return GDI_ERROR;
if(!(uFormat & GGO_GLYPH_INDEX)) {
int len;
char mbchs[2];
@@ -1009,7 +979,7 @@ GetGlyphOutlineW(
)
{
DPRINT("GetGlyphOutlineW uChar %x\n", uChar);
- if (!lpgm & !lpmat2) return GDI_ERROR;
+ if (!lpgm || !lpmat2) return GDI_ERROR;
if (!lpvBuffer) cbBuffer = 0;
return NtGdiGetGlyphOutline ( hdc, uChar, uFormat, lpgm, cbBuffer, lpvBuffer, (CONST LPMAT2)lpmat2, TRUE);
}
@@ -1035,7 +1005,13 @@ GetOutlineTextMetricsA(
if((ret = GetOutlineTextMetricsW(hdc, 0, NULL)) == 0)
return 0;
if(ret > sizeof(buf))
- lpOTMW = HeapAlloc(GetProcessHeap(), 0, ret);
+ {
+ lpOTMW = HeapAlloc(GetProcessHeap(), 0, ret);
+ if (lpOTMW == NULL)
+ {
+ return 0;
+ }
+ }
GetOutlineTextMetricsW(hdc, ret, lpOTMW);
needed = sizeof(OUTLINETEXTMETRICA);
@@ -1063,10 +1039,16 @@ GetOutlineTextMetricsA(
DPRINT("needed = %d\n", needed);
if(needed > cbData)
+ {
/* Since the supplied buffer isn't big enough, we'll alloc one
that is and memcpy the first cbData bytes into the lpOTM at
the end. */
output = HeapAlloc(GetProcessHeap(), 0, needed);
+ if (output == NULL)
+ {
+ goto end;
+ }
+ }
ret = output->otmSize = min(needed, cbData);
FONT_TextMetricWToA( &lpOTMW->otmTextMetrics, &output->otmTextMetrics );
@@ -1249,6 +1231,10 @@ GetKerningPairsA( HDC hDC,
if (!cPairs && !kern_pairA) return total_kern_pairs;
kern_pairW = HeapAlloc(GetProcessHeap(), 0, total_kern_pairs * sizeof(*kern_pairW));
+ if (kern_pairW == NULL)
+ {
+ return 0;
+ }
GetKerningPairsW(hDC, total_kern_pairs, kern_pairW);
for (i = 0; i < total_kern_pairs; i++)
@@ -1718,7 +1704,7 @@ GdiGetCharDimensions(HDC hdc, LPTEXTMETRICW lptm, LONG *height)
*
*/
/*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
diff --git a/reactos/dll/win32/gdi32/objects/metafile.c b/reactos/dll/win32/gdi32/objects/metafile.c
index 92babbf3494..61ded65dd7e 100644
--- a/reactos/dll/win32/gdi32/objects/metafile.c
+++ b/reactos/dll/win32/gdi32/objects/metafile.c
@@ -150,6 +150,12 @@ CreateMetaFileW(
pmfDC->mh.mtVersion = 0x0300;
pmfDC->mh.mtSize = pmfDC->mh.mtHeaderSize;
+ pmfDC->hPen = GetStockObject(BLACK_PEN);
+ pmfDC->hBrush = GetStockObject(WHITE_BRUSH);
+ pmfDC->hFont = GetStockObject(DEVICE_DEFAULT_FONT);
+ pmfDC->hBitmap = GetStockObject(DEFAULT_BITMAP);
+ pmfDC->hPalette = GetStockObject(DEFAULT_PALETTE);
+
if (lpszFile) /* disk based metafile */
{
pmfDC->mh.mtType = METAFILE_DISK;
@@ -159,20 +165,20 @@ CreateMetaFileW(
(LPTSTR) &pmfDC->Filename,
(LPTSTR*) &lpszFile))
{
-// MFDRV_DeleteDC( dc->physDev );
+ LocalFree(pmfDC);
return NULL;
}
if ((hFile = CreateFileW(pmfDC->Filename, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, 0, 0)) == INVALID_HANDLE_VALUE)
{
-// MFDRV_DeleteDC( dc->physDev );
+ LocalFree(pmfDC);
return NULL;
}
- if (!WriteFile( hFile, &pmfDC->mh, sizeof(pmfDC->mh), NULL, NULL ))
+ if (!WriteFile( hFile, &pmfDC->mh, sizeof(pmfDC->mh), &pmfDC->dwWritten, NULL ))
{
-// MFDRV_DeleteDC( dc->physDev );
+ LocalFree(pmfDC);
return NULL;
}
pmfDC->hFile = hFile;
diff --git a/reactos/dll/win32/gdi32/objects/printdrv.c b/reactos/dll/win32/gdi32/objects/printdrv.c
index 2c1310c6675..c0952c20d95 100644
--- a/reactos/dll/win32/gdi32/objects/printdrv.c
+++ b/reactos/dll/win32/gdi32/objects/printdrv.c
@@ -197,31 +197,31 @@ LoadTheSpoolerDrv(VOID)
if (hModWinSpoolDrv)
{
- fpAbortPrinter = GetProcAddress(hModWinSpoolDrv, "AbortPrinter");
- fpClosePrinter = GetProcAddress(hModWinSpoolDrv, "ClosePrinter");
- fpCloseSpoolFileHandle = GetProcAddress(hModWinSpoolDrv, "CloseSpoolFileHandle");
+ fpAbortPrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "AbortPrinter");
+ fpClosePrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "ClosePrinter");
+ fpCloseSpoolFileHandle = (PVOID)GetProcAddress(hModWinSpoolDrv, "CloseSpoolFileHandle");
fpCommitSpoolData = (PVOID)GetProcAddress(hModWinSpoolDrv, "CommitSpoolData");
- // fpConnectToLd64In32Server = GetProcAddress(hModWinSpoolDrv, (LPCSTR)224);
+ // fpConnectToLd64In32Server = (PVOID)GetProcAddress(hModWinSpoolDrv, (LPCSTR)224);
fpDocumentEvent = (PVOID)GetProcAddress(hModWinSpoolDrv,"DocumentEvent");
fpDocumentPropertiesW = (PVOID)GetProcAddress(hModWinSpoolDrv, "DocumentPropertiesW");
- fpEndDocPrinter = GetProcAddress(hModWinSpoolDrv, "EndDocPrinter");
- fpEndPagePrinter = GetProcAddress(hModWinSpoolDrv, "EndPagePrinter");
- fpGetPrinterW = GetProcAddress( hModWinSpoolDrv,"GetPrinterW");
- fpGetPrinterDriverW = GetProcAddress(hModWinSpoolDrv,"GetPrinterDriverW");
+ fpEndDocPrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "EndDocPrinter");
+ fpEndPagePrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "EndPagePrinter");
+ fpGetPrinterW = (PVOID)GetProcAddress( hModWinSpoolDrv,"GetPrinterW");
+ fpGetPrinterDriverW = (PVOID)GetProcAddress(hModWinSpoolDrv,"GetPrinterDriverW");
fpGetSpoolFileHandle = (PVOID)GetProcAddress(hModWinSpoolDrv, "GetSpoolFileHandle");
- fpIsValidDevmodeW = GetProcAddress(hModWinSpoolDrv, "IsValidDevmodeW");
- fpOpenPrinterW = GetProcAddress(hModWinSpoolDrv, "OpenPrinterW");
- fpQueryColorProfile = GetProcAddress(hModWinSpoolDrv,"QueryColorProfile");
+ fpIsValidDevmodeW = (PVOID)GetProcAddress(hModWinSpoolDrv, "IsValidDevmodeW");
+ fpOpenPrinterW = (PVOID)GetProcAddress(hModWinSpoolDrv, "OpenPrinterW");
+ fpQueryColorProfile = (PVOID)GetProcAddress(hModWinSpoolDrv,"QueryColorProfile");
fpQueryRemoteFonts = (PVOID)GetProcAddress(hModWinSpoolDrv, "QueryRemoteFonts");
fpQuerySpoolMode = (PVOID)GetProcAddress(hModWinSpoolDrv, "QuerySpoolMode");
- fpReadPrinter = GetProcAddress(hModWinSpoolDrv, "ReadPrinter");
- fpResetPrinterW = GetProcAddress(hModWinSpoolDrv, "ResetPrinterW");
- fpSeekPrinter = GetProcAddress(hModWinSpoolDrv, "SeekPrinter");
- fpSplDriverUnloadComplete = GetProcAddress(hModWinSpoolDrv, "SplDriverUnloadComplete");
- fpSplReadPrinter = GetProcAddress(hModWinSpoolDrv, (LPCSTR)205);
+ fpReadPrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "ReadPrinter");
+ fpResetPrinterW = (PVOID)GetProcAddress(hModWinSpoolDrv, "ResetPrinterW");
+ fpSeekPrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "SeekPrinter");
+ fpSplDriverUnloadComplete = (PVOID)GetProcAddress(hModWinSpoolDrv, "SplDriverUnloadComplete");
+ fpSplReadPrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, (LPCSTR)205);
fpStartDocDlgW = (PVOID)GetProcAddress(hModWinSpoolDrv, "StartDocDlgW");
fpStartDocPrinterW = (PVOID)GetProcAddress(hModWinSpoolDrv, "StartDocPrinterW");
- fpStartPagePrinter = GetProcAddress(hModWinSpoolDrv, "StartPagePrinter");
+ fpStartPagePrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "StartPagePrinter");
if ( !fpAbortPrinter ||
!fpClosePrinter ||
diff --git a/reactos/dll/win32/gdi32/objects/region.c b/reactos/dll/win32/gdi32/objects/region.c
index 98dbab0a503..7dbd97033c1 100644
--- a/reactos/dll/win32/gdi32/objects/region.c
+++ b/reactos/dll/win32/gdi32/objects/region.c
@@ -111,7 +111,7 @@ MirrorRgnByWidth(HRGN hRgn, INT Width, HRGN *phRgn)
if (phRgn) phRgn = (HRGN *)hRgnex;
else
{
- CombineRgn(hRgn, hRgnex, *phRgn, RGN_COPY);
+ CombineRgn(hRgn, hRgnex, 0, RGN_COPY);
DeleteObject(hRgnex);
}
Ret = 1;
diff --git a/reactos/dll/win32/gdi32/objects/text.c b/reactos/dll/win32/gdi32/objects/text.c
index 93896d45f5c..2e2306bca08 100644
--- a/reactos/dll/win32/gdi32/objects/text.c
+++ b/reactos/dll/win32/gdi32/objects/text.c
@@ -1,7 +1,6 @@
#include "precomp.h"
-
/*
* @implemented
*/
@@ -91,7 +90,6 @@ GetTextCharset(HDC hdc)
-
/*
* @implemented
*/
@@ -109,7 +107,8 @@ GetTextMetricsA(
return FALSE;
}
- return TextMetricW2A(lptm, &tmwi.TextMetric);
+ FONT_TextMetricWToA(&tmwi.TextMetric, lptm);
+ return TRUE;
}
@@ -396,6 +395,10 @@ GetTextFaceA( HDC hdc, INT count, LPSTR name )
res = GetTextFaceW(hdc, 0, NULL);
nameW = HeapAlloc( GetProcessHeap(), 0, res * 2 );
+ if (nameW == NULL)
+ {
+ return 0;
+ }
GetTextFaceW( hdc, res, nameW );
if (name)
diff --git a/reactos/dll/win32/gdiplus/brush.c b/reactos/dll/win32/gdiplus/brush.c
index cdbc17ddf2a..6220443b04d 100644
--- a/reactos/dll/win32/gdiplus/brush.c
+++ b/reactos/dll/win32/gdiplus/brush.c
@@ -288,6 +288,17 @@ GpStatus WINGDIPAPI GdipCreateLineBrush(GDIPCONST GpPointF* startpoint,
(*line)->rect.Width = fabs(startpoint->X - endpoint->X);
(*line)->rect.Height = fabs(startpoint->Y - endpoint->Y);
+ if ((*line)->rect.Width == 0)
+ {
+ (*line)->rect.X -= (*line)->rect.Height / 2.0f;
+ (*line)->rect.Width = (*line)->rect.Height;
+ }
+ else if ((*line)->rect.Height == 0)
+ {
+ (*line)->rect.Y -= (*line)->rect.Width / 2.0f;
+ (*line)->rect.Height = (*line)->rect.Width;
+ }
+
(*line)->blendcount = 1;
(*line)->blendfac = GdipAlloc(sizeof(REAL));
(*line)->blendpos = GdipAlloc(sizeof(REAL));
@@ -686,9 +697,9 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image,
n_y + n_height > ((GpBitmap*)image)->height)
return InvalidParameter;
- IPicture_get_Handle(image->picture, (OLE_HANDLE*)&hbm);
+ hbm = ((GpBitmap*)image)->hbitmap;
if(!hbm) return GenericError;
- IPicture_get_CurDC(image->picture, &hdc);
+ hdc = ((GpBitmap*)image)->hdc;
bm_is_selected = (hdc != 0);
pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
@@ -1342,6 +1353,13 @@ GpStatus WINGDIPAPI GdipSetPathGradientBlend(GpPathGradient *brush, GDIPCONST RE
return NotImplemented;
}
+GpStatus WINGDIPAPI GdipSetPathGradientPresetBlend(GpPathGradient *brush,
+ GDIPCONST ARGB *blend, GDIPCONST REAL *pos, INT count)
+{
+ FIXME("(%p,%p,%p,%i): stub\n", brush, blend, pos, count);
+ return NotImplemented;
+}
+
GpStatus WINGDIPAPI GdipSetPathGradientCenterColor(GpPathGradient *grad,
ARGB argb)
{
@@ -1551,12 +1569,33 @@ GpStatus WINGDIPAPI GdipRotateTextureTransform(GpTexture* brush, REAL angle,
GpStatus WINGDIPAPI GdipSetLineLinearBlend(GpLineGradient *brush, REAL focus,
REAL scale)
{
- static int calls;
+ REAL factors[3];
+ REAL positions[3];
+ int num_points = 0;
- if(!(calls++))
- FIXME("not implemented\n");
+ TRACE("(%p,%.2f,%.2f)\n", brush, focus, scale);
- return NotImplemented;
+ if (!brush) return InvalidParameter;
+
+ if (focus != 0.0)
+ {
+ factors[num_points] = 0.0;
+ positions[num_points] = 0.0;
+ num_points++;
+ }
+
+ factors[num_points] = scale;
+ positions[num_points] = focus;
+ num_points++;
+
+ if (focus != 1.0)
+ {
+ factors[num_points] = 0.0;
+ positions[num_points] = 1.0;
+ num_points++;
+ }
+
+ return GdipSetLineBlend(brush, factors, positions, num_points);
}
GpStatus WINGDIPAPI GdipSetLinePresetBlend(GpLineGradient *brush,
diff --git a/reactos/dll/win32/gdiplus/gdiplus.c b/reactos/dll/win32/gdiplus/gdiplus.c
index 06019a24e35..ec956f34f57 100644
--- a/reactos/dll/win32/gdiplus/gdiplus.c
+++ b/reactos/dll/win32/gdiplus/gdiplus.c
@@ -399,6 +399,25 @@ BOOL lengthen_path(GpPath *path, INT len)
return TRUE;
}
+void convert_32bppARGB_to_32bppPARGB(UINT width, UINT height,
+ BYTE *dst_bits, INT dst_stride, const BYTE *src_bits, INT src_stride)
+{
+ UINT x, y;
+ for (y=0; yuser32
gdi32
kernel32
+ windowscodecs
ntdll
crt
diff --git a/reactos/dll/win32/gdiplus/gdiplus.spec b/reactos/dll/win32/gdiplus/gdiplus.spec
index c658e002dfc..bda241ed93b 100644
--- a/reactos/dll/win32/gdiplus/gdiplus.spec
+++ b/reactos/dll/win32/gdiplus/gdiplus.spec
@@ -165,11 +165,11 @@
@ stdcall GdipDrawClosedCurveI(ptr ptr ptr long)
@ stdcall GdipDrawCurve2(ptr ptr ptr long long)
@ stdcall GdipDrawCurve2I(ptr ptr ptr long long)
-@ stub GdipDrawCurve3
-@ stub GdipDrawCurve3I
+@ stdcall GdipDrawCurve3(ptr ptr ptr long long long long)
+@ stdcall GdipDrawCurve3I(ptr ptr ptr long long long long)
@ stdcall GdipDrawCurve(ptr ptr ptr long)
@ stdcall GdipDrawCurveI(ptr ptr ptr long)
-@ stub GdipDrawDriverString
+@ stdcall GdipDrawDriverString(ptr ptr long ptr ptr ptr long ptr)
@ stdcall GdipDrawEllipse(ptr ptr long long long long)
@ stdcall GdipDrawEllipseI(ptr ptr long long long long)
@ stdcall GdipDrawImage(ptr ptr long long)
@@ -291,7 +291,7 @@
@ stdcall GdipGetImageHeight(ptr ptr)
@ stdcall GdipGetImageHorizontalResolution(ptr ptr)
@ stub GdipGetImageItemData
-@ stub GdipGetImagePalette
+@ stdcall GdipGetImagePalette(ptr ptr long)
@ stdcall GdipGetImagePaletteSize(ptr ptr)
@ stdcall GdipGetImagePixelFormat(ptr ptr)
@ stdcall GdipGetImageRawFormat(ptr ptr)
@@ -400,8 +400,8 @@
@ stub GdipGetTextureImage
@ stdcall GdipGetTextureTransform(ptr ptr)
@ stdcall GdipGetTextureWrapMode(ptr ptr)
-@ stub GdipGetVisibleClipBounds
-@ stub GdipGetVisibleClipBoundsI
+@ stdcall GdipGetVisibleClipBounds(ptr ptr)
+@ stdcall GdipGetVisibleClipBoundsI(ptr ptr)
@ stdcall GdipGetWorldTransform(ptr ptr)
@ stdcall GdipGraphicsClear(ptr long)
@ stub GdipGraphicsSetAbort
@@ -429,18 +429,18 @@
@ stdcall GdipIsVisiblePathPointI(ptr long long ptr ptr)
@ stdcall GdipIsVisiblePoint(ptr long long ptr)
@ stdcall GdipIsVisiblePointI(ptr long long ptr)
-@ stub GdipIsVisibleRect
-@ stub GdipIsVisibleRectI
-@ stub GdipIsVisibleRegionPoint
-@ stub GdipIsVisibleRegionPointI
-@ stub GdipIsVisibleRegionRect
-@ stub GdipIsVisibleRegionRectI
+@ stdcall GdipIsVisibleRect(ptr long long long long ptr)
+@ stdcall GdipIsVisibleRectI(ptr long long long long ptr)
+@ stdcall GdipIsVisibleRegionPoint(ptr long long ptr ptr)
+@ stdcall GdipIsVisibleRegionPointI(ptr long long ptr ptr)
+@ stdcall GdipIsVisibleRegionRect(ptr long long long long ptr ptr)
+@ stdcall GdipIsVisibleRegionRectI(ptr long long long long ptr ptr)
@ stdcall GdipLoadImageFromFile(wstr ptr)
@ stdcall GdipLoadImageFromFileICM(wstr ptr)
@ stdcall GdipLoadImageFromStream(ptr ptr)
@ stdcall GdipLoadImageFromStreamICM(ptr ptr)
@ stdcall GdipMeasureCharacterRanges(ptr wstr long ptr ptr ptr long ptr)
-@ stub GdipMeasureDriverString
+@ stdcall GdipMeasureDriverString(ptr ptr long ptr ptr long ptr ptr)
@ stdcall GdipMeasureString(ptr wstr long ptr ptr ptr ptr ptr ptr)
@ stub GdipMultiplyLineTransform
@ stdcall GdipMultiplyMatrix(ptr ptr long)
@@ -469,7 +469,7 @@
@ stub GdipRecordMetafile
@ stdcall GdipRecordMetafileFileName(wstr long long ptr long wstr ptr)
@ stdcall GdipRecordMetafileFileNameI(wstr long long ptr long wstr ptr)
-@ stub GdipRecordMetafileI
+@ stdcall GdipRecordMetafileI(long long ptr long wstr ptr)
@ stub GdipRecordMetafileStream
@ stub GdipRecordMetafileStreamI
@ stdcall GdipReleaseDC(ptr ptr)
@@ -556,7 +556,7 @@
@ stdcall GdipSetPathGradientGammaCorrection(ptr long)
@ stub GdipSetPathGradientLinearBlend
@ stub GdipSetPathGradientPath
-@ stub GdipSetPathGradientPresetBlend
+@ stdcall GdipSetPathGradientPresetBlend(ptr ptr ptr long)
@ stdcall GdipSetPathGradientSigmaBlend(ptr long long)
@ stdcall GdipSetPathGradientSurroundColorsWithCount(ptr ptr ptr)
@ stub GdipSetPathGradientTransform
diff --git a/reactos/dll/win32/gdiplus/gdiplus_private.h b/reactos/dll/win32/gdiplus/gdiplus_private.h
index 95133ca2d88..e87176e3064 100644
--- a/reactos/dll/win32/gdiplus/gdiplus_private.h
+++ b/reactos/dll/win32/gdiplus/gdiplus_private.h
@@ -29,6 +29,7 @@
#include "objbase.h"
#include "ocidl.h"
+#include "wine/list.h"
#include "gdiplus.h"
@@ -67,6 +68,11 @@ static inline INT roundr(REAL x)
return (INT) floorf(x + 0.5);
}
+static inline INT ceilr(REAL x)
+{
+ return (INT) ceilf(x);
+}
+
static inline REAL deg2rad(REAL degrees)
{
return M_PI * degrees / 180.0;
@@ -74,6 +80,9 @@ static inline REAL deg2rad(REAL degrees)
extern const char *debugstr_rectf(CONST RectF* rc);
+extern void convert_32bppARGB_to_32bppPARGB(UINT width, UINT height,
+ BYTE *dst_bits, INT dst_stride, const BYTE *src_bits, INT src_stride);
+
struct GpPen{
UINT style;
GpUnit unit;
@@ -109,6 +118,8 @@ struct GpGraphics{
BOOL busy; /* hdc handle obtained by GdipGetDC */
GpRegion *clip;
UINT textcontrast; /* not used yet. get/set only */
+ struct list containers;
+ GraphicsContainer contid; /* last-issued container ID */
};
struct GpBrush{
@@ -214,14 +225,25 @@ struct GpBitmap{
ImageLockMode lockmode;
INT numlocks;
BYTE *bitmapbits; /* pointer to the buffer we passed in BitmapLockBits */
+ HBITMAP hbitmap;
+ HDC hdc;
+ BYTE *bits; /* actual image bits if this is a DIB */
+ INT stride; /* stride of bits if this is a DIB */
};
struct GpCachedBitmap{
GpImage *image;
};
+struct color_key{
+ BOOL enabled;
+ ARGB low;
+ ARGB high;
+};
+
struct GpImageAttributes{
WrapMode wrap;
+ struct color_key colorkeys[ColorAdjustTypeCount];
};
struct GpFont{
diff --git a/reactos/dll/win32/gdiplus/graphics.c b/reactos/dll/win32/gdiplus/graphics.c
index 269815933f9..1df3eee4ba0 100644
--- a/reactos/dll/win32/gdiplus/graphics.c
+++ b/reactos/dll/win32/gdiplus/graphics.c
@@ -38,6 +38,7 @@
#include "gdiplus.h"
#include "gdiplus_private.h"
#include "wine/debug.h"
+#include "wine/list.h"
WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
@@ -941,6 +942,153 @@ GpStatus trace_path(GpGraphics *graphics, GpPath *path)
return result;
}
+typedef struct _GraphicsContainerItem {
+ struct list entry;
+ GraphicsContainer contid;
+
+ SmoothingMode smoothing;
+ CompositingQuality compqual;
+ InterpolationMode interpolation;
+ CompositingMode compmode;
+ TextRenderingHint texthint;
+ REAL scale;
+ GpUnit unit;
+ PixelOffsetMode pixeloffset;
+ UINT textcontrast;
+ GpMatrix* worldtrans;
+ GpRegion* clip;
+} GraphicsContainerItem;
+
+static GpStatus init_container(GraphicsContainerItem** container,
+ GDIPCONST GpGraphics* graphics){
+ GpStatus sts;
+
+ *container = GdipAlloc(sizeof(GraphicsContainerItem));
+ if(!(*container))
+ return OutOfMemory;
+
+ (*container)->contid = graphics->contid + 1;
+
+ (*container)->smoothing = graphics->smoothing;
+ (*container)->compqual = graphics->compqual;
+ (*container)->interpolation = graphics->interpolation;
+ (*container)->compmode = graphics->compmode;
+ (*container)->texthint = graphics->texthint;
+ (*container)->scale = graphics->scale;
+ (*container)->unit = graphics->unit;
+ (*container)->textcontrast = graphics->textcontrast;
+ (*container)->pixeloffset = graphics->pixeloffset;
+
+ sts = GdipCloneMatrix(graphics->worldtrans, &(*container)->worldtrans);
+ if(sts != Ok){
+ GdipFree(*container);
+ *container = NULL;
+ return sts;
+ }
+
+ sts = GdipCloneRegion(graphics->clip, &(*container)->clip);
+ if(sts != Ok){
+ GdipDeleteMatrix((*container)->worldtrans);
+ GdipFree(*container);
+ *container = NULL;
+ return sts;
+ }
+
+ return Ok;
+}
+
+static void delete_container(GraphicsContainerItem* container){
+ GdipDeleteMatrix(container->worldtrans);
+ GdipDeleteRegion(container->clip);
+ GdipFree(container);
+}
+
+static GpStatus restore_container(GpGraphics* graphics,
+ GDIPCONST GraphicsContainerItem* container){
+ GpStatus sts;
+ GpMatrix *newTrans;
+ GpRegion *newClip;
+
+ sts = GdipCloneMatrix(container->worldtrans, &newTrans);
+ if(sts != Ok)
+ return sts;
+
+ sts = GdipCloneRegion(container->clip, &newClip);
+ if(sts != Ok){
+ GdipDeleteMatrix(newTrans);
+ return sts;
+ }
+
+ GdipDeleteMatrix(graphics->worldtrans);
+ graphics->worldtrans = newTrans;
+
+ GdipDeleteRegion(graphics->clip);
+ graphics->clip = newClip;
+
+ graphics->contid = container->contid - 1;
+
+ graphics->smoothing = container->smoothing;
+ graphics->compqual = container->compqual;
+ graphics->interpolation = container->interpolation;
+ graphics->compmode = container->compmode;
+ graphics->texthint = container->texthint;
+ graphics->scale = container->scale;
+ graphics->unit = container->unit;
+ graphics->textcontrast = container->textcontrast;
+ graphics->pixeloffset = container->pixeloffset;
+
+ return Ok;
+}
+
+static GpStatus get_graphics_bounds(GpGraphics* graphics, GpRectF* rect)
+{
+ RECT wnd_rect;
+
+ if(graphics->hwnd) {
+ if(!GetClientRect(graphics->hwnd, &wnd_rect))
+ return GenericError;
+
+ rect->X = wnd_rect.left;
+ rect->Y = wnd_rect.top;
+ rect->Width = wnd_rect.right - wnd_rect.left;
+ rect->Height = wnd_rect.bottom - wnd_rect.top;
+ }else{
+ rect->X = 0;
+ rect->Y = 0;
+ rect->Width = GetDeviceCaps(graphics->hdc, HORZRES);
+ rect->Height = GetDeviceCaps(graphics->hdc, VERTRES);
+ }
+
+ return Ok;
+}
+
+/* on success, rgn will contain the region of the graphics object which
+ * is visible after clipping has been applied */
+static GpStatus get_visible_clip_region(GpGraphics *graphics, GpRegion *rgn)
+{
+ GpStatus stat;
+ GpRectF rectf;
+ GpRegion* tmp;
+
+ if((stat = get_graphics_bounds(graphics, &rectf)) != Ok)
+ return stat;
+
+ if((stat = GdipCreateRegion(&tmp)) != Ok)
+ return stat;
+
+ if((stat = GdipCombineRegionRect(tmp, &rectf, CombineModeReplace)) != Ok)
+ goto end;
+
+ if((stat = GdipCombineRegionRegion(tmp, graphics->clip, CombineModeIntersect)) != Ok)
+ goto end;
+
+ stat = GdipCombineRegionRegion(rgn, tmp, CombineModeReplace);
+
+end:
+ GdipDeleteRegion(tmp);
+ return stat;
+}
+
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
{
TRACE("(%p, %p)\n", hdc, graphics);
@@ -955,7 +1103,7 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra
TRACE("(%p, %p, %p)\n", hdc, hDevice, graphics);
if(hDevice != NULL) {
- FIXME("Don't know how to hadle parameter hDevice\n");
+ FIXME("Don't know how to handle parameter hDevice\n");
return NotImplemented;
}
@@ -991,6 +1139,8 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra
(*graphics)->scale = 1.0;
(*graphics)->busy = FALSE;
(*graphics)->textcontrast = 4;
+ list_init(&(*graphics)->containers);
+ (*graphics)->contid = 0;
return Ok;
}
@@ -1155,6 +1305,7 @@ GpStatus WINGDIPAPI GdipCreateStreamOnFile(GDIPCONST WCHAR * filename,
GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
{
+ GraphicsContainerItem *cont, *next;
TRACE("(%p)\n", graphics);
if(!graphics) return InvalidParameter;
@@ -1163,6 +1314,11 @@ GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
if(graphics->owndc)
ReleaseDC(graphics->hwnd, graphics->hdc);
+ LIST_FOR_EACH_ENTRY_SAFE(cont, next, &graphics->containers, GraphicsContainerItem, entry){
+ list_remove(&cont->entry);
+ delete_container(cont);
+ }
+
GdipDeleteRegion(graphics->clip);
GdipDeleteMatrix(graphics->worldtrans);
GdipFree(graphics);
@@ -1423,7 +1579,7 @@ GpStatus WINGDIPAPI GdipDrawCurveI(GpGraphics *graphics, GpPen *pen,
TRACE("(%p, %p, %p, %d)\n", graphics, pen, points, count);
- if(!points || count <= 0)
+ if(!points)
return InvalidParameter;
pointsF = GdipAlloc(sizeof(GpPointF)*count);
@@ -1459,7 +1615,13 @@ GpStatus WINGDIPAPI GdipDrawCurve2(GpGraphics *graphics, GpPen *pen,
if(graphics->busy)
return ObjectBusy;
+ if(count < 2)
+ return InvalidParameter;
+
pt = GdipAlloc(len_pt * sizeof(GpPointF));
+ if(!pt)
+ return OutOfMemory;
+
tension = tension * TENSION_CONST;
calc_curve_bezier_endp(points[0].X, points[0].Y, points[1].X, points[1].Y,
@@ -1508,7 +1670,7 @@ GpStatus WINGDIPAPI GdipDrawCurve2I(GpGraphics *graphics, GpPen *pen,
TRACE("(%p, %p, %p, %d, %.2f)\n", graphics, pen, points, count, tension);
- if(!points || count <= 0)
+ if(!points)
return InvalidParameter;
pointsF = GdipAlloc(sizeof(GpPointF)*count);
@@ -1526,6 +1688,36 @@ GpStatus WINGDIPAPI GdipDrawCurve2I(GpGraphics *graphics, GpPen *pen,
return ret;
}
+GpStatus WINGDIPAPI GdipDrawCurve3(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPointF *points, INT count, INT offset, INT numberOfSegments,
+ REAL tension)
+{
+ TRACE("(%p, %p, %p, %d, %d, %d, %.2f)\n", graphics, pen, points, count, offset, numberOfSegments, tension);
+
+ if(offset >= count || numberOfSegments > count - offset - 1 || numberOfSegments <= 0){
+ return InvalidParameter;
+ }
+
+ return GdipDrawCurve2(graphics, pen, points + offset, numberOfSegments + 1, tension);
+}
+
+GpStatus WINGDIPAPI GdipDrawCurve3I(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPoint *points, INT count, INT offset, INT numberOfSegments,
+ REAL tension)
+{
+ TRACE("(%p, %p, %p, %d, %d, %d, %.2f)\n", graphics, pen, points, count, offset, numberOfSegments, tension);
+
+ if(count < 0){
+ return OutOfMemory;
+ }
+
+ if(offset >= count || numberOfSegments > count - offset - 1 || numberOfSegments <= 0){
+ return InvalidParameter;
+ }
+
+ return GdipDrawCurve2I(graphics, pen, points + offset, numberOfSegments + 1, tension);
+}
+
GpStatus WINGDIPAPI GdipDrawEllipse(GpGraphics *graphics, GpPen *pen, REAL x,
REAL y, REAL width, REAL height)
{
@@ -1569,39 +1761,34 @@ GpStatus WINGDIPAPI GdipDrawEllipseI(GpGraphics *graphics, GpPen *pen, INT x,
GpStatus WINGDIPAPI GdipDrawImage(GpGraphics *graphics, GpImage *image, REAL x, REAL y)
{
+ UINT width, height;
+ GpPointF points[3];
+
TRACE("(%p, %p, %.2f, %.2f)\n", graphics, image, x, y);
- /* IPicture::Render uses LONG coords */
- return GdipDrawImageI(graphics,image,roundr(x),roundr(y));
-}
-
-GpStatus WINGDIPAPI GdipDrawImageI(GpGraphics *graphics, GpImage *image, INT x,
- INT y)
-{
- UINT width, height, srcw, srch;
-
- TRACE("(%p, %p, %d, %d)\n", graphics, image, x, y);
-
if(!graphics || !image)
return InvalidParameter;
GdipGetImageWidth(image, &width);
GdipGetImageHeight(image, &height);
- srcw = width * (((REAL) INCH_HIMETRIC) /
- ((REAL) GetDeviceCaps(graphics->hdc, LOGPIXELSX)));
- srch = height * (((REAL) INCH_HIMETRIC) /
- ((REAL) GetDeviceCaps(graphics->hdc, LOGPIXELSY)));
+ /* FIXME: we should use the graphics and image dpi, somehow */
- if(image->type != ImageTypeMetafile){
- y += height;
- height *= -1;
- }
+ points[0].X = points[2].X = x;
+ points[0].Y = points[1].Y = y;
+ points[1].X = x + width;
+ points[2].Y = y + height;
- IPicture_Render(image->picture, graphics->hdc, x, y, width, height,
- 0, 0, srcw, srch, NULL);
+ return GdipDrawImagePointsRect(graphics, image, points, 3, 0, 0, width, height,
+ UnitPixel, NULL, NULL, NULL);
+}
- return Ok;
+GpStatus WINGDIPAPI GdipDrawImageI(GpGraphics *graphics, GpImage *image, INT x,
+ INT y)
+{
+ TRACE("(%p, %p, %d, %d)\n", graphics, image, x, y);
+
+ return GdipDrawImage(graphics, image, (REAL)x, (REAL)y);
}
GpStatus WINGDIPAPI GdipDrawImagePointRect(GpGraphics *graphics, GpImage *image,
@@ -1651,37 +1838,127 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
if(!graphics || !image || !points || count != 3)
return InvalidParameter;
- if(srcUnit == UnitInch)
- dx = dy = (REAL) INCH_HIMETRIC;
- else if(srcUnit == UnitPixel){
- dx = ((REAL) INCH_HIMETRIC) /
- ((REAL) GetDeviceCaps(graphics->hdc, LOGPIXELSX));
- dy = ((REAL) INCH_HIMETRIC) /
- ((REAL) GetDeviceCaps(graphics->hdc, LOGPIXELSY));
- }
- else
- return NotImplemented;
-
memcpy(ptf, points, 3 * sizeof(GpPointF));
transform_and_round_points(graphics, pti, ptf, 3);
- /* IPicture renders bitmaps with the y-axis reversed
- * FIXME: flipping for unknown image type might not be correct. */
- if(image->type != ImageTypeMetafile){
- INT temp;
- temp = pti[0].y;
- pti[0].y = pti[2].y;
- pti[2].y = temp;
- }
+ if (image->picture)
+ {
+ if(srcUnit == UnitInch)
+ dx = dy = (REAL) INCH_HIMETRIC;
+ else if(srcUnit == UnitPixel){
+ dx = ((REAL) INCH_HIMETRIC) /
+ ((REAL) GetDeviceCaps(graphics->hdc, LOGPIXELSX));
+ dy = ((REAL) INCH_HIMETRIC) /
+ ((REAL) GetDeviceCaps(graphics->hdc, LOGPIXELSY));
+ }
+ else
+ return NotImplemented;
- if(IPicture_Render(image->picture, graphics->hdc,
- pti[0].x, pti[0].y, pti[1].x - pti[0].x, pti[2].y - pti[0].y,
- srcx * dx, srcy * dy,
- srcwidth * dx, srcheight * dy,
- NULL) != S_OK){
- if(callback)
- callback(callbackData);
- return GenericError;
+ /* IPicture renders bitmaps with the y-axis reversed
+ * FIXME: flipping for unknown image type might not be correct. */
+ if(image->type != ImageTypeMetafile){
+ INT temp;
+ temp = pti[0].y;
+ pti[0].y = pti[2].y;
+ pti[2].y = temp;
+ }
+
+ if(IPicture_Render(image->picture, graphics->hdc,
+ pti[0].x, pti[0].y, pti[1].x - pti[0].x, pti[2].y - pti[0].y,
+ srcx * dx, srcy * dy,
+ srcwidth * dx, srcheight * dy,
+ NULL) != S_OK){
+ if(callback)
+ callback(callbackData);
+ return GenericError;
+ }
+ }
+ else if (image->type == ImageTypeBitmap && ((GpBitmap*)image)->hbitmap)
+ {
+ HDC hdc;
+ GpBitmap* bitmap = (GpBitmap*)image;
+ int temp_hdc=0, temp_bitmap=0;
+ HBITMAP hbitmap, old_hbm=NULL;
+
+ if (srcUnit == UnitInch)
+ dx = dy = 96.0; /* FIXME: use the image resolution */
+ else if (srcUnit == UnitPixel)
+ dx = dy = 1.0;
+ else
+ return NotImplemented;
+
+ if (bitmap->format == PixelFormat32bppARGB)
+ {
+ BITMAPINFOHEADER bih;
+ BYTE *temp_bits;
+
+ /* we need a bitmap with premultiplied alpha */
+ hdc = CreateCompatibleDC(0);
+ temp_hdc = 1;
+ temp_bitmap = 1;
+
+ bih.biSize = sizeof(BITMAPINFOHEADER);
+ bih.biWidth = bitmap->width;
+ bih.biHeight = -bitmap->height;
+ bih.biPlanes = 1;
+ bih.biBitCount = 32;
+ bih.biCompression = BI_RGB;
+ bih.biSizeImage = 0;
+ bih.biXPelsPerMeter = 0;
+ bih.biYPelsPerMeter = 0;
+ bih.biClrUsed = 0;
+ bih.biClrImportant = 0;
+
+ hbitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_RGB_COLORS,
+ (void**)&temp_bits, NULL, 0);
+
+ convert_32bppARGB_to_32bppPARGB(bitmap->width, bitmap->height,
+ temp_bits, bitmap->width*4, bitmap->bits, bitmap->stride);
+ }
+ else
+ {
+ hbitmap = bitmap->hbitmap;
+ hdc = bitmap->hdc;
+ temp_hdc = (hdc == 0);
+ }
+
+ if (temp_hdc)
+ {
+ if (!hdc) hdc = CreateCompatibleDC(0);
+ old_hbm = SelectObject(hdc, hbitmap);
+ }
+
+ if (bitmap->format == PixelFormat32bppARGB || bitmap->format == PixelFormat32bppPARGB)
+ {
+ BLENDFUNCTION bf;
+
+ bf.BlendOp = AC_SRC_OVER;
+ bf.BlendFlags = 0;
+ bf.SourceConstantAlpha = 255;
+ bf.AlphaFormat = AC_SRC_ALPHA;
+
+ GdiAlphaBlend(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y,
+ hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, bf);
+ }
+ else
+ {
+ StretchBlt(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y,
+ hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, SRCCOPY);
+ }
+
+ if (temp_hdc)
+ {
+ SelectObject(hdc, old_hbm);
+ DeleteDC(hdc);
+ }
+
+ if (temp_bitmap)
+ DeleteObject(hbitmap);
+ }
+ else
+ {
+ ERR("GpImage with no IPicture or HBITMAP?!\n");
+ return NotImplemented;
}
return Ok;
@@ -2090,8 +2367,10 @@ GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string
WCHAR* stringdup;
REAL angle, ang_cos, ang_sin, rel_width, rel_height;
INT sum = 0, height = 0, offsety = 0, fit, fitcpy, save_state, i, j, lret, nwidth,
- nheight;
+ nheight, lineend;
SIZE size;
+ POINT drawbase;
+ UINT drawflags;
RECT drawcoord;
TRACE("(%p, %s, %i, %p, %s, %p, %p)\n", graphics, debugstr_wn(string, length),
@@ -2183,10 +2462,10 @@ GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string
pt[1].X = 1.0;
pt[1].Y = 0.0;
GdipTransformMatrixPoints(graphics->worldtrans, pt, 2);
- angle = gdiplus_atan2((pt[1].Y - pt[0].Y), (pt[1].X - pt[0].X));
+ angle = -gdiplus_atan2((pt[1].Y - pt[0].Y), (pt[1].X - pt[0].X));
ang_cos = cos(angle);
ang_sin = sin(angle);
- lfw.lfEscapement = lfw.lfOrientation = -roundr((angle / M_PI) * 1800.0);
+ lfw.lfEscapement = lfw.lfOrientation = roundr((angle / M_PI) * 1800.0);
gdifont = CreateFontIndirectW(&lfw);
DeleteObject(SelectObject(graphics->hdc, CreateFontIndirectW(&lfw)));
@@ -2201,17 +2480,35 @@ GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string
length = j;
+ if (!format || format->align == StringAlignmentNear)
+ {
+ drawbase.x = corners[0].x;
+ drawbase.y = corners[0].y;
+ drawflags = DT_NOCLIP | DT_EXPANDTABS;
+ }
+ else if (format->align == StringAlignmentCenter)
+ {
+ drawbase.x = (corners[0].x + corners[1].x)/2;
+ drawbase.y = (corners[0].y + corners[1].y)/2;
+ drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_CENTER;
+ }
+ else /* (format->align == StringAlignmentFar) */
+ {
+ drawbase.x = corners[1].x;
+ drawbase.y = corners[1].y;
+ drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_RIGHT;
+ }
+
while(sum < length){
- drawcoord.left = corners[0].x + roundr(ang_sin * (REAL) height);
- drawcoord.top = corners[0].y + roundr(ang_cos * (REAL) height);
+ drawcoord.left = drawcoord.right = drawbase.x + roundr(ang_sin * (REAL) height);
+ drawcoord.top = drawcoord.bottom = drawbase.y + roundr(ang_cos * (REAL) height);
GetTextExtentExPointW(graphics->hdc, stringdup + sum, length - sum,
nwidth, &fit, NULL, &size);
fitcpy = fit;
if(fit == 0){
- DrawTextW(graphics->hdc, stringdup + sum, 1, &drawcoord, DT_NOCLIP |
- DT_EXPANDTABS);
+ DrawTextW(graphics->hdc, stringdup + sum, 1, &drawcoord, drawflags);
break;
}
@@ -2221,7 +2518,7 @@ GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string
/* Line break code (may look strange, but it imitates windows). */
if(lret < fit)
- fit = lret; /* this is not an off-by-one error */
+ lineend = fit = lret; /* this is not an off-by-one error */
else if(fit < (length - sum)){
if(*(stringdup + sum + fit) == ' ')
while(*(stringdup + sum + fit) == ' ')
@@ -2238,9 +2535,15 @@ GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string
break;
}
}
+ lineend = fit;
+ while(*(stringdup + sum + lineend - 1) == ' ' ||
+ *(stringdup + sum + lineend - 1) == '\t')
+ lineend--;
}
- DrawTextW(graphics->hdc, stringdup + sum, min(length - sum, fit),
- &drawcoord, DT_NOCLIP | DT_EXPANDTABS);
+ else
+ lineend = fit;
+ DrawTextW(graphics->hdc, stringdup + sum, min(length - sum, lineend),
+ &drawcoord, drawflags);
sum += fit + (lret < fitcpy ? 1 : 0);
height += size.cy;
@@ -2349,12 +2652,14 @@ GpStatus WINGDIPAPI GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x
save_state = SaveDC(graphics->hdc);
EndPath(graphics->hdc);
- SelectObject(graphics->hdc, brush->gdibrush);
- SelectObject(graphics->hdc, GetStockObject(NULL_PEN));
transform_and_round_points(graphics, pti, ptf, 2);
+ BeginPath(graphics->hdc);
Ellipse(graphics->hdc, pti[0].x, pti[0].y, pti[1].x, pti[1].y);
+ EndPath(graphics->hdc);
+
+ brush_fill_path(graphics, brush);
RestoreDC(graphics->hdc, save_state);
@@ -2421,10 +2726,12 @@ GpStatus WINGDIPAPI GdipFillPie(GpGraphics *graphics, GpBrush *brush, REAL x,
save_state = SaveDC(graphics->hdc);
EndPath(graphics->hdc);
- SelectObject(graphics->hdc, brush->gdibrush);
- SelectObject(graphics->hdc, GetStockObject(NULL_PEN));
+ BeginPath(graphics->hdc);
draw_pie(graphics, x, y, width, height, startAngle, sweepAngle);
+ EndPath(graphics->hdc);
+
+ brush_fill_path(graphics, brush);
RestoreDC(graphics->hdc, save_state);
@@ -2467,13 +2774,16 @@ GpStatus WINGDIPAPI GdipFillPolygon(GpGraphics *graphics, GpBrush *brush,
save_state = SaveDC(graphics->hdc);
EndPath(graphics->hdc);
- SelectObject(graphics->hdc, brush->gdibrush);
- SelectObject(graphics->hdc, GetStockObject(NULL_PEN));
SetPolyFillMode(graphics->hdc, (fillMode == FillModeAlternate ? ALTERNATE
: WINDING));
transform_and_round_points(graphics, pti, ptf, count);
+
+ BeginPath(graphics->hdc);
Polygon(graphics->hdc, pti, count);
+ EndPath(graphics->hdc);
+
+ brush_fill_path(graphics, brush);
RestoreDC(graphics->hdc, save_state);
@@ -2514,13 +2824,16 @@ GpStatus WINGDIPAPI GdipFillPolygonI(GpGraphics *graphics, GpBrush *brush,
save_state = SaveDC(graphics->hdc);
EndPath(graphics->hdc);
- SelectObject(graphics->hdc, brush->gdibrush);
- SelectObject(graphics->hdc, GetStockObject(NULL_PEN));
SetPolyFillMode(graphics->hdc, (fillMode == FillModeAlternate ? ALTERNATE
: WINDING));
transform_and_round_points(graphics, pti, ptf, count);
+
+ BeginPath(graphics->hdc);
Polygon(graphics->hdc, pti, count);
+ EndPath(graphics->hdc);
+
+ brush_fill_path(graphics, brush);
RestoreDC(graphics->hdc, save_state);
@@ -2613,12 +2926,14 @@ GpStatus WINGDIPAPI GdipFillRectangleI(GpGraphics *graphics, GpBrush *brush,
save_state = SaveDC(graphics->hdc);
EndPath(graphics->hdc);
- SelectObject(graphics->hdc, brush->gdibrush);
- SelectObject(graphics->hdc, GetStockObject(NULL_PEN));
transform_and_round_points(graphics, pti, ptf, 4);
+ BeginPath(graphics->hdc);
Polygon(graphics->hdc, pti, 4);
+ EndPath(graphics->hdc);
+
+ brush_fill_path(graphics, brush);
RestoreDC(graphics->hdc, save_state);
@@ -2682,6 +2997,7 @@ GpStatus WINGDIPAPI GdipFillRegion(GpGraphics* graphics, GpBrush* brush,
INT save_state;
GpStatus status;
HRGN hrgn;
+ RECT rc;
TRACE("(%p, %p, %p)\n", graphics, brush, region);
@@ -2697,9 +3013,17 @@ GpStatus WINGDIPAPI GdipFillRegion(GpGraphics* graphics, GpBrush* brush,
save_state = SaveDC(graphics->hdc);
EndPath(graphics->hdc);
- SelectObject(graphics->hdc, GetStockObject(NULL_PEN));
- FillRgn(graphics->hdc, hrgn, brush->gdibrush);
+ ExtSelectClipRgn(graphics->hdc, hrgn, RGN_AND);
+
+ if (GetClipBox(graphics->hdc, &rc) != NULLREGION)
+ {
+ BeginPath(graphics->hdc);
+ Rectangle(graphics->hdc, rc.left, rc.top, rc.right, rc.bottom);
+ EndPath(graphics->hdc);
+
+ brush_fill_path(graphics, brush);
+ }
RestoreDC(graphics->hdc, save_state);
@@ -2912,6 +3236,56 @@ GpStatus WINGDIPAPI GdipGetTextRenderingHint(GpGraphics *graphics,
return Ok;
}
+GpStatus WINGDIPAPI GdipGetVisibleClipBounds(GpGraphics *graphics, GpRectF *rect)
+{
+ GpRegion *clip_rgn;
+ GpStatus stat;
+
+ TRACE("(%p, %p)\n", graphics, rect);
+
+ if(!graphics || !rect)
+ return InvalidParameter;
+
+ if(graphics->busy)
+ return ObjectBusy;
+
+ /* intersect window and graphics clipping regions */
+ if((stat = GdipCreateRegion(&clip_rgn)) != Ok)
+ return stat;
+
+ if((stat = get_visible_clip_region(graphics, clip_rgn)) != Ok)
+ goto cleanup;
+
+ /* get bounds of the region */
+ stat = GdipGetRegionBounds(clip_rgn, graphics, rect);
+
+cleanup:
+ GdipDeleteRegion(clip_rgn);
+
+ return stat;
+}
+
+GpStatus WINGDIPAPI GdipGetVisibleClipBoundsI(GpGraphics *graphics, GpRect *rect)
+{
+ GpRectF rectf;
+ GpStatus stat;
+
+ TRACE("(%p, %p)\n", graphics, rect);
+
+ if(!graphics || !rect)
+ return InvalidParameter;
+
+ if((stat = GdipGetVisibleClipBounds(graphics, &rectf)) == Ok)
+ {
+ rect->X = roundr(rectf.X);
+ rect->Y = roundr(rectf.Y);
+ rect->Width = roundr(rectf.Width);
+ rect->Height = roundr(rectf.Height);
+ }
+
+ return stat;
+}
+
GpStatus WINGDIPAPI GdipGetWorldTransform(GpGraphics *graphics, GpMatrix *matrix)
{
TRACE("(%p, %p)\n", graphics, matrix);
@@ -2930,7 +3304,7 @@ GpStatus WINGDIPAPI GdipGraphicsClear(GpGraphics *graphics, ARGB color)
{
GpSolidFill *brush;
GpStatus stat;
- RECT rect;
+ GpRectF wnd_rect;
TRACE("(%p, %x)\n", graphics, color);
@@ -2943,18 +3317,13 @@ GpStatus WINGDIPAPI GdipGraphicsClear(GpGraphics *graphics, ARGB color)
if((stat = GdipCreateSolidFill(color, &brush)) != Ok)
return stat;
- if(graphics->hwnd){
- if(!GetWindowRect(graphics->hwnd, &rect)){
- GdipDeleteBrush((GpBrush*)brush);
- return GenericError;
- }
-
- GdipFillRectangle(graphics, (GpBrush*)brush, 0.0, 0.0, (REAL)(rect.right - rect.left),
- (REAL)(rect.bottom - rect.top));
+ if((stat = get_graphics_bounds(graphics, &wnd_rect)) != Ok){
+ GdipDeleteBrush((GpBrush*)brush);
+ return stat;
}
- else
- GdipFillRectangle(graphics, (GpBrush*)brush, 0.0, 0.0, (REAL)GetDeviceCaps(graphics->hdc, HORZRES),
- (REAL)GetDeviceCaps(graphics->hdc, VERTRES));
+
+ GdipFillRectangle(graphics, (GpBrush*)brush, wnd_rect.X, wnd_rect.Y,
+ wnd_rect.Width, wnd_rect.Height);
GdipDeleteBrush((GpBrush*)brush);
@@ -2973,7 +3342,11 @@ GpStatus WINGDIPAPI GdipIsClipEmpty(GpGraphics *graphics, BOOL *res)
GpStatus WINGDIPAPI GdipIsVisiblePoint(GpGraphics *graphics, REAL x, REAL y, BOOL *result)
{
- FIXME("(%p, %.2f, %.2f, %p) stub\n", graphics, x, y, result);
+ GpStatus stat;
+ GpRegion* rgn;
+ GpPointF pt;
+
+ TRACE("(%p, %.2f, %.2f, %p)\n", graphics, x, y, result);
if(!graphics || !result)
return InvalidParameter;
@@ -2981,12 +3354,37 @@ GpStatus WINGDIPAPI GdipIsVisiblePoint(GpGraphics *graphics, REAL x, REAL y, BOO
if(graphics->busy)
return ObjectBusy;
- return NotImplemented;
+ pt.X = x;
+ pt.Y = y;
+ if((stat = GdipTransformPoints(graphics, CoordinateSpaceDevice,
+ CoordinateSpaceWorld, &pt, 1)) != Ok)
+ return stat;
+
+ if((stat = GdipCreateRegion(&rgn)) != Ok)
+ return stat;
+
+ if((stat = get_visible_clip_region(graphics, rgn)) != Ok)
+ goto cleanup;
+
+ stat = GdipIsVisibleRegionPoint(rgn, pt.X, pt.Y, graphics, result);
+
+cleanup:
+ GdipDeleteRegion(rgn);
+ return stat;
}
GpStatus WINGDIPAPI GdipIsVisiblePointI(GpGraphics *graphics, INT x, INT y, BOOL *result)
{
- FIXME("(%p, %d, %d, %p) stub\n", graphics, x, y, result);
+ return GdipIsVisiblePoint(graphics, (REAL)x, (REAL)y, result);
+}
+
+GpStatus WINGDIPAPI GdipIsVisibleRect(GpGraphics *graphics, REAL x, REAL y, REAL width, REAL height, BOOL *result)
+{
+ GpStatus stat;
+ GpRegion* rgn;
+ GpPointF pts[2];
+
+ TRACE("(%p %.2f %.2f %.2f %.2f %p)\n", graphics, x, y, width, height, result);
if(!graphics || !result)
return InvalidParameter;
@@ -2994,7 +3392,34 @@ GpStatus WINGDIPAPI GdipIsVisiblePointI(GpGraphics *graphics, INT x, INT y, BOOL
if(graphics->busy)
return ObjectBusy;
- return NotImplemented;
+ pts[0].X = x;
+ pts[0].Y = y;
+ pts[1].X = x + width;
+ pts[1].Y = y + height;
+
+ if((stat = GdipTransformPoints(graphics, CoordinateSpaceDevice,
+ CoordinateSpaceWorld, pts, 2)) != Ok)
+ return stat;
+
+ pts[1].X -= pts[0].X;
+ pts[1].Y -= pts[0].Y;
+
+ if((stat = GdipCreateRegion(&rgn)) != Ok)
+ return stat;
+
+ if((stat = get_visible_clip_region(graphics, rgn)) != Ok)
+ goto cleanup;
+
+ stat = GdipIsVisibleRegionRect(rgn, pts[0].X, pts[0].Y, pts[1].X, pts[1].Y, graphics, result);
+
+cleanup:
+ GdipDeleteRegion(rgn);
+ return stat;
+}
+
+GpStatus WINGDIPAPI GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y, INT width, INT height, BOOL *result)
+{
+ return GdipIsVisibleRect(graphics, (REAL)x, (REAL)y, (REAL)width, (REAL)height, result);
}
GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics,
@@ -3023,7 +3448,7 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
HFONT oldfont;
WCHAR* stringdup;
INT sum = 0, height = 0, fit, fitcpy, max_width = 0, i, j, lret, nwidth,
- nheight;
+ nheight, lineend;
SIZE size;
TRACE("(%p, %s, %i, %p, %s, %p, %p, %p, %p)\n", graphics,
@@ -3076,7 +3501,7 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
/* Line break code (may look strange, but it imitates windows). */
if(lret < fit)
- fit = lret; /* this is not an off-by-one error */
+ lineend = fit = lret; /* this is not an off-by-one error */
else if(fit < (length - sum)){
if(*(stringdup + sum + fit) == ' ')
while(*(stringdup + sum + fit) == ' ')
@@ -3093,9 +3518,15 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
break;
}
}
+ lineend = fit;
+ while(*(stringdup + sum + lineend - 1) == ' ' ||
+ *(stringdup + sum + lineend - 1) == '\t')
+ lineend--;
}
+ else
+ lineend = fit;
- GetTextExtentExPointW(graphics->hdc, stringdup + sum, fit,
+ GetTextExtentExPointW(graphics->hdc, stringdup + sum, lineend,
nwidth, &j, NULL, &size);
sum += fit + (lret < fitcpy ? 1 : 0);
@@ -3159,15 +3590,7 @@ GpStatus WINGDIPAPI GdipResetWorldTransform(GpGraphics *graphics)
GpStatus WINGDIPAPI GdipRestoreGraphics(GpGraphics *graphics, GraphicsState state)
{
- static int calls;
-
- if(!graphics)
- return InvalidParameter;
-
- if(!(calls++))
- FIXME("graphics state not implemented\n");
-
- return Ok;
+ return GdipEndContainer(graphics, state);
}
GpStatus WINGDIPAPI GdipRotateWorldTransform(GpGraphics *graphics, REAL angle,
@@ -3186,26 +3609,27 @@ GpStatus WINGDIPAPI GdipRotateWorldTransform(GpGraphics *graphics, REAL angle,
GpStatus WINGDIPAPI GdipSaveGraphics(GpGraphics *graphics, GraphicsState *state)
{
- static int calls;
-
- if(!graphics || !state)
- return InvalidParameter;
-
- if(!(calls++))
- FIXME("graphics state not implemented\n");
-
- *state = 0xdeadbeef;
- return Ok;
+ return GdipBeginContainer2(graphics, state);
}
-GpStatus WINGDIPAPI GdipBeginContainer2(GpGraphics *graphics, GraphicsContainer *state)
+GpStatus WINGDIPAPI GdipBeginContainer2(GpGraphics *graphics,
+ GraphicsContainer *state)
{
- FIXME("(%p, %p)\n", graphics, state);
+ GraphicsContainerItem *container;
+ GpStatus sts;
+
+ TRACE("(%p, %p)\n", graphics, state);
if(!graphics || !state)
return InvalidParameter;
- *state = 0xdeadbeef;
+ sts = init_container(&container, graphics);
+ if(sts != Ok)
+ return sts;
+
+ list_add_head(&graphics->containers, &container->entry);
+ *state = graphics->contid = container->contid;
+
return Ok;
}
@@ -3227,13 +3651,40 @@ GpStatus WINGDIPAPI GdipComment(GpGraphics *graphics, UINT sizeData, GDIPCONST B
return NotImplemented;
}
-GpStatus WINGDIPAPI GdipEndContainer(GpGraphics *graphics, GraphicsState state)
+GpStatus WINGDIPAPI GdipEndContainer(GpGraphics *graphics, GraphicsContainer state)
{
- FIXME("(%p, 0x%x)\n", graphics, state);
+ GpStatus sts;
+ GraphicsContainerItem *container, *container2;
- if(!graphics || !state)
+ TRACE("(%p, %x)\n", graphics, state);
+
+ if(!graphics)
return InvalidParameter;
+ LIST_FOR_EACH_ENTRY(container, &graphics->containers, GraphicsContainerItem, entry){
+ if(container->contid == state)
+ break;
+ }
+
+ /* did not find a matching container */
+ if(&container->entry == &graphics->containers)
+ return Ok;
+
+ sts = restore_container(graphics, container);
+ if(sts != Ok)
+ return sts;
+
+ /* remove all of the containers on top of the found container */
+ LIST_FOR_EACH_ENTRY_SAFE(container, container2, &graphics->containers, GraphicsContainerItem, entry){
+ if(container->contid == state)
+ break;
+ list_remove(&container->entry);
+ delete_container(container);
+ }
+
+ list_remove(&container->entry);
+ delete_container(container);
+
return Ok;
}
@@ -3839,3 +4290,37 @@ GpStatus WINGDIPAPI GdipTranslateClipI(GpGraphics *graphics, INT dx, INT dy)
return GdipTranslateRegion(graphics->clip, (REAL)dx, (REAL)dy);
}
+
+
+/*****************************************************************************
+ * GdipMeasureDriverString [GDIPLUS.@]
+ */
+GpStatus WINGDIPAPI GdipMeasureDriverString(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length,
+ GDIPCONST GpFont *font, GDIPCONST PointF *positions,
+ INT flags, GDIPCONST GpMatrix *matrix, RectF *boundingBox)
+{
+ FIXME("(%p %p %d %p %p %d %p %p): stub\n", graphics, text, length, font, positions, flags, matrix, boundingBox);
+ return NotImplemented;
+}
+
+/*****************************************************************************
+ * GdipDrawDriverString [GDIPLUS.@]
+ */
+GpStatus WINGDIPAPI GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length,
+ GDIPCONST GpFont *font, GDIPCONST GpBrush *brush,
+ GDIPCONST PointF *positions, INT flags,
+ GDIPCONST GpMatrix *matrix )
+{
+ FIXME("(%p %p %d %p %p %p %d %p): stub\n", graphics, text, length, font, brush, positions, flags, matrix);
+ return NotImplemented;
+}
+
+/*****************************************************************************
+ * GdipRecordMetafileI [GDIPLUS.@]
+ */
+GpStatus WINGDIPAPI GdipRecordMetafileI(HDC hdc, EmfType type, GDIPCONST GpRect *frameRect,
+ MetafileFrameUnit frameUnit, GDIPCONST WCHAR *desc, GpMetafile **metafile)
+{
+ FIXME("(%p %d %p %d %p %p): stub\n", hdc, type, frameRect, frameUnit, desc, metafile);
+ return NotImplemented;
+}
diff --git a/reactos/dll/win32/gdiplus/graphicspath.c b/reactos/dll/win32/gdiplus/graphicspath.c
index 1375cc3ad51..94e17dda39c 100644
--- a/reactos/dll/win32/gdiplus/graphicspath.c
+++ b/reactos/dll/win32/gdiplus/graphicspath.c
@@ -775,7 +775,7 @@ GpStatus WINGDIPAPI GdipAddPathPieI(GpPath *path, INT x, INT y, INT width, INT h
TRACE("(%p, %d, %d, %d, %d, %.2f, %.2f)\n",
path, x, y, width, height, startAngle, sweepAngle);
- return GdipAddPathPieI(path, (REAL)x, (REAL)y, (REAL)width, (REAL)height, startAngle, sweepAngle);
+ return GdipAddPathPie(path, (REAL)x, (REAL)y, (REAL)width, (REAL)height, startAngle, sweepAngle);
}
GpStatus WINGDIPAPI GdipAddPathPolygon(GpPath *path, GDIPCONST GpPointF *points, INT count)
diff --git a/reactos/dll/win32/gdiplus/image.c b/reactos/dll/win32/gdiplus/image.c
index 6df104ec54f..b1e831fdf99 100644
--- a/reactos/dll/win32/gdiplus/image.c
+++ b/reactos/dll/win32/gdiplus/image.c
@@ -31,6 +31,7 @@
#include "ole2.h"
#include "initguid.h"
+#include "wincodec.h"
#include "gdiplus.h"
#include "gdiplus_private.h"
#include "wine/debug.h"
@@ -167,8 +168,25 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
if(bitmap->lockmode)
return WrongState;
- IPicture_get_Handle(bitmap->image.picture, (OLE_HANDLE*)&hbm);
- IPicture_get_CurDC(bitmap->image.picture, &hdc);
+ if (bitmap->bits && bitmap->format == format)
+ {
+ /* no conversion is necessary; just use the bits directly */
+ lockeddata->Width = act_rect.Width;
+ lockeddata->Height = act_rect.Height;
+ lockeddata->PixelFormat = format;
+ lockeddata->Reserved = flags;
+ lockeddata->Stride = bitmap->stride;
+ lockeddata->Scan0 = bitmap->bits + (bitspp / 8) * act_rect.X +
+ bitmap->stride * act_rect.Y;
+
+ bitmap->lockmode = flags;
+ bitmap->numlocks++;
+
+ return Ok;
+ }
+
+ hbm = bitmap->hbitmap;
+ hdc = bitmap->hdc;
bm_is_selected = (hdc != 0);
pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
@@ -263,8 +281,15 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
return Ok;
}
- IPicture_get_Handle(bitmap->image.picture, (OLE_HANDLE*)&hbm);
- IPicture_get_CurDC(bitmap->image.picture, &hdc);
+ if (!bitmap->bitmapbits)
+ {
+ /* we passed a direct reference; no need to do anything */
+ bitmap->lockmode = 0;
+ return Ok;
+ }
+
+ hbm = bitmap->hbitmap;
+ hdc = bitmap->hdc;
bm_is_selected = (hdc != 0);
pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
@@ -312,10 +337,6 @@ GpStatus WINGDIPAPI GdipCloneBitmapAreaI(INT x, INT y, INT width, INT height,
GpStatus WINGDIPAPI GdipCloneImage(GpImage *image, GpImage **cloneImage)
{
- IStream* stream;
- HRESULT hr;
- INT size;
- LARGE_INTEGER move;
GpStatus stat = GenericError;
TRACE("%p, %p\n", image, cloneImage);
@@ -323,29 +344,82 @@ GpStatus WINGDIPAPI GdipCloneImage(GpImage *image, GpImage **cloneImage)
if (!image || !cloneImage)
return InvalidParameter;
- hr = CreateStreamOnHGlobal(0, TRUE, &stream);
- if (FAILED(hr))
- return GenericError;
-
- hr = IPicture_SaveAsFile(image->picture, stream, FALSE, &size);
- if(FAILED(hr))
+ if (image->picture)
{
- WARN("Failed to save image on stream\n");
- goto out;
+ IStream* stream;
+ HRESULT hr;
+ INT size;
+ LARGE_INTEGER move;
+
+ hr = CreateStreamOnHGlobal(0, TRUE, &stream);
+ if (FAILED(hr))
+ return GenericError;
+
+ hr = IPicture_SaveAsFile(image->picture, stream, FALSE, &size);
+ if(FAILED(hr))
+ {
+ WARN("Failed to save image on stream\n");
+ goto out;
+ }
+
+ /* Set seek pointer back to the beginning of the picture */
+ move.QuadPart = 0;
+ hr = IStream_Seek(stream, move, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr))
+ goto out;
+
+ stat = GdipLoadImageFromStream(stream, cloneImage);
+ if (stat != Ok) WARN("Failed to load image from stream\n");
+
+ out:
+ IStream_Release(stream);
+ return stat;
}
+ else if (image->type == ImageTypeBitmap)
+ {
+ GpBitmap *bitmap = (GpBitmap*)image;
+ BitmapData lockeddata_src, lockeddata_dst;
+ int i;
+ UINT row_size;
- /* Set seek pointer back to the beginning of the picture */
- move.QuadPart = 0;
- hr = IStream_Seek(stream, move, STREAM_SEEK_SET, NULL);
- if (FAILED(hr))
- goto out;
+ stat = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, bitmap->format,
+ &lockeddata_src);
+ if (stat != Ok) return stat;
- stat = GdipLoadImageFromStream(stream, cloneImage);
- if (stat != Ok) WARN("Failed to load image from stream\n");
+ stat = GdipCreateBitmapFromScan0(lockeddata_src.Width, lockeddata_src.Height,
+ 0, lockeddata_src.PixelFormat, NULL, (GpBitmap**)cloneImage);
+ if (stat == Ok)
+ {
+ stat = GdipBitmapLockBits((GpBitmap*)*cloneImage, NULL, ImageLockModeWrite,
+ lockeddata_src.PixelFormat, &lockeddata_dst);
-out:
- IStream_Release(stream);
- return stat;
+ if (stat == Ok)
+ {
+ /* copy the image data */
+ row_size = (lockeddata_src.Width * PIXELFORMATBPP(lockeddata_src.PixelFormat) +7)/8;
+ for (i=0; iimage.picture)) != S_OK){
- DestroyIcon(icon_copy);
- GdipFree(*bitmap);
+ /* get the size of the icon */
+ ret = GetObjectA(iinfo.hbmColor ? iinfo.hbmColor : iinfo.hbmMask, sizeof(bm), &bm);
+ if (ret == 0) {
+ DeleteObject(iinfo.hbmColor);
+ DeleteObject(iinfo.hbmMask);
return GenericError;
}
- (*bitmap)->format = PixelFormat32bppARGB;
- (*bitmap)->image.type = ImageTypeBitmap;
- (*bitmap)->image.flags = ImageFlagsNone;
- (*bitmap)->width = ipicture_pixel_width((*bitmap)->image.picture);
- (*bitmap)->height = ipicture_pixel_height((*bitmap)->image.picture);
+ width = bm.bmWidth;
+
+ if (iinfo.hbmColor)
+ height = abs(bm.bmHeight);
+ else /* combined bitmap + mask */
+ height = abs(bm.bmHeight) / 2;
+
+ bits = HeapAlloc(GetProcessHeap(), 0, 4*width*height);
+ if (!bits) {
+ DeleteObject(iinfo.hbmColor);
+ DeleteObject(iinfo.hbmMask);
+ return OutOfMemory;
+ }
+
+ stat = GdipCreateBitmapFromScan0(width, height, 0, PixelFormat32bppARGB, NULL, bitmap);
+ if (stat != Ok) {
+ DeleteObject(iinfo.hbmColor);
+ DeleteObject(iinfo.hbmMask);
+ HeapFree(GetProcessHeap(), 0, bits);
+ return stat;
+ }
+
+ rect.X = 0;
+ rect.Y = 0;
+ rect.Width = width;
+ rect.Height = height;
+
+ stat = GdipBitmapLockBits(*bitmap, &rect, ImageLockModeWrite, PixelFormat32bppARGB, &lockeddata);
+ if (stat != Ok) {
+ DeleteObject(iinfo.hbmColor);
+ DeleteObject(iinfo.hbmMask);
+ HeapFree(GetProcessHeap(), 0, bits);
+ GdipDisposeImage((GpImage*)*bitmap);
+ return stat;
+ }
+
+ bih.biSize = sizeof(bih);
+ bih.biWidth = width;
+ bih.biHeight = -height;
+ bih.biPlanes = 1;
+ bih.biBitCount = 32;
+ bih.biCompression = BI_RGB;
+ bih.biSizeImage = 0;
+ bih.biXPelsPerMeter = 0;
+ bih.biYPelsPerMeter = 0;
+ bih.biClrUsed = 0;
+ bih.biClrImportant = 0;
+
+ screendc = GetDC(0);
+ if (iinfo.hbmColor)
+ {
+ GetDIBits(screendc, iinfo.hbmColor, 0, height, bits, (BITMAPINFO*)&bih, DIB_RGB_COLORS);
+
+ if (bm.bmBitsPixel == 32)
+ {
+ has_alpha = FALSE;
+
+ /* If any pixel has a non-zero alpha, ignore hbmMask */
+ src = (DWORD*)bits;
+ for (x=0; xbfType = (((WORD)'M') << 8) + (WORD)'B';
- bmfh->bfSize = size;
- bmfh->bfOffBits = size - datalen;
-
- bmih->biSize = sizeof(BITMAPINFOHEADER);
- bmih->biWidth = width;
+ bmih.biSize = sizeof(BITMAPINFOHEADER);
+ bmih.biWidth = width;
+ bmih.biHeight = -height;
+ bmih.biPlanes = 1;
/* FIXME: use the rest of the data from format */
- bmih->biBitCount = PIXELFORMATBPP(format);
- bmih->biCompression = BI_RGB;
- bmih->biSizeImage = datalen;
+ bmih.biBitCount = PIXELFORMATBPP(format);
+ bmih.biCompression = BI_RGB;
+ bmih.biSizeImage = 0;
+ bmih.biXPelsPerMeter = 0;
+ bmih.biYPelsPerMeter = 0;
+ bmih.biClrUsed = 0;
+ bmih.biClrImportant = 0;
+ hdc = CreateCompatibleDC(NULL);
+ if (!hdc) return GenericError;
+
+ hbitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (void**)&bits,
+ NULL, 0);
+
+ DeleteDC(hdc);
+
+ if (!hbitmap) return GenericError;
+
+ /* copy bits to the dib if necessary */
+ /* FIXME: should reference the bits instead of copying them */
if (scan0)
- {
- if (stride > 0)
- {
- bmih->biHeight = -height;
- memcpy(bmih + 1, scan0, datalen);
- }
- else
- {
- bmih->biHeight = height;
- memcpy(bmih + 1, scan0 + stride * (height - 1), datalen);
- }
- }
- else
- {
- bmih->biHeight = height;
- memset(bmih + 1, 0, datalen);
- }
+ for (i=0; iimage.picture)) != S_OK){
- TRACE("Could not load picture\n");
- IStream_Release(stream);
- GdipFree(*bitmap);
- GdipFree(buff);
- *bitmap = NULL;
- return GenericError;
+ *bitmap = GdipAlloc(sizeof(GpBitmap));
+ if(!*bitmap)
+ {
+ DeleteObject(hbitmap);
+ return OutOfMemory;
}
(*bitmap)->image.type = ImageTypeBitmap;
@@ -629,6 +862,11 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
(*bitmap)->width = width;
(*bitmap)->height = height;
(*bitmap)->format = format;
+ (*bitmap)->image.picture = NULL;
+ (*bitmap)->hbitmap = hbitmap;
+ (*bitmap)->hdc = NULL;
+ (*bitmap)->bits = bits;
+ (*bitmap)->stride = dib_stride;
return Ok;
}
@@ -646,8 +884,8 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromStream(IStream* stream,
return stat;
if((*bitmap)->image.type != ImageTypeBitmap){
- IPicture_Release((*bitmap)->image.picture);
- GdipFree(bitmap);
+ GdipDisposeImage(&(*bitmap)->image);
+ *bitmap = NULL;
return GenericError; /* FIXME: what error to return? */
}
@@ -726,18 +964,18 @@ GpStatus WINGDIPAPI GdipEmfToWmfBits(HENHMETAFILE hemf, UINT cbData16,
GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
{
- HDC hdc;
-
TRACE("%p\n", image);
if(!image)
return InvalidParameter;
- IPicture_get_CurDC(image->picture, &hdc);
- DeleteDC(hdc);
- IPicture_Release(image->picture);
+ if (image->picture)
+ IPicture_Release(image->picture);
if (image->type == ImageTypeBitmap)
+ {
GdipFree(((GpBitmap*)image)->bitmapbits);
+ DeleteDC(((GpBitmap*)image)->hdc);
+ }
GdipFree(image);
return Ok;
@@ -829,11 +1067,12 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image,
return NotImplemented;
}
- IPicture_get_CurDC(image->picture, &hdc);
+ hdc = ((GpBitmap*)image)->hdc;
if(!hdc){
hdc = CreateCompatibleDC(0);
- IPicture_SelectPicture(image->picture, hdc, NULL, NULL);
+ SelectObject(hdc, ((GpBitmap*)image)->hbitmap);
+ ((GpBitmap*)image)->hdc = hdc;
}
return GdipCreateFromHDC(hdc, graphics);
@@ -1143,10 +1382,148 @@ GpStatus WINGDIPAPI GdipLoadImageFromFileICM(GDIPCONST WCHAR* filename,GpImage *
return GdipLoadImageFromFile(filename, image);
}
-GpStatus WINGDIPAPI GdipLoadImageFromStream(IStream* stream, GpImage **image)
+static const WICPixelFormatGUID *wic_pixel_formats[] = {
+ &GUID_WICPixelFormat16bppBGR555,
+ &GUID_WICPixelFormat24bppBGR,
+ &GUID_WICPixelFormat32bppBGR,
+ &GUID_WICPixelFormat32bppBGRA,
+ &GUID_WICPixelFormat32bppPBGRA,
+ NULL
+};
+
+static const PixelFormat wic_gdip_formats[] = {
+ PixelFormat16bppRGB555,
+ PixelFormat24bppRGB,
+ PixelFormat32bppRGB,
+ PixelFormat32bppARGB,
+ PixelFormat32bppPARGB,
+};
+
+static GpStatus decode_image_wic(IStream* stream, REFCLSID clsid, GpImage **image)
+{
+ GpStatus status=Ok;
+ GpBitmap *bitmap;
+ HRESULT hr;
+ IWICBitmapDecoder *decoder;
+ IWICBitmapFrameDecode *frame;
+ IWICBitmapSource *source=NULL;
+ WICPixelFormatGUID wic_format;
+ PixelFormat gdip_format=0;
+ int i;
+ UINT width, height;
+ BitmapData lockeddata;
+ WICRect wrc;
+ HRESULT initresult;
+
+ initresult = CoInitialize(NULL);
+
+ hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICBitmapDecoder, (void**)&decoder);
+ if (FAILED(hr)) goto end;
+
+ hr = IWICBitmapDecoder_Initialize(decoder, (IStream*)stream, WICDecodeMetadataCacheOnLoad);
+ if (SUCCEEDED(hr))
+ hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
+
+ if (SUCCEEDED(hr)) /* got frame */
+ {
+ hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &wic_format);
+
+ if (SUCCEEDED(hr))
+ {
+ for (i=0; wic_pixel_formats[i]; i++)
+ {
+ if (IsEqualGUID(&wic_format, wic_pixel_formats[i]))
+ {
+ source = (IWICBitmapSource*)frame;
+ IWICBitmapSource_AddRef(source);
+ gdip_format = wic_gdip_formats[i];
+ break;
+ }
+ }
+ if (!source)
+ {
+ /* unknown format; fall back on 32bppARGB */
+ hr = WICConvertBitmapSource(&GUID_WICPixelFormat32bppBGRA, (IWICBitmapSource*)frame, &source);
+ gdip_format = PixelFormat32bppARGB;
+ }
+ }
+
+ if (SUCCEEDED(hr)) /* got source */
+ {
+ hr = IWICBitmapSource_GetSize(source, &width, &height);
+
+ if (SUCCEEDED(hr))
+ status = GdipCreateBitmapFromScan0(width, height, 0, gdip_format,
+ NULL, &bitmap);
+
+ if (SUCCEEDED(hr) && status == Ok) /* created bitmap */
+ {
+ status = GdipBitmapLockBits(bitmap, NULL, ImageLockModeWrite,
+ gdip_format, &lockeddata);
+ if (status == Ok) /* locked bitmap */
+ {
+ wrc.X = 0;
+ wrc.Width = width;
+ wrc.Height = 1;
+ for (i=0; itype = ImageTypeBitmap;
-
- (*((GpBitmap**) image))->width = ipicture_pixel_width(pic);
- (*((GpBitmap**) image))->height = ipicture_pixel_height(pic);
-
- /* get the pixel format */
- IPicture_get_Handle(pic, (OLE_HANDLE*)&hbm);
- IPicture_get_CurDC(pic, &hdc);
-
- bmch = (BITMAPCOREHEADER*) (&pbmi->bmiHeader);
- bmch->bcSize = sizeof(BITMAPCOREHEADER);
-
- if(!hdc){
- HBITMAP old;
- hdc = CreateCompatibleDC(0);
- old = SelectObject(hdc, hbm);
- GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS);
- SelectObject(hdc, old);
- DeleteDC(hdc);
- }
- else
- GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS);
-
- switch(bmch->bcBitCount)
- {
- case 1:
- (*((GpBitmap**) image))->format = PixelFormat1bppIndexed;
- break;
- case 4:
- (*((GpBitmap**) image))->format = PixelFormat4bppIndexed;
- break;
- case 8:
- (*((GpBitmap**) image))->format = PixelFormat8bppIndexed;
- break;
- case 16:
- (*((GpBitmap**) image))->format = PixelFormat16bppRGB565;
- break;
- case 24:
- (*((GpBitmap**) image))->format = PixelFormat24bppRGB;
- break;
- case 32:
- (*((GpBitmap**) image))->format = PixelFormat32bppRGB;
- break;
- case 48:
- (*((GpBitmap**) image))->format = PixelFormat48bppRGB;
- break;
- default:
- FIXME("Bit depth %d is not fully supported yet\n", bmch->bcBitCount);
- (*((GpBitmap**) image))->format = (bmch->bcBitCount << 8) | PixelFormatGDI;
- break;
- }
-
+ pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
+ if (!pbmi)
+ return OutOfMemory;
+ *image = GdipAlloc(sizeof(GpBitmap));
+ if(!*image){
GdipFree(pbmi);
+ return OutOfMemory;
}
- else if(type == PICTYPE_METAFILE || type == PICTYPE_ENHMETAFILE){
- /* FIXME: missing initialization code */
- *image = GdipAlloc(sizeof(GpMetafile));
- if(!*image) return OutOfMemory;
- (*image)->type = ImageTypeMetafile;
+ (*image)->type = ImageTypeBitmap;
+
+ (*((GpBitmap**) image))->width = ipicture_pixel_width(pic);
+ (*((GpBitmap**) image))->height = ipicture_pixel_height(pic);
+
+ /* get the pixel format */
+ IPicture_get_Handle(pic, (OLE_HANDLE*)&hbm);
+ IPicture_get_CurDC(pic, &hdc);
+
+ (*((GpBitmap**) image))->hbitmap = hbm;
+ (*((GpBitmap**) image))->hdc = hdc;
+ (*((GpBitmap**) image))->bits = NULL;
+
+ bmch = (BITMAPCOREHEADER*) (&pbmi->bmiHeader);
+ bmch->bcSize = sizeof(BITMAPCOREHEADER);
+
+ if(!hdc){
+ HBITMAP old;
+ hdc = CreateCompatibleDC(0);
+ old = SelectObject(hdc, hbm);
+ GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS);
+ SelectObject(hdc, old);
+ DeleteDC(hdc);
}
- else{
- *image = GdipAlloc(sizeof(GpImage));
- if(!*image) return OutOfMemory;
- (*image)->type = ImageTypeUnknown;
+ else
+ GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS);
+
+ switch(bmch->bcBitCount)
+ {
+ case 1:
+ (*((GpBitmap**) image))->format = PixelFormat1bppIndexed;
+ break;
+ case 4:
+ (*((GpBitmap**) image))->format = PixelFormat4bppIndexed;
+ break;
+ case 8:
+ (*((GpBitmap**) image))->format = PixelFormat8bppIndexed;
+ break;
+ case 16:
+ (*((GpBitmap**) image))->format = PixelFormat16bppRGB565;
+ break;
+ case 24:
+ (*((GpBitmap**) image))->format = PixelFormat24bppRGB;
+ break;
+ case 32:
+ (*((GpBitmap**) image))->format = PixelFormat32bppRGB;
+ break;
+ case 48:
+ (*((GpBitmap**) image))->format = PixelFormat48bppRGB;
+ break;
+ default:
+ FIXME("Bit depth %d is not fully supported yet\n", bmch->bcBitCount);
+ (*((GpBitmap**) image))->format = (bmch->bcBitCount << 8) | PixelFormatGDI;
+ break;
}
+ GdipFree(pbmi);
+
(*image)->picture = pic;
(*image)->flags = ImageFlagsNone;
return Ok;
}
+static GpStatus decode_image_olepicture_metafile(IStream* stream, REFCLSID clsid, GpImage **image)
+{
+ IPicture *pic;
+
+ TRACE("%p %p\n", stream, image);
+
+ if(!stream || !image)
+ return InvalidParameter;
+
+ if(OleLoadPicture(stream, 0, FALSE, &IID_IPicture,
+ (LPVOID*) &pic) != S_OK){
+ TRACE("Could not load picture\n");
+ return GenericError;
+ }
+
+ /* FIXME: missing initialization code */
+ *image = GdipAlloc(sizeof(GpMetafile));
+ if(!*image) return OutOfMemory;
+ (*image)->type = ImageTypeMetafile;
+ (*image)->picture = pic;
+ (*image)->flags = ImageFlagsNone;
+
+ return Ok;
+}
+
+typedef GpStatus (*encode_image_func)(GpImage *image, IStream* stream,
+ GDIPCONST CLSID* clsid, GDIPCONST EncoderParameters* params);
+
+typedef GpStatus (*decode_image_func)(IStream *stream, REFCLSID clsid, GpImage** image);
+
+typedef struct image_codec {
+ ImageCodecInfo info;
+ encode_image_func encode_func;
+ decode_image_func decode_func;
+} image_codec;
+
+typedef enum {
+ BMP,
+ JPEG,
+ GIF,
+ EMF,
+ WMF,
+ PNG,
+ ICO,
+ NUM_CODECS
+} ImageFormat;
+
+static const struct image_codec codecs[NUM_CODECS];
+
+static GpStatus get_decoder_info(IStream* stream, const struct image_codec **result)
+{
+ BYTE signature[8];
+ LARGE_INTEGER seek;
+ HRESULT hr;
+ UINT bytesread;
+ int i, j;
+
+ /* seek to the start of the stream */
+ seek.QuadPart = 0;
+ hr = IStream_Seek(stream, seek, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) return hresult_to_status(hr);
+
+ /* read the first 8 bytes */
+ /* FIXME: This assumes all codecs have one signature <= 8 bytes in length */
+ hr = IStream_Read(stream, signature, 8, &bytesread);
+ if (FAILED(hr)) return hresult_to_status(hr);
+ if (hr == S_FALSE || bytesread == 0) return GenericError;
+
+ for (i = 0; i < NUM_CODECS; i++) {
+ if ((codecs[i].info.Flags & ImageCodecFlagsDecoder) &&
+ bytesread >= codecs[i].info.SigSize)
+ {
+ for (j=0; jdecode_func(stream, &codec->info.Clsid, image);
+}
+
/* FIXME: no ICM */
GpStatus WINGDIPAPI GdipLoadImageFromStreamICM(IStream* stream, GpImage **image)
{
@@ -1290,9 +1761,6 @@ GpStatus WINGDIPAPI GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR* filenam
if (!image || !filename|| !clsidEncoder)
return InvalidParameter;
- if (!(image->picture))
- return InvalidParameter;
-
stat = GdipCreateStreamOnFile(filename, GENERIC_WRITE, &stream);
if (stat != Ok)
return GenericError;
@@ -1313,62 +1781,139 @@ GpStatus WINGDIPAPI GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR* filenam
#define BITMAP_FORMAT_PNG 0x5089
#define BITMAP_FORMAT_APM 0xcdd7
-static GpStatus encode_image_BMP(LPVOID bitmap_bits, LPBITMAPINFO bitmap_info,
- void **output, unsigned int *output_size)
+static GpStatus encode_image_WIC(GpImage *image, IStream* stream,
+ GDIPCONST CLSID* clsid, GDIPCONST EncoderParameters* params)
{
- int num_palette_entries;
- BITMAPFILEHEADER *bmp_file_hdr;
- BITMAPINFO *bmp_info_hdr;
+ GpStatus stat;
+ GpBitmap *bitmap;
+ IWICBitmapEncoder *encoder;
+ IWICBitmapFrameEncode *frameencode;
+ IPropertyBag2 *encoderoptions;
+ HRESULT hr;
+ UINT width, height;
+ PixelFormat gdipformat=0;
+ WICPixelFormatGUID wicformat;
+ GpRect rc;
+ BitmapData lockeddata;
+ HRESULT initresult;
+ UINT i;
- if (bitmap_info->bmiHeader.biClrUsed) {
- num_palette_entries = bitmap_info->bmiHeader.biClrUsed;
- if (num_palette_entries > 256) num_palette_entries = 256;
- } else {
- if (bitmap_info->bmiHeader.biBitCount <= 8)
- num_palette_entries = 1 << bitmap_info->bmiHeader.biBitCount;
- else
- num_palette_entries = 0;
+ if (image->type != ImageTypeBitmap)
+ return GenericError;
+
+ bitmap = (GpBitmap*)image;
+
+ GdipGetImageWidth(image, &width);
+ GdipGetImageHeight(image, &height);
+
+ rc.X = 0;
+ rc.Y = 0;
+ rc.Width = width;
+ rc.Height = height;
+
+ initresult = CoInitialize(NULL);
+
+ hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICBitmapEncoder, (void**)&encoder);
+ if (FAILED(hr))
+ {
+ if (SUCCEEDED(initresult)) CoUninitialize();
+ return hresult_to_status(hr);
}
- *output_size =
- sizeof(BITMAPFILEHEADER) +
- sizeof(BITMAPINFOHEADER) +
- num_palette_entries * sizeof(RGBQUAD) +
- bitmap_info->bmiHeader.biSizeImage;
+ hr = IWICBitmapEncoder_Initialize(encoder, stream, WICBitmapEncoderNoCache);
- *output = GdipAlloc(*output_size);
+ if (SUCCEEDED(hr))
+ {
+ hr = IWICBitmapEncoder_CreateNewFrame(encoder, &frameencode, &encoderoptions);
+ }
- bmp_file_hdr = *output;
- bmp_file_hdr->bfType = BITMAP_FORMAT_BMP;
- bmp_file_hdr->bfSize = *output_size;
- bmp_file_hdr->bfOffBits =
- sizeof(BITMAPFILEHEADER) +
- sizeof(BITMAPINFOHEADER) +
- num_palette_entries * sizeof (RGBQUAD);
+ if (SUCCEEDED(hr)) /* created frame */
+ {
+ hr = IWICBitmapFrameEncode_Initialize(frameencode, encoderoptions);
- bmp_info_hdr = (BITMAPINFO*) ((unsigned char*)(*output) + sizeof(BITMAPFILEHEADER));
- memcpy(bmp_info_hdr, bitmap_info, sizeof(BITMAPINFOHEADER) + num_palette_entries * sizeof(RGBQUAD));
- memcpy((unsigned char *)(*output) +
- sizeof(BITMAPFILEHEADER) +
- sizeof(BITMAPINFOHEADER) +
- num_palette_entries * sizeof(RGBQUAD),
- bitmap_bits, bitmap_info->bmiHeader.biSizeImage);
+ if (SUCCEEDED(hr))
+ hr = IWICBitmapFrameEncode_SetSize(frameencode, width, height);
- return Ok;
+ if (SUCCEEDED(hr))
+ /* FIXME: use the resolution from the image */
+ hr = IWICBitmapFrameEncode_SetResolution(frameencode, 96.0, 96.0);
+
+ if (SUCCEEDED(hr))
+ {
+ for (i=0; wic_pixel_formats[i]; i++)
+ {
+ if (wic_gdip_formats[i] == bitmap->format)
+ break;
+ }
+ if (wic_pixel_formats[i])
+ memcpy(&wicformat, wic_pixel_formats[i], sizeof(GUID));
+ else
+ memcpy(&wicformat, &GUID_WICPixelFormat32bppBGRA, sizeof(GUID));
+
+ hr = IWICBitmapFrameEncode_SetPixelFormat(frameencode, &wicformat);
+
+ for (i=0; wic_pixel_formats[i]; i++)
+ {
+ if (IsEqualGUID(&wicformat, wic_pixel_formats[i]))
+ break;
+ }
+ if (wic_pixel_formats[i])
+ gdipformat = wic_gdip_formats[i];
+ else
+ {
+ ERR("cannot provide pixel format %s\n", debugstr_guid(&wicformat));
+ hr = E_FAIL;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ stat = GdipBitmapLockBits(bitmap, &rc, ImageLockModeRead, gdipformat,
+ &lockeddata);
+
+ if (stat == Ok)
+ {
+ UINT row_size = (lockeddata.Width * PIXELFORMATBPP(gdipformat) + 7)/8;
+ BYTE *row;
+
+ /* write one row at a time in case stride is negative */
+ row = lockeddata.Scan0;
+ for (i=0; ipicture)
- return GenericError;
-
- hr = IPicture_get_Type(image->picture, &type);
- if (FAILED(hr) || type != PICTYPE_BITMAP)
- return GenericError;
-
/* select correct encoder */
encode_image = NULL;
- for (i = 0; i < NUM_ENCODERS_SUPPORTED; i++) {
- if (IsEqualCLSID(clsid, &codecs[i].Clsid))
- encode_image = encode_image_funcs[i];
+ for (i = 0; i < NUM_CODECS; i++) {
+ if ((codecs[i].info.Flags & ImageCodecFlagsEncoder) &&
+ IsEqualCLSID(clsid, &codecs[i].info.Clsid))
+ encode_image = codecs[i].encode_func;
}
if (encode_image == NULL)
return UnknownImageFormat;
- /* extract underlying hbitmap representation from the IPicture */
- hr = IPicture_get_Handle(image->picture, (OLE_HANDLE*)&hbmp);
- if (FAILED(hr) || !hbmp)
- return GenericError;
- hr = IPicture_get_CurDC(image->picture, &hdc);
- if (FAILED(hr))
- return GenericError;
- bm_is_selected = (hdc != 0);
- if (!bm_is_selected) {
- hdc = CreateCompatibleDC(0);
- old_hbmp = SelectObject(hdc, hbmp);
- }
-
- /* get bits from HBITMAP */
- bmp_info.bmiHeader.biSize = sizeof(bmp_info.bmiHeader);
- bmp_info.bmiHeader.biBitCount = 0;
- GetDIBits(hdc, hbmp, 0, 0, NULL, &bmp_info, DIB_RGB_COLORS);
-
- bmp_bits = GdipAlloc(bmp_info.bmiHeader.biSizeImage);
-
- if (bmp_bits)
- GetDIBits(hdc, hbmp, 0, abs(bmp_info.bmiHeader.biHeight), bmp_bits, &bmp_info, DIB_RGB_COLORS);
-
- if (!bm_is_selected) {
- SelectObject(hdc, old_hbmp);
- DeleteDC(hdc);
- }
-
- if (!bmp_bits)
- return OutOfMemory;
-
- stat = encode_image(bmp_bits, &bmp_info, &output, &output_size);
- if (stat == Ok)
- IStream_Write(stream, output, output_size, &dummy);
-
- GdipFree(output);
- GdipFree(bmp_bits);
+ stat = encode_image(image, stream, clsid, params);
return stat;
}
+/*****************************************************************************
+ * GdipGetImagePalette [GDIPLUS.@]
+ */
+GpStatus WINGDIPAPI GdipGetImagePalette(GpImage *image, ColorPalette *palette, INT size)
+{
+ static int calls = 0;
+
+ if(!image)
+ return InvalidParameter;
+
+ if(!(calls++))
+ FIXME("not implemented\n");
+
+ return NotImplemented;
+}
+
/*****************************************************************************
* GdipSetImagePalette [GDIPLUS.@]
*/
@@ -1487,7 +1991,49 @@ static const WCHAR bmp_format[] = {'B', 'M', 'P', 0}; /* BMP */
static const BYTE bmp_sig_pattern[] = { 0x42, 0x4D };
static const BYTE bmp_sig_mask[] = { 0xFF, 0xFF };
-static const ImageCodecInfo codecs[NUM_ENCODERS_SUPPORTED] =
+static const WCHAR jpeg_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'J','P','E','G', 0};
+static const WCHAR jpeg_extension[] = {'*','.','J','P','G',';', '*','.','J','P','E','G',';', '*','.','J','P','E',';', '*','.','J','F','I','F',0};
+static const WCHAR jpeg_mimetype[] = {'i','m','a','g','e','/','j','p','e','g', 0};
+static const WCHAR jpeg_format[] = {'J','P','E','G',0};
+static const BYTE jpeg_sig_pattern[] = { 0xFF, 0xD8 };
+static const BYTE jpeg_sig_mask[] = { 0xFF, 0xFF };
+
+static const WCHAR gif_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'G','I','F', 0};
+static const WCHAR gif_extension[] = {'*','.','G','I','F',0};
+static const WCHAR gif_mimetype[] = {'i','m','a','g','e','/','g','i','f', 0};
+static const WCHAR gif_format[] = {'G','I','F',0};
+static const BYTE gif_sig_pattern[4] = "GIF8";
+static const BYTE gif_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF };
+
+static const WCHAR emf_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'E','M','F', 0};
+static const WCHAR emf_extension[] = {'*','.','E','M','F',0};
+static const WCHAR emf_mimetype[] = {'i','m','a','g','e','/','x','-','e','m','f', 0};
+static const WCHAR emf_format[] = {'E','M','F',0};
+static const BYTE emf_sig_pattern[] = { 0x01, 0x00, 0x00, 0x00 };
+static const BYTE emf_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF };
+
+static const WCHAR wmf_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'W','M','F', 0};
+static const WCHAR wmf_extension[] = {'*','.','W','M','F',0};
+static const WCHAR wmf_mimetype[] = {'i','m','a','g','e','/','x','-','w','m','f', 0};
+static const WCHAR wmf_format[] = {'W','M','F',0};
+static const BYTE wmf_sig_pattern[] = { 0xd7, 0xcd };
+static const BYTE wmf_sig_mask[] = { 0xFF, 0xFF };
+
+static const WCHAR png_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'P','N','G', 0};
+static const WCHAR png_extension[] = {'*','.','P','N','G',0};
+static const WCHAR png_mimetype[] = {'i','m','a','g','e','/','p','n','g', 0};
+static const WCHAR png_format[] = {'P','N','G',0};
+static const BYTE png_sig_pattern[] = { 137, 80, 78, 71, 13, 10, 26, 10, };
+static const BYTE png_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
+
+static const WCHAR ico_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'I','C','O', 0};
+static const WCHAR ico_extension[] = {'*','.','I','C','O',0};
+static const WCHAR ico_mimetype[] = {'i','m','a','g','e','/','x','-','i','c','o','n', 0};
+static const WCHAR ico_format[] = {'I','C','O',0};
+static const BYTE ico_sig_pattern[] = { 0x00, 0x00, 0x01, 0x00 };
+static const BYTE ico_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF };
+
+static const struct image_codec codecs[NUM_CODECS] = {
{
{ /* BMP */
/* Clsid */ { 0x557cf400, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } },
@@ -1504,20 +2050,145 @@ static const ImageCodecInfo codecs[NUM_ENCODERS_SUPPORTED] =
/* SigPattern */ bmp_sig_pattern,
/* SigMask */ bmp_sig_mask,
},
- };
+ encode_image_BMP,
+ decode_image_olepicture_bitmap
+ },
+ {
+ { /* JPEG */
+ /* Clsid */ { 0x557cf401, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } },
+ /* FormatID */ { 0xb96b3caeU, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e} },
+ /* CodecName */ jpeg_codecname,
+ /* DllName */ NULL,
+ /* FormatDescription */ jpeg_format,
+ /* FilenameExtension */ jpeg_extension,
+ /* MimeType */ jpeg_mimetype,
+ /* Flags */ ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin,
+ /* Version */ 1,
+ /* SigCount */ 1,
+ /* SigSize */ 2,
+ /* SigPattern */ jpeg_sig_pattern,
+ /* SigMask */ jpeg_sig_mask,
+ },
+ NULL,
+ decode_image_jpeg
+ },
+ {
+ { /* GIF */
+ /* Clsid */ { 0x557cf402, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } },
+ /* FormatID */ { 0xb96b3cb0U, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e} },
+ /* CodecName */ gif_codecname,
+ /* DllName */ NULL,
+ /* FormatDescription */ gif_format,
+ /* FilenameExtension */ gif_extension,
+ /* MimeType */ gif_mimetype,
+ /* Flags */ ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin,
+ /* Version */ 1,
+ /* SigCount */ 1,
+ /* SigSize */ 4,
+ /* SigPattern */ gif_sig_pattern,
+ /* SigMask */ gif_sig_mask,
+ },
+ NULL,
+ decode_image_gif
+ },
+ {
+ { /* EMF */
+ /* Clsid */ { 0x557cf403, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } },
+ /* FormatID */ { 0xb96b3cacU, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e} },
+ /* CodecName */ emf_codecname,
+ /* DllName */ NULL,
+ /* FormatDescription */ emf_format,
+ /* FilenameExtension */ emf_extension,
+ /* MimeType */ emf_mimetype,
+ /* Flags */ ImageCodecFlagsDecoder | ImageCodecFlagsSupportVector | ImageCodecFlagsBuiltin,
+ /* Version */ 1,
+ /* SigCount */ 1,
+ /* SigSize */ 4,
+ /* SigPattern */ emf_sig_pattern,
+ /* SigMask */ emf_sig_mask,
+ },
+ NULL,
+ decode_image_olepicture_metafile
+ },
+ {
+ { /* WMF */
+ /* Clsid */ { 0x557cf404, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } },
+ /* FormatID */ { 0xb96b3cadU, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e} },
+ /* CodecName */ wmf_codecname,
+ /* DllName */ NULL,
+ /* FormatDescription */ wmf_format,
+ /* FilenameExtension */ wmf_extension,
+ /* MimeType */ wmf_mimetype,
+ /* Flags */ ImageCodecFlagsDecoder | ImageCodecFlagsSupportVector | ImageCodecFlagsBuiltin,
+ /* Version */ 1,
+ /* SigCount */ 1,
+ /* SigSize */ 2,
+ /* SigPattern */ wmf_sig_pattern,
+ /* SigMask */ wmf_sig_mask,
+ },
+ NULL,
+ decode_image_olepicture_metafile
+ },
+ {
+ { /* PNG */
+ /* Clsid */ { 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } },
+ /* FormatID */ { 0xb96b3cafU, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e} },
+ /* CodecName */ png_codecname,
+ /* DllName */ NULL,
+ /* FormatDescription */ png_format,
+ /* FilenameExtension */ png_extension,
+ /* MimeType */ png_mimetype,
+ /* Flags */ ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin,
+ /* Version */ 1,
+ /* SigCount */ 1,
+ /* SigSize */ 8,
+ /* SigPattern */ png_sig_pattern,
+ /* SigMask */ png_sig_mask,
+ },
+ NULL,
+ decode_image_olepicture_bitmap
+ },
+ {
+ { /* ICO */
+ /* Clsid */ { 0x557cf407, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } },
+ /* FormatID */ { 0xb96b3cabU, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e} },
+ /* CodecName */ ico_codecname,
+ /* DllName */ NULL,
+ /* FormatDescription */ ico_format,
+ /* FilenameExtension */ ico_extension,
+ /* MimeType */ ico_mimetype,
+ /* Flags */ ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin,
+ /* Version */ 1,
+ /* SigCount */ 1,
+ /* SigSize */ 4,
+ /* SigPattern */ ico_sig_pattern,
+ /* SigMask */ ico_sig_mask,
+ },
+ NULL,
+ decode_image_icon
+ },
+};
/*****************************************************************************
* GdipGetImageDecodersSize [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipGetImageDecodersSize(UINT *numDecoders, UINT *size)
{
- FIXME("%p %p stub!\n", numDecoders, size);
+ int decoder_count=0;
+ int i;
+ TRACE("%p %p\n", numDecoders, size);
if (!numDecoders || !size)
return InvalidParameter;
- *numDecoders = 0;
- *size = 0;
+ for (i=0; i= ColorAdjustTypeCount)
return InvalidParameter;
- if(!(calls++))
- FIXME("not implemented\n");
+ imageattr->colorkeys[type].enabled = enableFlag;
+ imageattr->colorkeys[type].low = colorLow;
+ imageattr->colorkeys[type].high = colorHigh;
- return NotImplemented;
+ return Ok;
}
GpStatus WINGDIPAPI GdipSetImageAttributesColorMatrix(GpImageAttributes *imageattr,
diff --git a/reactos/dll/win32/gdiplus/region.c b/reactos/dll/win32/gdiplus/region.c
index 8fe5e2694c4..197b68af4a8 100644
--- a/reactos/dll/win32/gdiplus/region.c
+++ b/reactos/dll/win32/gdiplus/region.c
@@ -579,51 +579,63 @@ GpStatus WINGDIPAPI GdipCreateRegionRgnData(GDIPCONST BYTE *data, INT size, GpRe
*/
GpStatus WINGDIPAPI GdipCreateRegionHrgn(HRGN hrgn, GpRegion **region)
{
- union {
- RGNDATA data;
- char buf[sizeof(RGNDATAHEADER) + sizeof(RECT)];
- } rdata;
DWORD size;
- GpRectF rectf;
- GpPath *path;
+ LPRGNDATA buf;
+ LPRECT rect;
GpStatus stat;
+ GpPath* path;
+ GpRegion* local;
+ int i;
TRACE("(%p, %p)\n", hrgn, region);
if(!region || !(size = GetRegionData(hrgn, 0, NULL)))
return InvalidParameter;
- if(size > sizeof(RGNDATAHEADER) + sizeof(RECT)){
- FIXME("Only simple rect regions supported.\n");
- *region = NULL;
- return NotImplemented;
- }
+ buf = GdipAlloc(size);
+ if(!buf)
+ return OutOfMemory;
- if(!GetRegionData(hrgn, sizeof(rdata), &rdata.data))
+ if(!GetRegionData(hrgn, size, buf)){
+ GdipFree(buf);
return GenericError;
+ }
- /* return empty region */
- if(IsRectEmpty(&rdata.data.rdh.rcBound)){
- stat = GdipCreateRegion(region);
- if(stat == Ok)
- GdipSetEmpty(*region);
+ if(buf->rdh.nCount == 0){
+ if((stat = GdipCreateRegion(&local)) != Ok){
+ GdipFree(buf);
+ return stat;
+ }
+ if((stat = GdipSetEmpty(local)) != Ok){
+ GdipFree(buf);
+ GdipDeleteRegion(local);
+ return stat;
+ }
+ *region = local;
+ GdipFree(buf);
+ return Ok;
+ }
+
+ if((stat = GdipCreatePath(FillModeAlternate, &path)) != Ok){
+ GdipFree(buf);
return stat;
}
- rectf.X = (REAL)rdata.data.rdh.rcBound.left;
- rectf.Y = (REAL)rdata.data.rdh.rcBound.top;
- rectf.Width = (REAL)rdata.data.rdh.rcBound.right - rectf.X;
- rectf.Height = (REAL)rdata.data.rdh.rcBound.bottom - rectf.Y;
-
- stat = GdipCreatePath(FillModeAlternate, &path);
- if(stat != Ok)
- return stat;
-
- GdipAddPathRectangle(path, rectf.X, rectf.Y, rectf.Width, rectf.Height);
+ rect = (LPRECT)buf->Buffer;
+ for(i = 0; i < buf->rdh.nCount; i++){
+ if((stat = GdipAddPathRectangle(path, (REAL)rect->left, (REAL)rect->top,
+ (REAL)(rect->right - rect->left), (REAL)(rect->bottom - rect->top))) != Ok){
+ GdipFree(buf);
+ GdipDeletePath(path);
+ return stat;
+ }
+ rect++;
+ }
stat = GdipCreateRegionPath(path, region);
- GdipDeletePath(path);
+ GdipFree(buf);
+ GdipDeletePath(path);
return stat;
}
@@ -657,7 +669,8 @@ GpStatus WINGDIPAPI GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics,
if(!region || !graphics || !rect)
return InvalidParameter;
- status = GdipGetRegionHRgn(region, graphics, &hrgn);
+ /* Contrary to MSDN, native ignores the graphics transform. */
+ status = GdipGetRegionHRgn(region, NULL, &hrgn);
if(status != Ok)
return status;
@@ -1114,6 +1127,92 @@ GpStatus WINGDIPAPI GdipIsInfiniteRegion(GpRegion *region, GpGraphics *graphics,
return Ok;
}
+/*****************************************************************************
+ * GdipIsVisibleRegionRect [GDIPLUS.@]
+ */
+GpStatus WINGDIPAPI GdipIsVisibleRegionRect(GpRegion* region, REAL x, REAL y, REAL w, REAL h, GpGraphics *graphics, BOOL *res)
+{
+ HRGN hrgn;
+ GpStatus stat;
+ RECT rect;
+
+ TRACE("(%p, %.2f, %.2f, %.2f, %.2f, %p, %p)\n", region, x, y, w, h, graphics, res);
+
+ if(!region || !res)
+ return InvalidParameter;
+
+ if((stat = GdipGetRegionHRgn(region, NULL, &hrgn)) != Ok)
+ return stat;
+
+ /* infinite */
+ if(!hrgn){
+ *res = TRUE;
+ return Ok;
+ }
+
+ rect.left = ceilr(x);
+ rect.top = ceilr(y);
+ rect.right = ceilr(x + w);
+ rect.bottom = ceilr(y + h);
+
+ *res = RectInRegion(hrgn, &rect);
+
+ DeleteObject(hrgn);
+
+ return Ok;
+}
+
+/*****************************************************************************
+ * GdipIsVisibleRegionRectI [GDIPLUS.@]
+ */
+GpStatus WINGDIPAPI GdipIsVisibleRegionRectI(GpRegion* region, INT x, INT y, INT w, INT h, GpGraphics *graphics, BOOL *res)
+{
+ TRACE("(%p, %d, %d, %d, %d, %p, %p)\n", region, x, y, w, h, graphics, res);
+ if(!region || !res)
+ return InvalidParameter;
+
+ return GdipIsVisibleRegionRect(region, (REAL)x, (REAL)y, (REAL)w, (REAL)h, graphics, res);
+}
+
+/*****************************************************************************
+ * GdipIsVisibleRegionPoint [GDIPLUS.@]
+ */
+GpStatus WINGDIPAPI GdipIsVisibleRegionPoint(GpRegion* region, REAL x, REAL y, GpGraphics *graphics, BOOL *res)
+{
+ HRGN hrgn;
+ GpStatus stat;
+
+ TRACE("(%p, %.2f, %.2f, %p, %p)\n", region, x, y, graphics, res);
+
+ if(!region || !res)
+ return InvalidParameter;
+
+ if((stat = GdipGetRegionHRgn(region, NULL, &hrgn)) != Ok)
+ return stat;
+
+ /* infinite */
+ if(!hrgn){
+ *res = TRUE;
+ return Ok;
+ }
+
+ *res = PtInRegion(hrgn, roundr(x), roundr(y));
+
+ DeleteObject(hrgn);
+
+ return Ok;
+}
+
+/*****************************************************************************
+ * GdipIsVisibleRegionPointI [GDIPLUS.@]
+ */
+GpStatus WINGDIPAPI GdipIsVisibleRegionPointI(GpRegion* region, INT x, INT y, GpGraphics *graphics, BOOL *res)
+{
+ TRACE("(%p, %d, %d, %p, %p)\n", region, x, y, graphics, res);
+
+ return GdipIsVisibleRegionPoint(region, (REAL)x, (REAL)y, graphics, res);
+}
+
/*****************************************************************************
* GdipSetEmpty [GDIPLUS.@]
*/
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/backend.cc b/reactos/dll/win32/glu32/libnurbs/internals/backend.cc
index a028088539f..d120b1a11e3 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/backend.cc
+++ b/reactos/dll/win32/glu32/libnurbs/internals/backend.cc
@@ -246,7 +246,7 @@ Backend::evalVStrip(int n_left, REAL u_left, REAL* left_val,
*-------------------------------------------------------------------------
*/
void
-Backend::bgntmesh( char * )
+Backend::bgntmesh( const char * )
{
#ifndef NOWIREFRAME
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/backend.h b/reactos/dll/win32/glu32/libnurbs/internals/backend.h
index d8af424065e..6c7f7fc8698 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/backend.h
+++ b/reactos/dll/win32/glu32/libnurbs/internals/backend.h
@@ -65,7 +65,7 @@ public:
void surfbbox( long, REAL *, REAL * );
void surfgrid( REAL, REAL, long, REAL, REAL, long );
void surfmesh( long, long, long, long );
- void bgntmesh( char * );
+ void bgntmesh( const char * );
void endtmesh( void );
void swaptmesh( void );
void tmeshvert( GridTrimVertex * );
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/bin.cc b/reactos/dll/win32/glu32/libnurbs/internals/bin.cc
index 42052f5bf82..5bfa9924f9a 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/bin.cc
+++ b/reactos/dll/win32/glu32/libnurbs/internals/bin.cc
@@ -120,7 +120,7 @@ Bin::adopt()
*/
void
-Bin::show( char *name )
+Bin::show( const char *name )
{
#ifndef NDEBUG
dprintf( "%s\n", name );
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/bin.h b/reactos/dll/win32/glu32/libnurbs/internals/bin.h
index 77b59e99087..1a2ffab1e37 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/bin.h
+++ b/reactos/dll/win32/glu32/libnurbs/internals/bin.h
@@ -63,7 +63,7 @@ public:
int numarcs( void );
void adopt( void );
void markall( void );
- void show( char * );
+ void show( const char * );
void listBezier( void );
};
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/bufpool.cc b/reactos/dll/win32/glu32/libnurbs/internals/bufpool.cc
index 7689c4a8667..096ea4f34c0 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/bufpool.cc
+++ b/reactos/dll/win32/glu32/libnurbs/internals/bufpool.cc
@@ -48,7 +48,7 @@
* Pool - allocate a new pool of buffers
*-----------------------------------------------------------------------------
*/
-Pool::Pool( int _buffersize, int initpoolsize, char *n )
+Pool::Pool( int _buffersize, int initpoolsize, const char *n )
{
buffersize= (_buffersize < (int)sizeof(Buffer)) ? sizeof(Buffer) : _buffersize;
initsize = initpoolsize * buffersize;
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/bufpool.h b/reactos/dll/win32/glu32/libnurbs/internals/bufpool.h
index ebe5465ff3f..137e7e653d4 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/bufpool.h
+++ b/reactos/dll/win32/glu32/libnurbs/internals/bufpool.h
@@ -55,7 +55,7 @@ class Buffer {
class Pool {
public:
- Pool( int, int, char * );
+ Pool( int, int, const char * );
~Pool( void );
inline void* new_buffer( void );
inline void free_buffer( void * );
@@ -74,7 +74,7 @@ protected:
int nextfree; /* byte offset past next free buffer */
int initsize;
enum Magic { is_allocated = 0xf3a1, is_free = 0xf1a2 };
- char *name; /* name of the pool */
+ const char *name; /* name of the pool */
Magic magic; /* marker for valid pool */
};
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/intersect.cc b/reactos/dll/win32/glu32/libnurbs/internals/intersect.cc
index 66f3f309c64..204a8b3f0b7 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/intersect.cc
+++ b/reactos/dll/win32/glu32/libnurbs/internals/intersect.cc
@@ -179,6 +179,13 @@ Subdivider::arc_split( Arc_ptr jarc, int param, REAL value, int dir )
TrimVertex* v = jarc->pwlArc->pts;
int loc[3];
+
+#if defined(__GNUC__) && \
+ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ == 40400)
+ /* Silence incorrect GCC 4.4.0 warnings */
+ loc[0] = loc[1] = loc[2] = 0;
+#endif
+
switch( pwlarc_intersect( jarc->pwlArc, param, value, dir, loc ) ) {
// When the parameter value lands on a vertex, life is sweet
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/knotvector.cc b/reactos/dll/win32/glu32/libnurbs/internals/knotvector.cc
index 50556f622dd..f90ba81fbc7 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/knotvector.cc
+++ b/reactos/dll/win32/glu32/libnurbs/internals/knotvector.cc
@@ -126,7 +126,7 @@ int Knotvector::validate( void )
return 0;
}
-void Knotvector::show( char *msg )
+void Knotvector::show( const char *msg )
{
#ifndef NDEBUG
dprintf( "%s\n", msg );
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/knotvector.h b/reactos/dll/win32/glu32/libnurbs/internals/knotvector.h
index eecefe41ebe..1fc5d57e201 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/knotvector.h
+++ b/reactos/dll/win32/glu32/libnurbs/internals/knotvector.h
@@ -49,7 +49,7 @@ struct Knotvector { /* a knot vector */
~Knotvector( void );
void init( long, long, long, INREAL * );
int validate( void );
- void show( char * );
+ void show( const char * );
long order; /* order of spline */
long knotcount; /* number of knots */
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/nurbstess.cc b/reactos/dll/win32/glu32/libnurbs/internals/nurbstess.cc
index 41a78120c17..24f07fa70ff 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/nurbstess.cc
+++ b/reactos/dll/win32/glu32/libnurbs/internals/nurbstess.cc
@@ -677,7 +677,7 @@ NurbsTessellator::do_nurbserror( int msg )
}
int
-NurbsTessellator::do_check_knots( Knotvector *knots, char *msg )
+NurbsTessellator::do_check_knots( Knotvector *knots, const char *msg )
{
int status = knots->validate();
if( status ) {
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/nurbstess.h b/reactos/dll/win32/glu32/libnurbs/internals/nurbstess.h
index d1b250ba214..4ea43217f34 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/nurbstess.h
+++ b/reactos/dll/win32/glu32/libnurbs/internals/nurbstess.h
@@ -112,7 +112,7 @@ protected:
private:
void resetObjects( void );
- int do_check_knots( Knotvector *, char * );
+ int do_check_knots( Knotvector *, const char * );
void do_nurbserror( int );
void do_bgncurve( O_curve * );
void do_endcurve( void );
diff --git a/reactos/dll/win32/glu32/libnurbs/internals/subdivider.cc b/reactos/dll/win32/glu32/libnurbs/internals/subdivider.cc
index cc0b5147065..a46bf4b522c 100644
--- a/reactos/dll/win32/glu32/libnurbs/internals/subdivider.cc
+++ b/reactos/dll/win32/glu32/libnurbs/internals/subdivider.cc
@@ -531,16 +531,18 @@ Subdivider::nonSamplingSplit(
patchlist.pspec[param].range[1] ) * 0.5;
split( source, left, right, param, mid );
Patchlist subpatchlist( patchlist, param, mid );
- if( left.isnonempty() )
+ if( left.isnonempty() ) {
if( subpatchlist.cullCheck() == CULL_TRIVIAL_REJECT )
freejarcs( left );
else
nonSamplingSplit( left, subpatchlist, subdivisions-1, param );
- if( right.isnonempty() )
+ }
+ if( right.isnonempty() ) {
if( patchlist.cullCheck() == CULL_TRIVIAL_REJECT )
freejarcs( right );
else
nonSamplingSplit( right, patchlist, subdivisions-1, param );
+ }
} else {
// make bbox calls
diff --git a/reactos/dll/win32/glu32/libnurbs/nurbtess/partitionY.cc b/reactos/dll/win32/glu32/libnurbs/nurbtess/partitionY.cc
index 2bfc36299e0..d38b2fddcd0 100644
--- a/reactos/dll/win32/glu32/libnurbs/nurbtess/partitionY.cc
+++ b/reactos/dll/win32/glu32/libnurbs/nurbtess/partitionY.cc
@@ -113,8 +113,8 @@ Int isCusp(directedLine *v)
else if(A[1] > B[1] && C[1] > B[1])
return 1;
- if(isAbove(v, v) && isAbove(v, v->getPrev()) ||
- isBelow(v, v) && isBelow(v, v->getPrev()))
+ if((isAbove(v, v) && isAbove(v, v->getPrev())) ||
+ (isBelow(v, v) && isBelow(v, v->getPrev())))
return 1;
else
return 0;
diff --git a/reactos/dll/win32/hhctrl.ocx/chm.c b/reactos/dll/win32/hhctrl.ocx/chm.c
index e8d036b67bf..b7df8e72c7d 100644
--- a/reactos/dll/win32/hhctrl.ocx/chm.c
+++ b/reactos/dll/win32/hhctrl.ocx/chm.c
@@ -362,15 +362,18 @@ IStream *GetChmStream(CHMInfo *info, LPCWSTR parent_chm, ChmPath *chm_file)
/* Opens the CHM file for reading */
CHMInfo *OpenCHM(LPCWSTR szFile)
{
- WCHAR file[MAX_PATH] = {0};
HRESULT hres;
+ CHMInfo *ret;
static const WCHAR wszSTRINGS[] = {'#','S','T','R','I','N','G','S',0};
- CHMInfo *ret = heap_alloc_zero(sizeof(CHMInfo));
+ if (!(ret = heap_alloc_zero(sizeof(CHMInfo))))
+ return NULL;
- GetFullPathNameW(szFile, sizeof(file)/sizeof(file[0]), file, NULL);
- ret->szFile = strdupW(file);
+ if (!(ret->szFile = strdupW(szFile))) {
+ heap_free(ret);
+ return NULL;
+ }
hres = CoCreateInstance(&CLSID_ITStorage, NULL, CLSCTX_INPROC_SERVER,
&IID_IITStorage, (void **) &ret->pITStorage) ;
@@ -423,6 +426,7 @@ CHMInfo *CloseCHM(CHMInfo *chm)
heap_free(chm->defTitle);
heap_free(chm->defTopic);
heap_free(chm->defToc);
+ heap_free(chm->szFile);
heap_free(chm);
return NULL;
diff --git a/reactos/dll/win32/hhctrl.ocx/help.c b/reactos/dll/win32/hhctrl.ocx/help.c
index ff703384e67..092e97e8784 100644
--- a/reactos/dll/win32/hhctrl.ocx/help.c
+++ b/reactos/dll/win32/hhctrl.ocx/help.c
@@ -115,7 +115,9 @@ BOOL NavigateToChm(HHInfo *info, LPCWSTR file, LPCWSTR index)
LPWSTR ptr;
static const WCHAR url_format[] =
- {'m','k',':','@','M','S','I','T','S','t','o','r','e',':','%','s',':',':','%','s',0};
+ {'m','k',':','@','M','S','I','T','S','t','o','r','e',':','%','s',':',':','%','s','%','s',0};
+ static const WCHAR slash[] = {'/',0};
+ static const WCHAR empty[] = {0};
TRACE("%p %s %s\n", info, debugstr_w(file), debugstr_w(index));
@@ -127,7 +129,7 @@ BOOL NavigateToChm(HHInfo *info, LPCWSTR file, LPCWSTR index)
return FALSE;
}
- wsprintfW(buf, url_format, full_path, index);
+ wsprintfW(buf, url_format, full_path, (!index || index[0] == '/') ? empty : slash, index);
/* FIXME: HACK */
if((ptr = strchrW(buf, '#')))
diff --git a/reactos/dll/win32/hhctrl.ocx/hhctrl.c b/reactos/dll/win32/hhctrl.ocx/hhctrl.c
index 5e707b92560..8268a21f34b 100644
--- a/reactos/dll/win32/hhctrl.ocx/hhctrl.c
+++ b/reactos/dll/win32/hhctrl.ocx/hhctrl.c
@@ -86,11 +86,27 @@ static const char *command_to_string(UINT command)
#undef X
}
+static BOOL resolve_filename(const WCHAR *filename, WCHAR *fullname, DWORD buflen)
+{
+ static const WCHAR helpW[] = {'\\','h','e','l','p','\\',0};
+
+ GetFullPathNameW(filename, buflen, fullname, NULL);
+ if (GetFileAttributesW(fullname) == INVALID_FILE_ATTRIBUTES)
+ {
+ GetWindowsDirectoryW(fullname, buflen);
+ strcatW(fullname, helpW);
+ strcatW(fullname, filename);
+ }
+ return (GetFileAttributesW(fullname) != INVALID_FILE_ATTRIBUTES);
+}
+
/******************************************************************
* HtmlHelpW (HHCTRL.OCX.15)
*/
HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR data)
{
+ WCHAR fullname[MAX_PATH];
+
TRACE("(%p, %s, command=%s, data=%lx)\n",
caller, debugstr_w( filename ),
command_to_string( command ), data);
@@ -119,13 +135,14 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat
filename = chm_file;
index += 2; /* advance beyond "::" for calling NavigateToChm() later */
}
- else
+
+ if (!resolve_filename(filename, fullname, MAX_PATH))
{
- if (command!=HH_DISPLAY_SEARCH) /* FIXME - use HH_FTS_QUERYW structure in data */
- index = (const WCHAR*)data;
+ WARN("can't find %s\n", debugstr_w(filename));
+ return 0;
}
- info = CreateHelpViewer(filename);
+ info = CreateHelpViewer(fullname);
if(!info)
return NULL;
@@ -147,7 +164,13 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat
if (!filename)
return NULL;
- info = CreateHelpViewer(filename);
+ if (!resolve_filename(filename, fullname, MAX_PATH))
+ {
+ WARN("can't find %s\n", debugstr_w(filename));
+ return 0;
+ }
+
+ info = CreateHelpViewer(fullname);
if(!info)
return NULL;
diff --git a/reactos/dll/win32/hhctrl.ocx/hhctrl.ocx_ros.diff b/reactos/dll/win32/hhctrl.ocx/hhctrl.ocx_ros.diff
deleted file mode 100644
index 73495b417af..00000000000
--- a/reactos/dll/win32/hhctrl.ocx/hhctrl.ocx_ros.diff
+++ /dev/null
@@ -1,16 +0,0 @@
-Index: hhctrl.ocx.rbuild
-===================================================================
---- hhctrl.ocx.rbuild (revision 32840)
-+++ hhctrl.ocx.rbuild (working copy)
-@@ -6,9 +6,11 @@
-
- .
- include/reactos/wine
-+ include/reactos
-
- 0x600
- 0x600
-+ wineheaders
- chm.c
- content.c
- help.c
diff --git a/reactos/dll/win32/hhctrl.ocx/resource.h b/reactos/dll/win32/hhctrl.ocx/resource.h
index 02df94641e9..a08fdd96eb8 100644
--- a/reactos/dll/win32/hhctrl.ocx/resource.h
+++ b/reactos/dll/win32/hhctrl.ocx/resource.h
@@ -18,6 +18,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include
+#include
+#include
+#include
+
#define IDS_CONTENTS 1
#define IDS_INDEX 2
#define IDS_SEARCH 3
diff --git a/reactos/dll/win32/hnetcfg/apps.c b/reactos/dll/win32/hnetcfg/apps.c
new file mode 100644
index 00000000000..fbd603cd610
--- /dev/null
+++ b/reactos/dll/win32/hnetcfg/apps.c
@@ -0,0 +1,500 @@
+/*
+ * Copyright 2009 Hans Leidekker 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
+#include
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "ole2.h"
+#include "netfw.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "hnetcfg_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg);
+
+typedef struct fw_app
+{
+ const INetFwAuthorizedApplicationVtbl *vtbl;
+ LONG refs;
+} fw_app;
+
+static inline fw_app *impl_from_INetFwAuthorizedApplication( INetFwAuthorizedApplication *iface )
+{
+ return (fw_app *)((char *)iface - FIELD_OFFSET( fw_app, vtbl ));
+}
+
+static ULONG WINAPI fw_app_AddRef(
+ INetFwAuthorizedApplication *iface )
+{
+ fw_app *fw_app = impl_from_INetFwAuthorizedApplication( iface );
+ return InterlockedIncrement( &fw_app->refs );
+}
+
+static ULONG WINAPI fw_app_Release(
+ INetFwAuthorizedApplication *iface )
+{
+ fw_app *fw_app = impl_from_INetFwAuthorizedApplication( iface );
+ LONG refs = InterlockedDecrement( &fw_app->refs );
+ if (!refs)
+ {
+ TRACE("destroying %p\n", fw_app);
+ HeapFree( GetProcessHeap(), 0, fw_app );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI fw_app_QueryInterface(
+ INetFwAuthorizedApplication *iface,
+ REFIID riid,
+ void **ppvObject )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+
+ if ( IsEqualGUID( riid, &IID_INetFwAuthorizedApplication ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+ INetFwAuthorizedApplication_AddRef( iface );
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_app_GetTypeInfoCount(
+ INetFwAuthorizedApplication *iface,
+ UINT *pctinfo )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p %p\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_GetTypeInfo(
+ INetFwAuthorizedApplication *iface,
+ UINT iTInfo,
+ LCID lcid,
+ ITypeInfo **ppTInfo )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_GetIDsOfNames(
+ INetFwAuthorizedApplication *iface,
+ REFIID riid,
+ LPOLESTR *rgszNames,
+ UINT cNames,
+ LCID lcid,
+ DISPID *rgDispId )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_Invoke(
+ INetFwAuthorizedApplication *iface,
+ DISPID dispIdMember,
+ REFIID riid,
+ LCID lcid,
+ WORD wFlags,
+ DISPPARAMS *pDispParams,
+ VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo,
+ UINT *puArgErr )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
+ lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_get_Name(
+ INetFwAuthorizedApplication *iface,
+ BSTR *name )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %p\n", This, name);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_put_Name(
+ INetFwAuthorizedApplication *iface,
+ BSTR name )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %s\n", This, debugstr_w(name));
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_app_get_ProcessImageFileName(
+ INetFwAuthorizedApplication *iface,
+ BSTR *imageFileName )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %p\n", This, imageFileName);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_put_ProcessImageFileName(
+ INetFwAuthorizedApplication *iface,
+ BSTR imageFileName )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %s\n", This, debugstr_w(imageFileName));
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_app_get_IpVersion(
+ INetFwAuthorizedApplication *iface,
+ NET_FW_IP_VERSION *ipVersion )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %p\n", This, ipVersion);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_put_IpVersion(
+ INetFwAuthorizedApplication *iface,
+ NET_FW_IP_VERSION ipVersion )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %u\n", This, ipVersion);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_get_Scope(
+ INetFwAuthorizedApplication *iface,
+ NET_FW_SCOPE *scope )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %p\n", This, scope);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_put_Scope(
+ INetFwAuthorizedApplication *iface,
+ NET_FW_SCOPE scope )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %u\n", This, scope);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_get_RemoteAddresses(
+ INetFwAuthorizedApplication *iface,
+ BSTR *remoteAddrs )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %p\n", This, remoteAddrs);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_put_RemoteAddresses(
+ INetFwAuthorizedApplication *iface,
+ BSTR remoteAddrs )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %s\n", This, debugstr_w(remoteAddrs));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_app_get_Enabled(
+ INetFwAuthorizedApplication *iface,
+ VARIANT_BOOL *enabled )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %p\n", This, enabled);
+
+ *enabled = VARIANT_FALSE;
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_app_put_Enabled(
+ INetFwAuthorizedApplication *iface,
+ VARIANT_BOOL enabled )
+{
+ fw_app *This = impl_from_INetFwAuthorizedApplication( iface );
+
+ FIXME("%p, %d\n", This, enabled);
+ return E_NOTIMPL;
+}
+
+static const struct INetFwAuthorizedApplicationVtbl fw_app_vtbl =
+{
+ fw_app_QueryInterface,
+ fw_app_AddRef,
+ fw_app_Release,
+ fw_app_GetTypeInfoCount,
+ fw_app_GetTypeInfo,
+ fw_app_GetIDsOfNames,
+ fw_app_Invoke,
+ fw_app_get_Name,
+ fw_app_put_Name,
+ fw_app_get_ProcessImageFileName,
+ fw_app_put_ProcessImageFileName,
+ fw_app_get_IpVersion,
+ fw_app_put_IpVersion,
+ fw_app_get_Scope,
+ fw_app_put_Scope,
+ fw_app_get_RemoteAddresses,
+ fw_app_put_RemoteAddresses,
+ fw_app_get_Enabled,
+ fw_app_put_Enabled
+};
+
+HRESULT NetFwAuthorizedApplication_create( IUnknown *pUnkOuter, LPVOID *ppObj )
+{
+ fw_app *fa;
+
+ TRACE("(%p,%p)\n", pUnkOuter, ppObj);
+
+ fa = HeapAlloc( GetProcessHeap(), 0, sizeof(*fa) );
+ if (!fa) return E_OUTOFMEMORY;
+
+ fa->vtbl = &fw_app_vtbl;
+ fa->refs = 1;
+
+ *ppObj = &fa->vtbl;
+
+ TRACE("returning iface %p\n", *ppObj);
+ return S_OK;
+}
+typedef struct fw_apps
+{
+ const INetFwAuthorizedApplicationsVtbl *vtbl;
+ LONG refs;
+} fw_apps;
+
+static inline fw_apps *impl_from_INetFwAuthorizedApplications( INetFwAuthorizedApplications *iface )
+{
+ return (fw_apps *)((char *)iface - FIELD_OFFSET( fw_apps, vtbl ));
+}
+
+static ULONG WINAPI fw_apps_AddRef(
+ INetFwAuthorizedApplications *iface )
+{
+ fw_apps *fw_apps = impl_from_INetFwAuthorizedApplications( iface );
+ return InterlockedIncrement( &fw_apps->refs );
+}
+
+static ULONG WINAPI fw_apps_Release(
+ INetFwAuthorizedApplications *iface )
+{
+ fw_apps *fw_apps = impl_from_INetFwAuthorizedApplications( iface );
+ LONG refs = InterlockedDecrement( &fw_apps->refs );
+ if (!refs)
+ {
+ TRACE("destroying %p\n", fw_apps);
+ HeapFree( GetProcessHeap(), 0, fw_apps );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI fw_apps_QueryInterface(
+ INetFwAuthorizedApplications *iface,
+ REFIID riid,
+ void **ppvObject )
+{
+ fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
+
+ TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+
+ if ( IsEqualGUID( riid, &IID_INetFwAuthorizedApplications ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+ INetFwAuthorizedApplications_AddRef( iface );
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_apps_GetTypeInfoCount(
+ INetFwAuthorizedApplications *iface,
+ UINT *pctinfo )
+{
+ fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
+
+ FIXME("%p %p\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_apps_GetTypeInfo(
+ INetFwAuthorizedApplications *iface,
+ UINT iTInfo,
+ LCID lcid,
+ ITypeInfo **ppTInfo )
+{
+ fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
+
+ FIXME("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_apps_GetIDsOfNames(
+ INetFwAuthorizedApplications *iface,
+ REFIID riid,
+ LPOLESTR *rgszNames,
+ UINT cNames,
+ LCID lcid,
+ DISPID *rgDispId )
+{
+ fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
+
+ FIXME("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_apps_Invoke(
+ INetFwAuthorizedApplications *iface,
+ DISPID dispIdMember,
+ REFIID riid,
+ LCID lcid,
+ WORD wFlags,
+ DISPPARAMS *pDispParams,
+ VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo,
+ UINT *puArgErr )
+{
+ fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
+
+ FIXME("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
+ lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_apps_get_Count(
+ INetFwAuthorizedApplications *iface,
+ LONG *count )
+{
+ fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
+
+ FIXME("%p, %p\n", This, count);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_apps_Add(
+ INetFwAuthorizedApplications *iface,
+ INetFwAuthorizedApplication *app )
+{
+ fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
+
+ FIXME("%p, %p\n", This, app);
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_apps_Remove(
+ INetFwAuthorizedApplications *iface,
+ BSTR imageFileName )
+{
+ fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
+
+ FIXME("%p, %s\n", This, debugstr_w(imageFileName));
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_apps_Item(
+ INetFwAuthorizedApplications *iface,
+ BSTR imageFileName,
+ INetFwAuthorizedApplication **app )
+{
+ fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
+
+ TRACE("%p, %s, %p\n", This, debugstr_w(imageFileName), app);
+ return NetFwAuthorizedApplication_create( NULL, (void **)app );
+}
+
+static HRESULT WINAPI fw_apps_get__NewEnum(
+ INetFwAuthorizedApplications *iface,
+ IUnknown **newEnum )
+{
+ fw_apps *This = impl_from_INetFwAuthorizedApplications( iface );
+
+ FIXME("%p, %p\n", This, newEnum);
+ return E_NOTIMPL;
+}
+
+static const struct INetFwAuthorizedApplicationsVtbl fw_apps_vtbl =
+{
+ fw_apps_QueryInterface,
+ fw_apps_AddRef,
+ fw_apps_Release,
+ fw_apps_GetTypeInfoCount,
+ fw_apps_GetTypeInfo,
+ fw_apps_GetIDsOfNames,
+ fw_apps_Invoke,
+ fw_apps_get_Count,
+ fw_apps_Add,
+ fw_apps_Remove,
+ fw_apps_Item,
+ fw_apps_get__NewEnum
+};
+
+HRESULT NetFwAuthorizedApplications_create( IUnknown *pUnkOuter, LPVOID *ppObj )
+{
+ fw_apps *fa;
+
+ TRACE("(%p,%p)\n", pUnkOuter, ppObj);
+
+ fa = HeapAlloc( GetProcessHeap(), 0, sizeof(*fa) );
+ if (!fa) return E_OUTOFMEMORY;
+
+ fa->vtbl = &fw_apps_vtbl;
+ fa->refs = 1;
+
+ *ppObj = &fa->vtbl;
+
+ TRACE("returning iface %p\n", *ppObj);
+ return S_OK;
+}
diff --git a/reactos/dll/win32/hnetcfg/hnetcfg.c b/reactos/dll/win32/hnetcfg/hnetcfg.c
new file mode 100644
index 00000000000..72336f91210
--- /dev/null
+++ b/reactos/dll/win32/hnetcfg/hnetcfg.c
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2007 Jeff Latimer
+ *
+ * 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
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "objbase.h"
+#include "netfw.h"
+
+#include "wine/debug.h"
+#include "hnetcfg_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg);
+
+typedef HRESULT (*fnCreateInstance)( IUnknown *pUnkOuter, LPVOID *ppObj );
+
+typedef struct
+{
+ const struct IClassFactoryVtbl *vtbl;
+ fnCreateInstance pfnCreateInstance;
+} hnetcfg_cf;
+
+static inline hnetcfg_cf *impl_from_IClassFactory( IClassFactory *iface )
+{
+ return (hnetcfg_cf *)((char *)iface - FIELD_OFFSET( hnetcfg_cf, vtbl ));
+}
+
+static HRESULT WINAPI hnetcfg_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj )
+{
+ if (IsEqualGUID(riid, &IID_IUnknown) ||
+ IsEqualGUID(riid, &IID_IClassFactory))
+ {
+ IClassFactory_AddRef( iface );
+ *ppobj = iface;
+ return S_OK;
+ }
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI hnetcfg_cf_AddRef( IClassFactory *iface )
+{
+ return 2;
+}
+
+static ULONG WINAPI hnetcfg_cf_Release( IClassFactory *iface )
+{
+ return 1;
+}
+
+static HRESULT WINAPI hnetcfg_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter,
+ REFIID riid, LPVOID *ppobj )
+{
+ hnetcfg_cf *This = impl_from_IClassFactory( iface );
+ HRESULT r;
+ IUnknown *punk;
+
+ TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj);
+
+ *ppobj = NULL;
+
+ if (pOuter)
+ return CLASS_E_NOAGGREGATION;
+
+ r = This->pfnCreateInstance( pOuter, (LPVOID *)&punk );
+ if (FAILED(r))
+ return r;
+
+ r = IUnknown_QueryInterface( punk, riid, ppobj );
+ if (FAILED(r))
+ return r;
+
+ IUnknown_Release( punk );
+ return r;
+}
+
+static HRESULT WINAPI hnetcfg_cf_LockServer( IClassFactory *iface, BOOL dolock )
+{
+ FIXME("(%p)->(%d)\n", iface, dolock);
+ return S_OK;
+}
+
+static const struct IClassFactoryVtbl hnetcfg_cf_vtbl =
+{
+ hnetcfg_cf_QueryInterface,
+ hnetcfg_cf_AddRef,
+ hnetcfg_cf_Release,
+ hnetcfg_cf_CreateInstance,
+ hnetcfg_cf_LockServer
+};
+
+static hnetcfg_cf fw_manager_cf = { &hnetcfg_cf_vtbl, NetFwMgr_create };
+static hnetcfg_cf fw_app_cf = { &hnetcfg_cf_vtbl, NetFwAuthorizedApplication_create };
+
+BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+ TRACE("(0x%p, %d, %p)\n",hInstDLL,fdwReason,lpvReserved);
+
+ switch(fdwReason) {
+ case DLL_WINE_PREATTACH:
+ return FALSE;
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(hInstDLL);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv )
+{
+ IClassFactory *cf = NULL;
+
+ TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
+
+ if (IsEqualGUID( rclsid, &CLSID_NetFwMgr ))
+ {
+ cf = (IClassFactory *)&fw_manager_cf.vtbl;
+ }
+ else if (IsEqualGUID( rclsid, &CLSID_NetFwAuthorizedApplication ))
+ {
+ cf = (IClassFactory *)&fw_app_cf.vtbl;
+ }
+
+ if (!cf) return CLASS_E_CLASSNOTAVAILABLE;
+ return IClassFactory_QueryInterface( cf, iid, ppv );
+}
+
+HRESULT WINAPI DllCanUnloadNow( void )
+{
+ FIXME("\n");
+ return S_FALSE;
+}
diff --git a/reactos/dll/win32/hnetcfg/hnetcfg.rbuild b/reactos/dll/win32/hnetcfg/hnetcfg.rbuild
new file mode 100644
index 00000000000..37cd7ac6b2e
--- /dev/null
+++ b/reactos/dll/win32/hnetcfg/hnetcfg.rbuild
@@ -0,0 +1,18 @@
+
+
+
+ .
+ include/reactos/wine
+ 0x600
+
+ wine
+ ole32
+ advapi32
+ kernel32
+ apps.c
+ hnetcfg.c
+ manager.c
+ policy.c
+ profile.c
+ regsvr.c
+
diff --git a/reactos/dll/win32/hnetcfg/hnetcfg.spec b/reactos/dll/win32/hnetcfg/hnetcfg.spec
new file mode 100644
index 00000000000..be44a5930c1
--- /dev/null
+++ b/reactos/dll/win32/hnetcfg/hnetcfg.spec
@@ -0,0 +1,4 @@
+@ stdcall -private DllCanUnloadNow()
+@ stdcall -private DllGetClassObject( ptr ptr ptr )
+@ stdcall -private DllRegisterServer()
+@ stdcall -private DllUnregisterServer()
diff --git a/reactos/dll/win32/hnetcfg/hnetcfg_private.h b/reactos/dll/win32/hnetcfg/hnetcfg_private.h
new file mode 100644
index 00000000000..933782950bb
--- /dev/null
+++ b/reactos/dll/win32/hnetcfg/hnetcfg_private.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2009 Hans Leidekker 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
+ */
+
+HRESULT NetFwMgr_create(IUnknown *, LPVOID *);
+HRESULT NetFwPolicy_create(IUnknown *, LPVOID *);
+HRESULT NetFwProfile_create(IUnknown *, LPVOID *);
+HRESULT NetFwAuthorizedApplication_create(IUnknown *, LPVOID *);
+HRESULT NetFwAuthorizedApplications_create(IUnknown *, LPVOID *);
diff --git a/reactos/dll/win32/hnetcfg/manager.c b/reactos/dll/win32/hnetcfg/manager.c
new file mode 100644
index 00000000000..7d6a7a5f492
--- /dev/null
+++ b/reactos/dll/win32/hnetcfg/manager.c
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2009 Hans Leidekker 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
+#include
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "initguid.h"
+#include "ole2.h"
+#include "netfw.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "hnetcfg_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg);
+
+typedef struct fw_manager
+{
+ const INetFwMgrVtbl *vtbl;
+ LONG refs;
+} fw_manager;
+
+static inline fw_manager *impl_from_INetFwMgr( INetFwMgr *iface )
+{
+ return (fw_manager *)((char *)iface - FIELD_OFFSET( fw_manager, vtbl ));
+}
+
+static ULONG WINAPI fw_manager_AddRef(
+ INetFwMgr *iface )
+{
+ fw_manager *fw_manager = impl_from_INetFwMgr( iface );
+ return InterlockedIncrement( &fw_manager->refs );
+}
+
+static ULONG WINAPI fw_manager_Release(
+ INetFwMgr *iface )
+{
+ fw_manager *fw_manager = impl_from_INetFwMgr( iface );
+ LONG refs = InterlockedDecrement( &fw_manager->refs );
+ if (!refs)
+ {
+ TRACE("destroying %p\n", fw_manager);
+ HeapFree( GetProcessHeap(), 0, fw_manager );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI fw_manager_QueryInterface(
+ INetFwMgr *iface,
+ REFIID riid,
+ void **ppvObject )
+{
+ fw_manager *This = impl_from_INetFwMgr( iface );
+
+ TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+
+ if ( IsEqualGUID( riid, &IID_INetFwMgr ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+ INetFwMgr_AddRef( iface );
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_manager_GetTypeInfoCount(
+ INetFwMgr *iface,
+ UINT *pctinfo )
+{
+ fw_manager *This = impl_from_INetFwMgr( iface );
+
+ FIXME("%p %p\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_manager_GetTypeInfo(
+ INetFwMgr *iface,
+ UINT iTInfo,
+ LCID lcid,
+ ITypeInfo **ppTInfo )
+{
+ fw_manager *This = impl_from_INetFwMgr( iface );
+
+ FIXME("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_manager_GetIDsOfNames(
+ INetFwMgr *iface,
+ REFIID riid,
+ LPOLESTR *rgszNames,
+ UINT cNames,
+ LCID lcid,
+ DISPID *rgDispId )
+{
+ fw_manager *This = impl_from_INetFwMgr( iface );
+
+ FIXME("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_manager_Invoke(
+ INetFwMgr *iface,
+ DISPID dispIdMember,
+ REFIID riid,
+ LCID lcid,
+ WORD wFlags,
+ DISPPARAMS *pDispParams,
+ VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo,
+ UINT *puArgErr )
+{
+ fw_manager *This = impl_from_INetFwMgr( iface );
+
+ FIXME("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
+ lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_manager_get_LocalPolicy(
+ INetFwMgr *iface,
+ INetFwPolicy **localPolicy )
+{
+ fw_manager *This = impl_from_INetFwMgr( iface );
+
+ TRACE("%p, %p\n", This, localPolicy);
+ return NetFwPolicy_create( NULL, (void **)localPolicy );
+}
+
+static HRESULT WINAPI fw_manager_get_CurrentProfileType(
+ INetFwMgr *iface,
+ NET_FW_PROFILE_TYPE *profileType )
+{
+ fw_manager *This = impl_from_INetFwMgr( iface );
+
+ FIXME("%p, %p\n", This, profileType);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_manager_RestoreDefaults(
+ INetFwMgr *iface )
+{
+ fw_manager *This = impl_from_INetFwMgr( iface );
+
+ FIXME("%p\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_manager_IsPortAllowed(
+ INetFwMgr *iface,
+ BSTR imageFileName,
+ NET_FW_IP_VERSION ipVersion,
+ LONG portNumber,
+ BSTR localAddress,
+ NET_FW_IP_PROTOCOL ipProtocol,
+ VARIANT *allowed,
+ VARIANT *restricted )
+{
+ fw_manager *This = impl_from_INetFwMgr( iface );
+
+ FIXME("%p, %s, %u, %d, %s, %u, %p, %p\n", This, debugstr_w(imageFileName),
+ ipVersion, portNumber, debugstr_w(localAddress), ipProtocol, allowed, restricted);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_manager_IsIcmpTypeAllowed(
+ INetFwMgr *iface,
+ NET_FW_IP_VERSION ipVersion,
+ BSTR localAddress,
+ BYTE type,
+ VARIANT *allowed,
+ VARIANT *restricted )
+{
+ fw_manager *This = impl_from_INetFwMgr( iface );
+
+ FIXME("%p, %u, %s, %u, %p, %p\n", This, ipVersion, debugstr_w(localAddress),
+ type, allowed, restricted);
+ return E_NOTIMPL;
+}
+
+static const struct INetFwMgrVtbl fw_manager_vtbl =
+{
+ fw_manager_QueryInterface,
+ fw_manager_AddRef,
+ fw_manager_Release,
+ fw_manager_GetTypeInfoCount,
+ fw_manager_GetTypeInfo,
+ fw_manager_GetIDsOfNames,
+ fw_manager_Invoke,
+ fw_manager_get_LocalPolicy,
+ fw_manager_get_CurrentProfileType,
+ fw_manager_RestoreDefaults,
+ fw_manager_IsPortAllowed,
+ fw_manager_IsIcmpTypeAllowed
+};
+
+HRESULT NetFwMgr_create( IUnknown *pUnkOuter, LPVOID *ppObj )
+{
+ fw_manager *fm;
+
+ TRACE("(%p,%p)\n", pUnkOuter, ppObj);
+
+ fm = HeapAlloc( GetProcessHeap(), 0, sizeof(*fm) );
+ if (!fm) return E_OUTOFMEMORY;
+
+ fm->vtbl = &fw_manager_vtbl;
+ fm->refs = 1;
+
+ *ppObj = &fm->vtbl;
+
+ TRACE("returning iface %p\n", *ppObj);
+ return S_OK;
+}
diff --git a/reactos/dll/win32/hnetcfg/policy.c b/reactos/dll/win32/hnetcfg/policy.c
new file mode 100644
index 00000000000..cff89730b36
--- /dev/null
+++ b/reactos/dll/win32/hnetcfg/policy.c
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2009 Hans Leidekker 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
+#include
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "ole2.h"
+#include "netfw.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "hnetcfg_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg);
+
+typedef struct fw_policy
+{
+ const INetFwPolicyVtbl *vtbl;
+ LONG refs;
+} fw_policy;
+
+static inline fw_policy *impl_from_INetFwPolicy( INetFwPolicy *iface )
+{
+ return (fw_policy *)((char *)iface - FIELD_OFFSET( fw_policy, vtbl ));
+}
+
+static ULONG WINAPI fw_policy_AddRef(
+ INetFwPolicy *iface )
+{
+ fw_policy *fw_policy = impl_from_INetFwPolicy( iface );
+ return InterlockedIncrement( &fw_policy->refs );
+}
+
+static ULONG WINAPI fw_policy_Release(
+ INetFwPolicy *iface )
+{
+ fw_policy *fw_policy = impl_from_INetFwPolicy( iface );
+ LONG refs = InterlockedDecrement( &fw_policy->refs );
+ if (!refs)
+ {
+ TRACE("destroying %p\n", fw_policy);
+ HeapFree( GetProcessHeap(), 0, fw_policy );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI fw_policy_QueryInterface(
+ INetFwPolicy *iface,
+ REFIID riid,
+ void **ppvObject )
+{
+ fw_policy *This = impl_from_INetFwPolicy( iface );
+
+ TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+
+ if ( IsEqualGUID( riid, &IID_INetFwPolicy ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+ INetFwPolicy_AddRef( iface );
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_policy_GetTypeInfoCount(
+ INetFwPolicy *iface,
+ UINT *pctinfo )
+{
+ fw_policy *This = impl_from_INetFwPolicy( iface );
+
+ FIXME("%p %p\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_policy_GetTypeInfo(
+ INetFwPolicy *iface,
+ UINT iTInfo,
+ LCID lcid,
+ ITypeInfo **ppTInfo )
+{
+ fw_policy *This = impl_from_INetFwPolicy( iface );
+
+ FIXME("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_policy_GetIDsOfNames(
+ INetFwPolicy *iface,
+ REFIID riid,
+ LPOLESTR *rgszNames,
+ UINT cNames,
+ LCID lcid,
+ DISPID *rgDispId )
+{
+ fw_policy *This = impl_from_INetFwPolicy( iface );
+
+ FIXME("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_policy_Invoke(
+ INetFwPolicy *iface,
+ DISPID dispIdMember,
+ REFIID riid,
+ LCID lcid,
+ WORD wFlags,
+ DISPPARAMS *pDispParams,
+ VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo,
+ UINT *puArgErr )
+{
+ fw_policy *This = impl_from_INetFwPolicy( iface );
+
+ FIXME("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
+ lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_policy_get_CurrentProfile(
+ INetFwPolicy *iface,
+ INetFwProfile **profile )
+{
+ fw_policy *This = impl_from_INetFwPolicy( iface );
+
+ TRACE("%p, %p\n", This, profile);
+ return NetFwProfile_create( NULL, (void **)profile );
+}
+
+static HRESULT WINAPI fw_policy_GetProfileByType(
+ INetFwPolicy *iface,
+ NET_FW_PROFILE_TYPE profileType,
+ INetFwProfile **profile )
+{
+ fw_policy *This = impl_from_INetFwPolicy( iface );
+
+ FIXME("%p, %u, %p\n", This, profileType, profile);
+ return E_NOTIMPL;
+}
+
+static const struct INetFwPolicyVtbl fw_policy_vtbl =
+{
+ fw_policy_QueryInterface,
+ fw_policy_AddRef,
+ fw_policy_Release,
+ fw_policy_GetTypeInfoCount,
+ fw_policy_GetTypeInfo,
+ fw_policy_GetIDsOfNames,
+ fw_policy_Invoke,
+ fw_policy_get_CurrentProfile,
+ fw_policy_GetProfileByType
+};
+
+HRESULT NetFwPolicy_create( IUnknown *pUnkOuter, LPVOID *ppObj )
+{
+ fw_policy *fp;
+
+ TRACE("(%p,%p)\n", pUnkOuter, ppObj);
+
+ fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) );
+ if (!fp) return E_OUTOFMEMORY;
+
+ fp->vtbl = &fw_policy_vtbl;
+ fp->refs = 1;
+
+ *ppObj = &fp->vtbl;
+
+ TRACE("returning iface %p\n", *ppObj);
+ return S_OK;
+}
diff --git a/reactos/dll/win32/hnetcfg/profile.c b/reactos/dll/win32/hnetcfg/profile.c
new file mode 100644
index 00000000000..91c73afbf21
--- /dev/null
+++ b/reactos/dll/win32/hnetcfg/profile.c
@@ -0,0 +1,329 @@
+/*
+ * Copyright 2009 Hans Leidekker 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
+#include
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "ole2.h"
+#include "netfw.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "hnetcfg_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg);
+
+typedef struct fw_profile
+{
+ const INetFwProfileVtbl *vtbl;
+ LONG refs;
+} fw_profile;
+
+static inline fw_profile *impl_from_INetFwProfile( INetFwProfile *iface )
+{
+ return (fw_profile *)((char *)iface - FIELD_OFFSET( fw_profile, vtbl ));
+}
+
+static ULONG WINAPI fw_profile_AddRef(
+ INetFwProfile *iface )
+{
+ fw_profile *fw_profile = impl_from_INetFwProfile( iface );
+ return InterlockedIncrement( &fw_profile->refs );
+}
+
+static ULONG WINAPI fw_profile_Release(
+ INetFwProfile *iface )
+{
+ fw_profile *fw_profile = impl_from_INetFwProfile( iface );
+ LONG refs = InterlockedDecrement( &fw_profile->refs );
+ if (!refs)
+ {
+ TRACE("destroying %p\n", fw_profile);
+ HeapFree( GetProcessHeap(), 0, fw_profile );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI fw_profile_QueryInterface(
+ INetFwProfile *iface,
+ REFIID riid,
+ void **ppvObject )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+
+ if ( IsEqualGUID( riid, &IID_INetFwProfile ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = iface;
+ }
+ else
+ {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+ INetFwProfile_AddRef( iface );
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_profile_GetTypeInfoCount(
+ INetFwProfile *iface,
+ UINT *pctinfo )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p %p\n", This, pctinfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_GetTypeInfo(
+ INetFwProfile *iface,
+ UINT iTInfo,
+ LCID lcid,
+ ITypeInfo **ppTInfo )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_GetIDsOfNames(
+ INetFwProfile *iface,
+ REFIID riid,
+ LPOLESTR *rgszNames,
+ UINT cNames,
+ LCID lcid,
+ DISPID *rgDispId )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_Invoke(
+ INetFwProfile *iface,
+ DISPID dispIdMember,
+ REFIID riid,
+ LCID lcid,
+ WORD wFlags,
+ DISPPARAMS *pDispParams,
+ VARIANT *pVarResult,
+ EXCEPINFO *pExcepInfo,
+ UINT *puArgErr )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid),
+ lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_get_Type(
+ INetFwProfile *iface,
+ NET_FW_PROFILE_TYPE *type )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %p\n", This, type);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_get_FirewallEnabled(
+ INetFwProfile *iface,
+ VARIANT_BOOL *enabled )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %p\n", This, enabled);
+
+ *enabled = VARIANT_FALSE;
+ return S_OK;
+}
+
+static HRESULT WINAPI fw_profile_put_FirewallEnabled(
+ INetFwProfile *iface,
+ VARIANT_BOOL enabled )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %d\n", This, enabled);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_get_ExceptionsNotAllowed(
+ INetFwProfile *iface,
+ VARIANT_BOOL *notAllowed )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %p\n", This, notAllowed);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_put_ExceptionsNotAllowed(
+ INetFwProfile *iface,
+ VARIANT_BOOL notAllowed )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %d\n", This, notAllowed);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_get_NotificationsDisabled(
+ INetFwProfile *iface,
+ VARIANT_BOOL *disabled )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %p\n", This, disabled);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_put_NotificationsDisabled(
+ INetFwProfile *iface,
+ VARIANT_BOOL disabled )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %d\n", This, disabled);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_get_UnicastResponsesToMulticastBroadcastDisabled(
+ INetFwProfile *iface,
+ VARIANT_BOOL *disabled )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %p\n", This, disabled);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_put_UnicastResponsesToMulticastBroadcastDisabled(
+ INetFwProfile *iface,
+ VARIANT_BOOL disabled )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %d\n", This, disabled);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_get_RemoteAdminSettings(
+ INetFwProfile *iface,
+ INetFwRemoteAdminSettings **remoteAdminSettings )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %p\n", This, remoteAdminSettings);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_get_IcmpSettings(
+ INetFwProfile *iface,
+ INetFwIcmpSettings **icmpSettings )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %p\n", This, icmpSettings);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_get_GloballyOpenPorts(
+ INetFwProfile *iface,
+ INetFwOpenPorts **openPorts )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %p\n", This, openPorts);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_get_Services(
+ INetFwProfile *iface,
+ INetFwServices **Services )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ FIXME("%p, %p\n", This, Services);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI fw_profile_get_AuthorizedApplications(
+ INetFwProfile *iface,
+ INetFwAuthorizedApplications **apps )
+{
+ fw_profile *This = impl_from_INetFwProfile( iface );
+
+ TRACE("%p, %p\n", This, apps);
+ return NetFwAuthorizedApplications_create( NULL, (void **)apps );
+}
+
+static const struct INetFwProfileVtbl fw_profile_vtbl =
+{
+ fw_profile_QueryInterface,
+ fw_profile_AddRef,
+ fw_profile_Release,
+ fw_profile_GetTypeInfoCount,
+ fw_profile_GetTypeInfo,
+ fw_profile_GetIDsOfNames,
+ fw_profile_Invoke,
+ fw_profile_get_Type,
+ fw_profile_get_FirewallEnabled,
+ fw_profile_put_FirewallEnabled,
+ fw_profile_get_ExceptionsNotAllowed,
+ fw_profile_put_ExceptionsNotAllowed,
+ fw_profile_get_NotificationsDisabled,
+ fw_profile_put_NotificationsDisabled,
+ fw_profile_get_UnicastResponsesToMulticastBroadcastDisabled,
+ fw_profile_put_UnicastResponsesToMulticastBroadcastDisabled,
+ fw_profile_get_RemoteAdminSettings,
+ fw_profile_get_IcmpSettings,
+ fw_profile_get_GloballyOpenPorts,
+ fw_profile_get_Services,
+ fw_profile_get_AuthorizedApplications
+};
+
+HRESULT NetFwProfile_create( IUnknown *pUnkOuter, LPVOID *ppObj )
+{
+ fw_profile *fp;
+
+ TRACE("(%p,%p)\n", pUnkOuter, ppObj);
+
+ fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) );
+ if (!fp) return E_OUTOFMEMORY;
+
+ fp->vtbl = &fw_profile_vtbl;
+ fp->refs = 1;
+
+ *ppObj = &fp->vtbl;
+
+ TRACE("returning iface %p\n", *ppObj);
+ return S_OK;
+}
diff --git a/reactos/dll/win32/hnetcfg/regsvr.c b/reactos/dll/win32/hnetcfg/regsvr.c
new file mode 100644
index 00000000000..e739cc0b76d
--- /dev/null
+++ b/reactos/dll/win32/hnetcfg/regsvr.c
@@ -0,0 +1,430 @@
+/*
+ * self-registerable dll functions for hnetcfg.dll
+ *
+ * Copyright (C) 2003 John K. Hohm
+ *
+ * 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
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winreg.h"
+#include "winerror.h"
+#include "objbase.h"
+#include "netfw.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg);
+
+/*
+ * Near the bottom of this file are the exported DllRegisterServer and
+ * DllUnregisterServer, which make all this worthwhile.
+ */
+
+/***********************************************************************
+ * interface for self-registering
+ */
+struct regsvr_interface
+{
+ IID const *iid; /* NULL for end of list */
+ LPCSTR name; /* can be NULL to omit */
+ IID const *base_iid; /* can be NULL to omit */
+ int num_methods; /* can be <0 to omit */
+ CLSID const *ps_clsid; /* can be NULL to omit */
+ CLSID const *ps_clsid32; /* can be NULL to omit */
+};
+
+static HRESULT register_interfaces(struct regsvr_interface const *list);
+static HRESULT unregister_interfaces(struct regsvr_interface const *list);
+
+struct regsvr_coclass
+{
+ CLSID const *clsid; /* NULL for end of list */
+ LPCSTR name; /* can be NULL to omit */
+ LPCSTR ips; /* can be NULL to omit */
+ LPCSTR ips32; /* can be NULL to omit */
+ LPCSTR ips32_tmodel; /* can be NULL to omit */
+ LPCSTR clsid_str; /* can be NULL to omit */
+ LPCSTR progid; /* can be NULL to omit */
+};
+
+static HRESULT register_coclasses(struct regsvr_coclass const *list);
+static HRESULT unregister_coclasses(struct regsvr_coclass const *list);
+
+/***********************************************************************
+ * static string constants
+ */
+static WCHAR const interface_keyname[10] = {
+ 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 };
+static WCHAR const base_ifa_keyname[14] = {
+ 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c',
+ 'e', 0 };
+static WCHAR const num_methods_keyname[11] = {
+ 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 };
+static WCHAR const ps_clsid_keyname[15] = {
+ 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
+ 'i', 'd', 0 };
+static WCHAR const ps_clsid32_keyname[17] = {
+ 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
+ 'i', 'd', '3', '2', 0 };
+static WCHAR const clsid_keyname[6] = {
+ 'C', 'L', 'S', 'I', 'D', 0 };
+static WCHAR const ips_keyname[13] = {
+ 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
+ 0 };
+static WCHAR const ips32_keyname[15] = {
+ 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
+ '3', '2', 0 };
+static WCHAR const progid_keyname[7] = {
+ 'P', 'r', 'o', 'g', 'I', 'D', 0 };
+static char const tmodel_valuename[] = "ThreadingModel";
+
+/***********************************************************************
+ * static helper functions
+ */
+static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid);
+static LONG register_key_defvalueW(HKEY base, WCHAR const *name,
+ WCHAR const *value);
+static LONG register_key_defvalueA(HKEY base, WCHAR const *name,
+ char const *value);
+
+/***********************************************************************
+ * register_interfaces
+ */
+static HRESULT register_interfaces(struct regsvr_interface const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY interface_key;
+
+ res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &interface_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->iid; ++list) {
+ WCHAR buf[39];
+ HKEY iid_key;
+
+ StringFromGUID2(list->iid, buf, 39);
+ res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &iid_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_interface_key;
+
+ if (list->name) {
+ res = RegSetValueExA(iid_key, NULL, 0, REG_SZ,
+ (CONST BYTE*)(list->name),
+ strlen(list->name) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+ }
+
+ if (list->base_iid) {
+ res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid);
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+ }
+
+ if (0 <= list->num_methods) {
+ static WCHAR const fmt[3] = { '%', 'd', 0 };
+ HKEY key;
+
+ res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+
+ sprintfW(buf, fmt, list->num_methods);
+ res = RegSetValueExW(key, NULL, 0, REG_SZ,
+ (CONST BYTE*)buf,
+ (lstrlenW(buf) + 1) * sizeof(WCHAR));
+ RegCloseKey(key);
+
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+ }
+
+ if (list->ps_clsid) {
+ res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid);
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+ }
+
+ if (list->ps_clsid32) {
+ res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32);
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+ }
+
+ error_close_iid_key:
+ RegCloseKey(iid_key);
+ }
+
+error_close_interface_key:
+ RegCloseKey(interface_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * unregister_interfaces
+ */
+static HRESULT unregister_interfaces(struct regsvr_interface const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY interface_key;
+
+ res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0,
+ KEY_READ | KEY_WRITE, &interface_key);
+ if (res == ERROR_FILE_NOT_FOUND) return S_OK;
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->iid; ++list) {
+ WCHAR buf[39];
+
+ StringFromGUID2(list->iid, buf, 39);
+ res = RegDeleteTreeW(interface_key, buf);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ }
+
+ RegCloseKey(interface_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * register_coclasses
+ */
+static HRESULT register_coclasses(struct regsvr_coclass const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY coclass_key;
+
+ res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+ WCHAR buf[39];
+ HKEY clsid_key;
+
+ StringFromGUID2(list->clsid, buf, 39);
+ res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+
+ if (list->name) {
+ res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ,
+ (CONST BYTE*)(list->name),
+ strlen(list->name) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->ips) {
+ res = register_key_defvalueA(clsid_key, ips_keyname, list->ips);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->ips32) {
+ HKEY ips32_key;
+
+ res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL,
+ &ips32_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+ res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ,
+ (CONST BYTE*)list->ips32,
+ lstrlenA(list->ips32) + 1);
+ if (res == ERROR_SUCCESS && list->ips32_tmodel)
+ res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ,
+ (CONST BYTE*)list->ips32_tmodel,
+ strlen(list->ips32_tmodel) + 1);
+ RegCloseKey(ips32_key);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->clsid_str) {
+ res = register_key_defvalueA(clsid_key, clsid_keyname,
+ list->clsid_str);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->progid) {
+ HKEY progid_key;
+
+ res = register_key_defvalueA(clsid_key, progid_keyname,
+ list->progid);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+ res = RegCreateKeyExA(HKEY_CLASSES_ROOT, list->progid, 0,
+ NULL, 0, KEY_READ | KEY_WRITE, NULL,
+ &progid_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+ res = register_key_defvalueW(progid_key, clsid_keyname, buf);
+ RegCloseKey(progid_key);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ error_close_clsid_key:
+ RegCloseKey(clsid_key);
+ }
+
+error_close_coclass_key:
+ RegCloseKey(coclass_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * unregister_coclasses
+ */
+static HRESULT unregister_coclasses(struct regsvr_coclass const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY coclass_key;
+
+ res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
+ KEY_READ | KEY_WRITE, &coclass_key);
+ if (res == ERROR_FILE_NOT_FOUND) return S_OK;
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+ WCHAR buf[39];
+
+ StringFromGUID2(list->clsid, buf, 39);
+ res = RegDeleteTreeW(coclass_key, buf);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+
+ if (list->progid) {
+ res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+ }
+ }
+
+error_close_coclass_key:
+ RegCloseKey(coclass_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * regsvr_key_guid
+ */
+static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid)
+{
+ WCHAR buf[39];
+
+ StringFromGUID2(guid, buf, 39);
+ return register_key_defvalueW(base, name, buf);
+}
+
+/***********************************************************************
+ * regsvr_key_defvalueW
+ */
+static LONG register_key_defvalueW(
+ HKEY base,
+ WCHAR const *name,
+ WCHAR const *value)
+{
+ LONG res;
+ HKEY key;
+
+ res = RegCreateKeyExW(base, name, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &key, NULL);
+ if (res != ERROR_SUCCESS) return res;
+ res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
+ (lstrlenW(value) + 1) * sizeof(WCHAR));
+ RegCloseKey(key);
+ return res;
+}
+
+/***********************************************************************
+ * regsvr_key_defvalueA
+ */
+static LONG register_key_defvalueA(
+ HKEY base,
+ WCHAR const *name,
+ char const *value)
+{
+ LONG res;
+ HKEY key;
+
+ res = RegCreateKeyExW(base, name, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &key, NULL);
+ if (res != ERROR_SUCCESS) return res;
+ res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
+ lstrlenA(value) + 1);
+ RegCloseKey(key);
+ return res;
+}
+
+/***********************************************************************
+ * coclass list
+ */
+static struct regsvr_coclass const coclass_list[] = {
+ { &CLSID_NetFwMgr,
+ "NetFwMgr",
+ NULL,
+ "hnetcfg.dll",
+ "Both"
+ },
+ { &CLSID_NetFwAuthorizedApplication,
+ "NetFwAuthorizedApplication",
+ NULL,
+ "hnetcfg.dll",
+ "Both"
+ },
+ { NULL } /* list terminator */
+};
+
+/***********************************************************************
+ * interface list
+ */
+static struct regsvr_interface const interface_list[] = {
+ { NULL } /* list terminator */
+};
+
+/***********************************************************************
+ * DllRegisterServer (INETCOMM.@)
+ */
+HRESULT WINAPI DllRegisterServer(void)
+{
+ HRESULT hr;
+
+ TRACE("\n");
+
+ hr = register_coclasses(coclass_list);
+ if (SUCCEEDED(hr))
+ hr = register_interfaces(interface_list);
+ return hr;
+}
+
+/***********************************************************************
+ * DllUnregisterServer (INETCOMM.@)
+ */
+HRESULT WINAPI DllUnregisterServer(void)
+{
+ HRESULT hr;
+
+ TRACE("\n");
+
+ hr = unregister_coclasses(coclass_list);
+ if (SUCCEEDED(hr))
+ hr = unregister_interfaces(interface_list);
+ return hr;
+}
diff --git a/reactos/dll/win32/imm32/imm32.rbuild b/reactos/dll/win32/imm32/imm32.rbuild
index 2a15eb09246..a0d9b601814 100644
--- a/reactos/dll/win32/imm32/imm32.rbuild
+++ b/reactos/dll/win32/imm32/imm32.rbuild
@@ -7,6 +7,7 @@
include/reactos/wine
0x600
+ /FIwine/typeof.h
imm.c
version.rc
wine
diff --git a/reactos/dll/win32/iphlpapi/ifenum_reactos.c b/reactos/dll/win32/iphlpapi/ifenum_reactos.c
index a37d5e0d03d..90b43211f08 100644
--- a/reactos/dll/win32/iphlpapi/ifenum_reactos.c
+++ b/reactos/dll/win32/iphlpapi/ifenum_reactos.c
@@ -582,6 +582,8 @@ const char *getInterfaceNameByIndex(DWORD index)
interfaceName = HeapAlloc( GetProcessHeap(), 0,
strlen(adapter_name) + 1 );
+ if (!interfaceName) return NULL;
+
strcpy( interfaceName, adapter_name );
}
@@ -847,15 +849,14 @@ DWORD getInterfaceEntryByIndex(DWORD index, PMIB_IFROW entry)
char *toIPAddressString(unsigned int addr, char string[16])
{
- if (string) {
struct in_addr iAddr;
iAddr.s_addr = addr;
- /* extra-anal, just to make auditors happy */
- strncpy(string, inet_ntoa(iAddr), 16);
- string[16] = '\0';
- }
- return string;
+
+ if (string)
+ strncpy(string, inet_ntoa(iAddr), 16);
+
+ return inet_ntoa(iAddr);
}
NTSTATUS addIPAddress( IPAddr Address, IPMask Mask, DWORD IfIndex,
diff --git a/reactos/dll/win32/iphlpapi/iphlpapi_main.c b/reactos/dll/win32/iphlpapi/iphlpapi_main.c
index 5f8abd17211..8ef198ef3b0 100644
--- a/reactos/dll/win32/iphlpapi/iphlpapi_main.c
+++ b/reactos/dll/win32/iphlpapi/iphlpapi_main.c
@@ -102,6 +102,7 @@ DWORD getInterfaceGatewayByIndex(DWORD index)
{
DWORD ndx, retVal = 0, numRoutes = getNumRoutes();
RouteTable *table = getRouteTable();
+ if (!table) return 0;
for (ndx = 0; ndx < numRoutes; ndx++)
{
@@ -645,9 +646,12 @@ DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen)
DWORD addrLen = sizeof(ptr->Address), type;
const char *ifname =
getInterfaceNameByIndex(table->indexes[ndx]);
+ if (!ifname) {
+ ret = ERROR_OUTOFMEMORY;
+ break;
+ }
/* on Win98 this is left empty, but whatever */
-
strncpy(ptr->AdapterName,ifname,sizeof(ptr->AdapterName));
consumeInterfaceName(ifname);
ptr->AdapterName[MAX_ADAPTER_NAME_LENGTH] = '\0';
@@ -906,8 +910,9 @@ DWORD WINAPI GetIfTable(PMIB_IFTABLE pIfTable, PULONG pdwSize, BOOL bOrder)
ret = ERROR_INVALID_PARAMETER;
else {
DWORD numInterfaces = getNumInterfaces();
+ ULONG size;
TRACE("GetIfTable: numInterfaces = %d\n", (int)numInterfaces);
- ULONG size = sizeof(MIB_IFTABLE) + (numInterfaces - 1) * sizeof(MIB_IFROW);
+ size = sizeof(MIB_IFTABLE) + (numInterfaces - 1) * sizeof(MIB_IFROW);
if (!pIfTable || *pdwSize < size) {
*pdwSize = size;
@@ -971,8 +976,9 @@ DWORD WINAPI GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULONG dwOutBufLen)
ret = ERROR_INVALID_PARAMETER;
else {
DWORD numNonLoopbackInterfaces = getNumNonLoopbackInterfaces();
+ ULONG size;
TRACE("numNonLoopbackInterfaces == 0x%x\n", numNonLoopbackInterfaces);
- ULONG size = sizeof(IP_INTERFACE_INFO) + (numNonLoopbackInterfaces) *
+ size = sizeof(IP_INTERFACE_INFO) + (numNonLoopbackInterfaces) *
sizeof(IP_ADAPTER_INDEX_MAP);
if (!pIfTable || *dwOutBufLen < size) {
@@ -981,9 +987,9 @@ DWORD WINAPI GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULONG dwOutBufLen)
}
else {
InterfaceIndexTable *table = getNonLoopbackInterfaceIndexTable();
- TRACE("table->numIndexes == 0x%x\n", table->numIndexes);
if (table) {
+ TRACE("table->numIndexes == 0x%x\n", table->numIndexes);
size = sizeof(IP_INTERFACE_INFO) + (table->numIndexes) *
sizeof(IP_ADAPTER_INDEX_MAP);
if (*dwOutBufLen < size) {
diff --git a/reactos/dll/win32/iphlpapi/ipstats_reactos.c b/reactos/dll/win32/iphlpapi/ipstats_reactos.c
index d0a617853a9..4dede14468d 100644
--- a/reactos/dll/win32/iphlpapi/ipstats_reactos.c
+++ b/reactos/dll/win32/iphlpapi/ipstats_reactos.c
@@ -459,6 +459,10 @@ RouteTable *getRouteTable(void)
out_route_table = HeapAlloc( GetProcessHeap(), 0,
sizeof(RouteTable) +
(sizeof(RouteEntry) * (numRoutes - 1)) );
+ if (!out_route_table) {
+ closeTcpFile(tcpFile);
+ return NULL;
+ }
out_route_table->numRoutes = numRoutes;
@@ -586,6 +590,10 @@ PMIB_IPNETTABLE getArpTable(void)
IpArpTable = HeapAlloc
( GetProcessHeap(), 0,
sizeof(DWORD) + (sizeof(MIB_IPNETROW) * totalNumber) );
+ if (!IpArpTable) {
+ closeTcpFile(tcpFile);
+ return NULL;
+ }
status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities );
diff --git a/reactos/dll/win32/iphlpapi/registry.c b/reactos/dll/win32/iphlpapi/registry.c
index 2421b1cdec0..64b0f1f98bb 100644
--- a/reactos/dll/win32/iphlpapi/registry.c
+++ b/reactos/dll/win32/iphlpapi/registry.c
@@ -44,18 +44,19 @@ PWCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n ) {
PWCHAR Value;
DWORD ValueLen;
- if (MaxAdapterName == -1) {
- RegCloseKey( RegHandle );
+ if (MaxAdapterName == -1)
return 0;
- }
ValueLen = MaxAdapterName;
Value = (PWCHAR)HeapAlloc( GetProcessHeap(), 0, MaxAdapterName * sizeof(WCHAR) );
+ if (!Value) return 0;
+
Status = RegEnumKeyExW( RegHandle, n, Value, &ValueLen,
NULL, NULL, NULL, NULL );
- if (Status != ERROR_SUCCESS)
+ if (Status != ERROR_SUCCESS) {
+ HeapFree(GetProcessHeap(), 0, Value);
return 0;
- else {
+ } else {
Value[ValueLen] = 0;
return Value;
}
diff --git a/reactos/dll/win32/iphlpapi/resinfo_reactos.c b/reactos/dll/win32/iphlpapi/resinfo_reactos.c
index a5ace16799c..13ee4d25aee 100644
--- a/reactos/dll/win32/iphlpapi/resinfo_reactos.c
+++ b/reactos/dll/win32/iphlpapi/resinfo_reactos.c
@@ -151,11 +151,13 @@ void EnumNameServers( HANDLE RegHandle, PWCHAR Interface,
}
if (ch - LastNameStart > 0) { /* A last name? */
PWCHAR NameServer = malloc(((ch - LastNameStart) + 1) * sizeof(WCHAR));
- memcpy(NameServer,NameServerString + LastNameStart,
- (ch - LastNameStart) * sizeof(WCHAR));
- NameServer[ch - LastNameStart] = 0;
- cb( Interface, NameServer, Data );
- free(NameServer);
+ if (NameServer) {
+ memcpy(NameServer,NameServerString + LastNameStart,
+ (ch - LastNameStart) * sizeof(WCHAR));
+ NameServer[ch - LastNameStart] = 0;
+ cb( Interface, NameServer, Data );
+ free(NameServer);
+ }
}
ConsumeRegValueString(NameServerString);
}
@@ -223,6 +225,8 @@ PIPHLP_RES_INFO getResInfo() {
PrivateNSEnum.NumServers = ServerCount;
DnsList = HeapAlloc(GetProcessHeap(), 0, ServerCount * sizeof(IP_ADDR_STRING));
+ if (!DnsList) return NULL;
+
ZeroMemory(DnsList, ServerCount * sizeof(IP_ADDR_STRING));
ResInfo = (PIPHLP_RES_INFO)RtlAllocateHeap ( GetProcessHeap(), 0, sizeof(IPHLP_RES_INFO));
diff --git a/reactos/dll/win32/jscript/array.c b/reactos/dll/win32/jscript/array.c
index cd40e432517..704624e7974 100644
--- a/reactos/dll/win32/jscript/array.c
+++ b/reactos/dll/win32/jscript/array.c
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include
+
#include "jscript.h"
#include "wine/debug.h"
@@ -40,12 +42,7 @@ static const WCHAR sortW[] = {'s','o','r','t',0};
static const WCHAR spliceW[] = {'s','p','l','i','c','e',0};
static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0};
-static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0};
static const WCHAR unshiftW[] = {'u','n','s','h','i','f','t',0};
-static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0};
-static const WCHAR propertyIsEnumerableW[] =
- {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0};
-static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0};
static const WCHAR default_separatorW[] = {',',0};
@@ -61,6 +58,30 @@ static HRESULT Array_length(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
V_VT(retv) = VT_I4;
V_I4(retv) = This->length;
break;
+ case DISPATCH_PROPERTYPUT: {
+ VARIANT num;
+ DOUBLE len = -1;
+ DWORD i;
+ HRESULT hres;
+
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &num);
+ if(V_VT(&num) == VT_I4)
+ len = V_I4(&num);
+ else
+ len = floor(V_R8(&num));
+
+ if(len!=(DWORD)len)
+ return throw_range_error(dispex->ctx, ei, IDS_INVALID_LENGTH, NULL);
+
+ for(i=len; ilength; i++) {
+ hres = jsdisp_delete_idx(dispex, i);
+ if(FAILED(hres))
+ return hres;
+ }
+
+ This->length = len;
+ break;
+ }
default:
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
@@ -394,8 +415,81 @@ static HRESULT Array_shift(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS
static HRESULT Array_slice(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ DispatchEx *arr;
+ VARIANT v;
+ DOUBLE range;
+ DWORD length, start, end, idx;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ if(is_class(dispex, JSCLASS_ARRAY)) {
+ length = ((ArrayInstance*)dispex)->length;
+ }else {
+ FIXME("not Array this\n");
+ return E_NOTIMPL;
+ }
+
+ if(arg_cnt(dp)) {
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(V_VT(&v) == VT_I4)
+ range = V_I4(&v);
+ else
+ range = floor(V_R8(&v));
+
+ if(-range>length || isnan(range)) start = 0;
+ else if(range < 0) start = range+length;
+ else if(range <= length) start = range;
+ else start = length;
+ }
+ else start = 0;
+
+ if(arg_cnt(dp)>1) {
+ hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ if(V_VT(&v) == VT_I4)
+ range = V_I4(&v);
+ else
+ range = floor(V_R8(&v));
+
+ if(-range>length) end = 0;
+ else if(range < 0) end = range+length;
+ else if(range <= length) end = range;
+ else end = length;
+ }
+ else end = length;
+
+ hres = create_array(dispex->ctx, (end>start)?end-start:0, &arr);
+ if(FAILED(hres))
+ return hres;
+
+ for(idx=start; idxctx, ei, IDS_NOT_FUNC, NULL);
case INVOKE_PROPERTYGET:
return array_join(dispex, lcid, ((ArrayInstance*)dispex)->length, default_separatorW, retv, ei, sp);
default:
@@ -716,23 +784,19 @@ static void Array_on_put(DispatchEx *dispex, const WCHAR *name)
}
static const builtin_prop_t Array_props[] = {
- {concatW, Array_concat, PROPF_METHOD},
- {hasOwnPropertyW, Array_hasOwnProperty, PROPF_METHOD},
- {isPrototypeOfW, Array_isPrototypeOf, PROPF_METHOD},
- {joinW, Array_join, PROPF_METHOD},
+ {concatW, Array_concat, PROPF_METHOD|1},
+ {joinW, Array_join, PROPF_METHOD|1},
{lengthW, Array_length, 0},
{popW, Array_pop, PROPF_METHOD},
- {propertyIsEnumerableW, Array_propertyIsEnumerable, PROPF_METHOD},
- {pushW, Array_push, PROPF_METHOD},
+ {pushW, Array_push, PROPF_METHOD|1},
{reverseW, Array_reverse, PROPF_METHOD},
{shiftW, Array_shift, PROPF_METHOD},
- {sliceW, Array_slice, PROPF_METHOD},
- {sortW, Array_sort, PROPF_METHOD},
- {spliceW, Array_splice, PROPF_METHOD},
+ {sliceW, Array_slice, PROPF_METHOD|2},
+ {sortW, Array_sort, PROPF_METHOD|1},
+ {spliceW, Array_splice, PROPF_METHOD|2},
{toLocaleStringW, Array_toLocaleString, PROPF_METHOD},
{toStringW, Array_toString, PROPF_METHOD},
- {unshiftW, Array_unshift, PROPF_METHOD},
- {valueOfW, Array_valueOf, PROPF_METHOD}
+ {unshiftW, Array_unshift, PROPF_METHOD|1},
};
static const builtin_info_t Array_info = {
@@ -755,12 +819,11 @@ static HRESULT ArrayConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISP
TRACE("\n");
switch(flags) {
+ case DISPATCH_METHOD:
case DISPATCH_CONSTRUCT: {
if(arg_cnt(dp) == 1 && V_VT((arg_var = get_arg(dp, 0))) == VT_I4) {
- if(V_I4(arg_var) < 0) {
- FIXME("throw RangeError\n");
- return E_FAIL;
- }
+ if(V_I4(arg_var) < 0)
+ return throw_range_error(dispex->ctx, ei, IDS_INVALID_LENGTH, NULL);
hres = create_array(dispex->ctx, V_I4(arg_var), &obj);
if(FAILED(hres))
@@ -797,7 +860,7 @@ static HRESULT ArrayConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISP
return S_OK;
}
-static HRESULT alloc_array(script_ctx_t *ctx, BOOL use_constr, ArrayInstance **ret)
+static HRESULT alloc_array(script_ctx_t *ctx, DispatchEx *object_prototype, ArrayInstance **ret)
{
ArrayInstance *array;
HRESULT hres;
@@ -806,10 +869,10 @@ static HRESULT alloc_array(script_ctx_t *ctx, BOOL use_constr, ArrayInstance **r
if(!array)
return E_OUTOFMEMORY;
- if(use_constr)
- hres = init_dispex_from_constr(&array->dispex, ctx, &Array_info, ctx->array_constr);
+ if(object_prototype)
+ hres = init_dispex(&array->dispex, ctx, &Array_info, object_prototype);
else
- hres = init_dispex(&array->dispex, ctx, &Array_info, NULL);
+ hres = init_dispex_from_constr(&array->dispex, ctx, &Array_info, ctx->object_constr);
if(FAILED(hres)) {
heap_free(array);
@@ -820,12 +883,12 @@ static HRESULT alloc_array(script_ctx_t *ctx, BOOL use_constr, ArrayInstance **r
return S_OK;
}
-HRESULT create_array_constr(script_ctx_t *ctx, DispatchEx **ret)
+HRESULT create_array_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
{
ArrayInstance *array;
HRESULT hres;
- hres = alloc_array(ctx, FALSE, &array);
+ hres = alloc_array(ctx, object_prototype, &array);
if(FAILED(hres))
return hres;
@@ -840,7 +903,7 @@ HRESULT create_array(script_ctx_t *ctx, DWORD length, DispatchEx **ret)
ArrayInstance *array;
HRESULT hres;
- hres = alloc_array(ctx, TRUE, &array);
+ hres = alloc_array(ctx, NULL, &array);
if(FAILED(hres))
return hres;
diff --git a/reactos/dll/win32/jscript/bool.c b/reactos/dll/win32/jscript/bool.c
index 7e3bf7ac738..336f7e9cec9 100644
--- a/reactos/dll/win32/jscript/bool.c
+++ b/reactos/dll/win32/jscript/bool.c
@@ -1,5 +1,6 @@
/*
* Copyright 2008 Jacek Caban for CodeWeavers
+ * Copyright 2009 Piotr Caban
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,67 +30,74 @@ typedef struct {
} BoolInstance;
static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
-static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0};
static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0};
-static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0};
-static const WCHAR propertyIsEnumerableW[] =
- {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0};
-static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0};
+/* ECMA-262 3rd Edition 15.6.4.2 */
static HRESULT Bool_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT Bool_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR trueW[] = {'t','r','u','e',0};
+ static const WCHAR falseW[] = {'f','a','l','s','e',0};
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_BOOLEAN))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_BOOL, NULL);
+
+ if(retv) {
+ BoolInstance *bool = (BoolInstance*)dispex;
+ BSTR val;
+
+ if(bool->val) val = SysAllocString(trueW);
+ else val = SysAllocString(falseW);
+
+ if(!val)
+ return E_OUTOFMEMORY;
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = val;
+ }
+
+ return S_OK;
}
+/* ECMA-262 3rd Edition 15.6.4.3 */
static HRESULT Bool_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
-}
+ TRACE("\n");
-static HRESULT Bool_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
+ if(!is_class(dispex, JSCLASS_BOOLEAN))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_BOOL, NULL);
-static HRESULT Bool_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
+ if(retv) {
+ BoolInstance *bool = (BoolInstance*)dispex;
-static HRESULT Bool_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
+ V_VT(retv) = VT_BOOL;
+ V_BOOL(retv) = bool->val;
+ }
+
+ return S_OK;
}
static HRESULT Bool_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ switch(flags) {
+ case INVOKE_FUNC:
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL);
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+
}
static const builtin_prop_t Bool_props[] = {
- {hasOwnPropertyW, Bool_hasOwnProperty, PROPF_METHOD},
- {isPrototypeOfW, Bool_isPrototypeOf, PROPF_METHOD},
- {propertyIsEnumerableW, Bool_propertyIsEnumerable, PROPF_METHOD},
- {toLocaleStringW, Bool_toLocaleString, PROPF_METHOD},
{toStringW, Bool_toString, PROPF_METHOD},
{valueOfW, Bool_valueOf, PROPF_METHOD}
};
@@ -106,11 +114,44 @@ static const builtin_info_t Bool_info = {
static HRESULT BoolConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ HRESULT hres;
+ VARIANT_BOOL value = VARIANT_FALSE;
+
+ if(arg_cnt(dp)) {
+ hres = to_boolean(get_arg(dp,0), &value);
+ if(FAILED(hres))
+ return hres;
+ }
+
+ switch(flags) {
+ case DISPATCH_CONSTRUCT: {
+ DispatchEx *bool;
+
+ hres = create_bool(dispex->ctx, value, &bool);
+ if(FAILED(hres))
+ return hres;
+
+ V_VT(retv) = VT_DISPATCH;
+ V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(bool);
+ return S_OK;
+ }
+
+ case INVOKE_FUNC:
+ if(retv) {
+ V_VT(retv) = VT_BOOL;
+ V_BOOL(retv) = value;
+ }
+ return S_OK;
+
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
}
-static HRESULT alloc_bool(script_ctx_t *ctx, BOOL use_constr, BoolInstance **ret)
+static HRESULT alloc_bool(script_ctx_t *ctx, DispatchEx *object_prototype, BoolInstance **ret)
{
BoolInstance *bool;
HRESULT hres;
@@ -119,10 +160,10 @@ static HRESULT alloc_bool(script_ctx_t *ctx, BOOL use_constr, BoolInstance **ret
if(!bool)
return E_OUTOFMEMORY;
- if(use_constr)
- hres = init_dispex_from_constr(&bool->dispex, ctx, &Bool_info, ctx->bool_constr);
+ if(object_prototype)
+ hres = init_dispex(&bool->dispex, ctx, &Bool_info, object_prototype);
else
- hres = init_dispex(&bool->dispex, ctx, &Bool_info, NULL);
+ hres = init_dispex_from_constr(&bool->dispex, ctx, &Bool_info, ctx->bool_constr);
if(FAILED(hres)) {
heap_free(bool);
@@ -133,12 +174,12 @@ static HRESULT alloc_bool(script_ctx_t *ctx, BOOL use_constr, BoolInstance **ret
return S_OK;
}
-HRESULT create_bool_constr(script_ctx_t *ctx, DispatchEx **ret)
+HRESULT create_bool_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
{
BoolInstance *bool;
HRESULT hres;
- hres = alloc_bool(ctx, FALSE, &bool);
+ hres = alloc_bool(ctx, object_prototype, &bool);
if(FAILED(hres))
return hres;
@@ -153,7 +194,7 @@ HRESULT create_bool(script_ctx_t *ctx, VARIANT_BOOL b, DispatchEx **ret)
BoolInstance *bool;
HRESULT hres;
- hres = alloc_bool(ctx, TRUE, &bool);
+ hres = alloc_bool(ctx, NULL, &bool);
if(FAILED(hres))
return hres;
diff --git a/reactos/dll/win32/jscript/date.c b/reactos/dll/win32/jscript/date.c
index 9dcc8a7391b..7c240cd1031 100644
--- a/reactos/dll/win32/jscript/date.c
+++ b/reactos/dll/win32/jscript/date.c
@@ -1,5 +1,6 @@
/*
* Copyright 2008 Jacek Caban for CodeWeavers
+ * Copyright 2009 Piotr Caban
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -16,6 +17,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "config.h"
+#include "wine/port.h"
+
#include
#include
@@ -43,7 +47,6 @@ typedef struct {
static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0};
-static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0};
static const WCHAR propertyIsEnumerableW[] =
{'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0};
static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0};
@@ -86,6 +89,7 @@ static const WCHAR setMonthW[] = {'s','e','t','M','o','n','t','h',0};
static const WCHAR setUTCMonthW[] = {'s','e','t','U','T','C','M','o','n','t','h',0};
static const WCHAR setFullYearW[] = {'s','e','t','F','u','l','l','Y','e','a','r',0};
static const WCHAR setUTCFullYearW[] = {'s','e','t','U','T','C','F','u','l','l','Y','e','a','r',0};
+static const WCHAR getYearW[] = {'g','e','t','Y','e','a','r',0};
static const WCHAR UTCW[] = {'U','T','C',0};
static const WCHAR parseW[] = {'p','a','r','s','e',0};
@@ -454,9 +458,7 @@ static SYSTEMTIME create_systemtime(DOUBLE time)
return st;
}
-/* ECMA-262 3rd Edition 15.9.1.2 */
-static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
+static inline HRESULT date_to_string(DOUBLE time, BOOL show_offset, int offset, VARIANT *retv)
{
static const WCHAR NaNW[] = { 'N','a','N',0 };
static const WCHAR formatW[] = { '%','s',' ','%','s',' ','%','d',' ',
@@ -465,6 +467,9 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
static const WCHAR formatUTCW[] = { '%','s',' ','%','s',' ','%','d',' ',
'%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ',
'U','T','C',' ','%','d','%','s',0 };
+ static const WCHAR formatNoOffsetW[] = { '%','s',' ','%','s',' ',
+ '%','d',' ','%','0','2','d',':','%','0','2','d',':',
+ '%','0','2','d',' ','%','d','%','s',0 };
static const WCHAR ADW[] = { 0 };
static const WCHAR BCW[] = { ' ','B','.','C','.',0 };
@@ -480,23 +485,12 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
BOOL formatAD = TRUE;
BSTR week, month;
- DateInstance *date;
BSTR date_str;
- DOUBLE time;
- int len, size, year, day, offset;
+ int len, size, year, day;
DWORD lcid_en, week_id, month_id;
WCHAR sign = '-';
- TRACE("\n");
-
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
-
- date = (DateInstance*)dispex;
-
- if(isnan(date->time)) {
+ if(isnan(time)) {
if(retv) {
V_VT(retv) = VT_BSTR;
V_BSTR(retv) = SysAllocString(NaNW);
@@ -506,8 +500,6 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
return S_OK;
}
- time = local_time(date->time, date);
-
if(retv) {
len = 21;
@@ -553,10 +545,8 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
} while(day);
day = date_from_time(time);
- offset = date->bias +
- daylight_saving_ta(time, date);
-
- if(offset == 0) len -= 5;
+ if(!show_offset) len -= 9;
+ else if(offset == 0) len -= 5;
else if(offset < 0) {
sign = '+';
offset = -offset;
@@ -569,15 +559,19 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
return E_OUTOFMEMORY;
}
- if(offset)
+ if(!show_offset)
+ sprintfW(date_str, formatNoOffsetW, week, month, day,
+ (int)hour_from_time(time), (int)min_from_time(time),
+ (int)sec_from_time(time), year, formatAD?ADW:BCW);
+ else if(offset)
sprintfW(date_str, formatW, week, month, day,
(int)hour_from_time(time), (int)min_from_time(time),
(int)sec_from_time(time), sign, offset/60, offset%60,
year, formatAD?ADW:BCW);
else
sprintfW(date_str, formatUTCW, week, month, day,
- (int)hour_from_time(time), (int)min_from_time(time),
- (int)sec_from_time(time), year, formatAD?ADW:BCW);
+ (int)hour_from_time(time), (int)min_from_time(time),
+ (int)sec_from_time(time), year, formatAD?ADW:BCW);
SysFreeString(week);
SysFreeString(month);
@@ -588,6 +582,27 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
return S_OK;
}
+/* ECMA-262 3rd Edition 15.9.1.2 */
+static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
+{
+ DateInstance *date;
+ DOUBLE time;
+ int offset;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
+
+ date = (DateInstance*)dispex;
+ time = local_time(date->time, date);
+ offset = date->bias +
+ daylight_saving_ta(time, date);
+
+ return date_to_string(time, TRUE, offset, retv);
+}
+
/* ECMA-262 3rd Edition 15.9.1.5 */
static HRESULT Date_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
@@ -600,10 +615,8 @@ static HRESULT Date_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DI
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
date = (DateInstance*)dispex;
@@ -638,32 +651,19 @@ static HRESULT Date_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DI
return S_OK;
}
-static HRESULT Date_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT Date_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT Date_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
static HRESULT Date_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
+
+ if(retv) {
+ DateInstance *date = (DateInstance*)dispex;
+ num_set_val(retv, date->time);
+ }
+ return S_OK;
}
/* ECMA-262 3rd Edition 15.9.5.42 */
@@ -695,10 +695,8 @@ static HRESULT Date_toUTCString(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
date = (DateInstance*)dispex;
@@ -804,10 +802,8 @@ static HRESULT Date_toDateString(DispatchEx *dispex, LCID lcid, WORD flags, DISP
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
date = (DateInstance*)dispex;
@@ -902,10 +898,8 @@ static HRESULT Date_toTimeString(DispatchEx *dispex, LCID lcid, WORD flags, DISP
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
date = (DateInstance*)dispex;
@@ -961,10 +955,8 @@ static HRESULT Date_toLocaleDateString(DispatchEx *dispex, LCID lcid, WORD flags
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
date = (DateInstance*)dispex;
@@ -1008,10 +1000,8 @@ static HRESULT Date_toLocaleTimeString(DispatchEx *dispex, LCID lcid, WORD flags
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
date = (DateInstance*)dispex;
@@ -1049,10 +1039,8 @@ static HRESULT Date_getTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1067,10 +1055,8 @@ static HRESULT Date_getFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1087,10 +1073,8 @@ static HRESULT Date_getUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DI
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1105,10 +1089,8 @@ static HRESULT Date_getMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1125,10 +1107,8 @@ static HRESULT Date_getUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1143,10 +1123,8 @@ static HRESULT Date_getDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1163,10 +1141,8 @@ static HRESULT Date_getUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1181,10 +1157,8 @@ static HRESULT Date_getDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1201,10 +1175,8 @@ static HRESULT Date_getUTCDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1219,10 +1191,8 @@ static HRESULT Date_getHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1239,10 +1209,8 @@ static HRESULT Date_getUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1257,10 +1225,8 @@ static HRESULT Date_getMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1277,10 +1243,8 @@ static HRESULT Date_getUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DIS
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1295,10 +1259,8 @@ static HRESULT Date_getSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1315,10 +1277,8 @@ static HRESULT Date_getUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DIS
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1333,10 +1293,8 @@ static HRESULT Date_getMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, D
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1353,10 +1311,8 @@ static HRESULT Date_getUTCMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1371,10 +1327,8 @@ static HRESULT Date_getTimezoneOffset(DispatchEx *dispex, LCID lcid, WORD flags,
{
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
if(retv) {
DateInstance *date = (DateInstance*)dispex;
@@ -1394,16 +1348,11 @@ static HRESULT Date_setTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
if(FAILED(hres))
@@ -1429,16 +1378,11 @@ static HRESULT Date_setMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, D
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
if(FAILED(hres))
@@ -1467,16 +1411,11 @@ static HRESULT Date_setUTCMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
if(FAILED(hres))
@@ -1505,16 +1444,11 @@ static HRESULT Date_setSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
date = (DateInstance*)dispex;
t = local_time(date->time, date);
@@ -1553,16 +1487,11 @@ static HRESULT Date_setUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DIS
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
date = (DateInstance*)dispex;
t = date->time;
@@ -1601,16 +1530,11 @@ static HRESULT Date_setMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
date = (DateInstance*)dispex;
t = local_time(date->time, date);
@@ -1657,16 +1581,11 @@ static HRESULT Date_setUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DIS
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
date = (DateInstance*)dispex;
t = date->time;
@@ -1713,16 +1632,11 @@ static HRESULT Date_setHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
date = (DateInstance*)dispex;
t = local_time(date->time, date);
@@ -1776,16 +1690,11 @@ static HRESULT Date_setUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
date = (DateInstance*)dispex;
t = date->time;
@@ -1839,16 +1748,11 @@ static HRESULT Date_setDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
if(FAILED(hres))
@@ -1877,16 +1781,11 @@ static HRESULT Date_setUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v);
if(FAILED(hres))
@@ -1915,16 +1814,11 @@ static HRESULT Date_setMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
date = (DateInstance*)dispex;
t = local_time(date->time, date);
@@ -1963,16 +1857,11 @@ static HRESULT Date_setUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
date = (DateInstance*)dispex;
t = date->time;
@@ -2011,16 +1900,11 @@ static HRESULT Date_setFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
date = (DateInstance*)dispex;
t = local_time(date->time, date);
@@ -2066,16 +1950,11 @@ static HRESULT Date_setUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DI
TRACE("\n");
- if(!is_class(dispex, JSCLASS_DATE)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
- if(!arg_cnt(dp)) {
- FIXME("throw ArgumentNotOptional\n");
- if(retv) num_set_nan(retv);
- return S_OK;
- }
+ if(!arg_cnt(dp))
+ return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL);
date = (DateInstance*)dispex;
t = date->time;
@@ -2110,11 +1989,49 @@ static HRESULT Date_setUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DI
return S_OK;
}
+/* ECMA-262 3rd Edition B2.4 */
+static HRESULT Date_getYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
+{
+ DateInstance *date;
+ DOUBLE t, year;
+
+ TRACE("\n");
+
+ if(!is_class(dispex, JSCLASS_DATE))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL);
+
+ date = (DateInstance*)dispex;
+ t = local_time(date->time, date);
+
+
+ if(isnan(t)) {
+ if(retv)
+ num_set_nan(retv);
+ return S_OK;
+ }
+
+ year = year_from_time(t);
+ if(retv)
+ num_set_val(retv, (1900<=year && year<2000)?year-1900:year);
+
+ return S_OK;
+}
+
static HRESULT Date_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ switch(flags) {
+ case INVOKE_FUNC:
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL);
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
}
static const builtin_prop_t Date_props[] = {
@@ -2136,24 +2053,22 @@ static const builtin_prop_t Date_props[] = {
{getUTCMinutesW, Date_getUTCMinutes, PROPF_METHOD},
{getUTCMonthW, Date_getUTCMonth, PROPF_METHOD},
{getUTCSecondsW, Date_getUTCSeconds, PROPF_METHOD},
- {hasOwnPropertyW, Date_hasOwnProperty, PROPF_METHOD},
- {isPrototypeOfW, Date_isPrototypeOf, PROPF_METHOD},
- {propertyIsEnumerableW, Date_propertyIsEnumerable, PROPF_METHOD},
- {setDateW, Date_setDate, PROPF_METHOD},
- {setFullYearW, Date_setFullYear, PROPF_METHOD},
- {setHoursW, Date_setHours, PROPF_METHOD},
- {setMillisecondsW, Date_setMilliseconds, PROPF_METHOD},
- {setMinutesW, Date_setMinutes, PROPF_METHOD},
- {setMonthW, Date_setMonth, PROPF_METHOD},
- {setSecondsW, Date_setSeconds, PROPF_METHOD},
- {setTimeW, Date_setTime, PROPF_METHOD},
- {setUTCDateW, Date_setUTCDate, PROPF_METHOD},
- {setUTCFullYearW, Date_setUTCFullYear, PROPF_METHOD},
- {setUTCHoursW, Date_setUTCHours, PROPF_METHOD},
- {setUTCMillisecondsW, Date_setUTCMilliseconds, PROPF_METHOD},
- {setUTCMinutesW, Date_setUTCMinutes, PROPF_METHOD},
- {setUTCMonthW, Date_setUTCMonth, PROPF_METHOD},
- {setUTCSecondsW, Date_setUTCSeconds, PROPF_METHOD},
+ {getYearW, Date_getYear, PROPF_METHOD},
+ {setDateW, Date_setDate, PROPF_METHOD|1},
+ {setFullYearW, Date_setFullYear, PROPF_METHOD|3},
+ {setHoursW, Date_setHours, PROPF_METHOD|4},
+ {setMillisecondsW, Date_setMilliseconds, PROPF_METHOD|1},
+ {setMinutesW, Date_setMinutes, PROPF_METHOD|3},
+ {setMonthW, Date_setMonth, PROPF_METHOD|2},
+ {setSecondsW, Date_setSeconds, PROPF_METHOD|2},
+ {setTimeW, Date_setTime, PROPF_METHOD|1},
+ {setUTCDateW, Date_setUTCDate, PROPF_METHOD|1},
+ {setUTCFullYearW, Date_setUTCFullYear, PROPF_METHOD|3},
+ {setUTCHoursW, Date_setUTCHours, PROPF_METHOD|4},
+ {setUTCMillisecondsW, Date_setUTCMilliseconds, PROPF_METHOD|1},
+ {setUTCMinutesW, Date_setUTCMinutes, PROPF_METHOD|3},
+ {setUTCMonthW, Date_setUTCMonth, PROPF_METHOD|2},
+ {setUTCSecondsW, Date_setUTCSeconds, PROPF_METHOD|2},
{toDateStringW, Date_toDateString, PROPF_METHOD},
{toLocaleDateStringW, Date_toLocaleDateString, PROPF_METHOD},
{toLocaleStringW, Date_toLocaleString, PROPF_METHOD},
@@ -2173,7 +2088,7 @@ static const builtin_info_t Date_info = {
NULL
};
-static HRESULT create_date(script_ctx_t *ctx, BOOL use_constr, DOUBLE time, DispatchEx **ret)
+static HRESULT create_date(script_ctx_t *ctx, DispatchEx *object_prototype, DOUBLE time, DispatchEx **ret)
{
DateInstance *date;
HRESULT hres;
@@ -2185,10 +2100,10 @@ static HRESULT create_date(script_ctx_t *ctx, BOOL use_constr, DOUBLE time, Disp
if(!date)
return E_OUTOFMEMORY;
- if(use_constr)
- hres = init_dispex_from_constr(&date->dispex, ctx, &Date_info, ctx->date_constr);
+ if(object_prototype)
+ hres = init_dispex(&date->dispex, ctx, &Date_info, object_prototype);
else
- hres = init_dispex(&date->dispex, ctx, &Date_info, NULL);
+ hres = init_dispex_from_constr(&date->dispex, ctx, &Date_info, ctx->date_constr);
if(FAILED(hres)) {
heap_free(date);
return hres;
@@ -2205,11 +2120,288 @@ static HRESULT create_date(script_ctx_t *ctx, BOOL use_constr, DOUBLE time, Disp
return S_OK;
}
+static inline HRESULT date_parse(BSTR input, VARIANT *retv) {
+ static const DWORD string_ids[] = { LOCALE_SMONTHNAME12, LOCALE_SMONTHNAME11,
+ LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME9, LOCALE_SMONTHNAME8,
+ LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME6, LOCALE_SMONTHNAME5,
+ LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME3, LOCALE_SMONTHNAME2,
+ LOCALE_SMONTHNAME1, LOCALE_SDAYNAME7, LOCALE_SDAYNAME1,
+ LOCALE_SDAYNAME2, LOCALE_SDAYNAME3, LOCALE_SDAYNAME4,
+ LOCALE_SDAYNAME5, LOCALE_SDAYNAME6 };
+ BSTR strings[sizeof(string_ids)/sizeof(DWORD)];
+
+ BSTR parse;
+ int input_len, parse_len = 0, nest_level = 0, i, size;
+ int year = 0, month = 0, day = 0, hour = 0, min = 0, sec = 0;
+ int ms = 0, offset = 0, hour_adjust = 0;
+ BOOL set_year = FALSE, set_month = FALSE, set_day = FALSE, set_hour = FALSE;
+ BOOL set_offset = FALSE, set_era = FALSE, ad = TRUE, set_am = FALSE, am = TRUE;
+ BOOL set_hour_adjust = TRUE;
+ TIME_ZONE_INFORMATION tzi;
+ DateInstance di;
+ DWORD lcid_en;
+
+ if(retv) num_set_nan(retv);
+
+ input_len = SysStringLen(input);
+ for(i=0; i= 0)
+ SysFreeString(strings[i]);
+ SysFreeString(parse);
+ return E_OUTOFMEMORY;
+ }
+ GetLocaleInfoW(lcid_en, string_ids[i], strings[i], size);
+ }
+
+ for(i=0; i='0' && parse[i]<='9') {
+ int tmp = atoiW(&parse[i]);
+ while(parse[i]>='0' && parse[i]<='9') i++;
+ while(isspaceW(parse[i])) i++;
+
+ if(parse[i] == ':') {
+ /* Time */
+ if(set_hour) break;
+ set_hour = TRUE;
+
+ hour = tmp;
+
+ while(parse[i] == ':') i++;
+ while(isspaceW(parse[i])) i++;
+ if(parse[i]>='0' && parse[i]<='9') {
+ min = atoiW(&parse[i]);
+ while(parse[i]>='0' && parse[i]<='9') i++;
+ }
+
+ while(isspaceW(parse[i])) i++;
+ while(parse[i] == ':') i++;
+ while(isspaceW(parse[i])) i++;
+ if(parse[i]>='0' && parse[i]<='9') {
+ sec = atoiW(&parse[i]);
+ while(parse[i]>='0' && parse[i]<='9') i++;
+ }
+ }
+ else if(parse[i]=='-' || parse[i]=='/') {
+ /* Short date */
+ if(set_day || set_month || set_year) break;
+ set_day = TRUE;
+ set_month = TRUE;
+ set_year = TRUE;
+
+ month = tmp-1;
+
+ while(isspaceW(parse[i])) i++;
+ while(parse[i]=='-' || parse[i]=='/') i++;
+ while(isspaceW(parse[i])) i++;
+ if(parse[i]<'0' || parse[i]>'9') break;
+ day = atoiW(&parse[i]);
+ while(parse[i]>='0' && parse[i]<='9') i++;
+
+ while(parse[i]=='-' || parse[i]=='/') i++;
+ while(isspaceW(parse[i])) i++;
+ if(parse[i]<'0' || parse[i]>'9') break;
+ year = atoiW(&parse[i]);
+ while(parse[i]>='0' && parse[i]<='9') i++;
+ }
+ else if(tmp<0) break;
+ else if(tmp<70) {
+ /* Day */
+ if(set_day) break;
+ set_day = TRUE;
+ day = tmp;
+ }
+ else {
+ /* Year */
+ if(set_year) break;
+ set_year = TRUE;
+ year = tmp;
+ }
+ }
+ else {
+ if(parse[i]<'A' || parse[i]>'Z') break;
+ else if(parse[i]=='B' && (parse[i+1]=='C' ||
+ (parse[i+1]=='.' && parse[i+2]=='C'))) {
+ /* AD/BC */
+ if(set_era) break;
+ set_era = TRUE;
+ ad = FALSE;
+
+ i++;
+ if(parse[i] == '.') i++;
+ i++;
+ if(parse[i] == '.') i++;
+ }
+ else if(parse[i]=='A' && (parse[i+1]=='D' ||
+ (parse[i+1]=='.' && parse[i+2]=='D'))) {
+ /* AD/BC */
+ if(set_era) break;
+ set_era = TRUE;
+
+ i++;
+ if(parse[i] == '.') i++;
+ i++;
+ if(parse[i] == '.') i++;
+ }
+ else if(parse[i+1]<'A' || parse[i+1]>'Z') {
+ /* Timezone */
+ if(set_offset) break;
+ set_offset = TRUE;
+
+ if(parse[i] <= 'I') hour_adjust = parse[i]-'A'+2;
+ else if(parse[i] == 'J') break;
+ else if(parse[i] <= 'M') hour_adjust = parse[i]-'K'+11;
+ else if(parse[i] <= 'Y') hour_adjust = parse[i]-'N';
+ else hour_adjust = 1;
+
+ i++;
+ if(parse[i] == '.') i++;
+ }
+ else if(parse[i]=='A' && parse[i+1]=='M') {
+ /* AM/PM */
+ if(set_am) break;
+ set_am = TRUE;
+ am = TRUE;
+ i += 2;
+ }
+ else if(parse[i]=='P' && parse[i+1]=='M') {
+ /* AM/PM */
+ if(set_am) break;
+ set_am = TRUE;
+ am = FALSE;
+ i += 2;
+ }
+ else if((parse[i]=='U' && parse[i+1]=='T' && parse[i+2]=='C')
+ || (parse[i]=='G' && parse[i+1]=='M' && parse[i+2]=='T')) {
+ /* Timezone */
+ BOOL positive = TRUE;
+
+ if(set_offset) break;
+ set_offset = TRUE;
+ set_hour_adjust = FALSE;
+
+ i += 3;
+ while(isspaceW(parse[i])) i++;
+ if(parse[i] == '-') positive = FALSE;
+ else if(parse[i] != '+') continue;
+
+ i++;
+ while(isspaceW(parse[i])) i++;
+ if(parse[i]<'0' || parse[i]>'9') break;
+ offset = atoiW(&parse[i]);
+ while(parse[i]>='0' && parse[i]<='9') i++;
+
+ if(offset<24) offset *= 60;
+ else offset = (offset/100)*60 + offset%100;
+
+ if(positive) offset = -offset;
+ }
+ else {
+ /* Month or garbage */
+ int j;
+
+ for(size=i; parse[size]>='A' && parse[size]<='Z'; size++);
+ size -= i;
+
+ for(j=0; jctx, get_arg(dp,0), ei, &parse_str);
+ if(FAILED(hres))
+ return hres;
+
+ hres = date_parse(parse_str, retv);
+
+ SysFreeString(parse_str);
+ return hres;
}
static HRESULT DateConstr_UTC(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
@@ -2323,7 +2515,7 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
lltime = ((LONGLONG)time.dwHighDateTime<<32)
+ time.dwLowDateTime;
- hres = create_date(dispex->ctx, TRUE, lltime/10000-TIME_EPOCH, &date);
+ hres = create_date(dispex->ctx, NULL, lltime/10000-TIME_EPOCH, &date);
if(FAILED(hres))
return hres;
break;
@@ -2333,21 +2525,20 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
case 1: {
VARIANT prim, num;
- hres = to_primitive(dispex->ctx, get_arg(dp,0), ei, &prim);
+ hres = to_primitive(dispex->ctx, get_arg(dp,0), ei, &prim, NO_HINT);
if(FAILED(hres))
return hres;
- if(V_VT(&prim) == VT_BSTR) {
- FIXME("VT_BSTR not supported\n");
- return E_NOTIMPL;
- }
+ if(V_VT(&prim) == VT_BSTR)
+ hres = date_parse(V_BSTR(&prim), &num);
+ else
+ hres = to_number(dispex->ctx, &prim, ei, &num);
- hres = to_number(dispex->ctx, &prim, ei, &num);
VariantClear(&prim);
if(FAILED(hres))
return hres;
- hres = create_date(dispex->ctx, TRUE, time_clip(num_val(&num)), &date);
+ hres = create_date(dispex->ctx, NULL, time_clip(num_val(&num)), &date);
if(FAILED(hres))
return hres;
break;
@@ -2360,7 +2551,7 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
DateConstr_UTC(dispex, lcid, flags, dp, &ret_date, ei, sp);
- hres = create_date(dispex->ctx, TRUE, num_val(&ret_date), &date);
+ hres = create_date(dispex->ctx, NULL, num_val(&ret_date), &date);
if(FAILED(hres))
return hres;
@@ -2373,6 +2564,18 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(date);
return S_OK;
+ case INVOKE_FUNC: {
+ FILETIME system_time, local_time;
+ LONGLONG lltime;
+
+ GetSystemTimeAsFileTime(&system_time);
+ FileTimeToLocalFileTime(&system_time, &local_time);
+ lltime = ((LONGLONG)local_time.dwHighDateTime<<32)
+ + local_time.dwLowDateTime;
+
+ return date_to_string(lltime/10000-TIME_EPOCH, FALSE, 0, retv);
+ }
+
default:
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
@@ -2395,12 +2598,12 @@ static const builtin_info_t DateConstr_info = {
NULL
};
-HRESULT create_date_constr(script_ctx_t *ctx, DispatchEx **ret)
+HRESULT create_date_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
{
DispatchEx *date;
HRESULT hres;
- hres = create_date(ctx, FALSE, 0.0, &date);
+ hres = create_date(ctx, object_prototype, 0.0, &date);
if(FAILED(hres))
return hres;
diff --git a/reactos/dll/win32/jscript/dispex.c b/reactos/dll/win32/jscript/dispex.c
index a387ecdbff6..12fcb3a161a 100644
--- a/reactos/dll/win32/jscript/dispex.c
+++ b/reactos/dll/win32/jscript/dispex.c
@@ -828,7 +828,7 @@ HRESULT jsdisp_call_value(DispatchEx *disp, LCID lcid, WORD flags, DISPPARAMS *d
return disp->builtin_info->value_prop.invoke(disp, lcid, flags, dp, retv, ei, caller);
}
-static HRESULT jsdisp_call(DispatchEx *disp, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv,
+HRESULT jsdisp_call(DispatchEx *disp, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv,
jsexcept_t *ei, IServiceProvider *caller)
{
dispex_prop_t *prop;
@@ -844,6 +844,23 @@ static HRESULT jsdisp_call(DispatchEx *disp, DISPID id, LCID lcid, WORD flags, D
return invoke_prop_func(disp, disp, prop, lcid, flags, dp, retv, ei, caller);
}
+HRESULT jsdisp_call_name(DispatchEx *disp, const WCHAR *name, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv,
+ jsexcept_t *ei, IServiceProvider *caller)
+{
+ dispex_prop_t *prop;
+ HRESULT hres;
+
+ hres = find_prop_name_prot(disp, name, TRUE, &prop);
+ if(FAILED(hres))
+ return hres;
+
+ memset(ei, 0, sizeof(*ei));
+ if(retv)
+ V_VT(retv) = VT_EMPTY;
+
+ return invoke_prop_func(disp, disp, prop, lcid, flags, dp, retv, ei, caller);
+}
+
HRESULT disp_call(IDispatch *disp, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv,
jsexcept_t *ei, IServiceProvider *caller)
{
@@ -1010,3 +1027,19 @@ HRESULT disp_propget(IDispatch *disp, DISPID id, LCID lcid, VARIANT *val, jsexce
return hres;
}
+
+HRESULT jsdisp_delete_idx(DispatchEx *obj, DWORD idx)
+{
+ static const WCHAR formatW[] = {'%','d',0};
+ WCHAR buf[12];
+ dispex_prop_t *prop;
+ HRESULT hres;
+
+ sprintfW(buf, formatW, idx);
+
+ hres = find_prop_name(obj, buf, &prop);
+ if(FAILED(hres) || !prop)
+ return hres;
+
+ return delete_prop(prop);
+}
diff --git a/reactos/dll/win32/jscript/engine.c b/reactos/dll/win32/jscript/engine.c
index 05c6225daae..2f884b2cdb9 100644
--- a/reactos/dll/win32/jscript/engine.c
+++ b/reactos/dll/win32/jscript/engine.c
@@ -179,6 +179,8 @@ HRESULT create_exec_ctx(IDispatch *this_obj, DispatchEx *var_disp, scope_chain_t
if(!ctx)
return E_OUTOFMEMORY;
+ ctx->ref = 1;
+
IDispatch_AddRef(this_obj);
ctx->this_obj = this_obj;
@@ -230,10 +232,8 @@ static HRESULT disp_get_id(IDispatch *disp, BSTR name, DWORD flags, DISPID *id)
/* ECMA-262 3rd Edition 8.7.2 */
static HRESULT put_value(script_ctx_t *ctx, exprval_t *ref, VARIANT *v, jsexcept_t *ei)
{
- if(ref->type != EXPRVAL_IDREF) {
- FIXME("throw ReferemceError\n");
- return E_FAIL;
- }
+ if(ref->type != EXPRVAL_IDREF)
+ return throw_reference_error(ctx, ei, IDS_ILLEGAL_ASSIGN, NULL);
return disp_propput(ref->u.idref.disp, ref->u.idref.id, ctx->lcid, v, ei, NULL/*FIXME*/);
}
@@ -304,7 +304,12 @@ static HRESULT equal2_values(VARIANT *lval, VARIANT *rval, BOOL *ret)
*ret = V_R8(lval) == V_R8(rval);
break;
case VT_BSTR:
- *ret = !strcmpW(V_BSTR(lval), V_BSTR(rval));
+ if(!V_BSTR(lval))
+ *ret = SysStringLen(V_BSTR(rval))?FALSE:TRUE;
+ else if(!V_BSTR(rval))
+ *ret = SysStringLen(V_BSTR(lval))?FALSE:TRUE;
+ else
+ *ret = !strcmpW(V_BSTR(lval), V_BSTR(rval));
break;
case VT_DISPATCH:
return disp_cmp(V_DISPATCH(lval), V_DISPATCH(rval), ret);
@@ -351,6 +356,26 @@ static HRESULT literal_to_var(literal_t *literal, VARIANT *v)
return S_OK;
}
+static BOOL lookup_global_members(script_ctx_t *ctx, BSTR identifier, exprval_t *ret)
+{
+ named_item_t *item;
+ DISPID id;
+ HRESULT hres;
+
+ for(item = ctx->named_items; item; item = item->next) {
+ if(item->flags & SCRIPTITEM_GLOBALMEMBERS) {
+ hres = disp_get_id(item->disp, identifier, 0, &id);
+ if(SUCCEEDED(hres)) {
+ if(ret)
+ exprval_set_idref(ret, item->disp, id);
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *source, jsexcept_t *ei, VARIANT *retv)
{
script_ctx_t *script = parser->script;
@@ -382,8 +407,15 @@ HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *so
for(var = source->variables; var; var = var->next) {
DISPID id = 0;
+ BSTR name;
- hres = jsdisp_get_id(ctx->var_disp, var->identifier, fdexNameEnsure, &id);
+ name = SysAllocString(var->identifier);
+ if(!name)
+ return E_OUTOFMEMORY;
+
+ if(!lookup_global_members(parser->script, name, NULL))
+ hres = jsdisp_get_id(ctx->var_disp, var->identifier, fdexNameEnsure, &id);
+ SysFreeString(name);
if(FAILED(hres))
return hres;
}
@@ -431,7 +463,7 @@ HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *so
}
/* ECMA-262 3rd Edition 10.1.4 */
-static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, exprval_t *ret)
+static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, jsexcept_t *ei, exprval_t *ret)
{
scope_chain_t *scope;
named_item_t *item;
@@ -488,25 +520,15 @@ static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, ex
}
}
- for(item = ctx->parser->script->named_items; item; item = item->next) {
- if(item->flags & SCRIPTITEM_GLOBALMEMBERS) {
- hres = disp_get_id(item->disp, identifier, 0, &id);
- if(SUCCEEDED(hres))
- break;
- }
- }
-
- if(item) {
- exprval_set_idref(ret, item->disp, id);
- return S_OK;
- }
-
hres = jsdisp_get_id(ctx->parser->script->script_disp, identifier, 0, &id);
if(SUCCEEDED(hres)) {
exprval_set_idref(ret, (IDispatch*)_IDispatchEx_(ctx->parser->script->script_disp), id);
return S_OK;
}
+ if(lookup_global_members(ctx->parser->script, identifier, ret))
+ return S_OK;
+
if(flags & EXPR_NEWREF) {
hres = jsdisp_get_id(ctx->var_disp, identifier, fdexNameEnsure, &id);
if(FAILED(hres))
@@ -516,8 +538,7 @@ static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, ex
return S_OK;
}
- WARN("Could not find identifier %s\n", debugstr_w(identifier));
- return E_FAIL;
+ return throw_type_error(ctx->var_disp->ctx, ei, IDS_UNDEFINED, identifier);
}
/* ECMA-262 3rd Edition 12.1 */
@@ -853,7 +874,7 @@ HRESULT forin_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t
TRACE("iter %s\n", debugstr_w(str));
if(stat->variable)
- hres = identifier_eval(ctx, identifier, 0, &exprval);
+ hres = identifier_eval(ctx, identifier, 0, NULL, &exprval);
else
hres = expr_eval(ctx, stat->expr, EXPR_NEWREF, &rt->ei, &exprval);
if(SUCCEEDED(hres)) {
@@ -1536,11 +1557,16 @@ HRESULT call_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags,
hres = args_to_param(ctx, expr->argument_list, ei, &dp);
if(SUCCEEDED(hres)) {
switch(exprval.type) {
+ case EXPRVAL_VARIANT:
+ if(V_VT(&exprval.u.var) != VT_DISPATCH)
+ return throw_type_error(ctx->var_disp->ctx, ei, IDS_NO_PROPERTY, NULL);
+
+ hres = disp_call(V_DISPATCH(&exprval.u.var), DISPID_VALUE, ctx->parser->script->lcid,
+ DISPATCH_METHOD, &dp, flags & EXPR_NOVAL ? NULL : &var, ei, NULL/*FIXME*/);
+ break;
case EXPRVAL_IDREF:
- hres = disp_call(exprval.u.idref.disp, exprval.u.idref.id, ctx->parser->script->lcid, DISPATCH_METHOD,
- &dp, flags & EXPR_NOVAL ? NULL : &var, ei, NULL/*FIXME*/);
- if(flags & EXPR_NOVAL)
- V_VT(&var) = VT_EMPTY;
+ hres = disp_call(exprval.u.idref.disp, exprval.u.idref.id, ctx->parser->script->lcid,
+ DISPATCH_METHOD, &dp, flags & EXPR_NOVAL ? NULL : &var, ei, NULL/*FIXME*/);
break;
default:
FIXME("unimplemented type %d\n", exprval.type);
@@ -1554,9 +1580,13 @@ HRESULT call_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags,
if(FAILED(hres))
return hres;
- TRACE("= %s\n", debugstr_variant(&var));
ret->type = EXPRVAL_VARIANT;
- ret->u.var = var;
+ if(flags & EXPR_NOVAL) {
+ V_VT(&ret->u.var) = VT_EMPTY;
+ }else {
+ TRACE("= %s\n", debugstr_variant(&var));
+ ret->u.var = var;
+ }
return S_OK;
}
@@ -1585,7 +1615,7 @@ HRESULT identifier_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD f
if(!identifier)
return E_OUTOFMEMORY;
- hres = identifier_eval(ctx, identifier, flags, ret);
+ hres = identifier_eval(ctx, identifier, flags, ei, ret);
SysFreeString(identifier);
return hres;
@@ -1931,11 +1961,11 @@ static HRESULT add_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_
VARIANT r, l;
HRESULT hres;
- hres = to_primitive(ctx->parser->script, lval, ei, &l);
+ hres = to_primitive(ctx->parser->script, lval, ei, &l, NO_HINT);
if(FAILED(hres))
return hres;
- hres = to_primitive(ctx->parser->script, rval, ei, &r);
+ hres = to_primitive(ctx->parser->script, rval, ei, &r, NO_HINT);
if(FAILED(hres)) {
VariantClear(&l);
return hres;
@@ -2518,7 +2548,7 @@ static HRESULT equal_values(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexc
VARIANT v;
HRESULT hres;
- hres = to_primitive(ctx->parser->script, rval, ei, &v);
+ hres = to_primitive(ctx->parser->script, rval, ei, &v, NO_HINT);
if(FAILED(hres))
return hres;
@@ -2533,7 +2563,7 @@ static HRESULT equal_values(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexc
VARIANT v;
HRESULT hres;
- hres = to_primitive(ctx->parser->script, lval, ei, &v);
+ hres = to_primitive(ctx->parser->script, lval, ei, &v, NO_HINT);
if(FAILED(hres))
return hres;
@@ -2638,11 +2668,11 @@ static HRESULT less_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, BOOL gre
VARIANT l, r, ln, rn;
HRESULT hres;
- hres = to_primitive(ctx->parser->script, lval, ei, &l);
+ hres = to_primitive(ctx->parser->script, lval, ei, &l, NO_HINT);
if(FAILED(hres))
return hres;
- hres = to_primitive(ctx->parser->script, rval, ei, &r);
+ hres = to_primitive(ctx->parser->script, rval, ei, &r, NO_HINT);
if(FAILED(hres)) {
VariantClear(&l);
return hres;
diff --git a/reactos/dll/win32/jscript/engine.h b/reactos/dll/win32/jscript/engine.h
index f1a78ecf15d..8d53f003459 100644
--- a/reactos/dll/win32/jscript/engine.h
+++ b/reactos/dll/win32/jscript/engine.h
@@ -56,6 +56,7 @@ typedef struct _parser_ctx_t {
source_elements_t *source;
BOOL nl;
BOOL is_html;
+ BOOL lexer_error;
HRESULT hres;
jsheap_t heap;
diff --git a/reactos/dll/win32/jscript/error.c b/reactos/dll/win32/jscript/error.c
new file mode 100644
index 00000000000..70fd008781b
--- /dev/null
+++ b/reactos/dll/win32/jscript/error.c
@@ -0,0 +1,449 @@
+/*
+ * Copyright 2009 Piotr Caban
+ *
+ * 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 "wine/port.h"
+
+#include
+
+#include "jscript.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(jscript);
+
+typedef struct {
+ DispatchEx dispex;
+
+ VARIANT number;
+ VARIANT description;
+ VARIANT message;
+} ErrorInstance;
+
+static const WCHAR descriptionW[] = {'d','e','s','c','r','i','p','t','i','o','n',0};
+static const WCHAR messageW[] = {'m','e','s','s','a','g','e',0};
+static const WCHAR numberW[] = {'n','u','m','b','e','r',0};
+static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
+
+static HRESULT Error_number(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ ErrorInstance *This = (ErrorInstance*)dispex;
+
+ TRACE("\n");
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET:
+ return VariantCopy(retv, &This->number);
+ case DISPATCH_PROPERTYPUT:
+ return VariantCopy(&This->number, get_arg(dp, 0));
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+}
+
+static HRESULT Error_description(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ ErrorInstance *This = (ErrorInstance*)dispex;
+
+ TRACE("\n");
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET:
+ return VariantCopy(retv, &This->description);
+ case DISPATCH_PROPERTYPUT:
+ return VariantCopy(&This->description, get_arg(dp, 0));
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+}
+
+/* ECMA-262 3rd Edition 15.11.4.3 */
+static HRESULT Error_message(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ ErrorInstance *This = (ErrorInstance*)dispex;
+
+ TRACE("\n");
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET:
+ return VariantCopy(retv, &This->message);
+ case DISPATCH_PROPERTYPUT:
+ return VariantCopy(&This->message, get_arg(dp, 0));
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+}
+
+/* ECMA-262 3rd Edition 15.11.4.4 */
+static HRESULT Error_toString(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ static const WCHAR str[] = {'[','o','b','j','e','c','t',' ','E','r','r','o','r',']',0};
+
+ TRACE("\n");
+
+ if(retv) {
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = SysAllocString(str);
+ if(!V_BSTR(retv))
+ return E_OUTOFMEMORY;
+ }
+
+ return S_OK;
+}
+
+static HRESULT Error_value(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ switch(flags) {
+ case INVOKE_FUNC:
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL);
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
+static void Error_destructor(DispatchEx *dispex)
+{
+ ErrorInstance *This = (ErrorInstance*)dispex;
+
+ VariantClear(&This->number);
+ VariantClear(&This->description);
+ VariantClear(&This->message);
+ heap_free(This);
+}
+
+static const builtin_prop_t Error_props[] = {
+ {descriptionW, Error_description, 0},
+ {messageW, Error_message, 0},
+ {numberW, Error_number, 0},
+ {toStringW, Error_toString, PROPF_METHOD}
+};
+
+static const builtin_info_t Error_info = {
+ JSCLASS_ERROR,
+ {NULL, Error_value, 0},
+ sizeof(Error_props)/sizeof(*Error_props),
+ Error_props,
+ Error_destructor,
+ NULL
+};
+
+static const builtin_prop_t ErrorInst_props[] = {
+ {descriptionW, Error_description, 0},
+ {messageW, Error_message, 0},
+ {numberW, Error_number, 0},
+};
+
+static const builtin_info_t ErrorInst_info = {
+ JSCLASS_ERROR,
+ {NULL, Error_value, 0},
+ sizeof(ErrorInst_props)/sizeof(*ErrorInst_props),
+ ErrorInst_props,
+ Error_destructor,
+ NULL
+};
+
+static HRESULT alloc_error(script_ctx_t *ctx, DispatchEx *prototype,
+ DispatchEx *constr, ErrorInstance **ret)
+{
+ ErrorInstance *err;
+ HRESULT hres;
+
+ err = heap_alloc_zero(sizeof(ErrorInstance));
+ if(!err)
+ return E_OUTOFMEMORY;
+
+ if(prototype)
+ hres = init_dispex(&err->dispex, ctx, &Error_info, prototype);
+ else
+ hres = init_dispex_from_constr(&err->dispex, ctx, &ErrorInst_info,
+ constr ? constr : ctx->error_constr);
+ if(FAILED(hres)) {
+ heap_free(err);
+ return hres;
+ }
+
+ *ret = err;
+ return S_OK;
+}
+
+static HRESULT create_error(script_ctx_t *ctx, DispatchEx *constr,
+ const UINT *number, const WCHAR *msg, DispatchEx **ret)
+{
+ ErrorInstance *err;
+ HRESULT hres;
+
+ hres = alloc_error(ctx, NULL, constr, &err);
+ if(FAILED(hres))
+ return hres;
+
+ if(number) {
+ V_VT(&err->number) = VT_I4;
+ V_I4(&err->number) = *number;
+ }
+
+ V_VT(&err->message) = VT_BSTR;
+ if(msg) V_BSTR(&err->message) = SysAllocString(msg);
+ else V_BSTR(&err->message) = SysAllocStringLen(NULL, 0);
+
+ VariantCopy(&err->description, &err->message);
+
+ if(!V_BSTR(&err->message)) {
+ heap_free(err);
+ return E_OUTOFMEMORY;
+ }
+
+ *ret = &err->dispex;
+ return S_OK;
+}
+
+static HRESULT error_constr(DispatchEx *dispex, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, DispatchEx *constr) {
+ DispatchEx *err;
+ VARIANT numv;
+ UINT num;
+ BSTR msg = NULL;
+ HRESULT hres;
+
+ V_VT(&numv) = VT_NULL;
+
+ if(arg_cnt(dp)) {
+ hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &numv);
+ if(FAILED(hres) || (V_VT(&numv)==VT_R8 && isnan(V_R8(&numv))))
+ hres = to_string(dispex->ctx, get_arg(dp, 0), ei, &msg);
+ else if(V_VT(&numv) == VT_I4)
+ num = V_I4(&numv);
+ else
+ num = V_R8(&numv);
+
+ if(FAILED(hres))
+ return hres;
+ }
+
+ if(arg_cnt(dp)>1 && !msg) {
+ hres = to_string(dispex->ctx, get_arg(dp, 1), ei, &msg);
+ if(FAILED(hres))
+ return hres;
+ }
+
+ switch(flags) {
+ case INVOKE_FUNC:
+ case DISPATCH_CONSTRUCT:
+ if(V_VT(&numv) == VT_NULL)
+ hres = create_error(dispex->ctx, constr, NULL, msg, &err);
+ else
+ hres = create_error(dispex->ctx, constr, &num, msg, &err);
+
+ if(FAILED(hres))
+ return hres;
+
+ if(retv) {
+ V_VT(retv) = VT_DISPATCH;
+ V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(err);
+ }
+ else
+ IDispatchEx_Release(_IDispatchEx_(err));
+
+ return S_OK;
+
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+}
+
+static HRESULT ErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+ return error_constr(dispex, flags, dp, retv, ei,
+ dispex->ctx->error_constr);
+}
+
+static HRESULT EvalErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+ return error_constr(dispex, flags, dp, retv, ei,
+ dispex->ctx->eval_error_constr);
+}
+
+static HRESULT RangeErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+ return error_constr(dispex, flags, dp, retv, ei,
+ dispex->ctx->range_error_constr);
+}
+
+static HRESULT ReferenceErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+ return error_constr(dispex, flags, dp, retv, ei,
+ dispex->ctx->reference_error_constr);
+}
+
+static HRESULT SyntaxErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+ return error_constr(dispex, flags, dp, retv, ei,
+ dispex->ctx->syntax_error_constr);
+}
+
+static HRESULT TypeErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+ return error_constr(dispex, flags, dp, retv, ei,
+ dispex->ctx->type_error_constr);
+}
+
+static HRESULT URIErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+ return error_constr(dispex, flags, dp, retv, ei,
+ dispex->ctx->uri_error_constr);
+}
+
+HRESULT init_error_constr(script_ctx_t *ctx, DispatchEx *object_prototype)
+{
+ static const WCHAR nameW[] = {'n','a','m','e',0};
+ static const WCHAR ErrorW[] = {'E','r','r','o','r',0};
+ static const WCHAR EvalErrorW[] = {'E','v','a','l','E','r','r','o','r',0};
+ static const WCHAR RangeErrorW[] = {'R','a','n','g','e','E','r','r','o','r',0};
+ static const WCHAR ReferenceErrorW[] = {'R','e','f','e','r','e','n','c','e','E','r','r','o','r',0};
+ static const WCHAR SyntaxErrorW[] = {'S','y','n','t','a','x','E','r','r','o','r',0};
+ static const WCHAR TypeErrorW[] = {'T','y','p','e','E','r','r','o','r',0};
+ static const WCHAR URIErrorW[] = {'U','R','I','E','r','r','o','r',0};
+ static const WCHAR *names[] = {ErrorW, EvalErrorW, RangeErrorW,
+ ReferenceErrorW, SyntaxErrorW, TypeErrorW, URIErrorW};
+ DispatchEx **constr_addr[] = {&ctx->error_constr, &ctx->eval_error_constr,
+ &ctx->range_error_constr, &ctx->reference_error_constr,
+ &ctx->syntax_error_constr, &ctx->type_error_constr,
+ &ctx->uri_error_constr};
+ static builtin_invoke_t constr_val[] = {ErrorConstr_value, EvalErrorConstr_value,
+ RangeErrorConstr_value, ReferenceErrorConstr_value, SyntaxErrorConstr_value,
+ TypeErrorConstr_value, URIErrorConstr_value};
+
+ ErrorInstance *err;
+ INT i;
+ VARIANT v;
+ HRESULT hres;
+
+ for(i=0; i<7; i++) {
+ hres = alloc_error(ctx, i==0 ? object_prototype : NULL, NULL, &err);
+ if(FAILED(hres))
+ return hres;
+
+ V_VT(&v) = VT_BSTR;
+ V_BSTR(&v) = SysAllocString(names[i]);
+ if(!V_BSTR(&v)) {
+ IDispatchEx_Release(_IDispatchEx_(&err->dispex));
+ return E_OUTOFMEMORY;
+ }
+
+ hres = jsdisp_propput_name(&err->dispex, nameW, ctx->lcid, &v, NULL/*FIXME*/, NULL/*FIXME*/);
+
+ if(SUCCEEDED(hres))
+ hres = create_builtin_function(ctx, constr_val[i], NULL,
+ PROPF_CONSTR, &err->dispex, constr_addr[i]);
+
+ IDispatchEx_Release(_IDispatchEx_(&err->dispex));
+ VariantClear(&v);
+ if(FAILED(hres))
+ return hres;
+ }
+
+ return S_OK;
+}
+
+static HRESULT throw_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str, DispatchEx *constr)
+{
+ WCHAR buf[1024], *pos = NULL;
+ DispatchEx *err;
+ HRESULT hres;
+
+ buf[0] = '\0';
+ LoadStringW(jscript_hinstance, id&0xFFFF, buf, sizeof(buf)/sizeof(WCHAR));
+
+ if(str) pos = strchrW(buf, '|');
+ if(pos) {
+ int len = strlenW(str);
+ memmove(pos+len, pos+1, (strlenW(pos+1)+1)*sizeof(WCHAR));
+ memcpy(pos, str, len*sizeof(WCHAR));
+ }
+
+ WARN("%s\n", debugstr_w(buf));
+
+ id |= JSCRIPT_ERROR;
+ hres = create_error(ctx, constr, &id, buf, &err);
+ if(FAILED(hres))
+ return hres;
+
+ if(!ei)
+ return id;
+
+ V_VT(&ei->var) = VT_DISPATCH;
+ V_DISPATCH(&ei->var) = (IDispatch*)_IDispatchEx_(err);
+
+ return id;
+}
+
+HRESULT throw_eval_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
+{
+ return throw_error(ctx, ei, id, str, ctx->eval_error_constr);
+}
+
+HRESULT throw_range_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
+{
+ return throw_error(ctx, ei, id, str, ctx->range_error_constr);
+}
+
+HRESULT throw_reference_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
+{
+ return throw_error(ctx, ei, id, str, ctx->reference_error_constr);
+}
+
+HRESULT throw_syntax_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
+{
+ return throw_error(ctx, ei, id, str, ctx->syntax_error_constr);
+}
+
+HRESULT throw_type_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
+{
+ return throw_error(ctx, ei, id, str, ctx->type_error_constr);
+}
+
+HRESULT throw_uri_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
+{
+ return throw_error(ctx, ei, id, str, ctx->uri_error_constr);
+}
diff --git a/reactos/dll/win32/jscript/function.c b/reactos/dll/win32/jscript/function.c
index d780aeebde1..661b93c2576 100644
--- a/reactos/dll/win32/jscript/function.c
+++ b/reactos/dll/win32/jscript/function.c
@@ -40,13 +40,8 @@ static const WCHAR prototypeW[] = {'p','r','o','t','o','t', 'y', 'p','e',0};
static const WCHAR lengthW[] = {'l','e','n','g','t','h',0};
static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
-static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0};
-static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0};
static const WCHAR applyW[] = {'a','p','p','l','y',0};
static const WCHAR callW[] = {'c','a','l','l',0};
-static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0};
-static const WCHAR propertyIsEnumerableW[] = {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0};
-static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0};
static IDispatch *get_this(DISPPARAMS *dp)
{
@@ -198,9 +193,10 @@ static HRESULT invoke_constructor(FunctionInstance *function, LCID lcid, DISPPAR
return hres;
hres = invoke_source(function, (IDispatch*)_IDispatchEx_(this_obj), lcid, dp, retv, ei, caller);
- jsdisp_release(this_obj);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ jsdisp_release(this_obj);
return hres;
+ }
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(this_obj);
@@ -272,10 +268,8 @@ static HRESULT Function_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISP
TRACE("\n");
- if(!is_class(dispex, JSCLASS_FUNCTION)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_FUNCTION))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL);
function = (FunctionInstance*)dispex;
@@ -292,20 +286,6 @@ static HRESULT Function_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISP
return S_OK;
}
-static HRESULT Function_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT Function_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
static HRESULT Function_apply(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
@@ -320,27 +300,6 @@ static HRESULT Function_call(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
return E_NOTIMPL;
}
-static HRESULT Function_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT Function_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT Function_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
HRESULT Function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
@@ -403,13 +362,8 @@ static void Function_destructor(DispatchEx *dispex)
static const builtin_prop_t Function_props[] = {
{applyW, Function_apply, PROPF_METHOD},
{callW, Function_call, PROPF_METHOD},
- {hasOwnPropertyW, Function_hasOwnProperty, PROPF_METHOD},
- {isPrototypeOfW, Function_isPrototypeOf, PROPF_METHOD},
{lengthW, Function_length, 0},
- {propertyIsEnumerableW, Function_propertyIsEnumerable, PROPF_METHOD},
- {toLocaleStringW, Function_toLocaleString, PROPF_METHOD},
- {toStringW, Function_toString, PROPF_METHOD},
- {valueOfW, Function_valueOf, PROPF_METHOD}
+ {toStringW, Function_toString, PROPF_METHOD}
};
static const builtin_info_t Function_info = {
@@ -457,35 +411,38 @@ static HRESULT create_function(script_ctx_t *ctx, const builtin_info_t *builtin_
function->flags = flags;
function->length = flags & PROPF_ARGMASK;
- if(prototype) {
- jsexcept_t jsexcept;
- VARIANT var;
-
- V_VT(&var) = VT_DISPATCH;
- V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(prototype);
- memset(&jsexcept, 0, sizeof(jsexcept));
-
- hres = jsdisp_propput_name(&function->dispex, prototypeW, ctx->lcid, &var, &jsexcept, NULL/*FIXME*/);
- if(FAILED(hres)) {
- IDispatchEx_Release(_IDispatchEx_(&function->dispex));
- return hres;
- }
- }
-
*ret = function;
return S_OK;
}
+static HRESULT set_prototype(script_ctx_t *ctx, DispatchEx *dispex, DispatchEx *prototype)
+{
+ jsexcept_t jsexcept;
+ VARIANT var;
+
+ V_VT(&var) = VT_DISPATCH;
+ V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(prototype);
+ memset(&jsexcept, 0, sizeof(jsexcept));
+
+ return jsdisp_propput_name(dispex, prototypeW, ctx->lcid, &var, &jsexcept, NULL/*FIXME*/);
+}
+
HRESULT create_builtin_function(script_ctx_t *ctx, builtin_invoke_t value_proc,
const builtin_info_t *builtin_info, DWORD flags, DispatchEx *prototype, DispatchEx **ret)
{
FunctionInstance *function;
HRESULT hres;
- hres = create_function(ctx, builtin_info, flags, FALSE, prototype, &function);
+ hres = create_function(ctx, builtin_info, flags, FALSE, NULL, &function);
if(FAILED(hres))
return hres;
+ hres = set_prototype(ctx, &function->dispex, prototype);
+ if(FAILED(hres)) {
+ jsdisp_release(&function->dispex);
+ return hres;
+ }
+
function->value_proc = value_proc;
*ret = &function->dispex;
@@ -505,7 +462,12 @@ HRESULT create_source_function(parser_ctx_t *ctx, parameter_t *parameters, sourc
if(FAILED(hres))
return hres;
- hres = create_function(ctx->script, NULL, PROPF_CONSTR, FALSE, prototype, &function);
+ hres = create_function(ctx->script, NULL, PROPF_CONSTR, FALSE, NULL, &function);
+ if(SUCCEEDED(hres)) {
+ hres = set_prototype(ctx->script, &function->dispex, prototype);
+ if(FAILED(hres))
+ jsdisp_release(&function->dispex);
+ }
jsdisp_release(prototype);
if(FAILED(hres))
return hres;
@@ -532,23 +494,28 @@ HRESULT create_source_function(parser_ctx_t *ctx, parameter_t *parameters, sourc
return S_OK;
}
-HRESULT init_function_constr(script_ctx_t *ctx)
+HRESULT init_function_constr(script_ctx_t *ctx, DispatchEx *object_prototype)
{
FunctionInstance *prot, *constr;
HRESULT hres;
- hres = create_function(ctx, NULL, PROPF_CONSTR, TRUE, NULL, &prot);
+ hres = create_function(ctx, NULL, PROPF_CONSTR, TRUE, object_prototype, &prot);
if(FAILED(hres))
return hres;
prot->value_proc = FunctionProt_value;
hres = create_function(ctx, NULL, PROPF_CONSTR, TRUE, &prot->dispex, &constr);
+ if(SUCCEEDED(hres)) {
+ constr->value_proc = FunctionConstr_value;
+ hres = set_prototype(ctx, &constr->dispex, &prot->dispex);
+ if(FAILED(hres))
+ jsdisp_release(&constr->dispex);
+ }
jsdisp_release(&prot->dispex);
if(FAILED(hres))
return hres;
- constr->value_proc = FunctionConstr_value;
ctx->function_constr = &constr->dispex;
- return hres;
+ return S_OK;
}
diff --git a/reactos/dll/win32/jscript/global.c b/reactos/dll/win32/jscript/global.c
index a714f8ef4e4..e843fac02f7 100644
--- a/reactos/dll/win32/jscript/global.c
+++ b/reactos/dll/win32/jscript/global.c
@@ -20,6 +20,7 @@
#include "wine/port.h"
#include
+#include
#include "jscript.h"
#include "engine.h"
@@ -28,11 +29,20 @@
WINE_DEFAULT_DEBUG_CHANNEL(jscript);
+#define LONGLONG_MAX (((LONGLONG)0x7fffffff<<32)|0xffffffff)
+
static const WCHAR NaNW[] = {'N','a','N',0};
static const WCHAR InfinityW[] = {'I','n','f','i','n','i','t','y',0};
static const WCHAR ArrayW[] = {'A','r','r','a','y',0};
static const WCHAR BooleanW[] = {'B','o','o','l','e','a','n',0};
static const WCHAR DateW[] = {'D','a','t','e',0};
+static const WCHAR ErrorW[] = {'E','r','r','o','r',0};
+static const WCHAR EvalErrorW[] = {'E','v','a','l','E','r','r','o','r',0};
+static const WCHAR RangeErrorW[] = {'R','a','n','g','e','E','r','r','o','r',0};
+static const WCHAR ReferenceErrorW[] = {'R','e','f','e','r','e','n','c','e','E','r','r','o','r',0};
+static const WCHAR SyntaxErrorW[] = {'S','y','n','t','a','x','E','r','r','o','r',0};
+static const WCHAR TypeErrorW[] = {'T','y','p','e','E','r','r','o','r',0};
+static const WCHAR URIErrorW[] = {'U','R','I','E','r','r','o','r',0};
static const WCHAR FunctionW[] = {'F','u','n','c','t','i','o','n',0};
static const WCHAR NumberW[] = {'N','u','m','b','e','r',0};
static const WCHAR ObjectW[] = {'O','b','j','e','c','t',0};
@@ -165,6 +175,62 @@ static HRESULT JSGlobal_Date(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
return constructor_call(dispex->ctx->date_constr, lcid, flags, dp, retv, ei, sp);
}
+static HRESULT JSGlobal_Error(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ return constructor_call(dispex->ctx->error_constr, lcid, flags, dp, retv, ei, sp);
+}
+
+static HRESULT JSGlobal_EvalError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ return constructor_call(dispex->ctx->eval_error_constr, lcid, flags, dp, retv, ei, sp);
+}
+
+static HRESULT JSGlobal_RangeError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ return constructor_call(dispex->ctx->range_error_constr, lcid, flags, dp, retv, ei, sp);
+}
+
+static HRESULT JSGlobal_ReferenceError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ return constructor_call(dispex->ctx->reference_error_constr, lcid, flags, dp, retv, ei, sp);
+}
+
+static HRESULT JSGlobal_SyntaxError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ return constructor_call(dispex->ctx->syntax_error_constr, lcid, flags, dp, retv, ei, sp);
+}
+
+static HRESULT JSGlobal_TypeError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ return constructor_call(dispex->ctx->type_error_constr, lcid, flags, dp, retv, ei, sp);
+}
+
+static HRESULT JSGlobal_URIError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ return constructor_call(dispex->ctx->uri_error_constr, lcid, flags, dp, retv, ei, sp);
+}
+
static HRESULT JSGlobal_Function(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
@@ -267,7 +333,7 @@ static HRESULT JSGlobal_eval(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
hres = script_parse(dispex->ctx, V_BSTR(arg), NULL, &parser_ctx);
if(FAILED(hres)) {
WARN("parse (%s) failed: %08x\n", debugstr_w(V_BSTR(arg)), hres);
- return hres;
+ return throw_syntax_error(dispex->ctx, ei, hres, NULL);
}
hres = exec_source(dispex->ctx->exec_ctx, parser_ctx, parser_ctx->source, ei, retv);
@@ -411,8 +477,103 @@ static HRESULT JSGlobal_parseInt(DispatchEx *dispex, LCID lcid, WORD flags, DISP
static HRESULT JSGlobal_parseFloat(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ LONGLONG d = 0, hlp;
+ int exp = 0, length;
+ VARIANT *arg;
+ WCHAR *str;
+ BSTR val_str = NULL;
+ BOOL ret_nan = TRUE, positive = TRUE;
+ HRESULT hres;
+
+ if(!arg_cnt(dp)) {
+ if(retv)
+ num_set_nan(retv);
+ return S_OK;
+ }
+
+ arg = get_arg(dp, 0);
+ hres = to_string(dispex->ctx, arg, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+
+ while(isspaceW(*str)) str++;
+
+ if(*str == '+')
+ str++;
+ else if(*str == '-') {
+ positive = FALSE;
+ str++;
+ }
+
+ if(isdigitW(*str))
+ ret_nan = FALSE;
+
+ while(isdigitW(*str)) {
+ hlp = d*10 + *(str++) - '0';
+ if(d>LONGLONG_MAX/10 || hlp<0) {
+ exp++;
+ break;
+ }
+ else
+ d = hlp;
+ }
+ while(isdigitW(*str)) {
+ exp++;
+ str++;
+ }
+
+ if(*str == '.') str++;
+
+ if(isdigitW(*str))
+ ret_nan = FALSE;
+
+ while(isdigitW(*str)) {
+ hlp = d*10 + *(str++) - '0';
+ if(d>LONGLONG_MAX/10 || hlp<0)
+ break;
+
+ d = hlp;
+ exp--;
+ }
+ while(isdigitW(*str))
+ str++;
+
+ if(*str && !ret_nan && (*str=='e' || *str=='E')) {
+ int sign = 1, e = 0;
+
+ str++;
+ if(*str == '+')
+ str++;
+ else if(*str == '-') {
+ sign = -1;
+ str++;
+ }
+
+ while(isdigitW(*str)) {
+ if(e>INT_MAX/10 || (e = e*10 + *str++ - '0')<0)
+ e = INT_MAX;
+ }
+ e *= sign;
+
+ if(exp<0 && e<0 && exp+e>0) exp = INT_MIN;
+ else if(exp>0 && e>0 && exp+e<0) exp = INT_MAX;
+ else exp += e;
+ }
+
+ SysFreeString(val_str);
+
+ if(ret_nan) {
+ if(retv)
+ num_set_nan(retv);
+ return S_OK;
+ }
+
+ V_VT(retv) = VT_R8;
+ V_R8(retv) = (double)(positive?d:-d)*pow(10, exp);
+ return S_OK;
}
static HRESULT JSGlobal_unescape(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
@@ -541,6 +702,8 @@ static const builtin_prop_t JSGlobal_props[] = {
{CollectGarbageW, JSGlobal_CollectGarbage, PROPF_METHOD},
{DateW, JSGlobal_Date, PROPF_CONSTR},
{EnumeratorW, JSGlobal_Enumerator, PROPF_METHOD},
+ {ErrorW, JSGlobal_Error, PROPF_CONSTR},
+ {EvalErrorW, JSGlobal_EvalError, PROPF_CONSTR},
{FunctionW, JSGlobal_Function, PROPF_CONSTR},
{_GetObjectW, JSGlobal_GetObject, PROPF_METHOD},
{InfinityW, JSGlobal_Infinity, 0},
@@ -548,12 +711,17 @@ static const builtin_prop_t JSGlobal_props[] = {
{NaNW, JSGlobal_NaN, 0},
{NumberW, JSGlobal_Number, PROPF_CONSTR},
{ObjectW, JSGlobal_Object, PROPF_CONSTR},
+ {RangeErrorW, JSGlobal_RangeError, PROPF_CONSTR},
+ {ReferenceErrorW, JSGlobal_ReferenceError, PROPF_CONSTR},
{RegExpW, JSGlobal_RegExp, PROPF_CONSTR},
{ScriptEngineW, JSGlobal_ScriptEngine, PROPF_METHOD},
{ScriptEngineBuildVersionW, JSGlobal_ScriptEngineBuildVersion, PROPF_METHOD},
{ScriptEngineMajorVersionW, JSGlobal_ScriptEngineMajorVersion, PROPF_METHOD},
{ScriptEngineMinorVersionW, JSGlobal_ScriptEngineMinorVersion, PROPF_METHOD},
{StringW, JSGlobal_String, PROPF_CONSTR},
+ {SyntaxErrorW, JSGlobal_SyntaxError, PROPF_CONSTR},
+ {TypeErrorW, JSGlobal_TypeError, PROPF_CONSTR},
+ {URIErrorW, JSGlobal_URIError, PROPF_CONSTR},
{VBArrayW, JSGlobal_VBArray, PROPF_METHOD},
{encodeURIW, JSGlobal_encodeURI, PROPF_METHOD},
{escapeW, JSGlobal_escape, PROPF_METHOD},
@@ -574,39 +742,43 @@ static const builtin_info_t JSGlobal_info = {
NULL
};
-static HRESULT init_constructors(script_ctx_t *ctx)
+static HRESULT init_constructors(script_ctx_t *ctx, DispatchEx *object_prototype)
{
HRESULT hres;
- hres = init_function_constr(ctx);
+ hres = init_function_constr(ctx, object_prototype);
if(FAILED(hres))
return hres;
- hres = create_array_constr(ctx, &ctx->array_constr);
+ hres = create_object_constr(ctx, object_prototype, &ctx->object_constr);
if(FAILED(hres))
return hres;
- hres = create_bool_constr(ctx, &ctx->bool_constr);
+ hres = create_array_constr(ctx, object_prototype, &ctx->array_constr);
if(FAILED(hres))
return hres;
- hres = create_date_constr(ctx, &ctx->date_constr);
+ hres = create_bool_constr(ctx, object_prototype, &ctx->bool_constr);
if(FAILED(hres))
return hres;
- hres = create_number_constr(ctx, &ctx->number_constr);
+ hres = create_date_constr(ctx, object_prototype, &ctx->date_constr);
if(FAILED(hres))
return hres;
- hres = create_object_constr(ctx, &ctx->object_constr);
+ hres = init_error_constr(ctx, object_prototype);
if(FAILED(hres))
return hres;
- hres = create_regexp_constr(ctx, &ctx->regexp_constr);
+ hres = create_number_constr(ctx, object_prototype, &ctx->number_constr);
if(FAILED(hres))
return hres;
- hres = create_string_constr(ctx, &ctx->string_constr);
+ hres = create_regexp_constr(ctx, object_prototype, &ctx->regexp_constr);
+ if(FAILED(hres))
+ return hres;
+
+ hres = create_string_constr(ctx, object_prototype, &ctx->string_constr);
if(FAILED(hres))
return hres;
@@ -615,14 +787,19 @@ static HRESULT init_constructors(script_ctx_t *ctx)
HRESULT init_global(script_ctx_t *ctx)
{
- DispatchEx *math;
+ DispatchEx *math, *object_prototype;
VARIANT var;
HRESULT hres;
if(ctx->global)
return S_OK;
- hres = init_constructors(ctx);
+ hres = create_object_prototype(ctx, &object_prototype);
+ if(FAILED(hres))
+ return hres;
+
+ hres = init_constructors(ctx, object_prototype);
+ jsdisp_release(object_prototype);
if(FAILED(hres))
return hres;
diff --git a/reactos/dll/win32/jscript/jscript.h b/reactos/dll/win32/jscript/jscript.h
index 7a4158c631f..807225a0ac7 100644
--- a/reactos/dll/win32/jscript/jscript.h
+++ b/reactos/dll/win32/jscript/jscript.h
@@ -28,9 +28,13 @@
#include "dispex.h"
#include "activscp.h"
+#include "resource.h"
+
#include "wine/unicode.h"
#include "wine/list.h"
+#define JSCRIPT_ERROR 0x800A0000
+
typedef struct _script_ctx_t script_ctx_t;
typedef struct _exec_ctx_t exec_ctx_t;
typedef struct _dispex_prop_t dispex_prop_t;
@@ -58,6 +62,8 @@ jsheap_t *jsheap_mark(jsheap_t*);
typedef struct DispatchEx DispatchEx;
+extern HINSTANCE jscript_hinstance;
+
#define PROPF_ARGMASK 0x00ff
#define PROPF_METHOD 0x0100
#define PROPF_ENUM 0x0200
@@ -68,6 +74,7 @@ typedef enum {
JSCLASS_ARRAY,
JSCLASS_BOOLEAN,
JSCLASS_DATE,
+ JSCLASS_ERROR,
JSCLASS_FUNCTION,
JSCLASS_GLOBAL,
JSCLASS_MATH,
@@ -123,6 +130,8 @@ DispatchEx *iface_to_jsdisp(IUnknown*);
HRESULT disp_call(IDispatch*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_call_value(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
+HRESULT jsdisp_call(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
+HRESULT jsdisp_call_name(DispatchEx*,const WCHAR*,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT disp_propget(IDispatch*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT disp_propput(IDispatch*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propget(DispatchEx*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
@@ -131,11 +140,19 @@ HRESULT jsdisp_propput_idx(DispatchEx*,DWORD,LCID,VARIANT*,jsexcept_t*,IServiceP
HRESULT jsdisp_propget_name(DispatchEx*,LPCWSTR,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propget_idx(DispatchEx*,DWORD,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_get_id(DispatchEx*,const WCHAR*,DWORD,DISPID*);
+HRESULT jsdisp_delete_idx(DispatchEx*,DWORD);
HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const builtin_info_t*,DWORD,
DispatchEx*,DispatchEx**);
HRESULT Function_value(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
+HRESULT throw_eval_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
+HRESULT throw_range_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
+HRESULT throw_reference_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
+HRESULT throw_syntax_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
+HRESULT throw_type_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
+HRESULT throw_uri_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
+
HRESULT create_object(script_ctx_t*,DispatchEx*,DispatchEx**);
HRESULT create_math(script_ctx_t*,DispatchEx**);
@@ -145,7 +162,13 @@ HRESULT create_string(script_ctx_t*,const WCHAR*,DWORD,DispatchEx**);
HRESULT create_bool(script_ctx_t*,VARIANT_BOOL,DispatchEx**);
HRESULT create_number(script_ctx_t*,VARIANT*,DispatchEx**);
-HRESULT to_primitive(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*);
+typedef enum {
+ NO_HINT,
+ HINT_STRING,
+ HINT_NUMBER
+} hint_t;
+
+HRESULT to_primitive(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*, hint_t);
HRESULT to_boolean(VARIANT*,VARIANT_BOOL*);
HRESULT to_number(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*);
HRESULT to_integer(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*);
@@ -179,6 +202,13 @@ struct _script_ctx_t {
DispatchEx *array_constr;
DispatchEx *bool_constr;
DispatchEx *date_constr;
+ DispatchEx *error_constr;
+ DispatchEx *eval_error_constr;
+ DispatchEx *range_error_constr;
+ DispatchEx *reference_error_constr;
+ DispatchEx *syntax_error_constr;
+ DispatchEx *type_error_constr;
+ DispatchEx *uri_error_constr;
DispatchEx *number_constr;
DispatchEx *object_constr;
DispatchEx *regexp_constr;
@@ -193,15 +223,17 @@ static inline void script_addref(script_ctx_t *ctx)
}
HRESULT init_global(script_ctx_t*);
-HRESULT init_function_constr(script_ctx_t*);
+HRESULT init_function_constr(script_ctx_t*,DispatchEx*);
+HRESULT create_object_prototype(script_ctx_t*,DispatchEx**);
-HRESULT create_array_constr(script_ctx_t*,DispatchEx**);
-HRESULT create_bool_constr(script_ctx_t*,DispatchEx**);
-HRESULT create_date_constr(script_ctx_t*,DispatchEx**);
-HRESULT create_number_constr(script_ctx_t*,DispatchEx**);
-HRESULT create_object_constr(script_ctx_t*,DispatchEx**);
-HRESULT create_regexp_constr(script_ctx_t*,DispatchEx**);
-HRESULT create_string_constr(script_ctx_t*,DispatchEx**);
+HRESULT create_array_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
+HRESULT create_bool_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
+HRESULT create_date_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
+HRESULT init_error_constr(script_ctx_t*,DispatchEx*);
+HRESULT create_number_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
+HRESULT create_object_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
+HRESULT create_regexp_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
+HRESULT create_string_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
typedef struct {
const WCHAR *str;
diff --git a/reactos/dll/win32/jscript/jscript.rbuild b/reactos/dll/win32/jscript/jscript.rbuild
index 80c3d6cbc43..1694b54a850 100644
--- a/reactos/dll/win32/jscript/jscript.rbuild
+++ b/reactos/dll/win32/jscript/jscript.rbuild
@@ -10,11 +10,13 @@
jsglobal
wine
kernel32
+ user32
oleaut32
advapi32
date.c
dispex.c
engine.c
+ error.c
jscript.c
jscript_main.c
jsutils.c
diff --git a/reactos/dll/win32/jscript/jscript_De.rc b/reactos/dll/win32/jscript/jscript_De.rc
new file mode 100644
index 00000000000..123cf571b02
--- /dev/null
+++ b/reactos/dll/win32/jscript/jscript_De.rc
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2009 André Hentschel
+ *
+ * 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 "resource.h"
+
+#pragma code_page(65001)
+
+LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_TO_PRIMITIVE "Fehler beim umwandeln des Objektes in einen Grundtyp"
+ IDS_INVALID_CALL_ARG "Ungültiger Funktionsaufruf oder Argument"
+ IDS_NO_PROPERTY "Das Objekt unterstützt diese Eigenschaft oder Methode nicht"
+ IDS_ARG_NOT_OPT "Argument nicht optional"
+ IDS_SYNTAX_ERROR "Syntax Fehler"
+ IDS_SEMICOLON "';' erwartet"
+ IDS_LBRACKET "'(' erwartet"
+ IDS_RBRACKET "')' erwartet"
+ IDS_UNTERMINATED_STR "konstante Zeichenkette nicht terminiert"
+ IDS_NOT_FUNC "Funktion erwartet"
+ IDS_NOT_DATE "'[Objekt]' ist kein Datums-Objekt"
+ IDS_NOT_NUM "Nummer erwartet"
+ IDS_ILLEGAL_ASSIGN "Unzulässige Zuweisung"
+ IDS_UNDEFINED "'|' nicht definiert"
+ IDS_NOT_BOOL "Boolisches Objekt erwartet"
+ IDS_INVALID_LENGTH "Array-Größe muss eine endliche, positive Ganzzahl sein"
+}
diff --git a/reactos/dll/win32/jscript/jscript_En.rc b/reactos/dll/win32/jscript/jscript_En.rc
new file mode 100644
index 00000000000..697c1ab0709
--- /dev/null
+++ b/reactos/dll/win32/jscript/jscript_En.rc
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2009 Piotr Caban
+ *
+ * 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 "resource.h"
+
+LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_TO_PRIMITIVE "Error converting object to primitive type"
+ IDS_INVALID_CALL_ARG "Invalid procedure call or argument"
+ IDS_NO_PROPERTY "Object doesn't support this property or method"
+ IDS_ARG_NOT_OPT "Argument not optional"
+ IDS_SYNTAX_ERROR "Syntax error"
+ IDS_SEMICOLON "Expected ';'"
+ IDS_LBRACKET "Expected '('"
+ IDS_RBRACKET "Expected ')'"
+ IDS_UNTERMINATED_STR "Unterminated string constant"
+ IDS_NOT_FUNC "Function expected"
+ IDS_NOT_DATE "'[object]' is not a date object"
+ IDS_NOT_NUM "Number expected"
+ IDS_ILLEGAL_ASSIGN "Illegal assignment"
+ IDS_UNDEFINED "'|' is undefined"
+ IDS_NOT_BOOL "Boolean object expected"
+ IDS_INVALID_LENGTH "Array length must be a finite positive integer"
+}
diff --git a/reactos/dll/win32/jscript/jscript_Fr.rc b/reactos/dll/win32/jscript/jscript_Fr.rc
new file mode 100644
index 00000000000..4554fb06ff3
--- /dev/null
+++ b/reactos/dll/win32/jscript/jscript_Fr.rc
@@ -0,0 +1,46 @@
+/*
+ * French resources for jscript
+ *
+ * Copyright 2009 Frédéric Delanoy
+ *
+ * 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 "resource.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_TO_PRIMITIVE "Erreur lors de la conversion de l'objet vers un type primitif"
+ IDS_INVALID_CALL_ARG "Appel de procédure ou argument invalide"
+ IDS_NO_PROPERTY "Cet objet ne supporte pas cette propriété ou méthode"
+ IDS_ARG_NOT_OPT "Argument non optionnel"
+ IDS_SYNTAX_ERROR "Erreur de syntaxe"
+ IDS_SEMICOLON "« ; » attendu"
+ IDS_LBRACKET "« ( » attendu"
+ IDS_RBRACKET "« ) » attendu"
+ IDS_UNTERMINATED_STR "Constante chaîne de caractères non clôturée"
+ IDS_NOT_FUNC "Fonction attendue"
+ IDS_NOT_DATE "« [objet] » n'est pas un objet de type date"
+ IDS_NOT_NUM "Nombre attendu"
+ IDS_ILLEGAL_ASSIGN "Affectation illégale"
+ IDS_UNDEFINED "« | » n'est pas défini"
+ IDS_NOT_BOOL "Booléen attendu"
+ IDS_INVALID_LENGTH "La longueur d'un tableau doit être un entier positif"
+}
diff --git a/reactos/dll/win32/jscript/jscript_Lt.rc b/reactos/dll/win32/jscript/jscript_Lt.rc
new file mode 100644
index 00000000000..de0037ee604
--- /dev/null
+++ b/reactos/dll/win32/jscript/jscript_Lt.rc
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "resource.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_TO_PRIMITIVE "Klaida keičiant objektą į primityvų tipą"
+ IDS_INVALID_CALL_ARG "Netinkamas kreipinys į procedūrą ar argumentas"
+ IDS_NO_PROPERTY "Objektas nepalaiko šios savybės ar metodo"
+ IDS_ARG_NOT_OPT "Argumentas nėra neprivalomas"
+ IDS_SYNTAX_ERROR "Sintaksės klaida"
+ IDS_SEMICOLON "Tikėtasi „;“"
+ IDS_LBRACKET "Tikėtasi „(“"
+ IDS_RBRACKET "Tikėtasi „)“"
+ IDS_UNTERMINATED_STR "Nebaigta eilutės konstanta"
+ IDS_NOT_FUNC "Tikėtasi funkcijos"
+ IDS_NOT_DATE "„[objektas]“ nėra datos objektas"
+ IDS_NOT_NUM "Tikėtasi skaičiaus"
+ IDS_ILLEGAL_ASSIGN "Neleistinas priskyrimas"
+ IDS_UNDEFINED "„|“ yra neapibrėžtas"
+ IDS_NOT_BOOL "Tikėtasi loginio objekto"
+ IDS_INVALID_LENGTH "Masyvo dydis turi būti teigiamas sveikasis skaičius"
+}
diff --git a/reactos/dll/win32/jscript/jscript_Nl.rc b/reactos/dll/win32/jscript/jscript_Nl.rc
new file mode 100644
index 00000000000..e3bd39f884c
--- /dev/null
+++ b/reactos/dll/win32/jscript/jscript_Nl.rc
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2009 Paul Vriens
+ *
+ * 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 "resource.h"
+
+LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_TO_PRIMITIVE "Fout bij het omzetten van het object naar een primitief type"
+ IDS_INVALID_CALL_ARG "Ongeldige procedure-aanroep of argument"
+ IDS_NO_PROPERTY "Dit object ondersteunt deze eigenschap of methode niet"
+ IDS_ARG_NOT_OPT "Argument is niet optioneel"
+ IDS_SYNTAX_ERROR "Syntax fout"
+ IDS_SEMICOLON "';' verwacht"
+ IDS_LBRACKET "'(' verwacht"
+ IDS_RBRACKET "')' verwacht"
+ IDS_UNTERMINATED_STR "Onafgesloten tekenreeksconstante"
+ IDS_NOT_FUNC "Functie verwacht"
+ IDS_NOT_DATE "'[object]' is geen datum object"
+ IDS_NOT_NUM "Getal verwacht"
+ IDS_ILLEGAL_ASSIGN "Ongeldige toekenning"
+ IDS_UNDEFINED "'|' is ongedefinieerd"
+ IDS_NOT_BOOL "Boolean object verwacht"
+ IDS_INVALID_LENGTH "Array lengte moet een eindig, positief geheel getal zijn"
+}
diff --git a/reactos/dll/win32/jscript/jscript_Pt.rc b/reactos/dll/win32/jscript/jscript_Pt.rc
new file mode 100644
index 00000000000..87a791454a8
--- /dev/null
+++ b/reactos/dll/win32/jscript/jscript_Pt.rc
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2009 Ricardo Filipe
+ *
+ * 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 "resource.h"
+
+#pragma code_page(65001)
+
+LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_TO_PRIMITIVE "Erro ao converter objecto em tipo primitivo"
+ IDS_INVALID_CALL_ARG "Argumento ou chamada de procedimento inválida"
+ IDS_NO_PROPERTY "O objecto não suporta esta propriedade ou método"
+ IDS_ARG_NOT_OPT "Argumento não opcional"
+ IDS_SYNTAX_ERROR "Erro de sintaxe"
+ IDS_SEMICOLON "';' esperado"
+ IDS_LBRACKET "'(' esperado"
+ IDS_RBRACKET "')' esperado"
+ IDS_NOT_FUNC "Função esperada"
+ IDS_NOT_DATE "'[object]' não é um objecto de data"
+ IDS_NOT_NUM "Número esperado"
+ IDS_ILLEGAL_ASSIGN "Atribuição ilegal"
+ IDS_UNDEFINED "'|' é indefinido"
+ IDS_NOT_BOOL "Objecto boleano esperado"
+ IDS_INVALID_LENGTH "Tamanho do vector tem de ser um inteiro finito positivo"
+}
diff --git a/reactos/dll/win32/jscript/jscript_main.c b/reactos/dll/win32/jscript/jscript_main.c
index 37266e5773c..4f59ecbc11a 100644
--- a/reactos/dll/win32/jscript/jscript_main.c
+++ b/reactos/dll/win32/jscript/jscript_main.c
@@ -40,7 +40,7 @@ static const CLSID CLSID_JScriptEncode =
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
-static HINSTANCE jscript_hinstance;
+HINSTANCE jscript_hinstance;
static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
{
diff --git a/reactos/dll/win32/jscript/jsutils.c b/reactos/dll/win32/jscript/jsutils.c
index 73bac94d7e8..10d4f51b074 100644
--- a/reactos/dll/win32/jscript/jsutils.c
+++ b/reactos/dll/win32/jscript/jsutils.c
@@ -175,7 +175,7 @@ jsheap_t *jsheap_mark(jsheap_t *heap)
}
/* ECMA-262 3rd Edition 9.1 */
-HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret)
+HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret, hint_t hint)
{
switch(V_VT(v)) {
case VT_EMPTY:
@@ -189,8 +189,61 @@ HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret
V_VT(ret) = VT_BSTR;
V_BSTR(ret) = SysAllocString(V_BSTR(v));
break;
- case VT_DISPATCH:
- return disp_propget(V_DISPATCH(v), DISPID_VALUE, ctx->lcid, ret, ei, NULL /*FIXME*/);
+ case VT_DISPATCH: {
+ DispatchEx *jsdisp;
+ DISPID id;
+ DISPPARAMS dp = {NULL, NULL, 0, 0};
+ HRESULT hres;
+
+ static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
+ static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0};
+
+ jsdisp = iface_to_jsdisp((IUnknown*)V_DISPATCH(v));
+ if(!jsdisp)
+ return disp_propget(V_DISPATCH(v), DISPID_VALUE, ctx->lcid, ret, ei, NULL /*FIXME*/);
+
+ if(hint == NO_HINT)
+ hint = is_class(jsdisp, JSCLASS_DATE) ? HINT_STRING : HINT_NUMBER;
+
+ /* Native implementation doesn't throw TypeErrors, returns strange values */
+
+ hres = jsdisp_get_id(jsdisp, hint == HINT_STRING ? toStringW : valueOfW, 0, &id);
+ if(SUCCEEDED(hres)) {
+ hres = jsdisp_call(jsdisp, id, ctx->lcid, DISPATCH_METHOD, &dp, ret, ei, NULL /*FIXME*/);
+ if(FAILED(hres)) {
+ WARN("call error - forwarding exception\n");
+ jsdisp_release(jsdisp);
+ return hres;
+ }
+ else if(V_VT(ret) != VT_DISPATCH) {
+ jsdisp_release(jsdisp);
+ return S_OK;
+ }
+ else
+ IDispatch_Release(V_DISPATCH(ret));
+ }
+
+ hres = jsdisp_get_id(jsdisp, hint == HINT_STRING ? valueOfW : toStringW, 0, &id);
+ if(SUCCEEDED(hres)) {
+ hres = jsdisp_call(jsdisp, id, ctx->lcid, DISPATCH_METHOD, &dp, ret, ei, NULL /*FIXME*/);
+ if(FAILED(hres)) {
+ WARN("call error - forwarding exception\n");
+ jsdisp_release(jsdisp);
+ return hres;
+ }
+ else if(V_VT(ret) != VT_DISPATCH) {
+ jsdisp_release(jsdisp);
+ return S_OK;
+ }
+ else
+ IDispatch_Release(V_DISPATCH(ret));
+ }
+
+ jsdisp_release(jsdisp);
+
+ WARN("failed\n");
+ return throw_type_error(ctx, ei, IDS_TO_PRIMITIVE, NULL);
+ }
default:
FIXME("Unimplemented for vt %d\n", V_VT(v));
return E_NOTIMPL;
@@ -211,7 +264,8 @@ HRESULT to_boolean(VARIANT *v, VARIANT_BOOL *b)
*b = V_I4(v) ? VARIANT_TRUE : VARIANT_FALSE;
break;
case VT_R8:
- *b = V_R8(v) ? VARIANT_TRUE : VARIANT_FALSE;
+ if(isnan(V_R8(v))) *b = VARIANT_FALSE;
+ else *b = V_R8(v) ? VARIANT_TRUE : VARIANT_FALSE;
break;
case VT_BSTR:
*b = V_BSTR(v) && *V_BSTR(v) ? VARIANT_TRUE : VARIANT_FALSE;
@@ -355,7 +409,7 @@ HRESULT to_number(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret)
VARIANT prim;
HRESULT hres;
- hres = to_primitive(ctx, v, ei, &prim);
+ hres = to_primitive(ctx, v, ei, &prim, HINT_NUMBER);
if(FAILED(hres))
return hres;
@@ -458,6 +512,8 @@ HRESULT to_string(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, BSTR *str)
const WCHAR nullW[] = {'n','u','l','l',0};
const WCHAR trueW[] = {'t','r','u','e',0};
const WCHAR falseW[] = {'f','a','l','s','e',0};
+ const WCHAR NaNW[] = {'N','a','N',0};
+ const WCHAR InfinityW[] = {'-','I','n','f','i','n','i','t','y',0};
switch(V_VT(v)) {
case VT_EMPTY:
@@ -470,16 +526,23 @@ HRESULT to_string(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, BSTR *str)
*str = int_to_bstr(V_I4(v));
break;
case VT_R8: {
- VARIANT strv;
- HRESULT hres;
+ if(isnan(V_R8(v)))
+ *str = SysAllocString(NaNW);
+ else if(isinf(V_R8(v)))
+ *str = SysAllocString(V_R8(v)<0 ? InfinityW : InfinityW+1);
+ else {
+ VARIANT strv;
+ HRESULT hres;
- V_VT(&strv) = VT_EMPTY;
- hres = VariantChangeTypeEx(&strv, v, MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT), 0, VT_BSTR);
- if(FAILED(hres))
- return hres;
+ V_VT(&strv) = VT_EMPTY;
+ hres = VariantChangeTypeEx(&strv, v, MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT), 0, VT_BSTR);
+ if(FAILED(hres))
+ return hres;
- *str = V_BSTR(&strv);
- return S_OK;
+ *str = V_BSTR(&strv);
+ return S_OK;
+ }
+ break;
}
case VT_BSTR:
*str = SysAllocString(V_BSTR(v));
@@ -488,7 +551,7 @@ HRESULT to_string(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, BSTR *str)
VARIANT prim;
HRESULT hres;
- hres = to_primitive(ctx, v, ei, &prim);
+ hres = to_primitive(ctx, v, ei, &prim, HINT_STRING);
if(FAILED(hres))
return hres;
diff --git a/reactos/dll/win32/jscript/lex.c b/reactos/dll/win32/jscript/lex.c
index 5b7e7a4249b..eb9b83536be 100644
--- a/reactos/dll/win32/jscript/lex.c
+++ b/reactos/dll/win32/jscript/lex.c
@@ -100,7 +100,8 @@ static const struct {
static int lex_error(parser_ctx_t *ctx, HRESULT hres)
{
- ctx->hres = hres;
+ ctx->hres = JSCRIPT_ERROR|hres;
+ ctx->lexer_error = TRUE;
return -1;
}
@@ -342,10 +343,8 @@ static int parse_string_literal(parser_ctx_t *ctx, const WCHAR **ret, WCHAR endc
ctx->ptr++;
}
- if(ctx->ptr == ctx->end) {
- WARN("unexpected end of file\n");
- return lex_error(ctx, E_FAIL);
- }
+ if(ctx->ptr == ctx->end)
+ return lex_error(ctx, IDS_UNTERMINATED_STR);
len = ctx->ptr-ptr;
diff --git a/reactos/dll/win32/jscript/math.c b/reactos/dll/win32/jscript/math.c
index 9d609e5d8c0..628707ed17e 100644
--- a/reactos/dll/win32/jscript/math.c
+++ b/reactos/dll/win32/jscript/math.c
@@ -1,5 +1,6 @@
/*
* Copyright 2008 Jacek Caban for CodeWeavers
+ * Copyright 2009 Piotr Caban
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -570,24 +571,24 @@ static const builtin_prop_t Math_props[] = {
{PIW, Math_PI, 0},
{SQRT1_2W, Math_SQRT1_2, 0},
{SQRT2W, Math_SQRT2, 0},
- {absW, Math_abs, PROPF_METHOD},
- {acosW, Math_acos, PROPF_METHOD},
- {asinW, Math_asin, PROPF_METHOD},
- {atanW, Math_atan, PROPF_METHOD},
- {atan2W, Math_atan2, PROPF_METHOD},
- {ceilW, Math_ceil, PROPF_METHOD},
- {cosW, Math_cos, PROPF_METHOD},
- {expW, Math_exp, PROPF_METHOD},
- {floorW, Math_floor, PROPF_METHOD},
- {logW, Math_log, PROPF_METHOD},
- {maxW, Math_max, PROPF_METHOD},
- {minW, Math_min, PROPF_METHOD},
- {powW, Math_pow, PROPF_METHOD},
+ {absW, Math_abs, PROPF_METHOD|1},
+ {acosW, Math_acos, PROPF_METHOD|1},
+ {asinW, Math_asin, PROPF_METHOD|1},
+ {atanW, Math_atan, PROPF_METHOD|1},
+ {atan2W, Math_atan2, PROPF_METHOD|2},
+ {ceilW, Math_ceil, PROPF_METHOD|1},
+ {cosW, Math_cos, PROPF_METHOD|1},
+ {expW, Math_exp, PROPF_METHOD|1},
+ {floorW, Math_floor, PROPF_METHOD|1},
+ {logW, Math_log, PROPF_METHOD|1},
+ {maxW, Math_max, PROPF_METHOD|2},
+ {minW, Math_min, PROPF_METHOD|2},
+ {powW, Math_pow, PROPF_METHOD|2},
{randomW, Math_random, PROPF_METHOD},
- {roundW, Math_round, PROPF_METHOD},
- {sinW, Math_sin, PROPF_METHOD},
- {sqrtW, Math_sqrt, PROPF_METHOD},
- {tanW, Math_tan, PROPF_METHOD}
+ {roundW, Math_round, PROPF_METHOD|1},
+ {sinW, Math_sin, PROPF_METHOD|1},
+ {sqrtW, Math_sqrt, PROPF_METHOD|1},
+ {tanW, Math_tan, PROPF_METHOD|1}
};
static const builtin_info_t Math_info = {
@@ -601,5 +602,19 @@ static const builtin_info_t Math_info = {
HRESULT create_math(script_ctx_t *ctx, DispatchEx **ret)
{
- return create_dispex(ctx, &Math_info, NULL, ret);
+ DispatchEx *math;
+ HRESULT hres;
+
+ math = heap_alloc_zero(sizeof(DispatchEx));
+ if(!math)
+ return E_OUTOFMEMORY;
+
+ hres = init_dispex_from_constr(math, ctx, &Math_info, ctx->object_constr);
+ if(FAILED(hres)) {
+ heap_free(math);
+ return hres;
+ }
+
+ *ret = math;
+ return S_OK;
}
diff --git a/reactos/dll/win32/jscript/number.c b/reactos/dll/win32/jscript/number.c
index d6591d06317..30b7a56d6a9 100644
--- a/reactos/dll/win32/jscript/number.c
+++ b/reactos/dll/win32/jscript/number.c
@@ -16,6 +16,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "config.h"
+#include "wine/port.h"
+
+#include
+
#include "jscript.h"
#include "wine/debug.h"
@@ -34,36 +39,127 @@ static const WCHAR toFixedW[] = {'t','o','F','i','x','e','d',0};
static const WCHAR toExponentialW[] = {'t','o','E','x','p','o','n','e','n','t','i','a','l',0};
static const WCHAR toPrecisionW[] = {'t','o','P','r','e','c','i','s','i','o','n',0};
static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0};
-static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0};
-static const WCHAR propertyIsEnumerableW[] =
- {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0};
-static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0};
+#define NUMBER_TOSTRING_BUF_SIZE 64
/* ECMA-262 3rd Edition 15.7.4.2 */
static HRESULT Number_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
NumberInstance *number;
+ INT radix = 10;
+ DOUBLE val;
BSTR str;
HRESULT hres;
TRACE("\n");
- if(!is_class(dispex, JSCLASS_NUMBER)) {
- FIXME("throw TypeError\n");
- return E_FAIL;
- }
+ if(!is_class(dispex, JSCLASS_NUMBER))
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_NUM, NULL);
number = (NumberInstance*)dispex;
- if(arg_cnt(dp) != 0) {
- FIXME("unsupported args\n");
- return E_NOTIMPL;
+ if(arg_cnt(dp)) {
+ hres = to_int32(dispex->ctx, get_arg(dp, 0), ei, &radix);
+ if(FAILED(hres))
+ return hres;
+
+ if(radix<2 || radix>36)
+ return throw_type_error(dispex->ctx, ei, IDS_INVALID_CALL_ARG, NULL);
}
- hres = to_string(dispex->ctx, &number->num, ei, &str);
- if(FAILED(hres))
- return hres;
+ if(V_VT(&number->num) == VT_I4)
+ val = V_I4(&number->num);
+ else
+ val = V_R8(&number->num);
+
+ if(radix==10 || isnan(val) || isinf(val)) {
+ hres = to_string(dispex->ctx, &number->num, ei, &str);
+ if(FAILED(hres))
+ return hres;
+ }
+ else {
+ INT idx = 0;
+ DOUBLE integ, frac, log_radix = 0;
+ WCHAR buf[NUMBER_TOSTRING_BUF_SIZE+16];
+ BOOL exp = FALSE;
+
+ if(val<0) {
+ val = -val;
+ buf[idx++] = '-';
+ }
+
+ while(1) {
+ integ = floor(val);
+ frac = val-integ;
+
+ if(integ == 0)
+ buf[idx++] = '0';
+ while(integ>=1 && idx beg) {
+ wch = buf[beg];
+ buf[beg++] = buf[end];
+ buf[end--] = wch;
+ }
+ }
+
+ if(idx != NUMBER_TOSTRING_BUF_SIZE) buf[idx++] = '.';
+
+ while(frac>0 && idxctx, ei, IDS_NOT_NUM, NULL);
if(retv) {
NumberInstance *number = (NumberInstance*)dispex;
@@ -119,33 +213,14 @@ static HRESULT Number_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
return S_OK;
}
-static HRESULT Number_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT Number_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT Number_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
static HRESULT Number_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
NumberInstance *number = (NumberInstance*)dispex;
switch(flags) {
+ case INVOKE_FUNC:
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL);
case DISPATCH_PROPERTYGET:
*retv = number->num;
break;
@@ -159,14 +234,11 @@ static HRESULT Number_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
}
static const builtin_prop_t Number_props[] = {
- {hasOwnPropertyW, Number_hasOwnProperty, PROPF_METHOD},
- {isPrototypeOfW, Number_isPrototypeOf, PROPF_METHOD},
- {propertyIsEnumerableW, Number_propertyIsEnumerable, PROPF_METHOD},
- {toExponentialW, Number_toExponential, PROPF_METHOD},
+ {toExponentialW, Number_toExponential, PROPF_METHOD|1},
{toFixedW, Number_toFixed, PROPF_METHOD},
{toLocaleStringW, Number_toLocaleString, PROPF_METHOD},
- {toPrecisionW, Number_toPrecision, PROPF_METHOD},
- {toStringW, Number_toString, PROPF_METHOD},
+ {toPrecisionW, Number_toPrecision, PROPF_METHOD|1},
+ {toStringW, Number_toString, PROPF_METHOD|1},
{valueOfW, Number_valueOf, PROPF_METHOD}
};
@@ -233,7 +305,7 @@ static HRESULT NumberConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS
return S_OK;
}
-static HRESULT alloc_number(script_ctx_t *ctx, BOOL use_constr, NumberInstance **ret)
+static HRESULT alloc_number(script_ctx_t *ctx, DispatchEx *object_prototype, NumberInstance **ret)
{
NumberInstance *number;
HRESULT hres;
@@ -242,10 +314,10 @@ static HRESULT alloc_number(script_ctx_t *ctx, BOOL use_constr, NumberInstance *
if(!number)
return E_OUTOFMEMORY;
- if(use_constr)
- hres = init_dispex_from_constr(&number->dispex, ctx, &Number_info, ctx->number_constr);
+ if(object_prototype)
+ hres = init_dispex(&number->dispex, ctx, &Number_info, object_prototype);
else
- hres = init_dispex(&number->dispex, ctx, &Number_info, NULL);
+ hres = init_dispex_from_constr(&number->dispex, ctx, &Number_info, ctx->number_constr);
if(FAILED(hres))
return hres;
@@ -253,12 +325,12 @@ static HRESULT alloc_number(script_ctx_t *ctx, BOOL use_constr, NumberInstance *
return S_OK;
}
-HRESULT create_number_constr(script_ctx_t *ctx, DispatchEx **ret)
+HRESULT create_number_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
{
NumberInstance *number;
HRESULT hres;
- hres = alloc_number(ctx, FALSE, &number);
+ hres = alloc_number(ctx, object_prototype, &number);
if(FAILED(hres))
return hres;
@@ -274,7 +346,7 @@ HRESULT create_number(script_ctx_t *ctx, VARIANT *num, DispatchEx **ret)
NumberInstance *number;
HRESULT hres;
- hres = alloc_number(ctx, TRUE, &number);
+ hres = alloc_number(ctx, NULL, &number);
if(FAILED(hres))
return hres;
diff --git a/reactos/dll/win32/jscript/object.c b/reactos/dll/win32/jscript/object.c
index 9474bc4f8bc..e8624bd79aa 100644
--- a/reactos/dll/win32/jscript/object.c
+++ b/reactos/dll/win32/jscript/object.c
@@ -35,22 +35,65 @@ static const WCHAR default_valueW[] = {'[','o','b','j','e','c','t',' ','O','b','
static HRESULT Object_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR formatW[] = {'[','o','b','j','e','c','t',' ','%','s',']',0};
+
+ static const WCHAR arrayW[] = {'A','r','r','a','y',0};
+ static const WCHAR booleanW[] = {'B','o','o','l','e','a','n',0};
+ static const WCHAR dateW[] = {'D','a','t','e',0};
+ static const WCHAR errorW[] = {'E','r','r','o','r',0};
+ static const WCHAR functionW[] = {'F','u','n','c','t','i','o','n',0};
+ static const WCHAR mathW[] = {'M','a','t','h',0};
+ static const WCHAR numberW[] = {'N','u','m','b','e','r',0};
+ static const WCHAR objectW[] = {'O','b','j','e','c','t',0};
+ static const WCHAR regexpW[] = {'R','e','g','E','x','p',0};
+ static const WCHAR stringW[] = {'S','t','r','i','n','g',0};
+ /* Keep in sync with jsclass_t enum */
+ static const WCHAR *names[] = {NULL, arrayW, booleanW, dateW, errorW,
+ functionW, NULL, mathW, numberW, objectW, regexpW, stringW};
+
+ TRACE("\n");
+
+ if(names[dispex->builtin_info->class] == NULL) {
+ ERR("dispex->builtin_info->class = %d\n",
+ dispex->builtin_info->class);
+ return E_FAIL;
+ }
+
+ if(retv) {
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = SysAllocStringLen(NULL, 9+strlenW(names[dispex->builtin_info->class]));
+ if(!V_BSTR(retv))
+ return E_OUTOFMEMORY;
+
+ sprintfW(V_BSTR(retv), formatW, names[dispex->builtin_info->class]);
+ }
+
+ return S_OK;
}
static HRESULT Object_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ DISPPARAMS params = {NULL, NULL, 0, 0};
+
+ TRACE("\n");
+
+ return jsdisp_call_name(dispex, toStringW, lcid, DISPATCH_METHOD, ¶ms, retv, ei, sp);
}
static HRESULT Object_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ if(retv) {
+ IDispatchEx_AddRef(_IDispatchEx_(dispex));
+
+ V_VT(retv) = VT_DISPATCH;
+ V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(dispex);
+ }
+
+ return S_OK;
}
static HRESULT Object_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
@@ -80,6 +123,8 @@ static HRESULT Object_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
TRACE("\n");
switch(flags) {
+ case INVOKE_FUNC:
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL);
case DISPATCH_PROPERTYGET:
V_VT(retv) = VT_BSTR;
V_BSTR(retv) = SysAllocString(default_valueW);
@@ -100,9 +145,9 @@ static void Object_destructor(DispatchEx *dispex)
}
static const builtin_prop_t Object_props[] = {
- {hasOwnPropertyW, Object_hasOwnProperty, PROPF_METHOD},
- {isPrototypeOfW, Object_isPrototypeOf, PROPF_METHOD},
- {propertyIsEnumerableW, Object_propertyIsEnumerable, PROPF_METHOD},
+ {hasOwnPropertyW, Object_hasOwnProperty, PROPF_METHOD|1},
+ {isPrototypeOfW, Object_isPrototypeOf, PROPF_METHOD|1},
+ {propertyIsEnumerableW, Object_propertyIsEnumerable, PROPF_METHOD|1},
{toLocaleStringW, Object_toLocaleString, PROPF_METHOD},
{toStringW, Object_toString, PROPF_METHOD},
{valueOfW, Object_valueOf, PROPF_METHOD}
@@ -145,19 +190,15 @@ static HRESULT ObjectConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS
return S_OK;
}
-HRESULT create_object_constr(script_ctx_t *ctx, DispatchEx **ret)
+HRESULT create_object_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
{
- DispatchEx *object;
- HRESULT hres;
+ return create_builtin_function(ctx, ObjectConstr_value, NULL, PROPF_CONSTR,
+ object_prototype, ret);
+}
- hres = create_dispex(ctx, &Object_info, NULL, &object);
- if(FAILED(hres))
- return hres;
-
- hres = create_builtin_function(ctx, ObjectConstr_value, NULL, PROPF_CONSTR, object, ret);
-
- jsdisp_release(object);
- return hres;
+HRESULT create_object_prototype(script_ctx_t *ctx, DispatchEx **ret)
+{
+ return create_dispex(ctx, &Object_info, NULL, ret);
}
HRESULT create_object(script_ctx_t *ctx, DispatchEx *constr, DispatchEx **ret)
diff --git a/reactos/dll/win32/jscript/parser.tab.c b/reactos/dll/win32/jscript/parser.tab.c
index 0f1cf085a48..8334a0c3d29 100644
--- a/reactos/dll/win32/jscript/parser.tab.c
+++ b/reactos/dll/win32/jscript/parser.tab.c
@@ -86,6 +86,8 @@
#define YYPARSE_PARAM ctx
static int parser_error(const char*);
+static void set_error(parser_ctx_t*,UINT);
+static BOOL explicit_error(parser_ctx_t*,void*,WCHAR);
static BOOL allow_auto_semicolon(parser_ctx_t*);
static void program_parsed(parser_ctx_t*,source_elements_t*);
static source_elements_t *function_body_parsed(parser_ctx_t*,source_elements_t*);
@@ -205,7 +207,7 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state
/* Line 189 of yacc.c */
-#line 209 "parser.tab.c"
+#line 211 "parser.tab.c"
/* Enabling traces. */
#ifndef YYDEBUG
@@ -284,7 +286,7 @@ typedef union YYSTYPE
{
/* Line 214 of yacc.c */
-#line 149 "parser.y"
+#line 151 "parser.y"
int ival;
const WCHAR *srcptr;
@@ -308,7 +310,7 @@ typedef union YYSTYPE
/* Line 214 of yacc.c */
-#line 312 "parser.tab.c"
+#line 314 "parser.tab.c"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -320,7 +322,7 @@ typedef union YYSTYPE
/* Line 264 of yacc.c */
-#line 324 "parser.tab.c"
+#line 326 "parser.tab.c"
#ifdef short
# undef short
@@ -535,16 +537,16 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 3
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 891
+#define YYLAST 942
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 67
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 86
+#define YYNNTS 94
/* YYNRULES -- Number of rules. */
-#define YYNRULES 199
+#define YYNRULES 211
/* YYNRULES -- Number of states. */
-#define YYNSTATES 358
+#define YYNSTATES 370
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
#define YYUNDEFTOK 2
@@ -559,16 +561,16 @@ static const yytype_uint8 yytranslate[] =
0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 63, 2, 2, 2, 61, 56, 2,
- 46, 47, 59, 57, 49, 58, 66, 60, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 52, 51,
- 2, 50, 2, 53, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 61, 2, 2, 2, 59, 54, 2,
+ 65, 66, 57, 55, 47, 56, 64, 58, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 50, 49,
+ 2, 48, 2, 51, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 64, 2, 65, 55, 2, 2, 2, 2, 2,
+ 2, 62, 2, 63, 53, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 48, 54, 37, 62, 2, 2, 2,
+ 2, 2, 2, 46, 52, 37, 60, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -598,114 +600,121 @@ static const yytype_uint16 yyprhs[] =
47, 49, 51, 53, 55, 57, 59, 61, 63, 65,
68, 69, 71, 75, 78, 82, 84, 88, 90, 94,
97, 100, 101, 103, 106, 107, 109, 112, 114, 117,
- 125, 131, 139, 145, 155, 166, 174, 183, 187, 191,
- 195, 201, 205, 211, 215, 221, 222, 224, 226, 229,
- 234, 238, 242, 246, 250, 255, 261, 264, 265, 267,
- 269, 273, 274, 276, 278, 282, 284, 288, 292, 294,
- 298, 302, 304, 310, 312, 318, 320, 324, 326, 330,
- 332, 336, 338, 342, 344, 348, 350, 354, 356, 360,
- 362, 366, 368, 372, 374, 378, 380, 384, 386, 390,
- 392, 396, 400, 404, 406, 410, 414, 416, 420, 422,
- 426, 430, 432, 436, 440, 444, 446, 449, 452, 455,
- 458, 461, 464, 467, 470, 473, 475, 478, 481, 483,
- 485, 487, 490, 492, 494, 499, 503, 507, 510, 513,
- 518, 522, 525, 529, 531, 535, 537, 539, 541, 543,
- 545, 549, 552, 556, 560, 566, 569, 574, 576, 579,
- 580, 582, 585, 589, 593, 599, 601, 603, 605, 606,
- 608, 610, 612, 614, 616, 618, 620, 622, 624, 626
+ 125, 131, 139, 145, 146, 147, 159, 160, 161, 174,
+ 182, 191, 195, 199, 203, 209, 213, 219, 223, 229,
+ 230, 232, 234, 237, 242, 246, 250, 254, 258, 263,
+ 269, 272, 273, 275, 277, 279, 281, 285, 286, 288,
+ 290, 294, 296, 300, 304, 306, 310, 314, 316, 322,
+ 324, 330, 332, 336, 338, 342, 344, 348, 350, 354,
+ 356, 360, 362, 366, 368, 372, 374, 378, 380, 384,
+ 386, 390, 392, 396, 398, 402, 404, 408, 412, 416,
+ 418, 422, 426, 428, 432, 434, 438, 442, 444, 448,
+ 452, 456, 458, 461, 464, 467, 470, 473, 476, 479,
+ 482, 485, 487, 490, 493, 495, 497, 499, 502, 504,
+ 506, 511, 515, 519, 522, 525, 530, 534, 537, 541,
+ 543, 547, 549, 551, 553, 555, 557, 561, 564, 568,
+ 572, 578, 581, 586, 588, 591, 592, 594, 597, 601,
+ 605, 611, 613, 615, 617, 618, 620, 622, 624, 626,
+ 628, 630, 632, 634, 636, 638, 640, 642, 644, 646,
+ 648, 650
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
static const yytype_int16 yyrhs[] =
{
68, 0, -1, 70, 69, -1, 35, -1, -1, -1,
- 70, 76, -1, 72, 149, 46, 75, 47, 48, 73,
- 37, -1, 36, -1, 70, -1, 38, -1, 74, 49,
+ 70, 76, -1, 72, 154, 158, 75, 159, 46, 73,
+ 37, -1, 36, -1, 70, -1, 38, -1, 74, 47,
38, -1, -1, 74, -1, 79, -1, 80, -1, 89,
- -1, 90, -1, 91, -1, 92, -1, 93, -1, 94,
- -1, 95, -1, 96, -1, 97, -1, 98, -1, 104,
- -1, 105, -1, 76, -1, 77, 76, -1, -1, 77,
- -1, 48, 77, 37, -1, 48, 37, -1, 27, 81,
- 152, -1, 83, -1, 81, 49, 83, -1, 84, -1,
- 82, 49, 84, -1, 38, 85, -1, 38, 87, -1,
- -1, 86, -1, 50, 112, -1, -1, 88, -1, 50,
- 113, -1, 51, -1, 109, 152, -1, 11, 46, 109,
- 47, 76, 10, 76, -1, 11, 46, 109, 47, 76,
- -1, 9, 76, 29, 46, 109, 47, 51, -1, 29,
- 46, 109, 47, 76, -1, 13, 46, 110, 51, 108,
- 51, 108, 47, 76, -1, 13, 46, 27, 82, 51,
- 108, 51, 108, 47, 76, -1, 13, 46, 135, 14,
- 109, 47, 76, -1, 13, 46, 27, 84, 14, 109,
- 47, 76, -1, 6, 149, 152, -1, 3, 149, 152,
- -1, 19, 108, 152, -1, 30, 46, 109, 47, 76,
- -1, 38, 52, 76, -1, 20, 46, 109, 47, 99,
- -1, 48, 100, 37, -1, 48, 100, 103, 100, 37,
- -1, -1, 101, -1, 102, -1, 101, 102, -1, 4,
- 109, 52, 78, -1, 7, 52, 78, -1, 22, 109,
- 152, -1, 25, 79, 106, -1, 25, 79, 107, -1,
- 25, 79, 106, 107, -1, 5, 46, 38, 47, 79,
- -1, 12, 79, -1, -1, 109, -1, 112, -1, 109,
- 49, 112, -1, -1, 111, -1, 113, -1, 111, 49,
- 113, -1, 114, -1, 135, 50, 112, -1, 135, 39,
- 112, -1, 115, -1, 135, 50, 113, -1, 135, 39,
- 113, -1, 116, -1, 116, 53, 112, 52, 112, -1,
- 117, -1, 117, 53, 113, 52, 113, -1, 118, -1,
- 116, 32, 118, -1, 119, -1, 117, 32, 119, -1,
- 120, -1, 118, 31, 120, -1, 121, -1, 119, 31,
- 121, -1, 122, -1, 120, 54, 122, -1, 123, -1,
- 121, 54, 123, -1, 124, -1, 122, 55, 124, -1,
- 125, -1, 123, 55, 125, -1, 126, -1, 124, 56,
- 126, -1, 127, -1, 125, 56, 127, -1, 128, -1,
- 126, 40, 128, -1, 129, -1, 127, 40, 129, -1,
- 130, -1, 128, 42, 130, -1, 128, 15, 130, -1,
- 128, 14, 130, -1, 130, -1, 129, 42, 130, -1,
- 129, 15, 130, -1, 131, -1, 130, 41, 131, -1,
- 132, -1, 131, 57, 132, -1, 131, 58, 132, -1,
- 133, -1, 132, 59, 133, -1, 132, 60, 133, -1,
- 132, 61, 133, -1, 134, -1, 8, 133, -1, 28,
- 133, -1, 26, 133, -1, 33, 133, -1, 34, 133,
- -1, 57, 133, -1, 58, 133, -1, 62, 133, -1,
- 63, 133, -1, 135, -1, 135, 33, -1, 135, 34,
- -1, 136, -1, 138, -1, 137, -1, 16, 136, -1,
- 141, -1, 71, -1, 137, 64, 109, 65, -1, 137,
- 66, 38, -1, 16, 137, 139, -1, 137, 139, -1,
- 138, 139, -1, 138, 64, 109, 65, -1, 138, 66,
- 38, -1, 46, 47, -1, 46, 140, 47, -1, 112,
- -1, 140, 49, 112, -1, 21, -1, 38, -1, 150,
- -1, 142, -1, 146, -1, 46, 109, 47, -1, 64,
- 65, -1, 64, 144, 65, -1, 64, 143, 65, -1,
- 64, 143, 49, 145, 65, -1, 145, 112, -1, 143,
- 49, 145, 112, -1, 49, -1, 144, 49, -1, -1,
- 144, -1, 48, 37, -1, 48, 147, 37, -1, 148,
- 52, 112, -1, 147, 49, 148, 52, 112, -1, 38,
- -1, 44, -1, 43, -1, -1, 38, -1, 17, -1,
- 18, -1, 151, -1, 43, -1, 44, -1, 60, -1,
- 23, -1, 24, -1, 51, -1, 1, -1
+ -1, 90, -1, 91, -1, 92, -1, 97, -1, 98,
+ -1, 99, -1, 100, -1, 101, -1, 102, -1, 108,
+ -1, 109, -1, 76, -1, 77, 76, -1, -1, 77,
+ -1, 46, 77, 37, -1, 46, 37, -1, 27, 81,
+ 157, -1, 83, -1, 81, 47, 83, -1, 84, -1,
+ 82, 47, 84, -1, 38, 85, -1, 38, 87, -1,
+ -1, 86, -1, 48, 117, -1, -1, 88, -1, 48,
+ 118, -1, 49, -1, 114, 157, -1, 11, 158, 113,
+ 159, 76, 10, 76, -1, 11, 158, 113, 159, 76,
+ -1, 9, 76, 29, 158, 113, 159, 157, -1, 29,
+ 158, 113, 159, 76, -1, -1, -1, 13, 158, 115,
+ 93, 160, 112, 94, 160, 112, 159, 76, -1, -1,
+ -1, 13, 158, 27, 82, 95, 160, 112, 96, 160,
+ 112, 159, 76, -1, 13, 158, 140, 14, 113, 159,
+ 76, -1, 13, 158, 27, 84, 14, 113, 159, 76,
+ -1, 6, 154, 157, -1, 3, 154, 157, -1, 19,
+ 112, 157, -1, 30, 158, 114, 159, 76, -1, 38,
+ 50, 76, -1, 20, 158, 114, 159, 103, -1, 46,
+ 104, 37, -1, 46, 104, 107, 104, 37, -1, -1,
+ 105, -1, 106, -1, 105, 106, -1, 4, 114, 50,
+ 78, -1, 7, 50, 78, -1, 22, 114, 157, -1,
+ 25, 79, 110, -1, 25, 79, 111, -1, 25, 79,
+ 110, 111, -1, 5, 158, 38, 159, 79, -1, 12,
+ 79, -1, -1, 114, -1, 114, -1, 1, -1, 117,
+ -1, 114, 47, 117, -1, -1, 116, -1, 118, -1,
+ 116, 47, 118, -1, 119, -1, 140, 48, 117, -1,
+ 140, 39, 117, -1, 120, -1, 140, 48, 118, -1,
+ 140, 39, 118, -1, 121, -1, 121, 51, 117, 50,
+ 117, -1, 122, -1, 122, 51, 118, 50, 118, -1,
+ 123, -1, 121, 32, 123, -1, 124, -1, 122, 32,
+ 124, -1, 125, -1, 123, 31, 125, -1, 126, -1,
+ 124, 31, 126, -1, 127, -1, 125, 52, 127, -1,
+ 128, -1, 126, 52, 128, -1, 129, -1, 127, 53,
+ 129, -1, 130, -1, 128, 53, 130, -1, 131, -1,
+ 129, 54, 131, -1, 132, -1, 130, 54, 132, -1,
+ 133, -1, 131, 40, 133, -1, 134, -1, 132, 40,
+ 134, -1, 135, -1, 133, 42, 135, -1, 133, 15,
+ 135, -1, 133, 14, 135, -1, 135, -1, 134, 42,
+ 135, -1, 134, 15, 135, -1, 136, -1, 135, 41,
+ 136, -1, 137, -1, 136, 55, 137, -1, 136, 56,
+ 137, -1, 138, -1, 137, 57, 138, -1, 137, 58,
+ 138, -1, 137, 59, 138, -1, 139, -1, 8, 138,
+ -1, 28, 138, -1, 26, 138, -1, 33, 138, -1,
+ 34, 138, -1, 55, 138, -1, 56, 138, -1, 60,
+ 138, -1, 61, 138, -1, 140, -1, 140, 33, -1,
+ 140, 34, -1, 141, -1, 143, -1, 142, -1, 16,
+ 141, -1, 146, -1, 71, -1, 142, 62, 114, 63,
+ -1, 142, 64, 38, -1, 16, 142, 144, -1, 142,
+ 144, -1, 143, 144, -1, 143, 62, 114, 63, -1,
+ 143, 64, 38, -1, 65, 66, -1, 65, 145, 66,
+ -1, 117, -1, 145, 47, 117, -1, 21, -1, 38,
+ -1, 155, -1, 147, -1, 151, -1, 65, 114, 66,
+ -1, 62, 63, -1, 62, 149, 63, -1, 62, 148,
+ 63, -1, 62, 148, 47, 150, 63, -1, 150, 117,
+ -1, 148, 47, 150, 117, -1, 47, -1, 149, 47,
+ -1, -1, 149, -1, 46, 37, -1, 46, 152, 37,
+ -1, 153, 50, 117, -1, 152, 47, 153, 50, 117,
+ -1, 38, -1, 44, -1, 43, -1, -1, 38, -1,
+ 17, -1, 18, -1, 156, -1, 43, -1, 44, -1,
+ 58, -1, 23, -1, 24, -1, 49, -1, 1, -1,
+ 65, -1, 1, -1, 66, -1, 1, -1, 49, -1,
+ 1, -1
};
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
{
- 0, 254, 254, 258, 259, 263, 264, 269, 273, 277,
- 281, 282, 287, 288, 292, 293, 294, 295, 296, 297,
- 298, 299, 300, 301, 302, 303, 304, 305, 309, 310,
- 315, 316, 320, 321, 325, 330, 331, 336, 338, 343,
- 348, 353, 354, 358, 363, 364, 368, 373, 377, 382,
- 384, 389, 391, 393, 395, 397, 399, 404, 409, 414,
- 419, 424, 429, 434, 436, 441, 442, 446, 447, 452,
- 457, 462, 467, 468, 469, 474, 479, 483, 484, 488,
- 489, 494, 495, 499, 501, 506, 507, 509, 514, 516,
- 518, 523, 524, 529, 531, 536, 537, 542, 544, 549,
- 550, 555, 557, 562, 563, 568, 570, 575, 576, 581,
- 583, 588, 589, 594, 596, 601, 602, 607, 608, 613,
- 614, 616, 618, 623, 624, 626, 631, 632, 637, 639,
- 641, 646, 647, 649, 651, 656, 657, 659, 660, 662,
- 663, 664, 665, 666, 667, 671, 673, 675, 681, 682,
- 686, 687, 691, 692, 693, 695, 697, 702, 704, 706,
- 708, 713, 714, 718, 719, 724, 725, 726, 727, 728,
- 729, 733, 734, 735, 736, 741, 743, 748, 749, 753,
- 754, 758, 759, 764, 766, 771, 772, 773, 777, 778,
- 782, 783, 784, 785, 786, 787, 792, 793, 796, 797
+ 0, 256, 256, 260, 261, 265, 266, 271, 275, 279,
+ 283, 284, 289, 290, 294, 295, 296, 297, 298, 299,
+ 300, 301, 302, 303, 304, 305, 306, 307, 311, 312,
+ 317, 318, 322, 323, 327, 332, 333, 338, 340, 345,
+ 350, 355, 356, 360, 365, 366, 370, 375, 379, 384,
+ 386, 391, 393, 396, 398, 395, 402, 404, 401, 407,
+ 409, 414, 419, 424, 429, 434, 439, 444, 446, 451,
+ 452, 456, 457, 462, 467, 472, 477, 478, 479, 484,
+ 489, 493, 494, 497, 498, 502, 503, 508, 509, 513,
+ 515, 520, 521, 523, 528, 530, 532, 537, 538, 543,
+ 545, 550, 551, 556, 558, 563, 564, 569, 571, 576,
+ 577, 582, 584, 589, 590, 595, 597, 602, 603, 608,
+ 610, 615, 616, 621, 622, 627, 628, 630, 632, 637,
+ 638, 640, 645, 646, 651, 653, 655, 660, 661, 663,
+ 665, 670, 671, 673, 674, 676, 677, 678, 679, 680,
+ 681, 685, 687, 689, 695, 696, 700, 701, 705, 706,
+ 707, 709, 711, 716, 718, 720, 722, 727, 728, 732,
+ 733, 738, 739, 740, 741, 742, 743, 747, 748, 749,
+ 750, 755, 757, 762, 763, 767, 768, 772, 773, 778,
+ 780, 785, 786, 787, 791, 792, 796, 797, 798, 799,
+ 800, 801, 806, 807, 810, 811, 814, 815, 818, 819,
+ 822, 823
};
#endif
@@ -721,9 +730,9 @@ static const char *const yytname[] =
"kWHILE", "kWITH", "tANDAND", "tOROR", "tINC", "tDEC", "tHTMLCOMMENT",
"kFUNCTION", "'}'", "tIdentifier", "tAssignOper", "tEqOper",
"tShiftOper", "tRelOper", "tNumericLiteral", "tStringLiteral",
- "LOWER_THAN_ELSE", "'('", "')'", "'{'", "','", "'='", "';'", "':'",
- "'?'", "'|'", "'^'", "'&'", "'+'", "'-'", "'*'", "'/'", "'%'", "'~'",
- "'!'", "'['", "']'", "'.'", "$accept", "Program", "HtmlComment",
+ "LOWER_THAN_ELSE", "'{'", "','", "'='", "';'", "':'", "'?'", "'|'",
+ "'^'", "'&'", "'+'", "'-'", "'*'", "'/'", "'%'", "'~'", "'!'", "'['",
+ "']'", "'.'", "'('", "')'", "$accept", "Program", "HtmlComment",
"SourceElements", "FunctionExpression", "KFunction", "FunctionBody",
"FormalParameterList", "FormalParameterList_opt", "Statement",
"StatementList", "StatementList_opt", "Block", "VariableStatement",
@@ -731,12 +740,13 @@ static const char *const yytname[] =
"VariableDeclaration", "VariableDeclarationNoIn", "Initialiser_opt",
"Initialiser", "InitialiserNoIn_opt", "InitialiserNoIn",
"EmptyStatement", "ExpressionStatement", "IfStatement",
- "IterationStatement", "ContinueStatement", "BreakStatement",
- "ReturnStatement", "WithStatement", "LabelledStatement",
- "SwitchStatement", "CaseBlock", "CaseClausules_opt", "CaseClausules",
- "CaseClausule", "DefaultClausule", "ThrowStatement", "TryStatement",
- "Catch", "Finally", "Expression_opt", "Expression", "ExpressionNoIn_opt",
- "ExpressionNoIn", "AssignmentExpression", "AssignmentExpressionNoIn",
+ "IterationStatement", "$@1", "$@2", "$@3", "$@4", "ContinueStatement",
+ "BreakStatement", "ReturnStatement", "WithStatement",
+ "LabelledStatement", "SwitchStatement", "CaseBlock", "CaseClausules_opt",
+ "CaseClausules", "CaseClausule", "DefaultClausule", "ThrowStatement",
+ "TryStatement", "Catch", "Finally", "Expression_opt", "Expression_err",
+ "Expression", "ExpressionNoIn_opt", "ExpressionNoIn",
+ "AssignmentExpression", "AssignmentExpressionNoIn",
"ConditionalExpression", "ConditionalExpressionNoIn",
"LogicalORExpression", "LogicalORExpressionNoIn", "LogicalANDExpression",
"LogicalANDExpressionNoIn", "BitwiseORExpression",
@@ -750,7 +760,8 @@ static const char *const yytname[] =
"CallExpression", "Arguments", "ArgumentList", "PrimaryExpression",
"ArrayLiteral", "ElementList", "Elision", "Elision_opt", "ObjectLiteral",
"PropertyNameAndValueList", "PropertyName", "Identifier_opt", "Literal",
- "BooleanLiteral", "semicolon_opt", 0
+ "BooleanLiteral", "semicolon_opt", "left_bracket", "right_bracket",
+ "semicolon", 0
};
#endif
@@ -763,9 +774,9 @@ static const yytype_uint16 yytoknum[] =
265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
285, 286, 287, 288, 289, 290, 291, 125, 292, 293,
- 294, 295, 296, 297, 298, 299, 40, 41, 123, 44,
- 61, 59, 58, 63, 124, 94, 38, 43, 45, 42,
- 47, 37, 126, 33, 91, 93, 46
+ 294, 295, 296, 297, 298, 299, 123, 44, 61, 59,
+ 58, 63, 124, 94, 38, 43, 45, 42, 47, 37,
+ 126, 33, 91, 93, 46, 40, 41
};
# endif
@@ -777,21 +788,23 @@ static const yytype_uint8 yyr1[] =
76, 76, 76, 76, 76, 76, 76, 76, 77, 77,
78, 78, 79, 79, 80, 81, 81, 82, 82, 83,
84, 85, 85, 86, 87, 87, 88, 89, 90, 91,
- 91, 92, 92, 92, 92, 92, 92, 93, 94, 95,
- 96, 97, 98, 99, 99, 100, 100, 101, 101, 102,
- 103, 104, 105, 105, 105, 106, 107, 108, 108, 109,
- 109, 110, 110, 111, 111, 112, 112, 112, 113, 113,
- 113, 114, 114, 115, 115, 116, 116, 117, 117, 118,
- 118, 119, 119, 120, 120, 121, 121, 122, 122, 123,
- 123, 124, 124, 125, 125, 126, 126, 127, 127, 128,
- 128, 128, 128, 129, 129, 129, 130, 130, 131, 131,
- 131, 132, 132, 132, 132, 133, 133, 133, 133, 133,
- 133, 133, 133, 133, 133, 134, 134, 134, 135, 135,
- 136, 136, 137, 137, 137, 137, 137, 138, 138, 138,
- 138, 139, 139, 140, 140, 141, 141, 141, 141, 141,
- 141, 142, 142, 142, 142, 143, 143, 144, 144, 145,
- 145, 146, 146, 147, 147, 148, 148, 148, 149, 149,
- 150, 150, 150, 150, 150, 150, 151, 151, 152, 152
+ 91, 92, 92, 93, 94, 92, 95, 96, 92, 92,
+ 92, 97, 98, 99, 100, 101, 102, 103, 103, 104,
+ 104, 105, 105, 106, 107, 108, 109, 109, 109, 110,
+ 111, 112, 112, 113, 113, 114, 114, 115, 115, 116,
+ 116, 117, 117, 117, 118, 118, 118, 119, 119, 120,
+ 120, 121, 121, 122, 122, 123, 123, 124, 124, 125,
+ 125, 126, 126, 127, 127, 128, 128, 129, 129, 130,
+ 130, 131, 131, 132, 132, 133, 133, 133, 133, 134,
+ 134, 134, 135, 135, 136, 136, 136, 137, 137, 137,
+ 137, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 139, 139, 139, 140, 140, 141, 141, 142, 142,
+ 142, 142, 142, 143, 143, 143, 143, 144, 144, 145,
+ 145, 146, 146, 146, 146, 146, 146, 147, 147, 147,
+ 147, 148, 148, 149, 149, 150, 150, 151, 151, 152,
+ 152, 153, 153, 153, 154, 154, 155, 155, 155, 155,
+ 155, 155, 156, 156, 157, 157, 158, 158, 159, 159,
+ 160, 160
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
@@ -802,21 +815,23 @@ static const yytype_uint8 yyr2[] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
0, 1, 3, 2, 3, 1, 3, 1, 3, 2,
2, 0, 1, 2, 0, 1, 2, 1, 2, 7,
- 5, 7, 5, 9, 10, 7, 8, 3, 3, 3,
- 5, 3, 5, 3, 5, 0, 1, 1, 2, 4,
- 3, 3, 3, 3, 4, 5, 2, 0, 1, 1,
- 3, 0, 1, 1, 3, 1, 3, 3, 1, 3,
- 3, 1, 5, 1, 5, 1, 3, 1, 3, 1,
+ 5, 7, 5, 0, 0, 11, 0, 0, 12, 7,
+ 8, 3, 3, 3, 5, 3, 5, 3, 5, 0,
+ 1, 1, 2, 4, 3, 3, 3, 3, 4, 5,
+ 2, 0, 1, 1, 1, 1, 3, 0, 1, 1,
+ 3, 1, 3, 3, 1, 3, 3, 1, 5, 1,
+ 5, 1, 3, 1, 3, 1, 3, 1, 3, 1,
3, 1, 3, 1, 3, 1, 3, 1, 3, 1,
- 3, 1, 3, 1, 3, 1, 3, 1, 3, 1,
- 3, 3, 3, 1, 3, 3, 1, 3, 1, 3,
- 3, 1, 3, 3, 3, 1, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 1, 2, 2, 1, 1,
- 1, 2, 1, 1, 4, 3, 3, 2, 2, 4,
- 3, 2, 3, 1, 3, 1, 1, 1, 1, 1,
- 3, 2, 3, 3, 5, 2, 4, 1, 2, 0,
- 1, 2, 3, 3, 5, 1, 1, 1, 0, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+ 3, 1, 3, 1, 3, 1, 3, 3, 3, 1,
+ 3, 3, 1, 3, 1, 3, 3, 1, 3, 3,
+ 3, 1, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 1, 2, 2, 1, 1, 1, 2, 1, 1,
+ 4, 3, 3, 2, 2, 4, 3, 2, 3, 1,
+ 3, 1, 1, 1, 1, 1, 3, 2, 3, 3,
+ 5, 2, 4, 1, 2, 0, 1, 2, 3, 3,
+ 5, 1, 1, 1, 0, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1
};
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -824,306 +839,320 @@ static const yytype_uint8 yyr2[] =
means the default is an error. */
static const yytype_uint8 yydefact[] =
{
- 5, 0, 4, 1, 188, 188, 0, 0, 0, 0,
- 0, 190, 191, 77, 0, 165, 0, 196, 197, 0,
- 0, 0, 0, 0, 0, 0, 0, 3, 8, 166,
- 193, 194, 0, 0, 47, 0, 0, 195, 0, 0,
- 179, 2, 153, 188, 6, 14, 15, 16, 17, 18,
+ 5, 0, 4, 1, 194, 194, 0, 0, 0, 0,
+ 0, 196, 197, 81, 0, 171, 0, 202, 203, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 8, 172,
+ 199, 200, 0, 47, 0, 0, 201, 0, 0, 185,
+ 0, 2, 159, 194, 6, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 26, 27, 0,
- 79, 85, 91, 95, 99, 103, 107, 111, 115, 119,
- 126, 128, 131, 135, 145, 148, 150, 149, 152, 168,
- 169, 167, 192, 189, 0, 0, 166, 0, 136, 145,
- 0, 0, 81, 151, 150, 0, 78, 0, 0, 0,
- 0, 138, 41, 0, 35, 137, 0, 0, 139, 140,
- 0, 0, 33, 166, 193, 194, 28, 0, 0, 0,
- 141, 142, 143, 144, 177, 171, 0, 180, 0, 0,
- 199, 0, 198, 48, 0, 0, 0, 0, 0, 0,
+ 85, 91, 97, 101, 105, 109, 113, 117, 121, 125,
+ 132, 134, 137, 141, 151, 154, 156, 155, 158, 174,
+ 175, 173, 198, 195, 0, 0, 172, 0, 142, 151,
+ 0, 207, 206, 0, 87, 157, 156, 0, 82, 0,
+ 0, 0, 0, 144, 41, 0, 35, 143, 0, 0,
+ 145, 146, 0, 33, 172, 199, 200, 28, 0, 0,
+ 0, 147, 148, 149, 150, 183, 177, 0, 186, 0,
+ 0, 0, 205, 0, 204, 48, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 146, 147, 0, 0, 0, 0, 0, 157, 0, 0,
- 158, 58, 57, 181, 185, 187, 186, 0, 0, 0,
- 0, 82, 83, 88, 93, 97, 101, 105, 109, 113,
- 117, 123, 145, 156, 59, 0, 71, 33, 0, 0,
- 72, 73, 0, 39, 42, 0, 34, 0, 0, 61,
- 170, 32, 29, 182, 0, 0, 179, 173, 178, 172,
- 175, 12, 80, 96, 0, 100, 104, 108, 112, 116,
- 122, 121, 120, 127, 129, 130, 132, 133, 134, 87,
- 86, 161, 163, 0, 0, 155, 0, 160, 0, 0,
- 44, 0, 37, 77, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,
- 74, 43, 36, 0, 0, 0, 183, 180, 0, 10,
- 13, 0, 0, 162, 0, 154, 159, 0, 50, 0,
- 40, 45, 0, 77, 0, 0, 84, 145, 98, 0,
- 102, 106, 110, 114, 118, 125, 124, 0, 90, 89,
- 65, 62, 0, 52, 60, 0, 174, 176, 0, 0,
- 92, 164, 0, 0, 46, 38, 0, 0, 77, 0,
- 0, 0, 0, 66, 67, 0, 184, 11, 5, 51,
- 49, 77, 0, 0, 94, 55, 0, 0, 63, 65,
- 68, 75, 9, 0, 0, 56, 0, 30, 30, 0,
- 7, 0, 53, 31, 69, 70, 64, 54
+ 0, 0, 152, 153, 0, 0, 0, 0, 0, 163,
+ 0, 0, 164, 62, 61, 187, 191, 193, 192, 0,
+ 84, 0, 83, 0, 53, 88, 89, 94, 99, 103,
+ 107, 111, 115, 119, 123, 129, 151, 162, 63, 0,
+ 75, 33, 0, 0, 76, 77, 0, 39, 42, 0,
+ 34, 0, 0, 65, 32, 29, 188, 0, 0, 185,
+ 179, 184, 178, 181, 176, 12, 86, 102, 0, 106,
+ 110, 114, 118, 122, 128, 127, 126, 133, 135, 136,
+ 138, 139, 140, 93, 92, 0, 161, 167, 169, 0,
+ 0, 166, 0, 209, 208, 0, 44, 56, 37, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 80, 78, 43, 36, 0,
+ 0, 0, 189, 186, 0, 10, 13, 0, 0, 160,
+ 0, 168, 165, 0, 50, 0, 40, 45, 0, 0,
+ 0, 211, 210, 81, 90, 151, 104, 0, 108, 112,
+ 116, 120, 124, 131, 130, 0, 96, 95, 69, 66,
+ 0, 52, 64, 0, 180, 182, 0, 0, 98, 170,
+ 0, 0, 46, 38, 81, 0, 54, 0, 0, 0,
+ 0, 70, 71, 0, 190, 11, 5, 51, 49, 57,
+ 0, 0, 100, 59, 0, 0, 67, 69, 72, 79,
+ 9, 0, 0, 60, 81, 30, 30, 0, 7, 81,
+ 0, 31, 73, 74, 68, 0, 0, 0, 55, 58
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- -1, 1, 41, 2, 42, 43, 343, 270, 271, 116,
- 117, 354, 45, 46, 103, 241, 104, 242, 193, 194,
- 280, 281, 47, 48, 49, 50, 51, 52, 53, 54,
- 55, 56, 301, 322, 323, 324, 339, 57, 58, 190,
- 191, 95, 59, 170, 171, 60, 172, 61, 173, 62,
- 174, 63, 175, 64, 176, 65, 177, 66, 178, 67,
- 179, 68, 180, 69, 70, 71, 72, 73, 74, 75,
- 76, 77, 157, 233, 78, 79, 126, 127, 128, 80,
- 118, 119, 84, 81, 82, 133
+ -1, 1, 41, 2, 42, 43, 351, 276, 277, 117,
+ 118, 362, 45, 46, 105, 247, 106, 248, 197, 198,
+ 286, 287, 47, 48, 49, 50, 249, 341, 289, 352,
+ 51, 52, 53, 54, 55, 56, 309, 330, 331, 332,
+ 347, 57, 58, 194, 195, 97, 171, 59, 174, 175,
+ 60, 176, 61, 177, 62, 178, 63, 179, 64, 180,
+ 65, 181, 66, 182, 67, 183, 68, 184, 69, 70,
+ 71, 72, 73, 74, 75, 76, 77, 159, 239, 78,
+ 79, 127, 128, 129, 80, 119, 120, 84, 81, 82,
+ 135, 93, 245, 293
};
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
-#define YYPACT_NINF -242
+#define YYPACT_NINF -278
static const yytype_int16 yypact[] =
{
- -242, 16, 375, -242, 0, 0, 827, 623, 11, 55,
- 93, -242, -242, 827, 76, -242, 827, -242, -242, -4,
- 827, 33, 827, 86, 92, 827, 827, -242, -242, 23,
- -242, -242, 827, 437, -242, 827, 827, -242, 827, 827,
- -43, -242, -242, 0, -242, -242, -242, -242, -242, -242,
- -242, -242, -242, -242, -242, -242, -242, -242, -242, 7,
- -242, -242, -8, 52, 88, 90, 95, 119, 18, 140,
- 158, 44, -242, -242, 73, -242, 27, 32, -242, -242,
- -242, -242, -242, -242, 2, 2, -242, 117, -242, 186,
- 164, 827, 725, -242, 27, 2, 156, 827, 7, 499,
- 64, -242, 167, 10, -242, -242, 827, 827, -242, -242,
- 623, 25, 321, 23, 159, 173, -242, 561, 13, 175,
- -242, -242, -242, -242, -242, -242, -31, 35, 827, 182,
- -242, 827, -242, -242, 827, 827, 827, 827, 827, 827,
- 827, 827, 827, 827, 827, 827, 827, 827, 827, 827,
- -242, -242, 827, 827, 776, 827, 191, -242, 827, 192,
- -242, -242, -242, -242, -242, -242, -242, 187, 81, 194,
- 183, 189, -242, -242, -7, 204, 185, 181, 188, 201,
- -1, 140, 85, -242, -242, 109, -242, -242, 197, -4,
- 233, -242, 827, -242, -242, 33, -242, 115, 133, -242,
- -242, -242, -242, -242, 82, 827, 198, -242, -242, -242,
- -242, 208, -242, 52, 196, 88, 90, 95, 119, 18,
- 140, 140, 140, 158, 44, 44, -242, -242, -242, -242,
- -242, -242, -242, 151, 37, -242, 48, -242, 827, 623,
- 199, 150, 236, 827, 827, 827, 827, 827, 827, 827,
- 827, 827, 827, 827, 827, 827, 827, 203, 214, -242,
- -242, -242, -242, 623, 623, 202, -242, 206, 674, -242,
- 207, 210, 827, -242, 827, -242, -242, 157, 243, 827,
- -242, -242, 194, 827, 827, 209, -242, 163, 204, 211,
- 185, 181, 188, 201, -1, 140, 140, 161, -242, -242,
- 255, -242, 217, -242, -242, 827, -242, -242, 227, 218,
- -242, -242, 216, 623, -242, -242, 219, 165, 827, 827,
- 623, 827, 6, 255, -242, -4, -242, -242, -242, -242,
- -242, 827, 623, 221, -242, -242, -37, 231, -242, 255,
- -242, -242, 623, 232, 239, -242, 623, 623, 623, 250,
- -242, 623, -242, 623, -242, -242, -242, -242
+ -278, 20, 433, -278, -3, -3, 877, 673, 12, 12,
+ 196, -278, -278, 877, 12, -278, 877, -278, -278, 15,
+ 877, 28, 877, 12, 12, 877, 877, -278, -278, 1,
+ -278, -278, 493, -278, 877, 877, -278, 877, 877, 59,
+ 877, -278, -278, -3, -278, -278, -278, -278, -278, -278,
+ -278, -278, -278, -278, -278, -278, -278, -278, -278, 16,
+ -278, -278, -13, 83, 72, 32, 85, 102, 88, 114,
+ 153, 104, -278, -278, 98, -278, -40, -28, -278, -278,
+ -278, -278, -278, -278, 8, 8, -278, 113, -278, 182,
+ 135, -278, -278, 345, 775, -278, -40, 8, 119, 877,
+ 16, 553, 131, -278, 120, 51, -278, -278, 345, 877,
+ -278, -278, 673, 381, 1, 136, 149, -278, 613, 62,
+ 156, -278, -278, -278, -278, -278, -278, 60, 70, 877,
+ -26, 12, -278, 877, -278, -278, 877, 877, 877, 877,
+ 877, 877, 877, 877, 877, 877, 877, 877, 877, 877,
+ 877, 877, -278, -278, 877, 877, 877, 173, 724, -278,
+ 877, 180, -278, -278, -278, -278, -278, -278, -278, 12,
+ -278, 6, 119, 185, -278, 186, -278, -278, -6, 210,
+ 192, 193, 191, 207, 14, 114, 87, -278, -278, 7,
+ -278, -278, 12, 15, 237, -278, 877, -278, -278, 28,
+ -278, 6, 7, -278, -278, -278, -278, 116, 877, 203,
+ -278, -278, -278, -278, -278, 213, -278, 83, 202, 72,
+ 32, 85, 102, 88, 114, 114, 114, 153, 104, 104,
+ -278, -278, -278, -278, -278, 71, -278, -278, -278, -17,
+ 82, -278, 345, -278, -278, 673, 205, 208, 242, 13,
+ 877, 877, 877, 877, 877, 877, 877, 877, 877, 877,
+ 345, 877, 877, 211, 221, -278, -278, -278, -278, 673,
+ 673, 212, -278, 216, 826, -278, 217, 6, 877, -278,
+ 877, -278, -278, 6, 250, 877, -278, -278, 185, 13,
+ 345, -278, -278, 877, -278, 188, 210, 215, 192, 193,
+ 191, 207, 14, 114, 114, 6, -278, -278, 265, -278,
+ 6, -278, -278, 877, -278, -278, 233, 226, -278, -278,
+ 8, 673, -278, -278, 877, 6, -278, 877, 673, 877,
+ 9, 265, -278, 15, -278, -278, -278, -278, -278, -278,
+ 673, 13, -278, -278, 91, 223, -278, 265, -278, -278,
+ 673, 238, 13, -278, 877, 673, 673, 239, -278, 877,
+ 6, 673, -278, -278, -278, 6, 673, 673, -278, -278
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
- -242, -242, -242, -40, -242, -242, -242, -242, -242, -2,
- -126, -59, -10, -242, -242, -242, 96, 8, -242, -242,
- -242, -242, -242, -242, -242, -242, -242, -242, -242, -242,
- -242, -242, -242, -46, -242, -29, -242, -242, -242, -242,
- 102, -241, -12, -242, -242, -65, -227, -242, -242, -242,
- -242, 162, 50, 166, 51, 160, 53, 169, 54, 171,
- 62, 174, 65, -61, 155, 78, 1, -242, 29, 290,
- 294, -242, -47, -242, -242, -242, -242, 99, 107, -242,
- -242, 113, 5, -242, -242, 49
+ -278, -278, -278, -62, -278, -278, -278, -278, -278, -2,
+ -130, -79, -8, -278, -278, -278, 80, 10, -278, -278,
+ -278, -278, -278, -278, -278, -278, -278, -278, -278, -278,
+ -278, -278, -278, -278, -278, -278, -278, -67, -278, -49,
+ -278, -278, -278, -278, 99, -246, -102, -12, -278, -278,
+ -43, -157, -278, -278, -278, -278, 160, 46, 161, 47,
+ 162, 48, 163, 49, 164, 50, 165, 52, -61, 167,
+ 81, 54, -278, 33, 298, 300, -278, -27, -278, -278,
+ -278, -278, 105, 106, -278, -278, 109, 5, -278, -278,
+ -82, 18, -158, -277
};
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says.
If YYTABLE_NINF, syntax error. */
-#define YYTABLE_NINF -188
+#define YYTABLE_NINF -194
static const yytype_int16 yytable[] =
{
- 44, 96, 285, 130, 98, 90, 124, 88, 130, 100,
- 85, 130, 131, 337, 252, 347, 3, 286, 206, 289,
- 111, 101, 125, 105, 134, 245, 108, 109, 298, 299,
- 160, 181, 141, 142, 207, 89, 120, 121, 83, 122,
- 123, 253, 316, 338, 99, 135, 246, 183, 129, 89,
- 203, 89, 314, 132, 89, 89, 131, 91, 132, 195,
- 143, 132, 204, 210, 89, 89, 212, 89, 89, 188,
- 214, 102, 200, 154, 131, 110, 189, 333, 154, 168,
- 220, 221, 222, 136, 208, 185, 131, 229, 230, 232,
- 344, 155, 334, 156, 197, 198, 158, 131, 159, 254,
- 209, 92, 275, 147, 148, 149, 150, 151, 199, 10,
- 11, 12, 152, 276, 15, 202, 17, 18, 150, 151,
- 164, 182, 97, 153, 255, 165, 166, 261, 239, 28,
- 131, 86, 106, 161, 162, 256, 30, 31, 107, 32,
- 266, 87, 137, 234, 184, 138, 236, 186, 226, 227,
- 228, 139, 196, 37, 163, 164, 257, 40, 131, 140,
- 165, 166, 263, 89, 131, 89, 89, 89, 89, 89,
- 89, 89, 89, 89, 89, 89, 89, 89, 89, 259,
- 264, 144, 131, 181, 181, 181, 181, 181, 181, 181,
- 181, 295, 296, 167, 181, 181, 150, 151, 273, 282,
- 274, 283, 255, 307, 312, 131, 131, 310, 320, 311,
- 131, -187, 332, 256, 131, 145, 146, 192, 181, 150,
- 151, 353, 353, 224, 225, -186, 277, 205, 211, 235,
- 237, 96, 240, 238, 243, 247, 249, 278, 244, 248,
- 326, 251, 297, 258, 250, 189, 269, 124, 272, 279,
- 284, 300, 302, 313, 305, 208, 308, 309, 181, 321,
- 318, 303, 304, 319, 325, 327, 328, 329, 346, 350,
- 331, 96, 317, 287, 89, 287, 89, 89, 89, 89,
- 89, 89, 89, 348, 287, 287, 351, 356, 342, 355,
- 315, 262, 260, 349, 340, 288, 213, 216, 290, 223,
- 93, 291, 215, 292, 94, 267, 96, 217, 287, 336,
- 218, 330, 293, 268, 219, 341, 294, 265, 335, 96,
- 0, 0, -181, 0, 0, 0, 0, 0, 0, 0,
- 345, 0, 0, 0, 0, -181, -181, 0, 0, 0,
- 44, 0, 0, 0, 352, 0, 0, 0, 287, 357,
- 0, 202, -181, -181, 0, 0, 0, 0, 0, 0,
- -181, -181, -181, -181, 0, 0, 0, 0, 0, 0,
- -181, -181, 0, 0, -181, -181, -181, -181, 4, 0,
- -181, 5, -181, 6, 7, 0, 8, -181, 9, 0,
- 0, 10, 11, 12, 13, 14, 15, 16, 17, 18,
- 19, 20, 21, 22, 23, 24, 0, 0, 25, 26,
- 27, 28, 0, 29, 0, 0, 0, 0, 30, 31,
- 0, 32, 0, 33, 0, 0, 34, 0, 0, 0,
- 0, 0, 35, 36, 0, 37, 0, 38, 39, 40,
- 4, 0, 0, 5, 0, 6, 7, 0, 8, 0,
- 9, 0, 0, 10, 11, 12, 13, 14, 15, 16,
- 17, 18, 19, 20, 21, 22, 23, 24, 0, 0,
- 25, 26, 0, 28, 112, 113, 0, 0, 0, 0,
- 114, 115, 0, 32, 0, 33, 0, 0, 34, 0,
- 0, 0, 0, 0, 35, 36, 0, 37, 0, 38,
- 39, 40, 4, 0, 0, 5, 0, 6, 7, 0,
- 8, 0, 9, 0, 0, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 0, 0, 25, 26, 0, 28, 187, 29, 0, 0,
- 0, 0, 30, 31, 0, 32, 0, 33, 0, 0,
- 34, 0, 0, 0, 0, 0, 35, 36, 0, 37,
- 0, 38, 39, 40, 4, 0, 0, 5, 0, 6,
- 7, 0, 8, 0, 9, 0, 0, 10, 11, 12,
- 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 0, 0, 25, 26, 0, 28, 201, 29,
- 0, 0, 0, 0, 30, 31, 0, 32, 0, 33,
- 0, 0, 34, 0, 0, 0, 0, 0, 35, 36,
- 0, 37, 0, 38, 39, 40, 4, 0, 0, 5,
+ 44, 98, 163, 164, 100, 90, 201, 243, 243, 132,
+ 85, 102, 324, 91, 291, 188, 345, 132, 190, 136,
+ 3, 133, 156, 200, 157, 158, 251, 94, 130, 258,
+ 280, 263, 99, 185, 160, 83, 161, 158, 137, 89,
+ 214, 108, 109, 269, 270, 252, 346, 326, 131, 281,
+ 162, 112, 132, 89, 133, 89, 259, 134, 89, 89,
+ 88, 101, 292, 133, 354, 134, 104, 89, 89, 187,
+ 89, 89, 244, 244, 103, 359, 107, 92, 339, 110,
+ 111, 172, 224, 225, 226, 140, 213, 189, 121, 122,
+ 216, 123, 124, 294, 218, 297, 172, 202, 199, 206,
+ 134, 260, 143, 144, 306, 307, 125, 209, 360, 207,
+ 203, 233, 234, 365, 138, 238, 205, 211, 133, 317,
+ 152, 153, 126, 210, 139, 320, 261, 186, 322, 133,
+ 145, 152, 153, 212, 279, 262, 192, 154, 133, 141,
+ 283, 355, 142, 193, 235, 282, 155, 328, 240, 215,
+ 165, 166, 333, 267, 166, 146, 167, 168, 305, 167,
+ 168, 149, 150, 151, 169, 272, 133, 340, 196, 89,
+ 342, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 265, -193, 242, 325, 185,
+ 185, 185, 185, 185, 185, 185, 185, 303, 304, -192,
+ 185, 185, 366, 230, 231, 232, 208, 367, 147, 148,
+ 264, 236, 10, 11, 12, 152, 153, 15, 241, 17,
+ 18, 152, 153, 246, 185, 361, 361, 261, 228, 229,
+ 172, 315, 28, 250, 86, 318, 262, 319, 337, 30,
+ 31, 253, 87, 284, 254, 256, 255, 257, 172, 193,
+ 125, 275, 278, 285, 36, 288, 290, 308, 39, 310,
+ 321, 40, 313, 211, 316, 327, 185, 311, 312, 329,
+ 334, 335, 336, 356, 350, 358, 364, 363, 172, 268,
+ 357, 98, 348, 295, 89, 295, 89, 89, 89, 89,
+ 89, 89, 89, 266, 295, 295, 217, 296, 323, 219,
+ 298, 220, 299, 221, 300, 222, 301, 223, 95, 302,
+ 96, 0, 98, 227, 273, 274, 271, 344, 295, 338,
+ 0, 0, 0, 0, 0, 349, 343, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 353, 0,
+ 0, 0, 98, 0, 0, 0, 170, 98, 44, 0,
+ 0, 0, 0, 6, 0, 0, 0, 0, 0, 205,
+ 295, 10, 11, 12, 368, 369, 15, 0, 17, 18,
+ 0, 20, 0, 22, 0, 0, 0, 0, 25, 26,
+ 0, 28, -187, 86, 0, 0, 0, 0, 30, 31,
+ 0, 87, 0, 0, 0, -187, -187, 0, 0, 0,
+ 34, 35, 0, 36, 0, 37, 38, 39, 0, 0,
+ 40, 0, -187, -187, 0, 0, 0, 0, 0, 0,
+ -187, -187, -187, -187, 0, 0, 0, 0, -187, -187,
+ 0, 0, -187, -187, -187, -187, 4, 0, -187, 5,
+ -187, 6, 7, 0, 8, -187, 9, 0, 0, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 0, 0, 25, 26, 27, 28,
+ 0, 29, 0, 0, 0, 0, 30, 31, 0, 32,
+ 0, 0, 33, 0, 0, 0, 0, 0, 34, 35,
+ 0, 36, 0, 37, 38, 39, 4, 0, 40, 5,
+ 0, 6, 7, 0, 8, 0, 9, 0, 0, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 0, 0, 25, 26, 0, 28,
+ 113, 114, 0, 0, 0, 0, 115, 116, 0, 32,
+ 0, 0, 33, 0, 0, 0, 0, 0, 34, 35,
+ 0, 36, 0, 37, 38, 39, 4, 0, 40, 5,
+ 0, 6, 7, 0, 8, 0, 9, 0, 0, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 0, 0, 25, 26, 0, 28,
+ 191, 29, 0, 0, 0, 0, 30, 31, 0, 32,
+ 0, 0, 33, 0, 0, 0, 0, 0, 34, 35,
+ 0, 36, 0, 37, 38, 39, 4, 0, 40, 5,
+ 0, 6, 7, 0, 8, 0, 9, 0, 0, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 0, 0, 25, 26, 0, 28,
+ 204, 29, 0, 0, 0, 0, 30, 31, 0, 32,
+ 0, 0, 33, 0, 0, 0, 0, 0, 34, 35,
+ 0, 36, 0, 37, 38, 39, 4, 0, 40, 5,
0, 6, 7, 0, 8, 0, 9, 0, 0, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 0, 0, 25, 26, 0, 28,
0, 29, 0, 0, 0, 0, 30, 31, 0, 32,
- 0, 33, 0, 0, 34, 0, 0, 0, 0, 0,
- 35, 36, 6, 37, 0, 38, 39, 40, 0, 0,
+ 0, 0, 33, 0, 0, 0, 0, 0, 34, 35,
+ 0, 36, 6, 37, 38, 39, 0, 0, 40, 0,
10, 11, 12, 0, 0, 15, 0, 17, 18, 0,
20, 0, 22, 0, 0, 0, 0, 25, 26, 0,
28, 0, 86, 0, 0, 0, 0, 30, 31, 0,
- 32, 0, 87, 0, 0, 0, 0, 0, 0, 0,
- 0, 35, 36, 6, 37, 0, 38, 39, 40, 306,
- 0, 10, 11, 12, 0, 0, 15, 0, 17, 18,
- 0, 20, 169, 22, 0, 0, 0, 0, 25, 26,
+ 87, 0, 0, 0, 0, 0, 0, 0, 0, 34,
+ 35, 0, 36, 6, 37, 38, 39, 0, 0, 40,
+ 237, 10, 11, 12, 0, 0, 15, 0, 17, 18,
+ 0, 20, 173, 22, 0, 0, 0, 0, 25, 26,
0, 28, 0, 86, 0, 0, 0, 0, 30, 31,
- 0, 32, 0, 87, 0, 0, 0, 0, 0, 0,
- 0, 0, 35, 36, 6, 37, 0, 38, 39, 40,
- 0, 0, 10, 11, 12, 0, 0, 15, 0, 17,
+ 0, 87, 0, 0, 0, 0, 0, 0, 0, 0,
+ 34, 35, 0, 36, 6, 37, 38, 39, 0, 0,
+ 40, 0, 10, 11, 12, 0, 0, 15, 0, 17,
18, 0, 20, 0, 22, 0, 0, 0, 0, 25,
26, 0, 28, 0, 86, 0, 0, 0, 0, 30,
- 31, 0, 32, 231, 87, 0, 0, 0, 0, 0,
- 0, 0, 0, 35, 36, 6, 37, 0, 38, 39,
- 40, 0, 0, 10, 11, 12, 0, 0, 15, 0,
+ 31, 0, 87, 0, 0, 0, 0, 0, 0, 0,
+ 0, 34, 35, 0, 36, 6, 37, 38, 39, 314,
+ 0, 40, 0, 10, 11, 12, 0, 0, 15, 0,
17, 18, 0, 20, 0, 22, 0, 0, 0, 0,
25, 26, 0, 28, 0, 86, 0, 0, 0, 0,
- 30, 31, 0, 32, 0, 87, 0, 0, 0, 0,
- 0, 0, 0, 0, 35, 36, 0, 37, 0, 38,
- 39, 40
+ 30, 31, 0, 87, 0, 0, 0, 0, 0, 0,
+ 0, 0, 34, 35, 0, 36, 0, 37, 38, 39,
+ 0, 0, 40
};
static const yytype_int16 yycheck[] =
{
- 2, 13, 243, 1, 16, 7, 49, 6, 1, 19,
- 5, 1, 49, 7, 15, 52, 0, 244, 49, 246,
- 32, 20, 65, 22, 32, 32, 25, 26, 255, 256,
- 77, 92, 14, 15, 65, 6, 35, 36, 38, 38,
- 39, 42, 283, 37, 48, 53, 53, 94, 43, 20,
- 37, 22, 279, 51, 25, 26, 49, 46, 51, 49,
- 42, 51, 49, 128, 35, 36, 131, 38, 39, 5,
- 135, 38, 47, 46, 49, 52, 12, 318, 46, 91,
- 141, 142, 143, 31, 49, 97, 49, 152, 153, 154,
- 331, 64, 319, 66, 106, 107, 64, 49, 66, 14,
- 65, 46, 65, 59, 60, 61, 33, 34, 110, 16,
- 17, 18, 39, 65, 21, 117, 23, 24, 33, 34,
- 38, 92, 46, 50, 39, 43, 44, 192, 47, 36,
- 49, 38, 46, 84, 85, 50, 43, 44, 46, 46,
- 205, 48, 54, 155, 95, 55, 158, 98, 147, 148,
- 149, 56, 103, 60, 37, 38, 47, 64, 49, 40,
- 43, 44, 47, 134, 49, 136, 137, 138, 139, 140,
- 141, 142, 143, 144, 145, 146, 147, 148, 149, 189,
- 47, 41, 49, 244, 245, 246, 247, 248, 249, 250,
- 251, 252, 253, 29, 255, 256, 33, 34, 47, 49,
- 49, 51, 39, 268, 47, 49, 49, 272, 47, 274,
- 49, 52, 47, 50, 49, 57, 58, 50, 279, 33,
- 34, 347, 348, 145, 146, 52, 238, 52, 46, 38,
- 38, 243, 38, 46, 51, 31, 55, 239, 49, 54,
- 305, 40, 254, 46, 56, 12, 38, 49, 52, 50,
- 14, 48, 38, 10, 52, 49, 49, 47, 319, 4,
- 51, 263, 264, 52, 47, 38, 48, 51, 47, 37,
- 51, 283, 284, 244, 245, 246, 247, 248, 249, 250,
- 251, 252, 253, 52, 255, 256, 47, 37, 328, 348,
- 282, 195, 190, 339, 323, 245, 134, 137, 247, 144,
- 10, 248, 136, 249, 10, 206, 318, 138, 279, 321,
- 139, 313, 250, 206, 140, 325, 251, 204, 320, 331,
- -1, -1, 1, -1, -1, -1, -1, -1, -1, -1,
- 332, -1, -1, -1, -1, 14, 15, -1, -1, -1,
- 342, -1, -1, -1, 346, -1, -1, -1, 319, 351,
- -1, 353, 31, 32, -1, -1, -1, -1, -1, -1,
- 39, 40, 41, 42, -1, -1, -1, -1, -1, -1,
- 49, 50, -1, -1, 53, 54, 55, 56, 3, -1,
- 59, 6, 61, 8, 9, -1, 11, 66, 13, -1,
- -1, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, -1, -1, 33, 34,
- 35, 36, -1, 38, -1, -1, -1, -1, 43, 44,
- -1, 46, -1, 48, -1, -1, 51, -1, -1, -1,
- -1, -1, 57, 58, -1, 60, -1, 62, 63, 64,
- 3, -1, -1, 6, -1, 8, 9, -1, 11, -1,
- 13, -1, -1, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 27, 28, 29, 30, -1, -1,
- 33, 34, -1, 36, 37, 38, -1, -1, -1, -1,
- 43, 44, -1, 46, -1, 48, -1, -1, 51, -1,
- -1, -1, -1, -1, 57, 58, -1, 60, -1, 62,
- 63, 64, 3, -1, -1, 6, -1, 8, 9, -1,
- 11, -1, 13, -1, -1, 16, 17, 18, 19, 20,
- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
- -1, -1, 33, 34, -1, 36, 37, 38, -1, -1,
- -1, -1, 43, 44, -1, 46, -1, 48, -1, -1,
- 51, -1, -1, -1, -1, -1, 57, 58, -1, 60,
- -1, 62, 63, 64, 3, -1, -1, 6, -1, 8,
- 9, -1, 11, -1, 13, -1, -1, 16, 17, 18,
- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
- 29, 30, -1, -1, 33, 34, -1, 36, 37, 38,
- -1, -1, -1, -1, 43, 44, -1, 46, -1, 48,
- -1, -1, 51, -1, -1, -1, -1, -1, 57, 58,
- -1, 60, -1, 62, 63, 64, 3, -1, -1, 6,
+ 2, 13, 84, 85, 16, 7, 108, 1, 1, 1,
+ 5, 19, 289, 1, 1, 97, 7, 1, 100, 32,
+ 0, 47, 62, 105, 64, 65, 32, 9, 40, 15,
+ 47, 189, 14, 94, 62, 38, 64, 65, 51, 6,
+ 66, 23, 24, 201, 202, 51, 37, 293, 43, 66,
+ 77, 50, 1, 20, 47, 22, 42, 49, 25, 26,
+ 6, 46, 49, 47, 341, 49, 38, 34, 35, 96,
+ 37, 38, 66, 66, 20, 352, 22, 65, 324, 25,
+ 26, 93, 143, 144, 145, 53, 129, 99, 34, 35,
+ 133, 37, 38, 250, 137, 252, 108, 109, 47, 37,
+ 49, 14, 14, 15, 261, 262, 47, 47, 354, 47,
+ 112, 154, 155, 359, 31, 158, 118, 47, 47, 277,
+ 33, 34, 63, 63, 52, 283, 39, 94, 285, 47,
+ 42, 33, 34, 63, 63, 48, 5, 39, 47, 54,
+ 242, 50, 40, 12, 156, 63, 48, 305, 160, 131,
+ 37, 38, 310, 196, 38, 41, 43, 44, 260, 43,
+ 44, 57, 58, 59, 29, 208, 47, 325, 48, 136,
+ 327, 138, 139, 140, 141, 142, 143, 144, 145, 146,
+ 147, 148, 149, 150, 151, 193, 50, 169, 290, 250,
+ 251, 252, 253, 254, 255, 256, 257, 258, 259, 50,
+ 261, 262, 360, 149, 150, 151, 50, 365, 55, 56,
+ 192, 38, 16, 17, 18, 33, 34, 21, 38, 23,
+ 24, 33, 34, 38, 285, 355, 356, 39, 147, 148,
+ 242, 274, 36, 47, 38, 278, 48, 280, 320, 43,
+ 44, 31, 46, 245, 52, 54, 53, 40, 260, 12,
+ 47, 38, 50, 48, 58, 47, 14, 46, 62, 38,
+ 10, 65, 50, 47, 47, 50, 327, 269, 270, 4,
+ 313, 38, 46, 50, 336, 37, 37, 356, 290, 199,
+ 347, 293, 331, 250, 251, 252, 253, 254, 255, 256,
+ 257, 258, 259, 194, 261, 262, 136, 251, 288, 138,
+ 253, 139, 254, 140, 255, 141, 256, 142, 10, 257,
+ 10, -1, 324, 146, 209, 209, 207, 329, 285, 321,
+ -1, -1, -1, -1, -1, 333, 328, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 340, -1,
+ -1, -1, 354, -1, -1, -1, 1, 359, 350, -1,
+ -1, -1, -1, 8, -1, -1, -1, -1, -1, 361,
+ 327, 16, 17, 18, 366, 367, 21, -1, 23, 24,
+ -1, 26, -1, 28, -1, -1, -1, -1, 33, 34,
+ -1, 36, 1, 38, -1, -1, -1, -1, 43, 44,
+ -1, 46, -1, -1, -1, 14, 15, -1, -1, -1,
+ 55, 56, -1, 58, -1, 60, 61, 62, -1, -1,
+ 65, -1, 31, 32, -1, -1, -1, -1, -1, -1,
+ 39, 40, 41, 42, -1, -1, -1, -1, 47, 48,
+ -1, -1, 51, 52, 53, 54, 3, -1, 57, 6,
+ 59, 8, 9, -1, 11, 64, 13, -1, -1, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 28, 29, 30, -1, -1, 33, 34, 35, 36,
+ -1, 38, -1, -1, -1, -1, 43, 44, -1, 46,
+ -1, -1, 49, -1, -1, -1, -1, -1, 55, 56,
+ -1, 58, -1, 60, 61, 62, 3, -1, 65, 6,
+ -1, 8, 9, -1, 11, -1, 13, -1, -1, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 28, 29, 30, -1, -1, 33, 34, -1, 36,
+ 37, 38, -1, -1, -1, -1, 43, 44, -1, 46,
+ -1, -1, 49, -1, -1, -1, -1, -1, 55, 56,
+ -1, 58, -1, 60, 61, 62, 3, -1, 65, 6,
+ -1, 8, 9, -1, 11, -1, 13, -1, -1, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 28, 29, 30, -1, -1, 33, 34, -1, 36,
+ 37, 38, -1, -1, -1, -1, 43, 44, -1, 46,
+ -1, -1, 49, -1, -1, -1, -1, -1, 55, 56,
+ -1, 58, -1, 60, 61, 62, 3, -1, 65, 6,
+ -1, 8, 9, -1, 11, -1, 13, -1, -1, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 28, 29, 30, -1, -1, 33, 34, -1, 36,
+ 37, 38, -1, -1, -1, -1, 43, 44, -1, 46,
+ -1, -1, 49, -1, -1, -1, -1, -1, 55, 56,
+ -1, 58, -1, 60, 61, 62, 3, -1, 65, 6,
-1, 8, 9, -1, 11, -1, 13, -1, -1, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, -1, -1, 33, 34, -1, 36,
-1, 38, -1, -1, -1, -1, 43, 44, -1, 46,
- -1, 48, -1, -1, 51, -1, -1, -1, -1, -1,
- 57, 58, 8, 60, -1, 62, 63, 64, -1, -1,
+ -1, -1, 49, -1, -1, -1, -1, -1, 55, 56,
+ -1, 58, 8, 60, 61, 62, -1, -1, 65, -1,
16, 17, 18, -1, -1, 21, -1, 23, 24, -1,
26, -1, 28, -1, -1, -1, -1, 33, 34, -1,
36, -1, 38, -1, -1, -1, -1, 43, 44, -1,
- 46, -1, 48, -1, -1, -1, -1, -1, -1, -1,
- -1, 57, 58, 8, 60, -1, 62, 63, 64, 65,
- -1, 16, 17, 18, -1, -1, 21, -1, 23, 24,
+ 46, -1, -1, -1, -1, -1, -1, -1, -1, 55,
+ 56, -1, 58, 8, 60, 61, 62, -1, -1, 65,
+ 66, 16, 17, 18, -1, -1, 21, -1, 23, 24,
-1, 26, 27, 28, -1, -1, -1, -1, 33, 34,
-1, 36, -1, 38, -1, -1, -1, -1, 43, 44,
- -1, 46, -1, 48, -1, -1, -1, -1, -1, -1,
- -1, -1, 57, 58, 8, 60, -1, 62, 63, 64,
- -1, -1, 16, 17, 18, -1, -1, 21, -1, 23,
+ -1, 46, -1, -1, -1, -1, -1, -1, -1, -1,
+ 55, 56, -1, 58, 8, 60, 61, 62, -1, -1,
+ 65, -1, 16, 17, 18, -1, -1, 21, -1, 23,
24, -1, 26, -1, 28, -1, -1, -1, -1, 33,
34, -1, 36, -1, 38, -1, -1, -1, -1, 43,
- 44, -1, 46, 47, 48, -1, -1, -1, -1, -1,
- -1, -1, -1, 57, 58, 8, 60, -1, 62, 63,
- 64, -1, -1, 16, 17, 18, -1, -1, 21, -1,
+ 44, -1, 46, -1, -1, -1, -1, -1, -1, -1,
+ -1, 55, 56, -1, 58, 8, 60, 61, 62, 63,
+ -1, 65, -1, 16, 17, 18, -1, -1, 21, -1,
23, 24, -1, 26, -1, 28, -1, -1, -1, -1,
33, 34, -1, 36, -1, 38, -1, -1, -1, -1,
- 43, 44, -1, 46, -1, 48, -1, -1, -1, -1,
- -1, -1, -1, -1, 57, 58, -1, 60, -1, 62,
- 63, 64
+ 43, 44, -1, 46, -1, -1, -1, -1, -1, -1,
+ -1, -1, 55, 56, -1, 58, -1, 60, 61, 62,
+ -1, -1, 65
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1133,39 +1162,40 @@ static const yytype_uint8 yystos[] =
0, 68, 70, 0, 3, 6, 8, 9, 11, 13,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 33, 34, 35, 36, 38,
- 43, 44, 46, 48, 51, 57, 58, 60, 62, 63,
- 64, 69, 71, 72, 76, 79, 80, 89, 90, 91,
- 92, 93, 94, 95, 96, 97, 98, 104, 105, 109,
- 112, 114, 116, 118, 120, 122, 124, 126, 128, 130,
- 131, 132, 133, 134, 135, 136, 137, 138, 141, 142,
- 146, 150, 151, 38, 149, 149, 38, 48, 133, 135,
- 76, 46, 46, 136, 137, 108, 109, 46, 109, 48,
- 79, 133, 38, 81, 83, 133, 46, 46, 133, 133,
- 52, 109, 37, 38, 43, 44, 76, 77, 147, 148,
- 133, 133, 133, 133, 49, 65, 143, 144, 145, 149,
- 1, 49, 51, 152, 32, 53, 31, 54, 55, 56,
- 40, 14, 15, 42, 41, 57, 58, 59, 60, 61,
- 33, 34, 39, 50, 46, 64, 66, 139, 64, 66,
- 139, 152, 152, 37, 38, 43, 44, 29, 109, 27,
- 110, 111, 113, 115, 117, 119, 121, 123, 125, 127,
- 129, 130, 135, 139, 152, 109, 152, 37, 5, 12,
- 106, 107, 50, 85, 86, 49, 152, 109, 109, 76,
- 47, 37, 76, 37, 49, 52, 49, 65, 49, 65,
- 112, 46, 112, 118, 112, 120, 122, 124, 126, 128,
- 130, 130, 130, 131, 132, 132, 133, 133, 133, 112,
- 112, 47, 112, 140, 109, 38, 109, 38, 46, 47,
- 38, 82, 84, 51, 49, 32, 53, 31, 54, 55,
- 56, 40, 15, 42, 14, 39, 50, 47, 46, 79,
- 107, 112, 83, 47, 47, 148, 112, 144, 145, 38,
- 74, 75, 52, 47, 49, 65, 65, 109, 76, 50,
- 87, 88, 49, 51, 14, 108, 113, 135, 119, 113,
- 121, 123, 125, 127, 129, 130, 130, 109, 113, 113,
- 48, 99, 38, 76, 76, 52, 65, 112, 49, 47,
- 112, 112, 47, 10, 113, 84, 108, 109, 51, 52,
- 47, 4, 100, 101, 102, 47, 112, 38, 48, 51,
- 76, 51, 47, 108, 113, 76, 109, 7, 37, 103,
- 102, 79, 70, 73, 108, 76, 47, 52, 52, 100,
- 37, 47, 76, 77, 78, 78, 37, 76
+ 43, 44, 46, 49, 55, 56, 58, 60, 61, 62,
+ 65, 69, 71, 72, 76, 79, 80, 89, 90, 91,
+ 92, 97, 98, 99, 100, 101, 102, 108, 109, 114,
+ 117, 119, 121, 123, 125, 127, 129, 131, 133, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143, 146, 147,
+ 151, 155, 156, 38, 154, 154, 38, 46, 138, 140,
+ 76, 1, 65, 158, 158, 141, 142, 112, 114, 158,
+ 114, 46, 79, 138, 38, 81, 83, 138, 158, 158,
+ 138, 138, 50, 37, 38, 43, 44, 76, 77, 152,
+ 153, 138, 138, 138, 138, 47, 63, 148, 149, 150,
+ 114, 154, 1, 47, 49, 157, 32, 51, 31, 52,
+ 53, 54, 40, 14, 15, 42, 41, 55, 56, 57,
+ 58, 59, 33, 34, 39, 48, 62, 64, 65, 144,
+ 62, 64, 144, 157, 157, 37, 38, 43, 44, 29,
+ 1, 113, 114, 27, 115, 116, 118, 120, 122, 124,
+ 126, 128, 130, 132, 134, 135, 140, 144, 157, 114,
+ 157, 37, 5, 12, 110, 111, 48, 85, 86, 47,
+ 157, 113, 114, 76, 37, 76, 37, 47, 50, 47,
+ 63, 47, 63, 117, 66, 158, 117, 123, 117, 125,
+ 127, 129, 131, 133, 135, 135, 135, 136, 137, 137,
+ 138, 138, 138, 117, 117, 114, 38, 66, 117, 145,
+ 114, 38, 158, 1, 66, 159, 38, 82, 84, 93,
+ 47, 32, 51, 31, 52, 53, 54, 40, 15, 42,
+ 14, 39, 48, 159, 158, 79, 111, 117, 83, 159,
+ 159, 153, 117, 149, 150, 38, 74, 75, 50, 63,
+ 47, 66, 63, 113, 76, 48, 87, 88, 47, 95,
+ 14, 1, 49, 160, 118, 140, 124, 118, 126, 128,
+ 130, 132, 134, 135, 135, 113, 118, 118, 46, 103,
+ 38, 76, 76, 50, 63, 117, 47, 159, 117, 117,
+ 159, 10, 118, 84, 160, 113, 112, 50, 159, 4,
+ 104, 105, 106, 159, 117, 38, 46, 157, 76, 112,
+ 159, 94, 118, 76, 114, 7, 37, 107, 106, 79,
+ 70, 73, 96, 76, 160, 50, 50, 104, 37, 160,
+ 112, 77, 78, 78, 37, 112, 159, 159, 76, 76
};
#define yyerrok (yyerrstatus = 0)
@@ -1978,861 +2008,861 @@ yyreduce:
case 2:
/* Line 1455 of yacc.c */
-#line 255 "parser.y"
+#line 257 "parser.y"
{ program_parsed(ctx, (yyvsp[(1) - (2)].source_elements)); ;}
break;
case 3:
/* Line 1455 of yacc.c */
-#line 258 "parser.y"
+#line 260 "parser.y"
{;}
break;
case 4:
/* Line 1455 of yacc.c */
-#line 259 "parser.y"
+#line 261 "parser.y"
{;}
break;
case 5:
/* Line 1455 of yacc.c */
-#line 263 "parser.y"
+#line 265 "parser.y"
{ (yyval.source_elements) = new_source_elements(ctx); ;}
break;
case 6:
/* Line 1455 of yacc.c */
-#line 265 "parser.y"
+#line 267 "parser.y"
{ (yyval.source_elements) = source_elements_add_statement((yyvsp[(1) - (2)].source_elements), (yyvsp[(2) - (2)].statement)); ;}
break;
case 7:
/* Line 1455 of yacc.c */
-#line 270 "parser.y"
+#line 272 "parser.y"
{ (yyval.expr) = new_function_expression(ctx, (yyvsp[(2) - (8)].identifier), (yyvsp[(4) - (8)].parameter_list), (yyvsp[(7) - (8)].source_elements), (yyvsp[(1) - (8)].srcptr), (yyvsp[(8) - (8)].srcptr)-(yyvsp[(1) - (8)].srcptr)+1); ;}
break;
case 8:
/* Line 1455 of yacc.c */
-#line 273 "parser.y"
+#line 275 "parser.y"
{ push_func(ctx); (yyval.srcptr) = (yyvsp[(1) - (1)].srcptr); ;}
break;
case 9:
/* Line 1455 of yacc.c */
-#line 277 "parser.y"
+#line 279 "parser.y"
{ (yyval.source_elements) = function_body_parsed(ctx, (yyvsp[(1) - (1)].source_elements)); ;}
break;
case 10:
/* Line 1455 of yacc.c */
-#line 281 "parser.y"
+#line 283 "parser.y"
{ (yyval.parameter_list) = new_parameter_list(ctx, (yyvsp[(1) - (1)].identifier)); ;}
break;
case 11:
/* Line 1455 of yacc.c */
-#line 283 "parser.y"
+#line 285 "parser.y"
{ (yyval.parameter_list) = parameter_list_add(ctx, (yyvsp[(1) - (3)].parameter_list), (yyvsp[(3) - (3)].identifier)); ;}
break;
case 12:
/* Line 1455 of yacc.c */
-#line 287 "parser.y"
+#line 289 "parser.y"
{ (yyval.parameter_list) = NULL; ;}
break;
case 13:
/* Line 1455 of yacc.c */
-#line 288 "parser.y"
+#line 290 "parser.y"
{ (yyval.parameter_list) = (yyvsp[(1) - (1)].parameter_list); ;}
break;
case 14:
/* Line 1455 of yacc.c */
-#line 292 "parser.y"
+#line 294 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 15:
/* Line 1455 of yacc.c */
-#line 293 "parser.y"
+#line 295 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 16:
/* Line 1455 of yacc.c */
-#line 294 "parser.y"
+#line 296 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 17:
/* Line 1455 of yacc.c */
-#line 295 "parser.y"
+#line 297 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 18:
/* Line 1455 of yacc.c */
-#line 296 "parser.y"
+#line 298 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 19:
/* Line 1455 of yacc.c */
-#line 297 "parser.y"
+#line 299 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 20:
/* Line 1455 of yacc.c */
-#line 298 "parser.y"
+#line 300 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 21:
/* Line 1455 of yacc.c */
-#line 299 "parser.y"
+#line 301 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 22:
/* Line 1455 of yacc.c */
-#line 300 "parser.y"
+#line 302 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 23:
/* Line 1455 of yacc.c */
-#line 301 "parser.y"
+#line 303 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 24:
/* Line 1455 of yacc.c */
-#line 302 "parser.y"
+#line 304 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 25:
/* Line 1455 of yacc.c */
-#line 303 "parser.y"
+#line 305 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 26:
/* Line 1455 of yacc.c */
-#line 304 "parser.y"
+#line 306 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 27:
/* Line 1455 of yacc.c */
-#line 305 "parser.y"
+#line 307 "parser.y"
{ (yyval.statement) = (yyvsp[(1) - (1)].statement); ;}
break;
case 28:
/* Line 1455 of yacc.c */
-#line 309 "parser.y"
+#line 311 "parser.y"
{ (yyval.statement_list) = new_statement_list(ctx, (yyvsp[(1) - (1)].statement)); ;}
break;
case 29:
/* Line 1455 of yacc.c */
-#line 311 "parser.y"
+#line 313 "parser.y"
{ (yyval.statement_list) = statement_list_add((yyvsp[(1) - (2)].statement_list), (yyvsp[(2) - (2)].statement)); ;}
break;
case 30:
/* Line 1455 of yacc.c */
-#line 315 "parser.y"
+#line 317 "parser.y"
{ (yyval.statement_list) = NULL; ;}
break;
case 31:
/* Line 1455 of yacc.c */
-#line 316 "parser.y"
+#line 318 "parser.y"
{ (yyval.statement_list) = (yyvsp[(1) - (1)].statement_list); ;}
break;
case 32:
/* Line 1455 of yacc.c */
-#line 320 "parser.y"
+#line 322 "parser.y"
{ (yyval.statement) = new_block_statement(ctx, (yyvsp[(2) - (3)].statement_list)); ;}
break;
case 33:
/* Line 1455 of yacc.c */
-#line 321 "parser.y"
+#line 323 "parser.y"
{ (yyval.statement) = new_block_statement(ctx, NULL); ;}
break;
case 34:
/* Line 1455 of yacc.c */
-#line 326 "parser.y"
+#line 328 "parser.y"
{ (yyval.statement) = new_var_statement(ctx, (yyvsp[(2) - (3)].variable_list)); ;}
break;
case 35:
/* Line 1455 of yacc.c */
-#line 330 "parser.y"
+#line 332 "parser.y"
{ (yyval.variable_list) = new_variable_list(ctx, (yyvsp[(1) - (1)].variable_declaration)); ;}
break;
case 36:
/* Line 1455 of yacc.c */
-#line 332 "parser.y"
+#line 334 "parser.y"
{ (yyval.variable_list) = variable_list_add(ctx, (yyvsp[(1) - (3)].variable_list), (yyvsp[(3) - (3)].variable_declaration)); ;}
break;
case 37:
/* Line 1455 of yacc.c */
-#line 337 "parser.y"
+#line 339 "parser.y"
{ (yyval.variable_list) = new_variable_list(ctx, (yyvsp[(1) - (1)].variable_declaration)); ;}
break;
case 38:
/* Line 1455 of yacc.c */
-#line 339 "parser.y"
+#line 341 "parser.y"
{ (yyval.variable_list) = variable_list_add(ctx, (yyvsp[(1) - (3)].variable_list), (yyvsp[(3) - (3)].variable_declaration)); ;}
break;
case 39:
/* Line 1455 of yacc.c */
-#line 344 "parser.y"
+#line 346 "parser.y"
{ (yyval.variable_declaration) = new_variable_declaration(ctx, (yyvsp[(1) - (2)].identifier), (yyvsp[(2) - (2)].expr)); ;}
break;
case 40:
/* Line 1455 of yacc.c */
-#line 349 "parser.y"
+#line 351 "parser.y"
{ (yyval.variable_declaration) = new_variable_declaration(ctx, (yyvsp[(1) - (2)].identifier), (yyvsp[(2) - (2)].expr)); ;}
break;
case 41:
/* Line 1455 of yacc.c */
-#line 353 "parser.y"
+#line 355 "parser.y"
{ (yyval.expr) = NULL; ;}
break;
case 42:
/* Line 1455 of yacc.c */
-#line 354 "parser.y"
+#line 356 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 43:
/* Line 1455 of yacc.c */
-#line 359 "parser.y"
+#line 361 "parser.y"
{ (yyval.expr) = (yyvsp[(2) - (2)].expr); ;}
break;
case 44:
/* Line 1455 of yacc.c */
-#line 363 "parser.y"
+#line 365 "parser.y"
{ (yyval.expr) = NULL; ;}
break;
case 45:
/* Line 1455 of yacc.c */
-#line 364 "parser.y"
+#line 366 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 46:
/* Line 1455 of yacc.c */
-#line 369 "parser.y"
+#line 371 "parser.y"
{ (yyval.expr) = (yyvsp[(2) - (2)].expr); ;}
break;
case 47:
/* Line 1455 of yacc.c */
-#line 373 "parser.y"
+#line 375 "parser.y"
{ (yyval.statement) = new_empty_statement(ctx); ;}
break;
case 48:
/* Line 1455 of yacc.c */
-#line 378 "parser.y"
+#line 380 "parser.y"
{ (yyval.statement) = new_expression_statement(ctx, (yyvsp[(1) - (2)].expr)); ;}
break;
case 49:
/* Line 1455 of yacc.c */
-#line 383 "parser.y"
+#line 385 "parser.y"
{ (yyval.statement) = new_if_statement(ctx, (yyvsp[(3) - (7)].expr), (yyvsp[(5) - (7)].statement), (yyvsp[(7) - (7)].statement)); ;}
break;
case 50:
/* Line 1455 of yacc.c */
-#line 385 "parser.y"
+#line 387 "parser.y"
{ (yyval.statement) = new_if_statement(ctx, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].statement), NULL); ;}
break;
case 51:
/* Line 1455 of yacc.c */
-#line 390 "parser.y"
+#line 392 "parser.y"
{ (yyval.statement) = new_while_statement(ctx, TRUE, (yyvsp[(5) - (7)].expr), (yyvsp[(2) - (7)].statement)); ;}
break;
case 52:
/* Line 1455 of yacc.c */
-#line 392 "parser.y"
+#line 394 "parser.y"
{ (yyval.statement) = new_while_statement(ctx, FALSE, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].statement)); ;}
break;
case 53:
/* Line 1455 of yacc.c */
-#line 394 "parser.y"
- { (yyval.statement) = new_for_statement(ctx, NULL, (yyvsp[(3) - (9)].expr), (yyvsp[(5) - (9)].expr), (yyvsp[(7) - (9)].expr), (yyvsp[(9) - (9)].statement)); ;}
+#line 396 "parser.y"
+ { if(!explicit_error(ctx, (yyvsp[(3) - (3)].expr), ';')) YYABORT; ;}
break;
case 54:
/* Line 1455 of yacc.c */
-#line 396 "parser.y"
- { (yyval.statement) = new_for_statement(ctx, (yyvsp[(4) - (10)].variable_list), NULL, (yyvsp[(6) - (10)].expr), (yyvsp[(8) - (10)].expr), (yyvsp[(10) - (10)].statement)); ;}
+#line 398 "parser.y"
+ { if(!explicit_error(ctx, (yyvsp[(6) - (6)].expr), ';')) YYABORT; ;}
break;
case 55:
/* Line 1455 of yacc.c */
-#line 398 "parser.y"
- { (yyval.statement) = new_forin_statement(ctx, NULL, (yyvsp[(3) - (7)].expr), (yyvsp[(5) - (7)].expr), (yyvsp[(7) - (7)].statement)); ;}
+#line 400 "parser.y"
+ { (yyval.statement) = new_for_statement(ctx, NULL, (yyvsp[(3) - (11)].expr), (yyvsp[(6) - (11)].expr), (yyvsp[(9) - (11)].expr), (yyvsp[(11) - (11)].statement)); ;}
break;
case 56:
/* Line 1455 of yacc.c */
-#line 400 "parser.y"
- { (yyval.statement) = new_forin_statement(ctx, (yyvsp[(4) - (8)].variable_declaration), NULL, (yyvsp[(6) - (8)].expr), (yyvsp[(8) - (8)].statement)); ;}
+#line 402 "parser.y"
+ { if(!explicit_error(ctx, (yyvsp[(4) - (4)].variable_list), ';')) YYABORT; ;}
break;
case 57:
/* Line 1455 of yacc.c */
-#line 405 "parser.y"
- { (yyval.statement) = new_continue_statement(ctx, (yyvsp[(2) - (3)].identifier)); ;}
+#line 404 "parser.y"
+ { if(!explicit_error(ctx, (yyvsp[(7) - (7)].expr), ';')) YYABORT; ;}
break;
case 58:
/* Line 1455 of yacc.c */
-#line 410 "parser.y"
- { (yyval.statement) = new_break_statement(ctx, (yyvsp[(2) - (3)].identifier)); ;}
+#line 406 "parser.y"
+ { (yyval.statement) = new_for_statement(ctx, (yyvsp[(4) - (12)].variable_list), NULL, (yyvsp[(7) - (12)].expr), (yyvsp[(10) - (12)].expr), (yyvsp[(12) - (12)].statement)); ;}
break;
case 59:
/* Line 1455 of yacc.c */
-#line 415 "parser.y"
- { (yyval.statement) = new_return_statement(ctx, (yyvsp[(2) - (3)].expr)); ;}
+#line 408 "parser.y"
+ { (yyval.statement) = new_forin_statement(ctx, NULL, (yyvsp[(3) - (7)].expr), (yyvsp[(5) - (7)].expr), (yyvsp[(7) - (7)].statement)); ;}
break;
case 60:
/* Line 1455 of yacc.c */
-#line 420 "parser.y"
- { (yyval.statement) = new_with_statement(ctx, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].statement)); ;}
+#line 410 "parser.y"
+ { (yyval.statement) = new_forin_statement(ctx, (yyvsp[(4) - (8)].variable_declaration), NULL, (yyvsp[(6) - (8)].expr), (yyvsp[(8) - (8)].statement)); ;}
break;
case 61:
/* Line 1455 of yacc.c */
-#line 425 "parser.y"
- { (yyval.statement) = new_labelled_statement(ctx, (yyvsp[(1) - (3)].identifier), (yyvsp[(3) - (3)].statement)); ;}
+#line 415 "parser.y"
+ { (yyval.statement) = new_continue_statement(ctx, (yyvsp[(2) - (3)].identifier)); ;}
break;
case 62:
/* Line 1455 of yacc.c */
-#line 430 "parser.y"
- { (yyval.statement) = new_switch_statement(ctx, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].case_clausule)); ;}
+#line 420 "parser.y"
+ { (yyval.statement) = new_break_statement(ctx, (yyvsp[(2) - (3)].identifier)); ;}
break;
case 63:
/* Line 1455 of yacc.c */
-#line 435 "parser.y"
- { (yyval.case_clausule) = new_case_block(ctx, (yyvsp[(2) - (3)].case_list), NULL, NULL); ;}
+#line 425 "parser.y"
+ { (yyval.statement) = new_return_statement(ctx, (yyvsp[(2) - (3)].expr)); ;}
break;
case 64:
/* Line 1455 of yacc.c */
-#line 437 "parser.y"
- { (yyval.case_clausule) = new_case_block(ctx, (yyvsp[(2) - (5)].case_list), (yyvsp[(3) - (5)].case_clausule), (yyvsp[(4) - (5)].case_list)); ;}
+#line 430 "parser.y"
+ { (yyval.statement) = new_with_statement(ctx, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].statement)); ;}
break;
case 65:
/* Line 1455 of yacc.c */
-#line 441 "parser.y"
- { (yyval.case_list) = NULL; ;}
+#line 435 "parser.y"
+ { (yyval.statement) = new_labelled_statement(ctx, (yyvsp[(1) - (3)].identifier), (yyvsp[(3) - (3)].statement)); ;}
break;
case 66:
/* Line 1455 of yacc.c */
-#line 442 "parser.y"
- { (yyval.case_list) = (yyvsp[(1) - (1)].case_list); ;}
+#line 440 "parser.y"
+ { (yyval.statement) = new_switch_statement(ctx, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].case_clausule)); ;}
break;
case 67:
/* Line 1455 of yacc.c */
-#line 446 "parser.y"
- { (yyval.case_list) = new_case_list(ctx, (yyvsp[(1) - (1)].case_clausule)); ;}
+#line 445 "parser.y"
+ { (yyval.case_clausule) = new_case_block(ctx, (yyvsp[(2) - (3)].case_list), NULL, NULL); ;}
break;
case 68:
/* Line 1455 of yacc.c */
-#line 448 "parser.y"
- { (yyval.case_list) = case_list_add(ctx, (yyvsp[(1) - (2)].case_list), (yyvsp[(2) - (2)].case_clausule)); ;}
+#line 447 "parser.y"
+ { (yyval.case_clausule) = new_case_block(ctx, (yyvsp[(2) - (5)].case_list), (yyvsp[(3) - (5)].case_clausule), (yyvsp[(4) - (5)].case_list)); ;}
break;
case 69:
/* Line 1455 of yacc.c */
-#line 453 "parser.y"
- { (yyval.case_clausule) = new_case_clausule(ctx, (yyvsp[(2) - (4)].expr), (yyvsp[(4) - (4)].statement_list)); ;}
+#line 451 "parser.y"
+ { (yyval.case_list) = NULL; ;}
break;
case 70:
/* Line 1455 of yacc.c */
-#line 458 "parser.y"
- { (yyval.case_clausule) = new_case_clausule(ctx, NULL, (yyvsp[(3) - (3)].statement_list)); ;}
+#line 452 "parser.y"
+ { (yyval.case_list) = (yyvsp[(1) - (1)].case_list); ;}
break;
case 71:
/* Line 1455 of yacc.c */
-#line 463 "parser.y"
- { (yyval.statement) = new_throw_statement(ctx, (yyvsp[(2) - (3)].expr)); ;}
+#line 456 "parser.y"
+ { (yyval.case_list) = new_case_list(ctx, (yyvsp[(1) - (1)].case_clausule)); ;}
break;
case 72:
/* Line 1455 of yacc.c */
-#line 467 "parser.y"
- { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (3)].statement), (yyvsp[(3) - (3)].catch_block), NULL); ;}
+#line 458 "parser.y"
+ { (yyval.case_list) = case_list_add(ctx, (yyvsp[(1) - (2)].case_list), (yyvsp[(2) - (2)].case_clausule)); ;}
break;
case 73:
/* Line 1455 of yacc.c */
-#line 468 "parser.y"
- { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (3)].statement), NULL, (yyvsp[(3) - (3)].statement)); ;}
+#line 463 "parser.y"
+ { (yyval.case_clausule) = new_case_clausule(ctx, (yyvsp[(2) - (4)].expr), (yyvsp[(4) - (4)].statement_list)); ;}
break;
case 74:
/* Line 1455 of yacc.c */
-#line 470 "parser.y"
- { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (4)].statement), (yyvsp[(3) - (4)].catch_block), (yyvsp[(4) - (4)].statement)); ;}
+#line 468 "parser.y"
+ { (yyval.case_clausule) = new_case_clausule(ctx, NULL, (yyvsp[(3) - (3)].statement_list)); ;}
break;
case 75:
/* Line 1455 of yacc.c */
-#line 475 "parser.y"
- { (yyval.catch_block) = new_catch_block(ctx, (yyvsp[(3) - (5)].identifier), (yyvsp[(5) - (5)].statement)); ;}
+#line 473 "parser.y"
+ { (yyval.statement) = new_throw_statement(ctx, (yyvsp[(2) - (3)].expr)); ;}
break;
case 76:
/* Line 1455 of yacc.c */
-#line 479 "parser.y"
- { (yyval.statement) = (yyvsp[(2) - (2)].statement); ;}
+#line 477 "parser.y"
+ { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (3)].statement), (yyvsp[(3) - (3)].catch_block), NULL); ;}
break;
case 77:
/* Line 1455 of yacc.c */
-#line 483 "parser.y"
- { (yyval.expr) = NULL; ;}
+#line 478 "parser.y"
+ { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (3)].statement), NULL, (yyvsp[(3) - (3)].statement)); ;}
break;
case 78:
/* Line 1455 of yacc.c */
-#line 484 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 480 "parser.y"
+ { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (4)].statement), (yyvsp[(3) - (4)].catch_block), (yyvsp[(4) - (4)].statement)); ;}
break;
case 79:
/* Line 1455 of yacc.c */
-#line 488 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 485 "parser.y"
+ { (yyval.catch_block) = new_catch_block(ctx, (yyvsp[(3) - (5)].identifier), (yyvsp[(5) - (5)].statement)); ;}
break;
case 80:
/* Line 1455 of yacc.c */
-#line 490 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_COMMA, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 489 "parser.y"
+ { (yyval.statement) = (yyvsp[(2) - (2)].statement); ;}
break;
case 81:
/* Line 1455 of yacc.c */
-#line 494 "parser.y"
+#line 493 "parser.y"
{ (yyval.expr) = NULL; ;}
break;
case 82:
/* Line 1455 of yacc.c */
-#line 495 "parser.y"
+#line 494 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 83:
/* Line 1455 of yacc.c */
-#line 500 "parser.y"
+#line 497 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 84:
/* Line 1455 of yacc.c */
-#line 502 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_COMMA, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 498 "parser.y"
+ { set_error(ctx, IDS_SYNTAX_ERROR); YYABORT; ;}
break;
case 85:
/* Line 1455 of yacc.c */
-#line 506 "parser.y"
+#line 502 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 86:
/* Line 1455 of yacc.c */
-#line 508 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_ASSIGN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 504 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_COMMA, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 87:
/* Line 1455 of yacc.c */
-#line 510 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 508 "parser.y"
+ { (yyval.expr) = NULL; ;}
break;
case 88:
/* Line 1455 of yacc.c */
-#line 515 "parser.y"
+#line 509 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 89:
/* Line 1455 of yacc.c */
-#line 517 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_ASSIGN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 514 "parser.y"
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 90:
/* Line 1455 of yacc.c */
-#line 519 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 516 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_COMMA, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 91:
/* Line 1455 of yacc.c */
-#line 523 "parser.y"
+#line 520 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 92:
/* Line 1455 of yacc.c */
-#line 525 "parser.y"
- { (yyval.expr) = new_conditional_expression(ctx, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;}
+#line 522 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_ASSIGN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 93:
/* Line 1455 of yacc.c */
-#line 530 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 524 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 94:
/* Line 1455 of yacc.c */
-#line 532 "parser.y"
- { (yyval.expr) = new_conditional_expression(ctx, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;}
+#line 529 "parser.y"
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 95:
/* Line 1455 of yacc.c */
-#line 536 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 531 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_ASSIGN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 96:
/* Line 1455 of yacc.c */
-#line 538 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 533 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 97:
/* Line 1455 of yacc.c */
-#line 543 "parser.y"
+#line 537 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 98:
/* Line 1455 of yacc.c */
-#line 545 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 539 "parser.y"
+ { (yyval.expr) = new_conditional_expression(ctx, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;}
break;
case 99:
/* Line 1455 of yacc.c */
-#line 549 "parser.y"
+#line 544 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 100:
/* Line 1455 of yacc.c */
-#line 551 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 546 "parser.y"
+ { (yyval.expr) = new_conditional_expression(ctx, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;}
break;
case 101:
/* Line 1455 of yacc.c */
-#line 556 "parser.y"
+#line 550 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 102:
/* Line 1455 of yacc.c */
-#line 558 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 552 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 103:
/* Line 1455 of yacc.c */
-#line 562 "parser.y"
+#line 557 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 104:
/* Line 1455 of yacc.c */
-#line 564 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_BOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 559 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 105:
/* Line 1455 of yacc.c */
-#line 569 "parser.y"
+#line 563 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 106:
/* Line 1455 of yacc.c */
-#line 571 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_BOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 565 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 107:
/* Line 1455 of yacc.c */
-#line 575 "parser.y"
+#line 570 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 108:
/* Line 1455 of yacc.c */
-#line 577 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_BXOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 572 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 109:
/* Line 1455 of yacc.c */
-#line 582 "parser.y"
+#line 576 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 110:
/* Line 1455 of yacc.c */
-#line 584 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_BXOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 578 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_BOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 111:
/* Line 1455 of yacc.c */
-#line 588 "parser.y"
+#line 583 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 112:
/* Line 1455 of yacc.c */
-#line 590 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_BAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 585 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_BOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 113:
/* Line 1455 of yacc.c */
-#line 595 "parser.y"
+#line 589 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 114:
/* Line 1455 of yacc.c */
-#line 597 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_BAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 591 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_BXOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 115:
/* Line 1455 of yacc.c */
-#line 601 "parser.y"
+#line 596 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 116:
/* Line 1455 of yacc.c */
-#line 603 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 598 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_BXOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 117:
/* Line 1455 of yacc.c */
-#line 607 "parser.y"
+#line 602 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 118:
/* Line 1455 of yacc.c */
-#line 609 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 604 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_BAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 119:
/* Line 1455 of yacc.c */
-#line 613 "parser.y"
+#line 609 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 120:
/* Line 1455 of yacc.c */
-#line 615 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 611 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_BAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 121:
/* Line 1455 of yacc.c */
-#line 617 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_INSTANCEOF, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 615 "parser.y"
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 122:
/* Line 1455 of yacc.c */
-#line 619 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_IN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 617 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 123:
/* Line 1455 of yacc.c */
-#line 623 "parser.y"
+#line 621 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 124:
/* Line 1455 of yacc.c */
-#line 625 "parser.y"
+#line 623 "parser.y"
{ (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
@@ -2840,525 +2870,588 @@ yyreduce:
/* Line 1455 of yacc.c */
#line 627 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_INSTANCEOF, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 126:
/* Line 1455 of yacc.c */
-#line 631 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 629 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 127:
/* Line 1455 of yacc.c */
-#line 633 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 631 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_INSTANCEOF, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 128:
/* Line 1455 of yacc.c */
-#line 638 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 633 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_IN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 129:
/* Line 1455 of yacc.c */
-#line 640 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_ADD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 637 "parser.y"
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 130:
/* Line 1455 of yacc.c */
-#line 642 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_SUB, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 639 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 131:
/* Line 1455 of yacc.c */
-#line 646 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 641 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_INSTANCEOF, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 132:
/* Line 1455 of yacc.c */
-#line 648 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_MUL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 645 "parser.y"
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 133:
/* Line 1455 of yacc.c */
-#line 650 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_DIV, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+#line 647 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 134:
/* Line 1455 of yacc.c */
#line 652 "parser.y"
- { (yyval.expr) = new_binary_expression(ctx, EXPR_MOD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 135:
/* Line 1455 of yacc.c */
-#line 656 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 654 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_ADD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 136:
/* Line 1455 of yacc.c */
-#line 658 "parser.y"
- { (yyval.expr) = new_unary_expression(ctx, EXPR_DELETE, (yyvsp[(2) - (2)].expr)); ;}
+#line 656 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_SUB, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 137:
/* Line 1455 of yacc.c */
-#line 659 "parser.y"
- { (yyval.expr) = new_unary_expression(ctx, EXPR_VOID, (yyvsp[(2) - (2)].expr)); ;}
+#line 660 "parser.y"
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 138:
/* Line 1455 of yacc.c */
-#line 661 "parser.y"
- { (yyval.expr) = new_unary_expression(ctx, EXPR_TYPEOF, (yyvsp[(2) - (2)].expr)); ;}
+#line 662 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_MUL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 139:
/* Line 1455 of yacc.c */
-#line 662 "parser.y"
- { (yyval.expr) = new_unary_expression(ctx, EXPR_PREINC, (yyvsp[(2) - (2)].expr)); ;}
+#line 664 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_DIV, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 140:
/* Line 1455 of yacc.c */
-#line 663 "parser.y"
- { (yyval.expr) = new_unary_expression(ctx, EXPR_PREDEC, (yyvsp[(2) - (2)].expr)); ;}
+#line 666 "parser.y"
+ { (yyval.expr) = new_binary_expression(ctx, EXPR_MOD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
break;
case 141:
/* Line 1455 of yacc.c */
-#line 664 "parser.y"
- { (yyval.expr) = new_unary_expression(ctx, EXPR_PLUS, (yyvsp[(2) - (2)].expr)); ;}
+#line 670 "parser.y"
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 142:
/* Line 1455 of yacc.c */
-#line 665 "parser.y"
- { (yyval.expr) = new_unary_expression(ctx, EXPR_MINUS, (yyvsp[(2) - (2)].expr)); ;}
+#line 672 "parser.y"
+ { (yyval.expr) = new_unary_expression(ctx, EXPR_DELETE, (yyvsp[(2) - (2)].expr)); ;}
break;
case 143:
/* Line 1455 of yacc.c */
-#line 666 "parser.y"
- { (yyval.expr) = new_unary_expression(ctx, EXPR_BITNEG, (yyvsp[(2) - (2)].expr)); ;}
+#line 673 "parser.y"
+ { (yyval.expr) = new_unary_expression(ctx, EXPR_VOID, (yyvsp[(2) - (2)].expr)); ;}
break;
case 144:
/* Line 1455 of yacc.c */
-#line 667 "parser.y"
- { (yyval.expr) = new_unary_expression(ctx, EXPR_LOGNEG, (yyvsp[(2) - (2)].expr)); ;}
+#line 675 "parser.y"
+ { (yyval.expr) = new_unary_expression(ctx, EXPR_TYPEOF, (yyvsp[(2) - (2)].expr)); ;}
break;
case 145:
/* Line 1455 of yacc.c */
-#line 672 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 676 "parser.y"
+ { (yyval.expr) = new_unary_expression(ctx, EXPR_PREINC, (yyvsp[(2) - (2)].expr)); ;}
break;
case 146:
/* Line 1455 of yacc.c */
-#line 674 "parser.y"
- { (yyval.expr) = new_unary_expression(ctx, EXPR_POSTINC, (yyvsp[(1) - (2)].expr)); ;}
+#line 677 "parser.y"
+ { (yyval.expr) = new_unary_expression(ctx, EXPR_PREDEC, (yyvsp[(2) - (2)].expr)); ;}
break;
case 147:
/* Line 1455 of yacc.c */
-#line 676 "parser.y"
- { (yyval.expr) = new_unary_expression(ctx, EXPR_POSTDEC, (yyvsp[(1) - (2)].expr)); ;}
+#line 678 "parser.y"
+ { (yyval.expr) = new_unary_expression(ctx, EXPR_PLUS, (yyvsp[(2) - (2)].expr)); ;}
break;
case 148:
/* Line 1455 of yacc.c */
-#line 681 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 679 "parser.y"
+ { (yyval.expr) = new_unary_expression(ctx, EXPR_MINUS, (yyvsp[(2) - (2)].expr)); ;}
break;
case 149:
/* Line 1455 of yacc.c */
-#line 682 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 680 "parser.y"
+ { (yyval.expr) = new_unary_expression(ctx, EXPR_BITNEG, (yyvsp[(2) - (2)].expr)); ;}
break;
case 150:
+/* Line 1455 of yacc.c */
+#line 681 "parser.y"
+ { (yyval.expr) = new_unary_expression(ctx, EXPR_LOGNEG, (yyvsp[(2) - (2)].expr)); ;}
+ break;
+
+ case 151:
+
/* Line 1455 of yacc.c */
#line 686 "parser.y"
{ (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
- case 151:
-
-/* Line 1455 of yacc.c */
-#line 687 "parser.y"
- { (yyval.expr) = new_new_expression(ctx, (yyvsp[(2) - (2)].expr), NULL); ;}
- break;
-
case 152:
/* Line 1455 of yacc.c */
-#line 691 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 688 "parser.y"
+ { (yyval.expr) = new_unary_expression(ctx, EXPR_POSTINC, (yyvsp[(1) - (2)].expr)); ;}
break;
case 153:
/* Line 1455 of yacc.c */
-#line 692 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 690 "parser.y"
+ { (yyval.expr) = new_unary_expression(ctx, EXPR_POSTDEC, (yyvsp[(1) - (2)].expr)); ;}
break;
case 154:
/* Line 1455 of yacc.c */
-#line 694 "parser.y"
- { (yyval.expr) = new_array_expression(ctx, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;}
+#line 695 "parser.y"
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 155:
/* Line 1455 of yacc.c */
#line 696 "parser.y"
- { (yyval.expr) = new_member_expression(ctx, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].identifier)); ;}
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 156:
/* Line 1455 of yacc.c */
-#line 698 "parser.y"
- { (yyval.expr) = new_new_expression(ctx, (yyvsp[(2) - (3)].expr), (yyvsp[(3) - (3)].argument_list)); ;}
+#line 700 "parser.y"
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 157:
/* Line 1455 of yacc.c */
-#line 703 "parser.y"
- { (yyval.expr) = new_call_expression(ctx, (yyvsp[(1) - (2)].expr), (yyvsp[(2) - (2)].argument_list)); ;}
+#line 701 "parser.y"
+ { (yyval.expr) = new_new_expression(ctx, (yyvsp[(2) - (2)].expr), NULL); ;}
break;
case 158:
/* Line 1455 of yacc.c */
#line 705 "parser.y"
- { (yyval.expr) = new_call_expression(ctx, (yyvsp[(1) - (2)].expr), (yyvsp[(2) - (2)].argument_list)); ;}
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 159:
/* Line 1455 of yacc.c */
-#line 707 "parser.y"
- { (yyval.expr) = new_array_expression(ctx, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;}
+#line 706 "parser.y"
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 160:
/* Line 1455 of yacc.c */
-#line 709 "parser.y"
- { (yyval.expr) = new_member_expression(ctx, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].identifier)); ;}
+#line 708 "parser.y"
+ { (yyval.expr) = new_array_expression(ctx, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;}
break;
case 161:
/* Line 1455 of yacc.c */
-#line 713 "parser.y"
- { (yyval.argument_list) = NULL; ;}
+#line 710 "parser.y"
+ { (yyval.expr) = new_member_expression(ctx, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].identifier)); ;}
break;
case 162:
/* Line 1455 of yacc.c */
-#line 714 "parser.y"
- { (yyval.argument_list) = (yyvsp[(2) - (3)].argument_list); ;}
+#line 712 "parser.y"
+ { (yyval.expr) = new_new_expression(ctx, (yyvsp[(2) - (3)].expr), (yyvsp[(3) - (3)].argument_list)); ;}
break;
case 163:
/* Line 1455 of yacc.c */
-#line 718 "parser.y"
- { (yyval.argument_list) = new_argument_list(ctx, (yyvsp[(1) - (1)].expr)); ;}
+#line 717 "parser.y"
+ { (yyval.expr) = new_call_expression(ctx, (yyvsp[(1) - (2)].expr), (yyvsp[(2) - (2)].argument_list)); ;}
break;
case 164:
/* Line 1455 of yacc.c */
-#line 720 "parser.y"
- { (yyval.argument_list) = argument_list_add(ctx, (yyvsp[(1) - (3)].argument_list), (yyvsp[(3) - (3)].expr)); ;}
+#line 719 "parser.y"
+ { (yyval.expr) = new_call_expression(ctx, (yyvsp[(1) - (2)].expr), (yyvsp[(2) - (2)].argument_list)); ;}
break;
case 165:
/* Line 1455 of yacc.c */
-#line 724 "parser.y"
- { (yyval.expr) = new_this_expression(ctx); ;}
+#line 721 "parser.y"
+ { (yyval.expr) = new_array_expression(ctx, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;}
break;
case 166:
/* Line 1455 of yacc.c */
-#line 725 "parser.y"
- { (yyval.expr) = new_identifier_expression(ctx, (yyvsp[(1) - (1)].identifier)); ;}
+#line 723 "parser.y"
+ { (yyval.expr) = new_member_expression(ctx, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].identifier)); ;}
break;
case 167:
/* Line 1455 of yacc.c */
-#line 726 "parser.y"
- { (yyval.expr) = new_literal_expression(ctx, (yyvsp[(1) - (1)].literal)); ;}
+#line 727 "parser.y"
+ { (yyval.argument_list) = NULL; ;}
break;
case 168:
/* Line 1455 of yacc.c */
-#line 727 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 728 "parser.y"
+ { (yyval.argument_list) = (yyvsp[(2) - (3)].argument_list); ;}
break;
case 169:
/* Line 1455 of yacc.c */
-#line 728 "parser.y"
- { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
+#line 732 "parser.y"
+ { (yyval.argument_list) = new_argument_list(ctx, (yyvsp[(1) - (1)].expr)); ;}
break;
case 170:
/* Line 1455 of yacc.c */
-#line 729 "parser.y"
- { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;}
+#line 734 "parser.y"
+ { (yyval.argument_list) = argument_list_add(ctx, (yyvsp[(1) - (3)].argument_list), (yyvsp[(3) - (3)].expr)); ;}
break;
case 171:
/* Line 1455 of yacc.c */
-#line 733 "parser.y"
- { (yyval.expr) = new_array_literal_expression(ctx, NULL, 0); ;}
+#line 738 "parser.y"
+ { (yyval.expr) = new_this_expression(ctx); ;}
break;
case 172:
/* Line 1455 of yacc.c */
-#line 734 "parser.y"
- { (yyval.expr) = new_array_literal_expression(ctx, NULL, (yyvsp[(2) - (3)].ival)+1); ;}
+#line 739 "parser.y"
+ { (yyval.expr) = new_identifier_expression(ctx, (yyvsp[(1) - (1)].identifier)); ;}
break;
case 173:
/* Line 1455 of yacc.c */
-#line 735 "parser.y"
- { (yyval.expr) = new_array_literal_expression(ctx, (yyvsp[(2) - (3)].element_list), 0); ;}
+#line 740 "parser.y"
+ { (yyval.expr) = new_literal_expression(ctx, (yyvsp[(1) - (1)].literal)); ;}
break;
case 174:
/* Line 1455 of yacc.c */
-#line 737 "parser.y"
- { (yyval.expr) = new_array_literal_expression(ctx, (yyvsp[(2) - (5)].element_list), (yyvsp[(4) - (5)].ival)+1); ;}
+#line 741 "parser.y"
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 175:
/* Line 1455 of yacc.c */
#line 742 "parser.y"
- { (yyval.element_list) = new_element_list(ctx, (yyvsp[(1) - (2)].ival), (yyvsp[(2) - (2)].expr)); ;}
+ { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
break;
case 176:
/* Line 1455 of yacc.c */
-#line 744 "parser.y"
- { (yyval.element_list) = element_list_add(ctx, (yyvsp[(1) - (4)].element_list), (yyvsp[(3) - (4)].ival), (yyvsp[(4) - (4)].expr)); ;}
+#line 743 "parser.y"
+ { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;}
break;
case 177:
/* Line 1455 of yacc.c */
-#line 748 "parser.y"
- { (yyval.ival) = 1; ;}
+#line 747 "parser.y"
+ { (yyval.expr) = new_array_literal_expression(ctx, NULL, 0); ;}
break;
case 178:
/* Line 1455 of yacc.c */
-#line 749 "parser.y"
- { (yyval.ival) = (yyvsp[(1) - (2)].ival) + 1; ;}
+#line 748 "parser.y"
+ { (yyval.expr) = new_array_literal_expression(ctx, NULL, (yyvsp[(2) - (3)].ival)+1); ;}
break;
case 179:
/* Line 1455 of yacc.c */
-#line 753 "parser.y"
- { (yyval.ival) = 0; ;}
+#line 749 "parser.y"
+ { (yyval.expr) = new_array_literal_expression(ctx, (yyvsp[(2) - (3)].element_list), 0); ;}
break;
case 180:
/* Line 1455 of yacc.c */
-#line 754 "parser.y"
- { (yyval.ival) = (yyvsp[(1) - (1)].ival); ;}
+#line 751 "parser.y"
+ { (yyval.expr) = new_array_literal_expression(ctx, (yyvsp[(2) - (5)].element_list), (yyvsp[(4) - (5)].ival)+1); ;}
break;
case 181:
/* Line 1455 of yacc.c */
-#line 758 "parser.y"
- { (yyval.expr) = new_prop_and_value_expression(ctx, NULL); ;}
+#line 756 "parser.y"
+ { (yyval.element_list) = new_element_list(ctx, (yyvsp[(1) - (2)].ival), (yyvsp[(2) - (2)].expr)); ;}
break;
case 182:
/* Line 1455 of yacc.c */
-#line 760 "parser.y"
- { (yyval.expr) = new_prop_and_value_expression(ctx, (yyvsp[(2) - (3)].property_list)); ;}
+#line 758 "parser.y"
+ { (yyval.element_list) = element_list_add(ctx, (yyvsp[(1) - (4)].element_list), (yyvsp[(3) - (4)].ival), (yyvsp[(4) - (4)].expr)); ;}
break;
case 183:
/* Line 1455 of yacc.c */
-#line 765 "parser.y"
- { (yyval.property_list) = new_property_list(ctx, (yyvsp[(1) - (3)].literal), (yyvsp[(3) - (3)].expr)); ;}
+#line 762 "parser.y"
+ { (yyval.ival) = 1; ;}
break;
case 184:
/* Line 1455 of yacc.c */
-#line 767 "parser.y"
- { (yyval.property_list) = property_list_add(ctx, (yyvsp[(1) - (5)].property_list), (yyvsp[(3) - (5)].literal), (yyvsp[(5) - (5)].expr)); ;}
+#line 763 "parser.y"
+ { (yyval.ival) = (yyvsp[(1) - (2)].ival) + 1; ;}
break;
case 185:
/* Line 1455 of yacc.c */
-#line 771 "parser.y"
- { (yyval.literal) = new_string_literal(ctx, (yyvsp[(1) - (1)].identifier)); ;}
+#line 767 "parser.y"
+ { (yyval.ival) = 0; ;}
break;
case 186:
/* Line 1455 of yacc.c */
-#line 772 "parser.y"
- { (yyval.literal) = new_string_literal(ctx, (yyvsp[(1) - (1)].wstr)); ;}
+#line 768 "parser.y"
+ { (yyval.ival) = (yyvsp[(1) - (1)].ival); ;}
break;
case 187:
/* Line 1455 of yacc.c */
-#line 773 "parser.y"
- { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;}
+#line 772 "parser.y"
+ { (yyval.expr) = new_prop_and_value_expression(ctx, NULL); ;}
break;
case 188:
/* Line 1455 of yacc.c */
-#line 777 "parser.y"
- { (yyval.identifier) = NULL; ;}
+#line 774 "parser.y"
+ { (yyval.expr) = new_prop_and_value_expression(ctx, (yyvsp[(2) - (3)].property_list)); ;}
break;
case 189:
/* Line 1455 of yacc.c */
-#line 778 "parser.y"
- { (yyval.identifier) = (yyvsp[(1) - (1)].identifier); ;}
+#line 779 "parser.y"
+ { (yyval.property_list) = new_property_list(ctx, (yyvsp[(1) - (3)].literal), (yyvsp[(3) - (3)].expr)); ;}
break;
case 190:
/* Line 1455 of yacc.c */
-#line 782 "parser.y"
- { (yyval.literal) = new_null_literal(ctx); ;}
+#line 781 "parser.y"
+ { (yyval.property_list) = property_list_add(ctx, (yyvsp[(1) - (5)].property_list), (yyvsp[(3) - (5)].literal), (yyvsp[(5) - (5)].expr)); ;}
break;
case 191:
/* Line 1455 of yacc.c */
-#line 783 "parser.y"
- { (yyval.literal) = new_undefined_literal(ctx); ;}
+#line 785 "parser.y"
+ { (yyval.literal) = new_string_literal(ctx, (yyvsp[(1) - (1)].identifier)); ;}
break;
case 192:
-/* Line 1455 of yacc.c */
-#line 784 "parser.y"
- { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;}
- break;
-
- case 193:
-
-/* Line 1455 of yacc.c */
-#line 785 "parser.y"
- { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;}
- break;
-
- case 194:
-
/* Line 1455 of yacc.c */
#line 786 "parser.y"
{ (yyval.literal) = new_string_literal(ctx, (yyvsp[(1) - (1)].wstr)); ;}
break;
- case 195:
+ case 193:
/* Line 1455 of yacc.c */
#line 787 "parser.y"
- { (yyval.literal) = parse_regexp(ctx);
- if(!(yyval.literal)) YYABORT; ;}
+ { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;}
+ break;
+
+ case 194:
+
+/* Line 1455 of yacc.c */
+#line 791 "parser.y"
+ { (yyval.identifier) = NULL; ;}
+ break;
+
+ case 195:
+
+/* Line 1455 of yacc.c */
+#line 792 "parser.y"
+ { (yyval.identifier) = (yyvsp[(1) - (1)].identifier); ;}
break;
case 196:
/* Line 1455 of yacc.c */
-#line 792 "parser.y"
- { (yyval.literal) = new_boolean_literal(ctx, TRUE); ;}
+#line 796 "parser.y"
+ { (yyval.literal) = new_null_literal(ctx); ;}
break;
case 197:
/* Line 1455 of yacc.c */
-#line 793 "parser.y"
- { (yyval.literal) = new_boolean_literal(ctx, FALSE); ;}
+#line 797 "parser.y"
+ { (yyval.literal) = new_undefined_literal(ctx); ;}
+ break;
+
+ case 198:
+
+/* Line 1455 of yacc.c */
+#line 798 "parser.y"
+ { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;}
break;
case 199:
/* Line 1455 of yacc.c */
-#line 797 "parser.y"
+#line 799 "parser.y"
+ { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;}
+ break;
+
+ case 200:
+
+/* Line 1455 of yacc.c */
+#line 800 "parser.y"
+ { (yyval.literal) = new_string_literal(ctx, (yyvsp[(1) - (1)].wstr)); ;}
+ break;
+
+ case 201:
+
+/* Line 1455 of yacc.c */
+#line 801 "parser.y"
+ { (yyval.literal) = parse_regexp(ctx);
+ if(!(yyval.literal)) YYABORT; ;}
+ break;
+
+ case 202:
+
+/* Line 1455 of yacc.c */
+#line 806 "parser.y"
+ { (yyval.literal) = new_boolean_literal(ctx, TRUE); ;}
+ break;
+
+ case 203:
+
+/* Line 1455 of yacc.c */
+#line 807 "parser.y"
+ { (yyval.literal) = new_boolean_literal(ctx, FALSE); ;}
+ break;
+
+ case 205:
+
+/* Line 1455 of yacc.c */
+#line 811 "parser.y"
{ if(!allow_auto_semicolon(ctx)) {YYABORT;} ;}
break;
+ case 207:
+
+/* Line 1455 of yacc.c */
+#line 815 "parser.y"
+ { set_error(ctx, IDS_LBRACKET); YYABORT; ;}
+ break;
+
+ case 209:
+
+/* Line 1455 of yacc.c */
+#line 819 "parser.y"
+ { set_error(ctx, IDS_RBRACKET); YYABORT; ;}
+ break;
+
+ case 211:
+
+/* Line 1455 of yacc.c */
+#line 823 "parser.y"
+ { set_error(ctx, IDS_SEMICOLON); YYABORT; ;}
+ break;
+
/* Line 1455 of yacc.c */
-#line 3362 "parser.tab.c"
+#line 3455 "parser.tab.c"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -3570,7 +3663,7 @@ yyreturn:
/* Line 1675 of yacc.c */
-#line 799 "parser.y"
+#line 825 "parser.y"
static BOOL allow_auto_semicolon(parser_ctx_t *ctx)
@@ -4209,6 +4302,20 @@ static int parser_error(const char *str)
return 0;
}
+static void set_error(parser_ctx_t *ctx, UINT error)
+{
+ ctx->hres = JSCRIPT_ERROR|error;
+}
+
+static BOOL explicit_error(parser_ctx_t *ctx, void *obj, WCHAR next)
+{
+ if(obj || *(ctx->ptr-1)==next) return TRUE;
+
+ set_error(ctx, IDS_SYNTAX_ERROR);
+ return FALSE;
+}
+
+
static expression_t *new_identifier_expression(parser_ctx_t *ctx, const WCHAR *identifier)
{
identifier_expression_t *ret = parser_alloc(ctx, sizeof(identifier_expression_t));
@@ -4312,7 +4419,8 @@ static void program_parsed(parser_ctx_t *ctx, source_elements_t *source)
pop_func(ctx);
ctx->source = source;
- ctx->hres = S_OK;
+ if(!ctx->lexer_error)
+ ctx->hres = S_OK;
}
void parser_release(parser_ctx_t *ctx)
@@ -4343,7 +4451,7 @@ HRESULT script_parse(script_ctx_t *ctx, const WCHAR *code, const WCHAR *delimite
return E_OUTOFMEMORY;
parser_ctx->ref = 1;
- parser_ctx->hres = E_FAIL;
+ parser_ctx->hres = JSCRIPT_ERROR|IDS_SYNTAX_ERROR;
parser_ctx->is_html = delimiter && !strcmpiW(delimiter, html_tagW);
parser_ctx->begin = parser_ctx->ptr = code;
diff --git a/reactos/dll/win32/jscript/parser.tab.h b/reactos/dll/win32/jscript/parser.tab.h
index 98b62a20aab..69ae5827db1 100644
--- a/reactos/dll/win32/jscript/parser.tab.h
+++ b/reactos/dll/win32/jscript/parser.tab.h
@@ -91,7 +91,7 @@ typedef union YYSTYPE
{
/* Line 1676 of yacc.c */
-#line 149 "parser.y"
+#line 151 "parser.y"
int ival;
const WCHAR *srcptr;
diff --git a/reactos/dll/win32/jscript/parser.y b/reactos/dll/win32/jscript/parser.y
index 52a31c88a79..29d805f4df0 100644
--- a/reactos/dll/win32/jscript/parser.y
+++ b/reactos/dll/win32/jscript/parser.y
@@ -25,6 +25,8 @@
#define YYPARSE_PARAM ctx
static int parser_error(const char*);
+static void set_error(parser_ctx_t*,UINT);
+static BOOL explicit_error(parser_ctx_t*,void*,WCHAR);
static BOOL allow_auto_semicolon(parser_ctx_t*);
static void program_parsed(parser_ctx_t*,source_elements_t*);
static source_elements_t *function_body_parsed(parser_ctx_t*,source_elements_t*);
@@ -200,7 +202,7 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state
%type Finally
%type StatementList StatementList_opt
%type FormalParameterList FormalParameterList_opt
-%type Expression Expression_opt
+%type Expression Expression_opt Expression_err
%type ExpressionNoIn ExpressionNoIn_opt
%type FunctionExpression
%type AssignmentExpression AssignmentExpressionNoIn
@@ -266,7 +268,7 @@ SourceElements
/* ECMA-262 3rd Edition 13 */
FunctionExpression
- : KFunction Identifier_opt '(' FormalParameterList_opt ')' '{' FunctionBody '}'
+ : KFunction Identifier_opt left_bracket FormalParameterList_opt right_bracket '{' FunctionBody '}'
{ $$ = new_function_expression(ctx, $2, $4, $7, $1, $8-$1+1); }
KFunction
@@ -379,24 +381,32 @@ ExpressionStatement
/* ECMA-262 3rd Edition 12.5 */
IfStatement
- : kIF '(' Expression ')' Statement kELSE Statement
+ : kIF left_bracket Expression_err right_bracket Statement kELSE Statement
{ $$ = new_if_statement(ctx, $3, $5, $7); }
- | kIF '(' Expression ')' Statement %prec LOWER_THAN_ELSE
+ | kIF left_bracket Expression_err right_bracket Statement %prec LOWER_THAN_ELSE
{ $$ = new_if_statement(ctx, $3, $5, NULL); }
/* ECMA-262 3rd Edition 12.6 */
IterationStatement
- : kDO Statement kWHILE '(' Expression ')' ';'
+ : kDO Statement kWHILE left_bracket Expression_err right_bracket semicolon_opt
{ $$ = new_while_statement(ctx, TRUE, $5, $2); }
- | kWHILE '(' Expression ')' Statement
+ | kWHILE left_bracket Expression_err right_bracket Statement
{ $$ = new_while_statement(ctx, FALSE, $3, $5); }
- | kFOR '(' ExpressionNoIn_opt ';' Expression_opt ';' Expression_opt ')' Statement
- { $$ = new_for_statement(ctx, NULL, $3, $5, $7, $9); }
- | kFOR '(' kVAR VariableDeclarationListNoIn ';' Expression_opt ';' Expression_opt ')' Statement
- { $$ = new_for_statement(ctx, $4, NULL, $6, $8, $10); }
- | kFOR '(' LeftHandSideExpression kIN Expression ')' Statement
+ | kFOR left_bracket ExpressionNoIn_opt
+ { if(!explicit_error(ctx, $3, ';')) YYABORT; }
+ semicolon Expression_opt
+ { if(!explicit_error(ctx, $6, ';')) YYABORT; }
+ semicolon Expression_opt right_bracket Statement
+ { $$ = new_for_statement(ctx, NULL, $3, $6, $9, $11); }
+ | kFOR left_bracket kVAR VariableDeclarationListNoIn
+ { if(!explicit_error(ctx, $4, ';')) YYABORT; }
+ semicolon Expression_opt
+ { if(!explicit_error(ctx, $7, ';')) YYABORT; }
+ semicolon Expression_opt right_bracket Statement
+ { $$ = new_for_statement(ctx, $4, NULL, $7, $10, $12); }
+ | kFOR left_bracket LeftHandSideExpression kIN Expression_err right_bracket Statement
{ $$ = new_forin_statement(ctx, NULL, $3, $5, $7); }
- | kFOR '(' kVAR VariableDeclarationNoIn kIN Expression ')' Statement
+ | kFOR left_bracket kVAR VariableDeclarationNoIn kIN Expression_err right_bracket Statement
{ $$ = new_forin_statement(ctx, $4, NULL, $6, $8); }
/* ECMA-262 3rd Edition 12.7 */
@@ -416,7 +426,7 @@ ReturnStatement
/* ECMA-262 3rd Edition 12.10 */
WithStatement
- : kWITH '(' Expression ')' Statement
+ : kWITH left_bracket Expression right_bracket Statement
{ $$ = new_with_statement(ctx, $3, $5); }
/* ECMA-262 3rd Edition 12.12 */
@@ -426,8 +436,8 @@ LabelledStatement
/* ECMA-262 3rd Edition 12.11 */
SwitchStatement
- : kSWITCH '(' Expression ')' CaseBlock
- { $$ = new_switch_statement(ctx, $3, $5); }
+ : kSWITCH left_bracket Expression right_bracket CaseBlock
+ { $$ = new_switch_statement(ctx, $3, $5); }
/* ECMA-262 3rd Edition 12.11 */
CaseBlock
@@ -471,8 +481,8 @@ TryStatement
/* ECMA-262 3rd Edition 12.14 */
Catch
- : kCATCH '(' tIdentifier ')' Block
- { $$ = new_catch_block(ctx, $3, $5); }
+ : kCATCH left_bracket tIdentifier right_bracket Block
+ { $$ = new_catch_block(ctx, $3, $5); }
/* ECMA-262 3rd Edition 12.14 */
Finally
@@ -483,6 +493,10 @@ Expression_opt
: /* empty */ { $$ = NULL; }
| Expression { $$ = $1; }
+Expression_err
+ : Expression { $$ = $1; }
+ | error { set_error(ctx, IDS_SYNTAX_ERROR); YYABORT; }
+
/* ECMA-262 3rd Edition 11.14 */
Expression
: AssignmentExpression { $$ = $1; }
@@ -796,6 +810,18 @@ semicolon_opt
: ';'
| error { if(!allow_auto_semicolon(ctx)) {YYABORT;} }
+left_bracket
+ : '('
+ | error { set_error(ctx, IDS_LBRACKET); YYABORT; }
+
+right_bracket
+ : ')'
+ | error { set_error(ctx, IDS_RBRACKET); YYABORT; }
+
+semicolon
+ : ';'
+ | error { set_error(ctx, IDS_SEMICOLON); YYABORT; }
+
%%
static BOOL allow_auto_semicolon(parser_ctx_t *ctx)
@@ -1434,6 +1460,20 @@ static int parser_error(const char *str)
return 0;
}
+static void set_error(parser_ctx_t *ctx, UINT error)
+{
+ ctx->hres = JSCRIPT_ERROR|error;
+}
+
+static BOOL explicit_error(parser_ctx_t *ctx, void *obj, WCHAR next)
+{
+ if(obj || *(ctx->ptr-1)==next) return TRUE;
+
+ set_error(ctx, IDS_SYNTAX_ERROR);
+ return FALSE;
+}
+
+
static expression_t *new_identifier_expression(parser_ctx_t *ctx, const WCHAR *identifier)
{
identifier_expression_t *ret = parser_alloc(ctx, sizeof(identifier_expression_t));
@@ -1537,7 +1577,8 @@ static void program_parsed(parser_ctx_t *ctx, source_elements_t *source)
pop_func(ctx);
ctx->source = source;
- ctx->hres = S_OK;
+ if(!ctx->lexer_error)
+ ctx->hres = S_OK;
}
void parser_release(parser_ctx_t *ctx)
@@ -1568,7 +1609,7 @@ HRESULT script_parse(script_ctx_t *ctx, const WCHAR *code, const WCHAR *delimite
return E_OUTOFMEMORY;
parser_ctx->ref = 1;
- parser_ctx->hres = E_FAIL;
+ parser_ctx->hres = JSCRIPT_ERROR|IDS_SYNTAX_ERROR;
parser_ctx->is_html = delimiter && !strcmpiW(delimiter, html_tagW);
parser_ctx->begin = parser_ctx->ptr = code;
diff --git a/reactos/dll/win32/jscript/regexp.c b/reactos/dll/win32/jscript/regexp.c
index 0acc47815c8..1f874e27de9 100644
--- a/reactos/dll/win32/jscript/regexp.c
+++ b/reactos/dll/win32/jscript/regexp.c
@@ -90,12 +90,8 @@ static const WCHAR ignoreCaseW[] = {'i','g','n','o','r','e','C','a','s','e',0};
static const WCHAR multilineW[] = {'m','u','l','t','i','l','i','n','e',0};
static const WCHAR lastIndexW[] = {'l','a','s','t','I','n','d','e','x',0};
static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
-static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0};
-static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0};
-static const WCHAR propertyIsEnumerableW[] =
- {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0};
-static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0};
static const WCHAR execW[] = {'e','x','e','c',0};
+static const WCHAR testW[] = {'t','e','s','t',0};
static const WCHAR emptyW[] = {0};
@@ -3431,8 +3427,24 @@ HRESULT regexp_match(DispatchEx *dispex, const WCHAR *str, DWORD len, BOOL gflag
static HRESULT RegExp_source(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET: {
+ RegExpInstance *This = (RegExpInstance*)dispex;
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = SysAllocString(This->str);
+ if(!V_BSTR(retv))
+ return E_OUTOFMEMORY;
+ break;
+ }
+ default:
+ FIXME("Unimplemnted flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
}
static HRESULT RegExp_global(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
@@ -3470,34 +3482,6 @@ static HRESULT RegExp_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA
return E_NOTIMPL;
}
-static HRESULT RegExp_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT RegExp_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT RegExp_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT RegExp_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
static HRESULT RegExp_exec(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
@@ -3505,11 +3489,27 @@ static HRESULT RegExp_exec(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS
return E_NOTIMPL;
}
+static HRESULT RegExp_test(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+ VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ FIXME("\n");
+ return E_NOTIMPL;
+}
+
static HRESULT RegExp_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ TRACE("\n");
+
+ switch(flags) {
+ case INVOKE_FUNC:
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL);
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
}
static void RegExp_destructor(DispatchEx *dispex)
@@ -3523,16 +3523,13 @@ static void RegExp_destructor(DispatchEx *dispex)
}
static const builtin_prop_t RegExp_props[] = {
- {execW, RegExp_exec, PROPF_METHOD},
+ {execW, RegExp_exec, PROPF_METHOD|1},
{globalW, RegExp_global, 0},
- {hasOwnPropertyW, RegExp_hasOwnProperty, PROPF_METHOD},
{ignoreCaseW, RegExp_ignoreCase, 0},
- {isPrototypeOfW, RegExp_isPrototypeOf, PROPF_METHOD},
{lastIndexW, RegExp_lastIndex, 0},
{multilineW, RegExp_multiline, 0},
- {propertyIsEnumerableW, RegExp_propertyIsEnumerable, PROPF_METHOD},
{sourceW, RegExp_source, 0},
- {toLocaleStringW, RegExp_toLocaleString, PROPF_METHOD},
+ {testW, RegExp_test, PROPF_METHOD|1},
{toStringW, RegExp_toString, PROPF_METHOD}
};
@@ -3545,7 +3542,7 @@ static const builtin_info_t RegExp_info = {
NULL
};
-static HRESULT alloc_regexp(script_ctx_t *ctx, BOOL use_constr, RegExpInstance **ret)
+static HRESULT alloc_regexp(script_ctx_t *ctx, DispatchEx *object_prototype, RegExpInstance **ret)
{
RegExpInstance *regexp;
HRESULT hres;
@@ -3554,10 +3551,10 @@ static HRESULT alloc_regexp(script_ctx_t *ctx, BOOL use_constr, RegExpInstance *
if(!regexp)
return E_OUTOFMEMORY;
- if(use_constr)
- hres = init_dispex_from_constr(®exp->dispex, ctx, &RegExp_info, ctx->regexp_constr);
+ if(object_prototype)
+ hres = init_dispex(®exp->dispex, ctx, &RegExp_info, object_prototype);
else
- hres = init_dispex(®exp->dispex, ctx, &RegExp_info, NULL);
+ hres = init_dispex_from_constr(®exp->dispex, ctx, &RegExp_info, ctx->regexp_constr);
if(FAILED(hres)) {
heap_free(regexp);
@@ -3575,7 +3572,7 @@ static HRESULT create_regexp(script_ctx_t *ctx, const WCHAR *exp, int len, DWORD
TRACE("%s %x\n", debugstr_w(exp), flags);
- hres = alloc_regexp(ctx, TRUE, ®exp);
+ hres = alloc_regexp(ctx, NULL, ®exp);
if(FAILED(hres))
return hres;
@@ -3676,12 +3673,12 @@ static HRESULT RegExpConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS
return S_OK;
}
-HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx **ret)
+HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
{
RegExpInstance *regexp;
HRESULT hres;
- hres = alloc_regexp(ctx, FALSE, ®exp);
+ hres = alloc_regexp(ctx, object_prototype, ®exp);
if(FAILED(hres))
return hres;
diff --git a/reactos/dll/win32/jscript/resource.h b/reactos/dll/win32/jscript/resource.h
new file mode 100644
index 00000000000..f7e94b90241
--- /dev/null
+++ b/reactos/dll/win32/jscript/resource.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2009 Piotr Caban
+ *
+ * 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
+
+#define IDS_TO_PRIMITIVE 0x0001
+#define IDS_INVALID_CALL_ARG 0x0005
+#define IDS_NO_PROPERTY 0x01B6
+#define IDS_ARG_NOT_OPT 0x01c1
+#define IDS_SYNTAX_ERROR 0x03EA
+#define IDS_SEMICOLON 0x03EC
+#define IDS_LBRACKET 0x03ED
+#define IDS_RBRACKET 0x03EE
+#define IDS_UNTERMINATED_STR 0x03F7
+#define IDS_NOT_FUNC 0x138A
+#define IDS_NOT_DATE 0x138E
+#define IDS_NOT_NUM 0x1389
+#define IDS_ILLEGAL_ASSIGN 0x1390
+#define IDS_UNDEFINED 0x1391
+#define IDS_NOT_BOOL 0x1392
+#define IDS_INVALID_LENGTH 0x13A5
diff --git a/reactos/dll/win32/jscript/rsrc.rc b/reactos/dll/win32/jscript/rsrc.rc
index cb0f31a57ec..d57f83c09dc 100644
--- a/reactos/dll/win32/jscript/rsrc.rc
+++ b/reactos/dll/win32/jscript/rsrc.rc
@@ -21,3 +21,10 @@ REGINST REGINST jscript.inf
/* @makedep: jsglobal.tlb */
1 TYPELIB LOADONCALL DISCARDABLE jsglobal.tlb
+
+#include "jscript_De.rc"
+#include "jscript_En.rc"
+#include "jscript_Fr.rc"
+#include "jscript_Lt.rc"
+#include "jscript_Nl.rc"
+#include "jscript_Pt.rc"
diff --git a/reactos/dll/win32/jscript/string.c b/reactos/dll/win32/jscript/string.c
index 9f2ab9b2f3a..ea499aabd66 100644
--- a/reactos/dll/win32/jscript/string.c
+++ b/reactos/dll/win32/jscript/string.c
@@ -62,10 +62,7 @@ static const WCHAR toUpperCaseW[] = {'t','o','U','p','p','e','r','C','a','s','e'
static const WCHAR toLocaleLowerCaseW[] = {'t','o','L','o','c','a','l','e','L','o','w','e','r','C','a','s','e',0};
static const WCHAR toLocaleUpperCaseW[] = {'t','o','L','o','c','a','l','e','U','p','p','e','r','C','a','s','e',0};
static const WCHAR localeCompareW[] = {'l','o','c','a','l','e','C','o','m','p','a','r','e',0};
-static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0};
-static const WCHAR propertyIsEnumerableW[] =
- {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0};
-static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0};
+static const WCHAR fromCharCodeW[] = {'f','r','o','m','C','h','a','r','C','o','d','e',0};
static HRESULT String_length(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
@@ -127,34 +124,123 @@ static HRESULT do_attributeless_tag_format(DispatchEx *dispex, LCID lcid, WORD f
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp, const WCHAR *tagname)
{
static const WCHAR tagfmt[] = {'<','%','s','>','%','s','<','/','%','s','>',0};
- StringInstance *string;
- BSTR ret;
+ const WCHAR *str;
+ DWORD length;
+ BSTR val_str = NULL;
+ HRESULT hres;
if(!is_class(dispex, JSCLASS_STRING)) {
- WARN("this is not a string object\n");
- return E_NOTIMPL;
+ VARIANT this;
+
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
}
- string = (StringInstance*)dispex;
-
if(retv) {
- ret = SysAllocStringLen(NULL, string->length + 2*strlenW(tagname) + 5);
- if(!ret)
+ BSTR ret = SysAllocStringLen(NULL, length + 2*strlenW(tagname) + 5);
+ if(!ret) {
+ SysFreeString(val_str);
return E_OUTOFMEMORY;
+ }
- sprintfW(ret, tagfmt, tagname, string->str, tagname);
+ sprintfW(ret, tagfmt, tagname, str, tagname);
V_VT(retv) = VT_BSTR;
V_BSTR(retv) = ret;
}
+
+ SysFreeString(val_str);
+ return S_OK;
+}
+
+static HRESULT do_attribute_tag_format(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp,
+ const WCHAR *tagname, const WCHAR *attr)
+{
+ static const WCHAR tagfmtW[]
+ = {'<','%','s',' ','%','s','=','\"','%','s','\"','>','%','s','<','/','%','s','>',0};
+ static const WCHAR undefinedW[] = {'u','n','d','e','f','i','n','e','d',0};
+
+ const WCHAR *str;
+ DWORD length;
+ BSTR attr_value, val_str = NULL;
+ HRESULT hres;
+
+ if(!is_class(dispex, JSCLASS_STRING)) {
+ VARIANT this;
+
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
+ }
+
+ if(arg_cnt(dp)) {
+ hres = to_string(dispex->ctx, get_arg(dp, 0), ei, &attr_value);
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
+ return hres;
+ }
+ }
+ else {
+ attr_value = SysAllocString(undefinedW);
+ if(!attr_value) {
+ SysFreeString(val_str);
+ return E_OUTOFMEMORY;
+ }
+ }
+
+ if(retv) {
+ BSTR ret = SysAllocStringLen(NULL, length + 2*strlenW(tagname)
+ + strlenW(attr) + SysStringLen(attr_value) + 9);
+ if(!ret) {
+ SysFreeString(attr_value);
+ SysFreeString(val_str);
+ return E_OUTOFMEMORY;
+ }
+
+ sprintfW(ret, tagfmtW, tagname, attr, attr_value, str, tagname);
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = ret;
+ }
+
+ SysFreeString(attr_value);
+ SysFreeString(val_str);
return S_OK;
}
static HRESULT String_anchor(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR fontW[] = {'A',0};
+ static const WCHAR colorW[] = {'N','A','M','E',0};
+
+ return do_attribute_tag_format(dispex, lcid, flags, dp, retv, ei, sp, fontW, colorW);
}
static HRESULT String_big(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
@@ -182,26 +268,42 @@ static HRESULT String_bold(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS
static HRESULT String_charAt(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- StringInstance *strobj;
- BSTR str;
+ const WCHAR *str;
+ DWORD length;
+ BSTR ret, val_str = NULL;
INT pos = 0;
HRESULT hres;
TRACE("\n");
- if(dispex->builtin_info->class != JSCLASS_STRING) {
- FIXME("not string this not supported\n");
- return E_NOTIMPL;
- }
+ if(!is_class(dispex, JSCLASS_STRING)) {
+ VARIANT this;
- strobj = (StringInstance*)dispex;
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
+ }
if(arg_cnt(dp)) {
VARIANT num;
hres = to_integer(dispex->ctx, get_arg(dp, 0), ei, &num);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
if(V_VT(&num) == VT_I4) {
pos = V_I4(&num);
@@ -211,18 +313,22 @@ static HRESULT String_charAt(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA
}
}
- if(!retv)
+ if(!retv) {
+ SysFreeString(val_str);
return S_OK;
+ }
- if(0 <= pos && pos < strobj->length)
- str = SysAllocStringLen(strobj->str+pos, 1);
+ if(0 <= pos && pos < length)
+ ret = SysAllocStringLen(str+pos, 1);
else
- str = SysAllocStringLen(NULL, 0);
- if(!str)
+ ret = SysAllocStringLen(NULL, 0);
+ SysFreeString(val_str);
+ if(!ret) {
return E_OUTOFMEMORY;
+ }
V_VT(retv) = VT_BSTR;
- V_BSTR(retv) = str;
+ V_BSTR(retv) = ret;
return S_OK;
}
@@ -231,30 +337,44 @@ static HRESULT String_charCodeAt(DispatchEx *dispex, LCID lcid, WORD flags, DISP
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
const WCHAR *str;
+ BSTR val_str = NULL;
DWORD length, idx = 0;
HRESULT hres;
TRACE("\n");
- if(dispex->builtin_info->class == JSCLASS_STRING) {
- StringInstance *string = (StringInstance*)dispex;
+ if(!is_class(dispex, JSCLASS_STRING)) {
+ VARIANT this;
- str = string->str;
- length = string->length;
- }else {
- FIXME("not string this not supported\n");
- return E_NOTIMPL;
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
}
if(arg_cnt(dp) > 0) {
VARIANT v;
hres = to_integer(dispex->ctx, get_arg(dp, 0), ei, &v);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
if(V_VT(&v) != VT_I4 || V_I4(&v) < 0 || V_I4(&v) >= length) {
if(retv) num_set_nan(&v);
+ SysFreeString(val_str);
return S_OK;
}
@@ -265,6 +385,8 @@ static HRESULT String_charCodeAt(DispatchEx *dispex, LCID lcid, WORD flags, DISP
V_VT(retv) = VT_I4;
V_I4(retv) = str[idx];
}
+
+ SysFreeString(val_str);
return S_OK;
}
@@ -336,15 +458,19 @@ static HRESULT String_fixed(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
static HRESULT String_fontcolor(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR fontW[] = {'F','O','N','T',0};
+ static const WCHAR colorW[] = {'C','O','L','O','R',0};
+
+ return do_attribute_tag_format(dispex, lcid, flags, dp, retv, ei, sp, fontW, colorW);
}
static HRESULT String_fontsize(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR fontW[] = {'F','O','N','T',0};
+ static const WCHAR colorW[] = {'S','I','Z','E',0};
+
+ return do_attribute_tag_format(dispex, lcid, flags, dp, retv, ei, sp, fontW, colorW);
}
static HRESULT String_indexOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
@@ -352,20 +478,30 @@ static HRESULT String_indexOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
{
DWORD length, pos = 0;
const WCHAR *str;
- BSTR search_str;
+ BSTR search_str, val_str = NULL;
INT ret = -1;
HRESULT hres;
TRACE("\n");
- if(is_class(dispex, JSCLASS_STRING)) {
- StringInstance *string = (StringInstance*)dispex;
+ if(!is_class(dispex, JSCLASS_STRING)) {
+ VARIANT this;
- str = string->str;
- length = string->length;
- }else {
- FIXME("not String this\n");
- return E_NOTIMPL;
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
}
if(!arg_cnt(dp)) {
@@ -373,12 +509,15 @@ static HRESULT String_indexOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
V_VT(retv) = VT_I4;
V_I4(retv) = -1;
}
+ SysFreeString(val_str);
return S_OK;
}
hres = to_string(dispex->ctx, get_arg(dp,0), ei, &search_str);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
if(arg_cnt(dp) >= 2) {
VARIANT ival;
@@ -405,6 +544,7 @@ static HRESULT String_indexOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
}
SysFreeString(search_str);
+ SysFreeString(val_str);
if(FAILED(hres))
return hres;
@@ -432,27 +572,33 @@ static HRESULT String_lastIndexOf(DispatchEx *dispex, LCID lcid, WORD flags, DIS
static HRESULT String_link(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static const WCHAR fontW[] = {'A',0};
+ static const WCHAR colorW[] = {'H','R','E','F',0};
+
+ return do_attribute_tag_format(dispex, lcid, flags, dp, retv, ei, sp, fontW, colorW);
}
/* ECMA-262 3rd Edition 15.5.4.10 */
static HRESULT String_match(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- StringInstance *This = (StringInstance*)dispex;
+ const WCHAR *str;
match_result_t *match_result;
DispatchEx *regexp;
DispatchEx *array;
VARIANT var, *arg_var;
- DWORD match_cnt, i;
+ DWORD length, match_cnt, i;
+ BSTR val_str = NULL;
HRESULT hres = S_OK;
TRACE("\n");
- if(arg_cnt(dp) != 1) {
- FIXME("unsupported args\n");
- return E_NOTIMPL;
+ if(!arg_cnt(dp)) {
+ if(retv) {
+ V_VT(retv) = VT_NULL;
+ }
+
+ return S_OK;
}
arg_var = get_arg(dp, 0);
@@ -478,22 +624,50 @@ static HRESULT String_match(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
}
}
- hres = regexp_match(regexp, This->str, This->length, FALSE, &match_result, &match_cnt);
+ if(!is_class(dispex, JSCLASS_STRING)) {
+ VARIANT this;
+
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres)) {
+ jsdisp_release(regexp);
+ return hres;
+ }
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
+ }
+
+ hres = regexp_match(regexp, str, length, FALSE, &match_result, &match_cnt);
jsdisp_release(regexp);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
if(!match_cnt) {
TRACE("no match\n");
if(retv)
V_VT(retv) = VT_NULL;
+
+ SysFreeString(val_str);
return S_OK;
}
hres = create_array(dispex->ctx, match_cnt, &array);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
V_VT(&var) = VT_BSTR;
@@ -510,6 +684,8 @@ static HRESULT String_match(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
break;
}
+ SysFreeString(val_str);
+
if(SUCCEEDED(hres) && retv) {
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array);
@@ -618,11 +794,11 @@ static HRESULT rep_call(DispatchEx *func, const WCHAR *str, match_result_t *matc
static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
- DWORD parens_cnt = 0, parens_size=0, rep_len=0, length;
- BSTR rep_str = NULL, match_str = NULL, ret_str;
- DispatchEx *rep_func = NULL, *regexp = NULL;
- match_result_t *parens = NULL, match;
const WCHAR *str;
+ DWORD parens_cnt = 0, parens_size=0, rep_len=0, length;
+ BSTR rep_str = NULL, match_str = NULL, ret_str, val_str = NULL;
+ DispatchEx *rep_func = NULL, *regexp = NULL;
+ match_result_t *parens = NULL, match, **parens_ptr = &parens;
strbuf_t ret = {NULL,0,0};
BOOL gcheck = FALSE;
VARIANT *arg_var;
@@ -630,23 +806,36 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
TRACE("\n");
- if(is_class(dispex, JSCLASS_STRING)) {
- StringInstance *string = (StringInstance*)dispex;
- str = string->str;
- length = string->length;
- }else {
- FIXME("not String this\n");
- return E_NOTIMPL;
+ if(!is_class(dispex, JSCLASS_STRING)) {
+ VARIANT this;
+
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
}
if(!arg_cnt(dp)) {
if(retv) {
- ret_str = SysAllocString(str);
- if(!ret_str)
- return E_OUTOFMEMORY;
+ if(!val_str) {
+ val_str = SysAllocStringLen(str, length);
+ if(!val_str)
+ return E_OUTOFMEMORY;
+ }
V_VT(retv) = VT_BSTR;
- V_BSTR(retv) = ret_str;
+ V_BSTR(retv) = val_str;
}
return S_OK;
}
@@ -666,8 +855,10 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
default:
hres = to_string(dispex->ctx, arg_var, ei, &match_str);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
}
if(arg_cnt(dp) >= 2) {
@@ -689,12 +880,9 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
if(FAILED(hres))
break;
- if(strchrW(rep_str, '$')) {
- FIXME("unsupported $ in replace string\n");
- hres = E_NOTIMPL;
- }
-
rep_len = SysStringLen(rep_str);
+ if(!strchrW(rep_str, '$'))
+ parens_ptr = NULL;
}
}
@@ -705,7 +893,7 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
while(1) {
if(regexp) {
- hres = regexp_match_next(regexp, gcheck, str, length, &cp, rep_func ? &parens : NULL,
+ hres = regexp_match_next(regexp, gcheck, str, length, &cp, parens_ptr,
&parens_size, &parens_cnt, &match);
gcheck = TRUE;
@@ -739,6 +927,64 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
SysFreeString(cstr);
if(FAILED(hres))
break;
+ }else if(rep_str && regexp) {
+ const WCHAR *ptr = rep_str, *ptr2;
+
+ while((ptr2 = strchrW(ptr, '$'))) {
+ hres = strbuf_append(&ret, ptr, ptr2-ptr);
+ if(FAILED(hres))
+ break;
+
+ switch(ptr2[1]) {
+ case '$':
+ hres = strbuf_append(&ret, ptr2, 1);
+ ptr = ptr2+2;
+ break;
+ case '&':
+ hres = strbuf_append(&ret, match.str, match.len);
+ ptr = ptr2+2;
+ break;
+ case '`':
+ hres = strbuf_append(&ret, str, match.str-str);
+ ptr = ptr2+2;
+ break;
+ case '\'':
+ hres = strbuf_append(&ret, ecp, (str+length)-ecp);
+ ptr = ptr2+2;
+ break;
+ default: {
+ DWORD idx;
+
+ if(!isdigitW(ptr2[1])) {
+ hres = strbuf_append(&ret, ptr2, 1);
+ ptr = ptr2+1;
+ break;
+ }
+
+ idx = ptr2[1] - '0';
+ if(isdigitW(ptr[3]) && idx*10 + (ptr[2]-'0') <= parens_cnt) {
+ idx = idx*10 + (ptr[2]-'0');
+ ptr = ptr2+3;
+ }else if(idx && idx <= parens_cnt) {
+ ptr = ptr2+2;
+ }else {
+ hres = strbuf_append(&ret, ptr2, 1);
+ ptr = ptr2+1;
+ break;
+ }
+
+ hres = strbuf_append(&ret, parens[idx-1].str, parens[idx-1].len);
+ }
+ }
+
+ if(FAILED(hres))
+ break;
+ }
+
+ if(SUCCEEDED(hres))
+ hres = strbuf_append(&ret, ptr, (rep_str+rep_len)-ptr);
+ if(FAILED(hres))
+ break;
}else if(rep_str) {
hres = strbuf_append(&ret, rep_str, rep_len);
if(FAILED(hres))
@@ -760,6 +1006,7 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
jsdisp_release(rep_func);
if(regexp)
jsdisp_release(regexp);
+ SysFreeString(val_str);
SysFreeString(rep_str);
SysFreeString(match_str);
heap_free(parens);
@@ -790,6 +1037,7 @@ static HRESULT String_slice(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
const WCHAR *str;
+ BSTR val_str = NULL;
DWORD length;
INT start=0, end;
VARIANT v;
@@ -797,20 +1045,32 @@ static HRESULT String_slice(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
TRACE("\n");
- if(is_class(dispex, JSCLASS_STRING)) {
- StringInstance *string = (StringInstance*)dispex;
+ if(!is_class(dispex, JSCLASS_STRING)) {
+ VARIANT this;
- str = string->str;
- length = string->length;
- }else {
- FIXME("this is not a string class\n");
- return E_NOTIMPL;
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
}
if(arg_cnt(dp)) {
hres = to_integer(dispex->ctx, dp->rgvarg + dp->cArgs-1, ei, &v);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
if(V_VT(&v) == VT_I4) {
start = V_I4(&v);
@@ -830,8 +1090,10 @@ static HRESULT String_slice(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
if(arg_cnt(dp) >= 2) {
hres = to_integer(dispex->ctx, dp->rgvarg + dp->cArgs-2, ei, &v);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
if(V_VT(&v) == VT_I4) {
end = V_I4(&v);
@@ -854,12 +1116,16 @@ static HRESULT String_slice(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
if(retv) {
BSTR retstr = SysAllocStringLen(str+start, end-start);
- if(!str)
+ if(!retstr) {
+ SysFreeString(val_str);
return E_OUTOFMEMORY;
+ }
V_VT(retv) = VT_BSTR;
V_BSTR(retv) = retstr;
}
+
+ SysFreeString(val_str);
return S_OK;
}
@@ -874,28 +1140,40 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
match_result_t *match_result = NULL;
- DWORD match_cnt, i, match_len = 0;
- StringInstance *string;
- const WCHAR *ptr, *ptr2;
+ DWORD length, match_cnt, i, match_len = 0;
+ const WCHAR *str, *ptr, *ptr2;
VARIANT *arg, var;
DispatchEx *array;
- BSTR match_str = NULL;
+ BSTR val_str = NULL, match_str = NULL;
HRESULT hres;
TRACE("\n");
- if(!is_class(dispex, JSCLASS_STRING)) {
- FIXME("not String this\n");
- return E_NOTIMPL;
- }
-
- string = (StringInstance*)dispex;
-
if(arg_cnt(dp) != 1) {
FIXME("unsupported args\n");
return E_NOTIMPL;
}
+ if(!is_class(dispex, JSCLASS_STRING)) {
+ VARIANT this;
+
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
+ }
+
arg = get_arg(dp, 0);
switch(V_VT(arg)) {
case VT_DISPATCH: {
@@ -904,10 +1182,12 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
regexp = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg));
if(regexp) {
if(is_class(regexp, JSCLASS_REGEXP)) {
- hres = regexp_match(regexp, string->str, string->length, TRUE, &match_result, &match_cnt);
+ hres = regexp_match(regexp, str, length, TRUE, &match_result, &match_cnt);
jsdisp_release(regexp);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
break;
}
jsdisp_release(regexp);
@@ -915,8 +1195,10 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
}
default:
hres = to_string(dispex->ctx, arg, ei, &match_str);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
match_len = SysStringLen(match_str);
if(!match_len) {
@@ -928,7 +1210,7 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
hres = create_array(dispex->ctx, 0, &array);
if(SUCCEEDED(hres)) {
- ptr = string->str;
+ ptr = str;
for(i=0;; i++) {
if(match_result) {
if(i == match_cnt)
@@ -966,7 +1248,7 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
}
if(SUCCEEDED(hres) && (match_str || match_result)) {
- DWORD len = (string->str+string->length) - ptr;
+ DWORD len = (str+length) - ptr;
if(len || match_str) {
V_VT(&var) = VT_BSTR;
@@ -982,6 +1264,7 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
}
SysFreeString(match_str);
+ SysFreeString(val_str);
heap_free(match_result);
if(SUCCEEDED(hres) && retv) {
@@ -1013,6 +1296,7 @@ static HRESULT String_substring(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
const WCHAR *str;
+ BSTR val_str = NULL;
INT start=0, end;
DWORD length;
VARIANT v;
@@ -1020,20 +1304,32 @@ static HRESULT String_substring(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
TRACE("\n");
- if(is_class(dispex, JSCLASS_STRING)) {
- StringInstance *string = (StringInstance*)dispex;
+ if(!is_class(dispex, JSCLASS_STRING)) {
+ VARIANT this;
- length = string->length;
- str = string->str;
- }else {
- FIXME("not string this not supported\n");
- return E_NOTIMPL;
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
}
if(arg_cnt(dp) >= 1) {
hres = to_integer(dispex->ctx, dp->rgvarg + dp->cArgs-1, ei, &v);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
if(V_VT(&v) == VT_I4) {
start = V_I4(&v);
@@ -1048,8 +1344,10 @@ static HRESULT String_substring(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
if(arg_cnt(dp) >= 2) {
hres = to_integer(dispex->ctx, dp->rgvarg + dp->cArgs-2, ei, &v);
- if(FAILED(hres))
+ if(FAILED(hres)) {
+ SysFreeString(val_str);
return hres;
+ }
if(V_VT(&v) == VT_I4) {
end = V_I4(&v);
@@ -1073,9 +1371,12 @@ static HRESULT String_substring(DispatchEx *dispex, LCID lcid, WORD flags, DISPP
if(retv) {
V_VT(retv) = VT_BSTR;
V_BSTR(retv) = SysAllocStringLen(str+start, end-start);
- if(!V_BSTR(retv))
+ if(!V_BSTR(retv)) {
+ SysFreeString(val_str);
return E_OUTOFMEMORY;
+ }
}
+ SysFreeString(val_str);
return S_OK;
}
@@ -1096,66 +1397,92 @@ static HRESULT String_sup(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS
static HRESULT String_toLowerCase(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- StringInstance *string;
const WCHAR* str;
DWORD length;
- BSTR bstr;
+ BSTR val_str = NULL;
+ HRESULT hres;
TRACE("\n");
- if(is_class(dispex, JSCLASS_STRING)) {
- string = (StringInstance*)dispex;
+ if(!is_class(dispex, JSCLASS_STRING)) {
+ VARIANT this;
- length = string->length;
- str = string->str;
- }else {
- FIXME("not string this not supported\n");
- return E_NOTIMPL;
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
}
if(retv) {
- bstr = SysAllocStringLen(str, length);
- if (!bstr)
- return E_OUTOFMEMORY;
+ if(!val_str) {
+ val_str = SysAllocStringLen(str, length);
+ if(!val_str)
+ return E_OUTOFMEMORY;
+ }
- strlwrW(bstr);
+ strlwrW(val_str);
V_VT(retv) = VT_BSTR;
- V_BSTR(retv) = bstr;
+ V_BSTR(retv) = val_str;
}
+ else SysFreeString(val_str);
return S_OK;
}
static HRESULT String_toUpperCase(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
- StringInstance *string;
const WCHAR* str;
DWORD length;
- BSTR bstr;
+ BSTR val_str = NULL;
+ HRESULT hres;
TRACE("\n");
- if(is_class(dispex, JSCLASS_STRING)) {
- string = (StringInstance*)dispex;
+ if(!is_class(dispex, JSCLASS_STRING)) {
+ VARIANT this;
- length = string->length;
- str = string->str;
- }else {
- FIXME("not string this not supported\n");
- return E_NOTIMPL;
+ V_VT(&this) = VT_DISPATCH;
+ V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex);
+
+ hres = to_string(dispex->ctx, &this, ei, &val_str);
+ if(FAILED(hres))
+ return hres;
+
+ str = val_str;
+ length = SysStringLen(val_str);
+ }
+ else {
+ StringInstance *this = (StringInstance*)dispex;
+
+ str = this->str;
+ length = this->length;
}
if(retv) {
- bstr = SysAllocStringLen(str, length);
- if (!bstr)
- return E_OUTOFMEMORY;
+ if(!val_str) {
+ val_str = SysAllocStringLen(str, length);
+ if(!val_str)
+ return E_OUTOFMEMORY;
+ }
- struprW(bstr);
+ struprW(val_str);
V_VT(retv) = VT_BSTR;
- V_BSTR(retv) = bstr;
+ V_BSTR(retv) = val_str;
}
+ else SysFreeString(val_str);
return S_OK;
}
@@ -1180,27 +1507,6 @@ static HRESULT String_localeCompare(DispatchEx *dispex, LCID lcid, WORD flags, D
return E_NOTIMPL;
}
-static HRESULT String_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT String_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
-static HRESULT String_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
- VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
-{
- FIXME("\n");
- return E_NOTIMPL;
-}
-
static HRESULT String_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
@@ -1209,6 +1515,8 @@ static HRESULT String_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
TRACE("\n");
switch(flags) {
+ case INVOKE_FUNC:
+ return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL);
case DISPATCH_PROPERTYGET: {
BSTR str = SysAllocString(This->str);
if(!str)
@@ -1235,35 +1543,32 @@ static void String_destructor(DispatchEx *dispex)
}
static const builtin_prop_t String_props[] = {
- {anchorW, String_anchor, PROPF_METHOD},
+ {anchorW, String_anchor, PROPF_METHOD|1},
{bigW, String_big, PROPF_METHOD},
{blinkW, String_blink, PROPF_METHOD},
{boldW, String_bold, PROPF_METHOD},
- {charAtW, String_charAt, PROPF_METHOD},
- {charCodeAtW, String_charCodeAt, PROPF_METHOD},
- {concatW, String_concat, PROPF_METHOD},
+ {charAtW, String_charAt, PROPF_METHOD|1},
+ {charCodeAtW, String_charCodeAt, PROPF_METHOD|1},
+ {concatW, String_concat, PROPF_METHOD|1},
{fixedW, String_fixed, PROPF_METHOD},
- {fontcolorW, String_fontcolor, PROPF_METHOD},
- {fontsizeW, String_fontsize, PROPF_METHOD},
- {hasOwnPropertyW, String_hasOwnProperty, PROPF_METHOD},
- {indexOfW, String_indexOf, PROPF_METHOD},
- {isPrototypeOfW, String_isPrototypeOf, PROPF_METHOD},
+ {fontcolorW, String_fontcolor, PROPF_METHOD|1},
+ {fontsizeW, String_fontsize, PROPF_METHOD|1},
+ {indexOfW, String_indexOf, PROPF_METHOD|2},
{italicsW, String_italics, PROPF_METHOD},
- {lastIndexOfW, String_lastIndexOf, PROPF_METHOD},
+ {lastIndexOfW, String_lastIndexOf, PROPF_METHOD|2},
{lengthW, String_length, 0},
- {linkW, String_link, PROPF_METHOD},
- {localeCompareW, String_localeCompare, PROPF_METHOD},
- {matchW, String_match, PROPF_METHOD},
- {propertyIsEnumerableW, String_propertyIsEnumerable, PROPF_METHOD},
- {replaceW, String_replace, PROPF_METHOD},
+ {linkW, String_link, PROPF_METHOD|1},
+ {localeCompareW, String_localeCompare, PROPF_METHOD|1},
+ {matchW, String_match, PROPF_METHOD|1},
+ {replaceW, String_replace, PROPF_METHOD|1},
{searchW, String_search, PROPF_METHOD},
{sliceW, String_slice, PROPF_METHOD},
{smallW, String_small, PROPF_METHOD},
- {splitW, String_split, PROPF_METHOD},
+ {splitW, String_split, PROPF_METHOD|2},
{strikeW, String_strike, PROPF_METHOD},
{subW, String_sub, PROPF_METHOD},
- {substrW, String_substr, PROPF_METHOD},
- {substringW, String_substring, PROPF_METHOD},
+ {substrW, String_substr, PROPF_METHOD|2},
+ {substringW, String_substring, PROPF_METHOD|2},
{supW, String_sup, PROPF_METHOD},
{toLocaleLowerCaseW, String_toLocaleLowerCase, PROPF_METHOD},
{toLocaleUpperCaseW, String_toLocaleUpperCase, PROPF_METHOD},
@@ -1282,6 +1587,37 @@ static const builtin_info_t String_info = {
NULL
};
+/* ECMA-262 3rd Edition 15.5.3.2 */
+static HRESULT StringConstr_fromCharCode(DispatchEx *dispex, LCID lcid, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ DWORD i, code;
+ BSTR ret;
+ HRESULT hres;
+
+ ret = SysAllocStringLen(NULL, arg_cnt(dp));
+ if(!ret)
+ return E_OUTOFMEMORY;
+
+ for(i=0; ictx, get_arg(dp, i), ei, &code);
+ if(FAILED(hres)) {
+ SysFreeString(ret);
+ return hres;
+ }
+
+ ret[i] = code;
+ }
+
+ if(retv) {
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = ret;
+ }
+ else SysFreeString(ret);
+
+ return S_OK;
+}
+
static HRESULT StringConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
@@ -1339,7 +1675,7 @@ static HRESULT StringConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS
return S_OK;
}
-static HRESULT string_alloc(script_ctx_t *ctx, BOOL use_constr, StringInstance **ret)
+static HRESULT string_alloc(script_ctx_t *ctx, DispatchEx *object_prototype, StringInstance **ret)
{
StringInstance *string;
HRESULT hres;
@@ -1348,10 +1684,10 @@ static HRESULT string_alloc(script_ctx_t *ctx, BOOL use_constr, StringInstance *
if(!string)
return E_OUTOFMEMORY;
- if(use_constr)
- hres = init_dispex_from_constr(&string->dispex, ctx, &String_info, ctx->string_constr);
+ if(object_prototype)
+ hres = init_dispex(&string->dispex, ctx, &String_info, object_prototype);
else
- hres = init_dispex(&string->dispex, ctx, &String_info, NULL);
+ hres = init_dispex_from_constr(&string->dispex, ctx, &String_info, ctx->string_constr);
if(FAILED(hres)) {
heap_free(string);
return hres;
@@ -1361,16 +1697,29 @@ static HRESULT string_alloc(script_ctx_t *ctx, BOOL use_constr, StringInstance *
return S_OK;
}
-HRESULT create_string_constr(script_ctx_t *ctx, DispatchEx **ret)
+static const builtin_prop_t StringConstr_props[] = {
+ {fromCharCodeW, StringConstr_fromCharCode, PROPF_METHOD},
+};
+
+static const builtin_info_t StringConstr_info = {
+ JSCLASS_FUNCTION,
+ {NULL, Function_value, 0},
+ sizeof(StringConstr_props)/sizeof(*StringConstr_props),
+ StringConstr_props,
+ NULL,
+ NULL
+};
+
+HRESULT create_string_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
{
StringInstance *string;
HRESULT hres;
- hres = string_alloc(ctx, FALSE, &string);
+ hres = string_alloc(ctx, object_prototype, &string);
if(FAILED(hres))
return hres;
- hres = create_builtin_function(ctx, StringConstr_value, NULL, PROPF_CONSTR, &string->dispex, ret);
+ hres = create_builtin_function(ctx, StringConstr_value, &StringConstr_info, PROPF_CONSTR, &string->dispex, ret);
jsdisp_release(&string->dispex);
return hres;
@@ -1381,7 +1730,7 @@ HRESULT create_string(script_ctx_t *ctx, const WCHAR *str, DWORD len, DispatchEx
StringInstance *string;
HRESULT hres;
- hres = string_alloc(ctx, TRUE, &string);
+ hres = string_alloc(ctx, NULL, &string);
if(FAILED(hres))
return hres;
diff --git a/reactos/dll/win32/kernel32/file/file.c b/reactos/dll/win32/kernel32/file/file.c
index 24b730001d5..1b4511dd23d 100644
--- a/reactos/dll/win32/kernel32/file/file.c
+++ b/reactos/dll/win32/kernel32/file/file.c
@@ -996,9 +996,9 @@ GetFileAttributesA(LPCSTR lpFileName)
{
WIN32_FILE_ATTRIBUTE_DATA FileAttributeData;
PWSTR FileNameW;
- BOOL ret;
+ BOOL ret;
- if (!(FileNameW = FilenameA2W(lpFileName, FALSE)))
+ if (!lpFileName || !(FileNameW = FilenameA2W(lpFileName, FALSE)))
return INVALID_FILE_ATTRIBUTES;
ret = GetFileAttributesExW(FileNameW, GetFileExInfoStandard, &FileAttributeData);
diff --git a/reactos/dll/win32/kernel32/file/move.c b/reactos/dll/win32/kernel32/file/move.c
index ef1b372952b..dde35bf8d24 100644
--- a/reactos/dll/win32/kernel32/file/move.c
+++ b/reactos/dll/win32/kernel32/file/move.c
@@ -405,7 +405,7 @@ MoveFileWithProgressW (
}
lpExistingFileName2 = (LPWSTR) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,max_size * sizeof(WCHAR));
- if (lpNewFileName2 == NULL)
+ if (lpExistingFileName2 == NULL)
{
HeapFree(GetProcessHeap(),0,(VOID *) lpNewFileName2);
HeapFree(GetProcessHeap(),0,(VOID *) lpDeleteFile);
diff --git a/reactos/dll/win32/kernel32/file/rw.c b/reactos/dll/win32/kernel32/file/rw.c
index da1d68d1f3a..33adade420c 100644
--- a/reactos/dll/win32/kernel32/file/rw.c
+++ b/reactos/dll/win32/kernel32/file/rw.c
@@ -148,11 +148,22 @@ ReadFile(IN HANDLE hFile,
if (IsConsoleHandle(hFile))
{
- return ReadConsoleA(hFile,
+ if (ReadConsoleA(hFile,
lpBuffer,
nNumberOfBytesToRead,
lpNumberOfBytesRead,
- NULL);
+ NULL))
+ {
+ DWORD dwMode;
+ GetConsoleMode(hFile, &dwMode);
+ if ((dwMode & ENABLE_PROCESSED_INPUT) && *(char *)lpBuffer == 0x1a)
+ {
+ /* EOF character entered; simulate end-of-file */
+ *lpNumberOfBytesRead = 0;
+ }
+ return TRUE;
+ }
+ return FALSE;
}
if (lpOverlapped != NULL)
diff --git a/reactos/dll/win32/kernel32/kernel32.pspec b/reactos/dll/win32/kernel32/kernel32.pspec
index 631a70a4a0c..353da456ec2 100644
--- a/reactos/dll/win32/kernel32/kernel32.pspec
+++ b/reactos/dll/win32/kernel32/kernel32.pspec
@@ -400,6 +400,7 @@
@ stdcall GetLogicalDriveStringsA(long ptr)
@ stdcall GetLogicalDriveStringsW(long ptr)
@ stdcall GetLogicalDrives()
+@ stdcall GetLogicalProcessorInformation(ptr ptr)
@ stdcall GetLongPathNameA (str long long)
@ stdcall GetLongPathNameW (wstr long long)
@ stdcall GetMailslotInfo(long ptr ptr ptr ptr)
@@ -710,6 +711,7 @@
@ stdcall QueueUserAPC(ptr long long)
@ stdcall QueueUserWorkItem(ptr ptr long)
@ stdcall RaiseException(long long long ptr)
+@ stub ReOpenFile ;@ stdcall ReOpenFile(ptr long long long)
@ stdcall ReadConsoleA(long ptr long ptr ptr)
@ stdcall ReadConsoleInputA(long ptr long ptr)
@ stdcall ReadConsoleInputExA(long ptr long ptr long)
diff --git a/reactos/dll/win32/kernel32/kernel32.rbuild b/reactos/dll/win32/kernel32/kernel32.rbuild
index 0b2bbb6dc7d..996bfe4a65c 100644
--- a/reactos/dll/win32/kernel32/kernel32.rbuild
+++ b/reactos/dll/win32/kernel32/kernel32.rbuild
@@ -1,160 +1,144 @@
-
-
- .
- include
- include/reactos/subsys
-
- 0x0600
-
- 0x05020100
- errcodes
-
-
-
- -fno-unit-at-a-time
- -fno-exceptions
- -fno-rtti
-
-
- debugger.c
- output.c
-
-
- except.c
-
-
- backup.c
- bintype.c
- cnotify.c
- copy.c
- create.c
- curdir.c
- delete.c
- deviceio.c
- dir.c
- dosdev.c
- file.c
- find.c
- hardlink.c
- iocompl.c
- lfile.c
- lock.c
- mailslot.c
- move.c
- npipe.c
- pipe.c
- rw.c
- tape.c
- volume.c
-
-
- global.c
- heap.c
- isbad.c
- local.c
- procmem.c
- resnotify.c
- section.c
- virtual.c
-
-
- actctx.c
- atom.c
- chartype.c
- collation.c
- casemap.c
- comm.c
- commdcb.c
- computername.c
- console.c
- dllmain.c
- env.c
- error.c
- errormsg.c
- fold.c
- handle.c
- lang.c
- ldr.c
- lzexpand.c
- muldiv.c
- nls.c
- perfcnt.c
- power.c
- recovery.c
- res.c
- sortkey.c
- stubs.c
- sysinfo.c
- time.c
- timerqueue.c
- toolhelp.c
- version.c
-
-
- cmdline.c
- procsup.c
- job.c
- proc.c
- session.c
-
-
- lstring.c
-
-
- condvar.c
- critical.c
- event.c
- mutex.c
- sem.c
- timer.c
- wait.c
-
-
- fiber.c
- fls.c
- thread.c
- tls.c
-
-
- lcformat.c
- profile.c
- utils.c
-
-
-
-
- fiber.S
- thread.S
-
-
-
-
- fiber.S
- thread.S
-
-
-
-
-
- icustubs.cpp
-
- normalize
-
-
-
- .
- .
- include
- kernel32_base
- wine
- pseh
-
- kernel32.rc
-
- ntdll
-
-
+
+
+ .
+ .
+ include
+ include/reactos/subsys
+ wine
+ pseh
+ normalize
+ ntdll
+
+ 0x0600
+
+ 0x05020100
+ errcodes
+
+
+
+ -fno-unit-at-a-time
+ -fno-exceptions
+ -fno-rtti
+
+
+ debugger.c
+ output.c
+
+
+ except.c
+
+
+ backup.c
+ bintype.c
+ cnotify.c
+ copy.c
+ create.c
+ curdir.c
+ delete.c
+ deviceio.c
+ dir.c
+ dosdev.c
+ file.c
+ find.c
+ hardlink.c
+ iocompl.c
+ lfile.c
+ lock.c
+ mailslot.c
+ move.c
+ npipe.c
+ pipe.c
+ rw.c
+ tape.c
+ volume.c
+
+
+ global.c
+ heap.c
+ isbad.c
+ local.c
+ procmem.c
+ resnotify.c
+ section.c
+ virtual.c
+
+
+ actctx.c
+ atom.c
+ chartype.c
+ collation.c
+ casemap.c
+ comm.c
+ commdcb.c
+ computername.c
+ console.c
+ dllmain.c
+ env.c
+ error.c
+ errormsg.c
+ fold.c
+ handle.c
+ lang.c
+ ldr.c
+ lzexpand.c
+ muldiv.c
+ nls.c
+ perfcnt.c
+ power.c
+ recovery.c
+ res.c
+ sortkey.c
+ stubs.c
+ sysinfo.c
+ time.c
+ timerqueue.c
+ toolhelp.c
+ version.c
+
+
+ cmdline.c
+ procsup.c
+ job.c
+ proc.c
+ session.c
+
+
+ lstring.c
+
+
+ condvar.c
+ critical.c
+ event.c
+ mutex.c
+ sem.c
+ timer.c
+ wait.c
+
+
+ fiber.c
+ fls.c
+ thread.c
+ tls.c
+
+
+ lcformat.c
+ profile.c
+ utils.c
+
+
+
+
+ fiber.S
+ thread.S
+
+
+
+
+ icustubs.cpp
+
+ kernel32.rc
+
diff --git a/reactos/dll/win32/kernel32/misc/commdcb.c b/reactos/dll/win32/kernel32/misc/commdcb.c
index 8de2bf22d1a..8ddb9eda3a6 100644
--- a/reactos/dll/win32/kernel32/misc/commdcb.c
+++ b/reactos/dll/win32/kernel32/misc/commdcb.c
@@ -627,7 +627,7 @@ DCB_BuildCommDCBAndTimeoutsW(LPCWSTR lpDef, LPDCB lpDCB, LPCOMMTIMEOUTS lpCommTi
DWORD dwErr;
dwErr = ERROR_INVALID_PARAMETER;
- cchAscii = WideCharToMultiByte(20127, 0, lpDef, -1, NULL, 0, NULL, NULL);
+ cchAscii = WideCharToMultiByte(CP_ACP, 0, lpDef, -1, NULL, 0, NULL, NULL);
bRet = cchAscii > 0;
@@ -641,7 +641,7 @@ DCB_BuildCommDCBAndTimeoutsW(LPCWSTR lpDef, LPDCB lpDCB, LPCOMMTIMEOUTS lpCommTi
if(bRet)
{
bInvalidChars = FALSE;
- cchAscii = WideCharToMultiByte(20127, 0, lpDef, -1, pszAscii, cchAscii, NULL, &bInvalidChars);
+ cchAscii = WideCharToMultiByte(CP_ACP, 0, lpDef, -1, pszAscii, cchAscii, NULL, &bInvalidChars);
bRet = cchAscii > 0 && !bInvalidChars;
diff --git a/reactos/dll/win32/kernel32/misc/console.c b/reactos/dll/win32/kernel32/misc/console.c
index 1bf7874d708..6e6f57c1ddf 100644
--- a/reactos/dll/win32/kernel32/misc/console.c
+++ b/reactos/dll/win32/kernel32/misc/console.c
@@ -2,7 +2,7 @@
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
- * FILE: lib/kernel32/misc/console.c
+ * FILE: dll/win32/kernel32/misc/console.c
* PURPOSE: Win32 server console functions
* PROGRAMMER: James Tabor
*
@@ -352,6 +352,12 @@ GetConsoleAliasW(LPWSTR lpSource,
DPRINT("GetConsoleAliasW entered lpSource %S lpExeName %S\n", lpSource, lpExeName);
+ if (lpTargetBuffer == NULL)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+
CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIAS, CSR_CONSOLE);
ExeLength = wcslen(lpExeName) + 1;
@@ -361,11 +367,17 @@ GetConsoleAliasW(LPWSTR lpSource,
RequestLength = Size + sizeof(CSR_API_MESSAGE);
Request = RtlAllocateHeap(GetProcessHeap(), 0, RequestLength);
+ if (Request == NULL)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
CaptureBuffer = CsrAllocateCaptureBuffer(1, TargetBufferLength);
if (!CaptureBuffer)
{
RtlFreeHeap(GetProcessHeap(), 0, Request);
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return 0;
}
@@ -426,15 +438,39 @@ GetConsoleAliasA(LPSTR lpSource,
DPRINT("GetConsoleAliasA entered\n");
+ if (lpTargetBuffer == NULL)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+
dwSourceSize = (strlen(lpSource)+1) * sizeof(WCHAR);
lpwSource = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSourceSize);
+ if (lpwSource == NULL)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
MultiByteToWideChar(CP_ACP, 0, lpSource, -1, lpwSource, dwSourceSize);
dwExeNameSize = (strlen(lpExeName)+1) * sizeof(WCHAR);
lpwExeName = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwExeNameSize);
+ if (lpwExeName == NULL)
+ {
+ HeapFree(GetProcessHeap(), 0, lpwSource);
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
MultiByteToWideChar(CP_ACP, 0, lpExeName, -1, lpwExeName, dwExeNameSize);
lpwTargetBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, TargetBufferLength * sizeof(WCHAR));
+ if (lpwTargetBuffer == NULL)
+ {
+ HeapFree(GetProcessHeap(), 0, lpwSource);
+ HeapFree(GetProcessHeap(), 0, lpwExeName);
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
dwResult = GetConsoleAliasW(lpwSource, lpwTargetBuffer, TargetBufferLength * sizeof(WCHAR), lpwExeName);
@@ -3753,8 +3789,7 @@ WINAPI
AttachConsole(DWORD dwProcessId)
{
DPRINT1("AttachConsole(0x%x) UNIMPLEMENTED!\n", dwProcessId);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ return TRUE;
}
/*--------------------------------------------------------------
diff --git a/reactos/dll/win32/kernel32/misc/dllmain.c b/reactos/dll/win32/kernel32/misc/dllmain.c
index ab735ca48a5..542bd12b1af 100644
--- a/reactos/dll/win32/kernel32/misc/dllmain.c
+++ b/reactos/dll/win32/kernel32/misc/dllmain.c
@@ -42,8 +42,8 @@ RTL_CRITICAL_SECTION ConsoleLock;
extern BOOL WINAPI DefaultConsoleCtrlHandler(DWORD Event);
extern __declspec(noreturn) VOID CALLBACK ConsoleControlDispatcher(DWORD CodeAndFlag);
-extern BOOL FASTCALL NlsInit();
-extern VOID FASTCALL NlsUninit();
+extern BOOL FASTCALL NlsInit(VOID);
+extern VOID FASTCALL NlsUninit(VOID);
BOOLEAN InWindows = FALSE;
HANDLE
diff --git a/reactos/dll/win32/kernel32/misc/ldr.c b/reactos/dll/win32/kernel32/misc/ldr.c
index a967fc6ffa6..58c6bc096ae 100644
--- a/reactos/dll/win32/kernel32/misc/ldr.c
+++ b/reactos/dll/win32/kernel32/misc/ldr.c
@@ -340,28 +340,25 @@ GetProcAddress( HMODULE hModule, LPCSTR lpProcName )
/*
* @implemented
*/
-BOOL
-WINAPI
-FreeLibrary( HMODULE hLibModule )
+BOOL WINAPI FreeLibrary(HINSTANCE hLibModule)
{
- PVOID Module = (PVOID)((ULONG_PTR)hLibModule & ~1);
NTSTATUS Status;
+ if (!hLibModule)
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+
if ((ULONG_PTR)hLibModule & 1)
{
- if (!RtlImageNtHeader(Module))
- {
- SetLastErrorByStatus(STATUS_INVALID_IMAGE_FORMAT);
- return FALSE;
- }
-
- Status = NtUnmapViewOfSection(NtCurrentProcess(), Module);
- }
- else
- {
- Status = LdrUnloadDll(hLibModule);
+ /* this is a LOAD_LIBRARY_AS_DATAFILE module */
+ char *ptr = (char *)hLibModule - 1;
+ UnmapViewOfFile(ptr);
+ return TRUE;
}
+ Status = LdrUnloadDll(hLibModule);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
diff --git a/reactos/dll/win32/kernel32/misc/nls.c b/reactos/dll/win32/kernel32/misc/nls.c
index d100ad1bd1b..58a5b81c294 100644
--- a/reactos/dll/win32/kernel32/misc/nls.c
+++ b/reactos/dll/win32/kernel32/misc/nls.c
@@ -61,7 +61,7 @@ GetCPFileNameFromRegistry(UINT CodePage, LPWSTR FileName, ULONG FileNameSize);
BOOL
FASTCALL
-NlsInit()
+NlsInit(VOID)
{
UNICODE_STRING DirName;
OBJECT_ATTRIBUTES ObjectAttributes;
@@ -117,7 +117,7 @@ NlsInit()
VOID
FASTCALL
-NlsUninit()
+NlsUninit(VOID)
{
PCODEPAGE_ENTRY Current;
diff --git a/reactos/dll/win32/kernel32/misc/profile.c b/reactos/dll/win32/kernel32/misc/profile.c
index 54b21d7f9ef..33be0c1adef 100644
--- a/reactos/dll/win32/kernel32/misc/profile.c
+++ b/reactos/dll/win32/kernel32/misc/profile.c
@@ -16,7 +16,7 @@
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include
@@ -383,13 +383,13 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
case ENCODING_UTF16LE:
DPRINT("UTF16 Little Endian encoding\n");
- szFile = pBuffer;// + 1;
+ szFile = pBuffer;
szEnd = (WCHAR *)((char *)pBuffer + dwFileSize);
break;
case ENCODING_UTF16BE:
DPRINT("UTF16 Big Endian encoding\n");
- szFile = pBuffer;// + 1;
+ szFile = pBuffer;
szEnd = (WCHAR *)((char *)pBuffer + dwFileSize);
PROFILE_ByteSwapShortBuffer(szFile, dwFileSize / sizeof(WCHAR));
break;
@@ -1611,12 +1611,12 @@ BOOL WINAPI WriteProfileSectionW( LPCWSTR section, LPCWSTR keys_n_values)
* Win95:
* - if the buffer is 0 or 1 character long then it is as if it was of
* infinite length.
- * - otherwise, if the buffer is to small only the section names that fit
+ * - otherwise, if the buffer is too small only the section names that fit
* are returned.
- * - note that this means if the buffer was to small to return even just
+ * - note that this means if the buffer was too small to return even just
* the first section name then a single '\0' will be returned.
* - the return value is the number of characters written in the buffer,
- * except if the buffer was too smal in which case len-2 is returned
+ * except if the buffer was too small in which case len-2 is returned
*
* Win2000:
* - if the buffer is 0, 1 or 2 characters long then it is filled with
diff --git a/reactos/dll/win32/kernel32/misc/stubs.c b/reactos/dll/win32/kernel32/misc/stubs.c
index 0cb8241b225..b49c8bad368 100644
--- a/reactos/dll/win32/kernel32/misc/stubs.c
+++ b/reactos/dll/win32/kernel32/misc/stubs.c
@@ -992,15 +992,6 @@ GetProcessWorkingSetSizeEx(IN HANDLE hProcess,
return FALSE;
}
-BOOL
-WINAPI
-GetLogicalProcessorInformation(OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
- IN OUT PDWORD ReturnLength)
-{
- STUB;
- return FALSE;
-}
-
BOOL
WINAPI
GetNumaAvailableMemoryNode(IN UCHAR Node,
@@ -1056,7 +1047,7 @@ AddLocalAlternateComputerNameW(LPWSTR lpName, PNTSTATUS Status)
NTSTATUS
WINAPI
-BaseCleanupAppcompatCache()
+BaseCleanupAppcompatCache(VOID)
{
STUB;
return STATUS_NOT_IMPLEMENTED;
diff --git a/reactos/dll/win32/kernel32/misc/sysinfo.c b/reactos/dll/win32/kernel32/misc/sysinfo.c
index c33402e5f2b..612b7eddc15 100644
--- a/reactos/dll/win32/kernel32/misc/sysinfo.c
+++ b/reactos/dll/win32/kernel32/misc/sysinfo.c
@@ -232,3 +232,39 @@ GetNativeSystemInfo(
// GetNativeSystemInfo should return PROCESSOR_ARCHITECTURE_AMD64
GetSystemInfo(lpSystemInfo);
}
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+GetLogicalProcessorInformation(OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
+ IN OUT PDWORD ReturnLength)
+{
+ NTSTATUS Status;
+
+ if (!ReturnLength)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ Status = NtQuerySystemInformation(SystemLogicalProcessorInformation,
+ Buffer,
+ *ReturnLength,
+ ReturnLength);
+
+ if (!NT_SUCCESS(Status))
+ {
+ /*
+ * When NtQuerySystemInformation says STATUS_INFO_LENGTH_MISMATCH,
+ * return ERROR_INSUFFICIENT_BUFFER instead of ERROR_BAD_LENGTH.
+ */
+ SetLastErrorByStatus(Status == STATUS_INFO_LENGTH_MISMATCH
+ ? STATUS_BUFFER_TOO_SMALL
+ : Status);
+ return FALSE;
+ }
+
+ return TRUE;
+}
diff --git a/reactos/dll/win32/localui/localui.h b/reactos/dll/win32/localui/localui.h
index 25424da568c..aa244bdc824 100644
--- a/reactos/dll/win32/localui/localui.h
+++ b/reactos/dll/win32/localui/localui.h
@@ -21,8 +21,6 @@
#ifndef __WINE_LOCALUI__
#define __WINE_LOCALUI__
-#include
-#include
/* ## Resource-ID ## */
#define ADDPORT_DIALOG 100
diff --git a/reactos/dll/win32/localui/localui.rbuild b/reactos/dll/win32/localui/localui.rbuild
index 7172c2225b2..7ee4b144c90 100644
--- a/reactos/dll/win32/localui/localui.rbuild
+++ b/reactos/dll/win32/localui/localui.rbuild
@@ -8,21 +8,6 @@
localui.c
localui.rc
- ui_Da.rc
- ui_De.rc
- ui_En.rc
- ui_Fr.rc
- ui_Ko.rc
- ui_Lt.rc
- ui_Nl.rc
- ui_No.rc
- ui_Pl.rc
- ui_Pt.rc
- ui_Ro.rc
- ui_Ru.rc
- ui_Si.rc
- ui_Sv.rc
- ui_Zh.rc
wine
winspool
user32
diff --git a/reactos/dll/win32/localui/localui.rc b/reactos/dll/win32/localui/localui.rc
index cdf7bb4c7e8..9963acb20ae 100644
--- a/reactos/dll/win32/localui/localui.rc
+++ b/reactos/dll/win32/localui/localui.rc
@@ -19,6 +19,10 @@
*
*/
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winver.h"
#include "localui.h"
#define WINE_FILENAME_STR "localui.dll"
@@ -32,3 +36,20 @@
#define WINE_PRODUCTVERSION_STR "5.1.2600.2180"
#include "wine/wine_common_ver.rc"
+
+
+#include "ui_Da.rc"
+#include "ui_De.rc"
+#include "ui_En.rc"
+#include "ui_Fr.rc"
+#include "ui_Ko.rc"
+#include "ui_Lt.rc"
+#include "ui_Nl.rc"
+#include "ui_No.rc"
+#include "ui_Pl.rc"
+#include "ui_Pt.rc"
+#include "ui_Ro.rc"
+#include "ui_Ru.rc"
+#include "ui_Si.rc"
+#include "ui_Sv.rc"
+#include "ui_Zh.rc"
diff --git a/reactos/dll/win32/localui/ui_Da.rc b/reactos/dll/win32/localui/ui_Da.rc
index 861ba8f2ddf..97299266959 100644
--- a/reactos/dll/win32/localui/ui_Da.rc
+++ b/reactos/dll/win32/localui/ui_Da.rc
@@ -18,8 +18,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_De.rc b/reactos/dll/win32/localui/ui_De.rc
index 5f65a803737..2fe35fc4e77 100644
--- a/reactos/dll/win32/localui/ui_De.rc
+++ b/reactos/dll/win32/localui/ui_De.rc
@@ -18,8 +18,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_En.rc b/reactos/dll/win32/localui/ui_En.rc
index 5a218680472..c2de6263a8a 100644
--- a/reactos/dll/win32/localui/ui_En.rc
+++ b/reactos/dll/win32/localui/ui_En.rc
@@ -18,8 +18,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Fr.rc b/reactos/dll/win32/localui/ui_Fr.rc
index 70e4baf06ee..261fa0b7dd2 100644
--- a/reactos/dll/win32/localui/ui_Fr.rc
+++ b/reactos/dll/win32/localui/ui_Fr.rc
@@ -17,9 +17,6 @@
* 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 "localui.h"
-
#pragma code_page(65001)
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
@@ -56,3 +53,5 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "Le port %s existe déjà"
IDS_NOTHINGTOCONFIG "Ce port n'a pas d'options de configuration"
}
+
+#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/ui_Ko.rc b/reactos/dll/win32/localui/ui_Ko.rc
index d86b7ef58a5..9a380308422 100644
--- a/reactos/dll/win32/localui/ui_Ko.rc
+++ b/reactos/dll/win32/localui/ui_Ko.rc
@@ -19,8 +19,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Lt.rc b/reactos/dll/win32/localui/ui_Lt.rc
index 87997d0f75b..698918afb85 100644
--- a/reactos/dll/win32/localui/ui_Lt.rc
+++ b/reactos/dll/win32/localui/ui_Lt.rc
@@ -57,3 +57,4 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "Prievadas %s jau egzistuoja"
IDS_NOTHINGTOCONFIG "Šis prievadas neturi parinkčių konfigūravimui"
}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/ui_Nl.rc b/reactos/dll/win32/localui/ui_Nl.rc
index 21d7cc84fae..59c58ffd3aa 100644
--- a/reactos/dll/win32/localui/ui_Nl.rc
+++ b/reactos/dll/win32/localui/ui_Nl.rc
@@ -18,8 +18,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_No.rc b/reactos/dll/win32/localui/ui_No.rc
index 8ed9e00c8aa..3a46bc8ee88 100644
--- a/reactos/dll/win32/localui/ui_No.rc
+++ b/reactos/dll/win32/localui/ui_No.rc
@@ -18,8 +18,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Pl.rc b/reactos/dll/win32/localui/ui_Pl.rc
index 822763d7dae..74a5015e00a 100644
--- a/reactos/dll/win32/localui/ui_Pl.rc
+++ b/reactos/dll/win32/localui/ui_Pl.rc
@@ -19,8 +19,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Pt.rc b/reactos/dll/win32/localui/ui_Pt.rc
index 7f1684820f7..7bad5211ead 100644
--- a/reactos/dll/win32/localui/ui_Pt.rc
+++ b/reactos/dll/win32/localui/ui_Pt.rc
@@ -18,8 +18,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Ro.rc b/reactos/dll/win32/localui/ui_Ro.rc
index a1b1c771fa1..43edfe6a4b1 100644
--- a/reactos/dll/win32/localui/ui_Ro.rc
+++ b/reactos/dll/win32/localui/ui_Ro.rc
@@ -17,8 +17,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -55,3 +53,5 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "Portul %s existsă deja"
IDS_NOTHINGTOCONFIG "Acest port nu are opțiuni de configurat"
}
+
+#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/ui_Ru.rc b/reactos/dll/win32/localui/ui_Ru.rc
index 3402f37b000..96e78f1971b 100644
--- a/reactos/dll/win32/localui/ui_Ru.rc
+++ b/reactos/dll/win32/localui/ui_Ru.rc
@@ -18,8 +18,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Si.rc b/reactos/dll/win32/localui/ui_Si.rc
index 6810c7ce733..961a2e046d4 100644
--- a/reactos/dll/win32/localui/ui_Si.rc
+++ b/reactos/dll/win32/localui/ui_Si.rc
@@ -18,8 +18,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
@@ -56,3 +54,5 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "Vrata z imenom %s že obstajajo"
IDS_NOTHINGTOCONFIG "Ta vrata nimajo možnosti nastavitve"
}
+
+#pragma code_page(default)
diff --git a/reactos/dll/win32/localui/ui_Sv.rc b/reactos/dll/win32/localui/ui_Sv.rc
index e137079ffe4..3cd22fd8c70 100644
--- a/reactos/dll/win32/localui/ui_Sv.rc
+++ b/reactos/dll/win32/localui/ui_Sv.rc
@@ -18,8 +18,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47
diff --git a/reactos/dll/win32/localui/ui_Zh.rc b/reactos/dll/win32/localui/ui_Zh.rc
index f43dde9afbd..197ac1dd38d 100644
--- a/reactos/dll/win32/localui/ui_Zh.rc
+++ b/reactos/dll/win32/localui/ui_Zh.rc
@@ -18,8 +18,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "localui.h"
-
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -92,3 +90,5 @@ STRINGTABLE DISCARDABLE
IDS_PORTEXISTS "端口 %s 已經存在"
IDS_NOTHINGTOCONFIG "這個端口沒有可設定選項"
}
+
+#pragma code_page(default)
diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c
index f5ed5f5262a..039c8f8e3e6 100644
--- a/reactos/dll/win32/lsasrv/lsarpc.c
+++ b/reactos/dll/win32/lsasrv/lsarpc.c
@@ -6,7 +6,6 @@
#define NTOS_MODE_USER
#include
-#include "lsasrv.h"
#include "lsa_s.h"
#include
@@ -26,10 +25,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(lsasrv);
/* FUNCTIONS ***************************************************************/
-/*static*/ NTSTATUS
-ReferencePolicyHandle(IN LSAPR_HANDLE ObjectHandle,
- IN ACCESS_MASK DesiredAccess,
- OUT PLSAR_POLICY_HANDLE *Policy)
+static NTSTATUS
+ReferencePolicyHandle(
+ IN LSA_HANDLE ObjectHandle,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PLSAR_POLICY_HANDLE *Policy)
{
PLSAR_POLICY_HANDLE ReferencedPolicy;
NTSTATUS Status = STATUS_SUCCESS;
@@ -58,10 +58,10 @@ ReferencePolicyHandle(IN LSAPR_HANDLE ObjectHandle,
return Status;
}
-
-/*static*/ VOID
-DereferencePolicyHandle(IN OUT PLSAR_POLICY_HANDLE Policy,
- IN BOOLEAN Delete)
+static VOID
+DereferencePolicyHandle(
+ IN OUT PLSAR_POLICY_HANDLE Policy,
+ IN BOOLEAN Delete)
{
RtlEnterCriticalSection(&PolicyHandleTableLock);
@@ -83,13 +83,17 @@ DereferencePolicyHandle(IN OUT PLSAR_POLICY_HANDLE Policy,
RtlLeaveCriticalSection(&PolicyHandleTableLock);
}
-
-DWORD WINAPI
-LsapRpcThreadRoutine(LPVOID lpParameter)
+VOID
+LsarStartRpcServer(VOID)
{
RPC_STATUS Status;
- TRACE("LsapRpcThreadRoutine() called");
+ RtlInitializeCriticalSection(&PolicyHandleTableLock);
+ RtlInitializeHandleTable(0x1000,
+ sizeof(LSAR_POLICY_HANDLE),
+ &PolicyHandleTable);
+
+ TRACE("LsarStartRpcServer() called");
Status = RpcServerUseProtseqEpW(L"ncacn_np",
10,
@@ -98,7 +102,7 @@ LsapRpcThreadRoutine(LPVOID lpParameter)
if (Status != RPC_S_OK)
{
WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
- return 0;
+ return;
}
Status = RpcServerRegisterIf(lsarpc_v0_0_s_ifspec,
@@ -107,51 +111,17 @@ LsapRpcThreadRoutine(LPVOID lpParameter)
if (Status != RPC_S_OK)
{
WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status);
- return 0;
+ return;
}
- Status = RpcServerListen(1, 20, FALSE);
+ Status = RpcServerListen(1, 20, TRUE);
if (Status != RPC_S_OK)
{
WARN("RpcServerListen() failed (Status %lx)\n", Status);
- return 0;
+ return;
}
- TRACE("LsapRpcThreadRoutine() done\n");
-
- return 0;
-}
-
-
-VOID
-LsarStartRpcServer(VOID)
-{
- HANDLE hThread;
-
- TRACE("LsarStartRpcServer() called");
-
- RtlInitializeCriticalSection(&PolicyHandleTableLock);
- RtlInitializeHandleTable(0x1000,
- sizeof(LSAR_POLICY_HANDLE),
- &PolicyHandleTable);
-
- hThread = CreateThread(NULL,
- 0,
- (LPTHREAD_START_ROUTINE)
- LsapRpcThreadRoutine,
- NULL,
- 0,
- NULL);
- if (!hThread)
- {
- WARN("Starting LsapRpcThreadRoutine-Thread failed!\n");
- }
- else
- {
- CloseHandle(hThread);
- }
-
- TRACE("LsarStartRpcServer() done");
+ TRACE("LsarStartRpcServer() done\n");
}
@@ -162,16 +132,24 @@ void __RPC_USER LSAPR_HANDLE_rundown(LSAPR_HANDLE hHandle)
/* Function 0 */
-NTSTATUS
-LsarClose(LSAPR_HANDLE *ObjectHandle)
+NTSTATUS LsarClose(
+ LSAPR_HANDLE *ObjectHandle)
{
-#if 0
PLSAR_POLICY_HANDLE Policy = NULL;
NTSTATUS Status;
TRACE("0x%p\n", ObjectHandle);
- Status = ReferencePolicyHandle(*ObjectHandle,
+#if 1
+ /* This is our fake handle, don't go too much long way */
+ if (*ObjectHandle == (LSA_HANDLE)0xcafe)
+ {
+ *ObjectHandle = NULL;
+ Status = STATUS_SUCCESS;
+ }
+#endif
+
+ Status = ReferencePolicyHandle((LSA_HANDLE)*ObjectHandle,
0,
&Policy);
if (NT_SUCCESS(Status))
@@ -181,29 +159,13 @@ LsarClose(LSAPR_HANDLE *ObjectHandle)
TRUE);
}
- return Status;
-#endif
- NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
-
- TRACE("LsarClose called!\n");
-
- /* This is our fake handle, don't go too much long way */
- if (*ObjectHandle == (LSA_HANDLE)0xcafe)
- {
- *ObjectHandle = NULL;
- Status = STATUS_SUCCESS;
- }
-
-
- TRACE("LsarClose done (Status: 0x%08lx)!\n", Status);
-
return Status;
}
/* Function 1 */
-NTSTATUS
-LsarDelete(LSAPR_HANDLE ObjectHandle)
+NTSTATUS LsarDelete(
+ LSAPR_HANDLE ObjectHandle)
{
/* Deprecated */
return STATUS_NOT_SUPPORTED;
@@ -246,7 +208,7 @@ NTSTATUS LsarSetSecurityObject(
/* Function 5 */
NTSTATUS LsarChangePassword(
- handle_t hBinding, /* FIXME */
+ handle_t IDL_handle,
PRPC_UNICODE_STRING String1,
PRPC_UNICODE_STRING String2,
PRPC_UNICODE_STRING String3,
@@ -265,6 +227,7 @@ NTSTATUS LsarOpenPolicy(
ACCESS_MASK DesiredAccess,
LSAPR_HANDLE *PolicyHandle)
{
+#if 1
TRACE("LsarOpenPolicy called!\n");
*PolicyHandle = (LSAPR_HANDLE)0xcafe;
@@ -272,6 +235,10 @@ NTSTATUS LsarOpenPolicy(
TRACE("LsarOpenPolicy done!\n");
return STATUS_SUCCESS;
+#else
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+#endif
}
@@ -572,7 +539,11 @@ NTSTATUS LsarLookupPrivilegeName(
/* Function 33 */
NTSTATUS LsarLookupPrivilegeDisplayName(
- LSAPR_HANDLE PolicyHandle, /* FIXME */
+ LSAPR_HANDLE PolicyHandle,
+ PRPC_UNICODE_STRING Name,
+ USHORT ClientLanguage,
+ USHORT ClientSystemDefaultLanguage,
+ PRPC_UNICODE_STRING *DisplayName,
USHORT *LanguageReturned)
{
UNIMPLEMENTED;
@@ -1044,7 +1015,7 @@ NTSTATUS CredrRename(
/* Function 76 */
NTSTATUS LsarLookupSids3(
- handle_t hBinding,
+ LSAPR_HANDLE PolicyHandle,
PLSAPR_SID_ENUM_BUFFER SidEnumBuffer,
PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains,
PLSAPR_TRANSLATED_NAMES_EX TranslatedNames,
@@ -1060,7 +1031,6 @@ NTSTATUS LsarLookupSids3(
/* Function 77 */
NTSTATUS LsarLookupNames4(
- handle_t hBinding,
handle_t RpcHandle,
DWORD Count,
PRPC_UNICODE_STRING Names,
@@ -1111,4 +1081,121 @@ NTSTATUS LsarAdtReportSecurityEvent(
return STATUS_NOT_IMPLEMENTED;
}
+
+/* Function 82 */
+NTSTATUS CredrFindBestCredential(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 83 */
+NTSTATUS LsarSetAuditPolicy(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 84 */
+NTSTATUS LsarQueryAuditPolicy(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 85 */
+NTSTATUS LsarEnumerateAuditPolicy(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 86 */
+NTSTATUS LsarEnumerateAuditCategories(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 87 */
+NTSTATUS LsarEnumerateAuditSubCategories(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 88 */
+NTSTATUS LsarLookupAuditCategoryName(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 89 */
+NTSTATUS LsarLookupAuditSubCategoryName(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 90 */
+NTSTATUS LsarSetAuditSecurity(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 91 */
+NTSTATUS LsarQueryAuditSecurity(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 92 */
+NTSTATUS CredReadByTokenHandle(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 93 */
+NTSTATUS CredrRestoreCredentials(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Function 94 */
+NTSTATUS CredrBackupCredentials(
+ handle_t hBinding)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
/* EOF */
diff --git a/reactos/dll/win32/lsasrv/lsasrv.c b/reactos/dll/win32/lsasrv/lsasrv.c
index 8481f80b646..088da34437b 100644
--- a/reactos/dll/win32/lsasrv/lsasrv.c
+++ b/reactos/dll/win32/lsasrv/lsasrv.c
@@ -51,7 +51,7 @@ LsapInitLsa(VOID)
}
-void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
+void __RPC_FAR * __RPC_USER midl_user_allocate(SIZE_T len)
{
return RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, len);
}
diff --git a/reactos/dll/win32/lsasrv/lsasrv.rbuild b/reactos/dll/win32/lsasrv/lsasrv.rbuild
index e180e22ec7f..58d1fcc0f48 100644
--- a/reactos/dll/win32/lsasrv/lsasrv.rbuild
+++ b/reactos/dll/win32/lsasrv/lsasrv.rbuild
@@ -1,4 +1,4 @@
-
+
.
.
diff --git a/reactos/dll/win32/mciwave/mciwave.rbuild b/reactos/dll/win32/mciwave/mciwave.rbuild
index cbbd3f4cc80..1cb073a2c16 100644
--- a/reactos/dll/win32/mciwave/mciwave.rbuild
+++ b/reactos/dll/win32/mciwave/mciwave.rbuild
@@ -3,6 +3,7 @@
.
include/reactos/wine
+
mciwave.c
wine
winmm
diff --git a/reactos/dll/win32/mlang/mlang.c b/reactos/dll/win32/mlang/mlang.c
index 5deb87b3881..c28e695962d 100644
--- a/reactos/dll/win32/mlang/mlang.c
+++ b/reactos/dll/win32/mlang/mlang.c
@@ -4,6 +4,7 @@
* Copyright 2002 Lionel Ulmer
* Copyright 2003,2004 Mike McCormack
* Copyright 2004,2005 Dmitry Timoshkov
+ * Copyright 2009 Detlef Riekenberg
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -454,13 +455,13 @@ static const struct mlang_data
{ "Arabic",1256,sizeof(arabic_cp)/sizeof(arabic_cp[0]),arabic_cp,
"Courier","Arial", sidArabic }, /* FIXME */
{ "Baltic",1257,sizeof(baltic_cp)/sizeof(baltic_cp[0]),baltic_cp,
- "Courier","Arial" }, /* FIXME */
+ "Courier","Arial", sidAsciiLatin }, /* FIXME */
{ "Chinese Simplified",936,sizeof(chinese_simplified_cp)/sizeof(chinese_simplified_cp[0]),chinese_simplified_cp,
- "Courier","Arial" }, /* FIXME */
+ "Courier","Arial", sidHan }, /* FIXME */
{ "Chinese Traditional",950,sizeof(chinese_traditional_cp)/sizeof(chinese_traditional_cp[0]),chinese_traditional_cp,
- "Courier","Arial" }, /* FIXME */
+ "Courier","Arial", sidBopomofo }, /* FIXME */
{ "Central European",1250,sizeof(central_european_cp)/sizeof(central_european_cp[0]),central_european_cp,
- "Courier","Arial" }, /* FIXME */
+ "Courier","Arial", sidAsciiLatin }, /* FIXME */
{ "Cyrillic",1251,sizeof(cyrillic_cp)/sizeof(cyrillic_cp[0]),cyrillic_cp,
"Courier","Arial", sidCyrillic }, /* FIXME */
{ "Greek",1253,sizeof(greek_cp)/sizeof(greek_cp[0]),greek_cp,
@@ -468,17 +469,17 @@ static const struct mlang_data
{ "Hebrew",1255,sizeof(hebrew_cp)/sizeof(hebrew_cp[0]),hebrew_cp,
"Courier","Arial", sidHebrew }, /* FIXME */
{ "Japanese",932,sizeof(japanese_cp)/sizeof(japanese_cp[0]),japanese_cp,
- "MS Gothic","MS PGothic" },
+ "MS Gothic","MS PGothic", sidKana },
{ "Korean",949,sizeof(korean_cp)/sizeof(korean_cp[0]),korean_cp,
- "Courier","Arial" }, /* FIXME */
+ "Courier","Arial", sidHangul }, /* FIXME */
{ "Thai",874,sizeof(thai_cp)/sizeof(thai_cp[0]),thai_cp,
"Courier","Arial", sidThai }, /* FIXME */
{ "Turkish",1254,sizeof(turkish_cp)/sizeof(turkish_cp[0]),turkish_cp,
- "Courier","Arial" }, /* FIXME */
+ "Courier","Arial", sidAsciiLatin }, /* FIXME */
{ "Vietnamese",1258,sizeof(vietnamese_cp)/sizeof(vietnamese_cp[0]),vietnamese_cp,
- "Courier","Arial" }, /* FIXME */
+ "Courier","Arial", sidAsciiLatin }, /* FIXME */
{ "Western European",1252,sizeof(western_cp)/sizeof(western_cp[0]),western_cp,
- "Courier","Arial", sidLatin }, /* FIXME */
+ "Courier","Arial", sidAsciiLatin }, /* FIXME */
{ "Unicode",CP_UNICODE,sizeof(unicode_cp)/sizeof(unicode_cp[0]),unicode_cp,
"Courier","Arial" } /* FIXME */
};
@@ -1135,33 +1136,58 @@ HRESULT WINAPI IsConvertINetStringAvailable(
return S_FALSE;
}
-static inline INT lcid_to_rfc1766A( LCID lcid, LPSTR rfc1766, INT len )
+static inline HRESULT lcid_to_rfc1766A( LCID lcid, LPSTR rfc1766, INT len )
{
- INT n = GetLocaleInfoA( lcid, LOCALE_SISO639LANGNAME, rfc1766, len );
+ CHAR buffer[MAX_RFC1766_NAME];
+ INT n = GetLocaleInfoA(lcid, LOCALE_SISO639LANGNAME, buffer, MAX_RFC1766_NAME);
+ INT i;
+
if (n)
{
- rfc1766[n - 1] = '-';
- n += GetLocaleInfoA( lcid, LOCALE_SISO3166CTRYNAME, rfc1766 + n, len - n );
- LCMapStringA( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, n, rfc1766, len );
- return n;
+ i = PRIMARYLANGID(lcid);
+ if ((((i == LANG_ENGLISH) || (i == LANG_CHINESE) || (i == LANG_ARABIC)) &&
+ (SUBLANGID(lcid) == SUBLANG_DEFAULT)) ||
+ (SUBLANGID(lcid) > SUBLANG_DEFAULT)) {
+
+ buffer[n - 1] = '-';
+ i = GetLocaleInfoA(lcid, LOCALE_SISO3166CTRYNAME, buffer + n, MAX_RFC1766_NAME - n);
+ if (!i)
+ buffer[n - 1] = '\0';
+ }
+ else
+ i = 0;
+
+ LCMapStringA( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, buffer, n + i, rfc1766, len );
+ return ((n + i) > len) ? E_INVALIDARG : S_OK;
}
- return 0;
+ return E_FAIL;
}
-static inline INT lcid_to_rfc1766W( LCID lcid, LPWSTR rfc1766, INT len )
+static inline HRESULT lcid_to_rfc1766W( LCID lcid, LPWSTR rfc1766, INT len )
{
- INT n = GetLocaleInfoW( lcid, LOCALE_SISO639LANGNAME, rfc1766, len );
- INT save = n;
+ WCHAR buffer[MAX_RFC1766_NAME];
+ INT n = GetLocaleInfoW(lcid, LOCALE_SISO639LANGNAME, buffer, MAX_RFC1766_NAME);
+ INT i;
+
if (n)
{
- rfc1766[n - 1] = '-';
- n += GetLocaleInfoW( lcid, LOCALE_SISO3166CTRYNAME, rfc1766 + n, len - n );
- if (n == save)
- rfc1766[n - 1] = '\0';
- LCMapStringW( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, n, rfc1766, len );
- return n;
+ i = PRIMARYLANGID(lcid);
+ if ((((i == LANG_ENGLISH) || (i == LANG_CHINESE) || (i == LANG_ARABIC)) &&
+ (SUBLANGID(lcid) == SUBLANG_DEFAULT)) ||
+ (SUBLANGID(lcid) > SUBLANG_DEFAULT)) {
+
+ buffer[n - 1] = '-';
+ i = GetLocaleInfoW(lcid, LOCALE_SISO3166CTRYNAME, buffer + n, MAX_RFC1766_NAME - n);
+ if (!i)
+ buffer[n - 1] = '\0';
+ }
+ else
+ i = 0;
+
+ LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, buffer, n + i, rfc1766, len);
+ return ((n + i) > len) ? E_INVALIDARG : S_OK;
}
- return 0;
+ return E_FAIL;
}
HRESULT WINAPI LcidToRfc1766A(
@@ -1170,11 +1196,10 @@ HRESULT WINAPI LcidToRfc1766A(
INT nChar)
{
TRACE("%04x %p %u\n", lcid, pszRfc1766, nChar);
+ if (!pszRfc1766)
+ return E_INVALIDARG;
- if (lcid_to_rfc1766A( lcid, pszRfc1766, nChar ))
- return S_OK;
-
- return S_FALSE;
+ return lcid_to_rfc1766A(lcid, pszRfc1766, nChar);
}
HRESULT WINAPI LcidToRfc1766W(
@@ -1183,11 +1208,10 @@ HRESULT WINAPI LcidToRfc1766W(
INT nChar)
{
TRACE("%04x %p %u\n", lcid, pszRfc1766, nChar);
+ if (!pszRfc1766)
+ return E_INVALIDARG;
- if (lcid_to_rfc1766W( lcid, pszRfc1766, nChar ))
- return S_OK;
-
- return S_FALSE;
+ return lcid_to_rfc1766W(lcid, pszRfc1766, nChar);
}
static HRESULT lcid_from_rfc1766(IEnumRfc1766 *iface, LCID *lcid, LPCWSTR rfc1766)
@@ -1197,7 +1221,7 @@ static HRESULT lcid_from_rfc1766(IEnumRfc1766 *iface, LCID *lcid, LPCWSTR rfc176
while (IEnumRfc1766_Next(iface, 1, &info, &num) == S_OK)
{
- if (!strcmpW(info.wszRfc1766, rfc1766))
+ if (!strcmpiW(info.wszRfc1766, rfc1766))
{
*lcid = info.lcid;
return S_OK;
@@ -1222,8 +1246,6 @@ HRESULT WINAPI Rfc1766ToLcidW(LCID *pLocale, LPCWSTR pszRfc1766)
if (!pLocale || !pszRfc1766)
return E_INVALIDARG;
- *pLocale = 0;
-
hr = EnumRfc1766_create(0, &enumrfc1766);
if (FAILED(hr))
return hr;
@@ -1238,6 +1260,9 @@ HRESULT WINAPI Rfc1766ToLcidA(LCID *lcid, LPCSTR rfc1766A)
{
WCHAR rfc1766W[MAX_RFC1766_NAME + 1];
+ if (!rfc1766A)
+ return E_INVALIDARG;
+
MultiByteToWideChar(CP_ACP, 0, rfc1766A, -1, rfc1766W, MAX_RFC1766_NAME);
rfc1766W[MAX_RFC1766_NAME] = 0;
@@ -2116,8 +2141,14 @@ static HRESULT WINAPI fnIMultiLanguage_GetNumberOfCodePageInfo(
IMultiLanguage* iface,
UINT* pcCodePage)
{
- FIXME("\n");
- return E_NOTIMPL;
+ MLang_impl *This = impl_from_IMultiLanguage( iface );
+
+ TRACE("(%p, %p)\n", This, pcCodePage);
+
+ if (!pcCodePage) return E_INVALIDARG;
+
+ *pcCodePage = This->total_cp;
+ return S_OK;
}
static HRESULT WINAPI fnIMultiLanguage_GetCodePageInfo(
@@ -2237,8 +2268,10 @@ static HRESULT WINAPI fnIMultiLanguage_GetRfc1766FromLcid(
WCHAR buf[MAX_RFC1766_NAME];
TRACE("%p %04x %p\n", iface, lcid, pbstrRfc1766);
+ if (!pbstrRfc1766)
+ return E_INVALIDARG;
- if (lcid_to_rfc1766W( lcid, buf, MAX_RFC1766_NAME ))
+ if (!lcid_to_rfc1766W( lcid, buf, MAX_RFC1766_NAME ))
{
*pbstrRfc1766 = SysAllocString( buf );
return S_OK;
@@ -2463,7 +2496,7 @@ static HRESULT EnumRfc1766_create(LANGID LangId, IEnumRfc1766 **ppEnum)
rfc->total = 0;
data.total = 0;
- data.allocated = 32;
+ data.allocated = 160;
data.info = HeapAlloc(GetProcessHeap(), 0, data.allocated * sizeof(RFC1766INFO));
if (!data.info)
{
@@ -2509,8 +2542,38 @@ static HRESULT WINAPI fnIMultiLanguage_GetRfc1766Info(
LCID Locale,
PRFC1766INFO pRfc1766Info)
{
- FIXME("\n");
- return E_NOTIMPL;
+ LCTYPE type = LOCALE_SLANGUAGE;
+
+ TRACE("(%p, 0x%04x, %p)\n", iface, Locale, pRfc1766Info);
+
+ if (!pRfc1766Info)
+ return E_INVALIDARG;
+
+ if ((PRIMARYLANGID(Locale) == LANG_ENGLISH) ||
+ (PRIMARYLANGID(Locale) == LANG_CHINESE) ||
+ (PRIMARYLANGID(Locale) == LANG_ARABIC)) {
+
+ if (!SUBLANGID(Locale))
+ type = LOCALE_SENGLANGUAGE; /* suppress country */
+ }
+ else
+ {
+ if (!SUBLANGID(Locale)) {
+ TRACE("SUBLANGID missing in 0x%04x\n", Locale);
+ return E_FAIL;
+ }
+ }
+
+ pRfc1766Info->lcid = Locale;
+ pRfc1766Info->wszRfc1766[0] = 0;
+ pRfc1766Info->wszLocaleName[0] = 0;
+
+ if ((!lcid_to_rfc1766W(Locale, pRfc1766Info->wszRfc1766, MAX_RFC1766_NAME)) &&
+ (GetLocaleInfoW(Locale, type, pRfc1766Info->wszLocaleName, MAX_LOCALE_NAME) > 0))
+ return S_OK;
+
+ /* Locale not supported */
+ return E_INVALIDARG;
}
static HRESULT WINAPI fnIMultiLanguage_CreateConvertCharset(
@@ -2583,7 +2646,7 @@ static HRESULT WINAPI fnIMultiLanguage2_GetNumberOfCodePageInfo(
TRACE("%p, %p\n", This, pcCodePage);
- if (!pcCodePage) return S_FALSE;
+ if (!pcCodePage) return E_INVALIDARG;
*pcCodePage = This->total_cp;
return S_OK;
@@ -2792,8 +2855,10 @@ static HRESULT WINAPI fnIMultiLanguage2_GetRfc1766FromLcid(
WCHAR buf[MAX_RFC1766_NAME];
TRACE("%p %04x %p\n", iface, lcid, pbstrRfc1766);
+ if (!pbstrRfc1766)
+ return E_INVALIDARG;
- if (lcid_to_rfc1766W( lcid, buf, MAX_RFC1766_NAME ))
+ if (!lcid_to_rfc1766W( lcid, buf, MAX_RFC1766_NAME ))
{
*pbstrRfc1766 = SysAllocString( buf );
return S_OK;
@@ -2842,8 +2907,45 @@ static HRESULT WINAPI fnIMultiLanguage2_GetRfc1766Info(
LANGID LangId,
PRFC1766INFO pRfc1766Info)
{
- FIXME("\n");
- return E_NOTIMPL;
+ static LANGID last_lang = -1;
+ LCTYPE type = LOCALE_SLANGUAGE;
+
+ TRACE("(%p, 0x%04x, 0x%04x, %p)\n", iface, Locale, LangId, pRfc1766Info);
+
+ if (!pRfc1766Info)
+ return E_INVALIDARG;
+
+ if ((PRIMARYLANGID(Locale) == LANG_ENGLISH) ||
+ (PRIMARYLANGID(Locale) == LANG_CHINESE) ||
+ (PRIMARYLANGID(Locale) == LANG_ARABIC)) {
+
+ if (!SUBLANGID(Locale))
+ type = LOCALE_SENGLANGUAGE; /* suppress country */
+ }
+ else
+ {
+ if (!SUBLANGID(Locale)) {
+ TRACE("SUBLANGID missing in 0x%04x\n", Locale);
+ return E_FAIL;
+ }
+ }
+
+ pRfc1766Info->lcid = Locale;
+ pRfc1766Info->wszRfc1766[0] = 0;
+ pRfc1766Info->wszLocaleName[0] = 0;
+
+ if ((PRIMARYLANGID(LangId) != LANG_ENGLISH) &&
+ (last_lang != LangId)) {
+ FIXME("Only english names supported (requested: 0x%04x)\n", LangId);
+ last_lang = LangId;
+ }
+
+ if ((!lcid_to_rfc1766W(Locale, pRfc1766Info->wszRfc1766, MAX_RFC1766_NAME)) &&
+ (GetLocaleInfoW(Locale, type, pRfc1766Info->wszLocaleName, MAX_LOCALE_NAME) > 0))
+ return S_OK;
+
+ /* Locale not supported */
+ return E_INVALIDARG;
}
static HRESULT WINAPI fnIMultiLanguage2_CreateConvertCharset(
@@ -3023,8 +3125,10 @@ static HRESULT WINAPI fnIMultiLanguage2_IsCodePageInstallable(
IMultiLanguage3* iface,
UINT uiCodePage)
{
- FIXME("%u\n", uiCodePage);
- return E_NOTIMPL;
+ TRACE("%u\n", uiCodePage);
+
+ /* FIXME: the installable set is usually larger than the set of valid codepages */
+ return IMultiLanguage2_ValidateCodePageEx(iface, uiCodePage, NULL, CPIOD_PEEK);
}
static HRESULT WINAPI fnIMultiLanguage2_SetMimeDBSource(
@@ -3255,8 +3359,30 @@ static HRESULT WINAPI fnIMLangFontLink2_MapFont(IMLangFontLink2* This,
static HRESULT WINAPI fnIMLangFontLink2_GetFontUnicodeRanges(IMLangFontLink2* This,
HDC hDC, UINT *puiRanges, UNICODERANGE *pUranges)
{
- FIXME("(%p)->%p %p %p\n",This, hDC, puiRanges, pUranges);
- return E_NOTIMPL;
+ DWORD size;
+ GLYPHSET *gs;
+
+ TRACE("(%p)->%p %p %p\n", This, hDC, puiRanges, pUranges);
+
+ if (!puiRanges) return E_INVALIDARG;
+ if (!(size = GetFontUnicodeRanges(hDC, NULL))) return E_FAIL;
+ if (!(gs = HeapAlloc(GetProcessHeap(), 0, size))) return E_OUTOFMEMORY;
+
+ GetFontUnicodeRanges(hDC, gs);
+ *puiRanges = gs->cRanges;
+ if (pUranges)
+ {
+ UINT i;
+ for (i = 0; i < gs->cRanges; i++)
+ {
+ if (i >= *puiRanges) break;
+ pUranges[i].wcFrom = gs->ranges[i].wcLow;
+ pUranges[i].wcTo = gs->ranges[i].wcLow + gs->ranges[i].cGlyphs;
+ }
+ *puiRanges = i;
+ }
+ HeapFree(GetProcessHeap(), 0, gs);
+ return S_OK;
}
static HRESULT WINAPI fnIMLangFontLink2_GetScriptFontInfo(IMLangFontLink2* This,
@@ -3299,8 +3425,21 @@ static HRESULT WINAPI fnIMLangFontLink2_GetScriptFontInfo(IMLangFontLink2* This,
static HRESULT WINAPI fnIMLangFontLink2_CodePageToScriptID(IMLangFontLink2* This,
UINT uiCodePage, SCRIPT_ID *pSid)
{
- FIXME("(%p)->%i %p\n",This, uiCodePage, pSid);
- return E_NOTIMPL;
+ UINT i;
+
+ TRACE("(%p)->%i %p\n", This, uiCodePage, pSid);
+
+ if (uiCodePage == CP_UNICODE) return E_FAIL;
+
+ for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ {
+ if (uiCodePage == mlang_data[i].family_codepage)
+ {
+ if (pSid) *pSid = mlang_data[i].sid;
+ return S_OK;
+ }
+ }
+ return E_FAIL;
}
static const IMLangFontLink2Vtbl IMLangFontLink2_vtbl =
diff --git a/reactos/dll/win32/mmdrv/mme.c b/reactos/dll/win32/mmdrv/mme.c
index 26cb285fb2a..9d9960c16b2 100644
--- a/reactos/dll/win32/mmdrv/mme.c
+++ b/reactos/dll/win32/mmdrv/mme.c
@@ -41,7 +41,7 @@ NotifyClient(
Wave Output
*/
-APIENTRY DWORD
+DWORD APIENTRY
wodMessage(
UINT device_id,
UINT message,
diff --git a/reactos/dll/win32/mpr/mpr.rbuild b/reactos/dll/win32/mpr/mpr.rbuild
index 4f7b67ac1d1..2bcae1d64d2 100644
--- a/reactos/dll/win32/mpr/mpr.rbuild
+++ b/reactos/dll/win32/mpr/mpr.rbuild
@@ -6,6 +6,7 @@
.
include/reactos/wine
+
auth.c
mpr_main.c
multinet.c
diff --git a/reactos/dll/win32/msacm32/format.c b/reactos/dll/win32/msacm32/format.c
index 869cb365c94..a6f7fbdd6a0 100644
--- a/reactos/dll/win32/msacm32/format.c
+++ b/reactos/dll/win32/msacm32/format.c
@@ -475,7 +475,7 @@ static BOOL MSACM_FormatEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had,
continue;
hdrvr = OpenDriver(padid->pszFileName,0,0);
- SendDriverMessage(hdrvr,ACMDM_FORMAT_SUGGEST,(DWORD_PTR)&adfs,(fdwEnum & 0x000000FFL));
+ SendDriverMessage(hdrvr,ACMDM_FORMAT_SUGGEST,(LPARAM)&adfs,(fdwEnum & 0x000000FFL));
if (acmFormatDetailsW(had, pafd, ACM_FORMATDETAILSF_FORMAT) != MMSYSERR_NOERROR)
continue;
diff --git a/reactos/dll/win32/msacm32/msacm.rc b/reactos/dll/win32/msacm32/msacm.rc
index c998e3d65d5..a9d9d9d8e20 100644
--- a/reactos/dll/win32/msacm32/msacm.rc
+++ b/reactos/dll/win32/msacm32/msacm.rc
@@ -26,6 +26,7 @@
#include "msacm_Cs.rc"
#include "msacm_Da.rc"
#include "msacm_De.rc"
+#include "msacm_El.rc"
#include "msacm_En.rc"
#include "msacm_Es.rc"
#include "msacm_Fr.rc"
diff --git a/reactos/dll/win32/msacm32/msacm_De.rc b/reactos/dll/win32/msacm32/msacm_De.rc
index 8d60c363a8e..1f35148ebe4 100644
--- a/reactos/dll/win32/msacm32/msacm_De.rc
+++ b/reactos/dll/win32/msacm32/msacm_De.rc
@@ -18,6 +18,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
+#pragma code_page(65001)
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
diff --git a/reactos/dll/win32/msacm32/msacm_En.rc b/reactos/dll/win32/msacm32/msacm_En.rc
index e7c7ec2888f..620dfcf1699 100644
--- a/reactos/dll/win32/msacm32/msacm_En.rc
+++ b/reactos/dll/win32/msacm32/msacm_En.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
diff --git a/reactos/dll/win32/msacm32/msacm_Es.rc b/reactos/dll/win32/msacm32/msacm_Es.rc
index 8d16b62240e..3e6f441767a 100644
--- a/reactos/dll/win32/msacm32/msacm_Es.rc
+++ b/reactos/dll/win32/msacm32/msacm_Es.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
diff --git a/reactos/dll/win32/msacm32/msacm_Fr.rc b/reactos/dll/win32/msacm32/msacm_Fr.rc
index c170d2fff80..9341e6cafd4 100644
--- a/reactos/dll/win32/msacm32/msacm_Fr.rc
+++ b/reactos/dll/win32/msacm32/msacm_Fr.rc
@@ -2,7 +2,7 @@
* French resource file for MS ACM
*
* Copyright 2000 Eric Pouech
- * Copyright 2003 Vincent Bron
+ * Copyright 2003 Vincent Béron
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -19,25 +19,30 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
-DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
+DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 250, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Slection du son"
+CAPTION "Sélection du son"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "&Nom :", -1, 5, 5, 115, 8, NOT WS_GROUP
- COMBOBOX IDD_ACMFORMATCHOOSE_CMB_CUSTOM, 5, 15, 115, 60,
+ COMBOBOX IDD_ACMFORMATCHOOSE_CMB_CUSTOM, 5, 15, 115, 15,
CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- PUSHBUTTON "&Enregistrer sous...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14
- PUSHBUTTON "&Retirer", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14
+ PUSHBUTTON "&Enregistrer sous...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 70, 14
+ PUSHBUTTON "&Supprimer", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 199, 14, 45, 14
LTEXT "&Format :", -1, 5, 41, 44, 8, NOT WS_GROUP
- COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, 50, 39, 170, 60,
+ COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, 48, 39, 197, 15,
CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "&Attributs :", -1, 5, 59, 44, 8, NOT WS_GROUP
@@ -47,7 +52,7 @@ BEGIN
CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP |
CBS_OWNERDRAWFIXED | CBS_HASSTRINGS
#else
- COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 50, 57, 170, 60,
+ COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 48, 57, 197, 60,
CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
#endif
DEFPUSHBUTTON "OK", IDOK, 48, 80, 40, 14
diff --git a/reactos/dll/win32/msacm32/msacm_Hu.rc b/reactos/dll/win32/msacm32/msacm_Hu.rc
index 3bc440e2b3a..52f32584cf7 100644
--- a/reactos/dll/win32/msacm32/msacm_Hu.rc
+++ b/reactos/dll/win32/msacm32/msacm_Hu.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
diff --git a/reactos/dll/win32/msacm32/msacm_It.rc b/reactos/dll/win32/msacm32/msacm_It.rc
index 1ce6b42b369..07db54b6d54 100644
--- a/reactos/dll/win32/msacm32/msacm_It.rc
+++ b/reactos/dll/win32/msacm32/msacm_It.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
diff --git a/reactos/dll/win32/msacm32/msacm_Ja.rc b/reactos/dll/win32/msacm32/msacm_Ja.rc
index e9a63f9e257..56066b0ba2d 100644
--- a/reactos/dll/win32/msacm32/msacm_Ja.rc
+++ b/reactos/dll/win32/msacm32/msacm_Ja.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
/* UTF-8 */
#pragma code_page(65001)
@@ -25,24 +27,24 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "サウンドの選択"
+CAPTION "???????"
FONT 9, "MS Shell Dlg"
BEGIN
- LTEXT "名前(&N):", -1, 5, 5, 115, 8, NOT WS_GROUP
+ LTEXT "??(&N):", -1, 5, 5, 115, 8, NOT WS_GROUP
COMBOBOX IDD_ACMFORMATCHOOSE_CMB_CUSTOM, 5, 15, 115, 60,
CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- PUSHBUTTON "名前を付けて保存(&S)...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14
- PUSHBUTTON "削除(&R)", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14
+ PUSHBUTTON "????????(&S)...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14
+ PUSHBUTTON "??(&R)", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14
- LTEXT "フォーマット(&F):", -1, 5, 41, 44, 8, NOT WS_GROUP
+ LTEXT "??????(&F):", -1, 5, 41, 44, 8, NOT WS_GROUP
COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, 50, 39, 170, 60,
CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- LTEXT "属性(&A):", -1, 5, 59, 44, 8, NOT WS_GROUP
+ LTEXT "??(&A):", -1, 5, 59, 44, 8, NOT WS_GROUP
#if 0
COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 50, 57, 170, 60,
@@ -53,8 +55,8 @@ BEGIN
CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
#endif
DEFPUSHBUTTON "OK", IDOK, 48, 80, 40, 14
- PUSHBUTTON "キャンセル", IDCANCEL, 92, 80, 40, 14
- PUSHBUTTON "ヘルプ(&H)", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14
+ PUSHBUTTON "?????", IDCANCEL, 92, 80, 40, 14
+ PUSHBUTTON "???(&H)", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14
END
diff --git a/reactos/dll/win32/msacm32/msacm_Nl.rc b/reactos/dll/win32/msacm32/msacm_Nl.rc
index fd7fb79d547..1fb0b059b20 100644
--- a/reactos/dll/win32/msacm32/msacm_Nl.rc
+++ b/reactos/dll/win32/msacm32/msacm_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
diff --git a/reactos/dll/win32/msacm32/msacm_No.rc b/reactos/dll/win32/msacm32/msacm_No.rc
index e099f091a0e..1bef4343834 100644
--- a/reactos/dll/win32/msacm32/msacm_No.rc
+++ b/reactos/dll/win32/msacm32/msacm_No.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
diff --git a/reactos/dll/win32/msacm32/msacm_Pl.rc b/reactos/dll/win32/msacm32/msacm_Pl.rc
index 940b004d013..9a0c5075745 100644
--- a/reactos/dll/win32/msacm32/msacm_Pl.rc
+++ b/reactos/dll/win32/msacm32/msacm_Pl.rc
@@ -18,6 +18,8 @@
* 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 "wineacm.h"
+
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 235, 100
diff --git a/reactos/dll/win32/msacm32/msacm_Pt.rc b/reactos/dll/win32/msacm32/msacm_Pt.rc
index 17cbca22062..d73951c6899 100644
--- a/reactos/dll/win32/msacm32/msacm_Pt.rc
+++ b/reactos/dll/win32/msacm32/msacm_Pt.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
diff --git a/reactos/dll/win32/msacm32/msacm_Ru.rc b/reactos/dll/win32/msacm32/msacm_Ru.rc
index d634139396f..f9b7f90634f 100644
--- a/reactos/dll/win32/msacm32/msacm_Ru.rc
+++ b/reactos/dll/win32/msacm32/msacm_Ru.rc
@@ -18,28 +18,33 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION " "
+CAPTION "????? ?????"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "&:", -1, 5, 5, 115, 8, NOT WS_GROUP
+ LTEXT "&???:", -1, 5, 5, 115, 8, NOT WS_GROUP
COMBOBOX IDD_ACMFORMATCHOOSE_CMB_CUSTOM, 5, 15, 115, 60,
CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- PUSHBUTTON "& ...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14
- PUSHBUTTON "&", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14
+ PUSHBUTTON "&????????? ???...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14
+ PUSHBUTTON "&???????", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14
- LTEXT "&:", -1, 5, 41, 44, 8, NOT WS_GROUP
+ LTEXT "&??????:", -1, 5, 41, 44, 8, NOT WS_GROUP
COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, 50, 39, 170, 60,
CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- LTEXT "&:", -1, 5, 59, 44, 8, NOT WS_GROUP
+ LTEXT "&????????:", -1, 5, 59, 44, 8, NOT WS_GROUP
#if 0
COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 50, 57, 170, 60,
@@ -50,7 +55,7 @@ BEGIN
CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
#endif
DEFPUSHBUTTON "OK", IDOK, 48, 80, 40, 14
- PUSHBUTTON "", IDCANCEL, 92, 80, 40, 14
- PUSHBUTTON "&", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14
+ PUSHBUTTON "??????", IDCANCEL, 92, 80, 40, 14
+ PUSHBUTTON "&??????", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14
END
diff --git a/reactos/dll/win32/msacm32/msacm_Sv.rc b/reactos/dll/win32/msacm32/msacm_Sv.rc
index 747e6085b01..939e8793371 100644
--- a/reactos/dll/win32/msacm32/msacm_Sv.rc
+++ b/reactos/dll/win32/msacm32/msacm_Sv.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "wineacm.h"
+
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100
diff --git a/reactos/dll/win32/msacm32/wineacm.h b/reactos/dll/win32/msacm32/wineacm.h
index b566e618a6a..bf0c6ed04d4 100644
--- a/reactos/dll/win32/msacm32/wineacm.h
+++ b/reactos/dll/win32/msacm32/wineacm.h
@@ -20,6 +20,9 @@
#ifndef __WINE_WINEACM_H
#define __WINE_WINEACM_H
+#include
+#include
+
/***********************************************************************
* Wine specific - Win32
*/
diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c
index 37e5081e913..f654bb5bb91 100644
--- a/reactos/dll/win32/msafd/misc/dllmain.c
+++ b/reactos/dll/win32/msafd/misc/dllmain.c
@@ -98,6 +98,9 @@ WSPSocket(int AddressFamily,
/* Set Socket Data */
Socket = HeapAlloc(GlobalHeap, 0, sizeof(*Socket));
+ if (!Socket)
+ return MsafdReturnWithErrno(STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL);
+
RtlZeroMemory(Socket, sizeof(*Socket));
Socket->RefCount = 2;
Socket->Handle = -1;
@@ -140,6 +143,9 @@ WSPSocket(int AddressFamily,
/* Set up EA Buffer */
EABuffer = HeapAlloc(GlobalHeap, 0, SizeOfEA);
+ if (!EABuffer)
+ return MsafdReturnWithErrno(STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL);
+
RtlZeroMemory(EABuffer, SizeOfEA);
EABuffer->NextEntryOffset = 0;
EABuffer->Flags = 0;
@@ -229,16 +235,28 @@ WSPSocket(int AddressFamily,
ourselves after every call to NtDeviceIoControlFile. This is
because the kernel doesn't support overlapping synchronous I/O
requests (made from multiple threads) at this time (Sep 2005) */
- ZwCreateFile(&Sock,
- GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
- &Object,
- &IOSB,
- NULL,
- 0,
- FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF,
- 0,
- EABuffer,
- SizeOfEA);
+ Status = NtCreateFile(&Sock,
+ GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
+ &Object,
+ &IOSB,
+ NULL,
+ 0,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ FILE_OPEN_IF,
+ 0,
+ EABuffer,
+ SizeOfEA);
+
+ HeapFree(GlobalHeap, 0, EABuffer);
+
+ if (Status != STATUS_SUCCESS)
+ {
+ AFD_DbgPrint(MIN_TRACE, ("Failed to open socket\n"));
+
+ HeapFree(GlobalHeap, 0, Socket);
+
+ return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
+ }
/* Save Handle */
Socket->Handle = (SOCKET)Sock;
@@ -291,6 +309,9 @@ WSPSocket(int AddressFamily,
error:
AFD_DbgPrint(MID_TRACE,("Ending %x\n", Status));
+ if( Socket )
+ HeapFree(GlobalHeap, 0, Socket);
+
if( lpErrno )
*lpErrno = Status;
@@ -335,7 +356,7 @@ DWORD MsafdReturnWithErrno(NTSTATUS Status,
case STATUS_NO_MEMORY: /* Fall through to STATUS_INSUFFICIENT_RESOURCES */
case STATUS_INSUFFICIENT_RESOURCES:
DbgPrint("MSAFD: STATUS_NO_MEMORY/STATUS_INSUFFICIENT_RESOURCES\n");
- *Errno = WSA_NOT_ENOUGH_MEMORY;
+ *Errno = WSAENOBUFS;
break;
case STATUS_INVALID_CONNECTION:
DbgPrint("MSAFD: STATUS_INVALID_CONNECTION\n");
@@ -683,7 +704,7 @@ WSPSelect(int nfds,
fd_set *readfds,
fd_set *writefds,
fd_set *exceptfds,
- struct timeval *timeout,
+ const LPTIMEVAL timeout,
LPINT lpErrno)
{
IO_STATUS_BLOCK IOSB;
@@ -777,6 +798,7 @@ WSPSelect(int nfds,
PollInfo->Handles[j].Events = AFD_EVENT_RECEIVE |
AFD_EVENT_DISCONNECT |
AFD_EVENT_ABORT |
+ AFD_EVENT_CLOSE |
AFD_EVENT_ACCEPT;
}
}
@@ -1037,6 +1059,11 @@ WSPAccept(SOCKET Handle,
{
/* Allocate needed space */
PendingData = HeapAlloc(GlobalHeap, 0, PendingDataLength);
+ if (!PendingData)
+ {
+ MsafdReturnWithErrno( STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL );
+ return INVALID_SOCKET;
+ }
/* We want the data now */
PendingAcceptData.ReturnSize = FALSE;
@@ -1078,6 +1105,13 @@ WSPAccept(SOCKET Handle,
CalleeID.buf = (PVOID)Socket->LocalAddress;
CalleeID.len = Socket->SharedData.SizeOfLocalAddress;
+ RemoteAddress = HeapAlloc(GlobalHeap, 0, sizeof(*RemoteAddress));
+ if (!RemoteAddress)
+ {
+ MsafdReturnWithErrno(STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL);
+ return INVALID_SOCKET;
+ }
+
/* Set up Address in SOCKADDR Format */
RtlCopyMemory (RemoteAddress,
&ListenReceiveData->Address.Address[0].AddressType,
@@ -1096,6 +1130,10 @@ WSPAccept(SOCKET Handle,
{
/* Allocate Buffer for Callee Data */
CalleeDataBuffer = HeapAlloc(GlobalHeap, 0, 4096);
+ if (!CalleeDataBuffer) {
+ MsafdReturnWithErrno( STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL );
+ return INVALID_SOCKET;
+ }
CalleeData.buf = CalleeDataBuffer;
CalleeData.len = 4096;
}
@@ -1287,6 +1325,11 @@ WSPConnect(SOCKET Handle,
/* Get the Wildcard Address */
BindAddressLength = Socket->HelperData->MaxWSAddressLength;
BindAddress = HeapAlloc(GetProcessHeap(), 0, BindAddressLength);
+ if (!BindAddress)
+ {
+ MsafdReturnWithErrno( STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL );
+ return INVALID_SOCKET;
+ }
Socket->HelperData->WSHGetWildcardSockaddr (Socket->HelperContext,
BindAddress,
&BindAddressLength);
@@ -1937,7 +1980,10 @@ GetSocketInformation(PSOCKET_INFORMATION Socket,
}
/* Return Information */
- *Ulong = InfoData.Information.Ulong;
+ if (Ulong != NULL)
+ {
+ *Ulong = InfoData.Information.Ulong;
+ }
if (LargeInteger != NULL)
{
*LargeInteger = InfoData.Information.LargeInteger;
@@ -1974,7 +2020,10 @@ SetSocketInformation(PSOCKET_INFORMATION Socket,
InfoData.InformationClass = AfdInformationClass;
/* Set Information */
- InfoData.Information.Ulong = *Ulong;
+ if (Ulong != NULL)
+ {
+ InfoData.Information.Ulong = *Ulong;
+ }
if (LargeInteger != NULL)
{
InfoData.Information.LargeInteger = *LargeInteger;
@@ -2397,7 +2446,7 @@ VOID SockProcessAsyncSelect(PSOCKET_INFORMATION Socket, PASYNC_DATA AsyncData)
if (lNetworkEvents & FD_CLOSE)
{
- AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT;
+ AsyncData->AsyncSelectInfo.Handles[0].Events |= AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT | AFD_EVENT_CLOSE;
}
if (lNetworkEvents & FD_QOS)
@@ -2490,6 +2539,7 @@ SockReenableAsyncSelectEvent (IN PSOCKET_INFORMATION Socket,
/* Wait on new events */
AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(ASYNC_DATA));
+ if (!AsyncData) return;
/* Create the Asynch Thread if Needed */
SockCreateOrReferenceAsyncThread();
@@ -2537,6 +2587,7 @@ DllMain(HANDLE hInstDll,
/* Allocate Heap for 1024 Sockets, can be expanded later */
Sockets = HeapAlloc(GetProcessHeap(), 0, sizeof(PSOCKET_INFORMATION) * 1024);
+ if (!Sockets) return FALSE;
AFD_DbgPrint(MAX_TRACE, ("MSAFD.DLL has been loaded\n"));
diff --git a/reactos/dll/win32/msafd/misc/event.c b/reactos/dll/win32/msafd/misc/event.c
index 9719258eb3d..9a49e31b282 100644
--- a/reactos/dll/win32/msafd/misc/event.c
+++ b/reactos/dll/win32/msafd/misc/event.c
@@ -76,7 +76,7 @@ WSPEventSelect(
}
if (lNetworkEvents & FD_CLOSE) {
- EventSelectInfo.Events |= AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT;
+ EventSelectInfo.Events |= AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT | AFD_EVENT_CLOSE;
}
if (lNetworkEvents & FD_QOS) {
@@ -206,7 +206,7 @@ WSPEnumNetworkEvents(
}
if (EnumReq.PollEvents &
- (AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT)) {
+ (AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT | AFD_EVENT_CLOSE)) {
lpNetworkEvents->lNetworkEvents |= FD_CLOSE;
}
diff --git a/reactos/dll/win32/msafd/misc/sndrcv.c b/reactos/dll/win32/msafd/misc/sndrcv.c
index bb77f637cd2..670cfa7d044 100644
--- a/reactos/dll/win32/msafd/misc/sndrcv.c
+++ b/reactos/dll/win32/msafd/misc/sndrcv.c
@@ -32,6 +32,11 @@ WSPAsyncSelect(IN SOCKET Handle,
/* Allocate the Async Data Structure to pass on to the Thread later */
AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(*AsyncData));
+ if (!AsyncData)
+ {
+ MsafdReturnWithErrno( STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL );
+ return INVALID_SOCKET;
+ }
/* Change the Socket to Non Blocking */
BlockMode = 1;
@@ -533,6 +538,11 @@ WSPSendTo(SOCKET Handle,
/* Get the Wildcard Address */
BindAddressLength = Socket->HelperData->MaxWSAddressLength;
BindAddress = HeapAlloc(GlobalHeap, 0, BindAddressLength);
+ if (!BindAddress)
+ {
+ MsafdReturnWithErrno( STATUS_INSUFFICIENT_RESOURCES, lpErrno, 0, NULL );
+ return INVALID_SOCKET;
+ }
Socket->HelperData->WSHGetWildcardSockaddr (Socket->HelperContext,
BindAddress,
&BindAddressLength);
diff --git a/reactos/dll/win32/msafd/msafd.h b/reactos/dll/win32/msafd/msafd.h
index 48ef099e026..fbef176ab47 100755
--- a/reactos/dll/win32/msafd/msafd.h
+++ b/reactos/dll/win32/msafd/msafd.h
@@ -11,8 +11,8 @@
#include
#define WIN32_NO_STATUS
-#include
#include
+#include
#include
#define NTOS_MODE_USER
#include
diff --git a/reactos/dll/win32/msctf/compartmentmgr.c b/reactos/dll/win32/msctf/compartmentmgr.c
new file mode 100644
index 00000000000..06a691d9967
--- /dev/null
+++ b/reactos/dll/win32/msctf/compartmentmgr.c
@@ -0,0 +1,660 @@
+/*
+ * ITfCompartmentMgr implementation
+ *
+ * Copyright 2009 Aric Stewart, 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
+
+#define COBJMACROS
+
+#include "wine/debug.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "winuser.h"
+#include "shlwapi.h"
+#include "winerror.h"
+#include "objbase.h"
+#include "oleauto.h"
+#include "olectl.h"
+
+#include "wine/unicode.h"
+#include "wine/list.h"
+
+#include "msctf.h"
+#include "msctf_internal.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(msctf);
+
+typedef struct tagCompartmentValue {
+ struct list entry;
+ GUID guid;
+ TfClientId owner;
+ ITfCompartment *compartment;
+} CompartmentValue;
+
+typedef struct tagCompartmentMgr {
+ const ITfCompartmentMgrVtbl *CompartmentMgrVtbl;
+ LONG refCount;
+
+ IUnknown *pUnkOuter;
+
+ struct list values;
+} CompartmentMgr;
+
+typedef struct tagCompartmentEnumGuid {
+ const IEnumGUIDVtbl *Vtbl;
+ LONG refCount;
+
+ struct list *values;
+ struct list *cursor;
+} CompartmentEnumGuid;
+
+
+typedef struct tagCompartmentSink {
+ struct list entry;
+ union {
+ IUnknown *pIUnknown;
+ ITfCompartmentEventSink *pITfCompartmentEventSink;
+ } interfaces;
+} CompartmentSink;
+
+typedef struct tagCompartment {
+ const ITfCompartmentVtbl *Vtbl;
+ const ITfSourceVtbl *SourceVtbl;
+ LONG refCount;
+
+ /* Only VT_I4, VT_UNKNOWN and VT_BSTR data types are allowed */
+ VARIANT variant;
+ CompartmentValue *valueData;
+ struct list CompartmentEventSink;
+} Compartment;
+
+static HRESULT CompartmentEnumGuid_Constructor(struct list* values, IEnumGUID **ppOut);
+static HRESULT Compartment_Constructor(CompartmentValue *value, ITfCompartment **ppOut);
+
+static inline Compartment *impl_from_ITfSourceVtbl(ITfSource *iface)
+{
+ return (Compartment *)((char *)iface - FIELD_OFFSET(Compartment,SourceVtbl));
+}
+
+HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *iface)
+{
+ CompartmentMgr *This = (CompartmentMgr *)iface;
+ struct list *cursor, *cursor2;
+
+ LIST_FOR_EACH_SAFE(cursor, cursor2, &This->values)
+ {
+ CompartmentValue* value = LIST_ENTRY(cursor,CompartmentValue,entry);
+ list_remove(cursor);
+ ITfCompartment_Release(value->compartment);
+ HeapFree(GetProcessHeap(),0,value);
+ }
+
+ HeapFree(GetProcessHeap(),0,This);
+ return S_OK;
+}
+
+/*****************************************************
+ * ITfCompartmentMgr functions
+ *****************************************************/
+static HRESULT WINAPI CompartmentMgr_QueryInterface(ITfCompartmentMgr *iface, REFIID iid, LPVOID *ppvOut)
+{
+ CompartmentMgr *This = (CompartmentMgr *)iface;
+ if (This->pUnkOuter)
+ return IUnknown_QueryInterface(This->pUnkOuter, iid, *ppvOut);
+ else
+ {
+ *ppvOut = NULL;
+
+ if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfCompartmentMgr))
+ {
+ *ppvOut = This;
+ }
+
+ if (*ppvOut)
+ {
+ IUnknown_AddRef(iface);
+ return S_OK;
+ }
+
+ WARN("unsupported interface: %s\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+ }
+}
+
+static ULONG WINAPI CompartmentMgr_AddRef(ITfCompartmentMgr *iface)
+{
+ CompartmentMgr *This = (CompartmentMgr *)iface;
+ if (This->pUnkOuter)
+ return IUnknown_AddRef(This->pUnkOuter);
+ else
+ return InterlockedIncrement(&This->refCount);
+}
+
+static ULONG WINAPI CompartmentMgr_Release(ITfCompartmentMgr *iface)
+{
+ CompartmentMgr *This = (CompartmentMgr *)iface;
+ if (This->pUnkOuter)
+ return IUnknown_Release(This->pUnkOuter);
+ else
+ {
+ ULONG ret;
+
+ ret = InterlockedDecrement(&This->refCount);
+ if (ret == 0)
+ CompartmentMgr_Destructor(iface);
+ return ret;
+ }
+}
+
+static HRESULT WINAPI CompartmentMgr_GetCompartment(ITfCompartmentMgr *iface,
+ REFGUID rguid, ITfCompartment **ppcomp)
+{
+ CompartmentMgr *This = (CompartmentMgr *)iface;
+ CompartmentValue* value;
+ struct list *cursor;
+ HRESULT hr;
+
+ TRACE("(%p) %s %p\n",This,debugstr_guid(rguid),ppcomp);
+
+ LIST_FOR_EACH(cursor, &This->values)
+ {
+ value = LIST_ENTRY(cursor,CompartmentValue,entry);
+ if (IsEqualGUID(rguid,&value->guid))
+ {
+ ITfCompartment_AddRef(value->compartment);
+ *ppcomp = value->compartment;
+ return S_OK;
+ }
+ }
+
+ value = HeapAlloc(GetProcessHeap(),0,sizeof(CompartmentValue));
+ value->guid = *rguid;
+ value->owner = 0;
+ hr = Compartment_Constructor(value,&value->compartment);
+ if (SUCCEEDED(hr))
+ {
+ list_add_head(&This->values,&value->entry);
+ ITfCompartment_AddRef(value->compartment);
+ *ppcomp = value->compartment;
+ }
+ else
+ {
+ HeapFree(GetProcessHeap(),0,value);
+ *ppcomp = NULL;
+ }
+ return hr;
+}
+
+static HRESULT WINAPI CompartmentMgr_ClearCompartment(ITfCompartmentMgr *iface,
+ TfClientId tid, REFGUID rguid)
+{
+ struct list *cursor;
+ CompartmentMgr *This = (CompartmentMgr *)iface;
+ TRACE("(%p) %i %s\n",This,tid,debugstr_guid(rguid));
+
+ LIST_FOR_EACH(cursor, &This->values)
+ {
+ CompartmentValue* value = LIST_ENTRY(cursor,CompartmentValue,entry);
+ if (IsEqualGUID(rguid,&value->guid))
+ {
+ if (value->owner && tid != value->owner)
+ return E_UNEXPECTED;
+ list_remove(cursor);
+ ITfCompartment_Release(value->compartment);
+ HeapFree(GetProcessHeap(),0,value);
+ return S_OK;
+ }
+ }
+
+ return CONNECT_E_NOCONNECTION;
+}
+
+static HRESULT WINAPI CompartmentMgr_EnumCompartments(ITfCompartmentMgr *iface,
+ IEnumGUID **ppEnum)
+{
+ CompartmentMgr *This = (CompartmentMgr *)iface;
+ TRACE("(%p) %p\n",This,ppEnum);
+ if (!ppEnum)
+ return E_INVALIDARG;
+ return CompartmentEnumGuid_Constructor(&This->values, ppEnum);
+}
+
+static const ITfCompartmentMgrVtbl CompartmentMgr_CompartmentMgrVtbl =
+{
+ CompartmentMgr_QueryInterface,
+ CompartmentMgr_AddRef,
+ CompartmentMgr_Release,
+
+ CompartmentMgr_GetCompartment,
+ CompartmentMgr_ClearCompartment,
+ CompartmentMgr_EnumCompartments
+};
+
+HRESULT CompartmentMgr_Constructor(IUnknown *pUnkOuter, REFIID riid, IUnknown **ppOut)
+{
+ CompartmentMgr *This;
+
+ if (!ppOut)
+ return E_POINTER;
+
+ if (pUnkOuter && !IsEqualIID (riid, &IID_IUnknown))
+ return CLASS_E_NOAGGREGATION;
+
+ This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CompartmentMgr));
+ if (This == NULL)
+ return E_OUTOFMEMORY;
+
+ This->CompartmentMgrVtbl = &CompartmentMgr_CompartmentMgrVtbl;
+ This->pUnkOuter = pUnkOuter;
+ list_init(&This->values);
+
+ if (pUnkOuter)
+ {
+ TRACE("returning %p\n", This);
+ *ppOut = (IUnknown*)This;
+ return S_OK;
+ }
+ else
+ {
+ HRESULT hr;
+ hr = IUnknown_QueryInterface((IUnknown*)This, riid, (LPVOID*)ppOut);
+ if (FAILED(hr))
+ HeapFree(GetProcessHeap(),0,This);
+ return hr;
+ }
+}
+
+/**************************************************
+ * IEnumGUID implementaion for ITfCompartmentMgr::EnumCompartments
+ **************************************************/
+static void CompartmentEnumGuid_Destructor(CompartmentEnumGuid *This)
+{
+ TRACE("destroying %p\n", This);
+ HeapFree(GetProcessHeap(),0,This);
+}
+
+static HRESULT WINAPI CompartmentEnumGuid_QueryInterface(IEnumGUID *iface, REFIID iid, LPVOID *ppvOut)
+{
+ CompartmentEnumGuid *This = (CompartmentEnumGuid *)iface;
+ *ppvOut = NULL;
+
+ if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IEnumGUID))
+ {
+ *ppvOut = This;
+ }
+
+ if (*ppvOut)
+ {
+ IUnknown_AddRef(iface);
+ return S_OK;
+ }
+
+ WARN("unsupported interface: %s\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI CompartmentEnumGuid_AddRef(IEnumGUID *iface)
+{
+ CompartmentEnumGuid *This = (CompartmentEnumGuid*)iface;
+ return InterlockedIncrement(&This->refCount);
+}
+
+static ULONG WINAPI CompartmentEnumGuid_Release(IEnumGUID *iface)
+{
+ CompartmentEnumGuid *This = (CompartmentEnumGuid *)iface;
+ ULONG ret;
+
+ ret = InterlockedDecrement(&This->refCount);
+ if (ret == 0)
+ CompartmentEnumGuid_Destructor(This);
+ return ret;
+}
+
+/*****************************************************
+ * IEnumGuid functions
+ *****************************************************/
+static HRESULT WINAPI CompartmentEnumGuid_Next( LPENUMGUID iface,
+ ULONG celt, GUID *rgelt, ULONG *pceltFetched)
+{
+ CompartmentEnumGuid *This = (CompartmentEnumGuid *)iface;
+ ULONG fetched = 0;
+
+ TRACE("(%p)\n",This);
+
+ if (rgelt == NULL) return E_POINTER;
+
+ while (fetched < celt && This->cursor)
+ {
+ CompartmentValue* value = LIST_ENTRY(This->cursor,CompartmentValue,entry);
+ if (!value)
+ break;
+
+ This->cursor = list_next(This->values,This->cursor);
+ *rgelt = value->guid;
+
+ ++fetched;
+ ++rgelt;
+ }
+
+ if (pceltFetched) *pceltFetched = fetched;
+ return fetched == celt ? S_OK : S_FALSE;
+}
+
+static HRESULT WINAPI CompartmentEnumGuid_Skip( LPENUMGUID iface, ULONG celt)
+{
+ CompartmentEnumGuid *This = (CompartmentEnumGuid *)iface;
+ TRACE("(%p)\n",This);
+
+ This->cursor = list_next(This->values,This->cursor);
+ return S_OK;
+}
+
+static HRESULT WINAPI CompartmentEnumGuid_Reset( LPENUMGUID iface)
+{
+ CompartmentEnumGuid *This = (CompartmentEnumGuid *)iface;
+ TRACE("(%p)\n",This);
+ This->cursor = list_head(This->values);
+ return S_OK;
+}
+
+static HRESULT WINAPI CompartmentEnumGuid_Clone( LPENUMGUID iface,
+ IEnumGUID **ppenum)
+{
+ CompartmentEnumGuid *This = (CompartmentEnumGuid *)iface;
+ HRESULT res;
+
+ TRACE("(%p)\n",This);
+
+ if (ppenum == NULL) return E_POINTER;
+
+ res = CompartmentEnumGuid_Constructor(This->values, ppenum);
+ if (SUCCEEDED(res))
+ {
+ CompartmentEnumGuid *new_This = (CompartmentEnumGuid *)*ppenum;
+ new_This->cursor = This->cursor;
+ }
+ return res;
+}
+
+static const IEnumGUIDVtbl IEnumGUID_Vtbl ={
+ CompartmentEnumGuid_QueryInterface,
+ CompartmentEnumGuid_AddRef,
+ CompartmentEnumGuid_Release,
+
+ CompartmentEnumGuid_Next,
+ CompartmentEnumGuid_Skip,
+ CompartmentEnumGuid_Reset,
+ CompartmentEnumGuid_Clone
+};
+
+static HRESULT CompartmentEnumGuid_Constructor(struct list *values, IEnumGUID **ppOut)
+{
+ CompartmentEnumGuid *This;
+
+ This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CompartmentEnumGuid));
+ if (This == NULL)
+ return E_OUTOFMEMORY;
+
+ This->Vtbl= &IEnumGUID_Vtbl;
+ This->refCount = 1;
+
+ This->values = values;
+ This->cursor = list_head(values);
+
+ TRACE("returning %p\n", This);
+ *ppOut = (IEnumGUID*)This;
+ return S_OK;
+}
+
+/**************************************************
+ * ITfCompartment
+ **************************************************/
+static void free_sink(CompartmentSink *sink)
+{
+ IUnknown_Release(sink->interfaces.pIUnknown);
+ HeapFree(GetProcessHeap(),0,sink);
+}
+
+static void Compartment_Destructor(Compartment *This)
+{
+ struct list *cursor, *cursor2;
+ TRACE("destroying %p\n", This);
+ VariantClear(&This->variant);
+ LIST_FOR_EACH_SAFE(cursor, cursor2, &This->CompartmentEventSink)
+ {
+ CompartmentSink* sink = LIST_ENTRY(cursor,CompartmentSink,entry);
+ list_remove(cursor);
+ free_sink(sink);
+ }
+ HeapFree(GetProcessHeap(),0,This);
+}
+
+static HRESULT WINAPI Compartment_QueryInterface(ITfCompartment *iface, REFIID iid, LPVOID *ppvOut)
+{
+ Compartment *This = (Compartment *)iface;
+ *ppvOut = NULL;
+
+ if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfCompartment))
+ {
+ *ppvOut = This;
+ }
+ else if (IsEqualIID(iid, &IID_ITfSource))
+ {
+ *ppvOut = &This->SourceVtbl;
+ }
+
+ if (*ppvOut)
+ {
+ IUnknown_AddRef(iface);
+ return S_OK;
+ }
+
+ WARN("unsupported interface: %s\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI Compartment_AddRef(ITfCompartment *iface)
+{
+ Compartment *This = (Compartment*)iface;
+ return InterlockedIncrement(&This->refCount);
+}
+
+static ULONG WINAPI Compartment_Release(ITfCompartment *iface)
+{
+ Compartment *This = (Compartment *)iface;
+ ULONG ret;
+
+ ret = InterlockedDecrement(&This->refCount);
+ if (ret == 0)
+ Compartment_Destructor(This);
+ return ret;
+}
+
+static HRESULT WINAPI Compartment_SetValue(ITfCompartment *iface,
+ TfClientId tid, const VARIANT *pvarValue)
+{
+ Compartment *This = (Compartment *)iface;
+ struct list *cursor;
+
+ TRACE("(%p) %i %p\n",This,tid,pvarValue);
+
+ if (!pvarValue)
+ return E_INVALIDARG;
+
+ if (!(V_VT(pvarValue) == VT_BSTR || V_VT(pvarValue) == VT_I4 ||
+ V_VT(pvarValue) == VT_UNKNOWN))
+ return E_INVALIDARG;
+
+ if (!This->valueData->owner)
+ This->valueData->owner = tid;
+
+ VariantClear(&This->variant);
+
+ /* Shallow copy of value and type */
+ This->variant = *pvarValue;
+
+ if (V_VT(pvarValue) == VT_BSTR)
+ V_BSTR(&This->variant) = SysAllocStringByteLen((char*)V_BSTR(pvarValue),
+ SysStringByteLen(V_BSTR(pvarValue)));
+ else if (V_VT(pvarValue) == VT_UNKNOWN)
+ IUnknown_AddRef(V_UNKNOWN(&This->variant));
+
+ LIST_FOR_EACH(cursor, &This->CompartmentEventSink)
+ {
+ CompartmentSink* sink = LIST_ENTRY(cursor,CompartmentSink,entry);
+ ITfCompartmentEventSink_OnChange(sink->interfaces.pITfCompartmentEventSink,&This->valueData->guid);
+ }
+
+ return S_OK;
+}
+
+static HRESULT WINAPI Compartment_GetValue(ITfCompartment *iface,
+ VARIANT *pvarValue)
+{
+ Compartment *This = (Compartment *)iface;
+ TRACE("(%p) %p\n",This, pvarValue);
+
+ if (!pvarValue)
+ return E_INVALIDARG;
+
+ VariantInit(pvarValue);
+ if (V_VT(&This->variant) == VT_EMPTY) return S_FALSE;
+ return VariantCopy(pvarValue,&This->variant);
+}
+
+static const ITfCompartmentVtbl ITfCompartment_Vtbl ={
+ Compartment_QueryInterface,
+ Compartment_AddRef,
+ Compartment_Release,
+
+ Compartment_SetValue,
+ Compartment_GetValue
+};
+
+/*****************************************************
+ * ITfSource functions
+ *****************************************************/
+
+static HRESULT WINAPI Source_QueryInterface(ITfSource *iface, REFIID iid, LPVOID *ppvOut)
+{
+ Compartment *This = impl_from_ITfSourceVtbl(iface);
+ return Compartment_QueryInterface((ITfCompartment *)This, iid, *ppvOut);
+}
+
+static ULONG WINAPI Source_AddRef(ITfSource *iface)
+{
+ Compartment *This = impl_from_ITfSourceVtbl(iface);
+ return Compartment_AddRef((ITfCompartment*)This);
+}
+
+static ULONG WINAPI Source_Release(ITfSource *iface)
+{
+ Compartment *This = impl_from_ITfSourceVtbl(iface);
+ return Compartment_Release((ITfCompartment *)This);
+}
+
+static WINAPI HRESULT CompartmentSource_AdviseSink(ITfSource *iface,
+ REFIID riid, IUnknown *punk, DWORD *pdwCookie)
+{
+ CompartmentSink *cs;
+ Compartment *This = impl_from_ITfSourceVtbl(iface);
+
+ TRACE("(%p) %s %p %p\n",This,debugstr_guid(riid),punk,pdwCookie);
+
+ if (!riid || !punk || !pdwCookie)
+ return E_INVALIDARG;
+
+ if (IsEqualIID(riid, &IID_ITfCompartmentEventSink))
+ {
+ cs = HeapAlloc(GetProcessHeap(),0,sizeof(CompartmentSink));
+ if (!cs)
+ return E_OUTOFMEMORY;
+ if (FAILED(IUnknown_QueryInterface(punk, riid, (LPVOID *)&cs->interfaces.pITfCompartmentEventSink)))
+ {
+ HeapFree(GetProcessHeap(),0,cs);
+ return CONNECT_E_CANNOTCONNECT;
+ }
+ list_add_head(&This->CompartmentEventSink,&cs->entry);
+ *pdwCookie = generate_Cookie(COOKIE_MAGIC_COMPARTMENTSINK , cs);
+ }
+ else
+ {
+ FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid));
+ return E_NOTIMPL;
+ }
+
+ TRACE("cookie %x\n",*pdwCookie);
+
+ return S_OK;
+}
+
+static WINAPI HRESULT CompartmentSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie)
+{
+ CompartmentSink *sink;
+ Compartment *This = impl_from_ITfSourceVtbl(iface);
+
+ TRACE("(%p) %x\n",This,pdwCookie);
+
+ if (get_Cookie_magic(pdwCookie)!=COOKIE_MAGIC_COMPARTMENTSINK)
+ return E_INVALIDARG;
+
+ sink = (CompartmentSink*)remove_Cookie(pdwCookie);
+ if (!sink)
+ return CONNECT_E_NOCONNECTION;
+
+ list_remove(&sink->entry);
+ free_sink(sink);
+
+ return S_OK;
+}
+
+static const ITfSourceVtbl Compartment_SourceVtbl =
+{
+ Source_QueryInterface,
+ Source_AddRef,
+ Source_Release,
+
+ CompartmentSource_AdviseSink,
+ CompartmentSource_UnadviseSink,
+};
+
+static HRESULT Compartment_Constructor(CompartmentValue *valueData, ITfCompartment **ppOut)
+{
+ Compartment *This;
+
+ This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(Compartment));
+ if (This == NULL)
+ return E_OUTOFMEMORY;
+
+ This->Vtbl= &ITfCompartment_Vtbl;
+ This->SourceVtbl = &Compartment_SourceVtbl;
+ This->refCount = 1;
+
+ This->valueData = valueData;
+ VariantInit(&This->variant);
+
+ list_init(&This->CompartmentEventSink);
+
+ TRACE("returning %p\n", This);
+ *ppOut = (ITfCompartment*)This;
+ return S_OK;
+}
diff --git a/reactos/dll/win32/msctf/context.c b/reactos/dll/win32/msctf/context.c
index 8e14a722552..c13235c7783 100644
--- a/reactos/dll/win32/msctf/context.c
+++ b/reactos/dll/win32/msctf/context.c
@@ -61,15 +61,20 @@ typedef struct tagContext {
/* const ITfContextCompositionVtbl *ContextCompositionVtbl; */
/* const ITfContextOwnerCompositionServicesVtbl *ContextOwnerCompositionServicesVtbl; */
/* const ITfContextOwnerServicesVtbl *ContextOwnerServicesVtbl; */
- /* const ITfInsertAtSelectionVtbl *InsertAtSelectionVtbl; */
+ const ITfInsertAtSelectionVtbl *InsertAtSelectionVtbl;
/* const ITfMouseTrackerVtbl *MouseTrackerVtbl; */
/* const ITfQueryEmbeddedVtbl *QueryEmbeddedVtbl; */
- /* const ITfSourceSingleVtbl *SourceSingleVtbl; */
+ const ITfSourceSingleVtbl *SourceSingleVtbl;
LONG refCount;
BOOL connected;
+ /* Aggregation */
+ ITfCompartmentMgr *CompartmentMgr;
+
TfClientId tidOwner;
TfEditCookie defaultCookie;
+ TS_STATUS documentStatus;
+ ITfDocumentMgr *manager;
ITextStoreACP *pITextStoreACP;
ITfContextOwnerCompositionSink *pITfContextOwnerCompositionSink;
@@ -107,6 +112,16 @@ static inline Context *impl_from_ITfSourceVtbl(ITfSource *iface)
return (Context *)((char *)iface - FIELD_OFFSET(Context,SourceVtbl));
}
+static inline Context *impl_from_ITfInsertAtSelectionVtbl(ITfInsertAtSelection*iface)
+{
+ return (Context *)((char *)iface - FIELD_OFFSET(Context,InsertAtSelectionVtbl));
+}
+
+static inline Context *impl_from_ITfSourceSingleVtbl(ITfSourceSingle* iface)
+{
+ return (Context *)((char *)iface - FIELD_OFFSET(Context,SourceSingleVtbl));
+}
+
static void free_sink(ContextSink *sink)
{
IUnknown_Release(sink->interfaces.pIUnknown);
@@ -169,6 +184,7 @@ static void Context_Destructor(Context *This)
free_sink(sink);
}
+ CompartmentMgr_Destructor(This->CompartmentMgr);
HeapFree(GetProcessHeap(),0,This);
}
@@ -185,6 +201,18 @@ static HRESULT WINAPI Context_QueryInterface(ITfContext *iface, REFIID iid, LPVO
{
*ppvOut = &This->SourceVtbl;
}
+ else if (IsEqualIID(iid, &IID_ITfInsertAtSelection))
+ {
+ *ppvOut = &This->InsertAtSelectionVtbl;
+ }
+ else if (IsEqualIID(iid, &IID_ITfCompartmentMgr))
+ {
+ *ppvOut = This->CompartmentMgr;
+ }
+ else if (IsEqualIID(iid, &IID_ITfSourceSingle))
+ {
+ *ppvOut = &This->SourceSingleVtbl;
+ }
if (*ppvOut)
{
@@ -223,7 +251,6 @@ static HRESULT WINAPI Context_RequestEditSession (ITfContext *iface,
HRESULT hr;
Context *This = (Context *)iface;
DWORD dwLockFlags = 0x0;
- TS_STATUS status;
TRACE("(%p) %i %p %x %p\n",This, tid, pes, dwFlags, phrSession);
@@ -248,10 +275,10 @@ static HRESULT WINAPI Context_RequestEditSession (ITfContext *iface,
else if (dwFlags & TF_ES_READ)
dwLockFlags |= TS_LF_READ;
- /* TODO: cache this */
- ITextStoreACP_GetStatus(This->pITextStoreACP, &status);
+ if (!This->documentStatus.dwDynamicFlags)
+ ITextStoreACP_GetStatus(This->pITextStoreACP, &This->documentStatus);
- if (((dwFlags & TF_ES_READWRITE) == TF_ES_READWRITE) && (status.dwDynamicFlags & TS_SD_READONLY))
+ if (((dwFlags & TF_ES_READWRITE) == TF_ES_READWRITE) && (This->documentStatus.dwDynamicFlags & TS_SD_READONLY))
{
*phrSession = TS_E_READONLY;
return S_OK;
@@ -263,7 +290,6 @@ static HRESULT WINAPI Context_RequestEditSession (ITfContext *iface,
return E_INVALIDARG;
}
-
hr = ITextStoreACP_RequestLock(This->pITextStoreACP, dwLockFlags, phrSession);
return hr;
@@ -341,9 +367,39 @@ static HRESULT WINAPI Context_GetSelection (ITfContext *iface,
static HRESULT WINAPI Context_SetSelection (ITfContext *iface,
TfEditCookie ec, ULONG ulCount, const TF_SELECTION *pSelection)
{
+ TS_SELECTION_ACP *acp;
Context *This = (Context *)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ INT i;
+ HRESULT hr;
+
+ TRACE("(%p) %i %i %p\n",This,ec,ulCount,pSelection);
+
+ if (!This->pITextStoreACP)
+ {
+ FIXME("Context does not have a ITextStoreACP\n");
+ return E_NOTIMPL;
+ }
+
+ if (get_Cookie_magic(ec)!=COOKIE_MAGIC_EDITCOOKIE)
+ return TF_E_NOLOCK;
+
+ acp = HeapAlloc(GetProcessHeap(), 0, sizeof(TS_SELECTION_ACP) * ulCount);
+ if (!acp)
+ return E_OUTOFMEMORY;
+
+ for (i = 0; i < ulCount; i++)
+ if (FAILED(TF_SELECTION_to_TS_SELECTION_ACP(&pSelection[i], &acp[i])))
+ {
+ TRACE("Selection Conversion Failed\n");
+ HeapFree(GetProcessHeap(), 0 , acp);
+ return E_FAIL;
+ }
+
+ hr = ITextStoreACP_SetSelection(This->pITextStoreACP, ulCount, acp);
+
+ HeapFree(GetProcessHeap(), 0, acp);
+
+ return hr;
}
static HRESULT WINAPI Context_GetStart (ITfContext *iface,
@@ -419,8 +475,25 @@ static HRESULT WINAPI Context_GetStatus (ITfContext *iface,
TF_STATUS *pdcs)
{
Context *This = (Context *)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ TRACE("(%p) %p\n",This,pdcs);
+
+ if (!This->connected)
+ return TF_E_DISCONNECTED;
+
+ if (!pdcs)
+ return E_INVALIDARG;
+
+ if (!This->pITextStoreACP)
+ {
+ FIXME("Context does not have a ITextStoreACP\n");
+ return E_NOTIMPL;
+ }
+
+ ITextStoreACP_GetStatus(This->pITextStoreACP, &This->documentStatus);
+
+ *pdcs = This->documentStatus;
+
+ return S_OK;
}
static HRESULT WINAPI Context_GetProperty (ITfContext *iface,
@@ -460,8 +533,18 @@ static HRESULT WINAPI Context_GetDocumentMgr (ITfContext *iface,
ITfDocumentMgr **ppDm)
{
Context *This = (Context *)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ TRACE("(%p) %p\n",This,ppDm);
+
+ if (!ppDm)
+ return E_INVALIDARG;
+
+ *ppDm = This->manager;
+ if (!This->manager)
+ return S_FALSE;
+
+ ITfDocumentMgr_AddRef(This->manager);
+
+ return S_OK;
}
static HRESULT WINAPI Context_CreateRangeBackup (ITfContext *iface,
@@ -579,7 +662,130 @@ static const ITfSourceVtbl Context_SourceVtbl =
ContextSource_UnadviseSink,
};
-HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **ppOut, TfEditCookie *pecTextStore)
+/*****************************************************
+ * ITfInsertAtSelection functions
+ *****************************************************/
+static HRESULT WINAPI InsertAtSelection_QueryInterface(ITfInsertAtSelection *iface, REFIID iid, LPVOID *ppvOut)
+{
+ Context *This = impl_from_ITfInsertAtSelectionVtbl(iface);
+ return Context_QueryInterface((ITfContext *)This, iid, *ppvOut);
+}
+
+static ULONG WINAPI InsertAtSelection_AddRef(ITfInsertAtSelection *iface)
+{
+ Context *This = impl_from_ITfInsertAtSelectionVtbl(iface);
+ return Context_AddRef((ITfContext *)This);
+}
+
+static ULONG WINAPI InsertAtSelection_Release(ITfInsertAtSelection *iface)
+{
+ Context *This = impl_from_ITfInsertAtSelectionVtbl(iface);
+ return Context_Release((ITfContext *)This);
+}
+
+static WINAPI HRESULT InsertAtSelection_InsertTextAtSelection(
+ ITfInsertAtSelection *iface, TfEditCookie ec, DWORD dwFlags,
+ const WCHAR *pchText, LONG cch, ITfRange **ppRange)
+{
+ Context *This = impl_from_ITfInsertAtSelectionVtbl(iface);
+ EditCookie *cookie;
+ LONG acpStart, acpEnd;
+ TS_TEXTCHANGE change;
+ HRESULT hr;
+
+ TRACE("(%p) %i %x %s %p\n",This, ec, dwFlags, debugstr_wn(pchText,cch), ppRange);
+
+ if (!This->connected)
+ return TF_E_DISCONNECTED;
+
+ if (get_Cookie_magic(ec)!=COOKIE_MAGIC_EDITCOOKIE)
+ return TF_E_NOLOCK;
+
+ cookie = get_Cookie_data(ec);
+
+ if ((cookie->lockType & TS_LF_READWRITE) != TS_LF_READWRITE )
+ return TS_E_READONLY;
+
+ if (!This->pITextStoreACP)
+ {
+ FIXME("Context does not have a ITextStoreACP\n");
+ return E_NOTIMPL;
+ }
+
+ hr = ITextStoreACP_InsertTextAtSelection(This->pITextStoreACP, dwFlags, pchText, cch, &acpStart, &acpEnd, &change);
+ if (SUCCEEDED(hr))
+ Range_Constructor((ITfContext*)This, This->pITextStoreACP, cookie->lockType, change.acpStart, change.acpNewEnd, ppRange);
+
+ return hr;
+}
+
+static WINAPI HRESULT InsertAtSelection_InsertEmbeddedAtSelection(
+ ITfInsertAtSelection *iface, TfEditCookie ec, DWORD dwFlags,
+ IDataObject *pDataObject, ITfRange **ppRange)
+{
+ Context *This = impl_from_ITfInsertAtSelectionVtbl(iface);
+ FIXME("STUB:(%p)\n",This);
+ return E_NOTIMPL;
+}
+
+static const ITfInsertAtSelectionVtbl Context_InsertAtSelectionVtbl =
+{
+ InsertAtSelection_QueryInterface,
+ InsertAtSelection_AddRef,
+ InsertAtSelection_Release,
+
+ InsertAtSelection_InsertTextAtSelection,
+ InsertAtSelection_InsertEmbeddedAtSelection,
+};
+
+/*****************************************************
+ * ITfSourceSingle functions
+ *****************************************************/
+static HRESULT WINAPI SourceSingle_QueryInterface(ITfSourceSingle *iface, REFIID iid, LPVOID *ppvOut)
+{
+ Context *This = impl_from_ITfSourceSingleVtbl(iface);
+ return Context_QueryInterface((ITfContext *)This, iid, *ppvOut);
+}
+
+static ULONG WINAPI SourceSingle_AddRef(ITfSourceSingle *iface)
+{
+ Context *This = impl_from_ITfSourceSingleVtbl(iface);
+ return Context_AddRef((ITfContext *)This);
+}
+
+static ULONG WINAPI SourceSingle_Release(ITfSourceSingle *iface)
+{
+ Context *This = impl_from_ITfSourceSingleVtbl(iface);
+ return Context_Release((ITfContext *)This);
+}
+
+static WINAPI HRESULT SourceSingle_AdviseSingleSink( ITfSourceSingle *iface,
+ TfClientId tid, REFIID riid, IUnknown *punk)
+{
+ Context *This = impl_from_ITfSourceSingleVtbl(iface);
+ FIXME("STUB:(%p) %i %s %p\n",This, tid, debugstr_guid(riid),punk);
+ return E_NOTIMPL;
+}
+
+static WINAPI HRESULT SourceSingle_UnadviseSingleSink( ITfSourceSingle *iface,
+ TfClientId tid, REFIID riid)
+{
+ Context *This = impl_from_ITfSourceSingleVtbl(iface);
+ FIXME("STUB:(%p) %i %s\n",This, tid, debugstr_guid(riid));
+ return E_NOTIMPL;
+}
+
+static const ITfSourceSingleVtbl Context_SourceSingleVtbl =
+{
+ SourceSingle_QueryInterface,
+ SourceSingle_AddRef,
+ SourceSingle_Release,
+
+ SourceSingle_AdviseSingleSink,
+ SourceSingle_UnadviseSingleSink,
+};
+
+HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfDocumentMgr *mgr, ITfContext **ppOut, TfEditCookie *pecTextStore)
{
Context *This;
EditCookie *cookie;
@@ -599,9 +805,14 @@ HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **pp
This->ContextVtbl= &Context_ContextVtbl;
This->SourceVtbl = &Context_SourceVtbl;
+ This->InsertAtSelectionVtbl = &Context_InsertAtSelectionVtbl;
+ This->SourceSingleVtbl = &Context_SourceSingleVtbl;
This->refCount = 1;
This->tidOwner = tidOwner;
This->connected = FALSE;
+ This->manager = mgr;
+
+ CompartmentMgr_Constructor((IUnknown*)This, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr);
cookie->lockType = TF_ES_READ;
cookie->pOwningContext = This;
@@ -633,7 +844,7 @@ HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **pp
return S_OK;
}
-HRESULT Context_Initialize(ITfContext *iface)
+HRESULT Context_Initialize(ITfContext *iface, ITfDocumentMgr *manager)
{
Context *This = (Context *)iface;
@@ -644,6 +855,7 @@ HRESULT Context_Initialize(ITfContext *iface)
(IUnknown*)This->pITextStoreACPSink, TS_AS_ALL_SINKS);
}
This->connected = TRUE;
+ This->manager = manager;
return S_OK;
}
@@ -658,6 +870,7 @@ HRESULT Context_Uninitialize(ITfContext *iface)
This->pITextStoreACPSink = NULL;
}
This->connected = FALSE;
+ This->manager = NULL;
return S_OK;
}
@@ -739,8 +952,28 @@ static HRESULT WINAPI TextStoreACPSink_OnStatusChange(ITextStoreACPSink *iface,
DWORD dwFlags)
{
TextStoreACPSink *This = (TextStoreACPSink *)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ HRESULT hr, hrSession;
+
+ TRACE("(%p) %x\n",This, dwFlags);
+
+ if (!This->pContext)
+ {
+ ERR("No context?\n");
+ return E_FAIL;
+ }
+
+ if (!This->pContext->pITextStoreACP)
+ {
+ FIXME("Context does not have a ITextStoreACP\n");
+ return E_NOTIMPL;
+ }
+
+ hr = ITextStoreACP_RequestLock(This->pContext->pITextStoreACP, TS_LF_READ, &hrSession);
+
+ if(SUCCEEDED(hr) && SUCCEEDED(hrSession))
+ This->pContext->documentStatus.dwDynamicFlags = dwFlags;
+
+ return S_OK;
}
static HRESULT WINAPI TextStoreACPSink_OnAttrsChange(ITextStoreACPSink *iface,
@@ -756,27 +989,57 @@ static HRESULT WINAPI TextStoreACPSink_OnLockGranted(ITextStoreACPSink *iface,
{
TextStoreACPSink *This = (TextStoreACPSink *)iface;
HRESULT hr;
- EditCookie *cookie;
+ EditCookie *cookie,*sinkcookie;
TfEditCookie ec;
+ struct list *cursor;
TRACE("(%p) %x\n",This, dwLockFlags);
- if (!This->pContext || !This->pContext->currentEditSession)
+ if (!This->pContext)
{
- ERR("OnLockGranted called on a context without a current edit session\n");
+ ERR("OnLockGranted called without a context\n");
return E_FAIL;
}
+ if (!This->pContext->currentEditSession)
+ {
+ FIXME("OnLockGranted called for something other than an EditSession\n");
+ return S_OK;
+ }
+
cookie = HeapAlloc(GetProcessHeap(),0,sizeof(EditCookie));
if (!cookie)
return E_OUTOFMEMORY;
+ sinkcookie = HeapAlloc(GetProcessHeap(),0,sizeof(EditCookie));
+ if (!sinkcookie)
+ return E_OUTOFMEMORY;
+
cookie->lockType = dwLockFlags;
cookie->pOwningContext = This->pContext;
ec = generate_Cookie(COOKIE_MAGIC_EDITCOOKIE, cookie);
hr = ITfEditSession_DoEditSession(This->pContext->currentEditSession, ec);
+ if ((dwLockFlags&TS_LF_READWRITE) == TS_LF_READWRITE)
+ {
+ TfEditCookie sc;
+
+ sinkcookie->lockType = TS_LF_READ;
+ sinkcookie->pOwningContext = This->pContext;
+ sc = generate_Cookie(COOKIE_MAGIC_EDITCOOKIE, sinkcookie);
+
+ /*TODO: implement ITfEditRecord */
+ LIST_FOR_EACH(cursor, &This->pContext->pTextEditSink)
+ {
+ ContextSink* sink = LIST_ENTRY(cursor,ContextSink,entry);
+ ITfTextEditSink_OnEndEdit(sink->interfaces.pITfTextEditSink,
+ (ITfContext*) &This->pContext, sc, NULL);
+ }
+ sinkcookie = remove_Cookie(sc);
+ }
+ HeapFree(GetProcessHeap(),0,sinkcookie);
+
ITfEditSession_Release(This->pContext->currentEditSession);
This->pContext->currentEditSession = NULL;
diff --git a/reactos/dll/win32/msctf/documentmgr.c b/reactos/dll/win32/msctf/documentmgr.c
index 7fd354aa1b8..0a25b3d3b67 100644
--- a/reactos/dll/win32/msctf/documentmgr.c
+++ b/reactos/dll/win32/msctf/documentmgr.c
@@ -45,10 +45,23 @@ typedef struct tagDocumentMgr {
const ITfSourceVtbl *SourceVtbl;
LONG refCount;
+ /* Aggregation */
+ ITfCompartmentMgr *CompartmentMgr;
+
ITfContext* contextStack[2]; /* limit of 2 contexts */
ITfThreadMgrEventSink* ThreadMgrSink;
} DocumentMgr;
+typedef struct tagEnumTfContext {
+ const IEnumTfContextsVtbl *Vtbl;
+ LONG refCount;
+
+ DWORD index;
+ DocumentMgr *docmgr;
+} EnumTfContext;
+
+static HRESULT EnumTfContext_Constructor(DocumentMgr* mgr, IEnumTfContexts **ppOut);
+
static inline DocumentMgr *impl_from_ITfSourceVtbl(ITfSource *iface)
{
return (DocumentMgr *)((char *)iface - FIELD_OFFSET(DocumentMgr,SourceVtbl));
@@ -56,11 +69,17 @@ static inline DocumentMgr *impl_from_ITfSourceVtbl(ITfSource *iface)
static void DocumentMgr_Destructor(DocumentMgr *This)
{
+ ITfThreadMgr *tm;
TRACE("destroying %p\n", This);
+
+ TF_GetThreadMgr(&tm);
+ ThreadMgr_OnDocumentMgrDestruction(tm, (ITfDocumentMgr*)This);
+
if (This->contextStack[0])
ITfContext_Release(This->contextStack[0]);
if (This->contextStack[1])
ITfContext_Release(This->contextStack[1]);
+ CompartmentMgr_Destructor(This->CompartmentMgr);
HeapFree(GetProcessHeap(),0,This);
}
@@ -77,6 +96,10 @@ static HRESULT WINAPI DocumentMgr_QueryInterface(ITfDocumentMgr *iface, REFIID i
{
*ppvOut = &This->SourceVtbl;
}
+ else if (IsEqualIID(iid, &IID_ITfCompartmentMgr))
+ {
+ *ppvOut = This->CompartmentMgr;
+ }
if (*ppvOut)
{
@@ -115,7 +138,7 @@ static HRESULT WINAPI DocumentMgr_CreateContext(ITfDocumentMgr *iface,
{
DocumentMgr *This = (DocumentMgr *)iface;
TRACE("(%p) 0x%x 0x%x %p %p %p\n",This,tidOwner,dwFlags,punk,ppic,pecTextStore);
- return Context_Constructor(tidOwner, punk, ppic, pecTextStore);
+ return Context_Constructor(tidOwner, punk, iface, ppic, pecTextStore);
}
static HRESULT WINAPI DocumentMgr_Push(ITfDocumentMgr *iface, ITfContext *pic)
@@ -137,8 +160,8 @@ static HRESULT WINAPI DocumentMgr_Push(ITfDocumentMgr *iface, ITfContext *pic)
This->contextStack[1] = This->contextStack[0];
This->contextStack[0] = check;
+ Context_Initialize(check, iface);
ITfThreadMgrEventSink_OnPushContext(This->ThreadMgrSink,check);
- Context_Initialize(check);
return S_OK;
}
@@ -225,8 +248,8 @@ static HRESULT WINAPI DocumentMgr_GetBase(ITfDocumentMgr *iface, ITfContext **pp
static HRESULT WINAPI DocumentMgr_EnumContexts(ITfDocumentMgr *iface, IEnumTfContexts **ppEnum)
{
DocumentMgr *This = (DocumentMgr *)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ TRACE("(%p) %p\n",This,ppEnum);
+ return EnumTfContext_Constructor(This, ppEnum);
}
static const ITfDocumentMgrVtbl DocumentMgr_DocumentMgrVtbl =
@@ -303,7 +326,148 @@ HRESULT DocumentMgr_Constructor(ITfThreadMgrEventSink *ThreadMgrSink, ITfDocumen
This->refCount = 1;
This->ThreadMgrSink = ThreadMgrSink;
+ CompartmentMgr_Constructor((IUnknown*)This, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr);
+
TRACE("returning %p\n", This);
*ppOut = (ITfDocumentMgr*)This;
return S_OK;
}
+
+/**************************************************
+ * IEnumTfContexts implementaion
+ **************************************************/
+static void EnumTfContext_Destructor(EnumTfContext *This)
+{
+ TRACE("destroying %p\n", This);
+ HeapFree(GetProcessHeap(),0,This);
+}
+
+static HRESULT WINAPI EnumTfContext_QueryInterface(IEnumTfContexts *iface, REFIID iid, LPVOID *ppvOut)
+{
+ EnumTfContext *This = (EnumTfContext *)iface;
+ *ppvOut = NULL;
+
+ if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IEnumTfContexts))
+ {
+ *ppvOut = This;
+ }
+
+ if (*ppvOut)
+ {
+ IUnknown_AddRef(iface);
+ return S_OK;
+ }
+
+ WARN("unsupported interface: %s\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI EnumTfContext_AddRef(IEnumTfContexts *iface)
+{
+ EnumTfContext *This = (EnumTfContext*)iface;
+ return InterlockedIncrement(&This->refCount);
+}
+
+static ULONG WINAPI EnumTfContext_Release(IEnumTfContexts *iface)
+{
+ EnumTfContext *This = (EnumTfContext *)iface;
+ ULONG ret;
+
+ ret = InterlockedDecrement(&This->refCount);
+ if (ret == 0)
+ EnumTfContext_Destructor(This);
+ return ret;
+}
+
+static HRESULT WINAPI EnumTfContext_Next(IEnumTfContexts *iface,
+ ULONG ulCount, ITfContext **rgContext, ULONG *pcFetched)
+{
+ EnumTfContext *This = (EnumTfContext *)iface;
+ ULONG fetched = 0;
+
+ TRACE("(%p)\n",This);
+
+ if (rgContext == NULL) return E_POINTER;
+
+ while (fetched < ulCount)
+ {
+ if (This->index > 1)
+ break;
+
+ if (!This->docmgr->contextStack[This->index])
+ break;
+
+ *rgContext = This->docmgr->contextStack[This->index];
+ ITfContext_AddRef(*rgContext);
+
+ ++This->index;
+ ++fetched;
+ ++rgContext;
+ }
+
+ if (pcFetched) *pcFetched = fetched;
+ return fetched == ulCount ? S_OK : S_FALSE;
+}
+
+static HRESULT WINAPI EnumTfContext_Skip( IEnumTfContexts* iface, ULONG celt)
+{
+ EnumTfContext *This = (EnumTfContext *)iface;
+ TRACE("(%p)\n",This);
+ This->index += celt;
+ return S_OK;
+}
+
+static HRESULT WINAPI EnumTfContext_Reset( IEnumTfContexts* iface)
+{
+ EnumTfContext *This = (EnumTfContext *)iface;
+ TRACE("(%p)\n",This);
+ This->index = 0;
+ return S_OK;
+}
+
+static HRESULT WINAPI EnumTfContext_Clone( IEnumTfContexts *iface,
+ IEnumTfContexts **ppenum)
+{
+ EnumTfContext *This = (EnumTfContext *)iface;
+ HRESULT res;
+
+ TRACE("(%p)\n",This);
+
+ if (ppenum == NULL) return E_POINTER;
+
+ res = EnumTfContext_Constructor(This->docmgr, ppenum);
+ if (SUCCEEDED(res))
+ {
+ EnumTfContext *new_This = (EnumTfContext *)*ppenum;
+ new_This->index = This->index;
+ }
+ return res;
+}
+
+static const IEnumTfContextsVtbl IEnumTfContexts_Vtbl ={
+ EnumTfContext_QueryInterface,
+ EnumTfContext_AddRef,
+ EnumTfContext_Release,
+
+ EnumTfContext_Clone,
+ EnumTfContext_Next,
+ EnumTfContext_Reset,
+ EnumTfContext_Skip
+};
+
+static HRESULT EnumTfContext_Constructor(DocumentMgr *mgr, IEnumTfContexts **ppOut)
+{
+ EnumTfContext *This;
+
+ This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(EnumTfContext));
+ if (This == NULL)
+ return E_OUTOFMEMORY;
+
+ This->Vtbl= &IEnumTfContexts_Vtbl;
+ This->refCount = 1;
+ This->docmgr = mgr;
+
+ TRACE("returning %p\n", This);
+ *ppOut = (IEnumTfContexts*)This;
+ return S_OK;
+}
diff --git a/reactos/dll/win32/msctf/inputprocessor.c b/reactos/dll/win32/msctf/inputprocessor.c
index a904a68b854..0935c4444e2 100644
--- a/reactos/dll/win32/msctf/inputprocessor.c
+++ b/reactos/dll/win32/msctf/inputprocessor.c
@@ -43,10 +43,15 @@
WINE_DEFAULT_DEBUG_CHANNEL(msctf);
static const WCHAR szwLngp[] = {'L','a','n','g','u','a','g','e','P','r','o','f','i','l','e',0};
-static const WCHAR szwEnabled[] = {'E','n','a','b','l','e','d',0};
+static const WCHAR szwEnable[] = {'E','n','a','b','l','e',0};
static const WCHAR szwTipfmt[] = {'%','s','\\','%','s',0};
static const WCHAR szwFullLangfmt[] = {'%','s','\\','%','s','\\','%','s','\\','0','x','%','0','8','x','\\','%','s',0};
+static const WCHAR szwAssemblies[] = {'A','s','s','e','m','b','l','i','e','s',0};
+static const WCHAR szwDefault[] = {'D','e','f','a','u','l','t',0};
+static const WCHAR szwProfile[] = {'P','r','o','f','i','l','e',0};
+static const WCHAR szwDefaultFmt[] = {'%','s','\\','%','s','\\','0','x','%','0','8','x','\\','%','s',0};
+
typedef struct tagInputProcessorProfilesSink {
struct list entry;
union {
@@ -144,7 +149,7 @@ static void add_userkey( REFCLSID rclsid, LANGID langid,
if (!res && disposition == REG_CREATED_NEW_KEY)
{
DWORD zero = 0x0;
- RegSetValueExW(key, szwEnabled, 0, REG_DWORD, (LPBYTE)&zero, sizeof(DWORD));
+ RegSetValueExW(key, szwEnable, 0, REG_DWORD, (LPBYTE)&zero, sizeof(DWORD));
}
if (!res)
@@ -278,7 +283,7 @@ static HRESULT WINAPI InputProcessorProfiles_AddLanguageProfile(
RegSetValueExW(fmtkey, icnf, 0, REG_SZ, (LPBYTE)pchIconFile, cchFile * sizeof(WCHAR));
RegSetValueExW(fmtkey, icni, 0, REG_DWORD, (LPBYTE)&uIconIndex, sizeof(DWORD));
if (disposition == REG_CREATED_NEW_KEY)
- RegSetValueExW(fmtkey, szwEnabled, 0, REG_DWORD, (LPBYTE)&zero, sizeof(DWORD));
+ RegSetValueExW(fmtkey, szwEnable, 0, REG_DWORD, (LPBYTE)&zero, sizeof(DWORD));
RegCloseKey(fmtkey);
add_userkey(rclsid, langid, guidProfile);
@@ -312,18 +317,91 @@ static HRESULT WINAPI InputProcessorProfiles_GetDefaultLanguageProfile(
ITfInputProcessorProfiles *iface, LANGID langid, REFGUID catid,
CLSID *pclsid, GUID *pguidProfile)
{
+ WCHAR fullkey[168];
+ WCHAR buf[39];
+ HKEY hkey;
+ DWORD count;
+ ULONG res;
InputProcessorProfiles *This = (InputProcessorProfiles*)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+
+ TRACE("%p) %x %s %p %p\n",This, langid, debugstr_guid(catid),pclsid,pguidProfile);
+
+ if (!catid || !pclsid || !pguidProfile)
+ return E_INVALIDARG;
+
+ StringFromGUID2(catid, buf, 39);
+ sprintfW(fullkey, szwDefaultFmt, szwSystemCTFKey, szwAssemblies, langid, buf);
+
+ if (RegOpenKeyExW(HKEY_CURRENT_USER, fullkey, 0, KEY_READ | KEY_WRITE,
+ &hkey ) != ERROR_SUCCESS)
+ return S_FALSE;
+
+ count = sizeof(buf);
+ res = RegQueryValueExW(hkey, szwDefault, 0, NULL, (LPBYTE)buf, &count);
+ if (res != ERROR_SUCCESS)
+ {
+ RegCloseKey(hkey);
+ return S_FALSE;
+ }
+ CLSIDFromString(buf,pclsid);
+
+ res = RegQueryValueExW(hkey, szwProfile, 0, NULL, (LPBYTE)buf, &count);
+ if (res == ERROR_SUCCESS)
+ CLSIDFromString(buf,pguidProfile);
+
+ RegCloseKey(hkey);
+
+ return S_OK;
}
static HRESULT WINAPI InputProcessorProfiles_SetDefaultLanguageProfile(
ITfInputProcessorProfiles *iface, LANGID langid, REFCLSID rclsid,
REFGUID guidProfiles)
{
+ WCHAR fullkey[168];
+ WCHAR buf[39];
+ HKEY hkey;
+ GUID catid;
+ HRESULT hr;
+ ITfCategoryMgr *catmgr;
InputProcessorProfiles *This = (InputProcessorProfiles*)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ static const GUID * tipcats[3] = { &GUID_TFCAT_TIP_KEYBOARD,
+ &GUID_TFCAT_TIP_SPEECH,
+ &GUID_TFCAT_TIP_HANDWRITING };
+
+ TRACE("%p) %x %s %s\n",This, langid, debugstr_guid(rclsid),debugstr_guid(guidProfiles));
+
+ if (!rclsid || !guidProfiles)
+ return E_INVALIDARG;
+
+ hr = CategoryMgr_Constructor(NULL,(IUnknown**)&catmgr);
+
+ if (FAILED(hr))
+ return hr;
+
+ if (ITfCategoryMgr_FindClosestCategory(catmgr, rclsid,
+ &catid, tipcats, 3) != S_OK)
+ hr = ITfCategoryMgr_FindClosestCategory(catmgr, rclsid,
+ &catid, NULL, 0);
+ ITfCategoryMgr_Release(catmgr);
+
+ if (FAILED(hr))
+ return E_FAIL;
+
+ StringFromGUID2(&catid, buf, 39);
+ sprintfW(fullkey, szwDefaultFmt, szwSystemCTFKey, szwAssemblies, langid, buf);
+
+ if (RegCreateKeyExW(HKEY_CURRENT_USER, fullkey, 0, NULL, 0, KEY_READ | KEY_WRITE,
+ NULL, &hkey, NULL ) != ERROR_SUCCESS)
+ return E_FAIL;
+
+ StringFromGUID2(rclsid, buf, 39);
+ RegSetValueExW(hkey, szwDefault, 0, REG_SZ, (LPBYTE)buf, sizeof(buf));
+ StringFromGUID2(guidProfiles, buf, 39);
+ RegSetValueExW(hkey, szwProfile, 0, REG_SZ, (LPBYTE)buf, sizeof(buf));
+ RegCloseKey(hkey);
+
+ return S_OK;
}
static HRESULT WINAPI InputProcessorProfiles_ActivateLanguageProfile(
@@ -413,8 +491,22 @@ static HRESULT WINAPI InputProcessorProfiles_GetCurrentLanguage(
static HRESULT WINAPI InputProcessorProfiles_ChangeCurrentLanguage(
ITfInputProcessorProfiles *iface, LANGID langid)
{
+ struct list *cursor;
InputProcessorProfiles *This = (InputProcessorProfiles*)iface;
+ BOOL accept;
+
FIXME("STUB:(%p)\n",This);
+
+ LIST_FOR_EACH(cursor, &This->LanguageProfileNotifySink)
+ {
+ InputProcessorProfilesSink* sink = LIST_ENTRY(cursor,InputProcessorProfilesSink,entry);
+ accept = TRUE;
+ ITfLanguageProfileNotifySink_OnLanguageChange(sink->interfaces.pITfLanguageProfileNotifySink, langid, &accept);
+ if (!accept)
+ return E_FAIL;
+ }
+
+ /* TODO: On successful language change call OnLanguageChanged sink */
return E_NOTIMPL;
}
@@ -422,8 +514,11 @@ static HRESULT WINAPI InputProcessorProfiles_GetLanguageList(
ITfInputProcessorProfiles *iface, LANGID **ppLangId, ULONG *pulCount)
{
InputProcessorProfiles *This = (InputProcessorProfiles*)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ FIXME("Semi-STUB:(%p)\n",This);
+ *ppLangId = CoTaskMemAlloc(sizeof(LANGID));
+ **ppLangId = This->currentLanguage;
+ *pulCount = 1;
+ return S_OK;
}
static HRESULT WINAPI InputProcessorProfiles_EnumLanguageProfiles(
@@ -456,7 +551,7 @@ static HRESULT WINAPI InputProcessorProfiles_EnableLanguageProfile(
if (!res)
{
- RegSetValueExW(key, szwEnabled, 0, REG_DWORD, (LPBYTE)&fEnable, sizeof(DWORD));
+ RegSetValueExW(key, szwEnable, 0, REG_DWORD, (LPBYTE)&fEnable, sizeof(DWORD));
RegCloseKey(key);
}
else
@@ -490,7 +585,7 @@ static HRESULT WINAPI InputProcessorProfiles_IsEnabledLanguageProfile(
if (!res)
{
DWORD count = sizeof(DWORD);
- res = RegQueryValueExW(key, szwEnabled, 0, NULL, (LPBYTE)pfEnable, &count);
+ res = RegQueryValueExW(key, szwEnable, 0, NULL, (LPBYTE)pfEnable, &count);
RegCloseKey(key);
}
@@ -501,7 +596,7 @@ static HRESULT WINAPI InputProcessorProfiles_IsEnabledLanguageProfile(
if (!res)
{
DWORD count = sizeof(DWORD);
- res = RegQueryValueExW(key, szwEnabled, 0, NULL, (LPBYTE)pfEnable, &count);
+ res = RegQueryValueExW(key, szwEnable, 0, NULL, (LPBYTE)pfEnable, &count);
RegCloseKey(key);
}
}
@@ -533,7 +628,7 @@ static HRESULT WINAPI InputProcessorProfiles_EnableLanguageProfileByDefault(
if (!res)
{
- RegSetValueExW(key, szwEnabled, 0, REG_DWORD, (LPBYTE)&fEnable, sizeof(DWORD));
+ RegSetValueExW(key, szwEnable, 0, REG_DWORD, (LPBYTE)&fEnable, sizeof(DWORD));
RegCloseKey(key);
}
else
diff --git a/reactos/dll/win32/msctf/msctf.c b/reactos/dll/win32/msctf/msctf.c
index 675e4d5954c..82772787e41 100644
--- a/reactos/dll/win32/msctf/msctf.c
+++ b/reactos/dll/win32/msctf/msctf.c
@@ -33,7 +33,6 @@
#include "shlwapi.h"
#include "shlguid.h"
#include "comcat.h"
-#include "initguid.h"
#include "msctf.h"
#include "msctf_internal.h"
@@ -74,8 +73,10 @@ static UINT activated = 0;
DWORD tlsIndex = 0;
TfClientId processId = 0;
+ITfCompartmentMgr *globalCompartmentMgr = NULL;
const WCHAR szwSystemTIPKey[] = {'S','O','F','T','W','A','R','E','\\','M','i','c','r','o','s','o','f','t','\\','C','T','F','\\','T','I','P',0};
+const WCHAR szwSystemCTFKey[] = {'S','O','F','T','W','A','R','E','\\','M','i','c','r','o','s','o','f','t','\\','C','T','F',0};
typedef HRESULT (*LPFNCONSTRUCTOR)(IUnknown *pUnkOuter, IUnknown **ppvOut);
@@ -598,3 +599,12 @@ HRESULT WINAPI SetInputScopes(HWND hwnd, const INT *pInputScopes,
return S_OK;
}
+
+/***********************************************************************
+ * TF_CreateInputProcessorProfiles(MSCTF.@)
+ */
+HRESULT WINAPI TF_CreateInputProcessorProfiles(
+ ITfInputProcessorProfiles **ppipr)
+{
+ return InputProcessorProfiles_Constructor(NULL,(IUnknown**)ppipr);
+}
diff --git a/reactos/dll/win32/msctf/msctf.rbuild b/reactos/dll/win32/msctf/msctf.rbuild
index 44664c7c629..e7cea9ceefb 100644
--- a/reactos/dll/win32/msctf/msctf.rbuild
+++ b/reactos/dll/win32/msctf/msctf.rbuild
@@ -9,6 +9,7 @@
0x600
categorymgr.c
+ compartmentmgr.c
context.c
documentmgr.c
inputprocessor.c
@@ -20,12 +21,18 @@
wine
uuid
ole32
+ oleaut32
user32
advapi32
kernel32
+ msctf_local_interface
+ textstor_local_interface
ntdll
msctf_local.idl
+
+ textstor_local.idl
+
diff --git a/reactos/dll/win32/msctf/msctf.spec b/reactos/dll/win32/msctf/msctf.spec
index 1c8bb37a1b4..f7c35a3a64a 100644
--- a/reactos/dll/win32/msctf/msctf.spec
+++ b/reactos/dll/win32/msctf/msctf.spec
@@ -11,7 +11,7 @@
@ stub TF_CreateCategoryMgr
@ stub TF_CreateCicLoadMutex
@ stub TF_CreateDisplayAttributeMgr
-@ stub TF_CreateInputProcessorProfiles
+@ stdcall TF_CreateInputProcessorProfiles(ptr)
@ stub TF_CreateLangBarItemMgr
@ stub TF_CreateLangBarMgr
@ stdcall TF_CreateThreadMgr(ptr)
diff --git a/reactos/dll/win32/msctf/msctf_internal.h b/reactos/dll/win32/msctf/msctf_internal.h
index 9181b8c4f41..3bb0baa6ee7 100644
--- a/reactos/dll/win32/msctf/msctf_internal.h
+++ b/reactos/dll/win32/msctf/msctf_internal.h
@@ -26,19 +26,25 @@
#define COOKIE_MAGIC_GUIDATOM 0x0030
#define COOKIE_MAGIC_IPPSINK 0x0040
#define COOKIE_MAGIC_EDITCOOKIE 0x0050
+#define COOKIE_MAGIC_COMPARTMENTSINK 0x0060
extern DWORD tlsIndex;
extern TfClientId processId;
+extern ITfCompartmentMgr *globalCompartmentMgr;
extern HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut);
extern HRESULT DocumentMgr_Constructor(ITfThreadMgrEventSink*, ITfDocumentMgr **ppOut);
-extern HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **ppOut, TfEditCookie *pecTextStore);
+extern HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfDocumentMgr *mgr, ITfContext **ppOut, TfEditCookie *pecTextStore);
extern HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut);
extern HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut);
extern HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, DWORD lockType, DWORD anchorStart, DWORD anchorEnd, ITfRange **ppOut);
+extern HRESULT CompartmentMgr_Constructor(IUnknown *pUnkOuter, REFIID riid, IUnknown **ppOut);
+extern HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *This);
-extern HRESULT Context_Initialize(ITfContext *cxt);
+extern HRESULT Context_Initialize(ITfContext *cxt, ITfDocumentMgr *manager);
extern HRESULT Context_Uninitialize(ITfContext *cxt);
+extern void ThreadMgr_OnDocumentMgrDestruction(ITfThreadMgr *tm, ITfDocumentMgr *mgr);
+extern HRESULT TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION *tf, TS_SELECTION_ACP *tsAcp);
/* cookie function */
extern DWORD generate_Cookie(DWORD magic, LPVOID data);
@@ -58,4 +64,5 @@ extern HRESULT get_textservice_sink(TfClientId tid, REFCLSID iid, IUnknown** sin
extern HRESULT set_textservice_sink(TfClientId tid, REFCLSID iid, IUnknown* sink);
extern const WCHAR szwSystemTIPKey[];
+extern const WCHAR szwSystemCTFKey[];
#endif /* __WINE_MSCTF_I_H */
diff --git a/reactos/dll/win32/msctf/range.c b/reactos/dll/win32/msctf/range.c
index 63181afdff2..dc9eae15c60 100644
--- a/reactos/dll/win32/msctf/range.c
+++ b/reactos/dll/win32/msctf/range.c
@@ -201,8 +201,21 @@ static HRESULT WINAPI Range_Collapse(ITfRange *iface, TfEditCookie ec,
TfAnchor aPos)
{
Range *This = (Range *)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ TRACE("(%p) %i %i\n",This,ec,aPos);
+
+ switch (aPos)
+ {
+ case TF_ANCHOR_START:
+ This->anchorEnd = This->anchorStart;
+ break;
+ case TF_ANCHOR_END:
+ This->anchorStart = This->anchorEnd;
+ break;
+ default:
+ return E_INVALIDARG;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI Range_IsEqualStart(ITfRange *iface, TfEditCookie ec,
@@ -331,3 +344,21 @@ HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, DWORD l
return S_OK;
}
+
+/* Internal conversion functions */
+
+HRESULT TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION *tf, TS_SELECTION_ACP *tsAcp)
+{
+ Range *This;
+
+ if (!tf || !tsAcp || !tf->range)
+ return E_INVALIDARG;
+
+ This = (Range *)tf->range;
+
+ tsAcp->acpStart = This->anchorStart;
+ tsAcp->acpEnd = This->anchorEnd;
+ tsAcp->style.ase = tf->style.ase;
+ tsAcp->style.fInterimChar = tf->style.fInterimChar;
+ return S_OK;
+}
diff --git a/reactos/dll/win32/msctf/textstor_local.idl b/reactos/dll/win32/msctf/textstor_local.idl
new file mode 100644
index 00000000000..a665b253969
--- /dev/null
+++ b/reactos/dll/win32/msctf/textstor_local.idl
@@ -0,0 +1,2 @@
+
+#include "textstor.idl"
diff --git a/reactos/dll/win32/msctf/threadmgr.c b/reactos/dll/win32/msctf/threadmgr.c
index 9b887f0a24b..0661fec1bcd 100644
--- a/reactos/dll/win32/msctf/threadmgr.c
+++ b/reactos/dll/win32/msctf/threadmgr.c
@@ -65,6 +65,19 @@ typedef struct tagPreservedKey
TfClientId tid;
} PreservedKey;
+typedef struct tagDocumentMgrs
+{
+ struct list entry;
+ ITfDocumentMgr *docmgr;
+} DocumentMgrEntry;
+
+typedef struct tagAssociatedWindow
+{
+ struct list entry;
+ HWND hwnd;
+ ITfDocumentMgr *docmgr;
+} AssociatedWindow;
+
typedef struct tagACLMulti {
const ITfThreadMgrVtbl *ThreadMgrVtbl;
const ITfSourceVtbl *SourceVtbl;
@@ -78,6 +91,9 @@ typedef struct tagACLMulti {
/* const ITfSourceSingleVtbl *SourceSingleVtbl; */
LONG refCount;
+ /* Aggregation */
+ ITfCompartmentMgr *CompartmentMgr;
+
const ITfThreadMgrEventSinkVtbl *ThreadMgrEventSinkVtbl; /* internal */
ITfDocumentMgr *focus;
@@ -87,6 +103,10 @@ typedef struct tagACLMulti {
CLSID forgroundTextService;
struct list CurrentPreservedKeys;
+ struct list CreatedDocumentMgrs;
+
+ struct list AssociatedFocusWindows;
+ HHOOK focusHook;
/* kept as separate lists to reduce unnecessary iterations */
struct list ActiveLanguageProfileNotifySink;
@@ -97,6 +117,17 @@ typedef struct tagACLMulti {
struct list ThreadMgrEventSink;
} ThreadMgr;
+typedef struct tagEnumTfDocumentMgr {
+ const IEnumTfDocumentMgrsVtbl *Vtbl;
+ LONG refCount;
+
+ struct list *index;
+ struct list *head;
+} EnumTfDocumentMgr;
+
+static HRESULT EnumTfDocumentMgr_Constructor(struct list* head, IEnumTfDocumentMgrs **ppOut);
+LRESULT CALLBACK ThreadFocusHookProc(int nCode, WPARAM wParam, LPARAM lParam);
+
static inline ThreadMgr *impl_from_ITfSourceVtbl(ITfSource *iface)
{
return (ThreadMgr *)((char *)iface - FIELD_OFFSET(ThreadMgr,SourceVtbl));
@@ -122,6 +153,22 @@ static inline ThreadMgr *impl_from_ITfThreadMgrEventSink(ITfThreadMgrEventSink *
return (ThreadMgr *)((char *)iface - FIELD_OFFSET(ThreadMgr,ThreadMgrEventSinkVtbl));
}
+static HRESULT SetupWindowsHook(ThreadMgr *This)
+{
+ if (!This->focusHook)
+ {
+ This->focusHook = SetWindowsHookExW(WH_CBT, ThreadFocusHookProc, 0,
+ GetCurrentThreadId());
+ if (!This->focusHook)
+ {
+ ERR("Unable to set focus hook\n");
+ return E_FAIL;
+ }
+ return S_OK;
+ }
+ return S_FALSE;
+}
+
static void free_sink(ThreadMgrSink *sink)
{
IUnknown_Release(sink->interfaces.pIUnknown);
@@ -132,6 +179,10 @@ static void ThreadMgr_Destructor(ThreadMgr *This)
{
struct list *cursor, *cursor2;
+ /* unhook right away */
+ if (This->focusHook)
+ UnhookWindowsHookEx(This->focusHook);
+
TlsSetValue(tlsIndex,NULL);
TRACE("destroying %p\n", This);
if (This->focus)
@@ -183,6 +234,23 @@ static void ThreadMgr_Destructor(ThreadMgr *This)
HeapFree(GetProcessHeap(),0,key);
}
+ LIST_FOR_EACH_SAFE(cursor, cursor2, &This->CreatedDocumentMgrs)
+ {
+ DocumentMgrEntry *mgr = LIST_ENTRY(cursor,DocumentMgrEntry,entry);
+ list_remove(cursor);
+ FIXME("Left Over ITfDocumentMgr. Should we do something with it?\n");
+ HeapFree(GetProcessHeap(),0,mgr);
+ }
+
+ LIST_FOR_EACH_SAFE(cursor, cursor2, &This->AssociatedFocusWindows)
+ {
+ AssociatedWindow *wnd = LIST_ENTRY(cursor,AssociatedWindow,entry);
+ list_remove(cursor);
+ HeapFree(GetProcessHeap(),0,wnd);
+ }
+
+ CompartmentMgr_Destructor(This->CompartmentMgr);
+
HeapFree(GetProcessHeap(),0,This);
}
@@ -211,6 +279,10 @@ static HRESULT WINAPI ThreadMgr_QueryInterface(ITfThreadMgr *iface, REFIID iid,
{
*ppvOut = &This->ClientIdVtbl;
}
+ else if (IsEqualIID(iid, &IID_ITfCompartmentMgr))
+ {
+ *ppvOut = This->CompartmentMgr;
+ }
if (*ppvOut)
{
@@ -294,16 +366,37 @@ static HRESULT WINAPI ThreadMgr_CreateDocumentMgr( ITfThreadMgr* iface, ITfDocum
**ppdim)
{
ThreadMgr *This = (ThreadMgr *)iface;
+ DocumentMgrEntry *mgrentry;
+ HRESULT hr;
+
TRACE("(%p)\n",iface);
- return DocumentMgr_Constructor((ITfThreadMgrEventSink*)&This->ThreadMgrEventSinkVtbl, ppdim);
+ mgrentry = HeapAlloc(GetProcessHeap(),0,sizeof(DocumentMgrEntry));
+ if (mgrentry == NULL)
+ return E_OUTOFMEMORY;
+
+ hr = DocumentMgr_Constructor((ITfThreadMgrEventSink*)&This->ThreadMgrEventSinkVtbl, ppdim);
+
+ if (SUCCEEDED(hr))
+ {
+ mgrentry->docmgr = *ppdim;
+ list_add_head(&This->CreatedDocumentMgrs,&mgrentry->entry);
+ }
+ else
+ HeapFree(GetProcessHeap(),0,mgrentry);
+
+ return hr;
}
static HRESULT WINAPI ThreadMgr_EnumDocumentMgrs( ITfThreadMgr* iface, IEnumTfDocumentMgrs
**ppEnum)
{
ThreadMgr *This = (ThreadMgr *)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ TRACE("(%p) %p\n",This,ppEnum);
+
+ if (!ppEnum)
+ return E_INVALIDARG;
+
+ return EnumTfDocumentMgr_Constructor(&This->CreatedDocumentMgrs, ppEnum);
}
static HRESULT WINAPI ThreadMgr_GetFocus( ITfThreadMgr* iface, ITfDocumentMgr
@@ -334,7 +427,9 @@ static HRESULT WINAPI ThreadMgr_SetFocus( ITfThreadMgr* iface, ITfDocumentMgr *p
TRACE("(%p) %p\n",This,pdimFocus);
- if (!pdimFocus || FAILED(IUnknown_QueryInterface(pdimFocus,&IID_ITfDocumentMgr,(LPVOID*) &check)))
+ if (!pdimFocus)
+ check = NULL;
+ else if (FAILED(IUnknown_QueryInterface(pdimFocus,&IID_ITfDocumentMgr,(LPVOID*) &check)))
return E_INVALIDARG;
ITfThreadMgrEventSink_OnSetFocus((ITfThreadMgrEventSink*)&This->ThreadMgrEventSinkVtbl, check, This->focus);
@@ -349,16 +444,53 @@ static HRESULT WINAPI ThreadMgr_SetFocus( ITfThreadMgr* iface, ITfDocumentMgr *p
static HRESULT WINAPI ThreadMgr_AssociateFocus( ITfThreadMgr* iface, HWND hwnd,
ITfDocumentMgr *pdimNew, ITfDocumentMgr **ppdimPrev)
{
+ struct list *cursor, *cursor2;
ThreadMgr *This = (ThreadMgr *)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ AssociatedWindow *wnd;
+
+ TRACE("(%p) %p %p %p\n",This,hwnd,pdimNew,ppdimPrev);
+
+ if (!ppdimPrev)
+ return E_INVALIDARG;
+
+ *ppdimPrev = NULL;
+
+ LIST_FOR_EACH_SAFE(cursor, cursor2, &This->AssociatedFocusWindows)
+ {
+ wnd = LIST_ENTRY(cursor,AssociatedWindow,entry);
+ if (wnd->hwnd == hwnd)
+ {
+ if (wnd->docmgr)
+ ITfDocumentMgr_AddRef(wnd->docmgr);
+ *ppdimPrev = wnd->docmgr;
+ wnd->docmgr = pdimNew;
+ if (GetFocus() == hwnd)
+ ThreadMgr_SetFocus(iface,pdimNew);
+ return S_OK;
+ }
+ }
+
+ wnd = HeapAlloc(GetProcessHeap(),0,sizeof(AssociatedWindow));
+ wnd->hwnd = hwnd;
+ wnd->docmgr = pdimNew;
+ list_add_head(&This->AssociatedFocusWindows,&wnd->entry);
+
+ if (GetFocus() == hwnd)
+ ThreadMgr_SetFocus(iface,pdimNew);
+
+ SetupWindowsHook(This);
+
+ return S_OK;
}
static HRESULT WINAPI ThreadMgr_IsThreadFocus( ITfThreadMgr* iface, BOOL *pfThreadFocus)
{
+ HWND focus;
ThreadMgr *This = (ThreadMgr *)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ TRACE("(%p) %p\n",This,pfThreadFocus);
+ focus = GetFocus();
+ *pfThreadFocus = (focus == NULL);
+ return S_OK;
}
static HRESULT WINAPI ThreadMgr_GetFunctionProvider( ITfThreadMgr* iface, REFCLSID clsid,
@@ -381,8 +513,22 @@ static HRESULT WINAPI ThreadMgr_GetGlobalCompartment( ITfThreadMgr* iface,
ITfCompartmentMgr **ppCompMgr)
{
ThreadMgr *This = (ThreadMgr *)iface;
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ HRESULT hr;
+ TRACE("(%p) %p\n",This, ppCompMgr);
+
+ if (!ppCompMgr)
+ return E_INVALIDARG;
+
+ if (!globalCompartmentMgr)
+ {
+ hr = CompartmentMgr_Constructor(NULL,&IID_ITfCompartmentMgr,(IUnknown**)&globalCompartmentMgr);
+ if (FAILED(hr))
+ return hr;
+ }
+
+ ITfCompartmentMgr_AddRef(globalCompartmentMgr);
+ *ppCompMgr = globalCompartmentMgr;
+ return S_OK;
}
static const ITfThreadMgrVtbl ThreadMgr_ThreadMgrVtbl =
@@ -1054,7 +1200,11 @@ HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
This->refCount = 1;
TlsSetValue(tlsIndex,This);
+ CompartmentMgr_Constructor((IUnknown*)This, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr);
+
list_init(&This->CurrentPreservedKeys);
+ list_init(&This->CreatedDocumentMgrs);
+ list_init(&This->AssociatedFocusWindows);
list_init(&This->ActiveLanguageProfileNotifySink);
list_init(&This->DisplayAttributeNotifySink);
@@ -1067,3 +1217,200 @@ HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
*ppOut = (IUnknown *)This;
return S_OK;
}
+
+/**************************************************
+ * IEnumTfDocumentMgrs implementaion
+ **************************************************/
+static void EnumTfDocumentMgr_Destructor(EnumTfDocumentMgr *This)
+{
+ TRACE("destroying %p\n", This);
+ HeapFree(GetProcessHeap(),0,This);
+}
+
+static HRESULT WINAPI EnumTfDocumentMgr_QueryInterface(IEnumTfDocumentMgrs *iface, REFIID iid, LPVOID *ppvOut)
+{
+ EnumTfDocumentMgr *This = (EnumTfDocumentMgr *)iface;
+ *ppvOut = NULL;
+
+ if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IEnumTfDocumentMgrs))
+ {
+ *ppvOut = This;
+ }
+
+ if (*ppvOut)
+ {
+ IUnknown_AddRef(iface);
+ return S_OK;
+ }
+
+ WARN("unsupported interface: %s\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI EnumTfDocumentMgr_AddRef(IEnumTfDocumentMgrs *iface)
+{
+ EnumTfDocumentMgr *This = (EnumTfDocumentMgr*)iface;
+ return InterlockedIncrement(&This->refCount);
+}
+
+static ULONG WINAPI EnumTfDocumentMgr_Release(IEnumTfDocumentMgrs *iface)
+{
+ EnumTfDocumentMgr *This = (EnumTfDocumentMgr *)iface;
+ ULONG ret;
+
+ ret = InterlockedDecrement(&This->refCount);
+ if (ret == 0)
+ EnumTfDocumentMgr_Destructor(This);
+ return ret;
+}
+
+static HRESULT WINAPI EnumTfDocumentMgr_Next(IEnumTfDocumentMgrs *iface,
+ ULONG ulCount, ITfDocumentMgr **rgDocumentMgr, ULONG *pcFetched)
+{
+ EnumTfDocumentMgr *This = (EnumTfDocumentMgr *)iface;
+ ULONG fetched = 0;
+
+ TRACE("(%p)\n",This);
+
+ if (rgDocumentMgr == NULL) return E_POINTER;
+
+ while (fetched < ulCount)
+ {
+ DocumentMgrEntry *mgrentry;
+ if (This->index == NULL)
+ break;
+
+ mgrentry = LIST_ENTRY(This->index,DocumentMgrEntry,entry);
+ if (mgrentry == NULL)
+ break;
+
+ *rgDocumentMgr = mgrentry->docmgr;
+ ITfDocumentMgr_AddRef(*rgDocumentMgr);
+
+ This->index = list_next(This->head, This->index);
+ ++fetched;
+ ++rgDocumentMgr;
+ }
+
+ if (pcFetched) *pcFetched = fetched;
+ return fetched == ulCount ? S_OK : S_FALSE;
+}
+
+static HRESULT WINAPI EnumTfDocumentMgr_Skip( IEnumTfDocumentMgrs* iface, ULONG celt)
+{
+ INT i;
+ EnumTfDocumentMgr *This = (EnumTfDocumentMgr *)iface;
+ TRACE("(%p)\n",This);
+ for(i = 0; i < celt && This->index != NULL; i++)
+ This->index = list_next(This->head, This->index);
+ return S_OK;
+}
+
+static HRESULT WINAPI EnumTfDocumentMgr_Reset( IEnumTfDocumentMgrs* iface)
+{
+ EnumTfDocumentMgr *This = (EnumTfDocumentMgr *)iface;
+ TRACE("(%p)\n",This);
+ This->index = list_head(This->head);
+ return S_OK;
+}
+
+static HRESULT WINAPI EnumTfDocumentMgr_Clone( IEnumTfDocumentMgrs *iface,
+ IEnumTfDocumentMgrs **ppenum)
+{
+ EnumTfDocumentMgr *This = (EnumTfDocumentMgr *)iface;
+ HRESULT res;
+
+ TRACE("(%p)\n",This);
+
+ if (ppenum == NULL) return E_POINTER;
+
+ res = EnumTfDocumentMgr_Constructor(This->head, ppenum);
+ if (SUCCEEDED(res))
+ {
+ EnumTfDocumentMgr *new_This = (EnumTfDocumentMgr *)*ppenum;
+ new_This->index = This->index;
+ }
+ return res;
+}
+
+static const IEnumTfDocumentMgrsVtbl IEnumTfDocumentMgrs_Vtbl ={
+ EnumTfDocumentMgr_QueryInterface,
+ EnumTfDocumentMgr_AddRef,
+ EnumTfDocumentMgr_Release,
+
+ EnumTfDocumentMgr_Clone,
+ EnumTfDocumentMgr_Next,
+ EnumTfDocumentMgr_Reset,
+ EnumTfDocumentMgr_Skip
+};
+
+static HRESULT EnumTfDocumentMgr_Constructor(struct list* head, IEnumTfDocumentMgrs **ppOut)
+{
+ EnumTfDocumentMgr *This;
+
+ This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(EnumTfDocumentMgr));
+ if (This == NULL)
+ return E_OUTOFMEMORY;
+
+ This->Vtbl= &IEnumTfDocumentMgrs_Vtbl;
+ This->refCount = 1;
+ This->head = head;
+ This->index = list_head(This->head);
+
+ TRACE("returning %p\n", This);
+ *ppOut = (IEnumTfDocumentMgrs*)This;
+ return S_OK;
+}
+
+void ThreadMgr_OnDocumentMgrDestruction(ITfThreadMgr *tm, ITfDocumentMgr *mgr)
+{
+ ThreadMgr *This = (ThreadMgr *)tm;
+ struct list *cursor;
+ LIST_FOR_EACH(cursor, &This->CreatedDocumentMgrs)
+ {
+ DocumentMgrEntry *mgrentry = LIST_ENTRY(cursor,DocumentMgrEntry,entry);
+ if (mgrentry->docmgr == mgr)
+ {
+ list_remove(cursor);
+ HeapFree(GetProcessHeap(),0,mgrentry);
+ return;
+ }
+ }
+ FIXME("ITfDocumenMgr %p not found in this thread\n",mgr);
+}
+
+LRESULT CALLBACK ThreadFocusHookProc(int nCode, WPARAM wParam, LPARAM lParam)
+{
+ ThreadMgr *This;
+
+ This = TlsGetValue(tlsIndex);
+ if (!This)
+ {
+ ERR("Hook proc but no ThreadMgr for this thread. Serious Error\n");
+ return 0;
+ }
+ if (!This->focusHook)
+ {
+ ERR("Hook proc but no ThreadMgr focus Hook. Serious Error\n");
+ return 0;
+ }
+
+ if (nCode == HCBT_SETFOCUS) /* focus change within our thread */
+ {
+ struct list *cursor;
+
+ LIST_FOR_EACH(cursor, &This->AssociatedFocusWindows)
+ {
+ AssociatedWindow *wnd = LIST_ENTRY(cursor,AssociatedWindow,entry);
+ if (wnd->hwnd == (HWND)wParam)
+ {
+ TRACE("Triggering Associated window focus\n");
+ if (This->focus != wnd->docmgr)
+ ThreadMgr_SetFocus((ITfThreadMgr*)This, wnd->docmgr);
+ break;
+ }
+ }
+ }
+
+ return CallNextHookEx(This->focusHook, nCode, wParam, lParam);
+}
diff --git a/reactos/dll/win32/msgsm32.acm/msgsm32.acm.rbuild b/reactos/dll/win32/msgsm32.acm/msgsm32.acm.rbuild
new file mode 100644
index 00000000000..001d56c99d6
--- /dev/null
+++ b/reactos/dll/win32/msgsm32.acm/msgsm32.acm.rbuild
@@ -0,0 +1,11 @@
+
+
+ .
+ include/reactos/wine
+
+ msgsm32.c
+ wine
+ winmm
+ user32
+ kernel32
+
diff --git a/reactos/dll/win32/msgsm32.acm/msgsm32.acm.spec b/reactos/dll/win32/msgsm32.acm/msgsm32.acm.spec
new file mode 100644
index 00000000000..9275f0dae09
--- /dev/null
+++ b/reactos/dll/win32/msgsm32.acm/msgsm32.acm.spec
@@ -0,0 +1 @@
+@ stdcall -private DriverProc(long long long long long) GSM_DriverProc
diff --git a/reactos/dll/win32/msgsm32.acm/msgsm32.c b/reactos/dll/win32/msgsm32.acm/msgsm32.c
new file mode 100644
index 00000000000..ad86bc1c438
--- /dev/null
+++ b/reactos/dll/win32/msgsm32.acm/msgsm32.c
@@ -0,0 +1,645 @@
+/*
+ * GSM 06.10 codec handling
+ * Copyright (C) 2009 Maarten Lankhorst
+ *
+ * Based on msg711.acm
+ * Copyright (C) 2002 Eric Pouech
+ *
+ * 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
+
+#include
+#include
+#include
+
+#ifdef HAVE_GSM_GSM_H
+#include
+#elif defined(HAVE_GSM_H)
+#include
+#endif
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winnls.h"
+#include "mmsystem.h"
+#include "mmreg.h"
+#include "msacm.h"
+#include "msacmdrv.h"
+#include "wine/library.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(gsm);
+
+#ifdef SONAME_LIBGSM
+
+static void *libgsm_handle;
+#define FUNCPTR(f) static typeof(f) * p##f
+FUNCPTR(gsm_create);
+FUNCPTR(gsm_destroy);
+FUNCPTR(gsm_option);
+FUNCPTR(gsm_encode);
+FUNCPTR(gsm_decode);
+
+#define LOAD_FUNCPTR(f) \
+ if((p##f = wine_dlsym(libgsm_handle, #f, NULL, 0)) == NULL) { \
+ wine_dlclose(libgsm_handle, NULL, 0); \
+ libgsm_handle = NULL; \
+ return 0; \
+ }
+
+/***********************************************************************
+ * GSM_drvLoad
+ */
+static LRESULT GSM_drvLoad(void)
+{
+ char error[128];
+
+ libgsm_handle = wine_dlopen(SONAME_LIBGSM, RTLD_NOW, error, sizeof(error));
+ if (libgsm_handle)
+ {
+ LOAD_FUNCPTR(gsm_create);
+ LOAD_FUNCPTR(gsm_destroy);
+ LOAD_FUNCPTR(gsm_option);
+ LOAD_FUNCPTR(gsm_encode);
+ LOAD_FUNCPTR(gsm_decode);
+ return 1;
+ }
+ else
+ {
+ ERR("Couldn't load " SONAME_LIBGSM ": %s\n", error);
+ return 0;
+ }
+}
+
+/***********************************************************************
+ * GSM_drvFree
+ */
+static LRESULT GSM_drvFree(void)
+{
+ if (libgsm_handle)
+ wine_dlclose(libgsm_handle, NULL, 0);
+ return 1;
+}
+
+#else
+
+static LRESULT GSM_drvFree(void)
+{
+ return 1;
+}
+
+#endif
+
+/***********************************************************************
+ * GSM_DriverDetails
+ *
+ */
+static LRESULT GSM_DriverDetails(PACMDRIVERDETAILSW add)
+{
+ add->fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC;
+ add->fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED;
+ /* Details found from probing native msgsm32.acm */
+ add->wMid = MM_MICROSOFT;
+ add->wPid = 36;
+ add->vdwACM = 0x3320000;
+ add->vdwDriver = 0x4000000;
+ add->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
+ add->cFormatTags = 2;
+ add->cFilterTags = 0;
+ add->hicon = NULL;
+ MultiByteToWideChar( CP_ACP, 0, "Wine GSM 6.10", -1,
+ add->szShortName, sizeof(add->szShortName)/sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, "Wine GSM 6.10 libgsm codec", -1,
+ add->szLongName, sizeof(add->szLongName)/sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, "Brought to you by the Wine team...", -1,
+ add->szCopyright, sizeof(add->szCopyright)/sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, "Refer to LICENSE file", -1,
+ add->szLicensing, sizeof(add->szLicensing)/sizeof(WCHAR) );
+ add->szFeatures[0] = 0;
+ return MMSYSERR_NOERROR;
+}
+
+/* Validate a WAVEFORMATEX structure */
+static DWORD GSM_FormatValidate(const WAVEFORMATEX *wfx)
+{
+ if (wfx->nChannels != 1)
+ return 0;
+
+ switch (wfx->wFormatTag)
+ {
+ case WAVE_FORMAT_PCM:
+ if (wfx->wBitsPerSample != 16)
+ {
+ WARN("PCM wBitsPerSample %u\n", wfx->wBitsPerSample);
+ return 0;
+ }
+ if (wfx->nBlockAlign != 2)
+ {
+ WARN("PCM nBlockAlign %u\n", wfx->nBlockAlign);
+ return 0;
+ }
+ if (wfx->nAvgBytesPerSec != wfx->nBlockAlign * wfx->nSamplesPerSec)
+ {
+ WARN("PCM nAvgBytesPerSec %u/%u\n",
+ wfx->nAvgBytesPerSec,
+ wfx->nBlockAlign * wfx->nSamplesPerSec);
+ return 0;
+ }
+ return 1;
+ case WAVE_FORMAT_GSM610:
+ if (wfx->cbSize < sizeof(WORD))
+ {
+ WARN("GSM cbSize %u\n", wfx->cbSize);
+ return 0;
+ }
+ if (wfx->wBitsPerSample != 0)
+ {
+ WARN("GSM wBitsPerSample %u\n", wfx->wBitsPerSample);
+ return 0;
+ }
+ if (wfx->nBlockAlign != 65)
+ {
+ WARN("GSM nBlockAlign %u\n", wfx->nBlockAlign);
+ return 0;
+ }
+ if (((GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock != 320)
+ {
+ WARN("GSM wSamplesPerBlock %u\n",
+ ((GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock);
+ return 0;
+ }
+ if (wfx->nAvgBytesPerSec != wfx->nSamplesPerSec * 65 / 320)
+ {
+ WARN("GSM nAvgBytesPerSec %d / %d\n",
+ wfx->nAvgBytesPerSec, wfx->nSamplesPerSec * 65 / 320);
+ return 0;
+ }
+ return 1;
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+static const DWORD gsm_rates[] = { 8000, 11025, 22050, 44100, 48000, 96000 };
+#define NUM_RATES (sizeof(gsm_rates)/sizeof(*gsm_rates))
+
+/***********************************************************************
+ * GSM_FormatTagDetails
+ *
+ */
+static LRESULT GSM_FormatTagDetails(PACMFORMATTAGDETAILSW aftd, DWORD dwQuery)
+{
+ static const WCHAR szPcm[]={'P','C','M',0};
+ static const WCHAR szGsm[]={'G','S','M',' ','6','.','1','0',0};
+
+ switch (dwQuery)
+ {
+ case ACM_FORMATTAGDETAILSF_INDEX:
+ if (aftd->dwFormatTagIndex > 1) return ACMERR_NOTPOSSIBLE;
+ break;
+ case ACM_FORMATTAGDETAILSF_LARGESTSIZE:
+ if (aftd->dwFormatTag == WAVE_FORMAT_UNKNOWN)
+ {
+ aftd->dwFormatTagIndex = 1;
+ break;
+ }
+ /* fall thru */
+ case ACM_FORMATTAGDETAILSF_FORMATTAG:
+ switch (aftd->dwFormatTag)
+ {
+ case WAVE_FORMAT_PCM: aftd->dwFormatTagIndex = 0; break;
+ case WAVE_FORMAT_GSM610: aftd->dwFormatTagIndex = 1; break;
+ default: return ACMERR_NOTPOSSIBLE;
+ }
+ break;
+ default:
+ WARN("Unsupported query %08x\n", dwQuery);
+ return MMSYSERR_NOTSUPPORTED;
+ }
+
+ aftd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
+ switch (aftd->dwFormatTagIndex)
+ {
+ case 0:
+ aftd->dwFormatTag = WAVE_FORMAT_PCM;
+ aftd->cbFormatSize = sizeof(PCMWAVEFORMAT);
+ aftd->cStandardFormats = NUM_RATES;
+ lstrcpyW(aftd->szFormatTag, szPcm);
+ break;
+ case 1:
+ aftd->dwFormatTag = WAVE_FORMAT_GSM610;
+ aftd->cbFormatSize = sizeof(GSM610WAVEFORMAT);
+ aftd->cStandardFormats = NUM_RATES;
+ lstrcpyW(aftd->szFormatTag, szGsm);
+ break;
+ }
+ return MMSYSERR_NOERROR;
+}
+
+/***********************************************************************
+ * GSM_FormatDetails
+ *
+ */
+static LRESULT GSM_FormatDetails(PACMFORMATDETAILSW afd, DWORD dwQuery)
+{
+ switch (dwQuery)
+ {
+ case ACM_FORMATDETAILSF_FORMAT:
+ if (!GSM_FormatValidate(afd->pwfx)) return ACMERR_NOTPOSSIBLE;
+ break;
+ case ACM_FORMATDETAILSF_INDEX:
+ afd->pwfx->wFormatTag = afd->dwFormatTag;
+ switch (afd->dwFormatTag)
+ {
+ case WAVE_FORMAT_PCM:
+ if (afd->dwFormatIndex >= NUM_RATES) return ACMERR_NOTPOSSIBLE;
+ afd->pwfx->nChannels = 1;
+ afd->pwfx->nSamplesPerSec = gsm_rates[afd->dwFormatIndex];
+ afd->pwfx->wBitsPerSample = 16;
+ afd->pwfx->nBlockAlign = 2;
+ afd->pwfx->nAvgBytesPerSec = afd->pwfx->nSamplesPerSec * afd->pwfx->nBlockAlign;
+ break;
+ case WAVE_FORMAT_GSM610:
+ if (afd->dwFormatIndex >= NUM_RATES) return ACMERR_NOTPOSSIBLE;
+ afd->pwfx->nChannels = 1;
+ afd->pwfx->nSamplesPerSec = gsm_rates[afd->dwFormatIndex];
+ afd->pwfx->wBitsPerSample = 0;
+ afd->pwfx->nBlockAlign = 65;
+ afd->pwfx->nAvgBytesPerSec = afd->pwfx->nSamplesPerSec * 65 / 320;
+ afd->pwfx->cbSize = sizeof(WORD);
+ ((GSM610WAVEFORMAT*)afd->pwfx)->wSamplesPerBlock = 320;
+ break;
+ default:
+ WARN("Unsupported tag %08x\n", afd->dwFormatTag);
+ return MMSYSERR_INVALPARAM;
+ }
+ break;
+ default:
+ WARN("Unsupported query %08x\n", dwQuery);
+ return MMSYSERR_NOTSUPPORTED;
+ }
+ afd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
+ afd->szFormat[0] = 0; /* let MSACM format this for us... */
+
+ return MMSYSERR_NOERROR;
+}
+
+/***********************************************************************
+ * GSM_FormatSuggest
+ *
+ */
+static LRESULT GSM_FormatSuggest(PACMDRVFORMATSUGGEST adfs)
+{
+ /* some tests ... */
+ if (adfs->cbwfxSrc < sizeof(PCMWAVEFORMAT) ||
+ adfs->cbwfxDst < sizeof(PCMWAVEFORMAT) ||
+ !GSM_FormatValidate(adfs->pwfxSrc)) return ACMERR_NOTPOSSIBLE;
+ /* FIXME: should do those tests against the real size (according to format tag */
+
+ /* If no suggestion for destination, then copy source value */
+ if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_NCHANNELS))
+ adfs->pwfxDst->nChannels = adfs->pwfxSrc->nChannels;
+ if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_NSAMPLESPERSEC))
+ adfs->pwfxDst->nSamplesPerSec = adfs->pwfxSrc->nSamplesPerSec;
+
+ if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WBITSPERSAMPLE))
+ {
+ if (adfs->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM)
+ adfs->pwfxDst->wBitsPerSample = 0;
+ else
+ adfs->pwfxDst->wBitsPerSample = 16;
+ }
+ if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG))
+ {
+ switch (adfs->pwfxSrc->wFormatTag)
+ {
+ case WAVE_FORMAT_PCM: adfs->pwfxDst->wFormatTag = WAVE_FORMAT_GSM610; break;
+ case WAVE_FORMAT_GSM610: adfs->pwfxDst->wFormatTag = WAVE_FORMAT_PCM; break;
+ }
+ }
+
+ /* recompute other values */
+ switch (adfs->pwfxDst->wFormatTag)
+ {
+ case WAVE_FORMAT_PCM:
+ adfs->pwfxDst->nBlockAlign = 2;
+ adfs->pwfxDst->nAvgBytesPerSec = adfs->pwfxDst->nSamplesPerSec * 2;
+ break;
+ case WAVE_FORMAT_GSM610:
+ if (adfs->pwfxDst->cbSize < sizeof(WORD))
+ return ACMERR_NOTPOSSIBLE;
+ adfs->pwfxDst->nBlockAlign = 65;
+ adfs->pwfxDst->nAvgBytesPerSec = adfs->pwfxDst->nSamplesPerSec * 65 / 320;
+ ((GSM610WAVEFORMAT*)adfs->pwfxDst)->wSamplesPerBlock = 320;
+ break;
+ default:
+ return ACMERR_NOTPOSSIBLE;
+ }
+
+ /* check if result is ok */
+ if (!GSM_FormatValidate(adfs->pwfxDst)) return ACMERR_NOTPOSSIBLE;
+ return MMSYSERR_NOERROR;
+}
+
+#ifdef SONAME_LIBGSM
+/***********************************************************************
+ * GSM_StreamOpen
+ *
+ */
+static LRESULT GSM_StreamOpen(PACMDRVSTREAMINSTANCE adsi)
+{
+ int used = 1;
+ gsm r;
+ if (!GSM_FormatValidate(adsi->pwfxSrc) || !GSM_FormatValidate(adsi->pwfxDst))
+ return MMSYSERR_NOTSUPPORTED;
+
+ if (adsi->pwfxSrc->nSamplesPerSec != adsi->pwfxDst->nSamplesPerSec)
+ return MMSYSERR_NOTSUPPORTED;
+
+ if (!GSM_drvLoad()) return MMSYSERR_NOTSUPPORTED;
+
+ r = pgsm_create();
+ if (!r)
+ return MMSYSERR_NOMEM;
+ if (pgsm_option(r, GSM_OPT_WAV49, &used) < 0)
+ {
+ FIXME("Your libgsm library is doesn't support GSM_OPT_WAV49\n");
+ FIXME("Please recompile libgsm with WAV49 support\n");
+ pgsm_destroy(r);
+ return MMSYSERR_NOTSUPPORTED;
+ }
+ adsi->dwDriver = (DWORD_PTR)r;
+ return MMSYSERR_NOERROR;
+}
+
+/***********************************************************************
+ * GSM_StreamClose
+ *
+ */
+static LRESULT GSM_StreamClose(PACMDRVSTREAMINSTANCE adsi)
+{
+ pgsm_destroy((gsm)adsi->dwDriver);
+ return MMSYSERR_NOERROR;
+}
+
+/***********************************************************************
+ * GSM_StreamSize
+ *
+ */
+static LRESULT GSM_StreamSize(const ACMDRVSTREAMINSTANCE *adsi, PACMDRVSTREAMSIZE adss)
+{
+ switch (adss->fdwSize)
+ {
+ case ACM_STREAMSIZEF_DESTINATION:
+ /* cbDstLength => cbSrcLength */
+ if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
+ adsi->pwfxDst->wFormatTag == WAVE_FORMAT_GSM610)
+ {
+ adss->cbSrcLength = adss->cbDstLength / 65 * 640;
+ }
+ else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_GSM610 &&
+ adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
+ {
+ adss->cbSrcLength = adss->cbDstLength / 640 * 65;
+ }
+ else
+ {
+ return MMSYSERR_NOTSUPPORTED;
+ }
+ return MMSYSERR_NOERROR;
+ case ACM_STREAMSIZEF_SOURCE:
+ /* cbSrcLength => cbDstLength */
+ if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
+ adsi->pwfxDst->wFormatTag == WAVE_FORMAT_GSM610)
+ {
+ adss->cbDstLength = (adss->cbSrcLength + 639) / 640 * 65;
+ }
+ else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_GSM610 &&
+ adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
+ {
+ adss->cbDstLength = adss->cbSrcLength / 65 * 640;
+ }
+ else
+ {
+ return MMSYSERR_NOTSUPPORTED;
+ }
+ return MMSYSERR_NOERROR;
+ default:
+ WARN("Unsupported query %08x\n", adss->fdwSize);
+ return MMSYSERR_NOTSUPPORTED;
+ }
+}
+
+/***********************************************************************
+ * GSM_StreamConvert
+ *
+ */
+static LRESULT GSM_StreamConvert(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMHEADER adsh)
+{
+ gsm r = (gsm)adsi->dwDriver;
+ DWORD nsrc = 0;
+ DWORD ndst = 0;
+ BYTE *src = adsh->pbSrc;
+ BYTE *dst = adsh->pbDst;
+ int odd = 0;
+
+ if (adsh->fdwConvert &
+ ~(ACM_STREAMCONVERTF_BLOCKALIGN|
+ ACM_STREAMCONVERTF_END|
+ ACM_STREAMCONVERTF_START))
+ {
+ FIXME("Unsupported fdwConvert (%08x), ignoring it\n", adsh->fdwConvert);
+ }
+
+ /* Reset the index to 0, just to be sure */
+ pgsm_option(r, GSM_OPT_FRAME_INDEX, &odd);
+
+ /* The native ms codec writes 65 bytes, and this requires 2 libgsm calls.
+ * First 32 bytes are written, or 33 bytes read
+ * Second 33 bytes are written, or 32 bytes read
+ */
+
+ /* Decode */
+ if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_GSM610)
+ {
+ if (adsh->cbSrcLength / 65 * 640 > adsh->cbDstLength)
+ {
+ return ACMERR_NOTPOSSIBLE;
+ }
+
+ while (nsrc + 65 <= adsh->cbSrcLength)
+ {
+ /* Decode data */
+ if (pgsm_decode(r, src + nsrc, (gsm_signal*)(dst + ndst)) < 0)
+ FIXME("Couldn't decode data\n");
+ ndst += 320;
+ nsrc += 33;
+
+ if (pgsm_decode(r, src + nsrc, (gsm_signal*)(dst + ndst)) < 0)
+ FIXME("Couldn't decode data\n");
+ ndst += 320;
+ nsrc += 32;
+ }
+ }
+ else
+ {
+ /* Testing a little seems to reveal that despite being able to fit
+ * inside the buffer if ACM_STREAMCONVERTF_BLOCKALIGN is set
+ * it still rounds up
+ */
+ if ((adsh->cbSrcLength + 639) / 640 * 65 > adsh->cbDstLength)
+ {
+ return ACMERR_NOTPOSSIBLE;
+ }
+
+ /* The packing algorythm writes 32 bytes, then 33 bytes,
+ * and it seems to pad to align to 65 bytes always
+ * adding extra data where necessary
+ */
+ while (nsrc + 640 <= adsh->cbSrcLength)
+ {
+ /* Encode data */
+ pgsm_encode(r, (gsm_signal*)(src+nsrc), dst+ndst);
+ nsrc += 320;
+ ndst += 32;
+ pgsm_encode(r, (gsm_signal*)(src+nsrc), dst+ndst);
+ nsrc += 320;
+ ndst += 33;
+ }
+
+ /* If ACM_STREAMCONVERTF_BLOCKALIGN isn't set pad with zeros */
+ if (!(adsh->fdwConvert & ACM_STREAMCONVERTF_BLOCKALIGN) &&
+ nsrc < adsh->cbSrcLength)
+ {
+ char emptiness[320];
+ int todo = adsh->cbSrcLength - nsrc;
+
+ if (todo > 320)
+ {
+ pgsm_encode(r, (gsm_signal*)(src+nsrc), dst+ndst);
+ ndst += 32;
+ todo -= 320;
+ nsrc += 320;
+
+ memcpy(emptiness, src+nsrc, todo);
+ memset(emptiness + todo, 0, 320 - todo);
+ pgsm_encode(r, (gsm_signal*)emptiness, dst+ndst);
+ ndst += 33;
+ }
+ else
+ {
+ memcpy(emptiness, src+nsrc, todo);
+ memset(emptiness + todo, 0, 320 - todo);
+ pgsm_encode(r, (gsm_signal*)emptiness, dst+ndst);
+ ndst += 32;
+
+ memset(emptiness, 0, todo);
+ pgsm_encode(r, (gsm_signal*)emptiness, dst+ndst);
+ ndst += 33;
+ }
+ nsrc = adsh->cbSrcLength;
+ }
+ }
+
+ adsh->cbSrcLengthUsed = nsrc;
+ adsh->cbDstLengthUsed = ndst;
+ TRACE("%d(%d) -> %d(%d)\n", nsrc, adsh->cbSrcLength, ndst, adsh->cbDstLength);
+ return MMSYSERR_NOERROR;
+}
+
+#endif
+
+/**************************************************************************
+ * GSM_DriverProc [exported]
+ */
+LRESULT CALLBACK GSM_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
+ LPARAM dwParam1, LPARAM dwParam2)
+{
+ TRACE("(%08lx %p %04x %08lx %08lx);\n",
+ dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+
+ switch (wMsg)
+ {
+ case DRV_LOAD: return 1;
+ case DRV_FREE: return GSM_drvFree();
+ case DRV_OPEN: return 1;
+ case DRV_CLOSE: return 1;
+ case DRV_ENABLE: return 1;
+ case DRV_DISABLE: return 1;
+ case DRV_QUERYCONFIGURE: return 1;
+ case DRV_CONFIGURE: MessageBoxA(0, "GSM 06.10 codec", "Wine Driver", MB_OK); return 1;
+ case DRV_INSTALL: return DRVCNF_RESTART;
+ case DRV_REMOVE: return DRVCNF_RESTART;
+
+ case ACMDM_DRIVER_NOTIFY:
+ /* no caching from other ACM drivers is done so far */
+ return MMSYSERR_NOERROR;
+
+ case ACMDM_DRIVER_DETAILS:
+ return GSM_DriverDetails((PACMDRIVERDETAILSW)dwParam1);
+
+ case ACMDM_FORMATTAG_DETAILS:
+ return GSM_FormatTagDetails((PACMFORMATTAGDETAILSW)dwParam1, dwParam2);
+
+ case ACMDM_FORMAT_DETAILS:
+ return GSM_FormatDetails((PACMFORMATDETAILSW)dwParam1, dwParam2);
+
+ case ACMDM_FORMAT_SUGGEST:
+ return GSM_FormatSuggest((PACMDRVFORMATSUGGEST)dwParam1);
+
+#ifdef SONAME_LIBGSM
+ case ACMDM_STREAM_OPEN:
+ return GSM_StreamOpen((PACMDRVSTREAMINSTANCE)dwParam1);
+
+ case ACMDM_STREAM_CLOSE:
+ return GSM_StreamClose((PACMDRVSTREAMINSTANCE)dwParam1);
+
+ case ACMDM_STREAM_SIZE:
+ return GSM_StreamSize((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMSIZE)dwParam2);
+
+ case ACMDM_STREAM_CONVERT:
+ return GSM_StreamConvert((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMHEADER)dwParam2);
+#else
+ case ACMDM_STREAM_OPEN: ERR("libgsm support not compiled in!\n");
+ case ACMDM_STREAM_CLOSE:
+ case ACMDM_STREAM_SIZE:
+ case ACMDM_STREAM_CONVERT:
+ return MMSYSERR_NOTSUPPORTED;
+#endif
+
+ case ACMDM_HARDWARE_WAVE_CAPS_INPUT:
+ case ACMDM_HARDWARE_WAVE_CAPS_OUTPUT:
+ /* this converter is not a hardware driver */
+ case ACMDM_FILTERTAG_DETAILS:
+ case ACMDM_FILTER_DETAILS:
+ /* this converter is not a filter */
+ case ACMDM_STREAM_RESET:
+ /* only needed for asynchronous driver... we aren't, so just say it */
+ return MMSYSERR_NOTSUPPORTED;
+ case ACMDM_STREAM_PREPARE:
+ case ACMDM_STREAM_UNPREPARE:
+ /* nothing special to do here... so don't do anything */
+ return MMSYSERR_NOERROR;
+
+ default:
+ return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+ }
+}
diff --git a/reactos/dll/win32/mshtml/Bg.rc b/reactos/dll/win32/mshtml/Bg.rc
index 92c86b6ba4f..a8fd605ab09 100644
--- a/reactos/dll/win32/mshtml/Bg.rc
+++ b/reactos/dll/win32/mshtml/Bg.rc
@@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
diff --git a/reactos/dll/win32/mshtml/Da.rc b/reactos/dll/win32/mshtml/Da.rc
index 47579b5a4d8..574ea093afe 100644
--- a/reactos/dll/win32/mshtml/Da.rc
+++ b/reactos/dll/win32/mshtml/Da.rc
@@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
diff --git a/reactos/dll/win32/mshtml/De.rc b/reactos/dll/win32/mshtml/De.rc
index 991e84d28fd..dd55740ee0e 100644
--- a/reactos/dll/win32/mshtml/De.rc
+++ b/reactos/dll/win32/mshtml/De.rc
@@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
diff --git a/reactos/dll/win32/mshtml/En.rc b/reactos/dll/win32/mshtml/En.rc
index 09370deb353..41ee1197050 100644
--- a/reactos/dll/win32/mshtml/En.rc
+++ b/reactos/dll/win32/mshtml/En.rc
@@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
diff --git a/reactos/dll/win32/mshtml/Es.rc b/reactos/dll/win32/mshtml/Es.rc
index 94af0cfaf5c..fb79f87852c 100644
--- a/reactos/dll/win32/mshtml/Es.rc
+++ b/reactos/dll/win32/mshtml/Es.rc
@@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
diff --git a/reactos/dll/win32/mshtml/Fi.rc b/reactos/dll/win32/mshtml/Fi.rc
index d1d389a8ba5..564345d6960 100644
--- a/reactos/dll/win32/mshtml/Fi.rc
+++ b/reactos/dll/win32/mshtml/Fi.rc
@@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
diff --git a/reactos/dll/win32/mshtml/Fr.rc b/reactos/dll/win32/mshtml/Fr.rc
index 25426701de4..c7671d4aed4 100644
--- a/reactos/dll/win32/mshtml/Fr.rc
+++ b/reactos/dll/win32/mshtml/Fr.rc
@@ -2,7 +2,7 @@
* MsHTML resources
* French Language Support
*
- * Copyright 2005-2007 Jonathan Ernst
+ * Copyright 2005-2009 Jonathan Ernst
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -19,14 +19,18 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
- IDS_HTMLDISABLED "Le rendu HTML est actuellement dsactiv."
+ IDS_HTMLDISABLED "Le rendu HTML est actuellement désactivé."
IDS_HTMLDOCUMENT "Document HTML"
- IDS_DOWNLOADING "Tlchargement..."
+ IDS_DOWNLOADING "Téléchargement..."
IDS_INSTALLING "Installation..."
}
@@ -35,9 +39,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN
CAPTION "Programme d'installation de Gecko pour Wine"
FONT 8, "MS Shell Dlg"
{
- LTEXT "Cette application essaie d'afficher une page HTML. Wine requiert la prsence du moteur de rendu Gecko de Mozilla " \
+ LTEXT "Cette application essaie d'afficher une page HTML. Wine requiert la présence du moteur de rendu Gecko de Mozilla " \
"pour afficher cette page. Cliquez sur Installer si vous souhaitez que Wine " \
- "tlcharge et installe automatiquement Gecko.", ID_DWL_STATUS, 10, 10, 240, 40, SS_LEFT
+ "télécharge et installe automatiquement Gecko.", ID_DWL_STATUS, 10, 10, 240, 40, SS_LEFT
CONTROL "Progression", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12
DEFPUSHBUTTON "&Installer", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Annuler", IDCANCEL, 140, 70, 50, 15, WS_GROUP | WS_TABSTOP
@@ -49,10 +53,21 @@ CAPTION "Hyperlien"
FONT 8, "MS Shell Dlg"
{
GROUPBOX "Informations sur l'hyperlien", -1, 5, 5, 190, 55
- LTEXT "&Type:", -1, 10, 22, 20, 10
+ LTEXT "&Type :", -1, 10, 22, 20, 10
COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS
- LTEXT "&URL:", -1, 10, 42, 20, 10
+ LTEXT "&URL :", -1, 10, 42, 20, 10
EDITTEXT IDC_URL, 35, 40, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Annuler", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}
+
+ID_PROMPT_DIALOG DIALOG 0, 0, 200, 90
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION ""
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "", ID_PROMPT_PROMPT, 10, 10, 180, 30
+ EDITTEXT ID_PROMPT_EDIT, 10, 45, 180, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuler", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
+}
diff --git a/reactos/dll/win32/mshtml/Hu.rc b/reactos/dll/win32/mshtml/Hu.rc
index 7f3d25446ad..137a1007198 100644
--- a/reactos/dll/win32/mshtml/Hu.rc
+++ b/reactos/dll/win32/mshtml/Hu.rc
@@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
diff --git a/reactos/dll/win32/mshtml/Ja.rc b/reactos/dll/win32/mshtml/Ja.rc
index 81bf8f8eff2..202bd43164c 100644
--- a/reactos/dll/win32/mshtml/Ja.rc
+++ b/reactos/dll/win32/mshtml/Ja.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
/* UTF-8 */
#pragma code_page(65001)
@@ -56,4 +58,13 @@ FONT 9, "MS Shell Dlg"
PUSHBUTTON "キャンセル", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}
-#pragma code_page(default)
+ID_PROMPT_DIALOG DIALOG 0, 0, 200, 90
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION ""
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "", ID_PROMPT_PROMPT, 10, 10, 180, 30
+ EDITTEXT ID_PROMPT_EDIT, 10, 45, 180, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "キャンセル", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
+}
diff --git a/reactos/dll/win32/mshtml/Ko.rc b/reactos/dll/win32/mshtml/Ko.rc
index efad0075a87..01456e39d0d 100644
--- a/reactos/dll/win32/mshtml/Ko.rc
+++ b/reactos/dll/win32/mshtml/Ko.rc
@@ -17,6 +17,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
diff --git a/reactos/dll/win32/mshtml/Lt.rc b/reactos/dll/win32/mshtml/Lt.rc
index f63b177746d..26167a9adc1 100644
--- a/reactos/dll/win32/mshtml/Lt.rc
+++ b/reactos/dll/win32/mshtml/Lt.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
/* UTF-8 */
#pragma code_page(65001)
@@ -66,5 +68,3 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "Gerai", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Atsisakyti", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/mshtml/Nl.rc b/reactos/dll/win32/mshtml/Nl.rc
index f6f47e174b3..1aab09c79d6 100644
--- a/reactos/dll/win32/mshtml/Nl.rc
+++ b/reactos/dll/win32/mshtml/Nl.rc
@@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
diff --git a/reactos/dll/win32/mshtml/No.rc b/reactos/dll/win32/mshtml/No.rc
index 6060a515365..83989a0beab 100644
--- a/reactos/dll/win32/mshtml/No.rc
+++ b/reactos/dll/win32/mshtml/No.rc
@@ -1,7 +1,7 @@
/*
- * Norwegian Bokml language support
+ * Norwegian Bokmål language support
*
- * Copyright 2005-2007 Alexander N. Srnes
+ * Copyright 2005-2009 Alexander N. Sørnes
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,12 +18,15 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
+#pragma code_page(65001)
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
STRINGTABLE DISCARDABLE
{
- IDS_HTMLDISABLED "HTML-tegning er for yeblikket deaktivert."
+ IDS_HTMLDISABLED "HTML-tegning er for øyeblikket deaktivert."
IDS_HTMLDOCUMENT "HTML-dokument"
IDS_DOWNLOADING "Laster ned..."
IDS_INSTALLING "Installerer..."
@@ -34,8 +37,8 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN
CAPTION "Installere Wine Gecko"
FONT 8, "MS Shell Dlg"
{
- LTEXT "Dette programmer prver vise en HTML-side. Wine trenger Gecko " \
- "(Mozillas HTML-motor) for vise denne siden. Velg Installer hvis " \
+ LTEXT "Dette programmer prøver å vise en HTML-side. Wine trenger Gecko " \
+ "(Mozillas HTML-motor) for å vise denne siden. Velg «Installer» hvis " \
"du vil at Wine skal laste ned og installere Gecko automatisk.", ID_DWL_STATUS, 10, 10, 240, 30, SS_LEFT
CONTROL "Progress", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12
DEFPUSHBUTTON "&Installer", ID_DWL_INSTALL, 200, 60, 50, 15, WS_GROUP | WS_TABSTOP
@@ -55,3 +58,14 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Avbryt", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}
+
+ID_PROMPT_DIALOG DIALOG 0, 0, 200, 90
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION ""
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "", ID_PROMPT_PROMPT, 10, 10, 180, 30
+ EDITTEXT ID_PROMPT_EDIT, 10, 45, 180, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Avbryt", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
+}
diff --git a/reactos/dll/win32/mshtml/Pl.rc b/reactos/dll/win32/mshtml/Pl.rc
index a17768651ef..11659ee2297 100644
--- a/reactos/dll/win32/mshtml/Pl.rc
+++ b/reactos/dll/win32/mshtml/Pl.rc
@@ -17,6 +17,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
diff --git a/reactos/dll/win32/mshtml/Pt.rc b/reactos/dll/win32/mshtml/Pt.rc
index 0a83ee06a41..d9ebbb3126a 100644
--- a/reactos/dll/win32/mshtml/Pt.rc
+++ b/reactos/dll/win32/mshtml/Pt.rc
@@ -16,15 +16,18 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
-LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
+LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
STRINGTABLE DISCARDABLE
{
- IDS_HTMLDISABLED "A interpretao de HTML est desactivada."
+ IDS_HTMLDISABLED "A interpretação de HTML está desactivada."
IDS_HTMLDOCUMENT "Documento HTML"
- IDS_DOWNLOADING "Descarregando..."
- IDS_INSTALLING "Instalando..."
+ IDS_DOWNLOADING "A descarregar..."
+ IDS_INSTALLING "A instalar..."
}
ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 260, 95
@@ -32,8 +35,8 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN
CAPTION "Instalador Wine Gecko"
FONT 8, "MS Shell Dlg"
{
- LTEXT "Esta aplicao est a tentar mostrar uma pgina HTML. O Wine precisa que o Gecko " \
- "(Motor HTML Mozilla) seja instalado para mostrar a pgina. Clique em Instalar se deseja que o Wine " \
+ LTEXT "Esta aplicação está a tentar mostrar uma página HTML. O Wine precisa que o Gecko " \
+ "(Motor HTML Mozilla) seja instalado para mostrar a página. Clique em Instalar se deseja que o Wine " \
"descarregue e instale o Gecko automaticamente.", ID_DWL_STATUS, 10, 10, 240, 40, SS_LEFT
CONTROL "Progresso", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12
DEFPUSHBUTTON "&Instalar", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP
@@ -42,10 +45,10 @@ FONT 8, "MS Shell Dlg"
IDD_HYPERLINK DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 250, 65
STYLE DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hiperligao"
+CAPTION "Hiperligação"
FONT 8, "MS Shell Dlg"
{
- GROUPBOX "Informao da Hiperligao", -1, 5, 5, 190, 55
+ GROUPBOX "Informação da Hiperligação", -1, 5, 5, 190, 55
LTEXT "&Tipo:", -1, 10, 22, 20, 10
COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS
LTEXT "&URL:", -1, 10, 42, 20, 10
@@ -53,3 +56,14 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Cancelar", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}
+
+ID_PROMPT_DIALOG DIALOG 0, 0, 200, 90
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION ""
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "", ID_PROMPT_PROMPT, 10, 10, 180, 30
+ EDITTEXT ID_PROMPT_EDIT, 10, 45, 180, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Cancelar", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
+}
diff --git a/reactos/dll/win32/mshtml/Ro.rc b/reactos/dll/win32/mshtml/Ro.rc
index 4bb71993c47..1bac21645d2 100644
--- a/reactos/dll/win32/mshtml/Ro.rc
+++ b/reactos/dll/win32/mshtml/Ro.rc
@@ -17,6 +17,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
@@ -65,5 +66,3 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Renunță", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/mshtml/Ru.rc b/reactos/dll/win32/mshtml/Ru.rc
index 9460f243567..7638d9b8e9d 100644
--- a/reactos/dll/win32/mshtml/Ru.rc
+++ b/reactos/dll/win32/mshtml/Ru.rc
@@ -16,40 +16,44 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
- IDS_HTMLDISABLED " HTML ."
- IDS_HTMLDOCUMENT " HTML"
- IDS_DOWNLOADING "..."
- IDS_INSTALLING "..."
+ IDS_HTMLDISABLED "В настоящее время отображение HTML выключенно."
+ IDS_HTMLDOCUMENT "Документ HTML"
+ IDS_DOWNLOADING "Загрузка..."
+ IDS_INSTALLING "Установка..."
}
ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 261, 85
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION " Wine Gecko"
+CAPTION "Установка Wine Gecko"
FONT 8, "MS Shell Dlg"
{
- LTEXT " HTML . Wine " \
- " Gecko (Mozilla HTML engine). , Wine " \
- " Gecko.", ID_DWL_STATUS, 10, 10, 240, 33, SS_LEFT
- CONTROL "", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 46, 240, 12
- DEFPUSHBUTTON "&", ID_DWL_INSTALL, 200, 63, 50, 15, WS_GROUP | WS_TABSTOP
- PUSHBUTTON "&", IDCANCEL, 140, 63, 50, 15, WS_GROUP | WS_TABSTOP
+ LTEXT "Эта программа пытается отобразить HTML страницу. Для её отображения Wine необходимо " \
+ "установить Gecko (Mozilla HTML engine). Нажмите кнопку установить если вы хотите, что бы Wine " \
+ "автоматически загрузил и установил Gecko.", ID_DWL_STATUS, 10, 10, 240, 33, SS_LEFT
+ CONTROL "Прогресс", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 46, 240, 12
+ DEFPUSHBUTTON "&Установить", ID_DWL_INSTALL, 200, 63, 50, 15, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Отмена", IDCANCEL, 140, 63, 50, 15, WS_GROUP | WS_TABSTOP
}
IDD_HYPERLINK DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 250, 65
STYLE DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION ""
+CAPTION "Ссылка"
FONT 8, "MS Shell Dlg"
{
- GROUPBOX " ", -1, 5, 5, 190, 55
- LTEXT "&:", -1, 10, 22, 20, 10
+ GROUPBOX "Информация о ссылке", -1, 5, 5, 190, 55
+ LTEXT "&Тип:", -1, 10, 22, 20, 10
COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS
- LTEXT "&:", -1, 10, 42, 20, 10
+ LTEXT "&Адрес:", -1, 10, 42, 20, 10
EDITTEXT IDC_URL, 35, 40, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
- PUSHBUTTON "", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Отмена", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}
diff --git a/reactos/dll/win32/mshtml/Si.rc b/reactos/dll/win32/mshtml/Si.rc
index 2a67290fd73..92721df350d 100644
--- a/reactos/dll/win32/mshtml/Si.rc
+++ b/reactos/dll/win32/mshtml/Si.rc
@@ -16,13 +16,15 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
- IDS_HTMLDISABLED "Prikazovanje HTML dokumento je trenutno onemogočeno."
+ IDS_HTMLDISABLED "Prikazovanje HTML dokumentov je trenutno onemogočeno."
IDS_HTMLDOCUMENT "HTML dokument"
IDS_DOWNLOADING "Nalagam ..."
IDS_INSTALLING "Nameščam ..."
@@ -56,4 +58,13 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "Prekliči", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}
-#pragma code_page(default)
+ID_PROMPT_DIALOG DIALOG 0, 0, 200, 90
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION ""
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "", ID_PROMPT_PROMPT, 10, 10, 180, 30
+ EDITTEXT ID_PROMPT_EDIT, 10, 45, 180, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "V redu", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Prekliči", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
+}
diff --git a/reactos/dll/win32/mshtml/Sv.rc b/reactos/dll/win32/mshtml/Sv.rc
index 2d9c29233dd..041ff8b5dc7 100644
--- a/reactos/dll/win32/mshtml/Sv.rc
+++ b/reactos/dll/win32/mshtml/Sv.rc
@@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
@@ -51,6 +52,17 @@ FONT 8, "MS Shell Dlg"
COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS
LTEXT "&URL:", -1, 10, 42, 20, 10
EDITTEXT IDC_URL, 35, 40, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
- PUSHBUTTON "Ok", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Avbryt", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}
+
+ID_PROMPT_DIALOG DIALOG 0, 0, 200, 90
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION ""
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "", ID_PROMPT_PROMPT, 10, 10, 180, 30
+ EDITTEXT ID_PROMPT_EDIT, 10, 45, 180, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Avbryt", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
+}
diff --git a/reactos/dll/win32/mshtml/Tr.rc b/reactos/dll/win32/mshtml/Tr.rc
index 6d843a1503d..7e85fc6b4a1 100644
--- a/reactos/dll/win32/mshtml/Tr.rc
+++ b/reactos/dll/win32/mshtml/Tr.rc
@@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
diff --git a/reactos/dll/win32/mshtml/Zh.rc b/reactos/dll/win32/mshtml/Zh.rc
index 4b258a48fca..2365120e5bb 100644
--- a/reactos/dll/win32/mshtml/Zh.rc
+++ b/reactos/dll/win32/mshtml/Zh.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -94,5 +96,3 @@ FONT 9, "MS Shell Dlg"
PUSHBUTTON "確定", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "取消", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/mshtml/dispex.c b/reactos/dll/win32/mshtml/dispex.c
index 0d0422c873a..b8937e7c29e 100644
--- a/reactos/dll/win32/mshtml/dispex.c
+++ b/reactos/dll/win32/mshtml/dispex.c
@@ -35,12 +35,14 @@ typedef struct {
DISPID id;
BSTR name;
tid_t tid;
+ int func_disp_idx;
} func_info_t;
struct dispex_data_t {
DWORD func_cnt;
func_info_t *funcs;
func_info_t **name_table;
+ DWORD func_disp_cnt;
struct list entry;
};
@@ -50,10 +52,20 @@ typedef struct {
LPWSTR name;
} dynamic_prop_t;
+typedef struct {
+ DispatchEx dispex;
+ const IUnknownVtbl *lpIUnknownVtbl;
+ DispatchEx *obj;
+ func_info_t *info;
+} func_disp_t;
+
+#define FUNCUNKNOWN(x) ((IUnknown*) &(x)->lpIUnknownVtbl)
+
struct dispex_dynamic_data_t {
DWORD buf_size;
DWORD prop_cnt;
dynamic_prop_t *props;
+ func_disp_t **func_disps;
};
#define DISPID_DYNPROP_0 0x50000000
@@ -77,6 +89,8 @@ static REFIID tid_ids[] = {
&DIID_DispHTMLIFrame,
&DIID_DispHTMLImg,
&DIID_DispHTMLInputElement,
+ &DIID_DispHTMLLocation,
+ &DIID_DispHTMLNavigator,
&DIID_DispHTMLOptionElement,
&DIID_DispHTMLSelectElement,
&DIID_DispHTMLStyle,
@@ -186,22 +200,23 @@ void release_typelib(void)
ITypeLib_Release(typelib);
}
-static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, DISPID id, ITypeInfo *dti)
+static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, const FUNCDESC *desc, ITypeInfo *dti)
{
HRESULT hres;
- if(data->func_cnt && data->funcs[data->func_cnt-1].id == id)
+ if(data->func_cnt && data->funcs[data->func_cnt-1].id == desc->memid)
return;
if(data->func_cnt == *size)
data->funcs = heap_realloc(data->funcs, (*size <<= 1)*sizeof(func_info_t));
- hres = ITypeInfo_GetDocumentation(dti, id, &data->funcs[data->func_cnt].name, NULL, NULL, NULL);
+ hres = ITypeInfo_GetDocumentation(dti, desc->memid, &data->funcs[data->func_cnt].name, NULL, NULL, NULL);
if(FAILED(hres))
return;
- data->funcs[data->func_cnt].id = id;
+ data->funcs[data->func_cnt].id = desc->memid;
data->funcs[data->func_cnt].tid = tid;
+ data->funcs[data->func_cnt].func_disp_idx = desc->invkind == INVOKE_FUNC ? data->func_disp_cnt++ : -1;
data->func_cnt++;
}
@@ -235,6 +250,7 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
data = heap_alloc(sizeof(dispex_data_t));
data->func_cnt = 0;
+ data->func_disp_cnt = 0;
data->funcs = heap_alloc(size*sizeof(func_info_t));
list_add_tail(&dispex_data_list, &data->entry);
@@ -249,7 +265,7 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
if(FAILED(hres))
break;
- add_func_info(data, &size, *tid, funcdesc->memid, dti);
+ add_func_info(data, &size, *tid, funcdesc, dti);
ITypeInfo_ReleaseFuncDesc(ti, funcdesc);
}
@@ -341,55 +357,56 @@ static inline BOOL is_dynamic_dispid(DISPID id)
return DISPID_DYNPROP_0 <= id && id <= DISPID_DYNPROP_MAX;
}
+static inline dispex_dynamic_data_t *get_dynamic_data(DispatchEx *This, BOOL alloc)
+{
+ return !alloc || This->dynamic_data
+ ? This->dynamic_data
+ : (This->dynamic_data = heap_alloc_zero(sizeof(dispex_dynamic_data_t)));
+}
+
static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, BOOL alloc, dynamic_prop_t **ret)
{
- dispex_dynamic_data_t *data = This->dynamic_data;
+ dispex_dynamic_data_t *data = get_dynamic_data(This, alloc);
+ unsigned i;
- if(data) {
- unsigned i;
+ if(!data) {
+ if(alloc)
+ return E_OUTOFMEMORY;
- for(i=0; i < data->prop_cnt; i++) {
- if(!strcmpW(data->props[i].name, name)) {
- *ret = data->props+i;
- return S_OK;
- }
+ TRACE("not found %s\n", debugstr_w(name));
+ return DISP_E_UNKNOWNNAME;
+ }
+
+ for(i=0; i < data->prop_cnt; i++) {
+ if(!strcmpW(data->props[i].name, name)) {
+ *ret = data->props+i;
+ return S_OK;
}
}
- if(alloc) {
- TRACE("creating dynamic prop %s\n", debugstr_w(name));
+ TRACE("creating dynamic prop %s\n", debugstr_w(name));
- if(!data) {
- data = This->dynamic_data = heap_alloc_zero(sizeof(dispex_dynamic_data_t));
- if(!data)
- return E_OUTOFMEMORY;
- }
+ if(!data->buf_size) {
+ data->props = heap_alloc(sizeof(dynamic_prop_t)*4);
+ if(!data->props)
+ return E_OUTOFMEMORY;
+ data->buf_size = 4;
+ }else if(data->buf_size == data->prop_cnt) {
+ dynamic_prop_t *new_props;
- if(!data->buf_size) {
- data->props = heap_alloc(sizeof(dynamic_prop_t)*4);
- if(!data->props)
- return E_OUTOFMEMORY;
- data->buf_size = 4;
- }else if(data->buf_size == data->prop_cnt) {
- dynamic_prop_t *new_props;
+ new_props = heap_realloc(data->props, sizeof(dynamic_prop_t)*(data->buf_size<<1));
+ if(!new_props)
+ return E_OUTOFMEMORY;
- new_props = heap_realloc(data->props, sizeof(dynamic_prop_t)*(data->buf_size<<1));
- if(!new_props)
- return E_OUTOFMEMORY;
-
- data->props = new_props;
- data->buf_size <<= 1;
- }
-
- data->props[data->prop_cnt].name = heap_strdupW(name);
- VariantInit(&data->props[data->prop_cnt].var);
- *ret = data->props + data->prop_cnt++;
-
- return S_OK;
+ data->props = new_props;
+ data->buf_size <<= 1;
}
- TRACE("not found %s\n", debugstr_w(name));
- return DISP_E_UNKNOWNNAME;
+ data->props[data->prop_cnt].name = heap_strdupW(name);
+ VariantInit(&data->props[data->prop_cnt].var);
+ *ret = data->props + data->prop_cnt++;
+
+ return S_OK;
}
HRESULT dispex_get_dprop_ref(DispatchEx *This, const WCHAR *name, BOOL alloc, VARIANT **ret)
@@ -405,6 +422,191 @@ HRESULT dispex_get_dprop_ref(DispatchEx *This, const WCHAR *name, BOOL alloc, VA
return S_OK;
}
+static HRESULT dispex_value(DispatchEx *This, LCID lcid, WORD flags, DISPPARAMS *params,
+ VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+{
+ static const WCHAR objectW[] = {'[','o','b','j','e','c','t',']',0};
+
+ if(This->data->vtbl && This->data->vtbl->value)
+ return This->data->vtbl->value(This->outer, lcid, flags, params, res, ei, caller);
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET:
+ V_VT(res) = VT_BSTR;
+ V_BSTR(res) = SysAllocString(objectW);
+ if(!V_BSTR(res))
+ return E_OUTOFMEMORY;
+ break;
+ default:
+ FIXME("Unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
+static HRESULT typeinfo_invoke(DispatchEx *This, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res,
+ EXCEPINFO *ei)
+{
+ ITypeInfo *ti;
+ IUnknown *unk;
+ UINT argerr=0;
+ HRESULT hres;
+
+ hres = get_typeinfo(func->tid, &ti);
+ if(FAILED(hres)) {
+ ERR("Could not get type info: %08x\n", hres);
+ return hres;
+ }
+
+ hres = IUnknown_QueryInterface(This->outer, tid_ids[func->tid], (void**)&unk);
+ if(FAILED(hres)) {
+ ERR("Could not get iface %s: %08x\n", debugstr_guid(tid_ids[func->tid]), hres);
+ return E_FAIL;
+ }
+
+ hres = ITypeInfo_Invoke(ti, unk, func->id, flags, dp, res, ei, &argerr);
+
+ IUnknown_Release(unk);
+ return hres;
+}
+
+#define FUNCTION_THIS(iface) DEFINE_THIS(func_disp_t, IUnknown, iface)
+
+static HRESULT WINAPI Function_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
+{
+ func_disp_t *This = FUNCTION_THIS(iface);
+
+ if(IsEqualGUID(&IID_IUnknown, riid)) {
+ TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
+ *ppv = FUNCUNKNOWN(This);
+ }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
+ return *ppv ? S_OK : E_NOINTERFACE;
+ }else {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI Function_AddRef(IUnknown *iface)
+{
+ func_disp_t *This = FUNCTION_THIS(iface);
+
+ TRACE("(%p)\n", This);
+
+ return IDispatchEx_AddRef(DISPATCHEX(This->obj));
+}
+
+static ULONG WINAPI Function_Release(IUnknown *iface)
+{
+ func_disp_t *This = FUNCTION_THIS(iface);
+
+ TRACE("(%p)\n", This);
+
+ return IDispatchEx_Release(DISPATCHEX(This->obj));
+}
+
+static HRESULT function_value(IUnknown *iface, LCID lcid, WORD flags, DISPPARAMS *params,
+ VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+{
+ func_disp_t *This = FUNCTION_THIS(iface);
+ HRESULT hres;
+
+ switch(flags) {
+ case DISPATCH_METHOD:
+ hres = typeinfo_invoke(This->obj, This->info, flags, params, res, ei);
+ break;
+ default:
+ FIXME("Unimplemented flags %x\n", flags);
+ hres = E_NOTIMPL;
+ }
+
+ return hres;
+}
+
+#undef FUNCTION_THIS
+
+static const IUnknownVtbl FunctionUnkVtbl = {
+ Function_QueryInterface,
+ Function_AddRef,
+ Function_Release
+};
+
+static const dispex_static_data_vtbl_t function_dispex_vtbl = {
+ function_value,
+ NULL,
+ NULL
+};
+
+static dispex_static_data_t function_dispex = {
+ &function_dispex_vtbl,
+ LAST_tid,
+ NULL,
+ NULL
+};
+
+static func_disp_t *create_func_disp(DispatchEx *obj, func_info_t *info)
+{
+ func_disp_t *ret;
+
+ ret = heap_alloc_zero(sizeof(func_disp_t));
+ if(!ret)
+ return NULL;
+
+ ret->lpIUnknownVtbl = &FunctionUnkVtbl;
+ init_dispex(&ret->dispex, FUNCUNKNOWN(ret), &function_dispex);
+ ret->obj = obj;
+ ret->info = info;
+
+ return ret;
+}
+
+static HRESULT function_invoke(DispatchEx *This, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res,
+ EXCEPINFO *ei)
+{
+ HRESULT hres;
+
+ switch(flags) {
+ case DISPATCH_METHOD:
+ hres = typeinfo_invoke(This, func, flags, dp, res, ei);
+ break;
+ case DISPATCH_PROPERTYGET: {
+ dispex_dynamic_data_t *dynamic_data;
+
+ dynamic_data = get_dynamic_data(This, TRUE);
+ if(!dynamic_data)
+ return E_OUTOFMEMORY;
+
+ if(!dynamic_data->func_disps) {
+ dynamic_data->func_disps = heap_alloc_zero(This->data->data->func_disp_cnt * sizeof(func_disp_t*));
+ if(!dynamic_data->func_disps)
+ return E_OUTOFMEMORY;
+ }
+
+ if(!dynamic_data->func_disps[func->func_disp_idx]) {
+ dynamic_data->func_disps[func->func_disp_idx] = create_func_disp(This, func);
+ if(!dynamic_data->func_disps[func->func_disp_idx])
+ return E_OUTOFMEMORY;
+ }
+
+ V_VT(res) = VT_DISPATCH;
+ V_DISPATCH(res) = (IDispatch*)DISPATCHEX(&dynamic_data->func_disps[func->func_disp_idx]->dispex);
+ IDispatch_AddRef(V_DISPATCH(res));
+ hres = S_OK;
+ break;
+ }
+ default:
+ FIXME("Unimplemented flags %x\n", flags);
+ case DISPATCH_PROPERTYPUT:
+ hres = E_NOTIMPL;
+ }
+
+ return hres;
+}
+
#define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface)
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
@@ -545,15 +747,15 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
- IUnknown *unk;
- ITypeInfo *ti;
dispex_data_t *data;
- UINT argerr=0;
int min, max, n;
HRESULT hres;
TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
+ if(id == DISPID_VALUE)
+ return dispex_value(This, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
+
if(is_custom_dispid(id) && This->data->vtbl && This->data->vtbl->invoke)
return This->data->vtbl->invoke(This->outer, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
@@ -646,21 +848,11 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
return DISP_E_UNKNOWNNAME;
}
- hres = get_typeinfo(data->funcs[n].tid, &ti);
- if(FAILED(hres)) {
- ERR("Could not get type info: %08x\n", hres);
- return hres;
- }
+ if(data->funcs[n].func_disp_idx == -1)
+ hres = typeinfo_invoke(This, data->funcs+n, wFlags, pdp, pvarRes, pei);
+ else
+ hres = function_invoke(This, data->funcs+n, wFlags, pdp, pvarRes, pei);
- hres = IUnknown_QueryInterface(This->outer, tid_ids[data->funcs[n].tid], (void**)&unk);
- if(FAILED(hres)) {
- ERR("Could not get iface %s: %08x\n", debugstr_guid(tid_ids[data->funcs[n].tid]), hres);
- return E_FAIL;
- }
-
- hres = ITypeInfo_Invoke(ti, unk, id, wFlags, pdp, pvarRes, pei, &argerr);
-
- IUnknown_Release(unk);
return hres;
}
@@ -754,9 +946,40 @@ BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv)
return TRUE;
}
+void release_dispex(DispatchEx *This)
+{
+ dynamic_prop_t *prop;
+
+ if(!This->dynamic_data)
+ return;
+
+ for(prop = This->dynamic_data->props; prop < This->dynamic_data->props + This->dynamic_data->prop_cnt; prop++) {
+ VariantClear(&prop->var);
+ heap_free(prop->name);
+ }
+
+ heap_free(This->dynamic_data->props);
+
+ if(This->dynamic_data->func_disps) {
+ unsigned i;
+
+ for(i=0; i < This->data->data->func_disp_cnt; i++) {
+ if(This->dynamic_data->func_disps[i]) {
+ release_dispex(&This->dynamic_data->func_disps[i]->dispex);
+ heap_free(This->dynamic_data->func_disps[i]);
+ }
+ }
+
+ heap_free(This->dynamic_data->func_disps);
+ }
+
+ heap_free(This->dynamic_data);
+}
+
void init_dispex(DispatchEx *dispex, IUnknown *outer, dispex_static_data_t *data)
{
dispex->lpIDispatchExVtbl = &DispatchExVtbl;
dispex->outer = outer;
dispex->data = data;
+ dispex->dynamic_data = NULL;
}
diff --git a/reactos/dll/win32/mshtml/htmlbody.c b/reactos/dll/win32/mshtml/htmlbody.c
index 0cbfc06be67..b8e0f95c65b 100644
--- a/reactos/dll/win32/mshtml/htmlbody.c
+++ b/reactos/dll/win32/mshtml/htmlbody.c
@@ -44,6 +44,61 @@ typedef struct {
#define HTMLBODY(x) (&(x)->lpHTMLBodyElementVtbl)
+static const WCHAR aquaW[] = {'a','q','u','a',0};
+static const WCHAR blackW[] = {'b','l','a','c','k',0};
+static const WCHAR blueW[] = {'b','l','u','e',0};
+static const WCHAR fuchsiaW[] = {'f','u','s','h','s','i','a',0};
+static const WCHAR grayW[] = {'g','r','a','y',0};
+static const WCHAR greenW[] = {'g','r','e','e','n',0};
+static const WCHAR limeW[] = {'l','i','m','e',0};
+static const WCHAR maroonW[] = {'m','a','r','o','o','n',0};
+static const WCHAR navyW[] = {'n','a','v','y',0};
+static const WCHAR oliveW[] = {'o','l','i','v','e',0};
+static const WCHAR purpleW[] = {'p','u','r','p','l','e',0};
+static const WCHAR redW[] = {'r','e','d',0};
+static const WCHAR silverW[] = {'s','i','l','v','e','r',0};
+static const WCHAR tealW[] = {'t','e','a','l',0};
+static const WCHAR whiteW[] = {'w','h','i','t','e',0};
+static const WCHAR yellowW[] = {'y','e','l','l','o','w',0};
+
+static const struct {
+ LPCWSTR keyword;
+ const WCHAR hexstr[8];
+} keyword_table[] = {
+ {aquaW, {'#','0','0','f','f','f','f',0}},
+ {blackW, {'#','0','0','0','0','0','0',0}},
+ {blueW, {'#','0','0','0','0','f','f',0}},
+ {fuchsiaW, {'#','f','f','0','0','f','f',0}},
+ {grayW, {'#','8','0','8','0','8','0',0}},
+ {greenW, {'#','0','0','8','0','0','0',0}},
+ {limeW, {'#','0','0','f','f','0','0',0}},
+ {maroonW, {'#','8','0','0','0','0','0',0}},
+ {navyW, {'#','0','0','0','0','8','0',0}},
+ {oliveW, {'#','8','0','8','0','0','0',0}},
+ {purpleW, {'#','8','0','0','0','8','0',0}},
+ {redW, {'#','f','f','0','0','0','0',0}},
+ {silverW, {'#','c','0','c','0','c','0',0}},
+ {tealW, {'#','0','0','8','0','8','0',0}},
+ {whiteW, {'#','f','f','f','f','f','f',0}},
+ {yellowW, {'#','f','f','f','f','0','0',0}}
+};
+
+static BSTR nscolor_to_str(LPCWSTR color)
+{
+ int i;
+
+ if(!color || *color == '#')
+ return SysAllocString(color);
+
+ for(i=0; i < sizeof(keyword_table)/sizeof(keyword_table[0]); i++) {
+ if(!strcmpiW(color, keyword_table[i].keyword))
+ return SysAllocString(keyword_table[i].hexstr);
+ }
+
+ WARN("unknown color %s\n", debugstr_w(color));
+ return SysAllocString(color);
+}
+
static BOOL variant_to_nscolor(const VARIANT *v, nsAString *nsstr)
{
switch(V_VT(v)) {
@@ -305,7 +360,7 @@ static HRESULT WINAPI HTMLBodyElement_get_bgColor(IHTMLBodyElement *iface, VARIA
nsAString_GetData(&strColor, &color);
V_VT(p) = VT_BSTR;
- V_BSTR(p) = SysAllocString(color);
+ V_BSTR(p) = nscolor_to_str(color);
nsAString_Finish(&strColor);
diff --git a/reactos/dll/win32/mshtml/htmlcurstyle.c b/reactos/dll/win32/mshtml/htmlcurstyle.c
index 5aaaece85c2..d622239816b 100644
--- a/reactos/dll/win32/mshtml/htmlcurstyle.c
+++ b/reactos/dll/win32/mshtml/htmlcurstyle.c
@@ -90,6 +90,7 @@ static ULONG WINAPI HTMLCurrentStyle_Release(IHTMLCurrentStyle *iface)
if(!ref) {
if(This->nsstyle)
nsIDOMCSSStyleDeclaration_Release(This->nsstyle);
+ release_dispex(&This->dispex);
heap_free(This);
}
@@ -144,15 +145,15 @@ static HRESULT WINAPI HTMLCurrentStyle_get_styleFloat(IHTMLCurrentStyle *iface,
static HRESULT WINAPI HTMLCurrentStyle_get_color(IHTMLCurrentStyle *iface, VARIANT *p)
{
HTMLCurrentStyle *This = HTMLCURSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr_var(This->nsstyle, STYLEID_COLOR, p, 0);
}
static HRESULT WINAPI HTMLCurrentStyle_get_backgroundColor(IHTMLCurrentStyle *iface, VARIANT *p)
{
HTMLCurrentStyle *This = HTMLCURSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr_var(This->nsstyle, STYLEID_BACKGROUND_COLOR, p, 0);
}
static HRESULT WINAPI HTMLCurrentStyle_get_fontFamily(IHTMLCurrentStyle *iface, BSTR *p)
@@ -279,29 +280,29 @@ static HRESULT WINAPI HTMLCurrentStyle_get_borderLeftStyle(IHTMLCurrentStyle *if
static HRESULT WINAPI HTMLCurrentStyle_get_borderTopWidth(IHTMLCurrentStyle *iface, VARIANT *p)
{
HTMLCurrentStyle *This = HTMLCURSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr_var(This->nsstyle, STYLEID_BORDER_TOP_WIDTH, p, 0);
}
static HRESULT WINAPI HTMLCurrentStyle_get_borderRightWidth(IHTMLCurrentStyle *iface, VARIANT *p)
{
HTMLCurrentStyle *This = HTMLCURSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr_var(This->nsstyle, STYLEID_BORDER_RIGHT_WIDTH, p, 0);
}
static HRESULT WINAPI HTMLCurrentStyle_get_borderBottomWidth(IHTMLCurrentStyle *iface, VARIANT *p)
{
HTMLCurrentStyle *This = HTMLCURSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr_var(This->nsstyle, STYLEID_BORDER_BOTTOM_WIDTH, p, 0);
}
static HRESULT WINAPI HTMLCurrentStyle_get_borderLeftWidth(IHTMLCurrentStyle *iface, VARIANT *p)
{
HTMLCurrentStyle *This = HTMLCURSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr_var(This->nsstyle, STYLEID_BORDER_LEFT_WIDTH, p, 0);
}
static HRESULT WINAPI HTMLCurrentStyle_get_left(IHTMLCurrentStyle *iface, VARIANT *p)
@@ -386,8 +387,10 @@ static HRESULT WINAPI HTMLCurrentStyle_get_display(IHTMLCurrentStyle *iface, BST
static HRESULT WINAPI HTMLCurrentStyle_get_visibility(IHTMLCurrentStyle *iface, BSTR *p)
{
HTMLCurrentStyle *This = HTMLCURSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ return get_nsstyle_attr(This->nsstyle, STYLEID_VISIBILITY, p);
}
static HRESULT WINAPI HTMLCurrentStyle_get_zIndex(IHTMLCurrentStyle *iface, VARIANT *p)
@@ -519,8 +522,8 @@ static HRESULT WINAPI HTMLCurrentStyle_get_clipLeft(IHTMLCurrentStyle *iface, VA
static HRESULT WINAPI HTMLCurrentStyle_get_overflow(IHTMLCurrentStyle *iface, BSTR *p)
{
HTMLCurrentStyle *This = HTMLCURSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr(This->nsstyle, STYLEID_OVERFLOW, p);
}
static HRESULT WINAPI HTMLCurrentStyle_get_pageBreakBefore(IHTMLCurrentStyle *iface, BSTR *p)
@@ -723,8 +726,8 @@ static HRESULT WINAPI HTMLCurrentStyle_get_borderColor(IHTMLCurrentStyle *iface,
static HRESULT WINAPI HTMLCurrentStyle_get_borderWidth(IHTMLCurrentStyle *iface, BSTR *p)
{
HTMLCurrentStyle *This = HTMLCURSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr(This->nsstyle, STYLEID_BORDER_WIDTH, p);
}
static HRESULT WINAPI HTMLCurrentStyle_get_padding(IHTMLCurrentStyle *iface, BSTR *p)
@@ -737,8 +740,8 @@ static HRESULT WINAPI HTMLCurrentStyle_get_padding(IHTMLCurrentStyle *iface, BST
static HRESULT WINAPI HTMLCurrentStyle_get_margin(IHTMLCurrentStyle *iface, BSTR *p)
{
HTMLCurrentStyle *This = HTMLCURSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr(This->nsstyle, STYLEID_MARGIN, p);
}
static HRESULT WINAPI HTMLCurrentStyle_get_accelerator(IHTMLCurrentStyle *iface, BSTR *p)
diff --git a/reactos/dll/win32/mshtml/htmldoc.c b/reactos/dll/win32/mshtml/htmldoc.c
index 0b952293293..d5b6cbe5c8f 100644
--- a/reactos/dll/win32/mshtml/htmldoc.c
+++ b/reactos/dll/win32/mshtml/htmldoc.c
@@ -215,6 +215,7 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
detach_selection(This);
detach_ranges(This);
release_nodes(This);
+ release_dispex(&This->dispex);
ConnectionPointContainer_Destroy(&This->cp_container);
@@ -900,17 +901,14 @@ static HRESULT WINAPI HTMLDocument_get_nameProp(IHTMLDocument2 *iface, BSTR *p)
return E_NOTIMPL;
}
-static HRESULT WINAPI HTMLDocument_write(IHTMLDocument2 *iface, SAFEARRAY *psarray)
+static HRESULT document_write(HTMLDocument *This, SAFEARRAY *psarray, BOOL ln)
{
- HTMLDocument *This = HTMLDOC_THIS(iface);
nsAString nsstr;
VARIANT *var;
- ULONG i;
+ ULONG i, argc;
nsresult nsres;
HRESULT hres;
- TRACE("(%p)->(%p)\n", iface, psarray);
-
if(!This->nsdoc) {
WARN("NULL nsdoc\n");
return E_UNEXPECTED;
@@ -929,10 +927,14 @@ static HRESULT WINAPI HTMLDocument_write(IHTMLDocument2 *iface, SAFEARRAY *psarr
nsAString_Init(&nsstr, NULL);
- for(i=0; i < psarray->rgsabound[0].cElements; i++) {
+ argc = psarray->rgsabound[0].cElements;
+ for(i=0; i < argc; i++) {
if(V_VT(var+i) == VT_BSTR) {
nsAString_SetData(&nsstr, V_BSTR(var+i));
- nsres = nsIDOMHTMLDocument_Write(This->nsdoc, &nsstr);
+ if(!ln || i != argc-1)
+ nsres = nsIDOMHTMLDocument_Write(This->nsdoc, &nsstr);
+ else
+ nsres = nsIDOMHTMLDocument_Writeln(This->nsdoc, &nsstr);
if(NS_FAILED(nsres))
ERR("Write failed: %08x\n", nsres);
}else {
@@ -946,11 +948,22 @@ static HRESULT WINAPI HTMLDocument_write(IHTMLDocument2 *iface, SAFEARRAY *psarr
return S_OK;
}
+static HRESULT WINAPI HTMLDocument_write(IHTMLDocument2 *iface, SAFEARRAY *psarray)
+{
+ HTMLDocument *This = HTMLDOC_THIS(iface);
+
+ TRACE("(%p)->(%p)\n", iface, psarray);
+
+ return document_write(This, psarray, FALSE);
+}
+
static HRESULT WINAPI HTMLDocument_writeln(IHTMLDocument2 *iface, SAFEARRAY *psarray)
{
HTMLDocument *This = HTMLDOC_THIS(iface);
- FIXME("(%p)->(%p)\n", This, psarray);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, psarray);
+
+ return document_write(This, psarray, TRUE);
}
static HRESULT WINAPI HTMLDocument_open(IHTMLDocument2 *iface, BSTR url, VARIANT name,
diff --git a/reactos/dll/win32/mshtml/htmlelem.c b/reactos/dll/win32/mshtml/htmlelem.c
index 170d5a0761a..84f63095497 100644
--- a/reactos/dll/win32/mshtml/htmlelem.c
+++ b/reactos/dll/win32/mshtml/htmlelem.c
@@ -931,8 +931,26 @@ static HRESULT WINAPI HTMLElement_put_outerHTML(IHTMLElement *iface, BSTR v)
static HRESULT WINAPI HTMLElement_get_outerHTML(IHTMLElement *iface, BSTR *p)
{
HTMLElement *This = HTMLELEM_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ nsAString html_str;
+ HRESULT hres;
+
+ WARN("(%p)->(%p) semi-stub\n", This, p);
+
+ nsAString_Init(&html_str, NULL);
+ hres = nsnode_to_nsstring(This->node.nsnode, &html_str);
+ if(SUCCEEDED(hres)) {
+ const PRUnichar *html;
+
+ nsAString_GetData(&html_str, &html);
+ *p = SysAllocString(html);
+ if(!*p)
+ hres = E_OUTOFMEMORY;
+ }
+
+ nsAString_Finish(&html_str);
+
+ TRACE("ret %s\n", debugstr_w(*p));
+ return S_OK;
}
static HRESULT WINAPI HTMLElement_put_outerText(IHTMLElement *iface, BSTR v)
diff --git a/reactos/dll/win32/mshtml/htmlelemcol.c b/reactos/dll/win32/mshtml/htmlelemcol.c
index 049da58a9bb..63fcb80544a 100644
--- a/reactos/dll/win32/mshtml/htmlelemcol.c
+++ b/reactos/dll/win32/mshtml/htmlelemcol.c
@@ -132,6 +132,7 @@ static ULONG WINAPI HTMLElementCollection_Release(IHTMLElementCollection *iface)
if(!ref) {
IUnknown_Release(This->ref_unk);
+ release_dispex(&This->dispex);
heap_free(This->elems);
heap_free(This);
}
@@ -236,39 +237,43 @@ static BOOL is_elem_name(HTMLElement *elem, LPCWSTR name)
return ret;
}
+static HRESULT get_item_idx(HTMLElementCollection *This, UINT idx, IDispatch **ret)
+{
+ if(idx < This->len) {
+ *ret = (IDispatch*)This->elems[idx];
+ IDispatch_AddRef(*ret);
+ }
+
+ return S_OK;
+}
+
static HRESULT WINAPI HTMLElementCollection_item(IHTMLElementCollection *iface,
VARIANT name, VARIANT index, IDispatch **pdisp)
{
HTMLElementCollection *This = ELEMCOL_THIS(iface);
+ HRESULT hres = S_OK;
- TRACE("(%p)->(v(%d) v(%d) %p)\n", This, V_VT(&name), V_VT(&index), pdisp);
+ TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&name), debugstr_variant(&index), pdisp);
*pdisp = NULL;
- if(V_VT(&name) == VT_I4) {
- TRACE("name is VT_I4: %d\n", V_I4(&name));
-
+ switch(V_VT(&name)) {
+ case VT_I4:
if(V_I4(&name) < 0)
return E_INVALIDARG;
- if(V_I4(&name) >= This->len)
- return S_OK;
+ hres = get_item_idx(This, V_I4(&name), pdisp);
+ break;
- *pdisp = (IDispatch*)This->elems[V_I4(&name)];
- IDispatch_AddRef(*pdisp);
- TRACE("Returning pdisp=%p\n", pdisp);
- return S_OK;
- }
+ case VT_UINT:
+ hres = get_item_idx(This, V_UINT(&name), pdisp);
+ break;
- if(V_VT(&name) == VT_BSTR) {
+ case VT_BSTR: {
DWORD i;
- TRACE("name is VT_BSTR: %s\n", debugstr_w(V_BSTR(&name)));
-
if(V_VT(&index) == VT_I4) {
LONG idx = V_I4(&index);
- TRACE("index = %d\n", idx);
-
if(idx < 0)
return E_INVALIDARG;
@@ -281,8 +286,6 @@ static HRESULT WINAPI HTMLElementCollection_item(IHTMLElementCollection *iface,
*pdisp = (IDispatch*)HTMLELEM(This->elems[i]);
IDispatch_AddRef(*pdisp);
}
-
- return S_OK;
}else {
elem_vector_t buf = {NULL, 0, 8};
@@ -304,13 +307,18 @@ static HRESULT WINAPI HTMLElementCollection_item(IHTMLElementCollection *iface,
heap_free(buf.buf);
}
-
- return S_OK;
}
+ break;
}
- FIXME("unsupported arguments\n");
- return E_INVALIDARG;
+ default:
+ FIXME("Unsupported name %s\n", debugstr_variant(&name));
+ hres = E_NOTIMPL;
+ }
+
+ if(SUCCEEDED(hres))
+ TRACE("returning %p\n", *pdisp);
+ return hres;
}
static HRESULT WINAPI HTMLElementCollection_tags(IHTMLElementCollection *iface,
@@ -421,6 +429,7 @@ static const IHTMLElementCollectionVtbl HTMLElementCollectionVtbl = {
};
static const dispex_static_data_vtbl_t HTMLElementColection_dispex_vtbl = {
+ NULL,
HTMLElementCollection_get_dispid,
HTMLElementCollection_invoke
};
diff --git a/reactos/dll/win32/mshtml/htmlevent.c b/reactos/dll/win32/mshtml/htmlevent.c
index b73f8658b40..ca7166c004f 100644
--- a/reactos/dll/win32/mshtml/htmlevent.c
+++ b/reactos/dll/win32/mshtml/htmlevent.c
@@ -176,8 +176,10 @@ static ULONG WINAPI HTMLEventObj_Release(IHTMLEventObj *iface)
TRACE("(%p) ref=%d\n", This, ref);
- if(!ref)
+ if(!ref) {
+ release_dispex(&This->dispex);
heap_free(This);
+ }
return ref;
}
diff --git a/reactos/dll/win32/mshtml/htmlinput.c b/reactos/dll/win32/mshtml/htmlinput.c
index eaffae5b534..df7cb5fb304 100644
--- a/reactos/dll/win32/mshtml/htmlinput.c
+++ b/reactos/dll/win32/mshtml/htmlinput.c
@@ -839,7 +839,7 @@ static HRESULT WINAPI HTMLInputTextElement_get_value(IHTMLInputTextElement *ifac
TRACE("(%p)->(%p)\n", This, p);
- return IHTMLInputTextElement_get_value(HTMLINPUT(This), p);
+ return IHTMLInputElement_get_value(HTMLINPUT(This), p);
}
static HRESULT WINAPI HTMLInputTextElement_put_name(IHTMLInputTextElement *iface, BSTR v)
diff --git a/reactos/dll/win32/mshtml/htmllocation.c b/reactos/dll/win32/mshtml/htmllocation.c
index c671073b84b..8637838b776 100644
--- a/reactos/dll/win32/mshtml/htmllocation.c
+++ b/reactos/dll/win32/mshtml/htmllocation.c
@@ -23,7 +23,10 @@
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
+#include "winreg.h"
#include "ole2.h"
+#include "wininet.h"
+#include "shlwapi.h"
#include "wine/debug.h"
@@ -79,6 +82,7 @@ static ULONG WINAPI HTMLLocation_Release(IHTMLLocation *iface)
if(!ref) {
if(This->doc && This->doc->location == This)
This->doc->location = NULL;
+ release_dispex(&This->dispex);
heap_free(This);
}
@@ -125,8 +129,20 @@ static HRESULT WINAPI HTMLLocation_put_href(IHTMLLocation *iface, BSTR v)
static HRESULT WINAPI HTMLLocation_get_href(IHTMLLocation *iface, BSTR *p)
{
HTMLLocation *This = HTMLLOCATION_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ if(!p)
+ return E_POINTER;
+
+ if(!This->doc || !This->doc->url) {
+ FIXME("No current URL\n");
+ return E_NOTIMPL;
+ }
+
+ *p = SysAllocString(This->doc->url);
+
+ return S_OK;
}
static HRESULT WINAPI HTMLLocation_put_protocol(IHTMLLocation *iface, BSTR v)
@@ -195,8 +211,41 @@ static HRESULT WINAPI HTMLLocation_put_pathname(IHTMLLocation *iface, BSTR v)
static HRESULT WINAPI HTMLLocation_get_pathname(IHTMLLocation *iface, BSTR *p)
{
HTMLLocation *This = HTMLLOCATION_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ WCHAR buf[INTERNET_MAX_PATH_LENGTH];
+ URL_COMPONENTSW url = {sizeof(url)};
+ DWORD size = 0;
+ HRESULT hres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ if(!This->doc || !This->doc->url) {
+ FIXME("No current URL\n");
+ return E_NOTIMPL;
+ }
+
+ hres = CoInternetParseUrl(This->doc->url, PARSE_PATH_FROM_URL, 0, buf, sizeof(buf), &size, 0);
+ if(SUCCEEDED(hres)) {
+ *p = SysAllocString(buf);
+ if(!*p)
+ return E_OUTOFMEMORY;
+ return S_OK;
+ }
+
+ url.dwUrlPathLength = 1;
+ if(!InternetCrackUrlW(This->doc->url, 0, 0, &url)) {
+ FIXME("InternetCrackUrl failed\n");
+ return E_FAIL;
+ }
+
+ if(!url.dwUrlPathLength) {
+ *p = NULL;
+ return S_OK;
+ }
+
+ *p = SysAllocStringLen(url.lpszUrlPath, url.dwUrlPathLength);
+ if(!*p)
+ return E_OUTOFMEMORY;
+ return S_OK;
}
static HRESULT WINAPI HTMLLocation_put_search(IHTMLLocation *iface, BSTR v)
@@ -255,6 +304,34 @@ static HRESULT WINAPI HTMLLocation_toString(IHTMLLocation *iface, BSTR *String)
return E_NOTIMPL;
}
+static HRESULT HTMLLocation_value(IUnknown *iface, LCID lcid, WORD flags, DISPPARAMS *params,
+ VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+{
+ HTMLLocation *This = HTMLLOCATION_THIS(iface);
+ HRESULT hres;
+
+ TRACE("(%p)\n", This);
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET: {
+ BSTR str;
+
+ hres = IHTMLLocation_get_href(HTMLLOCATION(This), &str);
+ if(FAILED(hres))
+ return hres;
+
+ V_VT(res) = VT_BSTR;
+ V_BSTR(res) = str;
+ break;
+ }
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
#undef HTMLLOCATION_THIS
static const IHTMLLocationVtbl HTMLLocationVtbl = {
@@ -287,13 +364,19 @@ static const IHTMLLocationVtbl HTMLLocationVtbl = {
HTMLLocation_toString
};
+static const dispex_static_data_vtbl_t HTMLLocation_dispex_vtbl = {
+ HTMLLocation_value,
+ NULL,
+ NULL
+};
+
static const tid_t HTMLLocation_iface_tids[] = {
IHTMLLocation_tid,
0
};
static dispex_static_data_t HTMLLocation_dispex = {
- NULL,
- IHTMLLocation_tid,
+ &HTMLLocation_dispex_vtbl,
+ DispHTMLLocation_tid,
NULL,
HTMLLocation_iface_tids
};
diff --git a/reactos/dll/win32/mshtml/htmlnode.c b/reactos/dll/win32/mshtml/htmlnode.c
index 32b08019ec1..30fdac87162 100644
--- a/reactos/dll/win32/mshtml/htmlnode.c
+++ b/reactos/dll/win32/mshtml/htmlnode.c
@@ -157,6 +157,11 @@ static HRESULT WINAPI HTMLDOMChildrenCollection_item(IHTMLDOMChildrenCollection
TRACE("(%p)->(%d %p)\n", This, index, ppItem);
+ if (ppItem)
+ *ppItem = NULL;
+ else
+ return E_POINTER;
+
nsIDOMNodeList_GetLength(This->nslist, &length);
if(index < 0 || index >= length)
return E_INVALIDARG;
@@ -245,6 +250,7 @@ static const tid_t HTMLDOMChildrenCollection_iface_tids[] = {
};
static const dispex_static_data_vtbl_t HTMLDOMChildrenCollection_dispex_vtbl = {
+ NULL,
HTMLDOMChildrenCollection_get_dispid,
HTMLDOMChildrenCollection_invoke
};
@@ -302,6 +308,7 @@ static ULONG WINAPI HTMLDOMNode_Release(IHTMLDOMNode *iface)
if(!ref) {
This->vtbl->destructor(This);
+ release_dispex(&This->dispex);
heap_free(This);
}
diff --git a/reactos/dll/win32/mshtml/htmloption.c b/reactos/dll/win32/mshtml/htmloption.c
index ae36a99f753..49d8deb3272 100644
--- a/reactos/dll/win32/mshtml/htmloption.c
+++ b/reactos/dll/win32/mshtml/htmloption.c
@@ -31,13 +31,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
-typedef struct {
+struct HTMLOptionElement {
HTMLElement element;
const IHTMLOptionElementVtbl *lpHTMLOptionElementVtbl;
nsIDOMHTMLOptionElement *nsoption;
-} HTMLOptionElement;
+};
#define HTMLOPTION(x) (&(x)->lpHTMLOptionElementVtbl)
diff --git a/reactos/dll/win32/mshtml/htmlstyle.c b/reactos/dll/win32/mshtml/htmlstyle.c
index 6a225a6bffc..a993702eaea 100644
--- a/reactos/dll/win32/mshtml/htmlstyle.c
+++ b/reactos/dll/win32/mshtml/htmlstyle.c
@@ -59,6 +59,8 @@ static const WCHAR attrBorderLeft[] =
{'b','o','r','d','e','r','-','l','e','f','t',0};
static const WCHAR attrBorderLeftStyle[] =
{'b','o','r','d','e','r','-','l','e','f','t','-','s','t','y','l','e',0};
+static const WCHAR attrBorderLeftWidth[] =
+ {'b','o','r','d','e','r','-','l','e','f','t','-','w','i','d','t','h',0};
static const WCHAR attrBorderRightStyle[] =
{'b','o','r','d','e','r','-','r','i','g','h','t','-','s','t','y','l','e',0};
static const WCHAR attrBorderRightWidth[] =
@@ -93,6 +95,8 @@ static const WCHAR attrHeight[] =
{'h','e','i','g','h','t',0};
static const WCHAR attrLeft[] =
{'l','e','f','t',0};
+static const WCHAR attrLetterSpacing[] =
+ {'l','e','t','t','e','r','-','s','p','a','c','i','n','g',0};
static const WCHAR attrMargin[] =
{'m','a','r','g','i','n',0};
static const WCHAR attrMarginLeft[] =
@@ -119,6 +123,10 @@ static const WCHAR attrVisibility[] =
{'v','i','s','i','b','i','l','i','t','y',0};
static const WCHAR attrWidth[] =
{'w','i','d','t','h',0};
+static const WCHAR attrWordSpacing[] =
+ {'w','o','r','d','-','s','p','a','c','i','n','g',0};
+static const WCHAR attrWordWrap[] =
+ {'w','o','r','d','-','w','r','a','p',0};
static const WCHAR attrZIndex[] =
{'z','-','i','n','d','e','x',0};
@@ -138,6 +146,7 @@ static const struct{
{attrBorderColor, DISPID_IHTMLSTYLE_BORDERCOLOR},
{attrBorderLeft, DISPID_IHTMLSTYLE_BORDERLEFT},
{attrBorderLeftStyle, DISPID_IHTMLSTYLE_BORDERLEFTSTYLE},
+ {attrBorderLeftWidth, DISPID_IHTMLSTYLE_BORDERLEFTWIDTH},
{attrBorderRightStyle, DISPID_IHTMLSTYLE_BORDERRIGHTSTYLE},
{attrBorderRightWidth, DISPID_IHTMLSTYLE_BORDERRIGHTWIDTH},
{attrBorderStyle, DISPID_IHTMLSTYLE_BORDERSTYLE},
@@ -155,6 +164,7 @@ static const struct{
{attrFontWeight, DISPID_IHTMLSTYLE_FONTWEIGHT},
{attrHeight, DISPID_IHTMLSTYLE_HEIGHT},
{attrLeft, DISPID_IHTMLSTYLE_LEFT},
+ {attrLetterSpacing, DISPID_IHTMLSTYLE_LETTERSPACING},
{attrMargin, DISPID_IHTMLSTYLE_MARGIN},
{attrMarginLeft, DISPID_IHTMLSTYLE_MARGINLEFT},
{attrMarginRight, DISPID_IHTMLSTYLE_MARGINRIGHT},
@@ -168,6 +178,8 @@ static const struct{
{attrVerticalAlign, DISPID_IHTMLSTYLE_VERTICALALIGN},
{attrVisibility, DISPID_IHTMLSTYLE_VISIBILITY},
{attrWidth, DISPID_IHTMLSTYLE_WIDTH},
+ {attrWordSpacing, DISPID_IHTMLSTYLE_WORDSPACING},
+ {attrWordWrap, DISPID_IHTMLSTYLE3_WORDWRAP},
{attrZIndex, DISPID_IHTMLSTYLE_ZINDEX}
};
@@ -542,6 +554,7 @@ static ULONG WINAPI HTMLStyle_Release(IHTMLStyle *iface)
if(!ref) {
if(This->nsstyle)
nsIDOMCSSStyleDeclaration_Release(This->nsstyle);
+ release_dispex(&This->dispex);
heap_free(This);
}
@@ -917,29 +930,29 @@ static HRESULT WINAPI HTMLStyle_get_backgroundPositionY(IHTMLStyle *iface, VARIA
static HRESULT WINAPI HTMLStyle_put_wordSpacing(IHTMLStyle *iface, VARIANT v)
{
HTMLStyle *This = HTMLSTYLE_THIS(iface);
- FIXME("(%p)->(v%d)\n", This, V_VT(&v));
- return E_NOTIMPL;
+ TRACE("(%p)->(v%d)\n", This, V_VT(&v));
+ return set_nsstyle_attr_var(This->nsstyle, STYLEID_WORD_SPACING, &v, 0);
}
static HRESULT WINAPI HTMLStyle_get_wordSpacing(IHTMLStyle *iface, VARIANT *p)
{
HTMLStyle *This = HTMLSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr_var(This->nsstyle, STYLEID_WORD_SPACING, p, 0);
}
static HRESULT WINAPI HTMLStyle_put_letterSpacing(IHTMLStyle *iface, VARIANT v)
{
HTMLStyle *This = HTMLSTYLE_THIS(iface);
- FIXME("(%p)->(v%d)\n", This, V_VT(&v));
- return E_NOTIMPL;
+ TRACE("(%p)->(v%d)\n", This, V_VT(&v));
+ return set_nsstyle_attr_var(This->nsstyle, STYLEID_LETTER_SPACING, &v, 0);
}
static HRESULT WINAPI HTMLStyle_get_letterSpacing(IHTMLStyle *iface, VARIANT *p)
{
HTMLStyle *This = HTMLSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr_var(This->nsstyle, STYLEID_LETTER_SPACING, p, 0);
}
static HRESULT WINAPI HTMLStyle_put_textDecoration(IHTMLStyle *iface, BSTR v)
@@ -1571,15 +1584,15 @@ static HRESULT WINAPI HTMLStyle_get_borderBottomWidth(IHTMLStyle *iface, VARIANT
static HRESULT WINAPI HTMLStyle_put_borderLeftWidth(IHTMLStyle *iface, VARIANT v)
{
HTMLStyle *This = HTMLSTYLE_THIS(iface);
- FIXME("(%p)->(v%d)\n", This, V_VT(&v));
- return E_NOTIMPL;
+ TRACE("(%p)->(v%d)\n", This, V_VT(&v));
+ return set_nsstyle_attr_var(This->nsstyle, STYLEID_BORDER_LEFT_WIDTH, &v, 0);
}
static HRESULT WINAPI HTMLStyle_get_borderLeftWidth(IHTMLStyle *iface, VARIANT *p)
{
HTMLStyle *This = HTMLSTYLE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, p);
+ return get_nsstyle_attr_var(This->nsstyle, STYLEID_BORDER_LEFT_WIDTH, p, 0);
}
static HRESULT WINAPI HTMLStyle_put_borderStyle(IHTMLStyle *iface, BSTR v)
@@ -2598,6 +2611,7 @@ static const IHTMLStyleVtbl HTMLStyleVtbl = {
};
static const dispex_static_data_vtbl_t HTMLStyle_dispex_vtbl = {
+ NULL,
HTMLStyle_get_dispid,
NULL
};
diff --git a/reactos/dll/win32/mshtml/htmlstyle.h b/reactos/dll/win32/mshtml/htmlstyle.h
index 596f5793f31..b691804cefa 100644
--- a/reactos/dll/win32/mshtml/htmlstyle.h
+++ b/reactos/dll/win32/mshtml/htmlstyle.h
@@ -47,6 +47,7 @@ typedef enum {
STYLEID_BORDER_COLOR,
STYLEID_BORDER_LEFT,
STYLEID_BORDER_LEFT_STYLE,
+ STYLEID_BORDER_LEFT_WIDTH,
STYLEID_BORDER_RIGHT_STYLE,
STYLEID_BORDER_RIGHT_WIDTH,
STYLEID_BORDER_STYLE,
@@ -64,6 +65,7 @@ typedef enum {
STYLEID_FONT_WEIGHT,
STYLEID_HEIGHT,
STYLEID_LEFT,
+ STYLEID_LETTER_SPACING,
STYLEID_MARGIN,
STYLEID_MARGIN_LEFT,
STYLEID_MARGIN_RIGHT,
@@ -77,6 +79,8 @@ typedef enum {
STYLEID_VERTICAL_ALIGN,
STYLEID_VISIBILITY,
STYLEID_WIDTH,
+ STYLEID_WORD_SPACING,
+ STYLEID_WORD_WRAP,
STYLEID_Z_INDEX
} styleid_t;
diff --git a/reactos/dll/win32/mshtml/htmlstyle3.c b/reactos/dll/win32/mshtml/htmlstyle3.c
index ce1d56e197d..505e91e01d1 100644
--- a/reactos/dll/win32/mshtml/htmlstyle3.c
+++ b/reactos/dll/win32/mshtml/htmlstyle3.c
@@ -117,15 +117,19 @@ static HRESULT WINAPI HTMLStyle3_get_zoom(IHTMLStyle3 *iface, VARIANT *p)
static HRESULT WINAPI HTMLStyle3_put_wordWrap(IHTMLStyle3 *iface, BSTR v)
{
HTMLStyle *This = HTMLSTYLE3_THIS(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(v));
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+ return set_nsstyle_attr(This->nsstyle, STYLEID_WORD_WRAP, v, 0);
}
static HRESULT WINAPI HTMLStyle3_get_wordWrap(IHTMLStyle3 *iface, BSTR *p)
{
HTMLStyle *This = HTMLSTYLE3_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ return get_nsstyle_attr(This->nsstyle, STYLEID_WORD_WRAP, p);
}
static HRESULT WINAPI HTMLStyle3_put_textUnderlinePosition(IHTMLStyle3 *iface, BSTR v)
diff --git a/reactos/dll/win32/mshtml/htmlstylesheet.c b/reactos/dll/win32/mshtml/htmlstylesheet.c
index dca4214d634..e39bfb761ce 100644
--- a/reactos/dll/win32/mshtml/htmlstylesheet.c
+++ b/reactos/dll/win32/mshtml/htmlstylesheet.c
@@ -48,13 +48,13 @@ struct HTMLStyleSheetsCollection {
nsIDOMStyleSheetList *nslist;
};
-typedef struct {
+struct HTMLStyleSheetRulesCollection {
const IHTMLStyleSheetRulesCollectionVtbl *lpHTMLStyleSheetRulesCollectionVtbl;
LONG ref;
nsIDOMCSSRuleList *nslist;
-} HTMLStyleSheetRulesCollection;
+};
#define HTMLSTYLESHEET(x) ((IHTMLStyleSheet*) &(x)->lpHTMLStyleSheetVtbl)
#define HTMLSTYLESHEETSCOL(x) ((IHTMLStyleSheetsCollection*) &(x)->lpHTMLStyleSheetsCollectionVtbl)
diff --git a/reactos/dll/win32/mshtml/htmlwindow.c b/reactos/dll/win32/mshtml/htmlwindow.c
index a92870941bf..d50eca17758 100644
--- a/reactos/dll/win32/mshtml/htmlwindow.c
+++ b/reactos/dll/win32/mshtml/htmlwindow.c
@@ -93,6 +93,7 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
if(!ref) {
list_remove(&This->entry);
+ release_dispex(&This->dispex);
heap_free(This);
}
@@ -745,8 +746,16 @@ static HRESULT WINAPI HTMLWindow2_execScript(IHTMLWindow2 *iface, BSTR scode, BS
static HRESULT WINAPI HTMLWindow2_toString(IHTMLWindow2 *iface, BSTR *String)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
- FIXME("(%p)->(%p)\n", This, String);
- return E_NOTIMPL;
+
+ static const WCHAR objectW[] = {'[','o','b','j','e','c','t',']',0};
+
+ TRACE("(%p)->(%p)\n", This, String);
+
+ if(!String)
+ return E_INVALIDARG;
+
+ *String = SysAllocString(objectW);
+ return *String ? S_OK : E_OUTOFMEMORY;
}
static HRESULT WINAPI HTMLWindow2_scrollBy(IHTMLWindow2 *iface, LONG x, LONG y)
diff --git a/reactos/dll/win32/mshtml/install.c b/reactos/dll/win32/mshtml/install.c
index 7bfe0f6201c..58ac724a2e7 100644
--- a/reactos/dll/win32/mshtml/install.c
+++ b/reactos/dll/win32/mshtml/install.c
@@ -47,7 +47,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
-#define GECKO_FILE_NAME "wine_gecko-" GECKO_VERSION ".cab"
+#define GECKO_FILE_NAME "wine_gecko-" GECKO_VERSION "-x86.cab"
static const WCHAR mshtml_keyW[] =
{'S','o','f','t','w','a','r','e',
@@ -146,7 +146,7 @@ static BOOL install_cab(LPCWSTR file_name)
TRACE("(%s)\n", debugstr_w(file_name));
- GetWindowsDirectoryA(install_dir, sizeof(install_dir));
+ GetSystemDirectoryA(install_dir, sizeof(install_dir));
strcat(install_dir, "\\gecko\\");
res = CreateDirectoryA(install_dir, NULL);
if(!res && GetLastError() != ERROR_ALREADY_EXISTS) {
@@ -430,7 +430,7 @@ static LPWSTR get_url(void)
static const WCHAR wszGeckoUrl[] = {'G','e','c','k','o','U','r','l',0};
static const WCHAR httpW[] = {'h','t','t','p'};
- static const WCHAR v_formatW[] = {'?','v','=',0};
+ static const WCHAR v_formatW[] = {'?','a','r','c','h','=','x','8','6','&','v','=',0};
/* @@ Wine registry key: HKCU\Software\Wine\MSHTML */
res = RegOpenKeyW(HKEY_CURRENT_USER, mshtml_keyW, &hkey);
diff --git a/reactos/dll/win32/mshtml/main.c b/reactos/dll/win32/mshtml/main.c
index b1c8756ee99..548c50ca966 100644
--- a/reactos/dll/win32/mshtml/main.c
+++ b/reactos/dll/win32/mshtml/main.c
@@ -44,7 +44,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
HINSTANCE hInst;
-DWORD mshtml_tls = 0;
+DWORD mshtml_tls = TLS_OUT_OF_INDEXES;
static HINSTANCE shdoclc = NULL;
@@ -69,7 +69,7 @@ static void process_detach(void)
if(shdoclc)
FreeLibrary(shdoclc);
- if(mshtml_tls)
+ if(mshtml_tls != TLS_OUT_OF_INDEXES)
TlsFree(mshtml_tls);
}
@@ -284,7 +284,6 @@ DEFINE_GUID(CLSID_HTMLPluginDocument, 0x25336921, 0x03F9, 0x11CF, 0x8F,0xD0, 0x0
DEFINE_GUID(CLSID_HTMLPopup, 0x3050F667, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
DEFINE_GUID(CLSID_HTMLPopupDoc, 0x3050F67D, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
DEFINE_GUID(CLSID_HTMLServerDoc, 0x3050F4E7, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
-DEFINE_GUID(CLSID_HTMLWindowProxy, 0x3050F391, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
DEFINE_GUID(CLSID_IImageDecodeFilter, 0x607FD4E8, 0x0A03, 0x11D1, 0xAB,0x1D, 0x00,0xC0,0x4F,0xC9,0xB3,0x04);
DEFINE_GUID(CLSID_IImgCtx, 0x3050F3D6, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
DEFINE_GUID(CLSID_IntDitherer, 0x05F6FE1A, 0xECEF, 0x11D0, 0xAA,0xE7, 0x00,0xC0,0x4F,0xC9,0xB3,0x04);
@@ -434,6 +433,8 @@ const char *debugstr_variant(const VARIANT *v)
return wine_dbg_sprintf("{VT_DISPATCH: %p}", V_DISPATCH(v));
case VT_BOOL:
return wine_dbg_sprintf("{VT_BOOL: %x}", V_BOOL(v));
+ case VT_UINT:
+ return wine_dbg_sprintf("{VT_UINT: %u}", V_UINT(v));
default:
return wine_dbg_sprintf("{vt %d}", V_VT(v));
}
diff --git a/reactos/dll/win32/mshtml/mshtml.rbuild b/reactos/dll/win32/mshtml/mshtml.rbuild
index ead2dcb4deb..ff605823772 100644
--- a/reactos/dll/win32/mshtml/mshtml.rbuild
+++ b/reactos/dll/win32/mshtml/mshtml.rbuild
@@ -77,6 +77,7 @@
gdi32
advapi32
kernel32
+ wininet
ntdll
mshtml_nsiface_header
diff --git a/reactos/dll/win32/mshtml/mshtml_private.h b/reactos/dll/win32/mshtml/mshtml_private.h
index ebb63bbd39c..ecae0a55310 100644
--- a/reactos/dll/win32/mshtml/mshtml_private.h
+++ b/reactos/dll/win32/mshtml/mshtml_private.h
@@ -33,9 +33,6 @@
#include "nsiface.h"
-#define GENERATE_MSHTML_NS_FAILURE(code) \
- ((nsresult) ((PRUint32)(1<<31) | ((PRUint32)(0x45+6)<<16) | (PRUint32)(code)))
-
#define NS_OK ((nsresult)0x00000000L)
#define NS_ERROR_FAILURE ((nsresult)0x80004005L)
#define NS_NOINTERFACE ((nsresult)0x80004002L)
@@ -44,8 +41,6 @@
#define NS_ERROR_UNEXPECTED ((nsresult)0x8000ffffL)
#define NS_ERROR_UNKNOWN_PROTOCOL ((nsresult)0x804b0012L)
-#define WINE_NS_LOAD_FROM_MONIKER GENERATE_MSHTML_NS_FAILURE(0)
-
#define NS_FAILED(res) ((res) & 0x80000000)
#define NS_SUCCEEDED(res) (!NS_FAILED(res))
@@ -74,6 +69,8 @@ typedef enum {
DispHTMLIFrame_tid,
DispHTMLImg_tid,
DispHTMLInputElement_tid,
+ DispHTMLLocation_tid,
+ DispHTMLNavigator_tid,
DispHTMLOptionElement_tid,
DispHTMLSelectElement_tid,
DispHTMLStyle_tid,
@@ -130,6 +127,7 @@ typedef struct dispex_dynamic_data_t dispex_dynamic_data_t;
#define MSHTML_DISPID_CUSTOM_MAX 0x6fffffff
typedef struct {
+ HRESULT (*value)(IUnknown*,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
HRESULT (*get_dispid)(IUnknown*,BSTR,DWORD,DISPID*);
HRESULT (*invoke)(IUnknown*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
} dispex_static_data_vtbl_t;
@@ -151,6 +149,7 @@ typedef struct {
} DispatchEx;
void init_dispex(DispatchEx*,IUnknown*,dispex_static_data_t*);
+void release_dispex(DispatchEx*);
BOOL dispex_query_interface(DispatchEx*,REFIID,void**);
HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**);
@@ -361,11 +360,13 @@ struct NSContainer {
typedef struct {
const nsIHttpChannelVtbl *lpHttpChannelVtbl;
const nsIUploadChannelVtbl *lpUploadChannelVtbl;
+ const nsIHttpChannelInternalVtbl *lpIHttpChannelInternalVtbl;
LONG ref;
nsIChannel *channel;
nsIHttpChannel *http_channel;
+ nsIHttpChannelInternal *http_channel_internal;
nsIWineURI *uri;
nsIInputStream *post_data_stream;
nsILoadGroup *load_group;
@@ -375,6 +376,7 @@ typedef struct {
nsIURI *original_uri;
char *content_type;
char *charset;
+ PRUint32 response_status;
} nsChannel;
typedef struct {
@@ -464,6 +466,7 @@ typedef struct {
#define NSCHANNEL(x) ((nsIChannel*) &(x)->lpHttpChannelVtbl)
#define NSHTTPCHANNEL(x) ((nsIHttpChannel*) &(x)->lpHttpChannelVtbl)
#define NSUPCHANNEL(x) ((nsIUploadChannel*) &(x)->lpUploadChannelVtbl)
+#define NSHTTPINTERNAL(x) ((nsIHttpChannelInternal*) &(x)->lpIHttpChannelInternalVtbl)
#define HTTPNEG(x) ((IHttpNegotiate2*) &(x)->lpHttpNegotiate2Vtbl)
#define STATUSCLB(x) ((IBindStatusCallback*) &(x)->lpBindStatusCallbackVtbl)
@@ -557,9 +560,8 @@ void nsAString_SetData(nsAString*,const PRUnichar*);
PRUint32 nsAString_GetData(const nsAString*,const PRUnichar**);
void nsAString_Finish(nsAString*);
-nsIInputStream *create_nsstream(const char*,PRInt32);
nsICommandParams *create_nscommand_params(void);
-void nsnode_to_nsstring(nsIDOMNode*,nsAString*);
+HRESULT nsnode_to_nsstring(nsIDOMNode*,nsAString*);
void get_editor_controller(NSContainer*);
void init_nsevents(NSContainer*);
void add_nsevent_listener(NSContainer*,LPCWSTR);
diff --git a/reactos/dll/win32/mshtml/mutation.c b/reactos/dll/win32/mshtml/mutation.c
index ab9649ca6c1..f161de4eef2 100644
--- a/reactos/dll/win32/mshtml/mutation.c
+++ b/reactos/dll/win32/mshtml/mutation.c
@@ -412,6 +412,11 @@ static void NSAPI nsDocumentObserver_CharacterDataChanged(nsIDocumentObserver *i
{
}
+static void NSAPI nsDocumentObserver_AttributeWillChange(nsIDocumentObserver *iface, nsIDocument *aDocument,
+ nsIContent *aContent, PRInt32 aNameSpaceID, nsIAtom *aAttribute, PRInt32 aModType)
+{
+}
+
static void NSAPI nsDocumentObserver_AttributeChanged(nsIDocumentObserver *iface, nsIDocument *aDocument,
nsIContent *aContent, PRInt32 aNameSpaceID, nsIAtom *aAttribute, PRInt32 aModType, PRUint32 aStateMask)
{
@@ -456,6 +461,22 @@ static void NSAPI nsDocumentObserver_BeginLoad(nsIDocumentObserver *iface, nsIDo
static void NSAPI nsDocumentObserver_EndLoad(nsIDocumentObserver *iface, nsIDocument *aDocument)
{
+ NSContainer *This = NSDOCOBS_THIS(iface);
+ task_t *task;
+
+ TRACE("\n");
+
+ task = heap_alloc(sizeof(task_t));
+
+ task->doc = This->doc;
+ task->task_id = TASK_PARSECOMPLETE;
+ task->next = NULL;
+
+ /*
+ * This should be done in the worker thread that parses HTML,
+ * but we don't have such thread (Gecko parses HTML for us).
+ */
+ push_task(task);
}
static void NSAPI nsDocumentObserver_ContentStatesChanged(nsIDocumentObserver *iface, nsIDocument *aDocument,
@@ -563,6 +584,7 @@ static const nsIDocumentObserverVtbl nsDocumentObserverVtbl = {
nsDocumentObserver_Release,
nsDocumentObserver_CharacterDataWillChange,
nsDocumentObserver_CharacterDataChanged,
+ nsDocumentObserver_AttributeWillChange,
nsDocumentObserver_AttributeChanged,
nsDocumentObserver_ContentAppended,
nsDocumentObserver_ContentInserted,
diff --git a/reactos/dll/win32/mshtml/navigate.c b/reactos/dll/win32/mshtml/navigate.c
index 6e41699b280..1a0d5eb4024 100644
--- a/reactos/dll/win32/mshtml/navigate.c
+++ b/reactos/dll/win32/mshtml/navigate.c
@@ -54,10 +54,12 @@ typedef struct {
typedef struct {
void (*destroy)(BSCallback*);
+ HRESULT (*init_bindinfo)(BSCallback*);
HRESULT (*start_binding)(BSCallback*);
HRESULT (*stop_binding)(BSCallback*,HRESULT);
HRESULT (*read_data)(BSCallback*,IStream*);
HRESULT (*on_progress)(BSCallback*,ULONG,LPCWSTR);
+ HRESULT (*on_response)(BSCallback*,DWORD);
} BSCallbackVtbl;
struct BSCallback {
@@ -75,6 +77,7 @@ struct BSCallback {
ULONG post_data_len;
ULONG readed;
DWORD bindf;
+ BOOL bindinfo_ready;
IMoniker *mon;
IBinding *binding;
@@ -152,18 +155,21 @@ static nsresult NSAPI nsInputStream_Read(nsIInputStream *iface, char *aBuf, PRUi
PRUint32 *_retval)
{
nsProtocolStream *This = NSINSTREAM_THIS(iface);
+ DWORD read = aCount;
TRACE("(%p)->(%p %d %p)\n", This, aBuf, aCount, _retval);
- /* Gecko always calls Read with big enough buffer */
- if(aCount < This->buf_size)
- FIXME("aCount < This->buf_size\n");
+ if(read > This->buf_size)
+ read = This->buf_size;
- *_retval = This->buf_size;
- if(This->buf_size)
- memcpy(aBuf, This->buf, This->buf_size);
- This->buf_size = 0;
+ if(read) {
+ memcpy(aBuf, This->buf, read);
+ if(read < This->buf_size)
+ memmove(This->buf, This->buf+read, This->buf_size-read);
+ This->buf_size -= read;
+ }
+ *_retval = read;
return NS_OK;
}
@@ -341,19 +347,23 @@ static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *ifac
HRESULT hresult, LPCWSTR szError)
{
BSCallback *This = STATUSCLB_THIS(iface);
+ HRESULT hres;
TRACE("(%p)->(%08x %s)\n", This, hresult, debugstr_w(szError));
/* NOTE: IE7 calls GetBindResult here */
+ hres = This->vtbl->stop_binding(This, hresult);
+
if(This->binding) {
IBinding_Release(This->binding);
This->binding = NULL;
}
list_remove(&This->entry);
+ This->doc = NULL;
- return This->vtbl->stop_binding(This, hresult);
+ return hres;
}
static HRESULT WINAPI BindStatusCallback_GetBindInfo(IBindStatusCallback *iface,
@@ -364,6 +374,16 @@ static HRESULT WINAPI BindStatusCallback_GetBindInfo(IBindStatusCallback *iface,
TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo);
+ if(!This->bindinfo_ready) {
+ HRESULT hres;
+
+ hres = This->vtbl->init_bindinfo(This);
+ if(FAILED(hres))
+ return hres;
+
+ This->bindinfo_ready = TRUE;
+ }
+
*grfBINDF = This->bindf;
size = pbindinfo->cbSize;
@@ -466,9 +486,11 @@ static HRESULT WINAPI HttpNegotiate_OnResponse(IHttpNegotiate2 *iface, DWORD dwR
LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR *pszAdditionalRequestHeaders)
{
BSCallback *This = HTTPNEG_THIS(iface);
- FIXME("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders),
+
+ TRACE("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders),
debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders);
- return E_NOTIMPL;
+
+ return This->vtbl->on_response(This, dwResponseCode);
}
static HRESULT WINAPI HttpNegotiate_GetRootSecurityId(IHttpNegotiate2 *iface,
@@ -741,6 +763,11 @@ static void BufferBSC_destroy(BSCallback *bsc)
heap_free(This);
}
+static HRESULT BufferBSC_init_bindinfo(BSCallback *bsc)
+{
+ return S_OK;
+}
+
static HRESULT BufferBSC_start_binding(BSCallback *bsc)
{
return S_OK;
@@ -791,14 +818,21 @@ static HRESULT BufferBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCWSTR
return S_OK;
}
+static HRESULT BufferBSC_on_response(BSCallback *bsc, DWORD response_code)
+{
+ return S_OK;
+}
+
#undef BUFFERBSC_THIS
static const BSCallbackVtbl BufferBSCVtbl = {
BufferBSC_destroy,
+ BufferBSC_init_bindinfo,
BufferBSC_start_binding,
BufferBSC_stop_binding,
BufferBSC_read_data,
BufferBSC_on_progress,
+ BufferBSC_on_response
};
@@ -845,14 +879,46 @@ struct nsChannelBSC {
nsProtocolStream *nsstream;
};
+static void on_start_nsrequest(nsChannelBSC *This)
+{
+ nsresult nsres;
+
+ /* FIXME: it's needed for http connections from BindToObject. */
+ if(!This->nschannel->response_status)
+ This->nschannel->response_status = 200;
+
+ nsres = nsIStreamListener_OnStartRequest(This->nslistener,
+ (nsIRequest*)NSCHANNEL(This->nschannel), This->nscontext);
+ if(NS_FAILED(nsres))
+ FIXME("OnStartRequest failed: %08x\n", nsres);
+}
+
+static void on_stop_nsrequest(nsChannelBSC *This)
+{
+ nsresult nsres;
+
+ if(!This->nslistener)
+ return;
+
+ if(!This->bsc.readed) {
+ TRACE("No data read! Calling OnStartRequest\n");
+ on_start_nsrequest(This);
+ }
+
+ nsres = nsIStreamListener_OnStopRequest(This->nslistener, (nsIRequest*)NSCHANNEL(This->nschannel),
+ This->nscontext, NS_OK);
+ if(NS_FAILED(nsres))
+ WARN("OnStopRequest failed: %08x\n", nsres);
+}
+
static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
{
+ DWORD read;
nsresult nsres;
HRESULT hres;
if(!This->nslistener) {
BYTE buf[1024];
- DWORD read;
do {
read = 0;
@@ -866,21 +932,21 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
This->nsstream = create_nsprotocol_stream();
do {
- hres = IStream_Read(stream, This->nsstream->buf, sizeof(This->nsstream->buf),
- &This->nsstream->buf_size);
- if(!This->nsstream->buf_size)
+ read = 0;
+ hres = IStream_Read(stream, This->nsstream->buf+This->nsstream->buf_size,
+ sizeof(This->nsstream->buf)-This->nsstream->buf_size, &read);
+ if(!read)
break;
- if(!This->bsc.readed && This->nsstream->buf_size >= 2 && *(WORD*)This->nsstream->buf == 0xfeff) {
- This->nschannel->charset = heap_alloc(sizeof(UTF16_STR));
- memcpy(This->nschannel->charset, UTF16_STR, sizeof(UTF16_STR));
- }
+ This->nsstream->buf_size += read;
if(!This->bsc.readed) {
- nsres = nsIStreamListener_OnStartRequest(This->nslistener,
- (nsIRequest*)NSCHANNEL(This->nschannel), This->nscontext);
- if(NS_FAILED(nsres))
- FIXME("OnStartRequest failed: %08x\n", nsres);
+ if(This->nsstream->buf_size >= 2
+ && (BYTE)This->nsstream->buf[0] == 0xff
+ && (BYTE)This->nsstream->buf[1] == 0xfe)
+ This->nschannel->charset = heap_strdupA(UTF16_STR);
+
+ on_start_nsrequest(This);
/* events are reset when a new document URI is loaded, so re-initialise them here */
if(This->bsc.doc && This->bsc.doc->bscallback == This && This->bsc.doc->nscontainer) {
@@ -898,22 +964,15 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
if(NS_FAILED(nsres))
ERR("OnDataAvailable failed: %08x\n", nsres);
- if(This->nsstream->buf_size)
- FIXME("buffer is not empty!\n");
+ if(This->nsstream->buf_size == sizeof(This->nsstream->buf)) {
+ ERR("buffer is full\n");
+ break;
+ }
}while(hres == S_OK);
return S_OK;
}
-static void on_stop_nsrequest(nsChannelBSC *This)
-{
- if(!This->nslistener)
- return;
-
- nsIStreamListener_OnStopRequest(This->nslistener, (nsIRequest*)NSCHANNEL(This->nschannel),
- This->nscontext, NS_OK);
-}
-
static void add_nsrequest(nsChannelBSC *This)
{
nsresult nsres;
@@ -954,6 +1013,19 @@ static HRESULT nsChannelBSC_start_binding(BSCallback *bsc)
return S_OK;
}
+static HRESULT nsChannelBSC_init_bindinfo(BSCallback *bsc)
+{
+ nsChannelBSC *This = NSCHANNELBSC_THIS(bsc);
+
+ if(This->nschannel && This->nschannel->post_data_stream) {
+ parse_post_data(This->nschannel->post_data_stream, &This->bsc.headers, &This->bsc.post_data, &This->bsc.post_data_len);
+ TRACE("headers = %s post_data = %s\n", debugstr_w(This->bsc.headers),
+ debugstr_an(This->bsc.post_data, This->bsc.post_data_len));
+ }
+
+ return S_OK;
+}
+
static HRESULT nsChannelBSC_stop_binding(BSCallback *bsc, HRESULT result)
{
nsChannelBSC *This = NSCHANNELBSC_THIS(bsc);
@@ -971,23 +1043,6 @@ static HRESULT nsChannelBSC_stop_binding(BSCallback *bsc, HRESULT result)
}
}
- if(FAILED(result))
- return S_OK;
-
- if(This->bsc.doc && This->bsc.doc->bscallback == This && !This->bsc.doc->nscontainer) {
- task_t *task = heap_alloc(sizeof(task_t));
-
- task->doc = This->bsc.doc;
- task->task_id = TASK_PARSECOMPLETE;
- task->next = NULL;
-
- /*
- * This should be done in the worker thread that parses HTML,
- * but we don't have such thread.
- */
- push_task(task);
- }
-
return S_OK;
}
@@ -1014,14 +1069,24 @@ static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCW
return S_OK;
}
+static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code)
+{
+ nsChannelBSC *This = NSCHANNELBSC_THIS(bsc);
+
+ This->nschannel->response_status = response_code;
+ return S_OK;
+}
+
#undef NSCHANNELBSC_THIS
static const BSCallbackVtbl nsChannelBSCVtbl = {
nsChannelBSC_destroy,
+ nsChannelBSC_init_bindinfo,
nsChannelBSC_start_binding,
nsChannelBSC_stop_binding,
nsChannelBSC_read_data,
nsChannelBSC_on_progress,
+ nsChannelBSC_on_response
};
nsChannelBSC *create_channelbsc(IMoniker *mon)
diff --git a/reactos/dll/win32/mshtml/nsembed.c b/reactos/dll/win32/mshtml/nsembed.c
index 16ac21ebbd5..50001aa72b3 100644
--- a/reactos/dll/win32/mshtml/nsembed.c
+++ b/reactos/dll/win32/mshtml/nsembed.c
@@ -38,14 +38,10 @@ WINE_DECLARE_DEBUG_CHANNEL(gecko);
#define NS_APPSTARTUPNOTIFIER_CONTRACTID "@mozilla.org/embedcomp/appstartup-notifier;1"
#define NS_WEBBROWSER_CONTRACTID "@mozilla.org/embedding/browser/nsWebBrowser;1"
-#define NS_PROFILE_CONTRACTID "@mozilla.org/profile/manager;1"
#define NS_MEMORY_CONTRACTID "@mozilla.org/xpcom/memory-service;1"
-#define NS_STRINGSTREAM_CONTRACTID "@mozilla.org/io/string-input-stream;1"
#define NS_COMMANDPARAMS_CONTRACTID "@mozilla.org/embedcomp/command-params;1"
#define NS_HTMLSERIALIZER_CONTRACTID "@mozilla.org/layout/contentserializer;1?mimetype=text/html"
#define NS_EDITORCONTROLLER_CONTRACTID "@mozilla.org/editor/editorcontroller;1"
-#define NS_ARRAY_CONTRACTID "@mozilla.org/array;1"
-#define NS_VARIANT_CONTRACTID "@mozilla.org/variant;1"
#define NS_PREFERENCES_CONTRACTID "@mozilla.org/preferences;1"
#define APPSTARTUP_TOPIC "app-startup"
@@ -296,12 +292,38 @@ static BOOL load_wine_gecko(PRUnichar *gre_path)
return ret;
}
+static void set_bool_pref(nsIPrefBranch *pref, const char *pref_name, BOOL val)
+{
+ nsresult nsres;
+
+ nsres = nsIPrefBranch_SetBoolPref(pref, pref_name, val);
+ if(NS_FAILED(nsres))
+ ERR("Could not set pref %s\n", debugstr_a(pref_name));
+}
+
+static void set_int_pref(nsIPrefBranch *pref, const char *pref_name, int val)
+{
+ nsresult nsres;
+
+ nsres = nsIPrefBranch_SetIntPref(pref, pref_name, val);
+ if(NS_FAILED(nsres))
+ ERR("Could not set pref %s\n", debugstr_a(pref_name));
+}
+
+static void set_string_pref(nsIPrefBranch *pref, const char *pref_name, const char *val)
+{
+ nsresult nsres;
+
+ nsres = nsIPrefBranch_SetCharPref(pref, pref_name, val);
+ if(NS_FAILED(nsres))
+ ERR("Could not set pref %s\n", debugstr_a(pref_name));
+}
+
static void set_lang(nsIPrefBranch *pref)
{
char langs[100];
DWORD res, size, type;
HKEY hkey;
- nsresult nsres;
static const WCHAR international_keyW[] =
{'S','o','f','t','w','a','r','e',
@@ -321,9 +343,7 @@ static void set_lang(nsIPrefBranch *pref)
TRACE("Setting lang %s\n", debugstr_a(langs));
- nsres = nsIPrefBranch_SetCharPref(pref, "intl.accept_languages", langs);
- if(NS_FAILED(nsres))
- ERR("SetCharPref failed: %08x\n", nsres);
+ set_string_pref(pref, "intl.accept_languages", langs);
}
static void set_proxy(nsIPrefBranch *pref)
@@ -333,7 +353,6 @@ static void set_proxy(nsIPrefBranch *pref)
int proxy_port_num;
DWORD enabled = 0, res, size, type;
HKEY hkey;
- nsresult nsres;
static const WCHAR proxy_keyW[] =
{'S','o','f','t','w','a','r','e',
@@ -368,30 +387,12 @@ static void set_proxy(nsIPrefBranch *pref)
proxy_port_num = atoi(proxy_port + 1);
TRACE("Setting proxy to %s, port %d\n", debugstr_a(proxy), proxy_port_num);
- nsres = nsIPrefBranch_SetIntPref(pref, "network.proxy.type", 1);
- if(NS_FAILED(nsres))
- ERR("SetIntPref network.proxy.type failed: %08x\n", nsres);
- nsres = nsIPrefBranch_SetCharPref(pref, "network.proxy.http", proxy);
- if(NS_FAILED(nsres))
- ERR("SetCharPref network.proxy.http failed: %08x\n", nsres);
- nsres = nsIPrefBranch_SetIntPref(pref, "network.proxy.http_port", proxy_port_num);
- if(NS_FAILED(nsres))
- ERR("SetIntPref network.proxy.http_port failed: %08x\n", nsres);
- nsres = nsIPrefBranch_SetCharPref(pref, "network.proxy.ssl", proxy);
- if(NS_FAILED(nsres))
- ERR("SetCharPref network.proxy.ssl failed: %08x\n", nsres);
- nsres = nsIPrefBranch_SetIntPref(pref, "network.proxy.ssl_port", proxy_port_num);
- if(NS_FAILED(nsres))
- ERR("SetIntPref network.proxy.ssl_port failed: %08x\n", nsres);
-}
+ set_string_pref(pref, "network.proxy.http", proxy);
+ set_string_pref(pref, "network.proxy.ssl", proxy);
-static void set_bool_pref(nsIPrefBranch *pref, const char *pref_name, BOOL val)
-{
- nsresult nsres;
-
- nsres = nsIPrefBranch_SetBoolPref(pref, pref_name, val);
- if(NS_FAILED(nsres))
- ERR("Could not set pref %s\n", debugstr_a(pref_name));
+ set_int_pref(pref, "network.proxy.type", 1);
+ set_int_pref(pref, "network.proxy.http_port", proxy_port_num);
+ set_int_pref(pref, "network.proxy.ssl_port", proxy_port_num);
}
static void set_preferences(void)
@@ -410,6 +411,7 @@ static void set_preferences(void)
set_proxy(pref);
set_bool_pref(pref, "security.warn_entering_secure", FALSE);
set_bool_pref(pref, "security.warn_submit_insecure", FALSE);
+ set_int_pref(pref, "layout.spellcheckDefault", 0);
nsIPrefBranch_Release(pref);
}
@@ -448,10 +450,6 @@ static BOOL init_xpcom(const PRUnichar *gre_path)
if(NS_FAILED(nsres))
ERR("AutoRegister(NULL) failed: %08x\n", nsres);
- nsres = nsIComponentRegistrar_AutoRegister(registrar, gre_dir);
- if(NS_FAILED(nsres))
- ERR("AutoRegister(gre_dir) failed: %08x\n", nsres);
-
init_nsio(pCompMgr, registrar);
}else {
ERR("NS_GetComponentRegistrar failed: %08x\n", nsres);
@@ -515,7 +513,7 @@ BOOL load_gecko(BOOL silent)
|| (install_wine_gecko(silent) && load_wine_gecko(gre_path)))
ret = init_xpcom(gre_path);
else
- MESSAGE("Could not load Mozilla. HTML rendering will be disabled.\n");
+ MESSAGE("Could not load wine-gecko. HTML rendering will be disabled.\n");
}else {
ret = pCompMgr != NULL;
}
@@ -579,32 +577,6 @@ void nsAString_Finish(nsAString *str)
NS_StringContainerFinish(str);
}
-nsIInputStream *create_nsstream(const char *data, PRInt32 data_len)
-{
- nsIStringInputStream *ret;
- nsresult nsres;
-
- if(!pCompMgr)
- return NULL;
-
- nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr,
- NS_STRINGSTREAM_CONTRACTID, NULL, &IID_nsIStringInputStream,
- (void**)&ret);
- if(NS_FAILED(nsres)) {
- ERR("Could not get nsIStringInputStream\n");
- return NULL;
- }
-
- nsres = nsIStringInputStream_SetData(ret, data, data_len);
- if(NS_FAILED(nsres)) {
- ERR("AdoptData failed: %08x\n", nsres);
- nsIStringInputStream_Release(ret);
- return NULL;
- }
-
- return (nsIInputStream*)ret;
-}
-
nsICommandParams *create_nscommand_params(void)
{
nsICommandParams *ret = NULL;
@@ -637,7 +609,7 @@ nsresult get_nsinterface(nsISupports *iface, REFIID riid, void **ppv)
return nsres;
}
-static void nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode *nsnode, nsAString *str)
+static HRESULT nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode *nsnode, nsAString *str)
{
nsIDOMNodeList *node_list = NULL;
PRBool has_children = FALSE;
@@ -649,7 +621,7 @@ static void nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode
nsres = nsIDOMNode_GetNodeType(nsnode, &type);
if(NS_FAILED(nsres)) {
ERR("GetType failed: %08x\n", nsres);
- return;
+ return E_FAIL;
}
switch(type) {
@@ -680,6 +652,9 @@ static void nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode
nsIDOMDocument_Release(nsdoc);
break;
}
+ case DOCUMENT_TYPE_NODE:
+ WARN("Ignoring DOCUMENT_TYPE_NODE\n");
+ break;
case DOCUMENT_FRAGMENT_NODE:
break;
default:
@@ -712,35 +687,37 @@ static void nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode
nsIContentSerializer_AppendElementEnd(serializer, nselem, str);
nsIDOMElement_Release(nselem);
}
+
+ return S_OK;
}
-void nsnode_to_nsstring(nsIDOMNode *nsdoc, nsAString *str)
+HRESULT nsnode_to_nsstring(nsIDOMNode *nsnode, nsAString *str)
{
nsIContentSerializer *serializer;
- nsIDOMNode *nsnode;
nsresult nsres;
+ HRESULT hres;
nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr,
NS_HTMLSERIALIZER_CONTRACTID, NULL, &IID_nsIContentSerializer,
(void**)&serializer);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIContentSerializer: %08x\n", nsres);
- return;
+ return E_FAIL;
}
nsres = nsIContentSerializer_Init(serializer, 0, 100, NULL, FALSE, FALSE /* FIXME */);
if(NS_FAILED(nsres))
ERR("Init failed: %08x\n", nsres);
- nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMNode, (void**)&nsnode);
- nsnode_to_nsstring_rec(serializer, nsnode, str);
- nsIDOMNode_Release(nsnode);
-
- nsres = nsIContentSerializer_Flush(serializer, str);
- if(NS_FAILED(nsres))
- ERR("Flush failed: %08x\n", nsres);
+ hres = nsnode_to_nsstring_rec(serializer, nsnode, str);
+ if(SUCCEEDED(hres)) {
+ nsres = nsIContentSerializer_Flush(serializer, str);
+ if(NS_FAILED(nsres))
+ ERR("Flush failed: %08x\n", nsres);
+ }
nsIContentSerializer_Release(serializer);
+ return hres;
}
void get_editor_controller(NSContainer *This)
@@ -883,8 +860,8 @@ void close_gecko(void)
if(nsmem)
nsIMemory_Release(nsmem);
- if(hXPCOM)
- FreeLibrary(hXPCOM);
+ /* Gecko doesn't really support being unloaded */
+ /* if (hXPCOM) FreeLibrary(hXPCOM); */
}
/**********************************************************
@@ -1183,6 +1160,33 @@ static nsrefcnt NSAPI nsURIContentListener_Release(nsIURIContentListener *iface)
return nsIWebBrowserChrome_Release(NSWBCHROME(This));
}
+static BOOL translate_url(HTMLDocument *doc, nsIWineURI *nsuri)
+{
+ OLECHAR *new_url = NULL, *url;
+ BOOL ret = FALSE;
+ LPCWSTR wine_url;
+ HRESULT hres;
+
+ if(!doc->hostui)
+ return FALSE;
+
+ nsIWineURI_GetWineURL(nsuri, &wine_url);
+
+ url = heap_strdupW(wine_url);
+ hres = IDocHostUIHandler_TranslateUrl(doc->hostui, 0, url, &new_url);
+ heap_free(url);
+ if(hres != S_OK || !new_url)
+ return FALSE;
+
+ if(strcmpW(url, new_url)) {
+ FIXME("TranslateUrl returned new URL %s -> %s\n", debugstr_w(url), debugstr_w(new_url));
+ ret = TRUE;
+ }
+
+ CoTaskMemFree(new_url);
+ return ret;
+}
+
static nsresult NSAPI nsURIContentListener_OnStartURIOpen(nsIURIContentListener *iface,
nsIURI *aURI, PRBool *_retval)
{
@@ -1226,12 +1230,15 @@ static nsresult NSAPI nsURIContentListener_OnStartURIOpen(nsIURIContentListener
IMoniker_Release(mon);
}
+
+ *_retval = FALSE;
+ }else if(This->doc) {
+ *_retval = translate_url(This->doc, wine_uri);
}
nsIWineURI_Release(wine_uri);
- *_retval = FALSE;
- return This->content_listener
+ return !*_retval && This->content_listener
? nsIURIContentListener_OnStartURIOpen(This->content_listener, aURI, _retval)
: NS_OK;
}
diff --git a/reactos/dll/win32/mshtml/nsevents.c b/reactos/dll/win32/mshtml/nsevents.c
index 1933c5788cd..0ba11d2c361 100644
--- a/reactos/dll/win32/mshtml/nsevents.c
+++ b/reactos/dll/win32/mshtml/nsevents.c
@@ -131,7 +131,6 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
{
NSContainer *This = NSEVENTLIST_THIS(iface)->This;
nsIDOMHTMLElement *nsbody = NULL;
- task_t *task;
TRACE("(%p)\n", This);
@@ -149,18 +148,6 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
if(This->doc->usermode == EDITMODE)
handle_edit_load(This->doc);
- task = heap_alloc(sizeof(task_t));
-
- task->doc = This->doc;
- task->task_id = TASK_PARSECOMPLETE;
- task->next = NULL;
-
- /*
- * This should be done in the worker thread that parses HTML,
- * but we don't have such thread (Gecko parses HTML for us).
- */
- push_task(task);
-
if(!This->doc->nsdoc) {
ERR("NULL nsdoc\n");
return NS_ERROR_FAILURE;
diff --git a/reactos/dll/win32/mshtml/nsiface.idl b/reactos/dll/win32/mshtml/nsiface.idl
index 894bb41e0ed..cb8f76839b4 100644
--- a/reactos/dll/win32/mshtml/nsiface.idl
+++ b/reactos/dll/win32/mshtml/nsiface.idl
@@ -23,7 +23,7 @@
* compatible with XPCOM, usable in C code.
*/
-cpp_quote("#define GECKO_VERSION \"0.9.1\"")
+cpp_quote("#define GECKO_VERSION \"1.0.0\"")
cpp_quote("#define GECKO_VERSION_STRING \"Wine Gecko \" GECKO_VERSION")
import "wtypes.idl";
@@ -284,19 +284,6 @@ interface nsIInputStream : nsISupports
nsresult IsNonBlocking(PRBool *_retval);
}
-[
- object,
- uuid(450cd2d4-f0fd-424d-b365-b1251f80fd53),
- local
- /* NOT_FROZEN */
-]
-interface nsIStringInputStream : nsIInputStream
-{
- nsresult SetData(const char *data, PRInt32 dataLen);
- nsresult AdoptData(char *data, PRInt32 dataLen);
- nsresult ShareData(const char *data, PRInt32 dataLen);
-}
-
[
object,
uuid(07a22cc0-0ce5-11d3-9331-00104ba0fd40),
@@ -333,6 +320,34 @@ interface nsIURI : nsISupports
nsresult GetOriginCharset(nsACString *aOriginCharset);
}
+[
+ object,
+ uuid(d6116970-8034-11d3-9399-00104ba0fd40),
+ local
+ /* FROZEN */
+]
+interface nsIURL : nsIURI
+{
+ nsresult GetFilePath(nsACString *aFilePath);
+ nsresult SetFilePath(const nsACString *aFilePath);
+ nsresult GetParam(nsACString *aParam);
+ nsresult SetParam(const nsACString *aParam);
+ nsresult GetQuery(nsACString *aQuery);
+ nsresult SetQuery(const nsACString *aQuery);
+ nsresult GetRef(nsACString *aRef);
+ nsresult SetRef(const nsACString *aRef);
+ nsresult GetDirectory(nsACString *aDirectory);
+ nsresult SetDirectory(const nsACString *aDirectory);
+ nsresult GetFileName(nsACString *aFileName);
+ nsresult SetFileName(const nsACString *aFileName);
+ nsresult GetFileBaseName(nsACString *aFileBaseName);
+ nsresult SetFileBaseName(const nsACString *aFileBaseName);
+ nsresult GetFileExtension(nsACString *aFileExtension);
+ nsresult SetFileExtension(const nsACString *aFileExtension);
+ nsresult GetCommonBaseSpec(nsIURI *aURIToCompare, nsACString *_retval);
+ nsresult GetRelativeSpec(nsIURI *aURIToCompare, nsACString *_retval);
+}
+
[
object,
uuid(ef6bfbd2-fd46-48d8-96b7-9f8f0fd387fe),
@@ -452,6 +467,24 @@ interface nsIHttpChannel : nsIChannel
nsresult IsNoCacheResponse(PRBool *_retval);
}
+[
+ object,
+ uuid(0eb66361-faaa-4e52-8c7e-6c25f11f8e3c),
+ local
+ /* NOT_FROZEN */
+]
+interface nsIHttpChannelInternal : nsISupports
+{
+ nsresult GetDocumentURI(nsIURI **aDocumentURI);
+ nsresult SetDocumentURI(nsIURI *aDocumentURI);
+ nsresult GetRequestVersion(PRUint32 *major, PRUint32 *minor);
+ nsresult GetResponseVersion(PRUint32 *major, PRUint32 *minor);
+ nsresult SetCookie(const char *aCookieHeader);
+ nsresult SetupFallbackChannel(const char *aFallbackKey);
+ nsresult GetForceAllowThirdPartyCookie(PRBool *aForceAllowThirdPartyCookie);
+ nsresult SetForceAllowThirdPartyCookie(PRBool aForceAllowThirdPartyCookie);
+}
+
[
object,
uuid(ddf633d8-e9a4-439d-ad88-de636fd9bb75),
@@ -855,7 +888,7 @@ interface nsIDOMDocument : nsIDOMNode
[
object,
- uuid(533a8131-8d0c-4ebf-990b-7fad7cd51466),
+ uuid(09a439ad-4079-46d5-a050-4d7015d1a108),
local
/* NOT_FROZEN */
]
@@ -868,9 +901,9 @@ interface nsIDOMNSDocument : nsISupports
nsresult GetTitle(nsAString *aTitle);
nsresult SetTitle(const nsAString *aTitle);
nsresult GetContentType(nsAString *aContentType);
+ nsresult GetReadyState(nsAString *aReadyState);
nsresult GetLastModified(nsAString *aLastModified);
nsresult GetReferrer(nsAString *aReferrer);
- nsresult GetBoxObjectFor(nsIDOMElement *elt, nsIBoxObject **_retval);
nsresult HasFocus(PRBool *_retval);
nsresult GetActiveElement(nsIDOMElement **aActiveElement);
nsresult GetElementsByClassName(const nsAString *classes, nsIDOMNodeList **_retval);
@@ -1546,13 +1579,13 @@ interface nsIWebNavigation : nsISupports
[
object,
- uuid(5af07661-6477-4235-8814-4a45215855b8),
+ uuid(343700dd-078b-42b6-a809-b9c1d7e951d0),
local
/* NOT_FROZEN */
]
interface nsIPrintSettings : nsISupports
{
- typedef struct { char dummy; } nsMargin;
+ typedef struct { char dummy; } nsIntMargin;
nsresult SetPrintOptions(PRInt32 aType, PRBool aTurnOnOff);
nsresult GetPrintOptions(PRInt32 aType, PRBool *_retval);
@@ -1672,13 +1705,13 @@ interface nsIPrintSettings : nsISupports
nsresult SetIsInitializedFromPrinter(PRBool aIsInitializedFromPrinter);
nsresult GetIsInitializedFromPrefs(PRBool *aIsInitializedFromPrefs);
nsresult SetIsInitializedFromPrefs(PRBool aIsInitializedFromPrefs);
- nsresult SetMarginInTwips(nsMargin *aMargin);
- nsresult SetEdgeInTwips(nsMargin *aEdge);
- nsresult GetMarginInTwips(nsMargin *aMargin);
- nsresult GetEdgeInTwips(nsMargin *aEdge);
+ nsresult SetMarginInTwips(nsIntMargin *aMargin);
+ nsresult SetEdgeInTwips(nsIntMargin *aEdge);
+ nsresult GetMarginInTwips(nsIntMargin *aMargin);
+ nsresult GetEdgeInTwips(nsIntMargin *aEdge);
nsresult SetupSilentPrinting();
- nsresult SetUnwriteableMarginInTwips(nsMargin *aEdge);
- nsresult GetUnwriteableMarginInTwips(nsMargin *aEdge);
+ nsresult SetUnwriteableMarginInTwips(nsIntMargin *aEdge);
+ nsresult GetUnwriteableMarginInTwips(nsIntMargin *aEdge);
}
[
@@ -1872,7 +1905,7 @@ interface nsIIOService : nsISupports
[
object,
- uuid(57322c6f-f4ec-4e46-8253-b74be220de16),
+ uuid(a50d5516-5c0a-4f08-b427-703ca0c44ac3),
local,
/* NOT_FROZEN */
]
@@ -2485,7 +2518,7 @@ interface nsIHTMLEditor : nsISupports
[
object,
- uuid(32e68316-67d4-44a5-8d35-0d390fa9df11),
+ uuid(365d600b-868a-452a-8de8-f46fad8fee53),
local
/* NOT_FROZEN */
]
@@ -2495,6 +2528,8 @@ interface nsIMutationObserver : nsISupports
void /*CharacterDataChangeInfo*/ *aInfo);
void CharacterDataChanged(nsIDocument *aDocument, nsIContent *aContent,
void /*CharacterDataChangeInfo*/ *aInfo);
+ void AttributeWillChange(nsIDocument *aDocument, nsIContent * aContent, PRInt32 aNameSpaceID,
+ nsIAtom *aAttribute, PRInt32 aModType);
void AttributeChanged(nsIDocument *aDocument, nsIContent *aContent, PRInt32 aNameSpaceID,
nsIAtom *aAttribute, PRInt32 aModType, PRUint32 aStateMask);
void ContentAppended(nsIDocument *aDocument, nsIContent *aContainer, PRInt32 aNewIndexInContainer);
@@ -2531,7 +2566,7 @@ interface nsIDocumentObserver : nsIMutationObserver
void StyleRuleAdded(nsIDocument *aDocument, nsIStyleSheet *aStyleSheet, nsIStyleRule *aStyleRule);
void StyleRuleRemoved(nsIDocument *aDocument, nsIStyleSheet *aStyleSheet, nsIStyleRule *aStyleRule);
void BindToDocument(nsIDocument *aDocument, nsIContent *aContent);
- void DoneAddingContent(nsIContent *aContent, PRBool aHaveNotified);
+ void DoneAddingChildren(nsIContent *aContent, PRBool aHaveNotified);
}
/*
@@ -2545,7 +2580,7 @@ interface nsIDocumentObserver : nsIMutationObserver
local
/* INTERNAL */
]
-interface nsIWineURI : nsIURI
+interface nsIWineURI : nsIURL
{
typedef struct NSContainer NSContainer;
diff --git a/reactos/dll/win32/mshtml/nsio.c b/reactos/dll/win32/mshtml/nsio.c
index 7c402b295a9..12e8520978b 100644
--- a/reactos/dll/win32/mshtml/nsio.c
+++ b/reactos/dll/win32/mshtml/nsio.c
@@ -57,6 +57,7 @@ typedef struct {
LONG ref;
nsIURI *uri;
+ nsIURL *nsurl;
NSContainer *container;
LPWSTR wine_url;
PRBool is_doc_uri;
@@ -68,6 +69,14 @@ typedef struct {
static nsresult create_uri(nsIURI*,NSContainer*,nsIWineURI**);
+static const char *debugstr_nsacstr(const nsACString *nsstr)
+{
+ const char *data;
+
+ nsACString_GetData(nsstr, &data);
+ return debugstr_a(data);
+}
+
HRESULT nsuri_to_url(LPCWSTR nsuri, BSTR *ret)
{
const WCHAR *ptr = nsuri;
@@ -167,8 +176,6 @@ static nsresult NSAPI nsChannel_QueryInterface(nsIHttpChannel *iface, nsIIDRef r
{
nsChannel *This = NSCHANNEL_THIS(iface);
- *result = NULL;
-
if(IsEqualGUID(&IID_nsISupports, riid)) {
TRACE("(%p)->(IID_nsISupports %p)\n", This, result);
*result = NSCHANNEL(This);
@@ -178,12 +185,18 @@ static nsresult NSAPI nsChannel_QueryInterface(nsIHttpChannel *iface, nsIIDRef r
}else if(IsEqualGUID(&IID_nsIChannel, riid)) {
TRACE("(%p)->(IID_nsIChannel %p)\n", This, result);
*result = NSCHANNEL(This);
- }else if(This->http_channel && IsEqualGUID(&IID_nsIHttpChannel, riid)) {
+ }else if(IsEqualGUID(&IID_nsIHttpChannel, riid)) {
TRACE("(%p)->(IID_nsIHttpChannel %p)\n", This, result);
- *result = NSHTTPCHANNEL(This);
+ *result = This->http_channel ? NSHTTPCHANNEL(This) : NULL;
}else if(IsEqualGUID(&IID_nsIUploadChannel, riid)) {
TRACE("(%p)->(IID_nsIUploadChannel %p)\n", This, result);
*result = NSUPCHANNEL(This);
+ }else if(IsEqualGUID(&IID_nsIHttpChannelInternal, riid)) {
+ TRACE("(%p)->(IID_nsIHttpChannelInternal %p)\n", This, result);
+ *result = This->http_channel_internal ? NSHTTPINTERNAL(This) : NULL;
+ }else {
+ TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), result);
+ *result = NULL;
}
if(*result) {
@@ -191,10 +204,6 @@ static nsresult NSAPI nsChannel_QueryInterface(nsIHttpChannel *iface, nsIIDRef r
return NS_OK;
}
- TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), result);
-
- if(This->channel)
- return nsIChannel_QueryInterface(This->channel, riid, result);
return NS_NOINTERFACE;
}
@@ -219,6 +228,8 @@ static nsrefcnt NSAPI nsChannel_Release(nsIHttpChannel *iface)
nsIChannel_Release(This->channel);
if(This->http_channel)
nsIHttpChannel_Release(This->http_channel);
+ if(This->http_channel_internal)
+ nsIHttpChannel_Release(This->http_channel_internal);
if(This->owner)
nsISupports_Release(This->owner);
if(This->post_data_stream)
@@ -606,37 +617,6 @@ static nsresult NSAPI nsChannel_Open(nsIHttpChannel *iface, nsIInputStream **_re
return NS_ERROR_NOT_IMPLEMENTED;
}
-static BOOL do_load_from_moniker_hack(nsChannel *This)
-{
- nsACString scheme_str;
- nsresult nsres;
- BOOL ret = TRUE;
-
- /*
- * We should always load the page from IMoniker, but Wine is not yet
- * ready for this. This function is a heuristic, that decides which
- * way of loading is better (Gecko implementation or IMoniker). The
- * aim is to always return TRUE.
- */
-
- /* Load from moniker if there is no Gecko channel available */
- if(!This->channel)
- return TRUE;
-
- nsACString_Init(&scheme_str, NULL);
- nsres = nsIWineURI_GetScheme(This->uri, &scheme_str);
-
- if(NS_SUCCEEDED(nsres)) {
- const char *scheme;
-
- nsACString_GetData(&scheme_str, &scheme);
- ret = !strcmp(scheme, "wine") || !strcmp(scheme, "about");
- }
-
- nsACString_Finish(&scheme_str);
- return ret;
-}
-
static HRESULT create_mon_for_nschannel(nsChannel *channel, IMoniker **mon)
{
nsIWineURI *wine_uri;
@@ -730,8 +710,7 @@ static nsresult async_open_doc_uri(nsChannel *This, NSContainer *container,
This->content_type = heap_strdupWtoA(container->doc->mime);
}
- if(do_load_from_moniker_hack(This))
- return WINE_NS_LOAD_FROM_MONIKER;
+ return NS_OK;
}else {
BOOL cont = before_async_open(This, container);
@@ -762,23 +741,9 @@ static nsresult async_open(nsChannel *This, NSContainer *container, nsIStreamLis
{
nsChannelBSC *bscallback;
IMoniker *mon = NULL;
- nsresult nsres;
task_t *task;
HRESULT hres;
- if(This->channel) {
- nsres = nsIChannel_AsyncOpen(This->channel, listener, context);
-
- if(mon)
- IMoniker_Release(mon);
-
- if(NS_FAILED(nsres) && (This->load_flags & LOAD_INITIAL_DOCUMENT_URI))
- return WINE_NS_LOAD_FROM_MONIKER;
- return nsres;
- }
-
- TRACE("channel == NULL\n");
-
hres = create_mon_for_nschannel(This, &mon);
if(FAILED(hres))
return NS_ERROR_UNEXPECTED;
@@ -980,10 +945,15 @@ static nsresult NSAPI nsChannel_GetResponseStatus(nsIHttpChannel *iface, PRUint3
TRACE("(%p)->(%p)\n", This, aResponseStatus);
+ if(This->response_status) {
+ *aResponseStatus = This->response_status;
+ return NS_OK;
+ }
+
if(This->http_channel)
return nsIHttpChannel_GetResponseStatus(This->http_channel, aResponseStatus);
- return NS_ERROR_NOT_IMPLEMENTED;
+ return NS_ERROR_UNEXPECTED;
}
static nsresult NSAPI nsChannel_GetResponseStatusText(nsIHttpChannel *iface,
@@ -1217,6 +1187,131 @@ static const nsIUploadChannelVtbl nsUploadChannelVtbl = {
nsUploadChannel_GetUploadStream
};
+#define NSHTTPINTERNAL_THIS(iface) DEFINE_THIS(nsChannel, IHttpChannelInternal, iface)
+
+static nsresult NSAPI nsHttpChannelInternal_QueryInterface(nsIHttpChannelInternal *iface, nsIIDRef riid,
+ nsQIResult result)
+{
+ nsChannel *This = NSHTTPINTERNAL_THIS(iface);
+ return nsIChannel_QueryInterface(NSCHANNEL(This), riid, result);
+}
+
+static nsrefcnt NSAPI nsHttpChannelInternal_AddRef(nsIHttpChannelInternal *iface)
+{
+ nsChannel *This = NSHTTPINTERNAL_THIS(iface);
+ return nsIChannel_AddRef(NSCHANNEL(This));
+}
+
+static nsrefcnt NSAPI nsHttpChannelInternal_Release(nsIHttpChannelInternal *iface)
+{
+ nsChannel *This = NSHTTPINTERNAL_THIS(iface);
+ return nsIChannel_Release(NSCHANNEL(This));
+}
+
+static nsresult NSAPI nsHttpChannelInternal_GetDocumentURI(nsIHttpChannelInternal *iface, nsIURI **aDocumentURI)
+{
+ nsChannel *This = NSHTTPINTERNAL_THIS(iface);
+
+ TRACE("(%p)->()\n", This);
+
+ if(This->http_channel_internal)
+ return nsIHttpChannelInternal_GetDocumentURI(This->http_channel_internal, aDocumentURI);
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsHttpChannelInternal_SetDocumentURI(nsIHttpChannelInternal *iface, nsIURI *aDocumentURI)
+{
+ nsChannel *This = NSHTTPINTERNAL_THIS(iface);
+
+ TRACE("(%p)->()\n", This);
+
+ if(This->http_channel_internal)
+ return nsIHttpChannelInternal_SetDocumentURI(This->http_channel_internal, aDocumentURI);
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsHttpChannelInternal_GetRequestVersion(nsIHttpChannelInternal *iface, PRUint32 *major, PRUint32 *minor)
+{
+ nsChannel *This = NSHTTPINTERNAL_THIS(iface);
+
+ TRACE("(%p)->()\n", This);
+
+ if(This->http_channel_internal)
+ return nsIHttpChannelInternal_GetRequestVersion(This->http_channel_internal, major, minor);
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsHttpChannelInternal_GetResponseVersion(nsIHttpChannelInternal *iface, PRUint32 *major, PRUint32 *minor)
+{
+ nsChannel *This = NSHTTPINTERNAL_THIS(iface);
+
+ TRACE("(%p)->()\n", This);
+
+ if(This->http_channel_internal)
+ return nsIHttpChannelInternal_GetResponseVersion(This->http_channel_internal, major, minor);
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsHttpChannelInternal_SetCookie(nsIHttpChannelInternal *iface, const char *aCookieHeader)
+{
+ nsChannel *This = NSHTTPINTERNAL_THIS(iface);
+
+ TRACE("(%p)->()\n", This);
+
+ if(This->http_channel_internal)
+ return nsIHttpChannelInternal_SetCookie(This->http_channel_internal, aCookieHeader);
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsHttpChannelInternal_SetupFallbackChannel(nsIHttpChannelInternal *iface, const char *aFallbackKey)
+{
+ nsChannel *This = NSHTTPINTERNAL_THIS(iface);
+
+ TRACE("(%p)->()\n", This);
+
+ if(This->http_channel_internal)
+ return nsIHttpChannelInternal_SetupFallbackChannel(This->http_channel_internal, aFallbackKey);
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsHttpChannelInternal_GetForceAllowThirdPartyCookie(nsIHttpChannelInternal *iface, PRBool *aForceThirdPartyCookie)
+{
+ nsChannel *This = NSHTTPINTERNAL_THIS(iface);
+
+ TRACE("(%p)->()\n", This);
+
+ if(This->http_channel_internal)
+ return nsIHttpChannelInternal_GetForceAllowThirdPartyCookie(This->http_channel_internal, aForceThirdPartyCookie);
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsHttpChannelInternal_SetForceAllowThirdPartyCookie(nsIHttpChannelInternal *iface, PRBool aForceThirdPartyCookie)
+{
+ nsChannel *This = NSHTTPINTERNAL_THIS(iface);
+
+ TRACE("(%p)->()\n", This);
+
+ if(This->http_channel_internal)
+ return nsIHttpChannelInternal_SetForceAllowThirdPartyCookie(This->http_channel_internal, aForceThirdPartyCookie);
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+#undef NSHTTPINTERNAL_THIS
+
+static const nsIHttpChannelInternalVtbl nsHttpChannelInternalVtbl = {
+ nsHttpChannelInternal_QueryInterface,
+ nsHttpChannelInternal_AddRef,
+ nsHttpChannelInternal_Release,
+ nsHttpChannelInternal_GetDocumentURI,
+ nsHttpChannelInternal_SetDocumentURI,
+ nsHttpChannelInternal_GetRequestVersion,
+ nsHttpChannelInternal_GetResponseVersion,
+ nsHttpChannelInternal_SetCookie,
+ nsHttpChannelInternal_SetupFallbackChannel,
+ nsHttpChannelInternal_GetForceAllowThirdPartyCookie,
+ nsHttpChannelInternal_SetForceAllowThirdPartyCookie
+};
+
#define NSURI_THIS(iface) DEFINE_THIS(nsURI, WineURI, iface)
static nsresult NSAPI nsURI_QueryInterface(nsIWineURI *iface, nsIIDRef riid, nsQIResult result)
@@ -1231,6 +1326,9 @@ static nsresult NSAPI nsURI_QueryInterface(nsIWineURI *iface, nsIIDRef riid, nsQ
}else if(IsEqualGUID(&IID_nsIURI, riid)) {
TRACE("(%p)->(IID_nsIURI %p)\n", This, result);
*result = NSURI(This);
+ }else if(IsEqualGUID(&IID_nsIURL, riid)) {
+ TRACE("(%p)->(IID_nsIURL %p)\n", This, result);
+ *result = NSURI(This);
}else if(IsEqualGUID(&IID_nsIWineURI, riid)) {
TRACE("(%p)->(IID_nsIWineURI %p)\n", This, result);
*result = NSURI(This);
@@ -1265,6 +1363,8 @@ static nsrefcnt NSAPI nsURI_Release(nsIWineURI *iface)
if(!ref) {
if(This->container)
nsIWebBrowserChrome_Release(NSWBCHROME(This->container));
+ if(This->nsurl)
+ nsIURL_Release(This->nsurl);
if(This->uri)
nsIURI_Release(This->uri);
heap_free(This->wine_url);
@@ -1688,6 +1788,280 @@ static nsresult NSAPI nsURI_GetOriginCharset(nsIWineURI *iface, nsACString *aOri
return NS_ERROR_NOT_IMPLEMENTED;
}
+static nsresult NSAPI nsURL_GetFilePath(nsIWineURI *iface, nsACString *aFilePath)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%p)\n", This, aFilePath);
+
+ if(This->nsurl)
+ return nsIURL_GetFilePath(This->nsurl, aFilePath);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_SetFilePath(nsIWineURI *iface, const nsACString *aFilePath)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aFilePath));
+
+ if(This->nsurl)
+ return nsIURL_SetFilePath(This->nsurl, aFilePath);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_GetParam(nsIWineURI *iface, nsACString *aParam)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%p)\n", This, aParam);
+
+ if(This->nsurl)
+ return nsIURL_GetParam(This->nsurl, aParam);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_SetParam(nsIWineURI *iface, const nsACString *aParam)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aParam));
+
+ if(This->nsurl)
+ return nsIURL_SetParam(This->nsurl, aParam);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_GetQuery(nsIWineURI *iface, nsACString *aQuery)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%p)\n", This, aQuery);
+
+ if(This->nsurl)
+ return nsIURL_GetQuery(This->nsurl, aQuery);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_SetQuery(nsIWineURI *iface, const nsACString *aQuery)
+{
+ nsURI *This = NSURI_THIS(iface);
+ const WCHAR *ptr1, *ptr2;
+ const char *query;
+ WCHAR *new_url, *ptr;
+ DWORD len, size;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aQuery));
+
+ if(This->nsurl)
+ nsIURL_SetQuery(This->nsurl, aQuery);
+
+ if(!This->wine_url)
+ return NS_OK;
+
+ nsACString_GetData(aQuery, &query);
+ size = len = MultiByteToWideChar(CP_ACP, 0, query, -1, NULL, 0);
+ ptr1 = strchrW(This->wine_url, '?');
+ if(ptr1) {
+ size += ptr1-This->wine_url;
+ ptr2 = strchrW(ptr1, '#');
+ if(ptr2)
+ size += strlenW(ptr2);
+ }else {
+ ptr1 = This->wine_url + strlenW(This->wine_url);
+ ptr2 = NULL;
+ size += strlenW(This->wine_url);
+ }
+
+ if(*query)
+ size++;
+
+ new_url = heap_alloc(size*sizeof(WCHAR));
+ memcpy(new_url, This->wine_url, (ptr1-This->wine_url)*sizeof(WCHAR));
+ ptr = new_url + (ptr1-This->wine_url);
+ if(*query) {
+ *ptr++ = '?';
+ MultiByteToWideChar(CP_ACP, 0, query, -1, ptr, len);
+ ptr += len-1;
+ }
+ if(ptr2)
+ strcpyW(ptr, ptr2);
+ else
+ *ptr = 0;
+
+ TRACE("setting %s\n", debugstr_w(new_url));
+
+ heap_free(This->wine_url);
+ This->wine_url = new_url;
+ return NS_OK;
+}
+
+static nsresult NSAPI nsURL_GetRef(nsIWineURI *iface, nsACString *aRef)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%p)\n", This, aRef);
+
+ if(This->nsurl)
+ return nsIURL_GetRef(This->nsurl, aRef);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_SetRef(nsIWineURI *iface, const nsACString *aRef)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aRef));
+
+ if(This->nsurl)
+ return nsIURL_SetRef(This->nsurl, aRef);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_GetDirectory(nsIWineURI *iface, nsACString *aDirectory)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%p)\n", This, aDirectory);
+
+ if(This->nsurl)
+ return nsIURL_GetDirectory(This->nsurl, aDirectory);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_SetDirectory(nsIWineURI *iface, const nsACString *aDirectory)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aDirectory));
+
+ if(This->nsurl)
+ return nsIURL_SetDirectory(This->nsurl, aDirectory);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_GetFileName(nsIWineURI *iface, nsACString *aFileName)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%p)\n", This, aFileName);
+
+ if(This->nsurl)
+ return nsIURL_GetFileName(This->nsurl, aFileName);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_SetFileName(nsIWineURI *iface, const nsACString *aFileName)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aFileName));
+
+ if(This->nsurl)
+ return nsIURL_SetFileName(This->nsurl, aFileName);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_GetFileBaseName(nsIWineURI *iface, nsACString *aFileBaseName)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%p)\n", This, aFileBaseName);
+
+ if(This->nsurl)
+ return nsIURL_GetFileBaseName(This->nsurl, aFileBaseName);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_SetFileBaseName(nsIWineURI *iface, const nsACString *aFileBaseName)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aFileBaseName));
+
+ if(This->nsurl)
+ return nsIURL_SetFileBaseName(This->nsurl, aFileBaseName);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_GetFileExtension(nsIWineURI *iface, nsACString *aFileExtension)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%p)\n", This, aFileExtension);
+
+ if(This->nsurl)
+ return nsIURL_GetFileExtension(This->nsurl, aFileExtension);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_SetFileExtension(nsIWineURI *iface, const nsACString *aFileExtension)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aFileExtension));
+
+ if(This->nsurl)
+ return nsIURL_SetFileExtension(This->nsurl, aFileExtension);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_GetCommonBaseSpec(nsIWineURI *iface, nsIURI *aURIToCompare, nsACString *_retval)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%p %p)\n", This, aURIToCompare, _retval);
+
+ if(This->nsurl)
+ return nsIURL_GetCommonBaseSpec(This->nsurl, aURIToCompare, _retval);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsURL_GetRelativeSpec(nsIWineURI *iface, nsIURI *aURIToCompare, nsACString *_retval)
+{
+ nsURI *This = NSURI_THIS(iface);
+
+ TRACE("(%p)->(%p %p)\n", This, aURIToCompare, _retval);
+
+ if(This->nsurl)
+ return nsIURL_GetRelativeSpec(This->nsurl, aURIToCompare, _retval);
+
+ FIXME("default action not implemented\n");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
static nsresult NSAPI nsURI_GetNSContainer(nsIWineURI *iface, NSContainer **aContainer)
{
nsURI *This = NSURI_THIS(iface);
@@ -1813,6 +2187,24 @@ static const nsIWineURIVtbl nsWineURIVtbl = {
nsURI_GetAsciiSpec,
nsURI_GetAsciiHost,
nsURI_GetOriginCharset,
+ nsURL_GetFilePath,
+ nsURL_SetFilePath,
+ nsURL_GetParam,
+ nsURL_SetParam,
+ nsURL_GetQuery,
+ nsURL_SetQuery,
+ nsURL_GetRef,
+ nsURL_SetRef,
+ nsURL_GetDirectory,
+ nsURL_SetDirectory,
+ nsURL_GetFileName,
+ nsURL_SetFileName,
+ nsURL_GetFileBaseName,
+ nsURL_SetFileBaseName,
+ nsURL_GetFileExtension,
+ nsURL_SetFileExtension,
+ nsURL_GetCommonBaseSpec,
+ nsURL_GetRelativeSpec,
nsURI_GetNSContainer,
nsURI_SetNSContainer,
nsURI_GetIsDocumentURI,
@@ -1836,6 +2228,11 @@ static nsresult create_uri(nsIURI *uri, NSContainer *container, nsIWineURI **_re
if(container)
nsIWebBrowserChrome_AddRef(NSWBCHROME(container));
+ if(uri)
+ nsIURI_QueryInterface(uri, &IID_nsIURL, (void**)&ret->nsurl);
+ else
+ ret->nsurl = NULL;
+
TRACE("retval=%p\n", ret);
*_retval = NSWINEURI(ret);
return NS_OK;
@@ -2051,15 +2448,15 @@ static nsresult NSAPI nsIOService_GetProtocolFlags(nsIIOService *iface, const ch
static BOOL is_gecko_special_uri(const char *spec)
{
- static const char chromeW[] = "chrome:";
- static const char jarW[] = "jar:";
- static const char resourceW[] = "resource:";
- static const char javascriptW[] = "javascript:";
+ static const char *special_schemes[] = {"chrome:", "jar:", "resource:", "javascript:", "wyciwyg:"};
+ int i;
- return !strncasecmp(spec, chromeW, sizeof(chromeW)-1)
- || !strncasecmp(spec, resourceW, sizeof(resourceW)-1)
- || !strncasecmp(spec, jarW, sizeof(jarW)-1)
- || !strncasecmp(spec, javascriptW, sizeof(javascriptW)-1);
+ for(i=0; i < sizeof(special_schemes)/sizeof(*special_schemes); i++) {
+ if(!strncasecmp(spec, special_schemes[i], strlen(special_schemes[i])))
+ return TRUE;
+ }
+
+ return FALSE;
}
static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *aSpec,
@@ -2187,6 +2584,7 @@ static nsresult NSAPI nsIOService_NewChannelFromURI(nsIIOService *iface, nsIURI
ret->lpHttpChannelVtbl = &nsChannelVtbl;
ret->lpUploadChannelVtbl = &nsUploadChannelVtbl;
+ ret->lpIHttpChannelInternalVtbl = &nsHttpChannelInternalVtbl;
ret->ref = 1;
ret->channel = channel;
ret->uri = wine_uri;
@@ -2194,8 +2592,10 @@ static nsresult NSAPI nsIOService_NewChannelFromURI(nsIIOService *iface, nsIURI
nsIURI_AddRef(aURI);
ret->original_uri = aURI;
- if(channel)
+ if(channel) {
nsIChannel_QueryInterface(channel, &IID_nsIHttpChannel, (void**)&ret->http_channel);
+ nsIChannel_QueryInterface(channel, &IID_nsIHttpChannelInternal, (void**)&ret->http_channel_internal);
+ }
*_retval = NSCHANNEL(ret);
return NS_OK;
diff --git a/reactos/dll/win32/mshtml/olecmd.c b/reactos/dll/win32/mshtml/olecmd.c
index a122e0cb089..a8d3e6a95e9 100644
--- a/reactos/dll/win32/mshtml/olecmd.c
+++ b/reactos/dll/win32/mshtml/olecmd.c
@@ -583,9 +583,6 @@ static HRESULT exec_editmode(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in,
debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
}
- if(This->nscontainer)
- set_ns_editmode(This->nscontainer);
-
update_doc(This, UPDATE_UI);
if(This->mon) {
@@ -610,12 +607,17 @@ static HRESULT exec_editmode(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in,
return hres;
if(This->ui_active) {
- RECT rcBorderWidths;
-
if(This->ip_window)
call_set_active_object(This->ip_window, NULL);
if(This->hostui)
IDocHostUIHandler_HideUI(This->hostui);
+ }
+
+ if(This->nscontainer)
+ set_ns_editmode(This->nscontainer);
+
+ if(This->ui_active) {
+ RECT rcBorderWidths;
if(This->hostui)
IDocHostUIHandler_ShowUI(This->hostui, DOCHOSTUITYPE_AUTHOR, ACTOBJ(This), CMDTARGET(This),
diff --git a/reactos/dll/win32/mshtml/omnavigator.c b/reactos/dll/win32/mshtml/omnavigator.c
index a3eed8bce3b..dc0fb4a8ca4 100644
--- a/reactos/dll/win32/mshtml/omnavigator.c
+++ b/reactos/dll/win32/mshtml/omnavigator.c
@@ -84,8 +84,10 @@ static ULONG WINAPI OmNavigator_Release(IOmNavigator *iface)
TRACE("(%p) ref=%d\n", This, ref);
- if(!ref)
+ if(!ref) {
+ release_dispex(&This->dispex);
heap_free(This);
+ }
return ref;
}
@@ -139,8 +141,19 @@ static HRESULT WINAPI OmNavigator_get_appCodeName(IOmNavigator *iface, BSTR *p)
static HRESULT WINAPI OmNavigator_get_appName(IOmNavigator *iface, BSTR *p)
{
OmNavigator *This = OMNAVIGATOR_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+
+ static const WCHAR app_nameW[] =
+ {'M','i','c','r','o','s','o','f','t',' ',
+ 'I','n','t','e','r','n','e','t',' ',
+ 'E','x','p','l','o','r','e','r',0};
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ *p = SysAllocString(app_nameW);
+ if(!*p)
+ return E_OUTOFMEMORY;
+
+ return S_OK;
}
static HRESULT WINAPI OmNavigator_get_appVersion(IOmNavigator *iface, BSTR *p)
@@ -166,8 +179,24 @@ static HRESULT WINAPI OmNavigator_get_appVersion(IOmNavigator *iface, BSTR *p)
static HRESULT WINAPI OmNavigator_get_userAgent(IOmNavigator *iface, BSTR *p)
{
OmNavigator *This = OMNAVIGATOR_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ char user_agent[512];
+ DWORD size;
+ HRESULT hres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ size = sizeof(user_agent);
+ hres = ObtainUserAgentString(0, user_agent, &size);
+ if(FAILED(hres))
+ return hres;
+
+ size = MultiByteToWideChar(CP_ACP, 0, user_agent, -1, NULL, 0);
+ *p = SysAllocStringLen(NULL, size-1);
+ if(!*p)
+ return E_OUTOFMEMORY;
+
+ MultiByteToWideChar(CP_ACP, 0, user_agent, -1, *p, size);
+ return S_OK;
}
static HRESULT WINAPI OmNavigator_javaEnabled(IOmNavigator *iface, VARIANT_BOOL *enabled)
@@ -215,8 +244,16 @@ static HRESULT WINAPI OmNavigator_get_opsProfile(IOmNavigator *iface, IHTMLOpsPr
static HRESULT WINAPI OmNavigator_toString(IOmNavigator *iface, BSTR *String)
{
OmNavigator *This = OMNAVIGATOR_THIS(iface);
- FIXME("(%p)->(%p)\n", This, String);
- return E_NOTIMPL;
+
+ static const WCHAR objectW[] = {'[','o','b','j','e','c','t',']',0};
+
+ TRACE("(%p)->(%p)\n", This, String);
+
+ if(!String)
+ return E_INVALIDARG;
+
+ *String = SysAllocString(objectW);
+ return *String ? S_OK : E_OUTOFMEMORY;
}
static HRESULT WINAPI OmNavigator_get_cpuClass(IOmNavigator *iface, BSTR *p)
@@ -329,7 +366,7 @@ static const tid_t OmNavigator_iface_tids[] = {
};
static dispex_static_data_t OmNavigator_dispex = {
NULL,
- IOmNavigator_tid,
+ DispHTMLNavigator_tid,
NULL,
OmNavigator_iface_tids
};
diff --git a/reactos/dll/win32/mshtml/persist.c b/reactos/dll/win32/mshtml/persist.c
index c8a0c5731b3..6c1a0e5f3b7 100644
--- a/reactos/dll/win32/mshtml/persist.c
+++ b/reactos/dll/win32/mshtml/persist.c
@@ -39,129 +39,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
-#define USER_AGENT "User-Agent:"
-#define CONTENT_TYPE "Content-Type:"
-
-static int fix_headers(char *buf, DWORD post_len)
-{
- char *ptr = buf, *ptr2;
-
- while(*ptr && (ptr[0] != '\r' || ptr[1] != '\n')) {
- for(ptr2=ptr+1; *ptr2 && (ptr2[0] != '\r' || ptr2[1] != '\n'); ptr2++);
-
- if(*ptr2)
- ptr2 += 2;
-
- if(!strncasecmp(ptr, USER_AGENT, sizeof(USER_AGENT)-1)) {
- FIXME("Ignoring User-Agent header\n");
- memmove(ptr, ptr2, strlen(ptr2)+1);
- }else if(!post_len && !strncasecmp(ptr, CONTENT_TYPE, sizeof(CONTENT_TYPE)-1)) {
- TRACE("Ignoring Content-Type header\n");
- memmove(ptr, ptr2, strlen(ptr2)+1);
- }else {
- ptr = ptr2;
- }
- }
-
- *ptr = 0;
- return ptr-buf;
-}
-
-static nsIInputStream *get_post_data_stream(IBindCtx *bctx)
-{
- nsIInputStream *ret = NULL;
- IUnknown *unk;
- IBindStatusCallback *callback;
- IServiceProvider *service_provider;
- BINDINFO bindinfo;
- DWORD bindf = 0;
- DWORD post_len = 0, headers_len = 0;
- LPWSTR headers = NULL;
- WCHAR emptystr[] = {0};
- char *data;
- HRESULT hres;
-
- static WCHAR _BSCB_Holder_[] =
- {'_','B','S','C','B','_','H','o','l','d','e','r','_',0};
-
-
- /* FIXME: This should be done in URLMoniker */
- if(!bctx)
- return NULL;
-
- hres = IBindCtx_GetObjectParam(bctx, _BSCB_Holder_, &unk);
- if(FAILED(hres))
- return NULL;
-
- hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&callback);
- if(FAILED(hres)) {
- IUnknown_Release(unk);
- return NULL;
- }
-
- hres = IUnknown_QueryInterface(unk, &IID_IServiceProvider, (void**)&service_provider);
- IUnknown_Release(unk);
- if(SUCCEEDED(hres)) {
- IHttpNegotiate *http_negotiate;
-
- hres = IServiceProvider_QueryService(service_provider, &IID_IHttpNegotiate, &IID_IHttpNegotiate,
- (void**)&http_negotiate);
- if(SUCCEEDED(hres)) {
- hres = IHttpNegotiate_BeginningTransaction(http_negotiate, emptystr,
- emptystr, 0, &headers);
- IHttpNegotiate_Release(http_negotiate);
-
- if(SUCCEEDED(hres) && headers)
- headers_len = WideCharToMultiByte(CP_ACP, 0, headers, -1, NULL, 0, NULL, NULL);
- }
-
- IServiceProvider_Release(service_provider);
- }
-
- memset(&bindinfo, 0, sizeof(bindinfo));
- bindinfo.cbSize = sizeof(bindinfo);
-
- hres = IBindStatusCallback_GetBindInfo(callback, &bindf, &bindinfo);
-
- if(SUCCEEDED(hres) && bindinfo.dwBindVerb == BINDVERB_POST)
- post_len = bindinfo.cbstgmedData;
-
- if(headers_len || post_len) {
- int len = 0;
-
- static const char content_length[] = "Content-Length: %u\r\n\r\n";
-
- data = heap_alloc(headers_len+post_len+sizeof(content_length)+10);
-
- if(headers_len) {
- WideCharToMultiByte(CP_ACP, 0, headers, -1, data, headers_len, NULL, NULL);
- len = fix_headers(data, post_len);
- if(len >= 2 && (data[len-1] != '\n' || data[len-2] != '\r')) {
- data[len++] = '\r';
- data[len++] = '\n';
- }
- }
-
- if(post_len) {
- sprintf(data+len, content_length, post_len);
- len += strlen(data+len);
-
- memcpy(data+len, bindinfo.stgmedData.u.hGlobal, post_len);
- }
-
- TRACE("data = %s\n", debugstr_an(data, len+post_len));
-
- if(len)
- ret = create_nsstream(data, len+post_len);
- }
-
- CoTaskMemFree(headers);
- ReleaseBindInfo(&bindinfo);
- IBindStatusCallback_Release(callback);
-
- return ret;
-}
-
static BOOL use_gecko_script(LPCWSTR url)
{
static const WCHAR fileW[] = {'f','i','l','e',':'};
@@ -304,27 +181,15 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BO
push_task(task);
if(This->nscontainer) {
- nsIInputStream *post_data_stream = get_post_data_stream(pibc);
-
This->nscontainer->bscallback = bscallback;
nsres = nsIWebNavigation_LoadURI(This->nscontainer->navigation, url,
- LOAD_FLAGS_NONE, NULL, post_data_stream, NULL);
+ LOAD_FLAGS_NONE, NULL, NULL, NULL);
This->nscontainer->bscallback = NULL;
-
- if(post_data_stream)
- nsIInputStream_Release(post_data_stream);
-
- if(NS_SUCCEEDED(nsres)) {
- /* FIXME: don't return here (URL Moniker needs to be good enough) */
-
+ if(NS_FAILED(nsres)) {
+ WARN("LoadURI failed: %08x\n", nsres);
IUnknown_Release((IUnknown*)bscallback);
CoTaskMemFree(url);
-
- if(bind_complete)
- *bind_complete = TRUE;
- return S_OK;
- }else if(nsres != WINE_NS_LOAD_FROM_MONIKER) {
- WARN("LoadURI failed: %08x\n", nsres);
+ return E_FAIL;
}
}
@@ -337,7 +202,7 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BO
return S_OK;
}
-static HRESULT get_doc_string(HTMLDocument *This, char **str, DWORD *len)
+static HRESULT get_doc_string(HTMLDocument *This, char **str)
{
nsIDOMNode *nsnode;
LPCWSTR strw;
@@ -362,9 +227,7 @@ static HRESULT get_doc_string(HTMLDocument *This, char **str, DWORD *len)
nsAString_GetData(&nsstr, &strw);
TRACE("%s\n", debugstr_w(strw));
- *len = WideCharToMultiByte(CP_ACP, 0, strw, -1, NULL, 0, NULL, NULL);
- *str = heap_alloc(*len);
- WideCharToMultiByte(CP_ACP, 0, strw, -1, *str, *len, NULL, NULL);
+ *str = heap_strdupWtoA(strw);
nsAString_Finish(&nsstr);
@@ -583,7 +446,7 @@ static HRESULT WINAPI PersistFile_Save(IPersistFile *iface, LPCOLESTR pszFileNam
{
HTMLDocument *This = PERSISTFILE_THIS(iface);
char *str;
- DWORD len, written=0;
+ DWORD written=0;
HANDLE file;
HRESULT hres;
@@ -596,9 +459,9 @@ static HRESULT WINAPI PersistFile_Save(IPersistFile *iface, LPCOLESTR pszFileNam
return E_FAIL;
}
- hres = get_doc_string(This, &str, &len);
+ hres = get_doc_string(This, &str);
if(SUCCEEDED(hres))
- WriteFile(file, str, len, &written, NULL);
+ WriteFile(file, str, strlen(str), &written, NULL);
CloseHandle(file);
return hres;
@@ -698,16 +561,16 @@ static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, LPSTREAM
{
HTMLDocument *This = PERSTRINIT_THIS(iface);
char *str;
- DWORD len, written=0;
+ DWORD written=0;
HRESULT hres;
TRACE("(%p)->(%p %x)\n", This, pStm, fClearDirty);
- hres = get_doc_string(This, &str, &len);
+ hres = get_doc_string(This, &str);
if(FAILED(hres))
return hres;
- hres = IStream_Write(pStm, str, len, &written);
+ hres = IStream_Write(pStm, str, strlen(str), &written);
if(FAILED(hres))
FIXME("Write failed: %08x\n", hres);
diff --git a/reactos/dll/win32/mshtml/resource.h b/reactos/dll/win32/mshtml/resource.h
index f40938054e3..1e926378b10 100644
--- a/reactos/dll/win32/mshtml/resource.h
+++ b/reactos/dll/win32/mshtml/resource.h
@@ -16,6 +16,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include
+#include
+#include
+
#define IDS_HTMLDISABLED 7500
#define IDS_HTMLDOCUMENT 7501
#define IDS_DOWNLOADING 7502
diff --git a/reactos/dll/win32/mshtml/rsrc.rc b/reactos/dll/win32/mshtml/rsrc.rc
index 8be957f7156..5e669de70ef 100644
--- a/reactos/dll/win32/mshtml/rsrc.rc
+++ b/reactos/dll/win32/mshtml/rsrc.rc
@@ -16,13 +16,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "windef.h"
-#include "winuser.h"
-#include "commctrl.h"
-#include "mshtmcid.h"
-
-#include "resource.h"
-
#define WINE_OLESELFREGISTER
#define WINE_FILEDESCRIPTION_STR "Wine HTML Viewer"
#define WINE_FILENAME_STR "mshtml.dll"
@@ -33,30 +26,6 @@
#include "wine/wine_common_ver.rc"
-#include "Bg.rc"
-#include "Da.rc"
-#include "De.rc"
-#include "En.rc"
-#include "Es.rc"
-#include "Fi.rc"
-#include "Fr.rc"
-#include "Hu.rc"
-#include "Ja.rc"
-#include "Ko.rc"
-#include "Lt.rc"
-#include "Nl.rc"
-#include "No.rc"
-#include "Pl.rc"
-#include "Pt.rc"
-#include "Ro.rc"
-#include "Ru.rc"
-#include "Si.rc"
-#include "Sv.rc"
-#include "Tr.rc"
-#include "Zh.rc"
-
-LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
-
/* @makedep: mshtml.inf */
REGINST REGINST mshtml.inf
diff --git a/reactos/dll/win32/mshtml/script.c b/reactos/dll/win32/mshtml/script.c
index 55636d2118e..e12588ccd3e 100644
--- a/reactos/dll/win32/mshtml/script.c
+++ b/reactos/dll/win32/mshtml/script.c
@@ -67,12 +67,30 @@ typedef struct {
#define ACTSCPWIN(x) (&(x)->lpIActiveScriptSiteWindowVtbl)
#define ACTSCPDBG32(x) (&(x)->lpIActiveScriptSiteDebug32Vtbl)
+static void set_script_prop(ScriptHost *script_host, DWORD property, VARIANT *val)
+{
+ IActiveScriptProperty *script_prop;
+ HRESULT hres;
+
+ hres = IActiveScript_QueryInterface(script_host->script, &IID_IActiveScriptProperty,
+ (void**)&script_prop);
+ if(FAILED(hres)) {
+ WARN("Could not get IActiveScriptProperty iface: %08x\n", hres);
+ return;
+ }
+
+ hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val);
+ IActiveScriptProperty_Release(script_prop);
+ if(FAILED(hres))
+ WARN("SetProperty(%x) failed: %08x\n", property, hres);
+}
+
static BOOL init_script_engine(ScriptHost *script_host)
{
- IActiveScriptProperty *property;
IObjectSafety *safety;
SCRIPTSTATE state;
DWORD supported_opts=0, enabled_opts=0;
+ VARIANT var;
HRESULT hres;
hres = IActiveScript_QueryInterface(script_host->script, &IID_IActiveScriptParse, (void**)&script_host->parse);
@@ -104,20 +122,13 @@ static BOOL init_script_engine(ScriptHost *script_host)
if(FAILED(hres))
return FALSE;
- hres = IActiveScript_QueryInterface(script_host->script, &IID_IActiveScriptProperty, (void**)&property);
- if(SUCCEEDED(hres)) {
- VARIANT var;
+ V_VT(&var) = VT_I4;
+ V_I4(&var) = 1;
+ set_script_prop(script_host, SCRIPTPROP_INVOKEVERSIONING, &var);
- V_VT(&var) = VT_BOOL;
- V_BOOL(&var) = VARIANT_TRUE;
- hres = IActiveScriptProperty_SetProperty(property, SCRIPTPROP_HACK_TRIDENTEVENTSINK, NULL, &var);
- if(FAILED(hres))
- WARN("SetProperty failed: %08x\n", hres);
-
- IActiveScriptProperty_Release(property);
- }else {
- WARN("Could not get IActiveScriptProperty: %08x\n", hres);
- }
+ V_VT(&var) = VT_BOOL;
+ V_BOOL(&var) = VARIANT_TRUE;
+ set_script_prop(script_host, SCRIPTPROP_HACK_TRIDENTEVENTSINK, &var);
hres = IActiveScriptParse64_InitNew(script_host->parse);
if(FAILED(hres)) {
@@ -146,8 +157,13 @@ static BOOL init_script_engine(ScriptHost *script_host)
hres = IActiveScript_AddNamedItem(script_host->script, windowW,
SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
- if(FAILED(hres))
+ if(SUCCEEDED(hres)) {
+ V_VT(&var) = VT_BOOL;
+ V_BOOL(&var) = VARIANT_TRUE;
+ set_script_prop(script_host, SCRIPTPROP_ABBREVIATE_GLOBALNAME_RESOLUTION, &var);
+ }else {
WARN("AddNamedItem failed: %08x\n", hres);
+ }
hres = IActiveScript_QueryInterface(script_host->script, &IID_IActiveScriptParseProcedure2,
(void**)&script_host->parse_proc);
diff --git a/reactos/dll/win32/mshtml/task.c b/reactos/dll/win32/mshtml/task.c
index ffef5434ab0..496b96f6bd4 100644
--- a/reactos/dll/win32/mshtml/task.c
+++ b/reactos/dll/win32/mshtml/task.c
@@ -478,11 +478,19 @@ thread_data_t *get_thread_data(BOOL create)
{
thread_data_t *thread_data;
- if(!mshtml_tls) {
- if(create)
- mshtml_tls = TlsAlloc();
- else
+ if(mshtml_tls == TLS_OUT_OF_INDEXES) {
+ DWORD tls;
+
+ if(!create)
return NULL;
+
+ tls = TlsAlloc();
+ if(tls == TLS_OUT_OF_INDEXES)
+ return NULL;
+
+ tls = InterlockedCompareExchange((LONG*)&mshtml_tls, tls, TLS_OUT_OF_INDEXES);
+ if(tls != mshtml_tls)
+ TlsFree(tls);
}
thread_data = TlsGetValue(mshtml_tls);
diff --git a/reactos/dll/win32/mshtml/txtrange.c b/reactos/dll/win32/mshtml/txtrange.c
index fd00f852ba8..509d9382033 100644
--- a/reactos/dll/win32/mshtml/txtrange.c
+++ b/reactos/dll/win32/mshtml/txtrange.c
@@ -804,11 +804,11 @@ static WCHAR prev_char(HTMLTxtRange *This, const dompos_t *pos, dompos_t *new_po
return 0;
}
-static long move_next_chars(long cnt, const dompos_t *pos, BOOL col, const dompos_t *bound_pos,
+static LONG move_next_chars(LONG cnt, const dompos_t *pos, BOOL col, const dompos_t *bound_pos,
BOOL *bounded, dompos_t *new_pos)
{
dompos_t iter, tmp;
- long ret = 0;
+ LONG ret = 0;
WCHAR c;
if(bounded)
@@ -843,11 +843,11 @@ static long move_next_chars(long cnt, const dompos_t *pos, BOOL col, const dompo
return ret;
}
-static long move_prev_chars(HTMLTxtRange *This, long cnt, const dompos_t *pos, BOOL end,
+static LONG move_prev_chars(HTMLTxtRange *This, LONG cnt, const dompos_t *pos, BOOL end,
const dompos_t *bound_pos, BOOL *bounded, dompos_t *new_pos)
{
dompos_t iter, tmp;
- long ret = 0;
+ LONG ret = 0;
BOOL prev_eq = FALSE;
WCHAR c;
@@ -882,7 +882,7 @@ static long move_prev_chars(HTMLTxtRange *This, long cnt, const dompos_t *pos, B
return ret;
}
-static long find_prev_space(HTMLTxtRange *This, const dompos_t *pos, BOOL first_space, dompos_t *ret)
+static LONG find_prev_space(HTMLTxtRange *This, const dompos_t *pos, BOOL first_space, dompos_t *ret)
{
dompos_t iter, tmp;
WCHAR c;
@@ -946,10 +946,10 @@ static int find_word_end(const dompos_t *pos, dompos_t *ret)
return cnt;
}
-static long move_next_words(long cnt, const dompos_t *pos, dompos_t *new_pos)
+static LONG move_next_words(LONG cnt, const dompos_t *pos, dompos_t *new_pos)
{
dompos_t iter, tmp;
- long ret = 0;
+ LONG ret = 0;
WCHAR c;
c = get_pos_char(pos);
@@ -974,10 +974,10 @@ static long move_next_words(long cnt, const dompos_t *pos, dompos_t *new_pos)
return ret;
}
-static long move_prev_words(HTMLTxtRange *This, long cnt, const dompos_t *pos, dompos_t *new_pos)
+static LONG move_prev_words(HTMLTxtRange *This, LONG cnt, const dompos_t *pos, dompos_t *new_pos)
{
dompos_t iter, tmp;
- long ret = 0;
+ LONG ret = 0;
iter = *pos;
dompos_addref(&iter);
diff --git a/reactos/dll/win32/msi/custom.c b/reactos/dll/win32/msi/custom.c
index fa8f9517acf..3476f0d376b 100644
--- a/reactos/dll/win32/msi/custom.c
+++ b/reactos/dll/win32/msi/custom.c
@@ -851,6 +851,7 @@ static UINT HANDLE_CustomType23(MSIPACKAGE *package, LPCWSTR source,
msi_custom_action_info *info;
WCHAR package_path[MAX_PATH];
DWORD size;
+ UINT r;
static const WCHAR backslash[] = {'\\',0};
@@ -863,7 +864,9 @@ static UINT HANDLE_CustomType23(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCAConcurrentInstall(package, type, package_path, target, action);
- return wait_thread_handle(info);
+ r = wait_thread_handle(info);
+ release_custom_action_data( info );
+ return r;
}
static UINT HANDLE_CustomType1(MSIPACKAGE *package, LPCWSTR source,
@@ -888,7 +891,9 @@ static UINT HANDLE_CustomType1(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCustomActionTypeDll( package, type, tmp_file, target, action );
- return wait_thread_handle( info );
+ r = wait_thread_handle( info );
+ release_custom_action_data( info );
+ return r;
}
static UINT HANDLE_CustomType2(MSIPACKAGE *package, LPCWSTR source,
@@ -951,6 +956,7 @@ static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source,
{
msi_custom_action_info *info;
MSIFILE *file;
+ UINT r;
TRACE("%s %s\n", debugstr_w(source), debugstr_w(target));
@@ -963,7 +969,9 @@ static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCustomActionTypeDll( package, type, file->TargetPath, target, action );
- return wait_thread_handle( info );
+ r = wait_thread_handle( info );
+ release_custom_action_data( info );
+ return r;
}
static UINT HANDLE_CustomType18(MSIPACKAGE *package, LPCWSTR source,
@@ -1167,9 +1175,7 @@ static DWORD ACTION_CallScript( const GUID *guid )
else
ERR("failed to create handle for %p\n", info->package );
- if (info->type & msidbCustomActionTypeAsync &&
- info->type & msidbCustomActionTypeContinue)
- release_custom_action_data( info );
+ release_custom_action_data( info );
return S_OK;
}
@@ -1226,13 +1232,16 @@ static msi_custom_action_info *do_msidbCustomActionTypeScript(
static UINT HANDLE_CustomType37_38(MSIPACKAGE *package, LPCWSTR source,
LPCWSTR target, const INT type, LPCWSTR action)
{
+ UINT r;
msi_custom_action_info *info;
TRACE("%s %s\n", debugstr_w(source), debugstr_w(target));
info = do_msidbCustomActionTypeScript( package, type, target, NULL, action );
- return wait_thread_handle( info );
+ r = wait_thread_handle( info );
+ release_custom_action_data( info );
+ return r;
}
static UINT HANDLE_CustomType5_6(MSIPACKAGE *package, LPCWSTR source,
@@ -1277,6 +1286,7 @@ static UINT HANDLE_CustomType5_6(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCustomActionTypeScript( package, type, bufferw, target, action );
r = wait_thread_handle( info );
+ release_custom_action_data( info );
done:
msi_free(bufferw);
@@ -1341,6 +1351,7 @@ static UINT HANDLE_CustomType21_22(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCustomActionTypeScript( package, type, bufferw, target, action );
r = wait_thread_handle( info );
+ release_custom_action_data( info );
done:
msi_free(bufferw);
@@ -1353,6 +1364,7 @@ static UINT HANDLE_CustomType53_54(MSIPACKAGE *package, LPCWSTR source,
{
msi_custom_action_info *info;
WCHAR *prop;
+ UINT r;
TRACE("%s %s\n", debugstr_w(source), debugstr_w(target));
@@ -1362,7 +1374,9 @@ static UINT HANDLE_CustomType53_54(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCustomActionTypeScript( package, type, prop, NULL, action );
msi_free(prop);
- return wait_thread_handle( info );
+ r = wait_thread_handle( info );
+ release_custom_action_data( info );
+ return r;
}
void ACTION_FinishCustomActions(const MSIPACKAGE* package)
diff --git a/reactos/dll/win32/msi/database.c b/reactos/dll/win32/msi/database.c
index bc9319e33db..173657e1b70 100644
--- a/reactos/dll/win32/msi/database.c
+++ b/reactos/dll/win32/msi/database.c
@@ -41,11 +41,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(msi);
-DEFINE_GUID( CLSID_MsiDatabase, 0x000c1084, 0x0000, 0x0000,
- 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
-DEFINE_GUID( CLSID_MsiPatch, 0x000c1086, 0x0000, 0x0000,
- 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
-
/*
* .MSI file format
*
@@ -163,7 +158,8 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
}
if ( !IsEqualGUID( &stat.clsid, &CLSID_MsiDatabase ) &&
- !IsEqualGUID( &stat.clsid, &CLSID_MsiPatch ) )
+ !IsEqualGUID( &stat.clsid, &CLSID_MsiPatch ) &&
+ !IsEqualGUID( &stat.clsid, &CLSID_MsiTransform ) )
{
ERR("storage GUID is not a MSI database GUID %s\n",
debugstr_guid(&stat.clsid) );
@@ -417,10 +413,16 @@ static LPWSTR msi_build_createsql_columns(LPWSTR *columns_data, LPWSTR *types, D
case 'i':
lstrcpyW(extra, type_notnull);
case 'I':
- if (len == 2)
+ if (len <= 2)
type = type_int;
- else
+ else if (len == 4)
type = type_long;
+ else
+ {
+ WARN("invalid int width %u\n", len);
+ msi_free(columns);
+ return NULL;
+ }
break;
case 'v':
lstrcpyW(extra, type_notnull);
diff --git a/reactos/dll/win32/msi/dialog.c b/reactos/dll/win32/msi/dialog.c
index 495e033e913..88416e3d027 100644
--- a/reactos/dll/win32/msi/dialog.c
+++ b/reactos/dll/win32/msi/dialog.c
@@ -171,7 +171,7 @@ static HWND hMsiHiddenWindow;
static INT msi_dialog_scale_unit( msi_dialog *dialog, INT val )
{
- return (dialog->scale * val + 5) / 10;
+ return MulDiv( val, dialog->scale, 12 );
}
static msi_control *msi_dialog_find_control( msi_dialog *dialog, LPCWSTR name )
@@ -417,7 +417,7 @@ static msi_control *msi_dialog_create_window( msi_dialog *dialog,
return NULL;
strcpyW( control->name, name );
- list_add_head( &dialog->controls, &control->entry );
+ list_add_tail( &dialog->controls, &control->entry );
control->handler = NULL;
control->update = NULL;
control->property = NULL;
@@ -2911,7 +2911,7 @@ static INT msi_dialog_get_sans_serif_height( HWND hwnd )
if (hdc)
{
memset( &lf, 0, sizeof lf );
- lf.lfHeight = MulDiv(10, GetDeviceCaps(hdc, LOGPIXELSY), 72);
+ lf.lfHeight = MulDiv(12, GetDeviceCaps(hdc, LOGPIXELSY), 72);
strcpyW( lf.lfFaceName, szSansSerif );
hFont = CreateFontIndirectW(&lf);
if (hFont)
@@ -3002,37 +3002,34 @@ static void msi_dialog_adjust_dialog_pos( msi_dialog *dialog, MSIRECORD *rec, LP
AdjustWindowRect( pos, style, FALSE );
}
-static BOOL msi_control_set_next( msi_control *control, msi_control *next )
+static void msi_dialog_set_tab_order( msi_dialog *dialog, LPCWSTR first )
{
- return SetWindowPos( next->hwnd, control->hwnd, 0, 0, 0, 0,
- SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREDRAW |
- SWP_NOREPOSITION | SWP_NOSENDCHANGING | SWP_NOSIZE );
-}
+ struct list tab_chain;
+ msi_control *control;
+ HWND prev = HWND_TOP;
-static UINT msi_dialog_set_tab_order( msi_dialog *dialog )
-{
- msi_control *control, *tab_next;
+ list_init( &tab_chain );
+ if (!(control = msi_dialog_find_control( dialog, first ))) return;
- LIST_FOR_EACH_ENTRY( control, &dialog->controls, msi_control, entry )
+ dialog->hWndFocus = control->hwnd;
+ while (control)
{
- tab_next = msi_dialog_find_control( dialog, control->tabnext );
- if( !tab_next )
- continue;
- msi_control_set_next( control, tab_next );
+ list_remove( &control->entry );
+ list_add_tail( &tab_chain, &control->entry );
+ if (!control->tabnext) break;
+ control = msi_dialog_find_control( dialog, control->tabnext );
}
- return ERROR_SUCCESS;
-}
+ LIST_FOR_EACH_ENTRY( control, &tab_chain, msi_control, entry )
+ {
+ SetWindowPos( control->hwnd, prev, 0, 0, 0, 0,
+ SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREDRAW |
+ SWP_NOREPOSITION | SWP_NOSENDCHANGING | SWP_NOSIZE );
+ prev = control->hwnd;
+ }
-static void msi_dialog_set_first_control( msi_dialog* dialog, LPCWSTR name )
-{
- msi_control *control;
-
- control = msi_dialog_find_control( dialog, name );
- if( control )
- dialog->hWndFocus = control->hwnd;
- else
- dialog->hWndFocus = NULL;
+ /* put them back on the main list */
+ list_move_head( &dialog->controls, &tab_chain );
}
static LRESULT msi_dialog_oncreate( HWND hwnd, LPCREATESTRUCTW cs )
@@ -3082,8 +3079,7 @@ static LRESULT msi_dialog_oncreate( HWND hwnd, LPCREATESTRUCTW cs )
msi_dialog_build_font_list( dialog );
msi_dialog_fill_controls( dialog );
msi_dialog_evaluate_control_conditions( dialog );
- msi_dialog_set_tab_order( dialog );
- msi_dialog_set_first_control( dialog, MSI_RecordGetString( rec, 8 ) );
+ msi_dialog_set_tab_order( dialog, MSI_RecordGetString( rec, 8 ) );
msiobj_release( &rec->hdr );
return 0;
diff --git a/reactos/dll/win32/msi/msi.rc b/reactos/dll/win32/msi/msi.rc
index ffcb0c19ca9..89d524c18e1 100644
--- a/reactos/dll/win32/msi/msi.rc
+++ b/reactos/dll/win32/msi/msi.rc
@@ -38,6 +38,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#include "msi_Hu.rc"
#include "msi_It.rc"
#include "msi_Ko.rc"
+#include "msi_Lt.rc"
#include "msi_Nl.rc"
#include "msi_No.rc"
#include "msi_Pl.rc"
diff --git a/reactos/dll/win32/msi/msi_Bg.rc b/reactos/dll/win32/msi/msi_Bg.rc
index 3f2b34a5eb1..d3b8ca84abb 100644
--- a/reactos/dll/win32/msi/msi_Bg.rc
+++ b/reactos/dll/win32/msi/msi_Bg.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_Da.rc b/reactos/dll/win32/msi/msi_Da.rc
index 0fd1af07ee0..beee42765ee 100644
--- a/reactos/dll/win32/msi/msi_Da.rc
+++ b/reactos/dll/win32/msi/msi_Da.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_De.rc b/reactos/dll/win32/msi/msi_De.rc
index 00649b6ecd4..6cee52a30dc 100644
--- a/reactos/dll/win32/msi/msi_De.rc
+++ b/reactos/dll/win32/msi/msi_De.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
diff --git a/reactos/dll/win32/msi/msi_En.rc b/reactos/dll/win32/msi/msi_En.rc
index 55a6b229ff5..74fc5c14a85 100644
--- a/reactos/dll/win32/msi/msi_En.rc
+++ b/reactos/dll/win32/msi/msi_En.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_Eo.rc b/reactos/dll/win32/msi/msi_Eo.rc
index e7ed2fa5a26..7579bdc65cb 100644
--- a/reactos/dll/win32/msi/msi_Eo.rc
+++ b/reactos/dll/win32/msi/msi_Eo.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_ESPERANTO, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_Es.rc b/reactos/dll/win32/msi/msi_Es.rc
index 94bfaf55e00..781be071802 100644
--- a/reactos/dll/win32/msi/msi_Es.rc
+++ b/reactos/dll/win32/msi/msi_Es.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_Fi.rc b/reactos/dll/win32/msi/msi_Fi.rc
index 87ce3280202..17721aa4b01 100644
--- a/reactos/dll/win32/msi/msi_Fi.rc
+++ b/reactos/dll/win32/msi/msi_Fi.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_Fr.rc b/reactos/dll/win32/msi/msi_Fr.rc
index 8b4b83ffdaf..08b90497745 100644
--- a/reactos/dll/win32/msi/msi_Fr.rc
+++ b/reactos/dll/win32/msi/msi_Fr.rc
@@ -18,17 +18,23 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
- 4 "The specified installation package could not be opened. Please check the file path and try again."
+ 4 "Le paquet d'installation spécifié n'a pu être ouvert. Veuillez vérifier le chemin du fichier et réessayer."
5 "Le chemin %s est introuvable"
- 9 "insrez le disque %s"
- 10 "mauvais paramtres"
+ 9 "insérez le disque %s"
+ 10 "mauvais paramètres"
11 "saisissez le nom du dossier contenant %s"
- 12 "source d'installation pour la fonctionnalit manquante"
- 13 "lecteur rseau pour la fonctionnalit manquant"
- 14 "fonctionnalit depuis:"
- 15 "slectionnez le dossier contenant %s"
+ 12 "source d'installation pour la fonctionnalité manquante"
+ 13 "lecteur réseau pour la fonctionnalité manquante"
+ 14 "fonctionnalité depuis :"
+ 15 "sélectionnez le dossier contenant %s"
}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/msi/msi_Hu.rc b/reactos/dll/win32/msi/msi_Hu.rc
index ccefef7a14b..21ba5cf30c1 100644
--- a/reactos/dll/win32/msi/msi_Hu.rc
+++ b/reactos/dll/win32/msi/msi_Hu.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_It.rc b/reactos/dll/win32/msi/msi_It.rc
index 9e952450869..9864806fd80 100644
--- a/reactos/dll/win32/msi/msi_It.rc
+++ b/reactos/dll/win32/msi/msi_It.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_Ko.rc b/reactos/dll/win32/msi/msi_Ko.rc
index 2bca718c58a..ca14253307d 100644
--- a/reactos/dll/win32/msi/msi_Ko.rc
+++ b/reactos/dll/win32/msi/msi_Ko.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/base/applications/write/lang/ko-KR.rc b/reactos/dll/win32/msi/msi_Lt.rc
similarity index 55%
rename from reactos/base/applications/write/lang/ko-KR.rc
rename to reactos/dll/win32/msi/msi_Lt.rc
index f78ea13b286..76602612bd5 100644
--- a/reactos/base/applications/write/lang/ko-KR.rc
+++ b/reactos/dll/win32/msi/msi_Lt.rc
@@ -1,8 +1,7 @@
/*
- * Korean language support
+ * Lithuanian resources for MSI
*
- * Copyright (C) 2007 Mikolaj Zalewski
- * Copyright (C) 2008 YunSong Hwang(Ȳ)(hys545@dreamwiz.com)
+ * Copyright 2009 Aurimas Fišeras
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -19,9 +18,23 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
+#include "windef.h"
-STRINGTABLE
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
{
- IDS_FAILED, "е "
+ 4 "Nepavyko atverti nurodyto diegimo paketo. Patikrinkite failo kelią ir mėginkite dar kartą."
+ 5 "kelias %s nerastas"
+ 9 "įdėkite diską %s"
+ 10 "blogi parametrai"
+ 11 "įveskite aplanką, kuris turi %s"
+ 12 "trūksta diegimo šaltinio komponentui"
+ 13 "trūksta tinklo disko komponentui"
+ 14 "komponentas iš:"
+ 15 "parinkite aplanką, kuris turi %s"
}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/msi/msi_Nl.rc b/reactos/dll/win32/msi/msi_Nl.rc
index 123b1c69aff..da304304ed3 100644
--- a/reactos/dll/win32/msi/msi_Nl.rc
+++ b/reactos/dll/win32/msi/msi_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_No.rc b/reactos/dll/win32/msi/msi_No.rc
index 3ab58bcb1cf..e885f5adbda 100644
--- a/reactos/dll/win32/msi/msi_No.rc
+++ b/reactos/dll/win32/msi/msi_No.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_Pl.rc b/reactos/dll/win32/msi/msi_Pl.rc
index 00eb5352bb9..c31311ebf7e 100644
--- a/reactos/dll/win32/msi/msi_Pl.rc
+++ b/reactos/dll/win32/msi/msi_Pl.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_Pt.rc b/reactos/dll/win32/msi/msi_Pt.rc
index 3d90f71ded7..64ab16348d4 100644
--- a/reactos/dll/win32/msi/msi_Pt.rc
+++ b/reactos/dll/win32/msi/msi_Pt.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_Ro.rc b/reactos/dll/win32/msi/msi_Ro.rc
index a167d0558df..436f83b491b 100644
--- a/reactos/dll/win32/msi/msi_Ro.rc
+++ b/reactos/dll/win32/msi/msi_Ro.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -33,5 +35,4 @@ STRINGTABLE DISCARDABLE
14 "caracteristică de la:"
15 "selectați fișierul care conține %s"
}
-
#pragma code_page(default)
diff --git a/reactos/dll/win32/msi/msi_Ru.rc b/reactos/dll/win32/msi/msi_Ru.rc
index 2646573b659..3e59873c228 100644
--- a/reactos/dll/win32/msi/msi_Ru.rc
+++ b/reactos/dll/win32/msi/msi_Ru.rc
@@ -18,17 +18,23 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
- 4 " . ."
- 5 " %s "
- 9 " %s"
- 10 " "
- 11 " , %s"
- 12 " "
- 13 " "
- 14 " :"
- 15 " , %s"
+ 4 "Указанный пакет не может быть открыт. Проверьте файл и повторите попытку."
+ 5 "путь %s не найден"
+ 9 "вставьте диск %s"
+ 10 "неверные параметры"
+ 11 "укажите каталог, содержащий %s"
+ 12 "источник установки данной возможности не указан"
+ 13 "сетевой диск для данной возможности не указан"
+ 14 "возможность из:"
+ 15 "выберите каталог, содержащий %s"
}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/msi/msi_Si.rc b/reactos/dll/win32/msi/msi_Si.rc
index bf92697d2ef..df7a9f1dc04 100644
--- a/reactos/dll/win32/msi/msi_Si.rc
+++ b/reactos/dll/win32/msi/msi_Si.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
@@ -34,5 +36,4 @@ STRINGTABLE DISCARDABLE
14 "funkcija z:"
15 "izberite mapo, ki vsebuje %s"
}
-
#pragma code_page(default)
diff --git a/reactos/dll/win32/msi/msi_Sv.rc b/reactos/dll/win32/msi/msi_Sv.rc
index dc1f2ed36db..47bf09b00c4 100644
--- a/reactos/dll/win32/msi/msi_Sv.rc
+++ b/reactos/dll/win32/msi/msi_Sv.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_Tr.rc b/reactos/dll/win32/msi/msi_Tr.rc
index becd9136d6d..a8e0f369666 100644
--- a/reactos/dll/win32/msi/msi_Tr.rc
+++ b/reactos/dll/win32/msi/msi_Tr.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
diff --git a/reactos/dll/win32/msi/msi_Zh.rc b/reactos/dll/win32/msi/msi_Zh.rc
index 86620db06fc..a6d5cd1eff6 100644
--- a/reactos/dll/win32/msi/msi_Zh.rc
+++ b/reactos/dll/win32/msi/msi_Zh.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "windef.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -50,5 +52,3 @@ STRINGTABLE DISCARDABLE
14 "功能來自:"
15 "選擇包含 %s 的檔案夾"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/msi/msipriv.h b/reactos/dll/win32/msi/msipriv.h
index 8c4bd3a4515..b61d7b6f245 100644
--- a/reactos/dll/win32/msi/msipriv.h
+++ b/reactos/dll/win32/msi/msipriv.h
@@ -605,6 +605,10 @@ DEFINE_GUID(CLSID_IMsiServerMessage, 0x000C101D,0x0000,0x0000,0xC0,0x00,0x00,0x0
DEFINE_GUID(CLSID_IWineMsiRemoteCustomAction,0xBA26E6FA,0x4F27,0x4f56,0x95,0x3A,0x3F,0x90,0x27,0x20,0x18,0xAA);
DEFINE_GUID(CLSID_IWineMsiRemotePackage,0x902b3592,0x9d08,0x4dfd,0xa5,0x93,0xd0,0x7c,0x52,0x54,0x64,0x21);
+DEFINE_GUID(CLSID_MsiTransform, 0x000c1082,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
+DEFINE_GUID(CLSID_MsiDatabase, 0x000c1084,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
+DEFINE_GUID(CLSID_MsiPatch, 0x000c1086,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
+
/* handle unicode/ascii output in the Msi* API functions */
typedef struct {
BOOL unicode;
diff --git a/reactos/dll/win32/msi/msiquery.c b/reactos/dll/win32/msi/msiquery.c
index 43c7b4dc52a..5a46f9b5cb6 100644
--- a/reactos/dll/win32/msi/msiquery.c
+++ b/reactos/dll/win32/msi/msiquery.c
@@ -716,8 +716,6 @@ MSIHANDLE WINAPI MsiGetLastErrorRecord( void )
return 0;
}
-DEFINE_GUID( CLSID_MsiTransform, 0x000c1082, 0x0000, 0x0000, 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
-
UINT MSI_DatabaseApplyTransformW( MSIDATABASE *db,
LPCWSTR szTransformFile, int iErrorCond )
{
diff --git a/reactos/dll/win32/msi/msiserver.idl b/reactos/dll/win32/msi/msiserver.idl
index ac442dbd076..546b75821ca 100644
--- a/reactos/dll/win32/msi/msiserver.idl
+++ b/reactos/dll/win32/msi/msiserver.idl
@@ -424,4 +424,4 @@ library WindowsInstaller
properties:
methods:
}
-}
+}
\ No newline at end of file
diff --git a/reactos/dll/win32/msi/table.c b/reactos/dll/win32/msi/table.c
index 0b5b99164b9..b963a2022fd 100644
--- a/reactos/dll/win32/msi/table.c
+++ b/reactos/dll/win32/msi/table.c
@@ -121,16 +121,23 @@ static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo,
static UINT get_tablecolumns( MSIDATABASE *db,
LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz);
static void msi_free_colinfo( MSICOLUMNINFO *colinfo, UINT count );
+static UINT table_find_insert_idx (MSIVIEW *view, LPCWSTR name, INT *pidx);
static inline UINT bytes_per_column( MSIDATABASE *db, const MSICOLUMNINFO *col )
{
if( MSITYPE_IS_BINARY(col->type) )
return 2;
+
if( col->type & MSITYPE_STRING )
return db->bytes_per_strref;
- if( (col->type & 0xff) > 4 )
+
+ if( (col->type & 0xff) <= 2)
+ return 2;
+
+ if( (col->type & 0xff) != 4 )
ERR("Invalid column size!\n");
- return col->type & 0xff;
+
+ return 4;
}
static int utf2mime(int x)
@@ -620,6 +627,7 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
column_info *col;
MSITABLE *table;
UINT i;
+ INT idx;
/* only add tables that don't exist already */
if( TABLE_Exists(db, name ) )
@@ -685,7 +693,11 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
if( r )
goto err;
- r = tv->ops->insert_row( tv, rec, -1, persistent == MSICONDITION_FALSE );
+ r = table_find_insert_idx (tv, name, &idx);
+ if (r != ERROR_SUCCESS)
+ idx = -1;
+
+ r = tv->ops->insert_row( tv, rec, idx, persistent == MSICONDITION_FALSE );
TRACE("insert_row returned %x\n", r);
if( r )
goto err;
@@ -735,7 +747,11 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
if( r )
goto err;
- r = tv->ops->insert_row( tv, rec, -1, FALSE );
+ r = table_find_insert_idx (tv, name, &idx);
+ if (r != ERROR_SUCCESS)
+ idx = -1;
+
+ r = tv->ops->insert_row( tv, rec, idx, FALSE );
if( r )
goto err;
@@ -1701,6 +1717,21 @@ static UINT msi_table_update(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row)
return TABLE_set_row(view, new_row, rec, (1 << tv->num_cols) - 1);
}
+static UINT msi_table_assign(struct tagMSIVIEW *view, MSIRECORD *rec)
+{
+ MSITABLEVIEW *tv = (MSITABLEVIEW *)view;
+ UINT r, row;
+
+ if (!tv->table)
+ return ERROR_INVALID_PARAMETER;
+
+ r = msi_table_find_row(tv, rec, &row);
+ if (r == ERROR_SUCCESS)
+ return TABLE_set_row(view, row, rec, (1 << tv->num_cols) - 1);
+ else
+ return TABLE_insert_row( view, rec, -1, FALSE );
+}
+
static UINT modify_delete_row( struct tagMSIVIEW *view, MSIRECORD *rec )
{
MSITABLEVIEW *tv = (MSITABLEVIEW *)view;
@@ -1770,6 +1801,9 @@ static UINT TABLE_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode,
break;
case MSIMODIFY_ASSIGN:
+ r = msi_table_assign( view, rec );
+ break;
+
case MSIMODIFY_REPLACE:
case MSIMODIFY_MERGE:
case MSIMODIFY_VALIDATE:
@@ -2923,3 +2957,29 @@ void msi_free_transforms( MSIDATABASE *db )
msi_free( t );
}
}
+
+static UINT table_find_insert_idx (MSIVIEW *view, LPCWSTR name, INT *pidx)
+{
+ UINT r, name_id, row_id;
+ INT idx;
+ MSITABLEVIEW *tv = (MSITABLEVIEW *)view;
+
+ TRACE ("%p %s\n", view, debugstr_w(name));
+
+ r = msi_string2idW(tv->db->strings, name, &name_id);
+ if (r != ERROR_SUCCESS)
+ {
+ *pidx = -1;
+ return r;
+ }
+
+ for( idx = 0; idx < tv->table->row_count; idx++ )
+ {
+ r = TABLE_fetch_int( &tv->view, idx, 1, &row_id );
+ if (row_id > name_id)
+ break;
+ }
+
+ *pidx = idx;
+ return ERROR_SUCCESS;
+}
diff --git a/reactos/dll/win32/msvfw32/msvfw32.rbuild b/reactos/dll/win32/msvfw32/msvfw32.rbuild
index 37ffd8aa7e3..3e6cc002eb0 100644
--- a/reactos/dll/win32/msvfw32/msvfw32.rbuild
+++ b/reactos/dll/win32/msvfw32/msvfw32.rbuild
@@ -6,6 +6,7 @@
.
include/reactos/wine
+
mciwnd.c
msvideo_main.c
drawdib.c
diff --git a/reactos/dll/win32/msxml3/attribute.c b/reactos/dll/win32/msxml3/attribute.c
index 92cafad5367..2fc32be11d0 100644
--- a/reactos/dll/win32/msxml3/attribute.c
+++ b/reactos/dll/win32/msxml3/attribute.c
@@ -547,7 +547,7 @@ static const struct IXMLDOMAttributeVtbl domattr_vtbl =
IUnknown* create_attribute( xmlNodePtr attribute )
{
domattr *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
@@ -556,22 +556,15 @@ IUnknown* create_attribute( xmlNodePtr attribute )
This->lpVtbl = &domattr_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( attribute, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( attribute, (IUnknown*)&This->lpVtbl, NULL );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
diff --git a/reactos/dll/win32/msxml3/cdata.c b/reactos/dll/win32/msxml3/cdata.c
index 3d3c87514b9..b0ef3d76595 100644
--- a/reactos/dll/win32/msxml3/cdata.c
+++ b/reactos/dll/win32/msxml3/cdata.c
@@ -770,7 +770,7 @@ static const struct IXMLDOMCDATASectionVtbl domcdata_vtbl =
IUnknown* create_cdata( xmlNodePtr text )
{
domcdata *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
@@ -779,22 +779,15 @@ IUnknown* create_cdata( xmlNodePtr text )
This->lpVtbl = &domcdata_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( text, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( text, (IUnknown*)&This->lpVtbl, NULL );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
diff --git a/reactos/dll/win32/msxml3/comment.c b/reactos/dll/win32/msxml3/comment.c
index 717c73d0c45..346ad192730 100644
--- a/reactos/dll/win32/msxml3/comment.c
+++ b/reactos/dll/win32/msxml3/comment.c
@@ -768,7 +768,7 @@ static const struct IXMLDOMCommentVtbl domcomment_vtbl =
IUnknown* create_comment( xmlNodePtr comment )
{
domcomment *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
@@ -777,22 +777,15 @@ IUnknown* create_comment( xmlNodePtr comment )
This->lpVtbl = &domcomment_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( comment, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( comment, (IUnknown*)&This->lpVtbl, NULL );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
diff --git a/reactos/dll/win32/msxml3/dispex.c b/reactos/dll/win32/msxml3/dispex.c
index ab9d909035e..529f9a452ee 100644
--- a/reactos/dll/win32/msxml3/dispex.c
+++ b/reactos/dll/win32/msxml3/dispex.c
@@ -91,6 +91,7 @@ static REFIID tid_ids[] = {
&IID_IXMLDOMParseError,
&IID_IXMLDOMProcessingInstruction,
&IID_IXMLDOMSchemaCollection,
+ &IID_IXMLDOMSelection,
&IID_IXMLDOMText,
&IID_IXMLElement,
&IID_IXMLDOMDocument,
@@ -634,6 +635,9 @@ BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv)
}else if(IsEqualGUID(&IID_UndocumentedScriptIface, riid)) {
TRACE("(%p)->(IID_UndocumentedScriptIface %p) returning NULL\n", This, ppv);
*ppv = NULL;
+ }else if (IsEqualGUID(&IID_IObjectIdentity, riid)) {
+ TRACE("IID_IObjectIdentity not supported returning NULL\n");
+ *ppv = NULL;
}else {
return FALSE;
}
diff --git a/reactos/dll/win32/msxml3/docfrag.c b/reactos/dll/win32/msxml3/docfrag.c
index f922faaa229..1330c196ba0 100644
--- a/reactos/dll/win32/msxml3/docfrag.c
+++ b/reactos/dll/win32/msxml3/docfrag.c
@@ -520,7 +520,7 @@ static const struct IXMLDOMDocumentFragmentVtbl domfrag_vtbl =
IUnknown* create_doc_fragment( xmlNodePtr fragment )
{
domfrag *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
@@ -529,22 +529,15 @@ IUnknown* create_doc_fragment( xmlNodePtr fragment )
This->lpVtbl = &domfrag_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( fragment, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( fragment, (IUnknown*)&This->lpVtbl, NULL );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
diff --git a/reactos/dll/win32/msxml3/domdoc.c b/reactos/dll/win32/msxml3/domdoc.c
index 1724093a39e..ad0fe0a49bc 100644
--- a/reactos/dll/win32/msxml3/domdoc.c
+++ b/reactos/dll/win32/msxml3/domdoc.c
@@ -64,8 +64,7 @@ typedef struct _domdoc
VARIANT_BOOL resolving;
VARIANT_BOOL preserving;
BOOL bUseXPath;
- IUnknown *node_unk;
- IXMLDOMNode *node;
+ xmlnode *node;
IXMLDOMSchemaCollection *schema;
bsc_t *bsc;
HRESULT error;
@@ -78,9 +77,6 @@ typedef struct _domdoc
/* IObjectSafety */
DWORD safeopt;
-
- /* IDispatchEx */
- DispatchEx dispex;
} domdoc;
/*
@@ -210,16 +206,14 @@ HRESULT xmldoc_remove_orphan(xmlDocPtr doc, xmlNodePtr node)
return S_FALSE;
}
-static HRESULT attach_xmldoc( IXMLDOMNode *node, xmlDocPtr xml )
+static HRESULT attach_xmldoc( xmlnode *node, xmlDocPtr xml )
{
- xmlnode *This = impl_from_IXMLDOMNode( node );
+ if(node->node)
+ xmldoc_release(node->node->doc);
- if(This->node)
- xmldoc_release(This->node->doc);
-
- This->node = (xmlNodePtr) xml;
- if(This->node)
- xmldoc_add_ref(This->node->doc);
+ node->node = (xmlNodePtr) xml;
+ if(node->node)
+ xmldoc_add_ref(node->node->doc);
return S_OK;
}
@@ -231,7 +225,7 @@ static inline domdoc *impl_from_IXMLDOMDocument2( IXMLDOMDocument2 *iface )
static inline xmlDocPtr get_doc( domdoc *This )
{
- return (xmlDocPtr) xmlNodePtr_from_domnode( This->node, XML_DOCUMENT_NODE );
+ return (xmlDocPtr)This->node->node;
}
static inline domdoc *impl_from_IPersistStream(IPersistStream *iface)
@@ -363,7 +357,7 @@ static HRESULT WINAPI xmldoc_IPersistStream_Save(
TRACE("(%p, %p, %d)\n", iface, pStm, fClearDirty);
- hr = IXMLDOMNode_get_xml( This->node, &xmlString );
+ hr = IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(This->node), &xmlString );
if(hr == S_OK)
{
DWORD count;
@@ -455,7 +449,7 @@ static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument2 *iface, REFIID rii
}
else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
{
- return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
+ *ppvObject = IXMLDOMNode_from_impl(This->node);
}
else if (IsEqualGUID(&IID_IPersistStream, riid))
{
@@ -469,7 +463,7 @@ static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument2 *iface, REFIID rii
{
*ppvObject = &This->lpvtblISupportErrorInfo;
}
- else if(dispex_query_interface(&This->dispex, riid, ppvObject))
+ else if(dispex_query_interface(&This->node->dispex, riid, ppvObject))
{
return *ppvObject ? S_OK : E_NOINTERFACE;
}
@@ -484,7 +478,7 @@ static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument2 *iface, REFIID rii
return E_NOINTERFACE;
}
- IXMLDOMDocument_AddRef( iface );
+ IUnknown_AddRef((IUnknown*)*ppvObject);
return S_OK;
}
@@ -515,7 +509,7 @@ static ULONG WINAPI domdoc_Release(
if (This->site)
IUnknown_Release( This->site );
- IUnknown_Release( This->node_unk );
+ IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
if(This->schema) IXMLDOMSchemaCollection_Release( This->schema );
if (This->stream) IStream_Release(This->stream);
HeapFree( GetProcessHeap(), 0, This );
@@ -613,7 +607,7 @@ static HRESULT WINAPI domdoc_get_nodeName(
BSTR* name )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nodeName( This->node, name );
+ return IXMLDOMNode_get_nodeName( IXMLDOMNode_from_impl(This->node), name );
}
@@ -622,7 +616,7 @@ static HRESULT WINAPI domdoc_get_nodeValue(
VARIANT* value )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nodeValue( This->node, value );
+ return IXMLDOMNode_get_nodeValue( IXMLDOMNode_from_impl(This->node), value );
}
@@ -631,7 +625,7 @@ static HRESULT WINAPI domdoc_put_nodeValue(
VARIANT value)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_put_nodeValue( This->node, value );
+ return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(This->node), value );
}
@@ -640,7 +634,7 @@ static HRESULT WINAPI domdoc_get_nodeType(
DOMNodeType* type )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nodeType( This->node, type );
+ return IXMLDOMNode_get_nodeType( IXMLDOMNode_from_impl(This->node), type );
}
@@ -649,7 +643,7 @@ static HRESULT WINAPI domdoc_get_parentNode(
IXMLDOMNode** parent )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_parentNode( This->node, parent );
+ return IXMLDOMNode_get_parentNode( IXMLDOMNode_from_impl(This->node), parent );
}
@@ -658,7 +652,7 @@ static HRESULT WINAPI domdoc_get_childNodes(
IXMLDOMNodeList** childList )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_childNodes( This->node, childList );
+ return IXMLDOMNode_get_childNodes( IXMLDOMNode_from_impl(This->node), childList );
}
@@ -667,7 +661,7 @@ static HRESULT WINAPI domdoc_get_firstChild(
IXMLDOMNode** firstChild )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_firstChild( This->node, firstChild );
+ return IXMLDOMNode_get_firstChild( IXMLDOMNode_from_impl(This->node), firstChild );
}
@@ -676,7 +670,7 @@ static HRESULT WINAPI domdoc_get_lastChild(
IXMLDOMNode** lastChild )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_lastChild( This->node, lastChild );
+ return IXMLDOMNode_get_lastChild( IXMLDOMNode_from_impl(This->node), lastChild );
}
@@ -685,7 +679,7 @@ static HRESULT WINAPI domdoc_get_previousSibling(
IXMLDOMNode** previousSibling )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_previousSibling( This->node, previousSibling );
+ return IXMLDOMNode_get_previousSibling( IXMLDOMNode_from_impl(This->node), previousSibling );
}
@@ -694,7 +688,7 @@ static HRESULT WINAPI domdoc_get_nextSibling(
IXMLDOMNode** nextSibling )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nextSibling( This->node, nextSibling );
+ return IXMLDOMNode_get_nextSibling( IXMLDOMNode_from_impl(This->node), nextSibling );
}
@@ -703,7 +697,7 @@ static HRESULT WINAPI domdoc_get_attributes(
IXMLDOMNamedNodeMap** attributeMap )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_attributes( This->node, attributeMap );
+ return IXMLDOMNode_get_attributes( IXMLDOMNode_from_impl(This->node), attributeMap );
}
@@ -714,7 +708,7 @@ static HRESULT WINAPI domdoc_insertBefore(
IXMLDOMNode** outNewChild )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_insertBefore( This->node, newChild, refChild, outNewChild );
+ return IXMLDOMNode_insertBefore( IXMLDOMNode_from_impl(This->node), newChild, refChild, outNewChild );
}
@@ -725,7 +719,7 @@ static HRESULT WINAPI domdoc_replaceChild(
IXMLDOMNode** outOldChild)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_replaceChild( This->node, newChild, oldChild, outOldChild );
+ return IXMLDOMNode_replaceChild( IXMLDOMNode_from_impl(This->node), newChild, oldChild, outOldChild );
}
@@ -735,7 +729,7 @@ static HRESULT WINAPI domdoc_removeChild(
IXMLDOMNode** oldChild)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_removeChild( This->node, childNode, oldChild );
+ return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(This->node), childNode, oldChild );
}
@@ -745,7 +739,7 @@ static HRESULT WINAPI domdoc_appendChild(
IXMLDOMNode** outNewChild)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_appendChild( This->node, newChild, outNewChild );
+ return IXMLDOMNode_appendChild( IXMLDOMNode_from_impl(This->node), newChild, outNewChild );
}
@@ -754,7 +748,7 @@ static HRESULT WINAPI domdoc_hasChildNodes(
VARIANT_BOOL* hasChild)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_hasChildNodes( This->node, hasChild );
+ return IXMLDOMNode_hasChildNodes( IXMLDOMNode_from_impl(This->node), hasChild );
}
@@ -763,7 +757,7 @@ static HRESULT WINAPI domdoc_get_ownerDocument(
IXMLDOMDocument** DOMDocument)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_ownerDocument( This->node, DOMDocument );
+ return IXMLDOMNode_get_ownerDocument( IXMLDOMNode_from_impl(This->node), DOMDocument );
}
@@ -773,7 +767,7 @@ static HRESULT WINAPI domdoc_cloneNode(
IXMLDOMNode** cloneRoot)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_cloneNode( This->node, deep, cloneRoot );
+ return IXMLDOMNode_cloneNode( IXMLDOMNode_from_impl(This->node), deep, cloneRoot );
}
@@ -782,7 +776,7 @@ static HRESULT WINAPI domdoc_get_nodeTypeString(
BSTR* nodeType )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nodeTypeString( This->node, nodeType );
+ return IXMLDOMNode_get_nodeTypeString( IXMLDOMNode_from_impl(This->node), nodeType );
}
@@ -791,7 +785,7 @@ static HRESULT WINAPI domdoc_get_text(
BSTR* text )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_text( This->node, text );
+ return IXMLDOMNode_get_text( IXMLDOMNode_from_impl(This->node), text );
}
@@ -800,7 +794,7 @@ static HRESULT WINAPI domdoc_put_text(
BSTR text )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_put_text( This->node, text );
+ return IXMLDOMNode_put_text( IXMLDOMNode_from_impl(This->node), text );
}
@@ -809,7 +803,7 @@ static HRESULT WINAPI domdoc_get_specified(
VARIANT_BOOL* isSpecified )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_specified( This->node, isSpecified );
+ return IXMLDOMNode_get_specified( IXMLDOMNode_from_impl(This->node), isSpecified );
}
@@ -818,7 +812,7 @@ static HRESULT WINAPI domdoc_get_definition(
IXMLDOMNode** definitionNode )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_definition( This->node, definitionNode );
+ return IXMLDOMNode_get_definition( IXMLDOMNode_from_impl(This->node), definitionNode );
}
@@ -827,7 +821,7 @@ static HRESULT WINAPI domdoc_get_nodeTypedValue(
VARIANT* typedValue )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nodeTypedValue( This->node, typedValue );
+ return IXMLDOMNode_get_nodeTypedValue( IXMLDOMNode_from_impl(This->node), typedValue );
}
static HRESULT WINAPI domdoc_put_nodeTypedValue(
@@ -835,7 +829,7 @@ static HRESULT WINAPI domdoc_put_nodeTypedValue(
VARIANT typedValue )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_put_nodeTypedValue( This->node, typedValue );
+ return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(This->node), typedValue );
}
@@ -844,7 +838,7 @@ static HRESULT WINAPI domdoc_get_dataType(
VARIANT* dataTypeName )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_dataType( This->node, dataTypeName );
+ return IXMLDOMNode_get_dataType( IXMLDOMNode_from_impl(This->node), dataTypeName );
}
@@ -853,7 +847,7 @@ static HRESULT WINAPI domdoc_put_dataType(
BSTR dataTypeName )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_put_dataType( This->node, dataTypeName );
+ return IXMLDOMNode_put_dataType( IXMLDOMNode_from_impl(This->node), dataTypeName );
}
@@ -862,7 +856,7 @@ static HRESULT WINAPI domdoc_get_xml(
BSTR* xmlString )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_xml( This->node, xmlString );
+ return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(This->node), xmlString );
}
@@ -872,7 +866,7 @@ static HRESULT WINAPI domdoc_transformNode(
BSTR* xmlString )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_transformNode( This->node, styleSheet, xmlString );
+ return IXMLDOMNode_transformNode( IXMLDOMNode_from_impl(This->node), styleSheet, xmlString );
}
@@ -882,7 +876,7 @@ static HRESULT WINAPI domdoc_selectNodes(
IXMLDOMNodeList** resultList )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_selectNodes( This->node, queryString, resultList );
+ return IXMLDOMNode_selectNodes( IXMLDOMNode_from_impl(This->node), queryString, resultList );
}
@@ -892,7 +886,7 @@ static HRESULT WINAPI domdoc_selectSingleNode(
IXMLDOMNode** resultNode )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_selectSingleNode( This->node, queryString, resultNode );
+ return IXMLDOMNode_selectSingleNode( IXMLDOMNode_from_impl(This->node), queryString, resultNode );
}
@@ -901,7 +895,7 @@ static HRESULT WINAPI domdoc_get_parsed(
VARIANT_BOOL* isParsed )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_parsed( This->node, isParsed );
+ return IXMLDOMNode_get_parsed( IXMLDOMNode_from_impl(This->node), isParsed );
}
@@ -910,7 +904,7 @@ static HRESULT WINAPI domdoc_get_namespaceURI(
BSTR* namespaceURI )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_namespaceURI( This->node, namespaceURI );
+ return IXMLDOMNode_get_namespaceURI( IXMLDOMNode_from_impl(This->node), namespaceURI );
}
@@ -919,7 +913,7 @@ static HRESULT WINAPI domdoc_get_prefix(
BSTR* prefixString )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_prefix( This->node, prefixString );
+ return IXMLDOMNode_get_prefix( IXMLDOMNode_from_impl(This->node), prefixString );
}
@@ -928,7 +922,7 @@ static HRESULT WINAPI domdoc_get_baseName(
BSTR* nameString )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_baseName( This->node, nameString );
+ return IXMLDOMNode_get_baseName( IXMLDOMNode_from_impl(This->node), nameString );
}
@@ -938,7 +932,7 @@ static HRESULT WINAPI domdoc_transformNodeToObject(
VARIANT outputObject)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_transformNodeToObject( This->node, stylesheet, outputObject );
+ return IXMLDOMNode_transformNodeToObject( IXMLDOMNode_from_impl(This->node), stylesheet, outputObject );
}
@@ -1046,7 +1040,7 @@ static HRESULT WINAPI domdoc_createElement(
xmldoc_add_orphan(xmlnode->doc, xmlnode);
TRACE("created xmlptr %p\n", xmlnode);
- elem_unk = create_element(xmlnode, NULL);
+ elem_unk = create_element(xmlnode);
HeapFree(GetProcessHeap(), 0, xml_name);
hr = IUnknown_QueryInterface(elem_unk, &IID_IXMLDOMElement, (void **)element);
@@ -2198,7 +2192,6 @@ static dispex_static_data_t domdoc_dispex = {
HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **document)
{
domdoc *doc;
- HRESULT hr;
doc = HeapAlloc( GetProcessHeap(), 0, sizeof (*doc) );
if( !doc )
@@ -2222,26 +2215,13 @@ HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **docu
doc->safeopt = 0;
doc->bsc = NULL;
- doc->node_unk = create_basic_node( (xmlNodePtr)xmldoc, (IUnknown*)&doc->lpVtbl );
- if(!doc->node_unk)
+ doc->node = create_basic_node( (xmlNodePtr)xmldoc, (IUnknown*)&doc->lpVtbl, &domdoc_dispex );
+ if(!doc->node)
{
HeapFree(GetProcessHeap(), 0, doc);
return E_FAIL;
}
- hr = IUnknown_QueryInterface(doc->node_unk, &IID_IXMLDOMNode, (LPVOID*)&doc->node);
- if(FAILED(hr))
- {
- IUnknown_Release(doc->node_unk);
- HeapFree( GetProcessHeap(), 0, doc );
- return E_FAIL;
- }
-
- init_dispex(&doc->dispex, (IUnknown*)&doc->lpVtbl, &domdoc_dispex);
-
- /* The ref on doc->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(doc->node);
-
*document = (IXMLDOMDocument2*)&doc->lpVtbl;
TRACE("returning iface %p\n", *document);
diff --git a/reactos/dll/win32/msxml3/element.c b/reactos/dll/win32/msxml3/element.c
index 4f0bce93acc..6590e5baed5 100644
--- a/reactos/dll/win32/msxml3/element.c
+++ b/reactos/dll/win32/msxml3/element.c
@@ -41,11 +41,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
typedef struct _domelem
{
const struct IXMLDOMElementVtbl *lpVtbl;
- const struct IUnknownVtbl *lpInternalUnkVtbl;
- IUnknown *pUnkOuter;
LONG ref;
- IUnknown *node_unk;
- IXMLDOMNode *node;
+ xmlnode *node;
} domelem;
static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface )
@@ -53,14 +50,9 @@ static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface )
return (domelem *)((char*)iface - FIELD_OFFSET(domelem, lpVtbl));
}
-static inline domelem *impl_from_InternalUnknown( IUnknown *iface )
-{
- return (domelem *)((char*)iface - FIELD_OFFSET(domelem, lpInternalUnkVtbl));
-}
-
static inline xmlNodePtr get_element( domelem *This )
{
- return xmlNodePtr_from_domnode( This->node, XML_ELEMENT_NODE );
+ return This->node->node;
}
static HRESULT WINAPI domelem_QueryInterface(
@@ -69,23 +61,54 @@ static HRESULT WINAPI domelem_QueryInterface(
void** ppvObject )
{
domelem *This = impl_from_IXMLDOMElement( iface );
+
TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
- return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject);
+ if ( IsEqualGUID( riid, &IID_IXMLDOMElement ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ) )
+ {
+ *ppvObject = &This->lpVtbl;
+ }
+ else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
+ {
+ *ppvObject = IXMLDOMNode_from_impl(This->node);
+ }
+ else
+ {
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef( (IUnknown*)*ppvObject );
+ return S_OK;
}
static ULONG WINAPI domelem_AddRef(
IXMLDOMElement *iface )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IUnknown_AddRef(This->pUnkOuter);
+ LONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) ref=%d\n", This, ref);
+
+ return ref;
}
static ULONG WINAPI domelem_Release(
IXMLDOMElement *iface )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IUnknown_Release(This->pUnkOuter);
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) ref=%d\n", This, ref);
+
+ if(!ref) {
+ IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
+ heap_free(This);
+ }
+
+ return ref;
}
static HRESULT WINAPI domelem_GetTypeInfoCount(
@@ -170,7 +193,7 @@ static HRESULT WINAPI domelem_get_nodeName(
BSTR* p )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nodeName( This->node, p );
+ return IXMLDOMNode_get_nodeName( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_nodeValue(
@@ -178,7 +201,7 @@ static HRESULT WINAPI domelem_get_nodeValue(
VARIANT* var1 )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nodeValue( This->node, var1 );
+ return IXMLDOMNode_get_nodeValue( IXMLDOMNode_from_impl(This->node), var1 );
}
static HRESULT WINAPI domelem_put_nodeValue(
@@ -186,7 +209,7 @@ static HRESULT WINAPI domelem_put_nodeValue(
VARIANT var1 )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_put_nodeValue( This->node, var1 );
+ return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(This->node), var1 );
}
static HRESULT WINAPI domelem_get_nodeType(
@@ -194,7 +217,7 @@ static HRESULT WINAPI domelem_get_nodeType(
DOMNodeType* domNodeType )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nodeType( This->node, domNodeType );
+ return IXMLDOMNode_get_nodeType( IXMLDOMNode_from_impl(This->node), domNodeType );
}
static HRESULT WINAPI domelem_get_parentNode(
@@ -202,7 +225,7 @@ static HRESULT WINAPI domelem_get_parentNode(
IXMLDOMNode** parent )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_parentNode( This->node, parent );
+ return IXMLDOMNode_get_parentNode( IXMLDOMNode_from_impl(This->node), parent );
}
static HRESULT WINAPI domelem_get_childNodes(
@@ -210,7 +233,7 @@ static HRESULT WINAPI domelem_get_childNodes(
IXMLDOMNodeList** outList)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_childNodes( This->node, outList );
+ return IXMLDOMNode_get_childNodes( IXMLDOMNode_from_impl(This->node), outList );
}
static HRESULT WINAPI domelem_get_firstChild(
@@ -218,7 +241,7 @@ static HRESULT WINAPI domelem_get_firstChild(
IXMLDOMNode** domNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_firstChild( This->node, domNode );
+ return IXMLDOMNode_get_firstChild( IXMLDOMNode_from_impl(This->node), domNode );
}
static HRESULT WINAPI domelem_get_lastChild(
@@ -226,7 +249,7 @@ static HRESULT WINAPI domelem_get_lastChild(
IXMLDOMNode** domNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_lastChild( This->node, domNode );
+ return IXMLDOMNode_get_lastChild( IXMLDOMNode_from_impl(This->node), domNode );
}
static HRESULT WINAPI domelem_get_previousSibling(
@@ -234,7 +257,7 @@ static HRESULT WINAPI domelem_get_previousSibling(
IXMLDOMNode** domNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_previousSibling( This->node, domNode );
+ return IXMLDOMNode_get_previousSibling( IXMLDOMNode_from_impl(This->node), domNode );
}
static HRESULT WINAPI domelem_get_nextSibling(
@@ -242,7 +265,7 @@ static HRESULT WINAPI domelem_get_nextSibling(
IXMLDOMNode** domNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nextSibling( This->node, domNode );
+ return IXMLDOMNode_get_nextSibling( IXMLDOMNode_from_impl(This->node), domNode );
}
static HRESULT WINAPI domelem_get_attributes(
@@ -250,7 +273,7 @@ static HRESULT WINAPI domelem_get_attributes(
IXMLDOMNamedNodeMap** attributeMap)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_attributes( This->node, attributeMap );
+ return IXMLDOMNode_get_attributes( IXMLDOMNode_from_impl(This->node), attributeMap );
}
static HRESULT WINAPI domelem_insertBefore(
@@ -259,7 +282,7 @@ static HRESULT WINAPI domelem_insertBefore(
IXMLDOMNode** outOldNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode );
+ return IXMLDOMNode_insertBefore( IXMLDOMNode_from_impl(This->node), newNode, var1, outOldNode );
}
static HRESULT WINAPI domelem_replaceChild(
@@ -269,7 +292,7 @@ static HRESULT WINAPI domelem_replaceChild(
IXMLDOMNode** outOldNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode );
+ return IXMLDOMNode_replaceChild( IXMLDOMNode_from_impl(This->node), newNode, oldNode, outOldNode );
}
static HRESULT WINAPI domelem_removeChild(
@@ -277,7 +300,7 @@ static HRESULT WINAPI domelem_removeChild(
IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_removeChild( This->node, domNode, oldNode );
+ return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(This->node), domNode, oldNode );
}
static HRESULT WINAPI domelem_appendChild(
@@ -285,7 +308,7 @@ static HRESULT WINAPI domelem_appendChild(
IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_appendChild( This->node, newNode, outNewNode );
+ return IXMLDOMNode_appendChild( IXMLDOMNode_from_impl(This->node), newNode, outNewNode );
}
static HRESULT WINAPI domelem_hasChildNodes(
@@ -293,7 +316,7 @@ static HRESULT WINAPI domelem_hasChildNodes(
VARIANT_BOOL* pbool)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_hasChildNodes( This->node, pbool );
+ return IXMLDOMNode_hasChildNodes( IXMLDOMNode_from_impl(This->node), pbool );
}
static HRESULT WINAPI domelem_get_ownerDocument(
@@ -301,7 +324,7 @@ static HRESULT WINAPI domelem_get_ownerDocument(
IXMLDOMDocument** domDocument)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_ownerDocument( This->node, domDocument );
+ return IXMLDOMNode_get_ownerDocument( IXMLDOMNode_from_impl(This->node), domDocument );
}
static HRESULT WINAPI domelem_cloneNode(
@@ -309,7 +332,7 @@ static HRESULT WINAPI domelem_cloneNode(
VARIANT_BOOL pbool, IXMLDOMNode** outNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_cloneNode( This->node, pbool, outNode );
+ return IXMLDOMNode_cloneNode( IXMLDOMNode_from_impl(This->node), pbool, outNode );
}
static HRESULT WINAPI domelem_get_nodeTypeString(
@@ -317,7 +340,7 @@ static HRESULT WINAPI domelem_get_nodeTypeString(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nodeTypeString( This->node, p );
+ return IXMLDOMNode_get_nodeTypeString( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_text(
@@ -325,7 +348,7 @@ static HRESULT WINAPI domelem_get_text(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_text( This->node, p );
+ return IXMLDOMNode_get_text( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_put_text(
@@ -333,7 +356,7 @@ static HRESULT WINAPI domelem_put_text(
BSTR p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_put_text( This->node, p );
+ return IXMLDOMNode_put_text( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_specified(
@@ -341,7 +364,7 @@ static HRESULT WINAPI domelem_get_specified(
VARIANT_BOOL* pbool)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_specified( This->node, pbool );
+ return IXMLDOMNode_get_specified( IXMLDOMNode_from_impl(This->node), pbool );
}
static HRESULT WINAPI domelem_get_definition(
@@ -349,7 +372,7 @@ static HRESULT WINAPI domelem_get_definition(
IXMLDOMNode** domNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_definition( This->node, domNode );
+ return IXMLDOMNode_get_definition( IXMLDOMNode_from_impl(This->node), domNode );
}
static HRESULT WINAPI domelem_get_nodeTypedValue(
@@ -357,7 +380,7 @@ static HRESULT WINAPI domelem_get_nodeTypedValue(
VARIANT* var1)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nodeTypedValue( This->node, var1 );
+ return IXMLDOMNode_get_nodeTypedValue( IXMLDOMNode_from_impl(This->node), var1 );
}
static HRESULT WINAPI domelem_put_nodeTypedValue(
@@ -365,7 +388,7 @@ static HRESULT WINAPI domelem_put_nodeTypedValue(
VARIANT var1)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_put_nodeTypedValue( This->node, var1 );
+ return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(This->node), var1 );
}
static HRESULT WINAPI domelem_get_dataType(
@@ -373,7 +396,7 @@ static HRESULT WINAPI domelem_get_dataType(
VARIANT* var1)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_dataType( This->node, var1 );
+ return IXMLDOMNode_get_dataType( IXMLDOMNode_from_impl(This->node), var1 );
}
static HRESULT WINAPI domelem_put_dataType(
@@ -381,7 +404,7 @@ static HRESULT WINAPI domelem_put_dataType(
BSTR p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_put_dataType( This->node, p );
+ return IXMLDOMNode_put_dataType( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_xml(
@@ -389,7 +412,7 @@ static HRESULT WINAPI domelem_get_xml(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_xml( This->node, p );
+ return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_transformNode(
@@ -397,7 +420,7 @@ static HRESULT WINAPI domelem_transformNode(
IXMLDOMNode* domNode, BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_transformNode( This->node, domNode, p );
+ return IXMLDOMNode_transformNode( IXMLDOMNode_from_impl(This->node), domNode, p );
}
static HRESULT WINAPI domelem_selectNodes(
@@ -405,7 +428,7 @@ static HRESULT WINAPI domelem_selectNodes(
BSTR p, IXMLDOMNodeList** outList)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_selectNodes( This->node, p, outList );
+ return IXMLDOMNode_selectNodes( IXMLDOMNode_from_impl(This->node), p, outList );
}
static HRESULT WINAPI domelem_selectSingleNode(
@@ -413,7 +436,7 @@ static HRESULT WINAPI domelem_selectSingleNode(
BSTR p, IXMLDOMNode** outNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_selectSingleNode( This->node, p, outNode );
+ return IXMLDOMNode_selectSingleNode( IXMLDOMNode_from_impl(This->node), p, outNode );
}
static HRESULT WINAPI domelem_get_parsed(
@@ -421,7 +444,7 @@ static HRESULT WINAPI domelem_get_parsed(
VARIANT_BOOL* pbool)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_parsed( This->node, pbool );
+ return IXMLDOMNode_get_parsed( IXMLDOMNode_from_impl(This->node), pbool );
}
static HRESULT WINAPI domelem_get_namespaceURI(
@@ -429,7 +452,7 @@ static HRESULT WINAPI domelem_get_namespaceURI(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_namespaceURI( This->node, p );
+ return IXMLDOMNode_get_namespaceURI( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_prefix(
@@ -437,7 +460,7 @@ static HRESULT WINAPI domelem_get_prefix(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_prefix( This->node, p );
+ return IXMLDOMNode_get_prefix( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_baseName(
@@ -445,7 +468,7 @@ static HRESULT WINAPI domelem_get_baseName(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_baseName( This->node, p );
+ return IXMLDOMNode_get_baseName( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_transformNodeToObject(
@@ -453,7 +476,7 @@ static HRESULT WINAPI domelem_transformNodeToObject(
IXMLDOMNode* domNode, VARIANT var1)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 );
+ return IXMLDOMNode_transformNodeToObject( IXMLDOMNode_from_impl(This->node), domNode, var1 );
}
static HRESULT WINAPI domelem_get_tagName(
@@ -728,69 +751,9 @@ static const struct IXMLDOMElementVtbl domelem_vtbl =
domelem_normalize,
};
-static HRESULT WINAPI Internal_QueryInterface(
- IUnknown *iface,
- REFIID riid,
- void** ppvObject )
-{
- domelem *This = impl_from_InternalUnknown( iface );
- TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
-
- if ( IsEqualGUID( riid, &IID_IXMLDOMElement ) ||
- IsEqualGUID( riid, &IID_IDispatch ) ||
- IsEqualGUID( riid, &IID_IUnknown ) )
- {
- *ppvObject = &This->lpVtbl;
- }
- else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
- {
- return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
- }
- else
- {
- FIXME("interface %s not implemented\n", debugstr_guid(riid));
- return E_NOINTERFACE;
- }
-
- IUnknown_AddRef( (IUnknown*)*ppvObject );
-
- return S_OK;
-}
-
-static ULONG WINAPI Internal_AddRef(
- IUnknown *iface )
-{
- domelem *This = impl_from_InternalUnknown( iface );
- return InterlockedIncrement( &This->ref );
-}
-
-static ULONG WINAPI Internal_Release(
- IUnknown *iface )
-{
- domelem *This = impl_from_InternalUnknown( iface );
- ULONG ref;
-
- ref = InterlockedDecrement( &This->ref );
- if ( ref == 0 )
- {
- IUnknown_Release( This->node_unk );
- HeapFree( GetProcessHeap(), 0, This );
- }
-
- return ref;
-}
-
-static const struct IUnknownVtbl internal_unk_vtbl =
-{
- Internal_QueryInterface,
- Internal_AddRef,
- Internal_Release
-};
-
-IUnknown* create_element( xmlNodePtr element, IUnknown *pUnkOuter )
+IUnknown* create_element( xmlNodePtr element )
{
domelem *This;
- HRESULT hr;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
@@ -798,31 +761,15 @@ IUnknown* create_element( xmlNodePtr element, IUnknown *pUnkOuter )
This->lpVtbl = &domelem_vtbl;
This->ref = 1;
- This->lpInternalUnkVtbl = &internal_unk_vtbl;
- if(pUnkOuter)
- This->pUnkOuter = pUnkOuter; /* Don't take a ref on outer Unknown */
- else
- This->pUnkOuter = (IUnknown *)&This->lpInternalUnkVtbl;
-
- This->node_unk = create_basic_node( element, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ This->node = create_basic_node( element, (IUnknown*)&This->lpVtbl, NULL );
+ if(!This->node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
-
- return (IUnknown*) &This->lpInternalUnkVtbl;
+ return (IUnknown*) &This->lpVtbl;
}
#endif
diff --git a/reactos/dll/win32/msxml3/entityref.c b/reactos/dll/win32/msxml3/entityref.c
index a72b11022e7..102bf44533b 100644
--- a/reactos/dll/win32/msxml3/entityref.c
+++ b/reactos/dll/win32/msxml3/entityref.c
@@ -519,7 +519,7 @@ static const struct IXMLDOMEntityReferenceVtbl entityref_vtbl =
IUnknown* create_doc_entity_ref( xmlNodePtr entity )
{
entityref *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
@@ -528,22 +528,15 @@ IUnknown* create_doc_entity_ref( xmlNodePtr entity )
This->lpVtbl = &entityref_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( entity, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( entity, (IUnknown*)&This->lpVtbl, NULL );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
diff --git a/reactos/dll/win32/msxml3/main.c b/reactos/dll/win32/msxml3/main.c
index 358a5cb3af1..c31a53a8873 100644
--- a/reactos/dll/win32/msxml3/main.c
+++ b/reactos/dll/win32/msxml3/main.c
@@ -32,6 +32,7 @@
#include "msxml.h"
#include "msxml2.h"
+#include "wine/unicode.h"
#include "wine/debug.h"
#include "wine/library.h"
@@ -39,6 +40,68 @@
WINE_DEFAULT_DEBUG_CHANNEL(msxml);
+#ifdef HAVE_LIBXML2
+
+/* Support for loading xml files from a Wine Windows drive */
+static int wineXmlMatchCallback (char const * filename)
+{
+ int nRet = 0;
+
+ TRACE("%s\n", filename);
+
+ /*
+ * We will deal with loading XML files from the file system
+ * We only care about files that linux cannot find.
+ * e.g. C:,D: etc
+ */
+ if(isalpha(filename[0]) && filename[1] == ':')
+ nRet = 1;
+
+ return nRet;
+}
+
+static void *wineXmlOpenCallback (char const * filename)
+{
+ BSTR sFilename = bstr_from_xmlChar( (xmlChar*)filename);
+ HANDLE hFile;
+
+ TRACE("%s\n", debugstr_w(sFilename));
+
+ hFile = CreateFileW(sFilename, GENERIC_READ,FILE_SHARE_READ, NULL,
+ OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
+ if(hFile == INVALID_HANDLE_VALUE) hFile = 0;
+ SysFreeString(sFilename);
+ return hFile;
+}
+
+static int wineXmlReadCallback(void * context, char * buffer, int len)
+{
+ DWORD dwBytesRead;
+
+ TRACE("%p %s %d\n", context, buffer, len);
+
+ if ((context == NULL) || (buffer == NULL))
+ return(-1);
+
+ if(!ReadFile( context, buffer,len, &dwBytesRead, NULL))
+ {
+ ERR("Failed to read file\n");
+ return -1;
+ }
+
+ TRACE("Read %d\n", dwBytesRead);
+
+ return dwBytesRead;
+}
+
+static int wineXmlFileCloseCallback (void * context)
+{
+ return CloseHandle(context) ? 0 : -1;
+}
+
+#endif
+
+
HRESULT WINAPI DllCanUnloadNow(void)
{
FIXME("\n");
@@ -96,6 +159,12 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
for this thread and as default for new threads */
xmlTreeIndentString = "\t";
xmlThrDefTreeIndentString("\t");
+
+ /* Register callbacks for loading XML files */
+ if(xmlRegisterInputCallbacks(wineXmlMatchCallback, wineXmlOpenCallback,
+ wineXmlReadCallback, wineXmlFileCloseCallback) == -1)
+ WARN("Failed to register callbacks\n");
+
#endif
init_libxslt();
DisableThreadLibraryCalls(hInstDLL);
@@ -110,6 +179,10 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
}
#endif
#ifdef HAVE_LIBXML2
+ /* Restore default Callbacks */
+ xmlCleanupInputCallbacks();
+ xmlRegisterDefaultInputCallbacks();
+
xmlCleanupParser();
#endif
release_typelib();
diff --git a/reactos/dll/win32/msxml3/msxml3.rbuild b/reactos/dll/win32/msxml3/msxml3.rbuild
index 09bc90783bb..005568d25ef 100644
--- a/reactos/dll/win32/msxml3/msxml3.rbuild
+++ b/reactos/dll/win32/msxml3/msxml3.rbuild
@@ -7,8 +7,10 @@
.
msxml3_v1
+
0x601
+ /FIwine/typeof.h
libxml2
libxslt
wine
diff --git a/reactos/dll/win32/msxml3/msxml_private.h b/reactos/dll/win32/msxml3/msxml_private.h
index 917543de706..57dec0f4719 100644
--- a/reactos/dll/win32/msxml3/msxml_private.h
+++ b/reactos/dll/win32/msxml3/msxml_private.h
@@ -29,98 +29,6 @@
# error You must include config.h to use this header
#endif
-#ifdef HAVE_LIBXML2
-
-#ifdef HAVE_LIBXML_PARSER_H
-#include
-#endif
-
-/* constructors */
-extern IUnknown *create_domdoc( xmlNodePtr document );
-extern IUnknown *create_xmldoc( void );
-extern IXMLDOMNode *create_node( xmlNodePtr node );
-extern IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter );
-extern IUnknown *create_element( xmlNodePtr element, IUnknown *pUnkOuter );
-extern IUnknown *create_attribute( xmlNodePtr attribute );
-extern IUnknown *create_text( xmlNodePtr text );
-extern IUnknown *create_pi( xmlNodePtr pi );
-extern IUnknown *create_comment( xmlNodePtr comment );
-extern IUnknown *create_cdata( xmlNodePtr text );
-extern IXMLDOMNodeList *create_children_nodelist( xmlNodePtr );
-extern IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node );
-extern IUnknown *create_doc_Implementation();
-extern IUnknown *create_doc_fragment( xmlNodePtr fragment );
-extern IUnknown *create_doc_entity_ref( xmlNodePtr entity );
-
-extern HRESULT queryresult_create( xmlNodePtr, LPWSTR, IXMLDOMNodeList ** );
-
-/* data accessors */
-xmlNodePtr xmlNodePtr_from_domnode( IXMLDOMNode *iface, xmlElementType type );
-
-/* helpers */
-extern xmlChar *xmlChar_from_wchar( LPWSTR str );
-extern BSTR bstr_from_xmlChar( const xmlChar *buf );
-
-extern LONG xmldoc_add_ref( xmlDocPtr doc );
-extern LONG xmldoc_release( xmlDocPtr doc );
-extern HRESULT xmldoc_add_orphan( xmlDocPtr doc, xmlNodePtr node );
-extern HRESULT xmldoc_remove_orphan( xmlDocPtr doc, xmlNodePtr node );
-
-extern HRESULT XMLElement_create( IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj );
-
-extern xmlDocPtr parse_xml(char *ptr, int len);
-
-/* IXMLDOMNode Internal Structure */
-typedef struct _xmlnode
-{
- const struct IXMLDOMNodeVtbl *lpVtbl;
- const struct IUnknownVtbl *lpInternalUnkVtbl;
- IUnknown *pUnkOuter;
- LONG ref;
- xmlNodePtr node;
-} xmlnode;
-
-static inline xmlnode *impl_from_IXMLDOMNode( IXMLDOMNode *iface )
-{
- return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
-}
-
-extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **document);
-
-#endif
-
-void* libxslt_handle;
-#ifdef SONAME_LIBXSLT
-# ifdef HAVE_LIBXSLT_PATTERN_H
-# include
-# endif
-# ifdef HAVE_LIBXSLT_TRANSFORM_H
-# include
-# endif
-# include
-# include
-
-# define MAKE_FUNCPTR(f) extern typeof(f) * p##f
-MAKE_FUNCPTR(xsltApplyStylesheet);
-MAKE_FUNCPTR(xsltCleanupGlobals);
-MAKE_FUNCPTR(xsltFreeStylesheet);
-MAKE_FUNCPTR(xsltParseStylesheetDoc);
-# undef MAKE_FUNCPTR
-#endif
-
-extern IXMLDOMParseError *create_parseError( LONG code, BSTR url, BSTR reason, BSTR srcText,
- LONG line, LONG linepos, LONG filepos );
-extern HRESULT DOMDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj );
-extern HRESULT SchemaCache_create( IUnknown *pUnkOuter, LPVOID *ppObj );
-extern HRESULT XMLDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj );
-extern HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj );
-extern HRESULT XMLHTTPRequest_create(IUnknown *pUnkOuter, LPVOID *ppObj);
-
-typedef struct bsc_t bsc_t;
-
-HRESULT bind_url(LPCWSTR, HRESULT (*onDataAvailable)(void*,char*,DWORD), void*, bsc_t**);
-void detach_bsc(bsc_t*);
-
/* typelibs */
typedef enum tid_t {
IXMLDOMAttribute_tid,
@@ -138,6 +46,7 @@ typedef enum tid_t {
IXMLDOMParseError_tid,
IXMLDOMProcessingInstruction_tid,
IXMLDOMSchemaCollection_tid,
+ IXMLDOMSelection_tid,
IXMLDOMText_tid,
IXMLElement_tid,
IXMLDocument_tid,
@@ -191,6 +100,118 @@ typedef struct {
void init_dispex(DispatchEx*,IUnknown*,dispex_static_data_t*);
BOOL dispex_query_interface(DispatchEx*,REFIID,void**);
+#ifdef HAVE_LIBXML2
+
+#ifdef HAVE_LIBXML_PARSER_H
+#include
+#endif
+
+/* constructors */
+extern IUnknown *create_domdoc( xmlNodePtr document );
+extern IUnknown *create_xmldoc( void );
+extern IXMLDOMNode *create_node( xmlNodePtr node );
+extern IUnknown *create_element( xmlNodePtr element );
+extern IUnknown *create_attribute( xmlNodePtr attribute );
+extern IUnknown *create_text( xmlNodePtr text );
+extern IUnknown *create_pi( xmlNodePtr pi );
+extern IUnknown *create_comment( xmlNodePtr comment );
+extern IUnknown *create_cdata( xmlNodePtr text );
+extern IXMLDOMNodeList *create_children_nodelist( xmlNodePtr );
+extern IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node );
+extern IUnknown *create_doc_Implementation();
+extern IUnknown *create_doc_fragment( xmlNodePtr fragment );
+extern IUnknown *create_doc_entity_ref( xmlNodePtr entity );
+
+extern HRESULT queryresult_create( xmlNodePtr, LPWSTR, IXMLDOMNodeList ** );
+
+/* data accessors */
+xmlNodePtr xmlNodePtr_from_domnode( IXMLDOMNode *iface, xmlElementType type );
+
+/* helpers */
+extern xmlChar *xmlChar_from_wchar( LPWSTR str );
+
+extern LONG xmldoc_add_ref( xmlDocPtr doc );
+extern LONG xmldoc_release( xmlDocPtr doc );
+extern HRESULT xmldoc_add_orphan( xmlDocPtr doc, xmlNodePtr node );
+extern HRESULT xmldoc_remove_orphan( xmlDocPtr doc, xmlNodePtr node );
+
+extern HRESULT XMLElement_create( IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj );
+
+extern xmlDocPtr parse_xml(char *ptr, int len);
+
+/* IXMLDOMNode Internal Structure */
+typedef struct _xmlnode
+{
+ DispatchEx dispex;
+ const struct IXMLDOMNodeVtbl *lpVtbl;
+ const struct IUnknownVtbl *lpInternalUnkVtbl;
+ IUnknown *pUnkOuter;
+ LONG ref;
+ xmlNodePtr node;
+} xmlnode;
+
+static inline xmlnode *impl_from_IXMLDOMNode( IXMLDOMNode *iface )
+{
+ return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
+}
+
+static inline IXMLDOMNode *IXMLDOMNode_from_impl(xmlnode *This)
+{
+ return (IXMLDOMNode*)&This->lpVtbl;
+}
+
+extern xmlnode *create_basic_node(xmlNodePtr,IUnknown*,dispex_static_data_t*);
+
+extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **document);
+
+static inline BSTR bstr_from_xmlChar(const xmlChar *str)
+{
+ BSTR ret = NULL;
+
+ if(str) {
+ DWORD len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)str, -1, NULL, 0);
+ ret = SysAllocStringLen(NULL, len-1);
+ if(ret)
+ MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)str, -1, ret, len);
+ }
+
+ return ret;
+}
+
+#endif
+
+void* libxslt_handle;
+#ifdef SONAME_LIBXSLT
+# ifdef HAVE_LIBXSLT_PATTERN_H
+# include
+# endif
+# ifdef HAVE_LIBXSLT_TRANSFORM_H
+# include
+# endif
+# include
+# include
+
+# define MAKE_FUNCPTR(f) extern typeof(f) * p##f
+MAKE_FUNCPTR(xsltApplyStylesheet);
+MAKE_FUNCPTR(xsltCleanupGlobals);
+MAKE_FUNCPTR(xsltFreeStylesheet);
+MAKE_FUNCPTR(xsltParseStylesheetDoc);
+# undef MAKE_FUNCPTR
+#endif
+
+extern IXMLDOMParseError *create_parseError( LONG code, BSTR url, BSTR reason, BSTR srcText,
+ LONG line, LONG linepos, LONG filepos );
+extern HRESULT DOMDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj );
+extern HRESULT SchemaCache_create( IUnknown *pUnkOuter, LPVOID *ppObj );
+extern HRESULT XMLDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj );
+extern HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj );
+extern HRESULT XMLHTTPRequest_create(IUnknown *pUnkOuter, LPVOID *ppObj);
+
+typedef struct bsc_t bsc_t;
+
+HRESULT bind_url(LPCWSTR, HRESULT (*onDataAvailable)(void*,char*,DWORD), void*, bsc_t**);
+void detach_bsc(bsc_t*);
+
/* memory allocation functions */
static inline void *heap_alloc(size_t len)
diff --git a/reactos/dll/win32/msxml3/node.c b/reactos/dll/win32/msxml3/node.c
index 19fa4c592ce..987b07d2d09 100644
--- a/reactos/dll/win32/msxml3/node.c
+++ b/reactos/dll/win32/msxml3/node.c
@@ -247,25 +247,6 @@ static HRESULT WINAPI xmlnode_get_nodeName(
return S_OK;
}
-BSTR bstr_from_xmlChar( const xmlChar *buf )
-{
- DWORD len;
- LPWSTR str;
- BSTR bstr;
-
- if ( !buf )
- return NULL;
-
- len = MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) buf, -1, NULL, 0 );
- str = HeapAlloc( GetProcessHeap(), 0, len * sizeof (WCHAR) );
- if ( !str )
- return NULL;
- MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) buf, -1, str, len );
- bstr = SysAllocString( str );
- HeapFree( GetProcessHeap(), 0, str );
- return bstr;
-}
-
static HRESULT WINAPI xmlnode_get_nodeValue(
IXMLDOMNode *iface,
VARIANT* value)
@@ -1561,7 +1542,7 @@ static const struct IUnknownVtbl internal_unk_vtbl =
Internal_Release
};
-IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter )
+xmlnode *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter, dispex_static_data_t *dispex_data )
{
xmlnode *This;
@@ -1580,10 +1561,13 @@ IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter )
else
This->pUnkOuter = (IUnknown *)&This->lpInternalUnkVtbl;
+ if(dispex_data)
+ init_dispex(&This->dispex, This->pUnkOuter, dispex_data);
+
This->ref = 1;
This->node = node;
- return (IUnknown*)&This->lpInternalUnkVtbl;
+ return This;
}
IXMLDOMNode *create_node( xmlNodePtr node )
@@ -1599,7 +1583,7 @@ IXMLDOMNode *create_node( xmlNodePtr node )
switch(node->type)
{
case XML_ELEMENT_NODE:
- pUnk = create_element( node, NULL );
+ pUnk = create_element( node );
break;
case XML_ATTRIBUTE_NODE:
pUnk = create_attribute( node );
@@ -1618,7 +1602,7 @@ IXMLDOMNode *create_node( xmlNodePtr node )
break;
default:
FIXME("only creating basic node for type %d\n", node->type);
- pUnk = create_basic_node( node, NULL );
+ pUnk = (IUnknown*)&create_basic_node( node, NULL, NULL )->lpInternalUnkVtbl;
}
hr = IUnknown_QueryInterface(pUnk, &IID_IXMLDOMNode, (LPVOID*)&ret);
diff --git a/reactos/dll/win32/msxml3/pi.c b/reactos/dll/win32/msxml3/pi.c
index a38f355ce04..ddcf68b9415 100644
--- a/reactos/dll/win32/msxml3/pi.c
+++ b/reactos/dll/win32/msxml3/pi.c
@@ -605,7 +605,7 @@ static const struct IXMLDOMProcessingInstructionVtbl dom_pi_vtbl =
IUnknown* create_pi( xmlNodePtr pi )
{
dom_pi *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
@@ -614,22 +614,15 @@ IUnknown* create_pi( xmlNodePtr pi )
This->lpVtbl = &dom_pi_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( pi, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( pi, (IUnknown*)&This->lpVtbl, NULL );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
diff --git a/reactos/dll/win32/msxml3/queryresult.c b/reactos/dll/win32/msxml3/queryresult.c
index 1cdd9f66f47..50e8b79a83f 100644
--- a/reactos/dll/win32/msxml3/queryresult.c
+++ b/reactos/dll/win32/msxml3/queryresult.c
@@ -366,7 +366,7 @@ static const tid_t queryresult_iface_tids[] = {
};
static dispex_static_data_t queryresult_dispex = {
&queryresult_dispex_vtbl,
- IXMLDOMNodeList_tid,
+ IXMLDOMSelection_tid,
NULL,
queryresult_iface_tids
};
diff --git a/reactos/dll/win32/msxml3/regsvr.c b/reactos/dll/win32/msxml3/regsvr.c
index 9ca8afe3c64..c8ae753c47d 100644
--- a/reactos/dll/win32/msxml3/regsvr.c
+++ b/reactos/dll/win32/msxml3/regsvr.c
@@ -572,6 +572,22 @@ static struct regsvr_coclass const coclass_list[] = {
"Msxml2.SAXXMLReader",
"3.0"
},
+ { &CLSID_MXXMLWriter,
+ "IMXWriter interface",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Msxml2.MXXMLWriter",
+ "3.0"
+ },
+ { &CLSID_MXXMLWriter30,
+ "IMXWriter interface 3.0",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Msxml2.MXXMLWriter",
+ "3.0"
+ },
{ NULL } /* list terminator */
};
@@ -671,6 +687,16 @@ static struct progid const progid_list[] = {
&CLSID_SAXXMLReader30,
NULL
},
+ { "Msxml2.MXXMLWriter",
+ "MXXMLWriter",
+ &CLSID_MXXMLWriter,
+ "Msxml2.MXXMLWriter.3.0"
+ },
+ { "Msxml2.MXXMLWriter.3.0",
+ "MXXMLWriter 3.0",
+ &CLSID_MXXMLWriter30,
+ NULL
+ },
{ NULL } /* list terminator */
};
diff --git a/reactos/dll/win32/msxml3/text.c b/reactos/dll/win32/msxml3/text.c
index 0e231994d69..cb1966c03ad 100644
--- a/reactos/dll/win32/msxml3/text.c
+++ b/reactos/dll/win32/msxml3/text.c
@@ -772,7 +772,7 @@ static const struct IXMLDOMTextVtbl domtext_vtbl =
IUnknown* create_text( xmlNodePtr text )
{
domtext *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
@@ -781,22 +781,15 @@ IUnknown* create_text( xmlNodePtr text )
This->lpVtbl = &domtext_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( text, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( text, (IUnknown*)&This->lpVtbl, NULL );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
diff --git a/reactos/dll/win32/netshell/lang/cs-CZ.rc b/reactos/dll/win32/netshell/lang/cs-CZ.rc
index 3a1dcc91f61..db5e3ea00b6 100644
--- a/reactos/dll/win32/netshell/lang/cs-CZ.rc
+++ b/reactos/dll/win32/netshell/lang/cs-CZ.rc
@@ -10,7 +10,6 @@ BEGIN
EDITTEXT IDC_NETCARDNAME, 9, 21, 230, 12, WS_BORDER | WS_TABSTOP | ES_READONLY
PUSHBUTTON "&Nastavit", IDC_CONFIGURE, 189, 38, 50, 14
LTEXT "Vybran komponenty jsou pouvny tmto pipojenm:", -1, 9, 59, 217, 8
- LISTBOX IDC_COMPONENTSLIST, 9, 71, 230, 55, LBS_NOTIFY | WS_VSCROLL | WS_BORDER | LBS_NOINTEGRALHEIGHT
PUSHBUTTON "&Instalovat", IDC_INSTALL, 9, 130, 65, 14, WS_DISABLED | WS_TABSTOP
PUSHBUTTON "&Odstranit", IDC_UNINSTALL, 90, 130, 65, 14, WS_DISABLED | WS_TABSTOP
PUSHBUTTON "&Vlastnosti", IDC_PROPERTIES, 174, 130, 65, 14
@@ -43,7 +42,7 @@ BEGIN
LTEXT "Byt:", -1, 17, 115, 32, 8
RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8
RTEXT "000.000.000", IDC_RECEIVED, 139, 115, 44, 8
- PUSHBUTTON "&Vlastnosti", IDC_PROPERTIES, 10, 150, 50, 14
+ PUSHBUTTON "&Vlastnosti", IDC_STATUS_PROPERTIES, 10, 150, 50, 14
PUSHBUTTON "&Zakzat", IDC_ENDISABLE, 66, 150, 50, 14
RTEXT "",IDC_STATUS,83,20,98,8
RTEXT "",IDC_DURATION,83,34,98,8
@@ -113,6 +112,7 @@ BEGIN
IDS_NET_REPAIR "Repair"
IDS_NET_CREATELINK "Create Shortcut"
IDS_NET_DELETE "Delete"
+ IDS_NET_RENAME "Rename"
IDS_NET_PROPERTIES "Properties"
IDS_FORMAT_BIT "%u Bit/s"
@@ -124,4 +124,3 @@ BEGIN
IDS_ASSIGNED_DHCP "Piazeno DHCP"
IDS_ASSIGNED_MANUAL "Run nastaveno"
END
-
diff --git a/reactos/dll/win32/netshell/lang/ru-RU.rc b/reactos/dll/win32/netshell/lang/ru-RU.rc
index 623721c0f37..74c2b698959 100644
--- a/reactos/dll/win32/netshell/lang/ru-RU.rc
+++ b/reactos/dll/win32/netshell/lang/ru-RU.rc
@@ -114,10 +114,10 @@ BEGIN
IDS_NET_DELETE ""
IDS_NET_PROPERTIES ""
- IDS_FORMAT_BIT "%u /s"
- IDS_FORMAT_KBIT "%u /s"
- IDS_FORMAT_MBIT "%u /s"
- IDS_FORMAT_GBIT "%u /s"
+ IDS_FORMAT_BIT "%u /"
+ IDS_FORMAT_KBIT "%u /"
+ IDS_FORMAT_MBIT "%u /"
+ IDS_FORMAT_GBIT "%u /"
IDS_DURATION_DAY "%d %s"
IDS_DURATION_DAYS "%d %s"
IDS_ASSIGNED_DHCP " DHCP"
diff --git a/reactos/dll/win32/ole32/clipboard.c b/reactos/dll/win32/ole32/clipboard.c
index 1e72ec21217..7f19d1638a4 100644
--- a/reactos/dll/win32/ole32/clipboard.c
+++ b/reactos/dll/win32/ole32/clipboard.c
@@ -744,6 +744,30 @@ static HRESULT get_data_from_global(IDataObject *data, FORMATETC *fmt, HGLOBAL *
return hr;
}
+static HRESULT get_data_from_enhmetafile(IDataObject *data, FORMATETC *fmt, HGLOBAL *mem)
+{
+ HENHMETAFILE copy;
+ HRESULT hr;
+ FORMATETC mem_fmt;
+ STGMEDIUM med;
+
+ *mem = NULL;
+
+ mem_fmt = *fmt;
+ mem_fmt.tymed = TYMED_ENHMF;
+
+ hr = IDataObject_GetData(data, &mem_fmt, &med);
+ if(FAILED(hr)) return hr;
+
+ copy = CopyEnhMetaFileW(med.u.hEnhMetaFile, NULL);
+ if(copy) *mem = (HGLOBAL)copy;
+ else hr = E_FAIL;
+
+ ReleaseStgMedium(&med);
+
+ return hr;
+}
+
/***********************************************************************
* render_format
*
@@ -773,6 +797,10 @@ static HRESULT render_format(IDataObject *data, LPFORMATETC fmt)
{
hr = get_data_from_global(data, fmt, &clip_data);
}
+ else if(fmt->tymed & TYMED_ENHMF)
+ {
+ hr = get_data_from_enhmetafile(data, fmt, &clip_data);
+ }
else
{
FIXME("Unhandled tymed %x\n", fmt->tymed);
@@ -997,8 +1025,7 @@ static HRESULT get_priv_data(ole_priv_data **data)
{
char buf[100];
GetClipboardFormatNameA(cf, buf, sizeof(buf));
- TRACE("\tcf %04x %s\n", cf, buf);
- ;
+ TRACE("cf %04x %s\n", cf, buf);
}
TRACE("count %d\n", count);
size += count * sizeof(ret->entries[0]);
@@ -1106,6 +1133,22 @@ static HRESULT get_stgmed_for_storage(HGLOBAL h, STGMEDIUM *med)
return hr;
}
+/************************************************************************
+ * get_stgmed_for_emf
+ *
+ * Returns a stg medium with an enhanced metafile based on the handle
+ */
+static HRESULT get_stgmed_for_emf(HENHMETAFILE hemf, STGMEDIUM *med)
+{
+ med->pUnkForRelease = NULL;
+ med->tymed = TYMED_NULL;
+
+ med->u.hEnhMetaFile = CopyEnhMetaFileW(hemf, NULL);
+ if(!med->u.hEnhMetaFile) return E_OUTOFMEMORY;
+ med->tymed = TYMED_ENHMF;
+ return S_OK;
+}
+
static inline BOOL string_off_equal(const DVTARGETDEVICE *t1, WORD off1, const DVTARGETDEVICE *t2, WORD off2)
{
const WCHAR *str1, *str2;
@@ -1195,6 +1238,8 @@ static HRESULT WINAPI snapshot_GetData(IDataObject *iface, FORMATETC *fmt,
hr = get_stgmed_for_global(h, med);
else if(mask & TYMED_ISTREAM)
hr = get_stgmed_for_stream(h, med);
+ else if(mask & TYMED_ENHMF)
+ hr = get_stgmed_for_emf((HENHMETAFILE)h, med);
else
{
FIXME("Unhandled tymed - mask %x req tymed %x\n", mask, fmt->tymed);
diff --git a/reactos/dll/win32/ole32/comcat.c b/reactos/dll/win32/ole32/comcat.c
index cee1ebb7d68..b8060bdefca 100644
--- a/reactos/dll/win32/ole32/comcat.c
+++ b/reactos/dll/win32/ole32/comcat.c
@@ -278,7 +278,7 @@ static HRESULT WINAPI COMCAT_ICatRegister_QueryInterface(
LPVOID *ppvObj)
{
ComCatMgrImpl *This = (ComCatMgrImpl *)iface;
- TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
+ TRACE("%s\n",debugstr_guid(riid));
if (ppvObj == NULL) return E_POINTER;
@@ -515,7 +515,7 @@ static HRESULT WINAPI COMCAT_ICatInformation_GetCategoryDesc(
HKEY key;
HRESULT res;
- TRACE("\n\tCATID:\t%s\n\tLCID:\t%X\n",debugstr_guid(rcatid), lcid);
+ TRACE("CATID: %s LCID: %x\n",debugstr_guid(rcatid), lcid);
if (rcatid == NULL || ppszDesc == NULL) return E_INVALIDARG;
@@ -596,12 +596,12 @@ static HRESULT WINAPI COMCAT_ICatInformation_IsClassOfCategories(
if (WINE_TRACE_ON(ole)) {
ULONG count;
- TRACE("\n\tCLSID:\t%s\n\tImplemented %u\n",debugstr_guid(rclsid),cImplemented);
+ TRACE("CLSID: %s Implemented %u\n",debugstr_guid(rclsid),cImplemented);
for (count = 0; count < cImplemented; ++count)
- TRACE("\t\t%s\n",debugstr_guid(&rgcatidImpl[count]));
- TRACE("\tRequired %u\n",cRequired);
+ TRACE(" %s\n",debugstr_guid(&rgcatidImpl[count]));
+ TRACE("Required %u\n",cRequired);
for (count = 0; count < cRequired; ++count)
- TRACE("\t\t%s\n",debugstr_guid(&rgcatidReq[count]));
+ TRACE(" %s\n",debugstr_guid(&rgcatidReq[count]));
}
if ((cImplemented && rgcatidImpl == NULL) ||
@@ -637,7 +637,7 @@ static HRESULT WINAPI COMCAT_ICatInformation_EnumImplCategoriesOfClass(
'n', 't', 'e', 'd', ' ', 'C', 'a', 't',
'e', 'g', 'o', 'r', 'i', 'e', 's', 0 };
- TRACE("\n\tCLSID:\t%s\n",debugstr_guid(rclsid));
+ TRACE("%s\n",debugstr_guid(rclsid));
if (rclsid == NULL || ppenumCATID == NULL)
return E_POINTER;
@@ -659,7 +659,7 @@ static HRESULT WINAPI COMCAT_ICatInformation_EnumReqCategoriesOfClass(
'd', ' ', 'C', 'a', 't', 'e', 'g', 'o',
'r', 'i', 'e', 's', 0 };
- TRACE("\n\tCLSID:\t%s\n",debugstr_guid(rclsid));
+ TRACE("%s\n",debugstr_guid(rclsid));
if (rclsid == NULL || ppenumCATID == NULL)
return E_POINTER;
@@ -719,7 +719,7 @@ static HRESULT WINAPI COMCAT_IClassFactory_QueryInterface(
REFIID riid,
LPVOID *ppvObj)
{
- TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
+ TRACE("%s\n",debugstr_guid(riid));
if (ppvObj == NULL) return E_POINTER;
@@ -760,7 +760,7 @@ static HRESULT WINAPI COMCAT_IClassFactory_CreateInstance(
LPVOID *ppvObj)
{
HRESULT res;
- TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
+ TRACE("%s\n",debugstr_guid(riid));
if (ppvObj == NULL) return E_POINTER;
@@ -834,7 +834,7 @@ static HRESULT WINAPI COMCAT_IEnumCATEGORYINFO_QueryInterface(
REFIID riid,
LPVOID *ppvObj)
{
- TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
+ TRACE("%s\n",debugstr_guid(riid));
if (ppvObj == NULL) return E_POINTER;
@@ -1017,7 +1017,7 @@ static HRESULT WINAPI COMCAT_CLSID_IEnumGUID_QueryInterface(
REFIID riid,
LPVOID *ppvObj)
{
- TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
+ TRACE("%s\n",debugstr_guid(riid));
if (ppvObj == NULL) return E_POINTER;
@@ -1203,7 +1203,7 @@ static HRESULT WINAPI COMCAT_CATID_IEnumGUID_QueryInterface(
REFIID riid,
LPVOID *ppvObj)
{
- TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
+ TRACE("%s\n",debugstr_guid(riid));
if (ppvObj == NULL) return E_POINTER;
diff --git a/reactos/dll/win32/ole32/compobj.c b/reactos/dll/win32/ole32/compobj.c
index 154c18d67df..b2013cfbfa3 100644
--- a/reactos/dll/win32/ole32/compobj.c
+++ b/reactos/dll/win32/ole32/compobj.c
@@ -52,6 +52,7 @@
#include "winerror.h"
#include "winreg.h"
#include "winuser.h"
+#define USE_COM_CONTEXT_DEF
#include "objbase.h"
#include "ole2.h"
#include "ole2ver.h"
@@ -71,11 +72,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole);
* This section defines variables internal to the COM module.
*/
-static HRESULT COM_GetRegisteredClassObject(const struct apartment *apt, REFCLSID rclsid,
- DWORD dwClsContext, LPUNKNOWN* ppUnk);
-static void COM_RevokeAllClasses(const struct apartment *apt);
-static HRESULT get_inproc_class_object(APARTMENT *apt, HKEY hkeydll, REFCLSID rclsid, REFIID riid, BOOL hostifnecessary, void **ppv);
-
static APARTMENT *MTA; /* protected by csApartment */
static APARTMENT *MainApartment; /* the first STA apartment */
static struct list apts = LIST_INIT( apts ); /* protected by csApartment */
@@ -182,61 +178,147 @@ struct apartment_loaded_dll
static const WCHAR wszAptWinClass[] = {'O','l','e','M','a','i','n','T','h','r','e','a','d','W','n','d','C','l','a','s','s',' ',
'0','x','#','#','#','#','#','#','#','#',' ',0};
-static LRESULT CALLBACK apartment_wndproc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
-static HRESULT apartment_getclassobject(struct apartment *apt, LPCWSTR dllpath,
- BOOL apartment_threaded,
- REFCLSID rclsid, REFIID riid, void **ppv);
-static void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay);
-static HRESULT COMPOBJ_DllList_Add(LPCWSTR library_name, OpenDll **ret);
-static OpenDll *COMPOBJ_DllList_Get(LPCWSTR library_name);
-static void COMPOBJ_DllList_ReleaseRef(OpenDll *entry, BOOL free_entry);
+/*****************************************************************************
+ * This section contains OpenDllList implementation
+ */
-static DWORD COM_RegReadPath(HKEY hkeyroot, const WCHAR *keyname, const WCHAR *valuename, WCHAR * dst, DWORD dstlen);
-
-static void COMPOBJ_InitProcess( void )
+static OpenDll *COMPOBJ_DllList_Get(LPCWSTR library_name)
{
- WNDCLASSW wclass;
-
- /* Dispatching to the correct thread in an apartment is done through
- * window messages rather than RPC transports. When an interface is
- * marshalled into another apartment in the same process, a window of the
- * following class is created. The *caller* of CoMarshalInterface (i.e., the
- * application) is responsible for pumping the message loop in that thread.
- * The WM_USER messages which point to the RPCs are then dispatched to
- * apartment_wndproc by the user's code from the apartment in which the
- * interface was unmarshalled.
- */
- memset(&wclass, 0, sizeof(wclass));
- wclass.lpfnWndProc = apartment_wndproc;
- wclass.hInstance = hProxyDll;
- wclass.lpszClassName = wszAptWinClass;
- RegisterClassW(&wclass);
-}
-
-static void COMPOBJ_UninitProcess( void )
-{
- UnregisterClassW(wszAptWinClass, hProxyDll);
-}
-
-static void COM_TlsDestroy(void)
-{
- struct oletls *info = NtCurrentTeb()->ReservedForOle;
- if (info)
+ OpenDll *ptr;
+ OpenDll *ret = NULL;
+ EnterCriticalSection(&csOpenDllList);
+ LIST_FOR_EACH_ENTRY(ptr, &openDllList, OpenDll, entry)
{
- if (info->apt) apartment_release(info->apt);
- if (info->errorinfo) IErrorInfo_Release(info->errorinfo);
- if (info->state) IUnknown_Release(info->state);
- if (info->spy) IUnknown_Release(info->spy);
- HeapFree(GetProcessHeap(), 0, info);
- NtCurrentTeb()->ReservedForOle = NULL;
+ if (!strcmpiW(library_name, ptr->library_name) &&
+ (InterlockedIncrement(&ptr->refs) != 1) /* entry is being destroy if == 1 */)
+ {
+ ret = ptr;
+ break;
+ }
}
+ LeaveCriticalSection(&csOpenDllList);
+ return ret;
+}
+
+/* caller must ensure that library_name is not already in the open dll list */
+static HRESULT COMPOBJ_DllList_Add(LPCWSTR library_name, OpenDll **ret)
+{
+ OpenDll *entry;
+ int len;
+ HRESULT hr = S_OK;
+ HANDLE hLibrary;
+ DllCanUnloadNowFunc DllCanUnloadNow;
+ DllGetClassObjectFunc DllGetClassObject;
+
+ TRACE("\n");
+
+ *ret = COMPOBJ_DllList_Get(library_name);
+ if (*ret) return S_OK;
+
+ /* do this outside the csOpenDllList to avoid creating a lock dependency on
+ * the loader lock */
+ hLibrary = LoadLibraryExW(library_name, 0, LOAD_WITH_ALTERED_SEARCH_PATH);
+ if (!hLibrary)
+ {
+ ERR("couldn't load in-process dll %s\n", debugstr_w(library_name));
+ /* failure: DLL could not be loaded */
+ return E_ACCESSDENIED; /* FIXME: or should this be CO_E_DLLNOTFOUND? */
+ }
+
+ DllCanUnloadNow = (void *)GetProcAddress(hLibrary, "DllCanUnloadNow");
+ /* Note: failing to find DllCanUnloadNow is not a failure */
+ DllGetClassObject = (void *)GetProcAddress(hLibrary, "DllGetClassObject");
+ if (!DllGetClassObject)
+ {
+ /* failure: the dll did not export DllGetClassObject */
+ ERR("couldn't find function DllGetClassObject in %s\n", debugstr_w(library_name));
+ FreeLibrary(hLibrary);
+ return CO_E_DLLNOTFOUND;
+ }
+
+ EnterCriticalSection( &csOpenDllList );
+
+ *ret = COMPOBJ_DllList_Get(library_name);
+ if (*ret)
+ {
+ /* another caller to this function already added the dll while we
+ * weren't in the critical section */
+ FreeLibrary(hLibrary);
+ }
+ else
+ {
+ len = strlenW(library_name);
+ entry = HeapAlloc(GetProcessHeap(),0, sizeof(OpenDll));
+ if (entry)
+ entry->library_name = HeapAlloc(GetProcessHeap(), 0, (len + 1)*sizeof(WCHAR));
+ if (entry && entry->library_name)
+ {
+ memcpy(entry->library_name, library_name, (len + 1)*sizeof(WCHAR));
+ entry->library = hLibrary;
+ entry->refs = 1;
+ entry->DllCanUnloadNow = DllCanUnloadNow;
+ entry->DllGetClassObject = DllGetClassObject;
+ list_add_tail(&openDllList, &entry->entry);
+ }
+ else
+ {
+ HeapFree(GetProcessHeap(), 0, entry);
+ hr = E_OUTOFMEMORY;
+ FreeLibrary(hLibrary);
+ }
+ *ret = entry;
+ }
+
+ LeaveCriticalSection( &csOpenDllList );
+
+ return hr;
+}
+
+/* pass FALSE for free_entry to release a reference without destroying the
+ * entry if it reaches zero or TRUE otherwise */
+static void COMPOBJ_DllList_ReleaseRef(OpenDll *entry, BOOL free_entry)
+{
+ if (!InterlockedDecrement(&entry->refs) && free_entry)
+ {
+ EnterCriticalSection(&csOpenDllList);
+ list_remove(&entry->entry);
+ LeaveCriticalSection(&csOpenDllList);
+
+ TRACE("freeing %p\n", entry->library);
+ FreeLibrary(entry->library);
+
+ HeapFree(GetProcessHeap(), 0, entry->library_name);
+ HeapFree(GetProcessHeap(), 0, entry);
+ }
+}
+
+/* frees memory associated with active dll list */
+static void COMPOBJ_DllList_Free(void)
+{
+ OpenDll *entry, *cursor2;
+ EnterCriticalSection(&csOpenDllList);
+ LIST_FOR_EACH_ENTRY_SAFE(entry, cursor2, &openDllList, OpenDll, entry)
+ {
+ list_remove(&entry->entry);
+
+ HeapFree(GetProcessHeap(), 0, entry->library_name);
+ HeapFree(GetProcessHeap(), 0, entry);
+ }
+ LeaveCriticalSection(&csOpenDllList);
}
/******************************************************************************
* Manage apartments.
*/
+static DWORD apartment_addref(struct apartment *apt)
+{
+ DWORD refs = InterlockedIncrement(&apt->refs);
+ TRACE("%s: before = %d\n", wine_dbgstr_longlong(apt->oxid), refs - 1);
+ return refs;
+}
+
/* allocates memory and fills in the necessary fields for a new apartment
* object. must be called inside apartment cs */
static APARTMENT *apartment_construct(DWORD model)
@@ -335,11 +417,146 @@ static inline BOOL apartment_is_model(const APARTMENT *apt, DWORD model)
return (apt->multi_threaded == !(model & COINIT_APARTMENTTHREADED));
}
-DWORD apartment_addref(struct apartment *apt)
+static void COM_RevokeRegisteredClassObject(RegisteredClass *curClass)
{
- DWORD refs = InterlockedIncrement(&apt->refs);
- TRACE("%s: before = %d\n", wine_dbgstr_longlong(apt->oxid), refs - 1);
- return refs;
+ list_remove(&curClass->entry);
+
+ if (curClass->runContext & CLSCTX_LOCAL_SERVER)
+ RPC_StopLocalServer(curClass->RpcRegistration);
+
+ /*
+ * Release the reference to the class object.
+ */
+ IUnknown_Release(curClass->classObject);
+
+ if (curClass->pMarshaledData)
+ {
+ LARGE_INTEGER zero;
+ memset(&zero, 0, sizeof(zero));
+ IStream_Seek(curClass->pMarshaledData, zero, STREAM_SEEK_SET, NULL);
+ CoReleaseMarshalData(curClass->pMarshaledData);
+ IStream_Release(curClass->pMarshaledData);
+ }
+
+ HeapFree(GetProcessHeap(), 0, curClass);
+}
+
+static void COM_RevokeAllClasses(const struct apartment *apt)
+{
+ RegisteredClass *curClass, *cursor;
+
+ EnterCriticalSection( &csRegisteredClassList );
+
+ LIST_FOR_EACH_ENTRY_SAFE(curClass, cursor, &RegisteredClassList, RegisteredClass, entry)
+ {
+ if (curClass->apartment_id == apt->oxid)
+ COM_RevokeRegisteredClassObject(curClass);
+ }
+
+ LeaveCriticalSection( &csRegisteredClassList );
+}
+
+/***********************************************************************
+ * CoRevokeClassObject [OLE32.@]
+ *
+ * Removes a class object from the class registry.
+ *
+ * PARAMS
+ * dwRegister [I] Cookie returned from CoRegisterClassObject().
+ *
+ * RETURNS
+ * Success: S_OK.
+ * Failure: HRESULT code.
+ *
+ * NOTES
+ * Must be called from the same apartment that called CoRegisterClassObject(),
+ * otherwise it will fail with RPC_E_WRONG_THREAD.
+ *
+ * SEE ALSO
+ * CoRegisterClassObject
+ */
+HRESULT WINAPI CoRevokeClassObject(
+ DWORD dwRegister)
+{
+ HRESULT hr = E_INVALIDARG;
+ RegisteredClass *curClass;
+ APARTMENT *apt;
+
+ TRACE("(%08x)\n",dwRegister);
+
+ apt = COM_CurrentApt();
+ if (!apt)
+ {
+ ERR("COM was not initialized\n");
+ return CO_E_NOTINITIALIZED;
+ }
+
+ EnterCriticalSection( &csRegisteredClassList );
+
+ LIST_FOR_EACH_ENTRY(curClass, &RegisteredClassList, RegisteredClass, entry)
+ {
+ /*
+ * Check if we have a match on the cookie.
+ */
+ if (curClass->dwCookie == dwRegister)
+ {
+ if (curClass->apartment_id == apt->oxid)
+ {
+ COM_RevokeRegisteredClassObject(curClass);
+ hr = S_OK;
+ }
+ else
+ {
+ ERR("called from wrong apartment, should be called from %s\n",
+ wine_dbgstr_longlong(curClass->apartment_id));
+ hr = RPC_E_WRONG_THREAD;
+ }
+ break;
+ }
+ }
+
+ LeaveCriticalSection( &csRegisteredClassList );
+
+ return hr;
+}
+
+/* frees unused libraries loaded by apartment_getclassobject by calling the
+ * DLL's DllCanUnloadNow entry point */
+static void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay)
+{
+ struct apartment_loaded_dll *entry, *next;
+ EnterCriticalSection(&apt->cs);
+ LIST_FOR_EACH_ENTRY_SAFE(entry, next, &apt->loaded_dlls, struct apartment_loaded_dll, entry)
+ {
+ if (entry->dll->DllCanUnloadNow && (entry->dll->DllCanUnloadNow() == S_OK))
+ {
+ DWORD real_delay = delay;
+
+ if (real_delay == INFINITE)
+ {
+ /* DLLs that return multi-threaded objects aren't unloaded
+ * straight away to cope for programs that have races between
+ * last object destruction and threads in the DLLs that haven't
+ * finished, despite DllCanUnloadNow returning S_OK */
+ if (entry->multi_threaded)
+ real_delay = 10 * 60 * 1000; /* 10 minutes */
+ else
+ real_delay = 0;
+ }
+
+ if (!real_delay || (entry->unload_time && (entry->unload_time < GetTickCount())))
+ {
+ list_remove(&entry->entry);
+ COMPOBJ_DllList_ReleaseRef(entry->dll, TRUE);
+ HeapFree(GetProcessHeap(), 0, entry);
+ }
+ else
+ entry->unload_time = GetTickCount() + real_delay;
+ }
+ else if (entry->unload_time)
+ entry->unload_time = 0;
+ }
+ LeaveCriticalSection(&apt->cs);
}
DWORD apartment_release(struct apartment *apt)
@@ -519,6 +736,106 @@ static APARTMENT *apartment_find_multi_threaded(void)
return result;
}
+/* gets the specified class object by loading the appropriate DLL, if
+ * necessary and calls the DllGetClassObject function for the DLL */
+static HRESULT apartment_getclassobject(struct apartment *apt, LPCWSTR dllpath,
+ BOOL apartment_threaded,
+ REFCLSID rclsid, REFIID riid, void **ppv)
+{
+ static const WCHAR wszOle32[] = {'o','l','e','3','2','.','d','l','l',0};
+ HRESULT hr = S_OK;
+ BOOL found = FALSE;
+ struct apartment_loaded_dll *apartment_loaded_dll;
+
+ if (!strcmpiW(dllpath, wszOle32))
+ {
+ /* we don't need to control the lifetime of this dll, so use the local
+ * implementation of DllGetClassObject directly */
+ TRACE("calling ole32!DllGetClassObject\n");
+ hr = DllGetClassObject(rclsid, riid, ppv);
+
+ if (hr != S_OK)
+ ERR("DllGetClassObject returned error 0x%08x\n", hr);
+
+ return hr;
+ }
+
+ EnterCriticalSection(&apt->cs);
+
+ LIST_FOR_EACH_ENTRY(apartment_loaded_dll, &apt->loaded_dlls, struct apartment_loaded_dll, entry)
+ if (!strcmpiW(dllpath, apartment_loaded_dll->dll->library_name))
+ {
+ TRACE("found %s already loaded\n", debugstr_w(dllpath));
+ found = TRUE;
+ break;
+ }
+
+ if (!found)
+ {
+ apartment_loaded_dll = HeapAlloc(GetProcessHeap(), 0, sizeof(*apartment_loaded_dll));
+ if (!apartment_loaded_dll)
+ hr = E_OUTOFMEMORY;
+ if (SUCCEEDED(hr))
+ {
+ apartment_loaded_dll->unload_time = 0;
+ apartment_loaded_dll->multi_threaded = FALSE;
+ hr = COMPOBJ_DllList_Add( dllpath, &apartment_loaded_dll->dll );
+ if (FAILED(hr))
+ HeapFree(GetProcessHeap(), 0, apartment_loaded_dll);
+ }
+ if (SUCCEEDED(hr))
+ {
+ TRACE("added new loaded dll %s\n", debugstr_w(dllpath));
+ list_add_tail(&apt->loaded_dlls, &apartment_loaded_dll->entry);
+ }
+ }
+
+ LeaveCriticalSection(&apt->cs);
+
+ if (SUCCEEDED(hr))
+ {
+ /* one component being multi-threaded overrides any number of
+ * apartment-threaded components */
+ if (!apartment_threaded)
+ apartment_loaded_dll->multi_threaded = TRUE;
+
+ TRACE("calling DllGetClassObject %p\n", apartment_loaded_dll->dll->DllGetClassObject);
+ /* OK: get the ClassObject */
+ hr = apartment_loaded_dll->dll->DllGetClassObject(rclsid, riid, ppv);
+
+ if (hr != S_OK)
+ ERR("DllGetClassObject returned error 0x%08x\n", hr);
+ }
+
+ return hr;
+}
+
+/***********************************************************************
+ * COM_RegReadPath [internal]
+ *
+ * Reads a registry value and expands it when necessary
+ */
+static DWORD COM_RegReadPath(HKEY hkeyroot, const WCHAR *keyname, const WCHAR *valuename, WCHAR * dst, DWORD dstlen)
+{
+ DWORD ret;
+ HKEY key;
+ DWORD keytype;
+ WCHAR src[MAX_PATH];
+ DWORD dwLength = dstlen * sizeof(WCHAR);
+
+ if((ret = RegOpenKeyExW(hkeyroot, keyname, 0, KEY_READ, &key)) == ERROR_SUCCESS) {
+ if( (ret = RegQueryValueExW(key, NULL, NULL, &keytype, (LPBYTE)src, &dwLength)) == ERROR_SUCCESS ) {
+ if (keytype == REG_EXPAND_SZ) {
+ if (dstlen <= ExpandEnvironmentStringsW(src, dst, dstlen)) ret = ERROR_MORE_DATA;
+ } else {
+ lstrcpynW(dst, src, dstlen);
+ }
+ }
+ RegCloseKey (key);
+ }
+ return ret;
+}
+
struct host_object_params
{
HKEY hkeydll;
@@ -781,246 +1098,44 @@ void apartment_joinmta(void)
COM_CurrentInfo()->apt = MTA;
}
-/* gets the specified class object by loading the appropriate DLL, if
- * necessary and calls the DllGetClassObject function for the DLL */
-static HRESULT apartment_getclassobject(struct apartment *apt, LPCWSTR dllpath,
- BOOL apartment_threaded,
- REFCLSID rclsid, REFIID riid, void **ppv)
+static void COMPOBJ_InitProcess( void )
{
- static const WCHAR wszOle32[] = {'o','l','e','3','2','.','d','l','l',0};
- HRESULT hr = S_OK;
- BOOL found = FALSE;
- struct apartment_loaded_dll *apartment_loaded_dll;
+ WNDCLASSW wclass;
- if (!strcmpiW(dllpath, wszOle32))
- {
- /* we don't need to control the lifetime of this dll, so use the local
- * implementation of DllGetClassObject directly */
- TRACE("calling ole32!DllGetClassObject\n");
- hr = DllGetClassObject(rclsid, riid, ppv);
-
- if (hr != S_OK)
- ERR("DllGetClassObject returned error 0x%08x\n", hr);
-
- return hr;
- }
-
- EnterCriticalSection(&apt->cs);
-
- LIST_FOR_EACH_ENTRY(apartment_loaded_dll, &apt->loaded_dlls, struct apartment_loaded_dll, entry)
- if (!strcmpiW(dllpath, apartment_loaded_dll->dll->library_name))
- {
- TRACE("found %s already loaded\n", debugstr_w(dllpath));
- found = TRUE;
- break;
- }
-
- if (!found)
- {
- apartment_loaded_dll = HeapAlloc(GetProcessHeap(), 0, sizeof(*apartment_loaded_dll));
- if (!apartment_loaded_dll)
- hr = E_OUTOFMEMORY;
- if (SUCCEEDED(hr))
- {
- apartment_loaded_dll->unload_time = 0;
- apartment_loaded_dll->multi_threaded = FALSE;
- hr = COMPOBJ_DllList_Add( dllpath, &apartment_loaded_dll->dll );
- if (FAILED(hr))
- HeapFree(GetProcessHeap(), 0, apartment_loaded_dll);
- }
- if (SUCCEEDED(hr))
- {
- TRACE("added new loaded dll %s\n", debugstr_w(dllpath));
- list_add_tail(&apt->loaded_dlls, &apartment_loaded_dll->entry);
- }
- }
-
- LeaveCriticalSection(&apt->cs);
-
- if (SUCCEEDED(hr))
- {
- /* one component being multi-threaded overrides any number of
- * apartment-threaded components */
- if (!apartment_threaded)
- apartment_loaded_dll->multi_threaded = TRUE;
-
- TRACE("calling DllGetClassObject %p\n", apartment_loaded_dll->dll->DllGetClassObject);
- /* OK: get the ClassObject */
- hr = apartment_loaded_dll->dll->DllGetClassObject(rclsid, riid, ppv);
-
- if (hr != S_OK)
- ERR("DllGetClassObject returned error 0x%08x\n", hr);
- }
-
- return hr;
+ /* Dispatching to the correct thread in an apartment is done through
+ * window messages rather than RPC transports. When an interface is
+ * marshalled into another apartment in the same process, a window of the
+ * following class is created. The *caller* of CoMarshalInterface (i.e., the
+ * application) is responsible for pumping the message loop in that thread.
+ * The WM_USER messages which point to the RPCs are then dispatched to
+ * apartment_wndproc by the user's code from the apartment in which the
+ * interface was unmarshalled.
+ */
+ memset(&wclass, 0, sizeof(wclass));
+ wclass.lpfnWndProc = apartment_wndproc;
+ wclass.hInstance = hProxyDll;
+ wclass.lpszClassName = wszAptWinClass;
+ RegisterClassW(&wclass);
}
-/* frees unused libraries loaded by apartment_getclassobject by calling the
- * DLL's DllCanUnloadNow entry point */
-static void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay)
+static void COMPOBJ_UninitProcess( void )
{
- struct apartment_loaded_dll *entry, *next;
- EnterCriticalSection(&apt->cs);
- LIST_FOR_EACH_ENTRY_SAFE(entry, next, &apt->loaded_dlls, struct apartment_loaded_dll, entry)
- {
- if (entry->dll->DllCanUnloadNow && (entry->dll->DllCanUnloadNow() == S_OK))
- {
- DWORD real_delay = delay;
-
- if (real_delay == INFINITE)
- {
- /* DLLs that return multi-threaded objects aren't unloaded
- * straight away to cope for programs that have races between
- * last object destruction and threads in the DLLs that haven't
- * finished, despite DllCanUnloadNow returning S_OK */
- if (entry->multi_threaded)
- real_delay = 10 * 60 * 1000; /* 10 minutes */
- else
- real_delay = 0;
- }
-
- if (!real_delay || (entry->unload_time && (entry->unload_time < GetTickCount())))
- {
- list_remove(&entry->entry);
- COMPOBJ_DllList_ReleaseRef(entry->dll, TRUE);
- HeapFree(GetProcessHeap(), 0, entry);
- }
- else
- entry->unload_time = GetTickCount() + real_delay;
- }
- else if (entry->unload_time)
- entry->unload_time = 0;
- }
- LeaveCriticalSection(&apt->cs);
+ UnregisterClassW(wszAptWinClass, hProxyDll);
}
-/*****************************************************************************
- * This section contains OpenDllList implementation
- */
-
-/* caller must ensure that library_name is not already in the open dll list */
-static HRESULT COMPOBJ_DllList_Add(LPCWSTR library_name, OpenDll **ret)
+static void COM_TlsDestroy(void)
{
- OpenDll *entry;
- int len;
- HRESULT hr = S_OK;
- HANDLE hLibrary;
- DllCanUnloadNowFunc DllCanUnloadNow;
- DllGetClassObjectFunc DllGetClassObject;
-
- TRACE("\n");
-
- *ret = COMPOBJ_DllList_Get(library_name);
- if (*ret) return S_OK;
-
- /* do this outside the csOpenDllList to avoid creating a lock dependency on
- * the loader lock */
- hLibrary = LoadLibraryExW(library_name, 0, LOAD_WITH_ALTERED_SEARCH_PATH);
- if (!hLibrary)
+ struct oletls *info = NtCurrentTeb()->ReservedForOle;
+ if (info)
{
- ERR("couldn't load in-process dll %s\n", debugstr_w(library_name));
- /* failure: DLL could not be loaded */
- return E_ACCESSDENIED; /* FIXME: or should this be CO_E_DLLNOTFOUND? */
+ if (info->apt) apartment_release(info->apt);
+ if (info->errorinfo) IErrorInfo_Release(info->errorinfo);
+ if (info->state) IUnknown_Release(info->state);
+ if (info->spy) IUnknown_Release(info->spy);
+ if (info->context_token) IObjContext_Release(info->context_token);
+ HeapFree(GetProcessHeap(), 0, info);
+ NtCurrentTeb()->ReservedForOle = NULL;
}
-
- DllCanUnloadNow = (void *)GetProcAddress(hLibrary, "DllCanUnloadNow");
- /* Note: failing to find DllCanUnloadNow is not a failure */
- DllGetClassObject = (void *)GetProcAddress(hLibrary, "DllGetClassObject");
- if (!DllGetClassObject)
- {
- /* failure: the dll did not export DllGetClassObject */
- ERR("couldn't find function DllGetClassObject in %s\n", debugstr_w(library_name));
- FreeLibrary(hLibrary);
- return CO_E_DLLNOTFOUND;
- }
-
- EnterCriticalSection( &csOpenDllList );
-
- *ret = COMPOBJ_DllList_Get(library_name);
- if (*ret)
- {
- /* another caller to this function already added the dll while we
- * weren't in the critical section */
- FreeLibrary(hLibrary);
- }
- else
- {
- len = strlenW(library_name);
- entry = HeapAlloc(GetProcessHeap(),0, sizeof(OpenDll));
- if (entry)
- entry->library_name = HeapAlloc(GetProcessHeap(), 0, (len + 1)*sizeof(WCHAR));
- if (entry && entry->library_name)
- {
- memcpy(entry->library_name, library_name, (len + 1)*sizeof(WCHAR));
- entry->library = hLibrary;
- entry->refs = 1;
- entry->DllCanUnloadNow = DllCanUnloadNow;
- entry->DllGetClassObject = DllGetClassObject;
- list_add_tail(&openDllList, &entry->entry);
- }
- else
- {
- HeapFree(GetProcessHeap(), 0, entry);
- hr = E_OUTOFMEMORY;
- FreeLibrary(hLibrary);
- }
- *ret = entry;
- }
-
- LeaveCriticalSection( &csOpenDllList );
-
- return hr;
-}
-
-static OpenDll *COMPOBJ_DllList_Get(LPCWSTR library_name)
-{
- OpenDll *ptr;
- OpenDll *ret = NULL;
- EnterCriticalSection(&csOpenDllList);
- LIST_FOR_EACH_ENTRY(ptr, &openDllList, OpenDll, entry)
- {
- if (!strcmpiW(library_name, ptr->library_name) &&
- (InterlockedIncrement(&ptr->refs) != 1) /* entry is being destroy if == 1 */)
- {
- ret = ptr;
- break;
- }
- }
- LeaveCriticalSection(&csOpenDllList);
- return ret;
-}
-
-/* pass FALSE for free_entry to release a reference without destroying the
- * entry if it reaches zero or TRUE otherwise */
-static void COMPOBJ_DllList_ReleaseRef(OpenDll *entry, BOOL free_entry)
-{
- if (!InterlockedDecrement(&entry->refs) && free_entry)
- {
- EnterCriticalSection(&csOpenDllList);
- list_remove(&entry->entry);
- LeaveCriticalSection(&csOpenDllList);
-
- TRACE("freeing %p\n", entry->library);
- FreeLibrary(entry->library);
-
- HeapFree(GetProcessHeap(), 0, entry->library_name);
- HeapFree(GetProcessHeap(), 0, entry);
- }
-}
-
-/* frees memory associated with active dll list */
-static void COMPOBJ_DllList_Free(void)
-{
- OpenDll *entry, *cursor2;
- EnterCriticalSection(&csOpenDllList);
- LIST_FOR_EACH_ENTRY_SAFE(entry, cursor2, &openDllList, OpenDll, entry)
- {
- list_remove(&entry->entry);
-
- HeapFree(GetProcessHeap(), 0, entry->library_name);
- HeapFree(GetProcessHeap(), 0, entry);
- }
- LeaveCriticalSection(&csOpenDllList);
}
/******************************************************************************
@@ -2031,135 +2146,6 @@ HRESULT WINAPI CoRegisterClassObject(
return S_OK;
}
-static void COM_RevokeRegisteredClassObject(RegisteredClass *curClass)
-{
- list_remove(&curClass->entry);
-
- if (curClass->runContext & CLSCTX_LOCAL_SERVER)
- RPC_StopLocalServer(curClass->RpcRegistration);
-
- /*
- * Release the reference to the class object.
- */
- IUnknown_Release(curClass->classObject);
-
- if (curClass->pMarshaledData)
- {
- LARGE_INTEGER zero;
- memset(&zero, 0, sizeof(zero));
- IStream_Seek(curClass->pMarshaledData, zero, STREAM_SEEK_SET, NULL);
- CoReleaseMarshalData(curClass->pMarshaledData);
- IStream_Release(curClass->pMarshaledData);
- }
-
- HeapFree(GetProcessHeap(), 0, curClass);
-}
-
-static void COM_RevokeAllClasses(const struct apartment *apt)
-{
- RegisteredClass *curClass, *cursor;
-
- EnterCriticalSection( &csRegisteredClassList );
-
- LIST_FOR_EACH_ENTRY_SAFE(curClass, cursor, &RegisteredClassList, RegisteredClass, entry)
- {
- if (curClass->apartment_id == apt->oxid)
- COM_RevokeRegisteredClassObject(curClass);
- }
-
- LeaveCriticalSection( &csRegisteredClassList );
-}
-
-/***********************************************************************
- * CoRevokeClassObject [OLE32.@]
- *
- * Removes a class object from the class registry.
- *
- * PARAMS
- * dwRegister [I] Cookie returned from CoRegisterClassObject().
- *
- * RETURNS
- * Success: S_OK.
- * Failure: HRESULT code.
- *
- * NOTES
- * Must be called from the same apartment that called CoRegisterClassObject(),
- * otherwise it will fail with RPC_E_WRONG_THREAD.
- *
- * SEE ALSO
- * CoRegisterClassObject
- */
-HRESULT WINAPI CoRevokeClassObject(
- DWORD dwRegister)
-{
- HRESULT hr = E_INVALIDARG;
- RegisteredClass *curClass;
- APARTMENT *apt;
-
- TRACE("(%08x)\n",dwRegister);
-
- apt = COM_CurrentApt();
- if (!apt)
- {
- ERR("COM was not initialized\n");
- return CO_E_NOTINITIALIZED;
- }
-
- EnterCriticalSection( &csRegisteredClassList );
-
- LIST_FOR_EACH_ENTRY(curClass, &RegisteredClassList, RegisteredClass, entry)
- {
- /*
- * Check if we have a match on the cookie.
- */
- if (curClass->dwCookie == dwRegister)
- {
- if (curClass->apartment_id == apt->oxid)
- {
- COM_RevokeRegisteredClassObject(curClass);
- hr = S_OK;
- }
- else
- {
- ERR("called from wrong apartment, should be called from %s\n",
- wine_dbgstr_longlong(curClass->apartment_id));
- hr = RPC_E_WRONG_THREAD;
- }
- break;
- }
- }
-
- LeaveCriticalSection( &csRegisteredClassList );
-
- return hr;
-}
-
-/***********************************************************************
- * COM_RegReadPath [internal]
- *
- * Reads a registry value and expands it when necessary
- */
-static DWORD COM_RegReadPath(HKEY hkeyroot, const WCHAR *keyname, const WCHAR *valuename, WCHAR * dst, DWORD dstlen)
-{
- DWORD ret;
- HKEY key;
- DWORD keytype;
- WCHAR src[MAX_PATH];
- DWORD dwLength = dstlen * sizeof(WCHAR);
-
- if((ret = RegOpenKeyExW(hkeyroot, keyname, 0, KEY_READ, &key)) == ERROR_SUCCESS) {
- if( (ret = RegQueryValueExW(key, NULL, NULL, &keytype, (LPBYTE)src, &dwLength)) == ERROR_SUCCESS ) {
- if (keytype == REG_EXPAND_SZ) {
- if (dstlen <= ExpandEnvironmentStringsW(src, dst, dstlen)) ret = ERROR_MORE_DATA;
- } else {
- lstrcpynW(dst, src, dstlen);
- }
- }
- RegCloseKey (key);
- }
- return ret;
-}
-
static void get_threading_model(HKEY key, LPWSTR value, DWORD len)
{
static const WCHAR wszThreadingModel[] = {'T','h','r','e','a','d','i','n','g','M','o','d','e','l',0};
@@ -2265,7 +2251,7 @@ HRESULT WINAPI CoGetClassObject(
APARTMENT *apt;
BOOL release_apt = FALSE;
- TRACE("\n\tCLSID:\t%s,\n\tIID:\t%s\n", debugstr_guid(rclsid), debugstr_guid(iid));
+ TRACE("CLSID: %s,IID: %s\n", debugstr_guid(rclsid), debugstr_guid(iid));
if (!ppv)
return E_INVALIDARG;
@@ -2283,8 +2269,8 @@ HRESULT WINAPI CoGetClassObject(
}
if (pServerInfo) {
- FIXME("\tpServerInfo: name=%s\n",debugstr_w(pServerInfo->pwszName));
- FIXME("\t\tpAuthInfo=%p\n",pServerInfo->pAuthInfo);
+ FIXME("pServerInfo->name=%s pAuthInfo=%p\n",
+ debugstr_w(pServerInfo->pwszName), pServerInfo->pAuthInfo);
}
/*
@@ -3748,6 +3734,7 @@ typedef struct Context
{
const IComThreadingInfoVtbl *lpVtbl;
const IContextCallbackVtbl *lpCallbackVtbl;
+ const IObjContextVtbl *lpContextVtbl;
LONG refs;
APTTYPE apttype;
} Context;
@@ -3762,6 +3749,11 @@ static inline Context *impl_from_IContextCallback( IContextCallback *iface )
return (Context *)((char*)iface - FIELD_OFFSET(Context, lpCallbackVtbl));
}
+static inline Context *impl_from_IObjContext( IObjContext *iface )
+{
+ return (Context *)((char*)iface - FIELD_OFFSET(Context, lpContextVtbl));
+}
+
static HRESULT Context_QueryInterface(Context *iface, REFIID riid, LPVOID *ppv)
{
*ppv = NULL;
@@ -3770,10 +3762,15 @@ static HRESULT Context_QueryInterface(Context *iface, REFIID riid, LPVOID *ppv)
IsEqualIID(riid, &IID_IUnknown))
{
*ppv = &iface->lpVtbl;
- } else if (IsEqualIID(riid, &IID_IContextCallback))
+ }
+ else if (IsEqualIID(riid, &IID_IContextCallback))
{
*ppv = &iface->lpCallbackVtbl;
}
+ else if (IsEqualIID(riid, &IID_IObjContext))
+ {
+ *ppv = &iface->lpContextVtbl;
+ }
if (*ppv)
{
@@ -3903,6 +3900,115 @@ static const IContextCallbackVtbl Context_Callback_Vtbl =
Context_CC_ContextCallback
};
+static HRESULT WINAPI Context_OC_QueryInterface(IObjContext *iface, REFIID riid, LPVOID *ppv)
+{
+ Context *This = impl_from_IObjContext(iface);
+ return Context_QueryInterface(This, riid, ppv);
+}
+
+static ULONG WINAPI Context_OC_AddRef(IObjContext *iface)
+{
+ Context *This = impl_from_IObjContext(iface);
+ return Context_AddRef(This);
+}
+
+static ULONG WINAPI Context_OC_Release(IObjContext *iface)
+{
+ Context *This = impl_from_IObjContext(iface);
+ return Context_Release(This);
+}
+
+static HRESULT WINAPI Context_OC_SetProperty(IObjContext *iface, REFGUID propid, CPFLAGS flags, IUnknown *punk)
+{
+ Context *This = impl_from_IObjContext(iface);
+
+ FIXME("(%p/%p)->(%s, %x, %p)\n", This, iface, debugstr_guid(propid), flags, punk);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Context_OC_RemoveProperty(IObjContext *iface, REFGUID propid)
+{
+ Context *This = impl_from_IObjContext(iface);
+
+ FIXME("(%p/%p)->(%s)\n", This, iface, debugstr_guid(propid));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Context_OC_GetProperty(IObjContext *iface, REFGUID propid, CPFLAGS *flags, IUnknown **punk)
+{
+ Context *This = impl_from_IObjContext(iface);
+
+ FIXME("(%p/%p)->(%s, %p, %p)\n", This, iface, debugstr_guid(propid), flags, punk);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Context_OC_EnumContextProps(IObjContext *iface, IEnumContextProps **props)
+{
+ Context *This = impl_from_IObjContext(iface);
+
+ FIXME("(%p/%p)->(%p)\n", This, iface, props);
+ return E_NOTIMPL;
+}
+
+static void WINAPI Context_OC_Reserved1(IObjContext *iface)
+{
+ Context *This = impl_from_IObjContext(iface);
+ FIXME("(%p/%p)\n", This, iface);
+}
+
+static void WINAPI Context_OC_Reserved2(IObjContext *iface)
+{
+ Context *This = impl_from_IObjContext(iface);
+ FIXME("(%p/%p)\n", This, iface);
+}
+
+static void WINAPI Context_OC_Reserved3(IObjContext *iface)
+{
+ Context *This = impl_from_IObjContext(iface);
+ FIXME("(%p/%p)\n", This, iface);
+}
+
+static void WINAPI Context_OC_Reserved4(IObjContext *iface)
+{
+ Context *This = impl_from_IObjContext(iface);
+ FIXME("(%p/%p)\n", This, iface);
+}
+
+static void WINAPI Context_OC_Reserved5(IObjContext *iface)
+{
+ Context *This = impl_from_IObjContext(iface);
+ FIXME("(%p/%p)\n", This, iface);
+}
+
+static void WINAPI Context_OC_Reserved6(IObjContext *iface)
+{
+ Context *This = impl_from_IObjContext(iface);
+ FIXME("(%p/%p)\n", This, iface);
+}
+
+static void WINAPI Context_OC_Reserved7(IObjContext *iface)
+{
+ Context *This = impl_from_IObjContext(iface);
+ FIXME("(%p/%p)\n", This, iface);
+}
+
+static const IObjContextVtbl Context_Object_Vtbl =
+{
+ Context_OC_QueryInterface,
+ Context_OC_AddRef,
+ Context_OC_Release,
+ Context_OC_SetProperty,
+ Context_OC_RemoveProperty,
+ Context_OC_GetProperty,
+ Context_OC_EnumContextProps,
+ Context_OC_Reserved1,
+ Context_OC_Reserved2,
+ Context_OC_Reserved3,
+ Context_OC_Reserved4,
+ Context_OC_Reserved5,
+ Context_OC_Reserved6,
+ Context_OC_Reserved7
+};
/***********************************************************************
* CoGetObjectContext [OLE32.@]
@@ -3928,8 +4034,12 @@ HRESULT WINAPI CoGetObjectContext(REFIID riid, void **ppv)
*ppv = NULL;
if (!apt)
{
- ERR("apartment not initialised\n");
- return CO_E_NOTINITIALIZED;
+ if (!(apt = apartment_find_multi_threaded()))
+ {
+ ERR("apartment not initialised\n");
+ return CO_E_NOTINITIALIZED;
+ }
+ apartment_release(apt);
}
context = HeapAlloc(GetProcessHeap(), 0, sizeof(*context));
@@ -3938,6 +4048,7 @@ HRESULT WINAPI CoGetObjectContext(REFIID riid, void **ppv)
context->lpVtbl = &Context_Threading_Vtbl;
context->lpCallbackVtbl = &Context_Callback_Vtbl;
+ context->lpContextVtbl = &Context_Object_Vtbl;
context->refs = 1;
if (apt->multi_threaded)
context->apttype = APTTYPE_MTA;
@@ -3959,12 +4070,40 @@ HRESULT WINAPI CoGetObjectContext(REFIID riid, void **ppv)
HRESULT WINAPI CoGetContextToken( ULONG_PTR *token )
{
struct oletls *info = COM_CurrentInfo();
- static int calls;
- if(!(calls++)) FIXME( "stub\n" );
+
+ TRACE("(%p)\n", token);
+
if (!info)
return E_OUTOFMEMORY;
- if (token) *token = info->context_token;
- return E_NOTIMPL;
+
+ if (!info->apt)
+ {
+ APARTMENT *apt;
+ if (!(apt = apartment_find_multi_threaded()))
+ {
+ ERR("apartment not initialised\n");
+ return CO_E_NOTINITIALIZED;
+ }
+ apartment_release(apt);
+ }
+
+ if (!token)
+ return E_POINTER;
+
+ if (!info->context_token)
+ {
+ HRESULT hr;
+ IObjContext *ctx;
+
+ hr = CoGetObjectContext(&IID_IObjContext, (void **)&ctx);
+ if (FAILED(hr)) return hr;
+ info->context_token = ctx;
+ }
+
+ *token = (ULONG_PTR)info->context_token;
+ TRACE("apt->context_token=%p\n", info->context_token);
+
+ return S_OK;
}
diff --git a/reactos/dll/win32/ole32/compobj_private.h b/reactos/dll/win32/ole32/compobj_private.h
index a7c6dfa67ce..fb059349f8c 100644
--- a/reactos/dll/win32/ole32/compobj_private.h
+++ b/reactos/dll/win32/ole32/compobj_private.h
@@ -183,7 +183,7 @@ struct oletls
LONG pending_call_count_client; /* number of client calls pending */
LONG pending_call_count_server; /* number of server calls pending */
DWORD unknown;
- ULONG_PTR context_token; /* (+38h on x86) */
+ IObjContext *context_token; /* (+38h on x86) */
IUnknown *call_state; /* current call context (+3Ch on x86) */
DWORD unknown2[46];
IUnknown *cancel_object; /* cancel object set by CoSetCancelObject (+F8h on x86) */
@@ -203,7 +203,6 @@ HRESULT FTMarshalCF_Create(REFIID riid, LPVOID *ppv);
/* Stub Manager */
-ULONG stub_manager_int_addref(struct stub_manager *This);
ULONG stub_manager_int_release(struct stub_manager *This);
struct stub_manager *new_stub_manager(APARTMENT *apt, IUnknown *object);
ULONG stub_manager_ext_addref(struct stub_manager *m, ULONG refs, BOOL tableweak);
@@ -253,7 +252,6 @@ void OLEDD_UnInitialize(void);
APARTMENT *apartment_findfromoxid(OXID oxid, BOOL ref);
APARTMENT *apartment_findfromtid(DWORD tid);
-DWORD apartment_addref(struct apartment *apt);
DWORD apartment_release(struct apartment *apt);
HRESULT apartment_disconnectproxies(struct apartment *apt);
void apartment_disconnectobject(struct apartment *apt, void *object);
diff --git a/reactos/dll/win32/ole32/compositemoniker.c b/reactos/dll/win32/ole32/compositemoniker.c
index 57fb4e698df..5535a97681b 100644
--- a/reactos/dll/win32/ole32/compositemoniker.c
+++ b/reactos/dll/win32/ole32/compositemoniker.c
@@ -552,6 +552,7 @@ CompositeMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
IEnumMoniker *enumMoniker1,*enumMoniker2;
IMoniker *tempMk1,*tempMk2;
HRESULT res1,res2,res;
+ BOOL done;
TRACE("(%p,%p)\n",iface,pmkOtherMoniker);
@@ -567,27 +568,18 @@ CompositeMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
IMoniker_Enum(iface,TRUE,&enumMoniker2);
- while(1){
+ do {
res1=IEnumMoniker_Next(enumMoniker1,1,&tempMk1,NULL);
res2=IEnumMoniker_Next(enumMoniker2,1,&tempMk2,NULL);
if((res1==S_OK)&&(res2==S_OK)){
-
- if(IMoniker_IsEqual(tempMk1,tempMk2)==S_FALSE){
- res= S_FALSE;
- break;
- }
- else
- continue;
+ done = (res = IMoniker_IsEqual(tempMk1,tempMk2)) == S_FALSE;
}
- else if ( (res1==S_FALSE) && (res2==S_FALSE) ){
- res = S_OK;
- break;
- }
- else{
- res = S_FALSE;
- break;
+ else
+ {
+ res = (res1==S_FALSE) && (res2==S_FALSE);
+ done = TRUE;
}
if (res1==S_OK)
@@ -595,7 +587,7 @@ CompositeMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
if (res2==S_OK)
IMoniker_Release(tempMk2);
- }
+ } while (!done);
IEnumMoniker_Release(enumMoniker1);
IEnumMoniker_Release(enumMoniker2);
@@ -989,12 +981,12 @@ static VOID GetAfterCommonPrefix(IMoniker* pGenMk,IMoniker* commonMk,IMoniker**
nbRestMk++;
IMoniker_Release(tempMk1);
- IMoniker_Release(tempMk1);
+ IMoniker_Release(tempMk2);
break;
}
IMoniker_Release(tempMk1);
- IMoniker_Release(tempMk1);
+ IMoniker_Release(tempMk2);
}
}
else{
diff --git a/reactos/dll/win32/ole32/defaulthandler.c b/reactos/dll/win32/ole32/defaulthandler.c
index b85002ad52b..4102d50845b 100644
--- a/reactos/dll/win32/ole32/defaulthandler.c
+++ b/reactos/dll/win32/ole32/defaulthandler.c
@@ -137,6 +137,11 @@ struct DefaultHandler
/* storage passed to Load or InitNew */
IStorage *storage;
enum storage_state storage_state;
+
+ /* optional class factory for object */
+ IClassFactory *pCFObject;
+ /* TRUE if acting as an inproc server instead of an inproc handler */
+ BOOL inproc_server;
};
typedef struct DefaultHandler DefaultHandler;
@@ -223,6 +228,12 @@ static HRESULT WINAPI DefaultHandler_NDIUnknown_QueryInterface(
if (FAILED(hr)) FIXME("interface %s not implemented by data cache\n", debugstr_guid(riid));
return hr;
}
+ else if (This->inproc_server && This->pOleDelegate)
+ {
+ HRESULT hr = IUnknown_QueryInterface(This->pOleDelegate, riid, ppvObject);
+ if (SUCCEEDED(hr))
+ return hr;
+ }
/* Check that we obtained an interface. */
if (*ppvObject == NULL)
@@ -1901,7 +1912,9 @@ static const IPersistStorageVtbl DefaultHandler_IPersistStorage_VTable =
*/
static DefaultHandler* DefaultHandler_Construct(
REFCLSID clsid,
- LPUNKNOWN pUnkOuter)
+ LPUNKNOWN pUnkOuter,
+ DWORD flags,
+ IClassFactory *pCF)
{
DefaultHandler* This = NULL;
HRESULT hr;
@@ -1918,6 +1931,8 @@ static DefaultHandler* DefaultHandler_Construct(
This->lpvtblIAdviseSink = &DefaultHandler_IAdviseSink_VTable;
This->lpvtblIPersistStorage = &DefaultHandler_IPersistStorage_VTable;
+ This->inproc_server = (flags & EMBDHLP_INPROC_SERVER) ? TRUE : FALSE;
+
/*
* Start with one reference count. The caller of this function
* must release the interface pointer when it is done.
@@ -1964,6 +1979,30 @@ static DefaultHandler* DefaultHandler_Construct(
This->storage = NULL;
This->storage_state = storage_state_uninitialised;
+ if (This->inproc_server && !(flags & EMBDHLP_DELAYCREATE))
+ {
+ HRESULT hr;
+ This->pCFObject = NULL;
+ if (pCF)
+ hr = IClassFactory_CreateInstance(pCF, NULL, &IID_IOleObject, (void **)&This->pOleDelegate);
+ else
+ hr = CoCreateInstance(&This->clsid, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IOleObject, (void **)&This->pOleDelegate);
+ if (SUCCEEDED(hr))
+ hr = IOleObject_QueryInterface(This->pOleDelegate, &IID_IPersistStorage, (void **)&This->pPSDelegate);
+ if (SUCCEEDED(hr))
+ hr = IOleObject_QueryInterface(This->pOleDelegate, &IID_IDataObject, (void **)&This->pDataDelegate);
+ if (SUCCEEDED(hr))
+ This->object_state = object_state_running;
+ if (FAILED(hr))
+ WARN("object creation failed with error %08x\n", hr);
+ }
+ else
+ {
+ This->pCFObject = pCF;
+ if (pCF) IClassFactory_AddRef(pCF);
+ }
+
return This;
}
@@ -2011,22 +2050,30 @@ static void DefaultHandler_Destroy(
This->storage = NULL;
}
+ if (This->pCFObject)
+ {
+ IClassFactory_Release(This->pCFObject);
+ This->pCFObject = NULL;
+ }
+
HeapFree(GetProcessHeap(), 0, This);
}
/******************************************************************************
- * OleCreateDefaultHandler [OLE32.@]
+ * OleCreateEmbeddingHelper [OLE32.@]
*/
-HRESULT WINAPI OleCreateDefaultHandler(
+HRESULT WINAPI OleCreateEmbeddingHelper(
REFCLSID clsid,
LPUNKNOWN pUnkOuter,
+ DWORD flags,
+ IClassFactory *pCF,
REFIID riid,
LPVOID* ppvObj)
{
DefaultHandler* newHandler = NULL;
HRESULT hr = S_OK;
- TRACE("(%s, %p, %s, %p)\n", debugstr_guid(clsid), pUnkOuter, debugstr_guid(riid), ppvObj);
+ TRACE("(%s, %p, %08x, %p, %s, %p)\n", debugstr_guid(clsid), pUnkOuter, flags, pCF, debugstr_guid(riid), ppvObj);
if (!ppvObj)
return E_POINTER;
@@ -2045,7 +2092,7 @@ HRESULT WINAPI OleCreateDefaultHandler(
/*
* Try to construct a new instance of the class.
*/
- newHandler = DefaultHandler_Construct(clsid, pUnkOuter);
+ newHandler = DefaultHandler_Construct(clsid, pUnkOuter, flags, pCF);
if (!newHandler)
return E_OUTOFMEMORY;
@@ -2063,3 +2110,15 @@ HRESULT WINAPI OleCreateDefaultHandler(
return hr;
}
+
+
+/******************************************************************************
+ * OleCreateDefaultHandler [OLE32.@]
+ */
+HRESULT WINAPI OleCreateDefaultHandler(REFCLSID clsid, LPUNKNOWN pUnkOuter,
+ REFIID riid, LPVOID* ppvObj)
+{
+ TRACE("(%s, %p, %s, %p)\n", debugstr_guid(clsid), pUnkOuter,debugstr_guid(riid), ppvObj);
+ return OleCreateEmbeddingHelper(clsid, pUnkOuter, EMBDHLP_INPROC_HANDLER | EMBDHLP_CREATENOW,
+ NULL, riid, ppvObj);
+}
diff --git a/reactos/dll/win32/ole32/errorinfo.c b/reactos/dll/win32/ole32/errorinfo.c
index 64b81ff4dd2..f69635bc493 100644
--- a/reactos/dll/win32/ole32/errorinfo.c
+++ b/reactos/dll/win32/ole32/errorinfo.c
@@ -191,7 +191,7 @@ static HRESULT WINAPI IErrorInfoImpl_QueryInterface(
VOID** ppvoid)
{
ErrorInfoImpl *This = impl_from_IErrorInfo(iface);
- TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvoid);
+ TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppvoid);
*ppvoid = NULL;
diff --git a/reactos/dll/win32/ole32/ftmarshal.c b/reactos/dll/win32/ole32/ftmarshal.c
index f82410efe31..13802854fa6 100644
--- a/reactos/dll/win32/ole32/ftmarshal.c
+++ b/reactos/dll/win32/ole32/ftmarshal.c
@@ -110,7 +110,7 @@ FTMarshalImpl_QueryInterface (LPMARSHAL iface, REFIID riid, LPVOID * ppv)
FTMarshalImpl *This = impl_from_IMarshal(iface);
- TRACE ("(%p)->(\n\tIID:\t%s,%p)\n", This, debugstr_guid (riid), ppv);
+ TRACE ("(%p)->(%s,%p)\n", This, debugstr_guid (riid), ppv);
return IUnknown_QueryInterface (This->pUnkOuter, riid, ppv);
}
diff --git a/reactos/dll/win32/ole32/hglobalstream.c b/reactos/dll/win32/ole32/hglobalstream.c
index ff132ded213..c43d499bb4e 100644
--- a/reactos/dll/win32/ole32/hglobalstream.c
+++ b/reactos/dll/win32/ole32/hglobalstream.c
@@ -397,7 +397,7 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek(
*/
if (dlibMove.QuadPart < 0 && newPosition.QuadPart < -dlibMove.QuadPart) return STG_E_INVALIDFUNCTION;
- newPosition.QuadPart = RtlLargeIntegerAdd(newPosition.QuadPart, dlibMove.QuadPart);
+ newPosition.QuadPart += dlibMove.QuadPart;
if (plibNewPosition) *plibNewPosition = newPosition;
This->currentPosition = newPosition;
diff --git a/reactos/dll/win32/ole32/marshal.c b/reactos/dll/win32/ole32/marshal.c
index 006615320fc..3703de9f2b8 100644
--- a/reactos/dll/win32/ole32/marshal.c
+++ b/reactos/dll/win32/ole32/marshal.c
@@ -431,7 +431,7 @@ static HRESULT WINAPI Proxy_MarshalInterface(
if (SUCCEEDED(hr))
{
- TRACE("writing stdobjref:\n\tflags = %04x\n\tcPublicRefs = %d\n\toxid = %s\n\toid = %s\n\tipid = %s\n",
+ TRACE("writing stdobjref: flags = %04x cPublicRefs = %d oxid = %s oid = %s ipid = %s\n",
stdobjref.flags, stdobjref.cPublicRefs,
wine_dbgstr_longlong(stdobjref.oxid),
wine_dbgstr_longlong(stdobjref.oid),
@@ -1239,7 +1239,7 @@ static HRESULT unmarshal_object(const STDOBJREF *stdobjref, APARTMENT *apt,
assert(apt);
- TRACE("stdobjref:\n\tflags = %04x\n\tcPublicRefs = %d\n\toxid = %s\n\toid = %s\n\tipid = %s\n",
+ TRACE("stdobjref: flags = %04x cPublicRefs = %d oxid = %s oid = %s ipid = %s\n",
stdobjref->flags, stdobjref->cPublicRefs,
wine_dbgstr_longlong(stdobjref->oxid),
wine_dbgstr_longlong(stdobjref->oid),
diff --git a/reactos/dll/win32/ole32/moniker.c b/reactos/dll/win32/ole32/moniker.c
index 9ef82b5ff59..f65fe8fe728 100644
--- a/reactos/dll/win32/ole32/moniker.c
+++ b/reactos/dll/win32/ole32/moniker.c
@@ -1660,7 +1660,7 @@ HRESULT MonikerMarshal_Create(IMoniker *inner, IUnknown **outer)
return S_OK;
}
-void * __RPC_USER MIDL_user_allocate(size_t size)
+void * __RPC_USER MIDL_user_allocate(SIZE_T size)
{
return HeapAlloc(GetProcessHeap(), 0, size);
}
diff --git a/reactos/dll/win32/ole32/ole2.c b/reactos/dll/win32/ole32/ole2.c
index fe00066921e..3b87aacd6a6 100644
--- a/reactos/dll/win32/ole32/ole2.c
+++ b/reactos/dll/win32/ole32/ole2.c
@@ -570,7 +570,7 @@ HRESULT WINAPI OleQueryLinkFromData(
IDataObject* pSrcDataObject)
{
FIXME("(%p),stub!\n", pSrcDataObject);
- return S_OK;
+ return S_FALSE;
}
/***********************************************************************
diff --git a/reactos/dll/win32/ole32/ole2stubs.c b/reactos/dll/win32/ole32/ole2stubs.c
index 7c457047e57..b029a86ffe7 100644
--- a/reactos/dll/win32/ole32/ole2stubs.c
+++ b/reactos/dll/win32/ole32/ole2stubs.c
@@ -128,3 +128,12 @@ HRESULT WINAPI CoGetCallerTID(LPDWORD lpdwTID)
FIXME("stub!\n");
return E_NOTIMPL;
}
+
+/***********************************************************************
+ * CoGetCurrentLogicalThreadId [OLE32.@]
+ */
+HRESULT WINAPI CoGetCurrentLogicalThreadId(GUID *pguid)
+{
+ FIXME(": stub\n");
+ return E_NOTIMPL;
+}
diff --git a/reactos/dll/win32/ole32/ole32.spec b/reactos/dll/win32/ole32/ole32.spec
index 297f4397aee..f39dbb01550 100644
--- a/reactos/dll/win32/ole32/ole32.spec
+++ b/reactos/dll/win32/ole32/ole32.spec
@@ -25,7 +25,7 @@
@ stdcall CoGetCallerTID(ptr)
@ stdcall CoGetClassObject(ptr long ptr ptr ptr)
@ stdcall CoGetContextToken(ptr)
-@ stub CoGetCurrentLogicalThreadId
+@ stdcall CoGetCurrentLogicalThreadId(ptr)
@ stdcall CoGetCurrentProcess()
@ stub CoGetInstanceFromFile #@ stdcall (ptr ptr ptr long wstr long ptr) return 0,ERR_NOTIMPLEMENTED
@ stub CoGetInstanceFromIStorage #@ stdcall (ptr ptr ptr long ptr long ptr) return 0,ERR_NOTIMPLEMENTED
@@ -180,7 +180,7 @@
@ stub OleConvertOLESTREAMToIStorageEx
@ stdcall OleCreate(ptr ptr long ptr ptr ptr ptr)
@ stdcall OleCreateDefaultHandler(ptr ptr ptr ptr)
-@ stub OleCreateEmbeddingHelper
+@ stdcall OleCreateEmbeddingHelper(ptr ptr long ptr ptr ptr)
@ stub OleCreateEx
@ stdcall OleCreateFromData(ptr ptr long ptr ptr ptr ptr)
@ stdcall OleCreateFromDataEx(ptr ptr long long long ptr ptr ptr ptr ptr ptr ptr)
diff --git a/reactos/dll/win32/ole32/stg_prop.c b/reactos/dll/win32/ole32/stg_prop.c
index 381e0799e24..1c77c9e2d3c 100644
--- a/reactos/dll/win32/ole32/stg_prop.c
+++ b/reactos/dll/win32/ole32/stg_prop.c
@@ -977,7 +977,7 @@ static void PropertyStorage_ByteSwapString(LPWSTR str, size_t len)
* FIXME: alignment?
*/
for (i = 0; i < len; i++)
- str[i] = le16toh(str[i]);
+ str[i] = lendian16toh(str[i]);
}
#else
#define PropertyStorage_ByteSwapString(s, l)
@@ -1477,6 +1477,25 @@ static void PropertyStorage_MakePropertyIdOffset(DWORD propid, DWORD dwOffset,
offsetof(PROPERTYIDOFFSET, dwOffset), dwOffset);
}
+static inline HRESULT PropertStorage_WriteWStringToStream(IStream *stm,
+ LPCWSTR str, DWORD len, DWORD *written)
+{
+#ifdef WORDS_BIGENDIAN
+ WCHAR *leStr = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ HRESULT hr;
+
+ if (!leStr)
+ return E_OUTOFMEMORY;
+ memcpy(leStr, str, len * sizeof(WCHAR));
+ PropertyStorage_ByteSwapString(leStr, len);
+ hr = IStream_Write(stm, leStr, len, written);
+ HeapFree(GetProcessHeap(), 0, leStr);
+ return hr;
+#else
+ return IStream_Write(stm, str, len, written);
+#endif
+}
+
struct DictionaryClosure
{
HRESULT hr;
@@ -1508,15 +1527,11 @@ static BOOL PropertyStorage_DictionaryWriter(const void *key,
if (FAILED(c->hr))
goto end;
c->bytesWritten += sizeof(DWORD);
- /* Rather than allocate a copy, I'll swap the string to little-endian
- * in-place, write it, then swap it back.
- */
- PropertyStorage_ByteSwapString(key, keyLen);
- c->hr = IStream_Write(This->stm, key, keyLen, &count);
- PropertyStorage_ByteSwapString(key, keyLen);
+ c->hr = PropertStorage_WriteWStringToStream(This->stm, key, keyLen,
+ &count);
if (FAILED(c->hr))
goto end;
- c->bytesWritten += keyLen;
+ c->bytesWritten += keyLen * sizeof(WCHAR);
if (keyLen % sizeof(DWORD))
{
c->hr = IStream_Write(This->stm, &pad,
diff --git a/reactos/dll/win32/ole32/stg_stream.c b/reactos/dll/win32/ole32/stg_stream.c
index d0e06134ec1..79492a406c0 100644
--- a/reactos/dll/win32/ole32/stg_stream.c
+++ b/reactos/dll/win32/ole32/stg_stream.c
@@ -232,6 +232,7 @@ static void StgStreamImpl_OpenBlockChain(
{
This->smallBlockChain = SmallBlockChainStream_Construct(
This->parentStorage->ancestorStorage,
+ NULL,
This->ownerProperty);
}
else
@@ -521,7 +522,7 @@ static HRESULT WINAPI StgStreamImpl_Seek(
return STG_E_INVALIDFUNCTION;
}
- plibNewPosition->QuadPart = RtlLargeIntegerAdd( plibNewPosition->QuadPart, dlibMove.QuadPart );
+ plibNewPosition->QuadPart += dlibMove.QuadPart;
/*
* tell the caller what we calculated
@@ -536,8 +537,6 @@ static HRESULT WINAPI StgStreamImpl_Seek(
*
* It will change the size of a stream.
*
- * TODO: Switch from small blocks to big blocks and vice versa.
- *
* See the documentation of IStream for more info.
*/
static HRESULT WINAPI StgStreamImpl_SetSize(
@@ -575,6 +574,10 @@ static HRESULT WINAPI StgStreamImpl_SetSize(
return STG_E_ACCESSDENIED;
}
+ /* In simple mode keep the stream size above the small block limit */
+ if (This->parentStorage->ancestorStorage->base.openFlags & STGM_SIMPLE)
+ libNewSize.u.LowPart = max(libNewSize.u.LowPart, LIMIT_TO_USE_SMALL_BLOCK);
+
if (This->streamSize.u.LowPart == libNewSize.u.LowPart)
return S_OK;
@@ -587,6 +590,7 @@ static HRESULT WINAPI StgStreamImpl_SetSize(
{
This->smallBlockChain = SmallBlockChainStream_Construct(
This->parentStorage->ancestorStorage,
+ NULL,
This->ownerProperty);
}
else
@@ -620,6 +624,19 @@ static HRESULT WINAPI StgStreamImpl_SetSize(
&This->smallBlockChain);
}
}
+ else if ( (This->bigBlockChain!=0) &&
+ (curProperty.size.u.LowPart >= LIMIT_TO_USE_SMALL_BLOCK) )
+ {
+ if (libNewSize.u.LowPart < LIMIT_TO_USE_SMALL_BLOCK)
+ {
+ /*
+ * Transform the big block chain into a small block chain
+ */
+ This->smallBlockChain = Storage32Impl_BigBlocksToSmallBlocks(
+ This->parentStorage->ancestorStorage,
+ &This->bigBlockChain);
+ }
+ }
if (This->smallBlockChain!=0)
{
@@ -841,12 +858,18 @@ static HRESULT WINAPI StgStreamImpl_Stat(
if (readSuccessful)
{
+ StorageImpl *root = This->parentStorage->ancestorStorage;
+
StorageUtl_CopyPropertyToSTATSTG(pstatstg,
&curProperty,
grfStatFlag);
pstatstg->grfMode = This->grfMode;
+ /* In simple create mode cbSize is the current pos */
+ if((root->base.openFlags & STGM_SIMPLE) && root->create)
+ pstatstg->cbSize = This->currentPosition;
+
return S_OK;
}
diff --git a/reactos/dll/win32/ole32/storage32.c b/reactos/dll/win32/ole32/storage32.c
index 748eac8048a..6e3e1e1d978 100644
--- a/reactos/dll/win32/ole32/storage32.c
+++ b/reactos/dll/win32/ole32/storage32.c
@@ -104,6 +104,7 @@ static ULARGE_INTEGER BlockChainStream_GetSize(BlockChainStream* This);
static ULONG BlockChainStream_GetCount(BlockChainStream* This);
static ULARGE_INTEGER SmallBlockChainStream_GetSize(SmallBlockChainStream* This);
+static ULONG SmallBlockChainStream_GetHeadOfChain(SmallBlockChainStream* This);
static BOOL StorageImpl_WriteDWordToBigBlock( StorageImpl* This,
ULONG blockIndex, ULONG offset, DWORD value);
static BOOL StorageImpl_ReadDWordFromBigBlock( StorageImpl* This,
@@ -979,6 +980,10 @@ static HRESULT WINAPI StorageBaseImpl_CreateStream(
(grfMode & STGM_TRANSACTED))
return STG_E_INVALIDFUNCTION;
+ /* Can't create a stream on read-only storage */
+ if ( STGM_ACCESS_MODE( This->openFlags ) == STGM_READ )
+ return STG_E_ACCESSDENIED;
+
/*
* Check that we're compatible with the parent's storage mode
* if not in transacted mode
@@ -988,6 +993,9 @@ static HRESULT WINAPI StorageBaseImpl_CreateStream(
return STG_E_ACCESSDENIED;
}
+ if(This->ancestorStorage->base.openFlags & STGM_SIMPLE)
+ if(grfMode & STGM_CREATE) return STG_E_INVALIDFLAG;
+
/*
* Initialize the out parameter
*/
@@ -1226,8 +1234,13 @@ static HRESULT WINAPI StorageImpl_CreateStorage(
/*
* An element with this name already exists
*/
- if (STGM_CREATE_MODE(grfMode) == STGM_CREATE)
- IStorage_DestroyElement(iface, pwcsName);
+ if (STGM_CREATE_MODE(grfMode) == STGM_CREATE &&
+ STGM_ACCESS_MODE(This->base.openFlags) != STGM_READ)
+ {
+ hr = IStorage_DestroyElement(iface, pwcsName);
+ if (FAILED(hr))
+ return hr;
+ }
else
{
WARN("file already exists\n");
@@ -1792,6 +1805,9 @@ static HRESULT WINAPI StorageImpl_DestroyElement(
if (pwcsName==NULL)
return STG_E_INVALIDPOINTER;
+ if ( STGM_ACCESS_MODE( This->base.openFlags ) == STGM_READ )
+ return STG_E_ACCESSDENIED;
+
/*
* Create a property enumeration to search the property with the given name
*/
@@ -2383,7 +2399,7 @@ static HRESULT StorageImpl_Construct(
ILockBytes* pLkbyt,
DWORD openFlags,
BOOL fileBased,
- BOOL fileCreate)
+ BOOL create)
{
HRESULT hr = S_OK;
StgProperty currentProperty;
@@ -2395,19 +2411,13 @@ static HRESULT StorageImpl_Construct(
memset(This, 0, sizeof(StorageImpl));
- /*
- * Initialize stream list
- */
-
list_init(&This->base.strmHead);
- /*
- * Initialize the virtual function table.
- */
This->base.lpVtbl = &Storage32Impl_Vtbl;
This->base.pssVtbl = &IPropertySetStorage_Vtbl;
This->base.v_destructor = StorageImpl_Destroy;
This->base.openFlags = (openFlags & ~STGM_CREATE);
+ This->create = create;
/*
* This is the top-level storage so initialize the ancestor pointer
@@ -2415,14 +2425,8 @@ static HRESULT StorageImpl_Construct(
*/
This->base.ancestorStorage = This;
- /*
- * Initialize the physical support of the storage.
- */
This->hFile = hFile;
- /*
- * Store copy of file path.
- */
if(pwcsName) {
This->pwcsName = HeapAlloc(GetProcessHeap(), 0,
(lstrlenW(pwcsName)+1)*sizeof(WCHAR));
@@ -2445,7 +2449,7 @@ static HRESULT StorageImpl_Construct(
if (This->bigBlockFile == 0)
return E_FAIL;
- if (fileCreate)
+ if (create)
{
ULARGE_INTEGER size;
BYTE bigBlockBuffer[BIG_BLOCK_SIZE];
@@ -2526,7 +2530,7 @@ static HRESULT StorageImpl_Construct(
/*
* Write the root property (memory only)
*/
- if (fileCreate)
+ if (create)
{
StgProperty rootProp;
/*
@@ -3559,7 +3563,7 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks(
{
resRead = SmallBlockChainStream_ReadAt(*ppsbChain,
offset,
- This->smallBlockSize,
+ min(This->smallBlockSize, size.u.LowPart - offset.u.LowPart),
buffer,
&cbRead);
if (FAILED(resRead))
@@ -3578,14 +3582,18 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks(
if (FAILED(resWrite))
break;
- offset.u.LowPart += This->smallBlockSize;
+ offset.u.LowPart += cbRead;
}
} while (cbTotalRead.QuadPart < size.QuadPart);
HeapFree(GetProcessHeap(),0,buffer);
+ size.u.HighPart = 0;
+ size.u.LowPart = 0;
+
if (FAILED(resRead) || FAILED(resWrite))
{
ERR("conversion failed: resRead = 0x%08x, resWrite = 0x%08x\n", resRead, resWrite);
+ BlockChainStream_SetSize(bbTempChain, size);
BlockChainStream_Destroy(bbTempChain);
return NULL;
}
@@ -3594,8 +3602,6 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks(
* Destroy the small block chain.
*/
propertyIndex = (*ppsbChain)->ownerPropertyIndex;
- size.u.HighPart = 0;
- size.u.LowPart = 0;
SmallBlockChainStream_SetSize(*ppsbChain, size);
SmallBlockChainStream_Destroy(*ppsbChain);
*ppsbChain = 0;
@@ -3622,6 +3628,87 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks(
return bigBlockChain;
}
+/******************************************************************************
+ * Storage32Impl_BigBlocksToSmallBlocks
+ *
+ * This method will convert a big block chain to a small block chain.
+ * The big block chain will be destroyed on success.
+ */
+SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks(
+ StorageImpl* This,
+ BlockChainStream** ppbbChain)
+{
+ ULARGE_INTEGER size, offset, cbTotalRead;
+ ULONG cbRead, cbWritten, propertyIndex, sbHeadOfChain = BLOCK_END_OF_CHAIN;
+ HRESULT resWrite = S_OK, resRead;
+ StgProperty chainProperty;
+ BYTE* buffer;
+ SmallBlockChainStream* sbTempChain;
+
+ TRACE("%p %p\n", This, ppbbChain);
+
+ sbTempChain = SmallBlockChainStream_Construct(This, &sbHeadOfChain,
+ PROPERTY_NULL);
+
+ if(!sbTempChain)
+ return NULL;
+
+ size = BlockChainStream_GetSize(*ppbbChain);
+ SmallBlockChainStream_SetSize(sbTempChain, size);
+
+ offset.u.HighPart = 0;
+ offset.u.LowPart = 0;
+ cbTotalRead.QuadPart = 0;
+ buffer = HeapAlloc(GetProcessHeap(), 0, This->bigBlockSize);
+ do
+ {
+ resRead = BlockChainStream_ReadAt(*ppbbChain, offset,
+ min(This->bigBlockSize, size.u.LowPart - offset.u.LowPart),
+ buffer, &cbRead);
+
+ if(FAILED(resRead))
+ break;
+
+ if(cbRead > 0)
+ {
+ cbTotalRead.QuadPart += cbRead;
+
+ resWrite = SmallBlockChainStream_WriteAt(sbTempChain, offset,
+ cbRead, buffer, &cbWritten);
+
+ if(FAILED(resWrite))
+ break;
+
+ offset.u.LowPart += cbRead;
+ }
+ }while(cbTotalRead.QuadPart < size.QuadPart);
+ HeapFree(GetProcessHeap(), 0, buffer);
+
+ size.u.HighPart = 0;
+ size.u.LowPart = 0;
+
+ if(FAILED(resRead) || FAILED(resWrite))
+ {
+ ERR("conversion failed: resRead = 0x%08x, resWrite = 0x%08x\n", resRead, resWrite);
+ SmallBlockChainStream_SetSize(sbTempChain, size);
+ SmallBlockChainStream_Destroy(sbTempChain);
+ return NULL;
+ }
+
+ /* destroy the original big block chain */
+ propertyIndex = (*ppbbChain)->ownerPropertyIndex;
+ BlockChainStream_SetSize(*ppbbChain, size);
+ BlockChainStream_Destroy(*ppbbChain);
+ *ppbbChain = NULL;
+
+ StorageImpl_ReadProperty(This, propertyIndex, &chainProperty);
+ chainProperty.startingBlock = sbHeadOfChain;
+ StorageImpl_WriteProperty(This, propertyIndex, &chainProperty);
+
+ SmallBlockChainStream_Destroy(sbTempChain);
+ return SmallBlockChainStream_Construct(This, NULL, propertyIndex);
+}
+
static void StorageInternalImpl_Destroy( StorageBaseImpl *iface)
{
StorageInternalImpl* This = (StorageInternalImpl*) iface;
@@ -4574,7 +4661,6 @@ HRESULT BlockChainStream_ReadAt(BlockChainStream* This,
* BlockChainStream_WriteAt
*
* Writes the specified number of bytes to this chain at the specified offset.
- * bytesWritten may be NULL.
* Will fail if not all specified number of bytes have been written.
*/
HRESULT BlockChainStream_WriteAt(BlockChainStream* This,
@@ -4926,6 +5012,7 @@ static ULARGE_INTEGER BlockChainStream_GetSize(BlockChainStream* This)
SmallBlockChainStream* SmallBlockChainStream_Construct(
StorageImpl* parentStorage,
+ ULONG* headOfStreamPlaceHolder,
ULONG propertyIndex)
{
SmallBlockChainStream* newStream;
@@ -4933,6 +5020,7 @@ SmallBlockChainStream* SmallBlockChainStream_Construct(
newStream = HeapAlloc(GetProcessHeap(), 0, sizeof(SmallBlockChainStream));
newStream->parentStorage = parentStorage;
+ newStream->headOfStreamPlaceHolder = headOfStreamPlaceHolder;
newStream->ownerPropertyIndex = propertyIndex;
return newStream;
@@ -4955,6 +5043,9 @@ static ULONG SmallBlockChainStream_GetHeadOfChain(
StgProperty chainProperty;
BOOL readSuccessful;
+ if (This->headOfStreamPlaceHolder != NULL)
+ return *(This->headOfStreamPlaceHolder);
+
if (This->ownerPropertyIndex)
{
readSuccessful = StorageImpl_ReadProperty(
@@ -5317,7 +5408,6 @@ HRESULT SmallBlockChainStream_ReadAt(
* SmallBlockChainStream_WriteAt
*
* Writes the specified number of bytes to this chain at the specified offset.
- * bytesWritten may be NULL.
* Will fail if not all specified number of bytes have been written.
*/
HRESULT SmallBlockChainStream_WriteAt(
@@ -5357,9 +5447,6 @@ HRESULT SmallBlockChainStream_WriteAt(
/*
* Start writing the buffer.
- *
- * Here, I'm casting away the constness on the buffer variable
- * This is OK since we don't intend to modify that buffer.
*/
*bytesWritten = 0;
bufferWalker = buffer;
@@ -5506,26 +5593,32 @@ static BOOL SmallBlockChainStream_Enlarge(
blockIndex = SmallBlockChainStream_GetHeadOfChain(This);
/*
- * Empty chain
+ * Empty chain. Create the head.
*/
if (blockIndex == BLOCK_END_OF_CHAIN)
{
-
- StgProperty chainProp;
-
- StorageImpl_ReadProperty(This->parentStorage, This->ownerPropertyIndex,
- &chainProp);
-
- chainProp.startingBlock = SmallBlockChainStream_GetNextFreeBlock(This);
-
- StorageImpl_WriteProperty(This->parentStorage, This->ownerPropertyIndex,
- &chainProp);
-
- blockIndex = chainProp.startingBlock;
+ blockIndex = SmallBlockChainStream_GetNextFreeBlock(This);
SmallBlockChainStream_SetNextBlockInChain(
- This,
- blockIndex,
- BLOCK_END_OF_CHAIN);
+ This,
+ blockIndex,
+ BLOCK_END_OF_CHAIN);
+
+ if (This->headOfStreamPlaceHolder != NULL)
+ {
+ *(This->headOfStreamPlaceHolder) = blockIndex;
+ }
+ else
+ {
+ StgProperty chainProp;
+
+ StorageImpl_ReadProperty(This->parentStorage, This->ownerPropertyIndex,
+ &chainProp);
+
+ chainProp.startingBlock = blockIndex;
+
+ StorageImpl_WriteProperty(This->parentStorage, This->ownerPropertyIndex,
+ &chainProp);
+ }
}
currentBlock = blockIndex;
@@ -5600,6 +5693,32 @@ BOOL SmallBlockChainStream_SetSize(
return TRUE;
}
+/******************************************************************************
+ * SmallBlockChainStream_GetCount
+ *
+ * Returns the number of small blocks that comprises this chain.
+ * This is not the size of the stream as the last block may not be full!
+ *
+ */
+static ULONG SmallBlockChainStream_GetCount(SmallBlockChainStream* This)
+{
+ ULONG blockIndex;
+ ULONG count = 0;
+
+ blockIndex = SmallBlockChainStream_GetHeadOfChain(This);
+
+ while(blockIndex != BLOCK_END_OF_CHAIN)
+ {
+ count++;
+
+ if(FAILED(SmallBlockChainStream_GetNextBlockInChain(This,
+ blockIndex, &blockIndex)))
+ return 0;
+ }
+
+ return count;
+}
+
/******************************************************************************
* SmallBlockChainStream_GetSize
*
@@ -5609,6 +5728,17 @@ static ULARGE_INTEGER SmallBlockChainStream_GetSize(SmallBlockChainStream* This)
{
StgProperty chainProperty;
+ if(This->headOfStreamPlaceHolder != NULL)
+ {
+ ULARGE_INTEGER result;
+ result.u.HighPart = 0;
+
+ result.u.LowPart = SmallBlockChainStream_GetCount(This) *
+ This->parentStorage->smallBlockSize;
+
+ return result;
+ }
+
StorageImpl_ReadProperty(
This->parentStorage,
This->ownerPropertyIndex,
@@ -5788,7 +5918,7 @@ HRESULT WINAPI StgCreateDocfile(
*/
hr = StorageBaseImpl_QueryInterface(
(IStorage*)newStorage,
- (REFIID)&IID_IStorage,
+ &IID_IStorage,
(void**)ppstgOpen);
end:
TRACE("<-- %p r = %08x\n", *ppstgOpen, hr);
@@ -6092,7 +6222,7 @@ HRESULT WINAPI StgOpenStorage(
*/
hr = StorageBaseImpl_QueryInterface(
(IStorage*)newStorage,
- (REFIID)&IID_IStorage,
+ &IID_IStorage,
(void**)ppstgOpen);
end:
@@ -6146,7 +6276,7 @@ HRESULT WINAPI StgCreateDocfileOnILockBytes(
*/
hr = StorageBaseImpl_QueryInterface(
(IStorage*)newStorage,
- (REFIID)&IID_IStorage,
+ &IID_IStorage,
(void**)ppstgOpen);
return hr;
@@ -6211,7 +6341,7 @@ HRESULT WINAPI StgOpenStorageOnILockBytes(
*/
hr = StorageBaseImpl_QueryInterface(
(IStorage*)newStorage,
- (REFIID)&IID_IStorage,
+ &IID_IStorage,
(void**)ppstgOpen);
return hr;
@@ -7063,9 +7193,9 @@ static HRESULT STORAGE_WriteCompObj( LPSTORAGE pstg, CLSID *clsid,
debugstr_w(lpszUserType), debugstr_w(szClipName),
debugstr_w(szProgIDName));
- /* Create a CompObj stream if it doesn't exist */
+ /* Create a CompObj stream */
r = IStorage_CreateStream(pstg, szwStreamName,
- STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pstm );
+ STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pstm );
if( FAILED (r) )
return r;
diff --git a/reactos/dll/win32/ole32/storage32.h b/reactos/dll/win32/ole32/storage32.h
index 1e42afb69a8..fc4af325552 100644
--- a/reactos/dll/win32/ole32/storage32.h
+++ b/reactos/dll/win32/ole32/storage32.h
@@ -255,6 +255,8 @@ struct StorageImpl
*/
HANDLE hFile; /* Physical support for the Docfile */
LPOLESTR pwcsName; /* Full path of the document file */
+ BOOL create; /* Was the storage created or opened.
+ The behaviour of STGM_SIMPLE depends on this */
/* FIXME: should this be in Storage32BaseImpl ? */
WCHAR filename[PROPERTY_NAME_BUFFER_LEN];
@@ -304,6 +306,10 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks(
StorageImpl* This,
SmallBlockChainStream** ppsbChain);
+SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks(
+ StorageImpl* This,
+ BlockChainStream** ppbbChain);
+
/****************************************************************************
* StgStreamImpl definitions.
*
@@ -462,14 +468,16 @@ struct SmallBlockChainStream
{
StorageImpl* parentStorage;
ULONG ownerPropertyIndex;
+ ULONG* headOfStreamPlaceHolder;
};
/*
* Methods of the SmallBlockChainStream class.
*/
SmallBlockChainStream* SmallBlockChainStream_Construct(
- StorageImpl* parentStorage,
- ULONG propertyIndex);
+ StorageImpl* parentStorage,
+ ULONG* headOfStreamPlaceHolder,
+ ULONG propertyIndex);
void SmallBlockChainStream_Destroy(
SmallBlockChainStream* This);
diff --git a/reactos/dll/win32/ole32/stubmanager.c b/reactos/dll/win32/ole32/stubmanager.c
index 0aa80fa15a8..12813c6a5d7 100644
--- a/reactos/dll/win32/ole32/stubmanager.c
+++ b/reactos/dll/win32/ole32/stubmanager.c
@@ -42,8 +42,129 @@
WINE_DEFAULT_DEBUG_CHANNEL(ole);
-static void stub_manager_delete_ifstub(struct stub_manager *m, struct ifstub *ifstub);
-static struct ifstub *stub_manager_ipid_to_ifstub(struct stub_manager *m, const IPID *ipid);
+
+/* generates an ipid in the following format (similar to native version):
+ * Data1 = apartment-local ipid counter
+ * Data2 = apartment creator thread ID
+ * Data3 = process ID
+ * Data4 = random value
+ */
+static inline HRESULT generate_ipid(struct stub_manager *m, IPID *ipid)
+{
+ HRESULT hr;
+ hr = UuidCreate(ipid);
+ if (FAILED(hr))
+ {
+ ERR("couldn't create IPID for stub manager %p\n", m);
+ UuidCreateNil(ipid);
+ return hr;
+ }
+
+ ipid->Data1 = InterlockedIncrement(&m->apt->ipidc);
+ ipid->Data2 = (USHORT)m->apt->tid;
+ ipid->Data3 = (USHORT)GetCurrentProcessId();
+ return S_OK;
+}
+
+/* registers a new interface stub COM object with the stub manager and returns registration record */
+struct ifstub *stub_manager_new_ifstub(struct stub_manager *m, IRpcStubBuffer *sb, IUnknown *iptr, REFIID iid, MSHLFLAGS flags)
+{
+ struct ifstub *stub;
+ HRESULT hr;
+
+ TRACE("oid=%s, stubbuffer=%p, iptr=%p, iid=%s\n",
+ wine_dbgstr_longlong(m->oid), sb, iptr, debugstr_guid(iid));
+
+ stub = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct ifstub));
+ if (!stub) return NULL;
+
+ hr = RPC_CreateServerChannel(&stub->chan);
+ if (hr != S_OK)
+ {
+ HeapFree(GetProcessHeap(), 0, stub);
+ return NULL;
+ }
+
+ stub->stubbuffer = sb;
+ if (sb) IRpcStubBuffer_AddRef(sb);
+
+ IUnknown_AddRef(iptr);
+ stub->iface = iptr;
+ stub->flags = flags;
+ stub->iid = *iid;
+
+ /* FIXME: find a cleaner way of identifying that we are creating an ifstub
+ * for the remunknown interface */
+ if (flags & MSHLFLAGSP_REMUNKNOWN)
+ stub->ipid = m->oxid_info.ipidRemUnknown;
+ else
+ generate_ipid(m, &stub->ipid);
+
+ EnterCriticalSection(&m->lock);
+ list_add_head(&m->ifstubs, &stub->entry);
+ /* every normal marshal is counted so we don't allow more than we should */
+ if (flags & MSHLFLAGS_NORMAL) m->norm_refs++;
+ LeaveCriticalSection(&m->lock);
+
+ TRACE("ifstub %p created with ipid %s\n", stub, debugstr_guid(&stub->ipid));
+
+ return stub;
+}
+
+static void stub_manager_delete_ifstub(struct stub_manager *m, struct ifstub *ifstub)
+{
+ TRACE("m=%p, m->oid=%s, ipid=%s\n", m, wine_dbgstr_longlong(m->oid), debugstr_guid(&ifstub->ipid));
+
+ list_remove(&ifstub->entry);
+
+ RPC_UnregisterInterface(&ifstub->iid);
+
+ if (ifstub->stubbuffer) IUnknown_Release(ifstub->stubbuffer);
+ IUnknown_Release(ifstub->iface);
+ IRpcChannelBuffer_Release(ifstub->chan);
+
+ HeapFree(GetProcessHeap(), 0, ifstub);
+}
+
+static struct ifstub *stub_manager_ipid_to_ifstub(struct stub_manager *m, const IPID *ipid)
+{
+ struct list *cursor;
+ struct ifstub *result = NULL;
+
+ EnterCriticalSection(&m->lock);
+ LIST_FOR_EACH( cursor, &m->ifstubs )
+ {
+ struct ifstub *ifstub = LIST_ENTRY( cursor, struct ifstub, entry );
+
+ if (IsEqualGUID(ipid, &ifstub->ipid))
+ {
+ result = ifstub;
+ break;
+ }
+ }
+ LeaveCriticalSection(&m->lock);
+
+ return result;
+}
+
+struct ifstub *stub_manager_find_ifstub(struct stub_manager *m, REFIID iid, MSHLFLAGS flags)
+{
+ struct ifstub *result = NULL;
+ struct ifstub *ifstub;
+
+ EnterCriticalSection(&m->lock);
+ LIST_FOR_EACH_ENTRY( ifstub, &m->ifstubs, struct ifstub, entry )
+ {
+ if (IsEqualIID(iid, &ifstub->iid) && (ifstub->flags == flags))
+ {
+ result = ifstub;
+ break;
+ }
+ }
+ LeaveCriticalSection(&m->lock);
+
+ return result;
+}
/* creates a new stub manager and adds it into the apartment. caller must
* release stub manager when it is no longer required. the apartment and
@@ -129,6 +250,44 @@ static void stub_manager_delete(struct stub_manager *m)
HeapFree(GetProcessHeap(), 0, m);
}
+/* increments the internal refcount */
+static ULONG stub_manager_int_addref(struct stub_manager *This)
+{
+ ULONG refs;
+
+ EnterCriticalSection(&This->apt->cs);
+ refs = ++This->refs;
+ LeaveCriticalSection(&This->apt->cs);
+
+ TRACE("before %d\n", refs - 1);
+
+ return refs;
+}
+
+/* decrements the internal refcount */
+ULONG stub_manager_int_release(struct stub_manager *This)
+{
+ ULONG refs;
+ APARTMENT *apt = This->apt;
+
+ EnterCriticalSection(&apt->cs);
+ refs = --This->refs;
+
+ TRACE("after %d\n", refs);
+
+ /* remove from apartment so no other thread can access it... */
+ if (!refs)
+ list_remove(&This->entry);
+
+ LeaveCriticalSection(&apt->cs);
+
+ /* ... so now we can delete it without being inside the apartment critsec */
+ if (!refs)
+ stub_manager_delete(This);
+
+ return refs;
+}
+
/* gets the stub manager associated with an object - caller must have
* a reference to the apartment while a reference to the stub manager is held.
* it must also call release on the stub manager when it is no longer needed */
@@ -214,44 +373,6 @@ struct stub_manager *get_stub_manager(APARTMENT *apt, OID oid)
return result;
}
-/* increments the internal refcount */
-ULONG stub_manager_int_addref(struct stub_manager *This)
-{
- ULONG refs;
-
- EnterCriticalSection(&This->apt->cs);
- refs = ++This->refs;
- LeaveCriticalSection(&This->apt->cs);
-
- TRACE("before %d\n", refs - 1);
-
- return refs;
-}
-
-/* decrements the internal refcount */
-ULONG stub_manager_int_release(struct stub_manager *This)
-{
- ULONG refs;
- APARTMENT *apt = This->apt;
-
- EnterCriticalSection(&apt->cs);
- refs = --This->refs;
-
- TRACE("after %d\n", refs);
-
- /* remove from apartment so no other thread can access it... */
- if (!refs)
- list_remove(&This->entry);
-
- LeaveCriticalSection(&apt->cs);
-
- /* ... so now we can delete it without being inside the apartment critsec */
- if (!refs)
- stub_manager_delete(This);
-
- return refs;
-}
-
/* add some external references (ie from a client that unmarshaled an ifptr) */
ULONG stub_manager_ext_addref(struct stub_manager *m, ULONG refs, BOOL tableweak)
{
@@ -297,46 +418,6 @@ ULONG stub_manager_ext_release(struct stub_manager *m, ULONG refs, BOOL tablewea
return rc;
}
-static struct ifstub *stub_manager_ipid_to_ifstub(struct stub_manager *m, const IPID *ipid)
-{
- struct list *cursor;
- struct ifstub *result = NULL;
-
- EnterCriticalSection(&m->lock);
- LIST_FOR_EACH( cursor, &m->ifstubs )
- {
- struct ifstub *ifstub = LIST_ENTRY( cursor, struct ifstub, entry );
-
- if (IsEqualGUID(ipid, &ifstub->ipid))
- {
- result = ifstub;
- break;
- }
- }
- LeaveCriticalSection(&m->lock);
-
- return result;
-}
-
-struct ifstub *stub_manager_find_ifstub(struct stub_manager *m, REFIID iid, MSHLFLAGS flags)
-{
- struct ifstub *result = NULL;
- struct ifstub *ifstub;
-
- EnterCriticalSection(&m->lock);
- LIST_FOR_EACH_ENTRY( ifstub, &m->ifstubs, struct ifstub, entry )
- {
- if (IsEqualIID(iid, &ifstub->iid) && (ifstub->flags == flags))
- {
- result = ifstub;
- break;
- }
- }
- LeaveCriticalSection(&m->lock);
-
- return result;
-}
-
/* gets the stub manager associated with an ipid - caller must have
* a reference to the apartment while a reference to the stub manager is held.
* it must also call release on the stub manager when it is no longer needed */
@@ -426,89 +507,6 @@ HRESULT ipid_get_dispatch_params(const IPID *ipid, APARTMENT **stub_apt,
}
}
-/* generates an ipid in the following format (similar to native version):
- * Data1 = apartment-local ipid counter
- * Data2 = apartment creator thread ID
- * Data3 = process ID
- * Data4 = random value
- */
-static inline HRESULT generate_ipid(struct stub_manager *m, IPID *ipid)
-{
- HRESULT hr;
- hr = UuidCreate(ipid);
- if (FAILED(hr))
- {
- ERR("couldn't create IPID for stub manager %p\n", m);
- UuidCreateNil(ipid);
- return hr;
- }
-
- ipid->Data1 = InterlockedIncrement(&m->apt->ipidc);
- ipid->Data2 = (USHORT)m->apt->tid;
- ipid->Data3 = (USHORT)GetCurrentProcessId();
- return S_OK;
-}
-
-/* registers a new interface stub COM object with the stub manager and returns registration record */
-struct ifstub *stub_manager_new_ifstub(struct stub_manager *m, IRpcStubBuffer *sb, IUnknown *iptr, REFIID iid, MSHLFLAGS flags)
-{
- struct ifstub *stub;
- HRESULT hr;
-
- TRACE("oid=%s, stubbuffer=%p, iptr=%p, iid=%s\n",
- wine_dbgstr_longlong(m->oid), sb, iptr, debugstr_guid(iid));
-
- stub = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct ifstub));
- if (!stub) return NULL;
-
- hr = RPC_CreateServerChannel(&stub->chan);
- if (hr != S_OK)
- {
- HeapFree(GetProcessHeap(), 0, stub);
- return NULL;
- }
-
- stub->stubbuffer = sb;
- if (sb) IRpcStubBuffer_AddRef(sb);
-
- IUnknown_AddRef(iptr);
- stub->iface = iptr;
- stub->flags = flags;
- stub->iid = *iid;
-
- /* FIXME: find a cleaner way of identifying that we are creating an ifstub
- * for the remunknown interface */
- if (flags & MSHLFLAGSP_REMUNKNOWN)
- stub->ipid = m->oxid_info.ipidRemUnknown;
- else
- generate_ipid(m, &stub->ipid);
-
- EnterCriticalSection(&m->lock);
- list_add_head(&m->ifstubs, &stub->entry);
- /* every normal marshal is counted so we don't allow more than we should */
- if (flags & MSHLFLAGS_NORMAL) m->norm_refs++;
- LeaveCriticalSection(&m->lock);
-
- TRACE("ifstub %p created with ipid %s\n", stub, debugstr_guid(&stub->ipid));
-
- return stub;
-}
-
-static void stub_manager_delete_ifstub(struct stub_manager *m, struct ifstub *ifstub)
-{
- TRACE("m=%p, m->oid=%s, ipid=%s\n", m, wine_dbgstr_longlong(m->oid), debugstr_guid(&ifstub->ipid));
-
- list_remove(&ifstub->entry);
-
- RPC_UnregisterInterface(&ifstub->iid);
-
- if (ifstub->stubbuffer) IUnknown_Release(ifstub->stubbuffer);
- IUnknown_Release(ifstub->iface);
- IRpcChannelBuffer_Release(ifstub->chan);
-
- HeapFree(GetProcessHeap(), 0, ifstub);
-}
-
/* returns TRUE if it is possible to unmarshal, FALSE otherwise. */
BOOL stub_manager_notify_unmarshal(struct stub_manager *m, const IPID *ipid)
{
diff --git a/reactos/dll/win32/ole32/usrmarshal.c b/reactos/dll/win32/ole32/usrmarshal.c
index 46fba8b9213..f180f42f8ca 100644
--- a/reactos/dll/win32/ole32/usrmarshal.c
+++ b/reactos/dll/win32/ole32/usrmarshal.c
@@ -307,7 +307,7 @@ static unsigned char * handle_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffe
RemotableHandle *remhandle = (RemotableHandle *)pBuffer;
if (remhandle->fContext != WDT_INPROC_CALL)
RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
- *handle = (HANDLE)remhandle->u.hInproc;
+ *handle = (HANDLE)(LONG_PTR)remhandle->u.hInproc;
return pBuffer + sizeof(RemotableHandle);
}
diff --git a/reactos/dll/win32/oleacc/main.c b/reactos/dll/win32/oleacc/main.c
index 0e7b78e8a08..34bdb61bcde 100644
--- a/reactos/dll/win32/oleacc/main.c
+++ b/reactos/dll/win32/oleacc/main.c
@@ -40,6 +40,12 @@ HRESULT WINAPI CreateStdAccessibleObject( HWND hwnd, LONG idObject,
return E_NOTIMPL;
}
+HRESULT WINAPI ObjectFromLresult( LRESULT result, REFIID riid, WPARAM wParam, void **ppObject )
+{
+ FIXME("%ld %s %ld %p\n", result, debugstr_guid(riid), wParam, ppObject );
+ return E_NOTIMPL;
+}
+
LRESULT WINAPI LresultFromObject( REFIID riid, WPARAM wParam, LPUNKNOWN pAcc )
{
FIXME("%s %ld %p\n", debugstr_guid(riid), wParam, pAcc );
diff --git a/reactos/dll/win32/oleacc/oleacc.spec b/reactos/dll/win32/oleacc/oleacc.spec
index 2736a3d6070..6ace5424f1c 100644
--- a/reactos/dll/win32/oleacc/oleacc.spec
+++ b/reactos/dll/win32/oleacc/oleacc.spec
@@ -16,5 +16,5 @@
@ stub IID_IAccessibleHandler
@ stub LIBID_Accessibility
@ stdcall LresultFromObject(ptr long ptr)
-@ stub ObjectFromLresult
+@ stdcall ObjectFromLresult(long ptr long ptr)
@ stub WindowFromAccessibleObject
diff --git a/reactos/dll/win32/oleaut32/oleaut32.rbuild b/reactos/dll/win32/oleaut32/oleaut32.rbuild
index 5d5c1846f70..f3b3b5c3764 100644
--- a/reactos/dll/win32/oleaut32/oleaut32.rbuild
+++ b/reactos/dll/win32/oleaut32/oleaut32.rbuild
@@ -15,6 +15,7 @@
OLEAUTPS_
+ /FIwine/typeof.h
connpt.c
dispatch.c
hash.c
@@ -38,6 +39,7 @@
.
oleaut32_proxy
wine
+ windowscodecs
wineldr
ole32
rpcrt4
diff --git a/reactos/dll/win32/oleaut32/olefont.c b/reactos/dll/win32/oleaut32/olefont.c
index 3e008443ff7..a9b2c047abf 100644
--- a/reactos/dll/win32/oleaut32/olefont.c
+++ b/reactos/dll/win32/oleaut32/olefont.c
@@ -132,8 +132,8 @@ struct OLEFontImpl
/*
* Size ratio
*/
- long cyLogical;
- long cyHimetric;
+ LONG cyLogical;
+ LONG cyHimetric;
IConnectionPoint *pPropertyNotifyCP;
IConnectionPoint *pFontEventsCP;
diff --git a/reactos/dll/win32/oleaut32/olepicture.c b/reactos/dll/win32/oleaut32/olepicture.c
index adaad97def6..052aa9a37f4 100644
--- a/reactos/dll/win32/oleaut32/olepicture.c
+++ b/reactos/dll/win32/oleaut32/olepicture.c
@@ -46,25 +46,6 @@
#include
#include
-#ifdef SONAME_LIBJPEG
-/* This is a hack, so jpeglib.h does not redefine INT32 and the like*/
-#define XMD_H
-#define UINT8 JPEG_UINT8
-#define UINT16 JPEG_UINT16
-#define boolean jpeg_boolean
-# include
-#undef UINT8
-#undef UINT16
-#undef boolean
-#endif
-
-#ifdef HAVE_PNG_H
-#include
-#endif
-
-/* Must be before wine includes, the header has things conflicting with
- * WINE headers.
- */
#define COBJMACROS
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
@@ -79,12 +60,11 @@
#include "oleauto.h"
#include "connpt.h"
#include "urlmon.h"
+#include "wincodec.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "wine/library.h"
-#include "ungif.h"
-
WINE_DEFAULT_DEBUG_CHANNEL(ole);
#include "pshpack1.h"
@@ -1000,383 +980,6 @@ static HRESULT WINAPI OLEPictureImpl_IsDirty(
return E_NOTIMPL;
}
-#ifdef SONAME_LIBJPEG
-
-static void *libjpeg_handle;
-#define MAKE_FUNCPTR(f) static typeof(f) * p##f
-MAKE_FUNCPTR(jpeg_std_error);
-MAKE_FUNCPTR(jpeg_CreateDecompress);
-MAKE_FUNCPTR(jpeg_read_header);
-MAKE_FUNCPTR(jpeg_start_decompress);
-MAKE_FUNCPTR(jpeg_read_scanlines);
-MAKE_FUNCPTR(jpeg_finish_decompress);
-MAKE_FUNCPTR(jpeg_destroy_decompress);
-#undef MAKE_FUNCPTR
-
-static void *load_libjpeg(void)
-{
- if((libjpeg_handle = wine_dlopen(SONAME_LIBJPEG, RTLD_NOW, NULL, 0)) != NULL) {
-
-#define LOAD_FUNCPTR(f) \
- if((p##f = wine_dlsym(libjpeg_handle, #f, NULL, 0)) == NULL) { \
- libjpeg_handle = NULL; \
- return NULL; \
- }
-
- LOAD_FUNCPTR(jpeg_std_error);
- LOAD_FUNCPTR(jpeg_CreateDecompress);
- LOAD_FUNCPTR(jpeg_read_header);
- LOAD_FUNCPTR(jpeg_start_decompress);
- LOAD_FUNCPTR(jpeg_read_scanlines);
- LOAD_FUNCPTR(jpeg_finish_decompress);
- LOAD_FUNCPTR(jpeg_destroy_decompress);
-#undef LOAD_FUNCPTR
- }
- return libjpeg_handle;
-}
-
-/* for the jpeg decompressor source manager. */
-static void _jpeg_init_source(j_decompress_ptr cinfo) { }
-
-static jpeg_boolean _jpeg_fill_input_buffer(j_decompress_ptr cinfo) {
- ERR("(), should not get here.\n");
- return FALSE;
-}
-
-static void _jpeg_skip_input_data(j_decompress_ptr cinfo,long num_bytes) {
- TRACE("Skipping %ld bytes...\n", num_bytes);
- cinfo->src->next_input_byte += num_bytes;
- cinfo->src->bytes_in_buffer -= num_bytes;
-}
-
-static jpeg_boolean _jpeg_resync_to_restart(j_decompress_ptr cinfo, int desired) {
- ERR("(desired=%d), should not get here.\n",desired);
- return FALSE;
-}
-static void _jpeg_term_source(j_decompress_ptr cinfo) { }
-#endif /* SONAME_LIBJPEG */
-
-struct gifdata {
- unsigned char *data;
- unsigned int curoff;
- unsigned int len;
-};
-
-static int _gif_inputfunc(GifFileType *gif, GifByteType *data, int len) {
- struct gifdata *gd = gif->UserData;
-
- if (len+gd->curoff > gd->len) {
- ERR("Trying to read %d bytes, but only %d available.\n",len, gd->len-gd->curoff);
- len = gd->len - gd->curoff;
- }
- memcpy(data, gd->data+gd->curoff, len);
- gd->curoff += len;
- return len;
-}
-
-
-static HRESULT OLEPictureImpl_LoadGif(OLEPictureImpl *This, BYTE *xbuf, ULONG xread)
-{
- struct gifdata gd;
- GifFileType *gif;
- BITMAPINFO *bmi;
- HDC hdcref;
- LPBYTE bytes;
- int i,j,ret;
- GifImageDesc *gid;
- SavedImage *si;
- ColorMapObject *cm;
- int transparent = -1;
- ExtensionBlock *eb;
- int padding;
-
- gd.data = xbuf;
- gd.curoff = 0;
- gd.len = xread;
- gif = DGifOpen((void*)&gd, _gif_inputfunc);
- ret = DGifSlurp(gif);
- if (ret == GIF_ERROR) {
- ERR("Failed reading GIF using libgif.\n");
- return E_FAIL;
- }
- TRACE("screen height %d, width %d\n", gif->SWidth, gif->SHeight);
- TRACE("color res %d, backgcolor %d\n", gif->SColorResolution, gif->SBackGroundColor);
- TRACE("imgcnt %d\n", gif->ImageCount);
- if (gif->ImageCount<1) {
- ERR("GIF stream does not have images inside?\n");
- return E_FAIL;
- }
- TRACE("curimage: %d x %d, on %dx%d, interlace %d\n",
- gif->Image.Width, gif->Image.Height,
- gif->Image.Left, gif->Image.Top,
- gif->Image.Interlace
- );
- /* */
- padding = (gif->SWidth+3) & ~3;
- si = gif->SavedImages+0;
- gid = &(si->ImageDesc);
- cm = gid->ColorMap;
- if (!cm) cm = gif->SColorMap;
- bmi = HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+(cm->ColorCount)*sizeof(RGBQUAD));
- bytes= HeapAlloc(GetProcessHeap(),0,padding*gif->SHeight);
-
- /* look for the transparent color extension */
- for (i = 0; i < si->ExtensionBlockCount; ++i) {
- eb = si->ExtensionBlocks + i;
- if (eb->Function == 0xF9 && eb->ByteCount == 4) {
- if ((eb->Bytes[0] & 1) == 1) {
- transparent = (unsigned char)eb->Bytes[3];
- }
- }
- }
-
- for (i = 0; i < cm->ColorCount; i++) {
- bmi->bmiColors[i].rgbRed = cm->Colors[i].Red;
- bmi->bmiColors[i].rgbGreen = cm->Colors[i].Green;
- bmi->bmiColors[i].rgbBlue = cm->Colors[i].Blue;
- if (i == transparent) {
- This->rgbTrans = RGB(bmi->bmiColors[i].rgbRed,
- bmi->bmiColors[i].rgbGreen,
- bmi->bmiColors[i].rgbBlue);
- }
- }
-
- /* Map to in picture coordinates */
- for (i = 0, j = 0; i < gid->Height; i++) {
- if (gif->Image.Interlace) {
- memcpy(
- bytes + (gid->Top + j) * padding + gid->Left,
- si->RasterBits + i * gid->Width,
- gid->Width);
-
- /* Lower bits of interlaced counter encode current interlace */
- if (j & 1) j += 2; /* Currently filling odd rows */
- else if (j & 2) j += 4; /* Currently filling even rows not multiples of 4 */
- else j += 8; /* Currently filling every 8th row or 4th row in-between */
-
- if (j >= gid->Height && i < gid->Height && (j & 1) == 0) {
- /* End of current interlace, go to next interlace */
- if (j & 2) j = 1; /* Next iteration fills odd rows */
- else if (j & 4) j = 2; /* Next iteration fills even rows not mod 4 and not mod 8 */
- else j = 4; /* Next iteration fills rows in-between rows mod 6 */
- }
- } else {
- memcpy(
- bytes + (gid->Top + i) * padding + gid->Left,
- si->RasterBits + i * gid->Width,
- gid->Width);
- }
- }
-
- bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi->bmiHeader.biWidth = gif->SWidth;
- bmi->bmiHeader.biHeight = -gif->SHeight;
- bmi->bmiHeader.biPlanes = 1;
- bmi->bmiHeader.biBitCount = 8;
- bmi->bmiHeader.biCompression = BI_RGB;
- bmi->bmiHeader.biSizeImage = padding*gif->SHeight;
- bmi->bmiHeader.biXPelsPerMeter = 0;
- bmi->bmiHeader.biYPelsPerMeter = 0;
- bmi->bmiHeader.biClrUsed = cm->ColorCount;
- bmi->bmiHeader.biClrImportant = 0;
-
- hdcref = GetDC(0);
- This->desc.u.bmp.hbitmap=CreateDIBitmap(
- hdcref,
- &bmi->bmiHeader,
- CBM_INIT,
- bytes,
- bmi,
- DIB_RGB_COLORS
- );
-
- if (transparent > -1) {
- /* Create the Mask */
- HDC hdc = CreateCompatibleDC(0);
- HDC hdcMask = CreateCompatibleDC(0);
- HBITMAP hOldbitmap;
- HBITMAP hOldbitmapmask;
-
- unsigned int monopadding = (((unsigned)(gif->SWidth + 31)) >> 5) << 2;
- HBITMAP hTempMask;
-
- This->hbmXor = CreateDIBitmap(
- hdcref,
- &bmi->bmiHeader,
- CBM_INIT,
- bytes,
- bmi,
- DIB_RGB_COLORS
- );
-
- bmi->bmiColors[0].rgbRed = 0;
- bmi->bmiColors[0].rgbGreen = 0;
- bmi->bmiColors[0].rgbBlue = 0;
- bmi->bmiColors[1].rgbRed = 255;
- bmi->bmiColors[1].rgbGreen = 255;
- bmi->bmiColors[1].rgbBlue = 255;
-
- bmi->bmiHeader.biBitCount = 1;
- bmi->bmiHeader.biSizeImage = monopadding*gif->SHeight;
- bmi->bmiHeader.biClrUsed = 2;
-
- for (i = 0; i < gif->SHeight; i++) {
- unsigned char * colorPointer = bytes + padding * i;
- unsigned char * monoPointer = bytes + monopadding * i;
- for (j = 0; j < gif->SWidth; j++) {
- unsigned char pixel = colorPointer[j];
- if ((j & 7) == 0) monoPointer[j >> 3] = 0;
- if (pixel == (transparent & 0x000000FFU)) monoPointer[j >> 3] |= 1 << (7 - (j & 7));
- }
- }
- hdcref = GetDC(0);
- hTempMask = CreateDIBitmap(
- hdcref,
- &bmi->bmiHeader,
- CBM_INIT,
- bytes,
- bmi,
- DIB_RGB_COLORS
- );
- DeleteDC(hdcref);
-
- bmi->bmiHeader.biHeight = -bmi->bmiHeader.biHeight;
- This->hbmMask = CreateBitmap(bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, 1, 1, NULL);
- hOldbitmap = SelectObject(hdc, hTempMask);
- hOldbitmapmask = SelectObject(hdcMask, This->hbmMask);
-
- SetBkColor(hdc, RGB(255, 255, 255));
- BitBlt(hdcMask, 0, 0, bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, hdc, 0, 0, SRCCOPY);
-
- /* We no longer need the original bitmap, so we apply the first
- transformation with the mask to speed up the rendering */
- SelectObject(hdc, This->hbmXor);
- SetBkColor(hdc, RGB(0,0,0));
- SetTextColor(hdc, RGB(255,255,255));
- BitBlt(hdc, 0, 0, bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight,
- hdcMask, 0, 0, SRCAND);
-
- SelectObject(hdc, hOldbitmap);
- SelectObject(hdcMask, hOldbitmapmask);
- DeleteDC(hdcMask);
- DeleteDC(hdc);
- DeleteObject(hTempMask);
- }
-
- DeleteDC(hdcref);
- This->desc.picType = PICTYPE_BITMAP;
- OLEPictureImpl_SetBitmap(This);
- DGifCloseFile(gif);
- HeapFree(GetProcessHeap(),0,bmi);
- HeapFree(GetProcessHeap(),0,bytes);
- return S_OK;
-}
-
-static HRESULT OLEPictureImpl_LoadJpeg(OLEPictureImpl *This, BYTE *xbuf, ULONG xread)
-{
-#ifdef SONAME_LIBJPEG
- struct jpeg_decompress_struct jd;
- struct jpeg_error_mgr jerr;
- int ret;
- JDIMENSION x;
- JSAMPROW samprow,oldsamprow;
- BITMAPINFOHEADER bmi;
- LPBYTE bits;
- HDC hdcref;
- struct jpeg_source_mgr xjsm;
- LPBYTE oldbits;
- unsigned int i;
-
- if(!libjpeg_handle) {
- if(!load_libjpeg()) {
- ERR("Failed reading JPEG because unable to find %s\n", SONAME_LIBJPEG);
- return E_FAIL;
- }
- }
-
- /* This is basically so we can use in-memory data for jpeg decompression.
- * We need to have all the functions.
- */
- xjsm.next_input_byte = xbuf;
- xjsm.bytes_in_buffer = xread;
- xjsm.init_source = _jpeg_init_source;
- xjsm.fill_input_buffer = _jpeg_fill_input_buffer;
- xjsm.skip_input_data = _jpeg_skip_input_data;
- xjsm.resync_to_restart = _jpeg_resync_to_restart;
- xjsm.term_source = _jpeg_term_source;
-
- jd.err = pjpeg_std_error(&jerr);
- /* jpeg_create_decompress is a macro that expands to jpeg_CreateDecompress - see jpeglib.h
- * jpeg_create_decompress(&jd); */
- pjpeg_CreateDecompress(&jd, JPEG_LIB_VERSION, sizeof(struct jpeg_decompress_struct));
- jd.src = &xjsm;
- ret=pjpeg_read_header(&jd,TRUE);
- jd.out_color_space = JCS_RGB;
- pjpeg_start_decompress(&jd);
- if (ret != JPEG_HEADER_OK) {
- ERR("Jpeg image in stream has bad format, read header returned %d.\n",ret);
- HeapFree(GetProcessHeap(),0,xbuf);
- return E_FAIL;
- }
-
- bits = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
- (jd.output_height+1) * ((jd.output_width*jd.output_components + 3) & ~3) );
- samprow=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,jd.output_width*jd.output_components);
-
- oldbits = bits;
- oldsamprow = samprow;
- while ( jd.output_scanlinedesc.u.bmp.hbitmap=CreateDIBitmap(
- hdcref,
- &bmi,
- CBM_INIT,
- bits,
- (BITMAPINFO*)&bmi,
- DIB_RGB_COLORS
- );
- DeleteDC(hdcref);
- This->desc.picType = PICTYPE_BITMAP;
- OLEPictureImpl_SetBitmap(This);
- HeapFree(GetProcessHeap(),0,bits);
- return S_OK;
-#else
- ERR("Trying to load JPEG picture, but JPEG supported not compiled in.\n");
- return E_FAIL;
-#endif
-}
-
static HRESULT OLEPictureImpl_LoadDIB(OLEPictureImpl *This, BYTE *xbuf, ULONG xread)
{
BITMAPFILEHEADER *bfh = (BITMAPFILEHEADER*)xbuf;
@@ -1395,7 +998,7 @@ static HRESULT OLEPictureImpl_LoadDIB(OLEPictureImpl *This, BYTE *xbuf, ULONG xr
bi,
DIB_RGB_COLORS
);
- DeleteDC(hdcref);
+ ReleaseDC(0, hdcref);
if (This->desc.u.bmp.hbitmap == 0)
return E_FAIL;
This->desc.picType = PICTYPE_BITMAP;
@@ -1403,252 +1006,182 @@ static HRESULT OLEPictureImpl_LoadDIB(OLEPictureImpl *This, BYTE *xbuf, ULONG xr
return S_OK;
}
-/*****************************************************
-* start of PNG-specific code
-* currently only supports colortype PNG_COLOR_TYPE_RGB
-*/
-#ifdef SONAME_LIBPNG
-typedef struct{
- ULONG position;
- ULONG size;
- BYTE * buff;
-} png_io;
-
-static void png_stream_read_data(png_structp png_ptr, png_bytep data,
- png_size_t length)
+static HRESULT OLEPictureImpl_LoadWICSource(OLEPictureImpl *This, IWICBitmapSource *src)
{
- png_io * io_ptr = png_ptr->io_ptr;
+ HRESULT hr;
+ BITMAPINFOHEADER bih;
+ HDC hdcref;
+ UINT width, height;
+ UINT stride, buffersize;
+ LPBYTE bits=NULL;
+ WICRect rc;
+ IWICBitmapSource *real_source;
+ UINT x, y;
+ COLORREF white = RGB(255, 255, 255), black = RGB(0, 0, 0);
+ BOOL has_alpha=FALSE;
- if(length + io_ptr->position > io_ptr->size){
- length = io_ptr->size - io_ptr->position;
- }
+ hr = WICConvertBitmapSource(&GUID_WICPixelFormat32bppBGRA, src, &real_source);
+ if (FAILED(hr)) return hr;
- memcpy(data, io_ptr->buff + io_ptr->position, length);
+ hr = IWICBitmapSource_GetSize(real_source, &width, &height);
+ if (FAILED(hr)) goto end;
- io_ptr->position += length;
-}
+ bih.biSize = sizeof(bih);
+ bih.biWidth = width;
+ bih.biHeight = -height;
+ bih.biPlanes = 1;
+ bih.biBitCount = 32;
+ bih.biCompression = BI_RGB;
+ bih.biSizeImage = 0;
+ bih.biXPelsPerMeter = 4085; /* olepicture ignores the stored resolution */
+ bih.biYPelsPerMeter = 4085;
+ bih.biClrUsed = 0;
+ bih.biClrImportant = 0;
-static void *libpng_handle;
-#define MAKE_FUNCPTR(f) static typeof(f) * p##f
-MAKE_FUNCPTR(png_create_read_struct);
-MAKE_FUNCPTR(png_create_info_struct);
-MAKE_FUNCPTR(png_set_read_fn);
-MAKE_FUNCPTR(png_read_info);
-MAKE_FUNCPTR(png_read_image);
-MAKE_FUNCPTR(png_get_rowbytes);
-MAKE_FUNCPTR(png_set_bgr);
-MAKE_FUNCPTR(png_destroy_read_struct);
-MAKE_FUNCPTR(png_set_palette_to_rgb);
-MAKE_FUNCPTR(png_read_update_info);
-MAKE_FUNCPTR(png_get_tRNS);
-MAKE_FUNCPTR(png_get_PLTE);
-MAKE_FUNCPTR(png_set_expand);
-#undef MAKE_FUNCPTR
+ stride = 4 * width;
+ buffersize = stride * height;
-static void *load_libpng(void)
-{
- if((libpng_handle = wine_dlopen(SONAME_LIBPNG, RTLD_NOW, NULL, 0)) != NULL) {
-
-#define LOAD_FUNCPTR(f) \
- if((p##f = wine_dlsym(libpng_handle, #f, NULL, 0)) == NULL) { \
- libpng_handle = NULL; \
- return NULL; \
- }
- LOAD_FUNCPTR(png_create_read_struct);
- LOAD_FUNCPTR(png_create_info_struct);
- LOAD_FUNCPTR(png_set_read_fn);
- LOAD_FUNCPTR(png_read_info);
- LOAD_FUNCPTR(png_read_image);
- LOAD_FUNCPTR(png_get_rowbytes);
- LOAD_FUNCPTR(png_set_bgr);
- LOAD_FUNCPTR(png_destroy_read_struct);
- LOAD_FUNCPTR(png_set_palette_to_rgb);
- LOAD_FUNCPTR(png_read_update_info);
- LOAD_FUNCPTR(png_get_tRNS);
- LOAD_FUNCPTR(png_get_PLTE);
- LOAD_FUNCPTR(png_set_expand);
-
-#undef LOAD_FUNCPTR
- }
- return libpng_handle;
-}
-#endif /* SONAME_LIBPNG */
-
-static HRESULT OLEPictureImpl_LoadPNG(OLEPictureImpl *This, BYTE *xbuf, ULONG xread)
-{
-#ifdef SONAME_LIBPNG
- png_io io;
- png_structp png_ptr = NULL;
- png_infop info_ptr = NULL;
- INT row, rowsize, height, width, num_trans, i, j;
- png_bytep* row_pointers = NULL;
- png_bytep pngdata = NULL;
- BITMAPINFOHEADER bmi;
- HDC hdcref = NULL, hdcXor, hdcMask;
- HRESULT ret;
- BOOL transparency;
- png_bytep trans;
- png_color_16p trans_values;
- COLORREF white = RGB(255, 255, 255), black = RGB(0, 0, 0);
- HBITMAP hbmoldXor, hbmoldMask, temp;
-
- if(!libpng_handle) {
- if(!load_libpng()) {
- ERR("Failed reading PNG because unable to find %s\n",SONAME_LIBPNG);
- return E_FAIL;
- }
- }
-
- io.size = xread;
- io.position = 0;
- io.buff = xbuf;
-
- png_ptr = ppng_create_read_struct(PNG_LIBPNG_VER_STRING,
- NULL, NULL, NULL);
-
- if(setjmp(png_jmpbuf(png_ptr))){
- TRACE("Error in libpng\n");
- ret = E_FAIL;
+ bits = HeapAlloc(GetProcessHeap(), 0, buffersize);
+ if (!bits)
+ {
+ hr = E_OUTOFMEMORY;
goto end;
}
- info_ptr = ppng_create_info_struct(png_ptr);
- ppng_set_read_fn(png_ptr, &io, png_stream_read_data);
- ppng_read_info(png_ptr, info_ptr);
-
- if(!(png_ptr->color_type == PNG_COLOR_TYPE_RGB ||
- png_ptr->color_type == PNG_COLOR_TYPE_PALETTE ||
- png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)){
- FIXME("Unsupported .PNG type: %d\n", png_ptr->color_type);
- ret = E_FAIL;
+ rc.X = 0;
+ rc.Y = 0;
+ rc.Width = width;
+ rc.Height = height;
+ hr = IWICBitmapSource_CopyPixels(real_source, &rc, stride, buffersize, bits);
+ if (FAILED(hr))
goto end;
- }
-
- transparency = (ppng_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, &trans_values)
- == PNG_INFO_tRNS);
-
- /* sets format from anything to RGBA */
- ppng_set_expand(png_ptr);
- /* sets format to BGRA */
- ppng_set_bgr(png_ptr);
-
- ppng_read_update_info(png_ptr, info_ptr);
-
- rowsize = ppng_get_rowbytes(png_ptr, info_ptr);
- /* align rowsize to 4-byte boundary */
- rowsize = (rowsize + 3) & ~3;
- height = info_ptr->height;
- width = info_ptr->width;
-
- pngdata = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, height * rowsize);
- row_pointers = HeapAlloc(GetProcessHeap(), 0, height * (sizeof(VOID *)));
-
- if(!pngdata || !row_pointers){
- ret = E_FAIL;
- goto end;
- }
-
- for (row = 0; row < height; row++){
- row_pointers[row] = pngdata + row * rowsize;
- }
-
- ppng_read_image(png_ptr, row_pointers);
-
- bmi.biSize = sizeof(bmi);
- bmi.biWidth = width;
- bmi.biHeight = -height;
- bmi.biPlanes = 1;
- bmi.biBitCount = info_ptr->channels * 8;
- bmi.biCompression = BI_RGB;
- bmi.biSizeImage = height * rowsize;
- bmi.biXPelsPerMeter = 0;
- bmi.biYPelsPerMeter = 0;
- bmi.biClrUsed = 0;
- bmi.biClrImportant = 0;
hdcref = GetDC(0);
This->desc.u.bmp.hbitmap = CreateDIBitmap(
hdcref,
- &bmi,
+ &bih,
CBM_INIT,
- pngdata,
- (BITMAPINFO*)&bmi,
- DIB_RGB_COLORS
- );
+ bits,
+ (BITMAPINFO*)&bih,
+ DIB_RGB_COLORS);
- /* only fully-transparent alpha is handled */
- if((info_ptr->channels != 4) || !transparency){
+ if (This->desc.u.bmp.hbitmap == 0)
+ {
+ hr = E_FAIL;
ReleaseDC(0, hdcref);
- goto succ;
+ goto end;
}
- This->hbmXor = CreateDIBitmap(
- hdcref,
- &bmi,
- CBM_INIT,
- pngdata,
- (BITMAPINFO*)&bmi,
- DIB_RGB_COLORS
- );
+ This->desc.picType = PICTYPE_BITMAP;
+ OLEPictureImpl_SetBitmap(This);
/* set transparent pixels to black, all others to white */
- for(i = 0; i < height; i++){
- for(j = 3; j < rowsize; j += 4){
- if(row_pointers[i][j] == 0)
- *((DWORD*)(&row_pointers[i][j - 3])) = black;
+ for(y = 0; y < height; y++){
+ for(x = 0; x < width; x++){
+ DWORD *pixel = (DWORD*)(bits + stride*y + 4*x);
+ if((*pixel & 0x80000000) == 0)
+ {
+ has_alpha = TRUE;
+ *pixel = black;
+ }
else
- *((DWORD*)(&row_pointers[i][j - 3])) = white;
+ *pixel = white;
}
}
- temp = CreateDIBitmap(
- hdcref,
- &bmi,
- CBM_INIT,
- pngdata,
- (BITMAPINFO*)&bmi,
- DIB_RGB_COLORS
- );
+ if (has_alpha)
+ {
+ HDC hdcBmp, hdcXor, hdcMask;
+ HBITMAP hbmoldBmp, hbmoldXor, hbmoldMask;
+
+ This->hbmXor = CreateDIBitmap(
+ hdcref,
+ &bih,
+ CBM_INIT,
+ bits,
+ (BITMAPINFO*)&bih,
+ DIB_RGB_COLORS
+ );
+
+ This->hbmMask = CreateBitmap(width,-height,1,1,NULL);
+ hdcBmp = CreateCompatibleDC(NULL);
+ hdcXor = CreateCompatibleDC(NULL);
+ hdcMask = CreateCompatibleDC(NULL);
+
+ hbmoldBmp = SelectObject(hdcBmp,This->desc.u.bmp.hbitmap);
+ hbmoldXor = SelectObject(hdcXor,This->hbmXor);
+ hbmoldMask = SelectObject(hdcMask,This->hbmMask);
+
+ SetBkColor(hdcXor,black);
+ BitBlt(hdcMask,0,0,width,height,hdcXor,0,0,SRCCOPY);
+ BitBlt(hdcXor,0,0,width,height,hdcBmp,0,0,SRCAND);
+
+ SelectObject(hdcBmp,hbmoldBmp);
+ SelectObject(hdcXor,hbmoldXor);
+ SelectObject(hdcMask,hbmoldMask);
+
+ DeleteDC(hdcBmp);
+ DeleteDC(hdcXor);
+ DeleteDC(hdcMask);
+ }
ReleaseDC(0, hdcref);
- This->hbmMask = CreateBitmap(width,-height,1,1,NULL);
- hdcXor = CreateCompatibleDC(NULL);
- hdcMask = CreateCompatibleDC(NULL);
-
- hbmoldXor = SelectObject(hdcXor,temp);
- hbmoldMask = SelectObject(hdcMask,This->hbmMask);
- SetBkColor(hdcXor,black);
- BitBlt(hdcMask,0,0,width,height,hdcXor,0,0,SRCCOPY);
-
- SelectObject(hdcXor,This->hbmXor);
- DeleteObject(temp);
-
- SetTextColor(hdcXor,white);
- SetBkColor(hdcXor,black);
- BitBlt(hdcXor,0,0,width,height,hdcMask,0,0,SRCAND);
-
- SelectObject(hdcXor,hbmoldXor);
- SelectObject(hdcMask,hbmoldMask);
-
- DeleteDC(hdcXor);
- DeleteDC(hdcMask);
-
-succ:
- This->desc.picType = PICTYPE_BITMAP;
- OLEPictureImpl_SetBitmap(This);
- ret = S_OK;
-
end:
- if(png_ptr)
- ppng_destroy_read_struct(&png_ptr, info_ptr ? &info_ptr : NULL, NULL);
- HeapFree(GetProcessHeap(), 0, row_pointers);
- HeapFree(GetProcessHeap(), 0, pngdata);
- return ret;
-#else /* SONAME_LIBPNG */
- ERR("Trying to load PNG picture, but PNG supported not compiled in.\n");
- return E_FAIL;
-#endif
+ HeapFree(GetProcessHeap(), 0, bits);
+ IWICBitmapSource_Release(real_source);
+ return hr;
+}
+
+static HRESULT OLEPictureImpl_LoadWICDecoder(OLEPictureImpl *This, REFCLSID decoder_clsid, BYTE *xbuf, ULONG xread)
+{
+ HRESULT hr;
+ IWICImagingFactory *factory;
+ IWICBitmapDecoder *decoder;
+ IWICBitmapFrameDecode *framedecode;
+ HRESULT initresult;
+ IWICStream *stream;
+
+ initresult = CoInitialize(NULL);
+
+ hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICImagingFactory, (void**)&factory);
+ if (SUCCEEDED(hr)) /* created factory */
+ {
+ hr = IWICImagingFactory_CreateStream(factory, &stream);
+ IWICImagingFactory_Release(factory);
+ }
+
+ if (SUCCEEDED(hr)) /* created stream */
+ {
+ hr = IWICStream_InitializeFromMemory(stream, xbuf, xread);
+
+ if (SUCCEEDED(hr)) /* initialized stream */
+ {
+ hr = CoCreateInstance(decoder_clsid, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICBitmapDecoder, (void**)&decoder);
+ if (SUCCEEDED(hr)) /* created decoder */
+ {
+ hr = IWICBitmapDecoder_Initialize(decoder, (IStream*)stream, WICDecodeMetadataCacheOnLoad);
+
+ if (SUCCEEDED(hr)) /* initialized decoder */
+ hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode);
+
+ IWICBitmapDecoder_Release(decoder);
+ }
+ }
+
+ IWICStream_Release(stream);
+ }
+
+ if (SUCCEEDED(hr)) /* got framedecode */
+ {
+ hr = OLEPictureImpl_LoadWICSource(This, (IWICBitmapSource*)framedecode);
+ IWICBitmapFrameDecode_Release(framedecode);
+ }
+
+ if (SUCCEEDED(initresult)) CoUninitialize();
+ return hr;
}
/*****************************************************
@@ -1924,16 +1457,16 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
switch (magic) {
case BITMAP_FORMAT_GIF: /* GIF */
- hr = OLEPictureImpl_LoadGif(This, xbuf, xread);
+ hr = OLEPictureImpl_LoadWICDecoder(This, &CLSID_WICGifDecoder, xbuf, xread);
break;
case BITMAP_FORMAT_JPEG: /* JPEG */
- hr = OLEPictureImpl_LoadJpeg(This, xbuf, xread);
+ hr = OLEPictureImpl_LoadWICDecoder(This, &CLSID_WICJpegDecoder, xbuf, xread);
break;
case BITMAP_FORMAT_BMP: /* Bitmap */
hr = OLEPictureImpl_LoadDIB(This, xbuf, xread);
break;
case BITMAP_FORMAT_PNG: /* PNG */
- hr = OLEPictureImpl_LoadPNG(This, xbuf, xread);
+ hr = OLEPictureImpl_LoadWICDecoder(This, &CLSID_WICPngDecoder, xbuf, xread);
break;
case BITMAP_FORMAT_APM: /* APM */
hr = OLEPictureImpl_LoadAPM(This, xbuf, xread);
diff --git a/reactos/dll/win32/oleaut32/regsvr.c b/reactos/dll/win32/oleaut32/regsvr.c
index 9ee36b53ef0..3c5fabc0b20 100644
--- a/reactos/dll/win32/oleaut32/regsvr.c
+++ b/reactos/dll/win32/oleaut32/regsvr.c
@@ -32,6 +32,7 @@
#include "oleauto.h"
#include "initguid.h"
#include "typelib.h"
+#include "wincodec.h"
#include "wine/debug.h"
#include "wine/unicode.h"
diff --git a/reactos/dll/win32/oleaut32/resource.h b/reactos/dll/win32/oleaut32/resource.h
index 5c72c7e0acb..550170afc61 100644
--- a/reactos/dll/win32/oleaut32/resource.h
+++ b/reactos/dll/win32/oleaut32/resource.h
@@ -20,6 +20,8 @@
#ifndef WINE_OLEAUT32_RESOURCE_H
#define WINE_OLEAUT32_RESOURCE_H
+#include
+
/* Localised boolean text */
#define IDS_TRUE 100
#define IDS_FALSE 101
diff --git a/reactos/dll/win32/oleaut32/typelib.c b/reactos/dll/win32/oleaut32/typelib.c
index 5ddbe1b4acc..887c6bebc9e 100644
--- a/reactos/dll/win32/oleaut32/typelib.c
+++ b/reactos/dll/win32/oleaut32/typelib.c
@@ -930,6 +930,7 @@ typedef struct tagITypeLibImpl
const ITypeCompVtbl *lpVtblTypeComp;
LONG ref;
TLIBATTR LibAttr; /* guid,lcid,syskind,version,flags */
+ LCID lcid;
/* strings can be stored in tlb as multibyte strings BUT they are *always*
* exported to the application as a UNICODE string.
@@ -938,7 +939,7 @@ typedef struct tagITypeLibImpl
BSTR DocString;
BSTR HelpFile;
BSTR HelpStringDll;
- unsigned long dwHelpContext;
+ DWORD dwHelpContext;
int TypeInfoCount; /* nr of typeinfo's in librarry */
struct tagITypeInfoImpl *pTypeInfo; /* linked list of type info data */
int ctCustData; /* number of items in cust data list */
@@ -1058,8 +1059,8 @@ typedef struct tagITypeInfoImpl
BSTR Name;
BSTR DocString;
BSTR DllName;
- unsigned long dwHelpContext;
- unsigned long dwHelpStringContext;
+ DWORD dwHelpContext;
+ DWORD dwHelpStringContext;
/* functions */
TLBFuncDesc * funclist; /* linked list with function descriptions */
@@ -2872,18 +2873,14 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength)
/* TLIBATTR fields */
MSFT_ReadGuid(&pTypeLibImpl->LibAttr.guid, tlbHeader.posguid, &cx);
- /* pTypeLibImpl->LibAttr.lcid = tlbHeader.lcid;*/
- /* Windows seems to have zero here, is this correct? */
- if(SUBLANGID(tlbHeader.lcid) == SUBLANG_NEUTRAL)
- pTypeLibImpl->LibAttr.lcid = MAKELCID(MAKELANGID(PRIMARYLANGID(tlbHeader.lcid),0),0);
- else
- pTypeLibImpl->LibAttr.lcid = 0;
-
+ pTypeLibImpl->LibAttr.lcid = tlbHeader.lcid2;
pTypeLibImpl->LibAttr.syskind = tlbHeader.varflags & 0x0f; /* check the mask */
pTypeLibImpl->LibAttr.wMajorVerNum = LOWORD(tlbHeader.version);
pTypeLibImpl->LibAttr.wMinorVerNum = HIWORD(tlbHeader.version);
pTypeLibImpl->LibAttr.wLibFlags = (WORD) tlbHeader.flags & 0xffff;/* check mask */
+ pTypeLibImpl->lcid = tlbHeader.lcid;
+
/* name, eventually add to a hash table */
pTypeLibImpl->Name = MSFT_ReadName(&cx, tlbHeader.NameOffset);
@@ -3058,7 +3055,7 @@ static WORD SLTG_ReadString(const char *ptr, BSTR *pBstr)
bytelen = *(const WORD*)ptr;
if(bytelen == 0xffff) return 2;
len = MultiByteToWideChar(CP_ACP, 0, ptr + 2, bytelen, NULL, 0);
- *pBstr = SysAllocStringLen(NULL, len - 1);
+ *pBstr = SysAllocStringLen(NULL, len);
if (*pBstr)
len = MultiByteToWideChar(CP_ACP, 0, ptr + 2, bytelen, *pBstr, len);
return bytelen + 2;
@@ -3105,9 +3102,9 @@ static DWORD SLTG_ReadLibBlk(LPVOID pLibBlk, ITypeLibImpl *pTypeLibImpl)
ptr += 2;
if(SUBLANGID(*(WORD*)ptr) == SUBLANG_NEUTRAL)
- pTypeLibImpl->LibAttr.lcid = MAKELCID(MAKELANGID(PRIMARYLANGID(*(WORD*)ptr),0),0);
+ pTypeLibImpl->lcid = pTypeLibImpl->LibAttr.lcid = MAKELCID(MAKELANGID(PRIMARYLANGID(*(WORD*)ptr),0),0);
else
- pTypeLibImpl->LibAttr.lcid = 0;
+ pTypeLibImpl->lcid = pTypeLibImpl->LibAttr.lcid = 0;
ptr += 2;
ptr += 4; /* skip res12 */
@@ -3137,7 +3134,7 @@ typedef struct
static HRESULT sltg_get_typelib_ref(const sltg_ref_lookup_t *table, DWORD typeinfo_ref,
HREFTYPE *typelib_ref)
{
- if(typeinfo_ref < table->num)
+ if(table && typeinfo_ref < table->num)
{
*typelib_ref = table->refs[typeinfo_ref];
return S_OK;
@@ -5880,6 +5877,12 @@ static HRESULT typedescvt_to_variantvt(ITypeInfo *tinfo, const TYPEDESC *tdesc,
*vt |= VT_ARRAY;
hr = typedescvt_to_variantvt(tinfo, tdesc->u.lptdesc, vt);
break;
+ case VT_INT:
+ *vt |= VT_I4;
+ break;
+ case VT_UINT:
+ *vt |= VT_UI4;
+ break;
default:
*vt |= tdesc->vt;
break;
@@ -6063,6 +6066,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
VARTYPE *rgvt = INVBUF_GET_ARG_TYPE_ARRAY(buffer, func_desc->cParams);
UINT cNamedArgs = pDispParams->cNamedArgs;
DISPID *rgdispidNamedArgs = pDispParams->rgdispidNamedArgs;
+ UINT vargs_converted=0;
hres = S_OK;
@@ -6100,6 +6104,15 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
USHORT wParamFlags = func_desc->lprgelemdescParam[i].u.paramdesc.wParamFlags;
VARIANTARG *src_arg;
+ if (wParamFlags & PARAMFLAG_FLCID)
+ {
+ VARIANTARG *arg;
+ arg = prgpvarg[i] = &rgvarg[i];
+ V_VT(arg) = VT_I4;
+ V_I4(arg) = This->pTypeLib->lcid;
+ continue;
+ }
+
if (cNamedArgs)
{
USHORT j;
@@ -6112,7 +6125,10 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
}
}
else
- src_arg = i < pDispParams->cArgs ? &pDispParams->rgvarg[pDispParams->cArgs - 1 - i] : NULL;
+ {
+ src_arg = vargs_converted < pDispParams->cArgs ? &pDispParams->rgvarg[pDispParams->cArgs - 1 - vargs_converted] : NULL;
+ vargs_converted++;
+ }
if (wParamFlags & PARAMFLAG_FRETVAL)
{
@@ -6278,10 +6294,15 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
V_VT(&varresult), func_desc->cParams, rgvt,
prgpvarg, &varresult);
+ vargs_converted = 0;
+
for (i = 0; i < func_desc->cParams; i++)
{
USHORT wParamFlags = func_desc->lprgelemdescParam[i].u.paramdesc.wParamFlags;
- if (wParamFlags & PARAMFLAG_FRETVAL)
+
+ if (wParamFlags & PARAMFLAG_FLCID)
+ continue;
+ else if (wParamFlags & PARAMFLAG_FRETVAL)
{
if (TRACE_ON(ole))
{
@@ -6309,11 +6330,11 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
}
break;
}
- else if (i < pDispParams->cArgs)
+ else if (vargs_converted < pDispParams->cArgs)
{
if (wParamFlags & PARAMFLAG_FOUT)
{
- VARIANTARG *arg = &pDispParams->rgvarg[pDispParams->cArgs - 1 - i];
+ VARIANTARG *arg = &pDispParams->rgvarg[pDispParams->cArgs - 1 - vargs_converted];
if ((rgvt[i] == VT_BYREF) && (V_VT(arg) != VT_BYREF))
hres = VariantChangeType(arg, &rgvarg[i], 0, V_VT(arg));
@@ -6321,7 +6342,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
if (FAILED(hres))
{
ERR("failed to convert param %d to vt %d\n", i,
- V_VT(&pDispParams->rgvarg[pDispParams->cArgs - 1 - i]));
+ V_VT(&pDispParams->rgvarg[pDispParams->cArgs - 1 - vargs_converted]));
break;
}
}
@@ -6354,6 +6375,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
}
}
VariantClear(&rgvarg[i]);
+ vargs_converted++;
}
else if (wParamFlags & PARAMFLAG_FOPT)
{
@@ -7047,13 +7069,12 @@ static HRESULT WINAPI ITypeInfo2_fnGetCustData(
TRACE("(%p) guid %s %s found!x)\n", This, debugstr_guid(guid), pCData? "" : "NOT");
- if(pCData)
- {
- VariantInit( pVarVal);
+ VariantInit( pVarVal);
+ if (pCData)
VariantCopy( pVarVal, &pCData->data);
- return S_OK;
- }
- return E_INVALIDARG; /* FIXME: correct? */
+ else
+ VariantClear( pVarVal );
+ return S_OK;
}
/* ITypeInfo2::GetFuncCustData
diff --git a/reactos/dll/win32/oleaut32/typelib2.c b/reactos/dll/win32/oleaut32/typelib2.c
index 3d092e50d89..0f641d4103c 100644
--- a/reactos/dll/win32/oleaut32/typelib2.c
+++ b/reactos/dll/win32/oleaut32/typelib2.c
@@ -760,7 +760,7 @@ static int ctl2_alloc_custdata(
if (offset == -1) return offset;
*((unsigned short *)&This->typelib_segment_data[MSFT_SEG_CUSTDATA][offset]) = VT_UI4;
- *((unsigned long *)&This->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+2]) = V_UI4(pVarVal);
+ *((unsigned int *)&This->typelib_segment_data[MSFT_SEG_CUSTDATA][offset+2]) = V_UI4(pVarVal);
break;
default:
@@ -3204,7 +3204,10 @@ static HRESULT WINAPI ICreateTypeLib2_fnSetHelpContext(ICreateTypeLib2 * iface,
/******************************************************************************
* ICreateTypeLib2_SetLcid {OLEAUT32}
*
- * See ICreateTypeLib_SetLcid.
+ * Sets both the lcid and lcid2 members in the header to lcid.
+ *
+ * As a special case if lcid == LOCALE_NEUTRAL (0), then the first header lcid
+ * is set to US English while the second one is set to 0.
*/
static HRESULT WINAPI ICreateTypeLib2_fnSetLcid(ICreateTypeLib2 * iface, LCID lcid)
{
@@ -3214,6 +3217,8 @@ static HRESULT WINAPI ICreateTypeLib2_fnSetLcid(ICreateTypeLib2 * iface, LCID lc
This->typelib_header.lcid = This->typelib_header.lcid2 = lcid;
+ if(lcid == LOCALE_NEUTRAL) This->typelib_header.lcid = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
+
return S_OK;
}
diff --git a/reactos/dll/win32/oleaut32/usrmarshal.c b/reactos/dll/win32/oleaut32/usrmarshal.c
index 1e20c3cd322..3172ebad5fc 100644
--- a/reactos/dll/win32/oleaut32/usrmarshal.c
+++ b/reactos/dll/win32/oleaut32/usrmarshal.c
@@ -232,7 +232,7 @@ static unsigned int get_type_size(ULONG *pFlags, VARTYPE vt)
case VT_DECIMAL:
return sizeof(DECIMAL);
case VT_BSTR:
- return sizeof(BSTR);
+ return sizeof(ULONG);
case VT_VARIANT:
return sizeof(VARIANT);
case VT_UNKNOWN:
@@ -764,7 +764,7 @@ ULONG WINAPI LPSAFEARRAY_UserSize(ULONG *pFlags, ULONG StartingSize, LPSAFEARRAY
HRESULT hr;
size += sizeof(ULONG);
- size += FIELD_OFFSET(struct _wireSAFEARRAY, uArrayStructs);
+ size += 2 * sizeof(USHORT) + 2 * sizeof(ULONG);
sftype = SAFEARRAY_GetUnionType(psa);
size += sizeof(ULONG);
@@ -850,23 +850,23 @@ unsigned char * WINAPI LPSAFEARRAY_UserMarshal(ULONG *pFlags, unsigned char *Buf
VARTYPE vt;
SAFEARRAY *psa = *ppsa;
ULONG ulCellCount = SAFEARRAY_GetCellCount(psa);
- wireSAFEARRAY wiresa;
SF_TYPE sftype;
GUID guid;
*(ULONG *)Buffer = psa->cDims;
Buffer += sizeof(ULONG);
- wiresa = (wireSAFEARRAY)Buffer;
- wiresa->cDims = psa->cDims;
- wiresa->fFeatures = psa->fFeatures;
- wiresa->cbElements = psa->cbElements;
+ *(USHORT *)Buffer = psa->cDims;
+ Buffer += sizeof(USHORT);
+ *(USHORT *)Buffer = psa->fFeatures;
+ Buffer += sizeof(USHORT);
+ *(ULONG *)Buffer = psa->cbElements;
+ Buffer += sizeof(ULONG);
hr = SafeArrayGetVartype(psa, &vt);
if (FAILED(hr)) vt = 0;
- wiresa->cLocks = (USHORT)psa->cLocks | (vt << 16);
-
- Buffer += FIELD_OFFSET(struct _wireSAFEARRAY, uArrayStructs);
+ *(ULONG *)Buffer = (USHORT)psa->cLocks | (vt << 16);
+ Buffer += sizeof(ULONG);
sftype = SAFEARRAY_GetUnionType(psa);
*(ULONG *)Buffer = sftype;
@@ -987,7 +987,7 @@ unsigned char * WINAPI LPSAFEARRAY_UserUnmarshal(ULONG *pFlags, unsigned char *B
Buffer += sizeof(ULONG);
wiresa = (wireSAFEARRAY)Buffer;
- Buffer += FIELD_OFFSET(struct _wireSAFEARRAY, uArrayStructs);
+ Buffer += 2 * sizeof(USHORT) + 2 * sizeof(ULONG);
if (cDims != wiresa->cDims)
RpcRaiseException(RPC_S_INVALID_BOUND);
diff --git a/reactos/dll/win32/oleaut32/variant.c b/reactos/dll/win32/oleaut32/variant.c
index 909cf8a830c..e92a63dcdd7 100644
--- a/reactos/dll/win32/oleaut32/variant.c
+++ b/reactos/dll/win32/oleaut32/variant.c
@@ -588,7 +588,7 @@ void WINAPI VariantInit(VARIANTARG* pVarg)
*
* RETURNS
* Success: S_OK. Any previous value in pVarg is freed and its type is set to VT_EMPTY.
- * Failure: DISP_E_BADVARTYPE, if the variant is a not a valid variant type.
+ * Failure: DISP_E_BADVARTYPE, if the variant is not a valid variant type.
*/
HRESULT WINAPI VariantClear(VARIANTARG* pVarg)
{
@@ -3009,7 +3009,7 @@ HRESULT WINAPI VarAnd(LPVARIANT left, LPVARIANT right, LPVARIANT result)
{
/*
* Special cases for when left variant is VT_NULL
- * (NULL & 0 = NULL, NULL & value = value)
+ * (VT_NULL & 0 = VT_NULL, VT_NULL & value = value)
*/
if (leftvt == VT_NULL)
{
@@ -5571,7 +5571,9 @@ HRESULT WINAPI VarMod(LPVARIANT left, LPVARIANT right, LPVARIANT result)
V_VT(result) = VT_I8;
V_I8(result) = V_I8(&lv) % V_I8(&rv);
- TRACE("V_I8(left) == %ld, V_I8(right) == %ld, V_I8(result) == %ld\n", (long)V_I8(&lv), (long)V_I8(&rv), (long)V_I8(result));
+ TRACE("V_I8(left) == %s, V_I8(right) == %s, V_I8(result) == %s\n",
+ wine_dbgstr_longlong(V_I8(&lv)), wine_dbgstr_longlong(V_I8(&rv)),
+ wine_dbgstr_longlong(V_I8(result)));
/* convert left and right to the destination type */
rc = VariantChangeType(result, result, 0, resT);
diff --git a/reactos/dll/win32/oleaut32/vartype.c b/reactos/dll/win32/oleaut32/vartype.c
index 2d5ae7d8ea4..7f5325936b0 100644
--- a/reactos/dll/win32/oleaut32/vartype.c
+++ b/reactos/dll/win32/oleaut32/vartype.c
@@ -5788,6 +5788,16 @@ HRESULT WINAPI VarDecCmp(const DECIMAL* pDecLeft, const DECIMAL* pDecRight)
HRESULT hRet;
DECIMAL result;
+ if (!pDecLeft || !pDecRight)
+ return VARCMP_NULL;
+
+ if ((!(DEC_SIGN(pDecLeft) & DECIMAL_NEG)) && (DEC_SIGN(pDecRight) & DECIMAL_NEG) &&
+ (DEC_HI32(pDecLeft) | DEC_MID32(pDecLeft) | DEC_LO32(pDecLeft)))
+ return VARCMP_GT;
+ else if ((DEC_SIGN(pDecLeft) & DECIMAL_NEG) && (!(DEC_SIGN(pDecRight) & DECIMAL_NEG)) &&
+ (DEC_HI32(pDecLeft) | DEC_MID32(pDecLeft) | DEC_LO32(pDecLeft)))
+ return VARCMP_LT;
+
/* Subtract right from left, and compare the result to 0 */
hRet = VarDecSub(pDecLeft, pDecRight, &result);
diff --git a/reactos/dll/win32/oledlg/oledlg_Cs.rc b/reactos/dll/win32/oledlg/oledlg_Cs.rc
index 4271a762129..1cf038537de 100644
--- a/reactos/dll/win32/oledlg/oledlg_Cs.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Cs.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
/* Czech strings in CP1250 */
diff --git a/reactos/dll/win32/oledlg/oledlg_Da.rc b/reactos/dll/win32/oledlg/oledlg_Da.rc
index d1ef0696cdc..852733ab6d1 100644
--- a/reactos/dll/win32/oledlg/oledlg_Da.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Da.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
diff --git a/reactos/dll/win32/oledlg/oledlg_De.rc b/reactos/dll/win32/oledlg/oledlg_De.rc
index b2ae5faf43a..6f892091705 100644
--- a/reactos/dll/win32/oledlg/oledlg_De.rc
+++ b/reactos/dll/win32/oledlg/oledlg_De.rc
@@ -16,11 +16,15 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
+#pragma code_page(65001)
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Objekt einfgen"
+CAPTION "Objekt einfügen"
FONT 8, "MS Shell Dlg"
BEGIN
LISTBOX IDC_OBJTYPELIST,82,19,131,66,LBS_SORT |
@@ -37,7 +41,7 @@ BEGIN
CONTROL "A&us Datei erstellen",IDC_CREATEFROMFILE,"Button",
BS_AUTORADIOBUTTON,7,37,67,10
LTEXT "",IDC_RESULTDESC,49,112,159,23
- PUSHBUTTON "Steuerung hin&zufgen",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
+ PUSHBUTTON "Steuerung hin&zufügen",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
CONTROL "Als &Symbol anzeigen",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10
PUSHBUTTON "D&urchsuchen...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
@@ -47,22 +51,22 @@ END
STRINGTABLE DISCARDABLE
{
- IDS_RESULTOBJDESC "Fgt ein neues %s - Objekt in Ihr Dokument ein."
- IDS_RESULTFILEOBJDESC "Fgt den Inhalt der Datei als Objekt so in Ihr Dokument ein, dass Sie es mit dem Programm aktivieren knnen, mit dem es erstellt wurde."
+ IDS_RESULTOBJDESC "Fügt ein neues %s - Objekt in Ihr Dokument ein."
+ IDS_RESULTFILEOBJDESC "Fügt den Inhalt der Datei als Objekt so in Ihr Dokument ein, dass Sie es mit dem Programm aktivieren können, mit dem es erstellt wurde."
IDS_BROWSE "Durchsuchen"
- IDS_NOTOLEMOD "Die Datei ist offenbar kein gltiges OLE - Steuermodul. Die OLE - Steuerung konnte nicht registiert werden."
- IDS_NOTOLEMODCAPTION "Steuerung hinzufgen"
+ IDS_NOTOLEMOD "Die Datei ist offenbar kein gültiges OLE - Steuermodul. Die OLE - Steuerung konnte nicht registiert werden."
+ IDS_NOTOLEMODCAPTION "Steuerung hinzufügen"
}
IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 293, 140
STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Inhalte einfgen"
+CAPTION "Inhalte einfügen"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Quelle:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
- CONTROL "&Einfgen", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
+ CONTROL "&Einfügen", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
6, 38, 55, 10
- CONTROL "&Verknpfung einfgen", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
+ CONTROL "&Verknüpfung einfügen", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
6, 63, 55, 10
LTEXT "&Als:", -1, 65, 25, 16, 8, WS_VISIBLE | WS_GROUP
LISTBOX IDC_PS_PASTELIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
@@ -73,7 +77,7 @@ BEGIN
CONTROL "&Hilfe", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14
CONTROL "Als Symbol &darstellen", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE, 224, 59, 66, 14
CONTROL "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 75, 66, 44
- CONTROL "&Symbol ndern...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14
+ CONTROL "&Symbol ändern...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14
CONTROL "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34
CONTROL "<< result text goes here >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35
CONTROL "Ergebnis", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48
@@ -82,14 +86,15 @@ END
STRINGTABLE DISCARDABLE
{
- IDS_PS_PASTE_DATA "Fgt den Inhalt der Zwischenablage in Ihr Dokument als %s ein."
- IDS_PS_PASTE_OBJECT "Fgt den Inhalt der Zwischenablage so in Ihr Dokument ein dass Sie es mit %s aktivieren knnen."
- IDS_PS_PASTE_OBJECT_AS_ICON "Fgt den Inhalt der Zwischenablage so in Ihr Dokument ein dass Sie es mit %s aktivieren knnen. Wird als Symbol dargestellt."
- IDS_PS_PASTE_LINK_DATA "Fgt den Inhalt der Zwischenablage in Ihr Dokument als %s ein. Die Daten sind mit der Ursprungsdatei verknpft so dass nderungen an dieser in Ihrem Dokument erscheinen."
- IDS_PS_PASTE_LINK_OBJECT "Fgt ein Bild des Zwischenablagen-Inhalts in Ihr Dokument ein. Das Bild ist mit der Ursprungsdatei verknpft so dass nderungen an dieser in Ihrem Dokument erscheinen."
- IDS_PS_PASTE_LINK_OBJECT_AS_ICON "Fgt eine Verknpfung ein die auf den Ort des Zwischenablagen-Inhalts zeigt. Die Verknpfung ist mit der Ursprungsdatei verknpft so dass nderungen an dieser in Ihrem Dokument erscheinen."
- IDS_PS_NON_OLE "Fgt den Inhalt der Zwischenablage in Ihr Dokument als ein."
+ IDS_PS_PASTE_DATA "Fügt den Inhalt der Zwischenablage in Ihr Dokument als %s ein."
+ IDS_PS_PASTE_OBJECT "Fügt den Inhalt der Zwischenablage so in Ihr Dokument ein dass Sie es mit %s aktivieren können."
+ IDS_PS_PASTE_OBJECT_AS_ICON "Fügt den Inhalt der Zwischenablage so in Ihr Dokument ein dass Sie es mit %s aktivieren können. Wird als Symbol dargestellt."
+ IDS_PS_PASTE_LINK_DATA "Fügt den Inhalt der Zwischenablage in Ihr Dokument als %s ein. Die Daten sind mit der Ursprungsdatei verknüpft so dass Änderungen an dieser in Ihrem Dokument erscheinen."
+ IDS_PS_PASTE_LINK_OBJECT "Fügt ein Bild des Zwischenablagen-Inhalts in Ihr Dokument ein. Das Bild ist mit der Ursprungsdatei verknüpft so dass Änderungen an dieser in Ihrem Dokument erscheinen."
+ IDS_PS_PASTE_LINK_OBJECT_AS_ICON "Fügt eine Verknüpfung ein die auf den Ort des Zwischenablagen-Inhalts zeigt. Die Verknüpfung ist mit der Ursprungsdatei verknüpft so dass Änderungen an dieser in Ihrem Dokument erscheinen."
+ IDS_PS_NON_OLE "Fügt den Inhalt der Zwischenablage in Ihr Dokument als ein."
IDS_PS_UNKNOWN_TYPE "Unbekannter Typ"
IDS_PS_UNKNOWN_SRC "Unbekannte Quelle"
IDS_PS_UNKNOWN_APP "dem Erzeugerprogramm"
}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/oledlg/oledlg_En.rc b/reactos/dll/win32/oledlg/oledlg_En.rc
index 5b89a252c52..5dd5be40b3b 100644
--- a/reactos/dll/win32/oledlg/oledlg_En.rc
+++ b/reactos/dll/win32/oledlg/oledlg_En.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
diff --git a/reactos/dll/win32/oledlg/oledlg_Es.rc b/reactos/dll/win32/oledlg/oledlg_Es.rc
index 44d8d926e7f..74f8c0867f8 100644
--- a/reactos/dll/win32/oledlg/oledlg_Es.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Es.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
diff --git a/reactos/dll/win32/oledlg/oledlg_Fr.rc b/reactos/dll/win32/oledlg/oledlg_Fr.rc
index 41654cb75f4..5a64ab09b88 100644
--- a/reactos/dll/win32/oledlg/oledlg_Fr.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Fr.rc
@@ -3,6 +3,7 @@
* French language support
*
* Copyright (C) 2005-2006 Jonathan Ernst
+ * Copyright (C) 2009 Frédéric Delanoy
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -19,48 +20,52 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
-UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
+UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 308, 151
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Insrer Objet"
+CAPTION "Insérer objet"
FONT 8, "MS Shell Dlg"
BEGIN
- LISTBOX IDC_OBJTYPELIST,82,19,131,66,LBS_SORT |
+ LISTBOX IDC_OBJTYPELIST,94,19,131,66,LBS_SORT |
LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL |
WS_TABSTOP
- LTEXT "Type d'objet :",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE
- DEFPUSHBUTTON "OK",IDOK,221,7,66,14
- PUSHBUTTON "Annuler",IDCANCEL,221,24,66,14
- GROUPBOX "Rsultat",IDC_RESULT,7,103,208,41
- CONTROL "Crer nouveau",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON |
+ LTEXT "Type d'objet :",IDC_OBJTYPELBL,94,7,53,8,WS_VISIBLE
+ DEFPUSHBUTTON "OK",IDOK,233,7,65,14
+ PUSHBUTTON "Annuler",IDCANCEL,233,24,65,14
+ GROUPBOX "Résultat",IDC_RESULT,7,103,218,41
+ CONTROL "Créer nouveau",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON |
WS_GROUP,7,20,62,10
- CONTROL "Crer le contrle",IDC_CREATECONTROL,"Button",
- BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10
- CONTROL "Crer depuis le fichier",IDC_CREATEFROMFILE,"Button",
- BS_AUTORADIOBUTTON,7,37,67,10
- LTEXT "",IDC_RESULTDESC,49,112,159,23
- PUSHBUTTON "&Ajoute Contrle...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
- CONTROL "Afficher comme icne",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10
- PUSHBUTTON "Parcourir...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
- LTEXT "Fichier :",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE
- EDITTEXT IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE
+ CONTROL "Créer un contrôle",IDC_CREATECONTROL,"Button",
+ BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,72,10
+ CONTROL "Créer depuis le fichier",IDC_CREATEFROMFILE,"Button",
+ BS_AUTORADIOBUTTON,7,37,82,10
+ LTEXT "",IDC_RESULTDESC,47,112,173,25
+ PUSHBUTTON "&Ajouter un contrôle...",IDC_ADDCONTROL,94,88,80,14,NOT WS_VISIBLE
+ CONTROL "Afficher comme une icône",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
+ BS_MULTILINE | WS_TABSTOP | NOT WS_VISIBLE,234,51,61,35
+ PUSHBUTTON "Parcourir...",IDC_BROWSE,96,53,50,14,NOT WS_VISIBLE
+ LTEXT "Fichier :",IDC_FILELBL,96,27,27,8, NOT WS_VISIBLE
+ EDITTEXT IDC_FILE,95,37,129,13,ES_AUTOHSCROLL | NOT WS_VISIBLE
END
STRINGTABLE DISCARDABLE
{
- IDS_RESULTOBJDESC "Insrer un nouvel object %s dans votre document"
- IDS_RESULTFILEOBJDESC "Insre le contenu du fichier comme un objet dans votre document afin que vous puissiez l'activer en utilisant le programme avec lequel il a t cr."
+ IDS_RESULTOBJDESC "Insérer un nouvel object %s dans votre document"
+ IDS_RESULTFILEOBJDESC "Insère le contenu du fichier comme un objet dans votre document afin que vous puissiez l'activer en utilisant le programme avec lequel il a été créé."
IDS_BROWSE "Parcourir"
- IDS_NOTOLEMOD "Le fichier ne semble pas tre un module OLE valide. Impossible d'enregistrer le contrle OLE."
- IDS_NOTOLEMODCAPTION "Ajouter un contrle"
+ IDS_NOTOLEMOD "Le fichier ne semble pas être un module OLE valide. Impossible d'enregistrer le contrôle OLE."
+ IDS_NOTOLEMODCAPTION "Ajouter un contrôle"
}
-IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 293, 140
+IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 308, 140
STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Collage spcial"
+CAPTION "Collage spécial"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Source :", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
@@ -68,32 +73,33 @@ BEGIN
6, 38, 55, 10
CONTROL "Coller le &lien", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
6, 63, 55, 10
- LTEXT "&Comme :", -1, 65, 25, 16, 8, WS_VISIBLE | WS_GROUP
+ LTEXT "&Comme :", -1, 65, 25, 31, 8, WS_VISIBLE | WS_GROUP
LISTBOX IDC_PS_PASTELIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
LISTBOX IDC_PS_PASTELINKLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
LISTBOX IDC_PS_DISPLAYLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | WS_VISIBLE
- CONTROL "OK", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 224, 6, 66, 14
- CONTROL "Annuler", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 23, 66, 14
- CONTROL "Aid&e", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14
- CONTROL "&Afficher comme icne", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE, 224, 59, 66, 14
- CONTROL "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 75, 66, 44
- CONTROL "Changer l'&icne...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14
- CONTROL "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34
- CONTROL "<< le rsultat vient ici >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35
- CONTROL "Rsultat", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48
+ CONTROL "OK", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 228, 6, 66, 14
+ CONTROL "Annuler", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 228, 23, 66, 14
+ CONTROL "Aid&e", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 228, 42, 66, 14
+ CONTROL "&Afficher comme une icône", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP | WS_VISIBLE, 228, 63, 66, 14
+ CONTROL "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 84, 21, 20
+ CONTROL "Changer l'&icône...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14
+ CONTROL "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 12, 103, 21, 20
+ CONTROL "<< le résultat vient ici >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 53, 99, 161, 35
+ CONTROL "Résultat", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48
CONTROL "", IDC_PS_SOURCETEXT, "Edit", ES_READONLY | ES_AUTOHSCROLL | WS_VISIBLE, 37, 9, 180, 8
END
STRINGTABLE DISCARDABLE
{
- IDS_PS_PASTE_DATA "Insre le contenu du presse-papiers dans votre document comme %s."
- IDS_PS_PASTE_OBJECT "Insre le contenu du presse-papiers dans votre document de sorte que vous puissiez l'activer en utilisant %s."
- IDS_PS_PASTE_OBJECT_AS_ICON "Insre le contenu du presse-papiers dans votre document de sorte que vous puissiez l'activer en utilisant %s. Il sera affich comme une icne."
- IDS_PS_PASTE_LINK_DATA "Insre le contenu du presse-papiers dans votre document comme %s. Les donnes sont lies au fichier source de sorte que les modifications de celles-ci seront rpercutes dans votre document."
- IDS_PS_PASTE_LINK_OBJECT "Insre le contenu du presse-papiers dans votre document. L'image est lie au fichier source de sorte que les modifications de celle-ci seront rpercutes dans votre document."
- IDS_PS_PASTE_LINK_OBJECT_AS_ICON "Insre un raccourci qui pointe vers l'emplacement du contenu du presse-papiers. Le raccourci est li au fichier source de sorte que les modifications de celui-ci seront rpercutes dans votre document."
- IDS_PS_NON_OLE "Insre le contenu du presse-papiers dans votre document."
+ IDS_PS_PASTE_DATA "Insère le contenu du presse-papiers dans votre document comme %s."
+ IDS_PS_PASTE_OBJECT "Insère le contenu du presse-papiers dans votre document de sorte que vous puissiez l'activer en utilisant %s."
+ IDS_PS_PASTE_OBJECT_AS_ICON "Insère le contenu du presse-papiers dans votre document de sorte que vous puissiez l'activer en utilisant %s. Il sera affiché comme une icône."
+ IDS_PS_PASTE_LINK_DATA "Insère le contenu du presse-papiers dans votre document comme %s. Les données sont liées au fichier source de sorte que les modifications de celles-ci seront répercutées dans votre document."
+ IDS_PS_PASTE_LINK_OBJECT "Insère une image du contenu du presse-papiers dans votre document. L'image est liée au fichier source de sorte que les modifications de celui-ci seront répercutées dans votre document."
+ IDS_PS_PASTE_LINK_OBJECT_AS_ICON "Insère un raccourci qui pointe vers l'emplacement du contenu du presse-papiers. Le raccourci est lié au fichier source de sorte que les modifications de celui-ci seront répercutées dans votre document."
+ IDS_PS_NON_OLE "Insère le contenu du presse-papiers dans votre document."
IDS_PS_UNKNOWN_TYPE "Type inconnu"
IDS_PS_UNKNOWN_SRC "Source inconnue"
- IDS_PS_UNKNOWN_APP "le programme avec lequel il a t cr"
+ IDS_PS_UNKNOWN_APP "le programme avec lequel il a été créé"
}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/oledlg/oledlg_Hu.rc b/reactos/dll/win32/oledlg/oledlg_Hu.rc
index 58cc0882f2a..30bd8e03f96 100644
--- a/reactos/dll/win32/oledlg/oledlg_Hu.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Hu.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
diff --git a/reactos/dll/win32/oledlg/oledlg_It.rc b/reactos/dll/win32/oledlg/oledlg_It.rc
index 2a23abdffcc..91e43b274c8 100644
--- a/reactos/dll/win32/oledlg/oledlg_It.rc
+++ b/reactos/dll/win32/oledlg/oledlg_It.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
diff --git a/reactos/dll/win32/oledlg/oledlg_Ja.rc b/reactos/dll/win32/oledlg/oledlg_Ja.rc
index d753022f257..e6680dd7f21 100644
--- a/reactos/dll/win32/oledlg/oledlg_Ja.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Ja.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
/* UTF-8 */
#pragma code_page(65001)
@@ -56,5 +58,4 @@ STRINGTABLE DISCARDABLE
IDS_NOTOLEMOD "ファイルは有効なOLEモジュールではないようです。OLEコントロールを登録できません。"
IDS_NOTOLEMODCAPTION "コントロールを追加"
}
-
#pragma code_page(default)
diff --git a/reactos/dll/win32/oledlg/oledlg_Ko.rc b/reactos/dll/win32/oledlg/oledlg_Ko.rc
index 32a49305afc..7e0ae7e5ba4 100644
--- a/reactos/dll/win32/oledlg/oledlg_Ko.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Ko.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
diff --git a/reactos/dll/win32/oledlg/oledlg_Lt.rc b/reactos/dll/win32/oledlg/oledlg_Lt.rc
new file mode 100644
index 00000000000..02451c470cf
--- /dev/null
+++ b/reactos/dll/win32/oledlg/oledlg_Lt.rc
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "resource.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Įterpti objektą"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LISTBOX IDC_OBJTYPELIST,82,19,131,66,LBS_SORT |
+ LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL |
+ WS_TABSTOP
+ LTEXT "Objekto tipas:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE
+ DEFPUSHBUTTON "Gerai",IDOK,221,7,66,14
+ PUSHBUTTON "Atsisakyti",IDCANCEL,221,24,66,14
+ GROUPBOX "Rezultatas",IDC_RESULT,7,103,208,41
+ CONTROL "Sukurti naują",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON |
+ WS_GROUP,7,20,62,10
+ CONTROL "Sukurti valdiklį",IDC_CREATECONTROL,"Button",
+ BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10
+ CONTROL "Sukurti iš failo",IDC_CREATEFROMFILE,"Button",
+ BS_AUTORADIOBUTTON,7,37,67,10
+ LTEXT "",IDC_RESULTDESC,49,112,159,23
+ PUSHBUTTON "&Pridėti valdiklį...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
+ CONTROL "Rodyti kaip piktogramą",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
+ BS_MULTILINE | WS_TABSTOP | NOT WS_VISIBLE,223,58,64,20
+ PUSHBUTTON "Parinkti...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
+ LTEXT "Failas:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE
+ EDITTEXT IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE
+END
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_RESULTOBJDESC "Įterpia naują objektą „%s“ į jūsų dokumentą"
+ IDS_RESULTFILEOBJDESC "Įterpia failo turinį kaip objektą į jūsų dokumentą, kad galėtumėte jį aktyvuoti naudodami programą, kuri jį sukūrė."
+ IDS_BROWSE "Parinkti"
+ IDS_NOTOLEMOD "Panašu, kad failas nėra galiojantis OLE modulis. Nepavyko užregistruoti OLE valdiklio."
+ IDS_NOTOLEMODCAPTION "Pridėti valdiklį"
+}
+
+IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 293, 140
+STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Įdėti kaip"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Šaltinis:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
+ CONTROL "Į&dėti", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
+ 6, 38, 55, 10
+ CONTROL "Įdėti &saitą", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
+ 6, 63, 55, 10
+ LTEXT "&Kaip:", -1, 65, 25, 16, 8, WS_VISIBLE | WS_GROUP
+ LISTBOX IDC_PS_PASTELIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
+ LISTBOX IDC_PS_PASTELINKLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
+ LISTBOX IDC_PS_DISPLAYLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | WS_VISIBLE
+ CONTROL "Gerai", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 224, 6, 66, 14
+ CONTROL "Atsisakyti", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 23, 66, 14
+ CONTROL "&Žinynas", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14
+ CONTROL "&Rodyti kaip piktogramą", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP | WS_VISIBLE, 224, 59, 66, 20
+ CONTROL "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 81, 66, 44
+ CONTROL "Keisti &piktogramą...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14
+ CONTROL "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34
+ CONTROL "<< čia pateikiamas rezultato tekstas >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35
+ CONTROL "Rezultatas", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48
+ CONTROL "", IDC_PS_SOURCETEXT, "Edit", ES_READONLY | ES_AUTOHSCROLL | WS_VISIBLE, 37, 9, 180, 8
+END
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_PS_PASTE_DATA "Įterpia iškarpinės turinį į jūsų dokumentą kaip %s."
+ IDS_PS_PASTE_OBJECT "Įterpia iškarpinės turinį į jūsų dokumentą, kad galėtumėte jį aktyvuoti naudodami %s."
+ IDS_PS_PASTE_OBJECT_AS_ICON "Įterpia iškarpinės turinį į jūsų dokumentą, kad galėtumėte jį aktyvuoti naudodami %s. Jis bus rodomas kaip piktograma."
+ IDS_PS_PASTE_LINK_DATA "Įterpia iškarpinės turinį į jūsų dokumentą kaip %s. Duomenys yra susieti su šaltinio failu, todėl failo pakeitimai bus atspindėti jūsų dokumente."
+ IDS_PS_PASTE_LINK_OBJECT "Įterpia iškarpinės turinio paveikslą į jūsų dokumentą. Paveikslas yra susietas su šaltinio failu, todėl failo pakeitimai bus atspindėti jūsų dokumente."
+ IDS_PS_PASTE_LINK_OBJECT_AS_ICON "Įterpia nuorodą, kuri rodo į iškarpinės turinį. Nuoroda yra susieta su šaltinio failu, todėl failo pakeitimai bus atspindėti jūsų dokumente."
+ IDS_PS_NON_OLE "Įterpia iškarpinės turinį į jūsų dokumentą."
+ IDS_PS_UNKNOWN_TYPE "Nežinomas tipas"
+ IDS_PS_UNKNOWN_SRC "Nežinomas šaltinis"
+ IDS_PS_UNKNOWN_APP "programa, kuri jį sukūrė"
+}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/oledlg/oledlg_Nl.rc b/reactos/dll/win32/oledlg/oledlg_Nl.rc
index 27b0e745db2..58a63da7cae 100644
--- a/reactos/dll/win32/oledlg/oledlg_Nl.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
diff --git a/reactos/dll/win32/oledlg/oledlg_No.rc b/reactos/dll/win32/oledlg/oledlg_No.rc
index 4e0411480ed..5657d495737 100644
--- a/reactos/dll/win32/oledlg/oledlg_No.rc
+++ b/reactos/dll/win32/oledlg/oledlg_No.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
diff --git a/reactos/dll/win32/oledlg/oledlg_Pl.rc b/reactos/dll/win32/oledlg/oledlg_Pl.rc
index 1777dcb053a..079a2b9d82b 100644
--- a/reactos/dll/win32/oledlg/oledlg_Pl.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Pl.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 310, 151
diff --git a/reactos/dll/win32/oledlg/oledlg_Pt.rc b/reactos/dll/win32/oledlg/oledlg_Pt.rc
index 69cd06a4629..9ef209e2d9f 100644
--- a/reactos/dll/win32/oledlg/oledlg_Pt.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Pt.rc
@@ -1,6 +1,7 @@
/*
* Copyright 2004 Marcelo Duarte
- * Copyright 2006 Amrico Jos Melo
+ * Copyright 2006 Américo José Melo
+ * Copyright 2009 Ricardo Filipe
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,6 +18,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
+#pragma code_page(65001)
+
LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
@@ -39,7 +44,7 @@ BEGIN
BS_AUTORADIOBUTTON,7,37,67,10
LTEXT "",IDC_RESULTDESC,49,112,159,23
PUSHBUTTON "&Adicionar Controle...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
- CONTROL "Mostrar como cone",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
+ CONTROL "Mostrar como ícone",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10
PUSHBUTTON "Procurar...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
LTEXT "Arquivo:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE
@@ -68,7 +73,7 @@ BEGIN
BS_AUTORADIOBUTTON,7,37,67,10
LTEXT "",IDC_RESULTDESC,49,112,159,23
PUSHBUTTON "&Adicionar Controlo...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
- CONTROL "Mostrar como cone",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
+ CONTROL "Mostrar como ícone",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10
PUSHBUTTON "Procurar...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
LTEXT "Ficheiro:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE
@@ -81,9 +86,9 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
STRINGTABLE DISCARDABLE
{
IDS_RESULTOBJDESC "Inserir um novo objeto %s no documento"
- IDS_RESULTFILEOBJDESC "Inserir o contedo do arquivo como um objeto no documento de modo que possa ativ-lo usando o programa que o criou."
+ IDS_RESULTFILEOBJDESC "Inserir o conteúdo do arquivo como um objeto no documento de modo que possa ativá-lo usando o programa que o criou."
IDS_BROWSE "Procurar"
- IDS_NOTOLEMOD "O arquivo no parece ser um mdulo OLE vlido. Impossvel registrar o controle OLE."
+ IDS_NOTOLEMOD "O arquivo não parece ser um módulo OLE válido. Impossível registrar o controle OLE."
IDS_NOTOLEMODCAPTION "Adicionar Controle"
}
@@ -92,8 +97,48 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
STRINGTABLE DISCARDABLE
{
IDS_RESULTOBJDESC "Inserir novo objecto %s no documento"
- IDS_RESULTFILEOBJDESC "Inserir contedo do ficheiro como um objecto no documento de modo que opossa activar usando o programa que o criou."
+ IDS_RESULTFILEOBJDESC "Inserir conteúdo do ficheiro como um objecto no documento de modo que opossa activar usando o programa que o criou."
IDS_BROWSE "Procurar"
- IDS_NOTOLEMOD "O ficheiro no parece ser um mdulo OLE vlido. Impossvel registrar o controlo OLE."
+ IDS_NOTOLEMOD "O ficheiro não parece ser um módulo OLE válido. Impossível registrar o controlo OLE."
IDS_NOTOLEMODCAPTION "Adicionar Controlo"
}
+
+IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 293, 140
+STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Colar Especial"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Origem:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
+ CONTROL "&Colar", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
+ 6, 38, 55, 10
+ CONTROL "Colar &Ligação", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
+ 6, 63, 55, 10
+ LTEXT "&Como:", -1, 65, 25, 16, 8, WS_VISIBLE | WS_GROUP
+ LISTBOX IDC_PS_PASTELIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
+ LISTBOX IDC_PS_PASTELINKLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
+ LISTBOX IDC_PS_DISPLAYLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | WS_VISIBLE
+ CONTROL "OK", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 224, 6, 66, 14
+ CONTROL "Cancelar", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 23, 66, 14
+ CONTROL "&Ajuda", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14
+ CONTROL "&Mostrar como Icone", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE, 224, 59, 66, 14
+ CONTROL "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 75, 66, 44
+ CONTROL "Mudar &Icone...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14
+ CONTROL "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34
+ CONTROL "<< texto resultante fica aqui >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35
+ CONTROL "Resultado", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48
+ CONTROL "", IDC_PS_SOURCETEXT, "Edit", ES_READONLY | ES_AUTOHSCROLL | WS_VISIBLE, 37, 9, 180, 8
+END
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_PS_PASTE_DATA "Insere o conteúdo da área de transferência no seu documento como %s."
+ IDS_PS_PASTE_OBJECT "Insere o conteúdo da área de transferência no seu documento para que o possa activar usando %s."
+ IDS_PS_PASTE_OBJECT_AS_ICON "Insere o conteúdo da área de transferência no seu documento para que o possa activar usando %s. Vai ser mostrado como um icone."
+ IDS_PS_PASTE_LINK_DATA "Insere o conteúdo da área de transferência no seu documento como %s. Os dados estão ligados ao ficheiro de origem para que alterações ao ficheiro se reflictam no seu documento."
+ IDS_PS_PASTE_LINK_OBJECT "Insere uma imagem da área de transferência no seu documento. A imagem fica ligada ao ficheiro de origem para que alterações ao ficheiro se reflictam no seu documento."
+ IDS_PS_PASTE_LINK_OBJECT_AS_ICON "Insere um atalho que aponta para a localização do conteúdo na área de transferência. O atalho fica ligado ao ficheiro de origem para que alterações ao ficheiro se reflictam no seu documento."
+ IDS_PS_NON_OLE "Insere o conteúdo da área de transferência no seu documento."
+ IDS_PS_UNKNOWN_TYPE "Tipo Desconhecido"
+ IDS_PS_UNKNOWN_SRC "Origem Desconhecida"
+ IDS_PS_UNKNOWN_APP "o programa que o criou"
+}
diff --git a/reactos/dll/win32/oledlg/oledlg_Ru.rc b/reactos/dll/win32/oledlg/oledlg_Ru.rc
index 10453ef97eb..46b89dbce96 100644
--- a/reactos/dll/win32/oledlg/oledlg_Ru.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Ru.rc
@@ -16,80 +16,85 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION " "
+CAPTION "Вставить объект"
FONT 8, "MS Shell Dlg"
BEGIN
LISTBOX IDC_OBJTYPELIST,82,19,131,66,LBS_SORT |
LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL |
WS_TABSTOP
- LTEXT " :",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE
+ LTEXT "Тип объекта:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE
DEFPUSHBUTTON "OK",IDOK,221,7,66,14
- PUSHBUTTON "",IDCANCEL,221,24,66,14
- GROUPBOX "",IDC_RESULT,7,103,208,41
- CONTROL " ",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON |
+ PUSHBUTTON "Отмена",IDCANCEL,221,24,66,14
+ GROUPBOX "Результат",IDC_RESULT,7,103,208,41
+ CONTROL "Создать новый",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON |
WS_GROUP,7,20,62,10
- CONTROL " ",IDC_CREATECONTROL,"Button",
+ CONTROL "Создать элемент управления",IDC_CREATECONTROL,"Button",
BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10
- CONTROL " ",IDC_CREATEFROMFILE,"Button",
+ CONTROL "Создать из файла",IDC_CREATEFROMFILE,"Button",
BS_AUTORADIOBUTTON,7,37,67,10
LTEXT "",IDC_RESULTDESC,49,112,159,23
- PUSHBUTTON "& ...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
+ PUSHBUTTON "&Добавить элемент управления...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
CONTROL "Display As Icon",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10
- PUSHBUTTON "...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
- LTEXT ":",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE
+ PUSHBUTTON "Выбрать...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
+ LTEXT "Файл:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE
EDITTEXT IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE
END
STRINGTABLE DISCARDABLE
{
- IDS_RESULTOBJDESC " %s "
- IDS_RESULTFILEOBJDESC " . ."
- IDS_BROWSE ""
- IDS_NOTOLEMOD " OLE. OLE."
- IDS_NOTOLEMODCAPTION " "
+ IDS_RESULTOBJDESC "Добавление нового объекта %s в документ"
+ IDS_RESULTFILEOBJDESC "Добавление объекта из файла в документ. Работать с объектом можно будет в создавшей его программе."
+ IDS_BROWSE "Просмотр"
+ IDS_NOTOLEMOD "Файл не является корректным модулем OLE. Невозможно зарегистрировать элемент управления OLE."
+ IDS_NOTOLEMODCAPTION "Добавить элемент управления"
}
IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 293, 140
STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION " "
+CAPTION "Специальная вставка"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT ":", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
- CONTROL "&", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
+ LTEXT "Источник:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
+ CONTROL "&Вставить", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
6, 38, 55, 10
- CONTROL " &", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
+ CONTROL "Вставить &Ссылку", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
6, 63, 55, 10
- LTEXT "&:", -1, 65, 25, 16, 8, WS_VISIBLE | WS_GROUP
+ LTEXT "&Как:", -1, 65, 25, 16, 8, WS_VISIBLE | WS_GROUP
LISTBOX IDC_PS_PASTELIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
LISTBOX IDC_PS_PASTELINKLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
LISTBOX IDC_PS_DISPLAYLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | WS_VISIBLE
CONTROL "OK", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 224, 6, 66, 14
- CONTROL "", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 23, 66, 14
- CONTROL "&", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14
- CONTROL "& ", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE, 224, 59, 66, 14
+ CONTROL "Отмена", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 23, 66, 14
+ CONTROL "С&правка", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14
+ CONTROL "&Показывать как значок", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE, 224, 59, 66, 14
CONTROL "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 75, 66, 44
- CONTROL " &...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14
+ CONTROL "Изменить &значок...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14
CONTROL "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34
CONTROL "<< result text goes here >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35
- CONTROL "", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48
+ CONTROL "Результат", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48
CONTROL "", IDC_PS_SOURCETEXT, "Edit", ES_READONLY | ES_AUTOHSCROLL | WS_VISIBLE, 37, 9, 180, 8
END
STRINGTABLE DISCARDABLE
{
- IDS_PS_PASTE_DATA " %s."
- IDS_PS_PASTE_OBJECT " , , %s."
- IDS_PS_PASTE_OBJECT_AS_ICON " , , %s. ."
- IDS_PS_PASTE_LINK_DATA " %s. , ."
- IDS_PS_PASTE_LINK_OBJECT " . , ."
- IDS_PS_PASTE_LINK_OBJECT_AS_ICON " , . , ."
- IDS_PS_NON_OLE " ."
- IDS_PS_UNKNOWN_TYPE " "
- IDS_PS_UNKNOWN_SRC " "
- IDS_PS_UNKNOWN_APP ", "
+ IDS_PS_PASTE_DATA "Вставка содержимого буфера обмена в документ как %s."
+ IDS_PS_PASTE_OBJECT "Вставка содержимого буфера обмена в документ так, что его можно активировать, используя %s."
+ IDS_PS_PASTE_OBJECT_AS_ICON "Вставка содержимого буфера обмена в документ так, что его можно активировать, используя %s. Он будет отображаться в виде значка."
+ IDS_PS_PASTE_LINK_DATA "Вставка содержимого буфера обмена в документ как %s. Данные будут связаны с исходным файлом, так что изменения в нём будут отражаться в документе."
+ IDS_PS_PASTE_LINK_OBJECT "Вставка изображения из буфера обмена в документ. Избражение будет связано с исходным файлом, так что изменения в нём будут отражаться в документе."
+ IDS_PS_PASTE_LINK_OBJECT_AS_ICON "Вставка ссылки, которая будет указывать на расположение содержимого буфера обмена. Ссылка будет связана с исходным файлом, так что изменения в нём будут отражаться в документе."
+ IDS_PS_NON_OLE "Вставка содержимое буфера обмена в документ."
+ IDS_PS_UNKNOWN_TYPE "Неизвестный тип"
+ IDS_PS_UNKNOWN_SRC "Неизвестный источник"
+ IDS_PS_UNKNOWN_APP "программа, которая его создала"
}
diff --git a/reactos/dll/win32/oledlg/oledlg_Si.rc b/reactos/dll/win32/oledlg/oledlg_Si.rc
index 04e0eb3c3cb..55af95ec373 100644
--- a/reactos/dll/win32/oledlg/oledlg_Si.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Si.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
@@ -95,5 +97,4 @@ STRINGTABLE DISCARDABLE
IDS_PS_UNKNOWN_SRC "Neznan vir"
IDS_PS_UNKNOWN_APP "Neznan program"
}
-
#pragma code_page(default)
diff --git a/reactos/dll/win32/oledlg/oledlg_Sv.rc b/reactos/dll/win32/oledlg/oledlg_Sv.rc
index c775f4661f1..6a38d90e369 100644
--- a/reactos/dll/win32/oledlg/oledlg_Sv.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Sv.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
diff --git a/reactos/dll/win32/oledlg/oledlg_Tr.rc b/reactos/dll/win32/oledlg/oledlg_Tr.rc
index 8a96fe43220..7e68c0094ed 100644
--- a/reactos/dll/win32/oledlg/oledlg_Tr.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Tr.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151
diff --git a/reactos/dll/win32/oledlg/oledlg_Zh.rc b/reactos/dll/win32/oledlg/oledlg_Zh.rc
index 2f2daeda90d..40aac0b9814 100644
--- a/reactos/dll/win32/oledlg/oledlg_Zh.rc
+++ b/reactos/dll/win32/oledlg/oledlg_Zh.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -176,5 +178,3 @@ STRINGTABLE DISCARDABLE
IDS_PS_UNKNOWN_SRC "不明來源"
IDS_PS_UNKNOWN_APP "不明應用程式"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/oledlg/resource.h b/reactos/dll/win32/oledlg/resource.h
index 518f7ba6255..13ca052daa8 100644
--- a/reactos/dll/win32/oledlg/resource.h
+++ b/reactos/dll/win32/oledlg/resource.h
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include
+
#define IDS_RESULTOBJDESC 101
#define IDS_RESULTFILEOBJDESC 102
#define IDS_BROWSE 103
diff --git a/reactos/dll/win32/oledlg/rsrc.rc b/reactos/dll/win32/oledlg/rsrc.rc
index 4cbc8628f33..ef8e0ff42de 100644
--- a/reactos/dll/win32/oledlg/rsrc.rc
+++ b/reactos/dll/win32/oledlg/rsrc.rc
@@ -43,6 +43,7 @@
#include "oledlg_It.rc"
#include "oledlg_Ja.rc"
#include "oledlg_Ko.rc"
+#include "oledlg_Lt.rc"
#include "oledlg_Nl.rc"
#include "oledlg_No.rc"
#include "oledlg_Pl.rc"
diff --git a/reactos/dll/win32/olesvr32/olesvr32.spec b/reactos/dll/win32/olesvr32/olesvr32.spec
index 9fdd02d9d84..9db60ec44a6 100644
--- a/reactos/dll/win32/olesvr32/olesvr32.spec
+++ b/reactos/dll/win32/olesvr32/olesvr32.spec
@@ -1,6 +1,6 @@
1 stub WEP
2 stdcall OleRegisterServer(str ptr ptr long long)
- 3 stub OleRevokeServer
+ 3 stdcall OleRevokeServer(long)
4 stdcall OleBlockServer(long)
5 stdcall OleUnblockServer(long ptr)
6 stdcall OleRegisterServerDoc(ptr str ptr ptr)
diff --git a/reactos/dll/win32/olesvr32/olesvr_main.c b/reactos/dll/win32/olesvr32/olesvr_main.c
index b48d58bf75a..57c28e1b9b2 100644
--- a/reactos/dll/win32/olesvr32/olesvr_main.c
+++ b/reactos/dll/win32/olesvr32/olesvr_main.c
@@ -210,3 +210,13 @@ OLESTATUS WINAPI OleSavedServerDoc(LHSERVERDOC hDoc)
FIXME("(%d): stub.\n", hDoc);
return OLE_OK;
}
+
+/******************************************************************************
+ * OleRevokeServer [OLESVR32.3]
+ *
+ */
+OLESTATUS WINAPI OleRevokeServer(LHSERVER hServer)
+{
+ FIXME("(%d): stub.\n", hServer);
+ return OLE_OK;
+}
diff --git a/reactos/dll/win32/opengl32/gl.c b/reactos/dll/win32/opengl32/gl.c
index 3bc58e3fd8b..87e868f0a6c 100644
--- a/reactos/dll/win32/opengl32/gl.c
+++ b/reactos/dll/win32/opengl32/gl.c
@@ -19,14 +19,14 @@
*
* On other machines we use C to forward the calls (slow...)
*/
-
+
#include "opengl32.h"
#if defined(_M_IX86)
C_ASSERT(FIELD_OFFSET(TEB, glTable) == 0xbe8);
#endif
-int WINAPI glEmptyFunc0() { return 0; }
+int WINAPI glEmptyFunc0( void ) { return 0; }
int WINAPI glEmptyFunc4( long l1 ) { return 0; }
int WINAPI glEmptyFunc8( long l1, long l2 ) { return 0; }
int WINAPI glEmptyFunc12( long l1, long l2, long l3 ) { return 0; }
@@ -61,7 +61,7 @@ int WINAPI glEmptyFunc56( long l1, long l2, long l3, long l4, long l5,
#if defined(_M_IX86)
# define FOO(x) #x
-#if __MINGW32__
+#ifdef __GNUC__
# define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
__asm__(".align 4" "\n\t" \
".globl _"#func"@"#stack "\n\t" \
@@ -69,6 +69,14 @@ __asm__(".align 4" "\n\t" \
" movl %fs:0x18, %eax" "\n\t" \
" movl 0xbe8(%eax), %eax" "\n\t" \
" jmp *"FOO((icdidx*4))"(%eax)" "\n\t");
+#elif defined(_MSC_VER)
+# define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
+__declspec(naked) ret WINAPI func typeargs \
+{ \
+ __asm { mov eax, dword ptr fs:[18h] }; \
+ __asm { mov eax, dword ptr [eax+0be8h] }; \
+ __asm { jmp dword ptr [eax+icdidx*4] }; \
+}
#else
# define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
ret WINAPI func typeargs \
diff --git a/reactos/dll/win32/opengl32/opengl32.c b/reactos/dll/win32/opengl32/opengl32.c
index a76e334eee7..8412089150c 100644
--- a/reactos/dll/win32/opengl32/opengl32.c
+++ b/reactos/dll/win32/opengl32/opengl32.c
@@ -26,7 +26,7 @@ GLPROCESSDATA OPENGL32_processdata;
static BOOL
-OPENGL32_ThreadAttach()
+OPENGL32_ThreadAttach( void )
{
GLTHREADDATA* lpData = NULL;
PROC *dispatchTable = NULL;
@@ -69,7 +69,7 @@ OPENGL32_ThreadAttach()
static void
-OPENGL32_ThreadDetach()
+OPENGL32_ThreadDetach( void )
{
GLTHREADDATA* lpData = NULL;
PROC *dispatchTable = NULL;
@@ -96,7 +96,7 @@ OPENGL32_ThreadDetach()
static BOOL
-OPENGL32_ProcessAttach()
+OPENGL32_ProcessAttach( void )
{
SECURITY_ATTRIBUTES attrib = { sizeof (SECURITY_ATTRIBUTES), /* nLength */
NULL, /* lpSecurityDescriptor */
@@ -136,7 +136,7 @@ OPENGL32_ProcessAttach()
static void
-OPENGL32_ProcessDetach()
+OPENGL32_ProcessDetach( void )
{
GLDRIVERDATA *icd, *icd2;
GLDCDATA *dcdata, *dcdata2;
diff --git a/reactos/dll/win32/opengl32/opengl32.h b/reactos/dll/win32/opengl32/opengl32.h
index 05c27e388fc..32d761bb978 100644
--- a/reactos/dll/win32/opengl32/opengl32.h
+++ b/reactos/dll/win32/opengl32/opengl32.h
@@ -103,7 +103,7 @@ extern "C" {
#ifdef APIENTRY
#undef APIENTRY
#endif /* APIENTRY */
-#define APIENTRY EXPORT __stdcall
+#define APIENTRY __stdcall
/* Called by the driver to set the dispatch table */
typedef DWORD (WINAPI *SetContextCallBack)( const ICDTable * );
@@ -192,7 +192,7 @@ BOOL OPENGL32_UnloadICD( GLDRIVERDATA *icd );
BOOL APIENTRY rosglMakeCurrent( HDC hdc, HGLRC hglrc );
/* empty gl functions from gl.c */
-int WINAPI glEmptyFunc0();
+int WINAPI glEmptyFunc0( void );
int WINAPI glEmptyFunc4( long );
int WINAPI glEmptyFunc8( long, long );
int WINAPI glEmptyFunc12( long, long, long );
@@ -216,7 +216,7 @@ int WINAPI glEmptyFunc56( long, long, long, long, long, long, long, long,
#ifdef OPENGL32_GL_FUNC_PROTOTYPES
-#define X(func,ret,typeargs,args,icdidx,tebidx,stack) EXPORT ret WINAPI func typeargs;
+#define X(func,ret,typeargs,args,icdidx,tebidx,stack) ret WINAPI func typeargs;
GLFUNCS_MACRO
#undef X
diff --git a/reactos/dll/win32/psapi/psapi.c b/reactos/dll/win32/psapi/psapi.c
index 37616c23fa4..03734a92295 100644
--- a/reactos/dll/win32/psapi/psapi.c
+++ b/reactos/dll/win32/psapi/psapi.c
@@ -587,7 +587,7 @@ typedef struct _INTERNAL_ENUM_PAGE_FILES_CONTEXT
} INTERNAL_ENUM_PAGE_FILES_CONTEXT, *PINTERNAL_ENUM_PAGE_FILES_CONTEXT;
-static BOOL
+static BOOL CALLBACK
InternalAnsiPageFileCallback(LPVOID pContext,
PENUM_PAGE_FILE_INFORMATION pPageFileInfo,
LPCWSTR lpFilename)
diff --git a/reactos/dll/win32/rasman/rasman.c b/reactos/dll/win32/rasman/rasman.c
index ff980e15a7e..46c9697f214 100644
--- a/reactos/dll/win32/rasman/rasman.c
+++ b/reactos/dll/win32/rasman/rasman.c
@@ -38,7 +38,7 @@ RasSecurityDialogComplete(SECURITY_MESSAGE* pSecMsg)
DWORD WINAPI
RasSecurityDialogBegin(HPORT hPort, PBYTE pSendBuf,
DWORD SendBufSize, PBYTE pRecvBuf, DWORD RecvBufSize,
- VOID (WINAPI *RasSecurityDialogComplete)())
+ VOID (WINAPI *RasSecurityDialogComplete)(SECURITY_MESSAGE*))
{
FIXME("(%p,%p,0x%08x,%p,0x%08x,%p),stub!\n",hPort,pSendBuf,SendBufSize,
pRecvBuf,RecvBufSize,*RasSecurityDialogComplete);
diff --git a/reactos/dll/win32/riched20/riched20.rbuild b/reactos/dll/win32/riched20/riched20.rbuild
index 384445726f5..f28a2fa0e14 100644
--- a/reactos/dll/win32/riched20/riched20.rbuild
+++ b/reactos/dll/win32/riched20/riched20.rbuild
@@ -6,6 +6,7 @@
.
include/reactos/wine
+ /FIwine/typeof.h
-enable-stdcall-fixup
caret.c
clipboard.c
diff --git a/reactos/dll/win32/rpcrt4/ndr_es.c b/reactos/dll/win32/rpcrt4/ndr_es.c
index b0bb7cc5f40..dc50ad8b025 100644
--- a/reactos/dll/win32/rpcrt4/ndr_es.c
+++ b/reactos/dll/win32/rpcrt4/ndr_es.c
@@ -105,7 +105,7 @@ RPC_STATUS WINAPI MesIncrementalHandleReset(
handle_t Handle, void *UserState, MIDL_ES_ALLOC AllocFn,
MIDL_ES_WRITE WriteFn, MIDL_ES_READ ReadFn, MIDL_ES_CODE Operation)
{
- MIDL_ES_MESSAGE *pEsMsg = (MIDL_ES_MESSAGE *)Handle;
+ MIDL_ES_MESSAGE *pEsMsg = Handle;
TRACE("(%p, %p, %p, %p, %p, %d)\n", Handle, UserState, AllocFn,
WriteFn, ReadFn, Operation);
@@ -324,7 +324,7 @@ void WINAPIV NdrMesProcEncodeDecode(handle_t Handle, const MIDL_STUB_DESC * pStu
{
/* pointer to start of stack where arguments start */
RPC_MESSAGE rpcMsg;
- MIDL_ES_MESSAGE *pEsMsg = (MIDL_ES_MESSAGE *)Handle;
+ MIDL_ES_MESSAGE *pEsMsg = Handle;
/* size of stack */
unsigned short stack_size;
/* header for procedure string */
diff --git a/reactos/dll/win32/rpcrt4/ndr_marshall.c b/reactos/dll/win32/rpcrt4/ndr_marshall.c
index e0ff73d9dd4..9846d9e2e7b 100644
--- a/reactos/dll/win32/rpcrt4/ndr_marshall.c
+++ b/reactos/dll/win32/rpcrt4/ndr_marshall.c
@@ -102,9 +102,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole);
} while(0)
#define STD_OVERFLOW_CHECK(_Msg) do { \
- TRACE("buffer=%d/%d\n", _Msg->Buffer - (unsigned char *)_Msg->RpcMsg->Buffer, _Msg->BufferLength); \
+ TRACE("buffer=%d/%d\n", (ULONG)(_Msg->Buffer - (unsigned char *)_Msg->RpcMsg->Buffer), _Msg->BufferLength); \
if (_Msg->Buffer > (unsigned char *)_Msg->RpcMsg->Buffer + _Msg->BufferLength) \
- ERR("buffer overflow %d bytes\n", _Msg->Buffer - ((unsigned char *)_Msg->RpcMsg->Buffer + _Msg->BufferLength)); \
+ ERR("buffer overflow %d bytes\n", (ULONG)(_Msg->Buffer - ((unsigned char *)_Msg->RpcMsg->Buffer + _Msg->BufferLength))); \
} while (0)
#define NDR_POINTER_ID_BASE 0x20000
@@ -998,9 +998,8 @@ static void PointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
/***********************************************************************
* PointerMemorySize [internal]
*/
-static unsigned long PointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
- unsigned char *Buffer,
- PFORMAT_STRING pFormat)
+static ULONG PointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
+ unsigned char *Buffer, PFORMAT_STRING pFormat)
{
unsigned type = pFormat[0], attr = pFormat[1];
PFORMAT_STRING desc;
@@ -1043,6 +1042,8 @@ static unsigned long PointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
}
if (attr & RPC_FC_P_DEREF) {
+ ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(void*));
+ pStubMsg->MemorySize += sizeof(void*);
TRACE("deref\n");
}
@@ -1339,8 +1340,8 @@ static void EmbeddedPointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
/***********************************************************************
* EmbeddedPointerMemorySize [internal]
*/
-static unsigned long EmbeddedPointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
- PFORMAT_STRING pFormat)
+static ULONG EmbeddedPointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
+ PFORMAT_STRING pFormat)
{
unsigned char *Mark = pStubMsg->BufferMark;
unsigned rep, count, stride;
@@ -1500,18 +1501,28 @@ unsigned char * WINAPI NdrPointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
- /* Increment the buffer here instead of in PointerUnmarshall,
- * as that is used by embedded pointers which already handle the incrementing
- * the buffer, and shouldn't read any additional pointer data from the
- * buffer */
- if (*pFormat != RPC_FC_RP)
+ if (*pFormat == RPC_FC_RP)
{
+ Buffer = pStubMsg->Buffer;
+ /* Do the NULL ref pointer check here because embedded pointers can be
+ * NULL if the type the pointer is embedded in was allocated rather than
+ * being passed in by the client */
+ if (pStubMsg->IsClient && !*ppMemory)
+ {
+ ERR("NULL ref pointer is not allowed\n");
+ RpcRaiseException(RPC_X_NULL_REF_POINTER);
+ }
+ }
+ else
+ {
+ /* Increment the buffer here instead of in PointerUnmarshall,
+ * as that is used by embedded pointers which already handle the incrementing
+ * the buffer, and shouldn't read any additional pointer data from the
+ * buffer */
ALIGN_POINTER(pStubMsg->Buffer, 4);
Buffer = pStubMsg->Buffer;
safe_buffer_increment(pStubMsg, 4);
}
- else
- Buffer = pStubMsg->Buffer;
PointerUnmarshall(pStubMsg, Buffer, ppMemory, *ppMemory, pFormat, fMustAlloc);
@@ -1545,10 +1556,14 @@ void WINAPI NdrPointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
ULONG WINAPI NdrPointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
PFORMAT_STRING pFormat)
{
- /* unsigned size = *(LPWORD)(pFormat+2); */
- FIXME("(%p,%p): stub\n", pStubMsg, pFormat);
- PointerMemorySize(pStubMsg, pStubMsg->Buffer, pFormat);
- return 0;
+ unsigned char *Buffer = pStubMsg->Buffer;
+ if (*pFormat != RPC_FC_RP)
+ {
+ ALIGN_POINTER(pStubMsg->Buffer, 4);
+ safe_buffer_increment(pStubMsg, 4);
+ }
+ ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(void *));
+ return PointerMemorySize(pStubMsg, Buffer, pFormat);
}
/***********************************************************************
@@ -2559,8 +2574,8 @@ typedef struct
} NDR_RANGE;
#include "poppack.h"
-static unsigned long EmbeddedComplexSize(MIDL_STUB_MESSAGE *pStubMsg,
- PFORMAT_STRING pFormat)
+static ULONG EmbeddedComplexSize(MIDL_STUB_MESSAGE *pStubMsg,
+ PFORMAT_STRING pFormat)
{
switch (*pFormat) {
case RPC_FC_STRUCT:
@@ -2621,8 +2636,8 @@ static unsigned long EmbeddedComplexSize(MIDL_STUB_MESSAGE *pStubMsg,
}
-static unsigned long EmbeddedComplexMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
- PFORMAT_STRING pFormat)
+static ULONG EmbeddedComplexMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
+ PFORMAT_STRING pFormat)
{
NDR_MEMORYSIZE m = NdrMemorySizer[*pFormat & NDR_TABLE_MASK];
@@ -2643,7 +2658,7 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
{
PFORMAT_STRING desc;
NDR_MARSHALL m;
- unsigned long size;
+ ULONG size;
while (*pFormat != RPC_FC_END) {
switch (*pFormat) {
@@ -2709,9 +2724,12 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
}
TRACE("pStubMsg->Buffer after %p\n", pStubMsg->Buffer);
pPointer += 4;
- pMemory += 4;
+ pMemory += sizeof(void *);
break;
}
+ case RPC_FC_ALIGNM2:
+ ALIGN_POINTER(pMemory, 2);
+ break;
case RPC_FC_ALIGNM4:
ALIGN_POINTER(pMemory, 4);
break;
@@ -2732,7 +2750,7 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,
pFormat += 2;
desc = pFormat + *(const SHORT*)pFormat;
size = EmbeddedComplexSize(pStubMsg, desc);
- TRACE("embedded complex (size=%ld) <= %p\n", size, pMemory);
+ TRACE("embedded complex (size=%d) <= %p\n", size, pMemory);
m = NdrMarshaller[*desc & NDR_TABLE_MASK];
if (m)
{
@@ -2768,7 +2786,7 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
{
PFORMAT_STRING desc;
NDR_UNMARSHALL m;
- unsigned long size;
+ ULONG size;
while (*pFormat != RPC_FC_END) {
switch (*pFormat) {
@@ -2834,9 +2852,12 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
safe_buffer_increment(pStubMsg, 4); /* for pointer ID */
}
pPointer += 4;
- pMemory += 4;
+ pMemory += sizeof(void *);
break;
}
+ case RPC_FC_ALIGNM2:
+ ALIGN_POINTER_CLEAR(pMemory, 2);
+ break;
case RPC_FC_ALIGNM4:
ALIGN_POINTER_CLEAR(pMemory, 4);
break;
@@ -2858,7 +2879,7 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
pFormat += 2;
desc = pFormat + *(const SHORT*)pFormat;
size = EmbeddedComplexSize(pStubMsg, desc);
- TRACE("embedded complex (size=%ld) => %p\n", size, pMemory);
+ TRACE("embedded complex (size=%d) => %p\n", size, pMemory);
if (fMustAlloc)
/* we can't pass fMustAlloc=TRUE into the marshaller for this type
* since the type is part of the memory block that is encompassed by
@@ -2900,7 +2921,7 @@ static unsigned char * ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
{
PFORMAT_STRING desc;
NDR_BUFFERSIZE m;
- unsigned long size;
+ ULONG size;
while (*pFormat != RPC_FC_END) {
switch (*pFormat) {
@@ -2949,7 +2970,10 @@ static unsigned char * ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
safe_buffer_length_increment(pStubMsg, 4);
}
pPointer += 4;
- pMemory += 4;
+ pMemory += sizeof(void*);
+ break;
+ case RPC_FC_ALIGNM2:
+ ALIGN_POINTER(pMemory, 2);
break;
case RPC_FC_ALIGNM4:
ALIGN_POINTER(pMemory, 4);
@@ -3005,7 +3029,7 @@ static unsigned char * ComplexFree(PMIDL_STUB_MESSAGE pStubMsg,
{
PFORMAT_STRING desc;
NDR_FREE m;
- unsigned long size;
+ ULONG size;
while (*pFormat != RPC_FC_END) {
switch (*pFormat) {
@@ -3032,7 +3056,10 @@ static unsigned char * ComplexFree(PMIDL_STUB_MESSAGE pStubMsg,
case RPC_FC_POINTER:
NdrPointerFree(pStubMsg, *(unsigned char**)pMemory, pPointer);
pPointer += 4;
- pMemory += 4;
+ pMemory += sizeof(void *);
+ break;
+ case RPC_FC_ALIGNM2:
+ ALIGN_POINTER(pMemory, 2);
break;
case RPC_FC_ALIGNM4:
ALIGN_POINTER(pMemory, 4);
@@ -3080,12 +3107,12 @@ static unsigned char * ComplexFree(PMIDL_STUB_MESSAGE pStubMsg,
return pMemory;
}
-static unsigned long ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
- PFORMAT_STRING pFormat,
- PFORMAT_STRING pPointer)
+static ULONG ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
+ PFORMAT_STRING pFormat,
+ PFORMAT_STRING pPointer)
{
PFORMAT_STRING desc;
- unsigned long size = 0;
+ ULONG size = 0;
while (*pFormat != RPC_FC_END) {
switch (*pFormat) {
@@ -3143,9 +3170,12 @@ static unsigned long ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
safe_buffer_increment(pStubMsg, 4); /* for pointer ID */
}
pPointer += 4;
- size += 4;
+ size += sizeof(void *);
break;
}
+ case RPC_FC_ALIGNM2:
+ ALIGN_LENGTH(size, 2);
+ break;
case RPC_FC_ALIGNM4:
ALIGN_LENGTH(size, 4);
break;
@@ -3179,11 +3209,10 @@ static unsigned long ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
return size;
}
-unsigned long ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg,
- PFORMAT_STRING pFormat)
+ULONG ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat)
{
PFORMAT_STRING desc;
- unsigned long size = 0;
+ ULONG size = 0;
while (*pFormat != RPC_FC_END) {
switch (*pFormat) {
@@ -3210,6 +3239,9 @@ unsigned long ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg,
case RPC_FC_POINTER:
size += sizeof(void *);
break;
+ case RPC_FC_ALIGNM2:
+ ALIGN_LENGTH(size, 2);
+ break;
case RPC_FC_ALIGNM4:
ALIGN_LENGTH(size, 4);
break;
@@ -3264,18 +3296,18 @@ unsigned char * WINAPI NdrComplexStructMarshall(PMIDL_STUB_MESSAGE pStubMsg,
{
int saved_ignore_embedded = pStubMsg->IgnoreEmbeddedPointers;
/* save buffer length */
- unsigned long saved_buffer_length = pStubMsg->BufferLength;
+ ULONG saved_buffer_length = pStubMsg->BufferLength;
/* get the buffer pointer after complex array data, but before
* pointer data */
- pStubMsg->BufferLength = pStubMsg->Buffer - pStubMsg->BufferStart;
+ pStubMsg->BufferLength = pStubMsg->Buffer - (unsigned char *)pStubMsg->RpcMsg->Buffer;
pStubMsg->IgnoreEmbeddedPointers = 1;
NdrComplexStructBufferSize(pStubMsg, pMemory, pFormat);
pStubMsg->IgnoreEmbeddedPointers = saved_ignore_embedded;
/* save it for use by embedded pointer code later */
- pStubMsg->PointerBufferMark = pStubMsg->BufferStart + pStubMsg->BufferLength;
- TRACE("difference = 0x%x\n", pStubMsg->PointerBufferMark - pStubMsg->Buffer);
+ pStubMsg->PointerBufferMark = (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength;
+ TRACE("difference = 0x%x\n", (ULONG)(pStubMsg->PointerBufferMark - pStubMsg->Buffer));
pointer_buffer_mark_set = 1;
/* restore the original buffer length */
@@ -3294,7 +3326,7 @@ unsigned char * WINAPI NdrComplexStructMarshall(PMIDL_STUB_MESSAGE pStubMsg,
if (conf_array)
{
- unsigned long struct_size = ComplexStructSize(pStubMsg, pFormat);
+ ULONG struct_size = ComplexStructSize(pStubMsg, pFormat);
array_compute_and_write_conformance(conf_array[0], pStubMsg,
pMemory + struct_size, conf_array);
/* these could be changed in ComplexMarshall so save them for later */
@@ -3361,7 +3393,7 @@ unsigned char * WINAPI NdrComplexStructUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
/* save it for use by embedded pointer code later */
pStubMsg->PointerBufferMark = pStubMsg->Buffer;
- TRACE("difference = 0x%lx\n", (unsigned long)(pStubMsg->PointerBufferMark - saved_buffer));
+ TRACE("difference = 0x%x\n", (ULONG)(pStubMsg->PointerBufferMark - saved_buffer));
pointer_buffer_mark_set = 1;
/* restore the original buffer */
@@ -3438,7 +3470,7 @@ void WINAPI NdrComplexStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
if(!pStubMsg->IgnoreEmbeddedPointers && !pStubMsg->PointerLength)
{
int saved_ignore_embedded = pStubMsg->IgnoreEmbeddedPointers;
- unsigned long saved_buffer_length = pStubMsg->BufferLength;
+ ULONG saved_buffer_length = pStubMsg->BufferLength;
/* get the buffer length after complex struct data, but before
* pointer data */
@@ -3449,7 +3481,7 @@ void WINAPI NdrComplexStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
/* save it for use by embedded pointer code later */
pStubMsg->PointerLength = pStubMsg->BufferLength;
pointer_length_set = 1;
- TRACE("difference = 0x%lx\n", pStubMsg->PointerLength - saved_buffer_length);
+ TRACE("difference = 0x%x\n", pStubMsg->PointerLength - saved_buffer_length);
/* restore the original buffer length */
pStubMsg->BufferLength = saved_buffer_length;
@@ -3465,7 +3497,7 @@ void WINAPI NdrComplexStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
if (conf_array)
{
- unsigned long struct_size = ComplexStructSize(pStubMsg, pFormat);
+ ULONG struct_size = ComplexStructSize(pStubMsg, pFormat);
array_compute_and_size_conformance(conf_array[0], pStubMsg, pMemory + struct_size,
conf_array);
@@ -3823,21 +3855,21 @@ unsigned char * WINAPI NdrComplexArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
/* save buffer fields that may be changed by buffer sizer functions
* and that may be needed later on */
int saved_ignore_embedded = pStubMsg->IgnoreEmbeddedPointers;
- unsigned long saved_buffer_length = pStubMsg->BufferLength;
- unsigned long saved_max_count = pStubMsg->MaxCount;
- unsigned long saved_offset = pStubMsg->Offset;
- unsigned long saved_actual_count = pStubMsg->ActualCount;
+ ULONG saved_buffer_length = pStubMsg->BufferLength;
+ ULONG_PTR saved_max_count = pStubMsg->MaxCount;
+ ULONG saved_offset = pStubMsg->Offset;
+ ULONG saved_actual_count = pStubMsg->ActualCount;
/* get the buffer pointer after complex array data, but before
* pointer data */
- pStubMsg->BufferLength = pStubMsg->Buffer - pStubMsg->BufferStart;
+ pStubMsg->BufferLength = pStubMsg->Buffer - (unsigned char *)pStubMsg->RpcMsg->Buffer;
pStubMsg->IgnoreEmbeddedPointers = 1;
NdrComplexArrayBufferSize(pStubMsg, pMemory, pFormat);
pStubMsg->IgnoreEmbeddedPointers = saved_ignore_embedded;
/* save it for use by embedded pointer code later */
- pStubMsg->PointerBufferMark = pStubMsg->BufferStart + pStubMsg->BufferLength;
- TRACE("difference = 0x%x\n", pStubMsg->Buffer - pStubMsg->BufferStart);
+ pStubMsg->PointerBufferMark = (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength;
+ TRACE("difference = 0x%x\n", (ULONG)(pStubMsg->Buffer - (unsigned char *)pStubMsg->RpcMsg->Buffer));
pointer_buffer_mark_set = 1;
/* restore fields */
@@ -3915,7 +3947,7 @@ unsigned char * WINAPI NdrComplexArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
size = pStubMsg->MemorySize;
pStubMsg->IgnoreEmbeddedPointers = saved_ignore_embedded;
- TRACE("difference = 0x%lx\n", (unsigned long)(pStubMsg->Buffer - saved_buffer));
+ TRACE("difference = 0x%x\n", (ULONG)(pStubMsg->Buffer - saved_buffer));
if (!pStubMsg->PointerBufferMark)
{
/* save it for use by embedded pointer code later */
@@ -3979,10 +4011,10 @@ void WINAPI NdrComplexArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
/* save buffer fields that may be changed by buffer sizer functions
* and that may be needed later on */
int saved_ignore_embedded = pStubMsg->IgnoreEmbeddedPointers;
- unsigned long saved_buffer_length = pStubMsg->BufferLength;
- unsigned long saved_max_count = pStubMsg->MaxCount;
- unsigned long saved_offset = pStubMsg->Offset;
- unsigned long saved_actual_count = pStubMsg->ActualCount;
+ ULONG saved_buffer_length = pStubMsg->BufferLength;
+ ULONG_PTR saved_max_count = pStubMsg->MaxCount;
+ ULONG saved_offset = pStubMsg->Offset;
+ ULONG saved_actual_count = pStubMsg->ActualCount;
/* get the buffer pointer after complex array data, but before
* pointer data */
@@ -4237,7 +4269,7 @@ void WINAPI NdrUserMarshalBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
unsigned index = *(const WORD*)&pFormat[2];
DWORD bufsize = *(const WORD*)&pFormat[6];
USER_MARSHAL_CB umcb;
- unsigned long saved_buffer_length = 0;
+ ULONG saved_buffer_length = 0;
TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
TRACE("index=%d\n", index);
@@ -4891,7 +4923,7 @@ typedef struct
{
unsigned char type;
unsigned char alignment;
- unsigned long total_size;
+ ULONG total_size;
} NDR_LGFARRAY_FORMAT;
#include "poppack.h"
@@ -4903,7 +4935,7 @@ unsigned char * WINAPI NdrFixedArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
PFORMAT_STRING pFormat)
{
const NDR_SMFARRAY_FORMAT *pSmFArrayFormat = (const NDR_SMFARRAY_FORMAT *)pFormat;
- unsigned long total_size;
+ ULONG total_size;
TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
@@ -4946,7 +4978,7 @@ unsigned char * WINAPI NdrFixedArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
unsigned char fMustAlloc)
{
const NDR_SMFARRAY_FORMAT *pSmFArrayFormat = (const NDR_SMFARRAY_FORMAT *)pFormat;
- unsigned long total_size;
+ ULONG total_size;
unsigned char *saved_buffer;
TRACE("(%p, %p, %p, %d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
@@ -5001,7 +5033,7 @@ void WINAPI NdrFixedArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
PFORMAT_STRING pFormat)
{
const NDR_SMFARRAY_FORMAT *pSmFArrayFormat = (const NDR_SMFARRAY_FORMAT *)pFormat;
- unsigned long total_size;
+ ULONG total_size;
TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
@@ -5413,7 +5445,7 @@ static ULONG get_discriminant(unsigned char fc, const unsigned char *pMemory)
}
static PFORMAT_STRING get_arm_offset_from_union_arm_selector(PMIDL_STUB_MESSAGE pStubMsg,
- unsigned long discriminant,
+ ULONG discriminant,
PFORMAT_STRING pFormat)
{
unsigned short num_arms, arm, type;
@@ -5436,13 +5468,13 @@ static PFORMAT_STRING get_arm_offset_from_union_arm_selector(PMIDL_STUB_MESSAGE
{
if(type == 0xffff)
{
- ERR("no arm for 0x%lx and no default case\n", discriminant);
+ ERR("no arm for 0x%x and no default case\n", discriminant);
RpcRaiseException(RPC_S_INVALID_TAG);
return NULL;
}
if(type == 0)
{
- TRACE("falling back to empty default case for 0x%lx\n", discriminant);
+ TRACE("falling back to empty default case for 0x%x\n", discriminant);
return NULL;
}
}
@@ -5547,7 +5579,6 @@ static unsigned char *union_arm_unmarshall(PMIDL_STUB_MESSAGE pStubMsg,
case RPC_FC_UP:
case RPC_FC_OP:
case RPC_FC_FP:
- **(void***)ppMemory = NULL;
ALIGN_POINTER(pStubMsg->Buffer, 4);
saved_buffer = pStubMsg->Buffer;
if (pStubMsg->PointerBufferMark)
@@ -5671,8 +5702,8 @@ static ULONG union_arm_memory_size(PMIDL_STUB_MESSAGE pStubMsg,
ALIGN_POINTER(pStubMsg->Buffer, 4);
saved_buffer = pStubMsg->Buffer;
safe_buffer_increment(pStubMsg, 4);
- ALIGN_LENGTH(pStubMsg->MemorySize, 4);
- pStubMsg->MemorySize += 4;
+ ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(void *));
+ pStubMsg->MemorySize += sizeof(void *);
if (!pStubMsg->IgnoreEmbeddedPointers)
PointerMemorySize(pStubMsg, saved_buffer, pFormat);
break;
@@ -5782,10 +5813,18 @@ unsigned char * WINAPI NdrEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE pStubM
if (fMustAlloc)
*ppMemory = NdrAllocate(pStubMsg, size);
+ /* we can't pass fMustAlloc=TRUE into the marshaller for the arm
+ * since the arm is part of the memory block that is encompassed by
+ * the whole union. Memory is forced to allocate when pointers
+ * are set to NULL, so we emulate that part of fMustAlloc=TRUE by
+ * clearing the memory we pass in to the unmarshaller */
+ if (fMustAlloc)
+ memset(*ppMemory, 0, size);
+
NdrBaseTypeUnmarshall(pStubMsg, ppMemory, &switch_type, FALSE);
pMemoryArm = *ppMemory + increment;
- return union_arm_unmarshall(pStubMsg, &pMemoryArm, switch_value, pFormat, fMustAlloc);
+ return union_arm_unmarshall(pStubMsg, &pMemoryArm, switch_value, pFormat, FALSE);
}
/***********************************************************************
@@ -5889,10 +5928,10 @@ unsigned char * WINAPI NdrNonEncapsulatedUnionMarshall(PMIDL_STUB_MESSAGE pStub
return union_arm_marshall(pStubMsg, pMemory, pStubMsg->MaxCount, pFormat + *(const SHORT*)pFormat);
}
-static long unmarshall_discriminant(PMIDL_STUB_MESSAGE pStubMsg,
+static LONG unmarshall_discriminant(PMIDL_STUB_MESSAGE pStubMsg,
PFORMAT_STRING *ppFormat)
{
- long discriminant = 0;
+ LONG discriminant = 0;
switch(**ppFormat)
{
@@ -5945,7 +5984,7 @@ unsigned char * WINAPI NdrNonEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE pSt
PFORMAT_STRING pFormat,
unsigned char fMustAlloc)
{
- long discriminant;
+ LONG discriminant;
unsigned short size;
TRACE("(%p, %p, %p, %d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
@@ -5953,7 +5992,7 @@ unsigned char * WINAPI NdrNonEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE pSt
/* Unmarshall discriminant */
discriminant = unmarshall_discriminant(pStubMsg, &pFormat);
- TRACE("unmarshalled discriminant %lx\n", discriminant);
+ TRACE("unmarshalled discriminant %x\n", discriminant);
pFormat += *(const SHORT*)pFormat;
@@ -5964,7 +6003,15 @@ unsigned char * WINAPI NdrNonEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE pSt
if (fMustAlloc)
*ppMemory = NdrAllocate(pStubMsg, size);
- return union_arm_unmarshall(pStubMsg, ppMemory, discriminant, pFormat, fMustAlloc);
+ /* we can't pass fMustAlloc=TRUE into the marshaller for the arm
+ * since the arm is part of the memory block that is encompassed by
+ * the whole union. Memory is forced to allocate when pointers
+ * are set to NULL, so we emulate that part of fMustAlloc=TRUE by
+ * clearing the memory we pass in to the unmarshaller */
+ if (fMustAlloc)
+ memset(*ppMemory, 0, size);
+
+ return union_arm_unmarshall(pStubMsg, ppMemory, discriminant, pFormat, FALSE);
}
/***********************************************************************
@@ -6179,68 +6226,68 @@ unsigned char *WINAPI NdrRangeUnmarshall(
TRACE("base_type = 0x%02x, low_value = %d, high_value = %d\n",
base_type, pRange->low_value, pRange->high_value);
-#define RANGE_UNMARSHALL(type, format_spec) \
+#define RANGE_UNMARSHALL(mem_type, wire_type, format_spec) \
do \
{ \
- ALIGN_POINTER(pStubMsg->Buffer, sizeof(type)); \
+ ALIGN_POINTER(pStubMsg->Buffer, sizeof(wire_type)); \
if (!fMustAlloc && !*ppMemory) \
fMustAlloc = TRUE; \
if (fMustAlloc) \
- *ppMemory = NdrAllocate(pStubMsg, sizeof(type)); \
- if (pStubMsg->Buffer + sizeof(type) > pStubMsg->BufferEnd) \
+ *ppMemory = NdrAllocate(pStubMsg, sizeof(mem_type)); \
+ if (pStubMsg->Buffer + sizeof(wire_type) > pStubMsg->BufferEnd) \
{ \
ERR("buffer overflow - Buffer = %p, BufferEnd = %p\n", \
pStubMsg->Buffer, (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength); \
RpcRaiseException(RPC_X_BAD_STUB_DATA); \
} \
- if ((*(type *)pStubMsg->Buffer < (type)pRange->low_value) || \
- (*(type *)pStubMsg->Buffer > (type)pRange->high_value)) \
+ if ((*(wire_type *)pStubMsg->Buffer < (mem_type)pRange->low_value) || \
+ (*(wire_type *)pStubMsg->Buffer > (mem_type)pRange->high_value)) \
{ \
ERR("value exceeded bounds: " format_spec ", low: " format_spec ", high: " format_spec "\n", \
- *(type *)pStubMsg->Buffer, (type)pRange->low_value, \
- (type)pRange->high_value); \
+ *(wire_type *)pStubMsg->Buffer, (mem_type)pRange->low_value, \
+ (mem_type)pRange->high_value); \
RpcRaiseException(RPC_S_INVALID_BOUND); \
return NULL; \
} \
TRACE("*ppMemory: %p\n", *ppMemory); \
- **(type **)ppMemory = *(type *)pStubMsg->Buffer; \
- pStubMsg->Buffer += sizeof(type); \
+ **(mem_type **)ppMemory = *(wire_type *)pStubMsg->Buffer; \
+ pStubMsg->Buffer += sizeof(wire_type); \
} while (0)
switch(base_type)
{
case RPC_FC_CHAR:
case RPC_FC_SMALL:
- RANGE_UNMARSHALL(UCHAR, "%d");
+ RANGE_UNMARSHALL(UCHAR, UCHAR, "%d");
TRACE("value: 0x%02x\n", **ppMemory);
break;
case RPC_FC_BYTE:
case RPC_FC_USMALL:
- RANGE_UNMARSHALL(CHAR, "%u");
+ RANGE_UNMARSHALL(CHAR, CHAR, "%u");
TRACE("value: 0x%02x\n", **ppMemory);
break;
case RPC_FC_WCHAR: /* FIXME: valid? */
case RPC_FC_USHORT:
- RANGE_UNMARSHALL(USHORT, "%u");
+ RANGE_UNMARSHALL(USHORT, USHORT, "%u");
TRACE("value: 0x%04x\n", **(USHORT **)ppMemory);
break;
case RPC_FC_SHORT:
- RANGE_UNMARSHALL(SHORT, "%d");
+ RANGE_UNMARSHALL(SHORT, SHORT, "%d");
TRACE("value: 0x%04x\n", **(USHORT **)ppMemory);
break;
case RPC_FC_LONG:
- RANGE_UNMARSHALL(LONG, "%d");
+ case RPC_FC_ENUM32:
+ RANGE_UNMARSHALL(LONG, LONG, "%d");
TRACE("value: 0x%08x\n", **(ULONG **)ppMemory);
break;
case RPC_FC_ULONG:
- RANGE_UNMARSHALL(ULONG, "%u");
+ RANGE_UNMARSHALL(ULONG, ULONG, "%u");
TRACE("value: 0x%08x\n", **(ULONG **)ppMemory);
break;
case RPC_FC_ENUM16:
- case RPC_FC_ENUM32:
- FIXME("Unhandled enum type\n");
+ RANGE_UNMARSHALL(UINT, USHORT, "%u");
+ TRACE("value: 0x%08x\n", **(UINT **)ppMemory);
break;
- case RPC_FC_ERROR_STATUS_T: /* FIXME: valid? */
case RPC_FC_FLOAT:
case RPC_FC_DOUBLE:
case RPC_FC_HYPER:
@@ -6538,36 +6585,51 @@ static ULONG WINAPI NdrBaseTypeMemorySize(
case RPC_FC_WCHAR:
case RPC_FC_SHORT:
case RPC_FC_USHORT:
+ ALIGN_POINTER(pStubMsg->Buffer, sizeof(USHORT));
safe_buffer_increment(pStubMsg, sizeof(USHORT));
+ ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(USHORT));
pStubMsg->MemorySize += sizeof(USHORT);
return sizeof(USHORT);
case RPC_FC_LONG:
case RPC_FC_ULONG:
case RPC_FC_ENUM32:
+ ALIGN_POINTER(pStubMsg->Buffer, sizeof(ULONG));
safe_buffer_increment(pStubMsg, sizeof(ULONG));
+ ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(ULONG));
pStubMsg->MemorySize += sizeof(ULONG);
return sizeof(ULONG);
case RPC_FC_FLOAT:
+ ALIGN_POINTER(pStubMsg->Buffer, sizeof(float));
safe_buffer_increment(pStubMsg, sizeof(float));
+ ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(float));
pStubMsg->MemorySize += sizeof(float);
return sizeof(float);
case RPC_FC_DOUBLE:
+ ALIGN_POINTER(pStubMsg->Buffer, sizeof(double));
safe_buffer_increment(pStubMsg, sizeof(double));
+ ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(double));
pStubMsg->MemorySize += sizeof(double);
return sizeof(double);
case RPC_FC_HYPER:
+ ALIGN_POINTER(pStubMsg->Buffer, sizeof(ULONGLONG));
safe_buffer_increment(pStubMsg, sizeof(ULONGLONG));
+ ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(ULONGLONG));
pStubMsg->MemorySize += sizeof(ULONGLONG);
return sizeof(ULONGLONG);
case RPC_FC_ERROR_STATUS_T:
+ ALIGN_POINTER(pStubMsg->Buffer, sizeof(error_status_t));
safe_buffer_increment(pStubMsg, sizeof(error_status_t));
+ ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(error_status_t));
pStubMsg->MemorySize += sizeof(error_status_t);
return sizeof(error_status_t);
case RPC_FC_ENUM16:
+ ALIGN_POINTER(pStubMsg->Buffer, sizeof(USHORT));
safe_buffer_increment(pStubMsg, sizeof(USHORT));
+ ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(UINT));
pStubMsg->MemorySize += sizeof(UINT);
return sizeof(UINT);
case RPC_FC_IGNORE:
+ ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(void *));
pStubMsg->MemorySize += sizeof(void *);
return sizeof(void *);
default:
@@ -6627,7 +6689,7 @@ static unsigned char *WINAPI NdrContextHandleMarshall(
if (pFormat[1] & 0x80)
NdrClientContextMarshall(pStubMsg, *(NDR_CCONTEXT **)pMemory, FALSE);
else
- NdrClientContextMarshall(pStubMsg, (NDR_CCONTEXT *)pMemory, FALSE);
+ NdrClientContextMarshall(pStubMsg, pMemory, FALSE);
return NULL;
}
diff --git a/reactos/dll/win32/rpcrt4/ndr_ole.c b/reactos/dll/win32/rpcrt4/ndr_ole.c
index 729ab0b9f1e..a3264e70122 100644
--- a/reactos/dll/win32/rpcrt4/ndr_ole.c
+++ b/reactos/dll/win32/rpcrt4/ndr_ole.c
@@ -354,7 +354,7 @@ void WINAPI NdrInterfacePointerFree(PMIDL_STUB_MESSAGE pStubMsg,
/***********************************************************************
* NdrOleAllocate [RPCRT4.@]
*/
-void * WINAPI NdrOleAllocate(size_t Size)
+void * WINAPI NdrOleAllocate(SIZE_T Size)
{
if (!LoadCOM()) return NULL;
return COM_MemAlloc(Size);
diff --git a/reactos/dll/win32/rpcrt4/rpc_epmap.c b/reactos/dll/win32/rpcrt4/rpc_epmap.c
index 544ad74bf69..286ffbf9973 100644
--- a/reactos/dll/win32/rpcrt4/rpc_epmap.c
+++ b/reactos/dll/win32/rpcrt4/rpc_epmap.c
@@ -596,7 +596,7 @@ RPC_STATUS WINAPI TowerConstruct(
return RPC_S_OK;
}
-void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t len)
+void __RPC_FAR * __RPC_USER MIDL_user_allocate(SIZE_T len)
{
return HeapAlloc(GetProcessHeap(), 0, len);
}
diff --git a/reactos/dll/win32/rsaenh/rsaenh_ros.diff b/reactos/dll/win32/rsaenh/rsaenh_ros.diff
deleted file mode 100644
index 4248b1f1ed2..00000000000
--- a/reactos/dll/win32/rsaenh/rsaenh_ros.diff
+++ /dev/null
@@ -1,30 +0,0 @@
-Index: handle.h
-===================================================================
---- handle.h (revision 30501)
-+++ handle.h (working copy)
-@@ -48,6 +48,10 @@
- unsigned int iNextFree;
- } HANDLETABLEENTRY;
-
-+/* Prevent conflict with wingdi.h */
-+#define tagHANDLETABLE tagHANDLETABLE_RSA
-+#define HANDLETABLE HANDLETABLE_RSA
-+
- typedef struct tagHANDLETABLE
- {
- unsigned int iEntries;
-Index: rsaenh.c
-===================================================================
---- rsaenh.c (revision 30501)
-+++ rsaenh.c (working copy)
-@@ -34,9 +34,9 @@
- #include "winbase.h"
- #include "winreg.h"
- #include "wincrypt.h"
-+#include "objbase.h"
- #include "handle.h"
- #include "implglue.h"
--#include "objbase.h"
-
- WINE_DEFAULT_DEBUG_CHANNEL(crypt);
-
diff --git a/reactos/dll/win32/samlib/debug.h b/reactos/dll/win32/samlib/debug.h
index 6fdb2ede142..b54107f482c 100644
--- a/reactos/dll/win32/samlib/debug.h
+++ b/reactos/dll/win32/samlib/debug.h
@@ -1,12 +1,12 @@
#ifdef NDEBUG
-#define DPRINT(args...)
+#define DPRINT(...)
#define CHECKPOINT
#else
-#define DPRINT(args...) do { DebugPrint("(SAMLIB:%s:%d) ",__FILE__,__LINE__); DebugPrint(args); } while(0)
+#define DPRINT(...) do { DebugPrint("(SAMLIB:%s:%d) ",__FILE__,__LINE__); DebugPrint(__VA_ARGS__); } while(0)
#define CHECKPOINT do { DebugPrint("(SAMLIB:%s:%d) Checkpoint\n",__FILE__,__LINE__); } while(0)
#endif
-#define DPRINT1(args...) do { DebugPrint("(SAMLIB:%s:%d) ",__FILE__,__LINE__); DebugPrint(args); } while(0)
+#define DPRINT1(...) do { DebugPrint("(SAMLIB:%s:%d) ",__FILE__,__LINE__); DebugPrint(__VA_ARGS__); } while(0)
#define CHECKPOINT1 do { DebugPrint("(SAMLIB:%s:%d) Checkpoint\n",__FILE__,__LINE__); } while(0)
diff --git a/reactos/dll/win32/secur32/sspi.c b/reactos/dll/win32/secur32/sspi.c
index 5d4dc7bec64..4bbc757630f 100644
--- a/reactos/dll/win32/secur32/sspi.c
+++ b/reactos/dll/win32/secur32/sspi.c
@@ -100,7 +100,7 @@ EnumerateSecurityPackagesA(
)
{
SECURITY_STATUS ret;
- PSecPkgInfoW info = {0};
+ PSecPkgInfoW info = NULL;
ret = EnumerateSecurityPackagesW(pcPackages, &info);
if (ret == SEC_E_OK && *pcPackages && info)
diff --git a/reactos/dll/win32/setupapi/devinst.c b/reactos/dll/win32/setupapi/devinst.c
index 73853014a55..cb12d766ad5 100644
--- a/reactos/dll/win32/setupapi/devinst.c
+++ b/reactos/dll/win32/setupapi/devinst.c
@@ -1409,6 +1409,17 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
{
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
HKEY key = INVALID_HANDLE_VALUE;
+ LPWSTR lpGuidString = NULL;
+ LPWSTR DriverKey = NULL; /* {GUID}\Index */
+ LPWSTR pDeviceInstance; /* Points into DriverKey, on the Index field */
+ DWORD Index; /* Index used in the DriverKey name */
+ DWORD rc;
+ HKEY hHWProfileKey = INVALID_HANDLE_VALUE;
+ HKEY hEnumKey = NULL;
+ HKEY hClassKey = NULL;
+ HKEY hDeviceKey = INVALID_HANDLE_VALUE;
+ HKEY hKey = NULL;
+ HKEY RootKey;
TRACE("%p %p %lu %lu %lu %p %s\n", DeviceInfoSet, DeviceInfoData, Scope,
HwProfile, KeyType, InfHandle, debugstr_w(InfSectionName));
@@ -1450,18 +1461,6 @@ HKEY WINAPI SetupDiCreateDevRegKeyW(
return INVALID_HANDLE_VALUE;
}
- LPWSTR lpGuidString = NULL;
- LPWSTR DriverKey = NULL; /* {GUID}\Index */
- LPWSTR pDeviceInstance; /* Points into DriverKey, on the Index field */
- DWORD Index; /* Index used in the DriverKey name */
- DWORD rc;
- HKEY hHWProfileKey = INVALID_HANDLE_VALUE;
- HKEY hEnumKey = NULL;
- HKEY hClassKey = NULL;
- HKEY hDeviceKey = INVALID_HANDLE_VALUE;
- HKEY hKey = NULL;
- HKEY RootKey;
-
if (Scope == DICS_FLAG_GLOBAL)
RootKey = set->HKLM;
else /* Scope == DICS_FLAG_CONFIGSPECIFIC */
@@ -1670,6 +1669,7 @@ BOOL WINAPI SetupDiCreateDeviceInfoW(
{
struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
BOOL ret = FALSE;
+ SP_DEVINFO_DATA DevInfo;
TRACE("%p %s %s %s %p %x %p\n", DeviceInfoSet, debugstr_w(DeviceName),
debugstr_guid(ClassGuid), debugstr_w(DeviceDescription),
@@ -1708,8 +1708,6 @@ BOOL WINAPI SetupDiCreateDeviceInfoW(
return FALSE;
}
- SP_DEVINFO_DATA DevInfo;
-
if (CreationFlags & DICD_GENERATE_ID)
{
/* Generate a new unique ID for this device */
diff --git a/reactos/dll/win32/setupapi/install.c b/reactos/dll/win32/setupapi/install.c
index ff36ad19866..a89081c7d6d 100644
--- a/reactos/dll/win32/setupapi/install.c
+++ b/reactos/dll/win32/setupapi/install.c
@@ -96,9 +96,9 @@ struct needs_callback_info
typedef BOOL (*iterate_fields_func)( HINF hinf, PCWSTR field, void *arg );
static BOOL GetLineText( HINF hinf, PCWSTR section_name, PCWSTR key_name, PWSTR *value);
-typedef HRESULT WINAPI (*COINITIALIZE)(IN LPVOID pvReserved);
-typedef HRESULT WINAPI (*COCREATEINSTANCE)(IN REFCLSID rclsid, IN LPUNKNOWN pUnkOuter, IN DWORD dwClsContext, IN REFIID riid, OUT LPVOID *ppv);
-typedef HRESULT WINAPI (*COUNINITIALIZE)(VOID);
+typedef HRESULT (WINAPI *COINITIALIZE)(IN LPVOID pvReserved);
+typedef HRESULT (WINAPI *COCREATEINSTANCE)(IN REFCLSID rclsid, IN LPUNKNOWN pUnkOuter, IN DWORD dwClsContext, IN REFIID riid, OUT LPVOID *ppv);
+typedef HRESULT (WINAPI *COUNINITIALIZE)(VOID);
/* Unicode constants */
static const WCHAR AddService[] = {'A','d','d','S','e','r','v','i','c','e',0};
diff --git a/reactos/dll/win32/setupapi/interface.c b/reactos/dll/win32/setupapi/interface.c
index e13fa22c151..172917b1c06 100644
--- a/reactos/dll/win32/setupapi/interface.c
+++ b/reactos/dll/win32/setupapi/interface.c
@@ -255,6 +255,7 @@ SETUP_CreateInterfaceList(
rc = RegOpenKeyExW(hReferenceKey, Control, 0, KEY_QUERY_VALUE, &hControlKey);
if (rc != ERROR_SUCCESS)
{
+#if 0
if (OnlyPresentInterfaces)
{
DestroyDeviceInterface(interfaceInfo);
@@ -262,11 +263,12 @@ SETUP_CreateInterfaceList(
}
else
interfaceInfo->Flags |= SPINT_REMOVED;
+#endif
}
else
{
dwLength = sizeof(DWORD);
- if (RegQueryValueExW(hControlKey, Linked, NULL, &dwRegType, (LPBYTE)&LinkedValue, &dwLength)
+ if (RegQueryValueExW(hControlKey, Linked, NULL, &dwRegType, (LPBYTE)&LinkedValue, &dwLength) == ERROR_SUCCESS
&& dwRegType == REG_DWORD && LinkedValue)
interfaceInfo->Flags |= SPINT_ACTIVE;
RegCloseKey(hControlKey);
diff --git a/reactos/dll/win32/setupapi/rpc.c b/reactos/dll/win32/setupapi/rpc.c
index 71ff8842570..3d55315ec6d 100644
--- a/reactos/dll/win32/setupapi/rpc.c
+++ b/reactos/dll/win32/setupapi/rpc.c
@@ -111,7 +111,7 @@ PnpUnbindLocalBindingHandle(VOID)
void __RPC_FAR * __RPC_USER
-midl_user_allocate(size_t len)
+midl_user_allocate(SIZE_T len)
{
return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
}
diff --git a/reactos/dll/win32/setupapi/setupapi.spec b/reactos/dll/win32/setupapi/setupapi.spec
index c98d49b8102..7c55909ebbe 100644
--- a/reactos/dll/win32/setupapi/setupapi.spec
+++ b/reactos/dll/win32/setupapi/setupapi.spec
@@ -325,7 +325,7 @@
@ stdcall SetupDiGetDeviceInstallParamsW(ptr ptr ptr)
@ stdcall SetupDiGetDeviceInstanceIdA(ptr ptr str long ptr)
@ stdcall SetupDiGetDeviceInstanceIdW(ptr ptr wstr long ptr)
-@ stub SetupDiGetDeviceInterfaceAlias
+@ stdcall SetupDiGetDeviceInterfaceAlias(ptr ptr ptr ptr)
@ stdcall SetupDiGetDeviceInterfaceDetailA(long ptr ptr long ptr ptr)
@ stdcall SetupDiGetDeviceInterfaceDetailW(long ptr ptr long ptr ptr)
@ stdcall SetupDiGetDeviceRegistryPropertyA(long ptr long ptr ptr long ptr)
@@ -363,7 +363,7 @@
@ stdcall SetupDiOpenDeviceInfoA(ptr str long long ptr)
@ stdcall SetupDiOpenDeviceInfoW(ptr wstr long long ptr)
@ stdcall SetupDiOpenDeviceInterfaceA(ptr str long ptr)
-@ stub SetupDiOpenDeviceInterfaceRegKey
+@ stdcall SetupDiOpenDeviceInterfaceRegKey(ptr ptr long long)
@ stdcall SetupDiOpenDeviceInterfaceW(ptr wstr long ptr)
@ stdcall SetupDiRegisterCoDeviceInstallers(ptr ptr)
@ stdcall SetupDiRegisterDeviceInfo(ptr ptr long ptr ptr ptr)
diff --git a/reactos/dll/win32/setupapi/stubs.c b/reactos/dll/win32/setupapi/stubs.c
index f7d0711c4cc..c3b1a401b33 100644
--- a/reactos/dll/win32/setupapi/stubs.c
+++ b/reactos/dll/win32/setupapi/stubs.c
@@ -233,3 +233,16 @@ CONFIGRET WINAPI CM_Get_Device_Interface_List_Size_ExW(PULONG len, LPGUID class,
FIXME("%p %p %s 0x%08x %p: stub\n", len, class, debugstr_w(id), flags, machine);
return CR_FAILURE;
}
+
+WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInterfaceAlias(IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IN CONST GUID *AliasInterfaceClassGuid, OUT PSP_DEVICE_INTERFACE_DATA AliasDeviceInterfaceData)
+{
+ FIXME("%p %p %p %p %p stub\n", DeviceInfoSet, DeviceInterfaceData, AliasInterfaceClassGuid, AliasDeviceInterfaceData);
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+}
+
+HKEY WINAPI SetupDiOpenDeviceInterfaceRegKey(IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IN DWORD Reserved, IN REGSAM samDesired)
+{
+ FIXME("%p %p %p 0x%08x 0x%08x: stub\n", DeviceInfoSet, DeviceInterfaceData, Reserved, samDesired);
+ return INVALID_HANDLE_VALUE;
+}
diff --git a/reactos/dll/win32/shdocvw/client.c b/reactos/dll/win32/shdocvw/client.c
index 14a7f904e31..a351bd1e37f 100644
--- a/reactos/dll/win32/shdocvw/client.c
+++ b/reactos/dll/win32/shdocvw/client.c
@@ -60,6 +60,9 @@ static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID ri
}else if(IsEqualGUID(&IID_IDispatch, riid)) {
TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
*ppv = CLDISP(This);
+ }else if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
+ TRACE("(%p)->(IID_IPropertyNotifySink %p)\n", This, ppv);
+ *ppv = PROPNOTIF(This);
}else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
*ppv = SERVPROV(This);
diff --git a/reactos/dll/win32/shdocvw/dochost.c b/reactos/dll/win32/shdocvw/dochost.c
index dd6e71265d7..f3035e1c15e 100644
--- a/reactos/dll/win32/shdocvw/dochost.c
+++ b/reactos/dll/win32/shdocvw/dochost.c
@@ -20,6 +20,7 @@
#include "shdocvw.h"
#include "hlink.h"
#include "exdispid.h"
+#include "mshtml.h"
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
@@ -46,7 +47,7 @@ LRESULT process_dochost_task(DocHost *This, LPARAM lparam)
return 0;
}
-static void navigate_complete(DocHost *This)
+static void notif_complete(DocHost *This, DISPID dispid)
{
DISPPARAMS dispparams;
VARIANTARG params[2];
@@ -66,14 +67,15 @@ static void navigate_complete(DocHost *This)
V_VT(&url) = VT_BSTR;
V_BSTR(&url) = SysAllocString(This->url);
- call_sink(This->cps.wbe2, DISPID_NAVIGATECOMPLETE2, &dispparams);
- call_sink(This->cps.wbe2, DISPID_DOCUMENTCOMPLETE, &dispparams);
+ TRACE("%d >>>\n", dispid);
+ call_sink(This->cps.wbe2, dispid, &dispparams);
+ TRACE("%d <<<\n", dispid);
SysFreeString(V_BSTR(&url));
This->busy = VARIANT_FALSE;
}
-void object_available(DocHost *This)
+static void object_available(DocHost *This)
{
IHlinkTarget *hlink;
HRESULT hres;
@@ -93,14 +95,152 @@ void object_available(DocHost *This)
hres = IHlinkTarget_Navigate(hlink, 0, NULL);
IHlinkTarget_Release(hlink);
- if(FAILED(hres)) {
+ if(FAILED(hres))
FIXME("Navigate failed\n");
- return;
+}
+
+static HRESULT get_doc_ready_state(DocHost *This, READYSTATE *ret)
+{
+ DISPPARAMS dp = {NULL,NULL,0,0};
+ IDispatch *disp;
+ EXCEPINFO ei;
+ VARIANT var;
+ HRESULT hres;
+
+ hres = IUnknown_QueryInterface(This->document, &IID_IDispatch, (void**)&disp);
+ if(FAILED(hres))
+ return hres;
+
+ hres = IDispatch_Invoke(disp, DISPID_READYSTATE, &IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET,
+ &dp, &var, &ei, NULL);
+ IDispatch_Release(disp);
+ if(FAILED(hres)) {
+ WARN("Invoke(DISPID_READYSTATE failed: %08x\n", hres);
+ return hres;
}
- navigate_complete(This);
+ if(V_VT(&var) != VT_I4) {
+ WARN("V_VT(var) = %d\n", V_VT(&var));
+ VariantClear(&var);
+ return E_FAIL;
+ }
- return;
+ *ret = V_I4(&var);
+ return S_OK;
+}
+
+static void advise_prop_notif(DocHost *This, BOOL set)
+{
+ IConnectionPointContainer *cp_container;
+ IConnectionPoint *cp;
+ HRESULT hres;
+
+ hres = IUnknown_QueryInterface(This->document, &IID_IConnectionPointContainer, (void**)&cp_container);
+ if(FAILED(hres))
+ return;
+
+ hres = IConnectionPointContainer_FindConnectionPoint(cp_container, &IID_IPropertyNotifySink, &cp);
+ IConnectionPointContainer_Release(cp_container);
+ if(FAILED(hres))
+ return;
+
+ if(set)
+ hres = IConnectionPoint_Advise(cp, (IUnknown*)PROPNOTIF(This), &This->prop_notif_cookie);
+ else
+ hres = IConnectionPoint_Unadvise(cp, This->prop_notif_cookie);
+ IConnectionPoint_Release(cp);
+
+ if(SUCCEEDED(hres))
+ This->is_prop_notif = set;
+}
+
+static void update_ready_state(DocHost *This, READYSTATE ready_state)
+{
+ if(ready_state > READYSTATE_LOADING && This->ready_state <= READYSTATE_LOADING) {
+ notif_complete(This, DISPID_NAVIGATECOMPLETE2);
+ This->ready_state = ready_state;
+ }
+
+ if(ready_state == READYSTATE_COMPLETE && This->ready_state < READYSTATE_COMPLETE) {
+ This->ready_state = READYSTATE_COMPLETE;
+ notif_complete(This, DISPID_DOCUMENTCOMPLETE);
+ }
+}
+
+typedef struct {
+ task_header_t header;
+ IUnknown *doc;
+ READYSTATE ready_state;
+} ready_state_task_t;
+
+static void ready_state_proc(DocHost *This, task_header_t *_task)
+{
+ ready_state_task_t *task = (ready_state_task_t*)_task;
+
+ if(task->doc == This->document)
+ update_ready_state(This, task->ready_state);
+
+ IUnknown_Release(task->doc);
+}
+
+static void push_ready_state_task(DocHost *This, READYSTATE ready_state)
+{
+ ready_state_task_t *task = heap_alloc(sizeof(ready_state_task_t));
+
+ IUnknown_AddRef(This->document);
+ task->doc = This->document;
+ task->ready_state = ready_state;
+
+ push_dochost_task(This, &task->header, ready_state_proc, FALSE);
+}
+
+static void object_available_proc(DocHost *This, task_header_t *task)
+{
+ object_available(This);
+}
+
+HRESULT dochost_object_available(DocHost *This, IUnknown *doc)
+{
+ READYSTATE ready_state;
+ task_header_t *task;
+ IOleObject *oleobj;
+ HRESULT hres;
+
+ IUnknown_AddRef(doc);
+ This->document = doc;
+
+ hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
+ if(SUCCEEDED(hres)) {
+ CLSID clsid;
+
+ hres = IOleObject_GetUserClassID(oleobj, &clsid);
+ if(SUCCEEDED(hres))
+ TRACE("Got clsid %s\n",
+ IsEqualGUID(&clsid, &CLSID_HTMLDocument) ? "CLSID_HTMLDocument" : debugstr_guid(&clsid));
+
+ hres = IOleObject_SetClientSite(oleobj, CLIENTSITE(This));
+ if(FAILED(hres))
+ FIXME("SetClientSite failed: %08x\n", hres);
+
+ IOleObject_Release(oleobj);
+ }else {
+ FIXME("Could not get IOleObject iface: %08x\n", hres);
+ }
+
+ /* FIXME: Call SetAdvise */
+
+ task = heap_alloc(sizeof(*task));
+ push_dochost_task(This, task, object_available_proc, FALSE);
+
+ hres = get_doc_ready_state(This, &ready_state);
+ if(SUCCEEDED(hres)) {
+ if(ready_state == READYSTATE_COMPLETE)
+ push_ready_state_task(This, READYSTATE_COMPLETE);
+ else
+ advise_prop_notif(This, TRUE);
+ }
+
+ return S_OK;
}
static LRESULT resize_document(DocHost *This, LONG width, LONG height)
@@ -174,6 +314,9 @@ void deactivate_document(DocHost *This)
IHlinkTarget *hlink = NULL;
HRESULT hres;
+ if(This->is_prop_notif)
+ advise_prop_notif(This, FALSE);
+
if(This->view)
IOleDocumentView_UIActivate(This->view, FALSE);
@@ -502,10 +645,78 @@ static const IDocHostUIHandler2Vtbl DocHostUIHandler2Vtbl = {
DocHostUIHandler_GetOverrideKeyPath
};
+#define PROPNOTIF_THIS(iface) DEFINE_THIS(DocHost, IPropertyNotifySink, iface)
+
+static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface,
+ REFIID riid, void **ppv)
+{
+ DocHost *This = PROPNOTIF_THIS(iface);
+ return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
+}
+
+static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface)
+{
+ DocHost *This = PROPNOTIF_THIS(iface);
+ return IOleClientSite_AddRef(CLIENTSITE(This));
+}
+
+static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface)
+{
+ DocHost *This = PROPNOTIF_THIS(iface);
+ return IOleClientSite_Release(CLIENTSITE(This));
+}
+
+static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
+{
+ DocHost *This = PROPNOTIF_THIS(iface);
+
+ TRACE("(%p)->(%d)\n", This, dispID);
+
+ switch(dispID) {
+ case DISPID_READYSTATE: {
+ READYSTATE ready_state;
+ HRESULT hres;
+
+ hres = get_doc_ready_state(This, &ready_state);
+ if(FAILED(hres))
+ return hres;
+
+ if(ready_state == READYSTATE_COMPLETE)
+ advise_prop_notif(This, FALSE);
+
+ push_ready_state_task(This, ready_state);
+ break;
+ }
+ default:
+ FIXME("unimplemented dispid %d\n", dispID);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
+static HRESULT WINAPI PropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
+{
+ DocHost *This = PROPNOTIF_THIS(iface);
+ FIXME("(%p)->(%d)\n", This, dispID);
+ return E_NOTIMPL;
+}
+
+#undef PROPNOTIF_THIS
+
+static const IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
+ PropertyNotifySink_QueryInterface,
+ PropertyNotifySink_AddRef,
+ PropertyNotifySink_Release,
+ PropertyNotifySink_OnChanged,
+ PropertyNotifySink_OnRequestEdit
+};
+
void DocHost_Init(DocHost *This, IDispatch *disp)
{
This->lpDocHostUIHandlerVtbl = &DocHostUIHandler2Vtbl;
This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl;
+ This->lpIPropertyNotifySinkVtbl = &PropertyNotifySinkVtbl;
This->disp = disp;
@@ -522,6 +733,9 @@ void DocHost_Init(DocHost *This, IDispatch *disp)
This->silent = VARIANT_FALSE;
This->offline = VARIANT_FALSE;
+ This->ready_state = READYSTATE_UNINITIALIZED;
+ This->is_prop_notif = FALSE;
+
DocHost_ClientSite_Init(This);
DocHost_Frame_Init(This);
diff --git a/reactos/dll/win32/shdocvw/frame.c b/reactos/dll/win32/shdocvw/frame.c
index dd904993658..eeff20adcb3 100644
--- a/reactos/dll/win32/shdocvw/frame.c
+++ b/reactos/dll/win32/shdocvw/frame.c
@@ -135,7 +135,7 @@ static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface,
LPCOLESTR pszStatusText)
{
DocHost *This = INPLACEFRAME_THIS(iface);
- FIXME("(%p)->(%p)\n", This, debugstr_w(pszStatusText));
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pszStatusText));
return E_NOTIMPL;
}
diff --git a/reactos/dll/win32/shdocvw/navigate.c b/reactos/dll/win32/shdocvw/navigate.c
index d6c0e3e5cd9..ec23fcc7b38 100644
--- a/reactos/dll/win32/shdocvw/navigate.c
+++ b/reactos/dll/win32/shdocvw/navigate.c
@@ -22,7 +22,6 @@
#include "wine/debug.h"
#include "shdocvw.h"
-#include "mshtml.h"
#include "exdispid.h"
#include "shellapi.h"
#include "winreg.h"
@@ -220,7 +219,7 @@ static HRESULT WINAPI BindStatusCallback_OnProgress(IBindStatusCallback *iface,
FIXME("status code %u\n", ulStatusCode);
}
- return E_NOTIMPL;
+ return S_OK;
}
static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *iface,
@@ -270,49 +269,14 @@ static HRESULT WINAPI BindStatusCallback_OnDataAvailable(IBindStatusCallback *if
return E_NOTIMPL;
}
-static void object_available_proc(DocHost *This, task_header_t *task)
-{
- object_available(This);
-}
-
static HRESULT WINAPI BindStatusCallback_OnObjectAvailable(IBindStatusCallback *iface,
REFIID riid, IUnknown *punk)
{
BindStatusCallback *This = BINDSC_THIS(iface);
- task_header_t *task;
- IOleObject *oleobj;
- HRESULT hres;
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), punk);
- IUnknown_AddRef(punk);
- This->doc_host->document = punk;
-
- hres = IUnknown_QueryInterface(punk, &IID_IOleObject, (void**)&oleobj);
- if(SUCCEEDED(hres)) {
- CLSID clsid;
-
- hres = IOleObject_GetUserClassID(oleobj, &clsid);
- if(SUCCEEDED(hres))
- TRACE("Got clsid %s\n",
- IsEqualGUID(&clsid, &CLSID_HTMLDocument) ? "CLSID_HTMLDocument" : debugstr_guid(&clsid));
-
- hres = IOleObject_SetClientSite(oleobj, CLIENTSITE(This->doc_host));
- if(FAILED(hres))
- FIXME("SetClientSite failed: %08x\n", hres);
-
- IOleObject_Release(oleobj);
- }else {
- FIXME("Could not get IOleObject iface: %08x\n", hres);
- }
-
- /* FIXME: Call SetAdvise */
- /* FIXME: Call Invoke(DISPID_READYSTATE) */
-
- task = heap_alloc(sizeof(*task));
- push_dochost_task(This->doc_host, task, object_available_proc, FALSE);
-
- return S_OK;
+ return dochost_object_available(This->doc_host, punk);
}
#undef BSC_THIS
@@ -357,7 +321,7 @@ static HRESULT WINAPI HttpNegotiate_BeginningTransaction(IHttpNegotiate *iface,
{
BindStatusCallback *This = HTTPNEG_THIS(iface);
- FIXME("(%p)->(%s %s %d %p)\n", This, debugstr_w(szURL), debugstr_w(szHeaders),
+ TRACE("(%p)->(%s %s %d %p)\n", This, debugstr_w(szURL), debugstr_w(szHeaders),
dwReserved, pszAdditionalHeaders);
if(This->headers) {
@@ -374,9 +338,9 @@ static HRESULT WINAPI HttpNegotiate_OnResponse(IHttpNegotiate *iface,
LPWSTR *pszAdditionalRequestHeaders)
{
BindStatusCallback *This = HTTPNEG_THIS(iface);
- FIXME("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders),
+ TRACE("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders),
debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders);
- return E_NOTIMPL;
+ return S_OK;
}
#undef HTTPNEG_THIS
@@ -513,46 +477,6 @@ static BOOL try_application_url(LPCWSTR url)
return ShellExecuteExW(&exec_info);
}
-static HRESULT http_load_hack(DocHost *This, IMoniker *mon, IBindStatusCallback *callback, IBindCtx *bindctx)
-{
- IPersistMoniker *persist;
- IUnknown *doc;
- HRESULT hres;
-
- /*
- * FIXME:
- * We should use URLMoniker's BindToObject instead creating HTMLDocument here.
- * This should be fixed when mshtml.dll and urlmon.dll will be good enough.
- */
-
- hres = CoCreateInstance(&CLSID_HTMLDocument, NULL,
- CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
- &IID_IUnknown, (void**)&doc);
-
- if(FAILED(hres)) {
- ERR("Could not create HTMLDocument: %08x\n", hres);
- return hres;
- }
-
- hres = IUnknown_QueryInterface(doc, &IID_IPersistMoniker, (void**)&persist);
- if(FAILED(hres)) {
- IUnknown_Release(doc);
- return hres;
- }
-
- hres = IPersistMoniker_Load(persist, FALSE, mon, bindctx, 0);
- IPersistMoniker_Release(persist);
-
- if(SUCCEEDED(hres))
- hres = IBindStatusCallback_OnObjectAvailable(callback, &IID_IUnknown, doc);
- else
- WARN("Load failed: %08x\n", hres);
-
- IUnknown_Release(doc);
-
- return IBindStatusCallback_OnStopBinding(callback, hres, NULL);
-}
-
static HRESULT create_moniker(LPCWSTR url, IMoniker **mon)
{
WCHAR new_url[INTERNET_MAX_URL_LENGTH];
@@ -585,14 +509,9 @@ static HRESULT create_moniker(LPCWSTR url, IMoniker **mon)
static HRESULT bind_to_object(DocHost *This, IMoniker *mon, LPCWSTR url, IBindCtx *bindctx,
IBindStatusCallback *callback)
{
- WCHAR schema[30];
- DWORD schema_len;
+ IUnknown *unk = NULL;
HRESULT hres;
- static const WCHAR httpW[] = {'h','t','t','p',0};
- static const WCHAR httpsW[] = {'h','t','t','p','s',0};
- static const WCHAR ftpW[]= {'f','t','p',0};
-
if(mon) {
IMoniker_AddRef(mon);
}else {
@@ -609,24 +528,15 @@ static HRESULT bind_to_object(DocHost *This, IMoniker *mon, LPCWSTR url, IBindCt
IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM,
(IUnknown*)CLIENTSITE(This));
- hres = CoInternetParseUrl(This->url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(schema[0]),
- &schema_len, 0);
- if(SUCCEEDED(hres) &&
- (!strcmpW(schema, httpW) || !strcmpW(schema, httpsW) || !strcmpW(schema, ftpW))) {
- hres = http_load_hack(This, mon, callback, bindctx);
+ hres = IMoniker_BindToObject(mon, bindctx, NULL, &IID_IUnknown, (void**)&unk);
+ if(SUCCEEDED(hres)) {
+ hres = S_OK;
+ if(unk)
+ IUnknown_Release(unk);
+ }else if(try_application_url(url)) {
+ hres = S_OK;
}else {
- IUnknown *unk = NULL;
-
- hres = IMoniker_BindToObject(mon, bindctx, NULL, &IID_IUnknown, (void**)&unk);
- if(SUCCEEDED(hres)) {
- hres = S_OK;
- if(unk)
- IUnknown_Release(unk);
- }else if(try_application_url(url)) {
- hres = S_OK;
- }else {
- FIXME("BindToObject failed: %08x\n", hres);
- }
+ FIXME("BindToObject failed: %08x\n", hres);
}
IMoniker_Release(mon);
@@ -639,6 +549,8 @@ static HRESULT navigate_bsc(DocHost *This, BindStatusCallback *bsc, IMoniker *mo
VARIANT_BOOL cancel = VARIANT_FALSE;
HRESULT hres;
+ This->ready_state = READYSTATE_LOADING;
+
on_before_navigate2(This, bsc->url, bsc->post_data, bsc->post_data_len, bsc->headers, &cancel);
if(cancel) {
FIXME("Navigation canceled\n");
diff --git a/reactos/dll/win32/shdocvw/oleobject.c b/reactos/dll/win32/shdocvw/oleobject.c
index aab06d0194c..3657a7a5276 100644
--- a/reactos/dll/win32/shdocvw/oleobject.c
+++ b/reactos/dll/win32/shdocvw/oleobject.c
@@ -28,6 +28,7 @@
#include "shdocvw.h"
#include "htiframe.h"
#include "idispids.h"
+#include "mshtmdid.h"
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
@@ -151,8 +152,16 @@ static HRESULT activate_inplace(WebBrowser *This, IOleClientSite *active_site)
SWP_NOZORDER | SWP_SHOWWINDOW);
if(This->client) {
+ IOleContainer *container;
+
IOleClientSite_ShowObject(This->client);
- IOleClientSite_GetContainer(This->client, &This->container);
+
+ hres = IOleClientSite_GetContainer(This->client, &container);
+ if(SUCCEEDED(hres)) {
+ if(This->container)
+ IOleContainer_Release(This->container);
+ This->container = container;
+ }
}
if(This->doc_host.frame)
@@ -614,7 +623,13 @@ static HRESULT WINAPI OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObject *ifac
{
WebBrowser *This = INPLACEOBJ_THIS(iface);
FIXME("(%p)\n", This);
- return E_NOTIMPL;
+
+ if(This->inplace) {
+ IOleInPlaceSite_Release(This->inplace);
+ This->inplace = NULL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI OleInPlaceObject_UIDeactivate(IOleInPlaceObject *iface)
@@ -723,6 +738,8 @@ static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DIS
* BUT the Webbrowser OleControl object doesn't appear to do this.
*/
return S_OK;
+ case DISPID_AMBIENT_DLCONTROL:
+ return S_OK;
case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
return on_offlineconnected_change(This);
case DISPID_AMBIENT_SILENT:
diff --git a/reactos/dll/win32/shdocvw/shdocvw.h b/reactos/dll/win32/shdocvw/shdocvw.h
index b14861167dd..9a511211f71 100644
--- a/reactos/dll/win32/shdocvw/shdocvw.h
+++ b/reactos/dll/win32/shdocvw/shdocvw.h
@@ -78,6 +78,7 @@ struct DocHost {
const IOleDocumentSiteVtbl *lpOleDocumentSiteVtbl;
const IOleCommandTargetVtbl *lpOleCommandTargetVtbl;
const IDispatchVtbl *lpDispatchVtbl;
+ const IPropertyNotifySinkVtbl *lpIPropertyNotifySinkVtbl;
const IServiceProviderVtbl *lpServiceProviderVtbl;
/* Interfaces of InPlaceFrame object */
@@ -101,6 +102,10 @@ struct DocHost {
VARIANT_BOOL offline;
VARIANT_BOOL busy;
+ READYSTATE ready_state;
+ DWORD prop_notif_cookie;
+ BOOL is_prop_notif;
+
ConnectionPointContainer cps;
};
@@ -184,6 +189,7 @@ struct InternetExplorer {
#define DOCHOSTUI2(x) ((IDocHostUIHandler2*) &(x)->lpDocHostUIHandlerVtbl)
#define DOCSITE(x) ((IOleDocumentSite*) &(x)->lpOleDocumentSiteVtbl)
#define CLDISP(x) ((IDispatch*) &(x)->lpDispatchVtbl)
+#define PROPNOTIF(x) ((IPropertyNotifySink*) &(x)->lpIPropertyNotifySinkVtbl)
#define SERVPROV(x) ((IServiceProvider*) &(x)->lpServiceProviderVtbl)
#define INPLACEFRAME(x) ((IOleInPlaceFrame*) &(x)->lpOleInPlaceFrameVtbl)
@@ -211,7 +217,7 @@ HRESULT WebBrowserV2_Create(IUnknown*,REFIID,void**);
void create_doc_view_hwnd(DocHost*);
void deactivate_document(DocHost*);
-void object_available(DocHost*);
+HRESULT dochost_object_available(DocHost*,IUnknown*);
void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*);
HRESULT navigate_url(DocHost*,LPCWSTR,const VARIANT*,const VARIANT*,VARIANT*,VARIANT*);
HRESULT go_home(DocHost*);
diff --git a/reactos/dll/win32/shdocvw/shdocvw.inf b/reactos/dll/win32/shdocvw/shdocvw.inf
index 51b4d316285..92e78845f35 100644
--- a/reactos/dll/win32/shdocvw/shdocvw.inf
+++ b/reactos/dll/win32/shdocvw/shdocvw.inf
@@ -140,9 +140,10 @@ HKLM,"Software\Microsoft\Windows\CurrentVersion\URL\Prefixes","www",,"http://"
[Settings.Reg]
-HKCU,"Software\Microsoft\Internet Explorer\Main","Start Page",2,"http://www.reactos.org"
+HKCU,"Software\Microsoft\Internet Explorer\Main","Start Page",2,"http://www.winehq.org"
HKCU,"Software\Microsoft\Internet Explorer\Main","Search Page",2,"http://www.google.com"
-HKLM,"Software\Microsoft\Internet Explorer\Main","Default_Page_URL",2,"http://www.reactos.org"
+HKCU,"Software\Microsoft\Internet Explorer\Settings","Text Color",2,"0,0,0"
+HKLM,"Software\Microsoft\Internet Explorer\Main","Default_Page_URL",2,"http://www.winehq.org"
HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\iexplore.exe",,,"%16422%\Internet Explorer\iexplore.exe"
HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\iexplore.exe","Path",,"%16422%\Internet Explorer;"
diff --git a/reactos/dll/win32/shdocvw/shdocvw.rc b/reactos/dll/win32/shdocvw/shdocvw.rc
index 47718c16722..bb4809b6e08 100644
--- a/reactos/dll/win32/shdocvw/shdocvw.rc
+++ b/reactos/dll/win32/shdocvw/shdocvw.rc
@@ -16,7 +16,15 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "version.rc"
+#define WINE_OLESELFREGISTER
+#define WINE_FILEDESCRIPTION_STR "Wine core dll"
+#define WINE_FILENAME_STR "shdocvw.dll"
+#define WINE_FILEVERSION 6,0,2900,2180
+#define WINE_FILEVERSION_STR "6.0.2900.2180"
+#define WINE_PRODUCTVERSION 6,0,2900,2180
+#define WINE_PRODUCTVERSION_STR "6.0.2900.2180"
+
+#include "wine/wine_common_ver.rc"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
diff --git a/reactos/dll/win32/shdocvw/shdocvw.spec b/reactos/dll/win32/shdocvw/shdocvw.spec
index 2bfcc8f4ddf..aa5ef512b3c 100644
--- a/reactos/dll/win32/shdocvw/shdocvw.spec
+++ b/reactos/dll/win32/shdocvw/shdocvw.spec
@@ -41,7 +41,7 @@
152 stub -noname CShellUIHelper_CreateInstance2
153 stub -noname IsURLChild
158 stub -noname SHRestricted2A
-159 stub -noname SHRestricted2W
+159 stdcall -noname SHRestricted2W(long wstr long)
160 stub -noname SHIsRestricted2W
161 stub @ # CSearchAssistantOC::OnDraw
162 stub -noname CDDEAuto_Navigate
diff --git a/reactos/dll/win32/shdocvw/shdocvw_main.c b/reactos/dll/win32/shdocvw/shdocvw_main.c
index 110b713d883..9090b7d47f4 100644
--- a/reactos/dll/win32/shdocvw/shdocvw_main.c
+++ b/reactos/dll/win32/shdocvw/shdocvw_main.c
@@ -406,3 +406,12 @@ HRESULT WINAPI IEParseDisplayNameWithBCW(DWORD codepage, LPCWSTR lpszDisplayName
FIXME("stub: 0x%x %s %p %p\n",codepage,debugstr_w(lpszDisplayName),pbc,ppidl);
return E_FAIL;
}
+
+/******************************************************************
+ * SHRestricted2W (SHDOCVW.159)
+ */
+DWORD WINAPI SHRestricted2W(DWORD res, LPCWSTR url, DWORD reserved)
+{
+ FIXME("(%d %s %d) stub\n", res, debugstr_w(url), reserved);
+ return 0;
+}
diff --git a/reactos/dll/win32/shdocvw/taskbarlist.c b/reactos/dll/win32/shdocvw/taskbarlist.c
index e0e063c5091..028169584f0 100644
--- a/reactos/dll/win32/shdocvw/taskbarlist.c
+++ b/reactos/dll/win32/shdocvw/taskbarlist.c
@@ -71,6 +71,7 @@ static ULONG STDMETHODCALLTYPE taskbar_list_Release(ITaskbarList *iface)
if (!refcount)
{
HeapFree(GetProcessHeap(), 0, This);
+ SHDOCVW_UnlockModule();
}
return refcount;
@@ -130,12 +131,14 @@ static const struct ITaskbarListVtbl taskbar_list_vtbl =
HRESULT TaskbarList_Create(IUnknown *outer, REFIID riid, void **taskbar_list)
{
struct taskbar_list *object;
+ HRESULT hr;
TRACE("outer %p, riid %s, taskbar_list %p\n", outer, debugstr_guid(riid), taskbar_list);
if (outer)
{
WARN("Aggregation not supported\n");
+ *taskbar_list = NULL;
return CLASS_E_NOAGGREGATION;
}
@@ -143,15 +146,23 @@ HRESULT TaskbarList_Create(IUnknown *outer, REFIID riid, void **taskbar_list)
if (!object)
{
ERR("Failed to allocate taskbar list object memory\n");
+ *taskbar_list = NULL;
return E_OUTOFMEMORY;
}
object->lpVtbl = &taskbar_list_vtbl;
- object->refcount = 1;
-
- *taskbar_list = object;
+ object->refcount = 0;
TRACE("Created ITaskbarList %p\n", object);
+ hr = ITaskbarList_QueryInterface((ITaskbarList *)object, riid, taskbar_list);
+ if (FAILED(hr))
+ {
+ HeapFree(GetProcessHeap(), 0, object);
+ return hr;
+ }
+
+ SHDOCVW_LockModule();
+
return S_OK;
}
diff --git a/reactos/dll/win32/shdocvw/webbrowser.c b/reactos/dll/win32/shdocvw/webbrowser.c
index 5e97961ee78..323e9addfcb 100644
--- a/reactos/dll/win32/shdocvw/webbrowser.c
+++ b/reactos/dll/win32/shdocvw/webbrowser.c
@@ -724,6 +724,7 @@ static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VA
VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
{
WebBrowser *This = WEBBROWSER_THIS(iface);
+ LPCWSTR url;
TRACE("(%p)->(%p %p %p %p %p)\n", This, URL, Flags, TargetFrameName, PostData, Headers);
@@ -733,12 +734,20 @@ static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VA
if(!URL)
return S_OK;
- if(V_VT(URL) != VT_BSTR) {
+ switch (V_VT(URL))
+ {
+ case VT_BSTR:
+ url = V_BSTR(URL);
+ break;
+ case VT_BSTR|VT_BYREF:
+ url = *V_BSTRREF(URL);
+ break;
+ default:
FIXME("Unsupported V_VT(URL) %d\n", V_VT(URL));
return E_INVALIDARG;
}
- return navigate_url(&This->doc_host, V_BSTR(URL), Flags, TargetFrameName, PostData, Headers);
+ return navigate_url(&This->doc_host, url, Flags, TargetFrameName, PostData, Headers);
}
static HRESULT WINAPI WebBrowser_QueryStatusWB(IWebBrowser2 *iface, OLECMDID cmdID, OLECMDF *pcmdf)
@@ -767,9 +776,10 @@ static HRESULT WINAPI WebBrowser_ShowBrowserBar(IWebBrowser2 *iface, VARIANT *pv
static HRESULT WINAPI WebBrowser_get_ReadyState(IWebBrowser2 *iface, READYSTATE *lpReadyState)
{
WebBrowser *This = WEBBROWSER_THIS(iface);
- FIXME("(%p)->(%p)\n", This, lpReadyState);
- *lpReadyState = READYSTATE_COMPLETE;
+ TRACE("(%p)->(%p)\n", This, lpReadyState);
+
+ *lpReadyState = This->doc_host.ready_state;
return S_OK;
}
diff --git a/reactos/dll/win32/shell32/pidl.c b/reactos/dll/win32/shell32/pidl.c
index 3da70ca3961..919f7cf8d03 100644
--- a/reactos/dll/win32/shell32/pidl.c
+++ b/reactos/dll/win32/shell32/pidl.c
@@ -31,14 +31,17 @@ WINE_DECLARE_DEBUG_CHANNEL(shell);
extern LPVOID WINAPI Alloc(INT);
extern BOOL WINAPI Free(LPVOID);
+static LPSTR _ILGetSTextPointer(LPCITEMIDLIST pidl);
+static LPWSTR _ILGetTextPointerW(LPCITEMIDLIST pidl);
+
/*************************************************************************
- * ILGetDisplayNameEx [SHELL32.186]
+ * ILGetDisplayNameExA [SHELL32.186]
*
* Retrieves the display name of an ItemIDList
*
* PARAMS
* psf [I] Shell Folder to start with, if NULL the desktop is used
- * pidl [I] ItemIDList relativ to the psf to get the display name for
+ * pidl [I] ItemIDList relative to the psf to get the display name for
* path [O] Filled in with the display name, assumed to be at least MAX_PATH long
* type [I] Type of display name to retrieve
* 0 = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR uses always the desktop as root
@@ -48,7 +51,7 @@ extern BOOL WINAPI Free(LPVOID);
* RETURNS
* True if the display name could be retrieved successfully, False otherwise
*/
-BOOL WINAPI ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR path, DWORD type)
+static BOOL ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR path, DWORD type)
{
BOOL ret = FALSE;
WCHAR wPath[MAX_PATH];
@@ -210,7 +213,7 @@ LPITEMIDLIST WINAPI ILClone (LPCITEMIDLIST pidl)
return NULL;
len = ILGetSize(pidl);
- newpidl = (LPITEMIDLIST)SHAlloc(len);
+ newpidl = SHAlloc(len);
if (newpidl)
memcpy(newpidl,pidl,len);
@@ -237,7 +240,7 @@ LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl)
if (pidl)
{
len = pidl->mkid.cb;
- pidlNew = (LPITEMIDLIST) SHAlloc (len+2);
+ pidlNew = SHAlloc(len+2);
if (pidlNew)
{
memcpy(pidlNew,pidl,len+2); /* 2 -> mind a desktop pidl */
@@ -271,7 +274,7 @@ HRESULT WINAPI ILLoadFromStream (IStream * pStream, LPITEMIDLIST * ppPidl)
IStream_AddRef (pStream);
- if (SUCCEEDED(IStream_Read(pStream, (LPVOID)&wLen, 2, &dwBytesRead)))
+ if (SUCCEEDED(IStream_Read(pStream, &wLen, 2, &dwBytesRead)))
{
TRACE("PIDL length is %d\n", wLen);
if (wLen != 0)
@@ -326,7 +329,7 @@ HRESULT WINAPI ILSaveToStream (IStream * pStream, LPCITEMIDLIST pPidl)
wLen = ILGetSize(pPidl);
- if (SUCCEEDED(IStream_Write(pStream, (LPVOID)&wLen, 2, NULL)))
+ if (SUCCEEDED(IStream_Write(pStream, &wLen, 2, NULL)))
{
if (SUCCEEDED(IStream_Write(pStream, pPidl, wLen, NULL)))
ret = S_OK;
@@ -442,7 +445,7 @@ LPITEMIDLIST WINAPI ILGlobalClone(LPCITEMIDLIST pidl)
return NULL;
len = ILGetSize(pidl);
- newpidl = (LPITEMIDLIST)Alloc(len);
+ newpidl = Alloc(len);
if (newpidl)
memcpy(newpidl,pidl,len);
@@ -703,7 +706,7 @@ HRESULT WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPCITEMIDLIST pidlSimple, LPITEM
if (SUCCEEDED(hr))
{
/*assert(pida->cidl==1);*/
- LPIDA pida = (LPIDA)GlobalLock(medium.u.hGlobal);
+ LPIDA pida = GlobalLock(medium.u.hGlobal);
LPCITEMIDLIST pidl_folder = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]);
LPCITEMIDLIST pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[1]);
@@ -805,7 +808,7 @@ LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
}
/*************************************************************************
- * ILAppendID [SHELL32.154]
+ * ILAppend [SHELL32.154]
*
* Adds the single ItemID item to the ItemIDList indicated by pidl.
* If bEnd is FALSE, inserts the item in the front of the list,
@@ -963,7 +966,7 @@ LPITEMIDLIST WINAPI ILCreateFromPathAW (LPCVOID path)
* is used to avoid having to verify the current path element on disk, so
* that creating an ItemIDList from a nonexistent path still can work.
*/
-static HRESULT WINAPI _ILParsePathW(LPCWSTR path, LPWIN32_FIND_DATAW lpFindFile,
+static HRESULT _ILParsePathW(LPCWSTR path, LPWIN32_FIND_DATAW lpFindFile,
BOOL bBindCtx, LPITEMIDLIST *ppidl, LPDWORD prgfInOut)
{
LPSHELLFOLDER pSF = NULL;
@@ -994,7 +997,7 @@ static HRESULT WINAPI _ILParsePathW(LPCWSTR path, LPWIN32_FIND_DATAW lpFindFile,
IShellFolder_Release(pSF);
- if (!SUCCEEDED(ret) && ppidl)
+ if (FAILED(ret) && ppidl)
*ppidl = NULL;
TRACE("%s %p 0x%x\n", debugstr_w(path), ppidl ? *ppidl : NULL, prgfInOut ? *prgfInOut : 0);
@@ -1101,12 +1104,12 @@ HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl,
shortname = _ILGetSTextPointer(pidl);
if (filename)
- lstrcpynA(pfd->cFileName, filename, MAX_PATH);
+ lstrcpynA(pfd->cFileName, filename, sizeof(pfd->cFileName));
else
pfd->cFileName[0] = '\0';
if (shortname)
- lstrcpynA(pfd->cAlternateFileName, shortname, MAX_PATH);
+ lstrcpynA(pfd->cAlternateFileName, shortname, sizeof(pfd->cAlternateFileName));
else
pfd->cAlternateFileName[0] = '\0';
return NOERROR;
@@ -1300,7 +1303,14 @@ HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCI
*
*************************************************************************
*/
-LPITEMIDLIST _ILAlloc(PIDLTYPE type, unsigned int size)
+
+/* Basic PIDL constructor. Allocates size + 5 bytes, where:
+ * - two bytes are SHITEMID.cb
+ * - one byte is PIDLDATA.type
+ * - two bytes are the NULL PIDL terminator
+ * Sets type of the returned PIDL to type.
+ */
+static LPITEMIDLIST _ILAlloc(PIDLTYPE type, unsigned int size)
{
LPITEMIDLIST pidlOut = NULL;
@@ -1412,7 +1422,7 @@ LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid)
{
LPPIDLDATA pData = _ILGetDataPointer(pidlOut);
- memcpy(&(pData->u.guid.guid), guid, sizeof(GUID));
+ pData->u.guid.guid = *guid;
TRACE("-- create GUID-pidl %s\n",
debugstr_guid(&(pData->u.guid.guid)));
}
@@ -1429,7 +1439,7 @@ LPITEMIDLIST _ILCreateGuidFromStrA(LPCSTR szGUID)
{
IID iid;
- if (!SUCCEEDED(SHCLSIDFromStringA(szGUID, &iid)))
+ if (FAILED(SHCLSIDFromStringA(szGUID, &iid)))
{
ERR("%s is not a GUID\n", szGUID);
return NULL;
@@ -1904,7 +1914,7 @@ DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
{
if(pidl && pidl->mkid.cb != 0x00)
- return (LPPIDLDATA) &(pidl->mkid.abID);
+ return (LPPIDLDATA)pidl->mkid.abID;
return NULL;
}
@@ -1912,7 +1922,7 @@ LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
* _ILGetTextPointerW()
* gets a pointer to the unicode long filename string stored in the pidl
*/
-LPWSTR _ILGetTextPointerW(LPCITEMIDLIST pidl)
+static LPWSTR _ILGetTextPointerW(LPCITEMIDLIST pidl)
{
/* TRACE(pidl,"(pidl%p)\n", pidl);*/
@@ -1952,7 +1962,7 @@ LPWSTR _ILGetTextPointerW(LPCITEMIDLIST pidl)
return NULL;
case PT_VALUEW:
- return (LPWSTR)&(pdata->u.file.szNames);
+ return (LPWSTR)pdata->u.file.szNames;
}
return NULL;
}
@@ -1982,21 +1992,21 @@ LPSTR _ILGetTextPointer(LPCITEMIDLIST pidl)
case PT_DRIVE1:
case PT_DRIVE2:
case PT_DRIVE3:
- return (LPSTR)&(pdata->u.drive.szDriveName);
+ return pdata->u.drive.szDriveName;
case PT_FOLDER:
case PT_FOLDER1:
case PT_VALUE:
case PT_IESPECIAL1:
case PT_IESPECIAL2:
- return (LPSTR)&(pdata->u.file.szNames);
+ return pdata->u.file.szNames;
case PT_WORKGRP:
case PT_COMP:
case PT_NETWORK:
case PT_NETPROVIDER:
case PT_SHARE:
- return (LPSTR)&(pdata->u.network.szNames);
+ return pdata->u.network.szNames;
}
return NULL;
}
@@ -2005,7 +2015,7 @@ LPSTR _ILGetTextPointer(LPCITEMIDLIST pidl)
* _ILGetSTextPointer()
* gets a pointer to the short filename string stored in the pidl
*/
-LPSTR _ILGetSTextPointer(LPCITEMIDLIST pidl)
+static LPSTR _ILGetSTextPointer(LPCITEMIDLIST pidl)
{
/* TRACE(pidl,"(pidl%p)\n", pidl); */
@@ -2020,10 +2030,10 @@ LPSTR _ILGetSTextPointer(LPCITEMIDLIST pidl)
case PT_VALUE:
case PT_IESPECIAL1:
case PT_IESPECIAL2:
- return (LPSTR)(pdata->u.file.szNames + strlen (pdata->u.file.szNames) + 1);
+ return pdata->u.file.szNames + strlen (pdata->u.file.szNames) + 1;
case PT_WORKGRP:
- return (LPSTR)(pdata->u.network.szNames + strlen (pdata->u.network.szNames) + 1);
+ return pdata->u.network.szNames + strlen (pdata->u.network.szNames) + 1;
}
return NULL;
}
diff --git a/reactos/dll/win32/shell32/pidl.h b/reactos/dll/win32/shell32/pidl.h
index 51b655bf0f8..e6859688e2a 100644
--- a/reactos/dll/win32/shell32/pidl.h
+++ b/reactos/dll/win32/shell32/pidl.h
@@ -35,7 +35,6 @@
#ifndef __WINE_PIDL_H
#define __WINE_PIDL_H
-
#include
#include
@@ -50,7 +49,7 @@
* a pidl of NULL means the desktop
*
* The structure of the pidl seems to be a union. The first byte of the
-* PIDLDATA desribes the type of pidl.
+* PIDLDATA describes the type of pidl.
*
* object ! first byte / ! format ! living space
* ! size
@@ -108,7 +107,6 @@
#define PT_IESPECIAL2 0xb1
#define PT_SHARE 0xc3
-
#include "pshpack1.h"
typedef BYTE PIDLTYPE;
@@ -257,14 +255,6 @@ BOOL __inline _ILIsEmpty (LPCITEMIDLIST pidl) { return _ILIsDeskto
* simple pidls
*/
-/* Basic PIDL constructor. Allocates size + 5 bytes, where:
- * - two bytes are SHITEMID.cb
- * - one byte is PIDLDATA.type
- * - two bytes are the NULL PIDL terminator
- * Sets type of the returned PIDL to type.
- */
-LPITEMIDLIST _ILAlloc(PIDLTYPE type, unsigned int size);
-
/* Creates a PIDL with guid format and type type, which must be one of PT_GUID,
* PT_SHELLEXT, or PT_YAGUID.
*/
@@ -297,8 +287,6 @@ LPITEMIDLIST _ILCreateDrive (LPCWSTR);
*/
LPPIDLDATA _ILGetDataPointer (LPCITEMIDLIST);
LPSTR _ILGetTextPointer (LPCITEMIDLIST);
-LPWSTR _ILGetTextPointerW (LPCITEMIDLIST);
-LPSTR _ILGetSTextPointer (LPCITEMIDLIST);
IID *_ILGetGUIDPointer (LPCITEMIDLIST pidl);
FileStructW *_ILGetFileStructW (LPCITEMIDLIST pidl);
@@ -315,7 +303,6 @@ void _ILFreeaPidl(LPITEMIDLIST * apidl, UINT cidl);
LPITEMIDLIST * _ILCopyaPidl(const LPCITEMIDLIST * apidlsrc, UINT cidl);
LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, const CIDA * cida);
-BOOL WINAPI ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR path, DWORD type);
BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type);
#endif
diff --git a/reactos/dll/win32/shell32/shell32.rbuild b/reactos/dll/win32/shell32/shell32.rbuild
index 2f91a1d63a3..bf253956d81 100644
--- a/reactos/dll/win32/shell32/shell32.rbuild
+++ b/reactos/dll/win32/shell32/shell32.rbuild
@@ -7,6 +7,7 @@
include/reactos/wine
+
0x600
wine
uuid
diff --git a/reactos/dll/win32/shell32/shelllink.c b/reactos/dll/win32/shell32/shelllink.c
index 734e47f9e7a..584f9732bf8 100644
--- a/reactos/dll/win32/shell32/shelllink.c
+++ b/reactos/dll/win32/shell32/shelllink.c
@@ -2816,6 +2816,10 @@ ShellLink_InvokeCommand( IContextMenu* iface, LPCMINVOKECOMMANDINFO lpici )
wcscat( args, iciex->lpParametersW );
}
}
+ else if (This->sArgs != NULL)
+ {
+ args = This->sArgs;
+ }
memset( &sei, 0, sizeof sei );
sei.cbSize = sizeof sei;
diff --git a/reactos/dll/win32/shell32/shellpath.c b/reactos/dll/win32/shell32/shellpath.c
index 68021fba37c..5a39c8390b8 100644
--- a/reactos/dll/win32/shell32/shellpath.c
+++ b/reactos/dll/win32/shell32/shellpath.c
@@ -947,14 +947,14 @@ static HRESULT _SHGetUserShellFolderPath(HKEY rootKey, LPCWSTR userPrefix,
pShellFolderPath = szSHFolders;
}
- if (RegCreateKeyExW(rootKey, pShellFolderPath, 0, NULL, 0, KEY_ALL_ACCESS,
+ if (RegCreateKeyExW(rootKey, pShellFolderPath, 0, NULL, 0, KEY_SET_VALUE,
NULL, &shellFolderKey, &dwDisp))
{
TRACE("Failed to create %s\n", debugstr_w(pShellFolderPath));
return E_FAIL;
}
if (RegCreateKeyExW(rootKey, pUserShellFolderPath, 0, NULL, 0,
- KEY_ALL_ACCESS, NULL, &userShellFolderKey, &dwDisp))
+ KEY_QUERY_VALUE, NULL, &userShellFolderKey, &dwDisp))
{
TRACE("Failed to create %s\n",
debugstr_w(pUserShellFolderPath));
diff --git a/reactos/dll/win32/shell32/shfldr_mycomp.c b/reactos/dll/win32/shell32/shfldr_mycomp.c
index 7bd7daa9214..8a80035db23 100644
--- a/reactos/dll/win32/shell32/shfldr_mycomp.c
+++ b/reactos/dll/win32/shell32/shfldr_mycomp.c
@@ -94,7 +94,7 @@ HRESULT WINAPI ISF_MyComputer_Constructor (IUnknown * pUnkOuter, REFIID riid, LP
sf->lpVtblPersistFolder2 = &vt_PersistFolder2;
sf->pidlRoot = _ILCreateMyComputer (); /* my qualified pidl */
- if (!SUCCEEDED (IUnknown_QueryInterface (_IUnknown_ (sf), riid, ppv)))
+ if (FAILED (IUnknown_QueryInterface (_IUnknown_ (sf), riid, ppv)))
{
IUnknown_Release (_IUnknown_ (sf));
return E_NOINTERFACE;
@@ -180,7 +180,7 @@ static ULONG WINAPI ISF_MyComputer_fnRelease (IShellFolder2 * iface)
{
TRACE ("-- destroying IShellFolder(%p)\n", This);
SHFree (This->pidlRoot);
- LocalFree ((HLOCAL) This);
+ LocalFree (This);
}
return refCount;
}
diff --git a/reactos/dll/win32/shell32/shlfolder.c b/reactos/dll/win32/shell32/shlfolder.c
index 02e82ecae6f..a08b755deb6 100644
--- a/reactos/dll/win32/shell32/shlfolder.c
+++ b/reactos/dll/win32/shell32/shlfolder.c
@@ -88,7 +88,7 @@ BOOL SHELL32_GetCustomFolderAttribute(
*
* PARAMETERS
* pszNext [IN] string to get the element from
- * pszOut [IN] pointer to buffer whitch receives string
+ * pszOut [IN] pointer to buffer which receives string
* dwOut [IN] length of pszOut
*
* RETURNS
@@ -110,7 +110,7 @@ LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut)
while (*pszTail && (*pszTail != (WCHAR) '\\'))
pszTail++;
- dwCopy = (const WCHAR *) pszTail - (const WCHAR *) pszNext + 1;
+ dwCopy = pszTail - pszNext + 1;
lstrcpynW (pszOut, pszNext, (dwOut < dwCopy) ? dwOut : dwCopy);
if (*pszTail)
diff --git a/reactos/dll/win32/shlwapi/assoc.c b/reactos/dll/win32/shlwapi/assoc.c
index 56db41e08ab..d6bc53088eb 100644
--- a/reactos/dll/win32/shlwapi/assoc.c
+++ b/reactos/dll/win32/shlwapi/assoc.c
@@ -134,7 +134,8 @@ static BOOL SHLWAPI_ParamAToW(LPCSTR lpszParam, LPWSTR lpszBuff, DWORD dwLen,
* Failure: An HRESULT error code indicating the error.
*
* NOTES
- * refiid must be equal to IID_IQueryAssociations, or this function will fail.
+ * clsid must be equal to CLSID_QueryAssociations and
+ * refiid must be equal to IID_IQueryAssociations, IID_IUnknown or this function will fail
*/
HRESULT WINAPI AssocCreate(CLSID clsid, REFIID refiid, void **lpInterface)
{
@@ -149,8 +150,8 @@ HRESULT WINAPI AssocCreate(CLSID clsid, REFIID refiid, void **lpInterface)
*(DWORD*)lpInterface = 0;
- if (!IsEqualGUID(&clsid, &IID_IQueryAssociations))
- return E_NOTIMPL;
+ if (!IsEqualGUID(&clsid, &CLSID_QueryAssociations))
+ return CLASS_E_CLASSNOTAVAILABLE;
lpAssoc = IQueryAssociations_Constructor();
@@ -159,6 +160,10 @@ HRESULT WINAPI AssocCreate(CLSID clsid, REFIID refiid, void **lpInterface)
hRet = IQueryAssociations_QueryInterface(lpAssoc, refiid, lpInterface);
IQueryAssociations_Release(lpAssoc);
+
+ if(hRet == E_NOINTERFACE)
+ return CLASS_E_CLASSNOTAVAILABLE;
+
return hRet;
}
diff --git a/reactos/dll/win32/shlwapi/resource.h b/reactos/dll/win32/shlwapi/resource.h
index e0ca08c5dc6..ac53357358e 100644
--- a/reactos/dll/win32/shlwapi/resource.h
+++ b/reactos/dll/win32/shlwapi/resource.h
@@ -20,6 +20,9 @@
#ifndef WINE_SHLWAPI_RESOURCE_H
#define WINE_SHLWAPI_RESOURCE_H
+#include
+#include
+
#define IDS_BYTES_FORMAT 64
#define IDS_TIME_INTERVAL_HOURS 65
#define IDS_TIME_INTERVAL_MINUTES 66
diff --git a/reactos/dll/win32/shlwapi/shlwapi.rc b/reactos/dll/win32/shlwapi/shlwapi.rc
index d159dab2290..f9e68738d4c 100644
--- a/reactos/dll/win32/shlwapi/shlwapi.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi.rc
@@ -36,6 +36,7 @@
#include "shlwapi_It.rc"
#include "shlwapi_Ja.rc"
#include "shlwapi_Ko.rc"
+#include "shlwapi_Lt.rc"
#include "shlwapi_Nl.rc"
#include "shlwapi_No.rc"
#include "shlwapi_Pl.rc"
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Da.rc b/reactos/dll/win32/shlwapi/shlwapi_Da.rc
index 4ed0e61999b..3bb418da2b8 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Da.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Da.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_De.rc b/reactos/dll/win32/shlwapi/shlwapi_De.rc
index eaad902bff8..f33681e1136 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_De.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_De.rc
@@ -18,6 +18,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
+#pragma code_page(65001)
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
@@ -37,7 +41,8 @@ FONT 8, "MS Shell Dlg"
STRINGTABLE DISCARDABLE
{
IDS_BYTES_FORMAT "%ld Bytes"
- IDS_TIME_INTERVAL_HOURS " hr"
- IDS_TIME_INTERVAL_MINUTES " min"
- IDS_TIME_INTERVAL_SECONDS " sec"
+ IDS_TIME_INTERVAL_HOURS " Std"
+ IDS_TIME_INTERVAL_MINUTES " Min"
+ IDS_TIME_INTERVAL_SECONDS " Sek"
}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/shlwapi/shlwapi_En.rc b/reactos/dll/win32/shlwapi/shlwapi_En.rc
index 5a327f0e006..4e1d935cfca 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_En.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_En.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Eo.rc b/reactos/dll/win32/shlwapi/shlwapi_Eo.rc
index 71b3710f6d5..ce7833d6953 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Eo.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Eo.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_ESPERANTO, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Es.rc b/reactos/dll/win32/shlwapi/shlwapi_Es.rc
index 3a325db2c07..8d351f680fd 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Es.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Es.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Fi.rc b/reactos/dll/win32/shlwapi/shlwapi_Fi.rc
index ea9b3950845..877228f3393 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Fi.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Fi.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Fr.rc b/reactos/dll/win32/shlwapi/shlwapi_Fr.rc
index 842a67cb33e..d32b9a898b7 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Fr.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Fr.rc
@@ -18,11 +18,16 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Erreur!"
+CAPTION "Erreur !"
FONT 8, "MS Shell Dlg"
{
LTEXT "", IDS_ERR_USER_MSG2, 15, 5, 28, 20
@@ -41,3 +46,4 @@ STRINGTABLE DISCARDABLE
IDS_TIME_INTERVAL_MINUTES " min"
IDS_TIME_INTERVAL_SECONDS " sec"
}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Hu.rc b/reactos/dll/win32/shlwapi/shlwapi_Hu.rc
index 9aa253e45ba..56535e8927b 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Hu.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Hu.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_It.rc b/reactos/dll/win32/shlwapi/shlwapi_It.rc
index b62f4940abd..e7a984eaa9a 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_It.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_It.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Ja.rc b/reactos/dll/win32/shlwapi/shlwapi_Ja.rc
index accd716df23..2c79e3215ab 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Ja.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Ja.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
/* UTF-8 */
#pragma code_page(65001)
@@ -44,5 +46,4 @@ STRINGTABLE DISCARDABLE
IDS_TIME_INTERVAL_MINUTES " min"
IDS_TIME_INTERVAL_SECONDS " sec"
}
-
#pragma code_page(default)
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Ko.rc b/reactos/dll/win32/shlwapi/shlwapi_Ko.rc
index 8a44a6610f5..3526cac6a04 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Ko.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Ko.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Lt.rc b/reactos/dll/win32/shlwapi/shlwapi_Lt.rc
new file mode 100644
index 00000000000..264f6f64eb4
--- /dev/null
+++ b/reactos/dll/win32/shlwapi/shlwapi_Lt.rc
@@ -0,0 +1,48 @@
+/*
+ * Lithuanian resources for shlwapi
+ *
+ * Copyright 2009 Aurimas Fišeras
+ *
+ * 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 "resource.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
+
+IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
+STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Klaida!"
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "", IDS_ERR_USER_MSG2, 15, 5, 28, 20
+ LTEXT "", IDS_ERR_USER_MSG, 15, 5, 210, 8
+ CHECKBOX "Daugiau ne&rodyti šio pranešimo", IDC_ERR_DONT_SHOW, 5, 20, 210, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON L"&Gerai" IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON L"&Atsisakyti" IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON L"&Taip" IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON L"&Ne" IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
+}
+
+STRINGTABLE DISCARDABLE
+{
+ IDS_BYTES_FORMAT "%ld baitai"
+ IDS_TIME_INTERVAL_HOURS " val"
+ IDS_TIME_INTERVAL_MINUTES " min"
+ IDS_TIME_INTERVAL_SECONDS " sek"
+}
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Nl.rc b/reactos/dll/win32/shlwapi/shlwapi_Nl.rc
index c7ac3e7d131..0c9e3cb6df0 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Nl.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_No.rc b/reactos/dll/win32/shlwapi/shlwapi_No.rc
index 4df42c87dd0..b48106a9a51 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_No.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_No.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
@@ -41,3 +43,4 @@ STRINGTABLE DISCARDABLE
IDS_TIME_INTERVAL_MINUTES " min"
IDS_TIME_INTERVAL_SECONDS " sec"
}
+#pragma code_page(default)
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Pl.rc b/reactos/dll/win32/shlwapi/shlwapi_Pl.rc
index 467ee8d1f76..8a0032c58cf 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Pl.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Pl.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Pt.rc b/reactos/dll/win32/shlwapi/shlwapi_Pt.rc
index 839fa13c500..9974fd673bc 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Pt.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Pt.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Ro.rc b/reactos/dll/win32/shlwapi/shlwapi_Ro.rc
index 9b6278fbf95..800f25971e9 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Ro.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Ro.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -42,5 +44,3 @@ STRINGTABLE DISCARDABLE
IDS_TIME_INTERVAL_MINUTES " min"
IDS_TIME_INTERVAL_SECONDS " sec"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Ru.rc b/reactos/dll/win32/shlwapi/shlwapi_Ru.rc
index 87aee4acb8a..42a5c38dd73 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Ru.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Ru.rc
@@ -18,26 +18,31 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "!"
+CAPTION "Ошибка!"
FONT 8, "MS Shell Dlg"
{
LTEXT "", IDS_ERR_USER_MSG2, 15, 5, 28, 20
LTEXT "", IDS_ERR_USER_MSG, 15, 5, 210, 8
- CHECKBOX " & ", IDC_ERR_DONT_SHOW, 5, 20, 210, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ CHECKBOX "Больше не &показывать это сообщение", IDC_ERR_DONT_SHOW, 5, 20, 210, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&OK" IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
- PUSHBUTTON L"&" IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
- PUSHBUTTON L"&" IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
- PUSHBUTTON L"&" IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON L"О&тменить" IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON L"&Да" IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON L"&Нет" IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
}
STRINGTABLE DISCARDABLE
{
- IDS_BYTES_FORMAT "%ld "
- IDS_TIME_INTERVAL_HOURS " "
- IDS_TIME_INTERVAL_MINUTES " "
- IDS_TIME_INTERVAL_SECONDS " "
+ IDS_BYTES_FORMAT "%ld байт"
+ IDS_TIME_INTERVAL_HOURS " час"
+ IDS_TIME_INTERVAL_MINUTES " мин"
+ IDS_TIME_INTERVAL_SECONDS " сек"
}
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Si.rc b/reactos/dll/win32/shlwapi/shlwapi_Si.rc
index ed5a92e787a..d6394dd1562 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Si.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Si.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
@@ -43,5 +45,4 @@ STRINGTABLE DISCARDABLE
IDS_TIME_INTERVAL_MINUTES " min"
IDS_TIME_INTERVAL_SECONDS " sek"
}
-
#pragma code_page(default)
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Sk.rc b/reactos/dll/win32/shlwapi/shlwapi_Sk.rc
index e5479e90d4c..c44ca3f39fa 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Sk.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Sk.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Sv.rc b/reactos/dll/win32/shlwapi/shlwapi_Sv.rc
index 6e13b91cae9..6a0d52bc996 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Sv.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Sv.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Tr.rc b/reactos/dll/win32/shlwapi/shlwapi_Tr.rc
index 15453623df3..58515962719 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Tr.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Tr.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Uk.rc b/reactos/dll/win32/shlwapi/shlwapi_Uk.rc
index a8a1e3d9fc8..c14a7ce13dc 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Uk.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Uk.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60
diff --git a/reactos/dll/win32/shlwapi/shlwapi_Zh.rc b/reactos/dll/win32/shlwapi/shlwapi_Zh.rc
index 842bb15f8cc..0a1d9a62bf2 100644
--- a/reactos/dll/win32/shlwapi/shlwapi_Zh.rc
+++ b/reactos/dll/win32/shlwapi/shlwapi_Zh.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "resource.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -68,5 +70,3 @@ STRINGTABLE DISCARDABLE
IDS_TIME_INTERVAL_MINUTES " 分"
IDS_TIME_INTERVAL_SECONDS " 秒"
}
-
-#pragma code_page(default)
diff --git a/reactos/dll/win32/sndblst/sndblst.c b/reactos/dll/win32/sndblst/sndblst.c
index e826c0098c3..e814e4b3176 100644
--- a/reactos/dll/win32/sndblst/sndblst.c
+++ b/reactos/dll/win32/sndblst/sndblst.c
@@ -137,7 +137,7 @@ BOOLEAN FoundDevice(
return TRUE;
}
-APIENTRY LONG
+LONG APIENTRY
DriverProc(
DWORD DriverId,
HANDLE DriverHandle,
diff --git a/reactos/dll/win32/snmpapi/snmpapi.c b/reactos/dll/win32/snmpapi/snmpapi.c
index 80e6476d93c..99c67588527 100644
--- a/reactos/dll/win32/snmpapi/snmpapi.c
+++ b/reactos/dll/win32/snmpapi/snmpapi.c
@@ -12,20 +12,10 @@
#include
#include
-#ifdef __GNUC__
#define SNMP_FUNC_TYPE WINAPI
-#endif
#include
#include "debug.h"
-
-#ifdef __GNUC__
-#define EXPORT WINAPI
-#else
-#define EXPORT CALLBACK
-#endif
-
-
#if DBG
/* See debug.h for debug/trace constants */
diff --git a/reactos/dll/win32/sti/regsvr.c b/reactos/dll/win32/sti/regsvr.c
new file mode 100644
index 00000000000..018c1781ef6
--- /dev/null
+++ b/reactos/dll/win32/sti/regsvr.c
@@ -0,0 +1,426 @@
+/*
+ * self-registerable dll functions for sti.dll
+ *
+ * Copyright (C) 2003 John K. Hohm
+ * Copyright (C) 2009 Damjan Jovanovic
+ *
+ * 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
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winreg.h"
+#include "winerror.h"
+#include "objbase.h"
+#include "initguid.h"
+#include "sti.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(sti);
+
+/*
+ * Near the bottom of this file are the exported DllRegisterServer and
+ * DllUnregisterServer, which make all this worthwhile.
+ */
+
+/***********************************************************************
+ * interface for self-registering
+ */
+struct regsvr_interface
+{
+ IID const *iid; /* NULL for end of list */
+ LPCSTR name; /* can be NULL to omit */
+ IID const *base_iid; /* can be NULL to omit */
+ int num_methods; /* can be <0 to omit */
+ CLSID const *ps_clsid; /* can be NULL to omit */
+ CLSID const *ps_clsid32; /* can be NULL to omit */
+};
+
+static HRESULT register_interfaces(struct regsvr_interface const *list);
+static HRESULT unregister_interfaces(struct regsvr_interface const *list);
+
+struct regsvr_coclass
+{
+ CLSID const *clsid; /* NULL for end of list */
+ LPCSTR name; /* can be NULL to omit */
+ LPCSTR ips; /* can be NULL to omit */
+ LPCSTR ips32; /* can be NULL to omit */
+ LPCSTR ips32_tmodel; /* can be NULL to omit */
+ LPCSTR clsid_str; /* can be NULL to omit */
+ LPCSTR progid; /* can be NULL to omit */
+};
+
+static HRESULT register_coclasses(struct regsvr_coclass const *list);
+static HRESULT unregister_coclasses(struct regsvr_coclass const *list);
+
+/***********************************************************************
+ * static string constants
+ */
+static WCHAR const interface_keyname[10] = {
+ 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 };
+static WCHAR const base_ifa_keyname[14] = {
+ 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c',
+ 'e', 0 };
+static WCHAR const num_methods_keyname[11] = {
+ 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 };
+static WCHAR const ps_clsid_keyname[15] = {
+ 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
+ 'i', 'd', 0 };
+static WCHAR const ps_clsid32_keyname[17] = {
+ 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
+ 'i', 'd', '3', '2', 0 };
+static WCHAR const clsid_keyname[6] = {
+ 'C', 'L', 'S', 'I', 'D', 0 };
+static WCHAR const ips_keyname[13] = {
+ 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
+ 0 };
+static WCHAR const ips32_keyname[15] = {
+ 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
+ '3', '2', 0 };
+static WCHAR const progid_keyname[7] = {
+ 'P', 'r', 'o', 'g', 'I', 'D', 0 };
+static char const tmodel_valuename[] = "ThreadingModel";
+
+/***********************************************************************
+ * static helper functions
+ */
+static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid);
+static LONG register_key_defvalueW(HKEY base, WCHAR const *name,
+ WCHAR const *value);
+static LONG register_key_defvalueA(HKEY base, WCHAR const *name,
+ char const *value);
+
+/***********************************************************************
+ * register_interfaces
+ */
+static HRESULT register_interfaces(struct regsvr_interface const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY interface_key;
+
+ res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &interface_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->iid; ++list) {
+ WCHAR buf[39];
+ HKEY iid_key;
+
+ StringFromGUID2(list->iid, buf, 39);
+ res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &iid_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_interface_key;
+
+ if (list->name) {
+ res = RegSetValueExA(iid_key, NULL, 0, REG_SZ,
+ (CONST BYTE*)(list->name),
+ strlen(list->name) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+ }
+
+ if (list->base_iid) {
+ res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid);
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+ }
+
+ if (0 <= list->num_methods) {
+ static WCHAR const fmt[3] = { '%', 'd', 0 };
+ HKEY key;
+
+ res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+
+ sprintfW(buf, fmt, list->num_methods);
+ res = RegSetValueExW(key, NULL, 0, REG_SZ,
+ (CONST BYTE*)buf,
+ (lstrlenW(buf) + 1) * sizeof(WCHAR));
+ RegCloseKey(key);
+
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+ }
+
+ if (list->ps_clsid) {
+ res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid);
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+ }
+
+ if (list->ps_clsid32) {
+ res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32);
+ if (res != ERROR_SUCCESS) goto error_close_iid_key;
+ }
+
+ error_close_iid_key:
+ RegCloseKey(iid_key);
+ }
+
+error_close_interface_key:
+ RegCloseKey(interface_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * unregister_interfaces
+ */
+static HRESULT unregister_interfaces(struct regsvr_interface const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY interface_key;
+
+ res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0,
+ KEY_READ | KEY_WRITE, &interface_key);
+ if (res == ERROR_FILE_NOT_FOUND) return S_OK;
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->iid; ++list) {
+ WCHAR buf[39];
+
+ StringFromGUID2(list->iid, buf, 39);
+ res = RegDeleteTreeW(interface_key, buf);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ }
+
+ RegCloseKey(interface_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * register_coclasses
+ */
+static HRESULT register_coclasses(struct regsvr_coclass const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY coclass_key;
+
+ res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+ WCHAR buf[39];
+ HKEY clsid_key;
+
+ StringFromGUID2(list->clsid, buf, 39);
+ res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+
+ if (list->name) {
+ res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ,
+ (CONST BYTE*)(list->name),
+ strlen(list->name) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->ips) {
+ res = register_key_defvalueA(clsid_key, ips_keyname, list->ips);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->ips32) {
+ HKEY ips32_key;
+
+ res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL,
+ &ips32_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+ res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ,
+ (CONST BYTE*)list->ips32,
+ lstrlenA(list->ips32) + 1);
+ if (res == ERROR_SUCCESS && list->ips32_tmodel)
+ res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ,
+ (CONST BYTE*)list->ips32_tmodel,
+ strlen(list->ips32_tmodel) + 1);
+ RegCloseKey(ips32_key);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->clsid_str) {
+ res = register_key_defvalueA(clsid_key, clsid_keyname,
+ list->clsid_str);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->progid) {
+ HKEY progid_key;
+
+ res = register_key_defvalueA(clsid_key, progid_keyname,
+ list->progid);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+ res = RegCreateKeyExA(HKEY_CLASSES_ROOT, list->progid, 0,
+ NULL, 0, KEY_READ | KEY_WRITE, NULL,
+ &progid_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+ res = register_key_defvalueW(progid_key, clsid_keyname, buf);
+ RegCloseKey(progid_key);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ error_close_clsid_key:
+ RegCloseKey(clsid_key);
+ }
+
+error_close_coclass_key:
+ RegCloseKey(coclass_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * unregister_coclasses
+ */
+static HRESULT unregister_coclasses(struct regsvr_coclass const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY coclass_key;
+
+ res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
+ KEY_READ | KEY_WRITE, &coclass_key);
+ if (res == ERROR_FILE_NOT_FOUND) return S_OK;
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+ WCHAR buf[39];
+
+ StringFromGUID2(list->clsid, buf, 39);
+ res = RegDeleteTreeW(coclass_key, buf);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+
+ if (list->progid) {
+ res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+ }
+ }
+
+error_close_coclass_key:
+ RegCloseKey(coclass_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * regsvr_key_guid
+ */
+static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid)
+{
+ WCHAR buf[39];
+
+ StringFromGUID2(guid, buf, 39);
+ return register_key_defvalueW(base, name, buf);
+}
+
+/***********************************************************************
+ * regsvr_key_defvalueW
+ */
+static LONG register_key_defvalueW(
+ HKEY base,
+ WCHAR const *name,
+ WCHAR const *value)
+{
+ LONG res;
+ HKEY key;
+
+ res = RegCreateKeyExW(base, name, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &key, NULL);
+ if (res != ERROR_SUCCESS) return res;
+ res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
+ (lstrlenW(value) + 1) * sizeof(WCHAR));
+ RegCloseKey(key);
+ return res;
+}
+
+/***********************************************************************
+ * regsvr_key_defvalueA
+ */
+static LONG register_key_defvalueA(
+ HKEY base,
+ WCHAR const *name,
+ char const *value)
+{
+ LONG res;
+ HKEY key;
+
+ res = RegCreateKeyExW(base, name, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &key, NULL);
+ if (res != ERROR_SUCCESS) return res;
+ res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
+ lstrlenA(value) + 1);
+ RegCloseKey(key);
+ return res;
+}
+
+/***********************************************************************
+ * coclass list
+ */
+static struct regsvr_coclass const coclass_list[] = {
+ { &CLSID_Sti,
+ "StillImage",
+ NULL,
+ "sti.dll",
+ "Both"
+ },
+ { NULL } /* list terminator */
+};
+
+/***********************************************************************
+ * interface list
+ */
+static struct regsvr_interface const interface_list[] = {
+ { NULL } /* list terminator */
+};
+
+/***********************************************************************
+ * DllRegisterServer (INETCOMM.@)
+ */
+HRESULT WINAPI DllRegisterServer(void)
+{
+ HRESULT hr;
+
+ TRACE("\n");
+
+ hr = register_coclasses(coclass_list);
+ if (SUCCEEDED(hr))
+ hr = register_interfaces(interface_list);
+ return hr;
+}
+
+/***********************************************************************
+ * DllUnregisterServer (INETCOMM.@)
+ */
+HRESULT WINAPI DllUnregisterServer(void)
+{
+ HRESULT hr;
+
+ TRACE("\n");
+
+ hr = unregister_coclasses(coclass_list);
+ if (SUCCEEDED(hr))
+ hr = unregister_interfaces(interface_list);
+ return hr;
+}
diff --git a/reactos/dll/win32/sti/sti.rbuild b/reactos/dll/win32/sti/sti.rbuild
index 2fb62c587a3..66372bad58e 100644
--- a/reactos/dll/win32/sti/sti.rbuild
+++ b/reactos/dll/win32/sti/sti.rbuild
@@ -2,13 +2,17 @@
-
+
.
include/reactos/wine
+ 0x600
+ regsvr.c
sti_main.c
wine
+ advapi32
+ ole32
kernel32
ntdll
diff --git a/reactos/dll/win32/sti/sti.spec b/reactos/dll/win32/sti/sti.spec
index f8b17fdd8e4..186f382f195 100644
--- a/reactos/dll/win32/sti/sti.spec
+++ b/reactos/dll/win32/sti/sti.spec
@@ -1,7 +1,7 @@
@ stub DllCanUnloadNow
@ stub DllGetClassObject
-@ stub DllRegisterServer
-@ stub DllUnregisterServer
+@ stdcall -private DllRegisterServer()
+@ stdcall -private DllUnregisterServer()
@ stdcall StiCreateInstance(ptr long ptr ptr)
@ stdcall StiCreateInstanceA(ptr long ptr ptr)
@ stdcall StiCreateInstanceW(ptr long ptr ptr)
diff --git a/reactos/dll/win32/syssetup/install.c b/reactos/dll/win32/syssetup/install.c
index b8a478cad4e..dfc66614a3e 100644
--- a/reactos/dll/win32/syssetup/install.c
+++ b/reactos/dll/win32/syssetup/install.c
@@ -759,7 +759,7 @@ CreateShortcuts(VOID)
/* Create program startmenu shortcuts */
CreateShortcut(CSIDL_PROGRAMS, NULL, IDS_SHORT_EXPLORER, _T("%SystemRoot%\\explorer.exe"), IDS_CMT_EXPLORER, TRUE);
- CreateShortcut(CSIDL_PROGRAMS, NULL, IDS_SHORT_DOWNLOADER, _T("%SystemRoot%\\system32\\downloader.exe"), IDS_CMT_DOWNLOADER, TRUE);
+ CreateShortcut(CSIDL_PROGRAMS, NULL, IDS_SHORT_DOWNLOADER, _T("%SystemRoot%\\system32\\rapps.exe"), IDS_CMT_DOWNLOADER, TRUE);
/* Create administrative tools startmenu shortcuts */
CreateShortcut(CSIDL_COMMON_ADMINTOOLS, NULL, IDS_SHORT_SERVICE, _T("%SystemRoot%\\system32\\servman.exe"), IDS_CMT_SERVMAN, TRUE);
diff --git a/reactos/dll/win32/syssetup/lang/bg-BG.rc b/reactos/dll/win32/syssetup/lang/bg-BG.rc
index 07d1b18c4b2..f88ae565944 100644
--- a/reactos/dll/win32/syssetup/lang/bg-BG.rc
+++ b/reactos/dll/win32/syssetup/lang/bg-BG.rc
@@ -217,7 +217,7 @@ BEGIN
IDS_CMT_RDESKTOP " "
IDS_CMT_EVENTVIEW " "
IDS_CMT_MSCONFIG " "
- IDS_CMT_PAINT "Launch Paint"
+ IDS_CMT_PAINT " "
END
@@ -266,7 +266,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD " .lnk"
IDS_SHORT_EXPLORER " .lnk"
- IDS_SHORT_DOWNLOADER "!.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE " .lnk"
IDS_SHORT_DEVICE " .lnk"
IDS_SHORT_MPLAY32 " .lnk"
@@ -285,7 +285,7 @@ BEGIN
IDS_SHORT_MSCONFIG " .lnk"
IDS_SHORT_SNDVOL32 " .lnk"
IDS_SHORT_DXDIAG " .lnk"
- IDS_SHORT_PAINT "Paint.lnk"
+ IDS_SHORT_PAINT ".lnk"
END
diff --git a/reactos/dll/win32/syssetup/lang/cs-CZ.rc b/reactos/dll/win32/syssetup/lang/cs-CZ.rc
index ac937e51585..2556509eaf3 100644
--- a/reactos/dll/win32/syssetup/lang/cs-CZ.rc
+++ b/reactos/dll/win32/syssetup/lang/cs-CZ.rc
@@ -1,21 +1,7 @@
-/*
- * Copyright (C) 2004 Filip Navara
- * 2007 Kamil Hornicek
- * 2008 Radek Liska
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+/* FILE: dll/win32/syssetup/lang/cs-CZ.rc
+ * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com)
+ * UPDATED: 2009-08-02
+ * THANKS TO: Filip Navara and Kamil Hornicek, who translated major part of this file
*/
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
@@ -100,13 +86,13 @@ BEGIN
LTEXT "Lokalizace systmu by mla souhlasit s jazykem aplikac, "\
"kter chcete pouvat. Localizace ur jak budou zobrazena "\
"sla, mny a kalendn data.", IDC_STATIC, 53, 7, 253, 20
- LTEXT "", IDC_LOCALETEXT, 53, 29, 250, 16
+ LTEXT "", IDC_LOCALETEXT, 53, 29, 250, 16
LTEXT "Pro zmnu lokalizace systmu kliknte na Zmnit.",
IDC_STATIC, 53, 60, 184, 8
PUSHBUTTON "&Zmnit...", IDC_CUSTOMLOCALE, 245, 57, 50, 14
LTEXT "Rozloen klves ur znaky, kter se zobraz, kdy pete.",
IDC_STATIC, 53, 86, 253, 8
- LTEXT "", IDC_LAYOUTTEXT, 53, 100, 250, 16
+ LTEXT "", IDC_LAYOUTTEXT, 53, 100, 250, 16
LTEXT "Pro zmnu rozloen klves, kliknte na Zmnit.",
IDC_STATIC, 53, 126, 184, 8
PUSHBUTTON "Z&mnit...", IDC_CUSTOMLAYOUT, 245, 122, 50, 14
@@ -203,101 +189,101 @@ BEGIN
IDS_ACCESSORIES "Psluenstv"
IDS_CMT_CALC "Spustit Kalkulaku"
IDS_CMT_CMD "Otevt Pkazov dek"
- IDS_CMT_EXPLORER "Spustit Explorer"
- IDS_CMT_NOTEPAD "Spustit Textov editor"
- IDS_CMT_REGEDIT "Spustit Editor registru"
- IDS_CMT_WORDPAD "Spustit Editor dokument"
- IDS_CMT_SCREENSHOT "Sejmout obrazovku"
IDS_CMT_DEVMGMT "Spustit Sprvce zazen"
- IDS_CMT_SERVMAN "Spustit Sprvce slueb"
+ IDS_CMT_EVENTVIEW "Spustit Prohle udlost"
+ IDS_CMT_EXPLORER "Spustit Przkumnka"
+ IDS_CMT_MSCONFIG "Spustit Nstroj pro konfiguraci systmu"
+ IDS_CMT_NOTEPAD "Spustit Textov editor"
+ IDS_CMT_PAINT "Spustit Malovn"
IDS_CMT_RDESKTOP "Spustit Vzdlenou plochu"
- IDS_CMT_EVENTVIEW "Launch Event Viewer"
- IDS_CMT_MSCONFIG "Launch System Configuration program"
- IDS_CMT_PAINT "Launch Paint"
+ IDS_CMT_REGEDIT "Spustit Editor registru"
+ IDS_CMT_SCREENSHOT "Sejmout obrazovku"
+ IDS_CMT_SERVMAN "Spustit Sprvce slueb"
+ IDS_CMT_WORDPAD "Spustit WordPad"
END
STRINGTABLE
BEGIN
- IDS_GAMES "Hry"
- IDS_CMT_SOLITAIRE "Solitaire"
- IDS_CMT_WINEMINE "WineMine"
+ IDS_GAMES "Hry"
+ IDS_CMT_SOLITAIRE "Solitaire"
+ IDS_CMT_WINEMINE "WineMine"
END
STRINGTABLE
BEGIN
- IDS_SYS_TOOLS "Systmov nstroje"
- IDS_CMT_CHARMAP "Mapa znak"
- IDS_CMT_KBSWITCH "Pepna rozloen klvesnice"
- IDS_CMT_DXDIAG "Launch ReactX-Diagnostic program"
+ IDS_SYS_TOOLS "Systmov nstroje"
+ IDS_CMT_CHARMAP "Mapa znak"
+ IDS_CMT_KBSWITCH "Pepna rozloen klvesnice"
+ IDS_CMT_DXDIAG "Spustit Nstroj pro diagnostiku ReactX"
END
STRINGTABLE
BEGIN
- IDS_SYS_ACCESSIBILITY "Usnadnn"
- IDS_CMT_MAGNIFY "Lupa"
+ IDS_SYS_ACCESSIBILITY "Usnadnn"
+ IDS_CMT_MAGNIFY "Lupa"
END
STRINGTABLE
BEGIN
- IDS_SYS_ENTERTAINMENT "Entertainment"
- IDS_CMT_MPLAY32 "Launch Multimedia Player"
- IDS_CMT_SNDVOL32 "Launch Volume Control"
+ IDS_SYS_ENTERTAINMENT "Zbava"
+ IDS_CMT_MPLAY32 "Spustit Pehrva multimdi"
+ IDS_CMT_SNDVOL32 "Spustit Ovldn hlasitosti"
END
STRINGTABLE
BEGIN
- IDS_REACTOS_SETUP "ReactOS Instaltor"
+ IDS_REACTOS_SETUP "ReactOS Instaltor"
IDS_UNKNOWN_ERROR "Neznm chyba"
IDS_REGISTERING_COMPONENTS "Registruji sousti..."
- IDS_LOADLIBRARY_FAILED "LoadLibrary failed: "
- IDS_GETPROCADDR_FAILED "GetProcAddr failed: "
+ IDS_LOADLIBRARY_FAILED "LoadLibrary failed: "
+ IDS_GETPROCADDR_FAILED "GetProcAddr failed: "
IDS_REGSVR_FAILED "DllRegisterServer failed: "
- IDS_DLLINSTALL_FAILED "DllInstall failed: "
- IDS_TIMEOUT "Vyprel asov limit registrace"
+ IDS_DLLINSTALL_FAILED "DllInstall failed: "
+ IDS_TIMEOUT "Vyprel asov limit registrace"
IDS_REASON_UNKNOWN ""
END
STRINGTABLE
BEGIN
- IDS_SHORT_CMD "Pkazov dek.lnk"
- IDS_SHORT_EXPLORER "ReactOS Przkumnk.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
- IDS_SHORT_SERVICE "Sprvce slueb.lnk"
- IDS_SHORT_DEVICE "Sprvce zazen.lnk"
IDS_SHORT_CALC "Kalkulaka.lnk"
- IDS_SHORT_REGEDIT "Regedit.lnk"
+ IDS_SHORT_CHARMAP "Mapa znak.lnk"
+ IDS_SHORT_CMD "Pkazov dek.lnk"
+ IDS_SHORT_DEVICE "Sprvce zazen.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
+ IDS_SHORT_DXDIAG "Diagnostika ReactX.lnk"
+ IDS_SHORT_EVENTVIEW "Prohle udlost.lnk"
+ IDS_SHORT_EXPLORER "ReactOS Przkumnk.lnk"
+ IDS_SHORT_KBSWITCH "Pepna rozloen klvesnice.lnk"
+ IDS_SHORT_MAGNIFY "Lupa.lnk"
+ IDS_SHORT_MPLAY32 "Pehrva multimdi.lnk"
+ IDS_SHORT_MSCONFIG "Nastaven systmu.lnk"
IDS_SHORT_NOTEPAD "Poznmkov blok.lnk"
- IDS_SHORT_WORDPAD "WordPad.lnk"
- IDS_SHORT_SNAP "SnapShot.lnk"
+ IDS_SHORT_PAINT "Malovn.lnk"
+ IDS_SHORT_RDESKTOP "Vzdlen plocha.lnk"
+ IDS_SHORT_REGEDIT "Editor registru.lnk"
+ IDS_SHORT_SERVICE "Sprvce slueb.lnk"
+ IDS_SHORT_SNAP "Sejmout obrazovku.lnk"
+ IDS_SHORT_SNDVOL32 "Ovldn hlasitosti.lnk"
IDS_SHORT_SOLITAIRE "Solitaire.lnk"
IDS_SHORT_WINEMINE "WineMine.lnk"
- IDS_SHORT_CHARMAP "Mapa znak.lnk"
- IDS_SHORT_MAGNIFY "Lupa.lnk"
- IDS_SHORT_RDESKTOP "Vzdlen plocha.lnk"
- IDS_SHORT_KBSWITCH "Pepna rozloen klvesnice.lnk"
- IDS_SHORT_EVENTVIEW "Event Viewer.lnk"
- IDS_SHORT_MSCONFIG "System Configuration.lnk"
- IDS_SHORT_MPLAY32 "Multimedia Player.lnk"
- IDS_SHORT_SNDVOL32 "Volume Control.lnk"
- IDS_SHORT_DXDIAG "ReactX Diagnostic.lnk"
- IDS_SHORT_PAINT "Paint.lnk"
+ IDS_SHORT_WORDPAD "WordPad.lnk"
END
STRINGTABLE
BEGIN
- IDS_WZD_NAME "Instalace neme pokraovat, dokud nezadte sv jmno."
+ IDS_WZD_NAME "Instalace neme pokraovat, dokud nezadte sv jmno."
IDS_WZD_SETCOMPUTERNAME "Instaltor nedokzal nastavit jmno potae."
- IDS_WZD_COMPUTERNAME "Instalace neme pokraovat, dokud nezadte jmno potae."
- IDS_WZD_PASSWORDEMPTY "Muste zadat heslo!"
- IDS_WZD_PASSWORDMATCH "Zadan hesla nesouhlas. Zadejte poadovan heslo znovu."
- IDS_WZD_PASSWORDCHAR "Zadan heslo obsahuje nepovolen znaky. Zadejte upraven heslo."
- IDS_WZD_LOCALTIME "Instaltor nedokzal nastavit as."
+ IDS_WZD_COMPUTERNAME "Instalace neme pokraovat, dokud nezadte jmno potae."
+ IDS_WZD_PASSWORDEMPTY "Muste zadat heslo!"
+ IDS_WZD_PASSWORDMATCH "Zadan hesla nesouhlas. Zadejte poadovan heslo znovu."
+ IDS_WZD_PASSWORDCHAR "Zadan heslo obsahuje nepovolen znaky. Zadejte upraven heslo."
+ IDS_WZD_LOCALTIME "Instaltor nedokzal nastavit as."
END
STRINGTABLE
BEGIN
- IDS_STATUS_INSTALL_DEV "Instaluji zazen..."
+ IDS_STATUS_INSTALL_DEV "Instaluji zazen..."
END
/* EOF */
diff --git a/reactos/dll/win32/syssetup/lang/de-DE.rc b/reactos/dll/win32/syssetup/lang/de-DE.rc
index cbaac3c379e..9f1cdf529cd 100644
--- a/reactos/dll/win32/syssetup/lang/de-DE.rc
+++ b/reactos/dll/win32/syssetup/lang/de-DE.rc
@@ -262,7 +262,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "Eingabeaufforderung.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Anwendungsmanager.lnk"
IDS_SHORT_SERVICE "Dienste-Manager.lnk"
IDS_SHORT_DEVICE "Gerte-Manager.lnk"
IDS_SHORT_MPLAY32 "Multimedia Player.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/el-GR.rc b/reactos/dll/win32/syssetup/lang/el-GR.rc
index 4e9f9aad859..c61eb27a907 100644
--- a/reactos/dll/win32/syssetup/lang/el-GR.rc
+++ b/reactos/dll/win32/syssetup/lang/el-GR.rc
@@ -263,7 +263,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD " .lnk"
IDS_SHORT_EXPLORER " ReactOS.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE ".lnk"
IDS_SHORT_DEVICE " .lnk"
IDS_SHORT_MPLAY32 "Multimedia Player.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/en-US.rc b/reactos/dll/win32/syssetup/lang/en-US.rc
index 37cb109a3aa..ee1df528f5d 100644
--- a/reactos/dll/win32/syssetup/lang/en-US.rc
+++ b/reactos/dll/win32/syssetup/lang/en-US.rc
@@ -264,7 +264,7 @@ BEGIN
IDS_SHORT_CHARMAP "Character Map.lnk"
IDS_SHORT_CMD "Command Prompt.lnk"
IDS_SHORT_DEVICE "Device Manager.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_DXDIAG "ReactX Diagnostic.lnk"
IDS_SHORT_EVENTVIEW "Event Viewer.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/es-ES.rc b/reactos/dll/win32/syssetup/lang/es-ES.rc
index 7c6c3ebdefb..984016e6192 100644
--- a/reactos/dll/win32/syssetup/lang/es-ES.rc
+++ b/reactos/dll/win32/syssetup/lang/es-ES.rc
@@ -272,7 +272,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "Smbolo del sistema.lnk"
IDS_SHORT_EXPLORER "Explorador de ReactOS.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE "Administrador de Servicios.lnk"
IDS_SHORT_DEVICE "Administrador de Dispositivos.lnk"
IDS_SHORT_MPLAY32 "Reproductor multimedia.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/et-EE.rc b/reactos/dll/win32/syssetup/lang/et-EE.rc
index 2901ba431d4..ca70d779b81 100644
--- a/reactos/dll/win32/syssetup/lang/et-EE.rc
+++ b/reactos/dll/win32/syssetup/lang/et-EE.rc
@@ -263,7 +263,7 @@ BEGIN
IDS_SHORT_CHARMAP "Character Map.lnk"
IDS_SHORT_CMD "Command Prompt.lnk"
IDS_SHORT_DEVICE "Device Manager.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_DXDIAG "ReactX Diagnostic.lnk"
IDS_SHORT_EVENTVIEW "Event Viewer.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/fr-FR.rc b/reactos/dll/win32/syssetup/lang/fr-FR.rc
index 0744d0e7e03..738ba02b339 100644
--- a/reactos/dll/win32/syssetup/lang/fr-FR.rc
+++ b/reactos/dll/win32/syssetup/lang/fr-FR.rc
@@ -262,7 +262,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "Invite de commandes.lnk"
IDS_SHORT_EXPLORER "Explorateur ReactOS.lnk"
- IDS_SHORT_DOWNLOADER "Tlcharger !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE "Gestionnaire de services.lnk"
IDS_SHORT_DEVICE "Gestionnaire de priphriques.lnk"
IDS_SHORT_MPLAY32 "Multimedia Player.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/hu-HU.rc b/reactos/dll/win32/syssetup/lang/hu-HU.rc
index ec8ead17307..ce28af763b9 100644
--- a/reactos/dll/win32/syssetup/lang/hu-HU.rc
+++ b/reactos/dll/win32/syssetup/lang/hu-HU.rc
@@ -275,7 +275,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "Command Prompt.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE "Service Manager.lnk"
IDS_SHORT_DEVICE "Device Manager.lnk"
IDS_SHORT_MPLAY32 "Multimedia Player.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/id-ID.rc b/reactos/dll/win32/syssetup/lang/id-ID.rc
index 78ea213f42c..68f3c2ca5f9 100644
--- a/reactos/dll/win32/syssetup/lang/id-ID.rc
+++ b/reactos/dll/win32/syssetup/lang/id-ID.rc
@@ -260,7 +260,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "Command Prompt.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE "Service Manager.lnk"
IDS_SHORT_DEVICE "Device Manager.lnk"
IDS_SHORT_MPLAY32 "Multimedia Player.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/it-IT.rc b/reactos/dll/win32/syssetup/lang/it-IT.rc
index cbb3a12a65c..1be1ac96ea7 100644
--- a/reactos/dll/win32/syssetup/lang/it-IT.rc
+++ b/reactos/dll/win32/syssetup/lang/it-IT.rc
@@ -253,7 +253,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "Prompt dei comandi.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE "Service Manager.lnk"
IDS_SHORT_DEVICE "Device Manager.lnk"
IDS_SHORT_MPLAY32 "Multimedia Player.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/ja-JP.rc b/reactos/dll/win32/syssetup/lang/ja-JP.rc
index ee485e611ba..9fe024db12f 100644
--- a/reactos/dll/win32/syssetup/lang/ja-JP.rc
+++ b/reactos/dll/win32/syssetup/lang/ja-JP.rc
@@ -264,7 +264,7 @@ BEGIN
IDS_SHORT_CHARMAP "LN^[ }bv.lnk"
IDS_SHORT_CMD "R}h vvg.lnk"
IDS_SHORT_DEVICE "foCX }l[W.lnk"
- IDS_SHORT_DOWNLOADER "_E[h !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_DXDIAG "ReactX ff.lnk"
IDS_SHORT_EVENTVIEW "Cxg r[A.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/nl-NL.rc b/reactos/dll/win32/syssetup/lang/nl-NL.rc
index e06f2bf815f..2e02d4fe4f9 100644
--- a/reactos/dll/win32/syssetup/lang/nl-NL.rc
+++ b/reactos/dll/win32/syssetup/lang/nl-NL.rc
@@ -262,7 +262,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "Command Prompt.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE "Service Manager.lnk"
IDS_SHORT_DEVICE "Device Manager.lnk"
IDS_SHORT_MPLAY32 "Multimedia Player.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/no-NO.rc b/reactos/dll/win32/syssetup/lang/no-NO.rc
index e5f54cd867c..cf82b71e6e7 100644
--- a/reactos/dll/win32/syssetup/lang/no-NO.rc
+++ b/reactos/dll/win32/syssetup/lang/no-NO.rc
@@ -217,7 +217,7 @@ BEGIN
IDS_CMT_RDESKTOP "Start Ekstern skrivebord"
IDS_CMT_EVENTVIEW "Start Hendelseliste"
IDS_CMT_MSCONFIG "Start Systemkonfigurasjon"
- IDS_CMT_PAINT "Launch Paint"
+ IDS_CMT_PAINT "Start Paint"
END
STRINGTABLE
@@ -265,7 +265,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "Command Prompt.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE "Service Manager.lnk"
IDS_SHORT_DEVICE "Device Manager.lnk"
IDS_SHORT_MPLAY32 "Multimedia Player.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/pl-PL.rc b/reactos/dll/win32/syssetup/lang/pl-PL.rc
index e9fd4a13fd5..87dcef7befc 100644
--- a/reactos/dll/win32/syssetup/lang/pl-PL.rc
+++ b/reactos/dll/win32/syssetup/lang/pl-PL.rc
@@ -18,7 +18,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* translated by Caemyr
- * updated by Caemyr - Olaf Siejka (Jan, 2008)
+ * updated by Caemyr - Olaf Siejka (Jan, 2008), (Aug, 2009)
* Use ReactOS forum PM or IRC to contact me
* http://www.reactos.org
* IRC: irc.freenode.net #reactos-pl;
@@ -271,7 +271,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "Wiersz polece.lnk"
IDS_SHORT_EXPLORER "Eksplorator ReactOS.lnk"
- IDS_SHORT_DOWNLOADER "Download!.lnk"
+ IDS_SHORT_DOWNLOADER "Meneder aplikacji ReactOS.lnk"
IDS_SHORT_SERVICE "Meneder usug.lnk"
IDS_SHORT_DEVICE "Meneder urzdze.lnk"
IDS_SHORT_MPLAY32 "Odtwarzacz multimedialny.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/ro-RO.rc b/reactos/dll/win32/syssetup/lang/ro-RO.rc
index 317b7f00675..e45f0acc427 100644
--- a/reactos/dll/win32/syssetup/lang/ro-RO.rc
+++ b/reactos/dll/win32/syssetup/lang/ro-RO.rc
@@ -265,7 +265,7 @@ BEGIN
IDS_SHORT_CHARMAP "Hartă caractere.lnk"
IDS_SHORT_CMD "Linie comandă.lnk"
IDS_SHORT_DEVICE "Gestionar dispozitive.lnk"
- IDS_SHORT_DOWNLOADER "Descarcă !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_DXDIAG "Diagnostic ReactX.lnk"
IDS_SHORT_EVENTVIEW "Vizualizator evenimente.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/ru-RU.rc b/reactos/dll/win32/syssetup/lang/ru-RU.rc
index e33a17e1583..0825eefe1bf 100644
--- a/reactos/dll/win32/syssetup/lang/ru-RU.rc
+++ b/reactos/dll/win32/syssetup/lang/ru-RU.rc
@@ -244,7 +244,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD " .lnk"
IDS_SHORT_EXPLORER " ReactOS.lnk"
- IDS_SHORT_DOWNLOADER " !.lnk"
+ IDS_SHORT_DOWNLOADER " ReactOS.lnk"
IDS_SHORT_SERVICE " .lnk"
IDS_SHORT_DEVICE " .lnk"
IDS_SHORT_MPLAY32 ".lnk"
diff --git a/reactos/dll/win32/syssetup/lang/sk-SK.rc b/reactos/dll/win32/syssetup/lang/sk-SK.rc
index fc93db12bb1..0a475486c95 100644
--- a/reactos/dll/win32/syssetup/lang/sk-SK.rc
+++ b/reactos/dll/win32/syssetup/lang/sk-SK.rc
@@ -228,7 +228,7 @@ STRINGTABLE
BEGIN
IDS_SYS_ENTERTAINMENT "Zbava" //Entertainment
IDS_CMT_MPLAY32 "Spusti Multimedilny prehrva"
- IDS_CMT_SNDVOL32 "Stusti Ovldanie hlasitosti"
+ IDS_CMT_SNDVOL32 "Spusti Ovldanie hlasitosti"
END
STRINGTABLE
@@ -248,7 +248,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "Prkazov riadok.lnk"
IDS_SHORT_EXPLORER "Prieskumnk systmu ReactOS.lnk"
- IDS_SHORT_DOWNLOADER "ahaj!.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE "Sprvca sluieb.lnk"
IDS_SHORT_DEVICE "Sprvca zariaden.lnk"
IDS_SHORT_MPLAY32 "Multimedilny prehrva.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/uk-UA.rc b/reactos/dll/win32/syssetup/lang/uk-UA.rc
index e83c860ebe5..038f8badd31 100644
--- a/reactos/dll/win32/syssetup/lang/uk-UA.rc
+++ b/reactos/dll/win32/syssetup/lang/uk-UA.rc
@@ -252,7 +252,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "Command Prompt.lnk"
IDS_SHORT_EXPLORER "ReactOS Explorer.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE "Service Manager.lnk"
IDS_SHORT_DEVICE "Device Manager.lnk"
IDS_SHORT_MPLAY32 "Multimedia Player.lnk"
diff --git a/reactos/dll/win32/syssetup/lang/zh-CN.rc b/reactos/dll/win32/syssetup/lang/zh-CN.rc
index 3090483e53d..ec5da906a2c 100644
--- a/reactos/dll/win32/syssetup/lang/zh-CN.rc
+++ b/reactos/dll/win32/syssetup/lang/zh-CN.rc
@@ -251,7 +251,7 @@ STRINGTABLE
BEGIN
IDS_SHORT_CMD "ʾ.lnk"
IDS_SHORT_EXPLORER "ReactOS Դ.lnk"
- IDS_SHORT_DOWNLOADER "Download !.lnk"
+ IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk"
IDS_SHORT_SERVICE ".lnk"
IDS_SHORT_DEVICE "豸.lnk"
IDS_SHORT_MPLAY32 "Multimedia Player.lnk"
diff --git a/reactos/dll/win32/user32/include/message.h b/reactos/dll/win32/user32/include/message.h
index 489ae4364dd..2cdb7e07b7c 100644
--- a/reactos/dll/win32/user32/include/message.h
+++ b/reactos/dll/win32/user32/include/message.h
@@ -15,4 +15,12 @@ VOID FASTCALL MessageCleanup(VOID);
#define WM_ALTTABACTIVE 0x0029
#define WM_SETVISIBLE 0x0009
+static __inline BOOL
+IsCallProcHandle(IN WNDPROC lpWndProc)
+{
+ /* FIXME - check for 64 bit architectures... */
+ return ((ULONG_PTR)lpWndProc & 0xFFFF0000) == 0xFFFF0000;
+}
+
+
#endif /* LIB_USER32_INCLUDE_MESSAGE_H */
diff --git a/reactos/dll/win32/user32/include/user32.h b/reactos/dll/win32/user32/include/user32.h
index ef50a0984c2..9fc15b3de02 100644
--- a/reactos/dll/win32/user32/include/user32.h
+++ b/reactos/dll/win32/user32/include/user32.h
@@ -48,7 +48,7 @@ BOOL FASTCALL IsMetaFile(HDC);
extern PPROCESSINFO g_ppi;
extern ULONG_PTR g_ulSharedDelta;
-extern PSERVERINFO g_psi;
+extern PSERVERINFO gpsi;
static __inline PVOID
SharedPtrToUser(PVOID Ptr)
@@ -61,9 +61,11 @@ SharedPtrToUser(PVOID Ptr)
static __inline PVOID
DesktopPtrToUser(PVOID Ptr)
{
+ PCLIENTINFO pci;
+ PDESKTOPINFO pdi;
GetW32ThreadInfo();
- PCLIENTINFO pci = GetWin32ClientInfo();
- PDESKTOPINFO pdi = pci->pDeskInfo;
+ pci = GetWin32ClientInfo();
+ pdi = pci->pDeskInfo;
ASSERT(Ptr != NULL);
ASSERT(pdi != NULL);
@@ -98,7 +100,7 @@ IsThreadHooked(PCLIENTINFO pci)
static __inline PDESKTOPINFO
GetThreadDesktopInfo(VOID)
{
- PW32THREADINFO ti;
+ PTHREADINFO ti;
PDESKTOPINFO di = NULL;
ti = GetW32ThreadInfo();
@@ -117,3 +119,4 @@ PWND FASTCALL ValidateHwndNoErr(HWND hwnd);
VOID FASTCALL GetConnected(VOID);
BOOL FASTCALL DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi);
BOOL FASTCALL TestWindowProcess(PWND);
+VOID UserGetWindowBorders(DWORD, DWORD, SIZE *, BOOL);
diff --git a/reactos/dll/win32/user32/include/user32p.h b/reactos/dll/win32/user32/include/user32p.h
index 8b51ea2c8f2..8834c9920ee 100644
--- a/reactos/dll/win32/user32/include/user32p.h
+++ b/reactos/dll/win32/user32/include/user32p.h
@@ -41,7 +41,7 @@
(BOOL)NtUserCallTwoParam((DWORD_PTR)hWnd, (DWORD_PTR)hRgn, TWOPARAM_ROUTINE_VALIDATERGN)
#define NtUserSetWindowContextHelpId(hWnd, dwContextHelpId) \
- (BOOL)NtUserCallTwoParam((DWORD_PTR)hwnd, dwContextHelpId, TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID)
+ (BOOL)NtUserCallHwndParam(hWnd, dwContextHelpId, HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID)
#define NtUserSetCaretPos(X, Y) \
(BOOL)NtUserCallTwoParam((DWORD_PTR)X, (DWORD_PTR)Y, TWOPARAM_ROUTINE_SETCARETPOS)
@@ -55,9 +55,6 @@
#define NtUserSetMenuBarHeight(menu, height) \
(BOOL)NtUserCallTwoParam((DWORD_PTR)menu, (DWORD_PTR)height, TWOPARAM_ROUTINE_SETMENUBARHEIGHT)
-#define NtUserGetWindowInfo(hwnd, pwi) \
- (BOOL)NtUserCallTwoParam((DWORD_PTR)hwnd, (DWORD_PTR)pwi, TWOPARAM_ROUTINE_GETWINDOWINFO)
-
#define NtUserRegisterLogonProcess(hproc, x) \
(BOOL)NtUserCallTwoParam((DWORD_PTR)hproc, (DWORD_PTR)x, TWOPARAM_ROUTINE_REGISTERLOGONPROC)
@@ -202,7 +199,7 @@ typedef struct _USER_HANDLE_ENTRY
union
{
PVOID pi;
- PW32THREADINFO pti; // pointer to Win32ThreadInfo
+ PTHREADINFO pti; // pointer to Win32ThreadInfo
PPROCESSINFO ppi; // pointer to W32ProcessInfo
};
unsigned short type; /* object type (0 if free) */
diff --git a/reactos/dll/win32/user32/misc/desktop.c b/reactos/dll/win32/user32/misc/desktop.c
index 1e27b3deed1..3299d54f200 100644
--- a/reactos/dll/win32/user32/misc/desktop.c
+++ b/reactos/dll/win32/user32/misc/desktop.c
@@ -97,9 +97,9 @@ int WINAPI
GetSystemMetrics(int nIndex)
{
GetConnected();
-// FIXME("Global Sever Data -> %x\n",g_psi);
+// FIXME("Global Sever Data -> %x\n",gpsi);
if (nIndex < 0 || nIndex >= SM_CMETRICS) return 0;
- return g_psi->aiSysMet[nIndex];
+ return gpsi->aiSysMet[nIndex];
}
diff --git a/reactos/dll/win32/user32/misc/dllmain.c b/reactos/dll/win32/user32/misc/dllmain.c
index d03a3e7bdb2..dc643e7379d 100644
--- a/reactos/dll/win32/user32/misc/dllmain.c
+++ b/reactos/dll/win32/user32/misc/dllmain.c
@@ -11,7 +11,7 @@ HINSTANCE User32Instance;
PPROCESSINFO g_ppi = NULL;
PUSER_HANDLE_TABLE gHandleTable = NULL;
PUSER_HANDLE_ENTRY gHandleEntries = NULL;
-PSERVERINFO g_psi = NULL;
+PSERVERINFO gpsi = NULL;
ULONG_PTR g_ulSharedDelta;
WCHAR szAppInit[KEY_LENGTH];
@@ -232,6 +232,8 @@ Init(VOID)
(PVOID)User32CallEventProcFromKernel;
NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADMENU] =
(PVOID)User32CallLoadMenuFromKernel;
+ NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_CLIENTTHREADSTARTUP] =
+ (PVOID)User32CallClientThreadSetupFromKernel;
NtUserProcessConnect( NtCurrentProcess(),
&UserCon,
@@ -239,7 +241,7 @@ Init(VOID)
g_ppi = GetWin32ClientInfo()->ppi; // Snapshot PI, used as pointer only!
g_ulSharedDelta = UserCon.siClient.ulSharedDelta;
- g_psi = SharedPtrToUser(UserCon.siClient.psi);
+ gpsi = SharedPtrToUser(UserCon.siClient.psi);
gHandleTable = SharedPtrToUser(UserCon.siClient.aheList);
gHandleEntries = SharedPtrToUser(gHandleTable->handles);
//ERR("1 SI 0x%x : HT 0x%x : D 0x%x\n", UserCon.siClient.psi, UserCon.siClient.aheList, g_ulSharedDelta);
@@ -335,10 +337,10 @@ GetConnected(VOID)
USERCONNECT UserCon;
// ERR("GetConnected\n");
- if ((PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo == NULL)
+ if ((PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo == NULL)
NtUserGetThreadState(THREADSTATE_GETTHREADINFO);
- if (g_psi && g_ppi) return;
+ if (gpsi && g_ppi) return;
// FIXME HAX: Due to the "Dll Initialization Bug" we have to call this too.
GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL);
@@ -348,8 +350,17 @@ GetConnected(VOID)
g_ppi = GetWin32ClientInfo()->ppi;
g_ulSharedDelta = UserCon.siClient.ulSharedDelta;
- g_psi = SharedPtrToUser(UserCon.siClient.psi);
+ gpsi = SharedPtrToUser(UserCon.siClient.psi);
gHandleTable = SharedPtrToUser(UserCon.siClient.aheList);
gHandleEntries = SharedPtrToUser(gHandleTable->handles);
}
+
+NTSTATUS
+WINAPI
+User32CallClientThreadSetupFromKernel(PVOID Arguments, ULONG ArgumentLength)
+{
+ ERR("GetConnected\n");
+ return ZwCallbackReturn(NULL, 0, STATUS_SUCCESS);
+}
+
diff --git a/reactos/dll/win32/user32/misc/misc.c b/reactos/dll/win32/user32/misc/misc.c
index 20c65763ce8..5b8e9be5bf2 100644
--- a/reactos/dll/win32/user32/misc/misc.c
+++ b/reactos/dll/win32/user32/misc/misc.c
@@ -104,17 +104,17 @@ UpdatePerUserSystemParameters(
return NtUserUpdatePerUserSystemParameters(dwReserved, bEnable);
}
-PW32THREADINFO
+PTHREADINFO
GetW32ThreadInfo(VOID)
{
- PW32THREADINFO ti;
+ PTHREADINFO ti;
- ti = (PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo;
+ ti = (PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo;
if (ti == NULL)
{
- /* create the W32THREADINFO structure */
+ /* create the THREADINFO structure */
NtUserGetThreadState(THREADSTATE_GETTHREADINFO);
- ti = (PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo;
+ ti = (PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo;
}
return ti;
@@ -250,13 +250,13 @@ WINAPI
IsGUIThread(
BOOL bConvert)
{
- PW32THREADINFO ti = (PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo;
+ PTHREADINFO ti = (PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo;
if (ti == NULL)
{
if(bConvert)
{
NtUserGetThreadState(THREADSTATE_GETTHREADINFO);
- if ((PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo) return TRUE;
+ if ((PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo) return TRUE;
else
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
}
@@ -270,7 +270,7 @@ BOOL
FASTCALL
TestWindowProcess(PWND Wnd)
{
- if (Wnd->head.pti == (PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo)
+ if (Wnd->head.pti == (PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo)
return TRUE;
else
return (NtUserQueryWindow(Wnd->head.h, QUERY_WINDOW_UNIQUE_PROCESS_ID) ==
diff --git a/reactos/dll/win32/user32/user32.rbuild b/reactos/dll/win32/user32/user32.rbuild
index 897c69a7a51..3845d084384 100644
--- a/reactos/dll/win32/user32/user32.rbuild
+++ b/reactos/dll/win32/user32/user32.rbuild
@@ -1,4 +1,4 @@
-
+
.
include
diff --git a/reactos/dll/win32/user32/windows/bitmap.c b/reactos/dll/win32/user32/windows/bitmap.c
index 17ff0d8b498..a3c6cf00e51 100644
--- a/reactos/dll/win32/user32/windows/bitmap.c
+++ b/reactos/dll/win32/user32/windows/bitmap.c
@@ -56,7 +56,7 @@ typedef struct
#include "poppack.h"
-/* forward declerations... actually in user32\windows\icon.c but usful here */
+/* forward declarations... actually in user32\windows\icon.c but useful here */
HICON ICON_CreateIconFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cxDesired, int cyDesired, int xHotspot, int yHotspot);
CURSORICONDIRENTRY *CURSORICON_FindBestIcon( CURSORICONDIR *dir, int width, int height, int colors);
CURSORICONDIRENTRY *CURSORICON_FindBestCursor( CURSORICONDIR *dir, int width, int height, int colors);
@@ -265,7 +265,7 @@ LoadCursorIconImage(
hIcon = CreateIconFromResourceEx((PBYTE)ResIcon,
SizeofResource(hinst, hResInfo),
Icon, 0x00030000, width, height,
- fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
+ (fuLoad & (LR_DEFAULTSIZE | LR_SHARED)) | LR_DEFAULTCOLOR);
if (hIcon && 0 != (fuLoad & LR_SHARED))
{
diff --git a/reactos/dll/win32/user32/windows/defwnd.c b/reactos/dll/win32/user32/windows/defwnd.c
index 64c83dfa234..d271e5de08f 100644
--- a/reactos/dll/win32/user32/windows/defwnd.c
+++ b/reactos/dll/win32/user32/windows/defwnd.c
@@ -52,7 +52,7 @@ InitStockObjects(void)
SysColors table - the pens, brushes and stock objects are not affected
as their handles never change. But it'd be faster to map them, too. */
- // Done! g_psi!
+ // Done! gpsi!
}
/*
@@ -63,7 +63,7 @@ GetSysColor(int nIndex)
{
if(nIndex >= 0 && nIndex < NUM_SYSCOLORS)
{
- return g_psi->argbSystem[nIndex];
+ return gpsi->argbSystem[nIndex];
}
SetLastError(ERROR_INVALID_PARAMETER);
@@ -78,7 +78,7 @@ GetSysColorBrush(int nIndex)
{
if(nIndex >= 0 && nIndex < NUM_SYSCOLORS)
{
- return g_psi->ahbrSystem[nIndex];
+ return gpsi->ahbrSystem[nIndex];
}
SetLastError(ERROR_INVALID_PARAMETER);
@@ -1148,7 +1148,7 @@ User32DefWindowProc(HWND hWnd,
else
{
POINT Pt;
- DWORD Style;
+ LONG_PTR Style;
LONG HitCode;
Style = GetWindowLongPtrW(hWnd, GWL_STYLE);
@@ -1245,7 +1245,14 @@ User32DefWindowProc(HWND hWnd,
case WM_SETREDRAW:
{
- DefWndSetRedraw(hWnd, wParam);
+ LONG_PTR Style = GetWindowLongPtrW(hWnd, GWL_STYLE);
+ if (wParam) SetWindowLongPtr(hWnd, GWL_STYLE, Style | WS_VISIBLE);
+ else
+ {
+ RedrawWindow(hWnd, NULL, 0, RDW_ALLCHILDREN | RDW_VALIDATE);
+ Style &= ~WS_VISIBLE;
+ SetWindowLongPtr(hWnd, GWL_STYLE, Style);
+ }
return (0);
}
@@ -1345,7 +1352,7 @@ User32DefWindowProc(HWND hWnd,
case WM_SETCURSOR:
{
- ULONG Style = GetWindowLongPtrW(hWnd, GWL_STYLE);
+ LONG_PTR Style = GetWindowLongPtrW(hWnd, GWL_STYLE);
if (Style & WS_CHILD)
{
@@ -1518,7 +1525,15 @@ User32DefWindowProc(HWND hWnd,
return ((LRESULT)LoadIconW(0, IDI_APPLICATION));
}
- /* FIXME: WM_ISACTIVEICON */
+ case WM_ISACTIVEICON:
+ {
+ PWND pWnd;
+ BOOL isai;
+ pWnd = ValidateHwnd(hWnd);
+ if (!pWnd) return 0;
+ isai = (pWnd->state & WNDS_ACTIVEFRAME) != 0;
+ return isai;
+ }
case WM_NOTIFYFORMAT:
{
@@ -1877,13 +1892,17 @@ DefWindowProcA(HWND hWnd,
{
case WM_NCCREATE:
{
- LPCREATESTRUCTA cs = (LPCREATESTRUCTA)lParam;
- /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
- * may have child window IDs instead of window name */
-
- DefSetText(hWnd, (PCWSTR)cs->lpszName, TRUE);
-
- Result = 1;
+ if (lParam)
+ {
+ LPCREATESTRUCTA cs = (LPCREATESTRUCTA)lParam;
+ /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
+ * may have child window IDs instead of window name */
+ if (HIWORD(cs->lpszName))
+ {
+ DefSetText(hWnd, (PCWSTR)cs->lpszName, TRUE);
+ }
+ Result = 1;
+ }
break;
}
@@ -2026,12 +2045,18 @@ DefWindowProcW(HWND hWnd,
{
case WM_NCCREATE:
{
- LPCREATESTRUCTW cs = (LPCREATESTRUCTW)lParam;
- /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
- * may have child window IDs instead of window name */
+ if (lParam)
+ {
+ LPCREATESTRUCTW cs = (LPCREATESTRUCTW)lParam;
+ /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
+ * may have child window IDs instead of window name */
- DefSetText(hWnd, cs->lpszName, FALSE);
- Result = 1;
+ if (HIWORD(cs->lpszName))
+ {
+ DefSetText(hWnd, cs->lpszName, FALSE);
+ }
+ Result = 1;
+ }
break;
}
diff --git a/reactos/dll/win32/user32/windows/dialog.c b/reactos/dll/win32/user32/windows/dialog.c
index c6d8d4f4d7b..3b4c0307a22 100644
--- a/reactos/dll/win32/user32/windows/dialog.c
+++ b/reactos/dll/win32/user32/windows/dialog.c
@@ -16,8 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id$
- *
+/*
* PROJECT: ReactOS user32.dll
* FILE: lib/user32/windows/dialog.c
* PURPOSE: Input
@@ -143,6 +142,8 @@ const struct builtin_class_descr DIALOG_builtin_class =
*
* Get the DIALOGINFO structure of a window, allocating it if needed
* and 'create' is TRUE.
+*
+* ReactOS
*/
DIALOGINFO * DIALOG_get_info( HWND hWnd, BOOL create )
{
@@ -152,6 +153,11 @@ DIALOGINFO * DIALOG_get_info( HWND hWnd, BOOL create )
if(!dlgInfo && create)
{
pWindow = ValidateHwnd( hWnd );
+ if (!pWindow)
+ {
+ SetLastError( ERROR_INVALID_WINDOW_HANDLE );
+ return NULL;
+ }
if (pWindow && pWindow->cbwndExtra >= DLGWINDOWEXTRA && hWnd != GetDesktopWindow())
{
@@ -160,7 +166,7 @@ DIALOGINFO * DIALOG_get_info( HWND hWnd, BOOL create )
SETDLGINFO( hWnd, dlgInfo );
- NtUserSetWindowFNID( hWnd, FNID_DIALOG );
+ NtUserCallHwndParam( hWnd, (DWORD)dlgInfo, HWNDPARAM_ROUTINE_SETDIALOGPOINTER );
}
else
{
@@ -275,6 +281,7 @@ static const WORD *DIALOG_GetControl32( const WORD *p, DLG_CONTROL_INFO *info,
if (GET_WORD(p) == 0xffff) /* Is it an integer id? */
{
+//// ReactOS Rev 6478
info->windowName = HeapAlloc( GetProcessHeap(), 0, sizeof(L"#65535") );
if (info->windowName != NULL)
{
@@ -422,12 +429,16 @@ static HWND DIALOG_FindMsgDestination( HWND hwndDlg )
{
while (GetWindowLongA(hwndDlg, GWL_STYLE) & DS_CONTROL)
{
+ PWND pWnd;
HWND hParent = GetParent(hwndDlg);
if (!hParent) break;
-
+// ReactOS
if (!IsWindow(hParent)) break;
- if (!GETDLGINFO(hParent)) /* TODO: Correct? */
+ pWnd = ValidateHwnd(hParent);
+ if (!pWnd) break;
+
+ if (!(pWnd->state & WNDS_DIALOGWINDOW))
{
break;
}
@@ -547,7 +558,7 @@ INT DIALOG_DoDialogBox( HWND hwnd, HWND owner )
if (!GetMessageW( &msg, 0, 0, 0 )) break;
}
- if (!IsWindow( hwnd )) return -1;
+ if (!IsWindow( hwnd )) return 0;
if (!(dlgInfo->flags & DF_END) && !IsDialogMessageW( hwnd, &msg))
{
TranslateMessage( &msg );
@@ -649,13 +660,29 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
{
result->pointSize = GET_WORD(p);
p++;
- if (result->dialogEx)
+
+ /* If pointSize is 0x7fff, it means that we need to use the font
+ * in NONCLIENTMETRICSW.lfMessageFont, and NOT read the weight,
+ * italic, and facename from the dialog template.
+ */
+ if (result->pointSize == 0x7fff)
{
- result->weight = GET_WORD(p); p++;
- result->italic = LOBYTE(GET_WORD(p)); p++;
+ /* We could call SystemParametersInfo here, but then we'd have
+ * to convert from pixel size to point size (which can be
+ * imprecise).
+ */
+ TRACE(" FONT: Using message box font\n");
+ }
+ else
+ {
+ if (result->dialogEx)
+ {
+ result->weight = GET_WORD(p); p++;
+ result->italic = LOBYTE(GET_WORD(p)); p++;
+ }
+ result->faceName = (LPCWSTR)p;
+ p += wcslen( result->faceName ) + 1;
}
- result->faceName = (LPCWSTR)p;
- p += wcslen( result->faceName ) + 1;
}
/* First control is on dword boundary */
@@ -676,6 +703,8 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
{
HWND hwnd;
RECT rect;
+ POINT pos;
+ SIZE size;
DLG_TEMPLATE template;
DIALOGINFO * dlgInfo = NULL;
DWORD units = GetDialogBaseUnits();
@@ -699,16 +728,32 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
if (template.style & DS_SETFONT)
{
+ HDC dc = GetDC(0);
+
+ if (template.pointSize == 0x7fff)
+ {
+ /* We get the message font from the non-client metrics */
+ NONCLIENTMETRICSW ncMetrics;
+
+ ncMetrics.cbSize = sizeof(NONCLIENTMETRICSW);
+ if (SystemParametersInfoW(SPI_GETNONCLIENTMETRICS,
+ sizeof(NONCLIENTMETRICSW), &ncMetrics, 0))
+ {
+ hUserFont = CreateFontIndirectW( &ncMetrics.lfMessageFont );
+ }
+ }
+ else
+ {
/* We convert the size to pixels and then make it -ve. This works
* for both +ve and -ve template.pointSize */
- HDC dc;
- int pixels;
- dc = GetDC(0);
- pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72);
- hUserFont = CreateFontW( -pixels, 0, 0, 0, template.weight,
+ int pixels;
+ pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72);
+ hUserFont = CreateFontW( -pixels, 0, 0, 0, template.weight,
template.italic, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
PROOF_QUALITY, FF_DONTCARE,
template.faceName );
+ }
+
if (hUserFont)
{
SIZE charSize;
@@ -737,26 +782,39 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
if (template.style & DS_CONTROL)
template.exStyle |= WS_EX_CONTROLPARENT;
AdjustWindowRectEx( &rect, template.style, (hMenu != 0), template.exStyle );
- rect.right -= rect.left;
- rect.bottom -= rect.top;
+ pos.x = rect.left;
+ pos.y = rect.top;
+ size.cx = rect.right - rect.left;
+ size.cy = rect.bottom - rect.top;
if (template.x == CW_USEDEFAULT16)
{
- rect.left = rect.top = CW_USEDEFAULT;
+ pos.x = pos.y = CW_USEDEFAULT;
}
else
{
+ HMONITOR monitor = 0;
+ MONITORINFO mon_info;
+
+ mon_info.cbSize = sizeof(mon_info);
if (template.style & DS_CENTER)
{
- rect.left = (GetSystemMetrics(SM_CXSCREEN) - rect.right) / 2;
- rect.top = (GetSystemMetrics(SM_CYSCREEN) - rect.bottom) / 2;
+ monitor = MonitorFromWindow( owner ? owner : GetActiveWindow(), MONITOR_DEFAULTTOPRIMARY );
+ GetMonitorInfoW( monitor, &mon_info );
+ pos.x = (mon_info.rcWork.left + mon_info.rcWork.right - size.cx) / 2;
+ pos.y = (mon_info.rcWork.top + mon_info.rcWork.bottom - size.cy) / 2;
+ }
+ else if (template.style & DS_CENTERMOUSE)
+ {
+ GetCursorPos( &pos );
+ monitor = MonitorFromPoint( pos, MONITOR_DEFAULTTOPRIMARY );
+ GetMonitorInfoW( monitor, &mon_info );
}
else
{
- rect.left += MulDiv(template.x, xBaseUnit, 4);
- rect.top += MulDiv(template.y, yBaseUnit, 8);
- if( !(template.style & (WS_CHILD|DS_ABSALIGN)) )
- ClientToScreen( owner, (POINT *)&rect );
+ pos.x += MulDiv(template.x, xBaseUnit, 4);
+ pos.y += MulDiv(template.y, yBaseUnit, 8);
+ if (!(template.style & (WS_CHILD|DS_ABSALIGN))) ClientToScreen( owner, &pos );
}
if ( !(template.style & WS_CHILD) )
{
@@ -764,12 +822,18 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
/* try to fit it into the desktop */
- if( (dX = rect.left + rect.right + GetSystemMetrics(SM_CXDLGFRAME)
- - GetSystemMetrics(SM_CXSCREEN)) > 0 ) rect.left -= dX;
- if( (dY = rect.top + rect.bottom + GetSystemMetrics(SM_CYDLGFRAME)
- - GetSystemMetrics(SM_CYSCREEN)) > 0 ) rect.top -= dY;
- if( rect.left < 0 ) rect.left = 0;
- if( rect.top < 0 ) rect.top = 0;
+ if (!monitor)
+ {
+ SetRect( &rect, pos.x, pos.y, pos.x + size.cx, pos.y + size.cy );
+ monitor = MonitorFromRect( &rect, MONITOR_DEFAULTTOPRIMARY );
+ GetMonitorInfoW( monitor, &mon_info );
+ }
+ if ((dX = pos.x + size.cx + GetSystemMetrics(SM_CXDLGFRAME) - mon_info.rcWork.right) > 0)
+ pos.x -= dX;
+ if ((dY = pos.y + size.cy + GetSystemMetrics(SM_CYDLGFRAME) - mon_info.rcWork.bottom) > 0)
+ pos.y -= dY;
+ if( pos.x < mon_info.rcWork.left ) pos.x = mon_info.rcWork.left;
+ if( pos.y < mon_info.rcWork.top ) pos.y = mon_info.rcWork.top;
}
}
@@ -781,44 +845,36 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
if (unicode)
{
- hwnd = User32CreateWindowEx(template.exStyle, (LPCSTR)template.className, (LPCSTR)template.caption,
- template.style & ~WS_VISIBLE,
- rect.left, rect.top, rect.right, rect.bottom,
- owner, hMenu, hInst, NULL,
- TRUE);
+ hwnd = CreateWindowExW(template.exStyle, template.className, template.caption,
+ template.style & ~WS_VISIBLE, pos.x, pos.y, size.cx, size.cy,
+ owner, hMenu, hInst, NULL );
}
else
{
- LPSTR class = (LPSTR)template.className;
- LPSTR caption = (LPSTR)template.caption;
+ LPCSTR class = (LPCSTR)template.className;
+ LPCSTR caption = (LPCSTR)template.caption;
+ LPSTR class_tmp = NULL;
+ LPSTR caption_tmp = NULL;
if (HIWORD(class))
{
DWORD len = WideCharToMultiByte( CP_ACP, 0, template.className, -1, NULL, 0, NULL, NULL );
- class = HeapAlloc( GetProcessHeap(), 0, len );
- if (class != NULL)
- WideCharToMultiByte( CP_ACP, 0, template.className, -1, class, len, NULL, NULL );
+ class_tmp = HeapAlloc( GetProcessHeap(), 0, len );
+ WideCharToMultiByte( CP_ACP, 0, template.className, -1, class_tmp, len, NULL, NULL );
+ class = class_tmp;
}
if (HIWORD(caption))
{
DWORD len = WideCharToMultiByte( CP_ACP, 0, template.caption, -1, NULL, 0, NULL, NULL );
- caption = HeapAlloc( GetProcessHeap(), 0, len );
- if (caption != NULL)
- WideCharToMultiByte( CP_ACP, 0, template.caption, -1, caption, len, NULL, NULL );
+ caption_tmp = HeapAlloc( GetProcessHeap(), 0, len );
+ WideCharToMultiByte( CP_ACP, 0, template.caption, -1, caption_tmp, len, NULL, NULL );
+ caption = caption_tmp;
}
-
- if (class != NULL && caption != NULL)
- {
- hwnd = User32CreateWindowEx(template.exStyle, class, caption,
- template.style & ~WS_VISIBLE,
- rect.left, rect.top, rect.right, rect.bottom,
- owner, hMenu, hInst, NULL,
- FALSE);
- }
- else
- hwnd = NULL;
- if (HIWORD(class)) HeapFree( GetProcessHeap(), 0, class );
- if (HIWORD(caption)) HeapFree( GetProcessHeap(), 0, caption );
+ hwnd = CreateWindowExA(template.exStyle, class, caption,
+ template.style & ~WS_VISIBLE, pos.x, pos.y, size.cx, size.cy,
+ owner, hMenu, hInst, NULL );
+ HeapFree( GetProcessHeap(), 0, class_tmp );
+ HeapFree( GetProcessHeap(), 0, caption_tmp );
}
if (!hwnd)
@@ -832,7 +888,6 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
/* moved this from the top of the method to here as DIALOGINFO structure
will be valid only after WM_CREATE message has been handled in DefDlgProc
All the members of the structure get filled here using temp variables */
-
dlgInfo = DIALOG_get_info( hwnd, TRUE );
if (dlgInfo == NULL)
{
@@ -876,9 +931,10 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
SetFocus( dlgInfo->hwndFocus );
}
}
+//// ReactOS Rev 30613 & 30644
if (!(GetWindowLongPtrW( hwnd, GWL_STYLE ) & WS_CHILD))
SendMessageW( hwnd, WM_CHANGEUISTATE, MAKEWPARAM(UIS_INITIALIZE, 0), 0);
-
+////
if (template.style & WS_VISIBLE && !(GetWindowLongPtrW( hwnd, GWL_STYLE ) & WS_VISIBLE))
{
ShowWindow( hwnd, SW_SHOWNORMAL ); /* SW_SHOW doesn't always work */
@@ -899,13 +955,6 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
*/
static void DEFDLG_SetFocus( HWND hwndDlg, HWND hwndCtrl )
{
- HWND hwndPrev = GetFocus();
-
- if (IsChild( hwndDlg, hwndPrev ))
- {
- if (SendMessageW( hwndPrev, WM_GETDLGCODE, 0, 0 ) & DLGC_HASSETSEL)
- SendMessageW( hwndPrev, EM_SETSEL, -1, 0 );
- }
if (SendMessageW( hwndCtrl, WM_GETDLGCODE, 0, 0 ) & DLGC_HASSETSEL)
SendMessageW( hwndCtrl, EM_SETSEL, 0, -1 );
SetFocus( hwndCtrl );
@@ -944,7 +993,7 @@ static void DEFDLG_RestoreFocus( HWND hwnd )
infoPtr->hwndFocus = GetNextDlgTabItem( hwnd, 0, FALSE );
if (!IsWindow( infoPtr->hwndFocus )) return;
}
- SetFocus( infoPtr->hwndFocus );
+ DEFDLG_SetFocus( hwnd, infoPtr->hwndFocus );
/* This used to set infoPtr->hwndFocus to NULL for no apparent reason,
sometimes losing focus when receiving WM_SETFOCUS messages. */
@@ -1077,6 +1126,7 @@ static LRESULT DEFDLG_Proc( HWND hwnd, UINT msg, WPARAM wParam,
return 1;
}
case WM_NCDESTROY:
+//// ReactOS
if ((dlgInfo = (DIALOGINFO *)SetWindowLongPtrW( hwnd, DWLP_ROS_DIALOGINFO, 0 )))
{
/* Free dialog heap (if created) */
@@ -1088,6 +1138,7 @@ static LRESULT DEFDLG_Proc( HWND hwnd, UINT msg, WPARAM wParam,
if (dlgInfo->hUserFont) DeleteObject( dlgInfo->hUserFont );
if (dlgInfo->hMenu) DestroyMenu( dlgInfo->hMenu );
HeapFree( GetProcessHeap(), 0, dlgInfo );
+ NtUserCallHwndParam( hwnd, 0, HWNDPARAM_ROUTINE_SETDIALOGPOINTER );
}
/* Window clean-up */
return DefWindowProcA( hwnd, msg, wParam, lParam );
@@ -1541,7 +1592,7 @@ DefDlgProcA(
BOOL result = FALSE;
/* Perform DIALOGINFO initialization if not done */
- if(!(dlgInfo = DIALOG_get_info( hDlg, TRUE ))) return -1;
+ if(!(dlgInfo = DIALOG_get_info( hDlg, TRUE ))) return 0;
SetWindowLongPtrW( hDlg, DWLP_MSGRESULT, 0 );
@@ -1601,7 +1652,7 @@ DefDlgProcW(
BOOL result = FALSE;
/* Perform DIALOGINFO initialization if not done */
- if(!(dlgInfo = DIALOG_get_info( hDlg, TRUE ))) return -1;
+ if(!(dlgInfo = DIALOG_get_info( hDlg, TRUE ))) return 0;
SetWindowLongPtrW( hDlg, DWLP_MSGRESULT, 0 );
@@ -1716,7 +1767,7 @@ DialogBoxParamA(
HWND hwnd;
HRSRC hrsrc;
LPCDLGTEMPLATE ptr;
-
+//// ReactOS rev 33532
if (!(hrsrc = FindResourceA( hInstance, lpTemplateName, (LPCSTR)RT_DIALOG )) ||
!(ptr = LoadResource(hInstance, hrsrc)))
{
@@ -1749,7 +1800,7 @@ DialogBoxParamW(
HWND hwnd;
HRSRC hrsrc;
LPCDLGTEMPLATE ptr;
-
+//// ReactOS rev 33532
if (!(hrsrc = FindResourceW( hInstance, lpTemplateName, (LPCWSTR)RT_DIALOG )) ||
!(ptr = LoadResource(hInstance, hrsrc)))
{
diff --git a/reactos/dll/win32/user32/windows/hook.c b/reactos/dll/win32/user32/windows/hook.c
index 34a86ef636f..4abff2aac49 100644
--- a/reactos/dll/win32/user32/windows/hook.c
+++ b/reactos/dll/win32/user32/windows/hook.c
@@ -316,7 +316,7 @@ NotifyWinEvent(
// "Servers call NotifyWinEvent to announce the event to the system after the
// event has occurred; they must never notify the system of an event before
// the event has occurred." msdn on NotifyWinEvent.
- if (g_psi->dwInstalledEventHooks & GetMaskFromEvent(event)) // Check to see.
+ if (gpsi->dwInstalledEventHooks & GetMaskFromEvent(event)) // Check to see.
NtUserNotifyWinEvent(event, hwnd, idObject, idChild);
}
@@ -369,9 +369,9 @@ WINAPI
IsWinEventHookInstalled(
DWORD event)
{
- if ((PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo)
+ if ((PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo)
{
- return (g_psi->dwInstalledEventHooks & GetMaskFromEvent(event)) != 0;
+ return (gpsi->dwInstalledEventHooks & GetMaskFromEvent(event)) != 0;
}
return FALSE;
}
diff --git a/reactos/dll/win32/user32/windows/icon.c b/reactos/dll/win32/user32/windows/icon.c
index e6a32fd6cfd..bbf90d75562 100644
--- a/reactos/dll/win32/user32/windows/icon.c
+++ b/reactos/dll/win32/user32/windows/icon.c
@@ -98,13 +98,24 @@ ICON_CreateCursorFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cx
BITMAPINFO *bwBIH = (BITMAPINFO *)BitmapInfoBuffer;
BITMAPINFO *orgBIH = (BITMAPINFO *)IconImage;
ICONINFO IconInfo;
- PVOID XORImageData = ImageData;
IconInfo.fIcon = FALSE;
IconInfo.xHotspot = xHotspot;
IconInfo.yHotspot = yHotspot;
- /* Create a BITMAPINFO header for the monochrome part of the icon */
+ /* Handle the color part of the cursor */
+ if (IconImage->icHeader.biBitCount == 1)
+ {
+ IconInfo.hbmColor = (HBITMAP)0;
+ }
+ else
+ {
+ IconInfo.hbmColor = CreateDIBitmap(hDC, &IconImage->icHeader, CBM_INIT,
+ ImageData, (BITMAPINFO*)IconImage,
+ DIB_RGB_COLORS);
+ }
+
+ /* Create a BITMAPINFO header for the monochrome part of the cursor */
bwBIH->bmiHeader.biBitCount = 1;
bwBIH->bmiHeader.biWidth = IconImage->icHeader.biWidth;
bwBIH->bmiHeader.biHeight = IconImage->icHeader.biHeight;
@@ -127,29 +138,13 @@ ICON_CreateCursorFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cx
bwBIH->bmiColors[1].rgbRed = 0xff;
bwBIH->bmiColors[1].rgbReserved = 0;
- /* Load the AND bitmap */
+ /* Load the monochrome bitmap */
IconInfo.hbmMask = CreateDIBitmap(hDC, &bwBIH->bmiHeader, 0,
- XORImageData, bwBIH, DIB_RGB_COLORS);
+ ImageData, bwBIH, DIB_RGB_COLORS);
if (IconInfo.hbmMask)
{
SetDIBits(hDC, IconInfo.hbmMask, 0, IconImage->icHeader.biHeight,
- XORImageData, orgBIH, DIB_RGB_COLORS);
- }
-
- if (IconImage->icHeader.biBitCount == 1)
- {
- IconInfo.hbmColor = (HBITMAP)0;
- }
- else
- {
- /* Create the color part of the icon */
- IconInfo.hbmColor = CreateDIBitmap(hDC, &IconImage->icHeader, 0,
- XORImageData, orgBIH, DIB_RGB_COLORS);
- if (IconInfo.hbmColor)
- {
- SetDIBits(hDC, IconInfo.hbmColor, 0, IconImage->icHeader.biHeight,
- XORImageData, orgBIH, DIB_RGB_COLORS);
- }
+ ImageData, orgBIH, DIB_RGB_COLORS);
}
/* Create the icon based on everything we have so far */
@@ -708,7 +703,7 @@ LookupIconIdFromDirectoryEx(PBYTE xdir,
}
else
{
- ColorBits = g_psi->BitsPixel;
+ ColorBits = gpsi->BitsPixel;
}
if(bIcon)
diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c
index 101c55bf702..98e6fa685bd 100644
--- a/reactos/dll/win32/user32/windows/menu.c
+++ b/reactos/dll/win32/user32/windows/menu.c
@@ -998,6 +998,13 @@ PopupMenuWndProcA(HWND Wnd, UINT Message, WPARAM wParam, LPARAM lParam)
return 0;
}
+ case WM_PRINTCLIENT:
+ {
+ MenuDrawPopupMenu( Wnd, (HDC)wParam,
+ (HMENU)GetWindowLongPtrW( Wnd, 0 ) );
+ return 0;
+ }
+
case WM_ERASEBKGND:
return 1;
@@ -1062,6 +1069,13 @@ PopupMenuWndProcW(HWND Wnd, UINT Message, WPARAM wParam, LPARAM lParam)
return 0;
}
+ case WM_PRINTCLIENT:
+ {
+ MenuDrawPopupMenu( Wnd, (HDC)wParam,
+ (HMENU)GetWindowLongPtrW( Wnd, 0 ) );
+ return 0;
+ }
+
case WM_ERASEBKGND:
return 1;
@@ -1234,9 +1248,10 @@ User32LoadSysMenuTemplateForKernel(PVOID Arguments, ULONG ArgumentLength)
{
HMENU hmenu = LoadMenuW(User32Instance, L"SYSMENU");
LRESULT Result = (LRESULT)hmenu;
+ MENUINFO menuinfo = {0};
+ MENUITEMINFOW info = {0};
// removing space for checkboxes from menu
- MENUINFO menuinfo = {0};
menuinfo.cbSize = sizeof(menuinfo);
menuinfo.fMask = MIM_STYLE;
GetMenuInfo(hmenu, &menuinfo);
@@ -1244,7 +1259,6 @@ User32LoadSysMenuTemplateForKernel(PVOID Arguments, ULONG ArgumentLength)
SetMenuInfo(hmenu, &menuinfo);
// adding bitmaps to menu items
- MENUITEMINFOW info = {0};
info.cbSize = sizeof(info);
info.fMask |= MIIM_BITMAP;
info.hbmpItem = HBMMENU_POPUP_MINIMIZE;
@@ -4979,8 +4993,12 @@ SetMenuInfo(
{
ROSMENUINFO mi;
BOOL res = FALSE;
- if(lpcmi->cbSize != sizeof(MENUINFO))
+
+ if (!lpcmi || (lpcmi->cbSize != sizeof(MENUINFO)))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
return res;
+ }
memcpy(&mi, lpcmi, sizeof(MENUINFO));
return NtUserMenuInfo(hmenu, &mi, TRUE);
diff --git a/reactos/dll/win32/user32/windows/message.c b/reactos/dll/win32/user32/windows/message.c
index c1dc1f7cd6b..54f7d38a86b 100644
--- a/reactos/dll/win32/user32/windows/message.c
+++ b/reactos/dll/win32/user32/windows/message.c
@@ -1220,13 +1220,6 @@ IntCallWindowProcA(BOOL IsAnsiProc,
}
}
-static BOOL __inline
-IsCallProcHandle(IN WNDPROC lpWndProc)
-{
- /* FIXME - check for 64 bit architectures... */
- return ((ULONG_PTR)lpWndProc & 0xFFFF0000) == 0xFFFF0000;
-}
-
/*
* @implemented
@@ -1340,7 +1333,7 @@ DispatchMessageA(CONST MSG *lpmsg)
if (lpmsg->hwnd != NULL)
{
Wnd = ValidateHwnd(lpmsg->hwnd);
- if (!Wnd || SharedPtrToUser(Wnd->head.pti) != GetW32ThreadInfo())
+ if (!Wnd || Wnd->head.pti != GetW32ThreadInfo())
return 0;
}
else
@@ -1401,7 +1394,7 @@ DispatchMessageW(CONST MSG *lpmsg)
if (lpmsg->hwnd != NULL)
{
Wnd = ValidateHwnd(lpmsg->hwnd);
- if (!Wnd || SharedPtrToUser(Wnd->head.pti) != GetW32ThreadInfo())
+ if (!Wnd || Wnd->head.pti != GetW32ThreadInfo())
return 0;
}
else
@@ -1798,10 +1791,10 @@ SendMessageW(HWND Wnd,
if (Wnd != HWND_BROADCAST && (Msg < WM_DDE_FIRST || Msg > WM_DDE_LAST))
{
PWND Window;
- PW32THREADINFO ti = GetW32ThreadInfo();
+ PTHREADINFO ti = GetW32ThreadInfo();
Window = ValidateHwnd(Wnd);
- if (Window != NULL && SharedPtrToUser(Window->head.pti) == ti && !IsThreadHooked(GetWin32ClientInfo()))
+ if (Window != NULL && Window->head.pti == ti && !IsThreadHooked(GetWin32ClientInfo()))
{
/* NOTE: We can directly send messages to the window procedure
if *all* the following conditions are met:
@@ -1862,10 +1855,10 @@ SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
if (Wnd != HWND_BROADCAST && (Msg < WM_DDE_FIRST || Msg > WM_DDE_LAST))
{
PWND Window;
- PW32THREADINFO ti = GetW32ThreadInfo();
+ PTHREADINFO ti = GetW32ThreadInfo();
Window = ValidateHwnd(Wnd);
- if (Window != NULL && SharedPtrToUser(Window->head.pti) == ti && !IsThreadHooked(GetWin32ClientInfo()))
+ if (Window != NULL && Window->head.pti == ti && !IsThreadHooked(GetWin32ClientInfo()))
{
/* NOTE: We can directly send messages to the window procedure
if *all* the following conditions are met:
diff --git a/reactos/dll/win32/user32/windows/window.c b/reactos/dll/win32/user32/windows/window.c
index cb41592e0d9..cc8050ac3ff 100644
--- a/reactos/dll/win32/user32/windows/window.c
+++ b/reactos/dll/win32/user32/windows/window.c
@@ -1043,10 +1043,63 @@ GetTopWindow(HWND hWnd)
* @implemented
*/
BOOL WINAPI
-GetWindowInfo(HWND hwnd,
+GetWindowInfo(HWND hWnd,
PWINDOWINFO pwi)
{
- return NtUserGetWindowInfo(hwnd, pwi);
+ PWND pWnd;
+ PCLS pCls = NULL;
+ SIZE Size = {0,0};
+ BOOL Ret = FALSE;
+
+ if ( !pwi || pwi->cbSize != sizeof(WINDOWINFO))
+ SetLastError(ERROR_INVALID_PARAMETER); // Just set the error and go!
+
+ pWnd = ValidateHwnd(hWnd);
+ if (!pWnd)
+ return Ret;
+
+ UserGetWindowBorders(pWnd->style, pWnd->ExStyle, &Size, FALSE);
+
+ _SEH2_TRY
+ {
+ pCls = DesktopPtrToUser(pWnd->pcls);
+ pwi->rcWindow = pWnd->rcWindow;
+ pwi->rcClient = pWnd->rcClient;
+ pwi->dwStyle = pWnd->style;
+ pwi->dwExStyle = pWnd->ExStyle;
+ pwi->cxWindowBorders = Size.cx;
+ pwi->cyWindowBorders = Size.cy;
+ pwi->dwWindowStatus = 0;
+ if (pWnd->state & WNDS_ACTIVEFRAME)
+ pwi->dwWindowStatus = WS_ACTIVECAPTION;
+ pwi->atomWindowType = (pCls ? pCls->atomClassName : 0 );
+
+ if ( pWnd->state2 & WNDS2_WIN50COMPAT )
+ {
+ pwi->wCreatorVersion = 0x500;
+ }
+ else if ( pWnd->state2 & WNDS2_WIN40COMPAT )
+ {
+ pwi->wCreatorVersion = 0x400;
+ }
+ else if ( pWnd->state2 & WNDS2_WIN31COMPAT )
+ {
+ pwi->wCreatorVersion = 0x30A;
+ }
+ else
+ {
+ pwi->wCreatorVersion = 0x300;
+ }
+
+ Ret = TRUE;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ /* Do nothing */
+ }
+ _SEH2_END;
+
+ return Ret;
}
@@ -1263,12 +1316,12 @@ GetWindowThreadProcessId(HWND hWnd,
LPDWORD lpdwProcessId)
{
DWORD Ret = 0;
- PW32THREADINFO ti;
+ PTHREADINFO ti;
PWND pWnd = ValidateHwnd(hWnd);
if (!pWnd) return Ret;
- ti = SharedPtrToUser(pWnd->head.pti);
+ ti = pWnd->head.pti;
if (ti)
{
diff --git a/reactos/dll/win32/userenv/lang/pt-BR.rc b/reactos/dll/win32/userenv/lang/pt-BR.rc
new file mode 100644
index 00000000000..cc9ed4c0ef6
--- /dev/null
+++ b/reactos/dll/win32/userenv/lang/pt-BR.rc
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2004 Eric Kohl
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
+
+STRINGTABLE
+BEGIN
+ IDS_PROFILEPATH "%SystemDrive%\\Documents and Settings"
+ IDS_APPDATA "Dados de aplicativos"
+ IDS_DESKTOP "Desktop"
+ IDS_FAVORITES "Favoritos"
+ IDS_STARTMENU "Menu Iniciar"
+ IDS_PROGRAMS "Menu Iniciar\\Programas"
+ IDS_ADMINTOOLS "Menu Iniciar\\Programas\\Ferramentas Administrativas"
+ IDS_STARTUP "Menu Iniciar\\Programas\\Inicializar"
+ IDS_MYDOCUMENTS "Meus Documentos"
+ IDS_MYPICTURES "Meus Documentos\\Minhas imagens"
+ IDS_MYMUSIC "Meus Documentos\\Minhas msicas"
+ IDS_MYVIDEOS "Meus Documentos\\Meus vdeos"
+ IDS_TEMPLATES "Modelos"
+ IDS_RECENT "Documentos recentes"
+ IDS_SENDTO "SendTo"
+ IDS_PRINTHOOD "Ambiente de impresso"
+ IDS_NETHOOD "Ambiente de rede"
+ IDS_LOCALSETTINGS "Configuraes locais"
+ IDS_LOCALAPPDATA "Configuraes locais\\Dados de aplicativos"
+ IDS_TEMP "Configuraes locais\\Temp"
+ IDS_CACHE "Configuraes locais\\Temporary Internet Files"
+ IDS_HISTORY "Configuraes locais\\Histrico"
+ IDS_COOKIES "Cookies"
+ IDS_PROGRAMFILES "%SystemDrive%\\Arquivos de programas"
+ IDS_COMMONFILES "Arquivos comuns"
+END
diff --git a/reactos/dll/win32/userenv/userenv.rc b/reactos/dll/win32/userenv/userenv.rc
index b02c597271c..6de4a333713 100644
--- a/reactos/dll/win32/userenv/userenv.rc
+++ b/reactos/dll/win32/userenv/userenv.rc
@@ -53,6 +53,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#include "lang/no-NO.rc"
#include "lang/nl-NL.rc"
#include "lang/pl-PL.rc"
+#include "lang/pt-BR.rc"
#include "lang/ru-RU.rc"
#include "lang/sk-SK.rc"
#include "lang/sv-SE.rc"
diff --git a/reactos/dll/win32/wdmaud.drv/mixer.c b/reactos/dll/win32/wdmaud.drv/mixer.c
new file mode 100644
index 00000000000..ebb7e371059
--- /dev/null
+++ b/reactos/dll/win32/wdmaud.drv/mixer.c
@@ -0,0 +1,554 @@
+/*
+ * PROJECT: ReactOS Sound System
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: dll/win32/wdmaud.drv/mixer.c
+ *
+ * PURPOSE: WDM Audio Driver (User-mode part)
+ * PROGRAMMERS: Johannes Anderwald
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include "interface.h"
+
+
+extern HANDLE KernelHandle;
+
+DWORD
+PerformSampleRateConversion(
+ PUCHAR Buffer,
+ ULONG BufferLength,
+ ULONG OldRate,
+ ULONG NewRate,
+ ULONG BytesPerSample,
+ ULONG NumChannels,
+ PVOID * Result,
+ PULONG ResultLength)
+{
+ ULONG Index;
+ SRC_STATE * State;
+ SRC_DATA Data;
+ PUCHAR ResultOut;
+ int error;
+ PFLOAT FloatIn, FloatOut;
+ ULONG NumSamples;
+ ULONG NewSamples;
+
+ //SND_TRACE(L"PerformSampleRateConversion OldRate %u NewRate %u BytesPerSample %u NumChannels %u\n", OldRate, NewRate, BytesPerSample, NumChannels);
+
+ ASSERT(BytesPerSample == 1 || BytesPerSample == 2 || BytesPerSample == 4);
+
+ NumSamples = BufferLength / (BytesPerSample * NumChannels);
+
+ FloatIn = HeapAlloc(GetProcessHeap(), 0, NumSamples * NumChannels * sizeof(FLOAT));
+ if (!FloatIn)
+ {
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+
+ NewSamples = lrintf(((FLOAT)NumSamples * ((FLOAT)NewRate / (FLOAT)OldRate))) + 2;
+
+ FloatOut = HeapAlloc(GetProcessHeap(), 0, NewSamples * NumChannels * sizeof(FLOAT));
+ if (!FloatOut)
+ {
+ HeapFree(GetProcessHeap(), 0,FloatIn);
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+
+ ResultOut = HeapAlloc(GetProcessHeap(), 0, NewSamples * NumChannels * BytesPerSample);
+ if (!ResultOut)
+ {
+ HeapFree(GetProcessHeap(), 0,FloatIn);
+ HeapFree(GetProcessHeap(), 0,FloatOut);
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+
+ State = src_new(SRC_SINC_FASTEST, NumChannels, &error);
+ if (!State)
+ {
+ HeapFree(GetProcessHeap(), 0,FloatIn);
+ HeapFree(GetProcessHeap(), 0,FloatOut);
+ HeapFree(GetProcessHeap(), 0,ResultOut);
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+
+ /* fixme use asm */
+ if (BytesPerSample == 1)
+ {
+ for(Index = 0; Index < NumSamples * NumChannels; Index++)
+ FloatIn[Index] = (float)(Buffer[Index] / (1.0 * 0x80));
+ }
+ else if (BytesPerSample == 2)
+ {
+ src_short_to_float_array((short*)Buffer, FloatIn, NumSamples * NumChannels);
+ }
+ else if (BytesPerSample == 4)
+ {
+ src_int_to_float_array((int*)Buffer, FloatIn, NumSamples * NumChannels);
+ }
+
+ Data.data_in = FloatIn;
+ Data.data_out = FloatOut;
+ Data.input_frames = NumSamples;
+ Data.output_frames = NewSamples;
+ Data.src_ratio = (double)NewRate / (double)OldRate;
+
+ error = src_process(State, &Data);
+ if (error)
+ {
+ DPRINT1("src_process failed with %x\n", error);
+ HeapFree(GetProcessHeap(), 0,FloatIn);
+ HeapFree(GetProcessHeap(), 0,FloatOut);
+ HeapFree(GetProcessHeap(), 0,ResultOut);
+ return ERROR_INVALID_DATA;
+ }
+
+ if (BytesPerSample == 1)
+ {
+ /* FIXME perform over/under clipping */
+
+ for(Index = 0; Index < Data.output_frames_gen * NumChannels; Index++)
+ ResultOut[Index] = (lrintf(FloatOut[Index]) >> 24);
+ }
+ else if (BytesPerSample == 2)
+ {
+ PUSHORT Res = (PUSHORT)ResultOut;
+
+ src_float_to_short_array(FloatOut, (short*)Res, Data.output_frames_gen * NumChannels);
+ }
+ else if (BytesPerSample == 4)
+ {
+ PULONG Res = (PULONG)ResultOut;
+
+ src_float_to_int_array(FloatOut, (int*)Res, Data.output_frames_gen * NumChannels);
+ }
+
+
+ *Result = ResultOut;
+ *ResultLength = Data.output_frames_gen * BytesPerSample * NumChannels;
+ HeapFree(GetProcessHeap(), 0,FloatIn);
+ HeapFree(GetProcessHeap(), 0,FloatOut);
+ src_delete(State);
+ return ERROR_SUCCESS;
+}
+
+DWORD
+PerformChannelConversion(
+ PUCHAR Buffer,
+ ULONG BufferLength,
+ ULONG OldChannels,
+ ULONG NewChannels,
+ ULONG BitsPerSample,
+ PVOID * Result,
+ PULONG ResultLength)
+{
+ ULONG Samples;
+ ULONG NewIndex, OldIndex;
+
+ Samples = BufferLength / (BitsPerSample / 8) / OldChannels;
+
+ SND_TRACE(L"PerformChannelConversion OldChannels %u NewChannels %u\n", OldChannels, NewChannels);
+
+ if (NewChannels > OldChannels)
+ {
+ if (BitsPerSample == 8)
+ {
+ PUCHAR BufferOut = HeapAlloc(GetProcessHeap(), 0, Samples * NewChannels);
+ if (!BufferOut)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ for(NewIndex = 0, OldIndex = 0; OldIndex < Samples * OldChannels; NewIndex += NewChannels, OldIndex += OldChannels)
+ {
+ ULONG SubIndex = 0;
+
+ RtlMoveMemory(&BufferOut[NewIndex], &Buffer[OldIndex], OldChannels * sizeof(UCHAR));
+
+ do
+ {
+ /* 2 channel stretched to 4 looks like LRLR */
+ BufferOut[NewIndex+OldChannels + SubIndex] = Buffer[OldIndex + (SubIndex % OldChannels)];
+ }while(SubIndex++ < NewChannels - OldChannels);
+ }
+ *Result = BufferOut;
+ *ResultLength = Samples * NewChannels;
+ }
+ else if (BitsPerSample == 16)
+ {
+ PUSHORT BufferOut = HeapAlloc(GetProcessHeap(), 0, Samples * NewChannels);
+ if (!BufferOut)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ for(NewIndex = 0, OldIndex = 0; OldIndex < Samples * OldChannels; NewIndex += NewChannels, OldIndex += OldChannels)
+ {
+ ULONG SubIndex = 0;
+
+ RtlMoveMemory(&BufferOut[NewIndex], &Buffer[OldIndex], OldChannels * sizeof(USHORT));
+
+ do
+ {
+ BufferOut[NewIndex+OldChannels + SubIndex] = Buffer[OldIndex + (SubIndex % OldChannels)];
+ }while(SubIndex++ < NewChannels - OldChannels);
+ }
+ *Result = BufferOut;
+ *ResultLength = Samples * NewChannels;
+ }
+ else if (BitsPerSample == 24)
+ {
+ PUCHAR BufferOut = HeapAlloc(GetProcessHeap(), 0, Samples * NewChannels);
+ if (!BufferOut)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ for(NewIndex = 0, OldIndex = 0; OldIndex < Samples * OldChannels; NewIndex += NewChannels, OldIndex += OldChannels)
+ {
+ ULONG SubIndex = 0;
+
+ RtlMoveMemory(&BufferOut[NewIndex], &Buffer[OldIndex], OldChannels * 3);
+
+ do
+ {
+ RtlMoveMemory(&BufferOut[(NewIndex+OldChannels + SubIndex) * 3], &Buffer[(OldIndex + (SubIndex % OldChannels)) * 3], 3);
+ }while(SubIndex++ < NewChannels - OldChannels);
+ }
+ *Result = BufferOut;
+ *ResultLength = Samples * NewChannels;
+ }
+ else if (BitsPerSample == 32)
+ {
+ PULONG BufferOut = HeapAlloc(GetProcessHeap(), 0, Samples * NewChannels);
+ if (!BufferOut)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ for(NewIndex = 0, OldIndex = 0; OldIndex < Samples * OldChannels; NewIndex += NewChannels, OldIndex += OldChannels)
+ {
+ ULONG SubIndex = 0;
+
+ RtlMoveMemory(&BufferOut[NewIndex], &Buffer[OldIndex], OldChannels * sizeof(ULONG));
+
+ do
+ {
+ BufferOut[NewIndex+OldChannels + SubIndex] = Buffer[OldIndex + (SubIndex % OldChannels)];
+ }while(SubIndex++ < NewChannels - OldChannels);
+ }
+ *Result = BufferOut;
+ *ResultLength = Samples * NewChannels;
+ }
+
+ }
+ else
+ {
+ PUSHORT BufferOut = HeapAlloc(GetProcessHeap(), 0, Samples * NewChannels);
+ if (!BufferOut)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ for(NewIndex = 0, OldIndex = 0; OldIndex < Samples * OldChannels; NewIndex += NewChannels, OldIndex += OldChannels)
+ {
+ /* TODO
+ * mix stream instead of just dumping part of it ;)
+ */
+ RtlMoveMemory(&BufferOut[NewIndex], &Buffer[OldIndex], NewChannels * (BitsPerSample/8));
+ }
+
+ *Result = BufferOut;
+ *ResultLength = Samples * NewChannels;
+ }
+ return ERROR_SUCCESS;
+}
+
+
+DWORD
+PerformQualityConversion(
+ PUCHAR Buffer,
+ ULONG BufferLength,
+ ULONG OldWidth,
+ ULONG NewWidth,
+ PVOID * Result,
+ PULONG ResultLength)
+{
+ ULONG Samples;
+ ULONG Index;
+
+ ASSERT(OldWidth != NewWidth);
+
+ Samples = BufferLength / (OldWidth / 8);
+ //DPRINT("Samples %u BufferLength %u\n", Samples, BufferLength);
+
+ //SND_TRACE(L"PerformQualityConversion OldWidth %u NewWidth %u\n", OldWidth, NewWidth);
+
+ if (OldWidth == 8 && NewWidth == 16)
+ {
+ USHORT Sample;
+ PUSHORT BufferOut = HeapAlloc(GetProcessHeap(), 0, Samples * sizeof(USHORT));
+ if (!BufferOut)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ for(Index = 0; Index < Samples; Index++)
+ {
+ Sample = Buffer[Index];// & 0xFF);
+ Sample *= 2;
+#ifdef _X86_
+ Sample = _byteswap_ushort(Sample);
+#endif
+ BufferOut[Index] = Sample;
+ }
+ *Result = BufferOut;
+ *ResultLength = Samples * sizeof(USHORT);
+ }
+ else if (OldWidth == 8 && NewWidth == 32)
+ {
+ ULONG Sample;
+ PULONG BufferOut = HeapAlloc(GetProcessHeap(), 0, Samples * sizeof(ULONG));
+ if (!BufferOut)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ for(Index = 0; Index < Samples; Index++)
+ {
+ Sample = Buffer[Index];
+ Sample *= 16777216;
+#ifdef _X86_
+ Sample = _byteswap_ulong(Sample);
+#endif
+ BufferOut[Index] = Sample;
+ }
+ *Result = BufferOut;
+ *ResultLength = Samples * sizeof(ULONG);
+ }
+ else if (OldWidth == 16 && NewWidth == 32)
+ {
+ ULONG Sample;
+ PUSHORT BufferIn = (PUSHORT)Buffer;
+ PULONG BufferOut = HeapAlloc(GetProcessHeap(), 0, Samples * sizeof(ULONG));
+ if (!BufferOut)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ for(Index = 0; Index < Samples; Index++)
+ {
+ Sample = BufferIn[Index];
+ Sample *= 65536;
+#ifdef _X86_
+ Sample = _byteswap_ulong(Sample);
+#endif
+ BufferOut[Index] = Sample;
+ }
+ *Result = BufferOut;
+ *ResultLength = Samples * sizeof(ULONG);
+ }
+
+ else if (OldWidth == 16 && NewWidth == 8)
+ {
+ USHORT Sample;
+ PUSHORT BufferIn = (PUSHORT)Buffer;
+ PUCHAR BufferOut = HeapAlloc(GetProcessHeap(), 0, Samples * sizeof(UCHAR));
+ if (!BufferOut)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ for(Index = 0; Index < Samples; Index++)
+ {
+ Sample = BufferIn[Index];
+#ifdef _X86_
+ Sample = _byteswap_ushort(Sample);
+#endif
+ Sample /= 256;
+ BufferOut[Index] = (Sample & 0xFF);
+ }
+ *Result = BufferOut;
+ *ResultLength = Samples * sizeof(UCHAR);
+ }
+ else if (OldWidth == 32 && NewWidth == 8)
+ {
+ ULONG Sample;
+ PULONG BufferIn = (PULONG)Buffer;
+ PUCHAR BufferOut = HeapAlloc(GetProcessHeap(), 0, Samples * sizeof(UCHAR));
+ if (!BufferOut)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ for(Index = 0; Index < Samples; Index++)
+ {
+ Sample = BufferIn[Index];
+#ifdef _X86_
+ Sample = _byteswap_ulong(Sample);
+#endif
+ Sample /= 16777216;
+ BufferOut[Index] = (Sample & 0xFF);
+ }
+ *Result = BufferOut;
+ *ResultLength = Samples * sizeof(UCHAR);
+ }
+ else if (OldWidth == 32 && NewWidth == 16)
+ {
+ USHORT Sample;
+ PULONG BufferIn = (PULONG)Buffer;
+ PUSHORT BufferOut = HeapAlloc(GetProcessHeap(), 0, Samples * sizeof(USHORT));
+ if (!BufferOut)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ for(Index = 0; Index < Samples; Index++)
+ {
+ Sample = BufferIn[Index];
+#ifdef _X86_
+ Sample = _byteswap_ulong(Sample);
+#endif
+ Sample /= 65536;
+ BufferOut[Index] = (Sample & 0xFFFF);
+ }
+ *Result = BufferOut;
+ *ResultLength = Samples * sizeof(USHORT);
+ }
+ else
+ {
+ DPRINT1("Not implemented conversion OldWidth %u NewWidth %u\n", OldWidth, NewWidth);
+ return ERROR_NOT_SUPPORTED;
+ }
+
+ return ERROR_SUCCESS;
+}
+
+VOID
+CALLBACK
+MixerCompletionRoutine(
+ IN DWORD dwErrorCode,
+ IN DWORD dwNumberOfBytesTransferred,
+ IN LPOVERLAPPED lpOverlapped)
+{
+ PSOUND_OVERLAPPED Overlap = (PSOUND_OVERLAPPED)lpOverlapped;
+
+ /* Call mmebuddy overlap routine */
+ Overlap->OriginalCompletionRoutine(dwErrorCode, Overlap->OriginalBufferSize, lpOverlapped);
+}
+
+MMRESULT
+WriteFileEx_Remixer(
+ IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
+ IN PVOID OffsetPtr,
+ IN DWORD Length,
+ IN PSOUND_OVERLAPPED Overlap,
+ IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine)
+{
+ HANDLE Handle;
+ WDMAUD_DEVICE_INFO DeviceInfo;
+ DWORD BufferLength, BufferLengthTemp;
+ PVOID BufferOut, BufferOutTemp;
+ DWORD Status;
+ BOOL Result;
+
+ VALIDATE_MMSYS_PARAMETER( SoundDeviceInstance );
+ VALIDATE_MMSYS_PARAMETER( OffsetPtr );
+ VALIDATE_MMSYS_PARAMETER( Overlap );
+ VALIDATE_MMSYS_PARAMETER( CompletionRoutine );
+
+ GetSoundDeviceInstanceHandle(SoundDeviceInstance, &Handle);
+
+ SND_ASSERT(Handle);
+
+ BufferOut = OffsetPtr;
+ BufferLength = Length;
+
+ if (SoundDeviceInstance->WaveFormatEx.wBitsPerSample != 16)
+ {
+ Status = PerformQualityConversion(OffsetPtr,
+ Length,
+ SoundDeviceInstance->WaveFormatEx.wBitsPerSample,
+ 16,
+ &BufferOut,
+ &BufferLength);
+ if (Status)
+ {
+ SND_TRACE(L"PerformQualityConversion failed\n");
+ return MMSYSERR_NOERROR;
+ }
+ }
+
+ if (SoundDeviceInstance->WaveFormatEx.nChannels != 2)
+ {
+ Status = PerformChannelConversion(BufferOut,
+ BufferLength,
+ SoundDeviceInstance->WaveFormatEx.nChannels,
+ 2,
+ 16,
+ &BufferOutTemp,
+ &BufferLengthTemp);
+
+ if (BufferOut != OffsetPtr)
+ {
+ HeapFree(GetProcessHeap(), 0, BufferOut);
+ }
+
+ if (Status)
+ {
+ SND_TRACE(L"PerformChannelConversion failed\n");
+ return MMSYSERR_NOERROR;
+ }
+
+ BufferOut = BufferOutTemp;
+ BufferLength = BufferLengthTemp;
+ }
+
+ if (SoundDeviceInstance->WaveFormatEx.nSamplesPerSec != 44100)
+ {
+ Status = PerformSampleRateConversion(BufferOut,
+ BufferLength,
+ SoundDeviceInstance->WaveFormatEx.nSamplesPerSec,
+ 44100,
+ 2,
+ 2,
+ &BufferOutTemp,
+ &BufferLengthTemp);
+
+ if (BufferOut != OffsetPtr)
+ {
+ HeapFree(GetProcessHeap(), 0, BufferOut);
+ }
+
+ if (Status)
+ {
+ SND_TRACE(L"PerformSampleRateConversion failed\n");
+ return MMSYSERR_NOERROR;
+ }
+
+ BufferOut = BufferOutTemp;
+ BufferLength = BufferLengthTemp;
+ }
+
+ ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
+ DeviceInfo.hDevice = Handle;
+ DeviceInfo.DeviceType = WAVE_OUT_DEVICE_TYPE; //FIXME
+ DeviceInfo.Buffer = BufferOut;
+ DeviceInfo.BufferSize = BufferLength;
+
+ Overlap->OriginalBufferSize = Length;
+ Overlap->OriginalCompletionRoutine = CompletionRoutine;
+
+ Overlap->Standard.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+
+ //SND_TRACE(L"OriginalLength %u NewLength %u\n", Length, BufferLength);
+
+#if 0
+ Result = WriteFileEx(KernelHandle, &DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), (LPOVERLAPPED)Overlap, CompletionRoutine);
+#else
+ Result = WriteFileEx(KernelHandle, &DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), (LPOVERLAPPED)Overlap, MixerCompletionRoutine);
+#endif
+
+ if ( ! Result )
+ {
+ SND_TRACE(L"WriteFileEx failed with %x\n", GetLastError());
+ return MMSYSERR_NOERROR;
+ }
+
+ WaitForSingleObjectEx (KernelHandle, INFINITE, TRUE);
+
+#ifdef USERMODE_MIXER
+ // if (BufferOut != OffsetPtr)
+ // HeapFree(GetProcessHeap(), 0, BufferOut);
+#endif
+
+
+ return MMSYSERR_NOERROR;
+}
diff --git a/reactos/dll/win32/wdmaud.drv/wdmaud.c b/reactos/dll/win32/wdmaud.drv/wdmaud.c
index b8ff65b2a08..f96e7d65e73 100644
--- a/reactos/dll/win32/wdmaud.drv/wdmaud.c
+++ b/reactos/dll/win32/wdmaud.drv/wdmaud.c
@@ -32,6 +32,15 @@ PWSTR UnknownMidiOut = L"Midi Output";
HANDLE KernelHandle = INVALID_HANDLE_VALUE;
DWORD OpenCount = 0;
+MMRESULT
+WriteFileEx_Remixer(
+ IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
+ IN PVOID OffsetPtr,
+ IN DWORD Length,
+ IN PSOUND_OVERLAPPED Overlap,
+ IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine);
+
+
MMRESULT
GetNumWdmDevs(
@@ -111,6 +120,7 @@ GetWdmDeviceCapabilities(
return TranslateInternalMmResult(Result);
}
+ SND_TRACE(L"WDMAUD Name %S\n", DeviceInfo.u.WaveOutCaps.szPname);
/* This is pretty much a big hack right now */
switch ( DeviceType )
@@ -122,7 +132,7 @@ GetWdmDeviceCapabilities(
WaveOutCaps->wPid = DeviceInfo.u.WaveOutCaps.wPid;
WaveOutCaps->vDriverVersion = 0x0001;
- CopyWideString(WaveOutCaps->szPname, UnknownWaveOut);
+ CopyWideString(WaveOutCaps->szPname, DeviceInfo.u.WaveOutCaps.szPname);
WaveOutCaps->dwFormats = DeviceInfo.u.WaveOutCaps.dwFormats;
WaveOutCaps->wChannels = DeviceInfo.u.WaveOutCaps.wChannels;
@@ -132,7 +142,7 @@ GetWdmDeviceCapabilities(
case WAVE_IN_DEVICE_TYPE :
{
LPWAVEINCAPS WaveInCaps = (LPWAVEINCAPS) Capabilities;
- CopyWideString(WaveInCaps->szPname, UnknownWaveIn);
+ CopyWideString(WaveInCaps->szPname, DeviceInfo.u.WaveOutCaps.szPname);
/* TODO... other fields */
break;
}
@@ -205,6 +215,16 @@ CloseWdmSoundDevice(
DeviceInfo.DeviceType = DeviceType;
DeviceInfo.hDevice = SoundDeviceInstance->Handle;
+ /* First stop the stream */
+ DeviceInfo.u.State = KSSTATE_STOP;
+ SyncOverlappedDeviceIoControl(KernelHandle,
+ IOCTL_SETDEVICE_STATE,
+ (LPVOID) &DeviceInfo,
+ sizeof(WDMAUD_DEVICE_INFO),
+ (LPVOID) &DeviceInfo,
+ sizeof(WDMAUD_DEVICE_INFO),
+ NULL);
+
SyncOverlappedDeviceIoControl(KernelHandle,
IOCTL_CLOSE_WDMAUD,
(LPVOID) &DeviceInfo,
@@ -278,11 +298,19 @@ SetWdmWaveDeviceFormat(
DeviceInfo.DeviceIndex = DeviceId;
DeviceInfo.u.WaveFormatEx.cbSize = WaveFormat->cbSize;
DeviceInfo.u.WaveFormatEx.wFormatTag = WaveFormat->wFormatTag;
+#ifdef USERMODE_MIXER
+ DeviceInfo.u.WaveFormatEx.nChannels = 2;
+ DeviceInfo.u.WaveFormatEx.nSamplesPerSec = 44100;
+ DeviceInfo.u.WaveFormatEx.nBlockAlign = 4;
+ DeviceInfo.u.WaveFormatEx.nAvgBytesPerSec = 176400;
+ DeviceInfo.u.WaveFormatEx.wBitsPerSample = 16;
+#else
DeviceInfo.u.WaveFormatEx.nChannels = WaveFormat->nChannels;
DeviceInfo.u.WaveFormatEx.nSamplesPerSec = WaveFormat->nSamplesPerSec;
DeviceInfo.u.WaveFormatEx.nBlockAlign = WaveFormat->nBlockAlign;
DeviceInfo.u.WaveFormatEx.nAvgBytesPerSec = WaveFormat->nAvgBytesPerSec;
DeviceInfo.u.WaveFormatEx.wBitsPerSample = WaveFormat->wBitsPerSample;
+#endif
Result = SyncOverlappedDeviceIoControl(KernelHandle,
IOCTL_OPEN_WDMAUD,
@@ -297,6 +325,16 @@ SetWdmWaveDeviceFormat(
return TranslateInternalMmResult(Result);
}
+ /* Store format */
+ Instance->WaveFormatEx.cbSize = WaveFormat->cbSize;
+ Instance->WaveFormatEx.wFormatTag = WaveFormat->wFormatTag;
+ Instance->WaveFormatEx.nChannels = WaveFormat->nChannels;
+ Instance->WaveFormatEx.nSamplesPerSec = WaveFormat->nSamplesPerSec;
+ Instance->WaveFormatEx.nBlockAlign = WaveFormat->nBlockAlign;
+ Instance->WaveFormatEx.nAvgBytesPerSec = WaveFormat->nAvgBytesPerSec;
+ Instance->WaveFormatEx.wBitsPerSample = WaveFormat->wBitsPerSample;
+
+ /* Store sound device handle instance handle */
Instance->Handle = (PVOID)DeviceInfo.hDevice;
/* Now determine framing requirements */
@@ -318,6 +356,15 @@ SetWdmWaveDeviceFormat(
}
}
+ /* Now start the stream */
+ DeviceInfo.u.State = KSSTATE_RUN;
+ SyncOverlappedDeviceIoControl(KernelHandle,
+ IOCTL_SETDEVICE_STATE,
+ (LPVOID) &DeviceInfo,
+ sizeof(WDMAUD_DEVICE_INFO),
+ (LPVOID) &DeviceInfo,
+ sizeof(WDMAUD_DEVICE_INFO),
+ NULL);
return MMSYSERR_NOERROR;
}
@@ -454,7 +501,11 @@ PopulateWdmDeviceList(
FuncTable.SetWaveFormat = SetWdmWaveDeviceFormat;
FuncTable.Open = OpenWdmSoundDevice;
FuncTable.Close = CloseWdmSoundDevice;
+#ifndef USERMODE_MIXER
FuncTable.CommitWaveBuffer = WriteFileEx_Committer2;
+#else
+ FuncTable.CommitWaveBuffer = WriteFileEx_Remixer;
+#endif
FuncTable.GetPos = GetWdmPosition;
SetSoundDeviceFunctionTable(SoundDevice, &FuncTable);
@@ -465,7 +516,8 @@ PopulateWdmDeviceList(
-APIENTRY LONG
+LONG
+APIENTRY
DriverProc(
DWORD DriverId,
HANDLE DriverHandle,
diff --git a/reactos/dll/win32/wdmaud.drv/wdmaud.rbuild b/reactos/dll/win32/wdmaud.drv/wdmaud.rbuild
index d91b69217b8..9bcc11986d3 100644
--- a/reactos/dll/win32/wdmaud.drv/wdmaud.rbuild
+++ b/reactos/dll/win32/wdmaud.drv/wdmaud.rbuild
@@ -3,13 +3,18 @@
.
include/reactos/libs/sound
.
-
+ .
+
+
mmebuddy
ntdll
kernel32
user32
winmm
advapi32
+ libsamplerate
+ msvcrt
wdmaud.c
+ mixer.c
wdmaud.rc
\ No newline at end of file
diff --git a/reactos/dll/win32/win32.rbuild b/reactos/dll/win32/win32.rbuild
index 8a70b9f914b..256607f7752 100644
--- a/reactos/dll/win32/win32.rbuild
+++ b/reactos/dll/win32/win32.rbuild
@@ -31,6 +31,9 @@
+
+
+
@@ -127,6 +130,9 @@
+
+
+
@@ -253,6 +259,9 @@
+
+
+
@@ -574,6 +583,9 @@
+
+
+
@@ -610,6 +622,9 @@
+
+
+
@@ -640,4 +655,7 @@
+
+
+
diff --git a/reactos/dll/win32/windowscodecs/bmpdecode.c b/reactos/dll/win32/windowscodecs/bmpdecode.c
new file mode 100644
index 00000000000..5c805c8c098
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/bmpdecode.c
@@ -0,0 +1,1059 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "wingdi.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+typedef struct {
+ DWORD bc2Size;
+ DWORD bc2Width;
+ DWORD bc2Height;
+ WORD bc2Planes;
+ WORD bc2BitCount;
+ DWORD bc2Compression;
+ DWORD bc2SizeImage;
+ DWORD bc2XRes;
+ DWORD bc2YRes;
+ DWORD bc2ClrUsed;
+ DWORD bc2ClrImportant;
+ /* same as BITMAPINFOHEADER until this point */
+ WORD bc2ResUnit;
+ WORD bc2Reserved;
+ WORD bc2Orientation;
+ WORD bc2Halftoning;
+ DWORD bc2HalftoneSize1;
+ DWORD bc2HalftoneSize2;
+ DWORD bc2ColorSpace;
+ DWORD bc2AppData;
+} BITMAPCOREHEADER2;
+
+struct BmpFrameDecode;
+typedef HRESULT (*ReadDataFunc)(struct BmpFrameDecode* This);
+
+typedef struct BmpFrameDecode {
+ const IWICBitmapFrameDecodeVtbl *lpVtbl;
+ LONG ref;
+ IStream *stream;
+ BITMAPFILEHEADER bfh;
+ BITMAPV5HEADER bih;
+ const WICPixelFormatGUID *pixelformat;
+ int bitsperpixel;
+ ReadDataFunc read_data_func;
+ INT stride;
+ BYTE *imagedata;
+ BYTE *imagedatastart;
+} BmpFrameDecode;
+
+static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid,
+ void **ppv)
+{
+ BmpFrameDecode *This = (BmpFrameDecode*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IWICBitmapSource, iid) ||
+ IsEqualIID(&IID_IWICBitmapFrameDecode, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI BmpFrameDecode_AddRef(IWICBitmapFrameDecode *iface)
+{
+ BmpFrameDecode *This = (BmpFrameDecode*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI BmpFrameDecode_Release(IWICBitmapFrameDecode *iface)
+{
+ BmpFrameDecode *This = (BmpFrameDecode*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ IStream_Release(This->stream);
+ HeapFree(GetProcessHeap(), 0, This->imagedata);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI BmpFrameDecode_GetSize(IWICBitmapFrameDecode *iface,
+ UINT *puiWidth, UINT *puiHeight)
+{
+ BmpFrameDecode *This = (BmpFrameDecode*)iface;
+ TRACE("(%p,%p,%p)\n", iface, puiWidth, puiHeight);
+
+ if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER))
+ {
+ BITMAPCOREHEADER *bch = (BITMAPCOREHEADER*)&This->bih;
+ *puiWidth = bch->bcWidth;
+ *puiHeight = bch->bcHeight;
+ }
+ else
+ {
+ *puiWidth = This->bih.bV5Width;
+ *puiHeight = abs(This->bih.bV5Height);
+ }
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface,
+ WICPixelFormatGUID *pPixelFormat)
+{
+ BmpFrameDecode *This = (BmpFrameDecode*)iface;
+ TRACE("(%p,%p)\n", iface, pPixelFormat);
+
+ memcpy(pPixelFormat, This->pixelformat, sizeof(GUID));
+
+ return S_OK;
+}
+
+static HRESULT BmpHeader_GetResolution(BITMAPV5HEADER *bih, double *pDpiX, double *pDpiY)
+{
+ switch (bih->bV5Size)
+ {
+ case sizeof(BITMAPCOREHEADER):
+ *pDpiX = 96.0;
+ *pDpiY = 96.0;
+ return S_OK;
+ case sizeof(BITMAPCOREHEADER2):
+ case sizeof(BITMAPINFOHEADER):
+ case sizeof(BITMAPV4HEADER):
+ case sizeof(BITMAPV5HEADER):
+ *pDpiX = bih->bV5XPelsPerMeter * 0.0254;
+ *pDpiY = bih->bV5YPelsPerMeter * 0.0254;
+ return S_OK;
+ default:
+ return E_FAIL;
+ }
+}
+
+static HRESULT WINAPI BmpFrameDecode_GetResolution(IWICBitmapFrameDecode *iface,
+ double *pDpiX, double *pDpiY)
+{
+ BmpFrameDecode *This = (BmpFrameDecode*)iface;
+ TRACE("(%p,%p,%p)\n", iface, pDpiX, pDpiY);
+
+ return BmpHeader_GetResolution(&This->bih, pDpiX, pDpiY);
+}
+
+static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface,
+ IWICPalette *pIPalette)
+{
+ HRESULT hr;
+ BmpFrameDecode *This = (BmpFrameDecode*)iface;
+ int count;
+ WICColor *wiccolors=NULL;
+ RGBTRIPLE *bgrcolors=NULL;
+
+ TRACE("(%p,%p)\n", iface, pIPalette);
+
+ if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER))
+ {
+ BITMAPCOREHEADER *bch = (BITMAPCOREHEADER*)&This->bih;
+ if (bch->bcBitCount <= 8)
+ {
+ /* 2**n colors in BGR format after the header */
+ ULONG tablesize, bytesread;
+ LARGE_INTEGER offset;
+ int i;
+
+ count = 1 << bch->bcBitCount;
+ wiccolors = HeapAlloc(GetProcessHeap(), 0, sizeof(WICColor) * count);
+ tablesize = sizeof(RGBTRIPLE) * count;
+ bgrcolors = HeapAlloc(GetProcessHeap(), 0, tablesize);
+ if (!wiccolors || !bgrcolors)
+ {
+ hr = E_OUTOFMEMORY;
+ goto end;
+ }
+
+ offset.QuadPart = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPCOREHEADER);
+ hr = IStream_Seek(This->stream, offset, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) goto end;
+
+ hr = IStream_Read(This->stream, bgrcolors, tablesize, &bytesread);
+ if (FAILED(hr)) goto end;
+ if (bytesread != tablesize) {
+ hr = E_FAIL;
+ goto end;
+ }
+
+ for (i=0; ibih.bV5BitCount <= 8)
+ {
+ ULONG tablesize, bytesread;
+ LARGE_INTEGER offset;
+ int i;
+
+ if (This->bih.bV5ClrUsed == 0)
+ count = 1 << This->bih.bV5BitCount;
+ else
+ count = This->bih.bV5ClrUsed;
+
+ tablesize = sizeof(WICColor) * count;
+ wiccolors = HeapAlloc(GetProcessHeap(), 0, tablesize);
+ if (!wiccolors) return E_OUTOFMEMORY;
+
+ offset.QuadPart = sizeof(BITMAPFILEHEADER) + This->bih.bV5Size;
+ hr = IStream_Seek(This->stream, offset, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) goto end;
+
+ hr = IStream_Read(This->stream, wiccolors, tablesize, &bytesread);
+ if (FAILED(hr)) goto end;
+ if (bytesread != tablesize) {
+ hr = E_FAIL;
+ goto end;
+ }
+
+ /* convert from BGR to BGRA by setting alpha to 100% */
+ for (i=0; iimagedata)
+ {
+ hr = This->read_data_func(This);
+ if (FAILED(hr)) return hr;
+ }
+
+ hr = BmpFrameDecode_GetSize(iface, &width, &height);
+ if (FAILED(hr)) return hr;
+
+ return copy_pixels(This->bitsperpixel, This->imagedatastart,
+ width, height, This->stride,
+ prc, cbStride, cbBufferSize, pbBuffer);
+}
+
+static HRESULT WINAPI BmpFrameDecode_GetMetadataQueryReader(IWICBitmapFrameDecode *iface,
+ IWICMetadataQueryReader **ppIMetadataQueryReader)
+{
+ TRACE("(%p,%p)\n", iface, ppIMetadataQueryReader);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI BmpFrameDecode_GetColorContexts(IWICBitmapFrameDecode *iface,
+ UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
+{
+ TRACE("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI BmpFrameDecode_GetThumbnail(IWICBitmapFrameDecode *iface,
+ IWICBitmapSource **ppIThumbnail)
+{
+ TRACE("(%p,%p)\n", iface, ppIThumbnail);
+ return WINCODEC_ERR_CODECNOTHUMBNAIL;
+}
+
+static HRESULT BmpFrameDecode_ReadUncompressed(BmpFrameDecode* This)
+{
+ UINT bytesperrow;
+ UINT width, height;
+ UINT datasize;
+ int bottomup;
+ HRESULT hr;
+ LARGE_INTEGER offbits;
+ ULONG bytesread;
+
+ if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER))
+ {
+ BITMAPCOREHEADER *bch = (BITMAPCOREHEADER*)&This->bih;
+ width = bch->bcWidth;
+ height = bch->bcHeight;
+ bottomup = 1;
+ }
+ else
+ {
+ width = This->bih.bV5Width;
+ height = abs(This->bih.bV5Height);
+ bottomup = (This->bih.bV5Height > 0);
+ }
+
+ /* row sizes in BMP files must be divisible by 4 bytes */
+ bytesperrow = (((width * This->bitsperpixel)+31)/32)*4;
+ datasize = bytesperrow * height;
+
+ This->imagedata = HeapAlloc(GetProcessHeap(), 0, datasize);
+ if (!This->imagedata) return E_OUTOFMEMORY;
+
+ offbits.QuadPart = This->bfh.bfOffBits;
+ hr = IStream_Seek(This->stream, offbits, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) goto fail;
+
+ hr = IStream_Read(This->stream, This->imagedata, datasize, &bytesread);
+ if (FAILED(hr) || bytesread != datasize) goto fail;
+
+ if (bottomup)
+ {
+ This->imagedatastart = This->imagedata + (height-1) * bytesperrow;
+ This->stride = -bytesperrow;
+ }
+ else
+ {
+ This->imagedatastart = This->imagedata;
+ This->stride = bytesperrow;
+ }
+ return S_OK;
+
+fail:
+ HeapFree(GetProcessHeap(), 0, This->imagedata);
+ This->imagedata = NULL;
+ if (SUCCEEDED(hr)) hr = E_FAIL;
+ return hr;
+}
+
+static HRESULT BmpFrameDecode_ReadRLE8(BmpFrameDecode* This)
+{
+ UINT bytesperrow;
+ UINT width, height;
+ BYTE *rledata, *cursor, *rledataend;
+ UINT rlesize, datasize, palettesize;
+ DWORD palette[256];
+ UINT x, y;
+ DWORD *bgrdata;
+ HRESULT hr;
+ LARGE_INTEGER offbits;
+ ULONG bytesread;
+
+ width = This->bih.bV5Width;
+ height = abs(This->bih.bV5Height);
+ bytesperrow = width * 4;
+ datasize = bytesperrow * height;
+ rlesize = This->bih.bV5SizeImage;
+ if (This->bih.bV5ClrUsed && This->bih.bV5ClrUsed < 256)
+ palettesize = 4 * This->bih.bV5ClrUsed;
+ else
+ palettesize = 4 * 256;
+
+ rledata = HeapAlloc(GetProcessHeap(), 0, rlesize);
+ This->imagedata = HeapAlloc(GetProcessHeap(), 0, datasize);
+ if (!This->imagedata || !rledata)
+ {
+ hr = E_OUTOFMEMORY;
+ goto fail;
+ }
+
+ /* read palette */
+ offbits.QuadPart = sizeof(BITMAPFILEHEADER) + This->bih.bV5Size;
+ hr = IStream_Seek(This->stream, offbits, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) goto fail;
+
+ hr = IStream_Read(This->stream, palette, palettesize, &bytesread);
+ if (FAILED(hr) || bytesread != palettesize) goto fail;
+
+ /* read RLE data */
+ offbits.QuadPart = This->bfh.bfOffBits;
+ hr = IStream_Seek(This->stream, offbits, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) goto fail;
+
+ hr = IStream_Read(This->stream, rledata, rlesize, &bytesread);
+ if (FAILED(hr) || bytesread != rlesize) goto fail;
+
+ /* decode RLE */
+ bgrdata = (DWORD*)This->imagedata;
+ x = 0;
+ y = 0;
+ rledataend = rledata + rlesize;
+ cursor = rledata;
+ while (cursor < rledataend && y < height)
+ {
+ BYTE length = *cursor++;
+ if (length == 0)
+ {
+ /* escape code */
+ BYTE escape = *cursor++;
+ switch(escape)
+ {
+ case 0: /* end of line */
+ x = 0;
+ y++;
+ break;
+ case 1: /* end of bitmap */
+ goto end;
+ case 2: /* delta */
+ if (cursor < rledataend)
+ {
+ x += *cursor++;
+ y += *cursor++;
+ }
+ break;
+ default: /* absolute mode */
+ length = escape;
+ while (cursor < rledataend && length-- && x < width)
+ bgrdata[y*width + x++] = palette[*cursor++];
+ if (escape & 1) cursor++; /* skip pad byte */
+ }
+ }
+ else
+ {
+ DWORD color = palette[*cursor++];
+ while (length-- && x < width)
+ bgrdata[y*width + x++] = color;
+ }
+ }
+
+end:
+ HeapFree(GetProcessHeap(), 0, rledata);
+
+ This->imagedatastart = This->imagedata + (height-1) * bytesperrow;
+ This->stride = -bytesperrow;
+
+ return S_OK;
+
+fail:
+ HeapFree(GetProcessHeap(), 0, rledata);
+ HeapFree(GetProcessHeap(), 0, This->imagedata);
+ This->imagedata = NULL;
+ if (SUCCEEDED(hr)) hr = E_FAIL;
+ return hr;
+}
+
+static HRESULT BmpFrameDecode_ReadRLE4(BmpFrameDecode* This)
+{
+ UINT bytesperrow;
+ UINT width, height;
+ BYTE *rledata, *cursor, *rledataend;
+ UINT rlesize, datasize, palettesize;
+ DWORD palette[16];
+ UINT x, y;
+ DWORD *bgrdata;
+ HRESULT hr;
+ LARGE_INTEGER offbits;
+ ULONG bytesread;
+
+ width = This->bih.bV5Width;
+ height = abs(This->bih.bV5Height);
+ bytesperrow = width * 4;
+ datasize = bytesperrow * height;
+ rlesize = This->bih.bV5SizeImage;
+ if (This->bih.bV5ClrUsed && This->bih.bV5ClrUsed < 16)
+ palettesize = 4 * This->bih.bV5ClrUsed;
+ else
+ palettesize = 4 * 16;
+
+ rledata = HeapAlloc(GetProcessHeap(), 0, rlesize);
+ This->imagedata = HeapAlloc(GetProcessHeap(), 0, datasize);
+ if (!This->imagedata || !rledata)
+ {
+ hr = E_OUTOFMEMORY;
+ goto fail;
+ }
+
+ /* read palette */
+ offbits.QuadPart = sizeof(BITMAPFILEHEADER) + This->bih.bV5Size;
+ hr = IStream_Seek(This->stream, offbits, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) goto fail;
+
+ hr = IStream_Read(This->stream, palette, palettesize, &bytesread);
+ if (FAILED(hr) || bytesread != palettesize) goto fail;
+
+ /* read RLE data */
+ offbits.QuadPart = This->bfh.bfOffBits;
+ hr = IStream_Seek(This->stream, offbits, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) goto fail;
+
+ hr = IStream_Read(This->stream, rledata, rlesize, &bytesread);
+ if (FAILED(hr) || bytesread != rlesize) goto fail;
+
+ /* decode RLE */
+ bgrdata = (DWORD*)This->imagedata;
+ x = 0;
+ y = 0;
+ rledataend = rledata + rlesize;
+ cursor = rledata;
+ while (cursor < rledataend && y < height)
+ {
+ BYTE length = *cursor++;
+ if (length == 0)
+ {
+ /* escape code */
+ BYTE escape = *cursor++;
+ switch(escape)
+ {
+ case 0: /* end of line */
+ x = 0;
+ y++;
+ break;
+ case 1: /* end of bitmap */
+ goto end;
+ case 2: /* delta */
+ if (cursor < rledataend)
+ {
+ x += *cursor++;
+ y += *cursor++;
+ }
+ break;
+ default: /* absolute mode */
+ length = escape;
+ while (cursor < rledataend && length-- && x < width)
+ {
+ BYTE colors = *cursor++;
+ bgrdata[y*width + x++] = palette[colors>>4];
+ if (length-- && x < width)
+ bgrdata[y*width + x++] = palette[colors&0xf];
+ else
+ break;
+ }
+ if ((cursor - rledata) & 1) cursor++; /* skip pad byte */
+ }
+ }
+ else
+ {
+ BYTE colors = *cursor++;
+ DWORD color1 = palette[colors>>4];
+ DWORD color2 = palette[colors&0xf];
+ while (length-- && x < width)
+ {
+ bgrdata[y*width + x++] = color1;
+ if (length-- && x < width)
+ bgrdata[y*width + x++] = color2;
+ else
+ break;
+ }
+ }
+ }
+
+end:
+ HeapFree(GetProcessHeap(), 0, rledata);
+
+ This->imagedatastart = This->imagedata + (height-1) * bytesperrow;
+ This->stride = -bytesperrow;
+
+ return S_OK;
+
+fail:
+ HeapFree(GetProcessHeap(), 0, rledata);
+ HeapFree(GetProcessHeap(), 0, This->imagedata);
+ This->imagedata = NULL;
+ if (SUCCEEDED(hr)) hr = E_FAIL;
+ return hr;
+}
+
+static HRESULT BmpFrameDecode_ReadUnsupported(BmpFrameDecode* This)
+{
+ return E_FAIL;
+}
+
+struct bitfields_format {
+ WORD bitcount; /* 0 for end of list */
+ DWORD redmask;
+ DWORD greenmask;
+ DWORD bluemask;
+ DWORD alphamask;
+ const WICPixelFormatGUID *pixelformat;
+ ReadDataFunc read_data_func;
+};
+
+static const struct bitfields_format bitfields_formats[] = {
+ {16,0x7c00,0x3e0,0x1f,0,&GUID_WICPixelFormat16bppBGR555,BmpFrameDecode_ReadUncompressed},
+ {16,0xf800,0x7e0,0x1f,0,&GUID_WICPixelFormat16bppBGR565,BmpFrameDecode_ReadUncompressed},
+ {32,0xff0000,0xff00,0xff,0,&GUID_WICPixelFormat32bppBGR,BmpFrameDecode_ReadUncompressed},
+ {32,0xff0000,0xff00,0xff,0xff000000,&GUID_WICPixelFormat32bppBGRA,BmpFrameDecode_ReadUncompressed},
+ {0}
+};
+
+static const IWICBitmapFrameDecodeVtbl BmpFrameDecode_Vtbl = {
+ BmpFrameDecode_QueryInterface,
+ BmpFrameDecode_AddRef,
+ BmpFrameDecode_Release,
+ BmpFrameDecode_GetSize,
+ BmpFrameDecode_GetPixelFormat,
+ BmpFrameDecode_GetResolution,
+ BmpFrameDecode_CopyPalette,
+ BmpFrameDecode_CopyPixels,
+ BmpFrameDecode_GetMetadataQueryReader,
+ BmpFrameDecode_GetColorContexts,
+ BmpFrameDecode_GetThumbnail
+};
+
+typedef struct {
+ const IWICBitmapDecoderVtbl *lpVtbl;
+ LONG ref;
+ BOOL initialized;
+ IStream *stream;
+ BITMAPFILEHEADER bfh;
+ BITMAPV5HEADER bih;
+ BmpFrameDecode *framedecode;
+ const WICPixelFormatGUID *pixelformat;
+ int bitsperpixel;
+ ReadDataFunc read_data_func;
+} BmpDecoder;
+
+static HRESULT BmpDecoder_ReadHeaders(BmpDecoder* This, IStream *stream)
+{
+ HRESULT hr;
+ ULONG bytestoread, bytesread;
+ LARGE_INTEGER seek;
+
+ if (This->initialized) return WINCODEC_ERR_WRONGSTATE;
+
+ seek.QuadPart = 0;
+ hr = IStream_Seek(stream, seek, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) return hr;
+
+ hr = IStream_Read(stream, &This->bfh, sizeof(BITMAPFILEHEADER), &bytesread);
+ if (FAILED(hr)) return hr;
+ if (bytesread != sizeof(BITMAPFILEHEADER) ||
+ This->bfh.bfType != 0x4d42 /* "BM" */) return E_FAIL;
+
+ hr = IStream_Read(stream, &This->bih.bV5Size, sizeof(DWORD), &bytesread);
+ if (FAILED(hr)) return hr;
+ if (bytesread != sizeof(DWORD) ||
+ (This->bih.bV5Size != sizeof(BITMAPCOREHEADER) &&
+ This->bih.bV5Size != sizeof(BITMAPCOREHEADER2) &&
+ This->bih.bV5Size != sizeof(BITMAPINFOHEADER) &&
+ This->bih.bV5Size != sizeof(BITMAPV4HEADER) &&
+ This->bih.bV5Size != sizeof(BITMAPV5HEADER))) return E_FAIL;
+
+ bytestoread = This->bih.bV5Size-sizeof(DWORD);
+ hr = IStream_Read(stream, &This->bih.bV5Width, bytestoread, &bytesread);
+ if (FAILED(hr)) return hr;
+ if (bytestoread != bytesread) return E_FAIL;
+
+ /* if this is a BITMAPINFOHEADER with BI_BITFIELDS compression, we need to
+ read the extra fields */
+ if (This->bih.bV5Size == sizeof(BITMAPINFOHEADER) &&
+ This->bih.bV5Compression == BI_BITFIELDS)
+ {
+ hr = IStream_Read(stream, &This->bih.bV5RedMask, 12, &bytesread);
+ if (FAILED(hr)) return hr;
+ if (bytesread != 12) return E_FAIL;
+ This->bih.bV5AlphaMask = 0;
+ }
+
+ /* decide what kind of bitmap this is and how/if we can read it */
+ if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER))
+ {
+ BITMAPCOREHEADER *bch = (BITMAPCOREHEADER*)&This->bih;
+ TRACE("BITMAPCOREHEADER with depth=%i\n", bch->bcBitCount);
+ This->bitsperpixel = bch->bcBitCount;
+ This->read_data_func = BmpFrameDecode_ReadUncompressed;
+ switch(bch->bcBitCount)
+ {
+ case 1:
+ This->pixelformat = &GUID_WICPixelFormat1bppIndexed;
+ break;
+ case 2:
+ This->pixelformat = &GUID_WICPixelFormat2bppIndexed;
+ break;
+ case 4:
+ This->pixelformat = &GUID_WICPixelFormat4bppIndexed;
+ break;
+ case 8:
+ This->pixelformat = &GUID_WICPixelFormat8bppIndexed;
+ break;
+ case 24:
+ This->pixelformat = &GUID_WICPixelFormat24bppBGR;
+ break;
+ default:
+ This->pixelformat = &GUID_WICPixelFormatUndefined;
+ WARN("unsupported bit depth %i for BITMAPCOREHEADER\n", bch->bcBitCount);
+ break;
+ }
+ }
+ else /* struct is compatible with BITMAPINFOHEADER */
+ {
+ TRACE("bitmap header=%i compression=%i depth=%i\n", This->bih.bV5Size, This->bih.bV5Compression, This->bih.bV5BitCount);
+ switch(This->bih.bV5Compression)
+ {
+ case BI_RGB:
+ This->bitsperpixel = This->bih.bV5BitCount;
+ This->read_data_func = BmpFrameDecode_ReadUncompressed;
+ switch(This->bih.bV5BitCount)
+ {
+ case 1:
+ This->pixelformat = &GUID_WICPixelFormat1bppIndexed;
+ break;
+ case 2:
+ This->pixelformat = &GUID_WICPixelFormat2bppIndexed;
+ break;
+ case 4:
+ This->pixelformat = &GUID_WICPixelFormat4bppIndexed;
+ break;
+ case 8:
+ This->pixelformat = &GUID_WICPixelFormat8bppIndexed;
+ break;
+ case 16:
+ This->pixelformat = &GUID_WICPixelFormat16bppBGR555;
+ break;
+ case 24:
+ This->pixelformat = &GUID_WICPixelFormat24bppBGR;
+ break;
+ case 32:
+ This->pixelformat = &GUID_WICPixelFormat32bppBGR;
+ break;
+ default:
+ This->pixelformat = &GUID_WICPixelFormatUndefined;
+ FIXME("unsupported bit depth %i for uncompressed RGB\n", This->bih.bV5BitCount);
+ }
+ break;
+ case BI_RLE8:
+ This->bitsperpixel = 32;
+ This->read_data_func = BmpFrameDecode_ReadRLE8;
+ This->pixelformat = &GUID_WICPixelFormat32bppBGR;
+ break;
+ case BI_RLE4:
+ This->bitsperpixel = 32;
+ This->read_data_func = BmpFrameDecode_ReadRLE4;
+ This->pixelformat = &GUID_WICPixelFormat32bppBGR;
+ break;
+ case BI_BITFIELDS:
+ {
+ const struct bitfields_format *format;
+ if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER2))
+ {
+ /* BCH2 doesn't support bitfields; this is Huffman 1D compression */
+ This->bitsperpixel = 0;
+ This->read_data_func = BmpFrameDecode_ReadUnsupported;
+ This->pixelformat = &GUID_WICPixelFormatUndefined;
+ FIXME("Huffman 1D compression is unsupported\n");
+ break;
+ }
+ This->bitsperpixel = This->bih.bV5BitCount;
+ for (format = bitfields_formats; format->bitcount; format++)
+ {
+ if ((format->bitcount == This->bih.bV5BitCount) &&
+ (format->redmask == This->bih.bV5RedMask) &&
+ (format->greenmask == This->bih.bV5GreenMask) &&
+ (format->bluemask == This->bih.bV5BlueMask) &&
+ (format->alphamask == This->bih.bV5AlphaMask))
+ {
+ This->read_data_func = format->read_data_func;
+ This->pixelformat = format->pixelformat;
+ break;
+ }
+ }
+ if (!format->bitcount)
+ {
+ This->read_data_func = BmpFrameDecode_ReadUncompressed;
+ This->pixelformat = &GUID_WICPixelFormatUndefined;
+ FIXME("unsupported bitfields type depth=%i red=%x green=%x blue=%x alpha=%x\n",
+ This->bih.bV5BitCount, This->bih.bV5RedMask, This->bih.bV5GreenMask, This->bih.bV5BlueMask, This->bih.bV5AlphaMask);
+ }
+ break;
+ }
+ default:
+ This->bitsperpixel = 0;
+ This->read_data_func = BmpFrameDecode_ReadUnsupported;
+ This->pixelformat = &GUID_WICPixelFormatUndefined;
+ FIXME("unsupported bitmap type header=%i compression=%i depth=%i\n", This->bih.bV5Size, This->bih.bV5Compression, This->bih.bV5BitCount);
+ break;
+ }
+ }
+
+ This->initialized = TRUE;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid,
+ void **ppv)
+{
+ BmpDecoder *This = (BmpDecoder*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICBitmapDecoder, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI BmpDecoder_AddRef(IWICBitmapDecoder *iface)
+{
+ BmpDecoder *This = (BmpDecoder*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI BmpDecoder_Release(IWICBitmapDecoder *iface)
+{
+ BmpDecoder *This = (BmpDecoder*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ if (This->stream) IStream_Release(This->stream);
+ if (This->framedecode) IUnknown_Release((IUnknown*)This->framedecode);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI BmpDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *pIStream,
+ DWORD *pdwCapability)
+{
+ HRESULT hr;
+ BmpDecoder *This = (BmpDecoder*)iface;
+
+ hr = BmpDecoder_ReadHeaders(This, pIStream);
+ if (FAILED(hr)) return hr;
+
+ if (This->read_data_func == BmpFrameDecode_ReadUnsupported)
+ *pdwCapability = 0;
+ else
+ *pdwCapability = WICBitmapDecoderCapabilityCanDecodeAllImages;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream,
+ WICDecodeOptions cacheOptions)
+{
+ HRESULT hr;
+ BmpDecoder *This = (BmpDecoder*)iface;
+
+ hr = BmpDecoder_ReadHeaders(This, pIStream);
+
+ if (SUCCEEDED(hr))
+ {
+ This->stream = pIStream;
+ IStream_AddRef(pIStream);
+ }
+
+ return hr;
+}
+
+static HRESULT WINAPI BmpDecoder_GetContainerFormat(IWICBitmapDecoder *iface,
+ GUID *pguidContainerFormat)
+{
+ memcpy(pguidContainerFormat, &GUID_ContainerFormatBmp, sizeof(GUID));
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpDecoder_GetDecoderInfo(IWICBitmapDecoder *iface,
+ IWICBitmapDecoderInfo **ppIDecoderInfo)
+{
+ HRESULT hr;
+ IWICComponentInfo *compinfo;
+
+ TRACE("(%p,%p)\n", iface, ppIDecoderInfo);
+
+ hr = CreateComponentInfo(&CLSID_WICBmpDecoder, &compinfo);
+ if (FAILED(hr)) return hr;
+
+ hr = IWICComponentInfo_QueryInterface(compinfo, &IID_IWICBitmapDecoderInfo,
+ (void**)ppIDecoderInfo);
+
+ IWICComponentInfo_Release(compinfo);
+
+ return hr;
+}
+
+static HRESULT WINAPI BmpDecoder_CopyPalette(IWICBitmapDecoder *iface,
+ IWICPalette *pIPalette)
+{
+ TRACE("(%p,%p)\n", iface, pIPalette);
+
+ return WINCODEC_ERR_PALETTEUNAVAILABLE;
+}
+
+static HRESULT WINAPI BmpDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface,
+ IWICMetadataQueryReader **ppIMetadataQueryReader)
+{
+ TRACE("(%p,%p)\n", iface, ppIMetadataQueryReader);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI BmpDecoder_GetPreview(IWICBitmapDecoder *iface,
+ IWICBitmapSource **ppIBitmapSource)
+{
+ TRACE("(%p,%p)\n", iface, ppIBitmapSource);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI BmpDecoder_GetColorContexts(IWICBitmapDecoder *iface,
+ UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
+{
+ TRACE("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI BmpDecoder_GetThumbnail(IWICBitmapDecoder *iface,
+ IWICBitmapSource **ppIThumbnail)
+{
+ TRACE("(%p,%p)\n", iface, ppIThumbnail);
+ return WINCODEC_ERR_CODECNOTHUMBNAIL;
+}
+
+static HRESULT WINAPI BmpDecoder_GetFrameCount(IWICBitmapDecoder *iface,
+ UINT *pCount)
+{
+ *pCount = 1;
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpDecoder_GetFrame(IWICBitmapDecoder *iface,
+ UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
+{
+ BmpDecoder *This = (BmpDecoder*)iface;
+
+ if (index != 0) return E_INVALIDARG;
+
+ if (!This->stream) return WINCODEC_ERR_WRONGSTATE;
+
+ if (!This->framedecode)
+ {
+ This->framedecode = HeapAlloc(GetProcessHeap(), 0, sizeof(BmpFrameDecode));
+ if (!This->framedecode) return E_OUTOFMEMORY;
+
+ This->framedecode->lpVtbl = &BmpFrameDecode_Vtbl;
+ This->framedecode->ref = 1;
+ This->framedecode->stream = This->stream;
+ IStream_AddRef(This->stream);
+ This->framedecode->bfh = This->bfh;
+ This->framedecode->bih = This->bih;
+ This->framedecode->pixelformat = This->pixelformat;
+ This->framedecode->bitsperpixel = This->bitsperpixel;
+ This->framedecode->read_data_func = This->read_data_func;
+ This->framedecode->imagedata = NULL;
+ }
+
+ *ppIBitmapFrame = (IWICBitmapFrameDecode*)This->framedecode;
+ IWICBitmapFrameDecode_AddRef((IWICBitmapFrameDecode*)This->framedecode);
+
+ return S_OK;
+}
+
+static const IWICBitmapDecoderVtbl BmpDecoder_Vtbl = {
+ BmpDecoder_QueryInterface,
+ BmpDecoder_AddRef,
+ BmpDecoder_Release,
+ BmpDecoder_QueryCapability,
+ BmpDecoder_Initialize,
+ BmpDecoder_GetContainerFormat,
+ BmpDecoder_GetDecoderInfo,
+ BmpDecoder_CopyPalette,
+ BmpDecoder_GetMetadataQueryReader,
+ BmpDecoder_GetPreview,
+ BmpDecoder_GetColorContexts,
+ BmpDecoder_GetThumbnail,
+ BmpDecoder_GetFrameCount,
+ BmpDecoder_GetFrame
+};
+
+HRESULT BmpDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
+{
+ BmpDecoder *This;
+ HRESULT ret;
+
+ TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv);
+
+ *ppv = NULL;
+
+ if (pUnkOuter) return CLASS_E_NOAGGREGATION;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(BmpDecoder));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->lpVtbl = &BmpDecoder_Vtbl;
+ This->ref = 1;
+ This->initialized = FALSE;
+ This->stream = NULL;
+ This->framedecode = NULL;
+
+ ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv);
+ IUnknown_Release((IUnknown*)This);
+
+ return ret;
+}
diff --git a/reactos/dll/win32/windowscodecs/bmpencode.c b/reactos/dll/win32/windowscodecs/bmpencode.c
new file mode 100644
index 00000000000..11c39e89867
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/bmpencode.c
@@ -0,0 +1,598 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "wingdi.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+struct bmp_pixelformat {
+ const WICPixelFormatGUID *guid;
+ UINT bpp;
+ DWORD compression;
+ DWORD redmask;
+ DWORD greenmask;
+ DWORD bluemask;
+ DWORD alphamask;
+};
+
+static const struct bmp_pixelformat formats[] = {
+ {&GUID_WICPixelFormat24bppBGR, 24, BI_RGB},
+ {NULL}
+};
+
+typedef struct BmpFrameEncode {
+ const IWICBitmapFrameEncodeVtbl *lpVtbl;
+ LONG ref;
+ IStream *stream;
+ BOOL initialized;
+ UINT width, height;
+ BYTE *bits;
+ const struct bmp_pixelformat *format;
+ double xres, yres;
+ UINT lineswritten;
+ UINT stride;
+ BOOL committed;
+} BmpFrameEncode;
+
+static HRESULT WINAPI BmpFrameEncode_QueryInterface(IWICBitmapFrameEncode *iface, REFIID iid,
+ void **ppv)
+{
+ BmpFrameEncode *This = (BmpFrameEncode*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IWICBitmapFrameEncode, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI BmpFrameEncode_AddRef(IWICBitmapFrameEncode *iface)
+{
+ BmpFrameEncode *This = (BmpFrameEncode*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI BmpFrameEncode_Release(IWICBitmapFrameEncode *iface)
+{
+ BmpFrameEncode *This = (BmpFrameEncode*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ if (This->stream) IStream_Release(This->stream);
+ HeapFree(GetProcessHeap(), 0, This->bits);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI BmpFrameEncode_Initialize(IWICBitmapFrameEncode *iface,
+ IPropertyBag2 *pIEncoderOptions)
+{
+ BmpFrameEncode *This = (BmpFrameEncode*)iface;
+ TRACE("(%p,%p)\n", iface, pIEncoderOptions);
+
+ if (This->initialized) return WINCODEC_ERR_WRONGSTATE;
+
+ This->initialized = TRUE;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpFrameEncode_SetSize(IWICBitmapFrameEncode *iface,
+ UINT uiWidth, UINT uiHeight)
+{
+ BmpFrameEncode *This = (BmpFrameEncode*)iface;
+ TRACE("(%p,%u,%u)\n", iface, uiWidth, uiHeight);
+
+ if (!This->initialized || This->bits) return WINCODEC_ERR_WRONGSTATE;
+
+ This->width = uiWidth;
+ This->height = uiHeight;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpFrameEncode_SetResolution(IWICBitmapFrameEncode *iface,
+ double dpiX, double dpiY)
+{
+ BmpFrameEncode *This = (BmpFrameEncode*)iface;
+ TRACE("(%p,%0.2f,%0.2f)\n", iface, dpiX, dpiY);
+
+ if (!This->initialized || This->bits) return WINCODEC_ERR_WRONGSTATE;
+
+ This->xres = dpiX;
+ This->yres = dpiY;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpFrameEncode_SetPixelFormat(IWICBitmapFrameEncode *iface,
+ WICPixelFormatGUID *pPixelFormat)
+{
+ BmpFrameEncode *This = (BmpFrameEncode*)iface;
+ int i;
+ TRACE("(%p,%s)\n", iface, debugstr_guid(pPixelFormat));
+
+ if (!This->initialized || This->bits) return WINCODEC_ERR_WRONGSTATE;
+
+ for (i=0; formats[i].guid; i++)
+ {
+ if (memcmp(formats[i].guid, pPixelFormat, sizeof(GUID)) == 0)
+ break;
+ }
+
+ if (!formats[i].guid) i = 0;
+
+ This->format = &formats[i];
+ memcpy(pPixelFormat, This->format->guid, sizeof(GUID));
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpFrameEncode_SetColorContexts(IWICBitmapFrameEncode *iface,
+ UINT cCount, IWICColorContext **ppIColorContext)
+{
+ FIXME("(%p,%u,%p): stub\n", iface, cCount, ppIColorContext);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BmpFrameEncode_SetPalette(IWICBitmapFrameEncode *iface,
+ IWICPalette *pIPalette)
+{
+ FIXME("(%p,%p): stub\n", iface, pIPalette);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI BmpFrameEncode_SetThumbnail(IWICBitmapFrameEncode *iface,
+ IWICBitmapSource *pIThumbnail)
+{
+ FIXME("(%p,%p): stub\n", iface, pIThumbnail);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT BmpFrameEncode_AllocateBits(BmpFrameEncode *This)
+{
+ if (!This->bits)
+ {
+ if (!This->initialized || !This->width || !This->height || !This->format)
+ return WINCODEC_ERR_WRONGSTATE;
+
+ This->stride = (((This->width * This->format->bpp)+31)/32)*4;
+ This->bits = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->stride * This->height);
+ if (!This->bits) return E_OUTOFMEMORY;
+ }
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpFrameEncode_WritePixels(IWICBitmapFrameEncode *iface,
+ UINT lineCount, UINT cbStride, UINT cbBufferSize, BYTE *pbPixels)
+{
+ BmpFrameEncode *This = (BmpFrameEncode*)iface;
+ HRESULT hr;
+ WICRect rc;
+ TRACE("(%p,%u,%u,%u,%p)\n", iface, lineCount, cbStride, cbBufferSize, pbPixels);
+
+ if (!This->initialized || !This->width || !This->height || !This->format)
+ return WINCODEC_ERR_WRONGSTATE;
+
+ hr = BmpFrameEncode_AllocateBits(This);
+ if (FAILED(hr)) return hr;
+
+ rc.X = 0;
+ rc.Y = 0;
+ rc.Width = This->width;
+ rc.Height = lineCount;
+
+ hr = copy_pixels(This->format->bpp, pbPixels, This->width, lineCount, cbStride,
+ &rc, This->stride, This->stride*(This->height-This->lineswritten),
+ This->bits + This->stride*This->lineswritten);
+
+ if (SUCCEEDED(hr))
+ This->lineswritten += lineCount;
+
+ return hr;
+}
+
+static HRESULT WINAPI BmpFrameEncode_WriteSource(IWICBitmapFrameEncode *iface,
+ IWICBitmapSource *pIBitmapSource, WICRect *prc)
+{
+ BmpFrameEncode *This = (BmpFrameEncode*)iface;
+ HRESULT hr;
+ WICRect rc;
+ WICPixelFormatGUID guid;
+ TRACE("(%p,%p,%p)\n", iface, pIBitmapSource, prc);
+
+ if (!This->initialized || !This->width || !This->height)
+ return WINCODEC_ERR_WRONGSTATE;
+
+ if (!This->format)
+ {
+ hr = IWICBitmapSource_GetPixelFormat(pIBitmapSource, &guid);
+ if (FAILED(hr)) return hr;
+ hr = BmpFrameEncode_SetPixelFormat(iface, &guid);
+ if (FAILED(hr)) return hr;
+ }
+
+ hr = IWICBitmapSource_GetPixelFormat(pIBitmapSource, &guid);
+ if (FAILED(hr)) return hr;
+ if (memcmp(&guid, This->format->guid, sizeof(GUID)) != 0)
+ {
+ /* should use WICConvertBitmapSource to convert, but that's unimplemented */
+ ERR("format %s unsupported\n", debugstr_guid(&guid));
+ return E_FAIL;
+ }
+
+ if (This->xres == 0.0 || This->yres == 0.0)
+ {
+ double xres, yres;
+ hr = IWICBitmapSource_GetResolution(pIBitmapSource, &xres, &yres);
+ if (FAILED(hr)) return hr;
+ hr = BmpFrameEncode_SetResolution(iface, xres, yres);
+ if (FAILED(hr)) return hr;
+ }
+
+ if (!prc)
+ {
+ UINT width, height;
+ hr = IWICBitmapSource_GetSize(pIBitmapSource, &width, &height);
+ if (FAILED(hr)) return hr;
+ rc.X = 0;
+ rc.Y = 0;
+ rc.Width = width;
+ rc.Height = height;
+ prc = &rc;
+ }
+
+ if (prc->Width != This->width) return E_INVALIDARG;
+
+ hr = BmpFrameEncode_AllocateBits(This);
+ if (FAILED(hr)) return hr;
+
+ hr = IWICBitmapSource_CopyPixels(pIBitmapSource, prc, This->stride,
+ This->stride*(This->height-This->lineswritten),
+ This->bits + This->stride*This->lineswritten);
+
+ This->lineswritten += rc.Height;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpFrameEncode_Commit(IWICBitmapFrameEncode *iface)
+{
+ BmpFrameEncode *This = (BmpFrameEncode*)iface;
+ BITMAPFILEHEADER bfh;
+ BITMAPV5HEADER bih;
+ UINT info_size;
+ LARGE_INTEGER pos;
+ ULONG byteswritten;
+ HRESULT hr;
+
+ TRACE("(%p)\n", iface);
+
+ if (!This->bits || This->committed || This->height != This->lineswritten)
+ return WINCODEC_ERR_WRONGSTATE;
+
+ bfh.bfType = 0x4d42; /* "BM" */
+ bfh.bfReserved1 = 0;
+ bfh.bfReserved2 = 0;
+
+ bih.bV5Size = info_size = sizeof(BITMAPINFOHEADER);
+ bih.bV5Width = This->width;
+ bih.bV5Height = -This->height; /* top-down bitmap */
+ bih.bV5Planes = 1;
+ bih.bV5BitCount = This->format->bpp;
+ bih.bV5Compression = This->format->compression;
+ bih.bV5SizeImage = This->stride*This->height;
+ bih.bV5XPelsPerMeter = (This->xres+0.0127) / 0.0254;
+ bih.bV5YPelsPerMeter = (This->yres+0.0127) / 0.0254;
+ bih.bV5ClrUsed = 0;
+ bih.bV5ClrImportant = 0;
+
+ bfh.bfSize = sizeof(BITMAPFILEHEADER) + info_size + bih.bV5SizeImage;
+ bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + info_size;
+
+ pos.QuadPart = 0;
+ hr = IStream_Seek(This->stream, pos, STREAM_SEEK_SET, NULL);\
+ if (FAILED(hr)) return hr;
+
+ hr = IStream_Write(This->stream, &bfh, sizeof(BITMAPFILEHEADER), &byteswritten);
+ if (FAILED(hr)) return hr;
+ if (byteswritten != sizeof(BITMAPFILEHEADER)) return E_FAIL;
+
+ hr = IStream_Write(This->stream, &bih, info_size, &byteswritten);
+ if (FAILED(hr)) return hr;
+ if (byteswritten != info_size) return E_FAIL;
+
+ hr = IStream_Write(This->stream, This->bits, bih.bV5SizeImage, &byteswritten);
+ if (FAILED(hr)) return hr;
+ if (byteswritten != bih.bV5SizeImage) return E_FAIL;
+
+ This->committed = TRUE;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpFrameEncode_GetMetadataQueryWriter(IWICBitmapFrameEncode *iface,
+ IWICMetadataQueryWriter **ppIMetadataQueryWriter)
+{
+ FIXME("(%p, %p): stub\n", iface, ppIMetadataQueryWriter);
+ return E_NOTIMPL;
+}
+
+static const IWICBitmapFrameEncodeVtbl BmpFrameEncode_Vtbl = {
+ BmpFrameEncode_QueryInterface,
+ BmpFrameEncode_AddRef,
+ BmpFrameEncode_Release,
+ BmpFrameEncode_Initialize,
+ BmpFrameEncode_SetSize,
+ BmpFrameEncode_SetResolution,
+ BmpFrameEncode_SetPixelFormat,
+ BmpFrameEncode_SetColorContexts,
+ BmpFrameEncode_SetPalette,
+ BmpFrameEncode_SetThumbnail,
+ BmpFrameEncode_WritePixels,
+ BmpFrameEncode_WriteSource,
+ BmpFrameEncode_Commit,
+ BmpFrameEncode_GetMetadataQueryWriter
+};
+
+typedef struct BmpEncoder {
+ const IWICBitmapEncoderVtbl *lpVtbl;
+ LONG ref;
+ IStream *stream;
+ IWICBitmapFrameEncode *frame;
+} BmpEncoder;
+
+static HRESULT WINAPI BmpEncoder_QueryInterface(IWICBitmapEncoder *iface, REFIID iid,
+ void **ppv)
+{
+ BmpEncoder *This = (BmpEncoder*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IWICBitmapEncoder, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI BmpEncoder_AddRef(IWICBitmapEncoder *iface)
+{
+ BmpEncoder *This = (BmpEncoder*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI BmpEncoder_Release(IWICBitmapEncoder *iface)
+{
+ BmpEncoder *This = (BmpEncoder*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ if (This->stream) IStream_Release(This->stream);
+ if (This->frame) IWICBitmapFrameEncode_Release(This->frame);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI BmpEncoder_Initialize(IWICBitmapEncoder *iface,
+ IStream *pIStream, WICBitmapEncoderCacheOption cacheOption)
+{
+ BmpEncoder *This = (BmpEncoder*)iface;
+
+ TRACE("(%p,%p,%u)\n", iface, pIStream, cacheOption);
+
+ IStream_AddRef(pIStream);
+ This->stream = pIStream;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpEncoder_GetContainerFormat(IWICBitmapEncoder *iface,
+ GUID *pguidContainerFormat)
+{
+ FIXME("(%p,%s): stub\n", iface, debugstr_guid(pguidContainerFormat));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BmpEncoder_GetEncoderInfo(IWICBitmapEncoder *iface,
+ IWICBitmapEncoderInfo **ppIEncoderInfo)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIEncoderInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BmpEncoder_SetColorContexts(IWICBitmapEncoder *iface,
+ UINT cCount, IWICColorContext **ppIColorContext)
+{
+ FIXME("(%p,%u,%p): stub\n", iface, cCount, ppIColorContext);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BmpEncoder_SetPalette(IWICBitmapEncoder *iface, IWICPalette *pIPalette)
+{
+ TRACE("(%p,%p)\n", iface, pIPalette);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI BmpEncoder_SetThumbnail(IWICBitmapEncoder *iface, IWICBitmapSource *pIThumbnail)
+{
+ TRACE("(%p,%p)\n", iface, pIThumbnail);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI BmpEncoder_SetPreview(IWICBitmapEncoder *iface, IWICBitmapSource *pIPreview)
+{
+ TRACE("(%p,%p)\n", iface, pIPreview);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI BmpEncoder_CreateNewFrame(IWICBitmapEncoder *iface,
+ IWICBitmapFrameEncode **ppIFrameEncode, IPropertyBag2 **ppIEncoderOptions)
+{
+ BmpEncoder *This = (BmpEncoder*)iface;
+ BmpFrameEncode *encode;
+ HRESULT hr;
+
+ TRACE("(%p,%p,%p)\n", iface, ppIFrameEncode, ppIEncoderOptions);
+
+ if (This->frame) return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+
+ if (!This->stream) return WINCODEC_ERR_NOTINITIALIZED;
+
+ hr = CreatePropertyBag2(ppIEncoderOptions);
+ if (FAILED(hr)) return hr;
+
+ encode = HeapAlloc(GetProcessHeap(), 0, sizeof(BmpFrameEncode));
+ if (!encode)
+ {
+ IPropertyBag2_Release(*ppIEncoderOptions);
+ *ppIEncoderOptions = NULL;
+ return E_OUTOFMEMORY;
+ }
+ encode->lpVtbl = &BmpFrameEncode_Vtbl;
+ encode->ref = 2;
+ IStream_AddRef(This->stream);
+ encode->stream = This->stream;
+ encode->initialized = FALSE;
+ encode->width = 0;
+ encode->height = 0;
+ encode->bits = NULL;
+ encode->format = NULL;
+ encode->xres = 0.0;
+ encode->yres = 0.0;
+ encode->lineswritten = 0;
+ encode->committed = FALSE;
+
+ *ppIFrameEncode = (IWICBitmapFrameEncode*)encode;
+ This->frame = (IWICBitmapFrameEncode*)encode;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpEncoder_Commit(IWICBitmapEncoder *iface)
+{
+ BmpEncoder *This = (BmpEncoder*)iface;
+ BmpFrameEncode *frame = (BmpFrameEncode*)This->frame;
+ TRACE("(%p)\n", iface);
+
+ if (!frame || !frame->committed) return WINCODEC_ERR_WRONGSTATE;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI BmpEncoder_GetMetadataQueryWriter(IWICBitmapEncoder *iface,
+ IWICMetadataQueryWriter **ppIMetadataQueryWriter)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryWriter);
+ return E_NOTIMPL;
+}
+
+static const IWICBitmapEncoderVtbl BmpEncoder_Vtbl = {
+ BmpEncoder_QueryInterface,
+ BmpEncoder_AddRef,
+ BmpEncoder_Release,
+ BmpEncoder_Initialize,
+ BmpEncoder_GetContainerFormat,
+ BmpEncoder_GetEncoderInfo,
+ BmpEncoder_SetColorContexts,
+ BmpEncoder_SetPalette,
+ BmpEncoder_SetThumbnail,
+ BmpEncoder_SetPreview,
+ BmpEncoder_CreateNewFrame,
+ BmpEncoder_Commit,
+ BmpEncoder_GetMetadataQueryWriter
+};
+
+HRESULT BmpEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
+{
+ BmpEncoder *This;
+ HRESULT ret;
+
+ TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv);
+
+ *ppv = NULL;
+
+ if (pUnkOuter) return CLASS_E_NOAGGREGATION;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(BmpEncoder));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->lpVtbl = &BmpEncoder_Vtbl;
+ This->ref = 1;
+ This->stream = NULL;
+ This->frame = NULL;
+
+ ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv);
+ IUnknown_Release((IUnknown*)This);
+
+ return ret;
+}
diff --git a/reactos/dll/win32/windowscodecs/clsfactory.c b/reactos/dll/win32/windowscodecs/clsfactory.c
new file mode 100644
index 00000000000..af3ce513a8c
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/clsfactory.c
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "objbase.h"
+#include "ocidl.h"
+#include "initguid.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+typedef struct {
+ REFCLSID classid;
+ HRESULT (*constructor)(IUnknown*,REFIID,void**);
+} classinfo;
+
+static classinfo wic_classes[] = {
+ {&CLSID_WICImagingFactory, ImagingFactory_CreateInstance},
+ {&CLSID_WICBmpDecoder, BmpDecoder_CreateInstance},
+ {&CLSID_WICPngDecoder, PngDecoder_CreateInstance},
+ {&CLSID_WICBmpEncoder, BmpEncoder_CreateInstance},
+ {&CLSID_WICGifDecoder, GifDecoder_CreateInstance},
+ {&CLSID_WICIcoDecoder, IcoDecoder_CreateInstance},
+ {&CLSID_WICJpegDecoder, JpegDecoder_CreateInstance},
+ {&CLSID_WICDefaultFormatConverter, FormatConverter_CreateInstance},
+ {0}};
+
+typedef struct {
+ const IClassFactoryVtbl *lpIClassFactoryVtbl;
+ LONG ref;
+ classinfo *info;
+} ClassFactoryImpl;
+
+static HRESULT WINAPI ClassFactoryImpl_QueryInterface(IClassFactory *iface,
+ REFIID iid, void **ppv)
+{
+ ClassFactoryImpl *This = (ClassFactoryImpl*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IClassFactory, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI ClassFactoryImpl_AddRef(IClassFactory *iface)
+{
+ ClassFactoryImpl *This = (ClassFactoryImpl*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI ClassFactoryImpl_Release(IClassFactory *iface)
+{
+ ClassFactoryImpl *This = (ClassFactoryImpl*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ HeapFree(GetProcessHeap(), 0, This);
+
+ return ref;
+}
+
+static HRESULT WINAPI ClassFactoryImpl_CreateInstance(IClassFactory *iface,
+ IUnknown *pUnkOuter, REFIID riid, void **ppv)
+{
+ ClassFactoryImpl *This = (ClassFactoryImpl*)iface;
+
+ return This->info->constructor(pUnkOuter, riid, ppv);
+}
+
+static HRESULT WINAPI ClassFactoryImpl_LockServer(IClassFactory *iface, BOOL lock)
+{
+ TRACE("(%p, %i): stub\n", iface, lock);
+ return E_NOTIMPL;
+}
+
+static const IClassFactoryVtbl ClassFactoryImpl_Vtbl = {
+ ClassFactoryImpl_QueryInterface,
+ ClassFactoryImpl_AddRef,
+ ClassFactoryImpl_Release,
+ ClassFactoryImpl_CreateInstance,
+ ClassFactoryImpl_LockServer
+};
+
+static HRESULT ClassFactoryImpl_Constructor(classinfo *info, REFIID riid, LPVOID *ppv)
+{
+ ClassFactoryImpl *This;
+ HRESULT ret;
+
+ *ppv = NULL;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(ClassFactoryImpl));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->lpIClassFactoryVtbl = &ClassFactoryImpl_Vtbl;
+ This->ref = 1;
+ This->info = info;
+
+ ret = IClassFactory_QueryInterface((IClassFactory*)This, riid, ppv);
+ IClassFactory_Release((IClassFactory*)This);
+
+ return ret;
+}
+
+HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
+{
+ HRESULT ret;
+ classinfo *info=NULL;
+ int i;
+
+ TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
+
+ if (!rclsid || !iid || !ppv)
+ return E_INVALIDARG;
+
+ *ppv = NULL;
+
+ for (i=0; wic_classes[i].classid; i++)
+ {
+ if (IsEqualCLSID(wic_classes[i].classid, rclsid))
+ {
+ info = &wic_classes[i];
+ break;
+ }
+ }
+
+ if (info)
+ ret = ClassFactoryImpl_Constructor(info, iid, ppv);
+ else
+ ret = CLASS_E_CLASSNOTAVAILABLE;
+
+ TRACE("<-- %08X\n", ret);
+ return ret;
+}
diff --git a/reactos/dll/win32/windowscodecs/converter.c b/reactos/dll/win32/windowscodecs/converter.c
new file mode 100644
index 00000000000..15c7b0f380a
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/converter.c
@@ -0,0 +1,938 @@
+/*
+ * Copyright 2009 Vincent Povirk
+ *
+ * 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
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+struct FormatConverter;
+
+enum pixelformat {
+ format_1bppIndexed,
+ format_2bppIndexed,
+ format_4bppIndexed,
+ format_8bppIndexed,
+ format_BlackWhite,
+ format_2bppGray,
+ format_4bppGray,
+ format_8bppGray,
+ format_16bppGray,
+ format_16bppBGR555,
+ format_16bppBGR565,
+ format_24bppBGR,
+ format_32bppBGR,
+ format_32bppBGRA,
+ format_48bppRGB,
+ format_64bppRGBA,
+};
+
+typedef HRESULT (*copyfunc)(struct FormatConverter *This, const WICRect *prc,
+ UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer, enum pixelformat source_format);
+
+struct pixelformatinfo {
+ enum pixelformat format;
+ const WICPixelFormatGUID *guid;
+ copyfunc copy_function;
+};
+
+typedef struct FormatConverter {
+ const IWICFormatConverterVtbl *lpVtbl;
+ LONG ref;
+ IWICBitmapSource *source;
+ const struct pixelformatinfo *dst_format, *src_format;
+ WICBitmapDitherType dither;
+ double alpha_threshold;
+ WICBitmapPaletteType palette_type;
+} FormatConverter;
+
+static void make_grayscale_palette(WICColor *colors, UINT num_colors)
+{
+ int i, v;
+ for (i=0; isource, palette);
+ if (SUCCEEDED(res))
+ res = IWICPalette_GetColors(palette, 2, colors, &actualcolors);
+
+ IWICPalette_Release(palette);
+
+ if (FAILED(res)) return res;
+ }
+ else
+ {
+ colors[0] = 0xff000000;
+ colors[1] = 0xffffffff;
+ }
+
+ srcstride = (prc->Width+7)/8;
+ srcdatasize = srcstride * prc->Height;
+
+ srcdata = HeapAlloc(GetProcessHeap(), 0, srcdatasize);
+ if (!srcdata) return E_OUTOFMEMORY;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata);
+
+ if (SUCCEEDED(res))
+ {
+ srcrow = srcdata;
+ dstrow = pbBuffer;
+ for (y=0; yHeight; y++) {
+ srcbyte=(const BYTE*)srcrow;
+ dstpixel=(DWORD*)dstrow;
+ for (x=0; xWidth; x+=8) {
+ BYTE srcval;
+ srcval=*srcbyte++;
+ *dstpixel++ = colors[srcval>>7&1];
+ if (x+1 < prc->Width) *dstpixel++ = colors[srcval>>6&1];
+ if (x+2 < prc->Width) *dstpixel++ = colors[srcval>>5&1];
+ if (x+3 < prc->Width) *dstpixel++ = colors[srcval>>4&1];
+ if (x+4 < prc->Width) *dstpixel++ = colors[srcval>>3&1];
+ if (x+5 < prc->Width) *dstpixel++ = colors[srcval>>2&1];
+ if (x+6 < prc->Width) *dstpixel++ = colors[srcval>>1&1];
+ if (x+7 < prc->Width) *dstpixel++ = colors[srcval&1];
+ }
+ srcrow += srcstride;
+ dstrow += cbStride;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, srcdata);
+
+ return res;
+ }
+ return S_OK;
+ case format_2bppIndexed:
+ case format_2bppGray:
+ if (prc)
+ {
+ HRESULT res;
+ UINT x, y;
+ BYTE *srcdata;
+ UINT srcstride, srcdatasize;
+ const BYTE *srcrow;
+ const BYTE *srcbyte;
+ BYTE *dstrow;
+ DWORD *dstpixel;
+ WICColor colors[4];
+ IWICPalette *palette;
+ UINT actualcolors;
+
+ if (source_format == format_2bppIndexed)
+ {
+ res = PaletteImpl_Create(&palette);
+ if (FAILED(res)) return res;
+
+ res = IWICBitmapSource_CopyPalette(This->source, palette);
+ if (SUCCEEDED(res))
+ res = IWICPalette_GetColors(palette, 4, colors, &actualcolors);
+
+ IWICPalette_Release(palette);
+
+ if (FAILED(res)) return res;
+ }
+ else
+ make_grayscale_palette(colors, 4);
+
+ srcstride = (prc->Width+3)/4;
+ srcdatasize = srcstride * prc->Height;
+
+ srcdata = HeapAlloc(GetProcessHeap(), 0, srcdatasize);
+ if (!srcdata) return E_OUTOFMEMORY;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata);
+
+ if (SUCCEEDED(res))
+ {
+ srcrow = srcdata;
+ dstrow = pbBuffer;
+ for (y=0; yHeight; y++) {
+ srcbyte=(const BYTE*)srcrow;
+ dstpixel=(DWORD*)dstrow;
+ for (x=0; xWidth; x+=4) {
+ BYTE srcval;
+ srcval=*srcbyte++;
+ *dstpixel++ = colors[srcval>>6];
+ if (x+1 < prc->Width) *dstpixel++ = colors[srcval>>4&0x3];
+ if (x+2 < prc->Width) *dstpixel++ = colors[srcval>>2&0x3];
+ if (x+1 < prc->Width) *dstpixel++ = colors[srcval&0x3];
+ }
+ srcrow += srcstride;
+ dstrow += cbStride;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, srcdata);
+
+ return res;
+ }
+ return S_OK;
+ case format_4bppIndexed:
+ case format_4bppGray:
+ if (prc)
+ {
+ HRESULT res;
+ UINT x, y;
+ BYTE *srcdata;
+ UINT srcstride, srcdatasize;
+ const BYTE *srcrow;
+ const BYTE *srcbyte;
+ BYTE *dstrow;
+ DWORD *dstpixel;
+ WICColor colors[16];
+ IWICPalette *palette;
+ UINT actualcolors;
+
+ if (source_format == format_4bppIndexed)
+ {
+ res = PaletteImpl_Create(&palette);
+ if (FAILED(res)) return res;
+
+ res = IWICBitmapSource_CopyPalette(This->source, palette);
+ if (SUCCEEDED(res))
+ res = IWICPalette_GetColors(palette, 16, colors, &actualcolors);
+
+ IWICPalette_Release(palette);
+
+ if (FAILED(res)) return res;
+ }
+ else
+ make_grayscale_palette(colors, 16);
+
+ srcstride = (prc->Width+1)/2;
+ srcdatasize = srcstride * prc->Height;
+
+ srcdata = HeapAlloc(GetProcessHeap(), 0, srcdatasize);
+ if (!srcdata) return E_OUTOFMEMORY;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata);
+
+ if (SUCCEEDED(res))
+ {
+ srcrow = srcdata;
+ dstrow = pbBuffer;
+ for (y=0; yHeight; y++) {
+ srcbyte=(const BYTE*)srcrow;
+ dstpixel=(DWORD*)dstrow;
+ for (x=0; xWidth; x+=2) {
+ BYTE srcval;
+ srcval=*srcbyte++;
+ *dstpixel++ = colors[srcval>>4];
+ if (x+1 < prc->Width) *dstpixel++ = colors[srcval&0xf];
+ }
+ srcrow += srcstride;
+ dstrow += cbStride;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, srcdata);
+
+ return res;
+ }
+ return S_OK;
+ case format_8bppGray:
+ if (prc)
+ {
+ HRESULT res;
+ UINT x, y;
+ BYTE *srcdata;
+ UINT srcstride, srcdatasize;
+ const BYTE *srcrow;
+ const BYTE *srcbyte;
+ BYTE *dstrow;
+ DWORD *dstpixel;
+
+ srcstride = prc->Width;
+ srcdatasize = srcstride * prc->Height;
+
+ srcdata = HeapAlloc(GetProcessHeap(), 0, srcdatasize);
+ if (!srcdata) return E_OUTOFMEMORY;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata);
+
+ if (SUCCEEDED(res))
+ {
+ srcrow = srcdata;
+ dstrow = pbBuffer;
+ for (y=0; yHeight; y++) {
+ srcbyte=(const BYTE*)srcrow;
+ dstpixel=(DWORD*)dstrow;
+ for (x=0; xWidth; x++)
+ {
+ *dstpixel++ = 0xff000000|(*srcbyte<<16)|(*srcbyte<<8)|*srcbyte;
+ srcbyte++;
+ }
+ srcrow += srcstride;
+ dstrow += cbStride;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, srcdata);
+
+ return res;
+ }
+ return S_OK;
+ case format_8bppIndexed:
+ if (prc)
+ {
+ HRESULT res;
+ UINT x, y;
+ BYTE *srcdata;
+ UINT srcstride, srcdatasize;
+ const BYTE *srcrow;
+ const BYTE *srcbyte;
+ BYTE *dstrow;
+ DWORD *dstpixel;
+ WICColor colors[256];
+ IWICPalette *palette;
+ UINT actualcolors;
+
+ res = PaletteImpl_Create(&palette);
+ if (FAILED(res)) return res;
+
+ res = IWICBitmapSource_CopyPalette(This->source, palette);
+ if (SUCCEEDED(res))
+ res = IWICPalette_GetColors(palette, 256, colors, &actualcolors);
+
+ IWICPalette_Release(palette);
+
+ if (FAILED(res)) return res;
+
+ srcstride = prc->Width;
+ srcdatasize = srcstride * prc->Height;
+
+ srcdata = HeapAlloc(GetProcessHeap(), 0, srcdatasize);
+ if (!srcdata) return E_OUTOFMEMORY;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata);
+
+ if (SUCCEEDED(res))
+ {
+ srcrow = srcdata;
+ dstrow = pbBuffer;
+ for (y=0; yHeight; y++) {
+ srcbyte=(const BYTE*)srcrow;
+ dstpixel=(DWORD*)dstrow;
+ for (x=0; xWidth; x++)
+ *dstpixel++ = colors[*srcbyte++];
+ srcrow += srcstride;
+ dstrow += cbStride;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, srcdata);
+
+ return res;
+ }
+ return S_OK;
+ case format_16bppGray:
+ if (prc)
+ {
+ HRESULT res;
+ UINT x, y;
+ BYTE *srcdata;
+ UINT srcstride, srcdatasize;
+ const BYTE *srcrow;
+ const BYTE *srcbyte;
+ BYTE *dstrow;
+ DWORD *dstpixel;
+
+ srcstride = prc->Width * 2;
+ srcdatasize = srcstride * prc->Height;
+
+ srcdata = HeapAlloc(GetProcessHeap(), 0, srcdatasize);
+ if (!srcdata) return E_OUTOFMEMORY;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata);
+
+ if (SUCCEEDED(res))
+ {
+ srcrow = srcdata;
+ dstrow = pbBuffer;
+ for (y=0; yHeight; y++) {
+ srcbyte=(const BYTE*)srcrow;
+ dstpixel=(DWORD*)dstrow;
+ for (x=0; xWidth; x++)
+ {
+ *dstpixel++ = 0xff000000|(*srcbyte<<16)|(*srcbyte<<8)|*srcbyte;
+ srcbyte+=2;
+ }
+ srcrow += srcstride;
+ dstrow += cbStride;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, srcdata);
+
+ return res;
+ }
+ return S_OK;
+ case format_16bppBGR555:
+ if (prc)
+ {
+ HRESULT res;
+ UINT x, y;
+ BYTE *srcdata;
+ UINT srcstride, srcdatasize;
+ const BYTE *srcrow;
+ const WORD *srcpixel;
+ BYTE *dstrow;
+ DWORD *dstpixel;
+
+ srcstride = 2 * prc->Width;
+ srcdatasize = srcstride * prc->Height;
+
+ srcdata = HeapAlloc(GetProcessHeap(), 0, srcdatasize);
+ if (!srcdata) return E_OUTOFMEMORY;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata);
+
+ if (SUCCEEDED(res))
+ {
+ srcrow = srcdata;
+ dstrow = pbBuffer;
+ for (y=0; yHeight; y++) {
+ srcpixel=(const WORD*)srcrow;
+ dstpixel=(DWORD*)dstrow;
+ for (x=0; xWidth; x++) {
+ WORD srcval;
+ srcval=*srcpixel++;
+ *dstpixel++=0xff000000 | /* constant 255 alpha */
+ ((srcval << 9) & 0xf80000) | /* r */
+ ((srcval << 4) & 0x070000) | /* r - 3 bits */
+ ((srcval << 6) & 0x00f800) | /* g */
+ ((srcval << 1) & 0x000700) | /* g - 3 bits */
+ ((srcval << 3) & 0x0000f8) | /* b */
+ ((srcval >> 2) & 0x000007); /* b - 3 bits */
+ }
+ srcrow += srcstride;
+ dstrow += cbStride;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, srcdata);
+
+ return res;
+ }
+ return S_OK;
+ case format_16bppBGR565:
+ if (prc)
+ {
+ HRESULT res;
+ UINT x, y;
+ BYTE *srcdata;
+ UINT srcstride, srcdatasize;
+ const BYTE *srcrow;
+ const WORD *srcpixel;
+ BYTE *dstrow;
+ DWORD *dstpixel;
+
+ srcstride = 2 * prc->Width;
+ srcdatasize = srcstride * prc->Height;
+
+ srcdata = HeapAlloc(GetProcessHeap(), 0, srcdatasize);
+ if (!srcdata) return E_OUTOFMEMORY;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata);
+
+ if (SUCCEEDED(res))
+ {
+ srcrow = srcdata;
+ dstrow = pbBuffer;
+ for (y=0; yHeight; y++) {
+ srcpixel=(const WORD*)srcrow;
+ dstpixel=(DWORD*)dstrow;
+ for (x=0; xWidth; x++) {
+ WORD srcval;
+ srcval=*srcpixel++;
+ *dstpixel++=0xff000000 | /* constant 255 alpha */
+ ((srcval << 8) & 0xf80000) | /* r */
+ ((srcval << 3) & 0x070000) | /* r - 3 bits */
+ ((srcval << 5) & 0x00fc00) | /* g */
+ ((srcval >> 1) & 0x000300) | /* g - 2 bits */
+ ((srcval << 3) & 0x0000f8) | /* b */
+ ((srcval >> 2) & 0x000007); /* b - 3 bits */
+ }
+ srcrow += srcstride;
+ dstrow += cbStride;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, srcdata);
+
+ return res;
+ }
+ return S_OK;
+ case format_24bppBGR:
+ if (prc)
+ {
+ HRESULT res;
+ UINT x, y;
+ BYTE *srcdata;
+ UINT srcstride, srcdatasize;
+ const BYTE *srcrow;
+ const BYTE *srcpixel;
+ BYTE *dstrow;
+ BYTE *dstpixel;
+
+ srcstride = 3 * prc->Width;
+ srcdatasize = srcstride * prc->Height;
+
+ srcdata = HeapAlloc(GetProcessHeap(), 0, srcdatasize);
+ if (!srcdata) return E_OUTOFMEMORY;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata);
+
+ if (SUCCEEDED(res))
+ {
+ srcrow = srcdata;
+ dstrow = pbBuffer;
+ for (y=0; yHeight; y++) {
+ srcpixel=srcrow;
+ dstpixel=dstrow;
+ for (x=0; xWidth; x++) {
+ *dstpixel++=*srcpixel++; /* blue */
+ *dstpixel++=*srcpixel++; /* green */
+ *dstpixel++=*srcpixel++; /* red */
+ *dstpixel++=255; /* alpha */
+ }
+ srcrow += srcstride;
+ dstrow += cbStride;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, srcdata);
+
+ return res;
+ }
+ return S_OK;
+ case format_32bppBGR:
+ if (prc)
+ {
+ HRESULT res;
+ UINT x, y;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, cbStride, cbBufferSize, pbBuffer);
+ if (FAILED(res)) return res;
+
+ /* set all alpha values to 255 */
+ for (y=0; yHeight; y++)
+ for (x=0; xWidth; x++)
+ pbBuffer[cbStride*y+4*x+3] = 0xff;
+ }
+ return S_OK;
+ case format_32bppBGRA:
+ if (prc)
+ return IWICBitmapSource_CopyPixels(This->source, prc, cbStride, cbBufferSize, pbBuffer);
+ return S_OK;
+ case format_48bppRGB:
+ if (prc)
+ {
+ HRESULT res;
+ UINT x, y;
+ BYTE *srcdata;
+ UINT srcstride, srcdatasize;
+ const BYTE *srcrow;
+ const BYTE *srcpixel;
+ BYTE *dstrow;
+ DWORD *dstpixel;
+
+ srcstride = 6 * prc->Width;
+ srcdatasize = srcstride * prc->Height;
+
+ srcdata = HeapAlloc(GetProcessHeap(), 0, srcdatasize);
+ if (!srcdata) return E_OUTOFMEMORY;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata);
+
+ if (SUCCEEDED(res))
+ {
+ srcrow = srcdata;
+ dstrow = pbBuffer;
+ for (y=0; yHeight; y++) {
+ srcpixel=srcrow;
+ dstpixel=(DWORD*)dstrow;
+ for (x=0; xWidth; x++) {
+ BYTE red, green, blue;
+ red = *srcpixel++; srcpixel++;
+ green = *srcpixel++; srcpixel++;
+ blue = *srcpixel++; srcpixel++;
+ *dstpixel++=0xff000000|red<<16|green<<8|blue;
+ }
+ srcrow += srcstride;
+ dstrow += cbStride;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, srcdata);
+
+ return res;
+ }
+ return S_OK;
+ case format_64bppRGBA:
+ if (prc)
+ {
+ HRESULT res;
+ UINT x, y;
+ BYTE *srcdata;
+ UINT srcstride, srcdatasize;
+ const BYTE *srcrow;
+ const BYTE *srcpixel;
+ BYTE *dstrow;
+ DWORD *dstpixel;
+
+ srcstride = 8 * prc->Width;
+ srcdatasize = srcstride * prc->Height;
+
+ srcdata = HeapAlloc(GetProcessHeap(), 0, srcdatasize);
+ if (!srcdata) return E_OUTOFMEMORY;
+
+ res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata);
+
+ if (SUCCEEDED(res))
+ {
+ srcrow = srcdata;
+ dstrow = pbBuffer;
+ for (y=0; yHeight; y++) {
+ srcpixel=srcrow;
+ dstpixel=(DWORD*)dstrow;
+ for (x=0; xWidth; x++) {
+ BYTE red, green, blue, alpha;
+ red = *srcpixel++; srcpixel++;
+ green = *srcpixel++; srcpixel++;
+ blue = *srcpixel++; srcpixel++;
+ alpha = *srcpixel++; srcpixel++;
+ *dstpixel++=alpha<<24|red<<16|green<<8|blue;
+ }
+ srcrow += srcstride;
+ dstrow += cbStride;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, srcdata);
+
+ return res;
+ }
+ return S_OK;
+ default:
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+ }
+}
+
+static HRESULT copypixels_to_32bppBGR(struct FormatConverter *This, const WICRect *prc,
+ UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer, enum pixelformat source_format)
+{
+ switch (source_format)
+ {
+ case format_32bppBGR:
+ case format_32bppBGRA:
+ if (prc)
+ return IWICBitmapSource_CopyPixels(This->source, prc, cbStride, cbBufferSize, pbBuffer);
+ return S_OK;
+ default:
+ return copypixels_to_32bppBGRA(This, prc, cbStride, cbBufferSize, pbBuffer, source_format);
+ }
+}
+
+static const struct pixelformatinfo supported_formats[] = {
+ {format_1bppIndexed, &GUID_WICPixelFormat1bppIndexed, NULL},
+ {format_2bppIndexed, &GUID_WICPixelFormat2bppIndexed, NULL},
+ {format_4bppIndexed, &GUID_WICPixelFormat4bppIndexed, NULL},
+ {format_8bppIndexed, &GUID_WICPixelFormat8bppIndexed, NULL},
+ {format_BlackWhite, &GUID_WICPixelFormatBlackWhite, NULL},
+ {format_2bppGray, &GUID_WICPixelFormat2bppGray, NULL},
+ {format_4bppGray, &GUID_WICPixelFormat4bppGray, NULL},
+ {format_8bppGray, &GUID_WICPixelFormat8bppGray, NULL},
+ {format_16bppGray, &GUID_WICPixelFormat16bppGray, NULL},
+ {format_16bppBGR555, &GUID_WICPixelFormat16bppBGR555, NULL},
+ {format_16bppBGR565, &GUID_WICPixelFormat16bppBGR565, NULL},
+ {format_24bppBGR, &GUID_WICPixelFormat24bppBGR, NULL},
+ {format_32bppBGR, &GUID_WICPixelFormat32bppBGR, copypixels_to_32bppBGR},
+ {format_32bppBGRA, &GUID_WICPixelFormat32bppBGRA, copypixels_to_32bppBGRA},
+ {format_48bppRGB, &GUID_WICPixelFormat48bppRGB, NULL},
+ {format_64bppRGBA, &GUID_WICPixelFormat64bppRGBA, NULL},
+ {0}
+};
+
+static const struct pixelformatinfo *get_formatinfo(const WICPixelFormatGUID *format)
+{
+ UINT i;
+
+ for (i=0; supported_formats[i].guid; i++)
+ if (IsEqualGUID(supported_formats[i].guid, format)) return &supported_formats[i];
+
+ return NULL;
+}
+
+static HRESULT WINAPI FormatConverter_QueryInterface(IWICFormatConverter *iface, REFIID iid,
+ void **ppv)
+{
+ FormatConverter *This = (FormatConverter*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IWICBitmapSource, iid) ||
+ IsEqualIID(&IID_IWICFormatConverter, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI FormatConverter_AddRef(IWICFormatConverter *iface)
+{
+ FormatConverter *This = (FormatConverter*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI FormatConverter_Release(IWICFormatConverter *iface)
+{
+ FormatConverter *This = (FormatConverter*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ if (This->source) IWICBitmapSource_Release(This->source);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI FormatConverter_GetSize(IWICFormatConverter *iface,
+ UINT *puiWidth, UINT *puiHeight)
+{
+ FormatConverter *This = (FormatConverter*)iface;
+
+ TRACE("(%p,%p,%p)\n", iface, puiWidth, puiHeight);
+
+ if (This->source)
+ return IWICBitmapSource_GetSize(This->source, puiWidth, puiHeight);
+ else
+ return WINCODEC_ERR_NOTINITIALIZED;
+}
+
+static HRESULT WINAPI FormatConverter_GetPixelFormat(IWICFormatConverter *iface,
+ WICPixelFormatGUID *pPixelFormat)
+{
+ FormatConverter *This = (FormatConverter*)iface;
+
+ TRACE("(%p,%p): stub\n", iface, pPixelFormat);
+
+ if (This->source)
+ memcpy(pPixelFormat, This->dst_format->guid, sizeof(GUID));
+ else
+ return WINCODEC_ERR_NOTINITIALIZED;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI FormatConverter_GetResolution(IWICFormatConverter *iface,
+ double *pDpiX, double *pDpiY)
+{
+ FormatConverter *This = (FormatConverter*)iface;
+
+ TRACE("(%p,%p,%p): stub\n", iface, pDpiX, pDpiY);
+
+ if (This->source)
+ return IWICBitmapSource_GetResolution(This->source, pDpiX, pDpiY);
+ else
+ return WINCODEC_ERR_NOTINITIALIZED;
+}
+
+static HRESULT WINAPI FormatConverter_CopyPalette(IWICFormatConverter *iface,
+ IWICPalette *pIPalette)
+{
+ FIXME("(%p,%p): stub\n", iface, pIPalette);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI FormatConverter_CopyPixels(IWICFormatConverter *iface,
+ const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
+{
+ FormatConverter *This = (FormatConverter*)iface;
+ TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
+
+ if (This->source)
+ return This->dst_format->copy_function(This, prc, cbStride, cbBufferSize,
+ pbBuffer, This->src_format->format);
+ else
+ return WINCODEC_ERR_NOTINITIALIZED;
+}
+
+static HRESULT WINAPI FormatConverter_Initialize(IWICFormatConverter *iface,
+ IWICBitmapSource *pISource, REFWICPixelFormatGUID dstFormat, WICBitmapDitherType dither,
+ IWICPalette *pIPalette, double alphaThresholdPercent, WICBitmapPaletteType paletteTranslate)
+{
+ FormatConverter *This = (FormatConverter*)iface;
+ const struct pixelformatinfo *srcinfo, *dstinfo;
+ static INT fixme=0;
+ GUID srcFormat;
+ HRESULT res;
+
+ TRACE("(%p,%p,%s,%u,%p,%0.1f,%u)\n", iface, pISource, debugstr_guid(dstFormat),
+ dither, pIPalette, alphaThresholdPercent, paletteTranslate);
+
+ if (pIPalette && !fixme++) FIXME("ignoring palette\n");
+
+ if (This->source) return WINCODEC_ERR_WRONGSTATE;
+
+ res = IWICBitmapSource_GetPixelFormat(pISource, &srcFormat);
+ if (FAILED(res)) return res;
+
+ srcinfo = get_formatinfo(&srcFormat);
+ if (!srcinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT;
+
+ dstinfo = get_formatinfo(dstFormat);
+ if (!dstinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT;
+
+ if (dstinfo->copy_function)
+ {
+ IWICBitmapSource_AddRef(pISource);
+ This->source = pISource;
+ This->src_format = srcinfo;
+ This->dst_format = dstinfo;
+ This->dither = dither;
+ This->alpha_threshold = alphaThresholdPercent;
+ This->palette_type = paletteTranslate;
+ }
+ else
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI FormatConverter_CanConvert(IWICFormatConverter *iface,
+ REFWICPixelFormatGUID srcPixelFormat, REFWICPixelFormatGUID dstPixelFormat,
+ BOOL *pfCanConvert)
+{
+ FormatConverter *This = (FormatConverter*)iface;
+ const struct pixelformatinfo *srcinfo, *dstinfo;
+
+ TRACE("(%p,%s,%s,%p)\n", iface, debugstr_guid(srcPixelFormat),
+ debugstr_guid(dstPixelFormat), pfCanConvert);
+
+ srcinfo = get_formatinfo(srcPixelFormat);
+ if (!srcinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT;
+
+ dstinfo = get_formatinfo(dstPixelFormat);
+ if (!dstinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT;
+
+ if (dstinfo->copy_function &&
+ SUCCEEDED(dstinfo->copy_function(This, NULL, 0, 0, NULL, dstinfo->format)))
+ *pfCanConvert = TRUE;
+ else
+ *pfCanConvert = FALSE;
+
+ return S_OK;
+}
+
+static const IWICFormatConverterVtbl FormatConverter_Vtbl = {
+ FormatConverter_QueryInterface,
+ FormatConverter_AddRef,
+ FormatConverter_Release,
+ FormatConverter_GetSize,
+ FormatConverter_GetPixelFormat,
+ FormatConverter_GetResolution,
+ FormatConverter_CopyPalette,
+ FormatConverter_CopyPixels,
+ FormatConverter_Initialize,
+ FormatConverter_CanConvert
+};
+
+HRESULT FormatConverter_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
+{
+ FormatConverter *This;
+ HRESULT ret;
+
+ TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv);
+
+ *ppv = NULL;
+
+ if (pUnkOuter) return CLASS_E_NOAGGREGATION;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(FormatConverter));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->lpVtbl = &FormatConverter_Vtbl;
+ This->ref = 1;
+ This->source = NULL;
+
+ ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv);
+ IUnknown_Release((IUnknown*)This);
+
+ return ret;
+}
diff --git a/reactos/dll/win32/windowscodecs/gifformat.c b/reactos/dll/win32/windowscodecs/gifformat.c
new file mode 100644
index 00000000000..0597b1afbe3
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/gifformat.c
@@ -0,0 +1,510 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "ungif.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+typedef struct {
+ const IWICBitmapDecoderVtbl *lpVtbl;
+ LONG ref;
+ BOOL initialized;
+ GifFileType *gif;
+} GifDecoder;
+
+typedef struct {
+ const IWICBitmapFrameDecodeVtbl *lpVtbl;
+ LONG ref;
+ SavedImage *frame;
+ GifDecoder *parent;
+} GifFrameDecode;
+
+static HRESULT WINAPI GifFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid,
+ void **ppv)
+{
+ GifFrameDecode *This = (GifFrameDecode*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IWICBitmapSource, iid) ||
+ IsEqualIID(&IID_IWICBitmapFrameDecode, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI GifFrameDecode_AddRef(IWICBitmapFrameDecode *iface)
+{
+ GifFrameDecode *This = (GifFrameDecode*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI GifFrameDecode_Release(IWICBitmapFrameDecode *iface)
+{
+ GifFrameDecode *This = (GifFrameDecode*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ IUnknown_Release((IUnknown*)This->parent);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI GifFrameDecode_GetSize(IWICBitmapFrameDecode *iface,
+ UINT *puiWidth, UINT *puiHeight)
+{
+ GifFrameDecode *This = (GifFrameDecode*)iface;
+ TRACE("(%p,%p,%p)\n", iface, puiWidth, puiHeight);
+
+ *puiWidth = This->frame->ImageDesc.Width;
+ *puiHeight = This->frame->ImageDesc.Height;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI GifFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface,
+ WICPixelFormatGUID *pPixelFormat)
+{
+ memcpy(pPixelFormat, &GUID_WICPixelFormat8bppIndexed, sizeof(GUID));
+
+ return S_OK;
+}
+
+static HRESULT WINAPI GifFrameDecode_GetResolution(IWICBitmapFrameDecode *iface,
+ double *pDpiX, double *pDpiY)
+{
+ FIXME("(%p,%p,%p): stub\n", iface, pDpiX, pDpiY);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GifFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface,
+ IWICPalette *pIPalette)
+{
+ GifFrameDecode *This = (GifFrameDecode*)iface;
+ WICColor colors[256];
+ ColorMapObject *cm = This->frame->ImageDesc.ColorMap;
+ int i, trans;
+ ExtensionBlock *eb;
+ TRACE("(%p,%p)\n", iface, pIPalette);
+
+ if (!cm) cm = This->parent->gif->SColorMap;
+
+ if (cm->ColorCount > 256)
+ {
+ ERR("GIF contains %i colors???\n", cm->ColorCount);
+ return E_FAIL;
+ }
+
+ for (i = 0; i < cm->ColorCount; i++) {
+ colors[i] = 0xff000000| /* alpha */
+ cm->Colors[i].Red << 16|
+ cm->Colors[i].Green << 8|
+ cm->Colors[i].Blue;
+ }
+
+ /* look for the transparent color extension */
+ for (i = 0; i < This->frame->ExtensionBlockCount; ++i) {
+ eb = This->frame->ExtensionBlocks + i;
+ if (eb->Function == 0xF9 && eb->ByteCount == 4) {
+ if ((eb->Bytes[0] & 1) == 1) {
+ trans = (unsigned char)eb->Bytes[3];
+ colors[trans] &= 0xffffff; /* set alpha to 0 */
+ break;
+ }
+ }
+ }
+
+ IWICPalette_InitializeCustom(pIPalette, colors, cm->ColorCount);
+
+ return S_OK;
+}
+
+static HRESULT copy_interlaced_pixels(const BYTE *srcbuffer,
+ UINT srcwidth, UINT srcheight, INT srcstride, const WICRect *rc,
+ UINT dststride, UINT dstbuffersize, BYTE *dstbuffer)
+{
+ UINT row_offset; /* number of bytes into the source rows where the data starts */
+ const BYTE *src;
+ BYTE *dst;
+ UINT y;
+
+ if (rc->X < 0 || rc->Y < 0 || rc->X+rc->Width > srcwidth || rc->Y+rc->Height > srcheight)
+ return E_INVALIDARG;
+
+ if (dststride < rc->Width)
+ return E_INVALIDARG;
+
+ if ((dststride * rc->Height) > dstbuffersize)
+ return E_INVALIDARG;
+
+ row_offset = rc->X;
+
+ dst = dstbuffer;
+ for (y=rc->Y; y-rc->Y < rc->Height; y++)
+ {
+ if (y%8 == 0)
+ src = srcbuffer + srcstride * (y/8);
+ else if (y%4 == 0)
+ src = srcbuffer + srcstride * ((srcheight+7)/8 + y/8);
+ else if (y%2 == 0)
+ src = srcbuffer + srcstride * ((srcheight+3)/4 + y/4);
+ else /* y%2 == 1 */
+ src = srcbuffer + srcstride * ((srcheight+1)/2 + y/2);
+ src += row_offset;
+ memcpy(dst, src, rc->Width);
+ dst += dststride;
+ }
+ return S_OK;
+}
+
+static HRESULT WINAPI GifFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface,
+ const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
+{
+ GifFrameDecode *This = (GifFrameDecode*)iface;
+ TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
+
+ if (This->frame->ImageDesc.Interlace)
+ {
+ return copy_interlaced_pixels(This->frame->RasterBits, This->frame->ImageDesc.Width,
+ This->frame->ImageDesc.Height, This->frame->ImageDesc.Width,
+ prc, cbStride, cbBufferSize, pbBuffer);
+ }
+ else
+ {
+ return copy_pixels(8, This->frame->RasterBits, This->frame->ImageDesc.Width,
+ This->frame->ImageDesc.Height, This->frame->ImageDesc.Width,
+ prc, cbStride, cbBufferSize, pbBuffer);
+ }
+}
+
+static HRESULT WINAPI GifFrameDecode_GetMetadataQueryReader(IWICBitmapFrameDecode *iface,
+ IWICMetadataQueryReader **ppIMetadataQueryReader)
+{
+ TRACE("(%p,%p)\n", iface, ppIMetadataQueryReader);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI GifFrameDecode_GetColorContexts(IWICBitmapFrameDecode *iface,
+ UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
+{
+ TRACE("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI GifFrameDecode_GetThumbnail(IWICBitmapFrameDecode *iface,
+ IWICBitmapSource **ppIThumbnail)
+{
+ TRACE("(%p,%p)\n", iface, ppIThumbnail);
+ return WINCODEC_ERR_CODECNOTHUMBNAIL;
+}
+
+static const IWICBitmapFrameDecodeVtbl GifFrameDecode_Vtbl = {
+ GifFrameDecode_QueryInterface,
+ GifFrameDecode_AddRef,
+ GifFrameDecode_Release,
+ GifFrameDecode_GetSize,
+ GifFrameDecode_GetPixelFormat,
+ GifFrameDecode_GetResolution,
+ GifFrameDecode_CopyPalette,
+ GifFrameDecode_CopyPixels,
+ GifFrameDecode_GetMetadataQueryReader,
+ GifFrameDecode_GetColorContexts,
+ GifFrameDecode_GetThumbnail
+};
+
+static HRESULT WINAPI GifDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid,
+ void **ppv)
+{
+ GifDecoder *This = (GifDecoder*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICBitmapDecoder, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI GifDecoder_AddRef(IWICBitmapDecoder *iface)
+{
+ GifDecoder *This = (GifDecoder*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI GifDecoder_Release(IWICBitmapDecoder *iface)
+{
+ GifDecoder *This = (GifDecoder*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ DGifCloseFile(This->gif);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI GifDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *pIStream,
+ DWORD *pdwCapability)
+{
+ FIXME("(%p,%p,%p): stub\n", iface, pIStream, pdwCapability);
+ return E_NOTIMPL;
+}
+
+static int _gif_inputfunc(GifFileType *gif, GifByteType *data, int len) {
+ IStream *stream = gif->UserData;
+ ULONG bytesread;
+ HRESULT hr;
+
+ if (!stream)
+ {
+ ERR("attempting to read file after initialization\n");
+ return 0;
+ }
+
+ hr = IStream_Read(stream, data, len, &bytesread);
+ if (hr != S_OK) bytesread = 0;
+ return bytesread;
+}
+
+static HRESULT WINAPI GifDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream,
+ WICDecodeOptions cacheOptions)
+{
+ GifDecoder *This = (GifDecoder*)iface;
+ LARGE_INTEGER seek;
+ int ret;
+
+ TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions);
+
+ if (This->initialized || This->gif)
+ {
+ WARN("already initialized\n");
+ return WINCODEC_ERR_WRONGSTATE;
+ }
+
+ /* seek to start of stream */
+ seek.QuadPart = 0;
+ IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL);
+
+ /* read all data from the stream */
+ This->gif = DGifOpen((void*)pIStream, _gif_inputfunc);
+ if (!This->gif) return E_FAIL;
+
+ ret = DGifSlurp(This->gif);
+ if (ret == GIF_ERROR) return E_FAIL;
+
+ /* make sure we don't use the stream after this method returns */
+ This->gif->UserData = NULL;
+
+ This->initialized = TRUE;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI GifDecoder_GetContainerFormat(IWICBitmapDecoder *iface,
+ GUID *pguidContainerFormat)
+{
+ memcpy(pguidContainerFormat, &GUID_ContainerFormatGif, sizeof(GUID));
+ return S_OK;
+}
+
+static HRESULT WINAPI GifDecoder_GetDecoderInfo(IWICBitmapDecoder *iface,
+ IWICBitmapDecoderInfo **ppIDecoderInfo)
+{
+ HRESULT hr;
+ IWICComponentInfo *compinfo;
+
+ TRACE("(%p,%p)\n", iface, ppIDecoderInfo);
+
+ hr = CreateComponentInfo(&CLSID_WICGifDecoder, &compinfo);
+ if (FAILED(hr)) return hr;
+
+ hr = IWICComponentInfo_QueryInterface(compinfo, &IID_IWICBitmapDecoderInfo,
+ (void**)ppIDecoderInfo);
+
+ IWICComponentInfo_Release(compinfo);
+
+ return hr;
+}
+
+static HRESULT WINAPI GifDecoder_CopyPalette(IWICBitmapDecoder *iface,
+ IWICPalette *pIPalette)
+{
+ TRACE("(%p,%p)\n", iface, pIPalette);
+ return WINCODEC_ERR_PALETTEUNAVAILABLE;
+}
+
+static HRESULT WINAPI GifDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface,
+ IWICMetadataQueryReader **ppIMetadataQueryReader)
+{
+ TRACE("(%p,%p)\n", iface, ppIMetadataQueryReader);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI GifDecoder_GetPreview(IWICBitmapDecoder *iface,
+ IWICBitmapSource **ppIBitmapSource)
+{
+ TRACE("(%p,%p)\n", iface, ppIBitmapSource);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI GifDecoder_GetColorContexts(IWICBitmapDecoder *iface,
+ UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
+{
+ TRACE("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI GifDecoder_GetThumbnail(IWICBitmapDecoder *iface,
+ IWICBitmapSource **ppIThumbnail)
+{
+ TRACE("(%p,%p)\n", iface, ppIThumbnail);
+ return WINCODEC_ERR_CODECNOTHUMBNAIL;
+}
+
+static HRESULT WINAPI GifDecoder_GetFrameCount(IWICBitmapDecoder *iface,
+ UINT *pCount)
+{
+ GifDecoder *This = (GifDecoder*)iface;
+ TRACE("(%p,%p)\n", iface, pCount);
+
+ if (!This->initialized) return WINCODEC_ERR_NOTINITIALIZED;
+
+ *pCount = This->gif->ImageCount;
+
+ TRACE("<- %u\n", *pCount);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI GifDecoder_GetFrame(IWICBitmapDecoder *iface,
+ UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
+{
+ GifDecoder *This = (GifDecoder*)iface;
+ GifFrameDecode *result;
+ TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame);
+
+ if (!This->initialized) return WINCODEC_ERR_NOTINITIALIZED;
+
+ if (index >= This->gif->ImageCount) return E_INVALIDARG;
+
+ result = HeapAlloc(GetProcessHeap(), 0, sizeof(GifFrameDecode));
+ if (!result) return E_OUTOFMEMORY;
+
+ result->lpVtbl = &GifFrameDecode_Vtbl;
+ result->ref = 1;
+ result->frame = &This->gif->SavedImages[index];
+ IWICBitmapDecoder_AddRef(iface);
+ result->parent = This;
+
+ *ppIBitmapFrame = (IWICBitmapFrameDecode*)result;
+
+ return S_OK;
+}
+
+static const IWICBitmapDecoderVtbl GifDecoder_Vtbl = {
+ GifDecoder_QueryInterface,
+ GifDecoder_AddRef,
+ GifDecoder_Release,
+ GifDecoder_QueryCapability,
+ GifDecoder_Initialize,
+ GifDecoder_GetContainerFormat,
+ GifDecoder_GetDecoderInfo,
+ GifDecoder_CopyPalette,
+ GifDecoder_GetMetadataQueryReader,
+ GifDecoder_GetPreview,
+ GifDecoder_GetColorContexts,
+ GifDecoder_GetThumbnail,
+ GifDecoder_GetFrameCount,
+ GifDecoder_GetFrame
+};
+
+HRESULT GifDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
+{
+ GifDecoder *This;
+ HRESULT ret;
+
+ TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv);
+
+ *ppv = NULL;
+
+ if (pUnkOuter) return CLASS_E_NOAGGREGATION;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(GifDecoder));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->lpVtbl = &GifDecoder_Vtbl;
+ This->ref = 1;
+ This->initialized = FALSE;
+ This->gif = NULL;
+
+ ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv);
+ IUnknown_Release((IUnknown*)This);
+
+ return ret;
+}
diff --git a/reactos/dll/win32/windowscodecs/icoformat.c b/reactos/dll/win32/windowscodecs/icoformat.c
new file mode 100644
index 00000000000..ab30ab0a8af
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/icoformat.c
@@ -0,0 +1,797 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+#include "pshpack1.h"
+
+typedef struct {
+ BYTE bWidth;
+ BYTE bHeight;
+ BYTE bColorCount;
+ BYTE bReserved;
+ WORD wPlanes;
+ WORD wBitCount;
+ DWORD dwDIBSize;
+ DWORD dwDIBOffset;
+} ICONDIRENTRY;
+
+typedef struct
+{
+ WORD idReserved;
+ WORD idType;
+ WORD idCount;
+} ICONHEADER;
+
+#include "poppack.h"
+
+typedef struct {
+ const IWICBitmapDecoderVtbl *lpVtbl;
+ LONG ref;
+ BOOL initialized;
+ IStream *stream;
+ ICONHEADER header;
+} IcoDecoder;
+
+typedef struct {
+ const IWICBitmapFrameDecodeVtbl *lpVtbl;
+ LONG ref;
+ ICONDIRENTRY entry;
+ IcoDecoder *parent;
+ BYTE *bits;
+} IcoFrameDecode;
+
+static HRESULT WINAPI IcoFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid,
+ void **ppv)
+{
+ IcoFrameDecode *This = (IcoFrameDecode*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IWICBitmapSource, iid) ||
+ IsEqualIID(&IID_IWICBitmapFrameDecode, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI IcoFrameDecode_AddRef(IWICBitmapFrameDecode *iface)
+{
+ IcoFrameDecode *This = (IcoFrameDecode*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI IcoFrameDecode_Release(IWICBitmapFrameDecode *iface)
+{
+ IcoFrameDecode *This = (IcoFrameDecode*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ IUnknown_Release((IUnknown*)This->parent);
+ HeapFree(GetProcessHeap(), 0, This->bits);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI IcoFrameDecode_GetSize(IWICBitmapFrameDecode *iface,
+ UINT *puiWidth, UINT *puiHeight)
+{
+ IcoFrameDecode *This = (IcoFrameDecode*)iface;
+
+ *puiWidth = This->entry.bWidth ? This->entry.bWidth : 256;
+ *puiHeight = This->entry.bHeight ? This->entry.bHeight : 256;
+
+ TRACE("(%p) -> (%i,%i)\n", iface, *puiWidth, *puiHeight);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI IcoFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface,
+ WICPixelFormatGUID *pPixelFormat)
+{
+ memcpy(pPixelFormat, &GUID_WICPixelFormat32bppBGRA, sizeof(GUID));
+ return S_OK;
+}
+
+static HRESULT WINAPI IcoFrameDecode_GetResolution(IWICBitmapFrameDecode *iface,
+ double *pDpiX, double *pDpiY)
+{
+ FIXME("(%p,%p,%p): stub\n", iface, pDpiX, pDpiY);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IcoFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface,
+ IWICPalette *pIPalette)
+{
+ TRACE("(%p,%p)\n", iface, pIPalette);
+ return WINCODEC_ERR_PALETTEUNAVAILABLE;
+}
+
+static inline void pixel_set_trans(DWORD* pixel, BOOL transparent)
+{
+ if (transparent) *pixel = 0;
+ else *pixel |= 0xff000000;
+}
+
+static HRESULT IcoFrameDecode_ReadPixels(IcoFrameDecode *This)
+{
+ BITMAPINFOHEADER bih;
+ DWORD colors[256];
+ UINT colorcount=0;
+ LARGE_INTEGER seek;
+ ULONG bytesread;
+ HRESULT hr;
+ BYTE *tempdata = NULL;
+ BYTE *bits = NULL;
+ UINT bitsStride;
+ UINT bitsSize;
+ UINT width, height;
+
+ width = This->entry.bWidth ? This->entry.bWidth : 256;
+ height = This->entry.bHeight ? This->entry.bHeight : 256;
+
+ /* read the BITMAPINFOHEADER */
+ seek.QuadPart = This->entry.dwDIBOffset;
+ hr = IStream_Seek(This->parent->stream, seek, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) goto fail;
+
+ hr = IStream_Read(This->parent->stream, &bih, sizeof(BITMAPINFOHEADER), &bytesread);
+ if (FAILED(hr) || bytesread != sizeof(BITMAPINFOHEADER)) goto fail;
+
+ if (This->entry.wBitCount <= 8)
+ {
+ /* read the palette */
+ colorcount = This->entry.bColorCount ? This->entry.bColorCount : 256;
+
+ hr = IStream_Read(This->parent->stream, colors, sizeof(RGBQUAD)*colorcount, &bytesread);
+ if (FAILED(hr) || bytesread != sizeof(RGBQUAD)*colorcount) goto fail;
+ }
+
+ bitsStride = width * 4;
+ bitsSize = bitsStride * height;
+
+ /* read the XOR data */
+ switch (This->entry.wBitCount)
+ {
+ case 1:
+ {
+ UINT xorBytesPerRow = (width+31)/32*4;
+ UINT xorBytes = xorBytesPerRow * height;
+ INT xorStride;
+ BYTE *xorRow;
+ BYTE *bitsRow;
+ UINT x, y;
+
+ tempdata = HeapAlloc(GetProcessHeap(), 0, xorBytes);
+ if (!tempdata)
+ {
+ hr = E_OUTOFMEMORY;
+ goto fail;
+ }
+
+ hr = IStream_Read(This->parent->stream, tempdata, xorBytes, &bytesread);
+ if (FAILED(hr) || bytesread != xorBytes) goto fail;
+
+ if (bih.biHeight > 0) /* bottom-up DIB */
+ {
+ xorStride = -xorBytesPerRow;
+ xorRow = tempdata + (height-1)*xorBytesPerRow;
+ }
+ else /* top-down DIB */
+ {
+ xorStride = xorBytesPerRow;
+ xorRow = tempdata;
+ }
+
+ bits = HeapAlloc(GetProcessHeap(), 0, bitsSize);
+
+ /* palette-map the 1-bit data */
+ bitsRow = bits;
+ for (y=0; y>7];
+ if (x+1 < width) *bitsPixel++ = colors[xorVal>>6&1];
+ if (x+2 < width) *bitsPixel++ = colors[xorVal>>5&1];
+ if (x+3 < width) *bitsPixel++ = colors[xorVal>>4&1];
+ if (x+4 < width) *bitsPixel++ = colors[xorVal>>3&1];
+ if (x+5 < width) *bitsPixel++ = colors[xorVal>>2&1];
+ if (x+6 < width) *bitsPixel++ = colors[xorVal>>1&1];
+ if (x+7 < width) *bitsPixel++ = colors[xorVal&1];
+ }
+ xorRow += xorStride;
+ bitsRow += bitsStride;
+ }
+
+ HeapFree(GetProcessHeap(), 0, tempdata);
+ break;
+ }
+ case 4:
+ {
+ UINT xorBytesPerRow = (width+7)/8*4;
+ UINT xorBytes = xorBytesPerRow * height;
+ INT xorStride;
+ BYTE *xorRow;
+ BYTE *bitsRow;
+ UINT x, y;
+
+ tempdata = HeapAlloc(GetProcessHeap(), 0, xorBytes);
+ if (!tempdata)
+ {
+ hr = E_OUTOFMEMORY;
+ goto fail;
+ }
+
+ hr = IStream_Read(This->parent->stream, tempdata, xorBytes, &bytesread);
+ if (FAILED(hr) || bytesread != xorBytes) goto fail;
+
+ if (bih.biHeight > 0) /* bottom-up DIB */
+ {
+ xorStride = -xorBytesPerRow;
+ xorRow = tempdata + (height-1)*xorBytesPerRow;
+ }
+ else /* top-down DIB */
+ {
+ xorStride = xorBytesPerRow;
+ xorRow = tempdata;
+ }
+
+ bits = HeapAlloc(GetProcessHeap(), 0, bitsSize);
+
+ /* palette-map the 4-bit data */
+ bitsRow = bits;
+ for (y=0; y>4];
+ if (x+1 < width) *bitsPixel++ = colors[xorVal&0xf];
+ }
+ xorRow += xorStride;
+ bitsRow += bitsStride;
+ }
+
+ HeapFree(GetProcessHeap(), 0, tempdata);
+ break;
+ }
+ case 8:
+ {
+ UINT xorBytesPerRow = (width+3)/4*4;
+ UINT xorBytes = xorBytesPerRow * height;
+ INT xorStride;
+ BYTE *xorRow;
+ BYTE *bitsRow;
+ UINT x, y;
+
+ tempdata = HeapAlloc(GetProcessHeap(), 0, xorBytes);
+ if (!tempdata)
+ {
+ hr = E_OUTOFMEMORY;
+ goto fail;
+ }
+
+ hr = IStream_Read(This->parent->stream, tempdata, xorBytes, &bytesread);
+ if (FAILED(hr) || bytesread != xorBytes) goto fail;
+
+ if (bih.biHeight > 0) /* bottom-up DIB */
+ {
+ xorStride = -xorBytesPerRow;
+ xorRow = tempdata + (height-1)*xorBytesPerRow;
+ }
+ else /* top-down DIB */
+ {
+ xorStride = xorBytesPerRow;
+ xorRow = tempdata;
+ }
+
+ bits = HeapAlloc(GetProcessHeap(), 0, bitsSize);
+
+ /* palette-map the 8-bit data */
+ bitsRow = bits;
+ for (y=0; yparent->stream, tempdata, xorBytes, &bytesread);
+ if (FAILED(hr) || bytesread != xorBytes) goto fail;
+
+ if (bih.biHeight > 0) /* bottom-up DIB */
+ {
+ xorStride = -xorBytesPerRow;
+ xorRow = tempdata + (height-1)*xorBytesPerRow;
+ }
+ else /* top-down DIB */
+ {
+ xorStride = xorBytesPerRow;
+ xorRow = tempdata;
+ }
+
+ bits = HeapAlloc(GetProcessHeap(), 0, bitsSize);
+
+ /* copy BGR->BGRA */
+ bitsRow = bits;
+ for (y=0; y 0) /* bottom-up DIB */
+ {
+ /* read the rows backwards so we get a top-down DIB */
+ UINT i;
+ BYTE *xorRow = bits + xorBytesPerRow * (height-1);
+
+ for (i=0; iparent->stream, xorRow, xorBytesPerRow, &bytesread);
+ if (FAILED(hr) || bytesread != xorBytesPerRow) goto fail;
+ xorRow -= xorBytesPerRow;
+ }
+ }
+ else /* top-down DIB */
+ {
+ hr = IStream_Read(This->parent->stream, bits, xorBytes, &bytesread);
+ if (FAILED(hr) || bytesread != xorBytes) goto fail;
+ }
+ break;
+ }
+ default:
+ FIXME("unsupported bitcount: %u\n", This->entry.wBitCount);
+ goto fail;
+ }
+
+ if (This->entry.wBitCount < 32)
+ {
+ /* set alpha data based on the AND mask */
+ UINT andBytesPerRow = (width+31)/32*4;
+ UINT andBytes = andBytesPerRow * height;
+ INT andStride;
+ BYTE *andRow;
+ BYTE *bitsRow;
+ UINT x, y;
+
+ tempdata = HeapAlloc(GetProcessHeap(), 0, andBytes);
+ if (!tempdata)
+ {
+ hr = E_OUTOFMEMORY;
+ goto fail;
+ }
+
+ hr = IStream_Read(This->parent->stream, tempdata, andBytes, &bytesread);
+ if (FAILED(hr) || bytesread != andBytes) goto fail;
+
+ if (bih.biHeight > 0) /* bottom-up DIB */
+ {
+ andStride = -andBytesPerRow;
+ andRow = tempdata + (height-1)*andBytesPerRow;
+ }
+ else /* top-down DIB */
+ {
+ andStride = andBytesPerRow;
+ andRow = tempdata;
+ }
+
+ bitsRow = bits;
+ for (y=0; y>7&1);
+ if (x+1 < width) pixel_set_trans(bitsPixel++, andVal>>6&1);
+ if (x+2 < width) pixel_set_trans(bitsPixel++, andVal>>5&1);
+ if (x+3 < width) pixel_set_trans(bitsPixel++, andVal>>4&1);
+ if (x+4 < width) pixel_set_trans(bitsPixel++, andVal>>3&1);
+ if (x+5 < width) pixel_set_trans(bitsPixel++, andVal>>2&1);
+ if (x+6 < width) pixel_set_trans(bitsPixel++, andVal>>1&1);
+ if (x+7 < width) pixel_set_trans(bitsPixel++, andVal&1);
+ }
+ andRow += andStride;
+ bitsRow += bitsStride;
+ }
+
+ HeapFree(GetProcessHeap(), 0, tempdata);
+ }
+
+ This->bits = bits;
+
+ return S_OK;
+
+fail:
+ HeapFree(GetProcessHeap(), 0, tempdata);
+ HeapFree(GetProcessHeap(), 0, bits);
+ if (SUCCEEDED(hr)) hr = E_FAIL;
+ TRACE("<-- %x\n", hr);
+ return hr;
+}
+
+static HRESULT WINAPI IcoFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface,
+ const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
+{
+ IcoFrameDecode *This = (IcoFrameDecode*)iface;
+ HRESULT hr;
+ UINT width, height, stride;
+ TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
+
+ if (!This->bits)
+ {
+ hr = IcoFrameDecode_ReadPixels(This);
+ if (FAILED(hr)) return hr;
+ }
+
+ width = This->entry.bWidth ? This->entry.bWidth : 256;
+ height = This->entry.bHeight ? This->entry.bHeight : 256;
+ stride = width * 4;
+
+ return copy_pixels(32, This->bits, width, height, stride,
+ prc, cbStride, cbBufferSize, pbBuffer);
+}
+
+static HRESULT WINAPI IcoFrameDecode_GetMetadataQueryReader(IWICBitmapFrameDecode *iface,
+ IWICMetadataQueryReader **ppIMetadataQueryReader)
+{
+ TRACE("(%p,%p)\n", iface, ppIMetadataQueryReader);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI IcoFrameDecode_GetColorContexts(IWICBitmapFrameDecode *iface,
+ UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
+{
+ TRACE("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI IcoFrameDecode_GetThumbnail(IWICBitmapFrameDecode *iface,
+ IWICBitmapSource **ppIThumbnail)
+{
+ TRACE("(%p,%p)\n", iface, ppIThumbnail);
+ return WINCODEC_ERR_CODECNOTHUMBNAIL;
+}
+
+static const IWICBitmapFrameDecodeVtbl IcoFrameDecode_Vtbl = {
+ IcoFrameDecode_QueryInterface,
+ IcoFrameDecode_AddRef,
+ IcoFrameDecode_Release,
+ IcoFrameDecode_GetSize,
+ IcoFrameDecode_GetPixelFormat,
+ IcoFrameDecode_GetResolution,
+ IcoFrameDecode_CopyPalette,
+ IcoFrameDecode_CopyPixels,
+ IcoFrameDecode_GetMetadataQueryReader,
+ IcoFrameDecode_GetColorContexts,
+ IcoFrameDecode_GetThumbnail
+};
+
+static HRESULT WINAPI IcoDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid,
+ void **ppv)
+{
+ IcoDecoder *This = (IcoDecoder*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICBitmapDecoder, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI IcoDecoder_AddRef(IWICBitmapDecoder *iface)
+{
+ IcoDecoder *This = (IcoDecoder*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI IcoDecoder_Release(IWICBitmapDecoder *iface)
+{
+ IcoDecoder *This = (IcoDecoder*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ if (This->stream) IStream_Release(This->stream);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI IcoDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *pIStream,
+ DWORD *pdwCapability)
+{
+ FIXME("(%p,%p,%p): stub\n", iface, pIStream, pdwCapability);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IcoDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream,
+ WICDecodeOptions cacheOptions)
+{
+ IcoDecoder *This = (IcoDecoder*)iface;
+ LARGE_INTEGER seek;
+ HRESULT hr;
+ ULONG bytesread;
+ TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions);
+
+ if (This->initialized) return WINCODEC_ERR_WRONGSTATE;
+
+ seek.QuadPart = 0;
+ hr = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) return hr;
+
+ hr = IStream_Read(pIStream, &This->header, sizeof(ICONHEADER), &bytesread);
+ if (FAILED(hr)) return hr;
+ if (bytesread != sizeof(ICONHEADER) ||
+ This->header.idReserved != 0 ||
+ This->header.idType != 1) return E_FAIL;
+
+ This->initialized = TRUE;
+ This->stream = pIStream;
+ IStream_AddRef(pIStream);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI IcoDecoder_GetContainerFormat(IWICBitmapDecoder *iface,
+ GUID *pguidContainerFormat)
+{
+ FIXME("(%p,%p): stub\n", iface, pguidContainerFormat);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IcoDecoder_GetDecoderInfo(IWICBitmapDecoder *iface,
+ IWICBitmapDecoderInfo **ppIDecoderInfo)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIDecoderInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IcoDecoder_CopyPalette(IWICBitmapDecoder *iface,
+ IWICPalette *pIPalette)
+{
+ TRACE("(%p,%p)\n", iface, pIPalette);
+ return WINCODEC_ERR_PALETTEUNAVAILABLE;
+}
+
+static HRESULT WINAPI IcoDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface,
+ IWICMetadataQueryReader **ppIMetadataQueryReader)
+{
+ TRACE("(%p,%p)\n", iface, ppIMetadataQueryReader);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI IcoDecoder_GetPreview(IWICBitmapDecoder *iface,
+ IWICBitmapSource **ppIBitmapSource)
+{
+ TRACE("(%p,%p)\n", iface, ppIBitmapSource);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI IcoDecoder_GetColorContexts(IWICBitmapDecoder *iface,
+ UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
+{
+ TRACE("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI IcoDecoder_GetThumbnail(IWICBitmapDecoder *iface,
+ IWICBitmapSource **ppIThumbnail)
+{
+ TRACE("(%p,%p)\n", iface, ppIThumbnail);
+ return WINCODEC_ERR_CODECNOTHUMBNAIL;
+}
+
+static HRESULT WINAPI IcoDecoder_GetFrameCount(IWICBitmapDecoder *iface,
+ UINT *pCount)
+{
+ IcoDecoder *This = (IcoDecoder*)iface;
+ TRACE("(%p,%p)\n", iface, pCount);
+
+ if (!This->initialized) return WINCODEC_ERR_NOTINITIALIZED;
+
+ *pCount = This->header.idCount;
+ TRACE("<-- %u\n", *pCount);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI IcoDecoder_GetFrame(IWICBitmapDecoder *iface,
+ UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
+{
+ IcoDecoder *This = (IcoDecoder*)iface;
+ IcoFrameDecode *result;
+ LARGE_INTEGER seek;
+ HRESULT hr;
+ ULONG bytesread;
+ TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame);
+
+ if (!This->initialized) return WINCODEC_ERR_NOTINITIALIZED;
+
+ if (This->header.idCount < index) return E_INVALIDARG;
+
+ result = HeapAlloc(GetProcessHeap(), 0, sizeof(IcoFrameDecode));
+ if (!result) return E_OUTOFMEMORY;
+
+ result->lpVtbl = &IcoFrameDecode_Vtbl;
+ result->ref = 1;
+ result->parent = This;
+ result->bits = NULL;
+
+ /* read the icon entry */
+ seek.QuadPart = sizeof(ICONHEADER) + sizeof(ICONDIRENTRY) * index;
+ hr = IStream_Seek(This->stream, seek, STREAM_SEEK_SET, 0);
+ if (FAILED(hr)) goto fail;
+
+ hr = IStream_Read(This->stream, &result->entry, sizeof(ICONDIRENTRY), &bytesread);
+ if (FAILED(hr) || bytesread != sizeof(ICONDIRENTRY)) goto fail;
+
+ IWICBitmapDecoder_AddRef(iface);
+
+ *ppIBitmapFrame = (IWICBitmapFrameDecode*)result;
+
+ return S_OK;
+
+fail:
+ HeapFree(GetProcessHeap(), 0, result);
+ if (SUCCEEDED(hr)) hr = E_FAIL;
+ TRACE("<-- %x\n", hr);
+ return hr;
+}
+
+static const IWICBitmapDecoderVtbl IcoDecoder_Vtbl = {
+ IcoDecoder_QueryInterface,
+ IcoDecoder_AddRef,
+ IcoDecoder_Release,
+ IcoDecoder_QueryCapability,
+ IcoDecoder_Initialize,
+ IcoDecoder_GetContainerFormat,
+ IcoDecoder_GetDecoderInfo,
+ IcoDecoder_CopyPalette,
+ IcoDecoder_GetMetadataQueryReader,
+ IcoDecoder_GetPreview,
+ IcoDecoder_GetColorContexts,
+ IcoDecoder_GetThumbnail,
+ IcoDecoder_GetFrameCount,
+ IcoDecoder_GetFrame
+};
+
+HRESULT IcoDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
+{
+ IcoDecoder *This;
+ HRESULT ret;
+
+ TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv);
+
+ *ppv = NULL;
+
+ if (pUnkOuter) return CLASS_E_NOAGGREGATION;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(IcoDecoder));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->lpVtbl = &IcoDecoder_Vtbl;
+ This->ref = 1;
+ This->stream = NULL;
+ This->initialized = FALSE;
+
+ ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv);
+ IUnknown_Release((IUnknown*)This);
+
+ return ret;
+}
diff --git a/reactos/dll/win32/windowscodecs/imgfactory.c b/reactos/dll/win32/windowscodecs/imgfactory.c
new file mode 100644
index 00000000000..a98aeb81295
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/imgfactory.c
@@ -0,0 +1,420 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+typedef struct {
+ const IWICImagingFactoryVtbl *lpIWICImagingFactoryVtbl;
+ LONG ref;
+} ImagingFactory;
+
+static HRESULT WINAPI ImagingFactory_QueryInterface(IWICImagingFactory *iface, REFIID iid,
+ void **ppv)
+{
+ ImagingFactory *This = (ImagingFactory*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICImagingFactory, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI ImagingFactory_AddRef(IWICImagingFactory *iface)
+{
+ ImagingFactory *This = (ImagingFactory*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI ImagingFactory_Release(IWICImagingFactory *iface)
+{
+ ImagingFactory *This = (ImagingFactory*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ HeapFree(GetProcessHeap(), 0, This);
+
+ return ref;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateDecoderFromFilename(
+ IWICImagingFactory *iface, LPCWSTR wzFilename, const GUID *pguidVendor,
+ DWORD dwDesiredAccess, WICDecodeOptions metadataOptions,
+ IWICBitmapDecoder **ppIDecoder)
+{
+ FIXME("(%p,%s,%s,%u,%u,%p): stub\n", iface, debugstr_w(wzFilename),
+ debugstr_guid(pguidVendor), dwDesiredAccess, metadataOptions, ppIDecoder);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateDecoderFromStream(
+ IWICImagingFactory *iface, IStream *pIStream, const GUID *pguidVendor,
+ WICDecodeOptions metadataOptions, IWICBitmapDecoder **ppIDecoder)
+{
+ static int fixme=0;
+ IEnumUnknown *enumdecoders;
+ IUnknown *unkdecoderinfo;
+ IWICBitmapDecoderInfo *decoderinfo;
+ IWICBitmapDecoder *decoder=NULL;
+ HRESULT res=S_OK;
+ ULONG num_fetched;
+ BOOL matches;
+
+ TRACE("(%p,%p,%s,%u,%p)\n", iface, pIStream, debugstr_guid(pguidVendor),
+ metadataOptions, ppIDecoder);
+
+ if (pguidVendor && !fixme++)
+ FIXME("ignoring vendor GUID\n");
+
+ res = CreateComponentEnumerator(WICDecoder, WICComponentEnumerateDefault, &enumdecoders);
+ if (FAILED(res)) return res;
+
+ while (!decoder)
+ {
+ res = IEnumUnknown_Next(enumdecoders, 1, &unkdecoderinfo, &num_fetched);
+
+ if (res == S_OK)
+ {
+ res = IUnknown_QueryInterface(unkdecoderinfo, &IID_IWICBitmapDecoderInfo, (void**)&decoderinfo);
+
+ if (SUCCEEDED(res))
+ {
+ res = IWICBitmapDecoderInfo_MatchesPattern(decoderinfo, pIStream, &matches);
+
+ if (SUCCEEDED(res) && matches)
+ {
+ res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, &decoder);
+
+ /* FIXME: should use QueryCapability to choose a decoder */
+
+ if (SUCCEEDED(res))
+ {
+ res = IWICBitmapDecoder_Initialize(decoder, pIStream, metadataOptions);
+
+ if (FAILED(res))
+ {
+ IWICBitmapDecoder_Release(decoder);
+ decoder = NULL;
+ }
+ }
+ }
+
+ IWICBitmapDecoderInfo_Release(decoderinfo);
+ }
+
+ IUnknown_Release(unkdecoderinfo);
+ }
+ else
+ break;
+ }
+
+ IEnumUnknown_Release(enumdecoders);
+
+ if (decoder)
+ {
+ *ppIDecoder = decoder;
+ return S_OK;
+ }
+ else
+ {
+ if (WARN_ON(wincodecs))
+ {
+ LARGE_INTEGER seek;
+ BYTE data[4];
+ ULONG bytesread;
+
+ WARN("failed to load from a stream\n");
+
+ seek.QuadPart = 0;
+ res = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL);
+ if (SUCCEEDED(res))
+ res = IStream_Read(pIStream, data, 4, &bytesread);
+ if (SUCCEEDED(res))
+ WARN("first %i bytes of stream=%x %x %x %x\n", bytesread, data[0], data[1], data[2], data[3]);
+ }
+ *ppIDecoder = NULL;
+ return WINCODEC_ERR_COMPONENTNOTFOUND;
+ }
+}
+
+static HRESULT WINAPI ImagingFactory_CreateDecoderFromFileHandle(
+ IWICImagingFactory *iface, ULONG_PTR hFile, const GUID *pguidVendor,
+ WICDecodeOptions metadataOptions, IWICBitmapDecoder **ppIDecoder)
+{
+ FIXME("(%p,%lx,%s,%u,%p): stub\n", iface, hFile, debugstr_guid(pguidVendor),
+ metadataOptions, ppIDecoder);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateComponentInfo(IWICImagingFactory *iface,
+ REFCLSID clsidComponent, IWICComponentInfo **ppIInfo)
+{
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(clsidComponent), ppIInfo);
+ return CreateComponentInfo(clsidComponent, ppIInfo);
+}
+
+static HRESULT WINAPI ImagingFactory_CreateDecoder(IWICImagingFactory *iface,
+ REFGUID guidContainerFormat, const GUID *pguidVendor,
+ IWICBitmapDecoder **ppIDecoder)
+{
+ FIXME("(%p,%s,%s,%p): stub\n", iface, debugstr_guid(guidContainerFormat),
+ debugstr_guid(pguidVendor), ppIDecoder);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateEncoder(IWICImagingFactory *iface,
+ REFGUID guidContainerFormat, const GUID *pguidVendor,
+ IWICBitmapEncoder **ppIEncoder)
+{
+ FIXME("(%p,%s,%s,%p): stub\n", iface, debugstr_guid(guidContainerFormat),
+ debugstr_guid(pguidVendor), ppIEncoder);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreatePalette(IWICImagingFactory *iface,
+ IWICPalette **ppIPalette)
+{
+ TRACE("(%p,%p)\n", iface, ppIPalette);
+ return PaletteImpl_Create(ppIPalette);
+}
+
+static HRESULT WINAPI ImagingFactory_CreateFormatConverter(IWICImagingFactory *iface,
+ IWICFormatConverter **ppIFormatConverter)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIFormatConverter);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateBitmapScaler(IWICImagingFactory *iface,
+ IWICBitmapScaler **ppIBitmapScaler)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIBitmapScaler);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateBitmapClipper(IWICImagingFactory *iface,
+ IWICBitmapClipper **ppIBitmapClipper)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIBitmapClipper);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateBitmapFlipRotator(IWICImagingFactory *iface,
+ IWICBitmapFlipRotator **ppIBitmapFlipRotator)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIBitmapFlipRotator);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateStream(IWICImagingFactory *iface,
+ IWICStream **ppIWICStream)
+{
+ TRACE("(%p,%p)\n", iface, ppIWICStream);
+ return StreamImpl_Create(ppIWICStream);
+}
+
+static HRESULT WINAPI ImagingFactory_CreateColorContext(IWICImagingFactory *iface,
+ IWICColorContext **ppIColorContext)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIColorContext);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateColorTransformer(IWICImagingFactory *iface,
+ IWICColorTransform **ppIColorTransform)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIColorTransform);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateBitmap(IWICImagingFactory *iface,
+ UINT uiWidth, UINT uiHeight, REFWICPixelFormatGUID pixelFormat,
+ WICBitmapCreateCacheOption option, IWICBitmap **ppIBitmap)
+{
+ FIXME("(%p,%u,%u,%s,%u,%p): stub\n", iface, uiWidth, uiHeight,
+ debugstr_guid(pixelFormat), option, ppIBitmap);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateBitmapFromSource(IWICImagingFactory *iface,
+ IWICBitmapSource *piBitmapSource, WICBitmapCreateCacheOption option,
+ IWICBitmap **ppIBitmap)
+{
+ FIXME("(%p,%p,%u,%p): stub\n", iface, piBitmapSource, option, ppIBitmap);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateBitmapFromSourceRect(IWICImagingFactory *iface,
+ IWICBitmapSource *piBitmapSource, UINT x, UINT y, UINT width, UINT height,
+ IWICBitmap **ppIBitmap)
+{
+ FIXME("(%p,%p,%u,%u,%u,%u,%p): stub\n", iface, piBitmapSource, x, y, width,
+ height, ppIBitmap);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateBitmapFromMemory(IWICImagingFactory *iface,
+ UINT uiWidth, UINT uiHeight, REFWICPixelFormatGUID pixelFormat, UINT cbStride,
+ UINT cbBufferSize, BYTE *pbBuffer, IWICBitmap **ppIBitmap)
+{
+ FIXME("(%p,%u,%u,%s,%u,%u,%p,%p): stub\n", iface, uiWidth, uiHeight,
+ debugstr_guid(pixelFormat), cbStride, cbBufferSize, pbBuffer, ppIBitmap);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateBitmapFromHBITMAP(IWICImagingFactory *iface,
+ HBITMAP hBitmap, HPALETTE hPalette, WICBitmapAlphaChannelOption options,
+ IWICBitmap **ppIBitmap)
+{
+ FIXME("(%p,%p,%p,%u,%p): stub\n", iface, hBitmap, hPalette, options, ppIBitmap);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateBitmapFromHICON(IWICImagingFactory *iface,
+ HICON hIcon, IWICBitmap **ppIBitmap)
+{
+ FIXME("(%p,%p,%p): stub\n", iface, hIcon, ppIBitmap);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateComponentEnumerator(IWICImagingFactory *iface,
+ DWORD componentTypes, DWORD options, IEnumUnknown **ppIEnumUnknown)
+{
+ TRACE("(%p,%u,%u,%p)\n", iface, componentTypes, options, ppIEnumUnknown);
+ return CreateComponentEnumerator(componentTypes, options, ppIEnumUnknown);
+}
+
+static HRESULT WINAPI ImagingFactory_CreateFastMetadataEncoderFromDecoder(
+ IWICImagingFactory *iface, IWICBitmapDecoder *pIDecoder,
+ IWICFastMetadataEncoder **ppIFastEncoder)
+{
+ FIXME("(%p,%p,%p): stub\n", iface, pIDecoder, ppIFastEncoder);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateFastMetadataEncoderFromFrameDecode(
+ IWICImagingFactory *iface, IWICBitmapFrameDecode *pIFrameDecoder,
+ IWICFastMetadataEncoder **ppIFastEncoder)
+{
+ FIXME("(%p,%p,%p): stub\n", iface, pIFrameDecoder, ppIFastEncoder);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateQueryWriter(IWICImagingFactory *iface,
+ REFGUID guidMetadataFormat, const GUID *pguidVendor,
+ IWICMetadataQueryWriter **ppIQueryWriter)
+{
+ FIXME("(%p,%s,%s,%p): stub\n", iface, debugstr_guid(guidMetadataFormat),
+ debugstr_guid(pguidVendor), ppIQueryWriter);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImagingFactory_CreateQueryWriterFromReader(IWICImagingFactory *iface,
+ IWICMetadataQueryReader *pIQueryReader, const GUID *pguidVendor,
+ IWICMetadataQueryWriter **ppIQueryWriter)
+{
+ FIXME("(%p,%p,%s,%p): stub\n", iface, pIQueryReader, debugstr_guid(pguidVendor),
+ ppIQueryWriter);
+ return E_NOTIMPL;
+}
+
+static const IWICImagingFactoryVtbl ImagingFactory_Vtbl = {
+ ImagingFactory_QueryInterface,
+ ImagingFactory_AddRef,
+ ImagingFactory_Release,
+ ImagingFactory_CreateDecoderFromFilename,
+ ImagingFactory_CreateDecoderFromStream,
+ ImagingFactory_CreateDecoderFromFileHandle,
+ ImagingFactory_CreateComponentInfo,
+ ImagingFactory_CreateDecoder,
+ ImagingFactory_CreateEncoder,
+ ImagingFactory_CreatePalette,
+ ImagingFactory_CreateFormatConverter,
+ ImagingFactory_CreateBitmapScaler,
+ ImagingFactory_CreateBitmapClipper,
+ ImagingFactory_CreateBitmapFlipRotator,
+ ImagingFactory_CreateStream,
+ ImagingFactory_CreateColorContext,
+ ImagingFactory_CreateColorTransformer,
+ ImagingFactory_CreateBitmap,
+ ImagingFactory_CreateBitmapFromSource,
+ ImagingFactory_CreateBitmapFromSourceRect,
+ ImagingFactory_CreateBitmapFromMemory,
+ ImagingFactory_CreateBitmapFromHBITMAP,
+ ImagingFactory_CreateBitmapFromHICON,
+ ImagingFactory_CreateComponentEnumerator,
+ ImagingFactory_CreateFastMetadataEncoderFromDecoder,
+ ImagingFactory_CreateFastMetadataEncoderFromFrameDecode,
+ ImagingFactory_CreateQueryWriter,
+ ImagingFactory_CreateQueryWriterFromReader
+};
+
+HRESULT ImagingFactory_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
+{
+ ImagingFactory *This;
+ HRESULT ret;
+
+ TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv);
+
+ *ppv = NULL;
+
+ if (pUnkOuter) return CLASS_E_NOAGGREGATION;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(ImagingFactory));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->lpIWICImagingFactoryVtbl = &ImagingFactory_Vtbl;
+ This->ref = 1;
+
+ ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv);
+ IUnknown_Release((IUnknown*)This);
+
+ return ret;
+}
diff --git a/reactos/dll/win32/windowscodecs/info.c b/reactos/dll/win32/windowscodecs/info.c
new file mode 100644
index 00000000000..64c3855e4e0
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/info.c
@@ -0,0 +1,1071 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "wine/list.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+static WCHAR const pixelformats_keyname[] = {'P','i','x','e','l','F','o','r','m','a','t','s',0};
+
+typedef struct {
+ const IWICBitmapDecoderInfoVtbl *lpIWICBitmapDecoderInfoVtbl;
+ LONG ref;
+ HKEY classkey;
+ CLSID clsid;
+} BitmapDecoderInfo;
+
+static HRESULT WINAPI BitmapDecoderInfo_QueryInterface(IWICBitmapDecoderInfo *iface, REFIID iid,
+ void **ppv)
+{
+ BitmapDecoderInfo *This = (BitmapDecoderInfo*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IWICComponentInfo, iid) ||
+ IsEqualIID(&IID_IWICBitmapCodecInfo, iid) ||
+ IsEqualIID(&IID_IWICBitmapDecoderInfo ,iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI BitmapDecoderInfo_AddRef(IWICBitmapDecoderInfo *iface)
+{
+ BitmapDecoderInfo *This = (BitmapDecoderInfo*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI BitmapDecoderInfo_Release(IWICBitmapDecoderInfo *iface)
+{
+ BitmapDecoderInfo *This = (BitmapDecoderInfo*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ RegCloseKey(This->classkey);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetComponentType(IWICBitmapDecoderInfo *iface,
+ WICComponentType *pType)
+{
+ TRACE("(%p,%p)\n", iface, pType);
+ *pType = WICDecoder;
+ return S_OK;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetCLSID(IWICBitmapDecoderInfo *iface, CLSID *pclsid)
+{
+ FIXME("(%p,%p): stub\n", iface, pclsid);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetSigningStatus(IWICBitmapDecoderInfo *iface, DWORD *pStatus)
+{
+ FIXME("(%p,%p): stub\n", iface, pStatus);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetAuthor(IWICBitmapDecoderInfo *iface, UINT cchAuthor,
+ WCHAR *wzAuthor, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchAuthor, wzAuthor, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetVendorGUID(IWICBitmapDecoderInfo *iface, GUID *pguidVendor)
+{
+ FIXME("(%p,%p): stub\n", iface, pguidVendor);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetVersion(IWICBitmapDecoderInfo *iface, UINT cchVersion,
+ WCHAR *wzVersion, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchVersion, wzVersion, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetSpecVersion(IWICBitmapDecoderInfo *iface, UINT cchSpecVersion,
+ WCHAR *wzSpecVersion, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchSpecVersion, wzSpecVersion, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetFriendlyName(IWICBitmapDecoderInfo *iface, UINT cchFriendlyName,
+ WCHAR *wzFriendlyName, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchFriendlyName, wzFriendlyName, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetContainerFormat(IWICBitmapDecoderInfo *iface,
+ GUID *pguidContainerFormat)
+{
+ FIXME("(%p,%p): stub\n", iface, pguidContainerFormat);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetPixelFormats(IWICBitmapDecoderInfo *iface,
+ UINT cFormats, GUID *pguidPixelFormats, UINT *pcActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cFormats, pguidPixelFormats, pcActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetColorManagementVersion(IWICBitmapDecoderInfo *iface,
+ UINT cchColorManagementVersion, WCHAR *wzColorManagementVersion, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchColorManagementVersion, wzColorManagementVersion, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetDeviceManufacturer(IWICBitmapDecoderInfo *iface,
+ UINT cchDeviceManufacturer, WCHAR *wzDeviceManufacturer, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchDeviceManufacturer, wzDeviceManufacturer, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetDeviceModels(IWICBitmapDecoderInfo *iface,
+ UINT cchDeviceModels, WCHAR *wzDeviceModels, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchDeviceModels, wzDeviceModels, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetMimeTypes(IWICBitmapDecoderInfo *iface,
+ UINT cchMimeTypes, WCHAR *wzMimeTypes, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchMimeTypes, wzMimeTypes, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetFileExtensions(IWICBitmapDecoderInfo *iface,
+ UINT cchFileExtensions, WCHAR *wzFileExtensions, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchFileExtensions, wzFileExtensions, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_DoesSupportAnimation(IWICBitmapDecoderInfo *iface,
+ BOOL *pfSupportAnimation)
+{
+ FIXME("(%p,%p): stub\n", iface, pfSupportAnimation);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_DoesSupportChromaKey(IWICBitmapDecoderInfo *iface,
+ BOOL *pfSupportChromaKey)
+{
+ FIXME("(%p,%p): stub\n", iface, pfSupportChromaKey);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_DoesSupportLossless(IWICBitmapDecoderInfo *iface,
+ BOOL *pfSupportLossless)
+{
+ FIXME("(%p,%p): stub\n", iface, pfSupportLossless);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_DoesSupportMultiframe(IWICBitmapDecoderInfo *iface,
+ BOOL *pfSupportMultiframe)
+{
+ FIXME("(%p,%p): stub\n", iface, pfSupportMultiframe);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_MatchesMimeType(IWICBitmapDecoderInfo *iface,
+ LPCWSTR wzMimeType, BOOL *pfMatches)
+{
+ FIXME("(%p,%s,%p): stub\n", iface, debugstr_w(wzMimeType), pfMatches);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_GetPatterns(IWICBitmapDecoderInfo *iface,
+ UINT cbSizePatterns, WICBitmapPattern *pPatterns, UINT *pcPatterns, UINT *pcbPatternsActual)
+{
+ BitmapDecoderInfo *This = (BitmapDecoderInfo*)iface;
+ UINT pattern_count=0, patterns_size=0;
+ WCHAR subkeyname[11];
+ LONG res;
+ HKEY patternskey, patternkey;
+ static const WCHAR uintformatW[] = {'%','u',0};
+ static const WCHAR patternsW[] = {'P','a','t','t','e','r','n','s',0};
+ static const WCHAR positionW[] = {'P','o','s','i','t','i','o','n',0};
+ static const WCHAR lengthW[] = {'L','e','n','g','t','h',0};
+ static const WCHAR patternW[] = {'P','a','t','t','e','r','n',0};
+ static const WCHAR maskW[] = {'M','a','s','k',0};
+ static const WCHAR endofstreamW[] = {'E','n','d','O','f','S','t','r','e','a','m',0};
+ HRESULT hr=S_OK;
+ UINT i;
+ BYTE *bPatterns=(BYTE*)pPatterns;
+ DWORD length, valuesize;
+
+ TRACE("(%p,%i,%p,%p,%p)\n", iface, cbSizePatterns, pPatterns, pcPatterns, pcbPatternsActual);
+
+ res = RegOpenKeyExW(This->classkey, patternsW, 0, KEY_READ, &patternskey);
+ if (res != ERROR_SUCCESS) return HRESULT_FROM_WIN32(res);
+
+ res = RegQueryInfoKeyW(patternskey, NULL, NULL, NULL, &pattern_count, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ if (res == ERROR_SUCCESS)
+ {
+ patterns_size = pattern_count * sizeof(WICBitmapPattern);
+
+ for (i=0; i= patterns_size) && (res == ERROR_SUCCESS))
+ {
+ pPatterns[i].Length = length;
+
+ pPatterns[i].EndOfStream = 0;
+ valuesize = sizeof(BOOL);
+ RegGetValueW(patternkey, NULL, endofstreamW, RRF_RT_DWORD, NULL,
+ &pPatterns[i].EndOfStream, &valuesize);
+
+ pPatterns[i].Position.QuadPart = 0;
+ valuesize = sizeof(ULARGE_INTEGER);
+ res = RegGetValueW(patternkey, NULL, positionW, RRF_RT_DWORD|RRF_RT_QWORD, NULL,
+ &pPatterns[i].Position, &valuesize);
+
+ if (res == ERROR_SUCCESS)
+ {
+ pPatterns[i].Pattern = bPatterns+patterns_size-length*2;
+ valuesize = length;
+ res = RegGetValueW(patternkey, NULL, patternW, RRF_RT_REG_BINARY, NULL,
+ pPatterns[i].Pattern, &valuesize);
+ }
+
+ if (res == ERROR_SUCCESS)
+ {
+ pPatterns[i].Mask = bPatterns+patterns_size-length;
+ valuesize = length;
+ res = RegGetValueW(patternkey, NULL, maskW, RRF_RT_REG_BINARY, NULL,
+ pPatterns[i].Mask, &valuesize);
+ }
+ }
+
+ RegCloseKey(patternkey);
+ }
+ if (res != ERROR_SUCCESS)
+ {
+ hr = HRESULT_FROM_WIN32(res);
+ break;
+ }
+ }
+ }
+ else hr = HRESULT_FROM_WIN32(res);
+
+ RegCloseKey(patternskey);
+
+ if (hr == S_OK)
+ {
+ *pcPatterns = pattern_count;
+ *pcbPatternsActual = patterns_size;
+ if (pPatterns && cbSizePatterns < patterns_size)
+ hr = WINCODEC_ERR_INSUFFICIENTBUFFER;
+ }
+
+ return hr;
+}
+
+static HRESULT WINAPI BitmapDecoderInfo_MatchesPattern(IWICBitmapDecoderInfo *iface,
+ IStream *pIStream, BOOL *pfMatches)
+{
+ WICBitmapPattern *patterns;
+ UINT pattern_count=0, patterns_size=0;
+ HRESULT hr;
+ int i, pos;
+ BYTE *data=NULL;
+ ULONG datasize=0;
+ ULONG bytesread;
+ LARGE_INTEGER seekpos;
+
+ TRACE("(%p,%p,%p)\n", iface, pIStream, pfMatches);
+
+ hr = BitmapDecoderInfo_GetPatterns(iface, 0, NULL, &pattern_count, &patterns_size);
+ if (FAILED(hr)) return hr;
+
+ patterns = HeapAlloc(GetProcessHeap(), 0, patterns_size);
+ if (!patterns) return E_OUTOFMEMORY;
+
+ hr = BitmapDecoderInfo_GetPatterns(iface, patterns_size, patterns, &pattern_count, &patterns_size);
+ if (FAILED(hr)) goto end;
+
+ for (i=0; iclsid, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICBitmapDecoder, (void**)ppIBitmapDecoder);
+}
+
+static const IWICBitmapDecoderInfoVtbl BitmapDecoderInfo_Vtbl = {
+ BitmapDecoderInfo_QueryInterface,
+ BitmapDecoderInfo_AddRef,
+ BitmapDecoderInfo_Release,
+ BitmapDecoderInfo_GetComponentType,
+ BitmapDecoderInfo_GetCLSID,
+ BitmapDecoderInfo_GetSigningStatus,
+ BitmapDecoderInfo_GetAuthor,
+ BitmapDecoderInfo_GetVendorGUID,
+ BitmapDecoderInfo_GetVersion,
+ BitmapDecoderInfo_GetSpecVersion,
+ BitmapDecoderInfo_GetFriendlyName,
+ BitmapDecoderInfo_GetContainerFormat,
+ BitmapDecoderInfo_GetPixelFormats,
+ BitmapDecoderInfo_GetColorManagementVersion,
+ BitmapDecoderInfo_GetDeviceManufacturer,
+ BitmapDecoderInfo_GetDeviceModels,
+ BitmapDecoderInfo_GetMimeTypes,
+ BitmapDecoderInfo_GetFileExtensions,
+ BitmapDecoderInfo_DoesSupportAnimation,
+ BitmapDecoderInfo_DoesSupportChromaKey,
+ BitmapDecoderInfo_DoesSupportLossless,
+ BitmapDecoderInfo_DoesSupportMultiframe,
+ BitmapDecoderInfo_MatchesMimeType,
+ BitmapDecoderInfo_GetPatterns,
+ BitmapDecoderInfo_MatchesPattern,
+ BitmapDecoderInfo_CreateInstance
+};
+
+static HRESULT BitmapDecoderInfo_Constructor(HKEY classkey, REFCLSID clsid, IWICComponentInfo **ppIInfo)
+{
+ BitmapDecoderInfo *This;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(BitmapDecoderInfo));
+ if (!This)
+ {
+ RegCloseKey(classkey);
+ return E_OUTOFMEMORY;
+ }
+
+ This->lpIWICBitmapDecoderInfoVtbl = &BitmapDecoderInfo_Vtbl;
+ This->ref = 1;
+ This->classkey = classkey;
+ memcpy(&This->clsid, clsid, sizeof(CLSID));
+
+ *ppIInfo = (IWICComponentInfo*)This;
+ return S_OK;
+}
+
+typedef struct {
+ const IWICFormatConverterInfoVtbl *lpIWICFormatConverterInfoVtbl;
+ LONG ref;
+ HKEY classkey;
+ CLSID clsid;
+} FormatConverterInfo;
+
+static HRESULT WINAPI FormatConverterInfo_QueryInterface(IWICFormatConverterInfo *iface, REFIID iid,
+ void **ppv)
+{
+ FormatConverterInfo *This = (FormatConverterInfo*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IWICComponentInfo, iid) ||
+ IsEqualIID(&IID_IWICFormatConverterInfo ,iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI FormatConverterInfo_AddRef(IWICFormatConverterInfo *iface)
+{
+ FormatConverterInfo *This = (FormatConverterInfo*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI FormatConverterInfo_Release(IWICFormatConverterInfo *iface)
+{
+ FormatConverterInfo *This = (FormatConverterInfo*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ RegCloseKey(This->classkey);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI FormatConverterInfo_GetComponentType(IWICFormatConverterInfo *iface,
+ WICComponentType *pType)
+{
+ TRACE("(%p,%p)\n", iface, pType);
+ *pType = WICPixelFormatConverter;
+ return S_OK;
+}
+
+static HRESULT WINAPI FormatConverterInfo_GetCLSID(IWICFormatConverterInfo *iface, CLSID *pclsid)
+{
+ FIXME("(%p,%p): stub\n", iface, pclsid);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI FormatConverterInfo_GetSigningStatus(IWICFormatConverterInfo *iface, DWORD *pStatus)
+{
+ FIXME("(%p,%p): stub\n", iface, pStatus);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI FormatConverterInfo_GetAuthor(IWICFormatConverterInfo *iface, UINT cchAuthor,
+ WCHAR *wzAuthor, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchAuthor, wzAuthor, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI FormatConverterInfo_GetVendorGUID(IWICFormatConverterInfo *iface, GUID *pguidVendor)
+{
+ FIXME("(%p,%p): stub\n", iface, pguidVendor);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI FormatConverterInfo_GetVersion(IWICFormatConverterInfo *iface, UINT cchVersion,
+ WCHAR *wzVersion, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchVersion, wzVersion, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI FormatConverterInfo_GetSpecVersion(IWICFormatConverterInfo *iface, UINT cchSpecVersion,
+ WCHAR *wzSpecVersion, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchSpecVersion, wzSpecVersion, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI FormatConverterInfo_GetFriendlyName(IWICFormatConverterInfo *iface, UINT cchFriendlyName,
+ WCHAR *wzFriendlyName, UINT *pcchActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cchFriendlyName, wzFriendlyName, pcchActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI FormatConverterInfo_GetPixelFormats(IWICFormatConverterInfo *iface,
+ UINT cFormats, GUID *pguidPixelFormats, UINT *pcActual)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cFormats, pguidPixelFormats, pcActual);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI FormatConverterInfo_CreateInstance(IWICFormatConverterInfo *iface,
+ IWICFormatConverter **ppIFormatConverter)
+{
+ FormatConverterInfo *This = (FormatConverterInfo*)iface;
+
+ TRACE("(%p,%p)\n", iface, ppIFormatConverter);
+
+ return CoCreateInstance(&This->clsid, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICFormatConverter, (void**)ppIFormatConverter);
+}
+
+static BOOL ConverterSupportsFormat(IWICFormatConverterInfo *iface, const WCHAR *formatguid)
+{
+ LONG res;
+ FormatConverterInfo *This = (FormatConverterInfo*)iface;
+ HKEY formats_key, guid_key;
+
+ /* Avoid testing using IWICFormatConverter_GetPixelFormats because that
+ would be O(n). A registry test should do better. */
+
+ res = RegOpenKeyExW(This->classkey, pixelformats_keyname, 0, KEY_READ, &formats_key);
+ if (res != ERROR_SUCCESS) return FALSE;
+
+ res = RegOpenKeyExW(formats_key, formatguid, 0, KEY_READ, &guid_key);
+ if (res == ERROR_SUCCESS) RegCloseKey(guid_key);
+
+ RegCloseKey(formats_key);
+
+ return (res == ERROR_SUCCESS);
+}
+
+static const IWICFormatConverterInfoVtbl FormatConverterInfo_Vtbl = {
+ FormatConverterInfo_QueryInterface,
+ FormatConverterInfo_AddRef,
+ FormatConverterInfo_Release,
+ FormatConverterInfo_GetComponentType,
+ FormatConverterInfo_GetCLSID,
+ FormatConverterInfo_GetSigningStatus,
+ FormatConverterInfo_GetAuthor,
+ FormatConverterInfo_GetVendorGUID,
+ FormatConverterInfo_GetVersion,
+ FormatConverterInfo_GetSpecVersion,
+ FormatConverterInfo_GetFriendlyName,
+ FormatConverterInfo_GetPixelFormats,
+ FormatConverterInfo_CreateInstance
+};
+
+static HRESULT FormatConverterInfo_Constructor(HKEY classkey, REFCLSID clsid, IWICComponentInfo **ppIInfo)
+{
+ FormatConverterInfo *This;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(FormatConverterInfo));
+ if (!This)
+ {
+ RegCloseKey(classkey);
+ return E_OUTOFMEMORY;
+ }
+
+ This->lpIWICFormatConverterInfoVtbl = &FormatConverterInfo_Vtbl;
+ This->ref = 1;
+ This->classkey = classkey;
+ memcpy(&This->clsid, clsid, sizeof(CLSID));
+
+ *ppIInfo = (IWICComponentInfo*)This;
+ return S_OK;
+}
+
+static WCHAR const clsid_keyname[] = {'C','L','S','I','D',0};
+static WCHAR const instance_keyname[] = {'I','n','s','t','a','n','c','e',0};
+
+struct category {
+ WICComponentType type;
+ const GUID *catid;
+ HRESULT (*constructor)(HKEY,REFCLSID,IWICComponentInfo**);
+};
+
+static const struct category categories[] = {
+ {WICDecoder, &CATID_WICBitmapDecoders, BitmapDecoderInfo_Constructor},
+ {WICPixelFormatConverter, &CATID_WICFormatConverters, FormatConverterInfo_Constructor},
+ {0}
+};
+
+HRESULT CreateComponentInfo(REFCLSID clsid, IWICComponentInfo **ppIInfo)
+{
+ HKEY clsidkey;
+ HKEY classkey;
+ HKEY catidkey;
+ HKEY instancekey;
+ WCHAR guidstring[39];
+ LONG res;
+ const struct category *category;
+ int found=0;
+ HRESULT hr;
+
+ res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, KEY_READ, &clsidkey);
+ if (res != ERROR_SUCCESS)
+ return HRESULT_FROM_WIN32(res);
+
+ for (category=categories; category->type; category++)
+ {
+ StringFromGUID2(category->catid, guidstring, 39);
+ res = RegOpenKeyExW(clsidkey, guidstring, 0, KEY_READ, &catidkey);
+ if (res == ERROR_SUCCESS)
+ {
+ res = RegOpenKeyExW(catidkey, instance_keyname, 0, KEY_READ, &instancekey);
+ if (res == ERROR_SUCCESS)
+ {
+ StringFromGUID2(clsid, guidstring, 39);
+ res = RegOpenKeyExW(instancekey, guidstring, 0, KEY_READ, &classkey);
+ if (res == ERROR_SUCCESS)
+ {
+ RegCloseKey(classkey);
+ found = 1;
+ }
+ RegCloseKey(instancekey);
+ }
+ RegCloseKey(catidkey);
+ }
+ if (found) break;
+ }
+
+ if (found)
+ {
+ res = RegOpenKeyExW(clsidkey, guidstring, 0, KEY_READ, &classkey);
+ if (res == ERROR_SUCCESS)
+ hr = category->constructor(classkey, clsid, ppIInfo);
+ else
+ hr = HRESULT_FROM_WIN32(res);
+ }
+ else
+ hr = E_FAIL;
+
+ RegCloseKey(clsidkey);
+
+ return hr;
+}
+
+typedef struct {
+ const IEnumUnknownVtbl *IEnumUnknown_Vtbl;
+ LONG ref;
+ struct list objects;
+ struct list *cursor;
+} ComponentEnum;
+
+typedef struct {
+ struct list entry;
+ IUnknown *unk;
+} ComponentEnumItem;
+
+static const IEnumUnknownVtbl ComponentEnumVtbl;
+
+static HRESULT WINAPI ComponentEnum_QueryInterface(IEnumUnknown *iface, REFIID iid,
+ void **ppv)
+{
+ ComponentEnum *This = (ComponentEnum*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IEnumUnknown, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI ComponentEnum_AddRef(IEnumUnknown *iface)
+{
+ ComponentEnum *This = (ComponentEnum*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI ComponentEnum_Release(IEnumUnknown *iface)
+{
+ ComponentEnum *This = (ComponentEnum*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+ ComponentEnumItem *cursor, *cursor2;
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, &This->objects, ComponentEnumItem, entry)
+ {
+ IUnknown_Release(cursor->unk);
+ list_remove(&cursor->entry);
+ HeapFree(GetProcessHeap(), 0, cursor);
+ }
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI ComponentEnum_Next(IEnumUnknown *iface, ULONG celt,
+ IUnknown **rgelt, ULONG *pceltFetched)
+{
+ ComponentEnum *This = (ComponentEnum*)iface;
+ int num_fetched=0;
+ ComponentEnumItem *item;
+
+ TRACE("(%p,%u,%p,%p)\n", iface, celt, rgelt, pceltFetched);
+
+ while (num_fetchedcursor)
+ {
+ *pceltFetched = num_fetched;
+ return S_FALSE;
+ }
+ item = LIST_ENTRY(This->cursor, ComponentEnumItem, entry);
+ IUnknown_AddRef(item->unk);
+ rgelt[num_fetched] = item->unk;
+ num_fetched++;
+ This->cursor = list_next(&This->objects, This->cursor);
+ }
+ *pceltFetched = num_fetched;
+ return S_OK;
+}
+
+static HRESULT WINAPI ComponentEnum_Skip(IEnumUnknown *iface, ULONG celt)
+{
+ ComponentEnum *This = (ComponentEnum*)iface;
+ int i;
+
+ TRACE("(%p,%u)\n", iface, celt);
+
+ for (i=0; icursor)
+ return S_FALSE;
+ This->cursor = list_next(&This->objects, This->cursor);
+ }
+ return S_OK;
+}
+
+static HRESULT WINAPI ComponentEnum_Reset(IEnumUnknown *iface)
+{
+ ComponentEnum *This = (ComponentEnum*)iface;
+
+ TRACE("(%p)\n", iface);
+
+ This->cursor = list_head(&This->objects);
+ return S_OK;
+}
+
+static HRESULT WINAPI ComponentEnum_Clone(IEnumUnknown *iface, IEnumUnknown **ppenum)
+{
+ ComponentEnum *This = (ComponentEnum*)iface;
+ ComponentEnum *new_enum;
+ ComponentEnumItem *old_item, *new_item;
+ HRESULT ret=S_OK;
+
+ new_enum = HeapAlloc(GetProcessHeap(), 0, sizeof(ComponentEnum));
+ if (!new_enum)
+ {
+ *ppenum = NULL;
+ return E_OUTOFMEMORY;
+ }
+
+ new_enum->IEnumUnknown_Vtbl = &ComponentEnumVtbl;
+ new_enum->ref = 1;
+ new_enum->cursor = NULL;
+
+ list_init(&new_enum->objects);
+ LIST_FOR_EACH_ENTRY(old_item, &This->objects, ComponentEnumItem, entry)
+ {
+ new_item = HeapAlloc(GetProcessHeap(), 0, sizeof(ComponentEnumItem));
+ if (!new_item)
+ {
+ ret = E_OUTOFMEMORY;
+ break;
+ }
+ new_item->unk = old_item->unk;
+ list_add_tail(&new_enum->objects, &new_item->entry);
+ IUnknown_AddRef(new_item->unk);
+ if (&old_item->entry == This->cursor) new_enum->cursor = &new_item->entry;
+ }
+
+ if (FAILED(ret))
+ {
+ IUnknown_Release((IUnknown*)new_enum);
+ *ppenum = NULL;
+ }
+ else
+ *ppenum = (IEnumUnknown*)new_enum;
+
+ return ret;
+}
+
+static const IEnumUnknownVtbl ComponentEnumVtbl = {
+ ComponentEnum_QueryInterface,
+ ComponentEnum_AddRef,
+ ComponentEnum_Release,
+ ComponentEnum_Next,
+ ComponentEnum_Skip,
+ ComponentEnum_Reset,
+ ComponentEnum_Clone
+};
+
+HRESULT CreateComponentEnumerator(DWORD componentTypes, DWORD options, IEnumUnknown **ppIEnumUnknown)
+{
+ ComponentEnum *This;
+ ComponentEnumItem *item;
+ const struct category *category;
+ HKEY clsidkey, catidkey, instancekey;
+ WCHAR guidstring[39];
+ LONG res;
+ int i;
+ HRESULT hr=S_OK;
+ CLSID clsid;
+
+ if (options) FIXME("ignoring flags %x\n", options);
+
+ res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, KEY_READ, &clsidkey);
+ if (res != ERROR_SUCCESS)
+ return HRESULT_FROM_WIN32(res);
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(ComponentEnum));
+ if (!This)
+ {
+ RegCloseKey(clsidkey);
+ return E_OUTOFMEMORY;
+ }
+
+ This->IEnumUnknown_Vtbl = &ComponentEnumVtbl;
+ This->ref = 1;
+ list_init(&This->objects);
+
+ for (category=categories; category->type && hr == S_OK; category++)
+ {
+ if ((category->type & componentTypes) == 0) continue;
+ StringFromGUID2(category->catid, guidstring, 39);
+ res = RegOpenKeyExW(clsidkey, guidstring, 0, KEY_READ, &catidkey);
+ if (res == ERROR_SUCCESS)
+ {
+ res = RegOpenKeyExW(catidkey, instance_keyname, 0, KEY_READ, &instancekey);
+ if (res == ERROR_SUCCESS)
+ {
+ i=0;
+ for (;;i++)
+ {
+ DWORD guidstring_size = 39;
+ res = RegEnumKeyExW(instancekey, i, guidstring, &guidstring_size, NULL, NULL, NULL, NULL);
+ if (res != ERROR_SUCCESS) break;
+
+ item = HeapAlloc(GetProcessHeap(), 0, sizeof(ComponentEnumItem));
+ if (!item) { hr = E_OUTOFMEMORY; break; }
+
+ hr = CLSIDFromString(guidstring, &clsid);
+ if (SUCCEEDED(hr))
+ {
+ hr = CreateComponentInfo(&clsid, (IWICComponentInfo**)&item->unk);
+ if (SUCCEEDED(hr))
+ list_add_tail(&This->objects, &item->entry);
+ }
+
+ if (!SUCCEEDED(hr))
+ {
+ HeapFree(GetProcessHeap(), 0, item);
+ hr = S_OK;
+ }
+ }
+ RegCloseKey(instancekey);
+ }
+ RegCloseKey(catidkey);
+ }
+ if (res != ERROR_SUCCESS && res != ERROR_NO_MORE_ITEMS)
+ hr = HRESULT_FROM_WIN32(res);
+ }
+ RegCloseKey(clsidkey);
+
+ if (SUCCEEDED(hr))
+ {
+ IEnumUnknown_Reset((IEnumUnknown*)This);
+ *ppIEnumUnknown = (IEnumUnknown*)This;
+ }
+ else
+ {
+ *ppIEnumUnknown = NULL;
+ IUnknown_Release((IUnknown*)This);
+ }
+
+ return hr;
+}
+
+HRESULT WINAPI WICConvertBitmapSource(REFWICPixelFormatGUID dstFormat, IWICBitmapSource *pISrc, IWICBitmapSource **ppIDst)
+{
+ HRESULT res;
+ IEnumUnknown *enumconverters;
+ IUnknown *unkconverterinfo;
+ IWICFormatConverterInfo *converterinfo=NULL;
+ IWICFormatConverter *converter=NULL;
+ GUID srcFormat;
+ WCHAR srcformatstr[39], dstformatstr[39];
+ BOOL canconvert;
+ ULONG num_fetched;
+
+ res = IWICBitmapSource_GetPixelFormat(pISrc, &srcFormat);
+ if (FAILED(res)) return res;
+
+ if (IsEqualGUID(&srcFormat, dstFormat))
+ {
+ IWICBitmapSource_AddRef(pISrc);
+ *ppIDst = pISrc;
+ return S_OK;
+ }
+
+ StringFromGUID2(&srcFormat, srcformatstr, 39);
+ StringFromGUID2(dstFormat, dstformatstr, 39);
+
+ res = CreateComponentEnumerator(WICPixelFormatConverter, 0, &enumconverters);
+ if (FAILED(res)) return res;
+
+ while (!converter)
+ {
+ res = IEnumUnknown_Next(enumconverters, 1, &unkconverterinfo, &num_fetched);
+
+ if (res == S_OK)
+ {
+ res = IUnknown_QueryInterface(unkconverterinfo, &IID_IWICFormatConverterInfo, (void**)&converterinfo);
+
+ if (SUCCEEDED(res))
+ {
+ canconvert = ConverterSupportsFormat(converterinfo, srcformatstr);
+
+ if (canconvert)
+ canconvert = ConverterSupportsFormat(converterinfo, dstformatstr);
+
+ if (canconvert)
+ {
+ res = IWICFormatConverterInfo_CreateInstance(converterinfo, &converter);
+
+ if (SUCCEEDED(res))
+ res = IWICFormatConverter_CanConvert(converter, &srcFormat, dstFormat, &canconvert);
+
+ if (SUCCEEDED(res) && canconvert)
+ res = IWICFormatConverter_Initialize(converter, pISrc, dstFormat, WICBitmapDitherTypeNone,
+ NULL, 0.0, WICBitmapPaletteTypeCustom);
+
+ if (FAILED(res) || !canconvert)
+ {
+ if (converter)
+ {
+ IWICFormatConverter_Release(converter);
+ converter = NULL;
+ }
+ res = S_OK;
+ }
+ }
+
+ IWICFormatConverterInfo_Release(converterinfo);
+ }
+
+ IUnknown_Release(unkconverterinfo);
+ }
+ else
+ break;
+ }
+
+ IEnumUnknown_Release(enumconverters);
+
+ if (converter)
+ {
+ *ppIDst = (IWICBitmapSource*)converter;
+ return S_OK;
+ }
+ else
+ {
+ FIXME("cannot convert %s to %s\n", debugstr_guid(&srcFormat), debugstr_guid(dstFormat));
+ *ppIDst = NULL;
+ return WINCODEC_ERR_COMPONENTNOTFOUND;
+ }
+}
diff --git a/reactos/dll/win32/windowscodecs/jpegformat.c b/reactos/dll/win32/windowscodecs/jpegformat.c
new file mode 100644
index 00000000000..6f788216fbe
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/jpegformat.c
@@ -0,0 +1,577 @@
+/*
+ * Copyright 2009 Vincent Povirk 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 "wine/port.h"
+
+#ifdef HAVE_UNISTD_H
+# include
+#endif
+#include
+#include
+#include
+
+#ifdef SONAME_LIBJPEG
+/* This is a hack, so jpeglib.h does not redefine INT32 and the like*/
+#define XMD_H
+#define UINT8 JPEG_UINT8
+#define UINT16 JPEG_UINT16
+#define boolean jpeg_boolean
+#undef HAVE_STDLIB_H
+# include
+#undef HAVE_STDLIB_H
+#define HAVE_STDLIB_H 1
+#undef UINT8
+#undef UINT16
+#undef boolean
+#endif
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+#include "wine/library.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+#ifdef SONAME_LIBJPEG
+
+static void *libjpeg_handle;
+
+#define MAKE_FUNCPTR(f) static typeof(f) * p##f
+MAKE_FUNCPTR(jpeg_CreateDecompress);
+MAKE_FUNCPTR(jpeg_destroy_decompress);
+MAKE_FUNCPTR(jpeg_read_header);
+MAKE_FUNCPTR(jpeg_read_scanlines);
+MAKE_FUNCPTR(jpeg_resync_to_restart);
+MAKE_FUNCPTR(jpeg_start_decompress);
+MAKE_FUNCPTR(jpeg_std_error);
+#undef MAKE_FUNCPTR
+
+static void *load_libjpeg(void)
+{
+ if((libjpeg_handle = wine_dlopen(SONAME_LIBJPEG, RTLD_NOW, NULL, 0)) != NULL) {
+
+#define LOAD_FUNCPTR(f) \
+ if((p##f = wine_dlsym(libjpeg_handle, #f, NULL, 0)) == NULL) { \
+ libjpeg_handle = NULL; \
+ return NULL; \
+ }
+
+ LOAD_FUNCPTR(jpeg_CreateDecompress);
+ LOAD_FUNCPTR(jpeg_destroy_decompress);
+ LOAD_FUNCPTR(jpeg_read_header);
+ LOAD_FUNCPTR(jpeg_read_scanlines);
+ LOAD_FUNCPTR(jpeg_resync_to_restart);
+ LOAD_FUNCPTR(jpeg_start_decompress);
+ LOAD_FUNCPTR(jpeg_std_error);
+#undef LOAD_FUNCPTR
+ }
+ return libjpeg_handle;
+}
+
+typedef struct {
+ const IWICBitmapDecoderVtbl *lpVtbl;
+ const IWICBitmapFrameDecodeVtbl *lpFrameVtbl;
+ LONG ref;
+ BOOL initialized;
+ BOOL cinfo_initialized;
+ IStream *stream;
+ struct jpeg_decompress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ struct jpeg_source_mgr source_mgr;
+ BYTE source_buffer[1024];
+ BYTE *image_data;
+} JpegDecoder;
+
+static inline JpegDecoder *decoder_from_decompress(j_decompress_ptr decompress)
+{
+ return CONTAINING_RECORD(decompress, JpegDecoder, cinfo);
+}
+
+static inline JpegDecoder *decoder_from_frame(IWICBitmapFrameDecode *iface)
+{
+ return CONTAINING_RECORD(iface, JpegDecoder, lpFrameVtbl);
+}
+
+static HRESULT WINAPI JpegDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid,
+ void **ppv)
+{
+ JpegDecoder *This = (JpegDecoder*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICBitmapDecoder, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI JpegDecoder_AddRef(IWICBitmapDecoder *iface)
+{
+ JpegDecoder *This = (JpegDecoder*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI JpegDecoder_Release(IWICBitmapDecoder *iface)
+{
+ JpegDecoder *This = (JpegDecoder*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ if (This->cinfo_initialized) pjpeg_destroy_decompress(&This->cinfo);
+ if (This->stream) IStream_Release(This->stream);
+ HeapFree(GetProcessHeap(), 0, This->image_data);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI JpegDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *pIStream,
+ DWORD *pdwCapability)
+{
+ FIXME("(%p,%p,%p): stub\n", iface, pIStream, pdwCapability);
+ return E_NOTIMPL;
+}
+
+static void source_mgr_init_source(j_decompress_ptr cinfo)
+{
+}
+
+static jpeg_boolean source_mgr_fill_input_buffer(j_decompress_ptr cinfo)
+{
+ JpegDecoder *This = decoder_from_decompress(cinfo);
+ HRESULT hr;
+ ULONG bytesread;
+
+ hr = IStream_Read(This->stream, This->source_buffer, 1024, &bytesread);
+
+ if (hr != S_OK || bytesread == 0)
+ {
+ return FALSE;
+ }
+ else
+ {
+ This->source_mgr.next_input_byte = This->source_buffer;
+ This->source_mgr.bytes_in_buffer = bytesread;
+ return TRUE;
+ }
+}
+
+static void source_mgr_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
+{
+ JpegDecoder *This = decoder_from_decompress(cinfo);
+ LARGE_INTEGER seek;
+
+ if (num_bytes > This->source_mgr.bytes_in_buffer)
+ {
+ seek.QuadPart = num_bytes - This->source_mgr.bytes_in_buffer;
+ IStream_Seek(This->stream, seek, STREAM_SEEK_CUR, NULL);
+ This->source_mgr.bytes_in_buffer = 0;
+ }
+ else if (num_bytes > 0)
+ {
+ This->source_mgr.next_input_byte += num_bytes;
+ This->source_mgr.bytes_in_buffer -= num_bytes;
+ }
+}
+
+static void source_mgr_term_source(j_decompress_ptr cinfo)
+{
+}
+
+static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream,
+ WICDecodeOptions cacheOptions)
+{
+ JpegDecoder *This = (JpegDecoder*)iface;
+ int ret;
+ TRACE("(%p,%p,%u)\n", iface, pIStream, cacheOptions);
+
+ if (This->cinfo_initialized) return WINCODEC_ERR_WRONGSTATE;
+
+ This->cinfo.err = pjpeg_std_error(&This->jerr);
+
+ pjpeg_CreateDecompress(&This->cinfo, JPEG_LIB_VERSION, sizeof(struct jpeg_decompress_struct));
+
+ This->cinfo_initialized = TRUE;
+
+ This->stream = pIStream;
+ IStream_AddRef(pIStream);
+
+ This->source_mgr.bytes_in_buffer = 0;
+ This->source_mgr.init_source = source_mgr_init_source;
+ This->source_mgr.fill_input_buffer = source_mgr_fill_input_buffer;
+ This->source_mgr.skip_input_data = source_mgr_skip_input_data;
+ This->source_mgr.resync_to_restart = pjpeg_resync_to_restart;
+ This->source_mgr.term_source = source_mgr_term_source;
+
+ This->cinfo.src = &This->source_mgr;
+
+ ret = pjpeg_read_header(&This->cinfo, TRUE);
+
+ if (ret != JPEG_HEADER_OK) {
+ WARN("Jpeg image in stream has bad format, read header returned %d.\n",ret);
+ return E_FAIL;
+ }
+
+ if (This->cinfo.jpeg_color_space == JCS_GRAYSCALE)
+ This->cinfo.out_color_space = JCS_GRAYSCALE;
+ else
+ This->cinfo.out_color_space = JCS_RGB;
+
+ if (!pjpeg_start_decompress(&This->cinfo))
+ {
+ ERR("jpeg_start_decompress failed\n");
+ return E_FAIL;
+ }
+
+ This->initialized = TRUE;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI JpegDecoder_GetContainerFormat(IWICBitmapDecoder *iface,
+ GUID *pguidContainerFormat)
+{
+ memcpy(pguidContainerFormat, &GUID_ContainerFormatJpeg, sizeof(GUID));
+ return S_OK;
+}
+
+static HRESULT WINAPI JpegDecoder_GetDecoderInfo(IWICBitmapDecoder *iface,
+ IWICBitmapDecoderInfo **ppIDecoderInfo)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIDecoderInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI JpegDecoder_CopyPalette(IWICBitmapDecoder *iface,
+ IWICPalette *pIPalette)
+{
+ TRACE("(%p,%p)\n", iface, pIPalette);
+
+ return WINCODEC_ERR_PALETTEUNAVAILABLE;
+}
+
+static HRESULT WINAPI JpegDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface,
+ IWICMetadataQueryReader **ppIMetadataQueryReader)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryReader);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI JpegDecoder_GetPreview(IWICBitmapDecoder *iface,
+ IWICBitmapSource **ppIBitmapSource)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIBitmapSource);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI JpegDecoder_GetColorContexts(IWICBitmapDecoder *iface,
+ UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cCount, ppIColorContexts, pcActualCount);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI JpegDecoder_GetThumbnail(IWICBitmapDecoder *iface,
+ IWICBitmapSource **ppIThumbnail)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIThumbnail);
+ return WINCODEC_ERR_CODECNOTHUMBNAIL;
+}
+
+static HRESULT WINAPI JpegDecoder_GetFrameCount(IWICBitmapDecoder *iface,
+ UINT *pCount)
+{
+ *pCount = 1;
+ return S_OK;
+}
+
+static HRESULT WINAPI JpegDecoder_GetFrame(IWICBitmapDecoder *iface,
+ UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
+{
+ JpegDecoder *This = (JpegDecoder*)iface;
+ TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame);
+
+ if (!This->initialized) return WINCODEC_ERR_NOTINITIALIZED;
+
+ if (index != 0) return E_INVALIDARG;
+
+ IWICBitmapDecoder_AddRef(iface);
+ *ppIBitmapFrame = (IWICBitmapFrameDecode*)&This->lpFrameVtbl;
+
+ return S_OK;
+}
+
+static const IWICBitmapDecoderVtbl JpegDecoder_Vtbl = {
+ JpegDecoder_QueryInterface,
+ JpegDecoder_AddRef,
+ JpegDecoder_Release,
+ JpegDecoder_QueryCapability,
+ JpegDecoder_Initialize,
+ JpegDecoder_GetContainerFormat,
+ JpegDecoder_GetDecoderInfo,
+ JpegDecoder_CopyPalette,
+ JpegDecoder_GetMetadataQueryReader,
+ JpegDecoder_GetPreview,
+ JpegDecoder_GetColorContexts,
+ JpegDecoder_GetThumbnail,
+ JpegDecoder_GetFrameCount,
+ JpegDecoder_GetFrame
+};
+
+static HRESULT WINAPI JpegDecoder_Frame_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid,
+ void **ppv)
+{
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IWICBitmapSource, iid) ||
+ IsEqualIID(&IID_IWICBitmapFrameDecode, iid))
+ {
+ *ppv = iface;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI JpegDecoder_Frame_AddRef(IWICBitmapFrameDecode *iface)
+{
+ JpegDecoder *This = decoder_from_frame(iface);
+ return IUnknown_AddRef((IUnknown*)This);
+}
+
+static ULONG WINAPI JpegDecoder_Frame_Release(IWICBitmapFrameDecode *iface)
+{
+ JpegDecoder *This = decoder_from_frame(iface);
+ return IUnknown_Release((IUnknown*)This);
+}
+
+static HRESULT WINAPI JpegDecoder_Frame_GetSize(IWICBitmapFrameDecode *iface,
+ UINT *puiWidth, UINT *puiHeight)
+{
+ JpegDecoder *This = decoder_from_frame(iface);
+ *puiWidth = This->cinfo.output_width;
+ *puiHeight = This->cinfo.output_height;
+ TRACE("(%p)->(%u,%u)\n", iface, *puiWidth, *puiHeight);
+ return S_OK;
+}
+
+static HRESULT WINAPI JpegDecoder_Frame_GetPixelFormat(IWICBitmapFrameDecode *iface,
+ WICPixelFormatGUID *pPixelFormat)
+{
+ JpegDecoder *This = decoder_from_frame(iface);
+ TRACE("(%p,%p)\n", iface, pPixelFormat);
+ if (This->cinfo.out_color_space == JCS_RGB)
+ memcpy(pPixelFormat, &GUID_WICPixelFormat24bppBGR, sizeof(GUID));
+ else /* This->cinfo.out_color_space == JCS_GRAYSCALE */
+ memcpy(pPixelFormat, &GUID_WICPixelFormat8bppGray, sizeof(GUID));
+ return S_OK;
+}
+
+static HRESULT WINAPI JpegDecoder_Frame_GetResolution(IWICBitmapFrameDecode *iface,
+ double *pDpiX, double *pDpiY)
+{
+ FIXME("(%p,%p,%p): stub\n", iface, pDpiX, pDpiY);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI JpegDecoder_Frame_CopyPalette(IWICBitmapFrameDecode *iface,
+ IWICPalette *pIPalette)
+{
+ FIXME("(%p,%p): stub\n", iface, pIPalette);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface,
+ const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
+{
+ JpegDecoder *This = decoder_from_frame(iface);
+ UINT bpp;
+ UINT stride;
+ UINT data_size;
+ UINT max_row_needed;
+ TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
+
+ if (This->cinfo.out_color_space == JCS_GRAYSCALE) bpp = 8;
+ else bpp = 24;
+
+ stride = bpp * This->cinfo.output_width;
+ data_size = stride * This->cinfo.output_height;
+
+ max_row_needed = prc->Y + prc->Height;
+ if (max_row_needed > This->cinfo.output_height) return E_INVALIDARG;
+
+ if (!This->image_data)
+ {
+ This->image_data = HeapAlloc(GetProcessHeap(), 0, data_size);
+ if (!This->image_data) return E_OUTOFMEMORY;
+ }
+
+ while (max_row_needed > This->cinfo.output_scanline)
+ {
+ UINT first_scanline = This->cinfo.output_scanline;
+ UINT max_rows;
+ JSAMPROW out_rows[4];
+ UINT i, j;
+ JDIMENSION ret;
+
+ max_rows = min(This->cinfo.output_height-first_scanline, 4);
+ for (i=0; iimage_data + stride * (first_scanline+i);
+
+ ret = pjpeg_read_scanlines(&This->cinfo, out_rows, max_rows);
+
+ if (ret == 0)
+ {
+ ERR("read_scanlines failed\n");
+ return E_FAIL;
+ }
+
+ if (bpp == 24)
+ {
+ /* libjpeg gives us RGB data and we want BGR, so byteswap the data */
+ for (i=first_scanline; icinfo.output_scanline; i++)
+ {
+ BYTE *pixel = This->image_data + stride * i;
+ for (j=0; jcinfo.output_width; j++)
+ {
+ BYTE red=pixel[0];
+ BYTE blue=pixel[2];
+ pixel[0]=blue;
+ pixel[2]=red;
+ pixel+=3;
+ }
+ }
+ }
+ }
+
+ return copy_pixels(bpp, This->image_data,
+ This->cinfo.output_width, This->cinfo.output_height, stride,
+ prc, cbStride, cbBufferSize, pbBuffer);
+}
+
+static HRESULT WINAPI JpegDecoder_Frame_GetMetadataQueryReader(IWICBitmapFrameDecode *iface,
+ IWICMetadataQueryReader **ppIMetadataQueryReader)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryReader);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI JpegDecoder_Frame_GetColorContexts(IWICBitmapFrameDecode *iface,
+ UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cCount, ppIColorContexts, pcActualCount);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI JpegDecoder_Frame_GetThumbnail(IWICBitmapFrameDecode *iface,
+ IWICBitmapSource **ppIThumbnail)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIThumbnail);
+ return WINCODEC_ERR_CODECNOTHUMBNAIL;
+}
+
+static const IWICBitmapFrameDecodeVtbl JpegDecoder_Frame_Vtbl = {
+ JpegDecoder_Frame_QueryInterface,
+ JpegDecoder_Frame_AddRef,
+ JpegDecoder_Frame_Release,
+ JpegDecoder_Frame_GetSize,
+ JpegDecoder_Frame_GetPixelFormat,
+ JpegDecoder_Frame_GetResolution,
+ JpegDecoder_Frame_CopyPalette,
+ JpegDecoder_Frame_CopyPixels,
+ JpegDecoder_Frame_GetMetadataQueryReader,
+ JpegDecoder_Frame_GetColorContexts,
+ JpegDecoder_Frame_GetThumbnail
+};
+
+HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
+{
+ JpegDecoder *This;
+ HRESULT ret;
+
+ TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv);
+
+ if (!libjpeg_handle && !load_libjpeg())
+ {
+ ERR("Failed reading JPEG because unable to find %s\n", SONAME_LIBJPEG);
+ return E_FAIL;
+ }
+
+ *ppv = NULL;
+
+ if (pUnkOuter) return CLASS_E_NOAGGREGATION;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(JpegDecoder));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->lpVtbl = &JpegDecoder_Vtbl;
+ This->lpFrameVtbl = &JpegDecoder_Frame_Vtbl;
+ This->ref = 1;
+ This->initialized = FALSE;
+ This->cinfo_initialized = FALSE;
+ This->stream = NULL;
+ This->image_data = NULL;
+
+ ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv);
+ IUnknown_Release((IUnknown*)This);
+
+ return ret;
+}
+
+#else /* !defined(SONAME_LIBJPEG) */
+
+HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
+{
+ ERR("Trying to load JPEG picture, but JPEG supported not compiled in.\n");
+ return E_FAIL;
+}
+
+#endif
diff --git a/reactos/dll/win32/windowscodecs/main.c b/reactos/dll/win32/windowscodecs/main.c
new file mode 100644
index 00000000000..7ec5d410e71
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/main.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+
+#include "windef.h"
+#include "winbase.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+
+ switch (fdwReason)
+ {
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
+ case DLL_PROCESS_ATTACH:
+ DisableThreadLibraryCalls(hinstDLL);
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+
+ return TRUE;
+}
+
+HRESULT copy_pixels(UINT bpp, const BYTE *srcbuffer,
+ UINT srcwidth, UINT srcheight, INT srcstride,
+ const WICRect *rc, UINT dststride, UINT dstbuffersize, BYTE *dstbuffer)
+{
+ UINT bytesperrow;
+ UINT row_offset; /* number of bits into the source rows where the data starts */
+
+ if (rc->X < 0 || rc->Y < 0 || rc->X+rc->Width > srcwidth || rc->Y+rc->Height > srcheight)
+ return E_INVALIDARG;
+
+ bytesperrow = ((bpp * rc->Width)+7)/8;
+
+ if (dststride < bytesperrow)
+ return E_INVALIDARG;
+
+ if ((dststride * rc->Height) > dstbuffersize)
+ return E_INVALIDARG;
+
+ row_offset = rc->X * bpp;
+
+ if (row_offset % 8 == 0)
+ {
+ /* everything lines up on a byte boundary */
+ UINT row;
+ const BYTE *src;
+ BYTE *dst;
+
+ src = srcbuffer + (row_offset / 8) + srcstride * rc->Y;
+ dst = dstbuffer;
+ for (row=0; row < rc->Height; row++)
+ {
+ memcpy(dst, src, bytesperrow);
+ src += srcstride;
+ dst += dststride;
+ }
+ return S_OK;
+ }
+ else
+ {
+ /* we have to do a weird bitwise copy. eww. */
+ FIXME("cannot reliably copy bitmap data if bpp < 8\n");
+ return E_FAIL;
+ }
+}
diff --git a/reactos/dll/win32/windowscodecs/palette.c b/reactos/dll/win32/windowscodecs/palette.c
new file mode 100644
index 00000000000..842d3b51c30
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/palette.c
@@ -0,0 +1,279 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+typedef struct {
+ const IWICPaletteVtbl *lpIWICPaletteVtbl;
+ LONG ref;
+ UINT count;
+ WICColor *colors;
+ WICBitmapPaletteType type;
+} PaletteImpl;
+
+static HRESULT WINAPI PaletteImpl_QueryInterface(IWICPalette *iface, REFIID iid,
+ void **ppv)
+{
+ PaletteImpl *This = (PaletteImpl*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICPalette, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI PaletteImpl_AddRef(IWICPalette *iface)
+{
+ PaletteImpl *This = (PaletteImpl*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI PaletteImpl_Release(IWICPalette *iface)
+{
+ PaletteImpl *This = (PaletteImpl*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ HeapFree(GetProcessHeap(), 0, This->colors);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI PaletteImpl_InitializePredefined(IWICPalette *iface,
+ WICBitmapPaletteType ePaletteType, BOOL fAddTransparentColor)
+{
+ FIXME("(%p,%u,%i): stub\n", iface, ePaletteType, fAddTransparentColor);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PaletteImpl_InitializeCustom(IWICPalette *iface,
+ WICColor *pColors, UINT colorCount)
+{
+ PaletteImpl *This = (PaletteImpl*)iface;
+ WICColor *new_colors;
+
+ TRACE("(%p,%p,%u)\n", iface, pColors, colorCount);
+
+ if (colorCount == 0)
+ {
+ new_colors = NULL;
+ }
+ else
+ {
+ if (!pColors) return E_INVALIDARG;
+ new_colors = HeapAlloc(GetProcessHeap(), 0, sizeof(WICColor) * colorCount);
+ if (!new_colors) return E_OUTOFMEMORY;
+ memcpy(new_colors, pColors, sizeof(WICColor) * colorCount);
+ }
+
+ HeapFree(GetProcessHeap(), 0, This->colors);
+ This->colors = new_colors;
+ This->count = colorCount;
+ This->type = WICBitmapPaletteTypeCustom;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI PaletteImpl_InitializeFromBitmap(IWICPalette *iface,
+ IWICBitmapSource *pISurface, UINT colorCount, BOOL fAddTransparentColor)
+{
+ FIXME("(%p,%p,%u,%i): stub\n", iface, pISurface, colorCount, fAddTransparentColor);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PaletteImpl_InitializeFromPalette(IWICPalette *iface,
+ IWICPalette *pIPalette)
+{
+ FIXME("(%p,%p): stub\n", iface, pIPalette);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PaletteImpl_GetType(IWICPalette *iface,
+ WICBitmapPaletteType *pePaletteType)
+{
+ PaletteImpl *This = (PaletteImpl*)iface;
+
+ TRACE("(%p,%p)\n", iface, pePaletteType);
+
+ if (!pePaletteType) return E_INVALIDARG;
+
+ *pePaletteType = This->type;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI PaletteImpl_GetColorCount(IWICPalette *iface, UINT *pcCount)
+{
+ PaletteImpl *This = (PaletteImpl*)iface;
+
+ TRACE("(%p,%p)\n", iface, pcCount);
+
+ if (!pcCount) return E_INVALIDARG;
+
+ *pcCount = This->count;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI PaletteImpl_GetColors(IWICPalette *iface, UINT colorCount,
+ WICColor *pColors, UINT *pcActualColors)
+{
+ PaletteImpl *This = (PaletteImpl*)iface;
+
+ TRACE("(%p,%i,%p,%p)\n", iface, colorCount, pColors, pcActualColors);
+
+ if (!pColors || !pcActualColors) return E_INVALIDARG;
+
+ if (This->count < colorCount) colorCount = This->count;
+
+ memcpy(pColors, This->colors, sizeof(WICColor) * colorCount);
+
+ *pcActualColors = colorCount;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI PaletteImpl_IsBlackWhite(IWICPalette *iface, BOOL *pfIsBlackWhite)
+{
+ PaletteImpl *This = (PaletteImpl*)iface;
+
+ TRACE("(%p,%p)\n", iface, pfIsBlackWhite);
+
+ if (!pfIsBlackWhite) return E_INVALIDARG;
+
+ if (This->type == WICBitmapPaletteTypeFixedBW)
+ *pfIsBlackWhite = TRUE;
+ else
+ *pfIsBlackWhite = FALSE;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI PaletteImpl_IsGrayscale(IWICPalette *iface, BOOL *pfIsGrayscale)
+{
+ PaletteImpl *This = (PaletteImpl*)iface;
+
+ TRACE("(%p,%p)\n", iface, pfIsGrayscale);
+
+ if (!pfIsGrayscale) return E_INVALIDARG;
+
+ switch(This->type)
+ {
+ case WICBitmapPaletteTypeFixedBW:
+ case WICBitmapPaletteTypeFixedGray4:
+ case WICBitmapPaletteTypeFixedGray16:
+ case WICBitmapPaletteTypeFixedGray256:
+ *pfIsGrayscale = TRUE;
+ break;
+ default:
+ *pfIsGrayscale = FALSE;
+ }
+
+ return S_OK;
+}
+
+static HRESULT WINAPI PaletteImpl_HasAlpha(IWICPalette *iface, BOOL *pfHasAlpha)
+{
+ PaletteImpl *This = (PaletteImpl*)iface;
+ int i;
+
+ TRACE("(%p,%p)\n", iface, pfHasAlpha);
+
+ if (!pfHasAlpha) return E_INVALIDARG;
+
+ *pfHasAlpha = FALSE;
+
+ for (i=0; icount; i++)
+ if ((This->colors[i]&0xff000000) != 0xff000000)
+ {
+ *pfHasAlpha = TRUE;
+ break;
+ }
+
+ return S_OK;
+}
+
+static const IWICPaletteVtbl PaletteImpl_Vtbl = {
+ PaletteImpl_QueryInterface,
+ PaletteImpl_AddRef,
+ PaletteImpl_Release,
+ PaletteImpl_InitializePredefined,
+ PaletteImpl_InitializeCustom,
+ PaletteImpl_InitializeFromBitmap,
+ PaletteImpl_InitializeFromPalette,
+ PaletteImpl_GetType,
+ PaletteImpl_GetColorCount,
+ PaletteImpl_GetColors,
+ PaletteImpl_IsBlackWhite,
+ PaletteImpl_IsGrayscale,
+ PaletteImpl_HasAlpha
+};
+
+HRESULT PaletteImpl_Create(IWICPalette **palette)
+{
+ PaletteImpl *This;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(PaletteImpl));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->lpIWICPaletteVtbl = &PaletteImpl_Vtbl;
+ This->ref = 1;
+ This->count = 0;
+ This->colors = NULL;
+ This->type = WICBitmapPaletteTypeCustom;
+
+ *palette = (IWICPalette*)This;
+
+ return S_OK;
+}
diff --git a/reactos/dll/win32/windowscodecs/pngformat.c b/reactos/dll/win32/windowscodecs/pngformat.c
new file mode 100644
index 00000000000..be0bd6e9445
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/pngformat.c
@@ -0,0 +1,650 @@
+/*
+ * Copyright 2009 Vincent Povirk 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 "wine/port.h"
+
+#include
+
+#ifdef HAVE_PNG_H
+#include
+#endif
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+#include "wine/library.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+#ifdef SONAME_LIBPNG
+
+static void *libpng_handle;
+#define MAKE_FUNCPTR(f) static typeof(f) * p##f
+MAKE_FUNCPTR(png_create_read_struct);
+MAKE_FUNCPTR(png_create_info_struct);
+MAKE_FUNCPTR(png_destroy_read_struct);
+MAKE_FUNCPTR(png_error);
+MAKE_FUNCPTR(png_get_bit_depth);
+MAKE_FUNCPTR(png_get_color_type);
+MAKE_FUNCPTR(png_get_image_height);
+MAKE_FUNCPTR(png_get_image_width);
+MAKE_FUNCPTR(png_get_io_ptr);
+MAKE_FUNCPTR(png_get_PLTE);
+MAKE_FUNCPTR(png_get_tRNS);
+MAKE_FUNCPTR(png_set_bgr);
+MAKE_FUNCPTR(png_set_gray_1_2_4_to_8);
+MAKE_FUNCPTR(png_set_gray_to_rgb);
+MAKE_FUNCPTR(png_set_read_fn);
+MAKE_FUNCPTR(png_set_strip_16);
+MAKE_FUNCPTR(png_set_tRNS_to_alpha);
+MAKE_FUNCPTR(png_read_end);
+MAKE_FUNCPTR(png_read_image);
+MAKE_FUNCPTR(png_read_info);
+#undef MAKE_FUNCPTR
+
+static void *load_libpng(void)
+{
+ if((libpng_handle = wine_dlopen(SONAME_LIBPNG, RTLD_NOW, NULL, 0)) != NULL) {
+
+#define LOAD_FUNCPTR(f) \
+ if((p##f = wine_dlsym(libpng_handle, #f, NULL, 0)) == NULL) { \
+ libpng_handle = NULL; \
+ return NULL; \
+ }
+ LOAD_FUNCPTR(png_create_read_struct);
+ LOAD_FUNCPTR(png_create_info_struct);
+ LOAD_FUNCPTR(png_destroy_read_struct);
+ LOAD_FUNCPTR(png_error);
+ LOAD_FUNCPTR(png_get_bit_depth);
+ LOAD_FUNCPTR(png_get_color_type);
+ LOAD_FUNCPTR(png_get_image_height);
+ LOAD_FUNCPTR(png_get_image_width);
+ LOAD_FUNCPTR(png_get_io_ptr);
+ LOAD_FUNCPTR(png_get_PLTE);
+ LOAD_FUNCPTR(png_get_tRNS);
+ LOAD_FUNCPTR(png_set_bgr);
+ LOAD_FUNCPTR(png_set_gray_1_2_4_to_8);
+ LOAD_FUNCPTR(png_set_gray_to_rgb);
+ LOAD_FUNCPTR(png_set_read_fn);
+ LOAD_FUNCPTR(png_set_strip_16);
+ LOAD_FUNCPTR(png_set_tRNS_to_alpha);
+ LOAD_FUNCPTR(png_read_end);
+ LOAD_FUNCPTR(png_read_image);
+ LOAD_FUNCPTR(png_read_info);
+
+#undef LOAD_FUNCPTR
+ }
+ return libpng_handle;
+}
+
+typedef struct {
+ const IWICBitmapDecoderVtbl *lpVtbl;
+ const IWICBitmapFrameDecodeVtbl *lpFrameVtbl;
+ LONG ref;
+ png_structp png_ptr;
+ png_infop info_ptr;
+ png_infop end_info;
+ BOOL initialized;
+ int bpp;
+ int width, height;
+ UINT stride;
+ const WICPixelFormatGUID *format;
+ BYTE *image_bits;
+} PngDecoder;
+
+static inline PngDecoder *impl_from_frame(IWICBitmapFrameDecode *iface)
+{
+ return CONTAINING_RECORD(iface, PngDecoder, lpFrameVtbl);
+}
+
+static const IWICBitmapFrameDecodeVtbl PngDecoder_FrameVtbl;
+
+static HRESULT WINAPI PngDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid,
+ void **ppv)
+{
+ PngDecoder *This = (PngDecoder*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICBitmapDecoder, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI PngDecoder_AddRef(IWICBitmapDecoder *iface)
+{
+ PngDecoder *This = (PngDecoder*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI PngDecoder_Release(IWICBitmapDecoder *iface)
+{
+ PngDecoder *This = (PngDecoder*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ if (This->png_ptr)
+ ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, &This->end_info);
+ HeapFree(GetProcessHeap(), 0, This->image_bits);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI PngDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *pIStream,
+ DWORD *pdwCapability)
+{
+ FIXME("(%p,%p,%p): stub\n", iface, pIStream, pdwCapability);
+ return E_NOTIMPL;
+}
+
+static void user_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
+{
+ IStream *stream = ppng_get_io_ptr(png_ptr);
+ HRESULT hr;
+ ULONG bytesread;
+
+ hr = IStream_Read(stream, data, length, &bytesread);
+ if (FAILED(hr) || bytesread != length)
+ {
+ ppng_error(png_ptr, "failed reading data");
+ }
+}
+
+static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream,
+ WICDecodeOptions cacheOptions)
+{
+ PngDecoder *This = (PngDecoder*)iface;
+ LARGE_INTEGER seek;
+ HRESULT hr;
+ png_bytep *row_pointers=NULL;
+ UINT image_size;
+ UINT i;
+ int color_type, bit_depth;
+ png_bytep trans;
+ int num_trans;
+ png_uint_32 transparency;
+ png_color_16p trans_values;
+ TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions);
+
+ /* initialize libpng */
+ This->png_ptr = ppng_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+ if (!This->png_ptr) return E_FAIL;
+
+ This->info_ptr = ppng_create_info_struct(This->png_ptr);
+ if (!This->info_ptr)
+ {
+ ppng_destroy_read_struct(&This->png_ptr, (png_infopp)NULL, (png_infopp)NULL);
+ This->png_ptr = NULL;
+ return E_FAIL;
+ }
+
+ This->end_info = ppng_create_info_struct(This->png_ptr);
+ if (!This->info_ptr)
+ {
+ ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, (png_infopp)NULL);
+ This->png_ptr = NULL;
+ return E_FAIL;
+ }
+
+ /* set up setjmp/longjmp error handling */
+ if (setjmp(png_jmpbuf(This->png_ptr)))
+ {
+ ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, &This->end_info);
+ HeapFree(GetProcessHeap(), 0, row_pointers);
+ This->png_ptr = NULL;
+ return E_FAIL;
+ }
+
+ /* seek to the start of the stream */
+ seek.QuadPart = 0;
+ hr = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL);
+ if (FAILED(hr)) return hr;
+
+ /* set up custom i/o handling */
+ ppng_set_read_fn(This->png_ptr, pIStream, user_read_data);
+
+ /* read the header */
+ ppng_read_info(This->png_ptr, This->info_ptr);
+
+ /* choose a pixel format */
+ color_type = ppng_get_color_type(This->png_ptr, This->info_ptr);
+ bit_depth = ppng_get_bit_depth(This->png_ptr, This->info_ptr);
+
+ /* check for color-keyed alpha */
+ transparency = ppng_get_tRNS(This->png_ptr, This->info_ptr, &trans, &num_trans, &trans_values);
+
+ if (transparency && color_type != PNG_COLOR_TYPE_PALETTE)
+ {
+ /* expand to RGBA */
+ if (color_type == PNG_COLOR_TYPE_GRAY)
+ {
+ if (bit_depth < 8)
+ {
+ ppng_set_gray_1_2_4_to_8(This->png_ptr);
+ bit_depth = 8;
+ }
+ ppng_set_gray_to_rgb(This->png_ptr);
+ }
+ ppng_set_tRNS_to_alpha(This->png_ptr);
+ color_type = PNG_COLOR_TYPE_RGB_ALPHA;
+ }
+
+ switch (color_type)
+ {
+ case PNG_COLOR_TYPE_GRAY:
+ This->bpp = bit_depth;
+ switch (bit_depth)
+ {
+ case 1: This->format = &GUID_WICPixelFormatBlackWhite; break;
+ case 2: This->format = &GUID_WICPixelFormat2bppGray; break;
+ case 4: This->format = &GUID_WICPixelFormat4bppGray; break;
+ case 8: This->format = &GUID_WICPixelFormat8bppGray; break;
+ case 16: This->format = &GUID_WICPixelFormat16bppGray; break;
+ default:
+ ERR("invalid grayscale bit depth: %i\n", bit_depth);
+ return E_FAIL;
+ }
+ break;
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
+ /* WIC does not support grayscale alpha formats so use RGBA */
+ ppng_set_gray_to_rgb(This->png_ptr);
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ This->bpp = bit_depth * 4;
+ switch (bit_depth)
+ {
+ case 8:
+ ppng_set_bgr(This->png_ptr);
+ This->format = &GUID_WICPixelFormat32bppBGRA;
+ break;
+ case 16: This->format = &GUID_WICPixelFormat64bppRGBA; break;
+ default:
+ ERR("invalid RGBA bit depth: %i\n", bit_depth);
+ return E_FAIL;
+ }
+ break;
+ case PNG_COLOR_TYPE_PALETTE:
+ This->bpp = bit_depth;
+ switch (bit_depth)
+ {
+ case 1: This->format = &GUID_WICPixelFormat1bppIndexed; break;
+ case 2: This->format = &GUID_WICPixelFormat2bppIndexed; break;
+ case 4: This->format = &GUID_WICPixelFormat4bppIndexed; break;
+ case 8: This->format = &GUID_WICPixelFormat8bppIndexed; break;
+ default:
+ ERR("invalid indexed color bit depth: %i\n", bit_depth);
+ return E_FAIL;
+ }
+ break;
+ case PNG_COLOR_TYPE_RGB:
+ This->bpp = bit_depth * 3;
+ switch (bit_depth)
+ {
+ case 8:
+ ppng_set_bgr(This->png_ptr);
+ This->format = &GUID_WICPixelFormat24bppBGR;
+ break;
+ case 16: This->format = &GUID_WICPixelFormat48bppRGB; break;
+ default:
+ ERR("invalid RGB color bit depth: %i\n", bit_depth);
+ return E_FAIL;
+ }
+ break;
+ default:
+ ERR("invalid color type %i\n", color_type);
+ return E_FAIL;
+ }
+
+ /* read the image data */
+ This->width = ppng_get_image_width(This->png_ptr, This->info_ptr);
+ This->height = ppng_get_image_height(This->png_ptr, This->info_ptr);
+ This->stride = This->width * This->bpp;
+ image_size = This->stride * This->height;
+
+ This->image_bits = HeapAlloc(GetProcessHeap(), 0, image_size);
+ if (!This->image_bits) return E_OUTOFMEMORY;
+
+ row_pointers = HeapAlloc(GetProcessHeap(), 0, sizeof(png_bytep)*This->height);
+ if (!row_pointers) return E_OUTOFMEMORY;
+
+ for (i=0; iheight; i++)
+ row_pointers[i] = This->image_bits + i * This->stride;
+
+ ppng_read_image(This->png_ptr, row_pointers);
+
+ HeapFree(GetProcessHeap(), 0, row_pointers);
+ row_pointers = NULL;
+
+ ppng_read_end(This->png_ptr, This->end_info);
+
+ This->initialized = TRUE;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI PngDecoder_GetContainerFormat(IWICBitmapDecoder *iface,
+ GUID *pguidContainerFormat)
+{
+ memcpy(pguidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID));
+ return S_OK;
+}
+
+static HRESULT WINAPI PngDecoder_GetDecoderInfo(IWICBitmapDecoder *iface,
+ IWICBitmapDecoderInfo **ppIDecoderInfo)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIDecoderInfo);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PngDecoder_CopyPalette(IWICBitmapDecoder *iface,
+ IWICPalette *pIPalette)
+{
+ FIXME("(%p,%p): stub\n", iface, pIPalette);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PngDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface,
+ IWICMetadataQueryReader **ppIMetadataQueryReader)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryReader);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PngDecoder_GetPreview(IWICBitmapDecoder *iface,
+ IWICBitmapSource **ppIBitmapSource)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIBitmapSource);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PngDecoder_GetColorContexts(IWICBitmapDecoder *iface,
+ UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
+{
+ FIXME("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PngDecoder_GetThumbnail(IWICBitmapDecoder *iface,
+ IWICBitmapSource **ppIThumbnail)
+{
+ TRACE("(%p,%p)\n", iface, ppIThumbnail);
+ return WINCODEC_ERR_CODECNOTHUMBNAIL;
+}
+
+static HRESULT WINAPI PngDecoder_GetFrameCount(IWICBitmapDecoder *iface,
+ UINT *pCount)
+{
+ *pCount = 1;
+ return S_OK;
+}
+
+static HRESULT WINAPI PngDecoder_GetFrame(IWICBitmapDecoder *iface,
+ UINT index, IWICBitmapFrameDecode **ppIBitmapFrame)
+{
+ PngDecoder *This = (PngDecoder*)iface;
+ TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame);
+
+ if (!This->initialized) return WINCODEC_ERR_NOTINITIALIZED;
+
+ if (index != 0) return E_INVALIDARG;
+
+ IWICBitmapDecoder_AddRef(iface);
+
+ *ppIBitmapFrame = (void*)(&This->lpFrameVtbl);
+
+ return S_OK;
+}
+
+static const IWICBitmapDecoderVtbl PngDecoder_Vtbl = {
+ PngDecoder_QueryInterface,
+ PngDecoder_AddRef,
+ PngDecoder_Release,
+ PngDecoder_QueryCapability,
+ PngDecoder_Initialize,
+ PngDecoder_GetContainerFormat,
+ PngDecoder_GetDecoderInfo,
+ PngDecoder_CopyPalette,
+ PngDecoder_GetMetadataQueryReader,
+ PngDecoder_GetPreview,
+ PngDecoder_GetColorContexts,
+ PngDecoder_GetThumbnail,
+ PngDecoder_GetFrameCount,
+ PngDecoder_GetFrame
+};
+
+static HRESULT WINAPI PngDecoder_Frame_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid,
+ void **ppv)
+{
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IWICBitmapSource, iid) ||
+ IsEqualIID(&IID_IWICBitmapFrameDecode, iid))
+ {
+ *ppv = iface;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI PngDecoder_Frame_AddRef(IWICBitmapFrameDecode *iface)
+{
+ PngDecoder *This = impl_from_frame(iface);
+ return IUnknown_AddRef((IUnknown*)This);
+}
+
+static ULONG WINAPI PngDecoder_Frame_Release(IWICBitmapFrameDecode *iface)
+{
+ PngDecoder *This = impl_from_frame(iface);
+ return IUnknown_Release((IUnknown*)This);
+}
+
+static HRESULT WINAPI PngDecoder_Frame_GetSize(IWICBitmapFrameDecode *iface,
+ UINT *puiWidth, UINT *puiHeight)
+{
+ PngDecoder *This = impl_from_frame(iface);
+ *puiWidth = This->width;
+ *puiHeight = This->height;
+ TRACE("(%p)->(%u,%u)\n", iface, *puiWidth, *puiHeight);
+ return S_OK;
+}
+
+static HRESULT WINAPI PngDecoder_Frame_GetPixelFormat(IWICBitmapFrameDecode *iface,
+ WICPixelFormatGUID *pPixelFormat)
+{
+ PngDecoder *This = impl_from_frame(iface);
+ TRACE("(%p,%p)\n", iface, pPixelFormat);
+
+ memcpy(pPixelFormat, This->format, sizeof(GUID));
+
+ return S_OK;
+}
+
+static HRESULT WINAPI PngDecoder_Frame_GetResolution(IWICBitmapFrameDecode *iface,
+ double *pDpiX, double *pDpiY)
+{
+ FIXME("(%p,%p,%p): stub\n", iface, pDpiX, pDpiY);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PngDecoder_Frame_CopyPalette(IWICBitmapFrameDecode *iface,
+ IWICPalette *pIPalette)
+{
+ PngDecoder *This = impl_from_frame(iface);
+ png_uint_32 ret;
+ png_colorp png_palette;
+ int num_palette;
+ WICColor palette[256];
+ png_bytep trans;
+ int num_trans;
+ png_color_16p trans_values;
+ int i;
+
+ TRACE("(%p,%p)\n", iface, pIPalette);
+
+ ret = ppng_get_PLTE(This->png_ptr, This->info_ptr, &png_palette, &num_palette);
+ if (!ret) return WINCODEC_ERR_PALETTEUNAVAILABLE;
+
+ if (num_palette > 256)
+ {
+ ERR("palette has %i colors?!\n", num_palette);
+ return E_FAIL;
+ }
+
+ for (i=0; ipng_ptr, This->info_ptr, &trans, &num_trans, &trans_values);
+ if (ret)
+ {
+ for (i=0; ibpp, This->image_bits,
+ This->width, This->height, This->stride,
+ prc, cbStride, cbBufferSize, pbBuffer);
+}
+
+static HRESULT WINAPI PngDecoder_Frame_GetMetadataQueryReader(IWICBitmapFrameDecode *iface,
+ IWICMetadataQueryReader **ppIMetadataQueryReader)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryReader);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PngDecoder_Frame_GetColorContexts(IWICBitmapFrameDecode *iface,
+ UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cCount, ppIColorContexts, pcActualCount);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PngDecoder_Frame_GetThumbnail(IWICBitmapFrameDecode *iface,
+ IWICBitmapSource **ppIThumbnail)
+{
+ FIXME("(%p,%p): stub\n", iface, ppIThumbnail);
+ return E_NOTIMPL;
+}
+
+static const IWICBitmapFrameDecodeVtbl PngDecoder_FrameVtbl = {
+ PngDecoder_Frame_QueryInterface,
+ PngDecoder_Frame_AddRef,
+ PngDecoder_Frame_Release,
+ PngDecoder_Frame_GetSize,
+ PngDecoder_Frame_GetPixelFormat,
+ PngDecoder_Frame_GetResolution,
+ PngDecoder_Frame_CopyPalette,
+ PngDecoder_Frame_CopyPixels,
+ PngDecoder_Frame_GetMetadataQueryReader,
+ PngDecoder_Frame_GetColorContexts,
+ PngDecoder_Frame_GetThumbnail
+};
+
+HRESULT PngDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
+{
+ PngDecoder *This;
+ HRESULT ret;
+
+ TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv);
+
+ *ppv = NULL;
+
+ if (pUnkOuter) return CLASS_E_NOAGGREGATION;
+
+ if (!libpng_handle && !load_libpng())
+ {
+ ERR("Failed reading PNG because unable to find %s\n",SONAME_LIBPNG);
+ return E_FAIL;
+ }
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(PngDecoder));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->lpVtbl = &PngDecoder_Vtbl;
+ This->lpFrameVtbl = &PngDecoder_FrameVtbl;
+ This->ref = 1;
+ This->png_ptr = NULL;
+ This->info_ptr = NULL;
+ This->end_info = NULL;
+ This->initialized = FALSE;
+ This->image_bits = NULL;
+
+ ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv);
+ IUnknown_Release((IUnknown*)This);
+
+ return ret;
+}
+
+#else /* !HAVE_PNG_H */
+
+HRESULT PngDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv)
+{
+ ERR("Trying to load PNG picture, but PNG supported not compiled in.\n");
+ return E_FAIL;
+}
+
+#endif
diff --git a/reactos/dll/win32/windowscodecs/propertybag.c b/reactos/dll/win32/windowscodecs/propertybag.c
new file mode 100644
index 00000000000..ca40b3b65ba
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/propertybag.c
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+typedef struct PropertyBag {
+ const IPropertyBag2Vtbl *lpVtbl;
+ LONG ref;
+} PropertyBag;
+
+static HRESULT WINAPI PropertyBag_QueryInterface(IPropertyBag2 *iface, REFIID iid,
+ void **ppv)
+{
+ PropertyBag *This = (PropertyBag*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IPropertyBag2, iid))
+ {
+ *ppv = This;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI PropertyBag_AddRef(IPropertyBag2 *iface)
+{
+ PropertyBag *This = (PropertyBag*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI PropertyBag_Release(IPropertyBag2 *iface)
+{
+ PropertyBag *This = (PropertyBag*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI PropertyBag_Read(IPropertyBag2 *iface, ULONG cProperties,
+ PROPBAG2 *pPropBag, IErrorLog *pErrLog, VARIANT *pvarValue, HRESULT *phrError)
+{
+ FIXME("(%p,%u,%p,%p,%p,%p): stub\n", iface, cProperties, pPropBag, pErrLog, pvarValue, phrError);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PropertyBag_Write(IPropertyBag2 *iface, ULONG cProperties,
+ PROPBAG2 *pPropBag, VARIANT *pvarValue)
+{
+ FIXME("(%p,%u,%p,%p): stub\n", iface, cProperties, pPropBag, pvarValue);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PropertyBag_CountProperties(IPropertyBag2 *iface, ULONG *pcProperties)
+{
+ FIXME("(%p,%p): stub\n", iface, pcProperties);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PropertyBag_GetPropertyInfo(IPropertyBag2 *iface, ULONG iProperty,
+ ULONG cProperties, PROPBAG2 *pPropBag, ULONG *pcProperties)
+{
+ FIXME("(%p,%u,%u,%p,%p): stub\n", iface, iProperty, cProperties, pPropBag, pcProperties);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI PropertyBag_LoadObject(IPropertyBag2 *iface, LPCOLESTR pstrName,
+ DWORD dwHint, IUnknown *pUnkObject, IErrorLog *pErrLog)
+{
+ FIXME("(%p,%s,%u,%p,%p): stub\n", iface, debugstr_w(pstrName), dwHint, pUnkObject, pErrLog);
+ return E_NOTIMPL;
+}
+
+static const IPropertyBag2Vtbl PropertyBag_Vtbl = {
+ PropertyBag_QueryInterface,
+ PropertyBag_AddRef,
+ PropertyBag_Release,
+ PropertyBag_Read,
+ PropertyBag_Write,
+ PropertyBag_CountProperties,
+ PropertyBag_GetPropertyInfo,
+ PropertyBag_LoadObject
+};
+
+extern HRESULT CreatePropertyBag2(IPropertyBag2 **ppPropertyBag2)
+{
+ PropertyBag *This;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(PropertyBag));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->lpVtbl = &PropertyBag_Vtbl;
+ This->ref = 1;
+
+ *ppPropertyBag2 = (IPropertyBag2*)This;
+
+ return S_OK;
+}
diff --git a/reactos/dll/win32/windowscodecs/regsvr.c b/reactos/dll/win32/windowscodecs/regsvr.c
new file mode 100644
index 00000000000..654437224dd
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/regsvr.c
@@ -0,0 +1,976 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+ */
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#define COBJMACROS
+#include
+#include
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winreg.h"
+#include "winerror.h"
+
+#include "objbase.h"
+#include "ocidl.h"
+#include "wincodec.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+/***********************************************************************
+ * interface for self-registering
+ */
+struct regsvr_coclass
+{
+ CLSID const *clsid; /* NULL for end of list */
+ LPCSTR name; /* can be NULL to omit */
+ LPCSTR ips; /* can be NULL to omit */
+ LPCSTR ips32; /* can be NULL to omit */
+ LPCSTR ips32_tmodel; /* can be NULL to omit */
+ LPCSTR progid; /* can be NULL to omit */
+ LPCSTR viprogid; /* can be NULL to omit */
+ LPCSTR progid_extra; /* can be NULL to omit */
+};
+
+static HRESULT register_coclasses(struct regsvr_coclass const *list);
+static HRESULT unregister_coclasses(struct regsvr_coclass const *list);
+
+struct decoder_pattern
+{
+ DWORD length; /* 0 for end of list */
+ DWORD position;
+ const BYTE *pattern;
+ const BYTE *mask;
+ DWORD endofstream;
+};
+
+struct regsvr_decoder
+{
+ CLSID const *clsid; /* NULL for end of list */
+ LPCSTR author;
+ LPCSTR friendlyname;
+ LPCSTR version;
+ GUID const *vendor;
+ LPCSTR mimetypes;
+ LPCSTR extensions;
+ GUID const * const *formats;
+ const struct decoder_pattern *patterns;
+};
+
+static HRESULT register_decoders(struct regsvr_decoder const *list);
+static HRESULT unregister_decoders(struct regsvr_decoder const *list);
+
+struct regsvr_converter
+{
+ CLSID const *clsid; /* NULL for end of list */
+ LPCSTR author;
+ LPCSTR friendlyname;
+ LPCSTR version;
+ GUID const *vendor;
+ GUID const * const *formats;
+};
+
+static HRESULT register_converters(struct regsvr_converter const *list);
+static HRESULT unregister_converters(struct regsvr_converter const *list);
+
+/***********************************************************************
+ * static string constants
+ */
+static WCHAR const clsid_keyname[6] = {
+ 'C', 'L', 'S', 'I', 'D', 0 };
+static WCHAR const curver_keyname[7] = {
+ 'C', 'u', 'r', 'V', 'e', 'r', 0 };
+static WCHAR const ips_keyname[13] = {
+ 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
+ 0 };
+static WCHAR const ips32_keyname[15] = {
+ 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
+ '3', '2', 0 };
+static WCHAR const progid_keyname[7] = {
+ 'P', 'r', 'o', 'g', 'I', 'D', 0 };
+static WCHAR const viprogid_keyname[25] = {
+ 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p',
+ 'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D',
+ 0 };
+static char const tmodel_valuename[] = "ThreadingModel";
+static char const author_valuename[] = "Author";
+static char const friendlyname_valuename[] = "FriendlyName";
+static WCHAR const vendor_valuename[] = {'V','e','n','d','o','r',0};
+static char const version_valuename[] = "Version";
+static char const mimetypes_valuename[] = "MimeTypes";
+static char const extensions_valuename[] = "FileExtensions";
+static WCHAR const formats_keyname[] = {'F','o','r','m','a','t','s',0};
+static WCHAR const patterns_keyname[] = {'P','a','t','t','e','r','n','s',0};
+static WCHAR const instance_keyname[] = {'I','n','s','t','a','n','c','e',0};
+static WCHAR const clsid_valuename[] = {'C','L','S','I','D',0};
+static char const length_valuename[] = "Length";
+static char const position_valuename[] = "Position";
+static char const pattern_valuename[] = "Pattern";
+static char const mask_valuename[] = "Mask";
+static char const endofstream_valuename[] = "EndOfStream";
+static WCHAR const pixelformats_keyname[] = {'P','i','x','e','l','F','o','r','m','a','t','s',0};
+
+/***********************************************************************
+ * static helper functions
+ */
+static LONG register_key_defvalueW(HKEY base, WCHAR const *name,
+ WCHAR const *value);
+static LONG register_key_defvalueA(HKEY base, WCHAR const *name,
+ char const *value);
+static LONG register_progid(WCHAR const *clsid,
+ char const *progid, char const *curver_progid,
+ char const *name, char const *extra);
+
+/***********************************************************************
+ * register_coclasses
+ */
+static HRESULT register_coclasses(struct regsvr_coclass const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY coclass_key;
+
+ res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+ WCHAR buf[39];
+ HKEY clsid_key;
+
+ StringFromGUID2(list->clsid, buf, 39);
+ res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+
+ if (list->name) {
+ res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ,
+ (CONST BYTE*)(list->name),
+ strlen(list->name) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->ips) {
+ res = register_key_defvalueA(clsid_key, ips_keyname, list->ips);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->ips32) {
+ HKEY ips32_key;
+
+ res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL,
+ &ips32_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+ res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ,
+ (CONST BYTE*)list->ips32,
+ lstrlenA(list->ips32) + 1);
+ if (res == ERROR_SUCCESS && list->ips32_tmodel)
+ res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ,
+ (CONST BYTE*)list->ips32_tmodel,
+ strlen(list->ips32_tmodel) + 1);
+ RegCloseKey(ips32_key);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->progid) {
+ res = register_key_defvalueA(clsid_key, progid_keyname,
+ list->progid);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+ res = register_progid(buf, list->progid, NULL,
+ list->name, list->progid_extra);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->viprogid) {
+ res = register_key_defvalueA(clsid_key, viprogid_keyname,
+ list->viprogid);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+ res = register_progid(buf, list->viprogid, list->progid,
+ list->name, list->progid_extra);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ error_close_clsid_key:
+ RegCloseKey(clsid_key);
+ }
+
+error_close_coclass_key:
+ RegCloseKey(coclass_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * unregister_coclasses
+ */
+static HRESULT unregister_coclasses(struct regsvr_coclass const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY coclass_key;
+
+ res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
+ KEY_READ | KEY_WRITE, &coclass_key);
+ if (res == ERROR_FILE_NOT_FOUND) return S_OK;
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+ WCHAR buf[39];
+
+ StringFromGUID2(list->clsid, buf, 39);
+ res = RegDeleteTreeW(coclass_key, buf);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+
+ if (list->progid) {
+ res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+ }
+
+ if (list->viprogid) {
+ res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->viprogid);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+ }
+ }
+
+error_close_coclass_key:
+ RegCloseKey(coclass_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * register_decoders
+ */
+static HRESULT register_decoders(struct regsvr_decoder const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY coclass_key;
+ WCHAR buf[39];
+ HKEY decoders_key;
+ HKEY instance_key;
+
+ res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
+ if (res == ERROR_SUCCESS) {
+ StringFromGUID2(&CATID_WICBitmapDecoders, buf, 39);
+ res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &decoders_key, NULL);
+ if (res == ERROR_SUCCESS)
+ {
+ res = RegCreateKeyExW(decoders_key, instance_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &instance_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+ }
+ if (res != ERROR_SUCCESS)
+ RegCloseKey(coclass_key);
+ }
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+ HKEY clsid_key;
+ HKEY instance_clsid_key;
+
+ StringFromGUID2(list->clsid, buf, 39);
+ res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+
+ StringFromGUID2(list->clsid, buf, 39);
+ res = RegCreateKeyExW(instance_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &instance_clsid_key, NULL);
+ if (res == ERROR_SUCCESS) {
+ res = RegSetValueExW(instance_clsid_key, clsid_valuename, 0, REG_SZ,
+ (CONST BYTE*)(buf), 78);
+ RegCloseKey(instance_clsid_key);
+ }
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+ if (list->author) {
+ res = RegSetValueExA(clsid_key, author_valuename, 0, REG_SZ,
+ (CONST BYTE*)(list->author),
+ strlen(list->author) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->friendlyname) {
+ res = RegSetValueExA(clsid_key, friendlyname_valuename, 0, REG_SZ,
+ (CONST BYTE*)(list->friendlyname),
+ strlen(list->friendlyname) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->vendor) {
+ StringFromGUID2(list->vendor, buf, 39);
+ res = RegSetValueExW(clsid_key, vendor_valuename, 0, REG_SZ,
+ (CONST BYTE*)(buf), 78);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->version) {
+ res = RegSetValueExA(clsid_key, version_valuename, 0, REG_SZ,
+ (CONST BYTE*)(list->version),
+ strlen(list->version) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->mimetypes) {
+ res = RegSetValueExA(clsid_key, mimetypes_valuename, 0, REG_SZ,
+ (CONST BYTE*)(list->mimetypes),
+ strlen(list->mimetypes) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->extensions) {
+ res = RegSetValueExA(clsid_key, extensions_valuename, 0, REG_SZ,
+ (CONST BYTE*)(list->extensions),
+ strlen(list->extensions) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->formats) {
+ HKEY formats_key;
+ GUID const * const *format;
+
+ res = RegCreateKeyExW(clsid_key, formats_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &formats_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ for (format=list->formats; *format; ++format)
+ {
+ HKEY format_key;
+ StringFromGUID2(*format, buf, 39);
+ res = RegCreateKeyExW(formats_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &format_key, NULL);
+ if (res != ERROR_SUCCESS) break;
+ RegCloseKey(format_key);
+ }
+ RegCloseKey(formats_key);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->patterns) {
+ HKEY patterns_key;
+ int i;
+
+ res = RegCreateKeyExW(clsid_key, patterns_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &patterns_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ for (i=0; list->patterns[i].length; i++)
+ {
+ HKEY pattern_key;
+ static const WCHAR int_format[] = {'%','i',0};
+ snprintfW(buf, 39, int_format, i);
+ res = RegCreateKeyExW(patterns_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &pattern_key, NULL);
+ if (res != ERROR_SUCCESS) break;
+ res = RegSetValueExA(pattern_key, length_valuename, 0, REG_DWORD,
+ (CONST BYTE*)(&list->patterns[i].length), 4);
+ if (res == ERROR_SUCCESS)
+ res = RegSetValueExA(pattern_key, position_valuename, 0, REG_DWORD,
+ (CONST BYTE*)(&list->patterns[i].position), 4);
+ if (res == ERROR_SUCCESS)
+ res = RegSetValueExA(pattern_key, pattern_valuename, 0, REG_BINARY,
+ list->patterns[i].pattern,
+ list->patterns[i].length);
+ if (res == ERROR_SUCCESS)
+ res = RegSetValueExA(pattern_key, mask_valuename, 0, REG_BINARY,
+ list->patterns[i].mask,
+ list->patterns[i].length);
+ if (res == ERROR_SUCCESS)
+ res = RegSetValueExA(pattern_key, endofstream_valuename, 0, REG_DWORD,
+ (CONST BYTE*)&(list->patterns[i].endofstream), 4);
+ RegCloseKey(pattern_key);
+ }
+ RegCloseKey(patterns_key);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ error_close_clsid_key:
+ RegCloseKey(clsid_key);
+ }
+
+error_close_coclass_key:
+ RegCloseKey(instance_key);
+ RegCloseKey(decoders_key);
+ RegCloseKey(coclass_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * unregister_decoders
+ */
+static HRESULT unregister_decoders(struct regsvr_decoder const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY coclass_key;
+ WCHAR buf[39];
+ HKEY decoders_key;
+ HKEY instance_key;
+
+ res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
+ KEY_READ | KEY_WRITE, &coclass_key);
+ if (res == ERROR_FILE_NOT_FOUND) return S_OK;
+
+ if (res == ERROR_SUCCESS) {
+ StringFromGUID2(&CATID_WICBitmapDecoders, buf, 39);
+ res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &decoders_key, NULL);
+ if (res == ERROR_SUCCESS)
+ {
+ res = RegCreateKeyExW(decoders_key, instance_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &instance_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+ }
+ if (res != ERROR_SUCCESS)
+ RegCloseKey(coclass_key);
+ }
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+ StringFromGUID2(list->clsid, buf, 39);
+
+ res = RegDeleteTreeW(coclass_key, buf);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+
+ res = RegDeleteTreeW(instance_key, buf);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+ }
+
+error_close_coclass_key:
+ RegCloseKey(instance_key);
+ RegCloseKey(decoders_key);
+ RegCloseKey(coclass_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * register_converters
+ */
+static HRESULT register_converters(struct regsvr_converter const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY coclass_key;
+ WCHAR buf[39];
+ HKEY converters_key;
+ HKEY instance_key;
+
+ res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
+ if (res == ERROR_SUCCESS) {
+ StringFromGUID2(&CATID_WICFormatConverters, buf, 39);
+ res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &converters_key, NULL);
+ if (res == ERROR_SUCCESS)
+ {
+ res = RegCreateKeyExW(converters_key, instance_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &instance_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+ }
+ if (res != ERROR_SUCCESS)
+ RegCloseKey(coclass_key);
+ }
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+ HKEY clsid_key;
+ HKEY instance_clsid_key;
+
+ StringFromGUID2(list->clsid, buf, 39);
+ res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+
+ StringFromGUID2(list->clsid, buf, 39);
+ res = RegCreateKeyExW(instance_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &instance_clsid_key, NULL);
+ if (res == ERROR_SUCCESS) {
+ res = RegSetValueExW(instance_clsid_key, clsid_valuename, 0, REG_SZ,
+ (CONST BYTE*)(buf), 78);
+ RegCloseKey(instance_clsid_key);
+ }
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+
+ if (list->author) {
+ res = RegSetValueExA(clsid_key, author_valuename, 0, REG_SZ,
+ (CONST BYTE*)(list->author),
+ strlen(list->author) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->friendlyname) {
+ res = RegSetValueExA(clsid_key, friendlyname_valuename, 0, REG_SZ,
+ (CONST BYTE*)(list->friendlyname),
+ strlen(list->friendlyname) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->vendor) {
+ StringFromGUID2(list->vendor, buf, 39);
+ res = RegSetValueExW(clsid_key, vendor_valuename, 0, REG_SZ,
+ (CONST BYTE*)(buf), 78);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->version) {
+ res = RegSetValueExA(clsid_key, version_valuename, 0, REG_SZ,
+ (CONST BYTE*)(list->version),
+ strlen(list->version) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ if (list->formats) {
+ HKEY formats_key;
+ GUID const * const *format;
+
+ res = RegCreateKeyExW(clsid_key, pixelformats_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &formats_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ for (format=list->formats; *format; ++format)
+ {
+ HKEY format_key;
+ StringFromGUID2(*format, buf, 39);
+ res = RegCreateKeyExW(formats_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &format_key, NULL);
+ if (res != ERROR_SUCCESS) break;
+ RegCloseKey(format_key);
+ }
+ RegCloseKey(formats_key);
+ if (res != ERROR_SUCCESS) goto error_close_clsid_key;
+ }
+
+ error_close_clsid_key:
+ RegCloseKey(clsid_key);
+ }
+
+error_close_coclass_key:
+ RegCloseKey(instance_key);
+ RegCloseKey(converters_key);
+ RegCloseKey(coclass_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * unregister_converters
+ */
+static HRESULT unregister_converters(struct regsvr_converter const *list)
+{
+ LONG res = ERROR_SUCCESS;
+ HKEY coclass_key;
+ WCHAR buf[39];
+ HKEY converters_key;
+ HKEY instance_key;
+
+ res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
+ KEY_READ | KEY_WRITE, &coclass_key);
+ if (res == ERROR_FILE_NOT_FOUND) return S_OK;
+
+ if (res == ERROR_SUCCESS) {
+ StringFromGUID2(&CATID_WICFormatConverters, buf, 39);
+ res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &converters_key, NULL);
+ if (res == ERROR_SUCCESS)
+ {
+ res = RegCreateKeyExW(converters_key, instance_keyname, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &instance_key, NULL);
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+ }
+ if (res != ERROR_SUCCESS)
+ RegCloseKey(coclass_key);
+ }
+ if (res != ERROR_SUCCESS) goto error_return;
+
+ for (; res == ERROR_SUCCESS && list->clsid; ++list) {
+ StringFromGUID2(list->clsid, buf, 39);
+
+ res = RegDeleteTreeW(coclass_key, buf);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+
+ res = RegDeleteTreeW(instance_key, buf);
+ if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
+ if (res != ERROR_SUCCESS) goto error_close_coclass_key;
+ }
+
+error_close_coclass_key:
+ RegCloseKey(instance_key);
+ RegCloseKey(converters_key);
+ RegCloseKey(coclass_key);
+error_return:
+ return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
+}
+
+/***********************************************************************
+ * register_key_defvalueW
+ */
+static LONG register_key_defvalueW(
+ HKEY base,
+ WCHAR const *name,
+ WCHAR const *value)
+{
+ LONG res;
+ HKEY key;
+
+ res = RegCreateKeyExW(base, name, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &key, NULL);
+ if (res != ERROR_SUCCESS) return res;
+ res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
+ (lstrlenW(value) + 1) * sizeof(WCHAR));
+ RegCloseKey(key);
+ return res;
+}
+
+/***********************************************************************
+ * register_key_defvalueA
+ */
+static LONG register_key_defvalueA(
+ HKEY base,
+ WCHAR const *name,
+ char const *value)
+{
+ LONG res;
+ HKEY key;
+
+ res = RegCreateKeyExW(base, name, 0, NULL, 0,
+ KEY_READ | KEY_WRITE, NULL, &key, NULL);
+ if (res != ERROR_SUCCESS) return res;
+ res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
+ lstrlenA(value) + 1);
+ RegCloseKey(key);
+ return res;
+}
+
+/***********************************************************************
+ * register_progid
+ */
+static LONG register_progid(
+ WCHAR const *clsid,
+ char const *progid,
+ char const *curver_progid,
+ char const *name,
+ char const *extra)
+{
+ LONG res;
+ HKEY progid_key;
+
+ res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0,
+ NULL, 0, KEY_READ | KEY_WRITE, NULL,
+ &progid_key, NULL);
+ if (res != ERROR_SUCCESS) return res;
+
+ if (name) {
+ res = RegSetValueExA(progid_key, NULL, 0, REG_SZ,
+ (CONST BYTE*)name, strlen(name) + 1);
+ if (res != ERROR_SUCCESS) goto error_close_progid_key;
+ }
+
+ if (clsid) {
+ res = register_key_defvalueW(progid_key, clsid_keyname, clsid);
+ if (res != ERROR_SUCCESS) goto error_close_progid_key;
+ }
+
+ if (curver_progid) {
+ res = register_key_defvalueA(progid_key, curver_keyname,
+ curver_progid);
+ if (res != ERROR_SUCCESS) goto error_close_progid_key;
+ }
+
+ if (extra) {
+ HKEY extra_key;
+
+ res = RegCreateKeyExA(progid_key, extra, 0,
+ NULL, 0, KEY_READ | KEY_WRITE, NULL,
+ &extra_key, NULL);
+ if (res == ERROR_SUCCESS)
+ RegCloseKey(extra_key);
+ }
+
+error_close_progid_key:
+ RegCloseKey(progid_key);
+ return res;
+}
+
+/***********************************************************************
+ * coclass list
+ */
+static struct regsvr_coclass const coclass_list[] = {
+ { &CLSID_WICImagingFactory,
+ "WIC Imaging Factory",
+ NULL,
+ "windowscodecs.dll",
+ "Apartment"
+ },
+ { &CLSID_WICBmpDecoder,
+ "WIC BMP Decoder",
+ NULL,
+ "windowscodecs.dll",
+ "Apartment"
+ },
+ { &CLSID_WICPngDecoder,
+ "WIC PNG Decoder",
+ NULL,
+ "windowscodecs.dll",
+ "Apartment"
+ },
+ { &CLSID_WICBmpEncoder,
+ "WIC BMP Encoder",
+ NULL,
+ "windowscodecs.dll",
+ "Apartment"
+ },
+ { &CLSID_WICGifDecoder,
+ "WIC GIF Decoder",
+ NULL,
+ "windowscodecs.dll",
+ "Apartment"
+ },
+ { &CLSID_WICIcoDecoder,
+ "WIC ICO Decoder",
+ NULL,
+ "windowscodecs.dll",
+ "Apartment"
+ },
+ { &CLSID_WICJpegDecoder,
+ "WIC JPEG Decoder",
+ NULL,
+ "windowscodecs.dll",
+ "Apartment"
+ },
+ { &CLSID_WICDefaultFormatConverter,
+ "WIC Default Format Converter",
+ NULL,
+ "windowscodecs.dll",
+ "Apartment"
+ },
+ { NULL } /* list terminator */
+};
+
+/***********************************************************************
+ * decoder list
+ */
+static const BYTE mask_all[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
+
+static const BYTE bmp_magic[] = {0x42,0x4d};
+
+static GUID const * const bmp_formats[] = {
+ &GUID_WICPixelFormat1bppIndexed,
+ &GUID_WICPixelFormat2bppIndexed,
+ &GUID_WICPixelFormat4bppIndexed,
+ &GUID_WICPixelFormat8bppIndexed,
+ &GUID_WICPixelFormat16bppBGR555,
+ &GUID_WICPixelFormat16bppBGR565,
+ &GUID_WICPixelFormat24bppBGR,
+ &GUID_WICPixelFormat32bppBGR,
+ &GUID_WICPixelFormat32bppBGRA,
+ NULL
+};
+
+static struct decoder_pattern const bmp_patterns[] = {
+ {2,0,bmp_magic,mask_all,0},
+ {0}
+};
+
+static const BYTE gif87a_magic[6] = "GIF87a";
+static const BYTE gif89a_magic[6] = "GIF89a";
+
+static GUID const * const gif_formats[] = {
+ &GUID_WICPixelFormat8bppIndexed,
+ NULL
+};
+
+static struct decoder_pattern const gif_patterns[] = {
+ {6,0,gif87a_magic,mask_all,0},
+ {6,0,gif89a_magic,mask_all,0},
+ {0}
+};
+
+static const BYTE ico_magic[] = {00,00,01,00};
+
+static GUID const * const ico_formats[] = {
+ &GUID_WICPixelFormat32bppBGRA,
+ NULL
+};
+
+static struct decoder_pattern const ico_patterns[] = {
+ {4,0,ico_magic,mask_all,0},
+ {0}
+};
+
+static const BYTE jpeg_magic[] = {0xff, 0xd8, 0xff, 0xe0};
+
+static GUID const * const jpeg_formats[] = {
+ &GUID_WICPixelFormat24bppBGR,
+ &GUID_WICPixelFormat8bppGray,
+ NULL
+};
+
+static struct decoder_pattern const jpeg_patterns[] = {
+ {4,0,jpeg_magic,mask_all,0},
+ {0}
+};
+
+static const BYTE png_magic[] = {137,80,78,71,13,10,26,10};
+
+static GUID const * const png_formats[] = {
+ &GUID_WICPixelFormatBlackWhite,
+ &GUID_WICPixelFormat2bppGray,
+ &GUID_WICPixelFormat4bppGray,
+ &GUID_WICPixelFormat8bppGray,
+ &GUID_WICPixelFormat16bppGray,
+ &GUID_WICPixelFormat32bppBGRA,
+ &GUID_WICPixelFormat64bppRGBA,
+ &GUID_WICPixelFormat1bppIndexed,
+ &GUID_WICPixelFormat2bppIndexed,
+ &GUID_WICPixelFormat4bppIndexed,
+ &GUID_WICPixelFormat8bppIndexed,
+ &GUID_WICPixelFormat24bppBGR,
+ &GUID_WICPixelFormat48bppRGB,
+ NULL
+};
+
+static struct decoder_pattern const png_patterns[] = {
+ {8,0,png_magic,mask_all,0},
+ {0}
+};
+
+static struct regsvr_decoder const decoder_list[] = {
+ { &CLSID_WICBmpDecoder,
+ "The Wine Project",
+ "BMP Decoder",
+ "1.0.0.0",
+ &GUID_VendorMicrosoft,
+ "image/bmp",
+ ".bmp,.dib,.rle",
+ bmp_formats,
+ bmp_patterns
+ },
+ { &CLSID_WICGifDecoder,
+ "The Wine Project",
+ "GIF Decoder",
+ "1.0.0.0",
+ &GUID_VendorMicrosoft,
+ "image/gif",
+ ".gif",
+ gif_formats,
+ gif_patterns
+ },
+ { &CLSID_WICIcoDecoder,
+ "The Wine Project",
+ "ICO Decoder",
+ "1.0.0.0",
+ &GUID_VendorMicrosoft,
+ "image/vnd.microsoft.icon",
+ ".ico",
+ ico_formats,
+ ico_patterns
+ },
+ { &CLSID_WICJpegDecoder,
+ "The Wine Project",
+ "JPEG Decoder",
+ "1.0.0.0",
+ &GUID_VendorMicrosoft,
+ "image/jpeg",
+ ".jpg;.jpeg;.jfif",
+ jpeg_formats,
+ jpeg_patterns
+ },
+ { &CLSID_WICPngDecoder,
+ "The Wine Project",
+ "PNG Decoder",
+ "1.0.0.0",
+ &GUID_VendorMicrosoft,
+ "image/png",
+ ".png",
+ png_formats,
+ png_patterns
+ },
+ { NULL } /* list terminator */
+};
+
+static GUID const * const converter_formats[] = {
+ &GUID_WICPixelFormat1bppIndexed,
+ &GUID_WICPixelFormat2bppIndexed,
+ &GUID_WICPixelFormat4bppIndexed,
+ &GUID_WICPixelFormat8bppIndexed,
+ &GUID_WICPixelFormatBlackWhite,
+ &GUID_WICPixelFormat2bppGray,
+ &GUID_WICPixelFormat4bppGray,
+ &GUID_WICPixelFormat8bppGray,
+ &GUID_WICPixelFormat16bppGray,
+ &GUID_WICPixelFormat16bppBGR555,
+ &GUID_WICPixelFormat16bppBGR565,
+ &GUID_WICPixelFormat24bppBGR,
+ &GUID_WICPixelFormat32bppBGR,
+ &GUID_WICPixelFormat32bppBGRA,
+ &GUID_WICPixelFormat48bppRGB,
+ &GUID_WICPixelFormat64bppRGBA,
+ NULL
+};
+
+static struct regsvr_converter const converter_list[] = {
+ { &CLSID_WICDefaultFormatConverter,
+ "The Wine Project",
+ "Default Pixel Format Converter",
+ "1.0.0.0",
+ &GUID_VendorMicrosoft,
+ converter_formats
+ },
+ { NULL } /* list terminator */
+};
+
+HRESULT WINAPI DllRegisterServer(void)
+{
+ HRESULT hr;
+
+ TRACE("\n");
+
+ hr = register_coclasses(coclass_list);
+ if (SUCCEEDED(hr))
+ register_decoders(decoder_list);
+ if (SUCCEEDED(hr))
+ register_converters(converter_list);
+ return hr;
+}
+
+HRESULT WINAPI DllUnregisterServer(void)
+{
+ HRESULT hr;
+
+ TRACE("\n");
+
+ hr = unregister_coclasses(coclass_list);
+ if (SUCCEEDED(hr))
+ unregister_decoders(decoder_list);
+ if (SUCCEEDED(hr))
+ unregister_converters(converter_list);
+ return hr;
+}
diff --git a/reactos/dll/win32/windowscodecs/stream.c b/reactos/dll/win32/windowscodecs/stream.c
new file mode 100644
index 00000000000..5672ff50126
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/stream.c
@@ -0,0 +1,512 @@
+/*
+ * Copyright 2009 Tony Wasserka
+ *
+ * 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 "wine/debug.h"
+
+#define COBJMACROS
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "objbase.h"
+#include "wincodec.h"
+#include "wincodecs_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+/******************************************
+ * StreamOnMemory implementation
+ *
+ * Used by IWICStream_InitializeFromMemory
+ *
+ */
+typedef struct StreamOnMemory {
+ const IStreamVtbl *lpVtbl;
+ LONG ref;
+
+ BYTE *pbMemory;
+ DWORD dwMemsize;
+ DWORD dwCurPos;
+} StreamOnMemory;
+
+static HRESULT WINAPI StreamOnMemory_QueryInterface(IStream *iface,
+ REFIID iid, void **ppv)
+{
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IStream, iid) ||
+ IsEqualIID(&IID_ISequentialStream, iid))
+ {
+ *ppv = iface;
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+}
+
+static ULONG WINAPI StreamOnMemory_AddRef(IStream *iface)
+{
+ StreamOnMemory *This = (StreamOnMemory*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI StreamOnMemory_Release(IStream *iface)
+{
+ StreamOnMemory *This = (StreamOnMemory*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0) {
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+ return ref;
+}
+
+static HRESULT WINAPI StreamOnMemory_Read(IStream *iface,
+ void *pv, ULONG cb, ULONG *pcbRead)
+{
+ StreamOnMemory *This = (StreamOnMemory*)iface;
+ ULONG uBytesRead;
+ TRACE("(%p)\n", This);
+
+ if (!pv) return E_INVALIDARG;
+
+ uBytesRead = min(cb, This->dwMemsize - This->dwCurPos);
+ memcpy(pv, This->pbMemory + This->dwCurPos, uBytesRead);
+ This->dwCurPos += uBytesRead;
+ if (pcbRead) *pcbRead = uBytesRead;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI StreamOnMemory_Write(IStream *iface,
+ void const *pv, ULONG cb, ULONG *pcbWritten)
+{
+ StreamOnMemory *This = (StreamOnMemory*)iface;
+ TRACE("(%p)\n", This);
+
+ if (!pv) return E_INVALIDARG;
+
+ if (cb > This->dwMemsize - This->dwCurPos) return STG_E_MEDIUMFULL;
+ if (cb) {
+ memcpy(This->pbMemory + This->dwCurPos, pv, cb);
+ This->dwCurPos += cb;
+ }
+ if (pcbWritten) *pcbWritten = cb;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI StreamOnMemory_Seek(IStream *iface,
+ LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
+{
+ StreamOnMemory *This = (StreamOnMemory*)iface;
+ LARGE_INTEGER NewPosition;
+ TRACE("(%p)\n", This);
+
+ if (dlibMove.QuadPart > 0xFFFFFFFF) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
+
+ if (dwOrigin == STREAM_SEEK_SET) NewPosition.QuadPart = dlibMove.QuadPart;
+ else if (dwOrigin == STREAM_SEEK_CUR) NewPosition.QuadPart = This->dwCurPos + dlibMove.QuadPart;
+ else if (dwOrigin == STREAM_SEEK_END) NewPosition.QuadPart = This->dwMemsize + dlibMove.QuadPart;
+ else return E_INVALIDARG;
+
+ if (NewPosition.QuadPart > This->dwMemsize) return E_INVALIDARG;
+ if (NewPosition.QuadPart < 0) return E_INVALIDARG;
+ This->dwCurPos = NewPosition.u.LowPart;
+
+ if(plibNewPosition) plibNewPosition->QuadPart = This->dwCurPos;
+ return S_OK;
+}
+
+/* SetSize isn't implemented in the native windowscodecs DLL either */
+static HRESULT WINAPI StreamOnMemory_SetSize(IStream *iface,
+ ULARGE_INTEGER libNewSize)
+{
+ TRACE("(%p)\n", iface);
+ return E_NOTIMPL;
+}
+
+/* CopyTo isn't implemented in the native windowscodecs DLL either */
+static HRESULT WINAPI StreamOnMemory_CopyTo(IStream *iface,
+ IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
+{
+ TRACE("(%p)\n", iface);
+ return E_NOTIMPL;
+}
+
+/* Commit isn't implemented in the native windowscodecs DLL either */
+static HRESULT WINAPI StreamOnMemory_Commit(IStream *iface,
+ DWORD grfCommitFlags)
+{
+ TRACE("(%p)\n", iface);
+ return E_NOTIMPL;
+}
+
+/* Revert isn't implemented in the native windowscodecs DLL either */
+static HRESULT WINAPI StreamOnMemory_Revert(IStream *iface)
+{
+ TRACE("(%p)\n", iface);
+ return E_NOTIMPL;
+}
+
+/* LockRegion isn't implemented in the native windowscodecs DLL either */
+static HRESULT WINAPI StreamOnMemory_LockRegion(IStream *iface,
+ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
+{
+ TRACE("(%p)\n", iface);
+ return E_NOTIMPL;
+}
+
+/* UnlockRegion isn't implemented in the native windowscodecs DLL either */
+static HRESULT WINAPI StreamOnMemory_UnlockRegion(IStream *iface,
+ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
+{
+ TRACE("(%p)\n", iface);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI StreamOnMemory_Stat(IStream *iface,
+ STATSTG *pstatstg, DWORD grfStatFlag)
+{
+ StreamOnMemory *This = (StreamOnMemory*)iface;
+ TRACE("(%p)\n", This);
+
+ if (!pstatstg) return E_INVALIDARG;
+
+ ZeroMemory(pstatstg, sizeof(STATSTG));
+ pstatstg->type = STGTY_STREAM;
+ pstatstg->cbSize.QuadPart = This->dwMemsize;
+
+ return S_OK;
+}
+
+/* Clone isn't implemented in the native windowscodecs DLL either */
+static HRESULT WINAPI StreamOnMemory_Clone(IStream *iface,
+ IStream **ppstm)
+{
+ TRACE("(%p)\n", iface);
+ return E_NOTIMPL;
+}
+
+
+const IStreamVtbl StreamOnMemory_Vtbl =
+{
+ /*** IUnknown methods ***/
+ StreamOnMemory_QueryInterface,
+ StreamOnMemory_AddRef,
+ StreamOnMemory_Release,
+ /*** ISequentialStream methods ***/
+ StreamOnMemory_Read,
+ StreamOnMemory_Write,
+ /*** IStream methods ***/
+ StreamOnMemory_Seek,
+ StreamOnMemory_SetSize,
+ StreamOnMemory_CopyTo,
+ StreamOnMemory_Commit,
+ StreamOnMemory_Revert,
+ StreamOnMemory_LockRegion,
+ StreamOnMemory_UnlockRegion,
+ StreamOnMemory_Stat,
+ StreamOnMemory_Clone,
+};
+
+/******************************************
+ * IWICStream implementation
+ *
+ */
+typedef struct IWICStreamImpl
+{
+ const IWICStreamVtbl *lpVtbl;
+ LONG ref;
+
+ IStream *pStream;
+} IWICStreamImpl;
+
+static HRESULT WINAPI IWICStreamImpl_QueryInterface(IWICStream *iface,
+ REFIID iid, void **ppv)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IStream, iid) ||
+ IsEqualIID(&IID_ISequentialStream, iid) || IsEqualIID(&IID_IWICStream, iid))
+ {
+ *ppv = This;
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+}
+
+static ULONG WINAPI IWICStreamImpl_AddRef(IWICStream *iface)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI IWICStreamImpl_Release(IWICStream *iface)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0) {
+ if (This->pStream) IStream_Release(This->pStream);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+ return ref;
+}
+
+static HRESULT WINAPI IWICStreamImpl_Read(IWICStream *iface,
+ void *pv, ULONG cb, ULONG *pcbRead)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED;
+ return IStream_Read(This->pStream, pv, cb, pcbRead);
+}
+
+static HRESULT WINAPI IWICStreamImpl_Write(IWICStream *iface,
+ void const *pv, ULONG cb, ULONG *pcbWritten)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED;
+ return IStream_Write(This->pStream, pv, cb, pcbWritten);
+}
+
+static HRESULT WINAPI IWICStreamImpl_Seek(IWICStream *iface,
+ LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED;
+ return IStream_Seek(This->pStream, dlibMove, dwOrigin, plibNewPosition);
+}
+
+static HRESULT WINAPI IWICStreamImpl_SetSize(IWICStream *iface,
+ ULARGE_INTEGER libNewSize)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED;
+ return IStream_SetSize(This->pStream, libNewSize);
+}
+
+static HRESULT WINAPI IWICStreamImpl_CopyTo(IWICStream *iface,
+ IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED;
+ return IStream_CopyTo(This->pStream, pstm, cb, pcbRead, pcbWritten);
+}
+
+static HRESULT WINAPI IWICStreamImpl_Commit(IWICStream *iface,
+ DWORD grfCommitFlags)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED;
+ return IStream_Commit(This->pStream, grfCommitFlags);
+}
+
+static HRESULT WINAPI IWICStreamImpl_Revert(IWICStream *iface)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED;
+ return IStream_Revert(This->pStream);
+}
+
+static HRESULT WINAPI IWICStreamImpl_LockRegion(IWICStream *iface,
+ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED;
+ return IStream_LockRegion(This->pStream, libOffset, cb, dwLockType);
+}
+
+static HRESULT WINAPI IWICStreamImpl_UnlockRegion(IWICStream *iface,
+ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED;
+ return IStream_UnlockRegion(This->pStream, libOffset, cb, dwLockType);
+}
+
+static HRESULT WINAPI IWICStreamImpl_Stat(IWICStream *iface,
+ STATSTG *pstatstg, DWORD grfStatFlag)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED;
+ return IStream_Stat(This->pStream, pstatstg, grfStatFlag);
+}
+
+static HRESULT WINAPI IWICStreamImpl_Clone(IWICStream *iface,
+ IStream **ppstm)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ TRACE("(%p): relay\n", This);
+
+ if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED;
+ return IStream_Clone(This->pStream, ppstm);
+}
+
+static HRESULT WINAPI IWICStreamImpl_InitializeFromIStream(IWICStream *iface,
+ IStream *pIStream)
+{
+ FIXME("(%p): stub\n", iface);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IWICStreamImpl_InitializeFromFilename(IWICStream *iface,
+ LPCWSTR wzFileName, DWORD dwDesiredAccess)
+{
+ FIXME("(%p): stub\n", iface);
+ return E_NOTIMPL;
+}
+
+/******************************************
+ * IWICStream_InitializeFromMemory
+ *
+ * Initializes the internal IStream object to retrieve its data from a memory chunk.
+ *
+ * PARAMS
+ * pbBuffer [I] pointer to the memory chunk
+ * cbBufferSize [I] number of bytes to use from the memory chunk
+ *
+ * RETURNS
+ * SUCCESS: S_OK
+ * FAILURE: E_INVALIDARG, if pbBuffer is NULL
+ * E_OUTOFMEMORY, if we run out of memory
+ * WINCODEC_ERR_WRONGSTATE, if the IStream object has already been initialized before
+ *
+ */
+static HRESULT WINAPI IWICStreamImpl_InitializeFromMemory(IWICStream *iface,
+ BYTE *pbBuffer, DWORD cbBufferSize)
+{
+ IWICStreamImpl *This = (IWICStreamImpl*)iface;
+ StreamOnMemory *pObject;
+ TRACE("(%p,%p)\n", iface, pbBuffer);
+
+ if (!pbBuffer) return E_INVALIDARG;
+ if (This->pStream) return WINCODEC_ERR_WRONGSTATE;
+
+ pObject = HeapAlloc(GetProcessHeap(), 0, sizeof(StreamOnMemory));
+ if (!pObject) return E_OUTOFMEMORY;
+
+ pObject->lpVtbl = &StreamOnMemory_Vtbl;
+ pObject->ref = 1;
+ pObject->pbMemory = pbBuffer;
+ pObject->dwMemsize = cbBufferSize;
+ pObject->dwCurPos = 0;
+
+ This->pStream = (IStream*)pObject;
+ return S_OK;
+}
+
+static HRESULT WINAPI IWICStreamImpl_InitializeFromIStreamRegion(IWICStream *iface,
+ IStream *pIStream, ULARGE_INTEGER ulOffset, ULARGE_INTEGER ulMaxSize)
+{
+ FIXME("(%p): stub\n", iface);
+ return E_NOTIMPL;
+}
+
+
+const IWICStreamVtbl WICStream_Vtbl =
+{
+ /*** IUnknown methods ***/
+ IWICStreamImpl_QueryInterface,
+ IWICStreamImpl_AddRef,
+ IWICStreamImpl_Release,
+ /*** ISequentialStream methods ***/
+ IWICStreamImpl_Read,
+ IWICStreamImpl_Write,
+ /*** IStream methods ***/
+ IWICStreamImpl_Seek,
+ IWICStreamImpl_SetSize,
+ IWICStreamImpl_CopyTo,
+ IWICStreamImpl_Commit,
+ IWICStreamImpl_Revert,
+ IWICStreamImpl_LockRegion,
+ IWICStreamImpl_UnlockRegion,
+ IWICStreamImpl_Stat,
+ IWICStreamImpl_Clone,
+ /*** IWICStream methods ***/
+ IWICStreamImpl_InitializeFromIStream,
+ IWICStreamImpl_InitializeFromFilename,
+ IWICStreamImpl_InitializeFromMemory,
+ IWICStreamImpl_InitializeFromIStreamRegion,
+};
+
+HRESULT StreamImpl_Create(IWICStream **stream)
+{
+ IWICStreamImpl *pObject;
+
+ if( !stream ) return E_INVALIDARG;
+
+ pObject = HeapAlloc(GetProcessHeap(), 0, sizeof(IWICStreamImpl));
+ if( !pObject ) {
+ *stream = NULL;
+ return E_OUTOFMEMORY;
+ }
+
+ pObject->lpVtbl = &WICStream_Vtbl;
+ pObject->ref = 1;
+ pObject->pStream = NULL;
+
+ *stream = (IWICStream*)pObject;
+
+ return S_OK;
+}
diff --git a/reactos/dll/win32/windowscodecs/ungif.c b/reactos/dll/win32/windowscodecs/ungif.c
new file mode 100644
index 00000000000..c24f387df67
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/ungif.c
@@ -0,0 +1,999 @@
+/*
+ * Gif extracting routines - derived from libungif
+ *
+ * Portions Copyright 2006 Mike McCormack
+ *
+ * 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
+ */
+
+/*
+ * Original copyright notice:
+ *
+ * The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ */
+
+
+/******************************************************************************
+ * "Gif-Lib" - Yet another gif library.
+ *
+ * Written by: Gershon Elber IBM PC Ver 1.1, Aug. 1990
+ ******************************************************************************
+ * The kernel of the GIF Decoding process can be found here.
+ ******************************************************************************
+ * History:
+ * 16 Jun 89 - Version 1.0 by Gershon Elber.
+ * 3 Sep 90 - Version 1.1 by Gershon Elber (Support for Gif89, Unique names).
+ *****************************************************************************/
+
+#include
+#include
+#include "ungif.h"
+
+#include
+#include "windef.h"
+#include "winbase.h"
+
+static void *ungif_alloc( size_t sz )
+{
+ return HeapAlloc( GetProcessHeap(), 0, sz );
+}
+
+static void *ungif_calloc( size_t num, size_t sz )
+{
+ return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, num*sz );
+}
+
+static void *ungif_realloc( void *ptr, size_t sz )
+{
+ return HeapReAlloc( GetProcessHeap(), 0, ptr, sz );
+}
+
+static void ungif_free( void *ptr )
+{
+ HeapFree( GetProcessHeap(), 0, ptr );
+}
+
+#define LZ_MAX_CODE 4095 /* Biggest code possible in 12 bits. */
+#define LZ_BITS 12
+
+#define NO_SUCH_CODE 4098 /* Impossible code, to signal empty. */
+
+typedef struct GifFilePrivateType {
+ GifWord BitsPerPixel, /* Bits per pixel (Codes uses at least this + 1). */
+ ClearCode, /* The CLEAR LZ code. */
+ EOFCode, /* The EOF LZ code. */
+ RunningCode, /* The next code algorithm can generate. */
+ RunningBits, /* The number of bits required to represent RunningCode. */
+ MaxCode1, /* 1 bigger than max. possible code, in RunningBits bits. */
+ LastCode, /* The code before the current code. */
+ CrntCode, /* Current algorithm code. */
+ StackPtr, /* For character stack (see below). */
+ CrntShiftState; /* Number of bits in CrntShiftDWord. */
+ unsigned long CrntShiftDWord; /* For bytes decomposition into codes. */
+ unsigned long PixelCount; /* Number of pixels in image. */
+ InputFunc Read; /* function to read gif input (TVT) */
+ GifByteType Buf[256]; /* Compressed input is buffered here. */
+ GifByteType Stack[LZ_MAX_CODE]; /* Decoded pixels are stacked here. */
+ GifByteType Suffix[LZ_MAX_CODE + 1]; /* So we can trace the codes. */
+ GifPrefixType Prefix[LZ_MAX_CODE + 1];
+} GifFilePrivateType;
+
+/* avoid extra function call in case we use fread (TVT) */
+#define READ(_gif,_buf,_len) \
+ ((GifFilePrivateType*)_gif->Private)->Read(_gif,_buf,_len)
+
+static int DGifGetWord(GifFileType *GifFile, GifWord *Word);
+static int DGifSetupDecompress(GifFileType *GifFile);
+static int DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, int LineLen);
+static int DGifGetPrefixChar(const GifPrefixType *Prefix, int Code, int ClearCode);
+static int DGifDecompressInput(GifFileType *GifFile, int *Code);
+static int DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf,
+ GifByteType *NextByte);
+
+static int DGifGetExtensionNext(GifFileType * GifFile, GifByteType ** GifExtension);
+static int DGifGetCodeNext(GifFileType * GifFile, GifByteType ** GifCodeBlock);
+
+/******************************************************************************
+ * Miscellaneous utility functions
+ *****************************************************************************/
+
+/* return smallest bitfield size n will fit in */
+static int
+BitSize(int n) {
+
+ register int i;
+
+ for (i = 1; i <= 8; i++)
+ if ((1 << i) >= n)
+ break;
+ return (i);
+}
+
+/******************************************************************************
+ * Color map object functions
+ *****************************************************************************/
+
+/*
+ * Allocate a color map of given size; initialize with contents of
+ * ColorMap if that pointer is non-NULL.
+ */
+static ColorMapObject *
+MakeMapObject(int ColorCount,
+ const GifColorType * ColorMap) {
+
+ ColorMapObject *Object;
+
+ /*** FIXME: Our ColorCount has to be a power of two. Is it necessary to
+ * make the user know that or should we automatically round up instead? */
+ if (ColorCount != (1 << BitSize(ColorCount))) {
+ return NULL;
+ }
+
+ Object = ungif_alloc(sizeof(ColorMapObject));
+ if (Object == NULL) {
+ return NULL;
+ }
+
+ Object->Colors = ungif_calloc(ColorCount, sizeof(GifColorType));
+ if (Object->Colors == NULL) {
+ return NULL;
+ }
+
+ Object->ColorCount = ColorCount;
+ Object->BitsPerPixel = BitSize(ColorCount);
+
+ if (ColorMap) {
+ memcpy(Object->Colors, ColorMap, ColorCount * sizeof(GifColorType));
+ }
+
+ return (Object);
+}
+
+/*
+ * Free a color map object
+ */
+static void
+FreeMapObject(ColorMapObject * Object) {
+
+ if (Object != NULL) {
+ ungif_free(Object->Colors);
+ ungif_free(Object);
+ /*** FIXME:
+ * When we are willing to break API we need to make this function
+ * FreeMapObject(ColorMapObject **Object)
+ * and do this assignment to NULL here:
+ * *Object = NULL;
+ */
+ }
+}
+
+static int
+AddExtensionBlock(SavedImage * New,
+ int Len,
+ const unsigned char ExtData[]) {
+
+ ExtensionBlock *ep;
+
+ if (New->ExtensionBlocks == NULL)
+ New->ExtensionBlocks = ungif_alloc(sizeof(ExtensionBlock));
+ else
+ New->ExtensionBlocks = ungif_realloc(New->ExtensionBlocks,
+ sizeof(ExtensionBlock) *
+ (New->ExtensionBlockCount + 1));
+
+ if (New->ExtensionBlocks == NULL)
+ return (GIF_ERROR);
+
+ ep = &New->ExtensionBlocks[New->ExtensionBlockCount++];
+
+ ep->ByteCount=Len;
+ ep->Bytes = ungif_alloc(ep->ByteCount);
+ if (ep->Bytes == NULL)
+ return (GIF_ERROR);
+
+ if (ExtData) {
+ memcpy(ep->Bytes, ExtData, Len);
+ ep->Function = New->Function;
+ }
+
+ return (GIF_OK);
+}
+
+static void
+FreeExtension(SavedImage * Image)
+{
+ ExtensionBlock *ep;
+
+ if ((Image == NULL) || (Image->ExtensionBlocks == NULL)) {
+ return;
+ }
+ for (ep = Image->ExtensionBlocks;
+ ep < (Image->ExtensionBlocks + Image->ExtensionBlockCount); ep++)
+ ungif_free(ep->Bytes);
+ ungif_free(Image->ExtensionBlocks);
+ Image->ExtensionBlocks = NULL;
+}
+
+/******************************************************************************
+ * Image block allocation functions
+******************************************************************************/
+
+static void
+FreeSavedImages(GifFileType * GifFile) {
+
+ SavedImage *sp;
+
+ if ((GifFile == NULL) || (GifFile->SavedImages == NULL)) {
+ return;
+ }
+ for (sp = GifFile->SavedImages;
+ sp < GifFile->SavedImages + GifFile->ImageCount; sp++) {
+ if (sp->ImageDesc.ColorMap) {
+ FreeMapObject(sp->ImageDesc.ColorMap);
+ sp->ImageDesc.ColorMap = NULL;
+ }
+
+ ungif_free(sp->RasterBits);
+
+ if (sp->ExtensionBlocks)
+ FreeExtension(sp);
+ }
+ ungif_free(GifFile->SavedImages);
+ GifFile->SavedImages=NULL;
+}
+
+/******************************************************************************
+ * This routine should be called before any other DGif calls. Note that
+ * this routine is called automatically from DGif file open routines.
+ *****************************************************************************/
+static int
+DGifGetScreenDesc(GifFileType * GifFile) {
+
+ int i, BitsPerPixel;
+ GifByteType Buf[3];
+
+ /* Put the screen descriptor into the file: */
+ if (DGifGetWord(GifFile, &GifFile->SWidth) == GIF_ERROR ||
+ DGifGetWord(GifFile, &GifFile->SHeight) == GIF_ERROR)
+ return GIF_ERROR;
+
+ if (READ(GifFile, Buf, 3) != 3) {
+ return GIF_ERROR;
+ }
+ GifFile->SColorResolution = (((Buf[0] & 0x70) + 1) >> 4) + 1;
+ BitsPerPixel = (Buf[0] & 0x07) + 1;
+ GifFile->SBackGroundColor = Buf[1];
+ if (Buf[0] & 0x80) { /* Do we have global color map? */
+
+ GifFile->SColorMap = MakeMapObject(1 << BitsPerPixel, NULL);
+ if (GifFile->SColorMap == NULL) {
+ return GIF_ERROR;
+ }
+
+ /* Get the global color map: */
+ for (i = 0; i < GifFile->SColorMap->ColorCount; i++) {
+ if (READ(GifFile, Buf, 3) != 3) {
+ FreeMapObject(GifFile->SColorMap);
+ GifFile->SColorMap = NULL;
+ return GIF_ERROR;
+ }
+ GifFile->SColorMap->Colors[i].Red = Buf[0];
+ GifFile->SColorMap->Colors[i].Green = Buf[1];
+ GifFile->SColorMap->Colors[i].Blue = Buf[2];
+ }
+ } else {
+ GifFile->SColorMap = NULL;
+ }
+
+ return GIF_OK;
+}
+
+/******************************************************************************
+ * This routine should be called before any attempt to read an image.
+ *****************************************************************************/
+static int
+DGifGetRecordType(GifFileType * GifFile,
+ GifRecordType * Type) {
+
+ GifByteType Buf;
+
+ if (READ(GifFile, &Buf, 1) != 1) {
+ return GIF_ERROR;
+ }
+
+ switch (Buf) {
+ case ',':
+ *Type = IMAGE_DESC_RECORD_TYPE;
+ break;
+ case '!':
+ *Type = EXTENSION_RECORD_TYPE;
+ break;
+ case ';':
+ *Type = TERMINATE_RECORD_TYPE;
+ break;
+ default:
+ *Type = UNDEFINED_RECORD_TYPE;
+ return GIF_ERROR;
+ }
+
+ return GIF_OK;
+}
+
+/******************************************************************************
+ * This routine should be called before any attempt to read an image.
+ * Note it is assumed the Image desc. header (',') has been read.
+ *****************************************************************************/
+static int
+DGifGetImageDesc(GifFileType * GifFile) {
+
+ int i, BitsPerPixel;
+ GifByteType Buf[3];
+ GifFilePrivateType *Private = GifFile->Private;
+ SavedImage *sp;
+
+ if (DGifGetWord(GifFile, &GifFile->Image.Left) == GIF_ERROR ||
+ DGifGetWord(GifFile, &GifFile->Image.Top) == GIF_ERROR ||
+ DGifGetWord(GifFile, &GifFile->Image.Width) == GIF_ERROR ||
+ DGifGetWord(GifFile, &GifFile->Image.Height) == GIF_ERROR)
+ return GIF_ERROR;
+ if (READ(GifFile, Buf, 1) != 1) {
+ return GIF_ERROR;
+ }
+ BitsPerPixel = (Buf[0] & 0x07) + 1;
+ GifFile->Image.Interlace = (Buf[0] & 0x40);
+ if (Buf[0] & 0x80) { /* Does this image have local color map? */
+
+ /*** FIXME: Why do we check both of these in order to do this?
+ * Why do we have both Image and SavedImages? */
+ if (GifFile->Image.ColorMap && GifFile->SavedImages == NULL)
+ FreeMapObject(GifFile->Image.ColorMap);
+
+ GifFile->Image.ColorMap = MakeMapObject(1 << BitsPerPixel, NULL);
+ if (GifFile->Image.ColorMap == NULL) {
+ return GIF_ERROR;
+ }
+
+ /* Get the image local color map: */
+ for (i = 0; i < GifFile->Image.ColorMap->ColorCount; i++) {
+ if (READ(GifFile, Buf, 3) != 3) {
+ FreeMapObject(GifFile->Image.ColorMap);
+ GifFile->Image.ColorMap = NULL;
+ return GIF_ERROR;
+ }
+ GifFile->Image.ColorMap->Colors[i].Red = Buf[0];
+ GifFile->Image.ColorMap->Colors[i].Green = Buf[1];
+ GifFile->Image.ColorMap->Colors[i].Blue = Buf[2];
+ }
+ } else if (GifFile->Image.ColorMap) {
+ FreeMapObject(GifFile->Image.ColorMap);
+ GifFile->Image.ColorMap = NULL;
+ }
+
+ if (GifFile->SavedImages) {
+ if ((GifFile->SavedImages = ungif_realloc(GifFile->SavedImages,
+ sizeof(SavedImage) *
+ (GifFile->ImageCount + 1))) == NULL) {
+ return GIF_ERROR;
+ }
+ } else {
+ if ((GifFile->SavedImages = ungif_alloc(sizeof(SavedImage))) == NULL) {
+ return GIF_ERROR;
+ }
+ }
+
+ sp = &GifFile->SavedImages[GifFile->ImageCount];
+ sp->ImageDesc = GifFile->Image;
+ if (GifFile->Image.ColorMap != NULL) {
+ sp->ImageDesc.ColorMap = MakeMapObject(
+ GifFile->Image.ColorMap->ColorCount,
+ GifFile->Image.ColorMap->Colors);
+ if (sp->ImageDesc.ColorMap == NULL) {
+ return GIF_ERROR;
+ }
+ }
+ sp->RasterBits = NULL;
+ sp->ExtensionBlockCount = 0;
+ sp->ExtensionBlocks = NULL;
+
+ GifFile->ImageCount++;
+
+ Private->PixelCount = (long)GifFile->Image.Width *
+ (long)GifFile->Image.Height;
+
+ DGifSetupDecompress(GifFile); /* Reset decompress algorithm parameters. */
+
+ return GIF_OK;
+}
+
+/******************************************************************************
+ * Get one full scanned line (Line) of length LineLen from GIF file.
+ *****************************************************************************/
+static int
+DGifGetLine(GifFileType * GifFile,
+ GifPixelType * Line,
+ int LineLen) {
+
+ GifByteType *Dummy;
+ GifFilePrivateType *Private = GifFile->Private;
+
+ if (!LineLen)
+ LineLen = GifFile->Image.Width;
+
+ if ((Private->PixelCount -= LineLen) > 0xffff0000UL) {
+ return GIF_ERROR;
+ }
+
+ if (DGifDecompressLine(GifFile, Line, LineLen) == GIF_OK) {
+ if (Private->PixelCount == 0) {
+ /* We probably would not be called any more, so lets clean
+ * everything before we return: need to flush out all rest of
+ * image until empty block (size 0) detected. We use GetCodeNext. */
+ do
+ if (DGifGetCodeNext(GifFile, &Dummy) == GIF_ERROR)
+ return GIF_ERROR;
+ while (Dummy != NULL) ;
+ }
+ return GIF_OK;
+ } else
+ return GIF_ERROR;
+}
+
+/******************************************************************************
+ * Get an extension block (see GIF manual) from gif file. This routine only
+ * returns the first data block, and DGifGetExtensionNext should be called
+ * after this one until NULL extension is returned.
+ * The Extension should NOT be freed by the user (not dynamically allocated).
+ * Note it is assumed the Extension desc. header ('!') has been read.
+ *****************************************************************************/
+static int
+DGifGetExtension(GifFileType * GifFile,
+ int *ExtCode,
+ GifByteType ** Extension) {
+
+ GifByteType Buf;
+
+ if (READ(GifFile, &Buf, 1) != 1) {
+ return GIF_ERROR;
+ }
+ *ExtCode = Buf;
+
+ return DGifGetExtensionNext(GifFile, Extension);
+}
+
+/******************************************************************************
+ * Get a following extension block (see GIF manual) from gif file. This
+ * routine should be called until NULL Extension is returned.
+ * The Extension should NOT be freed by the user (not dynamically allocated).
+ *****************************************************************************/
+static int
+DGifGetExtensionNext(GifFileType * GifFile,
+ GifByteType ** Extension) {
+
+ GifByteType Buf;
+ GifFilePrivateType *Private = GifFile->Private;
+
+ if (READ(GifFile, &Buf, 1) != 1) {
+ return GIF_ERROR;
+ }
+ if (Buf > 0) {
+ *Extension = Private->Buf; /* Use private unused buffer. */
+ (*Extension)[0] = Buf; /* Pascal strings notation (pos. 0 is len.). */
+ if (READ(GifFile, &((*Extension)[1]), Buf) != Buf) {
+ return GIF_ERROR;
+ }
+ } else
+ *Extension = NULL;
+
+ return GIF_OK;
+}
+
+/******************************************************************************
+ * Get 2 bytes (word) from the given file:
+ *****************************************************************************/
+static int
+DGifGetWord(GifFileType * GifFile,
+ GifWord *Word) {
+
+ unsigned char c[2];
+
+ if (READ(GifFile, c, 2) != 2) {
+ return GIF_ERROR;
+ }
+
+ *Word = (((unsigned int)c[1]) << 8) + c[0];
+ return GIF_OK;
+}
+
+/******************************************************************************
+ * Continue to get the image code in compressed form. This routine should be
+ * called until NULL block is returned.
+ * The block should NOT be freed by the user (not dynamically allocated).
+ *****************************************************************************/
+static int
+DGifGetCodeNext(GifFileType * GifFile,
+ GifByteType ** CodeBlock) {
+
+ GifByteType Buf;
+ GifFilePrivateType *Private = GifFile->Private;
+
+ if (READ(GifFile, &Buf, 1) != 1) {
+ return GIF_ERROR;
+ }
+
+ if (Buf > 0) {
+ *CodeBlock = Private->Buf; /* Use private unused buffer. */
+ (*CodeBlock)[0] = Buf; /* Pascal strings notation (pos. 0 is len.). */
+ if (READ(GifFile, &((*CodeBlock)[1]), Buf) != Buf) {
+ return GIF_ERROR;
+ }
+ } else {
+ *CodeBlock = NULL;
+ Private->Buf[0] = 0; /* Make sure the buffer is empty! */
+ Private->PixelCount = 0; /* And local info. indicate image read. */
+ }
+
+ return GIF_OK;
+}
+
+/******************************************************************************
+ * Setup the LZ decompression for this image:
+ *****************************************************************************/
+static int
+DGifSetupDecompress(GifFileType * GifFile) {
+
+ int i, BitsPerPixel;
+ GifByteType CodeSize;
+ GifPrefixType *Prefix;
+ GifFilePrivateType *Private = GifFile->Private;
+
+ READ(GifFile, &CodeSize, 1); /* Read Code size from file. */
+ BitsPerPixel = CodeSize;
+
+ Private->Buf[0] = 0; /* Input Buffer empty. */
+ Private->BitsPerPixel = BitsPerPixel;
+ Private->ClearCode = (1 << BitsPerPixel);
+ Private->EOFCode = Private->ClearCode + 1;
+ Private->RunningCode = Private->EOFCode + 1;
+ Private->RunningBits = BitsPerPixel + 1; /* Number of bits per code. */
+ Private->MaxCode1 = 1 << Private->RunningBits; /* Max. code + 1. */
+ Private->StackPtr = 0; /* No pixels on the pixel stack. */
+ Private->LastCode = NO_SUCH_CODE;
+ Private->CrntShiftState = 0; /* No information in CrntShiftDWord. */
+ Private->CrntShiftDWord = 0;
+
+ Prefix = Private->Prefix;
+ for (i = 0; i <= LZ_MAX_CODE; i++)
+ Prefix[i] = NO_SUCH_CODE;
+
+ return GIF_OK;
+}
+
+/******************************************************************************
+ * The LZ decompression routine:
+ * This version decompress the given gif file into Line of length LineLen.
+ * This routine can be called few times (one per scan line, for example), in
+ * order the complete the whole image.
+ *****************************************************************************/
+static int
+DGifDecompressLine(GifFileType * GifFile,
+ GifPixelType * Line,
+ int LineLen) {
+
+ int i = 0;
+ int j, CrntCode, EOFCode, ClearCode, CrntPrefix, LastCode, StackPtr;
+ GifByteType *Stack, *Suffix;
+ GifPrefixType *Prefix;
+ GifFilePrivateType *Private = GifFile->Private;
+
+ StackPtr = Private->StackPtr;
+ Prefix = Private->Prefix;
+ Suffix = Private->Suffix;
+ Stack = Private->Stack;
+ EOFCode = Private->EOFCode;
+ ClearCode = Private->ClearCode;
+ LastCode = Private->LastCode;
+
+ if (StackPtr != 0) {
+ /* Let pop the stack off before continuing to read the gif file: */
+ while (StackPtr != 0 && i < LineLen)
+ Line[i++] = Stack[--StackPtr];
+ }
+
+ while (i < LineLen) { /* Decode LineLen items. */
+ if (DGifDecompressInput(GifFile, &CrntCode) == GIF_ERROR)
+ return GIF_ERROR;
+
+ if (CrntCode == EOFCode) {
+ /* Note, however, that usually we will not be here as we will stop
+ * decoding as soon as we got all the pixel, or EOF code will
+ * not be read at all, and DGifGetLine/Pixel clean everything. */
+ if (i != LineLen - 1 || Private->PixelCount != 0) {
+ return GIF_ERROR;
+ }
+ i++;
+ } else if (CrntCode == ClearCode) {
+ /* We need to start over again: */
+ for (j = 0; j <= LZ_MAX_CODE; j++)
+ Prefix[j] = NO_SUCH_CODE;
+ Private->RunningCode = Private->EOFCode + 1;
+ Private->RunningBits = Private->BitsPerPixel + 1;
+ Private->MaxCode1 = 1 << Private->RunningBits;
+ LastCode = Private->LastCode = NO_SUCH_CODE;
+ } else {
+ /* It's a regular code - if in pixel range simply add it to output
+ * stream, otherwise trace to codes linked list until the prefix
+ * is in pixel range: */
+ if (CrntCode < ClearCode) {
+ /* This is simple - its pixel scalar, so add it to output: */
+ Line[i++] = CrntCode;
+ } else {
+ /* It's a code to be traced: trace the linked list
+ * until the prefix is a pixel, while pushing the suffix
+ * pixels on our stack. If we done, pop the stack in reverse
+ * order (that's what stack is good for!) for output. */
+ if (Prefix[CrntCode] == NO_SUCH_CODE) {
+ /* Only allowed if CrntCode is exactly the running code:
+ * In that case CrntCode = XXXCode, CrntCode or the
+ * prefix code is last code and the suffix char is
+ * exactly the prefix of last code! */
+ if (CrntCode == Private->RunningCode - 2) {
+ CrntPrefix = LastCode;
+ Suffix[Private->RunningCode - 2] =
+ Stack[StackPtr++] = DGifGetPrefixChar(Prefix,
+ LastCode,
+ ClearCode);
+ } else {
+ return GIF_ERROR;
+ }
+ } else
+ CrntPrefix = CrntCode;
+
+ /* Now (if image is O.K.) we should not get a NO_SUCH_CODE
+ * during the trace. As we might loop forever, in case of
+ * defective image, we count the number of loops we trace
+ * and stop if we got LZ_MAX_CODE. Obviously we cannot
+ * loop more than that. */
+ j = 0;
+ while (j++ <= LZ_MAX_CODE &&
+ CrntPrefix > ClearCode && CrntPrefix <= LZ_MAX_CODE) {
+ Stack[StackPtr++] = Suffix[CrntPrefix];
+ CrntPrefix = Prefix[CrntPrefix];
+ }
+ if (j >= LZ_MAX_CODE || CrntPrefix > LZ_MAX_CODE) {
+ return GIF_ERROR;
+ }
+ /* Push the last character on stack: */
+ Stack[StackPtr++] = CrntPrefix;
+
+ /* Now lets pop all the stack into output: */
+ while (StackPtr != 0 && i < LineLen)
+ Line[i++] = Stack[--StackPtr];
+ }
+ if (LastCode != NO_SUCH_CODE) {
+ Prefix[Private->RunningCode - 2] = LastCode;
+
+ if (CrntCode == Private->RunningCode - 2) {
+ /* Only allowed if CrntCode is exactly the running code:
+ * In that case CrntCode = XXXCode, CrntCode or the
+ * prefix code is last code and the suffix char is
+ * exactly the prefix of last code! */
+ Suffix[Private->RunningCode - 2] =
+ DGifGetPrefixChar(Prefix, LastCode, ClearCode);
+ } else {
+ Suffix[Private->RunningCode - 2] =
+ DGifGetPrefixChar(Prefix, CrntCode, ClearCode);
+ }
+ }
+ LastCode = CrntCode;
+ }
+ }
+
+ Private->LastCode = LastCode;
+ Private->StackPtr = StackPtr;
+
+ return GIF_OK;
+}
+
+/******************************************************************************
+ * Routine to trace the Prefixes linked list until we get a prefix which is
+ * not code, but a pixel value (less than ClearCode). Returns that pixel value.
+ * If image is defective, we might loop here forever, so we limit the loops to
+ * the maximum possible if image O.k. - LZ_MAX_CODE times.
+ *****************************************************************************/
+static int
+DGifGetPrefixChar(const GifPrefixType *Prefix,
+ int Code,
+ int ClearCode) {
+
+ int i = 0;
+
+ while (Code > ClearCode && i++ <= LZ_MAX_CODE)
+ Code = Prefix[Code];
+ return Code;
+}
+
+/******************************************************************************
+ * The LZ decompression input routine:
+ * This routine is responsible for the decompression of the bit stream from
+ * 8 bits (bytes) packets, into the real codes.
+ * Returns GIF_OK if read successfully.
+ *****************************************************************************/
+static int
+DGifDecompressInput(GifFileType * GifFile,
+ int *Code) {
+
+ GifFilePrivateType *Private = GifFile->Private;
+
+ GifByteType NextByte;
+ static const unsigned short CodeMasks[] = {
+ 0x0000, 0x0001, 0x0003, 0x0007,
+ 0x000f, 0x001f, 0x003f, 0x007f,
+ 0x00ff, 0x01ff, 0x03ff, 0x07ff,
+ 0x0fff
+ };
+ /* The image can't contain more than LZ_BITS per code. */
+ if (Private->RunningBits > LZ_BITS) {
+ return GIF_ERROR;
+ }
+
+ while (Private->CrntShiftState < Private->RunningBits) {
+ /* Needs to get more bytes from input stream for next code: */
+ if (DGifBufferedInput(GifFile, Private->Buf, &NextByte) == GIF_ERROR) {
+ return GIF_ERROR;
+ }
+ Private->CrntShiftDWord |=
+ ((unsigned long)NextByte) << Private->CrntShiftState;
+ Private->CrntShiftState += 8;
+ }
+ *Code = Private->CrntShiftDWord & CodeMasks[Private->RunningBits];
+
+ Private->CrntShiftDWord >>= Private->RunningBits;
+ Private->CrntShiftState -= Private->RunningBits;
+
+ /* If code cannot fit into RunningBits bits, must raise its size. Note
+ * however that codes above 4095 are used for special signaling.
+ * If we're using LZ_BITS bits already and we're at the max code, just
+ * keep using the table as it is, don't increment Private->RunningCode.
+ */
+ if (Private->RunningCode < LZ_MAX_CODE + 2 &&
+ ++Private->RunningCode > Private->MaxCode1 &&
+ Private->RunningBits < LZ_BITS) {
+ Private->MaxCode1 <<= 1;
+ Private->RunningBits++;
+ }
+ return GIF_OK;
+}
+
+/******************************************************************************
+ * This routines read one gif data block at a time and buffers it internally
+ * so that the decompression routine could access it.
+ * The routine returns the next byte from its internal buffer (or read next
+ * block in if buffer empty) and returns GIF_OK if successful.
+ *****************************************************************************/
+static int
+DGifBufferedInput(GifFileType * GifFile,
+ GifByteType * Buf,
+ GifByteType * NextByte) {
+
+ if (Buf[0] == 0) {
+ /* Needs to read the next buffer - this one is empty: */
+ if (READ(GifFile, Buf, 1) != 1) {
+ return GIF_ERROR;
+ }
+ /* There shouldn't be any empty data blocks here as the LZW spec
+ * says the LZW termination code should come first. Therefore we
+ * shouldn't be inside this routine at that point.
+ */
+ if (Buf[0] == 0) {
+ return GIF_ERROR;
+ }
+ if (READ(GifFile, &Buf[1], Buf[0]) != Buf[0]) {
+ return GIF_ERROR;
+ }
+ *NextByte = Buf[1];
+ Buf[1] = 2; /* We use now the second place as last char read! */
+ Buf[0]--;
+ } else {
+ *NextByte = Buf[Buf[1]++];
+ Buf[0]--;
+ }
+
+ return GIF_OK;
+}
+
+/******************************************************************************
+ * This routine reads an entire GIF into core, hanging all its state info off
+ * the GifFileType pointer. Call DGifOpenFileName() or DGifOpenFileHandle()
+ * first to initialize I/O. Its inverse is EGifSpew().
+ ******************************************************************************/
+int
+DGifSlurp(GifFileType * GifFile) {
+
+ int ImageSize;
+ GifRecordType RecordType;
+ SavedImage *sp;
+ GifByteType *ExtData;
+ SavedImage temp_save;
+
+ temp_save.ExtensionBlocks = NULL;
+ temp_save.ExtensionBlockCount = 0;
+
+ do {
+ if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR)
+ return (GIF_ERROR);
+
+ switch (RecordType) {
+ case IMAGE_DESC_RECORD_TYPE:
+ if (DGifGetImageDesc(GifFile) == GIF_ERROR)
+ return (GIF_ERROR);
+
+ sp = &GifFile->SavedImages[GifFile->ImageCount - 1];
+ ImageSize = sp->ImageDesc.Width * sp->ImageDesc.Height;
+
+ sp->RasterBits = ungif_alloc(ImageSize * sizeof(GifPixelType));
+ if (sp->RasterBits == NULL) {
+ return GIF_ERROR;
+ }
+ if (DGifGetLine(GifFile, sp->RasterBits, ImageSize) ==
+ GIF_ERROR)
+ return (GIF_ERROR);
+ if (temp_save.ExtensionBlocks) {
+ sp->ExtensionBlocks = temp_save.ExtensionBlocks;
+ sp->ExtensionBlockCount = temp_save.ExtensionBlockCount;
+
+ temp_save.ExtensionBlocks = NULL;
+ temp_save.ExtensionBlockCount = 0;
+
+ /* FIXME: The following is wrong. It is left in only for
+ * backwards compatibility. Someday it should go away. Use
+ * the sp->ExtensionBlocks->Function variable instead. */
+ sp->Function = sp->ExtensionBlocks[0].Function;
+ }
+ break;
+
+ case EXTENSION_RECORD_TYPE:
+ if (DGifGetExtension(GifFile, &temp_save.Function, &ExtData) ==
+ GIF_ERROR)
+ return (GIF_ERROR);
+ while (ExtData != NULL) {
+
+ /* Create an extension block with our data */
+ if (AddExtensionBlock(&temp_save, ExtData[0], &ExtData[1])
+ == GIF_ERROR)
+ return (GIF_ERROR);
+
+ if (DGifGetExtensionNext(GifFile, &ExtData) == GIF_ERROR)
+ return (GIF_ERROR);
+ temp_save.Function = 0;
+ }
+ break;
+
+ case TERMINATE_RECORD_TYPE:
+ break;
+
+ default: /* Should be trapped by DGifGetRecordType */
+ break;
+ }
+ } while (RecordType != TERMINATE_RECORD_TYPE);
+
+ /* Just in case the Gif has an extension block without an associated
+ * image... (Should we save this into a savefile structure with no image
+ * instead? Have to check if the present writing code can handle that as
+ * well.... */
+ if (temp_save.ExtensionBlocks)
+ FreeExtension(&temp_save);
+
+ return (GIF_OK);
+}
+
+/******************************************************************************
+ * GifFileType constructor with user supplied input function (TVT)
+ *****************************************************************************/
+GifFileType *
+DGifOpen(void *userData,
+ InputFunc readFunc) {
+
+ unsigned char Buf[GIF_STAMP_LEN + 1];
+ GifFileType *GifFile;
+ GifFilePrivateType *Private;
+
+ GifFile = ungif_alloc(sizeof(GifFileType));
+ if (GifFile == NULL) {
+ return NULL;
+ }
+
+ memset(GifFile, '\0', sizeof(GifFileType));
+
+ Private = ungif_alloc(sizeof(GifFilePrivateType));
+ if (!Private) {
+ ungif_free(GifFile);
+ return NULL;
+ }
+
+ GifFile->Private = (void*)Private;
+
+ Private->Read = readFunc; /* TVT */
+ GifFile->UserData = userData; /* TVT */
+
+ /* Lets see if this is a GIF file: */
+ if (READ(GifFile, Buf, GIF_STAMP_LEN) != GIF_STAMP_LEN) {
+ ungif_free(Private);
+ ungif_free(GifFile);
+ return NULL;
+ }
+
+ /* The GIF Version number is ignored at this time. Maybe we should do
+ * something more useful with it. */
+ Buf[GIF_STAMP_LEN] = 0;
+ if (memcmp(GIF_STAMP, Buf, GIF_VERSION_POS) != 0) {
+ ungif_free(Private);
+ ungif_free(GifFile);
+ return NULL;
+ }
+
+ if (DGifGetScreenDesc(GifFile) == GIF_ERROR) {
+ ungif_free(Private);
+ ungif_free(GifFile);
+ return NULL;
+ }
+
+ return GifFile;
+}
+
+/******************************************************************************
+ * This routine should be called last, to close the GIF file.
+ *****************************************************************************/
+int
+DGifCloseFile(GifFileType * GifFile) {
+
+ GifFilePrivateType *Private;
+
+ if (GifFile == NULL)
+ return GIF_ERROR;
+
+ Private = GifFile->Private;
+
+ if (GifFile->Image.ColorMap) {
+ FreeMapObject(GifFile->Image.ColorMap);
+ GifFile->Image.ColorMap = NULL;
+ }
+
+ if (GifFile->SColorMap) {
+ FreeMapObject(GifFile->SColorMap);
+ GifFile->SColorMap = NULL;
+ }
+
+ ungif_free(Private);
+ Private = NULL;
+
+ if (GifFile->SavedImages) {
+ FreeSavedImages(GifFile);
+ GifFile->SavedImages = NULL;
+ }
+
+ ungif_free(GifFile);
+
+ return GIF_OK;
+}
diff --git a/reactos/dll/win32/windowscodecs/ungif.h b/reactos/dll/win32/windowscodecs/ungif.h
new file mode 100644
index 00000000000..e71dad8b3aa
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/ungif.h
@@ -0,0 +1,169 @@
+/*
+ * Gif extracting routines - derived from libungif
+ *
+ * Portions Copyright 2006 Mike McCormack
+ *
+ * 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
+ */
+
+/*
+ * Original copyright notice:
+ *
+ * The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ */
+
+/******************************************************************************
+ * In order to make life a little bit easier when using the GIF file format,
+ * this library was written, and which does all the dirty work...
+ *
+ * Written by Gershon Elber, Jun. 1989
+ * Hacks by Eric S. Raymond, Sep. 1992
+ ******************************************************************************
+ * History:
+ * 14 Jun 89 - Version 1.0 by Gershon Elber.
+ * 3 Sep 90 - Version 1.1 by Gershon Elber (Support for Gif89, Unique names)
+ * 15 Sep 90 - Version 2.0 by Eric S. Raymond (Changes to support GIF slurp)
+ * 26 Jun 96 - Version 3.0 by Eric S. Raymond (Full GIF89 support)
+ * 17 Dec 98 - Version 4.0 by Toshio Kuratomi (Fix extension writing code)
+ *****************************************************************************/
+
+#ifndef _UNGIF_H_
+#define _UNGIF_H_ 1
+
+#define GIF_ERROR 0
+#define GIF_OK 1
+
+#ifndef TRUE
+#define TRUE 1
+#endif /* TRUE */
+#ifndef FALSE
+#define FALSE 0
+#endif /* FALSE */
+
+#ifndef NULL
+#define NULL 0
+#endif /* NULL */
+
+#define GIF_STAMP "GIFVER" /* First chars in file - GIF stamp. */
+#define GIF_STAMP_LEN sizeof(GIF_STAMP) - 1
+#define GIF_VERSION_POS 3 /* Version first character in stamp. */
+#define GIF87_STAMP "GIF87a" /* First chars in file - GIF stamp. */
+#define GIF89_STAMP "GIF89a" /* First chars in file - GIF stamp. */
+
+#define GIF_FILE_BUFFER_SIZE 16384 /* Files uses bigger buffers than usual. */
+
+typedef int GifBooleanType;
+typedef unsigned char GifPixelType;
+typedef unsigned char *GifRowType;
+typedef unsigned char GifByteType;
+typedef unsigned int GifPrefixType;
+typedef int GifWord;
+
+typedef struct GifColorType {
+ GifByteType Red, Green, Blue;
+} GifColorType;
+
+typedef struct ColorMapObject {
+ int ColorCount;
+ int BitsPerPixel;
+ GifColorType *Colors;
+} ColorMapObject;
+
+typedef struct GifImageDesc {
+ GifWord Left, Top, Width, Height, /* Current image dimensions. */
+ Interlace; /* Sequential/Interlaced lines. */
+ ColorMapObject *ColorMap; /* The local color map */
+} GifImageDesc;
+
+typedef struct GifFileType {
+ GifWord SWidth, SHeight, /* Screen dimensions. */
+ SColorResolution, /* How many colors can we generate? */
+ SBackGroundColor; /* I hope you understand this one... */
+ ColorMapObject *SColorMap; /* NULL if not exists. */
+ int ImageCount; /* Number of current image */
+ GifImageDesc Image; /* Block describing current image */
+ struct SavedImage *SavedImages; /* Use this to accumulate file state */
+ void *UserData; /* hook to attach user data (TVT) */
+ void *Private; /* Don't mess with this! */
+} GifFileType;
+
+typedef enum {
+ UNDEFINED_RECORD_TYPE,
+ SCREEN_DESC_RECORD_TYPE,
+ IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */
+ EXTENSION_RECORD_TYPE, /* Begin with '!' */
+ TERMINATE_RECORD_TYPE /* Begin with ';' */
+} GifRecordType;
+
+/* func type to read gif data from arbitrary sources (TVT) */
+typedef int (*InputFunc) (GifFileType *, GifByteType *, int);
+
+/* GIF89 extension function codes */
+
+#define COMMENT_EXT_FUNC_CODE 0xfe /* comment */
+#define GRAPHICS_EXT_FUNC_CODE 0xf9 /* graphics control */
+#define PLAINTEXT_EXT_FUNC_CODE 0x01 /* plaintext */
+#define APPLICATION_EXT_FUNC_CODE 0xff /* application block */
+
+/* public interface to ungif.c */
+int DGifSlurp(GifFileType * GifFile);
+GifFileType *DGifOpen(void *userPtr, InputFunc readFunc);
+int DGifCloseFile(GifFileType * GifFile);
+
+#define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */
+#define D_GIF_ERR_READ_FAILED 102
+#define D_GIF_ERR_NOT_GIF_FILE 103
+#define D_GIF_ERR_NO_SCRN_DSCR 104
+#define D_GIF_ERR_NO_IMAG_DSCR 105
+#define D_GIF_ERR_NO_COLOR_MAP 106
+#define D_GIF_ERR_WRONG_RECORD 107
+#define D_GIF_ERR_DATA_TOO_BIG 108
+#define D_GIF_ERR_NOT_ENOUGH_MEM 109
+#define D_GIF_ERR_CLOSE_FAILED 110
+#define D_GIF_ERR_NOT_READABLE 111
+#define D_GIF_ERR_IMAGE_DEFECT 112
+#define D_GIF_ERR_EOF_TOO_SOON 113
+
+/******************************************************************************
+ * Support for the in-core structures allocation (slurp mode).
+ *****************************************************************************/
+
+/* This is the in-core version of an extension record */
+typedef struct {
+ int ByteCount;
+ char *Bytes;
+ int Function; /* Holds the type of the Extension block. */
+} ExtensionBlock;
+
+/* This holds an image header, its unpacked raster bits, and extensions */
+typedef struct SavedImage {
+ GifImageDesc ImageDesc;
+ unsigned char *RasterBits;
+ int Function; /* DEPRECATED: Use ExtensionBlocks[x].Function instead */
+ int ExtensionBlockCount;
+ ExtensionBlock *ExtensionBlocks;
+} SavedImage;
+
+#endif /* _UNGIF_H_ */
diff --git a/reactos/dll/win32/windowscodecs/version.rc b/reactos/dll/win32/windowscodecs/version.rc
new file mode 100644
index 00000000000..40378d3b28e
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/version.rc
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 Louis Lenders
+ *
+ * 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
+ */
+
+#define WINE_FILEDESCRIPTION_STR "Wine Windows Codecs Library"
+#define WINE_FILENAME_STR "windowscodecs.dll"
+#define WINE_FILEVERSION 6,0,6001,170099
+#define WINE_FILEVERSION_STR "6.0.6001.17009"
+#define WINE_PRODUCTVERSION 6,0,6001,170099
+#define WINE_PRODUCTVERSION_STR "6.0.6001.17009"
+
+#include "wine/wine_common_ver.rc"
diff --git a/reactos/dll/win32/windowscodecs/wincodecs_private.h b/reactos/dll/win32/windowscodecs/wincodecs_private.h
new file mode 100644
index 00000000000..de719d27a65
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/wincodecs_private.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2009 Vincent Povirk 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
+ */
+
+#ifndef WINCODECS_PRIVATE_H
+#define WINCODECS_PRIVATE_H
+
+extern HRESULT FormatConverter_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void** ppv);
+extern HRESULT ImagingFactory_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void** ppv);
+extern HRESULT BmpDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void** ppv);
+extern HRESULT PngDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv);
+extern HRESULT BmpEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv);
+extern HRESULT GifDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void** ppv);
+extern HRESULT IcoDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv);
+extern HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv);
+
+extern HRESULT PaletteImpl_Create(IWICPalette **palette);
+extern HRESULT StreamImpl_Create(IWICStream **stream);
+
+extern HRESULT copy_pixels(UINT bpp, const BYTE *srcbuffer,
+ UINT srcwidth, UINT srcheight, INT srcstride,
+ const WICRect *rc, UINT dststride, UINT dstbuffersize, BYTE *dstbuffer);
+
+extern HRESULT CreatePropertyBag2(IPropertyBag2 **ppPropertyBag2);
+
+extern HRESULT CreateComponentInfo(REFCLSID clsid, IWICComponentInfo **ppIInfo);
+extern HRESULT CreateComponentEnumerator(DWORD componentTypes, DWORD options, IEnumUnknown **ppIEnumUnknown);
+
+#endif /* WINCODECS_PRIVATE_H */
diff --git a/reactos/dll/win32/windowscodecs/windowscodecs.rbuild b/reactos/dll/win32/windowscodecs/windowscodecs.rbuild
new file mode 100644
index 00000000000..843ae750a18
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/windowscodecs.rbuild
@@ -0,0 +1,35 @@
+
+
+
+ .
+ include/reactos/wine
+ include/reactos/libs/libjpeg
+
+
+ 0x600
+
+ wine
+ uuid
+ ole32
+ advapi32
+ kernel32
+
+ bmpdecode.c
+ bmpencode.c
+ clsfactory.c
+ converter.c
+ gifformat.c
+ icoformat.c
+ imgfactory.c
+ info.c
+ jpegformat.c
+ main.c
+ palette.c
+ pngformat.c
+ propertybag.c
+ regsvr.c
+ stream.c
+ ungif.c
+
+ version.rc
+
diff --git a/reactos/dll/win32/windowscodecs/windowscodecs.spec b/reactos/dll/win32/windowscodecs/windowscodecs.spec
new file mode 100644
index 00000000000..d0b6a7e58ca
--- /dev/null
+++ b/reactos/dll/win32/windowscodecs/windowscodecs.spec
@@ -0,0 +1,116 @@
+@ stdcall -private DllGetClassObject(ptr ptr ptr)
+@ stdcall -private DllRegisterServer()
+@ stdcall -private DllUnregisterServer()
+@ stub IEnumString_Next_WIC_Proxy
+@ stub IEnumString_Reset_WIC_Proxy
+@ stub IPropertyBag2_Write_Proxy
+@ stub IWICBitmapClipper_Initialize_Proxy
+@ stub IWICBitmapCodecInfo_DoesSupportAnimation_Proxy
+@ stub IWICBitmapCodecInfo_DoesSupportLossless_Proxy
+@ stub IWICBitmapCodecInfo_DoesSupportMultiframe_Proxy
+@ stub IWICBitmapCodecInfo_GetContainerFormat_Proxy
+@ stub IWICBitmapCodecInfo_GetDeviceManufacturer_Proxy
+@ stub IWICBitmapCodecInfo_GetDeviceModels_Proxy
+@ stub IWICBitmapCodecInfo_GetFileExtensions_Proxy
+@ stub IWICBitmapCodecInfo_GetMimeTypes_Proxy
+@ stub IWICBitmapDecoder_CopyPalette_Proxy
+@ stub IWICBitmapDecoder_GetColorContexts_Proxy
+@ stub IWICBitmapDecoder_GetDecoderInfo_Proxy
+@ stub IWICBitmapDecoder_GetFrameCount_Proxy
+@ stub IWICBitmapDecoder_GetFrame_Proxy
+@ stub IWICBitmapDecoder_GetMetadataQueryReader_Proxy
+@ stub IWICBitmapDecoder_GetPreview_Proxy
+@ stub IWICBitmapDecoder_GetThumbnail_Proxy
+@ stub IWICBitmapEncoder_Commit_Proxy
+@ stub IWICBitmapEncoder_CreateNewFrame_Proxy
+@ stub IWICBitmapEncoder_GetEncoderInfo_Proxy
+@ stub IWICBitmapEncoder_GetMetadataQueryWriter_Proxy
+@ stub IWICBitmapEncoder_Initialize_Proxy
+@ stub IWICBitmapEncoder_SetPalette_Proxy
+@ stub IWICBitmapEncoder_SetThumbnail_Proxy
+@ stub IWICBitmapFlipRotator_Initialize_Proxy
+@ stub IWICBitmapFrameDecode_GetColorContexts_Proxy
+@ stub IWICBitmapFrameDecode_GetMetadataQueryReader_Proxy
+@ stub IWICBitmapFrameDecode_GetThumbnail_Proxy
+@ stub IWICBitmapFrameEncode_Commit_Proxy
+@ stub IWICBitmapFrameEncode_GetMetadataQueryWriter_Proxy
+@ stub IWICBitmapFrameEncode_Initialize_Proxy
+@ stub IWICBitmapFrameEncode_SetColorContexts_Proxy
+@ stub IWICBitmapFrameEncode_SetResolution_Proxy
+@ stub IWICBitmapFrameEncode_SetSize_Proxy
+@ stub IWICBitmapFrameEncode_SetThumbnail_Proxy
+@ stub IWICBitmapFrameEncode_WriteSource_Proxy
+@ stub IWICBitmapLock_GetDataPointer_STA_Proxy
+@ stub IWICBitmapLock_GetStride_Proxy
+@ stub IWICBitmapScaler_Initialize_Proxy
+@ stub IWICBitmapSource_CopyPalette_Proxy
+@ stub IWICBitmapSource_CopyPixels_Proxy
+@ stub IWICBitmapSource_GetPixelFormat_Proxy
+@ stub IWICBitmapSource_GetResolution_Proxy
+@ stub IWICBitmapSource_GetSize_Proxy
+@ stub IWICBitmap_Lock_Proxy
+@ stub IWICBitmap_SetPalette_Proxy
+@ stub IWICBitmap_SetResolution_Proxy
+@ stub IWICColorContext_InitializeFromMemory_Proxy
+@ stub IWICComponentFactory_CreateMetadataWriterFromReader_Proxy
+@ stub IWICComponentFactory_CreateQueryWriterFromBlockWriter_Proxy
+@ stub IWICComponentInfo_GetAuthor_Proxy
+@ stub IWICComponentInfo_GetCLSID_Proxy
+@ stub IWICComponentInfo_GetFriendlyName_Proxy
+@ stub IWICComponentInfo_GetSpecVersion_Proxy
+@ stub IWICComponentInfo_GetVersion_Proxy
+@ stub IWICFastMetadataEncoder_Commit_Proxy
+@ stub IWICFastMetadataEncoder_GetMetadataQueryWriter_Proxy
+@ stub IWICFormatConverter_Initialize_Proxy
+@ stub IWICImagingFactory_CreateBitmapClipper_Proxy
+@ stub IWICImagingFactory_CreateBitmapFlipRotator_Proxy
+@ stub IWICImagingFactory_CreateBitmapFromHBITMAP_Proxy
+@ stub IWICImagingFactory_CreateBitmapFromHICON_Proxy
+@ stub IWICImagingFactory_CreateBitmapFromMemory_Proxy
+@ stub IWICImagingFactory_CreateBitmapFromSource_Proxy
+@ stub IWICImagingFactory_CreateBitmapScaler_Proxy
+@ stub IWICImagingFactory_CreateBitmap_Proxy
+@ stub IWICImagingFactory_CreateComponentInfo_Proxy
+@ stub IWICImagingFactory_CreateDecoderFromFileHandle_Proxy
+@ stub IWICImagingFactory_CreateDecoderFromFilename_Proxy
+@ stub IWICImagingFactory_CreateDecoderFromStream_Proxy
+@ stub IWICImagingFactory_CreateEncoder_Proxy
+@ stub IWICImagingFactory_CreateFastMetadataEncoderFromDecoder_Proxy
+@ stub IWICImagingFactory_CreateFastMetadataEncoderFromFrameDecode_Proxy
+@ stub IWICImagingFactory_CreateFormatConverter_Proxy
+@ stub IWICImagingFactory_CreatePalette_Proxy
+@ stub IWICImagingFactory_CreateQueryWriterFromReader_Proxy
+@ stub IWICImagingFactory_CreateQueryWriter_Proxy
+@ stub IWICImagingFactory_CreateStream_Proxy
+@ stub IWICMetadataBlockReader_GetCount_Proxy
+@ stub IWICMetadataBlockReader_GetReaderByIndex_Proxy
+@ stub IWICMetadataQueryReader_GetContainerFormat_Proxy
+@ stub IWICMetadataQueryReader_GetEnumerator_Proxy
+@ stub IWICMetadataQueryReader_GetLocation_Proxy
+@ stub IWICMetadataQueryReader_GetMetadataByName_Proxy
+@ stub IWICMetadataQueryWriter_RemoveMetadataByName_Proxy
+@ stub IWICMetadataQueryWriter_SetMetadataByName_Proxy
+@ stub IWICPalette_GetColorCount_Proxy
+@ stub IWICPalette_GetColors_Proxy
+@ stub IWICPalette_GetType_Proxy
+@ stub IWICPalette_HasAlpha_Proxy
+@ stub IWICPalette_InitializeCustom_Proxy
+@ stub IWICPalette_InitializeFromBitmap_Proxy
+@ stub IWICPalette_InitializeFromPalette_Proxy
+@ stub IWICPalette_InitializePredefined_Proxy
+@ stub IWICPixelFormatInfo_GetBitsPerPixel_Proxy
+@ stub IWICPixelFormatInfo_GetChannelCount_Proxy
+@ stub IWICPixelFormatInfo_GetChannelMask_Proxy
+@ stub IWICStream_InitializeFromIStream_Proxy
+@ stub IWICStream_InitializeFromMemory_Proxy
+@ stdcall WICConvertBitmapSource(ptr ptr ptr)
+@ stub WICCreateBitmapFromSection
+@ stub WICCreateColorContext_Proxy
+@ stub WICCreateImagingFactory_Proxy
+@ stub WICGetMetadataContentSize
+@ stub WICMapGuidToShortName
+@ stub WICMapSchemaToName
+@ stub WICMapShortNameToGuid
+@ stub WICMatchMetadataContent
+@ stub WICSerializeMetadataContent
+@ stub WICSetEncoderFormat_Proxy
diff --git a/reactos/dll/win32/winemp3.acm/layer3.c b/reactos/dll/win32/winemp3.acm/layer3.c
index c655dcd7aba..17f5a7a9972 100644
--- a/reactos/dll/win32/winemp3.acm/layer3.c
+++ b/reactos/dll/win32/winemp3.acm/layer3.c
@@ -1061,8 +1061,9 @@ maybe still wrong??? (copy 12 to 13?) */
* and mode = mixed_mode
*/
int sfb = gr_info->maxbandl;
- int idx = bi->longIdx[sfb];
-
+ int idx;
+ if(sfb > 21) return; /* similarity fix related to CVE-2006-1655 */
+ idx = bi->longIdx[sfb];
for ( ; sfb<8; sfb++ )
{
int sb = bi->longDiff[sfb];
@@ -1085,7 +1086,9 @@ maybe still wrong??? (copy 12 to 13?) */
else /* ((gr_info->block_type != 2)) */
{
int sfb = gr_info->maxbandl;
- int is_p,idx = bi->longIdx[sfb];
+ int is_p,idx;
+ if (sfb > 21) return; /* tightened fix for CVE-2006-1655 */
+ idx = bi->longIdx[sfb];
for ( ; sfb<21; sfb++)
{
int sb = bi->longDiff[sfb];
diff --git a/reactos/dll/win32/wininet/wininet.rbuild b/reactos/dll/win32/wininet/wininet.rbuild
index cf0064396ea..d05740b1d20 100644
--- a/reactos/dll/win32/wininet/wininet.rbuild
+++ b/reactos/dll/win32/wininet/wininet.rbuild
@@ -7,6 +7,7 @@
.
include/reactos/wine
+
wine
mpr
shlwapi
diff --git a/reactos/dll/win32/winmm/winmm.rbuild b/reactos/dll/win32/winmm/winmm.rbuild
index 33020533fa2..3645255311c 100644
--- a/reactos/dll/win32/winmm/winmm.rbuild
+++ b/reactos/dll/win32/winmm/winmm.rbuild
@@ -8,6 +8,7 @@
.
include/reactos/wine
+
wine
ntdll
kernel32
diff --git a/reactos/dll/win32/wintrust/asn.c b/reactos/dll/win32/wintrust/asn.c
index e776cba2704..ec5c4ded571 100644
--- a/reactos/dll/win32/wintrust/asn.c
+++ b/reactos/dll/win32/wintrust/asn.c
@@ -2079,15 +2079,6 @@ BOOL WINAPI WVTAsn1SpcIndirectDataContentDecode(DWORD dwCertEncodingType,
return ret;
}
-BOOL WINAPI WVTAsn1SpcSpOpusInfoDecode(DWORD dwCertEncodingType,
- LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
- void *pvStructInfo, DWORD *pcbStructInfo)
-{
- FIXME("%p, %d, %08x, %p, %d\n", pbEncoded, cbEncoded, dwFlags,
- pvStructInfo, *pcbStructInfo);
- return FALSE;
-}
-
static BOOL WINAPI CRYPT_AsnDecodeBMPString(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
void *pvStructInfo, DWORD *pcbStructInfo)
@@ -2126,6 +2117,66 @@ static BOOL WINAPI CRYPT_AsnDecodeBMPString(DWORD dwCertEncodingType,
return ret;
}
+static BOOL WINAPI CRYPT_AsnDecodeProgramName(DWORD dwCertEncodingType,
+ LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
+ void *pvStructInfo, DWORD *pcbStructInfo)
+{
+ BOOL ret = FALSE;
+ DWORD dataLen;
+
+ TRACE("(%p, %d, %08x, %p, %d)\n", pbEncoded, cbEncoded, dwFlags,
+ pvStructInfo, pvStructInfo ? *pcbStructInfo : 0);
+
+ if ((ret = CRYPT_GetLen(pbEncoded, cbEncoded, &dataLen)))
+ {
+ BYTE lenBytes = GET_LEN_BYTES(pbEncoded[1]);
+
+ ret = CRYPT_AsnDecodeBMPString(dwCertEncodingType, lpszStructType,
+ pbEncoded + 1 + lenBytes, dataLen, dwFlags, pvStructInfo,
+ pcbStructInfo);
+ }
+ return ret;
+}
+
+BOOL WINAPI WVTAsn1SpcSpOpusInfoDecode(DWORD dwCertEncodingType,
+ LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
+ void *pvStructInfo, DWORD *pcbStructInfo)
+{
+ BOOL ret = FALSE;
+
+ TRACE("%p, %d, %08x, %p, %d\n", pbEncoded, cbEncoded, dwFlags,
+ pvStructInfo, *pcbStructInfo);
+
+ __TRY
+ {
+ struct AsnDecodeSequenceItem items[] = {
+ { ASN_CONSTRUCTOR | ASN_CONTEXT,
+ offsetof(SPC_SP_OPUS_INFO, pwszProgramName),
+ CRYPT_AsnDecodeProgramName, sizeof(LPCWSTR), TRUE, TRUE,
+ offsetof(SPC_SP_OPUS_INFO, pwszProgramName), 0 },
+ { ASN_CONSTRUCTOR | ASN_CONTEXT | 1,
+ offsetof(SPC_SP_OPUS_INFO, pMoreInfo),
+ CRYPT_AsnDecodeSPCLinkPointer, sizeof(PSPC_LINK), TRUE, TRUE,
+ offsetof(SPC_SP_OPUS_INFO, pMoreInfo), 0 },
+ { ASN_CONSTRUCTOR | ASN_CONTEXT | 2,
+ offsetof(SPC_SP_OPUS_INFO, pPublisherInfo),
+ CRYPT_AsnDecodeSPCLinkPointer, sizeof(PSPC_LINK), TRUE, TRUE,
+ offsetof(SPC_SP_OPUS_INFO, pPublisherInfo), 0 },
+ };
+
+ ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
+ sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
+ pvStructInfo, pcbStructInfo, NULL);
+ }
+ __EXCEPT_PAGE_FAULT
+ {
+ SetLastError(STATUS_ACCESS_VIOLATION);
+ }
+ __ENDTRY
+ TRACE("returning %d\n", ret);
+ return ret;
+}
+
static BOOL CRYPT_AsnDecodeInteger(const BYTE *pbEncoded,
DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo)
{
diff --git a/reactos/dll/win32/wintrust/crypt.c b/reactos/dll/win32/wintrust/crypt.c
index e01a23006fa..d9fa5633562 100644
--- a/reactos/dll/win32/wintrust/crypt.c
+++ b/reactos/dll/win32/wintrust/crypt.c
@@ -1121,36 +1121,6 @@ static BOOL WINTRUST_GetSignedMsgFromCabFile(SIP_SUBJECTINFO *pSubjectInfo,
TRACE("(%p %p %d %p %p)\n", pSubjectInfo, pdwEncodingType, dwIndex,
pcbSignedDataMsg, pbSignedDataMsg);
- /*
- * FIXME: I just noticed that I am memorizing the initial file pointer
- * offset and restoring it before reading in the rest of the header
- * information in the cabinet. Perhaps that's correct -- that is, perhaps
- * this API is supposed to support "streaming" cabinets which are embedded
- * in other files, or cabinets which begin at file offsets other than zero.
- * Otherwise, I should instead go to the absolute beginning of the file.
- * (Either way, the semantics of wine's FDICopy require me to leave the
- * file pointer where it is afterwards -- If Windows does not do so, we
- * ought to duplicate the native behavior in the FDIIsCabinet API, not here.
- *
- * So, the answer lies in Windows; will native cabinet.dll recognize a
- * cabinet "file" embedded in another file? Note that cabextract.c does
- * support this, which implies that Microsoft's might. I haven't tried it
- * yet so I don't know. ATM, most of wine's FDI cabinet routines (except
- * this one) would not work in this way. To fix it, we could just make the
- * various references to absolute file positions in the code relative to an
- * initial "beginning" offset. Because the FDICopy API doesn't take a
- * file-handle like this one, we would therein need to search through the
- * file for the beginning of the cabinet (as we also do in cabextract.c).
- * Note that this limits us to a maximum of one cabinet per. file: the first.
- *
- * So, in summary: either the code below is wrong, or the rest of fdi.c is
- * wrong... I cannot imagine that both are correct ;) One of these flaws
- * should be fixed after determining the behavior on Windows. We ought
- * to check both FDIIsCabinet and FDICopy for the right behavior.
- *
- * -gmt
- */
-
/* get basic offset & size info */
base_offset = SetFilePointer(pSubjectInfo->hFile, 0L, NULL, SEEK_CUR);
@@ -1162,7 +1132,7 @@ static BOOL WINTRUST_GetSignedMsgFromCabFile(SIP_SUBJECTINFO *pSubjectInfo,
cabsize = SetFilePointer(pSubjectInfo->hFile, 0L, NULL, SEEK_CUR);
if ((cabsize == -1) || (base_offset == -1) ||
- (SetFilePointer(pSubjectInfo->hFile, base_offset, NULL, SEEK_SET) == INVALID_SET_FILE_POINTER))
+ (SetFilePointer(pSubjectInfo->hFile, 0, NULL, SEEK_SET) == INVALID_SET_FILE_POINTER))
{
TRACE("seek error\n");
return FALSE;
@@ -1267,6 +1237,7 @@ static BOOL WINTRUST_GetSignedMsgFromCabFile(SIP_SUBJECTINFO *pSubjectInfo,
NULL) || dwRead != cert_size)
{
ERR("couldn't read cert\n");
+ SetFilePointer(pSubjectInfo->hFile, base_offset, NULL, SEEK_SET);
return FALSE;
}
/* The encoding of the files I've seen appears to be in ASN.1
@@ -1274,6 +1245,8 @@ static BOOL WINTRUST_GetSignedMsgFromCabFile(SIP_SUBJECTINFO *pSubjectInfo,
* always is.
*/
*pdwEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
+ /* Restore base offset */
+ SetFilePointer(pSubjectInfo->hFile, base_offset, NULL, SEEK_SET);
return TRUE;
}
diff --git a/reactos/dll/win32/wintrust/softpub.c b/reactos/dll/win32/wintrust/softpub.c
index 9a78838839a..7f5f86f5a5a 100644
--- a/reactos/dll/win32/wintrust/softpub.c
+++ b/reactos/dll/win32/wintrust/softpub.c
@@ -90,7 +90,9 @@ static BOOL SOFTPUB_GetFileSubject(CRYPT_PROVIDER_DATA *data)
{
BOOL ret;
- if (!data->pWintrustData->u.pFile->pgKnownSubject)
+ if (!WVT_ISINSTRUCT(WINTRUST_FILE_INFO,
+ data->pWintrustData->u.pFile->cbStruct, pgKnownSubject) ||
+ !data->pWintrustData->u.pFile->pgKnownSubject)
{
ret = CryptSIPRetrieveSubjectGuid(
data->pWintrustData->u.pFile->pcwszFilePath,
@@ -254,7 +256,8 @@ static BOOL SOFTPUB_LoadCertMessage(CRYPT_PROVIDER_DATA *data)
BOOL ret;
if (data->pWintrustData->u.pCert &&
- data->pWintrustData->u.pCert->cbStruct == sizeof(WINTRUST_CERT_INFO))
+ WVT_IS_CBSTRUCT_GT_MEMBEROFFSET(WINTRUST_CERT_INFO,
+ data->pWintrustData->u.pCert->cbStruct, psCertContext))
{
if (data->psPfns)
{
@@ -264,7 +267,9 @@ static BOOL SOFTPUB_LoadCertMessage(CRYPT_PROVIDER_DATA *data)
/* Add a signer with nothing but the time to verify, so we can
* add a cert to it
*/
- if (data->pWintrustData->u.pCert->psftVerifyAsOf)
+ if (WVT_ISINSTRUCT(WINTRUST_CERT_INFO,
+ data->pWintrustData->u.pCert->cbStruct, psftVerifyAsOf) &&
+ data->pWintrustData->u.pCert->psftVerifyAsOf)
data->sftSystemTime = signer.sftVerifyAsOf;
else
{
@@ -278,10 +283,12 @@ static BOOL SOFTPUB_LoadCertMessage(CRYPT_PROVIDER_DATA *data)
{
ret = data->psPfns->pfnAddCert2Chain(data, 0, FALSE, 0,
data->pWintrustData->u.pCert->psCertContext);
- for (i = 0; ret && i < data->pWintrustData->u.pCert->chStores;
- i++)
- ret = data->psPfns->pfnAddStore2Chain(data,
- data->pWintrustData->u.pCert->pahStores[i]);
+ if (WVT_ISINSTRUCT(WINTRUST_CERT_INFO,
+ data->pWintrustData->u.pCert->cbStruct, pahStores))
+ for (i = 0;
+ ret && i < data->pWintrustData->u.pCert->chStores; i++)
+ ret = data->psPfns->pfnAddStore2Chain(data,
+ data->pWintrustData->u.pCert->pahStores[i]);
}
}
else
@@ -1058,3 +1065,15 @@ HRESULT WINAPI SoftpubCleanup(CRYPT_PROVIDER_DATA *data)
return S_OK;
}
+
+HRESULT WINAPI HTTPSCertificateTrust(CRYPT_PROVIDER_DATA *data)
+{
+ FIXME("(%p)\n", data);
+ return S_OK;
+}
+
+HRESULT WINAPI HTTPSFinalProv(CRYPT_PROVIDER_DATA *data)
+{
+ FIXME("(%p)\n", data);
+ return S_OK;
+}
diff --git a/reactos/dll/win32/wintrust/wintrust.spec b/reactos/dll/win32/wintrust/wintrust.spec
index 9c5b1cb8e20..64c51e20375 100644
--- a/reactos/dll/win32/wintrust/wintrust.spec
+++ b/reactos/dll/win32/wintrust/wintrust.spec
@@ -48,8 +48,8 @@
@ stub FindCertsByIssuer
@ stdcall GenericChainCertificateTrust(ptr)
@ stdcall GenericChainFinalProv(ptr)
-@ stub HTTPSCertificateTrust
-@ stub HTTPSFinalProv
+@ stdcall HTTPSCertificateTrust(ptr)
+@ stdcall HTTPSFinalProv(ptr)
@ stub IsCatalogFile
@ stub MsCatConstructHashTag
@ stub MsCatFreeHashTag
@@ -73,6 +73,7 @@
@ stub TrustFreeDecode
@ stdcall TrustIsCertificateSelfSigned(ptr)
@ stub TrustOpenStores
+@ stdcall WTHelperCertCheckValidSignature(ptr)
@ stub WTHelperCertFindIssuerCertificate
@ stub WTHelperCertIsSelfSigned
@ stub WTHelperCheckCertUsage
diff --git a/reactos/dll/win32/wintrust/wintrust_main.c b/reactos/dll/win32/wintrust/wintrust_main.c
index fa4da16434c..c61f6e0f2d6 100644
--- a/reactos/dll/win32/wintrust/wintrust_main.c
+++ b/reactos/dll/win32/wintrust/wintrust_main.c
@@ -303,7 +303,8 @@ static HRESULT WINAPI WINTRUST_CertVerifyObjTrust(CRYPT_PROVIDER_DATA *data)
{
case WTD_CHOICE_BLOB:
if (data->pWintrustData->u.pBlob &&
- data->pWintrustData->u.pBlob->cbStruct == sizeof(WINTRUST_BLOB_INFO) &&
+ WVT_IS_CBSTRUCT_GT_MEMBEROFFSET(WINTRUST_BLOB_INFO,
+ data->pWintrustData->u.pBlob->cbStruct, pbMemObject) &&
data->pWintrustData->u.pBlob->cbMemObject ==
sizeof(CERT_VERIFY_CERTIFICATE_TRUST) &&
data->pWintrustData->u.pBlob->pbMemObject)
@@ -1084,3 +1085,12 @@ BOOL WINAPI OpenPersonalTrustDBDialog(HWND hwnd)
uiCertMgr.pszInitUsageOID = NULL;
return CryptUIDlgCertMgr(&uiCertMgr);
}
+
+/***********************************************************************
+ * WTHelperCertCheckValidSignature
+ */
+HRESULT WINAPI WTHelperCertCheckValidSignature(CRYPT_PROVIDER_DATA *pProvData)
+{
+ FIXME("Stub\n");
+ return S_OK;
+}
diff --git a/reactos/dll/win32/wlanapi/main.c b/reactos/dll/win32/wlanapi/main.c
index fbde40253f2..2b013338e8d 100644
--- a/reactos/dll/win32/wlanapi/main.c
+++ b/reactos/dll/win32/wlanapi/main.c
@@ -198,7 +198,7 @@ WlanScan(IN HANDLE hClientHandle,
}
void __RPC_FAR * __RPC_USER
-midl_user_allocate(size_t len)
+midl_user_allocate(SIZE_T len)
{
return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
}
diff --git a/reactos/dll/win32/ws2_32/misc/ns.c b/reactos/dll/win32/ws2_32/misc/ns.c
index 40e3323f89b..e298b114921 100644
--- a/reactos/dll/win32/ws2_32/misc/ns.c
+++ b/reactos/dll/win32/ws2_32/misc/ns.c
@@ -632,8 +632,9 @@ struct hostent defined in w32api/include/winsock2.h
void free_servent(struct servent* s)
{
+ char* next;
HFREE(s->s_name);
- char* next = s->s_aliases[0];
+ next = s->s_aliases[0];
while(next) { HFREE(next); next++; }
s->s_port = 0;
HFREE(s->s_proto);
@@ -660,10 +661,11 @@ gethostbyname(IN CONST CHAR FAR* name)
DNS_STATUS dns_status = {0};
/* include/WinDNS.h -- look up DNS_RECORD on MSDN */
PDNS_RECORD dp = 0;
+ PWINSOCK_THREAD_BLOCK p;
addr = GH_INVALID;
- PWINSOCK_THREAD_BLOCK p = NtCurrentTeb()->WinSockData;
+ p = NtCurrentTeb()->WinSockData;
if( !p )
{
diff --git a/reactos/dll/win32/ws2_32/misc/stubs.c b/reactos/dll/win32/ws2_32/misc/stubs.c
index c8c3b08c14d..90810e28659 100644
--- a/reactos/dll/win32/ws2_32/misc/stubs.c
+++ b/reactos/dll/win32/ws2_32/misc/stubs.c
@@ -510,13 +510,13 @@ WSAHtons(IN SOCKET s,
IN USHORT hostshort,
OUT USHORT FAR* lpnetshort)
{
+ PCATALOG_ENTRY provider;
if (!WSAINITIALIZED)
{
WSASetLastError(WSANOTINITIALISED);
return SOCKET_ERROR;
}
- PCATALOG_ENTRY provider;
if (!ReferenceProviderByHandle((HANDLE)s, &provider))
{
WSASetLastError(WSAENOTSOCK);
@@ -599,13 +599,13 @@ WSANtohs(IN SOCKET s,
IN USHORT netshort,
OUT USHORT FAR* lphostshort)
{
+ PCATALOG_ENTRY provider;
if (!WSAINITIALIZED)
{
WSASetLastError(WSANOTINITIALISED);
return SOCKET_ERROR;
}
- PCATALOG_ENTRY provider;
if (!ReferenceProviderByHandle((HANDLE)s, &provider))
{
WSASetLastError(WSAENOTSOCK);
diff --git a/reactos/dll/win32/ws2_32_new/inc/ws2_32.h b/reactos/dll/win32/ws2_32_new/inc/ws2_32.h
index 4dd0944dc99..e81f7d56867 100644
--- a/reactos/dll/win32/ws2_32_new/inc/ws2_32.h
+++ b/reactos/dll/win32/ws2_32_new/inc/ws2_32.h
@@ -14,7 +14,6 @@
#define NTOS_MODE_USER
#define _CRT_SECURE_NO_DEPRECATE
#define WINSOCK_API_LINKAGE
-#define DBG 1
/* C Header */
#include
@@ -25,9 +24,7 @@
#include
#include
#include
-
-/* Shared NSP Headers */
-#include